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