32#include <svx/svxids.hrc>
47 SID_ATTR_TRANSFORM_POS_X, SID_ATTR_TRANSFORM_POS_Y,
48 SID_ATTR_TRANSFORM_WIDTH, SID_ATTR_TRANSFORM_SIZE_POINT,
49 SID_ATTR_TRANSFORM_PROTECT_POS, SID_ATTR_TRANSFORM_INTERN,
50 SID_ATTR_TRANSFORM_AUTOWIDTH, SID_ATTR_TRANSFORM_AUTOHEIGHT,
51 SID_ATTR_TRANSFORM_ANCHOR, SID_ATTR_TRANSFORM_VERT_ORIENT
55 SID_ATTR_TRANSFORM_ROT_X, SID_ATTR_TRANSFORM_ANGLE,
56 SID_ATTR_TRANSFORM_INTERN, SID_ATTR_TRANSFORM_INTERN
60 SDRATTR_CORNER_RADIUS, SDRATTR_CORNER_RADIUS,
61 SID_ATTR_TRANSFORM_INTERN, SID_ATTR_TRANSFORM_INTERN,
62 SID_ATTR_TRANSFORM_SHEAR, SID_ATTR_TRANSFORM_SHEAR_VERTICAL
75 , nAnchorCtrls(nAnchorTypes)
80 if(
nAnchorCtrls & (SvxAnchorIds::Paragraph | SvxAnchorIds::Character | SvxAnchorIds::Page | SvxAnchorIds::Fly))
98 if (rId ==
"RID_SVXPAGE_POSITION_SIZE")
115 else if (rId ==
"RID_SVXPAGE_SWPOSSIZE")
123 else if (rId ==
"RID_SVXPAGE_ANGLE")
130 else if (rId ==
"RID_SVXPAGE_SLANT")
151 :
SvxTabPage(pPage, pController,
"cui/ui/rotationtabpage.ui",
"Rotation", rInAttrs)
155 , m_xFlPosition(m_xBuilder->weld_widget(
"FL_POSITION"))
156 , m_xMtrPosX(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_POS_X",
FieldUnit::
CM))
157 , m_xMtrPosY(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_POS_Y",
FieldUnit::
CM))
158 , m_xCtlRect(new
weld::CustomWeld(*m_xBuilder,
"CTL_RECT", m_aCtlRect))
159 , m_xFlAngle(m_xBuilder->weld_widget(
"FL_ANGLE"))
160 , m_xNfAngle(m_xBuilder->weld_metric_spin_button(
"NF_ANGLE",
FieldUnit::
DEGREE))
161 , m_xCtlAngle(new
svx::DialControl)
162 , m_xCtlAngleWin(new
weld::CustomWeld(*m_xBuilder,
"CTL_ANGLE", *m_xCtlAngle))
226 bool bModified =
false;
260 pItem =
GetItem(*rAttrs, SID_ATTR_TRANSFORM_ROT_Y);
271 pItem =
GetItem( *rAttrs, SID_ATTR_TRANSFORM_ANGLE );
287 return std::make_unique<SvxAngleTabPage>(pPage, pController, *
rSet);
295 m_xFlAngle->set_sensitive(!bPosProtect->GetValue());
306 return DeactivateRC::LeavePage;
311 if (pDrawingArea !=
m_aCtlRect.GetDrawingArea())
379 :
SfxTabPage(pPage, pController,
"cui/ui/slantcornertabpage.ui",
"SlantAndCornerRadius", &rInAttrs)
382 , m_xFlRadius(m_xBuilder->weld_widget(
"FL_RADIUS"))
383 , m_xMtrRadius(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_RADIUS",
FieldUnit::
CM))
384 , m_xFlAngle(m_xBuilder->weld_widget(
"FL_SLANT"))
385 , m_xMtrAngle(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_ANGLE",
FieldUnit::
DEGREE))
387 for (
int i = 0;
i < 2; ++
i)
389 m_aControlGroups[
i] = m_xBuilder->weld_widget(
"controlgroups" + OUString::number(
i+1));
390 m_aControlGroupX[
i] = m_xBuilder->weld_widget(
"controlgroupx" + OUString::number(
i+1));
391 m_aControlX[
i] = m_xBuilder->weld_metric_spin_button(
"controlx" + OUString::number(
i+1), FieldUnit::CM);
392 m_aControlGroupY[
i] = m_xBuilder->weld_widget(
"controlgroupy" + OUString::number(
i+1));
393 m_aControlY[
i] = m_xBuilder->weld_metric_spin_button(
"controly" + OUString::number(
i+1), FieldUnit::CM);
401 assert(pPool &&
"no pool (!)");
415 for (
int i = 0;
i < 2; ++
i)
429 bool bModified =
false;
442 sal_Int32
nValue =
static_cast<sal_Int32
>(
m_xMtrAngle->get_value(FieldUnit::NONE));
456 rAttrs->
Put(
SfxBoolItem( SID_ATTR_TRANSFORM_SHEAR_VERTICAL,
false ) );
459 bool bControlPointsChanged =
false;
460 for (
int i = 0;
i < 2; ++
i)
462 bControlPointsChanged |= (
m_aControlX[
i]->get_value_changed_from_saved() ||
466 if (!bControlPointsChanged)
469 bool bSelectionIsSdrObjCustomShape(
false);
485 if(
nullptr == pCandidate)
495 bSelectionIsSdrObjCustomShape =
true;
499 if(bSelectionIsSdrObjCustomShape)
505 std::unique_ptr<SdrUndoAction> pUndo;
511 rModel.
BegUndo(pUndo->GetComment());
517 for (
int i = 0;
i < 2; ++
i)
523 aNewPosition.
Move(aLogicRect.
Left(), aLogicRect.
Top());
525 css::awt::Point aPosition;
526 aPosition.X = aNewPosition.
X();
527 aPosition.Y = aNewPosition.
Y();
539 rModel.
AddUndo(std::move(pUndo));
565 const double fTmp(
static_cast<double>(
static_cast<const SdrMetricItem*
>(pItem)->
GetValue()) / fUIScale);
584 pItem =
GetItem( *rAttrs, SID_ATTR_TRANSFORM_SHEAR );
598 bool bSelectionIsSdrObjCustomShape(
false);
609 if(
nullptr == pCandidate)
619 bSelectionIsSdrObjCustomShape =
true;
623 if(bSelectionIsSdrObjCustomShape)
634 for (
int i = 0;
i < 2; ++
i)
636 Point aInitialPosition;
640 css::awt::Point aPosition;
655 aInitialPosition.
Move(-aLogicRect.
Left(), -aLogicRect.
Top());
656 aMaxPosition.
Move(-aLogicRect.
Left(), -aLogicRect.
Top());
657 aMinPosition.
Move(-aLogicRect.
Left(), -aLogicRect.
Top());
662 if (aMaxPosition.
X() == aMinPosition.
X())
665 m_aControlX[
i]->set_range(aMinPosition.
X(), aMaxPosition.
X(), FieldUnit::MM);
666 if (aMaxPosition.
Y() == aMinPosition.
Y())
669 m_aControlY[
i]->set_range(aMinPosition.
Y(), aMaxPosition.
Y(), FieldUnit::MM);
677 for (
int i = 0;
i < 2; ++
i)
686 return std::make_unique<SvxSlantTabPage>(pPage, pController, *rOutAttrs);
693 m_xFlAngle->set_sensitive(!bPosProtect->GetValue());
697 m_xFlAngle->set_sensitive(!bSizeProtect->GetValue());
709 return DeactivateRC::LeavePage;
719 :
SvxTabPage(pPage, pController,
"cui/ui/possizetabpage.ui",
"PositionAndSize", rInAttrs)
720 , mrOutAttrs(rInAttrs)
724 , mbPageDisabled(false)
725 , mbProtectDisabled(false)
726 , mbSizeDisabled(false)
727 , mbAdjustDisabled(true)
728 , mbIgnoreAutoGrowWidth(true)
729 , mbIgnoreAutoGrowHeight(true)
734 , m_xFlPosition(m_xBuilder->weld_widget(
"FL_POSITION"))
735 , m_xMtrPosX(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_POS_X",
FieldUnit::
CM))
736 , m_xMtrPosY(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_POS_Y",
FieldUnit::
CM))
737 , m_xCtlPos(new
weld::CustomWeld(*m_xBuilder,
"CTL_POSRECT", m_aCtlPos))
738 , m_xFlSize(m_xBuilder->weld_widget(
"FL_SIZE"))
739 , m_xFtWidth(m_xBuilder->weld_label(
"FT_WIDTH"))
740 , m_xMtrWidth(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_WIDTH",
FieldUnit::
CM))
741 , m_xFtHeight(m_xBuilder->weld_label(
"FT_HEIGHT"))
742 , m_xMtrHeight(m_xBuilder->weld_metric_spin_button(
"MTR_FLD_HEIGHT",
FieldUnit::
CM))
743 , m_xCbxScale(m_xBuilder->weld_check_button(
"CBX_SCALE"))
744 , m_xCtlSize(new
weld::CustomWeld(*m_xBuilder,
"CTL_SIZERECT", m_aCtlSize))
745 , m_xFlProtect(m_xBuilder->weld_widget(
"FL_PROTECT"))
746 , m_xTsbPosProtect(m_xBuilder->weld_check_button(
"TSB_POSPROTECT"))
747 , m_xTsbSizeProtect(m_xBuilder->weld_check_button(
"TSB_SIZEPROTECT"))
748 , m_xFlAdjust(m_xBuilder->weld_widget(
"FL_ADJUST"))
749 , m_xTsbAutoGrowWidth(m_xBuilder->weld_check_button(
"TSB_AUTOGROW_WIDTH"))
750 , m_xTsbAutoGrowHeight(m_xBuilder->weld_check_button(
"TSB_AUTOGROW_HEIGHT"))
753 SetExchangeSupport();
762 meRP = RectPoint::LT;
846 (SdrObjKind::Text == eKind || SdrObjKind::TitleText == eKind || SdrObjKind::OutlineText == eKind) &&
868 const sal_uInt16 nDigits(
m_xMtrPosX->get_digits());
878 bool bModified(
false);
935 double nWidth =
static_cast<double>(
m_xMtrWidth->get_value(FieldUnit::MM_100TH));
941 double nHeight =
static_cast<double>(
m_xMtrHeight->get_value(FieldUnit::MM_100TH));
947 rOutAttrs->
Put(
SfxUInt32Item( SID_ATTR_TRANSFORM_WIDTH,
static_cast<sal_uInt32
>(lWidth) ) );
948 rOutAttrs->
Put(
SfxUInt32Item( SID_ATTR_TRANSFORM_HEIGHT,
static_cast<sal_uInt32
>(lHeight) ) );
949 rOutAttrs->
Put(
SfxUInt16Item( SID_ATTR_TRANSFORM_SIZE_POINT, sal::static_int_cast< sal_uInt16 >(
meRP ) ) );
1043 fTmpWidth *= pow(10.0,
m_xMtrWidth->get_digits());
1044 m_xMtrWidth->set_value(fTmpWidth, FieldUnit::MM_100TH);
1053 m_xMtrHeight->set_value(fTmpHeight, FieldUnit::MM_100TH);
1081 OUString
aStr = GetUserData();
1100 return std::make_unique<SvxPositionSizeTabPage>(pPage, pController, *rOutAttrs);
1108 const ::tools::Rectangle aTempRect(pRectItem->GetValue());
1121 double fX(
static_cast<double>(
m_xMtrPosX->get_value(FieldUnit::NONE)));
1122 double fY(
static_cast<double>(
m_xMtrPosY->get_value(FieldUnit::NONE)));
1125 const ::tools::Rectangle aOutRectangle(
1136 return DeactivateRC::LeavePage;
1144 UpdateControlStates();
1181 if (m_xTsbSizeProtect->get_sensitive())
1191 mnProtectSizeState = m_xTsbSizeProtect->get_state();
1194 UpdateControlStates();
1270 fLeft = std::clamp(fLeft, -fMaxLong, fMaxLong);
1271 fRight = std::clamp(fRight, -fMaxLong, fMaxLong);
1272 fTop = std::clamp(fTop, - fMaxLong, fMaxLong);
1273 fBottom = std::clamp(fBottom, -fMaxLong, fMaxLong);
1317 const double f3(std::min(f1, f2));
1320 const double f6(std::min(f4, f5));
1415 if (pDrawingArea ==
m_aCtlPos.GetDrawingArea())
1497 if( !(m_xCbxScale->get_active() && m_xCbxScale->get_sensitive()) )
1500 sal_Int64 nHeight(
basegfx::fround64((mfOldHeight *
static_cast<double>(m_xMtrWidth->get_value(FieldUnit::NONE))) / mfOldWidth));
1501 sal_Int64 nMin, nMax;
1502 m_xMtrHeight->get_range(nMin, nMax, FieldUnit::NONE);
1504 if (nHeight <= nMax)
1506 m_xMtrHeight->set_value(nHeight, FieldUnit::NONE);
1511 m_xMtrHeight->set_value(nHeight, FieldUnit::NONE);
1513 const sal_Int64 nWidth(
basegfx::fround64((mfOldWidth *
static_cast<double>(nHeight)) / mfOldHeight));
1514 m_xMtrWidth->set_value(nWidth, FieldUnit::NONE);
1520 if( !(m_xCbxScale->get_active() && m_xCbxScale->get_sensitive()) )
1523 sal_Int64 nWidth(
basegfx::fround64((mfOldWidth *
static_cast<double>(m_xMtrHeight->get_value(FieldUnit::NONE))) / mfOldHeight));
1524 sal_Int64 nMin, nMax;
1525 m_xMtrWidth->get_range(nMin, nMax, FieldUnit::NONE);
1529 m_xMtrWidth->set_value(nWidth, FieldUnit::NONE);
1534 m_xMtrWidth->set_value(nWidth, FieldUnit::NONE);
1536 const sal_Int64 nHeight(
basegfx::fround64((mfOldHeight *
static_cast<double>(nWidth)) / mfOldWidth));
1537 m_xMtrHeight->set_value(nHeight, FieldUnit::NONE);
1543 UpdateControlStates();
1548 if (m_xCbxScale->get_active())
1550 mfOldWidth = std::max(
static_cast<double>(
GetCoreValue( *m_xMtrWidth, mePoolUnit )), 1.0 );
1551 mfOldHeight = std::max(
static_cast<double>(
GetCoreValue( *m_xMtrHeight, mePoolUnit )), 1.0 );
1558 OUString
aStr =
m_xCbxScale->get_active() ? OUString(
"1") : OUString(
"0");
1559 SetUserData(
aStr );
bool SetHandleControllerPosition(const sal_uInt32 nIndex, const css::awt::Point &rPosition)
bool GetHandlePosition(const sal_uInt32 nIndex, Point &rReturnPosition) const
const tools::Rectangle & GetLogicRect() const
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
constexpr tools::Long Y() const
void Move(tools::Long nHorzMove, tools::Long nVertMove)
constexpr tools::Long X() const
const tools::Rectangle & GetWorkArea() const
bool IsEdgeRadiusAllowed() const
bool IsShearAllowed() const
bool IsRotateAllowed(bool b90Deg=false) const
size_t GetMarkCount() const
SdrMark * GetMark(size_t nNum) const
const SdrMarkList & GetMarkedObjectList() const
const tools::Rectangle & GetAllMarkedRect() const
SdrObject * GetMarkedSdrObj() const
virtual void SetChanged(bool bFlg=true)
void AddUndo(std::unique_ptr< SdrUndoAction > pUndo)
SdrUndoFactory & GetSdrUndoFactory() const
bool IsUndoEnabled() const
const Fraction & GetUIScale() const
const SfxPoolItem & GetMergedItem(const sal_uInt16 nWhich) const
const Point & GetAnchorPos() const
virtual bool HasText() const
void BroadcastObjectChange() const
virtual SdrInventor GetObjInventor() const
SdrModel & getSdrModelFromSdrObject() const
virtual void SetChanged()
virtual SdrObjKind GetObjIdentifier() const
void SetMergedItem(const SfxPoolItem &rItem)
void LogicToPagePos(Point &rPnt) const
SdrPageView * GetSdrPageView() const
SdrModel & GetModel() const
virtual std::unique_ptr< SdrUndoAction > CreateUndoAttrObject(SdrObject &rObject, bool bStyleSheet1=false, bool bSaveText=false)
virtual MapUnit GetMetric(sal_uInt16 nWhich) const
SfxItemPool * GetPool() const
const T * GetItemIfSet(TypedWhichId< T > nWhich, bool bSrchInParent=true) const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
void InvalidateItem(sal_uInt16 nWhich)
void AddTabPage(const OUString &rName, CreateTabPage pCreateFunc, GetTabPageRanges pRangesFunc)
void RemoveTabPage(const OUString &rName)
const SfxItemSet & GetItemSet() const
void SetExchangeSupport()
static const SfxPoolItem * GetItem(const SfxItemSet &rSet, sal_uInt16 nSlot, bool bDeep=true)
basegfx::B2DPoint maAnchor
static const WhichRangesContainer pAngleRanges
std::unique_ptr< weld::MetricSpinButton > m_xMtrPosX
std::unique_ptr< weld::Widget > m_xFlPosition
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
std::unique_ptr< weld::MetricSpinButton > m_xMtrPosY
std::unique_ptr< weld::MetricSpinButton > m_xNfAngle
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
void SetView(const SdrView *pSdrView)
virtual void Reset(const SfxItemSet *) override
SvxAngleTabPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rInAttrs)
std::unique_ptr< svx::DialControl > m_xCtlAngle
basegfx::B2DRange maRange
virtual void ActivatePage(const SfxItemSet &rSet) override
std::unique_ptr< weld::Widget > m_xFlAngle
virtual void PointChanged(weld::DrawingArea *pWindow, RectPoint eRP) override
virtual ~SvxAngleTabPage() override
static WhichRangesContainer GetRanges()
virtual bool FillItemSet(SfxItemSet *) override
void UpdateControlStates()
void GetTopLeftPosition(double &rfX, double &rfY, const basegfx::B2DRange &rRange)
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
SvxPositionSizeTabPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rInAttrs)
std::unique_ptr< weld::MetricSpinButton > m_xMtrPosY
basegfx::B2DRange maRange
std::unique_ptr< weld::Label > m_xFtHeight
std::unique_ptr< weld::CheckButton > m_xTsbSizeProtect
std::unique_ptr< weld::CheckButton > m_xCbxScale
virtual void PointChanged(weld::DrawingArea *pWindow, RectPoint eRP) override
void SetView(const SdrView *pSdrView)
std::unique_ptr< weld::MetricSpinButton > m_xMtrPosX
std::unique_ptr< weld::CheckButton > m_xTsbAutoGrowWidth
std::unique_ptr< weld::Widget > m_xFlSize
virtual void FillUserData() override
virtual void ActivatePage(const SfxItemSet &rSet) override
basegfx::B2DRange maWorkRange
bool mbIgnoreAutoGrowWidth
std::unique_ptr< weld::CustomWeld > m_xCtlSize
virtual ~SvxPositionSizeTabPage() override
static WhichRangesContainer GetRanges()
static const WhichRangesContainer pPosSizeRanges
bool mbIgnoreAutoGrowHeight
virtual bool FillItemSet(SfxItemSet *) override
const SfxItemSet & mrOutAttrs
std::unique_ptr< weld::MetricSpinButton > m_xMtrHeight
std::unique_ptr< weld::Widget > m_xFlAdjust
virtual void Reset(const SfxItemSet *) override
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
std::unique_ptr< weld::Widget > m_xFlProtect
std::unique_ptr< weld::Label > m_xFtWidth
std::unique_ptr< weld::Widget > m_xFlPosition
std::unique_ptr< weld::MetricSpinButton > m_xMtrWidth
std::unique_ptr< weld::CheckButton > m_xTsbAutoGrowHeight
basegfx::B2DPoint maAnchor
std::unique_ptr< weld::CheckButton > m_xTsbPosProtect
void SetActualRP(RectPoint eNewRP)
RectPoint GetActualRP() const
void SetView(const SdrView *pSdrView)
std::unique_ptr< weld::MetricSpinButton > m_xMtrRadius
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
virtual bool FillItemSet(SfxItemSet *) override
std::unique_ptr< weld::Widget > m_aControlGroupY[2]
std::unique_ptr< weld::MetricSpinButton > m_aControlX[2]
std::unique_ptr< weld::Widget > m_aControlGroupX[2]
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
std::unique_ptr< weld::Widget > m_aControlGroups[2]
static const WhichRangesContainer pSlantRanges
virtual void ActivatePage(const SfxItemSet &rSet) override
std::unique_ptr< weld::MetricSpinButton > m_xMtrAngle
static WhichRangesContainer GetRanges()
virtual void Reset(const SfxItemSet *) override
SvxSlantTabPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rInAttrs)
std::unique_ptr< weld::MetricSpinButton > m_aControlY[2]
std::unique_ptr< weld::Widget > m_xFlAngle
std::unique_ptr< weld::Widget > m_xFlRadius
virtual ~SvxSlantTabPage() override
void EnableAnchorTypes(SvxAnchorIds nAnchorEnable)
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
void SetValidateFramePosLink(const Link< SvxSwFrameValidation &, void > &rLink)
void SetView(const SdrView *pSdrView)
static WhichRangesContainer GetRanges()
B2DPoint getMaximum() const
B2DPoint getCenter() const
B2DPoint getMinimum() const
#define DBG_ASSERT(sCon, aError)
virtual tools::Long GetValue() const override
SVXCORE_DLLPUBLIC FieldUnit GetModuleFieldUnit(const SfxItemSet &)
#define LINK(Instance, Class, Member)
void ConvertRect(basegfx::B2DRange &rRange, const sal_uInt16 nDigits, const MapUnit ePoolUnit, const FieldUnit eDlgUnit)
void ScaleRect(basegfx::B2DRange &rRange, const Fraction &rUIScale)
B2IRange fround(const B2DRange &rRange)
sal_Int64 fround64(double fVal)
static constexpr auto Items
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
sal_Int64 ConvertValue(sal_Int64 nValue, sal_Int64 mnBaseValue, sal_uInt16 nDecDigits, FieldUnit eInUnit, FieldUnit eOutUnit)
SdrMetricItem makeSdrEckenradiusItem(tools::Long nRadius)
constexpr TypedWhichId< SdrCustomShapeGeometryItem > SDRATTR_CUSTOMSHAPE_GEOMETRY(SDRATTR_CUSTOMSHAPE_FIRST+2)
constexpr TypedWhichId< SdrMetricItem > SDRATTR_CORNER_RADIUS(SDRATTR_MISC_FIRST+0)
IMPL_LINK_NOARG(SvxPositionSizeTabPage, ChangePosProtectHdl, weld::Toggleable &, void)
SVT_DLLPUBLIC sal_Int64 GetCoreValue(const weld::MetricSpinButton &rField, MapUnit eUnit)
SVT_DLLPUBLIC void SetMetricValue(weld::MetricSpinButton &rField, sal_Int64 nCoreValue, MapUnit eUnit)
SVT_DLLPUBLIC void SetFieldUnit(weld::MetricSpinButton &rCtrl, FieldUnit eUnit, bool bAll=false)