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 : #include <vcl/settings.hxx>
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 0 : 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 ( false ),
68 0 : eLastXFS ( XFILL_NONE )
69 : {
70 0 : addStatusListener( OUString( ".uno:FillColor" ));
71 0 : addStatusListener( OUString( ".uno:FillGradient" ));
72 0 : addStatusListener( OUString( ".uno:FillHatch" ));
73 0 : addStatusListener( OUString( ".uno:FillBitmap" ));
74 0 : addStatusListener( OUString( ".uno:ColorTableState" ));
75 0 : addStatusListener( OUString( ".uno:GradientListState" ));
76 0 : addStatusListener( OUString( ".uno:HatchListState" ));
77 0 : addStatusListener( OUString( ".uno:BitmapListState" ));
78 0 : }
79 :
80 :
81 :
82 0 : SvxFillToolBoxControl::~SvxFillToolBoxControl()
83 : {
84 0 : delete pStyleItem;
85 0 : delete pColorItem;
86 0 : delete pGradientItem;
87 0 : delete pHatchItem;
88 0 : delete pBitmapItem;
89 0 : }
90 :
91 :
92 :
93 0 : void SvxFillToolBoxControl::StateChanged(
94 :
95 : sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
96 :
97 : {
98 :
99 0 : if( eState == SFX_ITEM_DISABLED )
100 : {
101 0 : if( nSID == SID_ATTR_FILL_STYLE )
102 : {
103 0 : pFillTypeLB->Disable();
104 0 : pFillTypeLB->SetNoSelection();
105 : }
106 0 : pFillAttrLB->Disable();
107 0 : pFillAttrLB->SetNoSelection();
108 : }
109 : else
110 : {
111 0 : if ( SFX_ITEM_AVAILABLE == eState )
112 : {
113 0 : bool bEnableControls = false;
114 0 : if( nSID == SID_ATTR_FILL_STYLE )
115 : {
116 0 : delete pStyleItem;
117 0 : pStyleItem = (XFillStyleItem*) pState->Clone();
118 0 : pFillTypeLB->Enable();
119 : }
120 0 : else if( pStyleItem )
121 : {
122 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
123 :
124 0 : if( nSID == SID_ATTR_FILL_COLOR )
125 : {
126 0 : delete pColorItem;
127 0 : pColorItem = (XFillColorItem*) pState->Clone();
128 :
129 0 : if( eXFS == XFILL_SOLID )
130 0 : bEnableControls = true;
131 : }
132 0 : else if( nSID == SID_ATTR_FILL_GRADIENT )
133 : {
134 0 : delete pGradientItem;
135 0 : pGradientItem = (XFillGradientItem*) pState->Clone();
136 :
137 0 : if( eXFS == XFILL_GRADIENT )
138 0 : bEnableControls = true;
139 : }
140 0 : else if( nSID == SID_ATTR_FILL_HATCH )
141 : {
142 0 : delete pHatchItem;
143 0 : pHatchItem = (XFillHatchItem*) pState->Clone();
144 :
145 0 : if( eXFS == XFILL_HATCH )
146 0 : bEnableControls = true;
147 : }
148 0 : else if( nSID == SID_ATTR_FILL_BITMAP )
149 : {
150 0 : delete pBitmapItem;
151 0 : pBitmapItem = (XFillBitmapItem*) pState->Clone();
152 :
153 0 : if( eXFS == XFILL_BITMAP )
154 0 : bEnableControls = true;
155 : }
156 : }
157 :
158 0 : if( pStyleItem )
159 : {
160 : // ensure that the correct entry is selected in pFillTypeLB. It
161 : // might have been changed by nSID == SID_ATTR_FILL_STYLE, but
162 : // it might also be in an in-between state when user had started to
163 : // change fillstyle, but not yet changed fillvalue for new style
164 : // and when nSID == SID_ATTR_FILL_COLOR/SID_ATTR_FILL_GRADIENT/
165 : // SID_ATTR_FILL_HATCH/SID_ATTR_FILL_BITMAP value change is triggered
166 0 : eLastXFS = pFillTypeLB->GetSelectEntryPos();
167 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
168 :
169 0 : if(eLastXFS != eXFS)
170 : {
171 0 : bUpdate = true;
172 0 : pFillTypeLB->SelectEntryPos( eXFS );
173 : }
174 :
175 0 : pFillAttrLB->Enable();
176 : }
177 :
178 0 : if( bEnableControls )
179 : {
180 : //pFillTypeLB->Enable();
181 0 : pFillAttrLB->Enable();
182 :
183 0 : bUpdate = true;
184 : }
185 :
186 0 : Update( pState );
187 : }
188 : else
189 : {
190 : // empty or ambiguous status
191 0 : if( nSID == SID_ATTR_FILL_STYLE )
192 : {
193 0 : pFillTypeLB->SetNoSelection();
194 0 : pFillAttrLB->Disable();
195 0 : pFillAttrLB->SetNoSelection();
196 0 : bUpdate = false;
197 : }
198 : else
199 : {
200 0 : XFillStyle eXFS = XFILL_NONE;
201 0 : if( pStyleItem )
202 0 : eXFS = (XFillStyle)pStyleItem->GetValue();
203 0 : if( !pStyleItem ||
204 0 : ( nSID == SID_ATTR_FILL_COLOR && eXFS == XFILL_SOLID ) ||
205 0 : ( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
206 0 : ( nSID == SID_ATTR_FILL_HATCH && eXFS == XFILL_HATCH ) ||
207 0 : ( nSID == SID_ATTR_FILL_BITMAP && eXFS == XFILL_BITMAP ) )
208 : {
209 0 : pFillAttrLB->SetNoSelection();
210 : //bUpdate = sal_False;
211 : }
212 : }
213 : }
214 : }
215 0 : }
216 :
217 :
218 :
219 0 : void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
220 : {
221 0 : if ( pStyleItem && pState && bUpdate )
222 : {
223 0 : bUpdate = false;
224 :
225 0 : XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
226 :
227 : // Check if the fill style was already active
228 : //if( eTmpXFS != eXFS )
229 0 : if( (XFillStyle) eLastXFS != eXFS )
230 0 : pFillControl->SelectFillTypeHdl( NULL );
231 : //eLastXFS = eXFS;
232 :
233 0 : switch( eXFS )
234 : {
235 : case XFILL_NONE:
236 0 : break;
237 :
238 : case XFILL_SOLID:
239 : {
240 0 : if ( pColorItem )
241 : {
242 0 : OUString aString( pColorItem->GetName() );
243 0 : ::Color aColor = pColorItem->GetColorValue();
244 :
245 0 : pFillAttrLB->SelectEntry( aString );
246 :
247 0 : if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
248 0 : pFillAttrLB->GetSelectEntryColor() != aColor )
249 0 : pFillAttrLB->SelectEntry( aColor );
250 :
251 : // Check if the entry is not in the list
252 0 : if( pFillAttrLB->GetSelectEntryPos() ==
253 0 : LISTBOX_ENTRY_NOTFOUND ||
254 0 : pFillAttrLB->GetSelectEntryColor() != aColor )
255 : {
256 0 : sal_Int32 nCount = pFillAttrLB->GetEntryCount();
257 0 : OUString aTmpStr;
258 0 : if( nCount > 0 )
259 : {
260 : // Last entry gets tested against temporary color
261 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
262 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
263 0 : aTmpStr.endsWith(TMP_STR_END) )
264 : {
265 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
266 : }
267 : }
268 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
269 :
270 : //pFillAttrLB->SetUpdateMode( sal_False );
271 0 : sal_Int32 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
272 : //pFillAttrLB->SetUpdateMode( sal_True );
273 0 : pFillAttrLB->SelectEntryPos( nPos );
274 0 : }
275 : }
276 : else
277 0 : pFillAttrLB->SetNoSelection();
278 : }
279 0 : break;
280 :
281 : case XFILL_GRADIENT:
282 : {
283 0 : if ( pGradientItem )
284 : {
285 0 : OUString aString( pGradientItem->GetName() );
286 0 : pFillAttrLB->SelectEntry( aString );
287 : // Check if the entry is not in the list
288 0 : if( pFillAttrLB->GetSelectEntry() != aString )
289 : {
290 0 : sal_Int32 nCount = pFillAttrLB->GetEntryCount();
291 0 : OUString aTmpStr;
292 0 : if( nCount > 0 )
293 : {
294 : // Last entry gets tested against temporary entry
295 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
296 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
297 0 : aTmpStr.endsWith(TMP_STR_END) )
298 : {
299 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
300 : }
301 : }
302 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
303 :
304 0 : XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
305 0 : XGradientList aGradientList( "", ""/*TODO?*/ );
306 0 : aGradientList.Insert( pEntry );
307 0 : aGradientList.SetDirty( false );
308 0 : const Bitmap aBmp = aGradientList.GetUiBitmap( 0 );
309 :
310 0 : if( !aBmp.IsEmpty() )
311 : {
312 0 : pFillAttrLB->InsertEntry(pEntry->GetName(), Image(aBmp));
313 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
314 : //delete pBmp;
315 : }
316 :
317 0 : aGradientList.Remove( 0 );
318 0 : delete pEntry;
319 0 : }
320 : }
321 : else
322 0 : pFillAttrLB->SetNoSelection();
323 : }
324 0 : break;
325 :
326 : case XFILL_HATCH:
327 : {
328 0 : if ( pHatchItem )
329 : {
330 0 : OUString aString( pHatchItem->GetName() );
331 0 : pFillAttrLB->SelectEntry( aString );
332 : // Check if the entry is not in the list
333 0 : if( pFillAttrLB->GetSelectEntry() != aString )
334 : {
335 0 : sal_Int32 nCount = pFillAttrLB->GetEntryCount();
336 0 : OUString aTmpStr;
337 0 : if( nCount > 0 )
338 : {
339 : // Last entry gets tested against temporary entry
340 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
341 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
342 0 : aTmpStr.endsWith(TMP_STR_END) )
343 : {
344 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
345 : }
346 : }
347 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
348 :
349 0 : XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
350 0 : XHatchList aHatchList( "", ""/*TODO?*/ );
351 0 : aHatchList.Insert( pEntry );
352 0 : aHatchList.SetDirty( false );
353 0 : const Bitmap aBmp = aHatchList.GetUiBitmap( 0 );
354 :
355 0 : if( !aBmp.IsEmpty() )
356 : {
357 0 : pFillAttrLB->InsertEntry(pEntry->GetName(), Image(aBmp));
358 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
359 : //delete pBmp;
360 : }
361 :
362 0 : aHatchList.Remove( 0 );
363 0 : delete pEntry;
364 0 : }
365 : }
366 : else
367 0 : pFillAttrLB->SetNoSelection();
368 : }
369 0 : break;
370 :
371 : case XFILL_BITMAP:
372 : {
373 0 : if ( pBitmapItem )
374 : // &&
375 : // SfxObjectShell::Current() &&
376 : // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
377 : {
378 0 : OUString aString( pBitmapItem->GetName() );
379 : // Bitmap aBitmap( pBitmapItem->GetValue() );
380 :
381 : // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
382 : // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
383 0 : pFillAttrLB->SelectEntry( aString );
384 : // Check if the entry is not in the list
385 0 : if( pFillAttrLB->GetSelectEntry() != aString )
386 : {
387 0 : sal_Int32 nCount = pFillAttrLB->GetEntryCount();
388 0 : OUString aTmpStr;
389 0 : if( nCount > 0 )
390 : {
391 : // Last entry gets tested against temporary entry
392 0 : aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
393 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
394 0 : aTmpStr.endsWith(TMP_STR_END) )
395 : {
396 0 : pFillAttrLB->RemoveEntry( nCount - 1 );
397 : }
398 : }
399 0 : aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
400 :
401 0 : XBitmapEntry* pEntry = new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr);
402 : XBitmapListRef xBitmapList =
403 : XPropertyList::CreatePropertyList(XBITMAP_LIST,
404 0 : OUString("TmpList"), ""/*TODO?*/)->AsBitmapList();
405 0 : xBitmapList->Insert( pEntry );
406 0 : xBitmapList->SetDirty( false );
407 0 : pFillAttrLB->Fill( xBitmapList );
408 0 : pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
409 0 : xBitmapList->Remove( 0 );
410 0 : delete pEntry;
411 0 : }
412 : }
413 : else
414 0 : pFillAttrLB->SetNoSelection();
415 : }
416 0 : break;
417 :
418 : default:
419 : OSL_FAIL( "Unsupported fill type" );
420 0 : break;
421 : }
422 : }
423 :
424 0 : if( pState && pStyleItem )
425 : {
426 0 : XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
427 :
428 : // Does the lists have changed?
429 0 : if( pState->ISA( SvxColorListItem ) &&
430 : eXFS == XFILL_SOLID )
431 : {
432 0 : ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
433 0 : pFillAttrLB->Clear();
434 0 : pFillAttrLB->Fill( ( (SvxColorListItem*)pState )->GetColorList() );
435 0 : pFillAttrLB->SelectEntry( aTmpColor );
436 : }
437 0 : if( pState->ISA( SvxGradientListItem ) &&
438 : eXFS == XFILL_GRADIENT )
439 : {
440 0 : OUString aString( pFillAttrLB->GetSelectEntry() );
441 0 : pFillAttrLB->Clear();
442 0 : pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
443 0 : pFillAttrLB->SelectEntry( aString );
444 : }
445 0 : if( pState->ISA( SvxHatchListItem ) &&
446 : eXFS == XFILL_HATCH )
447 : {
448 0 : OUString aString( pFillAttrLB->GetSelectEntry() );
449 0 : pFillAttrLB->Clear();
450 0 : pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
451 0 : pFillAttrLB->SelectEntry( aString );
452 : }
453 0 : if( pState->ISA( SvxBitmapListItem ) &&
454 : eXFS == XFILL_BITMAP )
455 : {
456 0 : OUString aString( pFillAttrLB->GetSelectEntry() );
457 0 : pFillAttrLB->Clear();
458 0 : pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
459 0 : pFillAttrLB->SelectEntry( aString );
460 : }
461 : }
462 0 : }
463 :
464 :
465 :
466 0 : Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
467 : {
468 0 : if ( GetSlotId() == SID_ATTR_FILL_STYLE )
469 : {
470 0 : pFillControl = new FillControl( pParent );
471 : // Thus the FillControl is known by SvxFillToolBoxControl
472 : // (and in order to remain compatible)
473 0 : pFillControl->SetData( this );
474 :
475 0 : pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
476 0 : pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
477 :
478 0 : pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
479 0 : pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
480 :
481 0 : return pFillControl;
482 : }
483 0 : return NULL;
484 : }
485 :
486 : /*************************************************************************
487 : |*
488 : |* FillControl
489 : |*
490 : \************************************************************************/
491 :
492 0 : FillControl::FillControl( Window* pParent, WinBits nStyle ) :
493 : Window( pParent, nStyle | WB_DIALOGCONTROL ),
494 0 : pLbFillType(new SvxFillTypeBox( this )),
495 : aLogicalFillSize(40,80),
496 0 : aLogicalAttrSize(50,80)
497 : {
498 0 : pLbFillAttr = new SvxFillAttrBox( this );
499 0 : Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
500 0 : Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
501 0 : pLbFillType->SetSizePixel(aTypeSize);
502 0 : pLbFillAttr->SetSizePixel(aAttrSize);
503 : //to get the base height
504 0 : aTypeSize = pLbFillType->GetSizePixel();
505 0 : aAttrSize = pLbFillAttr->GetSizePixel();
506 0 : Point aAttrPnt = pLbFillAttr->GetPosPixel();
507 : SetSizePixel(
508 0 : Size( aAttrPnt.X() + aAttrSize.Width(),
509 0 : std::max( aAttrSize.Height(), aTypeSize.Height() ) ) );
510 :
511 0 : pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
512 0 : pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
513 :
514 0 : aDelayTimer.SetTimeout( DELAY_TIMEOUT );
515 0 : aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
516 0 : aDelayTimer.Start();
517 0 : }
518 :
519 :
520 :
521 0 : FillControl::~FillControl()
522 : {
523 0 : delete pLbFillType;
524 0 : delete pLbFillAttr;
525 0 : }
526 :
527 :
528 :
529 0 : IMPL_LINK_NOARG_INLINE_START(FillControl, DelayHdl)
530 : {
531 0 : SelectFillTypeHdl( NULL );
532 0 : ( (SvxFillToolBoxControl*)GetData() )->updateStatus( OUString( ".uno:FillStyle" ));
533 : // ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
534 0 : return 0;
535 : }
536 0 : IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
537 :
538 :
539 :
540 0 : IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
541 : {
542 0 : XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
543 :
544 : // Later, an optimization should be accomplished,
545 : // that the lists or tables can only be deleted and rebuilt
546 : // when the lists, or tables have actually changed (in the LBs of course).
547 :
548 0 : if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
549 : {
550 : // So that we can show a status in the following case:
551 : // One type was selected but no attribute.
552 : // The selection has exactly the same attributes as the previous one.
553 : // SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
554 : // if( pControlerItem )
555 : // pControlerItem->ClearCache();
556 :
557 0 : pLbFillAttr->Clear();
558 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
559 :
560 0 : switch( eXFS )
561 : {
562 : case XFILL_NONE:
563 : {
564 0 : pLbFillType->Selected();
565 0 : SelectFillAttrHdl( pBox );
566 0 : pLbFillAttr->Disable();
567 : }
568 0 : break;
569 :
570 : case XFILL_SOLID:
571 : {
572 0 : if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
573 : {
574 : SvxColorListItem aItem( *(const SvxColorListItem*)(
575 0 : pSh->GetItem( SID_COLOR_TABLE ) ) );
576 0 : pLbFillAttr->Enable();
577 0 : pLbFillAttr->Fill( aItem.GetColorList() );
578 : }
579 : else
580 0 : pLbFillAttr->Disable();
581 : }
582 0 : break;
583 :
584 : case XFILL_GRADIENT:
585 : {
586 0 : if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
587 : {
588 : SvxGradientListItem aItem( *(const SvxGradientListItem*)(
589 0 : pSh->GetItem( SID_GRADIENT_LIST ) ) );
590 0 : pLbFillAttr->Enable();
591 0 : pLbFillAttr->Fill( aItem.GetGradientList() );
592 : }
593 : else
594 0 : pLbFillAttr->Disable();
595 : }
596 0 : break;
597 :
598 : case XFILL_HATCH:
599 : {
600 0 : if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
601 : {
602 : SvxHatchListItem aItem( *(const SvxHatchListItem*)(
603 0 : pSh->GetItem( SID_HATCH_LIST ) ) );
604 0 : pLbFillAttr->Enable();
605 0 : pLbFillAttr->Fill( aItem.GetHatchList() );
606 : }
607 : else
608 0 : pLbFillAttr->Disable();
609 : }
610 0 : break;
611 :
612 : case XFILL_BITMAP:
613 : {
614 0 : if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
615 : {
616 : SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
617 0 : pSh->GetItem( SID_BITMAP_LIST ) ) );
618 0 : pLbFillAttr->Enable();
619 0 : pLbFillAttr->Fill( aItem.GetBitmapList() );
620 : }
621 : else
622 0 : pLbFillAttr->Disable();
623 : }
624 0 : break;
625 : }
626 :
627 0 : if( eXFS != XFILL_NONE ) // Has already been done
628 : {
629 0 : if ( pBox )
630 0 : pLbFillType->Selected();
631 :
632 : // release focus
633 0 : if ( pBox && pLbFillType->IsRelease() )
634 : {
635 0 : SfxViewShell* pViewShell = SfxViewShell::Current();
636 0 : if( pViewShell && pViewShell->GetWindow() )
637 0 : pViewShell->GetWindow()->GrabFocus();
638 : }
639 : }
640 : }
641 0 : return 0;
642 : }
643 :
644 :
645 :
646 0 : IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
647 : {
648 0 : XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
649 0 : XFillStyleItem aXFillStyleItem( eXFS );
650 0 : bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
651 :
652 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
653 0 : if ( bAction )
654 : {
655 0 : Any a;
656 0 : Sequence< PropertyValue > aArgs( 1 );
657 :
658 : // First set the style
659 0 : aArgs[0].Name = "FillStyle";
660 0 : aXFillStyleItem.QueryValue( a );
661 0 : aArgs[0].Value = a;
662 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch(
663 0 : OUString( ".uno:FillStyle" ), aArgs );
664 :
665 0 : switch( eXFS )
666 : {
667 : case XFILL_NONE:
668 : {
669 : }
670 0 : break;
671 :
672 : case XFILL_SOLID:
673 : {
674 : // Entry gets tested against temporary color
675 0 : OUString aTmpStr = pLbFillAttr->GetSelectEntry();
676 0 : if( aTmpStr.startsWith(TMP_STR_BEGIN) && aTmpStr.endsWith(TMP_STR_END) )
677 : {
678 0 : aTmpStr = aTmpStr.copy(1, aTmpStr.getLength()-2);
679 : }
680 :
681 0 : XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
682 :
683 0 : aArgs[0].Name = "FillColor";
684 0 : aXFillColorItem.QueryValue( a );
685 0 : aArgs[0].Value = a;
686 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( ".uno:FillColor",
687 0 : aArgs );
688 : }
689 0 : break;
690 : case XFILL_GRADIENT:
691 : {
692 0 : sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
693 :
694 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
695 : {
696 : SvxGradientListItem aItem(
697 0 : *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
698 :
699 0 : if ( nPos < aItem.GetGradientList()->Count() ) // no temporary entry?
700 : {
701 0 : XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
702 0 : XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
703 :
704 0 : aArgs[0].Name = "FillGradient";
705 0 : aXFillGradientItem.QueryValue( a );
706 0 : aArgs[0].Value = a;
707 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( OUString( ".uno:FillGradient" ),
708 0 : aArgs );
709 0 : }
710 : }
711 : }
712 0 : break;
713 :
714 : case XFILL_HATCH:
715 : {
716 0 : sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
717 :
718 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
719 : {
720 0 : SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
721 :
722 0 : if ( nPos < aItem.GetHatchList()->Count() ) // no temporary entry?
723 : {
724 0 : XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
725 0 : XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
726 :
727 0 : aArgs[0].Name = "FillHatch";
728 0 : aXFillHatchItem.QueryValue( a );
729 0 : aArgs[0].Value = a;
730 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch( OUString( ".uno:FillHatch" ),
731 0 : aArgs );
732 0 : }
733 : }
734 : }
735 0 : break;
736 :
737 : case XFILL_BITMAP:
738 : {
739 0 : sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
740 :
741 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
742 : {
743 : SvxBitmapListItem aItem(
744 0 : *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
745 :
746 0 : if ( nPos < aItem.GetBitmapList()->Count() ) // no temporary entry?
747 : {
748 0 : const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
749 0 : const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
750 :
751 0 : aArgs[0].Name = "FillBitmap";
752 0 : aXFillBitmapItem.QueryValue( a );
753 0 : aArgs[0].Value = a;
754 0 : ((SvxFillToolBoxControl*)GetData())->Dispatch(OUString(".uno:FillBitmap"), aArgs);
755 0 : }
756 : }
757 : }
758 0 : break;
759 : }
760 :
761 : // release focus
762 0 : if ( pLbFillAttr->IsRelease() && pBox )
763 : {
764 0 : SfxViewShell* pViewShell = SfxViewShell::Current();
765 0 : if( pViewShell && pViewShell->GetWindow() )
766 : {
767 0 : pViewShell->GetWindow()->GrabFocus();
768 : }
769 0 : }
770 : }
771 :
772 0 : return 0;
773 : }
774 :
775 :
776 :
777 0 : void FillControl::Resize()
778 : {
779 : // Width of the two list boxes not 1/2 : 1/2, but 2/5 : 3/5
780 0 : long nW = GetOutputSizePixel().Width() / 5;
781 0 : long nH = 180;
782 0 : long nSep = 0; // was previously 4
783 :
784 0 : pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
785 0 : pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
786 0 : }
787 :
788 0 : void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
789 : {
790 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
791 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
792 : {
793 0 : Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
794 0 : Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
795 0 : pLbFillType->SetSizePixel(aTypeSize);
796 0 : pLbFillAttr->SetSizePixel(aAttrSize);
797 : //to get the base height
798 0 : aTypeSize = pLbFillType->GetSizePixel();
799 0 : aAttrSize = pLbFillAttr->GetSizePixel();
800 0 : Point aAttrPnt = pLbFillAttr->GetPosPixel();
801 :
802 : SetSizePixel(
803 0 : Size( aAttrPnt.X() + aAttrSize.Width(),
804 0 : std::max( aAttrSize.Height(), aTypeSize.Height() ) ) );
805 : }
806 0 : Window::DataChanged( rDCEvt );
807 0 : }
808 :
809 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|