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