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