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