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