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 <rtl/ustring.hxx>
26 :
27 : #include <svx/dialogs.hrc>
28 :
29 : #define DELAY_TIMEOUT 300
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 :
42 : using namespace ::com::sun::star::uno;
43 : using namespace ::com::sun::star::util;
44 : using namespace ::com::sun::star::beans;
45 : using namespace ::com::sun::star::frame;
46 : using namespace ::com::sun::star::lang;
47 :
48 18 : SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
49 :
50 : /*************************************************************************
51 : |*
52 : |* SvxFillToolBoxControl
53 : |*
54 : \************************************************************************/
55 :
56 0 : SvxFillToolBoxControl::SvxFillToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
57 : SfxToolBoxControl( nSlotId, nId, rTbx ),
58 :
59 : pStyleItem ( NULL ),
60 : pColorItem ( NULL ),
61 : pGradientItem ( NULL ),
62 : pHatchItem ( NULL ),
63 : pBitmapItem ( NULL ),
64 : pFillControl ( NULL ),
65 : pFillTypeLB ( NULL ),
66 : pFillAttrLB ( NULL ),
67 : bUpdate ( sal_False ),
68 : bIgnoreStatusUpdate( sal_False ),
69 0 : eLastXFS ( XFILL_NONE )
70 : {
71 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )));
72 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )));
73 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )));
74 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )));
75 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
76 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GradientListState" )));
77 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:HatchListState" )));
78 0 : addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BitmapListState" )));
79 0 : }
80 :
81 : //========================================================================
82 :
83 0 : SvxFillToolBoxControl::~SvxFillToolBoxControl()
84 : {
85 0 : delete pStyleItem;
86 0 : delete pColorItem;
87 0 : delete pGradientItem;
88 0 : delete pHatchItem;
89 0 : delete pBitmapItem;
90 0 : }
91 :
92 : //========================================================================
93 :
94 0 : void SvxFillToolBoxControl::StateChanged(
95 :
96 : sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
97 :
98 : {
99 0 : bool bEnableControls = false;
100 :
101 0 : if ( bIgnoreStatusUpdate )
102 0 : return;
103 :
104 0 : if( eState == SFX_ITEM_DISABLED )
105 : {
106 0 : if( nSID == SID_ATTR_FILL_STYLE )
107 : {
108 0 : pFillTypeLB->Disable();
109 0 : pFillTypeLB->SetNoSelection();
110 : }
111 0 : pFillAttrLB->Disable();
112 0 : pFillAttrLB->SetNoSelection();
113 : }
114 : else
115 : {
116 0 : if ( SFX_ITEM_AVAILABLE == eState )
117 : {
118 0 : if( nSID == SID_ATTR_FILL_STYLE )
119 : {
120 0 : delete pStyleItem;
121 0 : pStyleItem = (XFillStyleItem*) pState->Clone();
122 0 : pFillTypeLB->Enable();
123 :
124 0 : eLastXFS = pFillTypeLB->GetSelectEntryPos();
125 0 : bUpdate = sal_True;
126 :
127 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
128 : pFillTypeLB->SelectEntryPos(
129 0 : sal::static_int_cast< sal_uInt16 >( eXFS ) );
130 0 : pFillAttrLB->Enable();
131 : }
132 0 : else if( pStyleItem )
133 : {
134 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
135 :
136 0 : if( nSID == SID_ATTR_FILL_COLOR )
137 : {
138 0 : delete pColorItem;
139 0 : pColorItem = (XFillColorItem*) pState->Clone();
140 :
141 0 : if( eXFS == XFILL_SOLID )
142 0 : bEnableControls = true;
143 : }
144 0 : else if( nSID == SID_ATTR_FILL_GRADIENT )
145 : {
146 0 : delete pGradientItem;
147 0 : pGradientItem = (XFillGradientItem*) pState->Clone();
148 :
149 0 : if( eXFS == XFILL_GRADIENT )
150 0 : bEnableControls = true;
151 : }
152 0 : else if( nSID == SID_ATTR_FILL_HATCH )
153 : {
154 0 : delete pHatchItem;
155 0 : pHatchItem = (XFillHatchItem*) pState->Clone();
156 :
157 0 : if( eXFS == XFILL_HATCH )
158 0 : bEnableControls = true;
159 : }
160 0 : else if( nSID == SID_ATTR_FILL_BITMAP )
161 : {
162 0 : delete pBitmapItem;
163 0 : pBitmapItem = (XFillBitmapItem*) pState->Clone();
164 :
165 0 : if( eXFS == XFILL_BITMAP )
166 0 : bEnableControls = true;
167 : }
168 : }
169 0 : if( bEnableControls )
170 : {
171 : //pFillTypeLB->Enable();
172 0 : pFillAttrLB->Enable();
173 :
174 0 : bUpdate = sal_True;
175 : }
176 :
177 0 : Update( pState );
178 : }
179 : else
180 : {
181 : // leerer oder uneindeutiger Status
182 0 : if( nSID == SID_ATTR_FILL_STYLE )
183 : {
184 0 : pFillTypeLB->SetNoSelection();
185 0 : pFillAttrLB->Disable();
186 0 : pFillAttrLB->SetNoSelection();
187 0 : bUpdate = sal_False;
188 : }
189 : else
190 : {
191 0 : XFillStyle eXFS = XFILL_NONE;
192 0 : if( pStyleItem )
193 0 : eXFS = (XFillStyle)pStyleItem->GetValue();
194 0 : if( !pStyleItem ||
195 : ( nSID == SID_ATTR_FILL_COLOR && eXFS == XFILL_SOLID ) ||
196 : ( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
197 : ( nSID == SID_ATTR_FILL_HATCH && eXFS == XFILL_HATCH ) ||
198 : ( nSID == SID_ATTR_FILL_BITMAP && eXFS == XFILL_BITMAP ) )
199 : {
200 0 : pFillAttrLB->SetNoSelection();
201 : //bUpdate = sal_False;
202 : }
203 : }
204 : }
205 : }
206 : }
207 :
208 : //========================================================================
209 :
210 0 : void SvxFillToolBoxControl::IgnoreStatusUpdate( sal_Bool bSet )
211 : {
212 0 : bIgnoreStatusUpdate = bSet;
213 0 : }
214 :
215 : //========================================================================
216 :
217 0 : void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
218 : {
219 0 : if ( pStyleItem && pState && bUpdate )
220 : {
221 0 : bUpdate = sal_False;
222 :
223 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
224 :
225 : // Pruefen, ob Fuellstil schon vorher aktiv war
226 : //if( eTmpXFS != eXFS )
227 0 : if( (XFillStyle) eLastXFS != eXFS )
228 0 : pFillControl->SelectFillTypeHdl( NULL );
229 : //eLastXFS = eXFS;
230 :
231 0 : switch( eXFS )
232 : {
233 : case XFILL_NONE:
234 0 : break;
235 :
236 : case XFILL_SOLID:
237 : {
238 0 : if ( pColorItem )
239 : {
240 0 : String aString( pColorItem->GetName() );
241 0 : ::Color aColor = pColorItem->GetColorValue();
242 :
243 0 : pFillAttrLB->SelectEntry( aString );
244 :
245 0 : if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
246 0 : pFillAttrLB->GetSelectEntryColor() != aColor )
247 0 : pFillAttrLB->SelectEntry( aColor );
248 :
249 : // NEU
250 : // Pruefen, ob Eintrag nicht in der Liste ist
251 0 : if( pFillAttrLB->GetSelectEntryPos() ==
252 : LISTBOX_ENTRY_NOTFOUND ||
253 0 : pFillAttrLB->GetSelectEntryColor() != aColor )
254 : {
255 0 : sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
256 0 : String aTmpStr;
257 0 : if( nCount > 0 )
258 : {
259 : //Letzter Eintrag wird auf temporaere Farbe geprueft
260 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
261 0 : if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
262 0 : aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
263 : {
264 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
265 : }
266 : }
267 0 : aTmpStr = TMP_STR_BEGIN;
268 0 : aTmpStr += aString;
269 0 : aTmpStr += TMP_STR_END;
270 :
271 : //pFillAttrLB->SetUpdateMode( sal_False );
272 0 : sal_uInt16 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
273 : //pFillAttrLB->SetUpdateMode( sal_True );
274 0 : pFillAttrLB->SelectEntryPos( nPos );
275 0 : }
276 : // NEU
277 : }
278 : else
279 0 : pFillAttrLB->SetNoSelection();
280 : }
281 0 : break;
282 :
283 : case XFILL_GRADIENT:
284 : {
285 0 : if ( pGradientItem )
286 : {
287 0 : String aString( pGradientItem->GetName() );
288 0 : pFillAttrLB->SelectEntry( aString );
289 : // NEU
290 : // Pruefen, ob Eintrag nicht in der Liste ist
291 0 : if( pFillAttrLB->GetSelectEntry() != aString )
292 : {
293 0 : sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
294 0 : String aTmpStr;
295 0 : if( nCount > 0 )
296 : {
297 : //Letzter Eintrag wird auf temporaeren Eintrag geprueft
298 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
299 0 : if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
300 0 : aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
301 : {
302 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
303 : }
304 : }
305 0 : aTmpStr = TMP_STR_BEGIN;
306 0 : aTmpStr += aString;
307 0 : aTmpStr += TMP_STR_END;
308 :
309 0 : XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
310 0 : String aEmptyString = String();
311 0 : XGradientList aGradientList( aEmptyString );
312 0 : aGradientList.Insert( pEntry );
313 0 : aGradientList.SetDirty( sal_False );
314 0 : Bitmap* pBmp = aGradientList.CreateBitmapForUI( 0 );
315 :
316 0 : if( pBmp )
317 : {
318 0 : ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), *pBmp );
319 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
320 0 : delete pBmp;
321 : }
322 :
323 0 : aGradientList.Remove( 0 );
324 0 : delete pEntry;
325 0 : }
326 : // NEU
327 : }
328 : else
329 0 : pFillAttrLB->SetNoSelection();
330 : }
331 0 : break;
332 :
333 : case XFILL_HATCH:
334 : {
335 0 : if ( pHatchItem )
336 : {
337 0 : String aString( pHatchItem->GetName() );
338 0 : pFillAttrLB->SelectEntry( aString );
339 : // NEU
340 : // Pruefen, ob Eintrag nicht in der Liste ist
341 0 : if( pFillAttrLB->GetSelectEntry() != aString )
342 : {
343 0 : sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
344 0 : String aTmpStr;
345 0 : if( nCount > 0 )
346 : {
347 : //Letzter Eintrag wird auf temporaeren Eintrag geprueft
348 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
349 0 : if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
350 0 : aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
351 : {
352 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
353 : }
354 : }
355 0 : aTmpStr = TMP_STR_BEGIN;
356 0 : aTmpStr += aString;
357 0 : aTmpStr += TMP_STR_END;
358 :
359 0 : XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
360 0 : String aEmptyString = String();
361 0 : XHatchList aHatchList( aEmptyString );
362 0 : aHatchList.Insert( pEntry );
363 0 : aHatchList.SetDirty( sal_False );
364 0 : Bitmap* pBmp = aHatchList.CreateBitmapForUI( 0 );
365 :
366 0 : if( pBmp )
367 : {
368 0 : ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), *pBmp );
369 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
370 0 : delete pBmp;
371 : }
372 :
373 0 : aHatchList.Remove( 0 );
374 0 : delete pEntry;
375 0 : }
376 : // NEU
377 : }
378 : else
379 0 : pFillAttrLB->SetNoSelection();
380 : }
381 0 : break;
382 :
383 : case XFILL_BITMAP:
384 : {
385 0 : if ( pBitmapItem )
386 : // &&
387 : // SfxObjectShell::Current() &&
388 : // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
389 : {
390 0 : String aString( pBitmapItem->GetName() );
391 : // Bitmap aBitmap( pBitmapItem->GetValue() );
392 :
393 : // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
394 : // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
395 0 : pFillAttrLB->SelectEntry( aString );
396 : // NEU
397 : // Pruefen, ob Eintrag nicht in der Liste ist
398 0 : if( pFillAttrLB->GetSelectEntry() != aString )
399 : {
400 0 : sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
401 0 : String aTmpStr;
402 0 : if( nCount > 0 )
403 : {
404 : //Letzter Eintrag wird auf temporaeren Eintrag geprueft
405 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
406 0 : if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
407 0 : aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
408 : {
409 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
410 : }
411 : }
412 0 : aTmpStr = TMP_STR_BEGIN;
413 0 : aTmpStr += aString;
414 0 : aTmpStr += TMP_STR_END;
415 :
416 0 : XBitmapEntry* pEntry = new XBitmapEntry( pBitmapItem->GetBitmapValue(), aTmpStr );
417 : XBitmapListRef xBitmapList =
418 : XPropertyList::CreatePropertyList(XBITMAP_LIST,
419 0 : rtl::OUString("TmpList"))->AsBitmapList();
420 0 : xBitmapList->Insert( pEntry );
421 0 : xBitmapList->SetDirty( sal_False );
422 0 : pFillAttrLB->Fill( xBitmapList );
423 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
424 0 : xBitmapList->Remove( 0 );
425 0 : delete pEntry;
426 0 : }
427 : // NEU
428 : }
429 : else
430 0 : pFillAttrLB->SetNoSelection();
431 : }
432 0 : break;
433 :
434 : default:
435 : OSL_FAIL( "Nicht unterstuetzter Flaechentyp" );
436 0 : break;
437 : }
438 : }
439 :
440 0 : if( pState && pStyleItem )
441 : {
442 0 : XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
443 :
444 : // Die Listen haben sich geaendert ?
445 0 : if( pState->ISA( SvxColorListItem ) &&
446 : eXFS == XFILL_SOLID )
447 : {
448 0 : ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
449 0 : pFillAttrLB->Clear();
450 0 : pFillAttrLB->Fill( ( (SvxColorListItem*)pState )->GetColorList() );
451 0 : pFillAttrLB->SelectEntry( aTmpColor );
452 : }
453 0 : if( pState->ISA( SvxGradientListItem ) &&
454 : eXFS == XFILL_GRADIENT )
455 : {
456 0 : String aString( pFillAttrLB->GetSelectEntry() );
457 0 : pFillAttrLB->Clear();
458 0 : pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
459 0 : pFillAttrLB->SelectEntry( aString );
460 : }
461 0 : if( pState->ISA( SvxHatchListItem ) &&
462 : eXFS == XFILL_HATCH )
463 : {
464 0 : String aString( pFillAttrLB->GetSelectEntry() );
465 0 : pFillAttrLB->Clear();
466 0 : pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
467 0 : pFillAttrLB->SelectEntry( aString );
468 : }
469 0 : if( pState->ISA( SvxBitmapListItem ) &&
470 : eXFS == XFILL_BITMAP )
471 : {
472 0 : String aString( pFillAttrLB->GetSelectEntry() );
473 0 : pFillAttrLB->Clear();
474 0 : pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
475 0 : pFillAttrLB->SelectEntry( aString );
476 : }
477 : }
478 0 : }
479 :
480 : //========================================================================
481 :
482 0 : Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
483 : {
484 0 : if ( GetSlotId() == SID_ATTR_FILL_STYLE )
485 : {
486 0 : pFillControl = new FillControl( pParent );
487 : // Damit dem FillControl das SvxFillToolBoxControl bekannt ist
488 : // (und um kompatibel zu bleiben)
489 0 : pFillControl->SetData( this );
490 :
491 0 : pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
492 0 : pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
493 :
494 0 : pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
495 0 : pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
496 :
497 0 : return pFillControl;
498 : }
499 0 : return NULL;
500 : }
501 :
502 : /*************************************************************************
503 : |*
504 : |* FillControl
505 : |*
506 : \************************************************************************/
507 :
508 0 : FillControl::FillControl( Window* pParent, WinBits nStyle ) :
509 : Window( pParent, nStyle | WB_DIALOGCONTROL ),
510 0 : pLbFillType(new SvxFillTypeBox( this )),
511 : aLogicalFillSize(40,80),
512 0 : aLogicalAttrSize(50,80)
513 : {
514 0 : pLbFillAttr = new SvxFillAttrBox( this );
515 0 : Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
516 0 : Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
517 0 : pLbFillType->SetSizePixel(aTypeSize);
518 0 : pLbFillAttr->SetSizePixel(aAttrSize);
519 : //to get the base height
520 0 : aTypeSize = pLbFillType->GetSizePixel();
521 0 : aAttrSize = pLbFillAttr->GetSizePixel();
522 0 : Point aAttrPnt = pLbFillAttr->GetPosPixel();
523 : SetSizePixel(
524 0 : Size( aAttrPnt.X() + aAttrSize.Width(),
525 0 : Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
526 :
527 0 : pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
528 0 : pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
529 :
530 0 : aDelayTimer.SetTimeout( DELAY_TIMEOUT );
531 0 : aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
532 0 : aDelayTimer.Start();
533 0 : }
534 :
535 : //------------------------------------------------------------------------
536 :
537 0 : FillControl::~FillControl()
538 : {
539 0 : delete pLbFillType;
540 0 : delete pLbFillAttr;
541 0 : }
542 :
543 : //------------------------------------------------------------------------
544 :
545 0 : IMPL_LINK_NOARG_INLINE_START(FillControl, DelayHdl)
546 : {
547 0 : SelectFillTypeHdl( NULL );
548 0 : ( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )));
549 : // ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
550 0 : return 0;
551 : }
552 0 : IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
553 :
554 : //------------------------------------------------------------------------
555 :
556 0 : IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
557 : {
558 0 : XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
559 :
560 : // Spaeter sollte eine Optimierung derart erfolgen, dass die
561 : // Listen, bzw. Tables nur dann geloescht und wieder aufgebaut
562 : // werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert
563 : // haben (in den LBs natuerlich).
564 :
565 0 : if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
566 : {
567 : // Damit wir in folgendem Fall einen Status anzeigen koennen:
568 : // Ein Typ wurde ausgewaehlt aber kein Attribut.
569 : // Die Selektion hat genau die gleichen Attribute wie die vorherige.
570 : // SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
571 : // if( pControlerItem )
572 : // pControlerItem->ClearCache();
573 :
574 0 : pLbFillAttr->Clear();
575 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
576 :
577 0 : switch( eXFS )
578 : {
579 : case XFILL_NONE:
580 : {
581 0 : pLbFillType->Selected();
582 0 : SelectFillAttrHdl( pBox );
583 0 : pLbFillAttr->Disable();
584 : }
585 0 : break;
586 :
587 : case XFILL_SOLID:
588 : {
589 0 : if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
590 : {
591 : SvxColorListItem aItem( *(const SvxColorListItem*)(
592 0 : pSh->GetItem( SID_COLOR_TABLE ) ) );
593 0 : pLbFillAttr->Enable();
594 0 : pLbFillAttr->Fill( aItem.GetColorList() );
595 : }
596 : else
597 0 : pLbFillAttr->Disable();
598 : }
599 0 : break;
600 :
601 : case XFILL_GRADIENT:
602 : {
603 0 : if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
604 : {
605 : SvxGradientListItem aItem( *(const SvxGradientListItem*)(
606 0 : pSh->GetItem( SID_GRADIENT_LIST ) ) );
607 0 : pLbFillAttr->Enable();
608 0 : pLbFillAttr->Fill( aItem.GetGradientList() );
609 : }
610 : else
611 0 : pLbFillAttr->Disable();
612 : }
613 0 : break;
614 :
615 : case XFILL_HATCH:
616 : {
617 0 : if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
618 : {
619 : SvxHatchListItem aItem( *(const SvxHatchListItem*)(
620 0 : pSh->GetItem( SID_HATCH_LIST ) ) );
621 0 : pLbFillAttr->Enable();
622 0 : pLbFillAttr->Fill( aItem.GetHatchList() );
623 : }
624 : else
625 0 : pLbFillAttr->Disable();
626 : }
627 0 : break;
628 :
629 : case XFILL_BITMAP:
630 : {
631 0 : if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
632 : {
633 : SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
634 0 : pSh->GetItem( SID_BITMAP_LIST ) ) );
635 0 : pLbFillAttr->Enable();
636 0 : pLbFillAttr->Fill( aItem.GetBitmapList() );
637 : }
638 : else
639 0 : pLbFillAttr->Disable();
640 : }
641 0 : break;
642 : }
643 :
644 0 : if( eXFS != XFILL_NONE ) // Wurde schon erledigt
645 : {
646 0 : if ( pBox )
647 0 : pLbFillType->Selected();
648 :
649 : // release focus
650 0 : if ( pBox && pLbFillType->IsRelease() )
651 : {
652 0 : SfxViewShell* pViewShell = SfxViewShell::Current();
653 0 : if( pViewShell && pViewShell->GetWindow() )
654 0 : pViewShell->GetWindow()->GrabFocus();
655 : }
656 : }
657 : }
658 0 : return 0;
659 : }
660 :
661 : //------------------------------------------------------------------------
662 :
663 0 : IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
664 : {
665 0 : XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
666 0 : XFillStyleItem aXFillStyleItem( eXFS );
667 0 : sal_Bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
668 :
669 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
670 0 : if ( bAction )
671 : {
672 0 : Any a;
673 0 : Sequence< PropertyValue > aArgs( 1 );
674 :
675 : // First set the style
676 0 : aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ));
677 0 : aXFillStyleItem.QueryValue( a );
678 0 : aArgs[0].Value = a;
679 0 : ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_True );
680 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch(
681 0 : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs );
682 0 : ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_False );
683 :
684 0 : switch( eXFS )
685 : {
686 : case XFILL_NONE:
687 : {
688 : }
689 0 : break;
690 :
691 : case XFILL_SOLID:
692 : {
693 : // NEU
694 : //Eintrag wird auf temporaere Farbe geprueft
695 0 : String aTmpStr = pLbFillAttr->GetSelectEntry();
696 0 : if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
697 : {
698 0 : aTmpStr.Erase( aTmpStr.Len()-1, 1 );
699 0 : aTmpStr.Erase( 0, 1 );
700 : }
701 :
702 0 : XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
703 :
704 0 : aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ));
705 0 : aXFillColorItem.QueryValue( a );
706 0 : aArgs[0].Value = a;
707 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )),
708 0 : aArgs );
709 : }
710 0 : break;
711 : case XFILL_GRADIENT:
712 : {
713 0 : sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
714 :
715 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
716 : {
717 : SvxGradientListItem aItem(
718 0 : *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
719 :
720 0 : if ( nPos < aItem.GetGradientList()->Count() ) // kein temp. Eintrag ?
721 : {
722 0 : XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
723 0 : XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
724 :
725 0 : aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
726 0 : aXFillGradientItem.QueryValue( a );
727 0 : aArgs[0].Value = a;
728 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )),
729 0 : aArgs );
730 0 : }
731 : }
732 : }
733 0 : break;
734 :
735 : case XFILL_HATCH:
736 : {
737 0 : sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
738 :
739 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
740 : {
741 0 : SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
742 :
743 0 : if ( nPos < aItem.GetHatchList()->Count() ) // kein temp. Eintrag ?
744 : {
745 0 : XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
746 0 : XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
747 :
748 0 : aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
749 0 : aXFillHatchItem.QueryValue( a );
750 0 : aArgs[0].Value = a;
751 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )),
752 0 : aArgs );
753 0 : }
754 : }
755 : }
756 0 : break;
757 :
758 : case XFILL_BITMAP:
759 : {
760 0 : sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
761 :
762 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
763 : {
764 : SvxBitmapListItem aItem(
765 0 : *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
766 :
767 0 : if ( nPos < aItem.GetBitmapList()->Count() ) // kein temp. Eintrag ?
768 : {
769 0 : XOBitmap aXOBitmap = aItem.GetBitmapList()->GetBitmap( nPos )->GetXBitmap();
770 0 : XFillBitmapItem aXFillBitmapItem( pLbFillAttr->GetSelectEntry(), aXOBitmap );
771 :
772 0 : aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" ));
773 0 : aXFillBitmapItem.QueryValue( a );
774 0 : aArgs[0].Value = a;
775 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )),
776 0 : aArgs );
777 0 : }
778 : }
779 : }
780 0 : break;
781 : }
782 :
783 : // release focus
784 0 : if ( pLbFillAttr->IsRelease() && pBox )
785 : {
786 0 : SfxViewShell* pViewShell = SfxViewShell::Current();
787 0 : if( pViewShell && pViewShell->GetWindow() )
788 : {
789 0 : pViewShell->GetWindow()->GrabFocus();
790 : }
791 0 : }
792 : }
793 :
794 0 : return 0;
795 : }
796 :
797 : //------------------------------------------------------------------------
798 :
799 0 : void FillControl::Resize()
800 : {
801 : // Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5
802 0 : long nW = GetOutputSizePixel().Width() / 5;
803 0 : long nH = 180;
804 0 : long nSep = 0; // war vorher 4
805 :
806 0 : pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
807 0 : pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
808 0 : }
809 :
810 0 : void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
811 : {
812 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
813 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
814 : {
815 0 : Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
816 0 : Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
817 0 : pLbFillType->SetSizePixel(aTypeSize);
818 0 : pLbFillAttr->SetSizePixel(aAttrSize);
819 : //to get the base height
820 0 : aTypeSize = pLbFillType->GetSizePixel();
821 0 : aAttrSize = pLbFillAttr->GetSizePixel();
822 0 : Point aAttrPnt = pLbFillAttr->GetPosPixel();
823 :
824 : SetSizePixel(
825 0 : Size( aAttrPnt.X() + aAttrSize.Width(),
826 0 : Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
827 : }
828 0 : Window::DataChanged( rDCEvt );
829 57 : }
830 :
831 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|