Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 : #include <sfx2/sidebar/ResourceDefinitions.hrc>
20 : #include <sfx2/sidebar/Theme.hxx>
21 : #include <sfx2/sidebar/ControlFactory.hxx>
22 : #include <LinePropertyPanel.hxx>
23 : #include <LinePropertyPanel.hrc>
24 : #include <svx/dialogs.hrc>
25 : #include <svx/dialmgr.hxx>
26 : #include <sfx2/objsh.hxx>
27 : #include <sfx2/bindings.hxx>
28 : #include <sfx2/dispatch.hxx>
29 : #include <svx/xtable.hxx>
30 : #include <svx/xdash.hxx>
31 : #include <svx/drawitem.hxx>
32 : #include <svx/svxitems.hrc>
33 : #include <svtools/valueset.hxx>
34 : #include <unotools/pathoptions.hxx>
35 : #include <unotools/viewoptions.hxx>
36 : #include <comphelper/processfactory.hxx>
37 : #include <i18nlangtag/mslangid.hxx>
38 : #include <svx/xlineit0.hxx>
39 : #include <svx/xlndsit.hxx>
40 : #include <vcl/svapp.hxx>
41 : #include <svx/xlnwtit.hxx>
42 : #include <vcl/lstbox.hxx>
43 : #include <vcl/toolbox.hxx>
44 : #include <svx/xlntrit.hxx>
45 : #include <svx/xlnstit.hxx>
46 : #include <svx/xlnedit.hxx>
47 : #include <svx/xlncapit.hxx>
48 : #include <svx/xlinjoit.hxx>
49 : #include "svx/sidebar/PopupContainer.hxx"
50 : #include "svx/sidebar/PopupControl.hxx"
51 : #include "LineWidthControl.hxx"
52 : #include <boost/bind.hpp>
53 :
54 : using namespace css;
55 : using namespace css::uno;
56 : using sfx2::sidebar::Theme;
57 :
58 : const char UNO_SELECTWIDTH[] = ".uno:SelectWidth";
59 :
60 : namespace
61 : {
62 :
63 1 : void FillLineEndListBox(ListBox& rListBoxStart, ListBox& rListBoxEnd, const XLineEndList& rList)
64 : {
65 1 : const sal_uInt32 nCount(rList.Count());
66 1 : const OUString sNone(SVX_RESSTR(RID_SVXSTR_NONE));
67 :
68 1 : rListBoxStart.SetUpdateMode(false);
69 1 : rListBoxEnd.SetUpdateMode(false);
70 :
71 1 : rListBoxStart.Clear();
72 1 : rListBoxEnd.Clear();
73 :
74 : // add 'none' entries
75 1 : rListBoxStart.InsertEntry(sNone);
76 1 : rListBoxEnd.InsertEntry(sNone);
77 :
78 21 : for(sal_uInt32 i(0); i < nCount; i++)
79 : {
80 20 : XLineEndEntry* pEntry = rList.GetLineEnd(i);
81 20 : const Bitmap aBitmap = const_cast< XLineEndList& >(rList).GetUiBitmap(i);
82 :
83 20 : if(!aBitmap.IsEmpty())
84 : {
85 20 : Bitmap aCopyStart(aBitmap);
86 40 : Bitmap aCopyEnd(aBitmap);
87 :
88 20 : const Size aBmpSize(aCopyStart.GetSizePixel());
89 20 : const Rectangle aCropRectStart(Point(), Size(aBmpSize.Width() / 2, aBmpSize.Height()));
90 20 : const Rectangle aCropRectEnd(Point(aBmpSize.Width() / 2, 0), Size(aBmpSize.Width() / 2, aBmpSize.Height()));
91 :
92 20 : aCopyStart.Crop(aCropRectStart);
93 : rListBoxStart.InsertEntry(
94 20 : pEntry->GetName(),
95 40 : Image(aCopyStart));
96 :
97 20 : aCopyEnd.Crop(aCropRectEnd);
98 : rListBoxEnd.InsertEntry(
99 20 : pEntry->GetName(),
100 60 : Image(aCopyEnd));
101 : }
102 : else
103 : {
104 0 : rListBoxStart.InsertEntry(pEntry->GetName());
105 0 : rListBoxEnd.InsertEntry(pEntry->GetName());
106 : }
107 20 : }
108 :
109 1 : rListBoxStart.SetUpdateMode(true);
110 1 : rListBoxEnd.SetUpdateMode(true);
111 1 : }
112 :
113 1 : void FillLineStyleListBox(ListBox& rListBox, const XDashList& rList)
114 : {
115 1 : const sal_uInt32 nCount(rList.Count());
116 1 : rListBox.SetUpdateMode(false);
117 :
118 1 : rListBox.Clear();
119 :
120 : // entry for 'none'
121 1 : rListBox.InsertEntry(rList.GetStringForUiNoLine());
122 :
123 : // entry for solid line
124 : rListBox.InsertEntry(rList.GetStringForUiSolidLine(),
125 1 : Image( rList.GetBitmapForUISolidLine()));
126 :
127 11 : for(sal_uInt32 i(0); i < nCount; i++)
128 : {
129 10 : XDashEntry* pEntry = rList.GetDash(i);
130 10 : const Bitmap aBitmap = const_cast< XDashList& >(rList).GetUiBitmap(i);
131 :
132 10 : if(!aBitmap.IsEmpty())
133 : {
134 10 : rListBox.InsertEntry(pEntry->GetName(), Image(aBitmap));
135 : }
136 : else
137 : {
138 0 : rListBox.InsertEntry(pEntry->GetName());
139 : }
140 10 : }
141 :
142 1 : rListBox.SetUpdateMode(true);
143 1 : }
144 :
145 : } // end of anonymous namespace
146 :
147 : namespace svx { namespace sidebar {
148 :
149 2 : LinePropertyPanel::LinePropertyPanel(
150 : vcl::Window* pParent,
151 : const uno::Reference<frame::XFrame>& rxFrame,
152 : SfxBindings* pBindings)
153 : : PanelLayout(pParent, "LinePropertyPanel", "svx/ui/sidebarline.ui", rxFrame),
154 : maStyleControl(SID_ATTR_LINE_STYLE, *pBindings, *this),
155 : maDashControl (SID_ATTR_LINE_DASH, *pBindings, *this),
156 : maWidthControl(SID_ATTR_LINE_WIDTH, *pBindings, *this),
157 : maStartControl(SID_ATTR_LINE_START, *pBindings, *this),
158 : maEndControl(SID_ATTR_LINE_END, *pBindings, *this),
159 : maLineEndListControl(SID_LINEEND_LIST, *pBindings, *this),
160 : maLineStyleListControl(SID_DASH_LIST, *pBindings, *this),
161 : maTransControl(SID_ATTR_LINE_TRANSPARENCE, *pBindings, *this),
162 : maEdgeStyle(SID_ATTR_LINE_JOINT, *pBindings, *this),
163 : maCapStyle(SID_ATTR_LINE_CAP, *pBindings, *this),
164 : mpStyleItem(),
165 : mpDashItem(),
166 : mnTrans(0),
167 : meMapUnit(SFX_MAPUNIT_MM),
168 : mnWidthCoreValue(0),
169 : mpStartItem(),
170 : mpEndItem(),
171 : maLineWidthPopup(this, ::boost::bind(&LinePropertyPanel::CreateLineWidthPopupControl, this, _1)),
172 1 : maIMGNone(SVX_RES(IMG_NONE_ICON)),
173 : mpIMGWidthIcon(),
174 : mxFrame(rxFrame),
175 : mpBindings(pBindings),
176 4 : mbWidthValuable(true)
177 : {
178 1 : get(mpFTWidth, "widthlabel");
179 1 : get(mpTBWidth, "width");
180 1 : get(mpFTStyle, "stylelabel");
181 1 : get(mpLBStyle, "linestyle");
182 1 : get(mpFTTransparency, "translabel");
183 1 : get(mpMFTransparent, "linetransparency");
184 1 : get(mpFTArrow, "arrowlabel");
185 1 : get(mpLBStart, "beginarrowstyle");
186 1 : get(mpLBEnd, "endarrowstyle");
187 1 : get(mpFTEdgeStyle, "cornerlabel");
188 1 : get(mpLBEdgeStyle, "edgestyle");
189 1 : get(mpFTCapStyle, "caplabel");
190 1 : get(mpLBCapStyle, "linecapstyle");
191 :
192 1 : Initialize();
193 1 : }
194 :
195 0 : LinePropertyPanel::~LinePropertyPanel()
196 : {
197 0 : disposeOnce();
198 0 : }
199 :
200 1 : void LinePropertyPanel::dispose()
201 : {
202 1 : mpFTWidth.clear();
203 1 : mpTBWidth.clear();
204 1 : mpFTStyle.clear();
205 1 : mpLBStyle.clear();
206 1 : mpFTTransparency.clear();
207 1 : mpMFTransparent.clear();
208 1 : mpFTArrow.clear();
209 1 : mpLBStart.clear();
210 1 : mpLBEnd.clear();
211 1 : mpFTEdgeStyle.clear();
212 1 : mpLBEdgeStyle.clear();
213 1 : mpFTCapStyle.clear();
214 1 : mpLBCapStyle.clear();
215 :
216 1 : maLineWidthPopup.dispose();
217 1 : maStyleControl.dispose();
218 1 : maDashControl.dispose();
219 1 : maWidthControl.dispose();
220 1 : maStartControl.dispose();
221 1 : maEndControl.dispose();
222 1 : maLineEndListControl.dispose();
223 1 : maLineStyleListControl.dispose();
224 1 : maTransControl.dispose();
225 1 : maEdgeStyle.dispose();
226 1 : maCapStyle.dispose();
227 :
228 1 : PanelLayout::dispose();
229 1 : }
230 :
231 1 : void LinePropertyPanel::Initialize()
232 : {
233 1 : mpIMGWidthIcon.reset(new Image[8]);
234 1 : mpIMGWidthIcon[0] = Image(SVX_RES(IMG_WIDTH1_ICON));
235 1 : mpIMGWidthIcon[1] = Image(SVX_RES(IMG_WIDTH2_ICON));
236 1 : mpIMGWidthIcon[2] = Image(SVX_RES(IMG_WIDTH3_ICON));
237 1 : mpIMGWidthIcon[3] = Image(SVX_RES(IMG_WIDTH4_ICON));
238 1 : mpIMGWidthIcon[4] = Image(SVX_RES(IMG_WIDTH5_ICON));
239 1 : mpIMGWidthIcon[5] = Image(SVX_RES(IMG_WIDTH6_ICON));
240 1 : mpIMGWidthIcon[6] = Image(SVX_RES(IMG_WIDTH7_ICON));
241 1 : mpIMGWidthIcon[7] = Image(SVX_RES(IMG_WIDTH8_ICON));
242 :
243 1 : meMapUnit = maWidthControl.GetCoreMetric();
244 :
245 1 : FillLineStyleList();
246 1 : SelectLineStyle();
247 1 : Link<> aLink = LINK( this, LinePropertyPanel, ChangeLineStyleHdl );
248 1 : mpLBStyle->SetSelectHdl( aLink );
249 1 : mpLBStyle->SetAccessibleName(OUString( "Style"));
250 1 : mpLBStyle->AdaptDropDownLineCountToMaximum();
251 :
252 1 : const sal_uInt16 nIdWidth = mpTBWidth->GetItemId(UNO_SELECTWIDTH);
253 1 : mpTBWidth->SetItemImage(nIdWidth, mpIMGWidthIcon[0]);
254 1 : mpTBWidth->SetItemBits( nIdWidth, mpTBWidth->GetItemBits( nIdWidth ) | ToolBoxItemBits::DROPDOWNONLY );
255 1 : Link<ToolBox *, void> aLink2 = LINK(this, LinePropertyPanel, ToolboxWidthSelectHdl);
256 1 : mpTBWidth->SetDropdownClickHdl ( aLink2 );
257 1 : mpTBWidth->SetSelectHdl ( aLink2 );
258 :
259 1 : FillLineEndList();
260 1 : SelectEndStyle(true);
261 1 : SelectEndStyle(false);
262 1 : aLink = LINK( this, LinePropertyPanel, ChangeStartHdl );
263 1 : mpLBStart->SetSelectHdl( aLink );
264 1 : mpLBStart->SetAccessibleName(OUString("Beginning Style")); //wj acc
265 1 : mpLBStart->AdaptDropDownLineCountToMaximum();
266 1 : aLink = LINK( this, LinePropertyPanel, ChangeEndHdl );
267 1 : mpLBEnd->SetSelectHdl( aLink );
268 1 : mpLBEnd->SetAccessibleName(OUString("Ending Style")); //wj acc
269 1 : mpLBEnd->AdaptDropDownLineCountToMaximum();
270 :
271 1 : aLink = LINK(this, LinePropertyPanel, ChangeTransparentHdl);
272 1 : mpMFTransparent->SetModifyHdl(aLink);
273 1 : mpMFTransparent->SetAccessibleName(OUString("Transparency")); //wj acc
274 :
275 1 : mpTBWidth->SetAccessibleRelationLabeledBy(mpFTWidth);
276 1 : mpLBStyle->SetAccessibleRelationLabeledBy(mpFTStyle);
277 1 : mpMFTransparent->SetAccessibleRelationLabeledBy(mpFTTransparency);
278 1 : mpLBStart->SetAccessibleRelationLabeledBy(mpFTArrow);
279 1 : mpLBEnd->SetAccessibleRelationLabeledBy(mpLBEnd);
280 :
281 1 : aLink = LINK( this, LinePropertyPanel, ChangeEdgeStyleHdl );
282 1 : mpLBEdgeStyle->SetSelectHdl( aLink );
283 1 : mpLBEdgeStyle->SetAccessibleName(OUString("Corner Style"));
284 :
285 1 : aLink = LINK( this, LinePropertyPanel, ChangeCapStyleHdl );
286 1 : mpLBCapStyle->SetSelectHdl( aLink );
287 1 : mpLBCapStyle->SetAccessibleName(OUString("Cap Style"));
288 1 : }
289 :
290 0 : void LinePropertyPanel::SetupIcons()
291 : {
292 0 : if(Theme::GetBoolean(Theme::Bool_UseSymphonyIcons))
293 : {
294 : // todo
295 : }
296 : else
297 : {
298 : // todo
299 : }
300 0 : }
301 :
302 2 : VclPtr<vcl::Window> LinePropertyPanel::Create (
303 : vcl::Window* pParent,
304 : const uno::Reference<frame::XFrame>& rxFrame,
305 : SfxBindings* pBindings)
306 : {
307 2 : if (pParent == NULL)
308 0 : throw lang::IllegalArgumentException("no parent Window given to LinePropertyPanel::Create", NULL, 0);
309 2 : if ( ! rxFrame.is())
310 0 : throw lang::IllegalArgumentException("no XFrame given to LinePropertyPanel::Create", NULL, 1);
311 2 : if (pBindings == NULL)
312 0 : throw lang::IllegalArgumentException("no SfxBindings given to LinePropertyPanel::Create", NULL, 2);
313 :
314 2 : return VclPtr<LinePropertyPanel>::Create(pParent, rxFrame, pBindings);
315 : }
316 :
317 0 : void LinePropertyPanel::DataChanged(const DataChangedEvent& /*rEvent*/)
318 : {
319 0 : SetupIcons();
320 0 : }
321 :
322 0 : void LinePropertyPanel::NotifyItemUpdate(
323 : sal_uInt16 nSID,
324 : SfxItemState eState,
325 : const SfxPoolItem* pState,
326 : const bool /*bIsEnabled*/)
327 : {
328 0 : const bool bDisabled(SfxItemState::DISABLED == eState);
329 :
330 0 : switch(nSID)
331 : {
332 : case SID_ATTR_LINE_DASH:
333 : case SID_ATTR_LINE_STYLE:
334 : {
335 0 : if(bDisabled)
336 : {
337 0 : mpFTStyle->Disable();
338 0 : mpLBStyle->Disable();
339 : }
340 : else
341 : {
342 0 : mpFTStyle->Enable();
343 0 : mpLBStyle->Enable();
344 : }
345 :
346 0 : if(eState >= SfxItemState::DEFAULT)
347 : {
348 0 : if(nSID == SID_ATTR_LINE_STYLE)
349 : {
350 0 : const XLineStyleItem* pItem = dynamic_cast< const XLineStyleItem* >(pState);
351 :
352 0 : if(pItem)
353 : {
354 0 : mpStyleItem.reset(pState ? static_cast<XLineStyleItem*>(pItem->Clone()) : 0);
355 : }
356 : }
357 : else // if(nSID == SID_ATTR_LINE_DASH)
358 : {
359 0 : const XLineDashItem* pItem = dynamic_cast< const XLineDashItem* >(pState);
360 :
361 0 : if(pItem)
362 : {
363 0 : mpDashItem.reset(pState ? static_cast<XLineDashItem*>(pItem->Clone()) : 0);
364 : }
365 : }
366 : }
367 : else
368 : {
369 0 : if(nSID == SID_ATTR_LINE_STYLE)
370 : {
371 0 : mpStyleItem.reset(0);
372 : }
373 : else
374 : {
375 0 : mpDashItem.reset(0);
376 : }
377 : }
378 :
379 0 : SelectLineStyle();
380 0 : break;
381 : }
382 : case SID_ATTR_LINE_TRANSPARENCE:
383 : {
384 0 : if(bDisabled)
385 : {
386 0 : mpFTTransparency->Disable();
387 0 : mpMFTransparent->Disable();
388 : }
389 : else
390 : {
391 0 : mpFTTransparency->Enable();
392 0 : mpMFTransparent->Enable();
393 : }
394 :
395 0 : if(eState >= SfxItemState::DEFAULT)
396 : {
397 0 : const XLineTransparenceItem* pItem = dynamic_cast< const XLineTransparenceItem* >(pState);
398 :
399 0 : if(pItem)
400 : {
401 0 : mnTrans = pItem->GetValue();
402 0 : mpMFTransparent->SetValue(mnTrans);
403 0 : break;
404 : }
405 : }
406 :
407 0 : mpMFTransparent->SetValue(0);//add
408 0 : mpMFTransparent->SetText(OUString());
409 0 : break;
410 : }
411 : case SID_ATTR_LINE_WIDTH:
412 : {
413 0 : if(bDisabled)
414 : {
415 0 : mpTBWidth->Disable();
416 0 : mpFTWidth->Disable();
417 : }
418 : else
419 : {
420 0 : mpTBWidth->Enable();
421 0 : mpFTWidth->Enable();
422 : }
423 :
424 0 : if(eState >= SfxItemState::DEFAULT)
425 : {
426 0 : const XLineWidthItem* pItem = dynamic_cast< const XLineWidthItem* >(pState);
427 :
428 0 : if(pItem)
429 : {
430 0 : mnWidthCoreValue = pItem->GetValue();
431 0 : mbWidthValuable = true;
432 0 : SetWidthIcon();
433 0 : break;
434 : }
435 : }
436 :
437 0 : mbWidthValuable = false;
438 0 : SetWidthIcon();
439 0 : break;
440 : }
441 : case SID_ATTR_LINE_START:
442 : {
443 0 : if(bDisabled)
444 : {
445 0 : mpFTArrow->Disable();
446 0 : mpLBStart->Disable();
447 : }
448 : else
449 : {
450 0 : mpFTArrow->Enable();
451 0 : mpLBStart->Enable();
452 : }
453 :
454 0 : if(eState >= SfxItemState::DEFAULT)
455 : {
456 0 : const XLineStartItem* pItem = dynamic_cast< const XLineStartItem* >(pState);
457 :
458 0 : if(pItem)
459 : {
460 0 : mpStartItem.reset(static_cast<XLineStartItem*>(pItem->Clone()));
461 0 : SelectEndStyle(true);
462 0 : break;
463 : }
464 : }
465 :
466 0 : mpStartItem.reset(0);
467 0 : SelectEndStyle(true);
468 0 : break;
469 : }
470 : case SID_ATTR_LINE_END:
471 : {
472 0 : if(bDisabled)
473 : {
474 0 : mpFTArrow->Disable();
475 0 : mpLBEnd->Disable();
476 : }
477 : else
478 : {
479 0 : mpFTArrow->Enable();
480 0 : mpLBEnd->Enable();
481 : }
482 :
483 0 : if(eState >= SfxItemState::DEFAULT)
484 : {
485 0 : const XLineEndItem* pItem = dynamic_cast< const XLineEndItem* >(pState);
486 :
487 0 : if(pItem)
488 : {
489 0 : mpEndItem.reset(static_cast<XLineEndItem*>(pItem->Clone()));
490 0 : SelectEndStyle(false);
491 0 : break;
492 : }
493 : }
494 :
495 0 : mpEndItem.reset(0);
496 0 : SelectEndStyle(false);
497 0 : break;
498 : }
499 : case SID_LINEEND_LIST:
500 : {
501 0 : FillLineEndList();
502 0 : SelectEndStyle(true);
503 0 : SelectEndStyle(false);
504 0 : break;
505 : }
506 : case SID_DASH_LIST:
507 : {
508 0 : FillLineStyleList();
509 0 : SelectLineStyle();
510 0 : break;
511 : }
512 : case SID_ATTR_LINE_JOINT:
513 : {
514 0 : if(bDisabled)
515 : {
516 0 : mpLBEdgeStyle->Disable();
517 0 : mpFTEdgeStyle->Disable();
518 : }
519 : else
520 : {
521 0 : mpLBEdgeStyle->Enable();
522 0 : mpFTEdgeStyle->Enable();
523 : }
524 :
525 0 : if(eState >= SfxItemState::DEFAULT)
526 : {
527 0 : const XLineJointItem* pItem = dynamic_cast< const XLineJointItem* >(pState);
528 :
529 0 : if(pItem)
530 : {
531 0 : sal_Int32 nEntryPos(0);
532 :
533 0 : switch(pItem->GetValue())
534 : {
535 : case drawing::LineJoint_MIDDLE:
536 : case drawing::LineJoint_ROUND:
537 : {
538 0 : nEntryPos = 1;
539 0 : break;
540 : }
541 : case drawing::LineJoint_NONE:
542 : {
543 0 : nEntryPos = 2;
544 0 : break;
545 : }
546 : case drawing::LineJoint_MITER:
547 : {
548 0 : nEntryPos = 3;
549 0 : break;
550 : }
551 : case drawing::LineJoint_BEVEL:
552 : {
553 0 : nEntryPos = 4;
554 0 : break;
555 : }
556 :
557 : default:
558 0 : break;
559 : }
560 :
561 0 : if(nEntryPos)
562 : {
563 0 : mpLBEdgeStyle->SelectEntryPos(nEntryPos - 1);
564 0 : break;
565 : }
566 : }
567 : }
568 :
569 0 : mpLBEdgeStyle->SetNoSelection();
570 0 : break;
571 : }
572 : case SID_ATTR_LINE_CAP:
573 : {
574 0 : if(bDisabled)
575 : {
576 0 : mpLBCapStyle->Disable();
577 0 : mpFTCapStyle->Disable();
578 : }
579 : else
580 : {
581 0 : mpLBCapStyle->Enable();
582 0 : mpLBCapStyle->Enable();
583 : }
584 :
585 0 : if(eState >= SfxItemState::DEFAULT)
586 : {
587 0 : const XLineCapItem* pItem = dynamic_cast< const XLineCapItem* >(pState);
588 :
589 0 : if(pItem)
590 : {
591 0 : sal_Int32 nEntryPos(0);
592 :
593 0 : switch(pItem->GetValue())
594 : {
595 : case drawing::LineCap_BUTT:
596 : {
597 0 : nEntryPos = 1;
598 0 : break;
599 : }
600 : case drawing::LineCap_ROUND:
601 : {
602 0 : nEntryPos = 2;
603 0 : break;
604 : }
605 : case drawing::LineCap_SQUARE:
606 : {
607 0 : nEntryPos = 3;
608 0 : break;
609 : }
610 :
611 : default:
612 0 : break;
613 : }
614 :
615 0 : if(nEntryPos)
616 : {
617 0 : mpLBCapStyle->SelectEntryPos(nEntryPos - 1);
618 0 : break;
619 : }
620 : }
621 : }
622 :
623 0 : mpLBCapStyle->SetNoSelection();
624 0 : break;
625 : }
626 : }
627 0 : }
628 :
629 0 : IMPL_LINK_NOARG(LinePropertyPanel, ChangeLineStyleHdl)
630 : {
631 0 : const sal_Int32 nPos(mpLBStyle->GetSelectEntryPos());
632 :
633 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && mpLBStyle->IsValueChangedFromSaved())
634 : {
635 0 : if(0 == nPos)
636 : {
637 : // drawing::LineStyle_NONE
638 0 : const XLineStyleItem aItem(drawing::LineStyle_NONE);
639 :
640 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SfxCallMode::RECORD, &aItem, 0L);
641 : }
642 0 : else if(1 == nPos)
643 : {
644 : // drawing::LineStyle_SOLID
645 0 : const XLineStyleItem aItem(drawing::LineStyle_SOLID);
646 :
647 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SfxCallMode::RECORD, &aItem, 0L);
648 : }
649 0 : else if (mxLineStyleList.is() && mxLineStyleList->Count() > (long)(nPos - 2))
650 : {
651 : // drawing::LineStyle_DASH
652 0 : const XLineStyleItem aItemA(drawing::LineStyle_DASH);
653 0 : const XDashEntry* pDashEntry = mxLineStyleList->GetDash(nPos - 2);
654 : OSL_ENSURE(pDashEntry, "OOps, got empty XDash from XDashList (!)");
655 : const XLineDashItem aItemB(
656 0 : pDashEntry ? pDashEntry->GetName() : OUString(),
657 0 : pDashEntry ? pDashEntry->GetDash() : XDash());
658 :
659 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SfxCallMode::RECORD, &aItemA, 0L);
660 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_DASH, SfxCallMode::RECORD, &aItemB, 0L);
661 : }
662 : }
663 :
664 0 : return 0;
665 : }
666 :
667 0 : IMPL_LINK_NOARG(LinePropertyPanel, ChangeStartHdl)
668 : {
669 0 : sal_Int32 nPos = mpLBStart->GetSelectEntryPos();
670 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND && mpLBStart->IsValueChangedFromSaved() )
671 : {
672 0 : std::unique_ptr<XLineStartItem> pItem;
673 0 : if( nPos == 0 )
674 0 : pItem.reset(new XLineStartItem());
675 0 : else if( mxLineEndList.is() && mxLineEndList->Count() > (long) ( nPos - 1 ) )
676 0 : pItem.reset(new XLineStartItem( mpLBStart->GetSelectEntry(),mxLineEndList->GetLineEnd( nPos - 1 )->GetLineEnd() ));
677 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINEEND_STYLE, SfxCallMode::RECORD, pItem.get(), 0L);
678 : }
679 0 : return 0;
680 : }
681 :
682 0 : IMPL_LINK_NOARG(LinePropertyPanel, ChangeEndHdl)
683 : {
684 0 : sal_Int32 nPos = mpLBEnd->GetSelectEntryPos();
685 0 : if( nPos != LISTBOX_ENTRY_NOTFOUND && mpLBEnd->IsValueChangedFromSaved() )
686 : {
687 0 : std::unique_ptr<XLineEndItem> pItem;
688 0 : if( nPos == 0 )
689 0 : pItem.reset(new XLineEndItem());
690 0 : else if( mxLineEndList.is() && mxLineEndList->Count() > (long) ( nPos - 1 ) )
691 0 : pItem.reset(new XLineEndItem( mpLBEnd->GetSelectEntry(), mxLineEndList->GetLineEnd( nPos - 1 )->GetLineEnd() ));
692 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINEEND_STYLE, SfxCallMode::RECORD, pItem.get(), 0L);
693 : }
694 0 : return 0;
695 : }
696 :
697 0 : IMPL_LINK_NOARG(LinePropertyPanel, ChangeEdgeStyleHdl)
698 : {
699 0 : const sal_Int32 nPos(mpLBEdgeStyle->GetSelectEntryPos());
700 :
701 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && mpLBEdgeStyle->IsValueChangedFromSaved())
702 : {
703 0 : std::unique_ptr<XLineJointItem> pItem;
704 :
705 0 : switch(nPos)
706 : {
707 : case 0: // rounded
708 : {
709 0 : pItem.reset(new XLineJointItem(drawing::LineJoint_ROUND));
710 0 : break;
711 : }
712 : case 1: // none
713 : {
714 0 : pItem.reset(new XLineJointItem(drawing::LineJoint_NONE));
715 0 : break;
716 : }
717 : case 2: // mitered
718 : {
719 0 : pItem.reset(new XLineJointItem(drawing::LineJoint_MITER));
720 0 : break;
721 : }
722 : case 3: // beveled
723 : {
724 0 : pItem.reset(new XLineJointItem(drawing::LineJoint_BEVEL));
725 0 : break;
726 : }
727 : }
728 :
729 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_JOINT, SfxCallMode::RECORD, pItem.get(), 0L);
730 : }
731 0 : return 0;
732 : }
733 :
734 0 : IMPL_LINK_NOARG(LinePropertyPanel, ChangeCapStyleHdl)
735 : {
736 0 : const sal_Int32 nPos(mpLBCapStyle->GetSelectEntryPos());
737 :
738 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && mpLBCapStyle->IsValueChangedFromSaved())
739 : {
740 0 : std::unique_ptr<XLineCapItem> pItem;
741 :
742 0 : switch(nPos)
743 : {
744 : case 0: // flat
745 : {
746 0 : pItem.reset(new XLineCapItem(drawing::LineCap_BUTT));
747 0 : break;
748 : }
749 : case 1: // round
750 : {
751 0 : pItem.reset(new XLineCapItem(drawing::LineCap_ROUND));
752 0 : break;
753 : }
754 : case 2: // square
755 : {
756 0 : pItem.reset(new XLineCapItem(drawing::LineCap_SQUARE));
757 0 : break;
758 : }
759 : }
760 :
761 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_CAP, SfxCallMode::RECORD, pItem.get(), 0L);
762 : }
763 0 : return 0;
764 : }
765 :
766 0 : IMPL_LINK_TYPED(LinePropertyPanel, ToolboxWidthSelectHdl,ToolBox*, pToolBox, void)
767 : {
768 0 : if (pToolBox->GetItemCommand(pToolBox->GetCurItemId()) == UNO_SELECTWIDTH)
769 : {
770 0 : maLineWidthPopup.SetWidthSelect(mnWidthCoreValue, mbWidthValuable, meMapUnit);
771 0 : maLineWidthPopup.Show(*pToolBox);
772 : }
773 0 : }
774 :
775 0 : IMPL_LINK_NOARG( LinePropertyPanel, ChangeTransparentHdl )
776 : {
777 0 : sal_uInt16 nVal = (sal_uInt16)mpMFTransparent->GetValue();
778 0 : XLineTransparenceItem aItem( nVal );
779 :
780 0 : GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SfxCallMode::RECORD, &aItem, 0L);
781 0 : return 0L;
782 : }
783 :
784 0 : VclPtr<PopupControl> LinePropertyPanel::CreateLineWidthPopupControl (PopupContainer* pParent)
785 : {
786 0 : return VclPtrInstance<LineWidthControl>(pParent, *this);
787 : }
788 :
789 0 : void LinePropertyPanel::EndLineWidthPopupMode()
790 : {
791 0 : maLineWidthPopup.Hide();
792 0 : }
793 :
794 0 : void LinePropertyPanel::SetWidthIcon(int n)
795 : {
796 0 : const sal_uInt16 nIdWidth = mpTBWidth->GetItemId(UNO_SELECTWIDTH);
797 0 : if (n == 0)
798 0 : mpTBWidth->SetItemImage( nIdWidth, maIMGNone);
799 : else
800 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[n-1]);
801 0 : }
802 :
803 0 : void LinePropertyPanel::SetWidthIcon()
804 : {
805 0 : if(!mbWidthValuable)
806 : {
807 0 : const sal_uInt16 nIdWidth = mpTBWidth->GetItemId(UNO_SELECTWIDTH);
808 0 : mpTBWidth->SetItemImage(nIdWidth, maIMGNone);
809 0 : return;
810 : }
811 :
812 0 : long nVal = LogicToLogic(mnWidthCoreValue * 10,(MapUnit)meMapUnit , MAP_POINT);
813 0 : const sal_uInt16 nIdWidth = mpTBWidth->GetItemId(UNO_SELECTWIDTH);
814 :
815 0 : if(nVal <= 6)
816 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[0]);
817 0 : else if(nVal > 6 && nVal <= 9)
818 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[1]);
819 0 : else if(nVal > 9 && nVal <= 12)
820 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[2]);
821 0 : else if(nVal > 12 && nVal <= 19)
822 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[3]);
823 0 : else if(nVal > 19 && nVal <= 26)
824 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[4]);
825 0 : else if(nVal > 26 && nVal <= 37)
826 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[5]);
827 0 : else if(nVal > 37 && nVal <=52)
828 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[6]);
829 0 : else if(nVal > 52)
830 0 : mpTBWidth->SetItemImage( nIdWidth, mpIMGWidthIcon[7]);
831 :
832 : }
833 :
834 0 : void LinePropertyPanel::SetWidth(long nWidth)
835 : {
836 0 : mnWidthCoreValue = nWidth;
837 0 : mbWidthValuable = true;
838 0 : }
839 :
840 1 : void LinePropertyPanel::FillLineEndList()
841 : {
842 1 : SfxObjectShell* pSh = SfxObjectShell::Current();
843 1 : if ( pSh && pSh->GetItem( SID_LINEEND_LIST ) )
844 : {
845 1 : mpLBStart->Enable();
846 1 : SvxLineEndListItem aItem( *static_cast<const SvxLineEndListItem*>(pSh->GetItem( SID_LINEEND_LIST ) ) );
847 1 : mxLineEndList = aItem.GetLineEndList();
848 :
849 1 : if (mxLineEndList.is())
850 : {
851 1 : FillLineEndListBox(*mpLBStart, *mpLBEnd, *mxLineEndList);
852 : }
853 :
854 1 : mpLBStart->SelectEntryPos(0);
855 1 : mpLBEnd->SelectEntryPos(0);
856 : }
857 : else
858 : {
859 0 : mpLBStart->Disable();
860 0 : mpLBEnd->Disable();
861 : }
862 1 : }
863 :
864 1 : void LinePropertyPanel::FillLineStyleList()
865 : {
866 1 : SfxObjectShell* pSh = SfxObjectShell::Current();
867 1 : if ( pSh && pSh->GetItem( SID_DASH_LIST ) )
868 : {
869 1 : mpLBStyle->Enable();
870 1 : SvxDashListItem aItem( *static_cast<const SvxDashListItem*>(pSh->GetItem( SID_DASH_LIST ) ) );
871 1 : mxLineStyleList = aItem.GetDashList();
872 :
873 1 : if (mxLineStyleList.is())
874 : {
875 1 : FillLineStyleListBox(*mpLBStyle, *mxLineStyleList);
876 : }
877 :
878 1 : mpLBStyle->SelectEntryPos(0);
879 : }
880 : else
881 : {
882 0 : mpLBStyle->Disable();
883 : }
884 1 : }
885 :
886 1 : void LinePropertyPanel::SelectLineStyle()
887 : {
888 1 : if( !mpStyleItem.get() || !mpDashItem.get() )
889 : {
890 1 : mpLBStyle->SetNoSelection();
891 1 : mpLBStyle->Disable();
892 2 : return;
893 : }
894 :
895 0 : const drawing::LineStyle eXLS(mpStyleItem ? (drawing::LineStyle)mpStyleItem->GetValue() : drawing::LineStyle_NONE);
896 0 : bool bSelected(false);
897 :
898 0 : switch(eXLS)
899 : {
900 : case drawing::LineStyle_NONE:
901 0 : break;
902 : case drawing::LineStyle_SOLID:
903 0 : mpLBStyle->SelectEntryPos(1);
904 0 : bSelected = true;
905 0 : break;
906 : default:
907 0 : if(mpDashItem && mxLineStyleList.is())
908 : {
909 0 : const XDash& rDash = mpDashItem->GetDashValue();
910 0 : for(sal_Int32 a(0);!bSelected && a < mxLineStyleList->Count(); a++)
911 : {
912 0 : XDashEntry* pEntry = mxLineStyleList->GetDash(a);
913 0 : const XDash& rEntry = pEntry->GetDash();
914 0 : if(rDash == rEntry)
915 : {
916 0 : mpLBStyle->SelectEntryPos(a + 2);
917 0 : bSelected = true;
918 : }
919 : }
920 : }
921 0 : break;
922 : }
923 :
924 0 : if(!bSelected)
925 0 : mpLBStyle->SelectEntryPos( 0 );
926 : }
927 :
928 2 : void LinePropertyPanel::SelectEndStyle(bool bStart)
929 : {
930 2 : bool bSelected(false);
931 :
932 2 : if(bStart)
933 : {
934 1 : if( !mpStartItem.get() )
935 : {
936 1 : mpLBStart->SetNoSelection();
937 1 : mpLBStart->Disable();
938 1 : return;
939 : }
940 :
941 0 : if (mpStartItem && mxLineEndList.is())
942 : {
943 0 : const basegfx::B2DPolyPolygon& rItemPolygon = mpStartItem->GetLineStartValue();
944 0 : for(sal_Int32 a(0);!bSelected && a < mxLineEndList->Count(); a++)
945 : {
946 0 : XLineEndEntry* pEntry = mxLineEndList->GetLineEnd(a);
947 0 : const basegfx::B2DPolyPolygon& rEntryPolygon = pEntry->GetLineEnd();
948 0 : if(rItemPolygon == rEntryPolygon)
949 : {
950 0 : mpLBStart->SelectEntryPos(a + 1);
951 0 : bSelected = true;
952 : }
953 0 : }
954 : }
955 :
956 0 : if(!bSelected)
957 : {
958 0 : mpLBStart->SelectEntryPos( 0 );
959 : }
960 : }
961 : else
962 : {
963 1 : if( !mpEndItem.get() )
964 : {
965 1 : mpLBEnd->SetNoSelection();
966 1 : mpLBEnd->Disable();
967 1 : return;
968 : }
969 :
970 0 : if (mpEndItem && mxLineEndList.is())
971 : {
972 0 : const basegfx::B2DPolyPolygon& rItemPolygon = mpEndItem->GetLineEndValue();
973 0 : for(sal_Int32 a(0);!bSelected && a < mxLineEndList->Count(); a++)
974 : {
975 0 : XLineEndEntry* pEntry = mxLineEndList->GetLineEnd(a);
976 0 : const basegfx::B2DPolyPolygon& rEntryPolygon = pEntry->GetLineEnd();
977 0 : if(rItemPolygon == rEntryPolygon)
978 : {
979 0 : mpLBEnd->SelectEntryPos(a + 1);
980 0 : bSelected = true;
981 : }
982 0 : }
983 : }
984 :
985 0 : if(!bSelected)
986 : {
987 0 : mpLBEnd->SelectEntryPos( 0 );
988 : }
989 : }
990 : }
991 :
992 390 : }} // end of namespace svx::sidebar
993 :
994 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|