26 #include <svx/svxids.hrc>
43 #include <svx/strings.hrc>
47 #include <boost/property_tree/ptree.hpp>
58 PosSizePropertyPanel::PosSizePropertyPanel(
60 const css::uno::Reference<css::frame::XFrame>& rxFrame,
62 const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
63 :
PanelLayout(pParent,
"PosSizePropertyPanel",
"svx/ui/sidebarpossize.ui"),
64 mxFtPosX(m_xBuilder->weld_label(
"horizontallabel")),
65 mxMtrPosX(m_xBuilder->weld_metric_spin_button(
"horizontalpos",
FieldUnit::
CM)),
66 mxFtPosY(m_xBuilder->weld_label(
"verticallabel")),
67 mxMtrPosY(m_xBuilder->weld_metric_spin_button(
"verticalpos",
FieldUnit::
CM)),
68 mxFtWidth(m_xBuilder->weld_label(
"widthlabel")),
69 mxMtrWidth(m_xBuilder->weld_metric_spin_button(
"selectwidth",
FieldUnit::
CM)),
70 mxFtHeight(m_xBuilder->weld_label(
"heightlabel")),
71 mxMtrHeight(m_xBuilder->weld_metric_spin_button(
"selectheight",
FieldUnit::
CM)),
72 mxCbxScale(m_xBuilder->weld_check_button(
"ratio")),
73 mxFtAngle(m_xBuilder->weld_label(
"rotationlabel")),
74 mxMtrAngle(m_xBuilder->weld_metric_spin_button(
"rotation",
FieldUnit::
DEGREE)),
76 mxDial(new
weld::CustomWeld(*m_xBuilder,
"orientationcontrol", *mxCtrlDial)),
77 mxFtFlip(m_xBuilder->weld_label(
"fliplabel")),
78 mxFlipTbx(m_xBuilder->weld_toolbar(
"selectrotationtype")),
80 mxArrangeTbx(m_xBuilder->weld_toolbar(
"arrangetoolbar")),
82 mxArrangeTbx2(m_xBuilder->weld_toolbar(
"arrangetoolbar2")),
84 mxAlignTbx(m_xBuilder->weld_toolbar(
"aligntoolbar")),
86 mxAlignTbx2(m_xBuilder->weld_toolbar(
"aligntoolbar2")),
88 mxBtnEditOLEObject(m_xBuilder->weld_button(
"btnEditObject")),
96 maTransfPosXControl(SID_ATTR_TRANSFORM_POS_X, *pBindings, *this),
97 maTransfPosYControl(SID_ATTR_TRANSFORM_POS_Y, *pBindings, *this),
98 maTransfWidthControl(SID_ATTR_TRANSFORM_WIDTH, *pBindings, *this),
99 maTransfHeightControl(SID_ATTR_TRANSFORM_HEIGHT, *pBindings, *this),
100 maSvxAngleControl( SID_ATTR_TRANSFORM_ANGLE, *pBindings, *this),
101 maRotXControl(SID_ATTR_TRANSFORM_ROT_X, *pBindings, *this),
102 maRotYControl(SID_ATTR_TRANSFORM_ROT_Y, *pBindings, *this),
103 maProPosControl(SID_ATTR_TRANSFORM_PROTECT_POS, *pBindings, *this),
104 maProSizeControl(SID_ATTR_TRANSFORM_PROTECT_SIZE, *pBindings, *this),
105 maAutoWidthControl(SID_ATTR_TRANSFORM_AUTOWIDTH, *pBindings, *this),
106 maAutoHeightControl(SID_ATTR_TRANSFORM_AUTOHEIGHT, *pBindings, *this),
107 m_aMetricCtl(SID_ATTR_METRIC, *pBindings, *this),
108 mpBindings(pBindings),
109 mbSizeProtected(
false),
110 mbPositionProtected(
false),
113 mbAdjustEnabled(
false),
121 auto nWidth =
mxFtWidth->get_preferred_size().Width();
122 OUString sLabel =
mxFtWidth->get_label();
124 nWidth = std::max(nWidth,
mxFtWidth->get_preferred_size().Width());;
179 bool hasText(
const SdrView& rSdrView)
192 if(pSdrTextObj && pSdrTextObj->
HasText())
225 Size aSize(nDim, nDim);
248 const css::uno::Reference<css::frame::XFrame>& rxFrame,
250 const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
252 if (pParent ==
nullptr)
253 throw lang::IllegalArgumentException(
"no parent Window given to PosSizePropertyPanel::Create",
nullptr, 0);
255 throw lang::IllegalArgumentException(
"no XFrame given to PosSizePropertyPanel::Create",
nullptr, 1);
256 if (pBindings ==
nullptr)
257 throw lang::IllegalArgumentException(
"no SfxBindings given to PosSizePropertyPanel::Create",
nullptr, 2);
259 return std::make_unique<PosSizePropertyPanel>(pParent, rxFrame, pBindings, rxSidebar);
273 bool bShowPosition =
false;
274 bool bShowAngle =
false;
275 bool bShowFlip =
false;
276 bool bShowEditObject =
false;
277 bool bShowArrangeTbx2 =
false;
284 bShowArrangeTbx2 =
true;
299 bShowPosition =
true;
305 bShowEditObject =
true;
310 bShowPosition =
true;
311 bShowEditObject =
true;
322 bShowPosition =
true;
327 mxFtPosX->set_visible(bShowPosition);
329 mxFtPosY->set_visible(bShowPosition);
354 if( mxCbxScale->get_active() &&
355 mxCbxScale->get_sensitive() )
357 tools::Long nHeight =
static_cast<tools::Long>( (
static_cast<double>(mlOldHeight) * static_cast<double>(mxMtrWidth->get_value(FieldUnit::NONE))) /
static_cast<double>(mlOldWidth) );
358 if( nHeight <= mxMtrHeight->get_max( FieldUnit::NONE ) )
360 mxMtrHeight->set_value( nHeight, FieldUnit::NONE );
364 nHeight =
static_cast<tools::Long>(mxMtrHeight->get_max( FieldUnit::NONE ));
365 mxMtrHeight->set_value(nHeight, FieldUnit::NONE);
366 const tools::Long nWidth =
static_cast<tools::Long>( (
static_cast<double>(mlOldWidth) * static_cast<double>(nHeight)) / static_cast<double>(mlOldHeight) );
367 mxMtrWidth->set_value( nWidth, FieldUnit::NONE );
376 if( mxCbxScale->get_active() &&
377 mxCbxScale->get_sensitive() )
379 tools::Long nWidth =
static_cast<tools::Long>( (
static_cast<double>(mlOldWidth) * static_cast<double>(mxMtrHeight->get_value(FieldUnit::NONE))) /
static_cast<double>(mlOldHeight) );
380 if( nWidth <= mxMtrWidth->get_max( FieldUnit::NONE ) )
382 mxMtrWidth->set_value( nWidth, FieldUnit::NONE );
386 nWidth =
static_cast<tools::Long>(mxMtrWidth->get_max( FieldUnit::NONE ));
387 mxMtrWidth->set_value( nWidth, FieldUnit::NONE );
388 const tools::Long nHeight =
static_cast<tools::Long>( (
static_cast<double>(mlOldHeight) * static_cast<double>(nWidth)) / static_cast<double>(mlOldWidth) );
389 mxMtrHeight->set_value( nHeight, FieldUnit::NONE );
398 if ( mxMtrPosX->get_value_changed_from_saved())
405 SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,static_cast<sal_uInt32>(lX));
408 SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aPosXItem });
414 if ( mxMtrPosY->get_value_changed_from_saved() )
421 SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,static_cast<sal_uInt32>(lY));
424 SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aPosYItem });
430 if ( mxCbxScale->get_active() )
432 mlOldWidth = std::max(
GetCoreValue(*mxMtrWidth, mePoolUnit), SAL_CONST_INT64(1));
433 mlOldHeight = std::max(
GetCoreValue(*mxMtrHeight, mePoolUnit), SAL_CONST_INT64(1));
437 SvtViewOptions aPageOpt(EViewType::TabPage,
"cui/ui/possizetabpage/PositionAndSize");
443 Degree100 nTmp = mxCtrlDial->GetRotation();
446 const double fUIScale(
mpView &&
mpView->GetModel() ? double(
mpView->GetModel()->GetUIScale()) : 1.0);
447 SdrAngleItem aAngleItem( SID_ATTR_TRANSFORM_ANGLE, nTmp);
452 SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem });
469 const int nMaxDigits = 7;
483 mxDial->set_sensitive(
true);
507 case SID_ATTR_TRANSFORM_WIDTH:
508 if ( SfxItemState::DEFAULT == eState )
527 case SID_ATTR_TRANSFORM_HEIGHT:
528 if ( SfxItemState::DEFAULT == eState )
547 case SID_ATTR_TRANSFORM_POS_X:
548 if(SfxItemState::DEFAULT == eState)
566 case SID_ATTR_TRANSFORM_POS_Y:
567 if(SfxItemState::DEFAULT == eState)
585 case SID_ATTR_TRANSFORM_ROT_X:
586 if (SfxItemState::DEFAULT == eState)
598 case SID_ATTR_TRANSFORM_ROT_Y:
599 if (SfxItemState::DEFAULT == eState)
611 case SID_ATTR_TRANSFORM_PROTECT_POS:
612 if(SfxItemState::DEFAULT == eState)
627 case SID_ATTR_TRANSFORM_PROTECT_SIZE:
628 if(SfxItemState::DEFAULT == eState)
643 case SID_ATTR_TRANSFORM_AUTOWIDTH:
644 if(SfxItemState::DEFAULT == eState)
655 case SID_ATTR_TRANSFORM_AUTOHEIGHT:
656 if(SfxItemState::DEFAULT == eState)
667 case SID_ATTR_TRANSFORM_ANGLE:
668 if (eState >= SfxItemState::DEFAULT)
687 case SID_ATTR_METRIC:
699 switch (rMarkList.GetMarkCount())
706 const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
716 mxDial->set_sensitive(
false);
725 sal_uInt16 nMarkObj = 0;
726 bool isNoEdge =
true;
728 while(isNoEdge && rMarkList.GetMark(nMarkObj))
730 const SdrObject* pObj = rMarkList.GetMark(nMarkObj)->GetMarkedSdrObj();
748 mxDial->set_sensitive(
false);
765 SvtViewOptions aPageOpt(EViewType::TabPage,
"cui/ui/possizetabpage/PositionAndSize");
769 if ( aUserItem >>= aTemp )
771 mxCbxScale->set_active(static_cast<bool>(sUserData.toInt32()));
779 case SID_ATTR_TRANSFORM_POS_X:
782 case SID_ATTR_TRANSFORM_POS_Y:
785 case SID_ATTR_TRANSFORM_WIDTH:
788 case SID_ATTR_TRANSFORM_HEIGHT:
793 if (pControl && !pControl->
get_text().isEmpty())
809 double nWidth =
static_cast<double>(
mxMtrWidth->get_value(FieldUnit::MM_100TH));
815 double nHeight =
static_cast<double>(
mxMtrHeight->get_value(FieldUnit::MM_100TH));
821 SfxUInt32Item aWidthItem( SID_ATTR_TRANSFORM_WIDTH, static_cast<sal_uInt32>(lWidth));
822 SfxUInt32Item aHeightItem( SID_ATTR_TRANSFORM_HEIGHT, static_cast<sal_uInt32>(lHeight));
831 SfxCallMode::RECORD, { &aWidthItem, &aHeightItem, &aPointItem });
837 SfxCallMode::RECORD, { &aWidthItem, &aHeightItem, &aPointItem });
838 else if(
mxMtrWidth->get_value_changed_from_saved())
840 SfxCallMode::RECORD, { &aWidthItem, &aPointItem });
841 else if (
mxMtrHeight->get_value_changed_from_saved())
843 SfxCallMode::RECORD, { &aHeightItem, &aPointItem });
859 bool bPosXBlank =
false;
860 bool bPosYBlank =
false;
861 bool bWidthBlank =
false;
862 bool bHeightBlank =
false;
899 if ( pState && eState >= SfxItemState::DEFAULT )
920 SAL_WARN(
"svx.sidebar",
"GetModuleFieldUnit(): no module found");
941 mxDial->set_sensitive(
false);
1024 const sal_uInt16 nDigits(
mxMtrPosX->get_digits());
1039 fLeft = std::clamp(fLeft, -fMaxLong, fMaxLong);
1040 fRight = std::clamp(fRight, -fMaxLong, fMaxLong);
1041 fTop = std::clamp(fTop, - fMaxLong, fMaxLong);
1042 fBottom = std::clamp(fBottom, -fMaxLong, fMaxLong);
#define LINK(Instance, Class, Member)
void SetUserItem(const OUString &sName, const css::uno::Any &aValue)
void SetFieldUnit(weld::MetricSpinButton &rField, FieldUnit eUnit, bool bAll)
sal_Int32 GetValue() const
const SfxPoolItem * ExecuteList(sal_uInt16 nSlot, SfxCallMode nCall, std::initializer_list< SfxPoolItem const * > args, std::initializer_list< SfxPoolItem const * > internalargs=std::initializer_list< SfxPoolItem const * >())
void SetMetricValue(weld::MetricSpinButton &rField, sal_Int64 nCoreValue, MapUnit eUnit)
size_t GetMarkCount() const
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
This control allows to input a rotation angle, visualized by a dial.
static const AllSettings & GetSettings()
periodic cubic Spline (ni)
MapUnit GetCoreMetric() const
SdrMark * GetMark(size_t nNum) const
virtual SfxBindings & GetBindings() override
virtual int get_width_chars() const =0
virtual void set_width_chars(int nChars)=0
void Invalidate(sal_uInt16 nId)
virtual SdrObjKind GetObjIdentifier() const
virtual SfxObjectShell * GetObjectShell() override
virtual bool HasText() const override
constexpr tools::Long Width() const
SfxModule * GetModule() const
void LogicToPagePos(Point &rPnt) const
OUString SvxResId(TranslateId aId)
static SfxViewShell * Current()
B2IRange fround(const B2DRange &rRange)
sal_Int32 GetCombinedContext_DI() const
SdrObject * GetMarkedSdrObj() const
const SfxPoolItem * GetItem(sal_uInt16 nSlotId) const
UNDERLYING_TYPE get() const
const SdrMarkList & GetMarkedObjectList() const
TitleText, special text object for StarDraw.
const tools::Rectangle & GetAllMarkedRect() const
virtual SdrInventor GetObjInventor() const
Degree100 NormAngle36000(Degree100 a)
Normalize angle to -180.00..179.99.
const LocaleDataWrapper & GetNeutralLocaleDataWrapper() const
void Update(sal_uInt16 nId)
const Fraction & GetUIScale() const
virtual ErrCode DoVerb(sal_Int32 nVerb)
static SfxViewFrame * Current()
constexpr tools::Long Height() const
sal_Int64 GetCoreValue(const weld::MetricSpinButton &rField, MapUnit eUnit)
constexpr OUStringLiteral USERITEM_NAME
Degree100 GetValue() const
css::uno::Any GetUserItem(const OUString &sName) const
void ScaleRect(basegfx::B2DRange &rRange, const Fraction &rUIScale)
virtual SdrView * GetDrawView() const
SdrPageView * GetSdrPageView() const
sal_Int64 ConvertValue(sal_Int64 nValue, sal_Int64 mnBaseValue, sal_uInt16 nDecDigits, FieldUnit eInUnit, FieldUnit eOutUnit)
sal_uInt32 GetValue() const
SfxDispatcher * GetDispatcher() const
#define SAL_WARN(area, stream)
virtual void DumpAsPropertyTree(tools::JsonWriter &)
sal_Int64 fround64(double fVal)
SdrModel * GetModel() const
const tools::Rectangle & GetWorkArea() const
#define CombinedEnumContext(a, e)
void ConvertRect(basegfx::B2DRange &rRange, const sal_uInt16 nDigits, const MapUnit ePoolUnit, const FieldUnit eDlgUnit)
bool m_bDetectedRangeSegmentation false