Kaydet (Commit) 1386c348 authored tarafından Katarina Behrens's avatar Katarina Behrens

fdo#82616: set limits on spinboxes according to size of workarea

Do it the same way as position'n'size dialog does, for that matter
move shared code into a separate header/class.

This fixes regression from .ui migration that omitted spinbox limits

Change-Id: I884904719b2608dd80aecc5d7ffb3923de71774d
Reviewed-on: https://gerrit.libreoffice.org/13174Tested-by: 's avatarLibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: 's avatarKatarina Behrens <bubli@bubli.org>
üst e22325ca
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <svx/svdotext.hxx> #include <svx/svdotext.hxx>
#include <svx/sderitm.hxx> #include <svx/sderitm.hxx>
#include <svx/dialogs.hrc> #include <svx/dialogs.hrc>
#include <svx/transfrmhelper.hxx>
#include <cuires.hrc> #include <cuires.hrc>
#include <editeng/sizeitem.hxx> #include <editeng/sizeitem.hxx>
...@@ -78,24 +79,6 @@ static const sal_uInt16 pSlantRanges[] = ...@@ -78,24 +79,6 @@ static const sal_uInt16 pSlantRanges[] =
0 0
}; };
static void lcl_ConvertRect(basegfx::B2DRange& rRange, const sal_uInt16 nDigits, const MapUnit ePoolUnit, const FieldUnit eDlgUnit)
{
const basegfx::B2DPoint aTopLeft(
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMinX()), nDigits, ePoolUnit, eDlgUnit),
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMinY()), nDigits, ePoolUnit, eDlgUnit));
const basegfx::B2DPoint aBottomRight(
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMaxX()), nDigits, ePoolUnit, eDlgUnit),
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMaxY()), nDigits, ePoolUnit, eDlgUnit));
rRange = basegfx::B2DRange(aTopLeft, aBottomRight);
}
static void lcl_ScaleRect(basegfx::B2DRange& rRange, const Fraction aUIScale)
{
const double fFactor(1.0 / double(aUIScale));
rRange = basegfx::B2DRange(rRange.getMinimum() * fFactor, rRange.getMaximum() * fFactor);
}
/************************************************************************* /*************************************************************************
|* |*
|* constructor of the tab dialog: adds the pages to the dialog |* constructor of the tab dialog: adds the pages to the dialog
...@@ -255,11 +238,11 @@ void SvxAngleTabPage::Construct() ...@@ -255,11 +238,11 @@ void SvxAngleTabPage::Construct()
// take scale into account // take scale into account
const Fraction aUIScale(pView->GetModel()->GetUIScale()); const Fraction aUIScale(pView->GetModel()->GetUIScale());
lcl_ScaleRect(maRange, aUIScale); TransfrmHelper::ScaleRect(maRange, aUIScale);
// take UI units into account // take UI units into account
sal_uInt16 nDigits(m_pMtrPosX->GetDecimalDigits()); sal_uInt16 nDigits(m_pMtrPosX->GetDecimalDigits());
lcl_ConvertRect(maRange, nDigits, (MapUnit)ePoolUnit, eDlgUnit); TransfrmHelper::ConvertRect(maRange, nDigits, (MapUnit)ePoolUnit, eDlgUnit);
if(!pView->IsRotateAllowed()) if(!pView->IsRotateAllowed())
{ {
...@@ -759,13 +742,13 @@ void SvxPositionSizeTabPage::Construct() ...@@ -759,13 +742,13 @@ void SvxPositionSizeTabPage::Construct()
// take scale into account // take scale into account
const Fraction aUIScale(mpView->GetModel()->GetUIScale()); const Fraction aUIScale(mpView->GetModel()->GetUIScale());
lcl_ScaleRect( maWorkRange, aUIScale ); TransfrmHelper::ScaleRect( maWorkRange, aUIScale );
lcl_ScaleRect( maRange, aUIScale ); TransfrmHelper::ScaleRect( maRange, aUIScale );
// take UI units into account // take UI units into account
const sal_uInt16 nDigits(m_pMtrPosX->GetDecimalDigits()); const sal_uInt16 nDigits(m_pMtrPosX->GetDecimalDigits());
lcl_ConvertRect( maWorkRange, nDigits, (MapUnit) mePoolUnit, meDlgUnit ); TransfrmHelper::ConvertRect( maWorkRange, nDigits, (MapUnit) mePoolUnit, meDlgUnit );
lcl_ConvertRect( maRange, nDigits, (MapUnit) mePoolUnit, meDlgUnit ); TransfrmHelper::ConvertRect( maRange, nDigits, (MapUnit) mePoolUnit, meDlgUnit );
SetMinMaxPosition(); SetMinMaxPosition();
} }
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SVX_TRANSFRMHELPER_HXX
#define INCLUDED_SVX_TRANSFRMHELPER_HXX
#include <basegfx/range/b2drange.hxx>
#include <tools/fldunit.hxx>
#include <tools/mapunit.hxx>
class SVX_DLLPUBLIC TransfrmHelper
{
public:
static void ConvertRect(basegfx::B2DRange& rRange, const sal_uInt16 nDigits, const MapUnit ePoolUnit, const FieldUnit eDlgUnit)
{
const basegfx::B2DPoint aTopLeft(
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMinX()), nDigits, ePoolUnit, eDlgUnit),
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMinY()), nDigits, ePoolUnit, eDlgUnit));
const basegfx::B2DPoint aBottomRight(
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMaxX()), nDigits, ePoolUnit, eDlgUnit),
(double)MetricField::ConvertValue(basegfx::fround(rRange.getMaxY()), nDigits, ePoolUnit, eDlgUnit));
rRange = basegfx::B2DRange(aTopLeft, aBottomRight);
}
static void ScaleRect(basegfx::B2DRange& rRange, const Fraction aUIScale)
{
const double fFactor(1.0 / double(aUIScale));
rRange = basegfx::B2DRange(rRange.getMinimum() * fFactor, rRange.getMaximum() * fFactor);
}
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <vcl/toolbox.hxx> #include <vcl/toolbox.hxx>
#include <svl/aeitem.hxx> #include <svl/aeitem.hxx>
#include <svx/svdview.hxx> #include <svx/svdview.hxx>
#include <svx/transfrmhelper.hxx>
using namespace css; using namespace css;
using namespace css::uno; using namespace css::uno;
...@@ -949,10 +950,6 @@ void PosSizePropertyPanel::executePosX() ...@@ -949,10 +950,6 @@ void PosSizePropertyPanel::executePosX()
lX = -lX; lX = -lX;
long lY = GetCoreValue( *mpMtrPosY, mePoolUnit ); long lY = GetCoreValue( *mpMtrPosY, mePoolUnit );
Rectangle aRect;
maRect = mpView->GetAllMarkedRect();
aRect = mpView->GetAllMarkedRect();
Fraction aUIScale = mpView->GetModel()->GetUIScale(); Fraction aUIScale = mpView->GetModel()->GetUIScale();
lX += maAnchorPos.X(); lX += maAnchorPos.X();
lX = Fraction( lX ) * aUIScale; lX = Fraction( lX ) * aUIScale;
...@@ -976,10 +973,6 @@ void PosSizePropertyPanel::executePosY() ...@@ -976,10 +973,6 @@ void PosSizePropertyPanel::executePosY()
long lX = GetCoreValue( *mpMtrPosX, mePoolUnit ); long lX = GetCoreValue( *mpMtrPosX, mePoolUnit );
long lY = GetCoreValue( *mpMtrPosY, mePoolUnit ); long lY = GetCoreValue( *mpMtrPosY, mePoolUnit );
Rectangle aRect;
maRect = mpView->GetAllMarkedRect();
aRect = mpView->GetAllMarkedRect();
Fraction aUIScale = mpView->GetModel()->GetUIScale(); Fraction aUIScale = mpView->GetModel()->GetUIScale();
lX += maAnchorPos.X(); lX += maAnchorPos.X();
lX = Fraction( lX ) * aUIScale; lX = Fraction( lX ) * aUIScale;
...@@ -1018,6 +1011,7 @@ void PosSizePropertyPanel::MetricState( SfxItemState eState, const SfxPoolItem* ...@@ -1018,6 +1011,7 @@ void PosSizePropertyPanel::MetricState( SfxItemState eState, const SfxPoolItem*
SetFieldUnit( *mpMtrPosY, meDlgUnit, true ); SetFieldUnit( *mpMtrPosY, meDlgUnit, true );
if(bPosYBlank) if(bPosYBlank)
mpMtrPosY->SetText(OUString()); mpMtrPosY->SetText(OUString());
SetPosXYMinMax();
if (mpMtrWidth->GetText().isEmpty()) if (mpMtrWidth->GetText().isEmpty())
bWidthBlank = true; bWidthBlank = true;
...@@ -1153,8 +1147,49 @@ void PosSizePropertyPanel::DisableControls() ...@@ -1153,8 +1147,49 @@ void PosSizePropertyPanel::DisableControls()
} }
} }
void PosSizePropertyPanel::SetPosXYMinMax()
{
Rectangle aTmpRect(mpView->GetAllMarkedRect());
mpView->GetSdrPageView()->LogicToPagePos(aTmpRect);
maRect = basegfx::B2DRange(aTmpRect.Left(), aTmpRect.Top(), aTmpRect.Right(), aTmpRect.Bottom());
Rectangle aTmpRect2(mpView->GetWorkArea());
mpView->GetSdrPageView()->LogicToPagePos(aTmpRect2);
maWorkArea = basegfx::B2DRange(aTmpRect2.Left(), aTmpRect2.Top(), aTmpRect2.Right(), aTmpRect2.Bottom());
const Fraction aUIScale(mpView->GetModel()->GetUIScale());
TransfrmHelper::ScaleRect( maWorkArea, aUIScale );
TransfrmHelper::ScaleRect( maRect, aUIScale );
const sal_uInt16 nDigits(mpMtrPosX->GetDecimalDigits());
TransfrmHelper::ConvertRect( maWorkArea, nDigits, (MapUnit) mePoolUnit, meDlgUnit );
TransfrmHelper::ConvertRect( maRect, nDigits, (MapUnit) mePoolUnit, meDlgUnit );
double fLeft(maWorkArea.getMinX());
double fTop(maWorkArea.getMinY());
double fRight(maWorkArea.getMaxX());
double fBottom(maWorkArea.getMaxY());
// seems that sidebar defaults to top left reference point
// and there's no way to set it to something else
fRight -= maRect.getWidth();
fBottom -= maRect.getHeight();
const double fMaxLong((double)(MetricField::ConvertValue( LONG_MAX, 0, MAP_100TH_MM, meDlgUnit ) - 1L));
fLeft = basegfx::clamp(fLeft, -fMaxLong, fMaxLong);
fRight = basegfx::clamp(fRight, -fMaxLong, fMaxLong);
fTop = basegfx::clamp(fTop, - fMaxLong, fMaxLong);
fBottom = basegfx::clamp(fBottom, -fMaxLong, fMaxLong);
mpMtrPosX->SetMin(basegfx::fround64(fLeft));
mpMtrPosX->SetFirst(basegfx::fround64(fLeft));
mpMtrPosX->SetMax(basegfx::fround64(fRight));
mpMtrPosX->SetLast(basegfx::fround64(fRight));
mpMtrPosY->SetMin(basegfx::fround64(fTop));
mpMtrPosY->SetFirst(basegfx::fround64(fTop));
mpMtrPosY->SetMax(basegfx::fround64(fBottom));
mpMtrPosY->SetLast(basegfx::fround64(fBottom));
}
void PosSizePropertyPanel::UpdateUIScale() void PosSizePropertyPanel::UpdateUIScale()
{ {
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <tools/fldunit.hxx> #include <tools/fldunit.hxx>
#include <tools/fract.hxx> #include <tools/fract.hxx>
#include <com/sun/star/ui/XSidebar.hpp> #include <com/sun/star/ui/XSidebar.hpp>
#include <basegfx/range/b2drange.hxx>
class DialControl; class DialControl;
class SdrView; class SdrView;
...@@ -95,7 +96,8 @@ private: ...@@ -95,7 +96,8 @@ private:
ToolBox* mpFlipTbx; ToolBox* mpFlipTbx;
// Internal variables // Internal variables
Rectangle maRect; basegfx::B2DRange maRect;
basegfx::B2DRange maWorkArea;
const SdrView* mpView; const SdrView* mpView;
sal_uInt32 mlOldWidth; sal_uInt32 mlOldWidth;
sal_uInt32 mlOldHeight; sal_uInt32 mlOldHeight;
...@@ -163,6 +165,7 @@ private: ...@@ -163,6 +165,7 @@ private:
void MetricState( SfxItemState eState, const SfxPoolItem* pState ); void MetricState( SfxItemState eState, const SfxPoolItem* pState );
FieldUnit GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState ); FieldUnit GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState );
void DisableControls(); void DisableControls();
void SetPosXYMinMax();
/** Check if the UI scale has changed and handle such a change. /** Check if the UI scale has changed and handle such a change.
UI scale is an SD only feature. The UI scale is represented by items UI scale is an SD only feature. The UI scale is represented by items
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment