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