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