summaryrefslogtreecommitdiff
path: root/svx/source/tbxctrls/extrusioncontrols.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/tbxctrls/extrusioncontrols.cxx')
-rw-r--r--svx/source/tbxctrls/extrusioncontrols.cxx1051
1 files changed, 1051 insertions, 0 deletions
diff --git a/svx/source/tbxctrls/extrusioncontrols.cxx b/svx/source/tbxctrls/extrusioncontrols.cxx
new file mode 100644
index 000000000000..f98fd57a0480
--- /dev/null
+++ b/svx/source/tbxctrls/extrusioncontrols.cxx
@@ -0,0 +1,1051 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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 ---------------------------------------------------------------
+
+#include <string> // HACK: prevent conflict between STLPORT and Workshop headers
+
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <com/sun/star/awt/MenuItemStyle.hpp>
+#include <com/sun/star/awt/XPopupMenuExtended.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+
+#include <vos/mutex.hxx>
+
+#include <vcl/toolbox.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/objsh.hxx>
+#include <svl/eitem.hxx>
+#include <vcl/settings.hxx>
+#include <svl/intitem.hxx>
+#include <editeng/colritem.hxx>
+#include <tools/urlobj.hxx>
+
+#include <svx/dialogs.hrc>
+#include <svx/svdtrans.hxx>
+#include <svx/sdasitm.hxx>
+#include <svx/dialmgr.hxx>
+#include "svx/extrusioncolorcontrol.hxx"
+
+//#include "chrtitem.hxx"
+#include "helpid.hrc"
+#include "extrusioncontrols.hxx"
+#include "extrusioncontrols.hrc"
+#include "colorwindow.hxx"
+#include "extrusiondepthdialog.hxx"
+
+////////////
+
+using ::rtl::OUString;
+using ::svtools::ToolbarMenu;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::graphic;
+
+namespace svx
+{
+
+/*************************************************************************
+|*
+|* ExtrusionDirectionWindow
+|*
+\************************************************************************/
+
+static sal_Int32 gSkewList[] = { 135, 90, 45, 180, 0, -360, -135, -90, -45 };
+
+ExtrusionDirectionWindow::ExtrusionDirectionWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
+: ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_DIRECTION ))
+, mrController( rController )
+, maImgPerspective( SVX_RES( IMG_PERSPECTIVE ) )
+, maImgPerspectiveH( SVX_RES( IMG_PERSPECTIVE_H ) )
+, maImgParallel( SVX_RES( IMG_PARALLEL ) )
+, maImgParallelH( SVX_RES( IMG_PARALLEL_H ) )
+, msExtrusionDirection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirection" ) )
+, msExtrusionProjection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionProjection" ) )
+{
+ SetHelpId( HID_MENU_EXTRUSION_DIRECTION );
+
+ USHORT i;
+ for( i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
+ {
+ maImgDirection[i] = Image( SVX_RES( IMG_DIRECTION + i ) );
+ maImgDirectionH[i] = Image( SVX_RES( IMG_DIRECTION_H + i ) );
+ }
+
+ SetSelectHdl( LINK( this, ExtrusionDirectionWindow, SelectHdl ) );
+ mpDirectionSet = createEmptyValueSetControl();
+ mpDirectionSet->SetHelpId( HID_VALUESET_EXTRUSION_DIRECTION );
+
+ mpDirectionSet->SetSelectHdl( LINK( this, ExtrusionDirectionWindow, SelectHdl ) );
+ mpDirectionSet->SetColCount( 3 );
+ mpDirectionSet->EnableFullItemMode( FALSE );
+
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ for( i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
+ {
+ String aText( SVX_RES( STR_DIRECTION + i ) );
+ mpDirectionSet->InsertItem( i+1, bHighContrast ? maImgDirectionH[ i ] : maImgDirection[ i ], aText );
+ }
+
+ mpDirectionSet->SetOutputSizePixel( Size( 72, 72 ) );
+
+ appendEntry( 2, mpDirectionSet );
+ appendSeparator();
+ appendEntry( 0, String( SVX_RES( STR_PERSPECTIVE ) ), bHighContrast ? maImgPerspectiveH : maImgPerspective );
+ appendEntry( 1, String( SVX_RES( STR_PARALLEL ) ), bHighContrast ? maImgParallelH : maImgParallel );
+
+ SetOutputSizePixel( getMenuSize() );
+
+ FreeResource();
+
+ AddStatusListener( msExtrusionDirection );
+ AddStatusListener( msExtrusionProjection );
+}
+
+void ExtrusionDirectionWindow::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ ToolbarMenu::DataChanged( rDCEvt );
+
+ if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
+ {
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ for( USHORT i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
+ {
+ mpDirectionSet->SetItemImage( i+1, bHighContrast ? maImgDirectionH[ i ] : maImgDirection[ i ] );
+ }
+
+ setEntryImage( 0, bHighContrast ? maImgPerspectiveH : maImgPerspective );
+ setEntryImage( 1, bHighContrast ? maImgParallelH : maImgParallel );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionDirectionWindow::implSetDirection( sal_Int32 nSkew, bool bEnabled )
+{
+ if( mpDirectionSet )
+ {
+ USHORT nItemId;
+ for( nItemId = DIRECTION_NW; nItemId <= DIRECTION_SE; nItemId++ )
+ {
+ if( gSkewList[nItemId] == nSkew )
+ break;
+ }
+
+ if( nItemId <= DIRECTION_SE )
+ {
+ mpDirectionSet->SelectItem( nItemId+1 );
+ }
+ else
+ {
+ mpDirectionSet->SetNoSelection();
+ }
+ }
+ enableEntry( 2, bEnabled );
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionDirectionWindow::implSetProjection( sal_Int32 nProjection, bool bEnabled )
+{
+ checkEntry( 0, (nProjection == 0) && bEnabled );
+ checkEntry( 1, (nProjection == 1 ) && bEnabled );
+ enableEntry( 0, bEnabled );
+ enableEntry( 1, bEnabled );
+}
+
+// -----------------------------------------------------------------------
+
+void SAL_CALL ExtrusionDirectionWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
+{
+ if( Event.FeatureURL.Main.equals( msExtrusionDirection ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetDirection( -1, false );
+ }
+ else
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ implSetDirection( nValue, true );
+ }
+ }
+ else if( Event.FeatureURL.Main.equals( msExtrusionProjection ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetProjection( -1, false );
+ }
+ else
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ implSetProjection( nValue, true );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ExtrusionDirectionWindow, SelectHdl, void *, pControl )
+{
+ if ( IsInPopupMode() )
+ EndPopupMode();
+
+ if( pControl == mpDirectionSet )
+ {
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionDirection.copy(5);
+ aArgs[0].Value <<= (sal_Int32)gSkewList[mpDirectionSet->GetSelectItemId()-1];
+
+ mrController.dispatchCommand( msExtrusionDirection, aArgs );
+ }
+ else
+ {
+ int nProjection = getSelectedEntryId();
+ if( (nProjection >= 0) && (nProjection < 2 ) )
+ {
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionProjection.copy(5);
+ aArgs[0].Value <<= (sal_Int32)nProjection;
+
+ mrController.dispatchCommand( msExtrusionProjection, aArgs );
+ implSetProjection( nProjection, true );
+ }
+ }
+
+ return 0;
+}
+
+// =======================================================================
+// ExtrusionDirectionControl
+// =======================================================================
+
+ExtrusionDirectionControl::ExtrusionDirectionControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
+: svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirectionFloater" ) ) )
+{
+}
+
+// -----------------------------------------------------------------------
+
+::Window* ExtrusionDirectionControl::createPopupWindow( ::Window* pParent )
+{
+ return new ExtrusionDirectionWindow( *this, m_xFrame, pParent );
+}
+
+// -----------------------------------------------------------------------
+// XServiceInfo
+// -----------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionDirectionControl_getImplementationName()
+{
+ return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionDirectionController" ));
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionDirectionControl_getSupportedServiceNames() throw( RuntimeException )
+{
+ Sequence< OUString > aSNS( 1 );
+ aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
+ return aSNS;
+}
+
+// --------------------------------------------------------------------
+
+Reference< XInterface > SAL_CALL SAL_CALL ExtrusionDirectionControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
+{
+ return *new ExtrusionDirectionControl( rSMgr );
+}
+
+// --------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionDirectionControl::getImplementationName( ) throw (RuntimeException)
+{
+ return ExtrusionDirectionControl_getImplementationName();
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionDirectionControl::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return ExtrusionDirectionControl_getSupportedServiceNames();
+}
+
+// ####################################################################
+
+ExtrusionDepthDialog::ExtrusionDepthDialog( Window* pParent, double fDepth, FieldUnit eDefaultUnit )
+: ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_EXTRUSION_DEPTH ) ),
+ maFLDepth( this, SVX_RES( FL_DEPTH ) ),
+ maMtrDepth( this, SVX_RES( MTR_DEPTH ) ),
+ maOKButton( this, SVX_RES( BTN_OK ) ),
+ maCancelButton( this, SVX_RES( BTN_CANCEL ) ),
+ maHelpButton( this, SVX_RES( BTN_HELP ) )
+{
+ bool bMetric = IsMetric( eDefaultUnit );
+ maMtrDepth.SetUnit( bMetric ? FUNIT_CM : FUNIT_INCH );
+ maMtrDepth.SetValue( (int) fDepth * 100, FUNIT_100TH_MM );
+
+ FreeResource();
+}
+
+ExtrusionDepthDialog::~ExtrusionDepthDialog()
+{
+}
+
+double ExtrusionDepthDialog::getDepth() const
+{
+// bool bMetric = IsMetric( meDefaultUnit );
+ return (double)( maMtrDepth.GetValue( FUNIT_100TH_MM ) ) / 100.0;
+}
+
+// ####################################################################
+
+double aDepthListInch[] = { 0, 1270,2540,5080,10160 };
+double aDepthListMM[] = { 0, 1000, 2500, 5000, 10000 };
+
+ExtrusionDepthWindow::ExtrusionDepthWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
+: ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_DEPTH ))
+, mrController( rController )
+, maImgDepth0( SVX_RES( IMG_DEPTH_0 ) )
+, maImgDepth1( SVX_RES( IMG_DEPTH_1 ) )
+, maImgDepth2( SVX_RES( IMG_DEPTH_2 ) )
+, maImgDepth3( SVX_RES( IMG_DEPTH_3 ) )
+, maImgDepth4( SVX_RES( IMG_DEPTH_4 ) )
+, maImgDepthInfinity( SVX_RES( IMG_DEPTH_INFINITY ) )
+, maImgDepth0h( SVX_RES( IMG_DEPTH_0_H ) )
+, maImgDepth1h( SVX_RES( IMG_DEPTH_1_H ) )
+, maImgDepth2h( SVX_RES( IMG_DEPTH_2_H ) )
+, maImgDepth3h( SVX_RES( IMG_DEPTH_3_H ) )
+, maImgDepth4h( SVX_RES( IMG_DEPTH_4_H ) )
+, maImgDepthInfinityh( SVX_RES( IMG_DEPTH_INFINITY_H ) )
+, mfDepth( -1.0 )
+, msExtrusionDepth( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepth" ) )
+, msMetricUnit( RTL_CONSTASCII_USTRINGPARAM( ".uno:MetricUnit" ) )
+{
+ SetHelpId( HID_MENU_EXTRUSION_DEPTH );
+
+ SetSelectHdl( LINK( this, ExtrusionDepthWindow, SelectHdl ) );
+
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ String aEmpty;
+ appendEntry( 0, aEmpty, bHighContrast ? maImgDepth0h : maImgDepth0 );
+ appendEntry( 1, aEmpty, bHighContrast ? maImgDepth1h : maImgDepth1 );
+ appendEntry( 2, aEmpty, bHighContrast ? maImgDepth2h : maImgDepth2 );
+ appendEntry( 3, aEmpty, bHighContrast ? maImgDepth3h : maImgDepth3 );
+ appendEntry( 4, aEmpty, bHighContrast ? maImgDepth4h : maImgDepth4 );
+ appendEntry( 5, String( SVX_RES( STR_INFINITY ) ), bHighContrast ? maImgDepthInfinityh : maImgDepthInfinity );
+ appendEntry( 6, String( SVX_RES( STR_CUSTOM ) ) );
+
+ SetOutputSizePixel( getMenuSize() );
+
+ FreeResource();
+
+ AddStatusListener( msExtrusionDepth );
+ AddStatusListener( msMetricUnit );
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionDepthWindow::implSetDepth( double fDepth )
+{
+ mfDepth = fDepth;
+ int i;
+ for( i = 0; i < 7; i++ )
+ {
+ if( i == 5 )
+ {
+ checkEntry( i, fDepth >= 338666 );
+ }
+ else if( i != 6 )
+ {
+ checkEntry( i, (fDepth == (IsMetric( meUnit ) ? aDepthListMM[i] : aDepthListInch[i]) ) );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionDepthWindow::implFillStrings( FieldUnit eUnit )
+{
+ meUnit = eUnit;
+ USHORT nResource = IsMetric( eUnit ) ? RID_SVXSTR_DEPTH_0 : RID_SVXSTR_DEPTH_0_INCH;
+
+ for( int i = 0; i < 5; i++ )
+ {
+ String aStr( SVX_RES( nResource + i ) );
+ setEntryText( i, aStr );
+ };
+}
+
+// -----------------------------------------------------------------------
+
+void SAL_CALL ExtrusionDepthWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
+{
+ if( Event.FeatureURL.Main.equals( msExtrusionDepth ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetDepth( 0 );
+ }
+ else
+ {
+ double fValue = 0.0;
+ if( Event.State >>= fValue )
+ implSetDepth( fValue );
+ }
+ }
+ else if( Event.FeatureURL.Main.equals( msMetricUnit ) )
+ {
+ if( Event.IsEnabled )
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ {
+ implFillStrings( static_cast<FieldUnit>(nValue) );
+ if( mfDepth >= 0.0 )
+ implSetDepth( mfDepth );
+ }
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionDepthWindow::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ ToolbarMenu::DataChanged( rDCEvt );
+
+ if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
+ {
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ setEntryImage( 0, bHighContrast ? maImgDepth0h : maImgDepth0 );
+ setEntryImage( 1, bHighContrast ? maImgDepth1h : maImgDepth1 );
+ setEntryImage( 2, bHighContrast ? maImgDepth2h : maImgDepth2 );
+ setEntryImage( 3, bHighContrast ? maImgDepth3h : maImgDepth3 );
+ setEntryImage( 4, bHighContrast ? maImgDepth4h : maImgDepth4 );
+ setEntryImage( 5, bHighContrast ? maImgDepthInfinityh : maImgDepthInfinity );
+ }
+}
+
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ExtrusionDepthWindow, SelectHdl, void *, EMPTYARG )
+{
+ int nSelected = getSelectedEntryId();
+ if( nSelected != -1 )
+ {
+ if( nSelected == 6 )
+ {
+ if ( IsInPopupMode() )
+ EndPopupMode();
+
+ const rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepthDialog" ));
+
+ Any a;
+ Sequence< PropertyValue > aArgs( 2 );
+ aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Depth" ));
+ aArgs[0].Value <<= mfDepth;
+ aArgs[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Metric" ));
+ aArgs[1].Value <<= static_cast<sal_Int32>( meUnit );
+
+ mrController.dispatchCommand( aCommand, aArgs );
+ }
+ else
+ {
+ double fDepth;
+
+ if( nSelected == 5 )
+ {
+ fDepth = 338666.6;
+ }
+ else
+ {
+ fDepth = IsMetric( meUnit ) ? aDepthListMM[nSelected] : aDepthListInch[nSelected];
+ }
+
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionDepth.copy(5);
+ aArgs[0].Value <<= fDepth;
+
+ mrController.dispatchCommand( msExtrusionDepth, aArgs );
+ implSetDepth( fDepth );
+
+ if ( IsInPopupMode() )
+ EndPopupMode();
+ }
+ }
+ return 0;
+}
+
+// =======================================================================
+// ExtrusionDirectionControl
+// =======================================================================
+
+ExtrusionDepthController::ExtrusionDepthController( const Reference< lang::XMultiServiceFactory >& rServiceManager )
+: svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepthFloater" ) ) )
+{
+}
+
+// -----------------------------------------------------------------------
+
+::Window* ExtrusionDepthController::createPopupWindow( ::Window* pParent )
+{
+ return new ExtrusionDepthWindow( *this, m_xFrame, pParent );
+}
+
+
+// -----------------------------------------------------------------------
+// XServiceInfo
+// -----------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionDepthController_getImplementationName()
+{
+ return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionDepthController" ));
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionDepthController_getSupportedServiceNames() throw( RuntimeException )
+{
+ Sequence< OUString > aSNS( 1 );
+ aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.PopupMenuController" ));
+ return aSNS;
+}
+
+// --------------------------------------------------------------------
+
+Reference< XInterface > SAL_CALL SAL_CALL ExtrusionDepthController_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
+{
+ return *new ExtrusionDepthController( rSMgr );
+}
+
+// --------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionDepthController::getImplementationName( ) throw (RuntimeException)
+{
+ return ExtrusionDepthController_getImplementationName();
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionDepthController::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return ExtrusionDepthController_getSupportedServiceNames();
+}
+
+
+// ####################################################################
+
+// -------------------------------------------------------------------------
+
+ExtrusionLightingWindow::ExtrusionLightingWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
+: ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_LIGHTING ))
+, mrController( rController )
+, maImgBright( SVX_RES( IMG_LIGHTING_BRIGHT ) )
+, maImgNormal( SVX_RES( IMG_LIGHTING_NORMAL ) )
+, maImgDim( SVX_RES( IMG_LIGHTING_DIM ) )
+, maImgBrighth( SVX_RES( IMG_LIGHTING_BRIGHT_H ) )
+, maImgNormalh( SVX_RES( IMG_LIGHTING_NORMAL_H ) )
+, maImgDimh( SVX_RES( IMG_LIGHTING_DIM_H ) )
+, mnLevel( 0 )
+, mbLevelEnabled( false )
+, mnDirection( FROM_FRONT )
+, mbDirectionEnabled( false )
+, msExtrusionLightingDirection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionLightingDirection" ))
+, msExtrusionLightingIntensity( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionLightingIntensity" ))
+{
+ USHORT i;
+ for( i = FROM_TOP_LEFT; i <= FROM_BOTTOM_RIGHT; i++ )
+ {
+ if( i != FROM_FRONT )
+ {
+ maImgLightingOff[i] = Image( SVX_RES( IMG_LIGHT_OFF + i ) );
+ maImgLightingOn[i] = Image( SVX_RES( IMG_LIGHT_ON + i ) );
+ maImgLightingOffh[i] = Image( SVX_RES( IMG_LIGHT_OFF_H + i ) );
+ maImgLightingOnh[i] = Image( SVX_RES( IMG_LIGHT_ON_H + i ) );
+ }
+ maImgLightingPreview[i] = Image( SVX_RES( IMG_LIGHT_PREVIEW + i ) );
+ maImgLightingPreviewh[i] = Image( SVX_RES( IMG_LIGHT_PREVIEW_H + i ) );
+ }
+
+ SetHelpId( HID_MENU_EXTRUSION_LIGHTING );
+ SetSelectHdl( LINK( this, ExtrusionLightingWindow, SelectHdl ) );
+
+ mpLightingSet = createEmptyValueSetControl();
+ mpLightingSet->SetHelpId( HID_VALUESET_EXTRUSION_LIGHTING );
+
+ mpLightingSet->SetSelectHdl( LINK( this, ExtrusionLightingWindow, SelectHdl ) );
+ mpLightingSet->SetColCount( 3 );
+ mpLightingSet->EnableFullItemMode( FALSE );
+
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ for( i = FROM_TOP_LEFT; i <= FROM_BOTTOM_RIGHT; i++ )
+ {
+ if( i != FROM_FRONT )
+ {
+ mpLightingSet->InsertItem( i+1, bHighContrast ? maImgLightingOffh[i] : maImgLightingOff[i] );
+ }
+ else
+ {
+ mpLightingSet->InsertItem( 5, bHighContrast ? maImgLightingPreviewh[FROM_FRONT] : maImgLightingPreview[FROM_FRONT] );
+ }
+ }
+ mpLightingSet->SetOutputSizePixel( Size( 72, 72 ) );
+
+ appendEntry( 3, mpLightingSet );
+ appendSeparator();
+ appendEntry( 0, String( SVX_RES( STR_BRIGHT ) ), bHighContrast ? maImgBrighth : maImgBright );
+ appendEntry( 1, String( SVX_RES( STR_NORMAL ) ), bHighContrast ? maImgNormalh : maImgNormal );
+ appendEntry( 2, String( SVX_RES( STR_DIM ) ), bHighContrast ? maImgDimh : maImgDim );
+
+ SetOutputSizePixel( getMenuSize() );
+
+ FreeResource();
+
+ AddStatusListener( msExtrusionLightingDirection );
+ AddStatusListener( msExtrusionLightingIntensity );
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionLightingWindow::implSetIntensity( int nLevel, bool bEnabled )
+{
+ mnLevel = nLevel;
+ mbLevelEnabled = bEnabled;
+ int i = 0;
+ for( i = 0; i < 3; i++ )
+ {
+ checkEntry( i, (i == nLevel) && bEnabled );
+ enableEntry( i, bEnabled );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionLightingWindow::implSetDirection( int nDirection, bool bEnabled )
+{
+ mnDirection = nDirection;
+ mbDirectionEnabled = bEnabled;
+
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ if( !bEnabled )
+ nDirection = FROM_FRONT;
+
+ USHORT nItemId;
+ for( nItemId = FROM_TOP_LEFT; nItemId <= FROM_BOTTOM_RIGHT; nItemId++ )
+ {
+ if( nItemId == FROM_FRONT )
+ {
+ mpLightingSet->SetItemImage( nItemId + 1, bHighContrast ? maImgLightingPreviewh[ nDirection ] : maImgLightingPreview[ nDirection ] );
+ }
+ else
+ {
+ if( bHighContrast )
+ {
+ mpLightingSet->SetItemImage( nItemId + 1, (USHORT)nDirection == nItemId ? maImgLightingOnh[nItemId] : maImgLightingOffh[nItemId] );
+ }
+ else
+ {
+ mpLightingSet->SetItemImage( nItemId + 1, (USHORT)nDirection == nItemId ? maImgLightingOn[nItemId] : maImgLightingOff[nItemId] );
+ }
+ }
+ }
+
+ enableEntry( 3, bEnabled );
+}
+
+// -----------------------------------------------------------------------
+
+void SAL_CALL ExtrusionLightingWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
+{
+ if( Event.FeatureURL.Main.equals( msExtrusionLightingIntensity ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetIntensity( 0, false );
+ }
+ else
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ implSetIntensity( nValue, true );
+ }
+ }
+ else if( Event.FeatureURL.Main.equals( msExtrusionLightingDirection ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetDirection( 0, false );
+ }
+ else
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ implSetDirection( nValue, true );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionLightingWindow::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ ToolbarMenu::DataChanged( rDCEvt );
+
+ if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
+ {
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ implSetDirection( mnDirection, mbDirectionEnabled );
+ setEntryImage( 0, bHighContrast ? maImgBrighth : maImgBright );
+ setEntryImage( 1, bHighContrast ? maImgNormalh : maImgNormal );
+ setEntryImage( 2, bHighContrast ? maImgDimh : maImgDim );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ExtrusionLightingWindow, SelectHdl, void *, pControl )
+{
+ if ( IsInPopupMode() )
+ EndPopupMode();
+
+ if( pControl == this )
+ {
+ int nLevel = getSelectedEntryId();
+ if( nLevel >= 0 )
+ {
+ if( nLevel != 3 )
+ {
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionLightingIntensity.copy(5);
+ aArgs[0].Value <<= (sal_Int32)nLevel;
+
+ mrController.dispatchCommand( msExtrusionLightingIntensity, aArgs );
+
+ implSetIntensity( nLevel, true );
+ }
+ }
+ }
+ else
+ {
+ sal_Int32 nDirection = mpLightingSet->GetSelectItemId();
+
+ if( (nDirection > 0) && (nDirection < 10) )
+ {
+ nDirection--;
+
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionLightingDirection.copy(5);
+ aArgs[0].Value <<= (sal_Int32)nDirection;
+
+ mrController.dispatchCommand( msExtrusionLightingDirection, aArgs );
+
+ implSetDirection( nDirection, true );
+ }
+
+ }
+
+ return 0;
+}
+
+// ========================================================================
+
+ExtrusionLightingControl::ExtrusionLightingControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
+: svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirectionFloater" ) ) )
+{
+}
+
+// -----------------------------------------------------------------------
+
+::Window* ExtrusionLightingControl::createPopupWindow( ::Window* pParent )
+{
+ return new ExtrusionLightingWindow( *this, m_xFrame, pParent );
+}
+
+// -----------------------------------------------------------------------
+// XServiceInfo
+// -----------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionLightingControl_getImplementationName()
+{
+ return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionLightingController" ));
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionLightingControl_getSupportedServiceNames() throw( RuntimeException )
+{
+ Sequence< OUString > aSNS( 1 );
+ aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
+ return aSNS;
+}
+
+// --------------------------------------------------------------------
+
+Reference< XInterface > SAL_CALL SAL_CALL ExtrusionLightingControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
+{
+ return *new ExtrusionLightingControl( rSMgr );
+}
+
+// --------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionLightingControl::getImplementationName( ) throw (RuntimeException)
+{
+ return ExtrusionLightingControl_getImplementationName();
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionLightingControl::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return ExtrusionLightingControl_getSupportedServiceNames();
+}
+
+// ####################################################################
+
+ExtrusionSurfaceWindow::ExtrusionSurfaceWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
+: ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_SURFACE ))
+, mrController( rController )
+, maImgSurface1( SVX_RES( IMG_WIRE_FRAME ) )
+, maImgSurface2( SVX_RES( IMG_MATTE ) )
+, maImgSurface3( SVX_RES( IMG_PLASTIC ) )
+, maImgSurface4( SVX_RES( IMG_METAL ) )
+, maImgSurface1h( SVX_RES( IMG_WIRE_FRAME_H ) )
+, maImgSurface2h( SVX_RES( IMG_MATTE_H ) )
+, maImgSurface3h( SVX_RES( IMG_PLASTIC_H ) )
+, maImgSurface4h( SVX_RES( IMG_METAL_H ) )
+, msExtrusionSurface( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionSurface" ))
+{
+ bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ SetHelpId( HID_MENU_EXTRUSION_SURFACE );
+ SetSelectHdl( LINK( this, ExtrusionSurfaceWindow, SelectHdl ) );
+
+ appendEntry( 0, String( SVX_RES( STR_WIREFRAME ) ), bHighContrast ? maImgSurface1h : maImgSurface1 );
+ appendEntry( 1, String( SVX_RES( STR_MATTE ) ), bHighContrast ? maImgSurface2h : maImgSurface2 );
+ appendEntry( 2, String( SVX_RES( STR_PLASTIC ) ), bHighContrast ? maImgSurface3h : maImgSurface3 );
+ appendEntry( 3, String( SVX_RES( STR_METAL ) ), bHighContrast ? maImgSurface4h : maImgSurface4 );
+
+ SetOutputSizePixel( getMenuSize() );
+
+ FreeResource();
+
+ AddStatusListener( msExtrusionSurface );
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionSurfaceWindow::implSetSurface( int nSurface, bool bEnabled )
+{
+// if( mpMenu )
+ {
+ int i;
+ for( i = 0; i < 4; i++ )
+ {
+ checkEntry( i, (i == nSurface) && bEnabled );
+ enableEntry( i, bEnabled );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void SAL_CALL ExtrusionSurfaceWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
+{
+ if( Event.FeatureURL.Main.equals( msExtrusionSurface ) )
+ {
+ if( !Event.IsEnabled )
+ {
+ implSetSurface( 0, false );
+ }
+ else
+ {
+ sal_Int32 nValue = 0;
+ if( Event.State >>= nValue )
+ implSetSurface( nValue, true );
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ExtrusionSurfaceWindow, SelectHdl, void *, EMPTYARG )
+{
+ if ( IsInPopupMode() )
+ EndPopupMode();
+
+ sal_Int32 nSurface = getSelectedEntryId();
+ if( nSurface >= 0 )
+ {
+ Sequence< PropertyValue > aArgs( 1 );
+ aArgs[0].Name = msExtrusionSurface.copy(5);
+ aArgs[0].Value <<= (sal_Int32)nSurface;
+
+ mrController.dispatchCommand( msExtrusionSurface, aArgs );
+
+ implSetSurface( nSurface, true );
+ }
+
+ return 0;
+}
+
+// ========================================================================
+
+ExtrusionSurfaceControl::ExtrusionSurfaceControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
+: svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionSurfaceFloater" ) ) )
+{
+}
+
+// -----------------------------------------------------------------------
+
+::Window* ExtrusionSurfaceControl::createPopupWindow( ::Window* pParent )
+{
+ return new ExtrusionSurfaceWindow( *this, m_xFrame, pParent );
+}
+
+// -----------------------------------------------------------------------
+// XServiceInfo
+// -----------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionSurfaceControl_getImplementationName()
+{
+ return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionSurfaceController" ));
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionSurfaceControl_getSupportedServiceNames() throw( RuntimeException )
+{
+ Sequence< OUString > aSNS( 1 );
+ aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
+ return aSNS;
+}
+
+// --------------------------------------------------------------------
+
+Reference< XInterface > SAL_CALL SAL_CALL ExtrusionSurfaceControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
+{
+ return *new ExtrusionSurfaceControl( rSMgr );
+}
+
+// --------------------------------------------------------------------
+
+OUString SAL_CALL ExtrusionSurfaceControl::getImplementationName( ) throw (RuntimeException)
+{
+ return ExtrusionSurfaceControl_getImplementationName();
+}
+
+// --------------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL ExtrusionSurfaceControl::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return ExtrusionSurfaceControl_getSupportedServiceNames();
+}
+
+//========================================================================
+
+SFX_IMPL_TOOLBOX_CONTROL( ExtrusionColorControl, SvxColorItem );
+
+ExtrusionColorControl::ExtrusionColorControl(
+ USHORT nSlotId, USHORT nId, ToolBox& rTbx )
+: SfxToolBoxControl ( nSlotId, nId, rTbx )
+{
+ rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
+ mpBtnUpdater = new ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox(), TBX_UPDATER_MODE_CHAR_COLOR_NEW );
+}
+
+// -----------------------------------------------------------------------
+
+ExtrusionColorControl::~ExtrusionColorControl()
+{
+ delete mpBtnUpdater;
+}
+
+// -----------------------------------------------------------------------
+
+SfxPopupWindowType ExtrusionColorControl::GetPopupWindowType() const
+{
+ return SFX_POPUPWINDOW_ONCLICK;
+}
+
+// -----------------------------------------------------------------------
+
+SfxPopupWindow* ExtrusionColorControl::CreatePopupWindow()
+{
+ SvxColorWindow_Impl* pColorWin = new SvxColorWindow_Impl(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Extrusion3DColor" )),
+ SID_EXTRUSION_3D_COLOR,
+ m_xFrame,
+ SVX_RESSTR( RID_SVXSTR_EXTRUSION_COLOR ),
+ &GetToolBox() );
+ pColorWin->StartPopupMode( &GetToolBox(), FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
+ pColorWin->StartSelection();
+ SetPopupWindow( pColorWin );
+ return pColorWin;
+}
+
+// -----------------------------------------------------------------------
+
+void ExtrusionColorControl::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
+{
+ USHORT nId = GetId();
+ ToolBox& rTbx = GetToolBox();
+
+ if( nSID == SID_EXTRUSION_3D_COLOR )
+ {
+ const SvxColorItem* pItem = 0;
+
+ if( SFX_ITEM_DONTCARE != eState )
+ pItem = PTR_CAST( SvxColorItem, pState );
+
+ if ( pItem )
+ mpBtnUpdater->Update( pItem->GetValue());
+ }
+
+ rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
+ rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
+}
+
+}