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 :
21 : #include <com/sun/star/text/WritingMode.hpp>
22 :
23 : #include <vcl/toolbox.hxx>
24 :
25 : #include <svl/itempool.hxx>
26 :
27 : #include <svtools/toolbarmenu.hxx>
28 : #include <svtools/popupwindowcontroller.hxx>
29 : #include <svtools/popupmenucontrollerbase.hxx>
30 :
31 : #include <sfx2/app.hxx>
32 : #include <sfx2/dispatch.hxx>
33 :
34 : #include <editeng/eeitem.hxx>
35 : #include <editeng/frmdiritem.hxx>
36 :
37 : #include <svx/fmmodel.hxx>
38 : #include <svx/svxids.hrc>
39 : #include <svx/dialmgr.hxx>
40 : #include <svx/dialogs.hrc>
41 : #include <svx/svdpage.hxx>
42 : #include <svx/svdobj.hxx>
43 : #include <svx/svdview.hxx>
44 : #include <svx/svdoutl.hxx>
45 :
46 : #include "svx/gallery.hxx"
47 : #include <svx/dlgutil.hxx>
48 :
49 : #include <svx/fontworkgallery.hxx>
50 : #include "fontworkgallery.hrc"
51 :
52 : #include <algorithm>
53 :
54 : #include "helpid.hrc"
55 :
56 : using ::rtl::OUString;
57 : using ::svtools::ToolbarMenu;
58 :
59 : using namespace ::com::sun::star;
60 : using namespace ::com::sun::star::uno;
61 : using namespace ::com::sun::star::lang;
62 : using namespace ::com::sun::star::beans;
63 : using namespace ::com::sun::star::frame;
64 :
65 : namespace svx
66 : {
67 :
68 : const int nColCount = 4;
69 : const int nLineCount = 4;
70 :
71 : /*************************************************************************
72 : |* Svx3DWin - FloatingWindow
73 : \************************************************************************/
74 0 : FontWorkGalleryDialog::FontWorkGalleryDialog( SdrView* pSdrView, Window* pParent, sal_uInt16 /*nSID*/ ) :
75 0 : ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_GALLERY ) ),
76 0 : maFLFavorites ( this, SVX_RES( FL_FAVORITES ) ),
77 0 : maCtlFavorites ( this, SVX_RES( CTL_FAVORITES ) ),
78 0 : maOKButton ( this, SVX_RES( BTN_OK ) ),
79 0 : maCancelButton ( this, SVX_RES( BTN_CANCEL ) ),
80 0 : maHelpButton ( this, SVX_RES( BTN_HELP ) ),
81 : mnThemeId ( 0xffff ),
82 : mpSdrView ( pSdrView ),
83 0 : mpModel ( (FmFormModel*)pSdrView->GetModel() ),
84 0 : maStrClickToAddText ( SVX_RES( STR_CLICK_TO_ADD_TEXT ) ),
85 : mppSdrObject ( NULL ),
86 0 : mpDestModel ( NULL )
87 : {
88 0 : FreeResource();
89 :
90 0 : maCtlFavorites.SetDoubleClickHdl( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) );
91 0 : maOKButton.SetClickHdl( LINK( this, FontWorkGalleryDialog, ClickOKHdl ) );
92 :
93 0 : maCtlFavorites.SetColCount( nColCount );
94 0 : maCtlFavorites.SetLineCount( nLineCount );
95 0 : maCtlFavorites.SetExtraSpacing( 3 );
96 :
97 0 : initfavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal );
98 0 : fillFavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal );
99 0 : }
100 :
101 0 : static void delete_bitmap( Bitmap* p ) { delete p; }
102 :
103 : // -----------------------------------------------------------------------
104 0 : FontWorkGalleryDialog::~FontWorkGalleryDialog()
105 : {
106 0 : std::for_each( maFavoritesHorizontal.begin(), maFavoritesHorizontal.end(), delete_bitmap );
107 0 : }
108 :
109 : // -----------------------------------------------------------------------
110 :
111 0 : void FontWorkGalleryDialog::initfavorites(sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites)
112 : {
113 : // Ueber die Gallery werden die Favoriten eingelesen
114 0 : sal_uIntPtr nFavCount = GalleryExplorer::GetSdrObjCount( nThemeId );
115 :
116 : // Gallery thema locken
117 0 : GalleryExplorer::BeginLocking(nThemeId);
118 :
119 : sal_uInt32 nModelPos;
120 0 : FmFormModel *pModel = NULL;
121 0 : for( nModelPos = 0; nModelPos < nFavCount; nModelPos++ )
122 : {
123 0 : Bitmap* pThumb = new Bitmap;
124 :
125 0 : if( GalleryExplorer::GetSdrObj( nThemeId, nModelPos, pModel, pThumb ) )
126 : {
127 : }
128 :
129 0 : rFavorites.push_back( pThumb );
130 : }
131 :
132 : // Gallery thema freigeben
133 0 : GalleryExplorer::EndLocking(nThemeId);
134 0 : }
135 :
136 0 : void FontWorkGalleryDialog::fillFavorites( sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites )
137 : {
138 0 : mnThemeId = nThemeId;
139 :
140 0 : Size aThumbSize( maCtlFavorites.GetSizePixel() );
141 0 : aThumbSize.Width() /= nColCount;
142 0 : aThumbSize.Height() /= nLineCount;
143 0 : aThumbSize.Width() -= 12;
144 0 : aThumbSize.Height() -= 12;
145 :
146 0 : std::vector< Bitmap * >::size_type nFavCount = rFavorites.size();
147 :
148 : // ValueSet Favoriten
149 0 : if( nFavCount > (nColCount * nLineCount) )
150 : {
151 0 : WinBits nWinBits = maCtlFavorites.GetStyle();
152 0 : nWinBits |= WB_VSCROLL;
153 0 : maCtlFavorites.SetStyle( nWinBits );
154 : }
155 :
156 0 : maCtlFavorites.Clear();
157 :
158 : sal_uInt32 nFavorite;
159 0 : for( nFavorite = 1; nFavorite <= nFavCount; nFavorite++ )
160 : {
161 0 : String aStr(SVX_RES(RID_SVXFLOAT3D_FAVORITE));
162 0 : aStr += sal_Unicode(' ');
163 0 : aStr += String::CreateFromInt32((sal_Int32)nFavorite);
164 0 : Image aThumbImage( *rFavorites[nFavorite-1] );
165 0 : maCtlFavorites.InsertItem( (sal_uInt16)nFavorite, aThumbImage, aStr );
166 0 : }
167 0 : }
168 :
169 0 : void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel* pModel )
170 : {
171 0 : mppSdrObject = ppSdrObject;
172 0 : mpDestModel = pModel;
173 0 : }
174 :
175 0 : void FontWorkGalleryDialog::insertSelectedFontwork()
176 : {
177 0 : sal_uInt16 nItemId = maCtlFavorites.GetSelectItemId();
178 :
179 0 : if( nItemId > 0 )
180 : {
181 0 : FmFormModel* pModel = new FmFormModel();
182 0 : pModel->GetItemPool().FreezeIdRanges();
183 :
184 0 : if( GalleryExplorer::GetSdrObj( mnThemeId, nItemId-1, pModel ) )
185 : {
186 0 : SdrPage* pPage = pModel->GetPage(0);
187 0 : if( pPage && pPage->GetObjCount() )
188 : {
189 0 : SdrObject* pNewObject = pPage->GetObj(0)->Clone();
190 :
191 : // center shape on current view
192 0 : OutputDevice* pOutDev = mpSdrView->GetFirstOutputDevice();
193 0 : if( pOutDev )
194 : {
195 0 : Rectangle aObjRect( pNewObject->GetLogicRect() );
196 0 : Rectangle aVisArea = pOutDev->PixelToLogic(Rectangle(Point(0,0), pOutDev->GetOutputSizePixel()));
197 0 : Point aPagePos = aVisArea.Center();
198 0 : aPagePos.X() -= aObjRect.GetWidth() / 2;
199 0 : aPagePos.Y() -= aObjRect.GetHeight() / 2;
200 0 : Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize());
201 0 : SdrPageView* pPV = mpSdrView->GetSdrPageView();
202 :
203 0 : pNewObject->SetLogicRect(aNewObjectRectangle);
204 0 : if ( mppSdrObject )
205 : {
206 0 : *mppSdrObject = pNewObject;
207 0 : (*mppSdrObject)->SetModel( mpDestModel );
208 : }
209 0 : else if( pPV )
210 : {
211 0 : mpSdrView->InsertObjectAtView( pNewObject, *pPV );
212 : }
213 : }
214 : }
215 : }
216 :
217 0 : delete pModel;
218 : }
219 0 : }
220 :
221 : // -----------------------------------------------------------------------
222 :
223 0 : IMPL_LINK_NOARG(FontWorkGalleryDialog, ClickOKHdl)
224 : {
225 0 : insertSelectedFontwork();
226 0 : EndDialog( true );
227 0 : return 0;
228 : }
229 :
230 : // -----------------------------------------------------------------------
231 :
232 0 : IMPL_LINK_NOARG(FontWorkGalleryDialog, DoubleClickFavoriteHdl)
233 : {
234 0 : insertSelectedFontwork();
235 0 : EndDialog( true );
236 0 : return( 0L );
237 : }
238 :
239 : //------------------------------------------------------------------------
240 :
241 18 : SFX_IMPL_TOOLBOX_CONTROL( FontWorkShapeTypeControl, SfxStringItem );
242 0 : FontWorkShapeTypeControl::FontWorkShapeTypeControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx )
243 0 : : SfxToolBoxControl( nSlotId, nId, rTbx )
244 : {
245 0 : rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
246 0 : rTbx.Invalidate();
247 0 : }
248 :
249 : // -----------------------------------------------------------------------
250 :
251 0 : FontWorkShapeTypeControl::~FontWorkShapeTypeControl()
252 : {
253 0 : }
254 :
255 : // -----------------------------------------------------------------------
256 :
257 0 : SfxPopupWindowType FontWorkShapeTypeControl::GetPopupWindowType() const
258 : {
259 0 : return SFX_POPUPWINDOW_ONCLICK; //( aLastAction.getLength() == 0 ? SFX_POPUPWINDOW_ONCLICK : SFX_POPUPWINDOW_ONTIMEOUT );
260 : }
261 :
262 : // -----------------------------------------------------------------------
263 :
264 0 : SfxPopupWindow* FontWorkShapeTypeControl::CreatePopupWindow()
265 : {
266 0 : rtl::OUString aSubTbxResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/fontworkshapetype" ) );
267 0 : createAndPositionSubToolBar( aSubTbxResName );
268 0 : return NULL;
269 : }
270 :
271 : // -----------------------------------------------------------------------
272 :
273 0 : void FontWorkShapeTypeControl::Select( sal_Bool )
274 : {
275 :
276 0 : }
277 :
278 : // ========================================================================
279 : // FontWorkAlignmentWindow
280 : // ========================================================================
281 :
282 0 : class FontWorkAlignmentWindow : public ToolbarMenu
283 : {
284 : public:
285 : FontWorkAlignmentWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow );
286 :
287 : virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException );
288 : virtual void DataChanged( const DataChangedEvent& rDCEvt );
289 :
290 : private:
291 : svt::ToolboxController& mrController;
292 :
293 : Image maImgAlgin1;
294 : Image maImgAlgin2;
295 : Image maImgAlgin3;
296 : Image maImgAlgin4;
297 : Image maImgAlgin5;
298 :
299 : const rtl::OUString msFontworkAlignment;
300 :
301 : DECL_LINK( SelectHdl, void * );
302 :
303 : void implSetAlignment( int nAlignmentMode, bool bEnabled );
304 : };
305 :
306 0 : FontWorkAlignmentWindow::FontWorkAlignmentWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow )
307 0 : : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_FONTWORK_ALIGNMENT ))
308 : , mrController( rController )
309 0 : , maImgAlgin1( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16 ) )
310 0 : , maImgAlgin2( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16 ) )
311 0 : , maImgAlgin3( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16 ) )
312 0 : , maImgAlgin4( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16 ) )
313 0 : , maImgAlgin5( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16 ) )
314 0 : , msFontworkAlignment( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" ) )
315 : {
316 0 : SetHelpId( HID_POPUP_FONTWORK_ALIGN );
317 0 : SetSelectHdl( LINK( this, FontWorkAlignmentWindow, SelectHdl ) );
318 :
319 0 : appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), maImgAlgin1 );
320 0 : appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), maImgAlgin2 );
321 0 : appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), maImgAlgin3 );
322 0 : appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), maImgAlgin4 );
323 0 : appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), maImgAlgin5 );
324 :
325 0 : SetOutputSizePixel( getMenuSize() );
326 :
327 0 : FreeResource();
328 :
329 0 : AddStatusListener( msFontworkAlignment );
330 0 : }
331 :
332 : // -----------------------------------------------------------------------
333 :
334 0 : void FontWorkAlignmentWindow::implSetAlignment( int nSurface, bool bEnabled )
335 : {
336 : int i;
337 0 : for( i = 0; i < 5; i++ )
338 : {
339 0 : checkEntry( i, (i == nSurface) && bEnabled );
340 0 : enableEntry( i, bEnabled );
341 : }
342 0 : }
343 :
344 : // -----------------------------------------------------------------------
345 :
346 0 : void SAL_CALL FontWorkAlignmentWindow::statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException )
347 : {
348 0 : if( Event.FeatureURL.Main.equals( msFontworkAlignment ) )
349 : {
350 0 : if( !Event.IsEnabled )
351 : {
352 0 : implSetAlignment( 0, false );
353 : }
354 : else
355 : {
356 0 : sal_Int32 nValue = 0;
357 0 : if( Event.State >>= nValue )
358 0 : implSetAlignment( nValue, true );
359 : }
360 : }
361 0 : }
362 :
363 : // -----------------------------------------------------------------------
364 :
365 0 : void FontWorkAlignmentWindow::DataChanged( const DataChangedEvent& rDCEvt )
366 : {
367 0 : ToolbarMenu::DataChanged( rDCEvt );
368 :
369 0 : if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
370 : {
371 0 : appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), maImgAlgin1 );
372 0 : appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), maImgAlgin2 );
373 0 : appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), maImgAlgin3 );
374 0 : appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), maImgAlgin4 );
375 0 : appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), maImgAlgin5 );
376 : }
377 0 : }
378 :
379 : // -----------------------------------------------------------------------
380 :
381 0 : IMPL_LINK_NOARG(FontWorkAlignmentWindow, SelectHdl)
382 : {
383 0 : if ( IsInPopupMode() )
384 0 : EndPopupMode();
385 :
386 0 : sal_Int32 nAlignment = getSelectedEntryId();
387 0 : if( nAlignment >= 0 )
388 : {
389 0 : Sequence< PropertyValue > aArgs( 1 );
390 0 : aArgs[0].Name = msFontworkAlignment.copy(5);
391 0 : aArgs[0].Value <<= (sal_Int32)nAlignment;
392 :
393 0 : mrController.dispatchCommand( msFontworkAlignment, aArgs );
394 :
395 0 : implSetAlignment( nAlignment, true );
396 : }
397 :
398 0 : return 0;
399 : }
400 :
401 : // ========================================================================
402 : // FontWorkAlignmentControl
403 : // ========================================================================
404 :
405 0 : class FontWorkAlignmentControl : public svt::PopupWindowController
406 : {
407 : public:
408 : FontWorkAlignmentControl( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
409 :
410 : virtual ::Window* createPopupWindow( ::Window* pParent );
411 :
412 : // XServiceInfo
413 : virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
414 : virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
415 :
416 : using svt::PopupWindowController::createPopupWindow;
417 : };
418 :
419 :
420 : // -----------------------------------------------------------------------
421 :
422 0 : FontWorkAlignmentControl::FontWorkAlignmentControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
423 0 : : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" ) ) )
424 : {
425 0 : }
426 :
427 : // -----------------------------------------------------------------------
428 :
429 0 : ::Window* FontWorkAlignmentControl::createPopupWindow( ::Window* pParent )
430 : {
431 0 : return new FontWorkAlignmentWindow( *this, m_xFrame, pParent );
432 : }
433 :
434 : // -----------------------------------------------------------------------
435 : // XServiceInfo
436 : // -----------------------------------------------------------------------
437 :
438 0 : OUString SAL_CALL FontWorkAlignmentControl_getImplementationName()
439 : {
440 0 : return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FontworkAlignmentController" ));
441 : }
442 :
443 : // --------------------------------------------------------------------
444 :
445 0 : Sequence< OUString > SAL_CALL FontWorkAlignmentControl_getSupportedServiceNames() throw( RuntimeException )
446 : {
447 0 : Sequence< OUString > aSNS( 1 );
448 0 : aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
449 0 : return aSNS;
450 : }
451 :
452 : // --------------------------------------------------------------------
453 :
454 0 : Reference< XInterface > SAL_CALL SAL_CALL FontWorkAlignmentControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
455 : {
456 0 : return *new FontWorkAlignmentControl( rSMgr );
457 : }
458 :
459 : // --------------------------------------------------------------------
460 :
461 0 : OUString SAL_CALL FontWorkAlignmentControl::getImplementationName( ) throw (RuntimeException)
462 : {
463 0 : return FontWorkAlignmentControl_getImplementationName();
464 : }
465 :
466 : // --------------------------------------------------------------------
467 :
468 0 : Sequence< OUString > SAL_CALL FontWorkAlignmentControl::getSupportedServiceNames( ) throw (RuntimeException)
469 : {
470 0 : return FontWorkAlignmentControl_getSupportedServiceNames();
471 : }
472 :
473 :
474 : // ####################################################################
475 :
476 0 : class FontWorkCharacterSpacingWindow : public ToolbarMenu
477 : {
478 : public:
479 : FontWorkCharacterSpacingWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow );
480 :
481 : virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException );
482 : private:
483 : svt::ToolboxController& mrController;
484 :
485 : const rtl::OUString msFontworkCharacterSpacing;
486 : const rtl::OUString msFontworkKernCharacterPairs;
487 :
488 : DECL_LINK( SelectHdl, void * );
489 :
490 : void implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled );
491 : void implSetKernCharacterPairs( sal_Bool bKernOnOff, bool bEnabled );
492 :
493 : };
494 :
495 : // -----------------------------------------------------------------------
496 :
497 0 : FontWorkCharacterSpacingWindow::FontWorkCharacterSpacingWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, Window* pParentWindow )
498 0 : : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_FONTWORK_CHARSPACING ))
499 : , mrController( rController )
500 : , msFontworkCharacterSpacing( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacing" ) )
501 0 : , msFontworkKernCharacterPairs( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkKernCharacterPairs" ) )
502 : {
503 0 : SetHelpId( HID_POPUP_FONTWORK_CHARSPACE );
504 0 : SetSelectHdl( LINK( this, FontWorkCharacterSpacingWindow, SelectHdl ) );
505 :
506 0 : appendEntry( 0, String( SVX_RES( STR_CHARS_SPACING_VERY_TIGHT ) ), MIB_RADIOCHECK );
507 0 : appendEntry( 1, String( SVX_RES( STR_CHARS_SPACING_TIGHT ) ), MIB_RADIOCHECK );
508 0 : appendEntry( 2, String( SVX_RES( STR_CHARS_SPACING_NORMAL ) ), MIB_RADIOCHECK );
509 0 : appendEntry( 3, String( SVX_RES( STR_CHARS_SPACING_LOOSE ) ), MIB_RADIOCHECK );
510 0 : appendEntry( 4, String( SVX_RES( STR_CHARS_SPACING_VERY_LOOSE ) ), MIB_RADIOCHECK );
511 0 : appendEntry( 5, String( SVX_RES( STR_CHARS_SPACING_CUSTOM ) ), MIB_RADIOCHECK );
512 0 : appendSeparator();
513 0 : appendEntry( 6, String( SVX_RES( STR_CHARS_SPACING_KERN_PAIRS ) ), MIB_CHECKABLE );
514 :
515 0 : SetOutputSizePixel( getMenuSize() );
516 :
517 0 : FreeResource();
518 :
519 0 : AddStatusListener( msFontworkCharacterSpacing );
520 0 : AddStatusListener( msFontworkKernCharacterPairs );
521 0 : }
522 :
523 : // -----------------------------------------------------------------------
524 :
525 0 : void FontWorkCharacterSpacingWindow::implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled )
526 : {
527 : sal_Int32 i;
528 0 : for ( i = 0; i < 6; i++ )
529 : {
530 0 : checkEntry( i, sal_False );
531 0 : enableEntry( i, bEnabled );
532 : }
533 0 : if ( nCharacterSpacing != -1 )
534 : {
535 : sal_Int32 nEntry;
536 0 : switch( nCharacterSpacing )
537 : {
538 0 : case 80 : nEntry = 0; break;
539 0 : case 90 : nEntry = 1; break;
540 0 : case 100 : nEntry = 2; break;
541 0 : case 120 : nEntry = 3; break;
542 0 : case 150 : nEntry = 4; break;
543 0 : default : nEntry = 5; break;
544 : }
545 0 : checkEntry( nEntry, bEnabled );
546 : }
547 0 : }
548 :
549 : // -----------------------------------------------------------------------
550 :
551 0 : void FontWorkCharacterSpacingWindow::implSetKernCharacterPairs( sal_Bool, bool bEnabled )
552 : {
553 0 : enableEntry( 6, bEnabled );
554 0 : checkEntry( 6, bEnabled );
555 0 : }
556 :
557 : // -----------------------------------------------------------------------
558 :
559 0 : void SAL_CALL FontWorkCharacterSpacingWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
560 : {
561 0 : if( Event.FeatureURL.Main.equals( msFontworkCharacterSpacing ) )
562 : {
563 0 : if( !Event.IsEnabled )
564 : {
565 0 : implSetCharacterSpacing( 0, false );
566 : }
567 : else
568 : {
569 0 : sal_Int32 nValue = 0;
570 0 : if( Event.State >>= nValue )
571 0 : implSetCharacterSpacing( nValue, true );
572 : }
573 : }
574 0 : else if( Event.FeatureURL.Main.equals( msFontworkKernCharacterPairs ) )
575 : {
576 0 : if( !Event.IsEnabled )
577 : {
578 0 : implSetKernCharacterPairs( 0, false );
579 : }
580 : else
581 : {
582 0 : sal_Bool bValue = sal_False;
583 0 : if( Event.State >>= bValue )
584 0 : implSetKernCharacterPairs( bValue, true );
585 : }
586 : }
587 0 : }
588 :
589 : // -----------------------------------------------------------------------
590 :
591 0 : IMPL_LINK_NOARG(FontWorkCharacterSpacingWindow, SelectHdl)
592 : {
593 0 : if ( IsInPopupMode() )
594 0 : EndPopupMode();
595 :
596 0 : sal_Int32 nSelection = getSelectedEntryId();
597 : sal_Int32 nCharacterSpacing;
598 0 : switch( nSelection )
599 : {
600 0 : case 0 : nCharacterSpacing = 80; break;
601 0 : case 1 : nCharacterSpacing = 90; break;
602 0 : case 2 : nCharacterSpacing = 100; break;
603 0 : case 3 : nCharacterSpacing = 120; break;
604 0 : case 4 : nCharacterSpacing = 150; break;
605 0 : default : nCharacterSpacing = 100; break;
606 : }
607 0 : if ( nSelection == 5 ) // custom spacing
608 : {
609 0 : Sequence< PropertyValue > aArgs( 1 );
610 0 : aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
611 0 : aArgs[0].Value <<= (sal_Int32)nCharacterSpacing;
612 :
613 0 : mrController.dispatchCommand( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacingDialog" )), aArgs );
614 : }
615 0 : else if ( nSelection == 6 ) // KernCharacterPairs
616 : {
617 0 : Sequence< PropertyValue > aArgs( 1 );
618 0 : aArgs[0].Name = msFontworkKernCharacterPairs.copy(5);
619 0 : aArgs[0].Value <<= (sal_Bool) sal_True;
620 :
621 0 : mrController.dispatchCommand( msFontworkKernCharacterPairs, aArgs );
622 :
623 0 : implSetKernCharacterPairs( sal_True, true );
624 : }
625 0 : else if( nSelection >= 0 )
626 : {
627 0 : Sequence< PropertyValue > aArgs( 1 );
628 0 : aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
629 0 : aArgs[0].Value <<=( sal_Int32)nCharacterSpacing;
630 :
631 0 : mrController.dispatchCommand( msFontworkCharacterSpacing, aArgs );
632 :
633 0 : implSetCharacterSpacing( nCharacterSpacing, true );
634 : }
635 :
636 0 : return 0;
637 : }
638 :
639 : // ========================================================================
640 : // FontWorkCharacterSpacingControl
641 : // ========================================================================
642 :
643 0 : class FontWorkCharacterSpacingControl : public svt::PopupWindowController
644 : {
645 : public:
646 : FontWorkCharacterSpacingControl( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
647 :
648 : virtual ::Window* createPopupWindow( ::Window* pParent );
649 :
650 : // XServiceInfo
651 : virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
652 : virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
653 :
654 : using svt::PopupWindowController::createPopupWindow;
655 : };
656 :
657 :
658 0 : FontWorkCharacterSpacingControl::FontWorkCharacterSpacingControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
659 0 : : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacingFloater" ) ) )
660 : {
661 0 : }
662 :
663 : // -----------------------------------------------------------------------
664 :
665 0 : ::Window* FontWorkCharacterSpacingControl::createPopupWindow( ::Window* pParent )
666 : {
667 0 : return new FontWorkCharacterSpacingWindow( *this, m_xFrame, pParent );
668 : }
669 :
670 : // -----------------------------------------------------------------------
671 : // XServiceInfo
672 : // -----------------------------------------------------------------------
673 :
674 0 : OUString SAL_CALL FontWorkCharacterSpacingControl_getImplementationName()
675 : {
676 0 : return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FontworkCharacterSpacingController" ));
677 : }
678 :
679 : // --------------------------------------------------------------------
680 :
681 0 : Sequence< OUString > SAL_CALL FontWorkCharacterSpacingControl_getSupportedServiceNames() throw( RuntimeException )
682 : {
683 0 : Sequence< OUString > aSNS( 1 );
684 0 : aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
685 0 : return aSNS;
686 : }
687 :
688 : // --------------------------------------------------------------------
689 :
690 0 : Reference< XInterface > SAL_CALL SAL_CALL FontWorkCharacterSpacingControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
691 : {
692 0 : return *new FontWorkCharacterSpacingControl( rSMgr );
693 : }
694 :
695 : // --------------------------------------------------------------------
696 :
697 0 : OUString SAL_CALL FontWorkCharacterSpacingControl::getImplementationName( ) throw (RuntimeException)
698 : {
699 0 : return FontWorkCharacterSpacingControl_getImplementationName();
700 : }
701 :
702 : // --------------------------------------------------------------------
703 :
704 0 : Sequence< OUString > SAL_CALL FontWorkCharacterSpacingControl::getSupportedServiceNames( ) throw (RuntimeException)
705 : {
706 0 : return FontWorkCharacterSpacingControl_getSupportedServiceNames();
707 : }
708 :
709 : // ========================================================================
710 : // FontworkCharacterSpacingDialog
711 : // ========================================================================
712 :
713 0 : FontworkCharacterSpacingDialog::FontworkCharacterSpacingDialog( Window* pParent, sal_Int32 nScale )
714 0 : : ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_CHARSPACING ) ),
715 0 : maFLScale( this, SVX_RES( FT_VALUE ) ),
716 0 : maMtrScale( this, SVX_RES( MF_VALUE ) ),
717 0 : maOKButton( this, SVX_RES( BTN_OK ) ),
718 0 : maCancelButton( this, SVX_RES( BTN_CANCEL ) ),
719 0 : maHelpButton( this, SVX_RES( BTN_HELP ) )
720 : {
721 0 : maMtrScale.SetValue( nScale );
722 0 : FreeResource();
723 0 : }
724 :
725 0 : FontworkCharacterSpacingDialog::~FontworkCharacterSpacingDialog()
726 : {
727 0 : }
728 :
729 0 : sal_Int32 FontworkCharacterSpacingDialog::getScale() const
730 : {
731 0 : return (sal_Int32)maMtrScale.GetValue();
732 : }
733 :
734 : }
735 :
736 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|