diff options
Diffstat (limited to 'svx/source/tbxctrls/fontworkgallery.cxx')
-rw-r--r-- | svx/source/tbxctrls/fontworkgallery.cxx | 944 |
1 files changed, 944 insertions, 0 deletions
diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx new file mode 100644 index 000000000000..111f2394836a --- /dev/null +++ b/svx/source/tbxctrls/fontworkgallery.cxx @@ -0,0 +1,944 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fontworkgallery.cxx,v $ + * $Revision: 1.16 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" +#include <com/sun/star/text/WritingMode.hpp> +#include <sfx2/app.hxx> +#include <svtools/itempool.hxx> +#include <svx/fmmodel.hxx> +#include <sfx2/dispatch.hxx> +#include <dlgutil.hxx> + +#include <svx/svxids.hrc> +#include <svx/dialmgr.hxx> +#include <svx/dialogs.hrc> +#include "gallery.hxx" +#include <svx/svdpage.hxx> +#include <svx/svdobj.hxx> +#include <svx/svdview.hxx> +#include <svx/svdoutl.hxx> +#include <svx/eeitem.hxx> +#include <svx/frmdiritem.hxx> +#include "toolbarmenu.hxx" + +#include "fontworkgallery.hxx" +#include "fontworkgallery.hrc" + +#include <algorithm> + +#ifndef _TOOLBOX_HXX //autogen +#include <vcl/toolbox.hxx> +#endif +#ifndef _SVX_HELPID_HRC +#include "helpid.hrc" +#endif +using namespace svx; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; + +const int nColCount = 4; +const int nLineCount = 4; + +/************************************************************************* +|* Svx3DWin - FloatingWindow +\************************************************************************/ +FontWorkGalleryDialog::FontWorkGalleryDialog( SdrView* pSdrView, Window* pParent, sal_uInt16 /*nSID*/ ) : + ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_GALLERY ) ), + maCtlFavorites ( this, SVX_RES( CTL_FAVORITES ) ), + maFLFavorites ( this, SVX_RES( FL_FAVORITES ) ), + maOKButton ( this, SVX_RES( BTN_OK ) ), + maCancelButton ( this, SVX_RES( BTN_CANCEL ) ), + maHelpButton ( this, SVX_RES( BTN_HELP ) ), + mnThemeId ( 0xffff ), + mpSdrView ( pSdrView ), + mpModel ( (FmFormModel*)pSdrView->GetModel() ), + maStrClickToAddText ( SVX_RES( STR_CLICK_TO_ADD_TEXT ) ), + mppSdrObject ( NULL ), + mpDestModel ( NULL ) +{ + FreeResource(); + + maCtlFavorites.SetDoubleClickHdl( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) ); + maOKButton.SetClickHdl( LINK( this, FontWorkGalleryDialog, ClickOKHdl ) ); + + maCtlFavorites.SetColCount( nColCount ); + maCtlFavorites.SetLineCount( nLineCount ); + maCtlFavorites.SetExtraSpacing( 3 ); + + initfavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal ); + fillFavorites( GALLERY_THEME_FONTWORK, maFavoritesHorizontal ); +} + +static void delete_bitmap( Bitmap* p ) { delete p; } + +// ----------------------------------------------------------------------- +FontWorkGalleryDialog::~FontWorkGalleryDialog() +{ + std::for_each( maFavoritesHorizontal.begin(), maFavoritesHorizontal.end(), delete_bitmap ); +} + +// ----------------------------------------------------------------------- + +void FontWorkGalleryDialog::initfavorites(sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites) +{ + // Ueber die Gallery werden die Favoriten eingelesen + ULONG nFavCount = GalleryExplorer::GetSdrObjCount( nThemeId ); + + // Gallery thema locken + GalleryExplorer::BeginLocking(nThemeId); + + sal_uInt32 nModelPos; + FmFormModel *pModel = NULL; + for( nModelPos = 0; nModelPos < nFavCount; nModelPos++ ) + { + Bitmap* pThumb = new Bitmap; + + if( GalleryExplorer::GetSdrObj( nThemeId, nModelPos, pModel, pThumb ) ) + { +/* + VirtualDevice aVDev; + Size aRenderSize( aThumbSize.Width() * 4, aThumbSize.Height() * 4 ); + aVDev.SetOutputSizePixel( aRenderSize ); + + if( GalleryExplorer::DrawCentered( &aVDev, *pModel ) ) + { + aThumb = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() ); + + Size aMS( 4, 4 ); + BmpFilterParam aParam( aMS ); + aThumb.Filter( BMP_FILTER_MOSAIC, &aParam ); + aThumb.Scale( aThumbSize ); + } +*/ + } + + rFavorites.push_back( pThumb ); + } + + // Gallery thema freigeben + GalleryExplorer::EndLocking(nThemeId); +} + +void FontWorkGalleryDialog::fillFavorites( sal_uInt16 nThemeId, std::vector< Bitmap * >& rFavorites ) +{ + mnThemeId = nThemeId; + + Size aThumbSize( maCtlFavorites.GetSizePixel() ); + aThumbSize.Width() /= nColCount; + aThumbSize.Height() /= nLineCount; + aThumbSize.Width() -= 12; + aThumbSize.Height() -= 12; + + std::vector< Bitmap * >::size_type nFavCount = rFavorites.size(); + + // ValueSet Favoriten + if( nFavCount > (nColCount * nLineCount) ) + { + WinBits nWinBits = maCtlFavorites.GetStyle(); + nWinBits |= WB_VSCROLL; + maCtlFavorites.SetStyle( nWinBits ); + } + + maCtlFavorites.Clear(); + + sal_uInt32 nFavorite; + for( nFavorite = 1; nFavorite <= nFavCount; nFavorite++ ) + { + String aStr(SVX_RES(RID_SVXFLOAT3D_FAVORITE)); + aStr += sal_Unicode(' '); + aStr += String::CreateFromInt32((sal_Int32)nFavorite); + Image aThumbImage( *rFavorites[nFavorite-1] ); + maCtlFavorites.InsertItem( (sal_uInt16)nFavorite, aThumbImage, aStr ); + } +} + +void FontWorkGalleryDialog::changeText( SdrTextObj* pObj ) +{ + if( pObj ) + { + SdrOutliner& rOutl = mpModel->GetDrawOutliner(pObj); + + USHORT nOutlMode = rOutl.GetMode(); + Size aPaperSize = rOutl.GetPaperSize(); + BOOL bUpdateMode = rOutl.GetUpdateMode(); + rOutl.SetUpdateMode(FALSE); + rOutl.SetParaAttribs( 0, rOutl.GetEmptyItemSet() ); + + // #95114# Always set the object's StyleSheet at the Outliner to + // use the current objects StyleSheet. Thus it's the same as in + // SetText(...). + // #95114# Moved this implementation from where SetObjText(...) was called + // to inside this method to work even when outliner is fetched here. + rOutl.SetStyleSheet(0, pObj->GetStyleSheet()); + + rOutl.SetPaperSize( pObj->GetLogicRect().GetSize() ); + + rOutl.SetText( maStrClickToAddText, rOutl.GetParagraph( 0 ) ); + pObj->SetOutlinerParaObject( rOutl.CreateParaObject() ); + + rOutl.Init( nOutlMode ); + rOutl.SetParaAttribs( 0, rOutl.GetEmptyItemSet() ); + rOutl.SetUpdateMode( bUpdateMode ); + rOutl.SetPaperSize( aPaperSize ); + + rOutl.Clear(); + } +} + +void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel* pModel ) +{ + mppSdrObject = ppSdrObject; + mpDestModel = pModel; +} + +void FontWorkGalleryDialog::insertSelectedFontwork() +{ + USHORT nItemId = maCtlFavorites.GetSelectItemId(); + + if( nItemId > 0 ) + { + FmFormModel* pModel = new FmFormModel(); + pModel->GetItemPool().FreezeIdRanges(); + + if( GalleryExplorer::GetSdrObj( mnThemeId, nItemId-1, pModel ) ) + { + SdrPage* pPage = pModel->GetPage(0); + if( pPage && pPage->GetObjCount() ) + { + SdrObject* pNewObject = pPage->GetObj(0)->Clone(); + + // center shape on current view + OutputDevice* pOutDev = mpSdrView->GetFirstOutputDevice(); + if( pOutDev ) + { + Rectangle aObjRect( pNewObject->GetLogicRect() ); + Rectangle aVisArea = pOutDev->PixelToLogic(Rectangle(Point(0,0), pOutDev->GetOutputSizePixel())); +/* + sal_Int32 nObjHeight = aObjRect.GetHeight(); + VirtualDevice aVirDev( 1 ); // calculating the optimal textwidth + Font aFont; + aFont.SetHeight( nObjHeight ); + aVirDev.SetMapMode( MAP_100TH_MM ); + aVirDev.SetFont( aFont ); + aObjRect.SetSize( Size( aVirDev.GetTextWidth( maStrClickToAddText ), nObjHeight ) ); +*/ + Point aPagePos = aVisArea.Center(); + aPagePos.X() -= aObjRect.GetWidth() / 2; + aPagePos.Y() -= aObjRect.GetHeight() / 2; + Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize()); + SdrPageView* pPV = mpSdrView->GetSdrPageView(); + + pNewObject->SetLogicRect(aNewObjectRectangle); + if ( mppSdrObject ) + { + *mppSdrObject = pNewObject; + (*mppSdrObject)->SetModel( mpDestModel ); + } + else if( pPV ) + { + mpSdrView->InsertObjectAtView( pNewObject, *pPV ); + // changeText( PTR_CAST( SdrTextObj, pNewObject ) ); + } + } + } + } + + delete pModel; + } +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( FontWorkGalleryDialog, ClickOKHdl, void*, EMPTYARG ) +{ + insertSelectedFontwork(); + EndDialog( true ); + return 0; +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( FontWorkGalleryDialog, DoubleClickFavoriteHdl, void*, EMPTYARG ) +{ + insertSelectedFontwork(); + EndDialog( true ); + return( 0L ); +} + +// ----------------------------------------------------------------------- + +SFX_IMPL_TOOLBOX_CONTROL( FontWorkShapeTypeControl, SfxStringItem ); +FontWorkShapeTypeControl::FontWorkShapeTypeControl( USHORT nSlotId, USHORT nId, ToolBox &rTbx ) +: SfxToolBoxControl( nSlotId, nId, rTbx ) +{ + rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) ); + rTbx.Invalidate(); +} + +// ----------------------------------------------------------------------- + +FontWorkShapeTypeControl::~FontWorkShapeTypeControl() +{ +} + +// ----------------------------------------------------------------------- + +SfxPopupWindowType FontWorkShapeTypeControl::GetPopupWindowType() const +{ + return SFX_POPUPWINDOW_ONCLICK; //( aLastAction.getLength() == 0 ? SFX_POPUPWINDOW_ONCLICK : SFX_POPUPWINDOW_ONTIMEOUT ); +} + +// ----------------------------------------------------------------------- + +SfxPopupWindow* FontWorkShapeTypeControl::CreatePopupWindow() +{ + rtl::OUString aSubTbxResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/fontworkshapetype" ) ); + createAndPositionSubToolBar( aSubTbxResName ); + return NULL; +} + +// ----------------------------------------------------------------------- + +void FontWorkShapeTypeControl::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState ) +{ + SfxToolBoxControl::StateChanged( nSID, eState, pState ); +} + +// ----------------------------------------------------------------------- + +void FontWorkShapeTypeControl::Select( BOOL ) +{ + +} + +// #################################################################### + +SFX_IMPL_TOOLBOX_CONTROL( FontWorkAlignmentControl, SfxBoolItem ); + +FontWorkAlignmentWindow::FontWorkAlignmentWindow( + USHORT nId, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame ) : + + SfxPopupWindow( nId, + rFrame, + SVX_RES( RID_SVXFLOAT_FONTWORK_ALIGNMENT )), + maImgAlgin1( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16 ) ), + maImgAlgin2( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16 ) ), + maImgAlgin3( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16 ) ), + maImgAlgin4( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16 ) ), + maImgAlgin5( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16 ) ), + maImgAlgin1h( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16_H ) ), + maImgAlgin2h( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16_H ) ), + maImgAlgin3h( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16_H ) ), + maImgAlgin4h( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16_H ) ), + maImgAlgin5h( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16_H ) ), + mxFrame( rFrame ), + mbPopupMode( true ) +{ + SetHelpId( HID_WIN_FONTWORK_ALIGN ); + implInit(); +} + +FontWorkAlignmentWindow::FontWorkAlignmentWindow( + USHORT nId, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, + Window* /*pParentWindow*/ ) : + + SfxPopupWindow( nId, + rFrame, + SVX_RES( RID_SVXFLOAT_FONTWORK_ALIGNMENT )), + maImgAlgin1( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16 ) ), + maImgAlgin2( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16 ) ), + maImgAlgin3( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16 ) ), + maImgAlgin4( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16 ) ), + maImgAlgin5( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16 ) ), + maImgAlgin1h( SVX_RES( IMG_FONTWORK_ALIGN_LEFT_16_H ) ), + maImgAlgin2h( SVX_RES( IMG_FONTWORK_ALIGN_CENTER_16_H ) ), + maImgAlgin3h( SVX_RES( IMG_FONTWORK_ALIGN_RIGHT_16_H ) ), + maImgAlgin4h( SVX_RES( IMG_FONTWORK_ALIGN_WORD_16_H ) ), + maImgAlgin5h( SVX_RES( IMG_FONTWORK_ALIGN_STRETCH_16_H ) ), + mxFrame( rFrame ), + mbPopupMode( true ) +{ + SetHelpId( HID_WIN_FONTWORK_ALIGN ); + implInit(); +} + +void FontWorkAlignmentWindow::implInit() +{ + SetHelpId( HID_POPUP_FONTWORK_ALIGN ); + + bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + + mpMenu = new ToolbarMenu( this, WB_CLIPCHILDREN ); + mpMenu->SetHelpId( HID_POPUP_FONTWORK_ALIGN ); + mpMenu->SetSelectHdl( LINK( this, FontWorkAlignmentWindow, SelectHdl ) ); + + mpMenu->appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), bHighContrast ? maImgAlgin1h : maImgAlgin1 ); + mpMenu->appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), bHighContrast ? maImgAlgin2h : maImgAlgin2 ); + mpMenu->appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), bHighContrast ? maImgAlgin3h : maImgAlgin3 ); + mpMenu->appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), bHighContrast ? maImgAlgin4h : maImgAlgin4 ); + mpMenu->appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), bHighContrast ? maImgAlgin5h : maImgAlgin5 ); + + SetOutputSizePixel( mpMenu->getMenuSize() ); + mpMenu->SetOutputSizePixel( GetOutputSizePixel() ); + + mpMenu->Show(); + + FreeResource(); + + AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" ))); +} + +SfxPopupWindow* FontWorkAlignmentWindow::Clone() const +{ + return new FontWorkAlignmentWindow( GetId(), mxFrame ); +} + +// ----------------------------------------------------------------------- + +FontWorkAlignmentWindow::~FontWorkAlignmentWindow() +{ + delete mpMenu; +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::implSetAlignment( int nSurface, bool bEnabled ) +{ + if( mpMenu ) + { + int i; + for( i = 0; i < 5; i++ ) + { + mpMenu->checkEntry( i, (i == nSurface) && bEnabled ); + mpMenu->enableEntry( i, bEnabled ); + } + } +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState ) +{ + switch( nSID ) + { + case SID_FONTWORK_ALIGNMENT: + { + if( eState == SFX_ITEM_DISABLED ) + { + implSetAlignment( 0, false ); + } + else + { + const SfxInt32Item* pStateItem = PTR_CAST( SfxInt32Item, pState ); + if( pStateItem ) + implSetAlignment( pStateItem->GetValue(), true ); + } + break; + } + } +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::DataChanged( const DataChangedEvent& rDCEvt ) +{ + SfxPopupWindow::DataChanged( rDCEvt ); + + if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) + { + bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + + mpMenu->appendEntry( 0, String( SVX_RES( STR_ALIGN_LEFT ) ), bHighContrast ? maImgAlgin1h : maImgAlgin1 ); + mpMenu->appendEntry( 1, String( SVX_RES( STR_ALIGN_CENTER ) ), bHighContrast ? maImgAlgin2h : maImgAlgin2 ); + mpMenu->appendEntry( 2, String( SVX_RES( STR_ALIGN_RIGHT ) ), bHighContrast ? maImgAlgin3h : maImgAlgin3 ); + mpMenu->appendEntry( 3, String( SVX_RES( STR_ALIGN_WORD ) ), bHighContrast ? maImgAlgin4h : maImgAlgin4 ); + mpMenu->appendEntry( 4, String( SVX_RES( STR_ALIGN_STRETCH ) ), bHighContrast ? maImgAlgin5h : maImgAlgin5 ); + } +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( FontWorkAlignmentWindow, SelectHdl, void *, EMPTYARG ) +{ + if ( IsInPopupMode() ) + EndPopupMode(); + +// SfxDispatcher* pDisp = GetBindings().GetDispatcher(); + + sal_Int32 nAlignment = mpMenu->getSelectedEntryId(); + if( nAlignment >= 0 ) + { + SfxInt32Item aItem( SID_FONTWORK_ALIGNMENT, nAlignment ); + rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkAlignment" )); + + Any a; + INetURLObject aObj( aCommand ); + Sequence< PropertyValue > aArgs( 1 ); + aArgs[0].Name = aObj.GetURLPath(); + aItem.QueryValue( a ); + aArgs[0].Value = a; + + SfxToolBoxControl::Dispatch( Reference< ::com::sun::star::frame::XDispatchProvider >( + mxFrame->getController(), UNO_QUERY ), + aCommand, + aArgs ); + + implSetAlignment( nAlignment, true ); + } + + return 0; +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::StartSelection() +{ +} + +// ----------------------------------------------------------------------- + +BOOL FontWorkAlignmentWindow::Close() +{ + return SfxPopupWindow::Close(); +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::PopupModeEnd() +{ + if ( IsVisible() ) + { + mbPopupMode = FALSE; + } + SfxPopupWindow::PopupModeEnd(); +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentWindow::GetFocus (void) +{ + SfxPopupWindow::GetFocus(); + // Grab the focus to the line ends value set so that it can be controlled + // with the keyboard. + if( mpMenu ) + mpMenu->GrabFocus(); +} + +// ======================================================================== + +FontWorkAlignmentControl::FontWorkAlignmentControl( + USHORT nSlotId, USHORT nId, ToolBox &rTbx ) +: SfxToolBoxControl( nSlotId, nId, rTbx ) +{ + rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) ); +} + +// ----------------------------------------------------------------------- + +FontWorkAlignmentControl::~FontWorkAlignmentControl() +{ +} + +// ----------------------------------------------------------------------- + +SfxPopupWindowType FontWorkAlignmentControl::GetPopupWindowType() const +{ + return SFX_POPUPWINDOW_ONCLICK; +} + +// ----------------------------------------------------------------------- + +SfxPopupWindow* FontWorkAlignmentControl::CreatePopupWindow() +{ + FontWorkAlignmentWindow* pWin = new FontWorkAlignmentWindow( GetId(), m_xFrame, &GetToolBox() ); + pWin->StartPopupMode( &GetToolBox(), TRUE ); + pWin->StartSelection(); + SetPopupWindow( pWin ); + return pWin; +} + +// ----------------------------------------------------------------------- + +void FontWorkAlignmentControl::StateChanged( USHORT /*nSID*/, SfxItemState eState, const SfxPoolItem* /*pState*/ ) +{ + USHORT nId = GetId(); + ToolBox& rTbx = GetToolBox(); + + rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState ); + rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK ); +} + +// #################################################################### + +SFX_IMPL_TOOLBOX_CONTROL( FontWorkCharacterSpacingControl, SfxBoolItem ); + +FontWorkCharacterSpacingWindow::FontWorkCharacterSpacingWindow( + USHORT nId, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame ) : + + SfxPopupWindow( nId, + rFrame, + SVX_RES( RID_SVXFLOAT_FONTWORK_CHARSPACING )), + mxFrame( rFrame ), + mbPopupMode( true ) +{ + SetHelpId( HID_WIN_FONTWORK_CHARSPACE ); + implInit(); +} + +FontWorkCharacterSpacingWindow::FontWorkCharacterSpacingWindow( + USHORT nId, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, + Window* pParentWindow ) : + + SfxPopupWindow( nId, + rFrame, + pParentWindow, + SVX_RES( RID_SVXFLOAT_FONTWORK_CHARSPACING )), + mxFrame( rFrame ), + mbPopupMode( true ) +{ + SetHelpId( HID_WIN_FONTWORK_CHARSPACE ); + implInit(); +} + +void FontWorkCharacterSpacingWindow::implInit() +{ + SetHelpId( HID_POPUP_FONTWORK_CHARSPACE ); + +// bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + + mpMenu = new ToolbarMenu( this, WB_CLIPCHILDREN ); + mpMenu->SetHelpId( HID_POPUP_FONTWORK_CHARSPACE ); + mpMenu->SetSelectHdl( LINK( this, FontWorkCharacterSpacingWindow, SelectHdl ) ); + + mpMenu->appendEntry( 0, String( SVX_RES( STR_CHARS_SPACING_VERY_TIGHT ) ), MIB_RADIOCHECK ); + mpMenu->appendEntry( 1, String( SVX_RES( STR_CHARS_SPACING_TIGHT ) ), MIB_RADIOCHECK ); + mpMenu->appendEntry( 2, String( SVX_RES( STR_CHARS_SPACING_NORMAL ) ), MIB_RADIOCHECK ); + mpMenu->appendEntry( 3, String( SVX_RES( STR_CHARS_SPACING_LOOSE ) ), MIB_RADIOCHECK ); + mpMenu->appendEntry( 4, String( SVX_RES( STR_CHARS_SPACING_VERY_LOOSE ) ), MIB_RADIOCHECK ); + mpMenu->appendEntry( 5, String( SVX_RES( STR_CHARS_SPACING_CUSTOM ) ), MIB_RADIOCHECK ); + mpMenu->appendSeparator(); + mpMenu->appendEntry( 6, String( SVX_RES( STR_CHARS_SPACING_KERN_PAIRS ) ), MIB_CHECKABLE ); + + SetOutputSizePixel( mpMenu->getMenuSize() ); + mpMenu->SetOutputSizePixel( GetOutputSizePixel() ); + + mpMenu->Show(); + + FreeResource(); + + AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacing" ))); +} + +SfxPopupWindow* FontWorkCharacterSpacingWindow::Clone() const +{ + return new FontWorkCharacterSpacingWindow( GetId(), mxFrame ); +} + +// ----------------------------------------------------------------------- + +FontWorkCharacterSpacingWindow::~FontWorkCharacterSpacingWindow() +{ + delete mpMenu; +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool bEnabled ) +{ + if( mpMenu ) + { + sal_Int32 i; + for ( i = 0; i < 6; i++ ) + { + mpMenu->checkEntry( i, sal_False ); + mpMenu->enableEntry( i, bEnabled ); + } + if ( nCharacterSpacing != -1 ) + { + sal_Int32 nEntry; + switch( nCharacterSpacing ) + { + case 80 : nEntry = 0; break; + case 90 : nEntry = 1; break; + case 100 : nEntry = 2; break; + case 120 : nEntry = 3; break; + case 150 : nEntry = 4; break; + default : nEntry = 5; break; + } + mpMenu->checkEntry( nEntry, bEnabled ); + } + } +} + +void FontWorkCharacterSpacingWindow::implSetKernCharacterPairs( sal_Bool, bool bEnabled ) +{ + if( mpMenu ) + { + mpMenu->enableEntry( 6, bEnabled ); + mpMenu->checkEntry( 6, bEnabled ); + } +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState ) +{ + switch( nSID ) + { + case SID_FONTWORK_CHARACTER_SPACING: + { + if( eState == SFX_ITEM_DISABLED ) + implSetCharacterSpacing( 0, false ); + else + { + const SfxInt32Item* pStateItem = PTR_CAST( SfxInt32Item, pState ); + if( pStateItem ) + implSetCharacterSpacing( pStateItem->GetValue(), true ); + } + } + break; + + case SID_FONTWORK_KERN_CHARACTER_PAIRS : + { + if( eState == SFX_ITEM_DISABLED ) + implSetKernCharacterPairs( 0, false ); + else + { + const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pState ); + if( pStateItem ) + implSetKernCharacterPairs( pStateItem->GetValue(), true ); + } + } + break; + } +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::DataChanged( const DataChangedEvent& rDCEvt ) +{ + SfxPopupWindow::DataChanged( rDCEvt ); + + if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) + { +// bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + + mpMenu->appendEntry( 0, String( SVX_RES( STR_CHARS_SPACING_VERY_TIGHT ) ), MIB_CHECKABLE ); + mpMenu->appendEntry( 1, String( SVX_RES( STR_CHARS_SPACING_TIGHT ) ), MIB_CHECKABLE ); + mpMenu->appendEntry( 2, String( SVX_RES( STR_CHARS_SPACING_NORMAL ) ), MIB_CHECKABLE ); + mpMenu->appendEntry( 3, String( SVX_RES( STR_CHARS_SPACING_LOOSE ) ), MIB_CHECKABLE ); + mpMenu->appendEntry( 4, String( SVX_RES( STR_CHARS_SPACING_VERY_LOOSE ) ), MIB_CHECKABLE ); + mpMenu->appendEntry( 5, String( SVX_RES( STR_CHARS_SPACING_CUSTOM ) ), MIB_CHECKABLE ); + mpMenu->appendSeparator(); + mpMenu->appendEntry( 6, String( SVX_RES( STR_CHARS_SPACING_KERN_PAIRS ) ), MIB_CHECKABLE ); + } +} + +// ----------------------------------------------------------------------- + +IMPL_LINK( FontWorkCharacterSpacingWindow, SelectHdl, void *, EMPTYARG ) +{ + if ( IsInPopupMode() ) + EndPopupMode(); + + sal_Int32 nSelection = mpMenu->getSelectedEntryId(); + sal_Int32 nCharacterSpacing; + switch( nSelection ) + { + case 0 : nCharacterSpacing = 80; break; + case 1 : nCharacterSpacing = 90; break; + case 2 : nCharacterSpacing = 100; break; + case 3 : nCharacterSpacing = 120; break; + case 4 : nCharacterSpacing = 150; break; + default : nCharacterSpacing = 100; break; + } + if ( nSelection == 5 ) // custom spacing + { + SfxInt32Item aItem( SID_FONTWORK_CHARACTER_SPACING, nCharacterSpacing ); + rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacingDialog" )); + + Any a; + Sequence< PropertyValue > aArgs( 1 ); + aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontworkCharacterSpacing" )); + aItem.QueryValue( a ); + aArgs[0].Value = a; + SfxToolBoxControl::Dispatch( Reference< ::com::sun::star::frame::XDispatchProvider >( + mxFrame->getController(), UNO_QUERY ), + aCommand, + aArgs ); + } + else if ( nSelection == 6 ) // KernCharacterPairs + { + sal_Bool bOnOff = sal_True; + SfxBoolItem aItem( SID_FONTWORK_KERN_CHARACTER_PAIRS, bOnOff ); + rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkKernCharacterPairs" )); + + Any a; + Sequence< PropertyValue > aArgs( 1 ); + aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontworkKernCharacterPairs" )); + aItem.QueryValue( a ); + aArgs[0].Value = a; + SfxToolBoxControl::Dispatch( Reference< ::com::sun::star::frame::XDispatchProvider >( + mxFrame->getController(), UNO_QUERY ), + aCommand, + aArgs ); + + implSetKernCharacterPairs( bOnOff, true ); + } + else if( nSelection >= 0 ) + { + SfxInt32Item aItem( SID_FONTWORK_CHARACTER_SPACING, nCharacterSpacing ); + rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontworkCharacterSpacing" )); + + Any a; + INetURLObject aObj( aCommand ); + Sequence< PropertyValue > aArgs( 1 ); + aArgs[0].Name = aObj.GetURLPath(); + aItem.QueryValue( a ); + aArgs[0].Value = a; + + SfxToolBoxControl::Dispatch( Reference< ::com::sun::star::frame::XDispatchProvider >( + mxFrame->getController(), UNO_QUERY ), + aCommand, + aArgs ); + + implSetCharacterSpacing( nCharacterSpacing, true ); + } + + return 0; +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::StartSelection() +{ +} + +// ----------------------------------------------------------------------- + +BOOL FontWorkCharacterSpacingWindow::Close() +{ + return SfxPopupWindow::Close(); +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::PopupModeEnd() +{ + if ( IsVisible() ) + { + mbPopupMode = FALSE; + } + SfxPopupWindow::PopupModeEnd(); +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingWindow::GetFocus (void) +{ + SfxPopupWindow::GetFocus(); + // Grab the focus to the line ends value set so that it can be controlled + // with the keyboard. + if( mpMenu ) + mpMenu->GrabFocus(); +} + +// ======================================================================== + +FontWorkCharacterSpacingControl::FontWorkCharacterSpacingControl( + USHORT nSlotId, USHORT nId, ToolBox &rTbx ) +: SfxToolBoxControl( nSlotId, nId, rTbx ) +{ + rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) ); +} + +// ----------------------------------------------------------------------- + +FontWorkCharacterSpacingControl::~FontWorkCharacterSpacingControl() +{ +} + +// ----------------------------------------------------------------------- + +SfxPopupWindowType FontWorkCharacterSpacingControl::GetPopupWindowType() const +{ + return SFX_POPUPWINDOW_ONCLICK; +} + +// ----------------------------------------------------------------------- + +SfxPopupWindow* FontWorkCharacterSpacingControl::CreatePopupWindow() +{ + FontWorkCharacterSpacingWindow* pWin = new FontWorkCharacterSpacingWindow( GetId(), m_xFrame, &GetToolBox() ); + pWin->StartPopupMode( &GetToolBox(), TRUE ); + pWin->StartSelection(); + SetPopupWindow( pWin ); + return pWin; +} + +// ----------------------------------------------------------------------- + +void FontWorkCharacterSpacingControl::StateChanged( USHORT, SfxItemState eState, const SfxPoolItem* ) +{ + USHORT nId = GetId(); + ToolBox& rTbx = GetToolBox(); + + rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState ); + rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK ); +} + +// ----------------------------------------------------------------------- + +FontworkCharacterSpacingDialog::FontworkCharacterSpacingDialog( Window* pParent, sal_Int32 nScale ) +: ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_FONTWORK_CHARSPACING ) ), + maFLScale( this, SVX_RES( FT_VALUE ) ), + maMtrScale( this, SVX_RES( MF_VALUE ) ), + maOKButton( this, SVX_RES( BTN_OK ) ), + maCancelButton( this, SVX_RES( BTN_CANCEL ) ), + maHelpButton( this, SVX_RES( BTN_HELP ) ) +{ + maMtrScale.SetValue( nScale ); + FreeResource(); +} + +FontworkCharacterSpacingDialog::~FontworkCharacterSpacingDialog() +{ +} + +sal_Int32 FontworkCharacterSpacingDialog::getScale() const +{ + return (sal_Int32)maMtrScale.GetValue(); +} |