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