summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-01-21 15:43:46 +0000
committerCaolán McNamara <caolanm@redhat.com>2020-01-22 17:55:28 +0100
commiteae55d7397f953ca8a4be1a2665e8ca887adfe81 (patch)
tree47d84a1b81c3a4d7b4719b328cb1241ae80f1a2f
parent2399373778cf0778ad15b1fec9a1bf289b4089de (diff)
rework line style to be a wide toolbar button
involves converting SvxLineStyleToolBoxControl to a PopupWindowController because chart is doing interesting things in its panel there needs to be a non-standard way to report/detect the selected line style, which is then reused to disable/enable the arrows when none is selected/deselected in non-chart sidebars SvxLineBox becomes a toolbar dropdown instead of a combobox itemwindow linectrl.cxx split into linewidthctrl.cxx and linewidthctrl because SvxLineBox is now needed in svxcore Change-Id: Icf0ef5e612b894a43d389af8a2908138c2e9c580 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87164 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--chart2/source/controller/sidebar/ChartColorWrapper.cxx101
-rw-r--r--chart2/source/controller/sidebar/ChartColorWrapper.hxx22
-rw-r--r--chart2/source/controller/sidebar/ChartLinePanel.cxx89
-rw-r--r--chart2/source/controller/sidebar/ChartLinePanel.hxx5
-rw-r--r--compilerplugins/clang/unusedfields.writeonly.results2
-rw-r--r--include/svx/itemwin.hxx35
-rw-r--r--include/svx/linectrl.hxx42
-rw-r--r--include/svx/sidebar/LinePropertyPanelBase.hxx38
-rw-r--r--include/svx/tbxcolorupdate.hxx13
-rw-r--r--officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu11
-rw-r--r--sc/source/ui/app/scdll.cxx1
-rw-r--r--sd/source/ui/app/sddll.cxx1
-rw-r--r--solenv/clang-format/blacklist1
-rw-r--r--svx/Library_svx.mk2
-rw-r--r--svx/Library_svxcore.mk1
-rw-r--r--svx/UIConfig_svx.mk1
-rw-r--r--svx/source/sidebar/line/LinePropertyPanel.cxx42
-rw-r--r--svx/source/sidebar/line/LinePropertyPanel.hxx5
-rw-r--r--svx/source/sidebar/line/LinePropertyPanelBase.cxx226
-rw-r--r--svx/source/tbxctrls/itemwin.cxx231
-rw-r--r--svx/source/tbxctrls/linectrl.cxx390
-rw-r--r--svx/source/tbxctrls/linewidthctrl.cxx116
-rw-r--r--svx/source/tbxctrls/tbxcolorupdate.cxx66
-rw-r--r--svx/uiconfig/ui/floatinglinestyle.ui49
-rw-r--r--svx/uiconfig/ui/sidebarline.ui82
-rw-r--r--svx/util/svx.component4
-rw-r--r--svx/util/svxcore.component8
-rw-r--r--sw/source/uibase/app/swmodule.cxx1
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx3
29 files changed, 805 insertions, 783 deletions
diff --git a/chart2/source/controller/sidebar/ChartColorWrapper.cxx b/chart2/source/controller/sidebar/ChartColorWrapper.cxx
index 189b55059492..9a8c568a863d 100644
--- a/chart2/source/controller/sidebar/ChartColorWrapper.cxx
+++ b/chart2/source/controller/sidebar/ChartColorWrapper.cxx
@@ -10,11 +10,17 @@
#include "ChartColorWrapper.hxx"
#include <ObjectIdentifier.hxx>
+#include <PropertyHelper.hxx>
#include <com/sun/star/chart2/XDiagram.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/view/XSelectionSupplier.hpp>
#include <com/sun/star/frame/XController.hpp>
+#include <svx/linectrl.hxx>
#include <svx/tbcontrl.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/unomid.hxx>
namespace chart::sidebar {
@@ -104,6 +110,101 @@ void ChartColorWrapper::updateData()
mpControl->statusChanged(aEvent);
}
+ChartLineStyleWrapper::ChartLineStyleWrapper(
+ css::uno::Reference<css::frame::XModel> const & xModel,
+ SvxLineStyleToolBoxControl* pControl)
+ : mxModel(xModel)
+ , mpControl(pControl)
+{
+}
+
+void ChartLineStyleWrapper::updateModel(const css::uno::Reference<css::frame::XModel>& xModel)
+{
+ mxModel = xModel;
+}
+
+namespace
+{
+ css::uno::Any getLineDash(
+ const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rDashName)
+ {
+ css::uno::Reference<css::lang::XMultiServiceFactory> xFact(xModel, css::uno::UNO_QUERY);
+ css::uno::Reference<css::container::XNameAccess> xNameAccess(
+ xFact->createInstance("com.sun.star.drawing.DashTable"),
+ css::uno::UNO_QUERY );
+ if(xNameAccess.is())
+ {
+ if (!xNameAccess->hasByName(rDashName))
+ return css::uno::Any();
+
+ return xNameAccess->getByName(rDashName);
+ }
+
+ return css::uno::Any();
+ }
+}
+
+void ChartLineStyleWrapper::updateData()
+{
+ css::uno::Reference<css::beans::XPropertySet> xPropSet = getPropSet(mxModel);
+ if (!xPropSet.is())
+ return;
+
+ css::util::URL aUrl;
+ aUrl.Complete = ".uno:XLineStyle";
+
+ css::frame::FeatureStateEvent aEvent;
+ aEvent.IsEnabled = true;
+
+ aEvent.FeatureURL = aUrl;
+ aEvent.State = xPropSet->getPropertyValue("LineStyle");
+ mpControl->statusChanged(aEvent);
+
+ aUrl.Complete = ".uno:LineDash";
+
+ auto aLineDashName = xPropSet->getPropertyValue("LineDashName");
+ OUString aDashName;
+ aLineDashName >>= aDashName;
+ css::uno::Any aLineDash = getLineDash(mxModel, aDashName);
+ XLineDashItem aDashItem;
+ aDashItem.PutValue(aLineDash, MID_LINEDASH);
+
+ aEvent.FeatureURL = aUrl;
+ aDashItem.QueryValue(aEvent.State);
+ mpControl->statusChanged(aEvent);
+}
+
+bool ChartLineStyleWrapper::operator()(const OUString& rCommand, const css::uno::Any& rValue)
+{
+ css::uno::Reference<css::beans::XPropertySet> xPropSet = getPropSet(mxModel);
+
+ if (!xPropSet.is())
+ {
+ SAL_WARN("chart2", "Invalid reference to xPropSet");
+ return false;
+ }
+
+ if (rCommand == ".uno:XLineStyle")
+ {
+ xPropSet->setPropertyValue("LineStyle", rValue);
+ return true;
+ }
+ else if (rCommand == ".uno:LineDash")
+ {
+ XLineDashItem aDashItem;
+ aDashItem.PutValue(rValue, 0);
+ css::uno::Any aAny;
+ aDashItem.QueryValue(aAny, MID_LINEDASH);
+ OUString aDashName = PropertyHelper::addLineDashUniqueNameToTable(aAny,
+ css::uno::Reference<css::lang::XMultiServiceFactory>(mxModel, css::uno::UNO_QUERY),
+ "");
+ xPropSet->setPropertyValue("LineDash", aAny);
+ xPropSet->setPropertyValue("LineDashName", css::uno::Any(aDashName));
+ return true;
+ }
+ return false;
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/sidebar/ChartColorWrapper.hxx b/chart2/source/controller/sidebar/ChartColorWrapper.hxx
index 05b0e9f38fea..8f16c1b1dd33 100644
--- a/chart2/source/controller/sidebar/ChartColorWrapper.hxx
+++ b/chart2/source/controller/sidebar/ChartColorWrapper.hxx
@@ -16,13 +16,12 @@
namespace com { namespace sun { namespace star { namespace frame { class XModel; } } } }
class SvxColorToolBoxControl;
+class SvxLineStyleToolBoxControl;
namespace chart { namespace sidebar {
class ChartColorWrapper
{
-private:
-
public:
ChartColorWrapper(css::uno::Reference<css::frame::XModel> const & xModel,
SvxColorToolBoxControl* pControl,
@@ -43,6 +42,25 @@ private:
OUString maPropertyName;
};
+class ChartLineStyleWrapper
+{
+public:
+ ChartLineStyleWrapper(css::uno::Reference<css::frame::XModel> const & xModel,
+ SvxLineStyleToolBoxControl* pControl);
+
+ bool operator()(const OUString& rCommand, const css::uno::Any& rValue);
+
+ void updateModel(const css::uno::Reference<css::frame::XModel>& xModel);
+
+ void updateData();
+
+private:
+
+ css::uno::Reference<css::frame::XModel> mxModel;
+
+ SvxLineStyleToolBoxControl* mpControl;
+};
+
} }
#endif
diff --git a/chart2/source/controller/sidebar/ChartLinePanel.cxx b/chart2/source/controller/sidebar/ChartLinePanel.cxx
index 2e410084466d..944b709cac56 100644
--- a/chart2/source/controller/sidebar/ChartLinePanel.cxx
+++ b/chart2/source/controller/sidebar/ChartLinePanel.cxx
@@ -19,6 +19,7 @@
#include <svx/xlntrit.hxx>
#include <svx/unomid.hxx>
+#include <svx/linectrl.hxx>
#include <svx/tbcontrl.hxx>
#include <sfx2/weldutils.hxx>
#include <vcl/svapp.hxx>
@@ -31,9 +32,16 @@ namespace chart::sidebar {
namespace {
-SvxColorToolBoxControl* getColorToolBoxControl(ToolbarUnoDispatcher& rToolBoxColor)
+SvxLineStyleToolBoxControl* getLineStyleToolBoxControl(ToolbarUnoDispatcher& rToolBoxColor)
{
- css::uno::Reference<css::frame::XToolbarController> xController = rToolBoxColor.GetControllerForCommand(".uno:XLineColor");
+ css::uno::Reference<css::frame::XToolbarController> xController = rToolBoxColor.GetControllerForCommand(".uno:XLineStyle");
+ SvxLineStyleToolBoxControl* pToolBoxLineStyleControl = dynamic_cast<SvxLineStyleToolBoxControl*>(xController.get());
+ return pToolBoxLineStyleControl;
+}
+
+SvxColorToolBoxControl* getColorToolBoxControl(ToolbarUnoDispatcher& rToolBoxLineStyle)
+{
+ css::uno::Reference<css::frame::XToolbarController> xController = rToolBoxLineStyle.GetControllerForCommand(".uno:XLineColor");
SvxColorToolBoxControl* pToolBoxColorControl = dynamic_cast<SvxColorToolBoxControl*>(xController.get());
return pToolBoxColorControl;
}
@@ -76,24 +84,6 @@ css::uno::Reference<css::beans::XPropertySet> getPropSet(
return xPropSet;
}
-css::uno::Any getLineDash(
- const css::uno::Reference<css::frame::XModel>& xModel, const OUString& rDashName)
-{
- css::uno::Reference<css::lang::XMultiServiceFactory> xFact(xModel, css::uno::UNO_QUERY);
- css::uno::Reference<css::container::XNameAccess> xNameAccess(
- xFact->createInstance("com.sun.star.drawing.DashTable"),
- css::uno::UNO_QUERY );
- if(xNameAccess.is())
- {
- if (!xNameAccess->hasByName(rDashName))
- return css::uno::Any();
-
- return xNameAccess->getByName(rDashName);
- }
-
- return css::uno::Any();
-}
-
class PreventUpdate
{
public:
@@ -137,7 +127,8 @@ ChartLinePanel::ChartLinePanel(vcl::Window* pParent,
mxSelectionListener(new ChartSidebarSelectionListener(this)),
mbUpdate(true),
mbModelValid(true),
- maLineColorWrapper(mxModel, getColorToolBoxControl(*mxColorDispatch), "LineColor")
+ maLineColorWrapper(mxModel, getColorToolBoxControl(*mxColorDispatch), "LineColor"),
+ maLineStyleWrapper(mxModel, getLineStyleToolBoxControl(*mxLineStyleDispatch))
{
disableArrowHead();
std::vector<ObjectType> aAcceptedTypes { OBJECTTYPE_PAGE, OBJECTTYPE_DIAGRAM,
@@ -177,6 +168,9 @@ void ChartLinePanel::Initialize()
SvxColorToolBoxControl* pToolBoxColor = getColorToolBoxControl(*mxColorDispatch);
pToolBoxColor->setColorSelectFunction(maLineColorWrapper);
+ SvxLineStyleToolBoxControl* pToolBoxLineStyle = getLineStyleToolBoxControl(*mxLineStyleDispatch);
+ pToolBoxLineStyle->setLineStyleSelectFunction(maLineStyleWrapper);
+
setMapUnit(MapUnit::Map100thMM);
updateData();
}
@@ -196,19 +190,7 @@ void ChartLinePanel::updateData()
XLineTransparenceItem aLineTransparenceItem(nLineTransparence);
updateLineTransparence(false, true, &aLineTransparenceItem);
- css::drawing::LineStyle eStyle = css::drawing::LineStyle_SOLID;
- xPropSet->getPropertyValue("LineStyle") >>= eStyle;
- XLineStyleItem aStyleItem(eStyle);
- updateLineStyle(false, true, &aStyleItem);
-
- css::uno::Any aLineDashName = xPropSet->getPropertyValue("LineDashName");
- OUString aDashName;
- aLineDashName >>= aDashName;
- css::uno::Any aLineDash = getLineDash(mxModel, aDashName);
- XLineDashItem aDashItem;
- aDashItem.PutValue(aLineDash, MID_LINEDASH);
- updateLineDash(false, true, &aDashItem);
-
+ maLineStyleWrapper.updateData();
maLineColorWrapper.updateData();
}
@@ -235,6 +217,7 @@ void ChartLinePanel::updateModel(
mxModel = xModel;
mbModelValid = true;
+ maLineStyleWrapper.updateModel(mxModel);
maLineColorWrapper.updateModel(mxModel);
css::uno::Reference<css::util::XModifyBroadcaster> xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW);
@@ -245,44 +228,6 @@ void ChartLinePanel::updateModel(
xSelectionSupplier->addSelectionChangeListener(mxSelectionListener.get());
}
-void ChartLinePanel::setLineStyle(const XLineStyleItem& rItem)
-{
- css::uno::Reference<css::beans::XPropertySet> xPropSet =
- getPropSet(mxModel);
-
- if (!xPropSet.is())
- return;
-
- PreventUpdate aPreventUpdate(mbUpdate);
- xPropSet->setPropertyValue("LineStyle", css::uno::Any(rItem.GetValue()));
-}
-
-void ChartLinePanel::setLineDash(const XLineDashItem& rItem)
-{
- css::uno::Reference<css::beans::XPropertySet> xPropSet =
- getPropSet(mxModel);
-
- if (!xPropSet.is())
- return;
-
- PreventUpdate aPreventUpdate(mbUpdate);
- css::uno::Any aAny;
- rItem.QueryValue(aAny, MID_LINEDASH);
- OUString aDashName = PropertyHelper::addLineDashUniqueNameToTable(aAny,
- css::uno::Reference<css::lang::XMultiServiceFactory>(mxModel, css::uno::UNO_QUERY),
- "");
- xPropSet->setPropertyValue("LineDash", aAny);
- xPropSet->setPropertyValue("LineDashName", css::uno::Any(aDashName));
-}
-
-void ChartLinePanel::setLineEndStyle(const XLineEndItem* /*pItem*/)
-{
-}
-
-void ChartLinePanel::setLineStartStyle(const XLineStartItem* /*pItem*/)
-{
-}
-
void ChartLinePanel::setLineJoint(const XLineJointItem* pItem)
{
css::uno::Reference<css::beans::XPropertySet> xPropSet =
diff --git a/chart2/source/controller/sidebar/ChartLinePanel.hxx b/chart2/source/controller/sidebar/ChartLinePanel.hxx
index c2e5d1fee7e1..2f1c520dd426 100644
--- a/chart2/source/controller/sidebar/ChartLinePanel.hxx
+++ b/chart2/source/controller/sidebar/ChartLinePanel.hxx
@@ -64,10 +64,6 @@ public:
protected:
- virtual void setLineStyle(const XLineStyleItem& rItem) override;
- virtual void setLineDash(const XLineDashItem& rItem) override;
- virtual void setLineEndStyle(const XLineEndItem* pItem) override;
- virtual void setLineStartStyle(const XLineStartItem* pItem) override;
virtual void setLineTransparency(const XLineTransparenceItem& rItem) override;
virtual void setLineJoint(const XLineJointItem* pItem) override;
virtual void setLineCap(const XLineCapItem* pItem) override;
@@ -83,6 +79,7 @@ private:
bool mbUpdate;
bool mbModelValid;
ChartColorWrapper maLineColorWrapper;
+ ChartLineStyleWrapper maLineStyleWrapper;
};
} } // end of namespace svx::sidebar
diff --git a/compilerplugins/clang/unusedfields.writeonly.results b/compilerplugins/clang/unusedfields.writeonly.results
index 4f6409bb1e30..ba25b0627e70 100644
--- a/compilerplugins/clang/unusedfields.writeonly.results
+++ b/compilerplugins/clang/unusedfields.writeonly.results
@@ -772,8 +772,6 @@ svx/source/sidebar/line/LinePropertyPanel.hxx:85
svx::sidebar::LinePropertyPanel maStyleControl sfx2::sidebar::ControllerItem
svx/source/sidebar/line/LinePropertyPanel.hxx:86
svx::sidebar::LinePropertyPanel maDashControl sfx2::sidebar::ControllerItem
-svx/source/sidebar/line/LinePropertyPanel.hxx:91
- svx::sidebar::LinePropertyPanel maLineStyleListControl sfx2::sidebar::ControllerItem
svx/source/sidebar/line/LinePropertyPanel.hxx:92
svx::sidebar::LinePropertyPanel maTransControl sfx2::sidebar::ControllerItem
svx/source/sidebar/line/LinePropertyPanel.hxx:93
diff --git a/include/svx/itemwin.hxx b/include/svx/itemwin.hxx
index 889a513586fe..e1a31d428724 100644
--- a/include/svx/itemwin.hxx
+++ b/include/svx/itemwin.hxx
@@ -20,40 +20,31 @@
#define INCLUDED_SVX_ITEMWIN_HXX
#include <vcl/field.hxx>
-
+#include <svtools/toolbarmenu.hxx>
#include <svx/dlgctrl.hxx>
#include <svx/svxdllapi.h>
class XLineWidthItem;
class SfxObjectShell;
+class SvtValueSet;
+class SvxLineStyleToolBoxControl;
-class SvxLineBox final : public ListBox
+class SvxLineBox final : public WeldToolbarPopup
{
- sal_uInt16 nCurPos;
- Timer aDelayTimer;
- Size const aLogicalSize;
- bool bRelease;
- SfxObjectShell* mpSh;
- css::uno::Reference< css::frame::XFrame > mxFrame;
-
- DECL_LINK(DelayHdl_Impl, Timer *, void);
-
- void ReleaseFocus_Impl();
-
-public:
- SvxLineBox( vcl::Window* pParent,
- const css::uno::Reference< css::frame::XFrame >& rFrame );
+ rtl::Reference<SvxLineStyleToolBoxControl> mxControl;
+ std::unique_ptr<SvtValueSet> mxLineStyleSet;
+ std::unique_ptr<weld::CustomWeld> mxLineStyleSetWin;
void FillControl();
-
void Fill(const XDashListRef &pList);
-private:
- virtual void Select() override;
- virtual bool PreNotify( NotifyEvent& rNEvt ) override;
- virtual bool EventNotify( NotifyEvent& rNEvt ) override;
- virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
+ DECL_LINK(SelectHdl, SvtValueSet*, void);
+
+ virtual void GrabFocus() override;
+public:
+ SvxLineBox(SvxLineStyleToolBoxControl* pControl, weld::Widget* pParent, int nInitialIndex);
+ virtual ~SvxLineBox() override;
};
class SVX_DLLPUBLIC SvxMetricField : public MetricField
diff --git a/include/svx/linectrl.hxx b/include/svx/linectrl.hxx
index 68f92e9a64fa..7fc9fc742cea 100644
--- a/include/svx/linectrl.hxx
+++ b/include/svx/linectrl.hxx
@@ -19,41 +19,57 @@
#ifndef INCLUDED_SVX_LINECTRL_HXX
#define INCLUDED_SVX_LINECTRL_HXX
-
#include <sfx2/tbxctrl.hxx>
+#include <svtools/popupwindowcontroller.hxx>
#include <svx/svxdllapi.h>
#include <memory>
+namespace svx {
+ class ToolboxButtonLineStyleUpdater;
+}
+
class XLineStyleItem;
class XLineDashItem;
+typedef std::function<bool(const OUString&, const css::uno::Any&)> LineStyleSelectFunction;
// SvxLineStyleController:
-
-
-class SVX_DLLPUBLIC SvxLineStyleToolBoxControl final : public SfxToolBoxControl
+class SVX_DLLPUBLIC SvxLineStyleToolBoxControl final : public svt::PopupWindowController
{
private:
std::unique_ptr<XLineStyleItem> pStyleItem;
std::unique_ptr<XLineDashItem> pDashItem;
+ std::unique_ptr<svx::ToolboxButtonLineStyleUpdater> m_xBtnUpdater;
- bool bUpdate;
+ LineStyleSelectFunction m_aLineStyleSelectFunction;
public:
- SFX_DECL_TOOLBOX_CONTROL();
+ SvxLineStyleToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext );
+
+ // XInitialization
+ virtual void SAL_CALL initialize( const css::uno::Sequence<css::uno::Any>& rArguments ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ virtual void SAL_CALL execute(sal_Int16 nKeyModifier) override;
+ virtual void SAL_CALL statusChanged(const css::frame::FeatureStateEvent& rEvent) override;
- SvxLineStyleToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx );
virtual ~SvxLineStyleToolBoxControl() override;
- virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState,
- const SfxPoolItem* pState ) override;
- void Update( const SfxPoolItem* pState );
- virtual VclPtr<vcl::Window> CreateItemWindow( vcl::Window *pParent ) override;
-};
+ void setLineStyleSelectFunction(const LineStyleSelectFunction& aLineStyleSelectFunction);
+ void dispatchLineStyleCommand(const OUString& rCommand, const css::uno::Sequence<css::beans::PropertyValue>& rArgs);
+ int GetStyleIndex() const;
-// SvxLineWidthController:
+private:
+ virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
+ virtual VclPtr<vcl::Window> createVclPopupWindow( vcl::Window* pParent ) override;
+
+};
+// SvxLineWidthController:
class SVX_DLLPUBLIC SvxLineWidthToolBoxControl final : public SfxToolBoxControl
{
diff --git a/include/svx/sidebar/LinePropertyPanelBase.hxx b/include/svx/sidebar/LinePropertyPanelBase.hxx
index 1a68126513cc..f8e534ddf1a4 100644
--- a/include/svx/sidebar/LinePropertyPanelBase.hxx
+++ b/include/svx/sidebar/LinePropertyPanelBase.hxx
@@ -45,15 +45,14 @@ namespace svx
namespace sidebar
{
+class DisableArrowsWrapper;
+
class SVX_DLLPUBLIC LinePropertyPanelBase : public PanelLayout
{
public:
virtual ~LinePropertyPanelBase() override;
virtual void dispose() override;
- virtual void DataChanged(
- const DataChangedEvent& rEvent) override;
-
void SetWidth(long nWidth);
void SetWidthIcon(int n);
void SetWidthIcon();
@@ -67,28 +66,28 @@ public:
virtual void setLineWidth(const XLineWidthItem& rItem) = 0;
+ void SetNoneLineStyle(bool bNoneLineStyle)
+ {
+ if (bNoneLineStyle != mbNoneLineStyle)
+ {
+ mbNoneLineStyle = bNoneLineStyle;
+ ActivateControls();
+ }
+ }
+
protected:
- virtual void setLineStyle(const XLineStyleItem& rItem) = 0;
- virtual void setLineDash(const XLineDashItem& rItem) = 0;
- virtual void setLineEndStyle(const XLineEndItem* pItem) = 0;
- virtual void setLineStartStyle(const XLineStartItem* pItem) = 0;
+ void ActivateControls();
+
virtual void setLineTransparency(const XLineTransparenceItem& rItem) = 0;
virtual void setLineJoint(const XLineJointItem* pItem) = 0;
virtual void setLineCap(const XLineCapItem* pItem) = 0;
- void updateLineStyle(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
- void updateLineDash(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
void updateLineTransparence(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
void updateLineWidth(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
void updateLineJoint(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
void updateLineCap(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem);
- void FillLineStyleList();
-
- void SelectLineStyle();
- void ActivateControls();
-
void setMapUnit(MapUnit eMapUnit);
void enableArrowHead();
@@ -99,15 +98,15 @@ protected:
std::unique_ptr<weld::Toolbar> mxTBColor;
std::unique_ptr<ToolbarUnoDispatcher> mxColorDispatch;
+ std::unique_ptr<weld::Toolbar> mxLineStyleTB;
+ std::unique_ptr<ToolbarUnoDispatcher> mxLineStyleDispatch;
+
private:
//ui controls
std::unique_ptr<weld::Label> mxFTWidth;
std::unique_ptr<weld::Toolbar> mxTBWidth;
- std::unique_ptr<SvxLineLB> mxLBStyle;
std::unique_ptr<weld::Label> mxFTTransparency;
std::unique_ptr<weld::MetricSpinButton> mxMFTransparent;
- std::unique_ptr<weld::Toolbar> mxArrowsTB;
- std::unique_ptr<ToolbarUnoDispatcher> mxArrowsDispatch;
std::unique_ptr<weld::Label> mxFTEdgeStyle;
std::unique_ptr<weld::ComboBox> mxLBEdgeStyle;
std::unique_ptr<weld::Label> mxFTCapStyle;
@@ -117,13 +116,11 @@ private:
//popup windows
std::unique_ptr<LineWidthPopup> mxLineWidthPopup;
- std::unique_ptr<XLineStyleItem> mpStyleItem;
- std::unique_ptr<XLineDashItem> mpDashItem;
+ std::unique_ptr<DisableArrowsWrapper> mxDisableArrowsWrapper;
sal_uInt16 mnTrans;
MapUnit meMapUnit;
sal_Int32 mnWidthCoreValue;
- XDashListRef mxLineStyleList;
// images from resource
OUString maIMGNone;
@@ -133,6 +130,7 @@ private:
bool mbWidthValuable : 1;
bool mbArrowSupported;
+ bool mbNoneLineStyle;
void Initialize();
diff --git a/include/svx/tbxcolorupdate.hxx b/include/svx/tbxcolorupdate.hxx
index 460635c0ac52..d9feb8da06f1 100644
--- a/include/svx/tbxcolorupdate.hxx
+++ b/include/svx/tbxcolorupdate.hxx
@@ -27,6 +27,8 @@
#include <vcl/vclenum.hxx>
#include <vcl/vclptr.hxx>
#include <svx/Palette.hxx>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/frame/FeatureStateEvent.hpp>
#include <com/sun/star/frame/XFrame.hpp>
class ToolBox;
@@ -122,6 +124,17 @@ namespace svx
virtual vcl::ImageType GetImageSize() const override;
virtual Size GetItemSize() const override;
};
+
+ class ToolboxButtonLineStyleUpdater
+ {
+ private:
+ css::drawing::LineStyle m_eXLS;
+ int m_nDashStyleIndex;
+ public:
+ ToolboxButtonLineStyleUpdater();
+ void Update(const css::frame::FeatureStateEvent& rEvent);
+ int GetStyleIndex() const;
+ };
}
#endif // INCLUDED_SVX_TBXCOLORUPDATE_HXX
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index bad60fb6b38f..8ed8d5c901de 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -1371,6 +1371,17 @@
<value>com.sun.star.comp.svx.LineEndToolBoxControl</value>
</prop>
</node>
+ <node oor:name="LineStyleToolBoxControl" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:XLineStyle</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.LineStyleToolBoxControl</value>
+ </prop>
+ </node>
<node oor:name="LineSpacingToolBoxControl" oor:op="replace">
<prop oor:name="Command">
<value>.uno:LineSpacing</value>
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index dfcb7d5edc11..03d431fc2d5b 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -146,7 +146,6 @@ void ScDLL::Init()
// SvxToolboxController
SvxTbxCtlDraw ::RegisterControl(SID_INSERT_DRAW, pMod);
SvxFillToolBoxControl ::RegisterControl(0, pMod);
- SvxLineStyleToolBoxControl ::RegisterControl(0, pMod);
SvxLineWidthToolBoxControl ::RegisterControl(0, pMod);
SvxStyleToolBoxControl ::RegisterControl(SID_STYLE_APPLY, pMod);
SvxClipBoardControl ::RegisterControl(SID_PASTE, pMod );
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
index a4805671b59e..4df9b7774d33 100644
--- a/sd/source/ui/app/sddll.cxx
+++ b/sd/source/ui/app/sddll.cxx
@@ -177,7 +177,6 @@ void SdDLL::RegisterControllers(SdModule* pMod)
::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(false, pMod);
SvxFillToolBoxControl::RegisterControl(0, pMod);
- SvxLineStyleToolBoxControl::RegisterControl(0, pMod);
SvxLineWidthToolBoxControl::RegisterControl(0, pMod);
SvxStyleToolBoxControl::RegisterControl(0, pMod);
diff --git a/solenv/clang-format/blacklist b/solenv/clang-format/blacklist
index be77724e432c..4cb6e4feec2d 100644
--- a/solenv/clang-format/blacklist
+++ b/solenv/clang-format/blacklist
@@ -14444,6 +14444,7 @@ svx/source/tbxctrls/itemwin.cxx
svx/source/tbxctrls/layctrl.cxx
svx/source/tbxctrls/lboxctrl.cxx
svx/source/tbxctrls/linectrl.cxx
+svx/source/tbxctrls/linewidthctrl.cxx
svx/source/tbxctrls/tbcontrl.cxx
svx/source/tbxctrls/tbunocontroller.cxx
svx/source/tbxctrls/tbunosearchcontrollers.cxx
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index a2f22cd7c700..2b9b96f04a3b 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -232,7 +232,7 @@ $(eval $(call gb_Library_add_exception_objects,svx,\
svx/source/tbxctrls/itemwin \
svx/source/tbxctrls/layctrl \
svx/source/tbxctrls/lboxctrl \
- svx/source/tbxctrls/linectrl \
+ svx/source/tbxctrls/linewidthctrl \
svx/source/tbxctrls/tbunocontroller \
svx/source/tbxctrls/tbunosearchcontrollers \
svx/source/tbxctrls/tbxcolor \
diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk
index e07289cc80f7..cd3abc58e624 100644
--- a/svx/Library_svxcore.mk
+++ b/svx/Library_svxcore.mk
@@ -370,6 +370,7 @@ $(eval $(call gb_Library_add_exception_objects,svxcore,\
svx/source/table/viewcontactoftableobj \
svx/source/tbxctrls/extrusioncontrols \
svx/source/tbxctrls/fontworkgallery \
+ svx/source/tbxctrls/linectrl \
svx/source/tbxctrls/Palette \
svx/source/tbxctrls/PaletteManager \
svx/source/tbxctrls/tbcontrl \
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index dd0ac621adcc..3d52a8369b3f 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -51,6 +51,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/floatingframeborder \
svx/uiconfig/ui/floatinglineend \
svx/uiconfig/ui/floatinglineproperty \
+ svx/uiconfig/ui/floatinglinestyle \
svx/uiconfig/ui/floatingundoredo \
svx/uiconfig/ui/fontworkgallerydialog \
svx/uiconfig/ui/fontworkspacingdialog \
diff --git a/svx/source/sidebar/line/LinePropertyPanel.cxx b/svx/source/sidebar/line/LinePropertyPanel.cxx
index cf6dc5505f72..bd0fde7a8674 100644
--- a/svx/source/sidebar/line/LinePropertyPanel.cxx
+++ b/svx/source/sidebar/line/LinePropertyPanel.cxx
@@ -54,7 +54,6 @@ LinePropertyPanel::LinePropertyPanel(
maStyleControl(SID_ATTR_LINE_STYLE, *pBindings, *this),
maDashControl (SID_ATTR_LINE_DASH, *pBindings, *this),
maWidthControl(SID_ATTR_LINE_WIDTH, *pBindings, *this),
- maLineStyleListControl(SID_DASH_LIST, *pBindings, *this),
maTransControl(SID_ATTR_LINE_TRANSPARENCE, *pBindings, *this),
maEdgeStyle(SID_ATTR_LINE_JOINT, *pBindings, *this),
maCapStyle(SID_ATTR_LINE_CAP, *pBindings, *this),
@@ -74,7 +73,6 @@ void LinePropertyPanel::dispose()
maStyleControl.dispose();
maDashControl.dispose();
maWidthControl.dispose();
- maLineStyleListControl.dispose();
maTransControl.dispose();
maEdgeStyle.dispose();
maCapStyle.dispose();
@@ -107,16 +105,6 @@ void LinePropertyPanel::NotifyItemUpdate(
switch(nSID)
{
- case SID_ATTR_LINE_DASH:
- {
- updateLineDash(bDisabled, bSetOrDefault, pState);
- break;
- }
- case SID_ATTR_LINE_STYLE:
- {
- updateLineStyle(bDisabled, bSetOrDefault, pState);
- break;
- }
case SID_ATTR_LINE_TRANSPARENCE:
{
updateLineTransparence(bDisabled, bSetOrDefault, pState);
@@ -127,12 +115,6 @@ void LinePropertyPanel::NotifyItemUpdate(
updateLineWidth(bDisabled, bSetOrDefault, pState);
break;
}
- case SID_DASH_LIST:
- {
- FillLineStyleList();
- SelectLineStyle();
- break;
- }
case SID_ATTR_LINE_JOINT:
{
updateLineJoint(bDisabled, bSetOrDefault, pState);
@@ -176,30 +158,6 @@ void LinePropertyPanel::HandleContextChange(
enableArrowHead();
}
-void LinePropertyPanel::setLineStyle(const XLineStyleItem& rItem)
-{
- GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_LINE_STYLE,
- SfxCallMode::RECORD, { &rItem });
-}
-
-void LinePropertyPanel::setLineDash(const XLineDashItem& rItem)
-{
- GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_LINE_DASH,
- SfxCallMode::RECORD, { &rItem });
-}
-
-void LinePropertyPanel::setLineEndStyle(const XLineEndItem* pItem)
-{
- GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_LINEEND_STYLE,
- SfxCallMode::RECORD, { pItem });
-}
-
-void LinePropertyPanel::setLineStartStyle(const XLineStartItem* pItem)
-{
- GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_LINEEND_STYLE,
- SfxCallMode::RECORD, { pItem });
-}
-
void LinePropertyPanel::setLineJoint(const XLineJointItem* pItem)
{
GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_LINE_JOINT,
diff --git a/svx/source/sidebar/line/LinePropertyPanel.hxx b/svx/source/sidebar/line/LinePropertyPanel.hxx
index 00585290f579..c2ae25639db7 100644
--- a/svx/source/sidebar/line/LinePropertyPanel.hxx
+++ b/svx/source/sidebar/line/LinePropertyPanel.hxx
@@ -72,10 +72,6 @@ public:
protected:
- virtual void setLineStyle(const XLineStyleItem& rItem) override;
- virtual void setLineDash(const XLineDashItem& rItem) override;
- virtual void setLineEndStyle(const XLineEndItem* pItem) override;
- virtual void setLineStartStyle(const XLineStartItem* pItem) override;
virtual void setLineTransparency(const XLineTransparenceItem& rItem) override;
virtual void setLineJoint(const XLineJointItem* pItem) override;
virtual void setLineCap(const XLineCapItem* pItem) override;
@@ -85,7 +81,6 @@ private:
sfx2::sidebar::ControllerItem maStyleControl;
sfx2::sidebar::ControllerItem maDashControl;
sfx2::sidebar::ControllerItem maWidthControl;
- sfx2::sidebar::ControllerItem maLineStyleListControl;
sfx2::sidebar::ControllerItem maTransControl;
sfx2::sidebar::ControllerItem maEdgeStyle;
sfx2::sidebar::ControllerItem maCapStyle;
diff --git a/svx/source/sidebar/line/LinePropertyPanelBase.cxx b/svx/source/sidebar/line/LinePropertyPanelBase.cxx
index cee744ebd3b1..e0bba5977fe6 100644
--- a/svx/source/sidebar/line/LinePropertyPanelBase.cxx
+++ b/svx/source/sidebar/line/LinePropertyPanelBase.cxx
@@ -32,6 +32,7 @@
#include <svx/xtable.hxx>
#include <svx/xdash.hxx>
#include <svx/drawitem.hxx>
+#include <svx/linectrl.hxx>
#include <svx/svxitems.hrc>
#include <svtools/valueset.hxx>
#include <unotools/pathoptions.hxx>
@@ -55,19 +56,53 @@ const char SELECTWIDTH[] = "SelectWidth";
namespace svx::sidebar {
+// trigger disabling the arrows if the none line style is selected
+class DisableArrowsWrapper
+{
+private:
+ LinePropertyPanelBase& m_rPanel;
+
+public:
+ DisableArrowsWrapper(LinePropertyPanelBase& rPanel)
+ : m_rPanel(rPanel)
+ {
+ }
+
+ bool operator()(const OUString& rCommand, const css::uno::Any& rValue)
+ {
+ if (rCommand == ".uno:XLineStyle")
+ {
+ css::drawing::LineStyle eLineStyle(css::drawing::LineStyle_NONE);
+ rValue >>= eLineStyle;
+ m_rPanel.SetNoneLineStyle(eLineStyle == css::drawing::LineStyle_NONE);
+ }
+ return false;
+ }
+};
+
+namespace
+{
+ SvxLineStyleToolBoxControl* getLineStyleToolBoxControl(ToolbarUnoDispatcher& rToolBoxColor)
+ {
+ css::uno::Reference<css::frame::XToolbarController> xController = rToolBoxColor.GetControllerForCommand(".uno:XLineStyle");
+ SvxLineStyleToolBoxControl* pToolBoxLineStyleControl = dynamic_cast<SvxLineStyleToolBoxControl*>(xController.get());
+ return pToolBoxLineStyleControl;
+ }
+}
+
+
LinePropertyPanelBase::LinePropertyPanelBase(
vcl::Window* pParent,
const uno::Reference<css::frame::XFrame>& rxFrame)
: PanelLayout(pParent, "LinePropertyPanel", "svx/ui/sidebarline.ui", rxFrame, true),
mxTBColor(m_xBuilder->weld_toolbar("color")),
mxColorDispatch(new ToolbarUnoDispatcher(*mxTBColor, rxFrame)),
+ mxLineStyleTB(m_xBuilder->weld_toolbar("linestyle")),
+ mxLineStyleDispatch(new ToolbarUnoDispatcher(*mxLineStyleTB, rxFrame)),
mxFTWidth(m_xBuilder->weld_label("widthlabel")),
mxTBWidth(m_xBuilder->weld_toolbar("width")),
- mxLBStyle(new SvxLineLB(m_xBuilder->weld_combo_box("linestyle"))),
mxFTTransparency(m_xBuilder->weld_label("translabel")),
mxMFTransparent(m_xBuilder->weld_metric_spin_button("linetransparency", FieldUnit::PERCENT)),
- mxArrowsTB(m_xBuilder->weld_toolbar("arrowheads")),
- mxArrowsDispatch(new ToolbarUnoDispatcher(*mxArrowsTB, rxFrame)),
mxFTEdgeStyle(m_xBuilder->weld_label("cornerlabel")),
mxLBEdgeStyle(m_xBuilder->weld_combo_box("edgestyle")),
mxFTCapStyle(m_xBuilder->weld_label("caplabel")),
@@ -75,14 +110,14 @@ LinePropertyPanelBase::LinePropertyPanelBase(
mxGridLineProps(m_xBuilder->weld_widget("lineproperties")),
mxBoxArrowProps(m_xBuilder->weld_widget("arrowproperties")),
mxLineWidthPopup(new LineWidthPopup(mxTBWidth.get(), *this)),
- mpStyleItem(),
- mpDashItem(),
+ mxDisableArrowsWrapper(new DisableArrowsWrapper(*this)),
mnTrans(0),
meMapUnit(MapUnit::MapMM),
mnWidthCoreValue(0),
maIMGNone(BMP_NONE_ICON),
mbWidthValuable(true),
- mbArrowSupported(true)
+ mbArrowSupported(true),
+ mbNoneLineStyle(false)
{
Initialize();
}
@@ -99,11 +134,10 @@ void LinePropertyPanelBase::dispose()
mxTBWidth.reset();
mxColorDispatch.reset();
mxTBColor.reset();
- mxLBStyle.reset();
mxFTTransparency.reset();
mxMFTransparent.reset();
- mxArrowsDispatch.reset();
- mxArrowsTB.reset();
+ mxLineStyleDispatch.reset();
+ mxLineStyleTB.reset();
mxFTEdgeStyle.reset();
mxLBEdgeStyle.reset();
mxFTCapStyle.reset();
@@ -127,10 +161,6 @@ void LinePropertyPanelBase::Initialize()
maIMGWidthIcon[6] = BMP_WIDTH7_ICON;
maIMGWidthIcon[7] = BMP_WIDTH8_ICON;
- FillLineStyleList();
- SelectLineStyle();
- mxLBStyle->connect_changed( LINK( this, LinePropertyPanelBase, ChangeLineStyleHdl ) );
-
mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[0]);
mxTBWidth->connect_clicked(LINK(this, LinePropertyPanelBase, ToolboxWidthSelectHdl));
@@ -139,62 +169,9 @@ void LinePropertyPanelBase::Initialize()
mxLBEdgeStyle->connect_changed( LINK( this, LinePropertyPanelBase, ChangeEdgeStyleHdl ) );
mxLBCapStyle->connect_changed( LINK( this, LinePropertyPanelBase, ChangeCapStyleHdl ) );
-}
-
-void LinePropertyPanelBase::DataChanged(const DataChangedEvent& /*rEvent*/)
-{
-}
-
-void LinePropertyPanelBase::updateLineStyle(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem)
-{
- if(bDisabled)
- {
- mxLBStyle->set_sensitive(false);
- }
- else
- {
- mxLBStyle->set_sensitive(true);
- }
- if(bSetOrDefault)
- {
- if(pItem)
- {
- mpStyleItem.reset(static_cast<XLineStyleItem*>(pItem->Clone()));
- }
- }
- else
- {
- mpStyleItem.reset();
- }
-
- SelectLineStyle();
-}
-
-void LinePropertyPanelBase::updateLineDash(bool bDisabled, bool bSetOrDefault, const SfxPoolItem* pItem)
-{
- if(bDisabled)
- {
- mxLBStyle->set_sensitive(false);
- }
- else
- {
- mxLBStyle->set_sensitive(true);
- }
-
- if(bSetOrDefault)
- {
- if(pItem)
- {
- mpDashItem.reset(static_cast<XLineDashItem*>(pItem->Clone()));
- }
- }
- else
- {
- mpDashItem.reset();
- }
-
- SelectLineStyle();
+ SvxLineStyleToolBoxControl* pLineStyleControl = getLineStyleToolBoxControl(*mxLineStyleDispatch);
+ pLineStyleControl->setLineStyleSelectFunction(*mxDisableArrowsWrapper);
}
void LinePropertyPanelBase::updateLineTransparence(bool bDisabled, bool bSetOrDefault,
@@ -366,44 +343,6 @@ void LinePropertyPanelBase::updateLineCap(bool bDisabled, bool bSetOrDefault,
mxLBCapStyle->set_active(-1);
}
-IMPL_LINK_NOARG(LinePropertyPanelBase, ChangeLineStyleHdl, weld::ComboBox&, void)
-{
- const sal_Int32 nPos(mxLBStyle->get_active());
-
- if (nPos != -1 && mxLBStyle->get_value_changed_from_saved())
- {
- if(0 == nPos)
- {
- // drawing::LineStyle_NONE
- const XLineStyleItem aItem(drawing::LineStyle_NONE);
-
- setLineStyle(aItem);
- }
- else if(1 == nPos)
- {
- // drawing::LineStyle_SOLID
- const XLineStyleItem aItem(drawing::LineStyle_SOLID);
-
- setLineStyle(aItem);
- }
- else if (mxLineStyleList.is() && mxLineStyleList->Count() > static_cast<long>(nPos - 2))
- {
- // drawing::LineStyle_DASH
- const XLineStyleItem aItemA(drawing::LineStyle_DASH);
- const XDashEntry* pDashEntry = mxLineStyleList->GetDash(nPos - 2);
- OSL_ENSURE(pDashEntry, "OOps, got empty XDash from XDashList (!)");
- const XLineDashItem aItemB(
- pDashEntry ? pDashEntry->GetName() : OUString(),
- pDashEntry ? pDashEntry->GetDash() : XDash());
-
- setLineStyle(aItemA);
- setLineDash(aItemB);
- }
- }
-
- ActivateControls();
-}
-
IMPL_LINK_NOARG(LinePropertyPanelBase, ChangeEdgeStyleHdl, weld::ComboBox&, void)
{
const sal_Int32 nPos(mxLBEdgeStyle->get_active());
@@ -533,79 +472,12 @@ void LinePropertyPanelBase::SetWidth(long nWidth)
mxLineWidthPopup->SetWidthSelect(mnWidthCoreValue, mbWidthValuable, meMapUnit);
}
-void LinePropertyPanelBase::FillLineStyleList()
-{
- SfxObjectShell* pSh = SfxObjectShell::Current();
- if ( pSh && pSh->GetItem( SID_DASH_LIST ) )
- {
- mxLBStyle->set_sensitive(true);
- mxLineStyleList = pSh->GetItem( SID_DASH_LIST )->GetDashList();
-
- if (mxLineStyleList.is())
- {
- mxLBStyle->Fill(mxLineStyleList);
- }
-
- mxLBStyle->set_active(0);
- }
- else
- {
- mxLBStyle->set_sensitive(false);
- }
-}
-
-void LinePropertyPanelBase::SelectLineStyle()
-{
- if (!mpStyleItem || !mpDashItem)
- {
- mxLBStyle->set_active(-1);
- mxLBStyle->set_sensitive(false);
- return;
- }
-
- const drawing::LineStyle eXLS(mpStyleItem->GetValue());
- bool bSelected(false);
-
- switch(eXLS)
- {
- case drawing::LineStyle_NONE:
- break;
- case drawing::LineStyle_SOLID:
- mxLBStyle->set_active(1);
- bSelected = true;
- break;
- default:
- if(mxLineStyleList.is())
- {
- const XDash& rDash = mpDashItem->GetDashValue();
- for(long a(0);!bSelected && a < mxLineStyleList->Count(); a++)
- {
- const XDashEntry* pEntry = mxLineStyleList->GetDash(a);
- const XDash& rEntry = pEntry->GetDash();
- if(rDash == rEntry)
- {
- mxLBStyle->set_active(a + 2);
- bSelected = true;
- }
- }
- }
- break;
- }
-
- if(!bSelected)
- mxLBStyle->set_active( 0 );
-
- ActivateControls();
-}
-
void LinePropertyPanelBase::ActivateControls()
{
- const sal_Int32 nPos(mxLBStyle->get_active());
- bool bLineStyle( nPos != 0 );
-
- mxGridLineProps->set_sensitive( bLineStyle );
- mxBoxArrowProps->set_sensitive( bLineStyle );
- mxArrowsTB->set_sensitive( bLineStyle && mbArrowSupported );
+ mxGridLineProps->set_sensitive(mbNoneLineStyle);
+ mxBoxArrowProps->set_sensitive(mbNoneLineStyle);
+ mxLineStyleTB->set_item_visible(".uno:LineEndStyle", mbArrowSupported);
+ mxLineStyleTB->set_item_sensitive(".uno:LineEndStyle", !mbNoneLineStyle);
}
void LinePropertyPanelBase::setMapUnit(MapUnit eMapUnit)
diff --git a/svx/source/tbxctrls/itemwin.cxx b/svx/source/tbxctrls/itemwin.cxx
index 5443d4f12751..7e6b661f9ec4 100644
--- a/svx/source/tbxctrls/itemwin.cxx
+++ b/svx/source/tbxctrls/itemwin.cxx
@@ -34,8 +34,6 @@
#include <svx/svxids.hrc>
-#define DELAY_TIMEOUT 100
-
#include <svx/xlnclit.hxx>
#include <svx/xlnwtit.hxx>
#include <svx/xlineit0.hxx>
@@ -47,6 +45,7 @@
#include <svx/linectrl.hxx>
#include <svtools/colorcfg.hxx>
#include <svtools/unitconv.hxx>
+#include <svtools/valueset.hxx>
#include <boost/property_tree/json_parser.hpp>
@@ -56,231 +55,6 @@ using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
-SvxLineBox::SvxLineBox( vcl::Window* pParent, const Reference< XFrame >& rFrame ) :
- ListBox(pParent, WB_BORDER | WB_DROPDOWN | WB_AUTOHSCROLL),
- nCurPos ( 0 ),
- aLogicalSize(40,140),
- bRelease ( true ),
- mpSh ( nullptr ),
- mxFrame ( rFrame )
-{
- SetSizePixel(LogicToPixel(aLogicalSize, MapMode(MapUnit::MapAppFont)));
- Show();
-
- aDelayTimer.SetTimeout( DELAY_TIMEOUT );
- aDelayTimer.SetInvokeHandler( LINK( this, SvxLineBox, DelayHdl_Impl ) );
- aDelayTimer.Start();
-}
-
-
-// Fills the listbox (provisional) with strings
-
-void SvxLineBox::Fill( const XDashListRef &pList )
-{
- Clear();
-
- if( !pList.is() )
- return;
-
- // entry for 'none'
- InsertEntry(pList->GetStringForUiNoLine());
-
- // entry for solid line
- InsertEntry(pList->GetStringForUiSolidLine(),
- Image(pList->GetBitmapForUISolidLine()));
-
- // entries for dashed lines
-
- long nCount = pList->Count();
- SetUpdateMode( false );
-
- for( long i = 0; i < nCount; i++ )
- {
- const XDashEntry* pEntry = pList->GetDash(i);
- const BitmapEx aBitmap = pList->GetUiBitmap( i );
- if( !aBitmap.IsEmpty() )
- {
- InsertEntry(pEntry->GetName(), Image(aBitmap));
- }
- else
- InsertEntry( pEntry->GetName() );
- }
-
- AdaptDropDownLineCountToMaximum();
- SetUpdateMode( true );
-}
-
-IMPL_LINK_NOARG(SvxLineBox, DelayHdl_Impl, Timer *, void)
-{
- if ( GetEntryCount() == 0 )
- {
- mpSh = SfxObjectShell::Current();
- FillControl();
- }
-}
-
-
-void SvxLineBox::Select()
-{
- // Call the parent's Select() member to trigger accessibility events.
- ListBox::Select();
-
- if ( IsTravelSelect() )
- return;
-
- drawing::LineStyle eXLS;
- sal_Int32 nPos = GetSelectedEntryPos();
-
- switch ( nPos )
- {
- case 0:
- eXLS = drawing::LineStyle_NONE;
- break;
-
- case 1:
- eXLS = drawing::LineStyle_SOLID;
- break;
-
- default:
- {
- eXLS = drawing::LineStyle_DASH;
-
- if ( nPos != LISTBOX_ENTRY_NOTFOUND &&
- SfxObjectShell::Current() &&
- SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) )
- {
- // LineDashItem will only be sent if it also has a dash.
- // Notify cares!
- SvxDashListItem const * pItem = SfxObjectShell::Current()->GetItem( SID_DASH_LIST );
- XLineDashItem aLineDashItem( GetSelectedEntry(),
- pItem->GetDashList()->GetDash( nPos - 2 )->GetDash() );
-
- Any a;
- Sequence< PropertyValue > aArgs( 1 );
- aArgs[0].Name = "LineDash";
- aLineDashItem.QueryValue ( a );
- aArgs[0].Value = a;
- SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
- ".uno:LineDash",
- aArgs );
- }
- }
- break;
- }
-
- XLineStyleItem aLineStyleItem( eXLS );
- Any a;
- Sequence< PropertyValue > aArgs( 1 );
- aArgs[0].Name = "XLineStyle";
- aLineStyleItem.QueryValue ( a );
- aArgs[0].Value = a;
- SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
- ".uno:XLineStyle",
- aArgs );
-
- nCurPos = GetSelectedEntryPos();
- ReleaseFocus_Impl();
-}
-
-
-bool SvxLineBox::PreNotify( NotifyEvent& rNEvt )
-{
- MouseNotifyEvent nType = rNEvt.GetType();
-
- switch(nType)
- {
- case MouseNotifyEvent::MOUSEBUTTONDOWN:
- case MouseNotifyEvent::GETFOCUS:
- nCurPos = GetSelectedEntryPos();
- break;
- case MouseNotifyEvent::LOSEFOCUS:
- SelectEntryPos(nCurPos);
- break;
- case MouseNotifyEvent::KEYINPUT:
- {
- const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
- if( pKEvt->GetKeyCode().GetCode() == KEY_TAB)
- {
- bRelease = false;
- Select();
- }
- }
- break;
- default:
- break;
- }
- return ListBox::PreNotify( rNEvt );
-}
-
-
-bool SvxLineBox::EventNotify( NotifyEvent& rNEvt )
-{
- bool bHandled = ListBox::EventNotify( rNEvt );
-
- if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
- {
- const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
-
- switch ( pKEvt->GetKeyCode().GetCode() )
- {
- case KEY_RETURN:
- Select();
- bHandled = true;
- break;
-
- case KEY_ESCAPE:
- SelectEntryPos( nCurPos );
- ReleaseFocus_Impl();
- bHandled = true;
- break;
- }
- }
- return bHandled;
-}
-
-
-void SvxLineBox::ReleaseFocus_Impl()
-{
- if(!bRelease)
- {
- bRelease = true;
- return;
- }
-
- if( SfxViewShell::Current() )
- {
- vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
-
- if ( pShellWnd )
- pShellWnd->GrabFocus();
- }
-}
-
-void SvxLineBox::DataChanged( const DataChangedEvent& rDCEvt )
-{
- if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
- (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
- {
- SetSizePixel(LogicToPixel(aLogicalSize, MapMode(MapUnit::MapAppFont)));
- }
-
- ListBox::DataChanged( rDCEvt );
-}
-
-void SvxLineBox::FillControl()
-{
- // FillStyles();
- if ( !mpSh )
- mpSh = SfxObjectShell::Current();
-
- if( mpSh )
- {
- const SvxDashListItem* pItem = mpSh->GetItem( SID_DASH_LIST );
- if ( pItem )
- Fill( pItem->GetDashList() );
- }
-}
-
SvxMetricField::SvxMetricField(
vcl::Window* pParent, const Reference< XFrame >& rFrame )
: MetricField(pParent, WB_BORDER | WB_SPIN | WB_REPEAT)
@@ -303,7 +77,6 @@ SvxMetricField::SvxMetricField(
Show();
}
-
void SvxMetricField::Update( const XLineWidthItem* pItem )
{
if ( pItem )
@@ -315,7 +88,6 @@ void SvxMetricField::Update( const XLineWidthItem* pItem )
SetText( "" );
}
-
void SvxMetricField::Modify()
{
MetricField::Modify();
@@ -332,7 +104,6 @@ void SvxMetricField::Modify()
aArgs );
}
-
void SvxMetricField::ReleaseFocus_Impl()
{
if( SfxViewShell::Current() )
diff --git a/svx/source/tbxctrls/linectrl.cxx b/svx/source/tbxctrls/linectrl.cxx
index 80c36beb55d5..31233a13e5ea 100644
--- a/svx/source/tbxctrls/linectrl.cxx
+++ b/svx/source/tbxctrls/linectrl.cxx
@@ -19,6 +19,8 @@
#include <string>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
#include <vcl/toolbox.hxx>
#include <sfx2/app.hxx>
#include <sfx2/dispatch.hxx>
@@ -42,6 +44,7 @@
#include <svx/linectrl.hxx>
#include <svx/itemwin.hxx>
#include <svx/dialmgr.hxx>
+#include <svx/tbxcolorupdate.hxx>
#include <svx/unoapi.hxx>
#include <memory>
@@ -55,198 +58,171 @@ using namespace ::com::sun::star;
// For End Line Controller
#define MAX_LINES 12
-SFX_IMPL_TOOLBOX_CONTROL( SvxLineStyleToolBoxControl, XLineStyleItem );
-SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
-
-SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( sal_uInt16 nSlotId,
- sal_uInt16 nId,
- ToolBox& rTbx ) :
- SfxToolBoxControl( nSlotId, nId, rTbx ),
- bUpdate ( false )
+SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext )
+ : svt::PopupWindowController( rContext, nullptr, OUString() )
{
- addStatusListener( ".uno:LineDash");
- addStatusListener( ".uno:DashListState");
+ addStatusListener(".uno:LineDash");
}
-
SvxLineStyleToolBoxControl::~SvxLineStyleToolBoxControl()
{
}
-
-void SvxLineStyleToolBoxControl::StateChanged (
-
- sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
-
+void SAL_CALL SvxLineStyleToolBoxControl::statusChanged( const frame::FeatureStateEvent& rEvent )
{
- SvxLineBox* pBox = static_cast<SvxLineBox*>( GetToolBox().GetItemWindow( GetId() ) );
- DBG_ASSERT( pBox, "Window not found!" );
+ ToolBox* pToolBox = nullptr;
+ sal_uInt16 nId = 0;
+ if (!getToolboxId(nId, &pToolBox) && !m_pToolbar)
+ return;
+
+ OString sId(m_aCommandURL.toUtf8());
- if( eState == SfxItemState::DISABLED )
+ if ( rEvent.FeatureURL.Complete == m_aCommandURL )
{
- pBox->Disable();
- pBox->SetNoSelection();
+ if (m_pToolbar)
+ m_pToolbar->set_item_sensitive(sId, rEvent.IsEnabled);
+ else
+ pToolBox->EnableItem( nId, rEvent.IsEnabled );
}
- else
- {
- pBox->Enable();
- if ( eState == SfxItemState::DEFAULT )
+ m_xBtnUpdater->Update(rEvent);
+
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if (pSh)
+ {
+ const SvxDashListItem* pItem = pSh->GetItem( SID_DASH_LIST );
+ if (pItem)
{
- if( nSID == SID_ATTR_LINE_STYLE )
+ XDashListRef xList = pItem->GetDashList();
+ int nIndex = m_xBtnUpdater->GetStyleIndex();
+ switch (nIndex)
{
- pStyleItem.reset( static_cast<XLineStyleItem*>(pState->Clone()) );
- }
- else if( nSID == SID_ATTR_LINE_DASH )
- {
- pDashItem.reset( static_cast<XLineDashItem*>(pState->Clone()) );
+ case -1:
+ case 0:
+ {
+ BitmapEx aEmpty(xList->GetBitmapForUISolidLine());
+ aEmpty.Erase(Application::GetSettings().GetStyleSettings().GetFieldColor());
+ if (m_pToolbar)
+ {
+ Graphic aGraf(aEmpty);
+ m_pToolbar->set_item_image(sId, aGraf.GetXGraphic());
+ }
+ else
+ pToolBox->SetItemImage(nId, Image(aEmpty));
+ break;
+ }
+ case 1:
+ if (m_pToolbar)
+ {
+ Graphic aGraf(xList->GetBitmapForUISolidLine());
+ m_pToolbar->set_item_image(sId, aGraf.GetXGraphic());
+ }
+ else
+ pToolBox->SetItemImage(nId, Image(xList->GetBitmapForUISolidLine()));
+ break;
+ default:
+ if (m_pToolbar)
+ {
+ Graphic aGraf(xList->GetUiBitmap(nIndex - 2));
+ m_pToolbar->set_item_image(sId, aGraf.GetXGraphic());
+ }
+ else
+ pToolBox->SetItemImage(nId, Image(xList->GetUiBitmap(nIndex - 2)));
+ break;
}
-
- bUpdate = true;
- Update( pState );
- }
- else if ( nSID != SID_DASH_LIST )
- {
- // no or ambiguous status
- pBox->SetNoSelection();
}
}
}
-
-void SvxLineStyleToolBoxControl::Update( const SfxPoolItem* pState )
+void SAL_CALL SvxLineStyleToolBoxControl::execute(sal_Int16 /*KeyModifier*/)
{
- if ( pState && bUpdate )
+ if (m_pToolbar)
{
- bUpdate = false;
-
- SvxLineBox* pBox = static_cast<SvxLineBox*>(GetToolBox().GetItemWindow( GetId() ));
- DBG_ASSERT( pBox, "Window not found!" );
-
- // Since the timer can strike unexpectedly, it may happen that
- // the LB is not yet filled. A ClearCache() on the control
- // in DelayHdl () was unsuccessful.
- if( pBox->GetEntryCount() == 0 )
- pBox->FillControl();
-
- drawing::LineStyle eXLS;
-
- if ( pStyleItem )
- eXLS = pStyleItem->GetValue();
- else
- eXLS = drawing::LineStyle_NONE;
-
- switch( eXLS )
- {
- case drawing::LineStyle_NONE:
- pBox->SelectEntryPos( 0 );
- break;
-
- case drawing::LineStyle_SOLID:
- pBox->SelectEntryPos( 1 );
- break;
+ // Toggle the popup also when toolbutton is activated
+ const OString aId(m_aCommandURL.toUtf8());
+ m_pToolbar->set_menu_item_active(aId, !m_pToolbar->get_menu_item_active(aId));
+ }
+ else
+ {
+ // Open the popup also when Enter key is pressed.
+ createPopupWindow();
+ }
+}
- case drawing::LineStyle_DASH:
- {
- if( pDashItem )
- {
- OUString aString = SvxUnogetInternalNameForItem(
- XATTR_LINEDASH, pDashItem->GetName());
- pBox->SelectEntry( aString );
- }
- else
- pBox->SetNoSelection();
- }
- break;
+void SvxLineStyleToolBoxControl::initialize( const css::uno::Sequence<css::uno::Any>& rArguments )
+{
+ svt::PopupWindowController::initialize( rArguments );
- default:
- OSL_FAIL( "Unsupported type of line" );
- break;
- }
+ if (m_pToolbar)
+ {
+ mxPopoverContainer.reset(new ToolbarPopupContainer(m_pToolbar));
+ m_pToolbar->set_item_popover(m_aCommandURL.toUtf8(), mxPopoverContainer->getTopLevel());
}
- if ( auto pDashListItem = dynamic_cast<const SvxDashListItem*>( pState) )
+ ToolBox* pToolBox = nullptr;
+ sal_uInt16 nId = 0;
+ if ( getToolboxId( nId, &pToolBox ) )
{
- // The list of line styles has changed
- SvxLineBox* pBox = static_cast<SvxLineBox*>(GetToolBox().GetItemWindow( GetId() ));
- DBG_ASSERT( pBox, "Window not found!" );
-
- OUString aString( pBox->GetSelectedEntry() );
- pBox->Clear();
- pBox->InsertEntry( SvxResId(RID_SVXSTR_INVISIBLE) );
- pBox->InsertEntry( SvxResId(RID_SVXSTR_SOLID) );
- pBox->Fill( pDashListItem->GetDashList() );
- pBox->SelectEntry( aString );
+ pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
}
-}
+ m_xBtnUpdater.reset(new svx::ToolboxButtonLineStyleUpdater);
+}
-VclPtr<vcl::Window> SvxLineStyleToolBoxControl::CreateItemWindow( vcl::Window *pParent )
+void SvxLineStyleToolBoxControl::setLineStyleSelectFunction(const LineStyleSelectFunction& rLineStyleSelectFunction)
{
- return VclPtr<SvxLineBox>::Create( pParent, m_xFrame ).get();
+ m_aLineStyleSelectFunction = rLineStyleSelectFunction;
}
-SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
- sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
- SfxToolBoxControl( nSlotId, nId, rTbx )
+void SvxLineStyleToolBoxControl::dispatchLineStyleCommand(const OUString& rCommand, const Sequence<PropertyValue>& rArgs)
{
- addStatusListener( ".uno:MetricUnit");
-}
+ if (m_aLineStyleSelectFunction && m_aLineStyleSelectFunction(rCommand, rArgs[0].Value))
+ return;
+ dispatchCommand(rCommand, rArgs);
+}
-SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
+int SvxLineStyleToolBoxControl::GetStyleIndex() const
{
+ return m_xBtnUpdater->GetStyleIndex();
}
-
-void SvxLineWidthToolBoxControl::StateChanged(
- sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
+std::unique_ptr<WeldToolbarPopup> SvxLineStyleToolBoxControl::weldPopupWindow()
{
- SvxMetricField* pFld = static_cast<SvxMetricField*>(
- GetToolBox().GetItemWindow( GetId() ));
- DBG_ASSERT( pFld, "Window not found" );
+ return std::make_unique<SvxLineBox>(this, m_pToolbar, m_xBtnUpdater->GetStyleIndex());
+}
- if ( nSID == SID_ATTR_METRIC )
- {
- pFld->RefreshDlgUnit();
- }
- else
- {
- if ( eState == SfxItemState::DISABLED )
- {
- pFld->Disable();
- pFld->SetText( "" );
- }
- else
- {
- pFld->Enable();
+VclPtr<vcl::Window> SvxLineStyleToolBoxControl::createVclPopupWindow( vcl::Window* pParent )
+{
+ mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
+ std::make_unique<SvxLineBox>(this, pParent->GetFrameWeld(), m_xBtnUpdater->GetStyleIndex()));
- if ( eState == SfxItemState::DEFAULT )
- {
- DBG_ASSERT( dynamic_cast<const XLineWidthItem*>( pState) != nullptr, "wrong ItemType" );
+ mxInterimPopover->Show();
- // Core-Unit handed over to MetricField
- // Should not happen in CreateItemWin ()!
- // CD!!! GetCoreMetric();
- pFld->SetCoreUnit( MapUnit::Map100thMM );
+ return mxInterimPopover;
+}
- pFld->Update( static_cast<const XLineWidthItem*>(pState) );
- }
- else
- pFld->Update( nullptr );
- }
- }
+OUString SvxLineStyleToolBoxControl::getImplementationName()
+{
+ return "com.sun.star.comp.svx.LineStyleToolBoxControl";
}
+css::uno::Sequence<OUString> SvxLineStyleToolBoxControl::getSupportedServiceNames()
+{
+ return { "com.sun.star.frame.ToolbarController" };
+}
-VclPtr<vcl::Window> SvxLineWidthToolBoxControl::CreateItemWindow( vcl::Window *pParent )
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
+com_sun_star_comp_svx_LineStyleToolBoxControl_get_implementation(
+ css::uno::XComponentContext* rContext,
+ css::uno::Sequence<css::uno::Any> const & )
{
- return VclPtr<SvxMetricField>::Create( pParent, m_xFrame ).get();
+ return cppu::acquire( new SvxLineStyleToolBoxControl( rContext ) );
}
namespace {
-class SvxLineEndToolBoxControl : public svt::PopupWindowController
+class SvxLineEndToolBoxControl final : public svt::PopupWindowController
{
public:
explicit SvxLineEndToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext );
@@ -529,4 +505,136 @@ com_sun_star_comp_svx_LineEndToolBoxControl_get_implementation(
return cppu::acquire( new SvxLineEndToolBoxControl( rContext ) );
}
+SvxLineBox::SvxLineBox(SvxLineStyleToolBoxControl* pControl, weld::Widget* pParent, int nInitialIndex)
+ : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "svx/ui/floatinglinestyle.ui", "FloatingLineStyle")
+ , mxControl(pControl)
+ , mxLineStyleSet(new SvtValueSet(m_xBuilder->weld_scrolled_window("valuesetwin")))
+ , mxLineStyleSetWin(new weld::CustomWeld(*m_xBuilder, "valueset", *mxLineStyleSet))
+{
+ mxLineStyleSet->SetStyle(WB_FLATVALUESET | WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT);
+
+ FillControl();
+
+ mxLineStyleSet->SelectItem(nInitialIndex + 1);
+
+ mxLineStyleSet->SetSelectHdl( LINK( this, SvxLineBox, SelectHdl ) );
+}
+
+void SvxLineBox::GrabFocus()
+{
+ mxLineStyleSet->GrabFocus();
+}
+
+SvxLineBox::~SvxLineBox()
+{
+}
+
+// Fills the listbox (provisional) with strings
+
+void SvxLineBox::Fill( const XDashListRef &pList )
+{
+ mxLineStyleSet->Clear();
+
+ if( !pList.is() )
+ return;
+
+ // entry for 'none'
+ mxLineStyleSet->InsertItem(1, Image(), pList->GetStringForUiNoLine());
+
+ // entry for solid line
+ auto aBmp = pList->GetBitmapForUISolidLine();
+ Size aBmpSize = aBmp.GetSizePixel();
+ mxLineStyleSet->InsertItem(2, Image(aBmp), pList->GetStringForUiSolidLine());
+
+ // entries for dashed lines
+ long nCount = pList->Count();
+ for( long i = 0; i < nCount; i++ )
+ {
+ const XDashEntry* pEntry = pList->GetDash(i);
+ const BitmapEx aBitmap = pList->GetUiBitmap(i);
+
+ mxLineStyleSet->InsertItem(i + 3, Image(aBitmap), pEntry->GetName());
+ }
+
+ sal_uInt16 nLines = std::min( static_cast<sal_uInt16>(nCount + 2), sal_uInt16(MAX_LINES) );
+ mxLineStyleSet->SetLineCount(nLines);
+
+ WinBits nBits = mxLineStyleSet->GetStyle();
+ if ( nLines == mxLineStyleSet->GetItemCount() )
+ nBits &= ~WB_VSCROLL;
+ else
+ nBits |= WB_VSCROLL;
+ mxLineStyleSet->SetStyle( nBits );
+
+ Size aSize(aBmpSize);
+ aSize.AdjustWidth(6);
+ aSize.AdjustHeight(6);
+ aSize = mxLineStyleSet->CalcWindowSizePixel(aSize);
+ mxLineStyleSet->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height());
+ mxLineStyleSet->SetOutputSizePixel(aSize);
+}
+
+IMPL_LINK_NOARG(SvxLineBox, SelectHdl, SvtValueSet*, void)
+{
+ drawing::LineStyle eXLS;
+ sal_Int32 nPos = mxLineStyleSet->GetSelectedItemId();
+ --nPos; // ids start at 1, get the pos of the id
+
+ switch ( nPos )
+ {
+ case 0:
+ eXLS = drawing::LineStyle_NONE;
+ break;
+
+ case 1:
+ eXLS = drawing::LineStyle_SOLID;
+ break;
+
+ default:
+ {
+ eXLS = drawing::LineStyle_DASH;
+
+ if ( nPos != -1 &&
+ SfxObjectShell::Current() &&
+ SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) )
+ {
+ // LineDashItem will only be sent if it also has a dash.
+ // Notify cares!
+ SvxDashListItem const * pItem = SfxObjectShell::Current()->GetItem( SID_DASH_LIST );
+ const XDashEntry* pEntry = pItem->GetDashList()->GetDash(nPos - 2);
+ XLineDashItem aLineDashItem(pEntry->GetName(), pEntry->GetDash());
+
+ Any a;
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = "LineDash";
+ aLineDashItem.QueryValue ( a );
+ aArgs[0].Value = a;
+ mxControl->dispatchLineStyleCommand(".uno:LineDash", aArgs);
+ }
+ }
+ break;
+ }
+
+ XLineStyleItem aLineStyleItem( eXLS );
+ Any a;
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = "XLineStyle";
+ aLineStyleItem.QueryValue ( a );
+ aArgs[0].Value = a;
+ mxControl->dispatchLineStyleCommand(".uno:XLineStyle", aArgs);
+
+ mxControl->EndPopupMode();
+}
+
+void SvxLineBox::FillControl()
+{
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if (pSh)
+ {
+ const SvxDashListItem* pItem = pSh->GetItem( SID_DASH_LIST );
+ if (pItem)
+ Fill(pItem->GetDashList());
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/tbxctrls/linewidthctrl.cxx b/svx/source/tbxctrls/linewidthctrl.cxx
new file mode 100644
index 000000000000..0a6d75446819
--- /dev/null
+++ b/svx/source/tbxctrls/linewidthctrl.cxx
@@ -0,0 +1,116 @@
+/* -*- 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 .
+ */
+
+#include <string>
+
+#include <vcl/toolbox.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/objsh.hxx>
+
+#include <svtools/toolbarmenu.hxx>
+#include <svtools/popupwindowcontroller.hxx>
+#include <svtools/valueset.hxx>
+
+#include <svx/strings.hrc>
+#include <svx/svxids.hrc>
+#include <helpids.h>
+
+#include <svx/drawitem.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xtable.hxx>
+#include <svx/linectrl.hxx>
+#include <svx/itemwin.hxx>
+#include <svx/dialmgr.hxx>
+#include <svx/tbxcolorupdate.hxx>
+#include <svx/unoapi.hxx>
+#include <memory>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star;
+
+SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
+
+SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
+ sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
+ SfxToolBoxControl( nSlotId, nId, rTbx )
+{
+ addStatusListener( ".uno:MetricUnit");
+}
+
+
+SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
+{
+}
+
+
+void SvxLineWidthToolBoxControl::StateChanged(
+ sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
+{
+ SvxMetricField* pFld = static_cast<SvxMetricField*>(
+ GetToolBox().GetItemWindow( GetId() ));
+ DBG_ASSERT( pFld, "Window not found" );
+
+ if ( nSID == SID_ATTR_METRIC )
+ {
+ pFld->RefreshDlgUnit();
+ }
+ else
+ {
+ if ( eState == SfxItemState::DISABLED )
+ {
+ pFld->Disable();
+ pFld->SetText( "" );
+ }
+ else
+ {
+ pFld->Enable();
+
+ if ( eState == SfxItemState::DEFAULT )
+ {
+ DBG_ASSERT( dynamic_cast<const XLineWidthItem*>( pState) != nullptr, "wrong ItemType" );
+
+ // Core-Unit handed over to MetricField
+ // Should not happen in CreateItemWin ()!
+ // CD!!! GetCoreMetric();
+ pFld->SetCoreUnit( MapUnit::Map100thMM );
+
+ pFld->Update( static_cast<const XLineWidthItem*>(pState) );
+ }
+ else
+ pFld->Update( nullptr );
+ }
+ }
+}
+
+
+VclPtr<vcl::Window> SvxLineWidthToolBoxControl::CreateItemWindow( vcl::Window *pParent )
+{
+ return VclPtr<SvxMetricField>::Create( pParent, m_xFrame ).get();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/tbxctrls/tbxcolorupdate.cxx b/svx/source/tbxctrls/tbxcolorupdate.cxx
index 2895f258590b..554bf0205c7b 100644
--- a/svx/source/tbxctrls/tbxcolorupdate.cxx
+++ b/svx/source/tbxctrls/tbxcolorupdate.cxx
@@ -17,9 +17,14 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <sfx2/objsh.hxx>
+#include <svx/drawitem.hxx>
#include <svx/tbxcolorupdate.hxx>
#include <svx/svxids.hrc>
+#include <svx/unomid.hxx>
#include <svx/xdef.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlndsit.hxx>
#include <vcl/commandinfoprovider.hxx>
#include <vcl/svapp.hxx>
@@ -275,6 +280,67 @@ namespace svx
return Size(nWidth, nHeight);
}
+ ToolboxButtonLineStyleUpdater::ToolboxButtonLineStyleUpdater()
+ : m_eXLS(css::drawing::LineStyle_NONE)
+ , m_nDashStyleIndex(-1)
+ {
+ }
+
+ void ToolboxButtonLineStyleUpdater::Update(const com::sun::star::frame::FeatureStateEvent& rEvent)
+ {
+ if (rEvent.FeatureURL.Complete == ".uno:LineDash")
+ {
+ m_nDashStyleIndex = -1;
+
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if (!pSh)
+ return;
+ const SvxDashListItem* pItem = pSh->GetItem( SID_DASH_LIST );
+ if (!pItem)
+ return;
+
+ XLineDashItem aDashItem;
+ aDashItem.PutValue(rEvent.State, 0);
+ const XDash& rDash = aDashItem.GetDashValue();
+
+ XDashListRef xLineStyleList = pItem->GetDashList();
+ for (long i = 0; i < xLineStyleList->Count(); ++i)
+ {
+ const XDashEntry* pEntry = xLineStyleList->GetDash(i);
+ const XDash& rEntry = pEntry->GetDash();
+ if (rDash == rEntry)
+ {
+ m_nDashStyleIndex = i;
+ break;
+ }
+ }
+ }
+ else if (rEvent.FeatureURL.Complete == ".uno:XLineStyle")
+ {
+ XLineStyleItem aLineStyleItem;
+ aLineStyleItem.PutValue(rEvent.State, 0);
+
+ m_eXLS = aLineStyleItem.GetValue();
+ }
+ }
+
+ int ToolboxButtonLineStyleUpdater::GetStyleIndex() const
+ {
+ int nRet;
+ switch (m_eXLS)
+ {
+ case css::drawing::LineStyle_NONE:
+ nRet = 0;
+ break;
+ case css::drawing::LineStyle_SOLID:
+ nRet = 1;
+ break;
+ default:
+ nRet = m_nDashStyleIndex + 2;
+ break;
+ }
+ return nRet;
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/uiconfig/ui/floatinglinestyle.ui b/svx/uiconfig/ui/floatinglinestyle.ui
new file mode 100644
index 000000000000..126d8f6aa758
--- /dev/null
+++ b/svx/uiconfig/ui/floatinglinestyle.ui
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sc">
+ <requires lib="gtk+" version="3.18"/>
+ <object class="GtkPopover" id="FloatingLineStyle">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="border_width">4</property>
+ <child>
+ <object class="GtkBox" id="container">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow" id="valuesetwin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="valueset">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/svx/uiconfig/ui/sidebarline.ui b/svx/uiconfig/ui/sidebarline.ui
index 997255fc5e80..5ae3faa288d3 100644
--- a/svx/uiconfig/ui/sidebarline.ui
+++ b/svx/uiconfig/ui/sidebarline.ui
@@ -7,18 +7,6 @@
<property name="step_increment">10</property>
<property name="page_increment">20</property>
</object>
- <object class="GtkListStore" id="liststore5">
- <columns>
- <!-- column-name text -->
- <column type="gchararray"/>
- <!-- column-name id -->
- <column type="gchararray"/>
- <!-- column-name image -->
- <column type="GdkPixbuf"/>
- <!-- column-name surface -->
- <column type="CairoSurface"/>
- </columns>
- </object>
<object class="GtkGrid" id="LinePropertyPanel">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -42,33 +30,13 @@
<property name="can_focus">False</property>
<property name="spacing">3</property>
<child>
- <object class="GtkComboBox" id="linestyle">
- <property name="width_request">105</property>
+ <object class="GtkLabel" id="linelabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes" context="sidebarline|linestyle|tooltip_text">Select the style of the line.</property>
- <property name="valign">center</property>
- <property name="hexpand">True</property>
- <property name="model">liststore5</property>
- <property name="entry_text_column">0</property>
- <property name="id_column">1</property>
- <child>
- <object class="GtkCellRendererText" id="cellrenderertext7"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- <child>
- <object class="GtkCellRendererPixbuf" id="cellrenderertext11"/>
- <attributes>
- <attribute name="surface">3</attribute>
- </attributes>
- </child>
- <child internal-child="accessible">
- <object class="AtkObject" id="linestyle-atkobject">
- <property name="AtkObject::accessible-name" translatable="yes" context="sidebarline|linestyle-atkobject">Style</property>
- </object>
- </child>
+ <property name="label" translatable="yes" context="sidebarline|widthlabel">_Line:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">linestyle</property>
+ <property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
@@ -77,18 +45,17 @@
</packing>
</child>
<child>
- <object class="GtkToolbar" id="arrowheads">
+ <object class="GtkToolbar" id="linestyle">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes" context="sidebarline|arrowheads|tooltip_text">Select the style of the arrowheads.</property>
<property name="toolbar_style">icons</property>
<property name="show_arrow">False</property>
<property name="icon_size">2</property>
<child>
- <object class="GtkMenuToolButton" id=".uno:LineEndStyle">
+ <object class="GtkMenuToolButton" id=".uno:XLineStyle">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes" context="sidebarline|arrowheads|tooltip_text">Select the style of the arrowheads.</property>
+ <property name="tooltip_text" translatable="yes" context="sidebarline|linestyle|tooltip_text">Select the style of the line.</property>
<property name="use_underline">True</property>
</object>
<packing>
@@ -96,10 +63,17 @@
<property name="homogeneous">False</property>
</packing>
</child>
- <child internal-child="accessible">
- <object class="AtkObject" id="arrowheads-atkobject">
- <property name="AtkObject::accessible-name" context="sidebarline|arrowheads-atkobject" translatable="yes">Arrow Styles</property>
+ <child>
+ <object class="GtkMenuToolButton" id=".uno:LineEndStyle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="sidebarline|linestyle|tooltip_text">Select the style of the arrowheads.</property>
+ <property name="use_underline">True</property>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
</child>
</object>
<packing>
@@ -360,4 +334,24 @@
<widget name="color"/>
</widgets>
</object>
+ <object class="GtkSizeGroup">
+ <widgets>
+ <widget name="linelabel"/>
+ <widget name="widthlabel"/>
+ <widget name="colorlabel"/>
+ <widget name="translabel"/>
+ </widgets>
+ </object>
+ <object class="GtkListStore" id="liststore5">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ <!-- column-name image -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name surface -->
+ <column type="CairoSurface"/>
+ </columns>
+ </object>
</interface>
diff --git a/svx/util/svx.component b/svx/util/svx.component
index e54318dea597..81cae7623bd2 100644
--- a/svx/util/svx.component
+++ b/svx/util/svx.component
@@ -100,10 +100,6 @@
constructor="com_sun_star_comp_svx_SmartTagMenuController_get_implementation">
<service name="com.sun.star.frame.PopupMenuController"/>
</implementation>
- <implementation name="com.sun.star.comp.svx.LineEndToolBoxControl"
- constructor="com_sun_star_comp_svx_LineEndToolBoxControl_get_implementation">
- <service name="com.sun.star.frame.ToolbarController"/>
- </implementation>
<implementation name="com.sun.star.comp.svx.LineSpacingToolBoxControl"
constructor="com_sun_star_comp_svx_LineSpacingToolBoxControl_get_implementation">
<service name="com.sun.star.frame.ToolbarController"/>
diff --git a/svx/util/svxcore.component b/svx/util/svxcore.component
index 50fedcc67feb..2c5a103857c4 100644
--- a/svx/util/svxcore.component
+++ b/svx/util/svxcore.component
@@ -62,6 +62,14 @@
constructor="com_sun_star_comp_svx_FontNameToolBoxControl_get_implementation">
<service name="com.sun.star.frame.ToolbarController"/>
</implementation>
+ <implementation name="com.sun.star.comp.svx.LineEndToolBoxControl"
+ constructor="com_sun_star_comp_svx_LineEndToolBoxControl_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.svx.LineStyleToolBoxControl"
+ constructor="com_sun_star_comp_svx_LineStyleToolBoxControl_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
<implementation name="com.sun.star.comp.Svx.GraphicExportHelper"
constructor="com_sun_star_comp_Svx_GraphicExportHelper_get_implementation">
<service name="com.sun.star.document.BinaryStreamResolver"/>
diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx
index 95e3c9eecd39..b62455e83aac 100644
--- a/sw/source/uibase/app/swmodule.cxx
+++ b/sw/source/uibase/app/swmodule.cxx
@@ -284,7 +284,6 @@ void SwDLL::RegisterControls()
svx::FormatPaintBrushToolBoxControl::RegisterControl(SID_FORMATPAINTBRUSH, pMod );
SvxFillToolBoxControl::RegisterControl(SID_ATTR_FILL_STYLE, pMod );
- SvxLineStyleToolBoxControl::RegisterControl(SID_ATTR_LINE_STYLE, pMod );
SvxLineWidthToolBoxControl::RegisterControl(SID_ATTR_LINE_WIDTH, pMod );
SvxStyleToolBoxControl::RegisterControl(SID_STYLE_APPLY, pMod );
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index ce6ff16be044..c4b58aaebc67 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7405,7 +7405,7 @@ private:
gtk_tool_button_set_icon_widget(pItem, pImage);
}
- static void set_item_image(GtkToolButton* pItem, VirtualDevice* pDevice)
+ void set_item_image(GtkToolButton* pItem, VirtualDevice* pDevice)
{
GtkWidget* pImage = nullptr;
@@ -7416,6 +7416,7 @@ private:
}
gtk_tool_button_set_icon_widget(pItem, pImage);
+ gtk_widget_queue_draw(GTK_WIDGET(m_pToolbar));
}
public: