bump product version to 7.2.5.1
[LibreOffice.git] / svx / source / sidebar / line / LinePropertyPanelBase.cxx
bloba15762c3586fb434ffb5220b5b80d907d9f441e0
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 .
20 #include <memory>
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>
31 using namespace css;
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
41 private:
42 LinePropertyPanelBase& m_rPanel;
44 public:
45 LineStyleNoneChange(LinePropertyPanelBase& rPanel)
46 : m_rPanel(rPanel)
50 void operator()(bool bLineStyleNone)
52 m_rPanel.SetNoneLineStyle(bLineStyleNone);
56 namespace
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)),
75 mnWidthCoreValue(0),
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)),
88 mnTrans(0),
89 meMapUnit(MapUnit::MapMM),
90 maIMGNone(BMP_NONE_ICON),
91 mbWidthValuable(true),
92 mbArrowSupported(true),
93 mbNoneLineStyle(false)
95 Initialize();
98 LinePropertyPanelBase::~LinePropertyPanelBase()
100 mxLineWidthPopup.reset();
101 mxFTWidth.reset();
102 mxTBWidth.reset();
103 mxColorDispatch.reset();
104 mxTBColor.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)
146 if(bDisabled)
148 mxFTTransparency->set_sensitive(false);
149 mxMFTransparent->set_sensitive(false);
151 else
153 mxFTTransparency->set_sensitive(true);
154 mxMFTransparent->set_sensitive(true);
157 if(bSetOrDefault)
159 if (const XLineTransparenceItem* pItem = dynamic_cast<const XLineTransparenceItem*>(pState))
161 mnTrans = pItem->GetValue();
162 mxMFTransparent->set_value(mnTrans, FieldUnit::PERCENT);
163 return;
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)
174 if(bDisabled)
176 mxTBWidth->set_sensitive(false);
177 mxFTWidth->set_sensitive(false);
179 else
181 mxTBWidth->set_sensitive(true);
182 mxFTWidth->set_sensitive(true);
185 if(bSetOrDefault)
187 if (const XLineWidthItem* pItem = dynamic_cast<const XLineWidthItem*>(pState))
189 mnWidthCoreValue = pItem->GetValue();
190 mbWidthValuable = true;
191 SetWidthIcon();
192 return;
196 mbWidthValuable = false;
197 SetWidthIcon();
200 void LinePropertyPanelBase::updateLineJoint(bool bDisabled, bool bSetOrDefault,
201 const SfxPoolItem* pState)
203 if(bDisabled)
205 mxLBEdgeStyle->set_sensitive(false);
206 mxFTEdgeStyle->set_sensitive(false);
208 else
210 mxLBEdgeStyle->set_sensitive(true);
211 mxFTEdgeStyle->set_sensitive(true);
214 if(bSetOrDefault)
216 if (const XLineJointItem* pItem = dynamic_cast<const XLineJointItem*>(pState))
218 sal_Int32 nEntryPos(0);
220 switch(pItem->GetValue())
222 case drawing::LineJoint_ROUND:
224 nEntryPos = 1;
225 break;
227 case drawing::LineJoint_NONE:
229 nEntryPos = 2;
230 break;
232 case drawing::LineJoint_MIDDLE:
233 case drawing::LineJoint_MITER:
235 nEntryPos = 3;
236 break;
238 case drawing::LineJoint_BEVEL:
240 nEntryPos = 4;
241 break;
244 default:
245 break;
248 if(nEntryPos)
250 mxLBEdgeStyle->set_active(nEntryPos - 1);
251 return;
256 mxLBEdgeStyle->set_active(-1);
259 void LinePropertyPanelBase::updateLineCap(bool bDisabled, bool bSetOrDefault,
260 const SfxPoolItem* pState)
262 if(bDisabled)
264 mxLBCapStyle->set_sensitive(false);
265 mxFTCapStyle->set_sensitive(false);
267 else
269 mxLBCapStyle->set_sensitive(true);
270 mxLBCapStyle->set_sensitive(true);
273 if(bSetOrDefault)
275 if (const XLineCapItem* pItem = dynamic_cast<const XLineCapItem*>(pState))
277 sal_Int32 nEntryPos(0);
279 switch(pItem->GetValue())
281 case drawing::LineCap_BUTT:
283 nEntryPos = 1;
284 break;
286 case drawing::LineCap_ROUND:
288 nEntryPos = 2;
289 break;
291 case drawing::LineCap_SQUARE:
293 nEntryPos = 3;
294 break;
297 default:
298 break;
301 if(nEntryPos)
303 mxLBCapStyle->set_active(nEntryPos - 1);
304 return;
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())
317 return;
319 std::unique_ptr<XLineJointItem> pItem;
321 switch(nPos)
323 case 0: // rounded
325 pItem.reset(new XLineJointItem(drawing::LineJoint_ROUND));
326 break;
328 case 1: // none
330 pItem.reset(new XLineJointItem(drawing::LineJoint_NONE));
331 break;
333 case 2: // mitered
335 pItem.reset(new XLineJointItem(drawing::LineJoint_MITER));
336 break;
338 case 3: // beveled
340 pItem.reset(new XLineJointItem(drawing::LineJoint_BEVEL));
341 break;
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()))
353 return;
355 std::unique_ptr<XLineCapItem> pItem;
357 switch(nPos)
359 case 0: // flat
361 pItem.reset(new XLineCapItem(drawing::LineCap_BUTT));
362 break;
364 case 1: // round
366 pItem.reset(new XLineCapItem(drawing::LineCap_ROUND));
367 break;
369 case 2: // square
371 pItem.reset(new XLineCapItem(drawing::LineCap_SQUARE));
372 break;
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)
399 if (n == 0)
400 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGNone);
401 else
402 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[n-1]);
405 void LinePropertyPanelBase::SetWidthIcon()
407 if(!mbWidthValuable)
409 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGNone);
410 return;
413 tools::Long nVal = OutputDevice::LogicToLogic(mnWidthCoreValue * 10, meMapUnit, MapUnit::MapPoint);
415 if(nVal <= 6)
416 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[0]);
417 else if (nVal <= 9)
418 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[1]);
419 else if (nVal <= 12)
420 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[2]);
421 else if (nVal <= 19)
422 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[3]);
423 else if (nVal <= 26)
424 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[4]);
425 else if (nVal <= 37)
426 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[5]);
427 else if (nVal <= 52)
428 mxTBWidth->set_item_icon_name(SELECTWIDTH, maIMGWidthIcon[6]);
429 else
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;
460 ActivateControls();
463 void LinePropertyPanelBase::enableArrowHead()
465 mbArrowSupported = true;
466 ActivateControls();
469 } // end of namespace svx::sidebar
471 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */