1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include <svx/sidebar/LinePropertyPanelBase.hxx>
22 #include <com/sun/star/drawing/LineStyle.hpp>
23 #include <sfx2/weldutils.hxx>
24 #include <svx/linectrl.hxx>
25 #include <svx/xlnwtit.hxx>
26 #include <svx/xlntrit.hxx>
27 #include <svx/xlncapit.hxx>
28 #include <svx/xlinjoit.hxx>
29 #include <bitmaps.hlst>
32 using namespace css::uno
;
34 constexpr OStringLiteral SELECTWIDTH
= "SelectWidth";
36 namespace svx::sidebar
{
38 // trigger disabling the arrows if the none line style is selected
39 class LineStyleNoneChange
42 LinePropertyPanelBase
& m_rPanel
;
45 LineStyleNoneChange(LinePropertyPanelBase
& rPanel
)
50 void operator()(bool bLineStyleNone
)
52 m_rPanel
.SetNoneLineStyle(bLineStyleNone
);
58 SvxLineStyleToolBoxControl
* getLineStyleToolBoxControl(const ToolbarUnoDispatcher
& rToolBoxColor
)
60 css::uno::Reference
<css::frame::XToolbarController
> xController
= rToolBoxColor
.GetControllerForCommand(".uno:XLineStyle");
61 SvxLineStyleToolBoxControl
* pToolBoxLineStyleControl
= dynamic_cast<SvxLineStyleToolBoxControl
*>(xController
.get());
62 return pToolBoxLineStyleControl
;
67 LinePropertyPanelBase::LinePropertyPanelBase(
68 weld::Widget
* pParent
,
69 const uno::Reference
<css::frame::XFrame
>& rxFrame
)
70 : PanelLayout(pParent
, "LinePropertyPanel", "svx/ui/sidebarline.ui"),
71 mxTBColor(m_xBuilder
->weld_toolbar("color")),
72 mxColorDispatch(new ToolbarUnoDispatcher(*mxTBColor
, *m_xBuilder
, rxFrame
)),
73 mxLineStyleTB(m_xBuilder
->weld_toolbar("linestyle")),
74 mxLineStyleDispatch(new ToolbarUnoDispatcher(*mxLineStyleTB
, *m_xBuilder
, rxFrame
)),
76 mxFTWidth(m_xBuilder
->weld_label("widthlabel")),
77 mxTBWidth(m_xBuilder
->weld_toolbar("width")),
78 mxFTTransparency(m_xBuilder
->weld_label("translabel")),
79 mxMFTransparent(m_xBuilder
->weld_metric_spin_button("linetransparency", FieldUnit::PERCENT
)),
80 mxFTEdgeStyle(m_xBuilder
->weld_label("cornerlabel")),
81 mxLBEdgeStyle(m_xBuilder
->weld_combo_box("edgestyle")),
82 mxFTCapStyle(m_xBuilder
->weld_label("caplabel")),
83 mxLBCapStyle(m_xBuilder
->weld_combo_box("linecapstyle")),
84 mxGridLineProps(m_xBuilder
->weld_widget("lineproperties")),
85 mxBoxArrowProps(m_xBuilder
->weld_widget("arrowproperties")),
86 mxLineWidthPopup(new LineWidthPopup(mxTBWidth
.get(), *this)),
87 mxLineStyleNoneChange(new LineStyleNoneChange(*this)),
89 meMapUnit(MapUnit::MapMM
),
90 maIMGNone(BMP_NONE_ICON
),
91 mbWidthValuable(true),
92 mbArrowSupported(true),
93 mbNoneLineStyle(false)
98 LinePropertyPanelBase::~LinePropertyPanelBase()
100 mxLineWidthPopup
.reset();
103 mxColorDispatch
.reset();
105 mxFTTransparency
.reset();
106 mxMFTransparent
.reset();
107 mxLineStyleDispatch
.reset();
108 mxLineStyleTB
.reset();
109 mxFTEdgeStyle
.reset();
110 mxLBEdgeStyle
.reset();
111 mxFTCapStyle
.reset();
112 mxLBCapStyle
.reset();
113 mxGridLineProps
.reset();
114 mxBoxArrowProps
.reset();
117 void LinePropertyPanelBase::Initialize()
119 mxTBWidth
->set_item_popover(SELECTWIDTH
, mxLineWidthPopup
->getTopLevel());
121 maIMGWidthIcon
[0] = BMP_WIDTH1_ICON
;
122 maIMGWidthIcon
[1] = BMP_WIDTH2_ICON
;
123 maIMGWidthIcon
[2] = BMP_WIDTH3_ICON
;
124 maIMGWidthIcon
[3] = BMP_WIDTH4_ICON
;
125 maIMGWidthIcon
[4] = BMP_WIDTH5_ICON
;
126 maIMGWidthIcon
[5] = BMP_WIDTH6_ICON
;
127 maIMGWidthIcon
[6] = BMP_WIDTH7_ICON
;
128 maIMGWidthIcon
[7] = BMP_WIDTH8_ICON
;
130 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[0]);
131 mxTBWidth
->connect_clicked(LINK(this, LinePropertyPanelBase
, ToolboxWidthSelectHdl
));
133 mxMFTransparent
->connect_value_changed(LINK(this, LinePropertyPanelBase
, ChangeTransparentHdl
));
135 mxLBEdgeStyle
->connect_changed( LINK( this, LinePropertyPanelBase
, ChangeEdgeStyleHdl
) );
137 mxLBCapStyle
->connect_changed( LINK( this, LinePropertyPanelBase
, ChangeCapStyleHdl
) );
139 SvxLineStyleToolBoxControl
* pLineStyleControl
= getLineStyleToolBoxControl(*mxLineStyleDispatch
);
140 pLineStyleControl
->setLineStyleIsNoneFunction(*mxLineStyleNoneChange
);
143 void LinePropertyPanelBase::updateLineTransparence(bool bDisabled
, bool bSetOrDefault
,
144 const SfxPoolItem
* pState
)
148 mxFTTransparency
->set_sensitive(false);
149 mxMFTransparent
->set_sensitive(false);
153 mxFTTransparency
->set_sensitive(true);
154 mxMFTransparent
->set_sensitive(true);
159 if (const XLineTransparenceItem
* pItem
= dynamic_cast<const XLineTransparenceItem
*>(pState
))
161 mnTrans
= pItem
->GetValue();
162 mxMFTransparent
->set_value(mnTrans
, FieldUnit::PERCENT
);
167 mxMFTransparent
->set_value(0, FieldUnit::PERCENT
);//add
168 mxMFTransparent
->set_text(OUString());
171 void LinePropertyPanelBase::updateLineWidth(bool bDisabled
, bool bSetOrDefault
,
172 const SfxPoolItem
* pState
)
176 mxTBWidth
->set_sensitive(false);
177 mxFTWidth
->set_sensitive(false);
181 mxTBWidth
->set_sensitive(true);
182 mxFTWidth
->set_sensitive(true);
187 if (const XLineWidthItem
* pItem
= dynamic_cast<const XLineWidthItem
*>(pState
))
189 mnWidthCoreValue
= pItem
->GetValue();
190 mbWidthValuable
= true;
196 mbWidthValuable
= false;
200 void LinePropertyPanelBase::updateLineJoint(bool bDisabled
, bool bSetOrDefault
,
201 const SfxPoolItem
* pState
)
205 mxLBEdgeStyle
->set_sensitive(false);
206 mxFTEdgeStyle
->set_sensitive(false);
210 mxLBEdgeStyle
->set_sensitive(true);
211 mxFTEdgeStyle
->set_sensitive(true);
216 if (const XLineJointItem
* pItem
= dynamic_cast<const XLineJointItem
*>(pState
))
218 sal_Int32
nEntryPos(0);
220 switch(pItem
->GetValue())
222 case drawing::LineJoint_ROUND
:
227 case drawing::LineJoint_NONE
:
232 case drawing::LineJoint_MIDDLE
:
233 case drawing::LineJoint_MITER
:
238 case drawing::LineJoint_BEVEL
:
250 mxLBEdgeStyle
->set_active(nEntryPos
- 1);
256 mxLBEdgeStyle
->set_active(-1);
259 void LinePropertyPanelBase::updateLineCap(bool bDisabled
, bool bSetOrDefault
,
260 const SfxPoolItem
* pState
)
264 mxLBCapStyle
->set_sensitive(false);
265 mxFTCapStyle
->set_sensitive(false);
269 mxLBCapStyle
->set_sensitive(true);
270 mxLBCapStyle
->set_sensitive(true);
275 if (const XLineCapItem
* pItem
= dynamic_cast<const XLineCapItem
*>(pState
))
277 sal_Int32
nEntryPos(0);
279 switch(pItem
->GetValue())
281 case drawing::LineCap_BUTT
:
286 case drawing::LineCap_ROUND
:
291 case drawing::LineCap_SQUARE
:
303 mxLBCapStyle
->set_active(nEntryPos
- 1);
309 mxLBCapStyle
->set_active(-1);
312 IMPL_LINK_NOARG(LinePropertyPanelBase
, ChangeEdgeStyleHdl
, weld::ComboBox
&, void)
314 const sal_Int32
nPos(mxLBEdgeStyle
->get_active());
316 if (nPos
== -1 || !mxLBEdgeStyle
->get_value_changed_from_saved())
319 std::unique_ptr
<XLineJointItem
> pItem
;
325 pItem
.reset(new XLineJointItem(drawing::LineJoint_ROUND
));
330 pItem
.reset(new XLineJointItem(drawing::LineJoint_NONE
));
335 pItem
.reset(new XLineJointItem(drawing::LineJoint_MITER
));
340 pItem
.reset(new XLineJointItem(drawing::LineJoint_BEVEL
));
345 setLineJoint(pItem
.get());
348 IMPL_LINK_NOARG(LinePropertyPanelBase
, ChangeCapStyleHdl
, weld::ComboBox
&, void)
350 const sal_Int32
nPos(mxLBCapStyle
->get_active());
352 if (!(nPos
!= -1 && mxLBCapStyle
->get_value_changed_from_saved()))
355 std::unique_ptr
<XLineCapItem
> pItem
;
361 pItem
.reset(new XLineCapItem(drawing::LineCap_BUTT
));
366 pItem
.reset(new XLineCapItem(drawing::LineCap_ROUND
));
371 pItem
.reset(new XLineCapItem(drawing::LineCap_SQUARE
));
376 setLineCap(pItem
.get());
379 IMPL_LINK_NOARG(LinePropertyPanelBase
, ToolboxWidthSelectHdl
, const OString
&, void)
381 mxTBWidth
->set_menu_item_active(SELECTWIDTH
, !mxTBWidth
->get_menu_item_active(SELECTWIDTH
));
384 void LinePropertyPanelBase::EndLineWidthPopup()
386 mxTBWidth
->set_menu_item_active(SELECTWIDTH
, false);
389 IMPL_LINK_NOARG( LinePropertyPanelBase
, ChangeTransparentHdl
, weld::MetricSpinButton
&, void )
391 sal_uInt16 nVal
= static_cast<sal_uInt16
>(mxMFTransparent
->get_value(FieldUnit::PERCENT
));
392 XLineTransparenceItem
aItem( nVal
);
394 setLineTransparency(aItem
);
397 void LinePropertyPanelBase::SetWidthIcon(int n
)
400 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGNone
);
402 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[n
-1]);
405 void LinePropertyPanelBase::SetWidthIcon()
409 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGNone
);
413 tools::Long nVal
= OutputDevice::LogicToLogic(mnWidthCoreValue
* 10, meMapUnit
, MapUnit::MapPoint
);
416 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[0]);
418 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[1]);
420 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[2]);
422 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[3]);
424 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[4]);
426 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[5]);
428 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[6]);
430 mxTBWidth
->set_item_icon_name(SELECTWIDTH
, maIMGWidthIcon
[7]);
434 void LinePropertyPanelBase::SetWidth(tools::Long nWidth
)
436 mnWidthCoreValue
= nWidth
;
437 mbWidthValuable
= true;
438 mxLineWidthPopup
->SetWidthSelect(mnWidthCoreValue
, mbWidthValuable
, meMapUnit
);
441 void LinePropertyPanelBase::ActivateControls()
443 mxGridLineProps
->set_sensitive(!mbNoneLineStyle
);
444 mxBoxArrowProps
->set_sensitive(!mbNoneLineStyle
);
445 mxLineStyleTB
->set_item_sensitive(".uno:LineEndStyle", !mbNoneLineStyle
);
447 mxBoxArrowProps
->set_visible(mbArrowSupported
);
448 mxLineStyleTB
->set_item_visible(".uno:LineEndStyle", mbArrowSupported
);
451 void LinePropertyPanelBase::setMapUnit(MapUnit eMapUnit
)
453 meMapUnit
= eMapUnit
;
454 mxLineWidthPopup
->SetWidthSelect(mnWidthCoreValue
, mbWidthValuable
, meMapUnit
);
457 void LinePropertyPanelBase::disableArrowHead()
459 mbArrowSupported
= false;
463 void LinePropertyPanelBase::enableArrowHead()
465 mbArrowSupported
= true;
469 } // end of namespace svx::sidebar
471 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */