1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26
27 // include ---------------------------------------------------------------
28
29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
30
31 #ifndef _TOOLBOX_HXX //autogen
32 #include <vcl/toolbox.hxx>
33 #endif
34 #include <sfx2/app.hxx>
35 #include <sfx2/dispatch.hxx>
36 #include <sfx2/objsh.hxx>
37
38 #include <svx/dialogs.hrc>
39 #include "helpid.hrc"
40
41 #include "svx/drawitem.hxx"
42 #include "svx/xattr.hxx"
43 #include <svx/xtable.hxx>
44 #include "svx/linectrl.hxx"
45 #include <svx/itemwin.hxx>
46 #include <svx/dialmgr.hxx>
47
48 using namespace ::com::sun::star::uno;
49 using namespace ::com::sun::star::beans;
50 using namespace ::com::sun::star::util;
51 using namespace ::com::sun::star::frame;
52 using namespace ::com::sun::star::lang;
53
54 // Fuer Linienenden-Controller
55 #define MAX_LINES 12
56
57 // STATIC DATA -----------------------------------------------------------
58
59 #define RESIZE_VALUE_POPUP(value_set) \
60 { \
61 Size aSize = GetOutputSizePixel(); \
62 aSize.Width() -= 4; \
63 aSize.Height() -= 4; \
64 (value_set).SetPosSizePixel( Point(2,2), aSize ); \
65 }
66
67 #define CALCSIZE_VALUE_POPUP(value_set,item_size) \
68 { \
69 Size aSize = (value_set).CalcWindowSizePixel( (item_size) ); \
70 aSize.Width() += 4; \
71 aSize.Height() += 4; \
72 SetOutputSizePixel( aSize ); \
73 }
74
75
76 SFX_IMPL_TOOLBOX_CONTROL( SvxLineStyleToolBoxControl, XLineStyleItem );
77 SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
78 SFX_IMPL_TOOLBOX_CONTROL( SvxLineColorToolBoxControl, XLineColorItem );
79 SFX_IMPL_TOOLBOX_CONTROL( SvxLineEndToolBoxControl, SfxBoolItem );
80
81 /*************************************************************************
82 |*
83 |* SvxLineStyleToolBoxControl
84 |*
85 \************************************************************************/
86
SvxLineStyleToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)87 SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( sal_uInt16 nSlotId,
88 sal_uInt16 nId,
89 ToolBox& rTbx ) :
90 SfxToolBoxControl( nSlotId, nId, rTbx ),
91 pStyleItem ( NULL ),
92 pDashItem ( NULL ),
93 bUpdate ( sal_False )
94 {
95 addStatusListener( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineDash" )));
96 addStatusListener( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DashListState" )));
97 }
98
99 //========================================================================
100
~SvxLineStyleToolBoxControl()101 SvxLineStyleToolBoxControl::~SvxLineStyleToolBoxControl()
102 {
103 delete pStyleItem;
104 delete pDashItem;
105 }
106
107 //========================================================================
108
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)109 void SvxLineStyleToolBoxControl::StateChanged (
110
111 sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
112
113 {
114 SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
115 DBG_ASSERT( pBox, "Window not found!" );
116
117 if( eState == SFX_ITEM_DISABLED )
118 {
119 pBox->Disable();
120 pBox->SetNoSelection();
121 }
122 else
123 {
124 pBox->Enable();
125
126 if ( eState == SFX_ITEM_AVAILABLE )
127 {
128 if( nSID == SID_ATTR_LINE_STYLE )
129 {
130 delete pStyleItem;
131 pStyleItem = (XLineStyleItem*)pState->Clone();
132 }
133 else if( nSID == SID_ATTR_LINE_DASH )
134 {
135 delete pDashItem;
136 pDashItem = (XLineDashItem*)pState->Clone();
137 }
138
139 bUpdate = sal_True;
140 Update( pState );
141 }
142 else if ( nSID != SID_DASH_LIST )
143 {
144 // kein oder uneindeutiger Status
145 pBox->SetNoSelection();
146 }
147 }
148 }
149
150 //========================================================================
151
Update(const SfxPoolItem * pState)152 void SvxLineStyleToolBoxControl::Update( const SfxPoolItem* pState )
153 {
154 if ( pState && bUpdate )
155 {
156 bUpdate = sal_False;
157
158 SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
159 DBG_ASSERT( pBox, "Window not found!" );
160
161 // Da der Timer unerwartet zuschlagen kann, kann es vorkommen, dass
162 // die LB noch nicht gefuellt ist. Ein ClearCache() am Control im
163 // DelayHdl() blieb ohne Erfolg.
164 if( pBox->GetEntryCount() == 0 )
165 pBox->FillControl();
166
167 XLineStyle eXLS;
168
169 if ( pStyleItem )
170 eXLS = ( XLineStyle )pStyleItem->GetValue();
171 else
172 eXLS = XLINE_NONE;
173
174 switch( eXLS )
175 {
176 case XLINE_NONE:
177 pBox->SelectEntryPos( 0 );
178 break;
179
180 case XLINE_SOLID:
181 pBox->SelectEntryPos( 1 );
182 break;
183
184 case XLINE_DASH:
185 {
186 if( pDashItem )
187 {
188 String aString( pDashItem->GetName() );
189 pBox->SelectEntry( aString );
190 }
191 else
192 pBox->SetNoSelection();
193 }
194 break;
195
196 default:
197 DBG_ERROR( "Nicht unterstuetzter Linientyp" );
198 break;
199 }
200 }
201
202 if ( pState && ( pState->ISA( SvxDashListItem ) ) )
203 {
204 // Die Liste der Linienstile hat sich geaendert
205 SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
206 DBG_ASSERT( pBox, "Window not found!" );
207
208 String aString( pBox->GetSelectEntry() );
209 pBox->Clear();
210 pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_INVISIBLE) );
211 pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_SOLID) );
212 pBox->Fill( ((SvxDashListItem*)pState )->GetDashList() );
213 pBox->SelectEntry( aString );
214 }
215 }
216
217 //========================================================================
218
CreateItemWindow(Window * pParent)219 Window* SvxLineStyleToolBoxControl::CreateItemWindow( Window *pParent )
220 {
221 return new SvxLineBox( pParent, m_xFrame );
222 }
223
224 /*************************************************************************
225 |*
226 |* SvxLineWidthToolBoxControl
227 |*
228 \************************************************************************/
229
SvxLineWidthToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)230 SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
231 sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
232 SfxToolBoxControl( nSlotId, nId, rTbx )
233 {
234 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:MetricUnit" )));
235 }
236
237 //========================================================================
238
~SvxLineWidthToolBoxControl()239 SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
240 {
241 }
242
243 //========================================================================
244
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)245 void SvxLineWidthToolBoxControl::StateChanged(
246 sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
247 {
248 SvxMetricField* pFld = (SvxMetricField*)
249 GetToolBox().GetItemWindow( GetId() );
250 DBG_ASSERT( pFld, "Window not found" );
251
252 if ( nSID == SID_ATTR_METRIC )
253 {
254 pFld->RefreshDlgUnit();
255 }
256 else
257 {
258 if ( eState == SFX_ITEM_DISABLED )
259 {
260 pFld->Disable();
261 pFld->SetText( String() );
262 }
263 else
264 {
265 pFld->Enable();
266
267 if ( eState == SFX_ITEM_AVAILABLE )
268 {
269 DBG_ASSERT( pState->ISA(XLineWidthItem), "falscher ItemType" );
270
271 // Core-Unit an MetricField uebergeben
272 // Darf nicht in CreateItemWin() geschehen!
273 SfxMapUnit eUnit = SFX_MAPUNIT_100TH_MM; // CD!!! GetCoreMetric();
274 pFld->SetCoreUnit( eUnit );
275
276 pFld->Update( (const XLineWidthItem*)pState );
277 }
278 else
279 pFld->Update( NULL );
280 }
281 }
282 }
283
284 //========================================================================
285
CreateItemWindow(Window * pParent)286 Window* SvxLineWidthToolBoxControl::CreateItemWindow( Window *pParent )
287 {
288 return( new SvxMetricField( pParent, m_xFrame ) );
289 }
290
291 /*************************************************************************
292 |*
293 |* SvxLineColorToolBoxControl
294 |*
295 \************************************************************************/
296
SvxLineColorToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)297 SvxLineColorToolBoxControl::SvxLineColorToolBoxControl(
298 sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
299 SfxToolBoxControl( nSlotId, nId, rTbx )
300 {
301 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
302 }
303
304 //========================================================================
305
~SvxLineColorToolBoxControl()306 SvxLineColorToolBoxControl::~SvxLineColorToolBoxControl()
307 {
308 }
309
310 //========================================================================
311
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)312 void SvxLineColorToolBoxControl::StateChanged(
313
314 sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
315
316 {
317 SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
318 DBG_ASSERT( pBox, "Window not found" );
319
320 if ( nSID != SID_COLOR_TABLE )
321 {
322 if ( eState == SFX_ITEM_DISABLED )
323 {
324 pBox->Disable();
325 pBox->SetNoSelection();
326 }
327 else
328 {
329 pBox->Enable();
330
331 if ( eState == SFX_ITEM_AVAILABLE )
332 {
333 DBG_ASSERT( pState->ISA(XLineColorItem), "falscher ItemTyoe" );
334 pBox->Update( (const XLineColorItem*) pState );
335 }
336 else
337 pBox->Update( NULL );
338 }
339 }
340 else
341 Update( pState );
342 }
343
344 //========================================================================
345
Update(const SfxPoolItem * pState)346 void SvxLineColorToolBoxControl::Update( const SfxPoolItem* pState )
347 {
348 if ( pState && ( pState->ISA( SvxColorTableItem ) ) )
349 {
350 SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
351
352 DBG_ASSERT( pBox, "Window not found" );
353
354 // Die Liste der Farben (ColorTable) hat sich geaendert:
355 ::Color aTmpColor( pBox->GetSelectEntryColor() );
356 pBox->Clear();
357 pBox->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
358 pBox->SelectEntry( aTmpColor );
359 }
360 }
361
362 //========================================================================
363
CreateItemWindow(Window * pParent)364 Window* SvxLineColorToolBoxControl::CreateItemWindow( Window *pParent )
365 {
366 return new SvxColorBox( pParent, m_aCommandURL, m_xFrame );
367 }
368
369 /*************************************************************************
370 |*
371 |* SvxLineEndWindow
372 |*
373 \************************************************************************/
374
SvxLineEndWindow(sal_uInt16 nSlotId,const Reference<XFrame> & rFrame,const String & rWndTitle)375 SvxLineEndWindow::SvxLineEndWindow(
376 sal_uInt16 nSlotId,
377 const Reference< XFrame >& rFrame,
378 const String& rWndTitle ) :
379 SfxPopupWindow( nSlotId,
380 rFrame,
381 WinBits( WB_BORDER | WB_STDFLOATWIN | WB_SIZEABLE | WB_3DLOOK ) ),
382 maLineEndList(),
383 aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
384 nCols ( 2 ),
385 nLines ( 12 ),
386 nLineEndWidth ( 400 ),
387 bPopupMode ( sal_True ),
388 mbInResize ( false ),
389 mxFrame ( rFrame )
390 {
391 SetText( rWndTitle );
392 implInit();
393 }
394
SvxLineEndWindow(sal_uInt16 nSlotId,const Reference<XFrame> & rFrame,Window * pParentWindow,const String & rWndTitle)395 SvxLineEndWindow::SvxLineEndWindow(
396 sal_uInt16 nSlotId,
397 const Reference< XFrame >& rFrame,
398 Window* pParentWindow,
399 const String& rWndTitle ) :
400 SfxPopupWindow( nSlotId,
401 rFrame,
402 pParentWindow,
403 WinBits( WB_BORDER | WB_STDFLOATWIN | WB_SIZEABLE | WB_3DLOOK ) ),
404 maLineEndList(),
405 aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
406 nCols ( 2 ),
407 nLines ( 12 ),
408 nLineEndWidth ( 400 ),
409 bPopupMode ( sal_True ),
410 mbInResize ( false ),
411 mxFrame ( rFrame )
412 {
413 SetText( rWndTitle );
414 implInit();
415 }
416
implInit()417 void SvxLineEndWindow::implInit()
418 {
419 SfxObjectShell* pDocSh = SfxObjectShell::Current();
420 const SfxPoolItem* pItem = NULL;
421
422 SetHelpId( HID_POPUP_LINEEND );
423 aLineEndSet.SetHelpId( HID_POPUP_LINEEND_CTRL );
424
425 if ( pDocSh )
426 {
427 pItem = pDocSh->GetItem( SID_LINEEND_LIST );
428 if( pItem )
429 maLineEndList = static_cast< const SvxLineEndListItem* >(pItem)->GetLineEndList();
430
431 pItem = pDocSh->GetItem( SID_ATTR_LINEEND_WIDTH_DEFAULT );
432 if( pItem )
433 nLineEndWidth = ( (SfxUInt16Item*) pItem )->GetValue();
434 }
435 DBG_ASSERT( maLineEndList.get(), "LineEndList wurde nicht gefunden" );
436
437 aLineEndSet.SetSelectHdl( LINK( this, SvxLineEndWindow, SelectHdl ) );
438 aLineEndSet.SetColCount( nCols );
439
440 // ValueSet mit Eintraegen der LineEndList fuellen
441 FillValueSet();
442
443 AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndListState" )));
444
445 //ChangeHelpId( HID_POPUP_LINEENDSTYLE );
446 aLineEndSet.Show();
447 }
448
Clone() const449 SfxPopupWindow* SvxLineEndWindow::Clone() const
450 {
451 return new SvxLineEndWindow( GetId(), mxFrame, GetText() );
452 }
453
454 // -----------------------------------------------------------------------
455
~SvxLineEndWindow()456 SvxLineEndWindow::~SvxLineEndWindow()
457 {
458 }
459
460 // -----------------------------------------------------------------------
461
IMPL_LINK(SvxLineEndWindow,SelectHdl,void *,EMPTYARG)462 IMPL_LINK( SvxLineEndWindow, SelectHdl, void *, EMPTYARG )
463 {
464 XLineEndItem* pLineEndItem = NULL;
465 XLineStartItem* pLineStartItem = NULL;
466 sal_uInt16 nId = aLineEndSet.GetSelectItemId();
467
468 if( nId == 1 )
469 {
470 pLineStartItem = new XLineStartItem();
471 }
472 else if( nId == 2 )
473 {
474 pLineEndItem = new XLineEndItem();
475 }
476 else if( nId % 2 ) // LinienAnfang
477 {
478 XLineEndEntry* pEntry = maLineEndList->GetLineEnd( ( nId - 1 ) / 2 - 1 );
479 pLineStartItem = new XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() );
480 }
481 else // LinienEnde
482 {
483 XLineEndEntry* pEntry = maLineEndList->GetLineEnd( nId / 2 - 2 );
484 pLineEndItem = new XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() );
485 }
486
487 if ( IsInPopupMode() )
488 EndPopupMode();
489
490 Sequence< PropertyValue > aArgs( 1 );
491 Any a;
492
493 if ( pLineStartItem )
494 {
495 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineStart" ));
496 pLineStartItem->QueryValue( a );
497 aArgs[0].Value = a;
498 }
499 else
500 {
501 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineEnd" ));
502 pLineEndItem->QueryValue( a );
503 aArgs[0].Value = a;
504 }
505
506 /* #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
507 This instance may be deleted in the meantime (i.e. when a dialog is opened
508 while in Dispatch()), accessing members will crash in this case. */
509 aLineEndSet.SetNoSelection();
510
511 SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
512 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndStyle" )),
513 aArgs );
514
515 delete pLineEndItem;
516 delete pLineStartItem;
517
518 return 0;
519 }
520
521 // -----------------------------------------------------------------------
522
FillValueSet()523 void SvxLineEndWindow::FillValueSet()
524 {
525 if(maLineEndList.get())
526 {
527 XLineEndEntry* pEntry = NULL;
528 VirtualDevice aVD;
529
530 long nCount = maLineEndList->Count();
531
532 // Erster Eintrag: kein LinienEnde
533 // Temporaer wird ein Eintrag hinzugefuegt, um die UI-Bitmap zu erhalten
534 basegfx::B2DPolyPolygon aNothing;
535 maLineEndList->Insert( new XLineEndEntry( aNothing, SVX_RESSTR( RID_SVXSTR_NONE ) ) );
536 pEntry = maLineEndList->GetLineEnd( nCount );
537 Bitmap aBmp = maLineEndList->GetUiBitmap( nCount );
538 OSL_ENSURE( !aBmp.IsEmpty(), "UI-Bitmap wurde nicht erzeugt" );
539
540 aBmpSize = aBmp.GetSizePixel();
541 aVD.SetOutputSizePixel( aBmpSize, sal_False );
542 aBmpSize.Width() = aBmpSize.Width() / 2;
543 Point aPt0( 0, 0 );
544 Point aPt1( aBmpSize.Width(), 0 );
545
546 aVD.DrawBitmap( Point(), aBmp );
547 aLineEndSet.InsertItem( 1, aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
548 aLineEndSet.InsertItem( 2, aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
549
550 delete maLineEndList->Remove( nCount );
551
552 for( long i = 0; i < nCount; i++ )
553 {
554 pEntry = maLineEndList->GetLineEnd( i );
555 DBG_ASSERT( pEntry, "Konnte auf LineEndEntry nicht zugreifen" );
556 aBmp = maLineEndList->GetUiBitmap( i );
557 OSL_ENSURE( !aBmp.IsEmpty(), "UI-Bitmap wurde nicht erzeugt" );
558
559 aVD.DrawBitmap( aPt0, aBmp );
560 aLineEndSet.InsertItem( (sal_uInt16)((i+1L)*2L+1L), aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
561 aLineEndSet.InsertItem( (sal_uInt16)((i+2L)*2L), aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
562 }
563 nLines = Min( (sal_uInt16)(nCount + 1), (sal_uInt16) MAX_LINES );
564 aLineEndSet.SetLineCount( nLines );
565
566 SetSize();
567 }
568 }
569
570 // -----------------------------------------------------------------------
571
Resize()572 void SvxLineEndWindow::Resize()
573 {
574 // since we change the size inside this call, check if we
575 // are called recursive
576 if( !mbInResize )
577 {
578 mbInResize = true;
579 if ( !IsRollUp() )
580 {
581 aLineEndSet.SetColCount( nCols );
582 aLineEndSet.SetLineCount( nLines );
583
584 SetSize();
585
586 Size aSize = GetOutputSizePixel();
587 aSize.Width() -= 4;
588 aSize.Height() -= 4;
589 aLineEndSet.SetPosSizePixel( Point( 2, 2 ), aSize );
590 }
591 //SfxPopupWindow::Resize();
592 mbInResize = false;
593 }
594 }
595
596 // -----------------------------------------------------------------------
597
Resizing(Size & rNewSize)598 void __EXPORT SvxLineEndWindow::Resizing( Size& rNewSize )
599 {
600 Size aBitmapSize = aBmpSize; // -> Member
601 aBitmapSize.Width() += 6; //
602 aBitmapSize.Height() += 6; //
603
604 Size aItemSize = aLineEndSet.CalcItemSizePixel( aBitmapSize ); // -> Member
605 //Size aOldSize = GetOutputSizePixel(); // fuer Breite
606
607 sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
608
609 // Spalten ermitteln
610 long nItemW = aItemSize.Width();
611 long nW = rNewSize.Width();
612 nCols = (sal_uInt16) Max( ( (sal_uIntPtr)(( nW + nItemW ) / ( nItemW * 2 ) )),
613 (sal_uIntPtr) 1L );
614 nCols *= 2;
615
616 // Reihen ermitteln
617 long nItemH = aItemSize.Height();
618 long nH = rNewSize.Height();
619 nLines = (sal_uInt16) Max( ( ( nH + nItemH / 2 ) / nItemH ), 1L );
620
621 sal_uInt16 nMaxCols = nItemCount / nLines;
622 if( nItemCount % nLines )
623 nMaxCols++;
624 if( nCols > nMaxCols )
625 nCols = nMaxCols;
626 nW = nItemW * nCols;
627
628 // Keine ungerade Anzahl von Spalten
629 if( nCols % 2 )
630 nCols--;
631 nCols = Max( nCols, (sal_uInt16) 2 );
632
633 sal_uInt16 nMaxLines = nItemCount / nCols;
634 if( nItemCount % nCols )
635 nMaxLines++;
636 if( nLines > nMaxLines )
637 nLines = nMaxLines;
638 nH = nItemH * nLines;
639
640 rNewSize.Width() = nW;
641 rNewSize.Height() = nH;
642 }
643 // -----------------------------------------------------------------------
644
StartSelection()645 void SvxLineEndWindow::StartSelection()
646 {
647 aLineEndSet.StartSelection();
648 }
649
650 // -----------------------------------------------------------------------
651
Close()652 sal_Bool SvxLineEndWindow::Close()
653 {
654 return SfxPopupWindow::Close();
655 }
656
657 // -----------------------------------------------------------------------
658
StateChanged(sal_uInt16 nSID,SfxItemState,const SfxPoolItem * pState)659 void SvxLineEndWindow::StateChanged(
660 sal_uInt16 nSID, SfxItemState, const SfxPoolItem* pState )
661 {
662 if ( nSID == SID_LINEEND_LIST )
663 {
664 // Die Liste der LinienEnden (LineEndList) hat sich geaendert:
665 if ( pState && pState->ISA( SvxLineEndListItem ))
666 {
667 maLineEndList = static_cast< const SvxLineEndListItem* >(pState)->GetLineEndList();
668 DBG_ASSERT( maLineEndList.get(), "LineEndList nicht gefunden" );
669
670 aLineEndSet.Clear();
671 FillValueSet();
672
673 Size aSize = GetOutputSizePixel();
674 Resizing( aSize );
675 Resize();
676 }
677 }
678 }
679
680 // -----------------------------------------------------------------------
681
PopupModeEnd()682 void SvxLineEndWindow::PopupModeEnd()
683 {
684 if ( IsVisible() )
685 {
686 bPopupMode = sal_False;
687 SetSize();
688 }
689 SfxPopupWindow::PopupModeEnd();
690 }
691
692 // -----------------------------------------------------------------------
693
SetSize()694 void SvxLineEndWindow::SetSize()
695 {
696 //if( !bPopupMode )
697 if( !IsInPopupMode() )
698 {
699 sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
700 sal_uInt16 nMaxLines = nItemCount / nCols; // -> Member ?
701 if( nItemCount % nCols )
702 nMaxLines++;
703
704 WinBits nBits = aLineEndSet.GetStyle();
705 if ( nLines == nMaxLines )
706 nBits &= ~WB_VSCROLL;
707 else
708 nBits |= WB_VSCROLL;
709 aLineEndSet.SetStyle( nBits );
710 }
711
712 Size aSize( aBmpSize );
713 aSize.Width() += 6;
714 aSize.Height() += 6;
715 aSize = aLineEndSet.CalcWindowSizePixel( aSize );
716 aSize.Width() += 4;
717 aSize.Height() += 4;
718 SetOutputSizePixel( aSize );
719 aSize.Height() = aBmpSize.Height();
720 aSize.Height() += 14;
721 //SetMinOutputSizePixel( aSize );
722 }
723
GetFocus(void)724 void SvxLineEndWindow::GetFocus (void)
725 {
726 SfxPopupWindow::GetFocus();
727 // Grab the focus to the line ends value set so that it can be controlled
728 // with the keyboard.
729 aLineEndSet.GrabFocus();
730 }
731
732 /*************************************************************************
733 |*
734 |* SvxLineEndToolBoxControl
735 |*
736 \************************************************************************/
737
SvxLineEndToolBoxControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)738 SvxLineEndToolBoxControl::SvxLineEndToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ) :
739 SfxToolBoxControl( nSlotId, nId, rTbx )
740 {
741 rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
742 rTbx.Invalidate();
743 }
744
745 // -----------------------------------------------------------------------
746
~SvxLineEndToolBoxControl()747 SvxLineEndToolBoxControl::~SvxLineEndToolBoxControl()
748 {
749 }
750
751 // -----------------------------------------------------------------------
752
GetPopupWindowType() const753 SfxPopupWindowType SvxLineEndToolBoxControl::GetPopupWindowType() const
754 {
755 return SFX_POPUPWINDOW_ONCLICK;
756 }
757
758 // -----------------------------------------------------------------------
759
CreatePopupWindow()760 SfxPopupWindow* SvxLineEndToolBoxControl::CreatePopupWindow()
761 {
762 SvxLineEndWindow* pLineEndWin =
763 new SvxLineEndWindow( GetId(), m_xFrame, &GetToolBox(), SVX_RESSTR( RID_SVXSTR_LINEEND ) );
764 pLineEndWin->StartPopupMode( &GetToolBox(), sal_True );
765 pLineEndWin->StartSelection();
766 SetPopupWindow( pLineEndWin );
767 return pLineEndWin;
768 }
769
770 // -----------------------------------------------------------------------
771
StateChanged(sal_uInt16,SfxItemState eState,const SfxPoolItem *)772 void SvxLineEndToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* )
773 {
774 sal_uInt16 nId = GetId();
775 ToolBox& rTbx = GetToolBox();
776
777 rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
778 rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
779 }
780