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 :
53 : #include <algorithm>
54 : #include <boost/scoped_ptr.hpp>
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 0 : FontWorkGalleryDialog::FontWorkGalleryDialog( SdrView* pSdrView, vcl::Window* pParent, sal_uInt16 /*nSID*/ ) :
73 : ModalDialog(pParent, "FontworkGalleryDialog", "svx/ui/fontworkgallerydialog.ui" ),
74 : mnThemeId ( 0xffff ),
75 : mpSdrView ( pSdrView ),
76 0 : mpModel ( static_cast<FmFormModel*>(pSdrView->GetModel()) ),
77 : mppSdrObject ( NULL ),
78 0 : mpDestModel ( NULL )
79 : {
80 0 : get(mpOKButton, "ok");
81 0 : get(mpCtlFavorites, "ctlFavorites");
82 0 : Size aSize(LogicToPixel(Size(200, 200), MAP_APPFONT));
83 0 : mpCtlFavorites->set_width_request(aSize.Width());
84 0 : mpCtlFavorites->set_height_request(aSize.Height());
85 :
86 0 : mpCtlFavorites->SetDoubleClickHdl( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) );
87 0 : mpOKButton->SetClickHdl( LINK( this, FontWorkGalleryDialog, ClickOKHdl ) );
88 :
89 0 : mpCtlFavorites->SetColCount( nColCount );
90 0 : mpCtlFavorites->SetLineCount( nLineCount );
91 0 : mpCtlFavorites->SetExtraSpacing( 3 );
92 :
93 0 : initFavorites( GALLERY_THEME_FONTWORK );
94 0 : fillFavorites( GALLERY_THEME_FONTWORK );
95 0 : }
96 :
97 0 : FontWorkGalleryDialog::~FontWorkGalleryDialog()
98 : {
99 0 : disposeOnce();
100 0 : }
101 :
102 0 : void FontWorkGalleryDialog::dispose()
103 : {
104 0 : mpCtlFavorites.clear();
105 0 : mpOKButton.clear();
106 0 : ModalDialog::dispose();
107 0 : }
108 :
109 0 : void FontWorkGalleryDialog::initFavorites(sal_uInt16 nThemeId)
110 : {
111 : // Ueber die Gallery werden die Favoriten eingelesen
112 0 : sal_uIntPtr nFavCount = GalleryExplorer::GetSdrObjCount( nThemeId );
113 :
114 : // Gallery thema locken
115 0 : GalleryExplorer::BeginLocking(nThemeId);
116 :
117 : sal_uInt32 nModelPos;
118 0 : FmFormModel *pModel = NULL;
119 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
120 :
121 0 : for( nModelPos = 0; nModelPos < nFavCount; nModelPos++ )
122 : {
123 0 : BitmapEx aThumb;
124 :
125 0 : if (GalleryExplorer::GetSdrObj(nThemeId, nModelPos, pModel, &aThumb) && !!aThumb)
126 : {
127 0 : ScopedVclPtrInstance< VirtualDevice > pVDev;
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 : pVDev->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 : pVDev->DrawCheckered(aNull, aSize, nLen, aW, aG);
144 : }
145 : else
146 : {
147 0 : pVDev->SetBackground(rStyleSettings.GetFieldColor());
148 0 : pVDev->Erase();
149 : }
150 :
151 0 : pVDev->DrawBitmapEx(aNull, aThumb);
152 0 : maFavoritesHorizontal.push_back(pVDev->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 : boost::scoped_ptr<FmFormModel> pModel(new FmFormModel());
206 0 : pModel->GetItemPool().FreezeIdRanges();
207 :
208 0 : if( GalleryExplorer::GetSdrObj( mnThemeId, nItemId-1, pModel.get() ) )
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 0 : }
240 : }
241 0 : }
242 :
243 :
244 :
245 0 : IMPL_LINK_NOARG(FontWorkGalleryDialog, ClickOKHdl)
246 : {
247 0 : insertSelectedFontwork();
248 0 : EndDialog( RET_OK );
249 0 : return 0;
250 : }
251 :
252 :
253 :
254 0 : IMPL_LINK_NOARG(FontWorkGalleryDialog, DoubleClickFavoriteHdl)
255 : {
256 0 : insertSelectedFontwork();
257 0 : EndDialog( RET_OK );
258 0 : return 0L;
259 : }
260 :
261 :
262 :
263 132 : SFX_IMPL_TOOLBOX_CONTROL( FontWorkShapeTypeControl, SfxStringItem );
264 0 : FontWorkShapeTypeControl::FontWorkShapeTypeControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx )
265 0 : : SfxToolBoxControl( nSlotId, nId, rTbx )
266 : {
267 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
268 0 : rTbx.Invalidate();
269 0 : }
270 :
271 :
272 :
273 0 : FontWorkShapeTypeControl::~FontWorkShapeTypeControl()
274 : {
275 0 : }
276 :
277 :
278 :
279 0 : SfxPopupWindowType FontWorkShapeTypeControl::GetPopupWindowType() const
280 : {
281 0 : return SfxPopupWindowType::ONCLICK; //( aLastAction.getLength() == 0 ? SfxPopupWindowType::ONCLICK : SfxPopupWindowType::ONTIMEOUT );
282 : }
283 :
284 :
285 :
286 0 : VclPtr<SfxPopupWindow> FontWorkShapeTypeControl::CreatePopupWindow()
287 : {
288 0 : OUString aSubTbxResName( "private:resource/toolbar/fontworkshapetype" );
289 0 : createAndPositionSubToolBar( aSubTbxResName );
290 0 : return NULL;
291 : }
292 :
293 :
294 :
295 0 : void FontWorkShapeTypeControl::Select(sal_uInt16 /*nSelectModifier*/)
296 : {
297 :
298 0 : }
299 :
300 0 : class FontworkAlignmentWindow : public ToolbarMenu
301 : {
302 : public:
303 : FontworkAlignmentWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow );
304 :
305 : virtual void statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException ) SAL_OVERRIDE;
306 :
307 : private:
308 : svt::ToolboxController& mrController;
309 :
310 : Image maImgAlgin1;
311 : Image maImgAlgin2;
312 : Image maImgAlgin3;
313 : Image maImgAlgin4;
314 : Image maImgAlgin5;
315 :
316 : const OUString msFontworkAlignment;
317 :
318 : DECL_LINK( SelectHdl, void * );
319 :
320 : void implSetAlignment( int nAlignmentMode, bool bEnabled );
321 : };
322 :
323 0 : FontworkAlignmentWindow::FontworkAlignmentWindow(svt::ToolboxController& rController,
324 : const Reference< XFrame >& rFrame, vcl::Window* pParentWindow)
325 : : ToolbarMenu(rFrame, pParentWindow, WB_MOVEABLE|WB_CLOSEABLE|WB_HIDE|WB_3DLOOK)
326 : , mrController(rController)
327 0 : , maImgAlgin1(SVX_RES(RID_SVXIMG_FONTWORK_ALIGN_LEFT))
328 0 : , maImgAlgin2(SVX_RES(RID_SVXIMG_FONTWORK_ALIGN_CENTER))
329 0 : , maImgAlgin3(SVX_RES(RID_SVXIMG_FONTWORK_ALIGN_RIGHT))
330 0 : , maImgAlgin4(SVX_RES(RID_SVXIMG_FONTWORK_ALIGN_WORD))
331 0 : , maImgAlgin5(SVX_RES(RID_SVXIMG_FONTWORK_ALIGN_STRETCH))
332 0 : , msFontworkAlignment(".uno:FontworkAlignment")
333 : {
334 0 : SetSelectHdl( LINK( this, FontworkAlignmentWindow, SelectHdl ) );
335 :
336 0 : appendEntry(0, SVX_RESSTR(RID_SVXSTR_ALIGN_LEFT), maImgAlgin1);
337 0 : appendEntry(1, SVX_RESSTR(RID_SVXSTR_ALIGN_CENTER), maImgAlgin2);
338 0 : appendEntry(2, SVX_RESSTR(RID_SVXSTR_ALIGN_RIGHT), maImgAlgin3);
339 0 : appendEntry(3, SVX_RESSTR(RID_SVXSTR_ALIGN_WORD), maImgAlgin4);
340 0 : appendEntry(4, SVX_RESSTR(RID_SVXSTR_ALIGN_STRETCH), maImgAlgin5);
341 :
342 0 : SetOutputSizePixel( getMenuSize() );
343 :
344 0 : AddStatusListener( msFontworkAlignment );
345 0 : }
346 :
347 0 : void FontworkAlignmentWindow::implSetAlignment( int nSurface, bool bEnabled )
348 : {
349 : int i;
350 0 : for( i = 0; i < 5; i++ )
351 : {
352 0 : checkEntry( i, (i == nSurface) && bEnabled );
353 0 : enableEntry( i, bEnabled );
354 : }
355 0 : }
356 :
357 0 : void FontworkAlignmentWindow::statusChanged( const frame::FeatureStateEvent& Event ) throw ( RuntimeException )
358 : {
359 0 : if( Event.FeatureURL.Main.equals( msFontworkAlignment ) )
360 : {
361 0 : if( !Event.IsEnabled )
362 : {
363 0 : implSetAlignment( 0, false );
364 : }
365 : else
366 : {
367 0 : sal_Int32 nValue = 0;
368 0 : if( Event.State >>= nValue )
369 0 : implSetAlignment( nValue, true );
370 : }
371 : }
372 0 : }
373 :
374 0 : IMPL_LINK_NOARG(FontworkAlignmentWindow, SelectHdl)
375 : {
376 0 : if ( IsInPopupMode() )
377 0 : EndPopupMode();
378 :
379 0 : sal_Int32 nAlignment = getSelectedEntryId();
380 0 : if( nAlignment >= 0 )
381 : {
382 0 : Sequence< PropertyValue > aArgs( 1 );
383 0 : aArgs[0].Name = msFontworkAlignment.copy(5);
384 0 : aArgs[0].Value <<= (sal_Int32)nAlignment;
385 :
386 0 : mrController.dispatchCommand( msFontworkAlignment, aArgs );
387 :
388 0 : implSetAlignment( nAlignment, true );
389 : }
390 :
391 0 : return 0;
392 : }
393 :
394 2 : class FontworkAlignmentControl : public svt::PopupWindowController
395 : {
396 : public:
397 : explicit FontworkAlignmentControl( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& rxContext );
398 :
399 : virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) SAL_OVERRIDE;
400 :
401 : // XInitialization
402 : virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
403 : throw ( css::uno::Exception, css::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
404 :
405 : // XServiceInfo
406 : virtual OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
407 : virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
408 :
409 : using svt::PopupWindowController::createPopupWindow;
410 : };
411 :
412 :
413 :
414 :
415 1 : FontworkAlignmentControl::FontworkAlignmentControl( const Reference< XComponentContext >& rxContext )
416 1 : : svt::PopupWindowController( rxContext, Reference< frame::XFrame >(), OUString( ".uno:FontworkAlignment" ) )
417 : {
418 1 : }
419 :
420 :
421 :
422 0 : VclPtr<vcl::Window> FontworkAlignmentControl::createPopupWindow( vcl::Window* pParent )
423 : {
424 0 : return VclPtr<FontworkAlignmentWindow>::Create( *this, m_xFrame, pParent );
425 : }
426 :
427 : // XInitialization
428 0 : void SAL_CALL FontworkAlignmentControl::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
429 : throw ( css::uno::Exception, css::uno::RuntimeException, std::exception )
430 : {
431 0 : svt::PopupWindowController::initialize( aArguments );
432 :
433 0 : ToolBox* pToolBox = 0;
434 0 : sal_uInt16 nId = 0;
435 0 : if ( getToolboxId( nId, &pToolBox ) )
436 0 : pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
437 0 : }
438 :
439 : // XServiceInfo
440 :
441 :
442 4 : OUString SAL_CALL FontworkAlignmentControl_getImplementationName()
443 : {
444 4 : return OUString( "com.sun.star.comp.svx.FontworkAlignmentController" );
445 : }
446 :
447 :
448 :
449 2 : Sequence< OUString > SAL_CALL FontworkAlignmentControl_getSupportedServiceNames() throw( RuntimeException )
450 : {
451 2 : Sequence< OUString > aSNS( 1 );
452 2 : aSNS.getArray()[0] = "com.sun.star.frame.ToolbarController";
453 2 : return aSNS;
454 : }
455 :
456 :
457 :
458 1 : Reference< XInterface > SAL_CALL SAL_CALL FontworkAlignmentControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
459 : {
460 1 : return *new FontworkAlignmentControl( comphelper::getComponentContext(rSMgr) );
461 : }
462 :
463 :
464 :
465 1 : OUString SAL_CALL FontworkAlignmentControl::getImplementationName( ) throw (RuntimeException, std::exception)
466 : {
467 1 : return FontworkAlignmentControl_getImplementationName();
468 : }
469 :
470 :
471 :
472 1 : Sequence< OUString > SAL_CALL FontworkAlignmentControl::getSupportedServiceNames( ) throw (RuntimeException, std::exception)
473 : {
474 1 : return FontworkAlignmentControl_getSupportedServiceNames();
475 : }
476 :
477 0 : class FontworkCharacterSpacingWindow : public ToolbarMenu
478 : {
479 : public:
480 : FontworkCharacterSpacingWindow( svt::ToolboxController& rController, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow );
481 :
482 : virtual void statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException ) SAL_OVERRIDE;
483 : private:
484 : svt::ToolboxController& mrController;
485 :
486 : const OUString msFontworkCharacterSpacing;
487 : const OUString msFontworkKernCharacterPairs;
488 :
489 : DECL_LINK( SelectHdl, void * );
490 :
491 : void implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled );
492 : void implSetKernCharacterPairs( bool bKernOnOff, bool bEnabled );
493 :
494 : };
495 :
496 0 : FontworkCharacterSpacingWindow::FontworkCharacterSpacingWindow(svt::ToolboxController& rController,
497 : const Reference< XFrame >& rFrame, vcl::Window* pParentWindow)
498 : : ToolbarMenu(rFrame, pParentWindow, WB_MOVEABLE|WB_CLOSEABLE|WB_HIDE|WB_3DLOOK)
499 : , mrController(rController)
500 : , msFontworkCharacterSpacing(".uno:FontworkCharacterSpacing")
501 0 : , msFontworkKernCharacterPairs(".uno:FontworkKernCharacterPairs")
502 : {
503 0 : SetSelectHdl( LINK( this, FontworkCharacterSpacingWindow, SelectHdl ) );
504 :
505 0 : appendEntry(0, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_VERY_TIGHT), MenuItemBits::RADIOCHECK);
506 0 : appendEntry(1, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_TIGHT), MenuItemBits::RADIOCHECK);
507 0 : appendEntry(2, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_NORMAL), MenuItemBits::RADIOCHECK);
508 0 : appendEntry(3, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_LOOSE), MenuItemBits::RADIOCHECK);
509 0 : appendEntry(4, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_VERY_LOOSE), MenuItemBits::RADIOCHECK);
510 0 : appendEntry(5, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_CUSTOM), MenuItemBits::RADIOCHECK);
511 0 : appendSeparator();
512 0 : appendEntry(6, SVX_RESSTR(RID_SVXSTR_CHARS_SPACING_KERN_PAIRS), MenuItemBits::CHECKABLE);
513 :
514 0 : SetOutputSizePixel( getMenuSize() );
515 :
516 0 : AddStatusListener( msFontworkCharacterSpacing );
517 0 : AddStatusListener( msFontworkKernCharacterPairs );
518 0 : }
519 :
520 0 : void FontworkCharacterSpacingWindow::implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled )
521 : {
522 : sal_Int32 i;
523 0 : for ( i = 0; i < 6; i++ )
524 : {
525 0 : checkEntry( i, false );
526 0 : enableEntry( i, bEnabled );
527 : }
528 0 : if ( nCharacterSpacing != -1 )
529 : {
530 : sal_Int32 nEntry;
531 0 : switch( nCharacterSpacing )
532 : {
533 0 : case 80 : nEntry = 0; break;
534 0 : case 90 : nEntry = 1; break;
535 0 : case 100 : nEntry = 2; break;
536 0 : case 120 : nEntry = 3; break;
537 0 : case 150 : nEntry = 4; break;
538 0 : default : nEntry = 5; break;
539 : }
540 0 : checkEntry( nEntry, bEnabled );
541 : }
542 0 : }
543 :
544 :
545 :
546 0 : void FontworkCharacterSpacingWindow::implSetKernCharacterPairs( bool, bool bEnabled )
547 : {
548 0 : enableEntry( 6, bEnabled );
549 0 : checkEntry( 6, bEnabled );
550 0 : }
551 :
552 :
553 :
554 0 : void FontworkCharacterSpacingWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
555 : {
556 0 : if( Event.FeatureURL.Main.equals( msFontworkCharacterSpacing ) )
557 : {
558 0 : if( !Event.IsEnabled )
559 : {
560 0 : implSetCharacterSpacing( 0, false );
561 : }
562 : else
563 : {
564 0 : sal_Int32 nValue = 0;
565 0 : if( Event.State >>= nValue )
566 0 : implSetCharacterSpacing( nValue, true );
567 : }
568 : }
569 0 : else if( Event.FeatureURL.Main.equals( msFontworkKernCharacterPairs ) )
570 : {
571 0 : if( !Event.IsEnabled )
572 : {
573 0 : implSetKernCharacterPairs( false, false );
574 : }
575 : else
576 : {
577 0 : bool bValue = false;
578 0 : if( Event.State >>= bValue )
579 0 : implSetKernCharacterPairs( bValue, true );
580 : }
581 : }
582 0 : }
583 :
584 :
585 :
586 0 : IMPL_LINK_NOARG(FontworkCharacterSpacingWindow, SelectHdl)
587 : {
588 0 : if ( IsInPopupMode() )
589 0 : EndPopupMode();
590 :
591 0 : sal_Int32 nSelection = getSelectedEntryId();
592 : sal_Int32 nCharacterSpacing;
593 0 : switch( nSelection )
594 : {
595 0 : case 0 : nCharacterSpacing = 80; break;
596 0 : case 1 : nCharacterSpacing = 90; break;
597 0 : case 2 : nCharacterSpacing = 100; break;
598 0 : case 3 : nCharacterSpacing = 120; break;
599 0 : case 4 : nCharacterSpacing = 150; break;
600 0 : default : nCharacterSpacing = 100; break;
601 : }
602 0 : if ( nSelection == 5 ) // custom spacing
603 : {
604 0 : Sequence< PropertyValue > aArgs( 1 );
605 0 : aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
606 0 : aArgs[0].Value <<= (sal_Int32)nCharacterSpacing;
607 :
608 0 : mrController.dispatchCommand( OUString( ".uno:FontworkCharacterSpacingDialog" ), aArgs );
609 : }
610 0 : else if ( nSelection == 6 ) // KernCharacterPairs
611 : {
612 0 : Sequence< PropertyValue > aArgs( 1 );
613 0 : aArgs[0].Name = msFontworkKernCharacterPairs.copy(5);
614 0 : aArgs[0].Value <<= true;
615 :
616 0 : mrController.dispatchCommand( msFontworkKernCharacterPairs, aArgs );
617 :
618 0 : implSetKernCharacterPairs( true, true );
619 : }
620 0 : else if( nSelection >= 0 )
621 : {
622 0 : Sequence< PropertyValue > aArgs( 1 );
623 0 : aArgs[0].Name = msFontworkCharacterSpacing.copy(5);
624 0 : aArgs[0].Value <<=( sal_Int32)nCharacterSpacing;
625 :
626 0 : mrController.dispatchCommand( msFontworkCharacterSpacing, aArgs );
627 :
628 0 : implSetCharacterSpacing( nCharacterSpacing, true );
629 : }
630 :
631 0 : return 0;
632 : }
633 :
634 2 : class FontworkCharacterSpacingControl : public svt::PopupWindowController
635 : {
636 : public:
637 : explicit FontworkCharacterSpacingControl( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& rxContext );
638 :
639 : virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) SAL_OVERRIDE;
640 :
641 : // XInitialization
642 : virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
643 : throw ( css::uno::Exception, css::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
644 :
645 : // XServiceInfo
646 : virtual OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
647 : virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
648 :
649 : using svt::PopupWindowController::createPopupWindow;
650 : };
651 :
652 :
653 1 : FontworkCharacterSpacingControl::FontworkCharacterSpacingControl( const Reference< XComponentContext >& rxContext )
654 1 : : svt::PopupWindowController( rxContext, Reference< frame::XFrame >(), OUString( ".uno:FontworkCharacterSpacingFloater" ) )
655 : {
656 1 : }
657 :
658 :
659 :
660 0 : VclPtr<vcl::Window> FontworkCharacterSpacingControl::createPopupWindow( vcl::Window* pParent )
661 : {
662 0 : return VclPtr<FontworkCharacterSpacingWindow>::Create( *this, m_xFrame, pParent );
663 : }
664 :
665 : // XInitialization
666 0 : void SAL_CALL FontworkCharacterSpacingControl::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
667 : throw ( css::uno::Exception, css::uno::RuntimeException, std::exception )
668 : {
669 0 : svt::PopupWindowController::initialize( aArguments );
670 :
671 0 : ToolBox* pToolBox = 0;
672 0 : sal_uInt16 nId = 0;
673 0 : if ( getToolboxId( nId, &pToolBox ) )
674 0 : pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
675 0 : }
676 :
677 : // XServiceInfo
678 :
679 :
680 3 : OUString SAL_CALL FontworkCharacterSpacingControl_getImplementationName()
681 : {
682 3 : return OUString( "com.sun.star.comp.svx.FontworkCharacterSpacingController" );
683 : }
684 :
685 :
686 :
687 2 : Sequence< OUString > SAL_CALL FontworkCharacterSpacingControl_getSupportedServiceNames() throw( RuntimeException )
688 : {
689 2 : Sequence< OUString > aSNS( 1 );
690 2 : aSNS.getArray()[0] = "com.sun.star.frame.ToolbarController";
691 2 : return aSNS;
692 : }
693 :
694 :
695 :
696 1 : Reference< XInterface > SAL_CALL SAL_CALL FontworkCharacterSpacingControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
697 : {
698 1 : return *new FontworkCharacterSpacingControl( comphelper::getComponentContext(rSMgr) );
699 : }
700 :
701 :
702 :
703 1 : OUString SAL_CALL FontworkCharacterSpacingControl::getImplementationName( ) throw (RuntimeException, std::exception)
704 : {
705 1 : return FontworkCharacterSpacingControl_getImplementationName();
706 : }
707 :
708 :
709 :
710 1 : Sequence< OUString > SAL_CALL FontworkCharacterSpacingControl::getSupportedServiceNames( ) throw (RuntimeException, std::exception)
711 : {
712 1 : return FontworkCharacterSpacingControl_getSupportedServiceNames();
713 : }
714 :
715 0 : FontworkCharacterSpacingDialog::FontworkCharacterSpacingDialog( vcl::Window* pParent, sal_Int32 nScale )
716 0 : : ModalDialog( pParent, "FontworkSpacingDialog" , "svx/ui/fontworkspacingdialog.ui" )
717 : {
718 0 : get(m_pMtrScale, "entry");
719 0 : m_pMtrScale->SetValue( nScale );
720 0 : }
721 :
722 0 : FontworkCharacterSpacingDialog::~FontworkCharacterSpacingDialog()
723 : {
724 0 : disposeOnce();
725 0 : }
726 :
727 0 : void FontworkCharacterSpacingDialog::dispose()
728 : {
729 0 : m_pMtrScale.clear();
730 0 : ModalDialog::dispose();
731 0 : }
732 :
733 0 : sal_Int32 FontworkCharacterSpacingDialog::getScale() const
734 : {
735 0 : return (sal_Int32)m_pMtrScale->GetValue();
736 : }
737 :
738 435 : }
739 :
740 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|