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 :
20 : #include <string>
21 : #include <sfx2/app.hxx>
22 : #include <sfx2/dispatch.hxx>
23 : #include <sfx2/objsh.hxx>
24 : #include <sfx2/viewsh.hxx>
25 : #include <sfx2/sidebar/SidebarToolBox.hxx>
26 : #include <rtl/ustring.hxx>
27 : #include <vcl/settings.hxx>
28 : #include <vcl/toolbox.hxx>
29 : #include <svx/dialogs.hrc>
30 :
31 : #define TMP_STR_BEGIN "["
32 : #define TMP_STR_END "]"
33 :
34 : #include "svx/drawitem.hxx"
35 : #include "svx/xattr.hxx"
36 : #include <svx/xtable.hxx>
37 : #include <svx/fillctrl.hxx>
38 : #include <svx/itemwin.hxx>
39 : #include <svx/dialmgr.hxx>
40 : #include "helpid.hrc"
41 : #include <boost/scoped_ptr.hpp>
42 :
43 : using namespace ::com::sun::star;
44 : using namespace ::com::sun::star::uno;
45 : using namespace ::com::sun::star::util;
46 : using namespace ::com::sun::star::beans;
47 : using namespace ::com::sun::star::frame;
48 : using namespace ::com::sun::star::lang;
49 :
50 182 : SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
51 :
52 50 : SvxFillToolBoxControl::SvxFillToolBoxControl(
53 : sal_uInt16 nSlotId,
54 : sal_uInt16 nId,
55 : ToolBox& rTbx )
56 : : SfxToolBoxControl( nSlotId, nId, rTbx )
57 : , mpStyleItem()
58 : , mpColorItem()
59 : , mpFillGradientItem()
60 : , mpHatchItem()
61 : , mpBitmapItem()
62 : , mpFillControl(0)
63 : , mpLbFillType(0)
64 : , mpLbFillAttr(0)
65 : , meLastXFS(static_cast<sal_uInt16>(-1))
66 : , mnLastPosGradient(0)
67 : , mnLastPosHatch(0)
68 50 : , mnLastPosBitmap(0)
69 : {
70 50 : addStatusListener( OUString( ".uno:FillColor" ));
71 50 : addStatusListener( OUString( ".uno:FillGradient" ));
72 50 : addStatusListener( OUString( ".uno:FillHatch" ));
73 50 : addStatusListener( OUString( ".uno:FillBitmap" ));
74 50 : addStatusListener( OUString( ".uno:ColorTableState" ));
75 50 : addStatusListener( OUString( ".uno:GradientListState" ));
76 50 : addStatusListener( OUString( ".uno:HatchListState" ));
77 50 : addStatusListener( OUString( ".uno:BitmapListState" ));
78 50 : }
79 :
80 100 : SvxFillToolBoxControl::~SvxFillToolBoxControl()
81 : {
82 100 : }
83 :
84 709 : void SvxFillToolBoxControl::StateChanged(
85 : sal_uInt16 nSID,
86 : SfxItemState eState,
87 : const SfxPoolItem* pState)
88 : {
89 709 : const bool bDisabled(SfxItemState::DISABLED == eState);
90 :
91 709 : switch(nSID)
92 : {
93 : case SID_ATTR_FILL_STYLE:
94 : {
95 79 : if(bDisabled)
96 : {
97 0 : mpLbFillType->Disable();
98 0 : mpLbFillType->SetNoSelection();
99 0 : mpLbFillAttr->Show();
100 0 : mpLbFillAttr->Disable();
101 0 : mpLbFillAttr->SetNoSelection();
102 0 : mpToolBoxColor->Hide();
103 0 : meLastXFS = static_cast<sal_uInt16>(-1);
104 0 : mpStyleItem.reset();
105 : }
106 :
107 79 : if(eState >= SfxItemState::DEFAULT)
108 : {
109 79 : const XFillStyleItem* pItem = dynamic_cast< const XFillStyleItem* >(pState);
110 :
111 79 : if(pItem)
112 : {
113 79 : mpStyleItem.reset(dynamic_cast< XFillStyleItem* >(pItem->Clone()));
114 79 : mpLbFillType->Enable();
115 79 : drawing::FillStyle eXFS = (drawing::FillStyle)mpStyleItem->GetValue();
116 79 : meLastXFS = eXFS;
117 79 : mpLbFillType->SelectEntryPos(sal::static_int_cast< sal_Int32 >(eXFS));
118 :
119 79 : if(drawing::FillStyle_NONE == eXFS)
120 : {
121 0 : mpLbFillAttr->SetNoSelection();
122 0 : mpLbFillAttr->Disable();
123 : }
124 :
125 79 : Update();
126 79 : break;
127 : }
128 : }
129 :
130 0 : mpLbFillType->SetNoSelection();
131 0 : mpLbFillAttr->Show();
132 0 : mpLbFillAttr->Disable();
133 0 : mpLbFillAttr->SetNoSelection();
134 0 : mpToolBoxColor->Hide();
135 0 : meLastXFS = static_cast<sal_uInt16>(-1);
136 0 : mpStyleItem.reset();
137 0 : break;
138 : }
139 : case SID_ATTR_FILL_COLOR:
140 : {
141 77 : if(SfxItemState::DEFAULT == eState)
142 : {
143 77 : mpColorItem.reset(pState ? static_cast<XFillColorItem*>(pState->Clone()) : 0);
144 : }
145 :
146 77 : if(mpStyleItem && drawing::FillStyle_SOLID == (drawing::FillStyle)mpStyleItem->GetValue())
147 : {
148 77 : mpLbFillAttr->Hide();
149 77 : mpToolBoxColor->Show();
150 :
151 77 : Update();
152 : }
153 77 : break;
154 : }
155 : case SID_ATTR_FILL_GRADIENT:
156 : {
157 79 : if(SfxItemState::DEFAULT == eState)
158 : {
159 79 : mpFillGradientItem.reset(pState ? static_cast<XFillGradientItem*>(pState->Clone()) : 0);
160 : }
161 :
162 79 : if(mpStyleItem && drawing::FillStyle_GRADIENT == (drawing::FillStyle)mpStyleItem->GetValue())
163 : {
164 0 : mpLbFillAttr->Show();
165 0 : mpToolBoxColor->Hide();
166 :
167 0 : if(SfxItemState::DEFAULT == eState)
168 : {
169 0 : mpLbFillAttr->Enable();
170 0 : Update();
171 : }
172 0 : else if(SfxItemState::DISABLED == eState )
173 : {
174 0 : mpLbFillAttr->Disable();
175 0 : mpLbFillAttr->SetNoSelection();
176 : }
177 : else
178 : {
179 0 : mpLbFillAttr->SetNoSelection();
180 : }
181 : }
182 79 : break;
183 : }
184 : case SID_ATTR_FILL_HATCH:
185 : {
186 79 : if(SfxItemState::DEFAULT == eState)
187 : {
188 79 : mpHatchItem.reset(pState ? static_cast<XFillHatchItem*>(pState->Clone()) : 0);
189 : }
190 :
191 79 : if(mpStyleItem && drawing::FillStyle_HATCH == (drawing::FillStyle)mpStyleItem->GetValue())
192 : {
193 0 : mpLbFillAttr->Show();
194 0 : mpToolBoxColor->Hide();
195 :
196 0 : if(SfxItemState::DEFAULT == eState)
197 : {
198 0 : mpLbFillAttr->Enable();
199 0 : Update();
200 : }
201 0 : else if(SfxItemState::DISABLED == eState )
202 : {
203 0 : mpLbFillAttr->Disable();
204 0 : mpLbFillAttr->SetNoSelection();
205 : }
206 : else
207 : {
208 0 : mpLbFillAttr->SetNoSelection();
209 : }
210 : }
211 79 : break;
212 : }
213 : case SID_ATTR_FILL_BITMAP:
214 : {
215 79 : if(SfxItemState::DEFAULT == eState)
216 : {
217 79 : mpBitmapItem.reset(pState ? static_cast<XFillBitmapItem*>(pState->Clone()) : 0);
218 : }
219 :
220 79 : if(mpStyleItem && drawing::FillStyle_BITMAP == (drawing::FillStyle)mpStyleItem->GetValue())
221 : {
222 0 : mpLbFillAttr->Show();
223 0 : mpToolBoxColor->Hide();
224 :
225 0 : if(SfxItemState::DEFAULT == eState)
226 : {
227 0 : mpLbFillAttr->Enable();
228 0 : Update();
229 : }
230 0 : else if(SfxItemState::DISABLED == eState )
231 : {
232 0 : mpLbFillAttr->Disable();
233 0 : mpLbFillAttr->SetNoSelection();
234 : }
235 : else
236 : {
237 0 : mpLbFillAttr->SetNoSelection();
238 : }
239 : }
240 79 : break;
241 : }
242 : case SID_GRADIENT_LIST:
243 : {
244 79 : if(SfxItemState::DEFAULT == eState)
245 : {
246 0 : if(mpStyleItem && drawing::FillStyle_GRADIENT == (drawing::FillStyle)mpStyleItem->GetValue())
247 : {
248 0 : if(mpFillGradientItem)
249 : {
250 0 : const OUString aString( mpFillGradientItem->GetName() );
251 0 : const SfxObjectShell* pSh = SfxObjectShell::Current();
252 0 : const SvxGradientListItem aItem( *static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
253 :
254 0 : mpLbFillAttr->Clear();
255 0 : mpLbFillAttr->Enable();
256 0 : mpLbFillAttr->Fill(aItem.GetGradientList());
257 0 : mpLbFillAttr->SelectEntry(aString);
258 : }
259 : else
260 : {
261 0 : mpLbFillAttr->SetNoSelection();
262 : }
263 : }
264 : }
265 79 : break;
266 : }
267 : case SID_HATCH_LIST:
268 : {
269 79 : if(SfxItemState::DEFAULT == eState)
270 : {
271 0 : if(mpStyleItem && drawing::FillStyle_HATCH == (drawing::FillStyle)mpStyleItem->GetValue())
272 : {
273 0 : if(mpHatchItem)
274 : {
275 0 : const OUString aString( mpHatchItem->GetName() );
276 0 : const SfxObjectShell* pSh = SfxObjectShell::Current();
277 0 : const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
278 :
279 0 : mpLbFillAttr->Clear();
280 0 : mpLbFillAttr->Enable();
281 0 : mpLbFillAttr->Fill(aItem.GetHatchList());
282 0 : mpLbFillAttr->SelectEntry(aString);
283 : }
284 : else
285 : {
286 0 : mpLbFillAttr->SetNoSelection();
287 : }
288 : }
289 : }
290 79 : break;
291 : }
292 : case SID_BITMAP_LIST:
293 : {
294 79 : if(SfxItemState::DEFAULT == eState)
295 : {
296 0 : if(mpStyleItem && drawing::FillStyle_BITMAP == (drawing::FillStyle)mpStyleItem->GetValue())
297 : {
298 0 : if(mpBitmapItem)
299 : {
300 0 : const OUString aString( mpBitmapItem->GetName() );
301 0 : const SfxObjectShell* pSh = SfxObjectShell::Current();
302 0 : const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
303 :
304 0 : mpLbFillAttr->Clear();
305 0 : mpLbFillAttr->Enable();
306 0 : mpLbFillAttr->Fill(aItem.GetBitmapList());
307 0 : mpLbFillAttr->SelectEntry(aString);
308 : }
309 : else
310 : {
311 0 : mpLbFillAttr->SetNoSelection();
312 : }
313 : }
314 : }
315 79 : break;
316 : }
317 : }
318 709 : }
319 :
320 156 : void SvxFillToolBoxControl::Update()
321 : {
322 156 : if(mpStyleItem)
323 : {
324 156 : const drawing::FillStyle eXFS = (drawing::FillStyle)mpStyleItem->GetValue();
325 156 : SfxObjectShell* pSh = SfxObjectShell::Current();
326 :
327 156 : switch( eXFS )
328 : {
329 : case drawing::FillStyle_NONE:
330 : {
331 0 : mpLbFillAttr->Show();
332 0 : mpToolBoxColor->Hide();
333 0 : break;
334 : }
335 : case drawing::FillStyle_SOLID:
336 : {
337 156 : if(mpColorItem)
338 : {
339 107 : mpLbFillAttr->Hide();
340 107 : mpToolBoxColor->Show();
341 : }
342 156 : break;
343 : }
344 : case drawing::FillStyle_GRADIENT:
345 : {
346 0 : mpLbFillAttr->Show();
347 0 : mpToolBoxColor->Hide();
348 :
349 0 : if(pSh && pSh->GetItem(SID_GRADIENT_LIST))
350 : {
351 0 : const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
352 0 : mpLbFillAttr->Enable();
353 0 : mpLbFillAttr->Clear();
354 0 : mpLbFillAttr->Fill(aItem.GetGradientList());
355 :
356 0 : if(mpFillGradientItem)
357 : {
358 0 : const OUString aString(mpFillGradientItem->GetName());
359 :
360 0 : mpLbFillAttr->SelectEntry(aString);
361 :
362 : // Check if the entry is not in the list
363 0 : if (mpLbFillAttr->GetSelectEntry() != aString)
364 : {
365 0 : sal_Int32 nCount = mpLbFillAttr->GetEntryCount();
366 0 : OUString aTmpStr;
367 0 : if( nCount > 0 )
368 : {
369 : // Last entry gets tested against temporary entry
370 0 : aTmpStr = mpLbFillAttr->GetEntry( nCount - 1 );
371 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
372 0 : aTmpStr.endsWith(TMP_STR_END) )
373 : {
374 0 : mpLbFillAttr->RemoveEntry(nCount - 1);
375 : }
376 : }
377 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
378 :
379 0 : boost::scoped_ptr<XGradientEntry> pEntry(new XGradientEntry(mpFillGradientItem->GetGradientValue(), aTmpStr));
380 0 : XGradientList aGradientList( "", ""/*TODO?*/ );
381 0 : aGradientList.Insert( pEntry.get() );
382 0 : aGradientList.SetDirty( false );
383 0 : const Bitmap aBmp = aGradientList.GetUiBitmap( 0 );
384 :
385 0 : if(!aBmp.IsEmpty())
386 : {
387 0 : mpLbFillAttr->InsertEntry(pEntry->GetName(), Image(aBmp));
388 0 : mpLbFillAttr->SelectEntryPos(mpLbFillAttr->GetEntryCount() - 1);
389 : }
390 :
391 0 : aGradientList.Remove( 0 );
392 0 : }
393 :
394 : }
395 : else
396 : {
397 0 : mpLbFillAttr->SetNoSelection();
398 0 : }
399 : }
400 : else
401 : {
402 0 : mpLbFillAttr->SetNoSelection();
403 : }
404 0 : break;
405 : }
406 : case drawing::FillStyle_HATCH:
407 : {
408 0 : mpLbFillAttr->Show();
409 0 : mpToolBoxColor->Hide();
410 :
411 0 : if(pSh && pSh->GetItem(SID_HATCH_LIST))
412 : {
413 0 : const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
414 0 : mpLbFillAttr->Enable();
415 0 : mpLbFillAttr->Clear();
416 0 : mpLbFillAttr->Fill(aItem.GetHatchList());
417 :
418 0 : if(mpHatchItem)
419 : {
420 0 : const OUString aString(mpHatchItem->GetName());
421 :
422 0 : mpLbFillAttr->SelectEntry( aString );
423 :
424 : // Check if the entry is not in the list
425 0 : if( mpLbFillAttr->GetSelectEntry() != aString )
426 : {
427 0 : sal_uInt16 nCount = mpLbFillAttr->GetEntryCount();
428 0 : OUString aTmpStr;
429 0 : if( nCount > 0 )
430 : {
431 : // Last entry gets tested against temporary entry
432 0 : aTmpStr = mpLbFillAttr->GetEntry( nCount - 1 );
433 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
434 0 : aTmpStr.endsWith(TMP_STR_END) )
435 : {
436 0 : mpLbFillAttr->RemoveEntry( nCount - 1 );
437 : }
438 : }
439 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
440 :
441 0 : XHatchEntry* pEntry = new XHatchEntry(mpHatchItem->GetHatchValue(), aTmpStr);
442 0 : XHatchList aHatchList( "", ""/*TODO?*/ );
443 0 : aHatchList.Insert( pEntry );
444 0 : aHatchList.SetDirty( false );
445 0 : const Bitmap aBmp = aHatchList.GetUiBitmap( 0 );
446 :
447 0 : if( !aBmp.IsEmpty() )
448 : {
449 0 : mpLbFillAttr->InsertEntry(pEntry->GetName(), Image(aBmp));
450 0 : mpLbFillAttr->SelectEntryPos( mpLbFillAttr->GetEntryCount() - 1 );
451 : //delete pBmp;
452 : }
453 :
454 0 : aHatchList.Remove( 0 );
455 0 : delete pEntry;
456 0 : }
457 : }
458 : else
459 : {
460 0 : mpLbFillAttr->SetNoSelection();
461 0 : }
462 : }
463 : else
464 : {
465 0 : mpLbFillAttr->SetNoSelection();
466 : }
467 0 : break;
468 : }
469 : case drawing::FillStyle_BITMAP:
470 : {
471 0 : mpLbFillAttr->Show();
472 0 : mpToolBoxColor->Hide();
473 :
474 0 : if(pSh && pSh->GetItem(SID_BITMAP_LIST))
475 : {
476 0 : const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
477 0 : mpLbFillAttr->Enable();
478 0 : mpLbFillAttr->Clear();
479 0 : mpLbFillAttr->Fill(aItem.GetBitmapList());
480 :
481 0 : if(mpBitmapItem)
482 : {
483 0 : const OUString aString(mpBitmapItem->GetName());
484 :
485 0 : mpLbFillAttr->SelectEntry(aString);
486 :
487 : // Check if the entry is not in the list
488 0 : if (mpLbFillAttr->GetSelectEntry() != aString)
489 : {
490 0 : sal_Int32 nCount = mpLbFillAttr->GetEntryCount();
491 0 : OUString aTmpStr;
492 0 : if( nCount > 0 )
493 : {
494 : // Last entry gets tested against temporary entry
495 0 : aTmpStr = mpLbFillAttr->GetEntry(nCount - 1);
496 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
497 0 : aTmpStr.endsWith(TMP_STR_END) )
498 : {
499 0 : mpLbFillAttr->RemoveEntry(nCount - 1);
500 : }
501 : }
502 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
503 :
504 0 : boost::scoped_ptr<XBitmapEntry> pEntry(new XBitmapEntry(mpBitmapItem->GetGraphicObject(), aTmpStr));
505 : XBitmapListRef xBitmapList =
506 : XPropertyList::AsBitmapList(
507 : XPropertyList::CreatePropertyList(
508 0 : XBITMAP_LIST, "TmpList", ""/*TODO?*/));
509 0 : xBitmapList->Insert( pEntry.get() );
510 0 : xBitmapList->SetDirty( false );
511 0 : mpLbFillAttr->Fill( xBitmapList );
512 0 : mpLbFillAttr->SelectEntryPos(mpLbFillAttr->GetEntryCount() - 1);
513 0 : xBitmapList->Remove( 0 );
514 0 : }
515 :
516 : }
517 : else
518 : {
519 0 : mpLbFillAttr->SetNoSelection();
520 0 : }
521 : }
522 : else
523 : {
524 0 : mpLbFillAttr->SetNoSelection();
525 : }
526 0 : break;
527 : }
528 : default:
529 : OSL_ENSURE(false, "Non supported FillType (!)");
530 0 : break;
531 : }
532 : }
533 :
534 156 : }
535 :
536 50 : VclPtr<vcl::Window> SvxFillToolBoxControl::CreateItemWindow(vcl::Window *pParent)
537 : {
538 50 : if(GetSlotId() == SID_ATTR_FILL_STYLE)
539 : {
540 50 : mpFillControl.reset(VclPtr<FillControl>::Create(pParent));
541 : // Thus the FillControl is known by SvxFillToolBoxControl
542 : // (and in order to remain compatible)
543 50 : mpFillControl->SetData(this);
544 :
545 50 : mpLbFillType = mpFillControl->mpLbFillType;
546 50 : mpLbFillAttr = mpFillControl->mpLbFillAttr;
547 50 : mpToolBoxColor = mpFillControl->mpToolBoxColor;
548 50 : mpFillControl->Resize();
549 50 : mpToolBoxColor->InsertItem(".uno:FillColor", m_xFrame, ToolBoxItemBits::DROPDOWNONLY, Size(mpToolBoxColor->GetSizePixel().Width(), 0));
550 :
551 50 : mpLbFillAttr->SetUniqueId(HID_FILL_ATTR_LISTBOX);
552 50 : mpToolBoxColor->SetUniqueId(HID_FILL_ATTR_LISTBOX);
553 50 : mpLbFillType->SetUniqueId(HID_FILL_TYPE_LISTBOX);
554 :
555 50 : mpLbFillType->SetSelectHdl(LINK(this,SvxFillToolBoxControl,SelectFillTypeHdl));
556 50 : mpLbFillAttr->SetSelectHdl(LINK(this,SvxFillToolBoxControl,SelectFillAttrHdl));
557 :
558 50 : return mpFillControl.get();
559 : }
560 0 : return VclPtr<vcl::Window>();
561 : }
562 :
563 50 : FillControl::FillControl(vcl::Window* pParent,WinBits nStyle)
564 : : Window(pParent,nStyle | WB_DIALOGCONTROL)
565 : , mpLbFillType(VclPtr<SvxFillTypeBox>::Create(this))
566 : , mpToolBoxColor(VclPtr<sfx2::sidebar::SidebarToolBox>::Create(this))
567 50 : , mpLbFillAttr(VclPtr<SvxFillAttrBox>::Create(this))
568 : {
569 50 : SetOptimalSize();
570 50 : }
571 :
572 150 : FillControl::~FillControl()
573 : {
574 50 : disposeOnce();
575 100 : }
576 :
577 50 : void FillControl::dispose()
578 : {
579 50 : mpLbFillType.disposeAndClear();
580 50 : mpToolBoxColor.disposeAndClear();
581 50 : mpLbFillAttr.disposeAndClear();
582 50 : vcl::Window::dispose();
583 50 : }
584 :
585 0 : IMPL_LINK(SvxFillToolBoxControl, SelectFillTypeHdl, ListBox *, pToolBox)
586 : {
587 0 : const drawing::FillStyle eXFS = (drawing::FillStyle)mpLbFillType->GetSelectEntryPos();
588 :
589 0 : if((drawing::FillStyle)meLastXFS != eXFS)
590 : {
591 0 : mpLbFillAttr->Clear();
592 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
593 0 : const XFillStyleItem aXFillStyleItem(eXFS);
594 :
595 : // #i122676# Do no longer trigger two Execute calls, one for SID_ATTR_FILL_STYLE
596 : // and one for setting the fill attribute itself, but add two SfxPoolItems to the
597 : // call to get just one action at the SdrObject and to create only one Undo action, too.
598 : // Checked that this works in all apps.
599 0 : switch( eXFS )
600 : {
601 : default:
602 : case drawing::FillStyle_NONE:
603 : {
604 0 : mpLbFillAttr->Show();
605 0 : mpToolBoxColor->Hide();
606 0 : mpLbFillType->Selected();
607 0 : mpLbFillAttr->Disable();
608 :
609 : // #i122676# need to call a single SID_ATTR_FILL_STYLE change
610 : SfxViewFrame::Current()->GetDispatcher()->Execute(
611 0 : SID_ATTR_FILL_STYLE, SfxCallMode::RECORD, &aXFillStyleItem, 0L);
612 0 : break;
613 : }
614 : case drawing::FillStyle_SOLID:
615 : {
616 0 : mpLbFillAttr->Hide();
617 0 : mpToolBoxColor->Show();
618 0 : const OUString aTmpStr;
619 0 : const ::Color aColor = mpColorItem->GetColorValue();
620 0 : const XFillColorItem aXFillColorItem( aTmpStr, aColor );
621 :
622 : // #i122676# change FillStyle and Color in one call
623 : SfxViewFrame::Current()->GetDispatcher()->Execute(
624 0 : SID_ATTR_FILL_COLOR, SfxCallMode::RECORD, &aXFillColorItem, &aXFillStyleItem, 0L);
625 0 : break;
626 : }
627 : case drawing::FillStyle_GRADIENT:
628 : {
629 0 : mpLbFillAttr->Show();
630 0 : mpToolBoxColor->Hide();
631 :
632 0 : if(pSh && pSh->GetItem(SID_GRADIENT_LIST))
633 : {
634 0 : if(!mpLbFillAttr->GetEntryCount())
635 : {
636 0 : const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
637 0 : mpLbFillAttr->Enable();
638 0 : mpLbFillAttr->Clear();
639 0 : mpLbFillAttr->Fill(aItem.GetGradientList());
640 : }
641 :
642 0 : mpLbFillAttr->AdaptDropDownLineCountToMaximum();
643 :
644 0 : if(LISTBOX_ENTRY_NOTFOUND != mnLastPosGradient)
645 : {
646 0 : const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
647 :
648 0 : if(mnLastPosGradient < aItem.GetGradientList()->Count())
649 : {
650 0 : const XGradient aGradient = aItem.GetGradientList()->GetGradient(mnLastPosGradient)->GetGradient();
651 0 : const XFillGradientItem aXFillGradientItem(mpLbFillAttr->GetEntry(mnLastPosGradient), aGradient);
652 :
653 : // #i122676# change FillStyle and Gradient in one call
654 : SfxViewFrame::Current()->GetDispatcher()->Execute(
655 0 : SID_ATTR_FILL_GRADIENT, SfxCallMode::RECORD, &aXFillGradientItem, &aXFillStyleItem, 0L);
656 0 : mpLbFillAttr->SelectEntryPos(mnLastPosGradient);
657 0 : }
658 : }
659 : }
660 : else
661 : {
662 0 : mpLbFillAttr->Disable();
663 : }
664 0 : break;
665 : }
666 : case drawing::FillStyle_HATCH:
667 : {
668 0 : mpLbFillAttr->Show();
669 0 : mpToolBoxColor->Hide();
670 :
671 0 : if(pSh && pSh->GetItem(SID_HATCH_LIST))
672 : {
673 0 : if(!mpLbFillAttr->GetEntryCount())
674 : {
675 0 : const SvxHatchListItem aItem( *static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
676 0 : mpLbFillAttr->Enable();
677 0 : mpLbFillAttr->Clear();
678 0 : mpLbFillAttr->Fill(aItem.GetHatchList());
679 : }
680 :
681 0 : mpLbFillAttr->AdaptDropDownLineCountToMaximum();
682 :
683 0 : if(LISTBOX_ENTRY_NOTFOUND != mnLastPosHatch)
684 : {
685 0 : const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
686 :
687 0 : if(mnLastPosHatch < aItem.GetHatchList()->Count())
688 : {
689 0 : const XHatch aHatch = aItem.GetHatchList()->GetHatch(mnLastPosHatch)->GetHatch();
690 0 : const XFillHatchItem aXFillHatchItem(mpLbFillAttr->GetSelectEntry(), aHatch);
691 :
692 : // #i122676# change FillStyle and Hatch in one call
693 : SfxViewFrame::Current()->GetDispatcher()->Execute(
694 0 : SID_ATTR_FILL_HATCH, SfxCallMode::RECORD, &aXFillHatchItem, &aXFillStyleItem, 0L);
695 0 : mpLbFillAttr->SelectEntryPos(mnLastPosHatch);
696 0 : }
697 : }
698 : }
699 : else
700 : {
701 0 : mpLbFillAttr->Disable();
702 : }
703 0 : break;
704 : }
705 : case drawing::FillStyle_BITMAP:
706 : {
707 0 : mpLbFillAttr->Show();
708 0 : mpToolBoxColor->Hide();
709 :
710 0 : if(pSh && pSh->GetItem(SID_BITMAP_LIST))
711 : {
712 0 : if(!mpLbFillAttr->GetEntryCount())
713 : {
714 0 : const SvxBitmapListItem aItem( *static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
715 0 : mpLbFillAttr->Enable();
716 0 : mpLbFillAttr->Clear();
717 0 : mpLbFillAttr->Fill(aItem.GetBitmapList());
718 : }
719 :
720 0 : mpLbFillAttr->AdaptDropDownLineCountToMaximum();
721 :
722 0 : if(LISTBOX_ENTRY_NOTFOUND != mnLastPosBitmap)
723 : {
724 0 : const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
725 :
726 0 : if(mnLastPosBitmap < aItem.GetBitmapList()->Count())
727 : {
728 0 : const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(mnLastPosBitmap);
729 0 : const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
730 :
731 : // #i122676# change FillStyle and Bitmap in one call
732 : SfxViewFrame::Current()->GetDispatcher()->Execute(
733 0 : SID_ATTR_FILL_BITMAP, SfxCallMode::RECORD, &aXFillBitmapItem, &aXFillStyleItem, 0L);
734 0 : mpLbFillAttr->SelectEntryPos(mnLastPosBitmap);
735 0 : }
736 : }
737 : }
738 : else
739 : {
740 0 : mpLbFillAttr->Disable();
741 : }
742 0 : break;
743 : }
744 : }
745 :
746 0 : meLastXFS = (sal_uInt16)eXFS;
747 :
748 0 : if(drawing::FillStyle_NONE != eXFS)
749 : {
750 0 : if(pToolBox)
751 : {
752 0 : mpLbFillType->Selected();
753 : }
754 0 : }
755 : }
756 :
757 0 : return 0;
758 : }
759 :
760 0 : IMPL_LINK(SvxFillToolBoxControl, SelectFillAttrHdl, ListBox *, pToolBox)
761 : {
762 0 : const drawing::FillStyle eXFS = (drawing::FillStyle)mpLbFillType->GetSelectEntryPos();
763 0 : const XFillStyleItem aXFillStyleItem(eXFS);
764 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
765 :
766 0 : if(pToolBox)
767 : {
768 : // #i122676# dependent from bFillStyleChange, do execute a single or two
769 : // changes in one Execute call
770 0 : const bool bFillStyleChange((drawing::FillStyle) meLastXFS != eXFS);
771 :
772 0 : switch(eXFS)
773 : {
774 : case drawing::FillStyle_SOLID:
775 : {
776 0 : if(bFillStyleChange)
777 : {
778 : // #i122676# Single FillStyle change call needed here
779 0 : SfxViewFrame::Current()->GetDispatcher()->Execute(SID_ATTR_FILL_STYLE, SfxCallMode::RECORD, &aXFillStyleItem, 0L);
780 : }
781 0 : break;
782 : }
783 : case drawing::FillStyle_GRADIENT:
784 : {
785 0 : sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
786 :
787 0 : if(LISTBOX_ENTRY_NOTFOUND == nPos)
788 : {
789 0 : nPos = mnLastPosGradient;
790 : }
791 :
792 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_GRADIENT_LIST))
793 : {
794 0 : const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
795 :
796 0 : if(nPos < aItem.GetGradientList()->Count())
797 : {
798 0 : const XGradient aGradient = aItem.GetGradientList()->GetGradient(nPos)->GetGradient();
799 0 : const XFillGradientItem aXFillGradientItem(mpLbFillAttr->GetSelectEntry(), aGradient);
800 :
801 : // #i122676# Change FillStale and Gradinet in one call
802 : SfxViewFrame::Current()->GetDispatcher()->Execute(
803 : SID_ATTR_FILL_GRADIENT, SfxCallMode::RECORD, &aXFillGradientItem,
804 0 : bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
805 0 : }
806 : }
807 :
808 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
809 : {
810 0 : mnLastPosGradient = nPos;
811 : }
812 0 : break;
813 : }
814 : case drawing::FillStyle_HATCH:
815 : {
816 0 : sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
817 :
818 0 : if(LISTBOX_ENTRY_NOTFOUND == nPos)
819 : {
820 0 : nPos = mnLastPosHatch;
821 : }
822 :
823 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_HATCH_LIST))
824 : {
825 0 : const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
826 :
827 0 : if(nPos < aItem.GetHatchList()->Count())
828 : {
829 0 : const XHatch aHatch = aItem.GetHatchList()->GetHatch(nPos)->GetHatch();
830 0 : const XFillHatchItem aXFillHatchItem( mpLbFillAttr->GetSelectEntry(), aHatch);
831 :
832 : // #i122676# Change FillStale and Hatch in one call
833 : SfxViewFrame::Current()->GetDispatcher()->Execute(
834 : SID_ATTR_FILL_HATCH, SfxCallMode::RECORD, &aXFillHatchItem,
835 0 : bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
836 0 : }
837 : }
838 :
839 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
840 : {
841 0 : mnLastPosHatch = nPos;
842 : }
843 0 : break;
844 : }
845 : case drawing::FillStyle_BITMAP:
846 : {
847 0 : sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
848 :
849 0 : if(LISTBOX_ENTRY_NOTFOUND == nPos)
850 : {
851 0 : nPos = mnLastPosBitmap;
852 : }
853 :
854 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_BITMAP_LIST))
855 : {
856 0 : const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
857 :
858 0 : if(nPos < aItem.GetBitmapList()->Count())
859 : {
860 0 : const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
861 0 : const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
862 :
863 : // #i122676# Change FillStale and Bitmap in one call
864 : SfxViewFrame::Current()->GetDispatcher()->Execute(
865 : SID_ATTR_FILL_BITMAP, SfxCallMode::RECORD, &aXFillBitmapItem,
866 0 : bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
867 0 : }
868 : }
869 :
870 0 : if(LISTBOX_ENTRY_NOTFOUND != nPos)
871 : {
872 0 : mnLastPosBitmap = nPos;
873 : }
874 0 : break;
875 : }
876 0 : default: break;
877 : }
878 : }
879 :
880 0 : return 0;
881 : }
882 :
883 50 : void FillControl::Resize()
884 : {
885 : // Relative width of the two list boxes is 2/5 : 3/5
886 50 : Size aSize(GetOutputSizePixel());
887 50 : long nW = aSize.Width() / 5;
888 50 : long nH = aSize.Height();
889 :
890 50 : long nPrefHeight = mpLbFillType->get_preferred_size().Height();
891 50 : long nOffset = (nH - nPrefHeight)/2;
892 50 : mpLbFillType->SetPosSizePixel(Point(0, nOffset), Size(nW * 2, nPrefHeight));
893 50 : nPrefHeight = mpToolBoxColor->get_preferred_size().Height();
894 50 : nOffset = (nH - nPrefHeight)/2;
895 50 : mpToolBoxColor->SetPosSizePixel(Point(nW * 2, nOffset),Size(nW * 3, nPrefHeight));
896 50 : nPrefHeight = mpLbFillType->get_preferred_size().Height();
897 50 : nOffset = (nH - nPrefHeight)/2;
898 50 : mpLbFillAttr->SetPosSizePixel(Point(nW * 2, nOffset),Size(nW * 3, nPrefHeight));
899 50 : }
900 :
901 50 : void FillControl::SetOptimalSize()
902 : {
903 50 : const Size aLogicalAttrSize(50,0);
904 50 : Size aSize(LogicToPixel(aLogicalAttrSize,MAP_APPFONT));
905 :
906 50 : Point aAttrPnt = mpLbFillAttr->GetPosPixel();
907 :
908 50 : aSize.Height() = std::max(aSize.Height(), mpLbFillType->get_preferred_size().Height());
909 50 : aSize.Height() = std::max(aSize.Height(), mpToolBoxColor->get_preferred_size().Height());
910 50 : aSize.Height() = std::max(aSize.Height(), mpLbFillAttr->get_preferred_size().Height());
911 :
912 50 : aSize.Width() = aAttrPnt.X() + aSize.Width();
913 :
914 50 : SetSizePixel(aSize);
915 50 : }
916 :
917 0 : void FillControl::DataChanged(const DataChangedEvent& rDCEvt)
918 : {
919 0 : if((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
920 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))
921 : {
922 0 : SetOptimalSize();
923 : }
924 0 : Window::DataChanged(rDCEvt);
925 390 : }
926 :
927 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|