xref: /trunk/main/svx/source/tbxctrls/fontworkgallery.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include <com/sun/star/text/WritingMode.hpp>
32 
33 #include <vcl/toolbox.hxx>
34 
35 #include <svl/itempool.hxx>
36 
37 #include <svtools/toolbarmenu.hxx>
38 #include <svtools/popupwindowcontroller.hxx>
39 #include <svtools/popupmenucontrollerbase.hxx>
40 
41 #include <sfx2/app.hxx>
42 #include <sfx2/dispatch.hxx>
43 
44 #include <editeng/eeitem.hxx>
45 #include <editeng/frmdiritem.hxx>
46 
47 #include <svx/fmmodel.hxx>
48 #include <svx/svxids.hrc>
49 #include <svx/dialmgr.hxx>
50 #include <svx/dialogs.hrc>
51 #include <svx/svdpage.hxx>
52 #include <svx/svdobj.hxx>
53 #include <svx/svdview.hxx>
54 #include <svx/svdoutl.hxx>
55 
56 #include "svx/gallery.hxx"
57 #include <svx/dlgutil.hxx>
58 
59 #include <svx/fontworkgallery.hxx>
60 #include "fontworkgallery.hrc"
61 
62 #include <algorithm>
63 
64 #include "helpid.hrc"
65 
66 using ::rtl::OUString;
67 using ::svtools::ToolbarMenu;
68 
69 using namespace ::com::sun::star;
70 using namespace ::com::sun::star::uno;
71 using namespace ::com::sun::star::lang;
72 using namespace ::com::sun::star::beans;
73 using namespace ::com::sun::star::frame;
74 
75 namespace svx
76 {
77 
78 const int nColCount = 4;
79 const int nLineCount = 4;
80 
81 /*************************************************************************
82 |*  Svx3DWin - FloatingWindow
83 \************************************************************************/
84 FontWorkGalleryDialog::FontWorkGalleryDialog( SdrView* pSdrView, Window* pParent, sal_uInt16 /*nSID*/ ) :
85         ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_GALLERY ) ),
86         maFLFavorites       ( this, SVX_RES( FL_FAVORITES ) ),
87         maCtlFavorites      ( this, SVX_RES( CTL_FAVORITES ) ),
88         maOKButton          ( this, SVX_RES( BTN_OK ) ),
89         maCancelButton      ( this, SVX_RES( BTN_CANCEL ) ),
90         maHelpButton        ( this, SVX_RES( BTN_HELP ) ),
91         mnThemeId           ( 0xffff ),
92         mpSdrView           ( pSdrView ),
93         mpModel             ( (FmFormModel*)pSdrView->GetModel() ),
94         maStrClickToAddText ( SVX_RES( STR_CLICK_TO_ADD_TEXT ) ),
95         mppSdrObject        ( NULL ),
96         mpDestModel         ( NULL )
97 {
98     FreeResource();
99 
100     maCtlFavorites.SetDoubleClickHdl( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) );
101     maOKButton.SetClickHdl( LINK( this, FontWorkGalleryDialog, ClickOKHdl ) );
102 
103     maCtlFavorites.SetColCount( nColCount );
104     maCtlFavorites.SetLineCount( nLineCount );
105     maCtlFavorites.SetExtraSpacing( 3 );
106 
107     initfavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal );
108     fillFavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal );
109 }
110 
111 static void delete_bitmap( Bitmap* p ) { delete p; }
112 
113 // -----------------------------------------------------------------------
114 FontWorkGalleryDialog::~FontWorkGalleryDialog()
115 {
116     std::for_each( maFavoritesHorizontal.begin(), maFavoritesHorizontal.end(), delete_bitmap );
117 }
118 
119 // -----------------------------------------------------------------------
120 
121 void FontWorkGalleryDialog::initfavorites(sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites)
122 {
123     // Ueber die Gallery werden die Favoriten eingelesen
124     sal_uIntPtr nFavCount = GalleryExplorer::GetSdrObjCount( nThemeId );
125 
126     // Gallery thema locken
127     GalleryExplorer::BeginLocking(nThemeId);
128 
129     sal_uInt32 nModelPos;
130     FmFormModel *pModel = NULL;
131     for( nModelPos = 0; nModelPos < nFavCount; nModelPos++ )
132     {
133         Bitmap* pThumb = new Bitmap;
134 
135         if( GalleryExplorer::GetSdrObj( nThemeId, nModelPos, pModel, pThumb ) )
136         {
137 /*
138             VirtualDevice aVDev;
139             Size aRenderSize( aThumbSize.Width() * 4, aThumbSize.Height() * 4 );
140             aVDev.SetOutputSizePixel( aRenderSize );
141 
142             if( GalleryExplorer::DrawCentered( &aVDev, *pModel ) )
143             {
144                 aThumb = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() );
145 
146                 Size aMS( 4, 4 );
147                 BmpFilterParam aParam( aMS );
148                 aThumb.Filter( BMP_FILTER_MOSAIC, &aParam );
149                 aThumb.Scale( aThumbSize );
150             }
151 */
152         }
153 
154         rFavorites.push_back( pThumb );
155     }
156 
157     // Gallery thema freigeben
158     GalleryExplorer::EndLocking(nThemeId);
159 }
160 
161 void FontWorkGalleryDialog::fillFavorites( sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites )
162 {
163     mnThemeId = nThemeId;
164 
165     Size aThumbSize( maCtlFavorites.GetSizePixel() );
166     aThumbSize.Width() /= nColCount;
167     aThumbSize.Height() /= nLineCount;
168     aThumbSize.Width() -= 12;
169     aThumbSize.Height() -= 12;
170 
171     std::vector< Bitmap * >::size_type nFavCount = rFavorites.size();
172 
173     // ValueSet Favoriten
174     if( nFavCount > (nColCount * nLineCount) )
175     {
176         WinBits nWinBits = maCtlFavorites.GetStyle();
177         nWinBits |= WB_VSCROLL;
178         maCtlFavorites.SetStyle( nWinBits );
179     }
180 
181     maCtlFavorites.Clear();
182 
183     sal_uInt32 nFavorite;
184     for( nFavorite = 1; nFavorite <= nFavCount; nFavorite++ )
185     {
186         String aStr(SVX_RES(RID_SVXFLOAT3D_FAVORITE));
187         aStr += sal_Unicode(' ');
188         aStr += String::CreateFromInt32((sal_Int32)nFavorite);
189         Image aThumbImage( *rFavorites[nFavorite-1] );
190         maCtlFavorites.InsertItem( (sal_uInt16)nFavorite, aThumbImage, aStr );
191     }
192 }
193 
194 void FontWorkGalleryDialog::changeText( SdrTextObj* pObj )
195 {
196     if( pObj )
197     {
198         SdrOutliner& rOutl = mpModel->GetDrawOutliner(pObj);
199 
200         sal_uInt16 nOutlMode = rOutl.GetMode();
201         Size aPaperSize = rOutl.GetPaperSize();
202         sal_Bool bUpdateMode = rOutl.GetUpdateMode();
203         rOutl.SetUpdateMode(sal_False);
204         rOutl.SetParaAttribs( 0, rOutl.GetEmptyItemSet() );
205 
206         // #95114# Always set the object's StyleSheet at the Outliner to
207         // use the current objects StyleSheet. Thus it's the same as in
208         // SetText(...).
209         // #95114# Moved this implementation from where SetObjText(...) was called
210         // to inside this method to work even when outliner is fetched here.
211         rOutl.SetStyleSheet(0, pObj->GetStyleSheet());
212 
213         rOutl.SetPaperSize( pObj->GetLogicRect().GetSize() );
214 
215         rOutl.SetText( maStrClickToAddText, rOutl.GetParagraph( 0 ) );
216         pObj->SetOutlinerParaObject( rOutl.CreateParaObject() );
217 
218         rOutl.Init( nOutlMode );
219         rOutl.SetParaAttribs( 0, rOutl.GetEmptyItemSet() );
220         rOutl.SetUpdateMode( bUpdateMode );
221         rOutl.SetPaperSize( aPaperSize );
222 
223         rOutl.Clear();
224     }
225 }
226 
227 void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel* pModel )
228 {
229     mppSdrObject = ppSdrObject;
230     mpDestModel = pModel;
231 }
232 
233 void FontWorkGalleryDialog::insertSelectedFontwork()
234 {
235     sal_uInt16 nItemId = maCtlFavorites.GetSelectItemId();
236 
237     if( nItemId > 0 )
238     {
239         FmFormModel* pModel = new FmFormModel();
240         pModel->GetItemPool().FreezeIdRanges();
241 
242         if( GalleryExplorer::GetSdrObj( mnThemeId, nItemId-1, pModel ) )
243         {
244             SdrPage* pPage = pModel->GetPage(0);
245             if( pPage && pPage->GetObjCount() )
246             {
247                 SdrObject* pNewObject = pPage->GetObj(0)->Clone();
248 
249                 // center shape on current view
250                 OutputDevice* pOutDev = mpSdrView->GetFirstOutputDevice();
251                 if( pOutDev )
252                 {
253                     Rectangle aObjRect( pNewObject->GetLogicRect() );
254                     Rectangle aVisArea = pOutDev->PixelToLogic(Rectangle(Point(0,0), pOutDev->GetOutputSizePixel()));
255 /*
256                     sal_Int32 nObjHeight = aObjRect.GetHeight();
257                     VirtualDevice aVirDev( 1 ); // calculating the optimal textwidth
258                     Font aFont;
259                     aFont.SetHeight( nObjHeight );
260                     aVirDev.SetMapMode( MAP_100TH_MM );
261                     aVirDev.SetFont( aFont );
262                     aObjRect.SetSize( Size( aVirDev.GetTextWidth( maStrClickToAddText ), nObjHeight ) );
263 */
264                     Point aPagePos = aVisArea.Center();
265                     aPagePos.X() -= aObjRect.GetWidth() / 2;
266                     aPagePos.Y() -= aObjRect.GetHeight() / 2;
267                     Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize());
268                     SdrPageView* pPV = mpSdrView->GetSdrPageView();
269 
270                     pNewObject->SetLogicRect(aNewObjectRectangle);
271                     if ( mppSdrObject )
272                     {
273                         *mppSdrObject = pNewObject;
274                         (*mppSdrObject)->SetModel( mpDestModel );
275                     }
276                     else if( pPV )
277                     {
278                             mpSdrView->InsertObjectAtView( pNewObject, *pPV );
279     //                      changeText( PTR_CAST( SdrTextObj, pNewObject ) );
280                     }
281                 }
282             }
283         }
284 
285         delete pModel;
286     }
287 }
288 
289 // -----------------------------------------------------------------------
290 
291 IMPL_LINK( FontWorkGalleryDialog, ClickOKHdl, void*, EMPTYARG )
292 {
293     insertSelectedFontwork();
294     EndDialog( true );
295     return 0;
296 }
297 
298 // -----------------------------------------------------------------------
299 
300 IMPL_LINK( FontWorkGalleryDialog, DoubleClickFavoriteHdl, void*, EMPTYARG )
301 {
302     insertSelectedFontwork();
303     EndDialog( true );
304     return( 0L );
305 }
306 
307 //------------------------------------------------------------------------
308 
309 SFX_IMPL_TOOLBOX_CONTROL( FontWorkShapeTypeControl, SfxStringItem );
310 FontWorkShapeTypeControl::FontWorkShapeTypeControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx )
311 : SfxToolBoxControl( nSlotId, nId, rTbx )
312 {
313     rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
314     rTbx.Invalidate();
315 }
316 
317 // -----------------------------------------------------------------------
318 
319 FontWorkShapeTypeControl::~FontWorkShapeTypeControl()
320 {
321 }
322 
323 // -----------------------------------------------------------------------
324 
325 SfxPopupWindowType FontWorkShapeTypeControl::GetPopupWindowType() const
326 {
327     return SFX_POPUPWINDOW_ONCLICK; //( aLastAction.getLength() == 0 ? SFX_POPUPWINDOW_ONCLICK : SFX_POPUPWINDOW_ONTIMEOUT );
328 }
329 
330 // -----------------------------------------------------------------------
331 
332 SfxPopupWindow* FontWorkShapeTypeControl::CreatePopupWindow()
333 {
334     rtl::OUString aSubTbxResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/fontworkshapetype" ) );
335     createAndPositionSubToolBar( aSubTbxResName );
336     return NULL;
337 }
338 
339 // -----------------------------------------------------------------------
340 
341 void FontWorkShapeTypeControl::Select( sal_Bool )
342 {
343 
344 }
345 
346 // ========================================================================
347 // FontWorkAlignmentWindow
348 // ========================================================================
349 
350 class FontWorkAlignmentWindow : public ToolbarMenu
351 {
352 public:
353     FontWorkAlignmentWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow );
354 
355     virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException );
356     virtual void DataChanged( const DataChangedEvent& rDCEvt );
357 
358 private:
359     svt::ToolboxController& mrController;
360 
361     Image maImgAlgin1;
362     Image maImgAlgin2;
363     Image maImgAlgin3;
364     Image maImgAlgin4;
365     Image maImgAlgin5;
366     Image maImgAlgin1h;
367     Image maImgAlgin2h;
368     Image maImgAlgin3h;
369     Image maImgAlgin4h;
370     Image maImgAlgin5h;
371 
372     const rtl::OUString msFontworkAlignment;
373 
374     DECL_LINK( SelectHdl, void * );
375 
376     void    implSetAlignment( int nAlignmentMode, bool bEnabled );
377 };
378 
379 FontWorkAlignmentWindow::FontWorkAlignmentWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow )
380 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_FONTWORK_ALIGNMENT ))
381 , mrController( rController )
382 , maImgAlgin1( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16 ) )
383 , maImgAlgin2( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16 ) )
384 , maImgAlgin3( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16 ) )
385 , maImgAlgin4( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16 ) )
386 , maImgAlgin5( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16 ) )
387 , maImgAlgin1h( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16_H ) )
388 , maImgAlgin2h( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16_H ) )
389 , maImgAlgin3h( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16_H ) )
390 , maImgAlgin4h( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16_H ) )
391 , maImgAlgin5h( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16_H ) )
392 , msFontworkAlignment( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" ) )
393 {
394     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
395 
396     SetHelpId( HID_POPUP_FONTWORK_ALIGN );
397     SetSelectHdl( LINK( this, FontWorkAlignmentWindow, SelectHdl ) );
398 
399     appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), bHighContrast ? maImgAlgin1h : maImgAlgin1 );
400     appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), bHighContrast ? maImgAlgin2h : maImgAlgin2 );
401     appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), bHighContrast ? maImgAlgin3h : maImgAlgin3 );
402     appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), bHighContrast ? maImgAlgin4h : maImgAlgin4 );
403     appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), bHighContrast ? maImgAlgin5h : maImgAlgin5 );
404 
405     SetOutputSizePixel( getMenuSize() );
406 
407     FreeResource();
408 
409     AddStatusListener( msFontworkAlignment );
410 }
411 
412 // -----------------------------------------------------------------------
413 
414 void FontWorkAlignmentWindow::implSetAlignment( int nSurface, bool bEnabled )
415 {
416     int i;
417     for( i = 0; i < 5; i++ )
418     {
419         checkEntry( i, (i == nSurface) && bEnabled );
420         enableEntry( i, bEnabled );
421     }
422 }
423 
424 // -----------------------------------------------------------------------
425 
426 void SAL_CALL FontWorkAlignmentWindow::statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException )
427 {
428     if( Event.FeatureURL.Main.equals( msFontworkAlignment ) )
429     {
430         if( !Event.IsEnabled )
431         {
432             implSetAlignment( 0, false );
433         }
434         else
435         {
436             sal_Int32 nValue = 0;
437             if( Event.State >>= nValue )
438                 implSetAlignment( nValue, true );
439         }
440     }
441 }
442 
443 // -----------------------------------------------------------------------
444 
445 void FontWorkAlignmentWindow::DataChanged( const DataChangedEvent& rDCEvt )
446 {
447     ToolbarMenu::DataChanged( rDCEvt );
448 
449     if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
450     {
451         bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
452 
453         appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), bHighContrast ? maImgAlgin1h : maImgAlgin1 );
454         appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), bHighContrast ? maImgAlgin2h : maImgAlgin2 );
455         appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), bHighContrast ? maImgAlgin3h : maImgAlgin3 );
456         appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), bHighContrast ? maImgAlgin4h : maImgAlgin4 );
457         appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), bHighContrast ? maImgAlgin5h : maImgAlgin5 );
458     }
459 }
460 
461 // -----------------------------------------------------------------------
462 
463 IMPL_LINK( FontWorkAlignmentWindow, SelectHdl, void *, EMPTYARG )
464 {
465     if ( IsInPopupMode() )
466         EndPopupMode();
467 
468     sal_Int32 nAlignment = getSelectedEntryId();
469     if( nAlignment >= 0 )
470     {
471         Sequence< PropertyValue > aArgs( 1 );
472         aArgs[0].Name = msFontworkAlignment.copy(5);
473         aArgs[0].Value <<= (sal_Int32)nAlignment;
474 
475         mrController.dispatchCommand( msFontworkAlignment, aArgs );
476 
477         implSetAlignment( nAlignment, true );
478     }
479 
480     return 0;
481 }
482 
483 // ========================================================================
484 // FontWorkAlignmentControl
485 // ========================================================================
486 
487 class FontWorkAlignmentControl : public svt::PopupWindowController
488 {
489 public:
490     FontWorkAlignmentControl( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
491 
492     virtual ::Window* createPopupWindow( ::Window* pParent );
493 
494     // XServiceInfo
495     virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
496     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
497 
498     using  svt::PopupWindowController::createPopupWindow;
499 };
500 
501 
502 // -----------------------------------------------------------------------
503 
504 FontWorkAlignmentControl::FontWorkAlignmentControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
505 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" ) ) )
506 {
507 }
508 
509 // -----------------------------------------------------------------------
510 
511 ::Window* FontWorkAlignmentControl::createPopupWindow( ::Window* pParent )
512 {
513     return new FontWorkAlignmentWindow( *this, m_xFrame, pParent );
514 }
515 
516 // -----------------------------------------------------------------------
517 // XServiceInfo
518 // -----------------------------------------------------------------------
519 
520 OUString SAL_CALL FontWorkAlignmentControl_getImplementationName()
521 {
522     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FontWorkAlignmentController" ));
523 }
524 
525 // --------------------------------------------------------------------
526 
527 Sequence< OUString > SAL_CALL FontWorkAlignmentControl_getSupportedServiceNames() throw( RuntimeException )
528 {
529     Sequence< OUString > aSNS( 1 );
530     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
531     return aSNS;
532 }
533 
534 // --------------------------------------------------------------------
535 
536 Reference< XInterface > SAL_CALL SAL_CALL FontWorkAlignmentControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
537 {
538     return *new FontWorkAlignmentControl( rSMgr );
539 }
540 
541 // --------------------------------------------------------------------
542 
543 OUString SAL_CALL FontWorkAlignmentControl::getImplementationName(  ) throw (RuntimeException)
544 {
545     return FontWorkAlignmentControl_getImplementationName();
546 }
547 
548 // --------------------------------------------------------------------
549 
550 Sequence< OUString > SAL_CALL FontWorkAlignmentControl::getSupportedServiceNames(  ) throw (RuntimeException)
551 {
552     return FontWorkAlignmentControl_getSupportedServiceNames();
553 }
554 
555 
556 // ####################################################################
557 
558 class FontWorkCharacterSpacingWindow : public ToolbarMenu
559 {
560 public:
561     FontWorkCharacterSpacingWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow );
562 
563     virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException );
564 private:
565     svt::ToolboxController& mrController;
566 
567     const rtl::OUString msFontworkCharacterSpacing;
568     const rtl::OUString msFontworkKernCharacterPairs;
569 
570     DECL_LINK( SelectHdl, void * );
571 
572     void    implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled );
573     void    implSetKernCharacterPairs( sal_Bool bKernOnOff, bool bEnabled );
574 
575 };
576 
577 // -----------------------------------------------------------------------
578 
579 FontWorkCharacterSpacingWindow::FontWorkCharacterSpacingWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow )
580 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_FONTWORK_CHARSPACING ))
581 , mrController( rController )
582 , msFontworkCharacterSpacing( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacing" ) )
583 , msFontworkKernCharacterPairs( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkKernCharacterPairs" ) )
584 {
585     SetHelpId( HID_POPUP_FONTWORK_CHARSPACE );
586     SetSelectHdl( LINK( this, FontWorkCharacterSpacingWindow, SelectHdl ) );
587 
588     appendEntry( 0, String( SVX_RES( STR_CHARS_SPACING_VERY_TIGHT ) ), MIB_RADIOCHECK );
589     appendEntry( 1, String( SVX_RES( STR_CHARS_SPACING_TIGHT ) ), MIB_RADIOCHECK );
590     appendEntry( 2, String( SVX_RES( STR_CHARS_SPACING_NORMAL ) ), MIB_RADIOCHECK );
591     appendEntry( 3, String( SVX_RES( STR_CHARS_SPACING_LOOSE ) ), MIB_RADIOCHECK );
592     appendEntry( 4, String( SVX_RES( STR_CHARS_SPACING_VERY_LOOSE ) ), MIB_RADIOCHECK );
593     appendEntry( 5, String( SVX_RES( STR_CHARS_SPACING_CUSTOM ) ), MIB_RADIOCHECK );
594     appendSeparator();
595     appendEntry( 6, String( SVX_RES( STR_CHARS_SPACING_KERN_PAIRS ) ), MIB_CHECKABLE );
596 
597     SetOutputSizePixel( getMenuSize() );
598 
599     FreeResource();
600 
601     AddStatusListener( msFontworkCharacterSpacing );
602     AddStatusListener( msFontworkKernCharacterPairs );
603 }
604 
605 // -----------------------------------------------------------------------
606 
607 void FontWorkCharacterSpacingWindow::implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled )
608 {
609     sal_Int32 i;
610     for ( i = 0; i < 6; i++ )
611     {
612         checkEntry( i, sal_False );
613         enableEntry( i, bEnabled );
614     }
615     if ( nCharacterSpacing != -1 )
616     {
617         sal_Int32 nEntry;
618         switch( nCharacterSpacing )
619         {
620             case 80 : nEntry = 0; break;
621             case 90 : nEntry = 1; break;
622             case 100 : nEntry = 2; break;
623             case 120 : nEntry = 3; break;
624             case 150 : nEntry = 4; break;
625             default : nEntry = 5; break;
626         }
627         checkEntry( nEntry, bEnabled );
628     }
629 }
630 
631 // -----------------------------------------------------------------------
632 
633 void FontWorkCharacterSpacingWindow::implSetKernCharacterPairs( sal_Bool, bool bEnabled )
634 {
635     enableEntry( 6, bEnabled );
636     checkEntry( 6, bEnabled );
637 }
638 
639 // -----------------------------------------------------------------------
640 
641 void SAL_CALL FontWorkCharacterSpacingWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
642 {
643     if( Event.FeatureURL.Main.equals( msFontworkCharacterSpacing ) )
644     {
645         if( !Event.IsEnabled )
646         {
647             implSetCharacterSpacing( 0, false );
648         }
649         else
650         {
651             sal_Int32 nValue = 0;
652             if( Event.State >>= nValue )
653                 implSetCharacterSpacing( nValue, true );
654         }
655     }
656     else if( Event.FeatureURL.Main.equals( msFontworkKernCharacterPairs ) )
657     {
658         if( !Event.IsEnabled )
659         {
660             implSetKernCharacterPairs( 0, false );
661         }
662         else
663         {
664             sal_Bool bValue = sal_False;
665             if( Event.State >>= bValue )
666                 implSetKernCharacterPairs( bValue, true );
667         }
668     }
669 }
670 
671 // -----------------------------------------------------------------------
672 
673 IMPL_LINK( FontWorkCharacterSpacingWindow, SelectHdl, void *, EMPTYARG )
674 {
675     if ( IsInPopupMode() )
676         EndPopupMode();
677 
678     sal_Int32 nSelection = getSelectedEntryId();
679     sal_Int32 nCharacterSpacing;
680     switch( nSelection )
681     {
682         case 0 : nCharacterSpacing = 80; break;
683         case 1 : nCharacterSpacing = 90; break;
684         case 2 : nCharacterSpacing = 100; break;
685         case 3 : nCharacterSpacing = 120; break;
686         case 4 : nCharacterSpacing = 150; break;
687         default : nCharacterSpacing = 100; break;
688     }
689     if ( nSelection == 5 )  // custom spacing
690     {
691         Sequence< PropertyValue > aArgs( 1 );
692         aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
693         aArgs[0].Value <<= (sal_Int32)nCharacterSpacing;
694 
695         mrController.dispatchCommand( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacingDialog" )), aArgs );
696     }
697     else if ( nSelection == 6 ) // KernCharacterPairs
698     {
699         rtl::OUString   aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkKernCharacterPairs" ));
700 
701         Sequence< PropertyValue > aArgs( 1 );
702         aArgs[0].Name = msFontworkKernCharacterPairs.copy(5);
703         aArgs[0].Value <<= (sal_Bool) sal_True;
704 
705         mrController.dispatchCommand( msFontworkKernCharacterPairs, aArgs );
706 
707         implSetKernCharacterPairs( sal_True, true );
708     }
709     else if( nSelection >= 0 )
710     {
711         Sequence< PropertyValue > aArgs( 1 );
712         aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
713         aArgs[0].Value <<=( sal_Int32)nCharacterSpacing;
714 
715         mrController.dispatchCommand( msFontworkCharacterSpacing,  aArgs );
716 
717         implSetCharacterSpacing( nCharacterSpacing, true );
718     }
719 
720     return 0;
721 }
722 
723 // ========================================================================
724 // FontWorkCharacterSpacingControl
725 // ========================================================================
726 
727 class FontWorkCharacterSpacingControl : public svt::PopupWindowController
728 {
729 public:
730     FontWorkCharacterSpacingControl( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
731 
732     virtual ::Window* createPopupWindow( ::Window* pParent );
733 
734     // XServiceInfo
735     virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
736     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
737 
738     using svt::PopupWindowController::createPopupWindow;
739 };
740 
741 
742 FontWorkCharacterSpacingControl::FontWorkCharacterSpacingControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
743 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacingFloater" ) ) )
744 {
745 }
746 
747 // -----------------------------------------------------------------------
748 
749 ::Window* FontWorkCharacterSpacingControl::createPopupWindow( ::Window* pParent )
750 {
751     return new FontWorkCharacterSpacingWindow( *this, m_xFrame, pParent );
752 }
753 
754 // -----------------------------------------------------------------------
755 // XServiceInfo
756 // -----------------------------------------------------------------------
757 
758 OUString SAL_CALL FontWorkCharacterSpacingControl_getImplementationName()
759 {
760     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FontWorkCharacterSpacingController" ));
761 }
762 
763 // --------------------------------------------------------------------
764 
765 Sequence< OUString > SAL_CALL FontWorkCharacterSpacingControl_getSupportedServiceNames() throw( RuntimeException )
766 {
767     Sequence< OUString > aSNS( 1 );
768     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
769     return aSNS;
770 }
771 
772 // --------------------------------------------------------------------
773 
774 Reference< XInterface > SAL_CALL SAL_CALL FontWorkCharacterSpacingControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
775 {
776     return *new FontWorkCharacterSpacingControl( rSMgr );
777 }
778 
779 // --------------------------------------------------------------------
780 
781 OUString SAL_CALL FontWorkCharacterSpacingControl::getImplementationName(  ) throw (RuntimeException)
782 {
783     return FontWorkCharacterSpacingControl_getImplementationName();
784 }
785 
786 // --------------------------------------------------------------------
787 
788 Sequence< OUString > SAL_CALL FontWorkCharacterSpacingControl::getSupportedServiceNames(  ) throw (RuntimeException)
789 {
790     return FontWorkCharacterSpacingControl_getSupportedServiceNames();
791 }
792 
793 // ========================================================================
794 // FontworkCharacterSpacingDialog
795 // ========================================================================
796 
797 FontworkCharacterSpacingDialog::FontworkCharacterSpacingDialog( Window* pParent, sal_Int32 nScale )
798 :   ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_CHARSPACING ) ),
799     maFLScale( this, SVX_RES( FT_VALUE ) ),
800     maMtrScale( this, SVX_RES( MF_VALUE ) ),
801     maOKButton( this, SVX_RES( BTN_OK ) ),
802     maCancelButton( this, SVX_RES( BTN_CANCEL ) ),
803     maHelpButton( this, SVX_RES( BTN_HELP ) )
804 {
805     maMtrScale.SetValue( nScale );
806     FreeResource();
807 }
808 
809 FontworkCharacterSpacingDialog::~FontworkCharacterSpacingDialog()
810 {
811 }
812 
813 sal_Int32 FontworkCharacterSpacingDialog::getScale() const
814 {
815     return (sal_Int32)maMtrScale.GetValue();
816 }
817 
818 }
819