24 #include <svx/svxids.hrc>
25 #include <strings.hrc>
36 #include <dialmgr.hxx>
70 :
SfxTabPage(pPage, pController,
"cui/ui/bitmaptabpage.ui",
"BitmapTabPage", &rInAttrs)
71 , m_rOutAttrs(rInAttrs)
72 , m_pnBitmapListState(nullptr)
74 , m_fObjectHeight(0.0)
75 , m_bLogicalSize(false)
76 , m_aXFillAttr(rInAttrs.GetPool())
79 , m_xBitmapLB(new
SvxPresetListBox(m_xBuilder->weld_scrolled_window(
"bitmapwin", true)))
80 , m_xBitmapStyleLB(m_xBuilder->weld_combo_box(
"bitmapstyle"))
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_BITMAP_PREVIEW", m_aCtlBitmapPreview))
95 , m_xBitmapLBWin(new
weld::CustomWeld(*m_xBuilder,
"BITMAP", *m_xBitmapLB))
153 if ( !aItem.isPattern() )
167 sal_uInt16
nId =
m_xBitmapLB->GetItemId( static_cast<size_t>( nPos ) );
176 return DeactivateRC::LeavePage;
192 bool bIsStretched( eStylePos == STRETCHED );
193 bool bIsTiled( eStylePos == TILED );
206 sal_Int64 nWidthPercent =
m_xBitmapWidth->get_value(FieldUnit::NONE);
207 sal_Int64 nHeightPercent =
m_xBitmapHeight->get_value(FieldUnit::NONE);
210 aSetBitmapSize.
setWidth( -nWidthPercent );
211 aSetBitmapSize.
setHeight( -nHeightPercent );
244 sal_uInt16 nOffsetValue =
static_cast<sal_uInt16
>(
m_xTileOffset->get_value(FieldUnit::PERCENT));
245 sal_uInt16 nRowOff = (eValue == ROW) ? nOffsetValue : 0;
246 sal_uInt16 nColOff = (eValue ==
COLUMN) ? nOffsetValue : 0;
256 double transfWidth = 0.0;
257 double transfHeight = 0.0;
258 double fUIScale = 1.0;
267 transfWidth =
static_cast<double>(
GetItem( rGeoAttr, SID_ATTR_TRANSFORM_WIDTH )->GetValue());
268 transfHeight=
static_cast<double>(
GetItem( rGeoAttr, SID_ATTR_TRANSFORM_HEIGHT )->GetValue());
281 if(!aItem.isPattern())
290 std::unique_ptr<GraphicObject> pGraphicObject;
291 pGraphicObject.reset(
new GraphicObject(aItem.GetGraphicObject()) );
293 BitmapEx aBmpEx(pGraphicObject->GetGraphic().GetBitmapEx());
294 Size aTempBitmapSize = aBmpEx.GetSizePixel();
298 bool bTiled =
false;
bool bStretched =
false;
339 nWidth = std::abs(nWidth);
351 nHeight = std::abs(nHeight);
375 m_xPositionLB->set_active( static_cast< sal_Int32 >(eValue) );
419 return std::make_unique<SvxBitmapTabPage>(pPage, pController, *rAttrs);
456 std::unique_ptr<GraphicObject> pGraphicObject;
457 size_t nPos = m_xBitmapLB->GetSelectItemPos();
461 pGraphicObject.reset(
new GraphicObject(m_pBitmapList->GetBitmap( static_cast<sal_uInt16>(nPos) )->GetGraphicObject()));
469 const drawing::FillStyle eXFS(static_cast<const XFillStyleItem*>(pPoolItem)->
GetValue());
471 if((drawing::FillStyle_BITMAP == eXFS) && (SfxItemState::SET == m_rOutAttrs.GetItemState(
GetWhich(
XATTR_FILLBITMAP),
true, &pPoolItem)))
473 pGraphicObject.reset(
new GraphicObject(static_cast<const XFillBitmapItem*>(pPoolItem)->GetGraphicObject()));
479 sal_uInt16
nId = m_xBitmapLB->GetItemId(0);
480 m_xBitmapLB->SelectItem(nId);
484 pGraphicObject.reset(
new GraphicObject(m_pBitmapList->GetBitmap(0)->GetGraphicObject()));
491 BitmapEx aBmpEx(pGraphicObject->GetGraphic().GetBitmapEx());
492 Size aTempBitmapSize = aBmpEx.GetSizePixel();
493 const double fUIScale = ( (
mpView &&
mpView->GetModel()) ?
double(
mpView->GetModel()->GetUIScale()) : 1.0);
496 rBitmapSize.setHeight( (
OutputDevice::LogicToLogic(static_cast<sal_Int32>(aTempBitmapSize.Height()),MapUnit::MapPixel, MapUnit::Map100thMM )) / fUIScale );
497 CalculateBitmapPresetSize();
498 ModifyBitmapStyleHdl( *m_xBitmapStyleLB );
499 ModifyBitmapPositionHdl( *m_xPositionLB );
505 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
506 m_aCtlBitmapPreview.Invalidate();
510 SAL_WARN(
"cui.tabpages",
"SvxBitmapTabPage::ModifyBitmapHdl(): null pGraphicObject");
517 sal_uInt16
nId = m_xBitmapLB->GetSelectedItemId();
518 size_t nPos = m_xBitmapLB->GetSelectItemPos();
523 OUString aDesc(
CuiResId( RID_SVXSTR_DESC_NEW_BITMAP ) );
524 OUString
aName( m_pBitmapList->GetBitmap( nPos )->GetName() );
530 while( bLoop && pDlg->Execute() ==
RET_OK )
532 pDlg->GetName(
aName );
533 sal_Int32 nBitmapPos = SearchBitmapList(
aName );
534 bool bValidBitmapName = (nBitmapPos ==
static_cast<sal_Int32
>(nPos) ) || (nBitmapPos == -1);
539 m_pBitmapList->GetBitmap(nPos)->SetName(
aName);
541 m_xBitmapLB->SetItemText(nId,
aName);
542 m_xBitmapLB->SelectItem( nId );
544 *m_pnBitmapListState |= ChangeType::MODIFIED;
549 std::unique_ptr<weld::MessageDialog> xBox(xBuilder->weld_message_dialog(
"DuplicateNameDialog"));
557 sal_uInt16
nId = m_xBitmapLB->GetSelectedItemId();
558 size_t nPos = m_xBitmapLB->GetSelectItemPos();
564 std::unique_ptr<weld::MessageDialog> xQueryBox(xBuilder->weld_message_dialog(
"AskDelBitmapDialog"));
566 if (xQueryBox->run() ==
RET_YES)
568 sal_uInt16 nNextId = m_xBitmapLB->GetItemId(nPos + 1);
570 nNextId = m_xBitmapLB->GetItemId(nPos - 1);
572 m_pBitmapList->Remove( static_cast<sal_uInt16>(nPos) );
573 m_xBitmapLB->RemoveItem( nId );
575 m_xBitmapLB->SelectItem(nNextId);
577 m_aCtlBitmapPreview.Invalidate();
578 ModifyBitmapHdl(m_xBitmapLB.get());
579 *m_pnBitmapListState |= ChangeType::MODIFIED;
585 m_bLogicalSize =
false;
588 sal_Int64 nWidthPercent = m_xBitmapWidth->denormalize(m_xBitmapWidth->get_value(FieldUnit::NONE));
589 sal_Int64 nHeightPercent = m_xBitmapHeight->denormalize(m_xBitmapHeight->get_value(FieldUnit::NONE));
590 if (nWidthPercent == 100 && nHeightPercent == 100)
591 m_xBitmapStyleLB->set_active(static_cast<sal_Int32>(
CUSTOM));
593 ModifyBitmapStyleHdl(*m_xBitmapStyleLB);
595 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
596 m_aCtlBitmapPreview.Invalidate();
603 m_xBitmapWidth->set_digits( 0 );
604 m_xBitmapWidth->set_unit(FieldUnit::PERCENT);
605 m_xBitmapWidth->set_value(100, FieldUnit::NONE);
606 m_xBitmapWidth->set_range(0, 100, FieldUnit::NONE);
608 m_xBitmapHeight->set_digits( 0 );
609 m_xBitmapHeight->set_unit(FieldUnit::PERCENT);
610 m_xBitmapHeight->set_value(100, FieldUnit::NONE);
611 m_xBitmapHeight->set_range(0, 100, FieldUnit::NONE);
615 m_xBitmapWidth->set_digits( 2 );
616 m_xBitmapWidth->set_unit(meFieldUnit);
617 m_xBitmapWidth->set_value(100, FieldUnit::NONE);
618 m_xBitmapWidth->set_range(0, 999900, FieldUnit::NONE);
620 m_xBitmapHeight->set_digits( 2 );
621 m_xBitmapHeight->set_unit(meFieldUnit);
622 m_xBitmapHeight->set_value(100, FieldUnit::NONE);
623 m_xBitmapHeight->set_range(0, 999900, FieldUnit::NONE);
626 ModifyBitmapStyleHdl( *m_xBitmapStyleLB );
632 bool bIsStretched( eStylePos == STRETCHED );
633 bool bIsTiled( eStylePos == TILED );
635 m_xSizeBox->set_sensitive( !bIsStretched );
636 m_xPositionBox->set_sensitive( !bIsStretched );
637 m_xPositionOffBox->set_sensitive( bIsTiled );
638 m_xTileOffBox->set_sensitive( bIsTiled );
651 if (m_xTsbScale->get_sensitive() && m_xTsbScale->get_state() ==
TRISTATE_TRUE)
653 aSetBitmapSize.
setWidth(-m_xBitmapWidth->get_value(FieldUnit::NONE));
654 aSetBitmapSize.
setHeight(-m_xBitmapHeight->get_value(FieldUnit::NONE));
671 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
672 m_aCtlBitmapPreview.Invalidate();
677 if (m_xPositionLB->get_sensitive())
678 m_rXFSet.Put(
XFillBmpPosItem( static_cast< RectPoint >( m_xPositionLB->get_active() ) ) );
680 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
681 m_aCtlBitmapPreview.Invalidate();
686 if (m_xPositionOffX->get_sensitive())
689 if (m_xPositionOffY->get_sensitive())
692 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
693 m_aCtlBitmapPreview.Invalidate();
698 sal_uInt16 nTileXOff = 0;
699 sal_uInt16 nTileYOff = 0;
701 if(m_xTileOffLB->get_active() ==
static_cast<sal_Int32
>(ROW))
702 nTileXOff = m_xTileOffset->get_value(FieldUnit::PERCENT);
704 if(m_xTileOffLB->get_active() ==
static_cast<sal_Int32
>(
COLUMN))
705 nTileYOff = m_xTileOffset->get_value(FieldUnit::PERCENT);
710 m_aCtlBitmapPreview.SetAttributes( m_aXFillAttr.GetItemSet() );
711 m_aCtlBitmapPreview.Invalidate();
727 std::unique_ptr<weld::WaitObject> xWait(
new weld::WaitObject(pDialogFrameWeld));
733 OUString aDesc(
CuiResId(RID_SVXSTR_DESC_EXT_BITMAP));
740 pDialogFrameWeld,
aURL.GetLastName().getToken(0,
'.'), aDesc));
743 while( pDlg->Execute() ==
RET_OK )
747 bool bDifferent =
true;
750 if( aName == m_pBitmapList->GetBitmap(
i )->GetName() )
759 std::unique_ptr<weld::MessageDialog> xBox(xBuilder->weld_message_dialog(
"DuplicateNameDialog"));
760 if (xBox->run() !=
RET_OK)
768 m_pBitmapList->Insert(std::make_unique<XBitmapEntry>(aGraphic, aName), nCount);
770 sal_Int32
nId = m_xBitmapLB->GetItemId( nCount - 1 );
771 BitmapEx aBitmap = m_pBitmapList->GetBitmapForPreview( nCount, m_xBitmapLB->GetIconSize() );
773 m_xBitmapLB->InsertItem( nId + 1,
Image(aBitmap), aName );
774 m_xBitmapLB->SelectItem( nId + 1 );
775 *m_pnBitmapListState |= ChangeType::MODIFIED;
777 ModifyBitmapHdl(m_xBitmapLB.get());
784 std::unique_ptr<weld::MessageDialog> xBox(xBuilder->weld_message_dialog(
"NoLoadedFileDialog"));
808 bool bValidBitmapName =
true;
816 bValidBitmapName =
false;
#define LINK(Instance, Class, Member)
void SetFieldUnit(weld::MetricSpinButton &rField, FieldUnit eUnit, bool bAll)
std::unique_ptr< weld::CheckButton > m_xTsbScale
ErrCode GetGraphic(Graphic &) const
std::unique_ptr< weld::MetricSpinButton > m_xBitmapHeight
constexpr TypedWhichId< XFillBmpTileOffsetYItem > XATTR_FILLBMP_TILEOFFSETY(XATTR_FILL_FIRST+15)
Size getDrawPreviewOptimalSize(const OutputDevice &rReference)
std::unique_ptr< weld::ComboBox > m_xPositionLB
void setWidth(tools::Long nWidth)
Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
std::unique_ptr< weld::MetricSpinButton > m_xTileOffset
#define VALUESET_ITEM_NOTFOUND
constexpr TypedWhichId< SfxMetricItem > XATTR_FILLBMP_SIZEX(XATTR_FILL_FIRST+9)
bool AreObjectsMarked() const
static SvxAbstractDialogFactory * Create()
constexpr TypedWhichId< XFillStyleItem > XATTR_FILLSTYLE(XATTR_FILL_FIRST)
constexpr OUStringLiteral PERCENT(u"Percent")
static weld::Builder * CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false)
XBitmapListRef m_pBitmapList
static const SfxPoolItem * GetItem(const SfxItemSet &rSet, sal_uInt16 nSlot, bool bDeep=true)
FieldUnit GetModuleFieldUnit(const SfxItemSet &rSet)
SfxItemSet GetGeoAttrFromMarked() const
static OutputDevice * GetDefaultDevice()
virtual MapUnit GetMetric(sal_uInt16 nWhich) const
sal_Int32 SearchBitmapList(std::u16string_view rBitmapName)
OString GetUniqueID() const
SvxBitmapTabPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rInAttrs)
static SfxViewShell * Current()
IMPL_LINK_NOARG(SvxBitmapTabPage, ModifyBitmapHdl, ValueSet *, void)
std::unique_ptr< weld::Container > m_xTileOffBox
std::unique_ptr< weld::CustomWeld > m_xCtlBitmapPreview
const GraphicObject & GetGraphicObject() const
virtual ~SvxBitmapTabPage() override
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
#define DBG_ASSERT(sCon, aError)
constexpr TypedWhichId< XFillBitmapItem > XATTR_FILLBITMAP(XATTR_FILL_FIRST+4)
int GetCoreValue(const weld::MetricSpinButton &rField, MapUnit eUnit)
constexpr TypedWhichId< XFillBmpPosItem > XATTR_FILLBMP_POS(XATTR_FILL_FIRST+8)
tools::Long Width() const
std::unique_ptr< weld::ComboBox > m_xBitmapStyleLB
void CalculateBitmapPresetSize()
void SetAttributes(const SfxItemSet &rItemSet)
virtual bool FillItemSet(SfxItemSet *) override
std::unique_ptr< SvxPresetListBox > m_xBitmapLB
void SetMetricValue(weld::MetricSpinButton &rField, int nCoreValue, MapUnit eUnit)
SfxItemPool * GetPool() const
virtual void Reset(const SfxItemSet *) override
OUString CuiResId(const char *pKey)
virtual void ActivatePage(const SfxItemSet &rSet) override
std::unique_ptr< weld::CustomWeld > m_xBitmapLBWin
std::unique_ptr< weld::ComboBox > m_xTileOffLB
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
Point PixelToLogic(const Point &rDevicePt) const
SvxXRectPreview m_aCtlBitmapPreview
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const Fraction & GetUIScale() const
std::unique_ptr< weld::MetricSpinButton > m_xPositionOffY
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
constexpr TypedWhichId< XFillBmpPosOffsetYItem > XATTR_FILLBMP_POSOFFSETY(XATTR_FILL_FIRST+18)
XFillAttrSetItem m_aXFillAttr
constexpr TypedWhichId< XFillBmpStretchItem > XATTR_FILLBMP_STRETCH(XATTR_FILL_FIRST+16)
constexpr TypedWhichId< XFillBmpPosOffsetXItem > XATTR_FILLBMP_POSOFFSETX(XATTR_FILL_FIRST+17)
tools::Long Height() const
constexpr TypedWhichId< XFillBmpTileItem > XATTR_FILLBMP_TILE(XATTR_FILL_FIRST+7)
std::unique_ptr< weld::MetricSpinButton > m_xPositionOffX
constexpr TypedWhichId< XFillBmpSizeLogItem > XATTR_FILLBMP_SIZELOG(XATTR_FILL_FIRST+13)
virtual SdrView * GetDrawView() const
void setHeight(tools::Long nHeight)
#define SAL_WARN(area, stream)
std::unique_ptr< weld::MetricSpinButton > m_xBitmapWidth
std::unique_ptr< weld::Button > m_xBtnImport
constexpr TypedWhichId< XFillBmpTileOffsetXItem > XATTR_FILLBMP_TILEOFFSETX(XATTR_FILL_FIRST+14)
constexpr TypedWhichId< XFillBmpSizeYItem > XATTR_FILLBMP_SIZEY(XATTR_FILL_FIRST+10)
SdrModel * GetModel() const
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
void ClickBitmapHdl_Impl()