1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
22 #include <tools/urlobj.hxx>
23 #include <svx/xbtmpit.hxx>
24 #include <svx/svxids.hrc>
25 #include <strings.hrc>
26 #include <svx/xfillit0.hxx>
27 #include <svx/xtable.hxx>
28 #include <svx/xflbmsxy.hxx>
29 #include <svx/xflbmtit.hxx>
30 #include <svx/xflbstit.hxx>
31 #include <svx/xflbmsli.hxx>
32 #include <svx/xflbmpit.hxx>
33 #include <svx/xflboxy.hxx>
34 #include <svx/xflbtoxy.hxx>
35 #include <cuitabarea.hxx>
36 #include <dialmgr.hxx>
37 #include <svx/dlgutil.hxx>
38 #include <svl/intitem.hxx>
39 #include <sfx2/opengrf.hxx>
40 #include <vcl/image.hxx>
41 #include <vcl/svapp.hxx>
42 #include <vcl/weld.hxx>
43 #include <svx/svxdlg.hxx>
44 #include <sfx2/viewsh.hxx>
45 #include <sfx2/dialoghelper.hxx>
46 #include <sal/log.hxx>
47 #include <comphelper/lok.hxx>
48 #include <svtools/unitconv.hxx>
50 using namespace com::sun::star
;
69 SvxBitmapTabPage::SvxBitmapTabPage(weld::Container
* pPage
, weld::DialogController
* pController
, const SfxItemSet
& rInAttrs
)
70 : SfxTabPage(pPage
, pController
, "cui/ui/imagetabpage.ui", "ImageTabPage", &rInAttrs
)
71 , m_rOutAttrs(rInAttrs
)
72 , m_pnBitmapListState(nullptr)
74 , m_fObjectHeight(0.0)
75 , m_bLogicalSize(false)
76 , m_aXFillAttr(rInAttrs
.GetPool())
77 , m_rXFSet(m_aXFillAttr
.GetItemSet())
79 , m_xBitmapLB(new SvxPresetListBox(m_xBuilder
->weld_scrolled_window("imagewin", true)))
80 , m_xBitmapStyleLB(m_xBuilder
->weld_combo_box("imagestyle"))
81 , m_xSizeBox(m_xBuilder
->weld_container("sizebox"))
82 , m_xTsbScale(m_xBuilder
->weld_check_button("scaletsb"))
83 , m_xBitmapWidth(m_xBuilder
->weld_metric_spin_button("width", FieldUnit::PERCENT
))
84 , m_xBitmapHeight(m_xBuilder
->weld_metric_spin_button("height", FieldUnit::PERCENT
))
85 , m_xPositionBox(m_xBuilder
->weld_container("posbox"))
86 , m_xPositionLB(m_xBuilder
->weld_combo_box("positionlb"))
87 , m_xPositionOffBox(m_xBuilder
->weld_container("posoffbox"))
88 , m_xPositionOffX(m_xBuilder
->weld_metric_spin_button("posoffx", FieldUnit::PERCENT
))
89 , m_xPositionOffY(m_xBuilder
->weld_metric_spin_button("posoffy", FieldUnit::PERCENT
))
90 , m_xTileOffBox(m_xBuilder
->weld_container("tileoffbox"))
91 , m_xTileOffLB(m_xBuilder
->weld_combo_box("tileofflb"))
92 , m_xTileOffset(m_xBuilder
->weld_metric_spin_button("tileoffmtr", FieldUnit::PERCENT
))
93 , m_xBtnImport(m_xBuilder
->weld_button("BTN_IMPORT"))
94 , m_xCtlBitmapPreview(new weld::CustomWeld(*m_xBuilder
, "CTL_IMAGE_PREVIEW", m_aCtlBitmapPreview
))
95 , m_xBitmapLBWin(new weld::CustomWeld(*m_xBuilder
, "IMAGE", *m_xBitmapLB
))
97 // setting the output device
98 m_rXFSet
.Put( XFillStyleItem(drawing::FillStyle_BITMAP
) );
99 m_rXFSet
.Put( XFillBitmapItem(OUString(), Graphic()) );
100 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
102 m_xBitmapLB
->SetSelectHdl( LINK(this, SvxBitmapTabPage
, ModifyBitmapHdl
) );
103 m_xBitmapLB
->SetRenameHdl( LINK(this, SvxBitmapTabPage
, ClickRenameHdl
) );
104 m_xBitmapLB
->SetDeleteHdl( LINK(this, SvxBitmapTabPage
, ClickDeleteHdl
) );
105 m_xBitmapStyleLB
->connect_changed( LINK(this, SvxBitmapTabPage
, ModifyBitmapStyleHdl
) );
106 Link
<weld::MetricSpinButton
&, void> aLink1( LINK(this, SvxBitmapTabPage
, ModifyBitmapSizeHdl
) );
107 m_xBitmapWidth
->connect_value_changed( aLink1
);
108 m_xBitmapHeight
->connect_value_changed( aLink1
);
109 m_xTsbScale
->connect_toggled(LINK(this, SvxBitmapTabPage
, ClickScaleHdl
));
110 m_xPositionLB
->connect_changed( LINK( this, SvxBitmapTabPage
, ModifyBitmapPositionHdl
) );
111 Link
<weld::MetricSpinButton
&, void> aLink( LINK( this, SvxBitmapTabPage
, ModifyPositionOffsetHdl
) );
112 m_xPositionOffX
->connect_value_changed(aLink
);
113 m_xPositionOffY
->connect_value_changed(aLink
);
114 m_xTileOffset
->connect_value_changed( LINK( this, SvxBitmapTabPage
, ModifyTileOffsetHdl
) );
115 m_xBtnImport
->connect_clicked( LINK(this, SvxBitmapTabPage
, ClickImportHdl
) );
116 if (comphelper::LibreOfficeKit::isActive())
117 m_xBtnImport
->hide();
119 // Calculate size of display boxes
120 Size aSize
= getDrawPreviewOptimalSize(m_aCtlBitmapPreview
.GetDrawingArea()->get_ref_device());
121 m_xBitmapLB
->set_size_request(aSize
.Width(), aSize
.Height());
122 m_xCtlBitmapPreview
->set_size_request(aSize
.Width(), aSize
.Height());
124 SfxItemPool
* pPool
= m_rXFSet
.GetPool();
125 mePoolUnit
= pPool
->GetMetric( XATTR_FILLBMP_SIZEX
);
126 meFieldUnit
= GetModuleFieldUnit( rInAttrs
);
127 SetFieldUnit( *m_xBitmapWidth
, meFieldUnit
, true );
128 SetFieldUnit( *m_xBitmapHeight
, meFieldUnit
, true );
130 m_xBitmapLB
->SetStyle(WB_FLATVALUESET
| WB_NO_DIRECTSELECT
| WB_TABSTOP
);
132 SfxViewShell
* pViewShell
= SfxViewShell::Current();
134 mpView
= pViewShell
->GetDrawView();
135 DBG_ASSERT( mpView
, "no valid view (!)" );
138 SvxBitmapTabPage::~SvxBitmapTabPage()
140 m_xBitmapLBWin
.reset();
142 m_xCtlBitmapPreview
.reset();
145 void SvxBitmapTabPage::Construct()
147 m_xBitmapLB
->FillPresetListBox( *m_pBitmapList
);
150 void SvxBitmapTabPage::ActivatePage( const SfxItemSet
& rSet
)
152 XFillBitmapItem
aItem( rSet
.Get(XATTR_FILLBITMAP
) );
155 if ( !aItem
.isPattern() )
157 nPos
= SearchBitmapList( aItem
.GetGraphicObject() );
163 m_xBitmapWidth
->set_value( 100, FieldUnit::NONE
);
164 m_xBitmapHeight
->set_value( 100, FieldUnit::NONE
);
165 const_cast<SfxItemSet
&>(rSet
).Put( XFillBmpSizeXItem( GetCoreValue( *m_xBitmapWidth
, mePoolUnit
) ) );
166 const_cast<SfxItemSet
&>(rSet
).Put( XFillBmpSizeYItem( GetCoreValue( *m_xBitmapHeight
, mePoolUnit
) ) );
169 sal_uInt16 nId
= m_xBitmapLB
->GetItemId( static_cast<size_t>( nPos
) );
170 m_xBitmapLB
->SelectItem( nId
);
173 DeactivateRC
SvxBitmapTabPage::DeactivatePage( SfxItemSet
* _pSet
)
176 FillItemSet( _pSet
);
178 return DeactivateRC::LeavePage
;
182 bool SvxBitmapTabPage::FillItemSet( SfxItemSet
* rAttrs
)
184 rAttrs
->Put(XFillStyleItem(drawing::FillStyle_BITMAP
));
185 size_t nPos
= m_xBitmapLB
->GetSelectItemPos();
186 if(VALUESET_ITEM_NOTFOUND
!= nPos
)
188 const XBitmapEntry
* pXBitmapEntry
= m_pBitmapList
->GetBitmap(nPos
);
189 const OUString
aString(m_xBitmapLB
->GetItemText( m_xBitmapLB
->GetSelectedItemId() ));
190 rAttrs
->Put(XFillBitmapItem(aString
, pXBitmapEntry
->GetGraphicObject()));
193 BitmapStyle eStylePos
= static_cast<BitmapStyle
>(m_xBitmapStyleLB
->get_active());
194 bool bIsStretched( eStylePos
== STRETCHED
);
195 bool bIsTiled( eStylePos
== TILED
);
197 rAttrs
->Put( XFillBmpTileItem(bIsTiled
) );
198 rAttrs
->Put( XFillBmpStretchItem(bIsStretched
) );
208 sal_Int64 nWidthPercent
= m_xBitmapWidth
->get_value(FieldUnit::NONE
);
209 sal_Int64 nHeightPercent
= m_xBitmapHeight
->get_value(FieldUnit::NONE
);
210 if (m_xTsbScale
->get_sensitive() && m_xTsbScale
->get_state() == TRISTATE_TRUE
)
212 aSetBitmapSize
.setWidth( -nWidthPercent
);
213 aSetBitmapSize
.setHeight( -nHeightPercent
);
215 else if (!m_bLogicalSize
)
217 aSetBitmapSize
.setWidth( GetCoreValue(*m_xBitmapWidth
, mePoolUnit
) );
218 aSetBitmapSize
.setHeight( GetCoreValue(*m_xBitmapHeight
, mePoolUnit
) );
222 rAttrs
->Put( XFillBmpSizeLogItem(true) );
223 aSetBitmapSize
.setWidth( 0 );
224 aSetBitmapSize
.setHeight( 0 );
233 rAttrs
->Put( XFillBmpSizeXItem( aSetBitmapSize
.Width() ) );
234 rAttrs
->Put( XFillBmpSizeYItem( aSetBitmapSize
.Height() ) );
237 if (m_xPositionLB
->get_sensitive())
238 rAttrs
->Put( XFillBmpPosItem( static_cast<RectPoint
>( m_xPositionLB
->get_active() ) ) );
239 if (m_xPositionOffX
->get_sensitive())
240 rAttrs
->Put( XFillBmpPosOffsetXItem(m_xPositionOffX
->get_value(FieldUnit::PERCENT
)));
241 if (m_xPositionOffY
->get_sensitive())
242 rAttrs
->Put( XFillBmpPosOffsetYItem(m_xPositionOffY
->get_value(FieldUnit::PERCENT
)));
243 if (m_xTileOffBox
->get_sensitive())
245 TileOffset eValue
= static_cast<TileOffset
>(m_xTileOffLB
->get_active());
246 sal_uInt16 nOffsetValue
= static_cast<sal_uInt16
>(m_xTileOffset
->get_value(FieldUnit::PERCENT
));
247 sal_uInt16 nRowOff
= (eValue
== ROW
) ? nOffsetValue
: 0;
248 sal_uInt16 nColOff
= (eValue
== COLUMN
) ? nOffsetValue
: 0;
249 rAttrs
->Put( XFillBmpTileOffsetXItem(nRowOff
) );
250 rAttrs
->Put( XFillBmpTileOffsetYItem(nColOff
) );
256 void SvxBitmapTabPage::Reset( const SfxItemSet
* rAttrs
)
258 double transfWidth
= 0.0;
259 double transfHeight
= 0.0;
260 double fUIScale
= 1.0;
263 fUIScale
= ( mpView
->GetModel() ? double(mpView
->GetModel()->GetUIScale()) : 1.0);
266 if (mpView
->AreObjectsMarked())
268 SfxItemSet
rGeoAttr(mpView
->GetGeoAttrFromMarked());
269 transfWidth
= static_cast<double>(GetItem( rGeoAttr
, SID_ATTR_TRANSFORM_WIDTH
)->GetValue());
270 transfHeight
= static_cast<double>(GetItem( rGeoAttr
, SID_ATTR_TRANSFORM_HEIGHT
)->GetValue());
273 m_fObjectWidth
= std::max( transfWidth
, 1.0 );
274 m_fObjectHeight
= std::max( transfHeight
, 1.0 );
275 double fTmpWidth((OutputDevice::LogicToLogic(static_cast<sal_Int32
>(m_fObjectWidth
), mePoolUnit
, MapUnit::Map100thMM
)) / fUIScale
);
276 m_fObjectWidth
= fTmpWidth
;
278 double fTmpHeight((OutputDevice::LogicToLogic(static_cast<sal_Int32
>(m_fObjectHeight
), mePoolUnit
, MapUnit::Map100thMM
)) / fUIScale
);
279 m_fObjectHeight
= fTmpHeight
;
281 XFillBitmapItem
aItem( rAttrs
->Get(XATTR_FILLBITMAP
) );
283 if(!aItem
.isPattern())
285 m_rXFSet
.Put( aItem
);
286 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
287 m_aCtlBitmapPreview
.Invalidate();
290 m_xCtlBitmapPreview
->set_sensitive(false);
292 std::unique_ptr
<GraphicObject
> pGraphicObject
;
293 pGraphicObject
.reset( new GraphicObject(aItem
.GetGraphicObject()) );
295 BitmapEx
aBmpEx(pGraphicObject
->GetGraphic().GetBitmapEx());
296 Size aTempBitmapSize
= aBmpEx
.GetSizePixel();
297 rBitmapSize
= Application::GetDefaultDevice()->PixelToLogic(aTempBitmapSize
, MapMode(MapUnit::Map100thMM
));
298 CalculateBitmapPresetSize();
300 bool bTiled
= false; bool bStretched
= false;
301 if(rAttrs
->GetItemState( XATTR_FILLBMP_TILE
) != SfxItemState::DONTCARE
)
302 bTiled
= rAttrs
->Get( XATTR_FILLBMP_TILE
).GetValue();
303 if(rAttrs
->GetItemState( XATTR_FILLBMP_STRETCH
) != SfxItemState::DONTCARE
)
304 bStretched
= rAttrs
->Get( XATTR_FILLBMP_STRETCH
).GetValue();
307 m_xBitmapStyleLB
->set_active(static_cast<sal_Int32
>(TILED
));
309 m_xBitmapStyleLB
->set_active(static_cast<sal_Int32
>(STRETCHED
));
311 m_xBitmapStyleLB
->set_active(static_cast<sal_Int32
>(CUSTOM
));
313 tools::Long nWidth
= 0;
314 tools::Long nHeight
= 0;
316 if(rAttrs
->GetItemState(XATTR_FILLBMP_SIZELOG
) != SfxItemState::DONTCARE
)
318 if (rAttrs
->Get( XATTR_FILLBMP_SIZELOG
).GetValue())
320 m_xTsbScale
->set_state(TRISTATE_FALSE
);
321 m_bLogicalSize
= true;
325 m_xTsbScale
->set_state(TRISTATE_TRUE
);
326 m_bLogicalSize
= false;
330 m_xTsbScale
->set_state(TRISTATE_INDET
);
332 TriState eRelative
= TRISTATE_FALSE
;
333 if(rAttrs
->GetItemState(XATTR_FILLBMP_SIZEX
) != SfxItemState::DONTCARE
)
335 nWidth
= static_cast<const XFillBmpSizeXItem
&>( rAttrs
->Get( XATTR_FILLBMP_SIZEX
) ).GetValue();
337 nWidth
= rBitmapSize
.Width();
340 eRelative
= TRISTATE_TRUE
;
341 nWidth
= std::abs(nWidth
);
345 if(rAttrs
->GetItemState( XATTR_FILLBMP_SIZEY
) != SfxItemState::DONTCARE
)
347 nHeight
= rAttrs
->Get( XATTR_FILLBMP_SIZEY
).GetValue();
349 nHeight
= rBitmapSize
.Height();
352 eRelative
= TRISTATE_TRUE
;
353 nHeight
= std::abs(nHeight
);
356 m_xTsbScale
->set_state(eRelative
);
357 ClickScaleHdl(*m_xTsbScale
);
360 if(!rBitmapSize
.IsEmpty())
362 if (eRelative
== TRISTATE_TRUE
)
364 m_xBitmapWidth
->set_value(nWidth
, FieldUnit::NONE
);
365 m_xBitmapHeight
->set_value(nHeight
, FieldUnit::NONE
);
369 SetMetricValue(*m_xBitmapWidth
, nWidth
, mePoolUnit
);
370 SetMetricValue(*m_xBitmapHeight
, nHeight
, mePoolUnit
);
374 if( rAttrs
->GetItemState( XATTR_FILLBMP_POS
) != SfxItemState::DONTCARE
)
376 RectPoint eValue
= rAttrs
->Get( XATTR_FILLBMP_POS
).GetValue();
377 m_xPositionLB
->set_active( static_cast< sal_Int32
>(eValue
) );
380 if( rAttrs
->GetItemState( XATTR_FILLBMP_POSOFFSETX
) != SfxItemState::DONTCARE
)
382 sal_Int32 nValue
= rAttrs
->Get( XATTR_FILLBMP_POSOFFSETX
).GetValue();
383 m_xPositionOffX
->set_value(nValue
, FieldUnit::PERCENT
);
386 m_xPositionOffX
->set_text("");
388 if( rAttrs
->GetItemState( XATTR_FILLBMP_POSOFFSETY
) != SfxItemState::DONTCARE
)
390 sal_Int32 nValue
= rAttrs
->Get( XATTR_FILLBMP_POSOFFSETY
).GetValue();
391 m_xPositionOffY
->set_value(nValue
, FieldUnit::PERCENT
);
394 m_xPositionOffY
->set_text("");
396 if( rAttrs
->GetItemState( XATTR_FILLBMP_TILEOFFSETX
) != SfxItemState::DONTCARE
)
398 sal_Int32 nValue
= rAttrs
->Get( XATTR_FILLBMP_TILEOFFSETX
).GetValue();
401 m_xTileOffLB
->set_active(static_cast<sal_Int32
>(ROW
));
402 m_xTileOffset
->set_value(nValue
, FieldUnit::PERCENT
);
406 if( rAttrs
->GetItemState( XATTR_FILLBMP_TILEOFFSETY
) != SfxItemState::DONTCARE
)
408 sal_Int32 nValue
= rAttrs
->Get( XATTR_FILLBMP_TILEOFFSETY
).GetValue();
411 m_xTileOffLB
->set_active(static_cast<sal_Int32
>(COLUMN
));
412 m_xTileOffset
->set_value(nValue
, FieldUnit::PERCENT
);
416 ClickBitmapHdl_Impl();
419 std::unique_ptr
<SfxTabPage
> SvxBitmapTabPage::Create(weld::Container
* pPage
, weld::DialogController
* pController
, const SfxItemSet
* rAttrs
)
421 return std::make_unique
<SvxBitmapTabPage
>(pPage
, pController
, *rAttrs
);
424 void SvxBitmapTabPage::ClickBitmapHdl_Impl()
426 m_xBitmapLBWin
->set_sensitive(true);
427 m_xCtlBitmapPreview
->set_sensitive(true);
429 ModifyBitmapHdl(m_xBitmapLB
.get());
432 void SvxBitmapTabPage::CalculateBitmapPresetSize()
434 if(rBitmapSize
.IsEmpty())
437 tools::Long nObjectWidth
= static_cast<tools::Long
>(m_fObjectWidth
);
438 tools::Long nObjectHeight
= static_cast<tools::Long
>(m_fObjectHeight
);
440 if(std::abs(rBitmapSize
.Width() - nObjectWidth
) < std::abs(rBitmapSize
.Height() - nObjectHeight
))
442 rFilledSize
.setWidth( nObjectWidth
);
443 rFilledSize
.setHeight( rBitmapSize
.Height()*nObjectWidth
/rBitmapSize
.Width() );
444 rZoomedSize
.setWidth( rBitmapSize
.Width()*nObjectHeight
/rBitmapSize
.Height() );
445 rZoomedSize
.setHeight( nObjectHeight
);
449 rFilledSize
.setWidth( rBitmapSize
.Width()*nObjectHeight
/rBitmapSize
.Height() );
450 rFilledSize
.setHeight( nObjectHeight
);
451 rZoomedSize
.setWidth( nObjectWidth
);
452 rZoomedSize
.setHeight( rBitmapSize
.Height()*nObjectWidth
/rBitmapSize
.Width() );
456 IMPL_LINK_NOARG(SvxBitmapTabPage
, ModifyBitmapHdl
, ValueSet
*, void)
458 std::unique_ptr
<GraphicObject
> pGraphicObject
;
459 size_t nPos
= m_xBitmapLB
->GetSelectItemPos();
461 if( nPos
!= VALUESET_ITEM_NOTFOUND
)
463 pGraphicObject
.reset(new GraphicObject(m_pBitmapList
->GetBitmap( static_cast<sal_uInt16
>(nPos
) )->GetGraphicObject()));
467 const SfxPoolItem
* pPoolItem
= nullptr;
469 if(SfxItemState::SET
== m_rOutAttrs
.GetItemState(GetWhich(XATTR_FILLSTYLE
), true, &pPoolItem
))
471 const drawing::FillStyle
eXFS(static_cast<const XFillStyleItem
*>(pPoolItem
)->GetValue());
473 if((drawing::FillStyle_BITMAP
== eXFS
) && (SfxItemState::SET
== m_rOutAttrs
.GetItemState(GetWhich(XATTR_FILLBITMAP
), true, &pPoolItem
)))
475 pGraphicObject
.reset(new GraphicObject(static_cast<const XFillBitmapItem
*>(pPoolItem
)->GetGraphicObject()));
481 sal_uInt16 nId
= m_xBitmapLB
->GetItemId(0);
482 m_xBitmapLB
->SelectItem(nId
);
486 pGraphicObject
.reset(new GraphicObject(m_pBitmapList
->GetBitmap(0)->GetGraphicObject()));
493 BitmapEx
aBmpEx(pGraphicObject
->GetGraphic().GetBitmapEx());
494 Size aTempBitmapSize
= aBmpEx
.GetSizePixel();
495 const double fUIScale
= ( (mpView
&& mpView
->GetModel()) ? double(mpView
->GetModel()->GetUIScale()) : 1.0);
496 Size aBitmapSize100mm
= o3tl::convert(aTempBitmapSize
, o3tl::Length::pt
, o3tl::Length::mm100
);
498 rBitmapSize
.setWidth(aBitmapSize100mm
.Width() / fUIScale
);
499 rBitmapSize
.setHeight(aBitmapSize100mm
.Height() / fUIScale
);
500 CalculateBitmapPresetSize();
501 ModifyBitmapStyleHdl( *m_xBitmapStyleLB
);
502 ModifyBitmapPositionHdl( *m_xPositionLB
);
504 m_rXFSet
.ClearItem(XATTR_FILLBITMAP
);
505 m_rXFSet
.Put(XFillStyleItem(drawing::FillStyle_BITMAP
));
506 m_rXFSet
.Put(XFillBitmapItem(OUString(), *pGraphicObject
));
508 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
509 m_aCtlBitmapPreview
.Invalidate();
513 SAL_WARN("cui.tabpages", "SvxBitmapTabPage::ModifyBitmapHdl(): null pGraphicObject");
518 IMPL_LINK_NOARG(SvxBitmapTabPage
, ClickRenameHdl
, SvxPresetListBox
*, void)
520 sal_uInt16 nId
= m_xBitmapLB
->GetSelectedItemId();
521 size_t nPos
= m_xBitmapLB
->GetSelectItemPos();
523 if( nPos
== VALUESET_ITEM_NOTFOUND
)
526 OUString
aDesc( CuiResId( RID_SVXSTR_DESC_NEW_BITMAP
) );
527 OUString
aName( m_pBitmapList
->GetBitmap( nPos
)->GetName() );
529 SvxAbstractDialogFactory
* pFact
= SvxAbstractDialogFactory::Create();
530 ScopedVclPtr
<AbstractSvxNameDialog
> pDlg(pFact
->CreateSvxNameDialog(GetFrameWeld(), aName
, aDesc
));
533 while( bLoop
&& pDlg
->Execute() == RET_OK
)
535 pDlg
->GetName( aName
);
536 sal_Int32 nBitmapPos
= SearchBitmapList( aName
);
537 bool bValidBitmapName
= (nBitmapPos
== static_cast<sal_Int32
>(nPos
) ) || (nBitmapPos
== -1);
542 m_pBitmapList
->GetBitmap(nPos
)->SetName(aName
);
544 m_xBitmapLB
->SetItemText(nId
, aName
);
545 m_xBitmapLB
->SelectItem( nId
);
547 *m_pnBitmapListState
|= ChangeType::MODIFIED
;
551 std::unique_ptr
<weld::Builder
> xBuilder(Application::CreateBuilder(GetFrameWeld(), "cui/ui/queryduplicatedialog.ui"));
552 std::unique_ptr
<weld::MessageDialog
> xBox(xBuilder
->weld_message_dialog("DuplicateNameDialog"));
558 IMPL_LINK_NOARG(SvxBitmapTabPage
, ClickDeleteHdl
, SvxPresetListBox
*, void)
560 sal_uInt16 nId
= m_xBitmapLB
->GetSelectedItemId();
561 size_t nPos
= m_xBitmapLB
->GetSelectItemPos();
563 if( nPos
== VALUESET_ITEM_NOTFOUND
)
566 std::unique_ptr
<weld::Builder
> xBuilder(Application::CreateBuilder(GetFrameWeld(), "cui/ui/querydeletebitmapdialog.ui"));
567 std::unique_ptr
<weld::MessageDialog
> xQueryBox(xBuilder
->weld_message_dialog("AskDelBitmapDialog"));
569 if (xQueryBox
->run() != RET_YES
)
572 sal_uInt16 nNextId
= m_xBitmapLB
->GetItemId(nPos
+ 1);
574 nNextId
= m_xBitmapLB
->GetItemId(nPos
- 1);
576 m_pBitmapList
->Remove( static_cast<sal_uInt16
>(nPos
) );
577 m_xBitmapLB
->RemoveItem( nId
);
579 m_xBitmapLB
->SelectItem(nNextId
);
581 m_aCtlBitmapPreview
.Invalidate();
582 ModifyBitmapHdl(m_xBitmapLB
.get());
583 *m_pnBitmapListState
|= ChangeType::MODIFIED
;
586 IMPL_LINK_NOARG( SvxBitmapTabPage
, ModifyBitmapSizeHdl
, weld::MetricSpinButton
&, void )
588 m_bLogicalSize
= false;
589 if (m_xTsbScale
->get_state() != TRISTATE_TRUE
&& static_cast<BitmapStyle
>(m_xBitmapStyleLB
->get_active()) != TILED
)
591 sal_Int64 nWidthPercent
= m_xBitmapWidth
->denormalize(m_xBitmapWidth
->get_value(FieldUnit::NONE
));
592 sal_Int64 nHeightPercent
= m_xBitmapHeight
->denormalize(m_xBitmapHeight
->get_value(FieldUnit::NONE
));
593 if (nWidthPercent
== 100 && nHeightPercent
== 100)
594 m_xBitmapStyleLB
->set_active(static_cast<sal_Int32
>(CUSTOM
));
596 ModifyBitmapStyleHdl(*m_xBitmapStyleLB
);
598 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
599 m_aCtlBitmapPreview
.Invalidate();
602 IMPL_LINK_NOARG( SvxBitmapTabPage
, ClickScaleHdl
, weld::Toggleable
&, void )
604 if (m_xTsbScale
->get_state() == TRISTATE_TRUE
)
606 m_xBitmapWidth
->set_digits( 0 );
607 m_xBitmapWidth
->set_unit(FieldUnit::PERCENT
);
608 m_xBitmapWidth
->set_value(100, FieldUnit::NONE
);
609 m_xBitmapWidth
->set_range(0, 100, FieldUnit::NONE
);
611 m_xBitmapHeight
->set_digits( 0 );
612 m_xBitmapHeight
->set_unit(FieldUnit::PERCENT
);
613 m_xBitmapHeight
->set_value(100, FieldUnit::NONE
);
614 m_xBitmapHeight
->set_range(0, 100, FieldUnit::NONE
);
618 m_xBitmapWidth
->set_digits( 2 );
619 m_xBitmapWidth
->set_unit(meFieldUnit
);
620 m_xBitmapWidth
->set_value(100, FieldUnit::NONE
);
621 m_xBitmapWidth
->set_range(0, 999900, FieldUnit::NONE
);
623 m_xBitmapHeight
->set_digits( 2 );
624 m_xBitmapHeight
->set_unit(meFieldUnit
);
625 m_xBitmapHeight
->set_value(100, FieldUnit::NONE
);
626 m_xBitmapHeight
->set_range(0, 999900, FieldUnit::NONE
);
629 ModifyBitmapStyleHdl( *m_xBitmapStyleLB
);
632 IMPL_LINK_NOARG( SvxBitmapTabPage
, ModifyBitmapStyleHdl
, weld::ComboBox
&, void )
634 BitmapStyle eStylePos
= static_cast<BitmapStyle
>(m_xBitmapStyleLB
->get_active());
635 bool bIsStretched( eStylePos
== STRETCHED
);
636 bool bIsTiled( eStylePos
== TILED
);
638 m_xSizeBox
->set_sensitive( !bIsStretched
);
639 m_xPositionBox
->set_sensitive( !bIsStretched
);
640 m_xPositionOffBox
->set_sensitive( bIsTiled
);
641 m_xTileOffBox
->set_sensitive( bIsTiled
);
643 m_rXFSet
.Put( XFillBmpTileItem( bIsTiled
) );
644 m_rXFSet
.Put( XFillBmpStretchItem( bIsStretched
) );
654 if (m_xTsbScale
->get_sensitive() && m_xTsbScale
->get_state() == TRISTATE_TRUE
)
656 aSetBitmapSize
.setWidth(-m_xBitmapWidth
->get_value(FieldUnit::NONE
));
657 aSetBitmapSize
.setHeight(-m_xBitmapHeight
->get_value(FieldUnit::NONE
));
661 aSetBitmapSize
.setWidth( GetCoreValue( *m_xBitmapWidth
, mePoolUnit
) );
662 aSetBitmapSize
.setHeight( GetCoreValue( *m_xBitmapHeight
, mePoolUnit
) );
670 m_rXFSet
.Put( XFillBmpSizeXItem( aSetBitmapSize
.Width() ) );
671 m_rXFSet
.Put( XFillBmpSizeYItem( aSetBitmapSize
.Height() ) );
674 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
675 m_aCtlBitmapPreview
.Invalidate();
678 IMPL_LINK_NOARG(SvxBitmapTabPage
, ModifyBitmapPositionHdl
, weld::ComboBox
&, void)
680 if (m_xPositionLB
->get_sensitive())
681 m_rXFSet
.Put( XFillBmpPosItem( static_cast< RectPoint
>( m_xPositionLB
->get_active() ) ) );
683 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
684 m_aCtlBitmapPreview
.Invalidate();
687 IMPL_LINK_NOARG(SvxBitmapTabPage
, ModifyPositionOffsetHdl
, weld::MetricSpinButton
&, void)
689 if (m_xPositionOffX
->get_sensitive())
690 m_rXFSet
.Put( XFillBmpPosOffsetXItem( m_xPositionOffX
->get_value(FieldUnit::PERCENT
) ) );
692 if (m_xPositionOffY
->get_sensitive())
693 m_rXFSet
.Put( XFillBmpPosOffsetYItem( m_xPositionOffY
->get_value(FieldUnit::PERCENT
) ) );
695 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
696 m_aCtlBitmapPreview
.Invalidate();
699 IMPL_LINK_NOARG(SvxBitmapTabPage
, ModifyTileOffsetHdl
, weld::MetricSpinButton
&, void)
701 sal_uInt16 nTileXOff
= 0;
702 sal_uInt16 nTileYOff
= 0;
704 if(m_xTileOffLB
->get_active() == static_cast<sal_Int32
>(ROW
))
705 nTileXOff
= m_xTileOffset
->get_value(FieldUnit::PERCENT
);
707 if(m_xTileOffLB
->get_active() == static_cast<sal_Int32
>(COLUMN
))
708 nTileYOff
= m_xTileOffset
->get_value(FieldUnit::PERCENT
);
710 m_rXFSet
.Put( XFillBmpTileOffsetXItem(nTileXOff
) );
711 m_rXFSet
.Put( XFillBmpTileOffsetYItem(nTileYOff
) );
713 m_aCtlBitmapPreview
.SetAttributes( m_aXFillAttr
.GetItemSet() );
714 m_aCtlBitmapPreview
.Invalidate();
717 IMPL_LINK_NOARG(SvxBitmapTabPage
, ClickImportHdl
, weld::Button
&, void)
719 weld::Window
* pDialogFrameWeld
= GetFrameWeld();
721 SvxOpenGraphicDialog
aDlg(CuiResId(RID_SVXSTR_ADD_IMAGE
), pDialogFrameWeld
);
722 aDlg
.EnableLink(false);
723 tools::Long nCount
= m_pBitmapList
->Count();
730 std::unique_ptr
<weld::WaitObject
> xWait(new weld::WaitObject(pDialogFrameWeld
));
731 ErrCode nError
= aDlg
.GetGraphic( aGraphic
);
736 OUString
aDesc(CuiResId(RID_SVXSTR_DESC_EXT_BITMAP
));
738 // convert file URL to UI name
740 INetURLObject
aURL( aDlg
.GetPath() );
741 SvxAbstractDialogFactory
* pFact
= SvxAbstractDialogFactory::Create();
742 ScopedVclPtr
<AbstractSvxNameDialog
> pDlg(pFact
->CreateSvxNameDialog(
743 pDialogFrameWeld
, aURL
.GetLastName().getToken(0, '.'), aDesc
));
746 while( pDlg
->Execute() == RET_OK
)
748 pDlg
->GetName( aName
);
750 bool bDifferent
= true;
752 for( tools::Long i
= 0; i
< nCount
&& bDifferent
; i
++ )
753 if( aName
== m_pBitmapList
->GetBitmap( i
)->GetName() )
757 nError
= ERRCODE_NONE
;
761 std::unique_ptr
<weld::Builder
> xBuilder(Application::CreateBuilder(pDialogFrameWeld
, "cui/ui/queryduplicatedialog.ui"));
762 std::unique_ptr
<weld::MessageDialog
> xBox(xBuilder
->weld_message_dialog("DuplicateNameDialog"));
763 if (xBox
->run() != RET_OK
)
767 pDlg
.disposeAndClear();
771 m_pBitmapList
->Insert(std::make_unique
<XBitmapEntry
>(aGraphic
, aName
), nCount
);
773 sal_Int32 nId
= m_xBitmapLB
->GetItemId( nCount
- 1 );
774 BitmapEx aBitmap
= m_pBitmapList
->GetBitmapForPreview( nCount
, m_xBitmapLB
->GetIconSize() );
776 m_xBitmapLB
->InsertItem( nId
+ 1, Image(aBitmap
), aName
);
777 m_xBitmapLB
->SelectItem( nId
+ 1 );
778 *m_pnBitmapListState
|= ChangeType::MODIFIED
;
780 ModifyBitmapHdl(m_xBitmapLB
.get());
785 // graphic couldn't be loaded
786 std::unique_ptr
<weld::Builder
> xBuilder(Application::CreateBuilder(pDialogFrameWeld
, "cui/ui/querynoloadedfiledialog.ui"));
787 std::unique_ptr
<weld::MessageDialog
> xBox(xBuilder
->weld_message_dialog("NoLoadedFileDialog"));
792 sal_Int32
SvxBitmapTabPage::SearchBitmapList(const GraphicObject
& rGraphicObject
)
794 tools::Long nCount
= m_pBitmapList
->Count();
797 for(tools::Long i
= 0;i
< nCount
;i
++)
799 if(rGraphicObject
.GetUniqueID() == m_pBitmapList
->GetBitmap( i
)->GetGraphicObject().GetUniqueID())
808 sal_Int32
SvxBitmapTabPage::SearchBitmapList(std::u16string_view rBitmapName
)
810 tools::Long nCount
= m_pBitmapList
->Count();
811 bool bValidBitmapName
= true;
814 for(tools::Long i
= 0;i
< nCount
&& bValidBitmapName
;i
++)
816 if(rBitmapName
== m_pBitmapList
->GetBitmap( i
)->GetName())
819 bValidBitmapName
= false;
825 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */