xref: /aoo41x/main/svx/source/tbxctrls/tbcontrl.cxx (revision d205bed2)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 // include ---------------------------------------------------------------
32 
33 
34 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
35 #include <tools/shl.hxx>
36 #include <svl/poolitem.hxx>
37 #include <svl/eitem.hxx>
38 #include <vcl/toolbox.hxx>
39 #include <vcl/bmpacc.hxx>
40 #include <svtools/valueset.hxx>
41 #include <svtools/ctrlbox.hxx>
42 #include <svl/style.hxx>
43 #include <svtools/ctrltool.hxx>
44 #include <svl/stritem.hxx>
45 #include <unotools/pathoptions.hxx>
46 #include <sfx2/tplpitem.hxx>
47 #include <sfx2/dispatch.hxx>
48 #include <sfx2/viewsh.hxx>
49 #include <sfx2/objsh.hxx>
50 #include <sfx2/docfac.hxx>
51 #include <sfx2/templdlg.hxx>
52 #include <svl/isethint.hxx>
53 #include <sfx2/querystatus.hxx>
54 #include <sfx2/sfxstatuslistener.hxx>
55 #include <tools/urlobj.hxx>
56 #include <sfx2/childwin.hxx>
57 #include <sfx2/viewfrm.hxx>
58 #include <unotools/fontoptions.hxx>
59 #include <vcl/mnemonic.hxx>
60 
61 #include <vcl/svapp.hxx>
62 #include <svl/smplhint.hxx>
63 
64 #define _SVX_TBCONTRL_CXX
65 #include <svtools/colorcfg.hxx>
66 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
67 #include <com/sun/star/lang/XServiceInfo.hpp>
68 #include <com/sun/star/beans/XPropertySet.hpp>
69 #include <com/sun/star/frame/status/ItemStatus.hpp>
70 #include <com/sun/star/frame/status/FontHeight.hpp>
71 
72 #include <svx/dialogs.hrc>
73 #include <svx/svxitems.hrc>
74 #include "helpid.hrc"
75 #include "svx/htmlmode.hxx"
76 #include <svx/xtable.hxx>
77 #include "editeng/fontitem.hxx"
78 #include <editeng/fhgtitem.hxx>
79 #include <editeng/brshitem.hxx>
80 #include <editeng/boxitem.hxx>
81 #include <editeng/colritem.hxx>
82 #include "editeng/flstitem.hxx"
83 #include "editeng/bolnitem.hxx"
84 #include "svx/drawitem.hxx"
85 #include <svx/tbcontrl.hxx>
86 #include "svx/dlgutil.hxx"
87 #include <svx/dialmgr.hxx>
88 #include "colorwindow.hxx"
89 #include <memory>
90 
91 #include <svx/tbxcolorupdate.hxx>
92 #include <editeng/eerdll.hxx>
93 #include <editeng/editrids.hrc>
94 
95 // ------------------------------------------------------------------------
96 
97 #define MAX_MRU_FONTNAME_ENTRIES	5
98 #define LOGICAL_EDIT_HEIGHT         12
99 
100 // STATIC DATA -----------------------------------------------------------
101 
102 #ifndef DELETEZ
103 #define DELETEZ(p) (delete (p), (p)=NULL)
104 #endif
105 // don't make more than 15 entries visible at once
106 #define MAX_STYLES_ENTRIES          static_cast< sal_uInt16 >( 15 )
107 
108 void lcl_ResizeValueSet( Window &rWin, ValueSet &rValueSet );
109 void lcl_CalcSizeValueSet( Window &rWin, ValueSet &rValueSet, const Size &aItemSize );
110 sal_Bool lcl_FontChangedHint( const SfxHint &rHint );
111 
112 // namespaces
113 using ::rtl::OUString;
114 using namespace ::com::sun::star;
115 using namespace ::com::sun::star::uno;
116 using namespace ::com::sun::star::frame;
117 using namespace ::com::sun::star::util;
118 using namespace ::com::sun::star::beans;
119 using namespace ::com::sun::star::lang;
120 
121 SFX_IMPL_TOOLBOX_CONTROL( SvxStyleToolBoxControl, SfxTemplateItem );
122 SFX_IMPL_TOOLBOX_CONTROL( SvxFontNameToolBoxControl, SvxFontItem );
123 SFX_IMPL_TOOLBOX_CONTROL( SvxFontColorToolBoxControl, SvxColorItem );
124 SFX_IMPL_TOOLBOX_CONTROL( SvxFontColorExtToolBoxControl, SvxColorItem );
125 SFX_IMPL_TOOLBOX_CONTROL( SvxColorToolBoxControl, SvxColorItem );
126 SFX_IMPL_TOOLBOX_CONTROL( SvxFrameToolBoxControl, SvxBoxItem );
127 SFX_IMPL_TOOLBOX_CONTROL( SvxFrameLineStyleToolBoxControl, SvxLineItem );
128 SFX_IMPL_TOOLBOX_CONTROL( SvxFrameLineColorToolBoxControl, SvxColorItem );
129 SFX_IMPL_TOOLBOX_CONTROL( SvxReloadControllerItem,	SfxBoolItem );
130 SFX_IMPL_TOOLBOX_CONTROL( SvxSimpleUndoRedoController, SfxStringItem );
131 
132 //========================================================================
133 // class SvxStyleBox_Impl -----------------------------------------------------
134 //========================================================================
135 
136 
137 class SvxStyleBox_Impl : public ComboBox
138 {
139 	using Window::IsVisible;
140 public:
141     SvxStyleBox_Impl( Window* pParent, sal_uInt16 nSlot, const OUString& rCommand, SfxStyleFamily eFamily, const Reference< XDispatchProvider >& rDispatchProvider,
142 						const Reference< XFrame >& _xFrame,const String& rClearFormatKey, const String& rMoreKey, sal_Bool bInSpecialMode );
143 	~SvxStyleBox_Impl();
144 
145 	void 			SetFamily( SfxStyleFamily eNewFamily );
146     inline sal_Bool     IsVisible() { return bVisible; }
147 
148 	virtual long	PreNotify( NotifyEvent& rNEvt );
149 	virtual long	Notify( NotifyEvent& rNEvt );
150     virtual void    DataChanged( const DataChangedEvent& rDCEvt );
151     virtual void	StateChanged( StateChangedType nStateChange );
152 
153     inline void     SetVisibilityListener( const Link& aVisListener ) { aVisibilityListener = aVisListener; }
154     inline void     RemoveVisibilityListener() { aVisibilityListener = Link(); }
155 
156     void            SetDefaultStyle( const ::rtl::OUString& rDefault ) { sDefaultStyle = rDefault; }
157     DECL_STATIC_LINK( SvxStyleBox_Impl, FocusHdl_Impl, Control* );
158 
159 protected:
160 	virtual void	Select();
161 
162 private:
163 	sal_uInt16			                nSlotId;
164 	SfxStyleFamily	                eStyleFamily;
165 	sal_uInt16			                nCurSel;
166 	sal_Bool			                bRelease;
167     Size                            aLogicalSize;
168 	Link			                aVisibilityListener;
169 	sal_Bool			                bVisible;
170     Reference< XDispatchProvider >  m_xDispatchProvider;
171     Reference< XFrame >             m_xFrame;
172     OUString                        m_aCommand;
173 	String							aClearFormatKey;
174 	String							aMoreKey;
175 	String                          sDefaultStyle;
176     sal_Bool							bInSpecialMode;
177 
178 	void			ReleaseFocus();
179 };
180 
181 //========================================================================
182 // class SvxFontNameBox --------------------------------------------------
183 //========================================================================
184 
185 class SvxFontNameBox_Impl : public FontNameBox
186 {
187 	using Window::Update;
188 private:
189 	const FontList*	               pFontList;
190     ::std::auto_ptr<FontList>      m_aOwnFontList;
191 	Font			               aCurFont;
192     Size                           aLogicalSize;
193 	String			               aCurText;
194 	sal_uInt16			               nFtCount;
195 	sal_Bool			               bRelease;
196     Reference< XDispatchProvider > m_xDispatchProvider;
197     Reference< XFrame >            m_xFrame;
198 
199 	void			ReleaseFocus_Impl();
200 	void			EnableControls_Impl();
201 
202 protected:
203 	virtual void 	Select();
204     virtual void    DataChanged( const DataChangedEvent& rDCEvt );
205 
206 public:
207     SvxFontNameBox_Impl( Window* pParent, const Reference< XDispatchProvider >& rDispatchProvider,const Reference< XFrame >& _xFrame
208         , WinBits nStyle = WB_SORT
209         );
210 
211 	void			FillList();
212 	void			Update( const SvxFontItem* pFontItem );
213 	sal_uInt16			GetListCount() { return nFtCount; }
214 	void			Clear() { FontNameBox::Clear(); nFtCount = 0; }
215 	void			Fill( const FontList* pList )
216 						{ FontNameBox::Fill( pList );
217 						  nFtCount = pList->GetFontNameCount(); }
218 	virtual long	PreNotify( NotifyEvent& rNEvt );
219 	virtual long	Notify( NotifyEvent& rNEvt );
220 	virtual Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
221     inline void     SetOwnFontList(::std::auto_ptr<FontList> _aOwnFontList) { m_aOwnFontList = _aOwnFontList; }
222 };
223 
224 //========================================================================
225 // class SvxFrameWindow_Impl --------------------------------------------------
226 //========================================================================
227 
228 // fuer den SelectHdl werden die Modifier gebraucht, also
229 // muss man sie im MouseButtonUp besorgen
230 
231 class SvxFrmValueSet_Impl : public ValueSet
232 {
233 	sal_uInt16			nModifier;
234     virtual void    MouseButtonUp( const MouseEvent& rMEvt );
235 public:
236     SvxFrmValueSet_Impl(Window* pParent,  WinBits nWinStyle)
237 		: ValueSet(pParent, nWinStyle), nModifier(0) {}
238 	sal_uInt16			GetModifier() const {return nModifier;}
239 
240 };
241 
242 void SvxFrmValueSet_Impl::MouseButtonUp( const MouseEvent& rMEvt )
243 {
244 	nModifier = rMEvt.GetModifier();
245 	ValueSet::MouseButtonUp(rMEvt);
246 }
247 
248 class SvxFrameWindow_Impl : public SfxPopupWindow
249 {
250 	using FloatingWindow::StateChanged;
251 
252 private:
253     SvxFrmValueSet_Impl  aFrameSet;
254 	ImageList 		aImgList;
255     sal_Bool        bParagraphMode;
256 
257 #if _SOLAR__PRIVATE
258 	DECL_LINK( SelectHdl, void * );
259 #endif
260 
261 protected:
262 	virtual void    Resize();
263 	virtual sal_Bool	Close();
264 	virtual Window*	GetPreferredKeyInputWindow();
265 	virtual void	GetFocus();
266 
267 public:
268     SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, Window* pParentWindow );
269     ~SvxFrameWindow_Impl();
270 	void            StartSelection();
271 
272 	virtual void	StateChanged( sal_uInt16 nSID, SfxItemState eState,
273 								  const SfxPoolItem* pState );
274 	virtual SfxPopupWindow* Clone() const;
275 	virtual void	DataChanged( const DataChangedEvent& rDCEvt );
276 
277 	inline sal_Bool		IsHighContrast( void ) const;
278 };
279 
280 inline sal_Bool SvxFrameWindow_Impl::IsHighContrast( void ) const
281 {
282 	return GetSettings().GetStyleSettings().GetHighContrastMode();
283 }
284 
285 //========================================================================
286 // class SvxLineWindow_Impl ---------------------------------------------------
287 //========================================================================
288 class SvxLineWindow_Impl : public SfxPopupWindow
289 {
290 private:
291 	ValueSet		    aLineSet;
292 	bool				m_bIsWriter;
293 
294 #if _SOLAR__PRIVATE
295 	void			MakeLineBitmap( sal_uInt16 nNo, Bitmap& rBmp, const Size& rSize, String& rStr,
296 									const ::Color& rLine, const ::Color& rBack );
297 	DECL_LINK( SelectHdl, void * );
298 #endif
299 
300 protected:
301 	virtual void    Resize();
302 	virtual sal_Bool	Close();
303 	virtual Window*	GetPreferredKeyInputWindow();
304 	virtual void	GetFocus();
305     virtual void    DataChanged( const DataChangedEvent& rDCEvt );
306 	void			CreateBitmaps( void );
307 public:
308     SvxLineWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, Window* pParentWindow );
309 
310 	void					StartSelection();
311 	virtual SfxPopupWindow* Clone() const;
312 };
313 
314 //########################################################################
315 // Hilfsklassen:
316 //========================================================================
317 // class SfxStyleControllerItem ------------------------------------------
318 //========================================================================
319 class SvxStyleToolBoxControl;
320 
321 class SfxStyleControllerItem_Impl : public SfxStatusListener
322 {
323     public:
324         SfxStyleControllerItem_Impl( const Reference< XDispatchProvider >& rDispatchProvider,
325                                      sal_uInt16 nSlotId,
326                                      const rtl::OUString& rCommand,
327                                      SvxStyleToolBoxControl& rTbxCtl );
328 
329     protected:
330         virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState );
331 
332     private:
333         SvxStyleToolBoxControl& rControl;
334 };
335 
336 //========================================================================
337 // class SvxStyleBox_Impl -----------------------------------------------------
338 //========================================================================
339 
340 SvxStyleBox_Impl::SvxStyleBox_Impl(
341     Window*                                 pParent,
342     sal_uInt16                                  nSlot,
343     const rtl::OUString&                    rCommand,
344     SfxStyleFamily                          eFamily,
345     const Reference< XDispatchProvider >&   rDispatchProvider,
346     const Reference< XFrame >&              _xFrame,
347 	const String&							rClearFormatKey,
348 	const String&							rMoreKey,
349 	sal_Bool									bInSpec) :
350 
351 	ComboBox( pParent, SVX_RES( RID_SVXTBX_STYLE ) ),
352 
353 	nSlotId		( nSlot ),
354 	eStyleFamily( eFamily ),
355 	bRelease	( sal_True ),
356     bVisible(sal_False),
357     m_xDispatchProvider( rDispatchProvider ),
358     m_xFrame(_xFrame),
359 	m_aCommand  ( rCommand ),
360 	aClearFormatKey	( rClearFormatKey ),
361 	aMoreKey		( rMoreKey ),
362 	bInSpecialMode	( bInSpec )
363 {
364     aLogicalSize = PixelToLogic( GetSizePixel(), MAP_APPFONT );
365 	EnableAutocomplete( sal_True );
366 }
367 
368 SvxStyleBox_Impl::~SvxStyleBox_Impl()
369 {
370 }
371 
372 // -----------------------------------------------------------------------
373 
374 void SvxStyleBox_Impl::ReleaseFocus()
375 {
376 	if ( !bRelease )
377 	{
378 		bRelease = sal_True;
379 		return;
380 	}
381     if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() )
382         m_xFrame->getContainerWindow()->setFocus();
383 }
384 
385 // -----------------------------------------------------------------------
386 
387 void SvxStyleBox_Impl::Select()
388 {
389     // Tell base class about selection so that AT get informed about it.
390     ComboBox::Select();
391 
392 	if ( !IsTravelSelect() )
393 	{
394         String aSelEntry( GetText() );
395 		bool bDoIt = true, bClear = false;
396 		if( bInSpecialMode )
397 		{
398 			if( aSelEntry == aClearFormatKey && GetSelectEntryPos() == 0 )
399 			{
400                 aSelEntry = sDefaultStyle;
401 				bClear = true;
402                 //not only apply default style but also call 'ClearFormatting'
403                 Sequence< PropertyValue > aEmptyVals;
404                 SfxToolBoxControl::Dispatch( m_xDispatchProvider, String::CreateFromAscii(".uno:ResetAttributes"),
405                     aEmptyVals);
406 			}
407 			else if( aSelEntry == aMoreKey && GetSelectEntryPos() == ( GetEntryCount() - 1 ) )
408 			{
409 				SfxViewFrame* pViewFrm = SfxViewFrame::Current();
410 				DBG_ASSERT( pViewFrm, "SvxStyleBox_Impl::Select(): no viewframe" );
411 				pViewFrm->ShowChildWindow( SID_STYLE_DESIGNER );
412 				SfxChildWindow* pChildWin = pViewFrm->GetChildWindow( SID_STYLE_DESIGNER );
413 				if ( pChildWin && pChildWin->GetWindow() )
414                 {
415                     static_cast< SfxTemplateDialogWrapper* >( pChildWin )->SetParagraphFamily();
416                     static_cast< SfxDockingWindow* >( pChildWin->GetWindow() )->AutoShow( sal_True );
417                     Application::PostUserEvent(
418                         STATIC_LINK( 0, SvxStyleBox_Impl, FocusHdl_Impl ), pChildWin->GetWindow() );
419                 }
420 				bDoIt = false;
421 			}
422 		}
423 
424         // #i36723# after ReleaseFocus() the new entry is included into the List
425         sal_Bool bCreateNew = GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND;
426 
427         /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
428             This instance may be deleted in the meantime (i.e. when a dialog is opened
429             while in Dispatch()), accessing members will crash in this case. */
430         ReleaseFocus();
431 
432         if( bDoIt )
433 		{
434             if ( bClear )
435                 SetText( aSelEntry );
436             SaveValue();
437 
438             Sequence< PropertyValue > aArgs( 2 );
439 	        aArgs[0].Value  = makeAny( OUString( aSelEntry ) );
440 			aArgs[1].Name   = OUString::createFromAscii( "Family" );
441 			aArgs[1].Value  = makeAny( sal_Int16( eStyleFamily ));
442 			if( bCreateNew )
443             {
444                 aArgs[0].Name   = OUString::createFromAscii( "Param" );
445                 SfxToolBoxControl::Dispatch( m_xDispatchProvider, String::CreateFromAscii(".uno:StyleNewByExample"), aArgs);
446             }
447             else
448             {
449                 aArgs[0].Name   = OUString::createFromAscii( "Template" );
450 			    SfxToolBoxControl::Dispatch( m_xDispatchProvider, m_aCommand, aArgs );
451             }
452         }
453 	}
454 }
455 // -----------------------------------------------------------------------
456 
457 void SvxStyleBox_Impl::SetFamily( SfxStyleFamily eNewFamily )
458 {
459 	eStyleFamily = eNewFamily;
460 }
461 
462 // -----------------------------------------------------------------------
463 
464 long SvxStyleBox_Impl::PreNotify( NotifyEvent& rNEvt )
465 {
466 	sal_uInt16 nType = rNEvt.GetType();
467 
468 	if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
469 		nCurSel = GetSelectEntryPos();
470     else if ( EVENT_LOSEFOCUS == nType )
471 	{
472 		// don't handle before our Select() is called
473 		if ( !HasFocus() && !HasChildPathFocus() )
474 			SetText( GetSavedValue() );
475 	}
476 	return ComboBox::PreNotify( rNEvt );
477 }
478 
479 // -----------------------------------------------------------------------
480 
481 long SvxStyleBox_Impl::Notify( NotifyEvent& rNEvt )
482 {
483 	long nHandled = 0;
484 
485 	if ( rNEvt.GetType() == EVENT_KEYINPUT )
486 	{
487 		sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
488 
489 		switch ( nCode )
490 		{
491 			case KEY_RETURN:
492 			case KEY_TAB:
493 			{
494 				if ( KEY_TAB == nCode )
495 					bRelease = sal_False;
496 				else
497 					nHandled = 1;
498 				Select();
499 				break;
500 			}
501 
502 			case KEY_ESCAPE:
503 				SelectEntryPos( nCurSel );
504 				ReleaseFocus();
505 				nHandled = 1;
506 				break;
507 		}
508 	}
509 	return nHandled ? nHandled : ComboBox::Notify( rNEvt );
510 }
511 /* -----------------------------08.03.2002 13:03------------------------------
512 
513  ---------------------------------------------------------------------------*/
514 void SvxStyleBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
515 {
516 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
517          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
518     {
519         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
520         Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT);
521         SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT));
522     }
523 
524     ComboBox::DataChanged( rDCEvt );
525 }
526 
527 void SvxStyleBox_Impl::StateChanged( StateChangedType nStateChange )
528 {
529 	ComboBox::StateChanged( nStateChange );
530 
531 	if ( nStateChange == STATE_CHANGE_VISIBLE )
532 	{
533 		bVisible = IsReallyVisible();
534 		if ( aVisibilityListener.IsSet() )
535 			aVisibilityListener.Call( this );
536 	}
537 	else if ( nStateChange == STATE_CHANGE_INITSHOW )
538 	{
539 		bVisible = sal_True;
540 		if ( aVisibilityListener.IsSet() )
541 			aVisibilityListener.Call( this );
542 	}
543 }
544 
545 //--------------------------------------------------------------------
546 
547 IMPL_STATIC_LINK( SvxStyleBox_Impl, FocusHdl_Impl, Control*, _pCtrl )
548 {
549 	(void)pThis;
550     if ( _pCtrl )
551         _pCtrl->GrabFocus();
552     return 0;
553 }
554 
555 // -----------------------------------------------------------------------
556 
557 sal_Bool GetDocFontList_Impl( const FontList** ppFontList, SvxFontNameBox_Impl* pBox )
558 {
559 	sal_Bool bChanged = sal_False;
560 	const SfxObjectShell* pDocSh = SfxObjectShell::Current();
561 	SvxFontListItem* pFontListItem = NULL;
562 
563 	if ( pDocSh )
564 		pFontListItem =
565 			(SvxFontListItem*)pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST );
566     else
567     {
568         ::std::auto_ptr<FontList> aFontList(new FontList( pBox ));
569         *ppFontList = aFontList.get();
570         pBox->SetOwnFontList(aFontList);
571         bChanged = sal_True;
572     }
573 
574 	if ( pFontListItem )
575 	{
576 		const FontList*	pNewFontList = pFontListItem->GetFontList();
577 		DBG_ASSERT( pNewFontList, "Doc-FontList not available!" );
578 
579 		// keine alte Liste, aber neue Liste
580 		if ( !*ppFontList && pNewFontList )
581 		{
582 			// => "ubernehmen
583 			*ppFontList = pNewFontList;
584 			bChanged = sal_True;
585 		}
586 		else
587 		{
588 			// Vergleich der Fontlisten ist nicht vollkommen
589 			// wird die Fontliste am Doc geaendert, kann man hier
590 			// nur ueber die Listbox Aenderungen feststellen, weil
591 			// ppFontList dabei schon upgedatet wurde
592 			bChanged =
593 				( ( *ppFontList != pNewFontList ) ||
594 				  pBox->GetListCount() != pNewFontList->GetFontNameCount() );
595 			HACK(vergleich ist unvollstaendig)
596 
597 			if ( bChanged )
598 				*ppFontList = pNewFontList;
599 		}
600 
601 		if ( pBox )
602 			pBox->Enable();
603 	}
604 	else if ( pBox && ( pDocSh || ( !pDocSh && !ppFontList )))
605     {
606         // Disable box only when we have a SfxObjectShell and didn't get a font list OR
607         // we don't have a SfxObjectShell and no current font list.
608         // It's possible that we currently have no SfxObjectShell, but a current font list.
609         // See #i58471: When a user set the focus into the font name combo box and opens
610         // the help window with F1. After closing the help window, we disable the font name
611         // combo box. The SfxObjectShell::Current() method returns in that case zero. But the
612         // font list hasn't changed and therefore the combo box shouldn't be disabled!
613         pBox->Disable();
614     }
615 
616 	// in die FontBox ggf. auch die neue Liste f"ullen
617 	if ( pBox && bChanged )
618 	{
619 		if ( *ppFontList )
620 			pBox->Fill( *ppFontList );
621 		else
622 			pBox->Clear();
623 	}
624 	return bChanged;
625 }
626 
627 //========================================================================
628 // class SvxFontNameBox_Impl --------------------------------------------------
629 //========================================================================
630 
631 SvxFontNameBox_Impl::SvxFontNameBox_Impl( Window* pParent, const Reference< XDispatchProvider >& rDispatchProvider,const Reference< XFrame >& _xFrame, WinBits nStyle ) :
632 
633 	FontNameBox	       ( pParent, nStyle | WinBits( WB_DROPDOWN | WB_AUTOHSCROLL ) ),
634 	pFontList	       ( NULL ),
635 	aLogicalSize       ( 75,160 ),
636 	nFtCount	       ( 0 ),
637 	bRelease	       ( sal_True ),
638     m_xDispatchProvider( rDispatchProvider ),
639     m_xFrame (_xFrame)
640 {
641     SetSizePixel(LogicToPixel( aLogicalSize, MAP_APPFONT ));
642     EnableControls_Impl();
643 }
644 // -----------------------------------------------------------------------
645 
646 void SvxFontNameBox_Impl::FillList()
647 {
648 	// alte Selektion merken, und am Ende wieder setzen
649 	Selection aOldSel = GetSelection();
650 	// hat sich Doc-Fontlist geaendert?
651 	GetDocFontList_Impl( &pFontList, this );
652 	aCurText = GetText();
653 	SetSelection( aOldSel );
654 }
655 
656 // -----------------------------------------------------------------------
657 
658 void SvxFontNameBox_Impl::Update( const SvxFontItem* pFontItem )
659 {
660 	if ( pFontItem )
661 	{
662 		aCurFont.SetName		( pFontItem->GetFamilyName() );
663 		aCurFont.SetFamily		( pFontItem->GetFamily() );
664 		aCurFont.SetStyleName	( pFontItem->GetStyleName() );
665 		aCurFont.SetPitch		( pFontItem->GetPitch() );
666 		aCurFont.SetCharSet		( pFontItem->GetCharSet() );
667 	}
668 	String aCurName = aCurFont.GetName();
669 	if ( GetText() != aCurName )
670 		SetText( aCurName );
671 }
672 
673 // -----------------------------------------------------------------------
674 
675 long SvxFontNameBox_Impl::PreNotify( NotifyEvent& rNEvt )
676 {
677 	sal_uInt16 nType = rNEvt.GetType();
678 
679 	if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
680     {
681         EnableControls_Impl();
682 		FillList();
683     }
684     return FontNameBox::PreNotify( rNEvt );
685 }
686 
687 // -----------------------------------------------------------------------
688 
689 long SvxFontNameBox_Impl::Notify( NotifyEvent& rNEvt )
690 {
691 	long nHandled = 0;
692 
693 	if ( rNEvt.GetType() == EVENT_KEYINPUT )
694 	{
695 		sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
696 
697 		switch ( nCode )
698 		{
699 			case KEY_RETURN:
700 			case KEY_TAB:
701 			{
702 				if ( KEY_TAB == nCode )
703 					bRelease = sal_False;
704 				else
705 					nHandled = 1;
706 				Select();
707 				break;
708 			}
709 
710 			case KEY_ESCAPE:
711 				SetText( aCurText );
712 				ReleaseFocus_Impl();
713 				break;
714 		}
715 	}
716     else if ( EVENT_LOSEFOCUS == rNEvt.GetType() )
717 	{
718 		Window* pFocusWin = Application::GetFocusWindow();
719 		if ( !HasFocus() && GetSubEdit() != pFocusWin )
720 			SetText( GetSavedValue() );
721 	}
722 
723 	return nHandled ? nHandled : FontNameBox::Notify( rNEvt );
724 }
725 
726 // ---------------------------------------------------------------------------
727 void SvxFontNameBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
728 {
729 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
730          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
731     {
732         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
733         Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT);
734         SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT));
735     }
736 
737     FontNameBox::DataChanged( rDCEvt );
738 }
739 
740 // -----------------------------------------------------------------------
741 
742 void SvxFontNameBox_Impl::ReleaseFocus_Impl()
743 {
744 	if ( !bRelease )
745 	{
746 		bRelease = sal_True;
747 		return;
748 	}
749     if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() )
750         m_xFrame->getContainerWindow()->setFocus();
751 }
752 
753 // -----------------------------------------------------------------------
754 
755 void SvxFontNameBox_Impl::EnableControls_Impl()
756 {
757 	SvtFontOptions aFontOpt;
758 	sal_Bool bEnable = aFontOpt.IsFontHistoryEnabled();
759 	sal_uInt16 nEntries = bEnable ? MAX_MRU_FONTNAME_ENTRIES : 0;
760 	if ( GetMaxMRUCount() != nEntries )
761 	{
762 		// refill in the next GetFocus-Handler
763 		pFontList = NULL;
764 		Clear();
765 		SetMaxMRUCount( nEntries );
766 	}
767 
768 	bEnable = aFontOpt.IsFontWYSIWYGEnabled();
769 	EnableWYSIWYG( bEnable );
770 	EnableSymbols( bEnable );
771 }
772 
773 // -----------------------------------------------------------------------
774 
775 void SvxFontNameBox_Impl::Select()
776 {
777 	FontNameBox::Select();
778 
779 	if ( !IsTravelSelect() )
780 	{
781 		if ( pFontList )
782 		{
783 			FontInfo aInfo( pFontList->Get( GetText(),
784 											aCurFont.GetWeight(),
785 											aCurFont.GetItalic() ) );
786 			aCurFont = aInfo;
787 
788 			SvxFontItem aFontItem( aInfo.GetFamily(),
789 								   aInfo.GetName(),
790 								   aInfo.GetStyleName(),
791 								   aInfo.GetPitch(),
792 								   aInfo.GetCharSet(),
793 								   SID_ATTR_CHAR_FONT );
794 
795             Any a;
796             Sequence< PropertyValue > aArgs( 1 );
797             aArgs[0].Name   = OUString( RTL_CONSTASCII_USTRINGPARAM( "CharFontName" ));
798             aFontItem.QueryValue( a );
799             aArgs[0].Value  = a;
800 
801             //  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
802             //  This instance may be deleted in the meantime (i.e. when a dialog is opened
803             //  while in Dispatch()), accessing members will crash in this case.
804             ReleaseFocus_Impl();
805 
806             SfxToolBoxControl::Dispatch( m_xDispatchProvider,
807                                          OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharFontName" )),
808                                          aArgs );
809 		}
810         else
811             ReleaseFocus_Impl();
812 	}
813 }
814 
815 //========================================================================
816 // class SvxColorWindow_Impl --------------------------------------------------
817 //========================================================================
818 #ifndef WB_NO_DIRECTSELECT
819 #define WB_NO_DIRECTSELECT      ((WinBits)0x04000000)
820 #endif
821 
822 #define PALETTE_X 10
823 #define PALETTE_Y 11
824 #define PALETTE_SIZE (PALETTE_X * PALETTE_Y)
825 
826 SvxColorWindow_Impl::SvxColorWindow_Impl( const OUString&            rCommand,
827                                           sal_uInt16                     nSlotId,
828                                           const Reference< XFrame >& rFrame,
829 								          const String&              rWndTitle,
830                                           Window*                    pParentWindow ) :
831 
832     SfxPopupWindow( nSlotId, rFrame, pParentWindow, WinBits( WB_BORDER | WB_STDFLOATWIN | WB_3DLOOK|WB_DIALOGCONTROL ) ),
833 
834 	theSlotId( nSlotId ),
835     aColorSet( this, WinBits( WB_ITEMBORDER | WB_NAMEFIELD | WB_3DLOOK | WB_NO_DIRECTSELECT) ),
836     maCommand( rCommand )
837 
838 {
839 	SfxObjectShell* pDocSh = SfxObjectShell::Current();
840 	const SfxPoolItem* pItem = NULL;
841 	XColorTable* pColorTable = NULL;
842 	sal_Bool bKillTable = sal_False;
843     const Size aSize12( 13, 13 );
844 
845 	if ( pDocSh )
846 		if ( 0 != ( pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) )
847 			pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable();
848 
849 	if ( !pColorTable )
850 	{
851 		pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() );
852 		bKillTable = sal_True;
853 	}
854 
855 	if ( SID_ATTR_CHAR_COLOR_BACKGROUND == theSlotId || SID_BACKGROUND_COLOR == theSlotId )
856 	{
857 		aColorSet.SetStyle( aColorSet.GetStyle() | WB_NONEFIELD );
858 		aColorSet.SetText( SVX_RESSTR( RID_SVXSTR_TRANSPARENT ) );
859 		aColorSet.SetAccessibleName( SVX_RESSTR( RID_SVXSTR_BACKGROUND ) );
860 	}
861     else if ( SID_ATTR_CHAR_COLOR == theSlotId || SID_ATTR_CHAR_COLOR2 == theSlotId || SID_EXTRUSION_3D_COLOR == theSlotId )
862 	{
863         SfxPoolItem* pDummy;
864 
865 		Reference< XDispatchProvider > aDisp( GetFrame()->getController(), UNO_QUERY );
866         SfxQueryStatus aQueryStatus( aDisp,
867                                      SID_ATTR_AUTO_COLOR_INVALID,
868                                      rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:AutoColorInvalid" )));
869         SfxItemState eState = aQueryStatus.QueryState( pDummy );
870         if( (SFX_ITEM_DEFAULT > eState) || ( SID_EXTRUSION_3D_COLOR == theSlotId ) )
871         {
872             aColorSet.SetStyle( aColorSet.GetStyle() | WB_NONEFIELD );
873             aColorSet.SetText( SVX_RESSTR( RID_SVXSTR_AUTOMATIC ) );
874 			aColorSet.SetAccessibleName( SVX_RESSTR( RID_SVXSTR_TEXTCOLOR ) );
875         }
876 	}
877 	else
878 	{
879 		aColorSet.SetAccessibleName( SVX_RESSTR( RID_SVXSTR_FRAME_COLOR ) );
880 	}
881 
882 	if ( pColorTable )
883 	{
884 		short i = 0;
885 		long nCount = pColorTable->Count();
886 		XColorEntry* pEntry = NULL;
887 		::Color aColWhite( COL_WHITE );
888 		String aStrWhite( EditResId(RID_SVXITEMS_COLOR_WHITE) );
889 
890         if ( nCount > PALETTE_SIZE )
891             // Show scrollbar if more than PALLETTE_SIZE colors are available
892 			aColorSet.SetStyle( aColorSet.GetStyle() | WB_VSCROLL );
893 
894 		for ( i = 0; i < nCount; i++ )
895 		{
896 			pEntry = pColorTable->GetColor(i);
897 			aColorSet.InsertItem( i+1, pEntry->GetColor(), pEntry->GetName() );
898 		}
899 
900         while ( i < PALETTE_SIZE )
901 		{
902             // fill empty elements if less then PALLETTE_SIZE colors are available
903 			aColorSet.InsertItem( i+1, aColWhite, aStrWhite );
904 			i++;
905 		}
906 	}
907 
908     aColorSet.SetSelectHdl( LINK( this, SvxColorWindow_Impl, SelectHdl ) );
909     aColorSet.SetColCount( PALETTE_X );
910     aColorSet.SetLineCount( PALETTE_Y );
911 
912 	lcl_CalcSizeValueSet( *this, aColorSet, aSize12 );
913 
914 	SetHelpId( HID_POPUP_COLOR );
915 	aColorSet.SetHelpId( HID_POPUP_COLOR_CTRL );
916 
917 	SetText( rWndTitle );
918 	aColorSet.Show();
919 
920     AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
921 	if ( bKillTable )
922 		delete pColorTable;
923 }
924 
925 SvxColorWindow_Impl::~SvxColorWindow_Impl()
926 {
927 }
928 
929 void SvxColorWindow_Impl::KeyInput( const KeyEvent& rKEvt )
930 {
931     aColorSet.KeyInput(rKEvt);
932 }
933 
934 SfxPopupWindow* SvxColorWindow_Impl::Clone() const
935 {
936     return new SvxColorWindow_Impl( maCommand, theSlotId, GetFrame(), GetText(), GetParent() );
937 }
938 
939 // -----------------------------------------------------------------------
940 
941 IMPL_LINK( SvxColorWindow_Impl, SelectHdl, void *, EMPTYARG )
942 {
943 	sal_uInt16 nItemId = aColorSet.GetSelectItemId();
944     SvxColorItem aColorItem( aColorSet.GetItemColor( nItemId ), theSlotId );
945 
946     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() calls.
947         This instance may be deleted in the meantime (i.e. when a dialog is opened
948         while in Dispatch()), accessing members will crash in this case. */
949     aColorSet.SetNoSelection();
950 
951 	if ( IsInPopupMode() )
952 		EndPopupMode();
953 
954 	if ( !nItemId && ( SID_ATTR_CHAR_COLOR_BACKGROUND == theSlotId  || SID_BACKGROUND_COLOR == theSlotId ) )
955     {
956 		Sequence< PropertyValue > aArgs;
957         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
958                                      maCommand,
959                                      aArgs );
960     }
961     else if ( !nItemId && (SID_ATTR_CHAR_COLOR == theSlotId || SID_ATTR_CHAR_COLOR2  == theSlotId || SID_EXTRUSION_3D_COLOR == theSlotId) )
962     {
963         SvxColorItem _aColorItem( COL_AUTO, theSlotId );
964         INetURLObject aObj( maCommand );
965 
966         Any a;
967         Sequence< PropertyValue > aArgs( 1 );
968         aArgs[0].Name = aObj.GetURLPath();
969         _aColorItem.QueryValue( a );
970         aArgs[0].Value = a;
971         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
972                                      maCommand,
973                                      aArgs );
974     }
975     else
976 	{
977         INetURLObject aObj( maCommand );
978 
979         Any a;
980         Sequence< PropertyValue > aArgs( 1 );
981         aArgs[0].Name = aObj.GetURLPath();
982         aColorItem.QueryValue( a );
983         aArgs[0].Value = a;
984         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
985                                      maCommand,
986                                      aArgs );
987 	}
988 
989 	return 0;
990 }
991 
992 // -----------------------------------------------------------------------
993 
994 void SvxColorWindow_Impl::Resize()
995 {
996 	lcl_ResizeValueSet( *this, aColorSet);
997 }
998 
999 // -----------------------------------------------------------------------
1000 
1001 void SvxColorWindow_Impl::StartSelection()
1002 {
1003 	aColorSet.StartSelection();
1004 }
1005 
1006 // -----------------------------------------------------------------------
1007 
1008 sal_Bool SvxColorWindow_Impl::Close()
1009 {
1010 	return SfxPopupWindow::Close();
1011 }
1012 
1013 // -----------------------------------------------------------------------
1014 
1015 void SvxColorWindow_Impl::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1016 {
1017     if (( SFX_ITEM_DISABLED != eState ) && pState )
1018     {
1019         if (( nSID == SID_COLOR_TABLE ) && ( pState->ISA( SvxColorTableItem )))
1020         {
1021 	        XColorTable* pColorTable = pState ? ((SvxColorTableItem *)pState)->GetColorTable() : NULL;
1022 
1023 			if ( pColorTable )
1024 			{
1025 				// Die Liste der Farben (ColorTable) hat sich ge"andert:
1026 				short i = 0;
1027 				long nCount = pColorTable->Count();
1028 				XColorEntry* pEntry = NULL;
1029 				::Color aColWhite( COL_WHITE );
1030 				String aStrWhite( SVX_RES( RID_SVXITEMS_COLOR_WHITE ) );
1031 
1032 				// ScrollBar an oder aus
1033 				WinBits nBits = aColorSet.GetStyle();
1034         		if ( nCount > PALETTE_SIZE )
1035 					nBits &= ~WB_VSCROLL;
1036 				else
1037 					nBits |= WB_VSCROLL;
1038 				aColorSet.SetStyle( nBits );
1039 
1040 				for ( i = 0; i < nCount; ++i )
1041 				{
1042 					pEntry = pColorTable->GetColor(i);
1043 					aColorSet.SetItemColor( i + 1, pEntry->GetColor() );
1044 					aColorSet.SetItemText ( i + 1, pEntry->GetName() );
1045 				}
1046 
1047         		while ( i < PALETTE_SIZE )
1048 				{
1049 					aColorSet.SetItemColor( i + 1, aColWhite );
1050 					aColorSet.SetItemText ( i + 1, aStrWhite );
1051 					i++;
1052 				}
1053 			}
1054 		}
1055 	}
1056 }
1057 
1058 //========================================================================
1059 // class SvxFrameWindow_Impl --------------------------------------------------
1060 //========================================================================
1061 
1062 SvxFrameWindow_Impl::SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, Window* pParentWindow ) :
1063 
1064 	SfxPopupWindow( nId, rFrame, pParentWindow, WinBits( WB_BORDER | WB_STDFLOATWIN | WB_3DLOOK | WB_DIALOGCONTROL ) ),
1065     aFrameSet   ( this, WinBits( WB_ITEMBORDER | WB_DOUBLEBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
1066     bParagraphMode(sal_False)
1067 
1068 {
1069     BindListener();
1070     String sCommand(String::CreateFromAscii( ".uno:BorderReducedMode" ));
1071     AddStatusListener( sCommand );
1072     aImgList = ImageList( SVX_RES( IsHighContrast()? RID_SVXIL_FRAME_HC : RID_SVXIL_FRAME ) );
1073 
1074 	/*
1075 	 *  1       2        3         4
1076 	 *  -------------------------------------
1077 	 *	NONE    LEFT     RIGHT     LEFTRIGHT
1078 	 *	TOP     BOTTOM   TOPBOTTOM OUTER
1079 	 *  -------------------------------------
1080 	 *	HOR	    HORINNER VERINNER	ALL			<- kann ueber bParagraphMode
1081 	 *                                             abgeschaltet werden
1082 	 */
1083 
1084 	sal_uInt16 i = 0;
1085 
1086 	for ( i=1; i<9; i++ )
1087 		aFrameSet.InsertItem( i, aImgList.GetImage(i) );
1088 
1089     //bParagraphMode should have been set in StateChanged
1090     if ( !bParagraphMode )
1091 		for ( i = 9; i < 13; i++ )
1092 			aFrameSet.InsertItem( i, aImgList.GetImage(i) );
1093 
1094 	aFrameSet.SetColCount( 4 );
1095     aFrameSet.SetSelectHdl( LINK( this, SvxFrameWindow_Impl, SelectHdl ) );
1096 
1097 	lcl_CalcSizeValueSet( *this, aFrameSet,Size( 20, 20 ));
1098 
1099 	SetHelpId( HID_POPUP_FRAME );
1100 	SetText( SVX_RESSTR(RID_SVXSTR_FRAME) );
1101 	aFrameSet.SetAccessibleName( SVX_RESSTR(RID_SVXSTR_FRAME) );
1102 	aFrameSet.Show();
1103 }
1104 /*-- 22.09.2004 12:27:50---------------------------------------------------
1105 
1106   -----------------------------------------------------------------------*/
1107 SvxFrameWindow_Impl::~SvxFrameWindow_Impl()
1108 {
1109     UnbindListener();
1110 }
1111 
1112 SfxPopupWindow* SvxFrameWindow_Impl::Clone() const
1113 {
1114 	//! HACK: wie bekomme ich den Paragraph-Mode ??
1115     return new SvxFrameWindow_Impl( GetId(), GetFrame(), GetParent() );
1116 }
1117 
1118 Window* SvxFrameWindow_Impl::GetPreferredKeyInputWindow()
1119 {
1120 	return &aFrameSet;
1121 }
1122 
1123 void SvxFrameWindow_Impl::GetFocus()
1124 {
1125 	aFrameSet.GrabFocus();
1126 }
1127 
1128 void SvxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
1129 {
1130 	SfxPopupWindow::DataChanged( rDCEvt );
1131 
1132 	if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
1133 	{
1134 		aImgList = ImageList( SVX_RES( IsHighContrast()? RID_SVXIL_FRAME_HC : RID_SVXIL_FRAME ) );
1135 
1136 		sal_uInt16	nNumOfItems = aFrameSet.GetItemCount();
1137 
1138 		for( sal_uInt16 i = 1 ; i <= nNumOfItems ; ++i )
1139 			aFrameSet.SetItemImage( i, aImgList.GetImage( i ) );
1140 	}
1141 }
1142 // -----------------------------------------------------------------------
1143 
1144 #define FRM_VALID_LEFT 		0x01
1145 #define FRM_VALID_RIGHT 	0x02
1146 #define FRM_VALID_TOP 		0x04
1147 #define FRM_VALID_BOTTOM 	0x08
1148 #define FRM_VALID_HINNER 	0x10
1149 #define FRM_VALID_VINNER 	0x20
1150 #define FRM_VALID_OUTER		0x0f
1151 #define FRM_VALID_ALL       0xff
1152 
1153 //
1154 // Per default bleiben ungesetzte Linien unveraendert
1155 // Mit Shift werden ungesetzte Linien zurueckgsetzt
1156 //
1157 IMPL_LINK( SvxFrameWindow_Impl, SelectHdl, void *, EMPTYARG )
1158 {
1159 	::Color				aColBlack( COL_BLACK );
1160 	SvxBoxItem			aBorderOuter( SID_ATTR_BORDER_OUTER );
1161 	SvxBoxInfoItem		aBorderInner( SID_ATTR_BORDER_INNER );
1162 	SvxBorderLine		theDefLine;
1163     SvxBorderLine       *pLeft = 0,
1164 						*pRight = 0,
1165 						*pTop = 0,
1166 						*pBottom = 0;
1167 	sal_uInt16				nSel = aFrameSet.GetSelectItemId();
1168 	sal_uInt16 				nModifier = aFrameSet.GetModifier();
1169 	sal_uInt8 				nValidFlags = 0;
1170 
1171     theDefLine.SetOutWidth( DEF_LINE_WIDTH_0 );
1172 	switch ( nSel )
1173 	{
1174 		case 1: nValidFlags |= FRM_VALID_ALL;
1175 		break;	// NONE
1176 		case 2: pLeft = &theDefLine;
1177 				nValidFlags |= FRM_VALID_LEFT;
1178 		break;	// LEFT
1179 		case 3: pRight = &theDefLine;
1180 				nValidFlags |= FRM_VALID_RIGHT;
1181 		break;	// RIGHT
1182 		case 4: pLeft = pRight = &theDefLine;
1183 				nValidFlags |= 	FRM_VALID_RIGHT|FRM_VALID_LEFT;
1184 		break;	// LEFTRIGHT
1185 		case 5: pTop = &theDefLine;
1186 				nValidFlags |= FRM_VALID_TOP;
1187 		break;	// TOP
1188 		case 6: pBottom = &theDefLine;
1189 				nValidFlags |= FRM_VALID_BOTTOM;
1190 		break;	// BOTTOM
1191 		case 7: pTop =  pBottom = &theDefLine;
1192 				nValidFlags |= FRM_VALID_BOTTOM|FRM_VALID_TOP;
1193 		break;	// TOPBOTTOM
1194 		case 8: pLeft = pRight = pTop = pBottom = &theDefLine;
1195 				nValidFlags |= FRM_VALID_OUTER;
1196 		break;	// OUTER
1197 
1198 		// Tabelle innen:
1199 		case 9: // HOR
1200 			pTop = pBottom = &theDefLine;
1201 			aBorderInner.SetLine( &theDefLine, BOXINFO_LINE_HORI );
1202 			aBorderInner.SetLine( NULL, BOXINFO_LINE_VERT );
1203 			nValidFlags |= FRM_VALID_HINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
1204 			break;
1205 
1206 		case 10: // HORINNER
1207 			pLeft = pRight = pTop = pBottom = &theDefLine;
1208 			aBorderInner.SetLine( &theDefLine, BOXINFO_LINE_HORI );
1209 			aBorderInner.SetLine( NULL, BOXINFO_LINE_VERT );
1210 			nValidFlags |= FRM_VALID_RIGHT|FRM_VALID_LEFT|FRM_VALID_HINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
1211 			break;
1212 
1213 		case 11: // VERINNER
1214 			pLeft = pRight = pTop = pBottom = &theDefLine;
1215 			aBorderInner.SetLine( NULL, BOXINFO_LINE_HORI );
1216 			aBorderInner.SetLine( &theDefLine, BOXINFO_LINE_VERT );
1217 			nValidFlags |= FRM_VALID_RIGHT|FRM_VALID_LEFT|FRM_VALID_VINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
1218 		break;
1219 
1220 		case 12: // ALL
1221 			pLeft = pRight = pTop = pBottom = &theDefLine;
1222 			aBorderInner.SetLine( &theDefLine, BOXINFO_LINE_HORI );
1223 			aBorderInner.SetLine( &theDefLine, BOXINFO_LINE_VERT );
1224 			nValidFlags |= FRM_VALID_ALL;
1225 			break;
1226 
1227 		default:
1228 		break;
1229 	}
1230 	aBorderOuter.SetLine( pLeft, BOX_LINE_LEFT );
1231 	aBorderOuter.SetLine( pRight, BOX_LINE_RIGHT );
1232 	aBorderOuter.SetLine( pTop, BOX_LINE_TOP );
1233 	aBorderOuter.SetLine( pBottom, BOX_LINE_BOTTOM );
1234 
1235 	if(nModifier == KEY_SHIFT)
1236 		nValidFlags |= FRM_VALID_ALL;
1237 	aBorderInner.SetValid( VALID_TOP, 		0 != (nValidFlags&FRM_VALID_TOP ));
1238 	aBorderInner.SetValid( VALID_BOTTOM, 	0 != (nValidFlags&FRM_VALID_BOTTOM ));
1239 	aBorderInner.SetValid( VALID_LEFT, 		0 != (nValidFlags&FRM_VALID_LEFT));
1240 	aBorderInner.SetValid( VALID_RIGHT, 	0 != (nValidFlags&FRM_VALID_RIGHT ));
1241 	aBorderInner.SetValid( VALID_HORI, 		0 != (nValidFlags&FRM_VALID_HINNER ));
1242 	aBorderInner.SetValid( VALID_VERT, 		0 != (nValidFlags&FRM_VALID_VINNER));
1243 	aBorderInner.SetValid( VALID_DISTANCE, sal_True );
1244 	aBorderInner.SetValid( VALID_DISABLE, sal_False );
1245 
1246 	if ( IsInPopupMode() )
1247 		EndPopupMode();
1248 
1249     Any a;
1250     Sequence< PropertyValue > aArgs( 2 );
1251     aArgs[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "OuterBorder" ));
1252     aBorderOuter.QueryValue( a );
1253     aArgs[0].Value = a;
1254     aArgs[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "InnerBorder" ));
1255     aBorderInner.QueryValue( a );
1256     aArgs[1].Value = a;
1257 
1258     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
1259         This instance may be deleted in the meantime (i.e. when a dialog is opened
1260         while in Dispatch()), accessing members will crash in this case. */
1261     aFrameSet.SetNoSelection();
1262 
1263     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
1264                                  OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SetBorderStyle" )),
1265                                  aArgs );
1266 	return 0;
1267 }
1268 
1269 // -----------------------------------------------------------------------
1270 
1271 void SvxFrameWindow_Impl::Resize()
1272 {
1273 	lcl_ResizeValueSet( *this, aFrameSet);
1274 }
1275 
1276 // -----------------------------------------------------------------------
1277 
1278 void SvxFrameWindow_Impl::StateChanged(
1279 
1280 	sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1281 
1282 {
1283     if ( pState && nSID == SID_BORDER_REDUCED_MODE)
1284 	{
1285         const SfxBoolItem* pItem = PTR_CAST( SfxBoolItem, pState );
1286 
1287 		if ( pItem )
1288 		{
1289             bParagraphMode = (sal_Bool)pItem->GetValue();
1290             //initial calls mustn't insert or remove elements
1291             if(aFrameSet.GetItemCount())
1292             {
1293 			    sal_Bool bTableMode = ( aFrameSet.GetItemCount() == 12 );
1294 			    sal_Bool bResize    = sal_False;
1295 
1296                 if ( bTableMode && bParagraphMode )
1297 			    {
1298 				    for ( sal_uInt16 i = 9; i < 13; i++ )
1299 					    aFrameSet.RemoveItem(i);
1300 				    bResize = sal_True;
1301 			    }
1302                 else if ( !bTableMode && !bParagraphMode )
1303 			    {
1304 				    for ( sal_uInt16 i = 9; i < 13; i++ )
1305 					    aFrameSet.InsertItem( i, aImgList.GetImage(i) );
1306 				    bResize = sal_True;
1307 			    }
1308 
1309 			    if ( bResize )
1310 			    {
1311 				    lcl_CalcSizeValueSet( *this, aFrameSet,Size( 20, 20 ));
1312 			    }
1313             }
1314 		}
1315 	}
1316 	SfxPopupWindow::StateChanged( nSID, eState, pState );
1317 }
1318 
1319 // -----------------------------------------------------------------------
1320 
1321 void SvxFrameWindow_Impl::StartSelection()
1322 {
1323 	aFrameSet.StartSelection();
1324 }
1325 
1326 // -----------------------------------------------------------------------
1327 
1328 sal_Bool SvxFrameWindow_Impl::Close()
1329 {
1330 	return SfxPopupWindow::Close();
1331 }
1332 
1333 //========================================================================
1334 // class SvxLineWindow_Impl --------------------------------------------------
1335 //========================================================================
1336 
1337 SvxLineWindow_Impl::SvxLineWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, Window* pParentWindow ) :
1338 
1339 	SfxPopupWindow( nId, rFrame, pParentWindow, WinBits( WB_BORDER | WB_STDFLOATWIN | WB_3DLOOK | WB_DIALOGCONTROL ) ),
1340 
1341 	aLineSet( this, WinBits( WB_3DLOOK | WB_ITEMBORDER | WB_DOUBLEBORDER | WB_NAMEFIELD | WB_NONEFIELD | WB_NO_DIRECTSELECT ) )
1342 {
1343     try
1344     {
1345         Reference< lang::XServiceInfo > xServices( rFrame->getController()->getModel(), UNO_QUERY_THROW );
1346         m_bIsWriter = xServices->supportsService(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextDocument")));
1347 	}
1348 	catch(const uno::Exception& )
1349 	{
1350 	}
1351 	Size	aBmpSize( 55, 12 );
1352 	CreateBitmaps();
1353 
1354 	aLineSet.SetColCount( 2 );
1355     aLineSet.SetSelectHdl( LINK( this, SvxLineWindow_Impl, SelectHdl ) );
1356 	aLineSet.SetText( SVX_RESSTR(RID_SVXSTR_NONE) );
1357 
1358 	aLineSet.SetAccessibleName( SVX_RESSTR(RID_SVXSTR_FRAME_STYLE) );
1359 	lcl_CalcSizeValueSet( *this, aLineSet, aBmpSize );
1360 
1361 	SetHelpId( HID_POPUP_LINE );
1362 	SetText( SVX_RESSTR(RID_SVXSTR_FRAME_STYLE) );
1363 	aLineSet.Show();
1364 }
1365 
1366 SfxPopupWindow* SvxLineWindow_Impl::Clone() const
1367 {
1368     return new SvxLineWindow_Impl( GetId(), GetFrame(), GetParent() );
1369 }
1370 
1371 // -----------------------------------------------------------------------
1372 
1373 void SvxLineWindow_Impl::MakeLineBitmap( sal_uInt16 nNo, Bitmap& rBmp, const Size& rSize, String& rStr,
1374 											const ::Color& rLineCol, const ::Color& rBackCol )
1375 {
1376 	VirtualDevice	aVirDev( *this );
1377 	Rectangle		aRect( Point(2,0), Size(rSize.Width()-4,0) );
1378 
1379 	// grau einfaerben und Bitmap sichern:
1380 	aVirDev.SetOutputSizePixel( rSize );
1381 	aVirDev.SetLineColor();
1382 	aVirDev.SetFillColor( rBackCol );
1383 	aVirDev.DrawRect( Rectangle( Point(0,0), rSize ) );
1384 	aVirDev.SetFillColor( rLineCol );
1385 
1386     sal_uInt16 nLineWidth = 0;
1387 	switch ( nNo )
1388 	{
1389 		case 1: // DEF_LINE_WIDTH_0
1390 			aRect.Top() 	= 6;
1391 			aRect.Bottom()	= 6;
1392 			aVirDev.DrawRect( aRect );
1393 			break;
1394 
1395 		case 2: // DEF_LINE_WIDTH_1
1396 			aRect.Top() 	= 5;
1397 			aRect.Bottom()	= 6;
1398 			aVirDev.DrawRect( aRect );
1399 			nLineWidth = (sal_uInt16) DEF_LINE_WIDTH_1/20;
1400 			break;
1401 
1402 		case 3: // DEF_LINE_WIDTH_2
1403 			aRect.Top() 	= 5;
1404 			aRect.Bottom()	= 7;
1405 			aVirDev.DrawRect( aRect );
1406 			nLineWidth = (sal_uInt16) DEF_LINE_WIDTH_2/20;
1407 			break;
1408 
1409 		case 4: // DEF_LINE_WIDTH_3
1410 			aRect.Top() 	= 4;
1411 			aRect.Bottom()	= 7;
1412 			aVirDev.DrawRect( aRect );
1413 			aVirDev.DrawRect( Rectangle( Point(2,4), Point(37,7) ) );
1414 			nLineWidth = (sal_uInt16) DEF_LINE_WIDTH_3/20;
1415 			break;
1416 
1417 		case 5: // DEF_LINE_WIDTH_4
1418 			aRect.Top() 	= 4;
1419 			aRect.Bottom()	= 8;
1420 			aVirDev.DrawRect( aRect );
1421 			nLineWidth = (sal_uInt16) DEF_LINE_WIDTH_4/20;
1422 			break;
1423 
1424 		case 6: // DEF_DOUBLE_LINE0
1425 			aRect.Top() 	= 5;
1426 			aRect.Bottom()	= 5;
1427 			aVirDev.DrawRect( aRect );
1428 			aRect.Top() 	= 7;
1429 			aRect.Bottom()	= 7;
1430 			aVirDev.DrawRect( aRect );
1431 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE0_OUT+DEF_DOUBLE_LINE0_IN+DEF_DOUBLE_LINE0_DIST)/20;
1432 			break;
1433 
1434 		case 7: // DEF_DOUBLE_LINE7
1435 			aRect.Top() 	= 4;
1436 			aRect.Bottom()	= 4;
1437 			aVirDev.DrawRect( aRect );
1438 			aRect.Top() 	= 7;
1439 			aRect.Bottom()	= 7;
1440 			aVirDev.DrawRect( aRect );
1441 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE7_OUT+DEF_DOUBLE_LINE7_IN+DEF_DOUBLE_LINE7_DIST)/20;
1442 			break;
1443 
1444 		case 8: // DEF_DOUBLE_LINE1
1445 			aRect.Top() 	= 4;
1446 			aRect.Bottom()	= 5;
1447 			aVirDev.DrawRect( aRect );
1448 			aRect.Top() 	= 7;
1449 			aRect.Bottom()	= 8;
1450 			aVirDev.DrawRect( aRect );
1451 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE1_OUT+DEF_DOUBLE_LINE1_IN+DEF_DOUBLE_LINE1_DIST)/20;
1452 			break;
1453 
1454 		case 9: // DEF_DOUBLE_LINE2
1455 			aRect.Top() 	= 3;
1456 			aRect.Bottom()	= 5;
1457 			aVirDev.DrawRect( aRect );
1458 			aRect.Top() 	= 8;
1459 			aRect.Bottom()	= 10;
1460 			aVirDev.DrawRect( aRect );
1461 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE2_OUT+DEF_DOUBLE_LINE2_IN+DEF_DOUBLE_LINE2_DIST)/20;
1462 			break;
1463 
1464 		case 10: // DEF_DOUBLE_LINE8
1465 			aRect.Top() 	= 3;
1466 			aRect.Bottom()	= 4;
1467 			aVirDev.DrawRect( aRect );
1468 			aRect.Top() 	= 7;
1469 			aRect.Bottom()	= 7;
1470 			aVirDev.DrawRect( aRect );
1471 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE8_OUT+DEF_DOUBLE_LINE8_IN+DEF_DOUBLE_LINE8_DIST)/20;
1472 			break;
1473 
1474 		case 11: // DEF_DOUBLE_LINE9
1475 			aRect.Top() 	= 3;
1476 			aRect.Bottom()	= 5;
1477 			aVirDev.DrawRect( aRect );
1478 			aRect.Top() 	= 8;
1479 			aRect.Bottom()	= 8;
1480 			aVirDev.DrawRect( aRect );
1481 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE9_OUT+DEF_DOUBLE_LINE9_IN+DEF_DOUBLE_LINE9_DIST)/20;
1482 			break;
1483 
1484 		case 12: // DEF_DOUBLE_LINE10
1485 			aRect.Top() 	= 2;
1486 			aRect.Bottom()	= 5;
1487 			aVirDev.DrawRect( aRect );
1488 			aRect.Top() 	= 8;
1489 			aRect.Bottom()	= 8;
1490 			aVirDev.DrawRect( aRect );
1491 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE10_OUT+DEF_DOUBLE_LINE10_IN+DEF_DOUBLE_LINE10_DIST)/20;
1492 			break;
1493 
1494 		case 13: // DEF_DOUBLE_LINE3
1495 			aRect.Top() 	= 4;
1496 			aRect.Bottom()	= 5;
1497 			aVirDev.DrawRect( aRect );
1498 			aRect.Top() 	= 7;
1499 			aRect.Bottom()	= 7;
1500 			aVirDev.DrawRect( aRect );
1501 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE3_OUT+DEF_DOUBLE_LINE3_IN+DEF_DOUBLE_LINE3_DIST)/20;
1502 			break;
1503 
1504 		case 14: // DEF_DOUBLE_LINE4
1505 			aRect.Top() 	= 4;
1506 			aRect.Bottom()	= 4;
1507 			aVirDev.DrawRect( aRect );
1508 			aRect.Top() 	= 6;
1509 			aRect.Bottom()	= 7;
1510 			aVirDev.DrawRect( aRect );
1511 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE4_OUT+DEF_DOUBLE_LINE4_IN+DEF_DOUBLE_LINE4_DIST)/20;
1512 			break;
1513 
1514 		case 15: // DEF_DOUBLE_LINE5
1515 			aRect.Top() 	= 3;
1516 			aRect.Bottom()	= 5;
1517 			aVirDev.DrawRect( aRect );
1518 			aRect.Top() 	= 8;
1519 			aRect.Bottom()	= 9;
1520 			aVirDev.DrawRect( aRect );
1521 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE5_OUT+DEF_DOUBLE_LINE5_IN+DEF_DOUBLE_LINE5_DIST)/20;
1522 			break;
1523 
1524 		case 16: // DEF_DOUBLE_LINE6
1525 			aRect.Top() 	= 3;
1526 			aRect.Bottom()	= 4;
1527 			aVirDev.DrawRect( aRect );
1528 			aRect.Top() 	= 7;
1529 			aRect.Bottom()	= 9;
1530 			aVirDev.DrawRect( aRect );
1531 			nLineWidth = (sal_uInt16) (DEF_DOUBLE_LINE6_OUT+DEF_DOUBLE_LINE6_IN+DEF_DOUBLE_LINE6_DIST)/20;
1532 			break;
1533 
1534 		default:
1535 			break;
1536 	}
1537     if ( nLineWidth )
1538     {
1539         rStr = String::CreateFromInt32( nLineWidth );
1540 	    rStr.AppendAscii(" pt");
1541     }
1542 	rBmp = aVirDev.GetBitmap( Point(0,0), rSize );
1543 }
1544 
1545 // -----------------------------------------------------------------------
1546 
1547 IMPL_LINK( SvxLineWindow_Impl, SelectHdl, void *, EMPTYARG )
1548 {
1549     SvxLineItem     aLineItem( SID_FRAME_LINESTYLE );
1550 	sal_uInt16			n1 = 0,
1551 					n2 = 0,
1552 					n3 = 0;
1553 	sal_Bool			bSetLine = sal_True;
1554 
1555 	switch ( aLineSet.GetSelectItemId() )
1556 	{
1557 		case  1: n1 = DEF_LINE_WIDTH_0; break;
1558 		case  2: n1 = DEF_LINE_WIDTH_1; break;
1559 		case  3: n1 = DEF_LINE_WIDTH_2; break;
1560 		case  4: n1 = DEF_LINE_WIDTH_3; break;
1561 		case  5: n1 = DEF_LINE_WIDTH_4; break;
1562 
1563 		case  6: n1 = DEF_DOUBLE_LINE0_OUT;
1564 				 n2 = DEF_DOUBLE_LINE0_IN;
1565 				 n3 = DEF_DOUBLE_LINE0_DIST;	 break;
1566 		case  7: n1 = DEF_DOUBLE_LINE7_OUT;
1567 				 n2 = DEF_DOUBLE_LINE7_IN;
1568 				 n3 = DEF_DOUBLE_LINE7_DIST;	 break;
1569 		case  8: n1 = DEF_DOUBLE_LINE1_OUT;
1570 				 n2 = DEF_DOUBLE_LINE1_IN;
1571 				 n3 = DEF_DOUBLE_LINE1_DIST;	 break;
1572 		case  9: n1 = DEF_DOUBLE_LINE2_OUT;
1573 				 n2 = DEF_DOUBLE_LINE2_IN;
1574 				 n3 = DEF_DOUBLE_LINE2_DIST;	 break;
1575 		case 10: n1 = DEF_DOUBLE_LINE8_OUT;
1576 				 n2 = DEF_DOUBLE_LINE8_IN;
1577 				 n3 = DEF_DOUBLE_LINE8_DIST;	 break;
1578 		case 11: n1 = DEF_DOUBLE_LINE9_OUT;
1579 				 n2 = DEF_DOUBLE_LINE9_IN;
1580 				 n3 = DEF_DOUBLE_LINE9_DIST;	 break;
1581 		case 12: n1 = DEF_DOUBLE_LINE10_OUT;
1582 				 n2 = DEF_DOUBLE_LINE10_IN;
1583 				 n3 = DEF_DOUBLE_LINE10_DIST; break;
1584 		case 13: n1 = DEF_DOUBLE_LINE3_OUT;
1585 				 n2 = DEF_DOUBLE_LINE3_IN;
1586 				 n3 = DEF_DOUBLE_LINE3_DIST;	 break;
1587 		case 14: n1 = DEF_DOUBLE_LINE4_OUT;
1588 				 n2 = DEF_DOUBLE_LINE4_IN;
1589 				 n3 = DEF_DOUBLE_LINE4_DIST;	 break;
1590 		case 15: n1 = DEF_DOUBLE_LINE5_OUT;
1591 				 n2 = DEF_DOUBLE_LINE5_IN;
1592 				 n3 = DEF_DOUBLE_LINE5_DIST;	 break;
1593 		case 16: n1 = DEF_DOUBLE_LINE6_OUT;
1594 				 n2 = DEF_DOUBLE_LINE6_IN;
1595 				 n3 = DEF_DOUBLE_LINE6_DIST;	 break;
1596 		case  0:
1597 		default:
1598 			bSetLine = sal_False;
1599 			break;
1600 	}
1601 	if ( bSetLine )
1602 	{
1603 		SvxBorderLine aTmp( NULL, n1, n2, n3 );
1604 		aLineItem.SetLine( &aTmp );
1605 	}
1606 	else
1607 		aLineItem.SetLine( 0 );
1608 
1609 	if ( IsInPopupMode() )
1610 		EndPopupMode();
1611 
1612     Any a;
1613 	Sequence< PropertyValue > aArgs( 1 );
1614     aArgs[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "LineStyle" ));
1615 	aLineItem.QueryValue( a, m_bIsWriter ? CONVERT_TWIPS : 0 );
1616     aArgs[0].Value = a;
1617 
1618     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
1619         This instance may be deleted in the meantime (i.e. when a dialog is opened
1620         while in Dispatch()), accessing members will crash in this case. */
1621     aLineSet.SetNoSelection();
1622 
1623     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
1624                                  OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineStyle" )),
1625                                  aArgs );
1626 	return 0;
1627 }
1628 
1629 // -----------------------------------------------------------------------
1630 
1631 void SvxLineWindow_Impl::Resize()
1632 {
1633 	lcl_ResizeValueSet( *this, aLineSet);
1634 }
1635 
1636 // -----------------------------------------------------------------------
1637 
1638 void SvxLineWindow_Impl::StartSelection()
1639 {
1640 	aLineSet.StartSelection();
1641 }
1642 
1643 // -----------------------------------------------------------------------
1644 
1645 sal_Bool SvxLineWindow_Impl::Close()
1646 {
1647 	return SfxPopupWindow::Close();
1648 }
1649 
1650 // -----------------------------------------------------------------------
1651 
1652 Window* SvxLineWindow_Impl::GetPreferredKeyInputWindow()
1653 {
1654 	return &aLineSet;
1655 }
1656 
1657 // -----------------------------------------------------------------------
1658 
1659 void SvxLineWindow_Impl::GetFocus()
1660 {
1661 	aLineSet.GrabFocus();
1662 }
1663 
1664 void SvxLineWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
1665 {
1666     SfxPopupWindow::DataChanged( rDCEvt );
1667 
1668 	if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
1669 	{
1670 		CreateBitmaps();
1671 		Invalidate();
1672 	}
1673 }
1674 
1675 void SvxLineWindow_Impl::CreateBitmaps( void )
1676 {
1677 	Size					aBmpSize( 55, 12 );
1678 	Bitmap					aBmp;
1679 	String					aStr;
1680 
1681 	const StyleSettings&	rStyleSettings = Application::GetSettings().GetStyleSettings();
1682 	svtools::ColorConfig aColorConfig;
1683 	::Color					aLineCol( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
1684 	::Color					aBackCol( rStyleSettings.GetWindowColor() );
1685 	aLineSet.Clear();
1686 
1687 	for( sal_uInt16 i = 1 ; i < 17 ; ++i )
1688 	{
1689 		MakeLineBitmap( i, aBmp, aBmpSize, aStr, aLineCol, aBackCol );
1690 		aLineSet.InsertItem( i, aBmp, aStr );
1691 	}
1692 }
1693 
1694 // -----------------------------------------------------------------------
1695 
1696 //########################################################################
1697 // Hilfsklassen
1698 
1699 //========================================================================
1700 // class SfxStyleControllerItem_Impl ------------------------------------------
1701 //========================================================================
1702 
1703 SfxStyleControllerItem_Impl::SfxStyleControllerItem_Impl(
1704     const Reference< XDispatchProvider >& rDispatchProvider,
1705     sal_uInt16			                      nSlotId,      // Family-ID
1706     const rtl::OUString&                  rCommand,     // .uno: command bound to this item
1707     SvxStyleToolBoxControl&	              rTbxCtl )     // Controller-Instanz, dem dieses Item zugeordnet ist.
1708 	:	SfxStatusListener( rDispatchProvider, nSlotId, rCommand ),
1709 		rControl( rTbxCtl )
1710 {
1711 }
1712 
1713 // -----------------------------------------------------------------------
1714 
1715 void SfxStyleControllerItem_Impl::StateChanged(
1716 	sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
1717 {
1718 	switch ( GetId() )
1719 	{
1720 		case SID_STYLE_FAMILY1:
1721 		case SID_STYLE_FAMILY2:
1722 		case SID_STYLE_FAMILY3:
1723 		case SID_STYLE_FAMILY4:
1724 		case SID_STYLE_FAMILY5:
1725 		{
1726 			const sal_uInt16 nIdx = GetId() - SID_STYLE_FAMILY_START;
1727 
1728 			if ( SFX_ITEM_AVAILABLE == eState )
1729 			{
1730 				const SfxTemplateItem* pStateItem =
1731 					PTR_CAST( SfxTemplateItem, pState );
1732 				DBG_ASSERT( pStateItem != NULL, "SfxTemplateItem expected" );
1733 				rControl.SetFamilyState( nIdx, pStateItem );
1734 			}
1735 			else
1736 				rControl.SetFamilyState( nIdx, NULL );
1737 			break;
1738 		}
1739 	}
1740 }
1741 
1742 //########################################################################
1743 
1744 //========================================================================
1745 // class SvxStyleToolBoxControl ------------------------------------------
1746 //========================================================================
1747 
1748 struct SvxStyleToolBoxControl::Impl
1749 {
1750 	String						        aClearForm;
1751 	String						        aMore;
1752     ::std::vector< ::rtl::OUString >    aDefaultStyles;
1753 	sal_Bool						bListening;
1754 	sal_Bool						bSpecModeWriter;
1755 	sal_Bool						bSpecModeCalc;
1756 
1757 	inline Impl( void )
1758 		:aClearForm			( SVX_RESSTR( RID_SVXSTR_CLEARFORM ) )
1759 		,aMore				( SVX_RESSTR( RID_SVXSTR_MORE ) )
1760 		,bListening			( sal_False )
1761 		,bSpecModeWriter	( sal_False )
1762 		,bSpecModeCalc		( sal_False )
1763 	{
1764 
1765 
1766     }
1767     void InitializeStyles(Reference < frame::XModel > xModel)
1768     {
1769         //now convert the default style names to the localized names
1770         try
1771         {
1772             Reference< style::XStyleFamiliesSupplier > xStylesSupplier( xModel, UNO_QUERY_THROW );
1773             Reference< lang::XServiceInfo > xServices( xModel, UNO_QUERY_THROW );
1774             bSpecModeWriter = xServices->supportsService(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextDocument")));
1775             if(bSpecModeWriter)
1776             {
1777                 Reference<container::XNameAccess> xParaStyles;
1778                     xStylesSupplier->getStyleFamilies()->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParagraphStyles"))) >>=
1779                     xParaStyles;
1780                 static const sal_Char* aWriterStyles[] =
1781                 {
1782 		            "Standard",
1783 		            "Heading 1",
1784 		            "Heading 2",
1785 		            "Heading 3",
1786 		            "Text body"
1787                 };
1788                 for( sal_uInt32 nStyle = 0; nStyle < sizeof( aWriterStyles ) / sizeof( sal_Char*); ++nStyle )
1789                 {
1790                     try
1791                     {
1792                         Reference< beans::XPropertySet > xStyle;
1793                         xParaStyles->getByName( rtl::OUString::createFromAscii( aWriterStyles[nStyle] )) >>= xStyle;
1794                         ::rtl::OUString sName;
1795                         xStyle->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DisplayName"))) >>= sName;
1796                         if( sName.getLength() )
1797                             aDefaultStyles.push_back(sName);
1798                     }
1799                     catch( const uno::Exception& )
1800                     {}
1801                 }
1802 
1803             }
1804             else if( 0 != (
1805                 bSpecModeCalc = xServices->supportsService(::rtl::OUString(
1806                     RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDocument")))))
1807             {
1808                 static const sal_Char* aCalcStyles[] =
1809                 {
1810 		            "Default",
1811 		            "Heading1",
1812 		            "Result",
1813 		            "Result2"
1814                 };
1815                 Reference<container::XNameAccess> xCellStyles;
1816                     xStylesSupplier->getStyleFamilies()->getByName(
1817                         ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellStyles"))) >>=
1818                         xCellStyles;
1819                 for( sal_uInt32 nStyle = 0; nStyle < sizeof( aCalcStyles ) / sizeof( sal_Char*); ++nStyle )
1820                 {
1821                     try
1822                     {
1823 						const rtl::OUString sStyleName( rtl::OUString::createFromAscii( aCalcStyles[nStyle] ) );
1824 						if( xCellStyles->hasByName( sStyleName ) )
1825 						{
1826 							Reference< beans::XPropertySet > xStyle( xCellStyles->getByName( sStyleName), UNO_QUERY_THROW );
1827 		                    ::rtl::OUString sName;
1828 			                xStyle->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DisplayName"))) >>= sName;
1829 				            if( sName.getLength() )
1830 					            aDefaultStyles.push_back(sName);
1831 						}
1832                     }
1833                     catch( const uno::Exception& )
1834                     {}
1835                 }
1836             }
1837         }
1838         catch(const uno::Exception& )
1839         {
1840             DBG_ERROR("error while initializing style names");
1841         }
1842     }
1843 };
1844 
1845 
1846 // mapping table from bound items. BE CAREFUL this table must be in the
1847 // same order as the uno commands bound to the slots SID_STYLE_FAMILY1..n
1848 // MAX_FAMILIES must also be correctly set!
1849 static const char* StyleSlotToStyleCommand[MAX_FAMILIES] =
1850 {
1851     ".uno:CharStyle",
1852     ".uno:ParaStyle",
1853     ".uno:FrameStyle",
1854     ".uno:PageStyle",
1855     ".uno:TemplateFamily5"
1856 };
1857 
1858 SvxStyleToolBoxControl::SvxStyleToolBoxControl(
1859     sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx )
1860 	:	SfxToolBoxControl	( nSlotId, nId, rTbx ),
1861 		pStyleSheetPool		( NULL ),
1862 		nActFamily			( 0xffff ),
1863 		bListening			( sal_False ),
1864 		pImpl				( new Impl )
1865 {
1866 	for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
1867 	{
1868         pBoundItems[i] = 0;
1869         m_xBoundItems[i] = Reference< XComponent >();
1870 		pFamilyState[i]  = NULL;
1871     }
1872 }
1873 
1874 // -----------------------------------------------------------------------
1875 SvxStyleToolBoxControl::~SvxStyleToolBoxControl()
1876 {
1877 }
1878 
1879 // -----------------------------------------------------------------------
1880 void SAL_CALL SvxStyleToolBoxControl::initialize( const Sequence< Any >& aArguments )
1881 throw ( Exception, RuntimeException)
1882 {
1883     SfxToolBoxControl::initialize( aArguments );
1884 
1885     // After initialize we should have a valid frame member where we can retrieve our
1886     // dispatch provider.
1887     if ( m_xFrame.is() )
1888     {
1889         pImpl->InitializeStyles(m_xFrame->getController()->getModel());
1890         Reference< XDispatchProvider > xDispatchProvider( m_xFrame->getController(), UNO_QUERY );
1891         for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
1892 	    {
1893             pBoundItems[i]   = new SfxStyleControllerItem_Impl( xDispatchProvider,
1894                                                                 SID_STYLE_FAMILY_START + i,
1895                                                                 OUString::createFromAscii( StyleSlotToStyleCommand[i] ),
1896                                                                 *this );
1897             m_xBoundItems[i] = Reference< XComponent >( static_cast< OWeakObject* >( pBoundItems[i] ), UNO_QUERY );
1898 	        pFamilyState[i]  = NULL;
1899         }
1900     }
1901 }
1902 
1903 // XComponent
1904 void SAL_CALL SvxStyleToolBoxControl::dispose()
1905 throw (::com::sun::star::uno::RuntimeException)
1906 {
1907     SfxToolBoxControl::dispose();
1908 
1909     for( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
1910 	{
1911         if ( m_xBoundItems[i].is() )
1912         {
1913             try
1914             {
1915                 m_xBoundItems[i]->dispose();
1916             }
1917             catch ( Exception& )
1918             {
1919             }
1920 
1921             m_xBoundItems[i].clear();
1922             pBoundItems[i] = 0;
1923         }
1924 		DELETEZ( pFamilyState[i] );
1925 	}
1926 	pStyleSheetPool = NULL;
1927     DELETEZ( pImpl );
1928 }
1929 
1930 // -----------------------------------------------------------------------
1931 void SAL_CALL SvxStyleToolBoxControl::update() throw (RuntimeException)
1932 {
1933     // Do nothing, we will start binding our listener when we are visible.
1934     // See link SvxStyleToolBoxControl::VisibilityNotification.
1935     SvxStyleBox_Impl* pBox = (SvxStyleBox_Impl*)GetToolBox().GetItemWindow( GetId() );
1936 	if ( pBox->IsVisible() )
1937 	{
1938 		for ( int i=0; i<MAX_FAMILIES; i++ )
1939 			pBoundItems	[i]->ReBind();
1940 
1941         bindListener();
1942 	}
1943 }
1944 
1945 // -----------------------------------------------------------------------
1946 
1947 SfxStyleFamily SvxStyleToolBoxControl::GetActFamily()
1948 {
1949 	switch ( nActFamily-1 + SID_STYLE_FAMILY_START )
1950 	{
1951 		case SID_STYLE_FAMILY1:	return SFX_STYLE_FAMILY_CHAR;
1952 		case SID_STYLE_FAMILY2:	return SFX_STYLE_FAMILY_PARA;
1953 		case SID_STYLE_FAMILY3:	return SFX_STYLE_FAMILY_FRAME;
1954 		case SID_STYLE_FAMILY4:	return SFX_STYLE_FAMILY_PAGE;
1955 		case SID_STYLE_FAMILY5:	return SFX_STYLE_FAMILY_PSEUDO;
1956 		default:
1957 			DBG_ERROR( "unknown style family" );
1958 			break;
1959 	}
1960 	return SFX_STYLE_FAMILY_PARA;
1961 }
1962 
1963 // -----------------------------------------------------------------------
1964 
1965 void SvxStyleToolBoxControl::FillStyleBox()
1966 {
1967     SvxStyleBox_Impl* pBox = (SvxStyleBox_Impl*)GetToolBox().GetItemWindow( GetId() );
1968 
1969 	DBG_ASSERT( pStyleSheetPool, "StyleSheetPool not found!" );
1970 	DBG_ASSERT( pBox,			 "Control not found!" );
1971 
1972 	if ( pStyleSheetPool && pBox && nActFamily!=0xffff )
1973 	{
1974 		const SfxStyleFamily	eFamily 	= GetActFamily();
1975 		sal_uInt16					nCount  	= pStyleSheetPool->Count();
1976 		sal_uInt16 					i			= 0;
1977 		SfxStyleSheetBase*		pStyle  	= NULL;
1978 		sal_Bool 					bDoFill 	= sal_False;
1979 
1980 		pStyleSheetPool->SetSearchMask( eFamily, SFXSTYLEBIT_USED );
1981 
1982 		//------------------------------
1983 		// Ueberpruefen, ob Fill noetig:
1984 		//------------------------------
1985 
1986 		pStyle = pStyleSheetPool->First();
1987         //!!! TODO: This condition isn't right any longer, because we always show some default entries
1988         //!!! so the list doesn't show the count
1989 		if ( nCount != pBox->GetEntryCount() )
1990 		{
1991 			bDoFill = sal_True;
1992 		}
1993 		else
1994 		{
1995 			while ( pStyle && !bDoFill )
1996 			{
1997 				bDoFill = ( pBox->GetEntry(i) != pStyle->GetName() );
1998 				pStyle = pStyleSheetPool->Next();
1999 				i++;
2000 			}
2001 		}
2002 
2003 		if ( bDoFill )
2004 		{
2005 			pBox->SetUpdateMode( sal_False );
2006 			pBox->Clear();
2007 
2008 			{
2009 				sal_uInt16	_i;
2010                 sal_uInt32  nCnt = pImpl->aDefaultStyles.size();
2011 				bool	bInsert;
2012 
2013 				pStyle = pStyleSheetPool->First();
2014 
2015 				if( pImpl->bSpecModeWriter || pImpl->bSpecModeCalc )
2016 				{
2017 					while ( pStyle )
2018 					{
2019 						// sort out default styles
2020 						bInsert = true;
2021                         ::rtl::OUString	aName( pStyle->GetName() );
2022 						for( _i = 0 ; _i < nCnt ; ++_i )
2023 						{
2024 							if( pImpl->aDefaultStyles[_i] == aName )
2025 							{
2026 								bInsert = false;
2027 								break;
2028 							}
2029 						}
2030 
2031 						if( bInsert )
2032 							pBox->InsertEntry( aName );
2033 						pStyle = pStyleSheetPool->Next();
2034 					}
2035 				}
2036 				else
2037 				{
2038 					while ( pStyle )
2039 					{
2040 						pBox->InsertEntry( pStyle->GetName() );
2041 						pStyle = pStyleSheetPool->Next();
2042 					}
2043 				}
2044 			}
2045 
2046 			if( pImpl->bSpecModeWriter || pImpl->bSpecModeCalc )
2047 			{
2048 				// insert default styles
2049 				sal_uInt16	_i;
2050                 sal_uInt32  nCnt = pImpl->aDefaultStyles.size();
2051 				sal_uInt16 nPos = 1;
2052 				for( _i = 0 ; _i < nCnt ; ++_i )
2053 				{
2054 					pBox->InsertEntry( pImpl->aDefaultStyles[_i], nPos );
2055 					++nPos;
2056 				}
2057 
2058                 // disable sort to preserve special order
2059                 WinBits nWinBits = pBox->GetStyle();
2060                 nWinBits &= ~WB_SORT;
2061                 pBox->SetStyle( nWinBits );
2062 
2063                 pBox->InsertEntry( pImpl->aClearForm, 0 );
2064                 pBox->SetSeparatorPos( 0 );
2065 
2066 				pBox->InsertEntry( pImpl->aMore );
2067 
2068 				// enable sort again
2069 				nWinBits |= WB_SORT;
2070 				pBox->SetStyle( nWinBits );
2071 			}
2072 
2073 			pBox->SetUpdateMode( sal_True );
2074 			pBox->SetFamily( eFamily );
2075 
2076             sal_uInt16 nLines = Min( pBox->GetEntryCount(), MAX_STYLES_ENTRIES );
2077             pBox->SetDropDownLineCount( nLines );
2078 		}
2079 	}
2080 }
2081 
2082 // -----------------------------------------------------------------------
2083 
2084 void SvxStyleToolBoxControl::SelectStyle( const String& rStyleName )
2085 {
2086     SvxStyleBox_Impl* pBox = (SvxStyleBox_Impl*)GetToolBox().GetItemWindow( GetId() );
2087 	DBG_ASSERT( pBox, "Control not found!" );
2088 
2089 	if ( pBox )
2090 	{
2091 //		String aStrSel( pBox->GetSelectEntry() );
2092 		String aStrSel( pBox->GetText() );
2093 
2094 		if ( rStyleName.Len() > 0 )
2095 		{
2096 			if ( rStyleName != aStrSel )
2097 //				pBox->SelectEntry( rStyleName );
2098 				pBox->SetText( rStyleName );
2099 		}
2100 		else
2101 			pBox->SetNoSelection();
2102         pBox->SaveValue();
2103     }
2104 }
2105 
2106 // -----------------------------------------------------------------------
2107 
2108 void SvxStyleToolBoxControl::Update()
2109 {
2110 	SfxStyleSheetBasePool*	pPool	  = NULL;
2111 	SfxObjectShell*		    pDocShell = SfxObjectShell::Current();
2112 
2113 	if ( pDocShell )
2114 		pPool = pDocShell->GetStyleSheetPool();
2115 
2116 	sal_uInt16 i;
2117 	for ( i=0; i<MAX_FAMILIES; i++ )
2118 		if( pFamilyState[i] )
2119 			break;
2120 
2121 	if ( i==MAX_FAMILIES || !pPool )
2122 	{
2123 		pStyleSheetPool = pPool;
2124 		return;
2125 	}
2126 
2127 	//--------------------------------------------------------------------
2128 	const SfxTemplateItem* pItem = NULL;
2129 
2130 	if ( nActFamily == 0xffff || 0 == (pItem = pFamilyState[nActFamily-1]) )
2131 		// aktueller Bereich nicht innerhalb der erlaubten Bereiche
2132 		// oder Default
2133 	{
2134 		pStyleSheetPool = pPool;
2135 		nActFamily		= 2;
2136 
2137 		pItem = pFamilyState[nActFamily-1];
2138 		if ( !pItem )
2139 		{
2140 			nActFamily++;
2141 			pItem = pFamilyState[nActFamily-1];
2142 		}
2143 
2144 		if ( !pItem )
2145         {
2146 			DBG_WARNING( "Unknown Family" ); // can happen
2147         }
2148 	}
2149 	else if ( pPool != pStyleSheetPool )
2150 		pStyleSheetPool = pPool;
2151 
2152 	FillStyleBox(); // entscheidet selbst, ob gefuellt werden muss
2153 
2154 	if ( pItem )
2155 		SelectStyle( pItem->GetStyleName() );
2156 }
2157 
2158 // -----------------------------------------------------------------------
2159 
2160 void SvxStyleToolBoxControl::SetFamilyState( sal_uInt16 nIdx,
2161 											 const SfxTemplateItem* pItem )
2162 {
2163 	DELETEZ( pFamilyState[nIdx] );
2164 
2165 	if ( pItem )
2166 		pFamilyState[nIdx] = new SfxTemplateItem( *pItem );
2167 
2168     Update();
2169 }
2170 
2171 // -----------------------------------------------------------------------
2172 
2173 IMPL_LINK( SvxStyleToolBoxControl, VisibilityNotification, void*, EMPTYARG )
2174 {
2175 
2176     sal_uInt16 i;
2177 
2178 	// Call ReBind() && UnBind() according to visibility
2179 	SvxStyleBox_Impl* pBox = (SvxStyleBox_Impl*)( GetToolBox().GetItemWindow( GetId() ));
2180 	if ( pBox->IsVisible() && !isBound() )
2181 	{
2182 		for ( i=0; i<MAX_FAMILIES; i++ )
2183 			pBoundItems	[i]->ReBind();
2184 
2185         bindListener();
2186 	}
2187     else if ( !pBox->IsVisible() && isBound() )
2188 	{
2189 		for ( i=0; i<MAX_FAMILIES; i++ )
2190 			pBoundItems[i]->UnBind();
2191 		unbindListener();
2192 	}
2193 
2194 	return 0;
2195 }
2196 
2197 // -----------------------------------------------------------------------
2198 
2199 void SvxStyleToolBoxControl::StateChanged(
2200 
2201 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2202 
2203 {
2204 	sal_uInt16 		 nId	= GetId();
2205 	ToolBox&	 rTbx   = GetToolBox();
2206     SvxStyleBox_Impl* pBox   = (SvxStyleBox_Impl*)(rTbx.GetItemWindow( nId ));
2207 	TriState	 eTri	= STATE_NOCHECK;
2208 
2209 	DBG_ASSERT( pBox, "Control not found!" );
2210 
2211 	if ( SFX_ITEM_DISABLED == eState )
2212 		pBox->Disable();
2213 	else
2214 		pBox->Enable();
2215 
2216 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2217 
2218 	switch ( eState )
2219 	{
2220 		case SFX_ITEM_AVAILABLE:
2221 			eTri = ((const SfxBoolItem*)pState)->GetValue()
2222 						? STATE_CHECK
2223 						: STATE_NOCHECK;
2224 			break;
2225 
2226 		case SFX_ITEM_DONTCARE:
2227 			eTri = STATE_DONTKNOW;
2228 			break;
2229 	}
2230 
2231 	rTbx.SetItemState( nId, eTri );
2232 
2233     if ( SFX_ITEM_DISABLED != eState )
2234         Update();
2235 }
2236 
2237 // -----------------------------------------------------------------------
2238 
2239 Window* SvxStyleToolBoxControl::CreateItemWindow( Window *pParent )
2240 {
2241     SvxStyleBox_Impl* pBox = new SvxStyleBox_Impl( pParent,
2242 										           SID_STYLE_APPLY,
2243                                                    OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StyleApply" )),
2244 										           SFX_STYLE_FAMILY_PARA,
2245                                                    Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
2246                                                    m_xFrame,
2247                                                    pImpl->aClearForm,
2248 												   pImpl->aMore,
2249 												   pImpl->bSpecModeWriter || pImpl->bSpecModeCalc );
2250     if( !pImpl->aDefaultStyles.empty())
2251         pBox->SetDefaultStyle( pImpl->aDefaultStyles[0] );
2252 	// Set visibility listener to bind/unbind controller
2253 	pBox->SetVisibilityListener( LINK( this, SvxStyleToolBoxControl, VisibilityNotification ));
2254 
2255 	return pBox;
2256 }
2257 
2258 //========================================================================
2259 // class SvxFontNameToolBoxControl ---------------------------------------
2260 //========================================================================
2261 
2262 SvxFontNameToolBoxControl::SvxFontNameToolBoxControl(
2263                                             sal_uInt16          nSlotId,
2264 											sal_uInt16			nId,
2265 											ToolBox&		rTbx )
2266 
2267 	:	SfxToolBoxControl( nSlotId, nId, rTbx )
2268 {
2269 }
2270 
2271 // -----------------------------------------------------------------------
2272 
2273 void SvxFontNameToolBoxControl::StateChanged(
2274 
2275 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2276 
2277 {
2278 	sal_uInt16 			     nId	= GetId();
2279 	ToolBox&		     rTbx   = GetToolBox();
2280     SvxFontNameBox_Impl* pBox   = (SvxFontNameBox_Impl*)(rTbx.GetItemWindow( nId ));
2281 
2282 	DBG_ASSERT( pBox, "Control not found!" );
2283 
2284 	if ( SFX_ITEM_DISABLED == eState )
2285 	{
2286 		pBox->Disable();
2287 		pBox->Update( (const SvxFontItem*)NULL );
2288 	}
2289 	else
2290 	{
2291 		pBox->Enable();
2292 
2293 		if ( SFX_ITEM_AVAILABLE == eState )
2294 		{
2295 			const SvxFontItem* pFontItem = dynamic_cast< const SvxFontItem* >( pState );
2296 
2297 			DBG_ASSERT( pFontItem, "svx::SvxFontNameToolBoxControl::StateChanged(), wrong item type!" );
2298 			if( pFontItem )
2299 				pBox->Update( pFontItem );
2300 		}
2301 		else
2302 			pBox->SetText( String() );
2303         pBox->SaveValue();
2304 	}
2305 
2306 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2307 }
2308 
2309 // -----------------------------------------------------------------------
2310 
2311 Window* SvxFontNameToolBoxControl::CreateItemWindow( Window *pParent )
2312 {
2313     SvxFontNameBox_Impl* pBox = new SvxFontNameBox_Impl( pParent,
2314                                                          Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
2315                                                          m_xFrame,0);
2316 	return pBox;
2317 }
2318 
2319 //========================================================================
2320 // class SvxFontColorToolBoxControl --------------------------------------
2321 //========================================================================
2322 
2323 SvxFontColorToolBoxControl::SvxFontColorToolBoxControl(
2324     sal_uInt16          nSlotId,
2325     sal_uInt16			nId,
2326 	ToolBox&		rTbx )
2327 
2328 	:	SfxToolBoxControl( nSlotId, nId, rTbx ),
2329     pBtnUpdater( new ::svx::ToolboxButtonColorUpdater(
2330                     nSlotId, nId, &GetToolBox(), TBX_UPDATER_MODE_CHAR_COLOR_NEW ))
2331 {
2332 	rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
2333 }
2334 
2335 // -----------------------------------------------------------------------
2336 
2337 SvxFontColorToolBoxControl::~SvxFontColorToolBoxControl()
2338 {
2339 	delete pBtnUpdater;
2340 }
2341 
2342 // -----------------------------------------------------------------------
2343 
2344 SfxPopupWindowType SvxFontColorToolBoxControl::GetPopupWindowType() const
2345 {
2346 	return SFX_POPUPWINDOW_ONCLICK;
2347 }
2348 
2349 // -----------------------------------------------------------------------
2350 
2351 SfxPopupWindow*	SvxFontColorToolBoxControl::CreatePopupWindow()
2352 {
2353     SvxColorWindow_Impl* pColorWin =
2354         new SvxColorWindow_Impl(
2355                 OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Color" )),
2356                 SID_ATTR_CHAR_COLOR,
2357                 m_xFrame,
2358                 SVX_RESSTR( RID_SVXITEMS_EXTRAS_CHARCOLOR ),
2359                 &GetToolBox() );
2360 
2361     pColorWin->StartPopupMode( &GetToolBox(),
2362         FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
2363 	pColorWin->StartSelection();
2364     SetPopupWindow( pColorWin );
2365 	return pColorWin;
2366 }
2367 
2368 // -----------------------------------------------------------------------
2369 
2370 void SvxFontColorToolBoxControl::StateChanged(
2371 
2372 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2373 
2374 {
2375 	sal_uInt16 nId = GetId();
2376 	ToolBox& rTbx = GetToolBox();
2377 	const SvxColorItem*	pItem = 0;
2378 
2379 	if ( SFX_ITEM_DONTCARE != eState )
2380 	   pItem = PTR_CAST( SvxColorItem, pState );
2381 
2382 	if ( pItem )
2383 		pBtnUpdater->Update( pItem->GetValue());
2384 
2385 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2386 	rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
2387 }
2388 
2389 //========================================================================
2390 // class SvxColorToolBoxControl --------------------------------
2391 //========================================================================
2392 
2393 SvxColorToolBoxControl::SvxColorToolBoxControl(	sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
2394 
2395 	SfxToolBoxControl( nSlotId, nId, rTbx )
2396 {
2397     if ( nSlotId == SID_BACKGROUND_COLOR )
2398         rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
2399     else
2400         rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
2401 	rTbx.Invalidate();
2402     pBtnUpdater = new ::svx::ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox() );
2403 }
2404 
2405 // -----------------------------------------------------------------------
2406 
2407 SvxColorToolBoxControl::~SvxColorToolBoxControl()
2408 {
2409 	delete pBtnUpdater;
2410 }
2411 
2412 // -----------------------------------------------------------------------
2413 
2414 SfxPopupWindowType SvxColorToolBoxControl::GetPopupWindowType() const
2415 {
2416 	return SFX_POPUPWINDOW_ONCLICK;
2417 }
2418 
2419 // -----------------------------------------------------------------------
2420 
2421 SfxPopupWindow*	SvxColorToolBoxControl::CreatePopupWindow()
2422 {
2423 	sal_uInt16 nResId = GetSlotId() == SID_BACKGROUND_COLOR ?
2424 						RID_SVXSTR_BACKGROUND : RID_SVXSTR_COLOR;
2425     SvxColorWindow_Impl* pColorWin = new SvxColorWindow_Impl(
2426         OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BackgroundColor" )),
2427 									SID_BACKGROUND_COLOR,
2428                                     m_xFrame,
2429 									SVX_RESSTR(nResId),
2430                                     &GetToolBox() );
2431 
2432     pColorWin->StartPopupMode( &GetToolBox(),
2433         FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
2434 	pColorWin->StartSelection();
2435     SetPopupWindow( pColorWin );
2436 	return pColorWin;
2437 }
2438 
2439 // -----------------------------------------------------------------------
2440 
2441 void SvxColorToolBoxControl::StateChanged(
2442 
2443 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2444 
2445 {
2446 	const SvxColorItem*	pItem	= 0;
2447 	if ( SFX_ITEM_DONTCARE != eState )
2448 		pItem = PTR_CAST( SvxColorItem, pState );
2449 
2450 	if ( pItem )
2451 		pBtnUpdater->Update( pItem->GetValue() );
2452 
2453 	sal_uInt16 nId = GetId();
2454 	ToolBox& rTbx = GetToolBox();
2455 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2456 	rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
2457 }
2458 
2459 //========================================================================
2460 // class SvxFontColorExtToolBoxControl --------------------------------------
2461 //========================================================================
2462 
2463 SvxFontColorExtToolBoxControl::SvxFontColorExtToolBoxControl(
2464 	sal_uInt16 nSlotId,
2465     sal_uInt16 nId,
2466 	ToolBox& rTbx ) :
2467 
2468 	SfxToolBoxControl( nSlotId, nId, rTbx ),
2469 	pBtnUpdater(0)
2470 {
2471 	rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
2472     // The following commands are available at the writer module.
2473     if ( SID_ATTR_CHAR_COLOR2 == nSlotId )
2474         addStatusListener( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharColorExt" )));
2475     else
2476         addStatusListener( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharBackgroundExt" )));
2477 
2478     sal_uInt16 nMode =	SID_ATTR_CHAR_COLOR2 == nSlotId
2479 		? TBX_UPDATER_MODE_CHAR_COLOR_NEW :	TBX_UPDATER_MODE_CHAR_COLOR_NEW;
2480     pBtnUpdater = new ::svx::ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox(), nMode );
2481 }
2482 
2483 // -----------------------------------------------------------------------
2484 
2485 SvxFontColorExtToolBoxControl::~SvxFontColorExtToolBoxControl()
2486 {
2487 	delete pBtnUpdater;
2488 }
2489 
2490 // -----------------------------------------------------------------------
2491 
2492 SfxPopupWindowType SvxFontColorExtToolBoxControl::GetPopupWindowType() const
2493 {
2494 	return SFX_POPUPWINDOW_ONTIMEOUT;
2495 }
2496 
2497 // -----------------------------------------------------------------------
2498 
2499 SfxPopupWindow*	SvxFontColorExtToolBoxControl::CreatePopupWindow()
2500 {
2501     SvxColorWindow_Impl* pColorWin =
2502         new SvxColorWindow_Impl(
2503                             m_aCommandURL,
2504                             GetSlotId(),
2505                             m_xFrame,
2506 							SVX_RESSTR( RID_SVXITEMS_EXTRAS_CHARCOLOR ),
2507                             &GetToolBox() );
2508 
2509 	if ( GetSlotId() == SID_ATTR_CHAR_COLOR_BACKGROUND )
2510 		pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_EXTRAS_CHARBACKGROUND ) );
2511 
2512     pColorWin->StartPopupMode( &GetToolBox(),
2513         FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
2514 	pColorWin->StartSelection();
2515     SetPopupWindow( pColorWin );
2516 	return pColorWin;
2517 }
2518 
2519 // -----------------------------------------------------------------------
2520 
2521 void SvxFontColorExtToolBoxControl::StateChanged(
2522 
2523 	sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
2524 
2525 {
2526 	sal_uInt16 nId = GetId();
2527 	ToolBox& rTbx = GetToolBox();
2528 	const SvxColorItem*	pItem = 0;
2529 
2530 	if ( nSID == SID_ATTR_CHAR_COLOR_EXT ||
2531 		 nSID == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT )
2532 	{
2533 		if ( SFX_ITEM_DONTCARE != eState )
2534 		{
2535 			const SfxBoolItem* pBool = PTR_CAST( SfxBoolItem, pState );
2536 			rTbx.CheckItem( nId, pBool && pBool->GetValue());
2537 		}
2538 		rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2539 	}
2540 	else
2541 	{
2542 		if ( SFX_ITEM_DONTCARE != eState )
2543 		   pItem = PTR_CAST( SvxColorItem, pState );
2544 
2545 		if ( pItem )
2546 			pBtnUpdater->Update( pItem->GetValue() );
2547 	}
2548 }
2549 
2550 // -----------------------------------------------------------------------
2551 
2552 void SvxFontColorExtToolBoxControl::Select( sal_Bool )
2553 {
2554     OUString aCommand;
2555     OUString aParamName;
2556     if ( SID_ATTR_CHAR_COLOR2 == GetSlotId() )
2557     {
2558         aCommand    = OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharColorExt" ));
2559         aParamName  = OUString( RTL_CONSTASCII_USTRINGPARAM( "CharColorExt" ));
2560     }
2561     else
2562     {
2563         aCommand    = OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharBackgroundExt" ));
2564         aParamName  = OUString( RTL_CONSTASCII_USTRINGPARAM( "CharBackgroundExt" ));
2565     }
2566 
2567     Sequence< PropertyValue > aArgs( 1 );
2568     aArgs[0].Name  = aParamName;
2569     aArgs[0].Value = makeAny( GetToolBox().IsItemChecked( GetId() ));
2570     Dispatch( aCommand, aArgs );
2571 }
2572 
2573 //========================================================================
2574 // class SvxFrameToolBoxControl ------------------------------------------
2575 //========================================================================
2576 
2577 SvxFrameToolBoxControl::SvxFrameToolBoxControl(
2578     sal_uInt16      nSlotId,
2579     sal_uInt16      nId,
2580 	ToolBox&    rTbx )
2581 
2582     :   SfxToolBoxControl( nSlotId, nId, rTbx )
2583 {
2584 	rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
2585 }
2586 
2587 // -----------------------------------------------------------------------
2588 
2589 SfxPopupWindowType SvxFrameToolBoxControl::GetPopupWindowType() const
2590 {
2591 	return SFX_POPUPWINDOW_ONCLICK;
2592 }
2593 
2594 // -----------------------------------------------------------------------
2595 
2596 SfxPopupWindow*	SvxFrameToolBoxControl::CreatePopupWindow()
2597 {
2598     SvxFrameWindow_Impl* pFrameWin = new SvxFrameWindow_Impl(
2599                                         GetSlotId(), m_xFrame, &GetToolBox() );
2600 
2601 	pFrameWin->StartPopupMode( &GetToolBox(), FLOATWIN_POPUPMODE_GRABFOCUS | FLOATWIN_POPUPMODE_ALLOWTEAROFF );
2602 	pFrameWin->StartSelection();
2603     SetPopupWindow( pFrameWin );
2604 
2605 	return pFrameWin;
2606 }
2607 
2608 // -----------------------------------------------------------------------
2609 
2610 void SvxFrameToolBoxControl::StateChanged(
2611 
2612 	sal_uInt16, SfxItemState eState, const SfxPoolItem*  )
2613 
2614 {
2615 	sal_uInt16 					nId		= GetId();
2616 	ToolBox&	 			rTbx	= GetToolBox();
2617 
2618     rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2619     rTbx.SetItemState( nId, (SFX_ITEM_DONTCARE == eState)
2620                             ? STATE_DONTKNOW
2621                             : STATE_NOCHECK );
2622 }
2623 
2624 //========================================================================
2625 // class SvxFrameLineStyleToolBoxControl ---------------------------------
2626 //========================================================================
2627 
2628 SvxFrameLineStyleToolBoxControl::SvxFrameLineStyleToolBoxControl(
2629     sal_uInt16          nSlotId,
2630     sal_uInt16   		nId,
2631 	ToolBox& 		rTbx )
2632 
2633 	:    SfxToolBoxControl( nSlotId, nId, rTbx )
2634 {
2635 	rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
2636 }
2637 
2638 // -----------------------------------------------------------------------
2639 
2640 SfxPopupWindowType SvxFrameLineStyleToolBoxControl::GetPopupWindowType() const
2641 {
2642 	return SFX_POPUPWINDOW_ONCLICK;
2643 }
2644 
2645 // -----------------------------------------------------------------------
2646 
2647 SfxPopupWindow*	SvxFrameLineStyleToolBoxControl::CreatePopupWindow()
2648 {
2649 	SvxLineWindow_Impl* pLineWin = new SvxLineWindow_Impl( GetSlotId(), m_xFrame, &GetToolBox() );
2650 	pLineWin->StartPopupMode( &GetToolBox(), sal_True );
2651 	pLineWin->StartSelection();
2652     SetPopupWindow( pLineWin );
2653 
2654 	return pLineWin;
2655 }
2656 
2657 // -----------------------------------------------------------------------
2658 
2659 void SvxFrameLineStyleToolBoxControl::StateChanged(
2660 
2661 	sal_uInt16 , SfxItemState eState, const SfxPoolItem*  )
2662 {
2663 	sal_uInt16 		 nId	= GetId();
2664 	ToolBox&	 rTbx   = GetToolBox();
2665 
2666 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2667 	rTbx.SetItemState( nId, (SFX_ITEM_DONTCARE == eState)
2668 								? STATE_DONTKNOW
2669 								: STATE_NOCHECK );
2670 }
2671 
2672 //========================================================================
2673 // class SvxFrameLineColorToolBoxControl ---------------------------------
2674 //========================================================================
2675 
2676 SvxFrameLineColorToolBoxControl::SvxFrameLineColorToolBoxControl(
2677 	sal_uInt16      nSlotId,
2678     sal_uInt16      nId,
2679 	ToolBox&    rTbx ) :
2680 
2681     SfxToolBoxControl( nSlotId, nId, rTbx ),
2682     pBtnUpdater(new ::svx::ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox() ))
2683 {
2684 	rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
2685 }
2686 
2687 // -----------------------------------------------------------------------
2688 
2689 SvxFrameLineColorToolBoxControl::~SvxFrameLineColorToolBoxControl()
2690 {
2691 
2692     delete pBtnUpdater;
2693 }
2694 
2695 // -----------------------------------------------------------------------
2696 
2697 SfxPopupWindowType SvxFrameLineColorToolBoxControl::GetPopupWindowType() const
2698 {
2699 	return SFX_POPUPWINDOW_ONCLICK;
2700 }
2701 
2702 // -----------------------------------------------------------------------
2703 
2704 SfxPopupWindow*	SvxFrameLineColorToolBoxControl::CreatePopupWindow()
2705 {
2706     SvxColorWindow_Impl* pColorWin = new SvxColorWindow_Impl(
2707                                         OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FrameLineColor" )),
2708 									    SID_FRAME_LINECOLOR,
2709                                         m_xFrame,
2710 									    SVX_RESSTR(RID_SVXSTR_FRAME_COLOR),
2711                                         &GetToolBox() );
2712 
2713     pColorWin->StartPopupMode( &GetToolBox(),
2714         FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
2715 	pColorWin->StartSelection();
2716     SetPopupWindow( pColorWin );
2717 	return pColorWin;
2718 }
2719 
2720 // -----------------------------------------------------------------------
2721 
2722 void SvxFrameLineColorToolBoxControl::StateChanged(
2723 
2724 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2725 
2726 {
2727 	sal_uInt16 nId = GetId();
2728 	ToolBox& rTbx = GetToolBox();
2729 	rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
2730 	rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
2731 
2732     const SvxColorItem* pItem = 0;
2733 	if ( SFX_ITEM_DONTCARE != eState )
2734     {
2735 	   pItem = PTR_CAST( SvxColorItem, pState );
2736         if ( pItem )
2737             pBtnUpdater->Update( pItem->GetValue());
2738     }
2739 }
2740 
2741 // class SvxReloadControllerItem_Impl ------------------------------------
2742 
2743 class SvxReloadControllerItem_Impl
2744 {
2745 public:
2746 	Image* pNormalImage;
2747 	Image* pSpecialImage;
2748 
2749 	SvxReloadControllerItem_Impl() :
2750 		pNormalImage( new Image( SVX_RES( RID_SVX_RELOAD_NORMAL ) ) ), pSpecialImage( 0 ) {}
2751 	~SvxReloadControllerItem_Impl() { delete pNormalImage; delete pSpecialImage; }
2752 
2753 	Image& GetNormalImage() { return *pNormalImage; }
2754 	Image& GetSpecialImage()
2755 		{
2756 			if ( !pSpecialImage )
2757 				pSpecialImage = new Image( SVX_RES( RID_SVX_RELOAD_SPECIAL ) );
2758 			return *pSpecialImage;
2759 		}
2760 };
2761 
2762 // -----------------------------------------------------------------------
2763 
2764 SvxReloadControllerItem::SvxReloadControllerItem( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx )
2765 :	SfxToolBoxControl( nSlotId, nId, rTbx )
2766 ,	pImpl( new SvxReloadControllerItem_Impl )
2767 {
2768 	rTbx.SetItemImage( nId, pImpl->GetNormalImage() );
2769 }
2770 
2771 // -----------------------------------------------------------------------
2772 
2773 SvxReloadControllerItem::~SvxReloadControllerItem()
2774 {
2775 	delete pImpl;
2776 }
2777 
2778 // -----------------------------------------------------------------------
2779 
2780 void SvxReloadControllerItem::StateChanged(
2781 	sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
2782 {
2783 	SfxBoolItem* pItem = PTR_CAST( SfxBoolItem, pState );
2784 	ToolBox& rBox = GetToolBox();
2785 	if( pItem )
2786 	{
2787 		rBox.SetItemImage( GetId(),
2788 				pItem->GetValue() ? pImpl->GetSpecialImage() :
2789 				pImpl->GetNormalImage() );
2790 	}
2791 	rBox.EnableItem( GetId(), eState != SFX_ITEM_DISABLED );
2792 }
2793 
2794 //========================================================================
2795 // class SvxSimpleUndoRedoController -------------------------------------
2796 //========================================================================
2797 
2798 SvxSimpleUndoRedoController::SvxSimpleUndoRedoController( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx  )
2799     :SfxToolBoxControl( nSlotId, nId, rTbx )
2800 {
2801     aDefaultText = rTbx.GetItemText( nId );
2802 }
2803 
2804 // -----------------------------------------------------------------------
2805 
2806 SvxSimpleUndoRedoController::~SvxSimpleUndoRedoController()
2807 {
2808 }
2809 
2810 // -----------------------------------------------------------------------
2811 
2812 void SvxSimpleUndoRedoController::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
2813 {
2814     SfxStringItem* pItem = PTR_CAST( SfxStringItem, pState );
2815     ToolBox& rBox = GetToolBox();
2816     if ( pItem && eState != SFX_ITEM_DISABLED )
2817     {
2818         ::rtl::OUString aNewText( MnemonicGenerator::EraseAllMnemonicChars( pItem->GetValue() ) );
2819         rBox.SetQuickHelpText( GetId(), aNewText );
2820     }
2821     if ( eState == SFX_ITEM_DISABLED )
2822         rBox.SetQuickHelpText( GetId(), aDefaultText );
2823     rBox.EnableItem( GetId(), eState != SFX_ITEM_DISABLED );
2824 }
2825 
2826 //========================================================================
2827 
2828 void lcl_ResizeValueSet( Window &rWin, ValueSet &rValueSet )
2829 {
2830 	Size aSize = rWin.GetOutputSizePixel();
2831 	aSize.Width()  -= 4;
2832 	aSize.Height() -= 4;
2833 	rValueSet.SetPosSizePixel( Point(2,2), aSize );
2834 }
2835 
2836 // -----------------------------------------------------------------------
2837 
2838 void lcl_CalcSizeValueSet( Window &rWin, ValueSet &rValueSet, const Size &aItemSize )
2839 {
2840 	Size aSize = rValueSet.CalcWindowSizePixel( aItemSize );
2841 	aSize.Width()  += 4;
2842 	aSize.Height() += 4;
2843 	rWin.SetOutputSizePixel( aSize );
2844 }
2845 
2846 // -----------------------------------------------------------------------
2847 
2848 sal_Bool lcl_FontChangedHint( const SfxHint &rHint )
2849 {
2850 	SfxPoolItemHint *pItemHint = PTR_CAST(SfxPoolItemHint, &rHint);
2851 	if ( pItemHint )
2852 	{
2853 		SfxPoolItem *pItem = pItemHint->GetObject();
2854 		return ( pItem->Which() == SID_ATTR_CHAR_FONTLIST );
2855 	}
2856 	else
2857 	{
2858 		SfxSimpleHint* pSimpleHint = PTR_CAST(SfxSimpleHint, &rHint);
2859 		return pSimpleHint && ( SFX_HINT_DATACHANGED ==
2860 							( pSimpleHint->GetId() & SFX_HINT_DATACHANGED ) );
2861 	}
2862 }
2863 // -----------------------------------------------------------------------------
2864 Reference< ::com::sun::star::accessibility::XAccessible > SvxFontNameBox_Impl::CreateAccessible()
2865 {
2866 	FillList();
2867 	return FontNameBox::CreateAccessible();
2868 }
2869