/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#include <sfx2/dispatch.hxx>
#include <sfx2/module.hxx>
#include <sfx2/viewfrm.hxx>
#include <svl/eitem.hxx>
#include <svtools/colrdlg.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/viewsh.hxx>
#include <tools/shl.hxx>
#include <svx/xflclit.hxx>
#include <svx/svdmodel.hxx>
#include <svx/globl3d.hxx>
#include <svx/view3d.hxx>
#include <svx/obj3d.hxx>
#include <svx/sphere3d.hxx>
#include <svx/scene3d.hxx>
#include <svx/camera3d.hxx>
#include <svx/fmmodel.hxx>
#include <svx/fmpage.hxx>
#include <svx/polysc3d.hxx>
#include <editeng/eeitem.hxx>
#include <svl/style.hxx>
#include <svx/dlgutil.hxx>

#include <svx/dlgutil.hxx>
#include <svx/dialmgr.hxx>
#include <svx/viewpt3d.hxx> // ProjectionType

#include <svx/svxids.hrc>
#include <svx/dialogs.hrc>

#include <editeng/colritem.hxx>
#include <svx/e3ditem.hxx>

#include <svx/gallery.hxx>
#define GALLERY_THEME "3D"
#include <svl/whiter.hxx>

#include <svx/float3d.hxx>
#include "float3d.hrc"

SFX_IMPL_DOCKINGWINDOW( Svx3DChildWindow, SID_3D_WIN )

struct Svx3DWinImpl
{
	SfxItemPool*		pPool;
	Image				maImgLightOnH;
	Image				maImgLightOffH;
};

#define SETHCIMAGE(btn,res) \
{ \
	Bitmap aBmp( SVX_RES( res ) ); \
	Image aImage( aBmp, COL_LIGHTMAGENTA ); \
	btn.SetModeImage( aImage, BMP_COLOR_HIGHCONTRAST ); \
}

namespace {
    /** Get the dispatcher from the current view frame, or, if that is not
        available, from the given bindings.
        @param pBindings
            May be NULL.
        @returns NULL when both the current view frame is NULL and the given
            bindings are NULL.
    */
    SfxDispatcher* LocalGetDispatcher (const SfxBindings* pBindings)
    {
        SfxDispatcher* pDispatcher = NULL;

        if (SfxViewFrame::Current() != NULL)
            pDispatcher = SfxViewFrame::Current()->GetDispatcher();
        else if (pBindings != NULL)
            pDispatcher = pBindings->GetDispatcher();

        return pDispatcher;
    }
}


/*************************************************************************
|*	Svx3DWin - FloatingWindow
\************************************************************************/
__EXPORT Svx3DWin::Svx3DWin( SfxBindings* pInBindings,
				SfxChildWindow *pCW, Window* pParent ) :
		SfxDockingWindow    ( pInBindings, pCW, pParent,
									SVX_RES( RID_SVXFLOAT_3D ) ),
		aBtnGeo				( this, SVX_RES( BTN_GEO ) ),
		aBtnRepresentation	( this, SVX_RES( BTN_REPRESENTATION ) ),
		aBtnLight			( this, SVX_RES( BTN_LIGHT ) ),
		aBtnTexture			( this, SVX_RES( BTN_TEXTURE ) ),
		aBtnMaterial		( this, SVX_RES( BTN_MATERIAL ) ),
		aBtnUpdate			( this, SVX_RES( BTN_UPDATE ) ),
		aBtnAssign			( this, SVX_RES( BTN_ASSIGN ) ),
        aFLGeometrie       ( this, SVX_RES( FL_GEOMETRIE ) ),

		// Geometrie
		aFtPercentDiagonal	( this, SVX_RES( FT_PERCENT_DIAGONAL ) ),
		aMtrPercentDiagonal	( this, SVX_RES( MTR_PERCENT_DIAGONAL ) ),
		aFtBackscale		( this, SVX_RES( FT_BACKSCALE ) ),
		aMtrBackscale		( this, SVX_RES( MTR_BACKSCALE ) ),
		aFtEndAngle			( this, SVX_RES( FT_END_ANGLE ) ),
		aMtrEndAngle		( this, SVX_RES( MTR_END_ANGLE ) ),
		aFtDepth			( this, SVX_RES( FT_DEPTH ) ),
		aMtrDepth			( this, SVX_RES( MTR_DEPTH ) ),
        aFLSegments        ( this, SVX_RES( FL_SEGMENTS ) ),

		aFtHorizontal		( this, SVX_RES( FT_HORIZONTAL ) ),
		aNumHorizontal		( this, SVX_RES( NUM_HORIZONTAL ) ),
		aFtVertical			( this, SVX_RES( FT_VERTICAL ) ),
		aNumVertical		( this, SVX_RES( NUM_VERTICAL ) ),

        aFLNormals         ( this, SVX_RES( FL_NORMALS ) ),
		aBtnNormalsObj		( this, SVX_RES( BTN_NORMALS_OBJ ) ),
		aBtnNormalsFlat		( this, SVX_RES( BTN_NORMALS_FLAT ) ),
		aBtnNormalsSphere	( this, SVX_RES( BTN_NORMALS_SPHERE ) ),
		aBtnNormalsInvert	( this, SVX_RES( BTN_NORMALS_INVERT ) ),
		aBtnTwoSidedLighting( this, SVX_RES( BTN_TWO_SIDED_LIGHTING ) ),

		aBtnDoubleSided   	( this, SVX_RES( BTN_DOUBLE_SIDED ) ),

		// Darstellung
        aFLRepresentation  ( this, SVX_RES( FL_REPRESENTATION ) ),
		aFtShademode		( this, SVX_RES( FT_SHADEMODE ) ),
		aLbShademode		( this, SVX_RES( LB_SHADEMODE ) ),
        aFLShadow          ( this, SVX_RES( FL_SHADOW ) ),
		aBtnShadow3d 		( this, SVX_RES( BTN_SHADOW_3D ) ),
		aFtSlant      		( this, SVX_RES( FT_SLANT ) ),
		aMtrSlant     		( this, SVX_RES( MTR_SLANT ) ),
		aFtDistance			( this, SVX_RES( FT_DISTANCE ) ),
		aMtrDistance		( this, SVX_RES( MTR_DISTANCE ) ),
		aFtFocalLeng		( this, SVX_RES( FT_FOCAL_LENGTH ) ),
		aMtrFocalLength		( this, SVX_RES( MTR_FOCAL_LENGTH ) ),
        aFLCamera          ( this, SVX_RES( FL_CAMERA ) ),
		aFLLight           ( this, SVX_RES( FL_LIGHT ) ),

		// Beleuchtung
		aBtnLight1			( this, SVX_RES( BTN_LIGHT_1 ) ),
		aBtnLight2			( this, SVX_RES( BTN_LIGHT_2 ) ),
		aBtnLight3			( this, SVX_RES( BTN_LIGHT_3 ) ),
		aBtnLight4			( this, SVX_RES( BTN_LIGHT_4 ) ),
		aBtnLight5			( this, SVX_RES( BTN_LIGHT_5 ) ),
		aBtnLight6			( this, SVX_RES( BTN_LIGHT_6 ) ),
		aBtnLight7			( this, SVX_RES( BTN_LIGHT_7 ) ),
		aBtnLight8			( this, SVX_RES( BTN_LIGHT_8 ) ),
        aFTLightsource     ( this, SVX_RES( FT_LIGHTSOURCE ) ),
		aLbLight1			( this, SVX_RES( LB_LIGHT_1 ) ),
		aLbLight2   		( this, SVX_RES( LB_LIGHT_2 ) ),
		aLbLight3			( this, SVX_RES( LB_LIGHT_3 ) ),
		aLbLight4			( this, SVX_RES( LB_LIGHT_4 ) ),
		aLbLight5			( this, SVX_RES( LB_LIGHT_5 ) ),
		aLbLight6			( this, SVX_RES( LB_LIGHT_6 ) ),
		aLbLight7			( this, SVX_RES( LB_LIGHT_7 ) ),
		aLbLight8			( this, SVX_RES( LB_LIGHT_8 ) ),

		aBtnLightColor		( this, SVX_RES( BTN_LIGHT_COLOR ) ),

		// #99694# Keyboard shortcuts activate the next control, so the
		// order needed to be changed here
        aFTAmbientlight    ( this, SVX_RES( FT_AMBIENTLIGHT ) ),	// Text label
		aLbAmbientlight		( this, SVX_RES( LB_AMBIENTLIGHT ) ),	// ListBox
		aBtnAmbientColor	( this, SVX_RES( BTN_AMBIENT_COLOR ) ), // color button
        aFLTexture         ( this, SVX_RES( FL_TEXTURE ) ),

		// Texturen
		aFtTexKind			( this, SVX_RES( FT_TEX_KIND ) ),
		aBtnTexLuminance	( this, SVX_RES( BTN_TEX_LUMINANCE ) ),
		aBtnTexColor		( this, SVX_RES( BTN_TEX_COLOR ) ),
		aFtTexMode			( this, SVX_RES( FT_TEX_MODE ) ),
		aBtnTexReplace		( this, SVX_RES( BTN_TEX_REPLACE ) ),
		aBtnTexModulate		( this, SVX_RES( BTN_TEX_MODULATE ) ),
		aBtnTexBlend		( this, SVX_RES( BTN_TEX_BLEND ) ),
		aFtTexProjectionX	( this, SVX_RES( FT_TEX_PROJECTION_X ) ),
		aBtnTexObjectX		( this, SVX_RES( BTN_TEX_OBJECT_X ) ),
		aBtnTexParallelX	( this, SVX_RES( BTN_TEX_PARALLEL_X ) ),
		aBtnTexCircleX		( this, SVX_RES( BTN_TEX_CIRCLE_X ) ),
		aFtTexProjectionY	( this, SVX_RES( FT_TEX_PROJECTION_Y ) ),
		aBtnTexObjectY		( this, SVX_RES( BTN_TEX_OBJECT_Y ) ),
		aBtnTexParallelY	( this, SVX_RES( BTN_TEX_PARALLEL_Y ) ),
		aBtnTexCircleY		( this, SVX_RES( BTN_TEX_CIRCLE_Y ) ),
		aFtTexFilter		( this, SVX_RES( FT_TEX_FILTER ) ),
		aBtnTexFilter		( this, SVX_RES( BTN_TEX_FILTER ) ),
        aFLMaterial        ( this, SVX_RES( FL_MATERIAL ) ),

		// Material
		aFtMatFavorites 	( this, SVX_RES( FT_MAT_FAVORITES ) ),
		aLbMatFavorites 	( this, SVX_RES( LB_MAT_FAVORITES ) ),
		aFtMatColor			( this, SVX_RES( FT_MAT_COLOR ) ),
		aLbMatColor			( this, SVX_RES( LB_MAT_COLOR ) ),
		aBtnMatColor		( this, SVX_RES( BTN_MAT_COLOR ) ),
		aFtMatEmission		( this, SVX_RES( FT_MAT_EMISSION ) ),
		aLbMatEmission		( this, SVX_RES( LB_MAT_EMISSION ) ),
		aBtnEmissionColor	( this, SVX_RES( BTN_EMISSION_COLOR ) ),
        aFLMatSpecular     ( this, SVX_RES( FL_MAT_SPECULAR ) ),
		aFtMatSpecular		( this, SVX_RES( FT_MAT_SPECULAR ) ),
		aLbMatSpecular		( this, SVX_RES( LB_MAT_SPECULAR ) ),
		aBtnSpecularColor	( this, SVX_RES( BTN_SPECULAR_COLOR ) ),
		aFtMatSpecularIntensity( this, SVX_RES( FT_MAT_SPECULAR_INTENSITY ) ),
		aMtrMatSpecularIntensity( this, SVX_RES( MTR_MAT_SPECULAR_INTENSITY ) ),
		aCtlPreview 		( this, SVX_RES( CTL_PREVIEW ) ),
		aCtlLightPreview 	( this, SVX_RES( CTL_LIGHT_PREVIEW ) ),

		// Unterer Bereich
		aBtnConvertTo3D		( this, SVX_RES( BTN_CHANGE_TO_3D ) ),
		aBtnLatheObject		( this, SVX_RES( BTN_LATHE_OBJ ) ),
		aBtnPerspective		( this, SVX_RES( BTN_PERSPECTIVE ) ),

		aImgLightOn			( SVX_RES( RID_SVXIMAGE_LIGHT_ON ) ),
		aImgLightOff		( SVX_RES( RID_SVXIMAGE_LIGHT_OFF ) ),

		bUpdate				( sal_False ),
		eViewType			( VIEWTYPE_GEO ),

		pModel				( NULL ),
		pFmPage				( NULL ),
		pVDev	 			( NULL ),
		p3DView				( NULL ),
		pFavorSetList		( NULL ),
		pMatFavSetList		( NULL ),

		pBindings			( pInBindings ),
		pControllerItem(0L),
		pConvertTo3DItem(0L),
		pConvertTo3DLatheItem(0L),
//		pPool				( NULL ),
		mpImpl				( new Svx3DWinImpl() ),
		mpRemember2DAttributes(NULL),
		bOnly3DChanged		( sal_False )
{
	String accname(SVX_RES(STR_COLOR_LIGHT_PRE));
	aCtlLightPreview.SetAccessibleName(accname);
	aCtlPreview.SetAccessibleName(accname);
	aLbAmbientlight.SetAccessibleName(aFTAmbientlight.GetDisplayText());

	SETHCIMAGE( aBtnGeo, BMP_GEO_H );
	SETHCIMAGE( aBtnRepresentation, BMP_REPRESENTATION_H );
	SETHCIMAGE( aBtnLight, BMP_3DLIGHT_H );
	SETHCIMAGE( aBtnTexture, BMP_TEXTURE_H );
	SETHCIMAGE( aBtnMaterial, BMP_MATERIAL_H );
	SETHCIMAGE( aBtnUpdate, BMP_UPDATE_H );
	SETHCIMAGE( aBtnAssign, BMP_ASSIGN_H );
	SETHCIMAGE( aBtnNormalsObj, BMP_NORMALS_OBJ_H );
	SETHCIMAGE( aBtnNormalsFlat, BMP_NORMALS_FLAT_H );
	SETHCIMAGE( aBtnNormalsSphere, BMP_NORMALS_SPHERE_H );
	SETHCIMAGE( aBtnTwoSidedLighting, BMP_TWO_SIDED_LIGHTING_H );
	SETHCIMAGE( aBtnNormalsInvert, BMP_NORMALS_INVERT_H );
	SETHCIMAGE( aBtnDoubleSided, BMP_DOUBLE_SIDED_H );
	SETHCIMAGE( aBtnShadow3d, BMP_SHADOW_3D_H );
	SETHCIMAGE( aBtnLight1, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight2, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight3, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight4, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight5, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight6, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight7, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLight8, BMP_LIGHT_H );
	SETHCIMAGE( aBtnLightColor, BMP_LIGHT_COLOR_H );
	SETHCIMAGE( aBtnAmbientColor, BMP_AMBIENT_COLOR_H );
	SETHCIMAGE( aBtnTexLuminance, BMP_TEX_LUMINANCE_H );
	SETHCIMAGE( aBtnTexColor, BMP_TEX_COLOR_H );
	SETHCIMAGE( aBtnTexReplace, BMP_TEX_REPLACE_H );
	SETHCIMAGE( aBtnTexModulate, BMP_TEX_MODULATE_H );
	SETHCIMAGE( aBtnTexBlend, BMP_TEX_BLEND_H );
	SETHCIMAGE( aBtnTexParallelX, BMP_TEX_PARALLEL_H );
	SETHCIMAGE( aBtnTexCircleX, BMP_TEX_CIRCLE_H );
	SETHCIMAGE( aBtnTexObjectX, BMP_TEX_OBJECT_H );
	SETHCIMAGE( aBtnTexParallelY, BMP_TEX_PARALLEL_H );
	SETHCIMAGE( aBtnTexCircleY, BMP_TEX_CIRCLE_H );
	SETHCIMAGE( aBtnTexObjectY, BMP_TEX_OBJECT_H );
	SETHCIMAGE( aBtnTexFilter, BMP_TEX_FILTER_H );
	SETHCIMAGE( aBtnMatColor, BMP_COLORDLG_H );
	SETHCIMAGE( aBtnEmissionColor, BMP_COLORDLG_H );
	SETHCIMAGE( aBtnSpecularColor, BMP_COLORDLG_H );
	SETHCIMAGE( aBtnPerspective, BMP_PERSPECTIVE_H );
	SETHCIMAGE( aBtnConvertTo3D, BMP_CHANGE_TO_3D_H );
	SETHCIMAGE( aBtnLatheObject, BMP_LATHE_OBJ_H );

	mpImpl->pPool = NULL;
	mpImpl->maImgLightOnH = Image( SVX_RES( RID_SVXIMAGE_LIGHT_ON_H ) );
	mpImpl->maImgLightOffH = Image( SVX_RES( RID_SVXIMAGE_LIGHT_OFF_H ) );
	FreeResource();

	// Metrik einstellen
	eFUnit = pInBindings->GetDispatcher()->GetModule()->GetFieldUnit();

	aMtrDepth.SetUnit( eFUnit );
	aMtrDistance.SetUnit( eFUnit );
	aMtrFocalLength.SetUnit( eFUnit );

	pControllerItem = new Svx3DCtrlItem(SID_3D_STATE, this, pBindings);
	pConvertTo3DItem = new SvxConvertTo3DItem(SID_CONVERT_TO_3D, pBindings);
	pConvertTo3DLatheItem = new SvxConvertTo3DItem(SID_CONVERT_TO_3D_LATHE_FAST, pBindings);

	aBtnAssign.SetClickHdl( LINK( this, Svx3DWin, ClickAssignHdl ) );
	aBtnUpdate.SetClickHdl( LINK( this, Svx3DWin, ClickUpdateHdl ) );

	Link aLink( LINK( this, Svx3DWin, ClickViewTypeHdl ) );
	aBtnGeo.SetClickHdl( aLink );
	aBtnRepresentation.SetClickHdl( aLink );
	aBtnLight.SetClickHdl( aLink );
	aBtnTexture.SetClickHdl( aLink );
	aBtnMaterial.SetClickHdl( aLink );

	aLink = LINK( this, Svx3DWin, ClickHdl );
	aBtnPerspective.SetClickHdl( aLink );
	aBtnConvertTo3D.SetClickHdl( aLink );
	aBtnLatheObject.SetClickHdl( aLink );

	// Geometrie
	aBtnNormalsObj.SetClickHdl( aLink );
	aBtnNormalsFlat.SetClickHdl( aLink );
	aBtnNormalsSphere.SetClickHdl( aLink );
	aBtnTwoSidedLighting.SetClickHdl( aLink );
	aBtnNormalsInvert.SetClickHdl( aLink );
	aBtnDoubleSided.SetClickHdl( aLink );

	// Darstellung
	aBtnShadow3d.SetClickHdl( aLink );

	// Beleuchtung
	aBtnLight1.SetClickHdl( aLink );
	aBtnLight2.SetClickHdl( aLink );
	aBtnLight3.SetClickHdl( aLink );
	aBtnLight4.SetClickHdl( aLink );
	aBtnLight5.SetClickHdl( aLink );
	aBtnLight6.SetClickHdl( aLink );
	aBtnLight7.SetClickHdl( aLink );
	aBtnLight8.SetClickHdl( aLink );

	// Texturen
	aBtnTexLuminance.SetClickHdl( aLink );
	aBtnTexColor.SetClickHdl( aLink );
	aBtnTexReplace.SetClickHdl( aLink );
	aBtnTexModulate.SetClickHdl( aLink );
	//aBtnTexBlend.SetClickHdl( aLink );
	aBtnTexParallelX.SetClickHdl( aLink );
	aBtnTexCircleX.SetClickHdl( aLink );
	aBtnTexObjectX.SetClickHdl( aLink );
	aBtnTexParallelY.SetClickHdl( aLink );
	aBtnTexCircleY.SetClickHdl( aLink );
	aBtnTexObjectY.SetClickHdl( aLink );
	aBtnTexFilter.SetClickHdl( aLink );

	// Material
	aLink = LINK( this, Svx3DWin, ClickColorHdl );
	aBtnLightColor.SetClickHdl( aLink );
	aBtnAmbientColor.SetClickHdl( aLink );
	aBtnMatColor.SetClickHdl( aLink );
	aBtnEmissionColor.SetClickHdl( aLink );
	aBtnSpecularColor.SetClickHdl( aLink );


	aLink = LINK( this, Svx3DWin, SelectHdl );
	aLbMatFavorites.SetSelectHdl( aLink );
	aLbMatColor.SetSelectHdl( aLink );
	aLbMatEmission.SetSelectHdl( aLink );
	aLbMatSpecular.SetSelectHdl( aLink );
	aLbLight1.SetSelectHdl( aLink );
	aLbLight2.SetSelectHdl( aLink );
	aLbLight3.SetSelectHdl( aLink );
	aLbLight4.SetSelectHdl( aLink );
	aLbLight5.SetSelectHdl( aLink );
	aLbLight6.SetSelectHdl( aLink );
	aLbLight7.SetSelectHdl( aLink );
	aLbLight8.SetSelectHdl( aLink );
	aLbAmbientlight.SetSelectHdl( aLink );
	aLbShademode.SetSelectHdl( aLink );

	aLink = LINK( this, Svx3DWin, ModifyHdl );
	aMtrMatSpecularIntensity.SetModifyHdl( aLink );
	aNumHorizontal.SetModifyHdl( aLink );
	aNumVertical.SetModifyHdl( aLink );
	aMtrSlant.SetModifyHdl( aLink );

	// Preview-Callback
	aLink = LINK( this, Svx3DWin, ChangeLightCallbackHdl );
	aCtlLightPreview.SetUserInteractiveChangeCallback(aLink);
	aLink = LINK( this, Svx3DWin, ChangeSelectionCallbackHdl );
	aCtlLightPreview.SetUserSelectionChangeCallback(aLink);

    aSize = GetOutputSizePixel();
	SetMinOutputSizePixel( aSize );

	Construct();

	// Initiierung der Initialisierung der ColorLBs
    SfxDispatcher* pDispatcher = LocalGetDispatcher(pBindings);
    if (pDispatcher != NULL)
    {
        SfxBoolItem aItem( SID_3D_INIT, sal_True );
        pDispatcher->Execute(
            SID_3D_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
    }

	Reset();

	aBtnNormalsObj.SetAccessibleRelationMemberOf( &aFLNormals );
	aBtnNormalsFlat.SetAccessibleRelationMemberOf( &aFLNormals );
	aBtnNormalsSphere.SetAccessibleRelationMemberOf( &aFLNormals );
	aBtnNormalsInvert.SetAccessibleRelationMemberOf( &aFLNormals );
	aBtnTwoSidedLighting.SetAccessibleRelationMemberOf( &aFLNormals );
	aBtnDoubleSided.SetAccessibleRelationMemberOf( &aFLNormals );

	aBtnLight1.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight2.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight3.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight4.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight5.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight6.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight7.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLight8.SetAccessibleRelationMemberOf( &aFLLight );

	aBtnLight1.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight2.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight3.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight4.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight5.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight6.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight7.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLight8.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnLightColor.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnLightColor.SetAccessibleRelationLabeledBy( &aFTLightsource );
	aBtnAmbientColor.SetAccessibleRelationMemberOf( &aFLLight );
	aBtnAmbientColor.SetAccessibleRelationLabeledBy( &aFTAmbientlight );

	aBtnSpecularColor.SetAccessibleRelationLabeledBy( &aFtMatSpecular );
	aBtnMatColor.SetAccessibleRelationLabeledBy( &aFtMatColor );
	aBtnEmissionColor.SetAccessibleRelationLabeledBy( &aFtMatEmission );
	aBtnTexLuminance.SetAccessibleRelationLabeledBy( &aFtTexKind );
	aBtnTexColor.SetAccessibleRelationLabeledBy( &aFtTexKind );
	aBtnTexReplace.SetAccessibleRelationLabeledBy( &aFtTexMode );
	aBtnTexModulate.SetAccessibleRelationLabeledBy( &aFtTexMode );
	aBtnTexBlend.SetAccessibleRelationLabeledBy( &aFtTexMode );
	aBtnTexObjectX.SetAccessibleRelationLabeledBy( &aFtTexProjectionX );
	aBtnTexParallelX.SetAccessibleRelationLabeledBy( &aFtTexProjectionX );
	aBtnTexCircleX.SetAccessibleRelationLabeledBy( &aFtTexProjectionX );
	aBtnTexObjectY.SetAccessibleRelationLabeledBy( &aFtTexProjectionY );
	aBtnTexParallelY.SetAccessibleRelationLabeledBy( &aFtTexProjectionY );
	aBtnTexCircleY.SetAccessibleRelationLabeledBy( &aFtTexProjectionY );
	aBtnTexFilter.SetAccessibleRelationLabeledBy( &aFtTexFilter );
	aCtlLightPreview.SetAccessibleRelationLabeledBy( &aCtlLightPreview );
	aBtnNormalsObj.SetAccessibleRelationMemberOf(&aFLNormals);
	aBtnNormalsFlat.SetAccessibleRelationMemberOf(&aFLNormals);
	aBtnNormalsSphere.SetAccessibleRelationMemberOf(&aFLNormals);
	aBtnNormalsInvert.SetAccessibleRelationMemberOf(&aFLNormals);
	aBtnTwoSidedLighting.SetAccessibleRelationMemberOf(&aFLNormals);

	aBtnShadow3d.SetAccessibleRelationMemberOf(&aFLShadow);

	aBtnLight1.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight2.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight3.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight4.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight5.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight6.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight7.SetAccessibleRelationMemberOf(&aFLLight);
	aBtnLight8.SetAccessibleRelationMemberOf(&aFLLight);

	aBtnTexLuminance.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexColor.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexReplace.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexModulate.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexBlend.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexObjectX.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexParallelX.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexCircleX.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexObjectY.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexParallelY.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexCircleY.SetAccessibleRelationMemberOf(&aFLTexture);
	aBtnTexFilter.SetAccessibleRelationMemberOf(&aFLTexture);

	aBtnMatColor.SetAccessibleRelationMemberOf(&aFLMaterial);
	aBtnEmissionColor.SetAccessibleRelationMemberOf(&aFLMaterial);

	aBtnSpecularColor.SetAccessibleRelationMemberOf(&aFLMatSpecular);
}

// -----------------------------------------------------------------------
__EXPORT Svx3DWin::~Svx3DWin()
{
	//delete pMatFavSetList;
	delete p3DView;
	delete pVDev;
	delete pModel;

	delete pControllerItem;
	delete pConvertTo3DItem;
	delete pConvertTo3DLatheItem;

	if(mpRemember2DAttributes)
		delete mpRemember2DAttributes;

	delete mpImpl;
}

// -----------------------------------------------------------------------
void Svx3DWin::Construct()
{
	aBtnGeo.Check();
	Link aLink( LINK( this, Svx3DWin, ClickViewTypeHdl ) );
	aLink.Call( &aBtnGeo );
	aCtlLightPreview.Hide();
}

// -----------------------------------------------------------------------
void Svx3DWin::Reset()
{
	// Diverse Initialisierungen, default ist AllAttributes
	aLbShademode.SelectEntryPos( 0 );
	aMtrMatSpecularIntensity.SetValue( 50 );

	aBtnLight1.Check();
	ClickUpdateHdl( NULL );

	// Nichts selektieren, um Fehler beim erstselektieren zu vermeiden
	aCtlLightPreview.GetSvx3DLightControl().SelectLight(0);
	aCtlLightPreview.CheckSelection();
}

bool Svx3DWin::GetUILightState( ImageButton& aBtn ) const
{
	return (aBtn.GetModeImage() == aImgLightOn) || (aBtn.GetModeImage() == mpImpl->maImgLightOnH);
}

void Svx3DWin::SetUILightState( ImageButton& aBtn, bool bState )
{
	aBtn.SetModeImage( bState ? aImgLightOn : aImgLightOff );
	aBtn.SetModeImage( bState ? mpImpl->maImgLightOnH : mpImpl->maImgLightOffH, BMP_COLOR_HIGHCONTRAST );
}

// -----------------------------------------------------------------------
void Svx3DWin::Update( SfxItemSet& rAttrs )
{
	// remember 2d attributes
	if(mpRemember2DAttributes)
		mpRemember2DAttributes->ClearItem();
	else
		mpRemember2DAttributes = new SfxItemSet(*rAttrs.GetPool(),
			SDRATTR_START, SDRATTR_SHADOW_LAST,
			SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
			0, 0);

	SfxWhichIter aIter(*mpRemember2DAttributes);
	sal_uInt16 nWhich(aIter.FirstWhich());

	while(nWhich)
	{
		SfxItemState eState = rAttrs.GetItemState(nWhich, sal_False);
		if(SFX_ITEM_DONTCARE == eState)
			mpRemember2DAttributes->InvalidateItem(nWhich);
		else if(SFX_ITEM_SET == eState)
			mpRemember2DAttributes->Put(rAttrs.Get(nWhich, sal_False));

		nWhich = aIter.NextWhich();
	}

	// construct field values
	const SfxPoolItem* pItem;
	//sal_Bool bUpdate = sal_False;

	// evtl. PoolUnit ermitteln
	if( !mpImpl->pPool )
	{
		mpImpl->pPool = rAttrs.GetPool();
		DBG_ASSERT( mpImpl->pPool, "Wo ist der Pool?" );
		ePoolUnit = mpImpl->pPool->GetMetric( SID_ATTR_LINE_WIDTH );
	}
	eFUnit = GetModuleFieldUnit( rAttrs );


// Segmentanzahl aenderbar ? und andere Stati
	SfxItemState eState = rAttrs.GetItemState( SID_ATTR_3D_INTERN, sal_False, &pItem );
	if( SFX_ITEM_SET == eState )
	{
		sal_uInt32 nState = ( ( const SfxUInt32Item* )pItem )->GetValue();
		//sal_Bool bLathe   = (sal_Bool) ( nState & 1 );
		sal_Bool bExtrude = (sal_Bool) ( nState & 2 );
		sal_Bool bSphere  = (sal_Bool) ( nState & 4 );
		sal_Bool bCube    = (sal_Bool) ( nState & 8 );

		sal_Bool bChart = (sal_Bool) ( nState & 32 ); // Chart

		if( !bChart )
		{
			// Bei Cube-Objekten werden keine Segmente eingestellt
			aFtHorizontal.Enable( !bCube );
			aNumHorizontal.Enable( !bCube );
			aFtVertical.Enable( !bCube );
			aNumVertical.Enable( !bCube );
            aFLSegments.Enable( !bCube );

			aFtPercentDiagonal.Enable( !bCube && !bSphere );
			aMtrPercentDiagonal.Enable( !bCube && !bSphere );
			aFtBackscale.Enable( !bCube && !bSphere );
			aMtrBackscale.Enable( !bCube && !bSphere );
			aFtDepth.Enable( !bCube && !bSphere );
			aMtrDepth.Enable( !bCube && !bSphere );
			if( bCube )
			{
				aNumHorizontal.SetEmptyFieldValue();
				aNumVertical.SetEmptyFieldValue();
			}
			if( bCube || bSphere )
			{
				aMtrPercentDiagonal.SetEmptyFieldValue();
				aMtrBackscale.SetEmptyFieldValue();
				aMtrDepth.SetEmptyFieldValue();
			}

			// Nur bei Lathe-Objekten gibt es einen Endwinkel
			aFtEndAngle.Enable( !bExtrude && !bCube && !bSphere );
			aMtrEndAngle.Enable( !bExtrude && !bCube && !bSphere );
			if( bExtrude || bCube || bSphere )
				aMtrEndAngle.SetEmptyFieldValue();
		}
		else
		{
			// Geometrie
			aFtHorizontal.Enable( sal_False );
			aNumHorizontal.Enable( sal_False );
			aNumHorizontal.SetEmptyFieldValue();
			aFtVertical.Enable( sal_False );
			aNumVertical.Enable( sal_False );
			aNumVertical.SetEmptyFieldValue();
            aFLSegments.Enable( sal_False );
			aFtEndAngle.Enable( sal_False );
			aMtrEndAngle.Enable( sal_False );
			aMtrEndAngle.SetEmptyFieldValue();
			aFtDepth.Enable( sal_False );
			aMtrDepth.Enable( sal_False );
			aMtrDepth.SetEmptyFieldValue();

			// Darstellung
			aBtnShadow3d.Enable( sal_False );
			aFtSlant.Enable( sal_False );
			aMtrSlant.Enable( sal_False );
            aFLShadow.Enable( sal_False );

			aFtDistance.Enable( sal_False );
			aMtrDistance.Enable( sal_False );
			aMtrDistance.SetEmptyFieldValue();
			aFtFocalLeng.Enable( sal_False );
			aMtrFocalLength.Enable( sal_False );
			aMtrFocalLength.SetEmptyFieldValue();
            aFLCamera.Enable( sal_False );

			// Unterer Bereich
			aBtnConvertTo3D.Enable( sal_False );
			aBtnLatheObject.Enable( sal_False );
		}
	}
// Bitmapfuellung ? -> Status
	sal_Bool bBitmap(sal_False);
	eState = rAttrs.GetItemState(XATTR_FILLSTYLE);
	if(eState != SFX_ITEM_DONTCARE)
	{
		XFillStyle eXFS = (XFillStyle)((const XFillStyleItem&)rAttrs.Get(XATTR_FILLSTYLE)).GetValue();
		bBitmap = (eXFS == XFILL_BITMAP || eXFS == XFILL_GRADIENT || eXFS == XFILL_HATCH);
	}

	aFtTexKind.Enable( bBitmap );
	aBtnTexLuminance.Enable( bBitmap );
	aBtnTexColor.Enable( bBitmap );
	aFtTexMode.Enable( bBitmap );
	aBtnTexReplace.Enable( bBitmap );
	aBtnTexModulate.Enable( bBitmap );
	aBtnTexBlend.Enable( bBitmap );
	aFtTexProjectionX.Enable( bBitmap );
	aBtnTexParallelX.Enable( bBitmap );
	aBtnTexCircleX.Enable( bBitmap );
	aBtnTexObjectX.Enable( bBitmap );
	aFtTexProjectionY.Enable( bBitmap );
	aBtnTexParallelY.Enable( bBitmap );
	aBtnTexCircleY.Enable( bBitmap );
	aBtnTexObjectY.Enable( bBitmap );
	aFtTexFilter.Enable( bBitmap );
	aBtnTexFilter.Enable( bBitmap );
    aFLTexture.Enable( bBitmap );


// Geometrie
	// Anzahl Segmente (horizontal)
	if( aNumHorizontal.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_HORZ_SEGS);
		if(eState != SFX_ITEM_DONTCARE)
		{
			sal_uInt32 nValue = ((const Svx3DHorizontalSegmentsItem&)rAttrs.Get(SDRATTR_3DOBJ_HORZ_SEGS)).GetValue();
			if(nValue != (sal_uInt32 )aNumHorizontal.GetValue())
			{
				aNumHorizontal.SetValue( nValue );
				// evtl. am Ende...
				// aCtlLightPreview.GetSvx3DLightControl().SetHorizontalSegments( (sal_uInt16)nValue );
				bUpdate = sal_True;
			}
			else if( aNumHorizontal.IsEmptyFieldValue() )
				aNumHorizontal.SetValue( nValue );
		}
		else
		{
			if( !aNumHorizontal.IsEmptyFieldValue() )
			{
				aNumHorizontal.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Anzahl Segmente (vertikal)
	if( aNumVertical.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_VERT_SEGS);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt32 nValue = ((const Svx3DVerticalSegmentsItem&)rAttrs.Get(SDRATTR_3DOBJ_VERT_SEGS)).GetValue();
			if( nValue != (sal_uInt32) aNumVertical.GetValue() )
			{
				aNumVertical.SetValue( nValue );
				// evtl. am Ende...
				//aCtlLightPreview.GetSvx3DLightControl().SetVerticalSegments( (sal_uInt16)nValue );
				bUpdate = sal_True;
			}
			else if( aNumVertical.IsEmptyFieldValue() )
				aNumVertical.SetValue( nValue );
		}
		else
		{
			if( !aNumVertical.IsEmptyFieldValue() )
			{
				aNumVertical.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Tiefe
	if( aMtrDepth.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_DEPTH);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt32 nValue = ((const Svx3DDepthItem&)rAttrs.Get(SDRATTR_3DOBJ_DEPTH)).GetValue();
			sal_uInt32 nValue2 = GetCoreValue( aMtrDepth, ePoolUnit );
			if( nValue != nValue2 )
			{
				if( eFUnit != aMtrDepth.GetUnit() )
					SetFieldUnit( aMtrDepth, eFUnit );

				SetMetricValue( aMtrDepth, nValue, ePoolUnit );
				bUpdate = sal_True;
			}
			else if( aMtrDepth.IsEmptyFieldValue() )
				aMtrDepth.SetValue( aMtrDepth.GetValue() );
		}
		else
		{
			if( !aMtrDepth.IsEmptyFieldValue() )
			{
				aMtrDepth.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Doppelwandig/-seitig
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_DOUBLE_SIDED);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_Bool bValue = ((const Svx3DDoubleSidedItem&)rAttrs.Get(SDRATTR_3DOBJ_DOUBLE_SIDED)).GetValue();
		if( bValue != aBtnDoubleSided.IsChecked() )
		{
			aBtnDoubleSided.Check( bValue );
			bUpdate = sal_True;
		}
		else if( aBtnDoubleSided.GetState() == STATE_DONTKNOW )
			aBtnDoubleSided.Check( bValue );
	}
	else
	{
		if( aBtnDoubleSided.GetState() != STATE_DONTKNOW )
		{
			aBtnDoubleSided.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}

	// Kantenrundung
	if( aMtrPercentDiagonal.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_PERCENT_DIAGONAL);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DPercentDiagonalItem&)rAttrs.Get(SDRATTR_3DOBJ_PERCENT_DIAGONAL)).GetValue();
			if( nValue != aMtrPercentDiagonal.GetValue() )
			{
				aMtrPercentDiagonal.SetValue( nValue );
				bUpdate = sal_True;
			}
			else if( aMtrPercentDiagonal.IsEmptyFieldValue() )
				aMtrPercentDiagonal.SetValue( nValue );
		}
		else
		{
			if( !aMtrPercentDiagonal.IsEmptyFieldValue() )
			{
				aMtrPercentDiagonal.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Tiefenskalierung
	if( aMtrBackscale.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_BACKSCALE);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DBackscaleItem&)rAttrs.Get(SDRATTR_3DOBJ_BACKSCALE)).GetValue();
			if( nValue != aMtrBackscale.GetValue() )
			{
				aMtrBackscale.SetValue( nValue );
				bUpdate = sal_True;
			}
			else if( aMtrBackscale.IsEmptyFieldValue() )
				aMtrBackscale.SetValue( nValue );
		}
		else
		{
			if( !aMtrBackscale.IsEmptyFieldValue() )
			{
				aMtrBackscale.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Endwinkel
	if( aMtrEndAngle.IsEnabled() )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_END_ANGLE);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_Int32 nValue = ((const Svx3DEndAngleItem&)rAttrs.Get(SDRATTR_3DOBJ_END_ANGLE)).GetValue();
			if( nValue != aMtrEndAngle.GetValue() )
			{
				aMtrEndAngle.SetValue( nValue );
				bUpdate = sal_True;
			}
		}
		else
		{
			if( !aMtrEndAngle.IsEmptyFieldValue() )
			{
				aMtrEndAngle.SetEmptyFieldValue();
				bUpdate = sal_True;
			}
		}
	}

	// Normalentyp
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_NORMALS_KIND);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt16 nValue = ((const Svx3DNormalsKindItem&)rAttrs.Get(SDRATTR_3DOBJ_NORMALS_KIND)).GetValue();

		if( ( !aBtnNormalsObj.IsChecked() && nValue == 0 ) ||
			( !aBtnNormalsFlat.IsChecked() && nValue == 1 ) ||
			( !aBtnNormalsSphere.IsChecked() && nValue == 2 ) )
		{
			aBtnNormalsObj.Check( nValue == 0 );
			aBtnNormalsFlat.Check( nValue == 1 );
			aBtnNormalsSphere.Check( nValue == 2 );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aBtnNormalsObj.IsChecked() ||
			aBtnNormalsFlat.IsChecked() ||
			aBtnNormalsSphere.IsChecked() )
		{
			aBtnNormalsObj.Check( sal_False );
			aBtnNormalsFlat.Check( sal_False );
			aBtnNormalsSphere.Check( sal_False );
			bUpdate = sal_True;
		}
	}

	// Normalen invertieren
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_NORMALS_INVERT);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_Bool bValue = ((const Svx3DNormalsInvertItem&)rAttrs.Get(SDRATTR_3DOBJ_NORMALS_INVERT)).GetValue();
		if( bValue != aBtnNormalsInvert.IsChecked() )
		{
			aBtnNormalsInvert.Check( bValue );
			bUpdate = sal_True;
		}
		else if( aBtnNormalsInvert.GetState() == STATE_DONTKNOW )
			aBtnNormalsInvert.Check( bValue );
	}
	else
	{
		if( aBtnNormalsInvert.GetState() != STATE_DONTKNOW )
		{
			aBtnNormalsInvert.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}

	// 2-seitige Beleuchtung
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_TWO_SIDED_LIGHTING);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_Bool bValue = ((const Svx3DTwoSidedLightingItem&)rAttrs.Get(SDRATTR_3DSCENE_TWO_SIDED_LIGHTING)).GetValue();
		if( bValue != aBtnTwoSidedLighting.IsChecked() )
		{
			aBtnTwoSidedLighting.Check( bValue );
			bUpdate = sal_True;
		}
		else if( aBtnTwoSidedLighting.GetState() == STATE_DONTKNOW )
			aBtnTwoSidedLighting.Check( bValue );
	}
	else
	{
		if( aBtnTwoSidedLighting.GetState() != STATE_DONTKNOW )
		{
			aBtnTwoSidedLighting.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}

// Darstellung
	// Shademode
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_SHADE_MODE);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt16 nValue = ((const Svx3DShadeModeItem&)rAttrs.Get(SDRATTR_3DSCENE_SHADE_MODE)).GetValue();
		if( nValue != aLbShademode.GetSelectEntryPos() )
		{
			aLbShademode.SelectEntryPos( nValue );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbShademode.GetSelectEntryCount() != 0 )
		{
			aLbShademode.SetNoSelection();
			bUpdate = sal_True;
		}
	}

	// 3D-Shatten
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_SHADOW_3D);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_Bool bValue = ((const Svx3DShadow3DItem&)rAttrs.Get(SDRATTR_3DOBJ_SHADOW_3D)).GetValue();
		if( bValue != aBtnShadow3d.IsChecked() )
		{
			aBtnShadow3d.Check( bValue );
			aFtSlant.Enable( bValue );
			aMtrSlant.Enable( bValue );
			bUpdate = sal_True;
		}
		else if( aBtnShadow3d.GetState() == STATE_DONTKNOW )
			aBtnShadow3d.Check( bValue );
	}
	else
	{
		if( aBtnShadow3d.GetState() != STATE_DONTKNOW )
		{
			aBtnShadow3d.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}

	// Neigung (Schatten)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_SHADOW_SLANT);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt16 nValue = ((const Svx3DShadowSlantItem&)rAttrs.Get(SDRATTR_3DSCENE_SHADOW_SLANT)).GetValue();
		if( nValue != aMtrSlant.GetValue() )
		{
			aMtrSlant.SetValue( nValue );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( !aMtrSlant.IsEmptyFieldValue() )
		{
			aMtrSlant.SetEmptyFieldValue();
			bUpdate = sal_True;
		}
	}

	// Distanz
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_DISTANCE);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt32 nValue = ((const Svx3DDistanceItem&)rAttrs.Get(SDRATTR_3DSCENE_DISTANCE)).GetValue();
		sal_uInt32 nValue2 = GetCoreValue( aMtrDistance, ePoolUnit );
		if( nValue != nValue2 )
		{
			if( eFUnit != aMtrDistance.GetUnit() )
				SetFieldUnit( aMtrDistance, eFUnit );

			SetMetricValue( aMtrDistance, nValue, ePoolUnit );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( !aMtrDepth.IsEmptyFieldValue() )
		{
			aMtrDepth.SetEmptyFieldValue();
			bUpdate = sal_True;
		}
	}

	// Brennweite
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_FOCAL_LENGTH);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt32 nValue = ((const Svx3DFocalLengthItem&)rAttrs.Get(SDRATTR_3DSCENE_FOCAL_LENGTH)).GetValue();
		sal_uInt32 nValue2 = GetCoreValue( aMtrFocalLength, ePoolUnit );
		if( nValue != nValue2 )
		{
			if( eFUnit != aMtrFocalLength.GetUnit() )
				SetFieldUnit( aMtrFocalLength, eFUnit );

			SetMetricValue( aMtrFocalLength, nValue, ePoolUnit );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( !aMtrFocalLength.IsEmptyFieldValue() )
		{
			aMtrFocalLength.SetEmptyFieldValue();
			bUpdate = sal_True;
		}
	}

// Beleuchtung
	Color aColor;
	basegfx::B3DVector aVector;
	// Licht 1 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_1);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor1Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_1)).GetValue();
		ColorLB* pLb = &aLbLight1;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight1.GetSelectEntryCount() != 0 )
		{
			aLbLight1.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 1 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_1);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff1Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_1)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight1 )) ||
			( !bOn && GetUILightState( aBtnLight1 )) )
		{
			SetUILightState( aBtnLight1, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight1.GetState() == STATE_DONTKNOW )
			aBtnLight1.Check( aBtnLight1.IsChecked() );
	}
	else
	{
		if( aBtnLight1.GetState() != STATE_DONTKNOW )
		{
			aBtnLight1.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 1 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_1);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 2 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_2);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor2Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_2)).GetValue();
		ColorLB* pLb = &aLbLight2;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight2.GetSelectEntryCount() != 0 )
		{
			aLbLight2.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 2 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_2);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff2Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_2)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight2 )) ||
			( !bOn && GetUILightState( aBtnLight2 )) )
		{
			SetUILightState( aBtnLight2, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight2.GetState() == STATE_DONTKNOW )
			aBtnLight2.Check( aBtnLight2.IsChecked() );
	}
	else
	{
		if( aBtnLight2.GetState() != STATE_DONTKNOW )
		{
			aBtnLight2.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 2 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_2);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 3 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_3);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor3Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_3)).GetValue();
		ColorLB* pLb = &aLbLight3;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight3.GetSelectEntryCount() != 0 )
		{
			aLbLight3.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 3 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_3);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff3Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_3)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight3)) ||
			( !bOn && GetUILightState( aBtnLight3)) )
		{
			SetUILightState( aBtnLight3, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight3.GetState() == STATE_DONTKNOW )
			aBtnLight3.Check( aBtnLight3.IsChecked() );
	}
	else
	{
		if( aBtnLight3.GetState() != STATE_DONTKNOW )
		{
			aBtnLight3.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 3 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_3);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 4 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_4);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor4Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_4)).GetValue();
		ColorLB* pLb = &aLbLight4;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight4.GetSelectEntryCount() != 0 )
		{
			aLbLight4.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 4 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_4);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff4Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_4)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight4 )) ||
			( !bOn && GetUILightState( aBtnLight4 )) )
		{
			SetUILightState( aBtnLight4, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight4.GetState() == STATE_DONTKNOW )
			aBtnLight4.Check( aBtnLight4.IsChecked() );
	}
	else
	{
		if( aBtnLight4.GetState() != STATE_DONTKNOW )
		{
			aBtnLight4.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 4 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_4);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 5 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_5);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor5Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_5)).GetValue();
		ColorLB* pLb = &aLbLight5;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight5.GetSelectEntryCount() != 0 )
		{
			aLbLight5.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 5 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_5);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff5Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_5)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight5 )) ||
			( !bOn && GetUILightState( aBtnLight5 )) )
		{
			SetUILightState( aBtnLight5, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight5.GetState() == STATE_DONTKNOW )
			aBtnLight5.Check( aBtnLight5.IsChecked() );
	}
	else
	{
		if( aBtnLight5.GetState() != STATE_DONTKNOW )
		{
			aBtnLight5.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 5 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_5);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 6 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_6);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor6Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_6)).GetValue();
		ColorLB* pLb = &aLbLight6;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight6.GetSelectEntryCount() != 0 )
		{
			aLbLight6.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 6 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_6);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff6Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_6)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight6 )) ||
			( !bOn && GetUILightState( aBtnLight6 )) )
		{
			SetUILightState( aBtnLight6, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight6.GetState() == STATE_DONTKNOW )
			aBtnLight6.Check( aBtnLight6.IsChecked() );
	}
	else
	{
		if( aBtnLight6.GetState() != STATE_DONTKNOW )
		{
			aBtnLight6.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 6 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_6);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 7 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_7);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor7Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_7)).GetValue();
		ColorLB* pLb = &aLbLight7;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight7.GetSelectEntryCount() != 0 )
		{
			aLbLight7.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 7 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_7);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff7Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_7)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight7 )) ||
			( !bOn && GetUILightState( aBtnLight7 )) )
		{
			SetUILightState( aBtnLight7	, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight7.GetState() == STATE_DONTKNOW )
			aBtnLight7.Check( aBtnLight7.IsChecked() );
	}
	else
	{
		if( aBtnLight7.GetState() != STATE_DONTKNOW )
		{
			aBtnLight7.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 7 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_7);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Licht 8 (Farbe)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTCOLOR_8);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DLightcolor8Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTCOLOR_8)).GetValue();
		ColorLB* pLb = &aLbLight8;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbLight8.GetSelectEntryCount() != 0 )
		{
			aLbLight8.SetNoSelection();
			bUpdate = sal_True;
		}
	}
	// Licht 8 (an/aus)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTON_8);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bool bOn = ((const Svx3DLightOnOff8Item&)rAttrs.Get(SDRATTR_3DSCENE_LIGHTON_8)).GetValue() != 0;
		if( ( bOn && !GetUILightState( aBtnLight8 )) ||
			( !bOn && GetUILightState( aBtnLight8 )) )
		{
			SetUILightState( aBtnLight8, bOn );
			bUpdate = sal_True;
		}
		if( aBtnLight8.GetState() == STATE_DONTKNOW )
			aBtnLight8.Check( aBtnLight8.IsChecked() );
	}
	else
	{
		if( aBtnLight8.GetState() != STATE_DONTKNOW )
		{
			aBtnLight8.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}
	// Licht 8 (Richtung)
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_LIGHTDIRECTION_8);
	if( eState != SFX_ITEM_DONTCARE )
	{
		bUpdate = sal_True;
	}

	// Umgebungslicht
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_AMBIENTCOLOR);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DAmbientcolorItem&)rAttrs.Get(SDRATTR_3DSCENE_AMBIENTCOLOR)).GetValue();
		ColorLB* pLb = &aLbAmbientlight;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbAmbientlight.GetSelectEntryCount() != 0 )
		{
			aLbAmbientlight.SetNoSelection();
			bUpdate = sal_True;
		}
	}


// Texturen
	// Art
	if( bBitmap )
	{
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_TEXTURE_KIND);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DTextureKindItem&)rAttrs.Get(SDRATTR_3DOBJ_TEXTURE_KIND)).GetValue();

			if( ( !aBtnTexLuminance.IsChecked() && nValue == 1 ) ||
				( !aBtnTexColor.IsChecked() && nValue == 3 ) )
			{
				aBtnTexLuminance.Check( nValue == 1 );
				aBtnTexColor.Check( nValue == 3 );
				bUpdate = sal_True;
			}
		}
		else
		{
			if( aBtnTexLuminance.IsChecked() ||
				aBtnTexColor.IsChecked() )
			{
				aBtnTexLuminance.Check( sal_False );
				aBtnTexColor.Check( sal_False );
				bUpdate = sal_True;
			}
		}

		// Modus
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_TEXTURE_MODE);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DTextureModeItem&)rAttrs.Get(SDRATTR_3DOBJ_TEXTURE_MODE)).GetValue();

			if( ( !aBtnTexReplace.IsChecked() && nValue == 1 ) ||
				( !aBtnTexModulate.IsChecked() && nValue == 2 ) )
			{
				aBtnTexReplace.Check( nValue == 1 );
				aBtnTexModulate.Check( nValue == 2 );
				//aBtnTexBlend.Check( nValue == 2 );
				bUpdate = sal_True;
			}
		}
		else
		{
			if( aBtnTexReplace.IsChecked() ||
				aBtnTexModulate.IsChecked() )
			{
				aBtnTexReplace.Check( sal_False );
				aBtnTexModulate.Check( sal_False );
				//aBtnTexBlend.Check( sal_False );
				bUpdate = sal_True;
			}
		}

		// Projektion X
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_TEXTURE_PROJ_X);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DTextureProjectionXItem&)rAttrs.Get(SDRATTR_3DOBJ_TEXTURE_PROJ_X)).GetValue();

			if( ( !aBtnTexObjectX.IsChecked() && nValue == 0 ) ||
				( !aBtnTexParallelX.IsChecked() && nValue == 1 ) ||
				( !aBtnTexCircleX.IsChecked() && nValue == 2 ) )
			{
				aBtnTexObjectX.Check( nValue == 0 );
				aBtnTexParallelX.Check( nValue == 1 );
				aBtnTexCircleX.Check( nValue == 2 );
				bUpdate = sal_True;
			}
		}
		else
		{
			if( aBtnTexObjectX.IsChecked() ||
				aBtnTexParallelX.IsChecked() ||
				aBtnTexCircleX.IsChecked() )
			{
				aBtnTexObjectX.Check( sal_False );
				aBtnTexParallelX.Check( sal_False );
				aBtnTexCircleX.Check( sal_False );
				bUpdate = sal_True;
			}
		}

		// Projektion Y
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_TEXTURE_PROJ_Y);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_uInt16 nValue = ((const Svx3DTextureProjectionYItem&)rAttrs.Get(SDRATTR_3DOBJ_TEXTURE_PROJ_Y)).GetValue();

			if( ( !aBtnTexObjectY.IsChecked() && nValue == 0 ) ||
				( !aBtnTexParallelY.IsChecked() && nValue == 1 ) ||
				( !aBtnTexCircleY.IsChecked() && nValue == 2 ) )
			{
				aBtnTexObjectY.Check( nValue == 0 );
				aBtnTexParallelY.Check( nValue == 1 );
				aBtnTexCircleY.Check( nValue == 2 );
				bUpdate = sal_True;
			}
		}
		else
		{
			if( aBtnTexObjectY.IsChecked() ||
				aBtnTexParallelY.IsChecked() ||
				aBtnTexCircleY.IsChecked() )
			{
				aBtnTexObjectY.Check( sal_False );
				aBtnTexParallelY.Check( sal_False );
				aBtnTexCircleY.Check( sal_False );
				bUpdate = sal_True;
			}
		}

		// Filter
		eState = rAttrs.GetItemState(SDRATTR_3DOBJ_TEXTURE_FILTER);
		if( eState != SFX_ITEM_DONTCARE )
		{
			sal_Bool bValue = ((const Svx3DTextureFilterItem&)rAttrs.Get(SDRATTR_3DOBJ_TEXTURE_FILTER)).GetValue();
			if( bValue != aBtnTexFilter.IsChecked() )
			{
				aBtnTexFilter.Check( bValue );
				bUpdate = sal_True;
			}
			if( aBtnTexFilter.GetState() == STATE_DONTKNOW )
				aBtnTexFilter.Check( bValue );
		}
		else
		{
			if( aBtnTexFilter.GetState() != STATE_DONTKNOW )
			{
				aBtnTexFilter.SetState( STATE_DONTKNOW );
				bUpdate = sal_True;
			}
		}
	}


	// Material Favoriten
	aLbMatFavorites.SelectEntryPos( 0 );

	// Objektfarbe
	eState = rAttrs.GetItemState(XATTR_FILLCOLOR);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const XFillColorItem&)rAttrs.Get(XATTR_FILLCOLOR)).GetColorValue();
		ColorLB* pLb = &aLbMatColor;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbMatColor.GetSelectEntryCount() != 0 )
		{
			aLbMatColor.SetNoSelection();
			bUpdate = sal_True;
		}
	}

	// Slebstleuchtfarbe
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_MAT_EMISSION);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DMaterialEmissionItem&)rAttrs.Get(SDRATTR_3DOBJ_MAT_EMISSION)).GetValue();
		ColorLB* pLb = &aLbMatEmission;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbMatEmission.GetSelectEntryCount() != 0 )
		{
			aLbMatEmission.SetNoSelection();
			bUpdate = sal_True;
		}
	}

	// Glanzpunkt
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_MAT_SPECULAR);
	if( eState != SFX_ITEM_DONTCARE )
	{
		aColor = ((const Svx3DMaterialSpecularItem&)rAttrs.Get(SDRATTR_3DOBJ_MAT_SPECULAR)).GetValue();
		ColorLB* pLb = &aLbMatSpecular;
		if( aColor != pLb->GetSelectEntryColor() )
		{
			LBSelectColor( pLb, aColor );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( aLbMatSpecular.GetSelectEntryCount() != 0 )
		{
			aLbMatSpecular.SetNoSelection();
			bUpdate = sal_True;
		}
	}

	// Glanzpunkt Intensitaet
	eState = rAttrs.GetItemState(SDRATTR_3DOBJ_MAT_SPECULAR_INTENSITY);
	if( eState != SFX_ITEM_DONTCARE )
	{
		sal_uInt16 nValue = ((const Svx3DMaterialSpecularIntensityItem&)rAttrs.Get(SDRATTR_3DOBJ_MAT_SPECULAR_INTENSITY)).GetValue();
		if( nValue != aMtrMatSpecularIntensity.GetValue() )
		{
			aMtrMatSpecularIntensity.SetValue( nValue );
			bUpdate = sal_True;
		}
	}
	else
	{
		if( !aMtrMatSpecularIntensity.IsEmptyFieldValue() )
		{
			aMtrMatSpecularIntensity.SetEmptyFieldValue();
			bUpdate = sal_True;
		}
	}


// Sonstige
	// Perspektive
	eState = rAttrs.GetItemState(SDRATTR_3DSCENE_PERSPECTIVE);
	if( eState != SFX_ITEM_DONTCARE )
	{
		ProjectionType ePT = (ProjectionType)((const Svx3DPerspectiveItem&)rAttrs.Get(SDRATTR_3DSCENE_PERSPECTIVE)).GetValue();
		if( ( !aBtnPerspective.IsChecked() && ePT == PR_PERSPECTIVE ) ||
			( aBtnPerspective.IsChecked() && ePT == PR_PARALLEL ) )
		{
			aBtnPerspective.Check( ePT == PR_PERSPECTIVE );
			bUpdate = sal_True;
		}
		if( aBtnPerspective.GetState() == STATE_DONTKNOW )
			aBtnPerspective.Check( ePT == PR_PERSPECTIVE );
	}
	else
	{
		if( aBtnPerspective.GetState() != STATE_DONTKNOW )
		{
			aBtnPerspective.SetState( STATE_DONTKNOW );
			bUpdate = sal_True;
		}
	}

	if( !bUpdate && !bOnly3DChanged )
	{
		// Eventuell sind aber die 2D-Attribute unterschiedlich. Vergleiche
		// diese und entscheide


		bUpdate = sal_True;
	}

	if( bUpdate || bOnly3DChanged )
	{
		// Preview updaten
		SfxItemSet aSet(rAttrs);

		// set LineStyle hard to XLINE_NONE when it's not set so that
		// the default (XLINE_SOLID) is not used for 3d preview
		if(SFX_ITEM_SET != aSet.GetItemState(XATTR_LINESTYLE, sal_False))
			aSet.Put(XLineStyleItem(XLINE_NONE));

		// set FillColor hard to WHITE when it's SFX_ITEM_DONTCARE so that
		// the default (Blue7) is not used for 3d preview
		if(SFX_ITEM_DONTCARE == aSet.GetItemState(XATTR_FILLCOLOR, sal_False))
			aSet.Put(XFillColorItem(String(), Color(COL_WHITE)));

		aCtlPreview.Set3DAttributes(aSet);
		aCtlLightPreview.GetSvx3DLightControl().Set3DAttributes(aSet);

        // try to select light corresponding to active button
        sal_uInt32 nNumber(0xffffffff);

        if(aBtnLight1.IsChecked())
            nNumber = 0;
        else if(aBtnLight2.IsChecked())
            nNumber = 1;
        else if(aBtnLight3.IsChecked())
            nNumber = 2;
        else if(aBtnLight4.IsChecked())
            nNumber = 3;
        else if(aBtnLight5.IsChecked())
            nNumber = 4;
        else if(aBtnLight6.IsChecked())
            nNumber = 5;
        else if(aBtnLight7.IsChecked())
            nNumber = 6;
        else if(aBtnLight8.IsChecked())
            nNumber = 7;

        if(nNumber != 0xffffffff)
        {
    		aCtlLightPreview.GetSvx3DLightControl().SelectLight(nNumber);
        }
	}

	// handle state of converts possible
	aBtnConvertTo3D.Enable(pConvertTo3DItem->GetState());
	aBtnLatheObject.Enable(pConvertTo3DLatheItem->GetState());
}

// -----------------------------------------------------------------------
void Svx3DWin::GetAttr( SfxItemSet& rAttrs )
{
	// get remembered 2d attributes from the dialog
	if(mpRemember2DAttributes)
	{
		SfxWhichIter aIter(*mpRemember2DAttributes);
		sal_uInt16 nWhich(aIter.FirstWhich());

		while(nWhich)
		{
			SfxItemState eState = mpRemember2DAttributes->GetItemState(nWhich, sal_False);
			if(SFX_ITEM_DONTCARE == eState)
				rAttrs.InvalidateItem(nWhich);
			else if(SFX_ITEM_SET == eState)
				rAttrs.Put(mpRemember2DAttributes->Get(nWhich, sal_False));

			nWhich = aIter.NextWhich();
		}
	}

// Sonstige, muss vorne stehen da auf allen Seiten
	// Perspektive
	if( aBtnPerspective.GetState() != STATE_DONTKNOW )
	{
		sal_uInt16 nValue;
		if( aBtnPerspective.IsChecked() )
			nValue = PR_PERSPECTIVE;
		else
			nValue = PR_PARALLEL;
		rAttrs.Put(Svx3DPerspectiveItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_PERSPECTIVE);

// Geometrie
	// evtl. PoolUnit ermitteln (Falls dies in Update() nicht passiert ist)
	if( !mpImpl->pPool )
	{
		DBG_ERROR( "Kein Pool in GetAttr()! Evtl. inkompatibel zu drviewsi.cxx ?" );
		mpImpl->pPool = rAttrs.GetPool();
		DBG_ASSERT( mpImpl->pPool, "Wo ist der Pool?" );
		ePoolUnit = mpImpl->pPool->GetMetric( SID_ATTR_LINE_WIDTH );

		eFUnit = GetModuleFieldUnit( rAttrs );
	}

	// Anzahl Segmente (horizontal)
	if( !aNumHorizontal.IsEmptyFieldValue() )
	{
		sal_uInt32 nValue = static_cast<sal_uInt32>(aNumHorizontal.GetValue());
		rAttrs.Put(Svx3DHorizontalSegmentsItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_HORZ_SEGS);

	// Anzahl Segmente (vertikal)
	if( !aNumVertical.IsEmptyFieldValue() )
	{
		sal_uInt32 nValue = static_cast<sal_uInt32>(aNumVertical.GetValue());
		rAttrs.Put(Svx3DVerticalSegmentsItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_VERT_SEGS);

	// Tiefe
	if( !aMtrDepth.IsEmptyFieldValue() )
	{
		sal_uInt32 nValue = GetCoreValue( aMtrDepth, ePoolUnit );
		rAttrs.Put(Svx3DDepthItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_DEPTH);

	// Doppelseitig
	TriState eState = aBtnDoubleSided.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = STATE_CHECK == eState;
		rAttrs.Put(Svx3DDoubleSidedItem(bValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_DOUBLE_SIDED);

	// Kantenrundung
	if( !aMtrPercentDiagonal.IsEmptyFieldValue() )
	{
		sal_uInt16 nValue = (sal_uInt16) aMtrPercentDiagonal.GetValue();
		rAttrs.Put(Svx3DPercentDiagonalItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_PERCENT_DIAGONAL);

	// Tiefenskalierung
	if( !aMtrBackscale.IsEmptyFieldValue() )
	{
		sal_uInt16 nValue = (sal_uInt16)aMtrBackscale.GetValue();
		rAttrs.Put(Svx3DBackscaleItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_BACKSCALE);

	// Endwinkel
	if( !aMtrEndAngle.IsEmptyFieldValue() )
	{
		sal_uInt16 nValue = (sal_uInt16)aMtrEndAngle.GetValue();
		rAttrs.Put(Svx3DEndAngleItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_END_ANGLE);

	// Normalentyp
	sal_uInt16 nValue = 99;
	if( aBtnNormalsObj.IsChecked() )
		nValue = 0;
	else if( aBtnNormalsFlat.IsChecked() )
		nValue = 1;
	else if( aBtnNormalsSphere.IsChecked() )
		nValue = 2;

	if( nValue <= 2 )
		rAttrs.Put(Svx3DNormalsKindItem(nValue));
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_NORMALS_KIND);

	// Normalen invertieren
	eState = aBtnNormalsInvert.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = STATE_CHECK == eState;
		rAttrs.Put(Svx3DNormalsInvertItem(bValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_NORMALS_INVERT);

	// 2-seitige Beleuchtung
	eState = aBtnTwoSidedLighting.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = STATE_CHECK == eState;
		rAttrs.Put(Svx3DTwoSidedLightingItem(bValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_TWO_SIDED_LIGHTING);

// Darstellung
	// Shademode
	if( aLbShademode.GetSelectEntryCount() )
	{
		nValue = aLbShademode.GetSelectEntryPos();
		rAttrs.Put(Svx3DShadeModeItem(nValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_SHADE_MODE);

	// 3D-Shatten
	eState = aBtnShadow3d.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = STATE_CHECK == eState;
		rAttrs.Put(Svx3DShadow3DItem(bValue));
		rAttrs.Put(SdrShadowItem(bValue));
	}
	else
	{
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_SHADOW_3D);
		rAttrs.InvalidateItem(SDRATTR_SHADOW);
	}

	// Neigung (Schatten)
	if( !aMtrSlant.IsEmptyFieldValue() )
	{
		sal_uInt16 nValue2 = (sal_uInt16) aMtrSlant.GetValue();
		rAttrs.Put(Svx3DShadowSlantItem(nValue2));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_SHADOW_SLANT);

	// Distanz
	if( !aMtrDistance.IsEmptyFieldValue() )
	{
		sal_uInt32 nValue2 = GetCoreValue( aMtrDistance, ePoolUnit );
		rAttrs.Put(Svx3DDistanceItem(nValue2));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_DISTANCE);

	// Brennweite
	if( !aMtrFocalLength.IsEmptyFieldValue() )
	{
		sal_uInt32 nValue2 = GetCoreValue( aMtrFocalLength, ePoolUnit );
		rAttrs.Put(Svx3DFocalLengthItem(nValue2));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_FOCAL_LENGTH);

// Beleuchtung
	Image aImg;
	basegfx::B3DVector aVector;
	Color aColor;
    const SfxItemSet aLightItemSet(aCtlLightPreview.GetSvx3DLightControl().Get3DAttributes());

    // Licht 1 Farbe
	if( aLbLight1.GetSelectEntryCount() )
	{
		aColor = aLbLight1.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor1Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_1);
	// Licht 1 (an/aus)
	eState = aBtnLight1.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight1 );
		rAttrs.Put(Svx3DLightOnOff1Item(bValue));

		// Licht 1 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_1));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_1);


	// Licht 2 Farbe
	if( aLbLight2.GetSelectEntryCount() )
	{
		aColor = aLbLight2.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor2Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_2);
	// Licht 2 (an/aus)
	eState = aBtnLight2.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight2 );
		rAttrs.Put(Svx3DLightOnOff2Item(bValue));

		// Licht 2 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_2));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_2);

	// Licht 3 Farbe
	if( aLbLight3.GetSelectEntryCount() )
	{
		aColor = aLbLight3.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor3Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_3);
	// Licht 3 (an/aus)
	eState = aBtnLight3.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight3 );
		rAttrs.Put(Svx3DLightOnOff3Item(bValue));

		// Licht 3 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_3));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_3);

	// Licht 4 Farbe
	if( aLbLight4.GetSelectEntryCount() )
	{
		aColor = aLbLight4.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor4Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_4);
	// Licht 4 (an/aus)
	eState = aBtnLight4.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight4 );
		rAttrs.Put(Svx3DLightOnOff4Item(bValue));

		// Licht 4 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_4));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_4);

	// Licht 5 Farbe
	if( aLbLight5.GetSelectEntryCount() )
	{
		aColor = aLbLight5.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor5Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_5);
	// Licht 5 (an/aus)
	eState = aBtnLight5.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight5 );
		rAttrs.Put(Svx3DLightOnOff5Item(bValue));

		// Licht 5 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_5));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_5);

	// Licht 6 Farbe
	if( aLbLight6.GetSelectEntryCount() )
	{
		aColor = aLbLight6.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor6Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_6);
	// Licht 6 (an/aus)
	eState = aBtnLight6.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight6 );
		rAttrs.Put(Svx3DLightOnOff6Item(bValue));

		// Licht 6 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_6));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_6);

	// Licht 7 Farbe
	if( aLbLight7.GetSelectEntryCount() )
	{
		aColor = aLbLight7.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor7Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_7);
	// Licht 7 (an/aus)
	eState = aBtnLight7.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight7 );
		rAttrs.Put(Svx3DLightOnOff7Item(bValue));

		// Licht 7 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_7));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_7);

	// Licht 8 Farbe
	if( aLbLight8.GetSelectEntryCount() )
	{
		aColor = aLbLight8.GetSelectEntryColor();
		rAttrs.Put(Svx3DLightcolor8Item(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTCOLOR_8);
	// Licht 8 (an/aus)
	eState = aBtnLight8.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = GetUILightState( aBtnLight8 );
		rAttrs.Put(Svx3DLightOnOff8Item(bValue));

		// Licht 8 (Richtung)
		if( bValue )
		{
            rAttrs.Put(aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_8));
		}
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_LIGHTON_8);

	// Umgebungslicht
	if( aLbAmbientlight.GetSelectEntryCount() )
	{
		aColor = aLbAmbientlight.GetSelectEntryColor();
		rAttrs.Put(Svx3DAmbientcolorItem(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DSCENE_AMBIENTCOLOR);

// Texturen
	// Art
	nValue = 3;
	if( aBtnTexLuminance.IsChecked() )
		nValue = 1;
	else if( aBtnTexColor.IsChecked() )
		nValue = 3;

	if( nValue == 1 || nValue == 3 )
		rAttrs.Put(Svx3DTextureKindItem(nValue));
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_TEXTURE_KIND);


	// Modus
	nValue = 99;
	if( aBtnTexReplace.IsChecked() )
		nValue = 1;
	else if( aBtnTexModulate.IsChecked() )
		nValue = 2;
	//else if( aBtnTexBlend.IsChecked() )
	//	nValue = 2;

	if( nValue == 1 || nValue == 2 )
		rAttrs.Put(Svx3DTextureModeItem(nValue));
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_TEXTURE_MODE);

	// Projektion X
	nValue = 99;
	if( aBtnTexObjectX.IsChecked() )
		nValue = 0;
	else if( aBtnTexParallelX.IsChecked() )
		nValue = 1;
	else if( aBtnTexCircleX.IsChecked() )
		nValue = 2;

	if( nValue <= 2 )
		rAttrs.Put(Svx3DTextureProjectionXItem(nValue));
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_TEXTURE_PROJ_X);

	// Projektion Y
	nValue = 99;
	if( aBtnTexObjectY.IsChecked() )
		nValue = 0;
	else if( aBtnTexParallelY.IsChecked() )
		nValue = 1;
	else if( aBtnTexCircleY.IsChecked() )
		nValue = 2;

	if( nValue <= 2 )
		rAttrs.Put(Svx3DTextureProjectionYItem(nValue));
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_TEXTURE_PROJ_Y);


	// Filter
	eState = aBtnTexFilter.GetState();
	if( eState != STATE_DONTKNOW )
	{
		sal_Bool bValue = STATE_CHECK == eState;
		rAttrs.Put(Svx3DTextureFilterItem(bValue));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_TEXTURE_FILTER);


// Material
	// Objektfarbe
	if( aLbMatColor.GetSelectEntryCount() )
	{
		aColor = aLbMatColor.GetSelectEntryColor();
		rAttrs.Put( XFillColorItem( String(), aColor) );
	}
	else
	{
		rAttrs.InvalidateItem( XATTR_FILLCOLOR );
	}

	// Slebstleuchtfarbe
	if( aLbMatEmission.GetSelectEntryCount() )
	{
		aColor = aLbMatEmission.GetSelectEntryColor();
		rAttrs.Put(Svx3DMaterialEmissionItem(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_MAT_EMISSION);

	// Glanzpunkt
	if( aLbMatSpecular.GetSelectEntryCount() )
	{
		aColor = aLbMatSpecular.GetSelectEntryColor();
		rAttrs.Put(Svx3DMaterialSpecularItem(aColor));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_MAT_SPECULAR);

	// Glanzpunkt Intensitaet
	if( !aMtrMatSpecularIntensity.IsEmptyFieldValue() )
	{
		sal_uInt16 nValue2 = (sal_uInt16) aMtrMatSpecularIntensity.GetValue();
		rAttrs.Put(Svx3DMaterialSpecularIntensityItem(nValue2));
	}
	else
		rAttrs.InvalidateItem(SDRATTR_3DOBJ_MAT_SPECULAR_INTENSITY);
}

// -----------------------------------------------------------------------
void __EXPORT Svx3DWin::Resize()
{
	if ( !IsFloatingMode() ||
		 !GetFloatingWindow()->IsRollUp() )
	{
		Size aWinSize( GetOutputSizePixel() ); // vorher rSize im Resizing()

		if( aWinSize.Height() >= GetMinOutputSizePixel().Height() &&
			aWinSize.Width() >= GetMinOutputSizePixel().Width() )
		{
			Size aDiffSize;
			aDiffSize.Width() = aWinSize.Width() - aSize.Width();
			aDiffSize.Height() = aWinSize.Height() - aSize.Height();

			Point aXPt;
			Point aYPt;
			aXPt.X() = aDiffSize.Width();
			aYPt.Y() = aDiffSize.Height();

			Size aObjSize;

			// Hide
			aBtnUpdate.Hide();
			aBtnAssign.Hide();

			aBtnConvertTo3D.Hide();
			aBtnLatheObject.Hide();
			aBtnPerspective.Hide();

			aCtlPreview.Hide();
			aCtlLightPreview.Hide();

            aFLGeometrie.Hide();
            aFLRepresentation.Hide();
            aFLLight.Hide();
            aFLTexture.Hide();
            aFLMaterial.Hide();

			// Verschieben / Resizen
			aBtnUpdate.SetPosPixel( aBtnUpdate.GetPosPixel() + aXPt );
			aBtnAssign.SetPosPixel( aBtnAssign.GetPosPixel() + aXPt );

				// Preview-Controls
			aObjSize = aCtlPreview.GetOutputSizePixel();
			aObjSize.Width() += aDiffSize.Width();
			aObjSize.Height() += aDiffSize.Height();
			aCtlPreview.SetOutputSizePixel( aObjSize );
			aCtlLightPreview.SetOutputSizePixel( aObjSize );

            // Groups
            aObjSize = aFLGeometrie.GetOutputSizePixel();
			aObjSize.Width() += aDiffSize.Width();
            aFLGeometrie.SetOutputSizePixel( aObjSize );
            aFLSegments.SetOutputSizePixel( aObjSize );
            aFLShadow.SetOutputSizePixel( aObjSize );
            aFLCamera.SetOutputSizePixel( aObjSize );
            aFLRepresentation.SetOutputSizePixel( aObjSize );
            aFLLight.SetOutputSizePixel( aObjSize );
            aFLTexture.SetOutputSizePixel( aObjSize );
            aFLMaterial.SetOutputSizePixel( aObjSize );

				// Y-Position der unteren Buttons
			aBtnConvertTo3D.SetPosPixel( aBtnConvertTo3D.GetPosPixel() + aYPt );
			aBtnLatheObject.SetPosPixel( aBtnLatheObject.GetPosPixel() + aYPt );
			aBtnPerspective.SetPosPixel( aBtnPerspective.GetPosPixel() + aYPt );

			// Show
			aBtnUpdate.Show();
			aBtnAssign.Show();

			aBtnConvertTo3D.Show();
			aBtnLatheObject.Show();
			aBtnPerspective.Show();

			if( aBtnGeo.IsChecked() )
				ClickViewTypeHdl( &aBtnGeo );
			if( aBtnRepresentation.IsChecked() )
				ClickViewTypeHdl( &aBtnRepresentation );
			if( aBtnLight.IsChecked() )
				ClickViewTypeHdl( &aBtnLight );
			if( aBtnTexture.IsChecked() )
				ClickViewTypeHdl( &aBtnTexture );
			if( aBtnMaterial.IsChecked() )
				ClickViewTypeHdl( &aBtnMaterial );

			aSize = aWinSize;
		}
	}

	SfxDockingWindow::Resize();
}

// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, ClickUpdateHdl, void *, EMPTYARG )
{
	bUpdate = !aBtnUpdate.IsChecked();
	aBtnUpdate.Check( bUpdate );

	if( bUpdate )
	{
        SfxDispatcher* pDispatcher = LocalGetDispatcher(pBindings);
        if (pDispatcher != NULL)
        {
            SfxBoolItem aItem( SID_3D_STATE, sal_True );
            pDispatcher->Execute(
                SID_3D_STATE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
        }
	}
	else
	{
		// Controls koennen u.U. disabled sein
	}

	return( 0L );
}

// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, ClickAssignHdl, void *, EMPTYARG )
{
    SfxDispatcher* pDispatcher = LocalGetDispatcher(pBindings);
    if (pDispatcher != NULL)
    {
        SfxBoolItem aItem( SID_3D_ASSIGN, sal_True );
        pDispatcher->Execute(
            SID_3D_ASSIGN, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
    }

	return( 0L );
}

// -----------------------------------------------------------------------

IMPL_LINK( Svx3DWin, ClickViewTypeHdl, void *, pBtn )
{

	if( pBtn )
	{
		// Da das permanente Updaten der Preview zu teuer waere
		sal_Bool bUpdatePreview = aBtnLight.IsChecked();

		aBtnGeo.Check( &aBtnGeo	== pBtn );
		aBtnRepresentation.Check( &aBtnRepresentation == pBtn );
		aBtnLight.Check( &aBtnLight	== pBtn );
		aBtnTexture.Check( &aBtnTexture	== pBtn );
		aBtnMaterial.Check( &aBtnMaterial == pBtn );

		if( aBtnGeo.IsChecked() )
			eViewType = VIEWTYPE_GEO;
		if( aBtnRepresentation.IsChecked() )
			eViewType = VIEWTYPE_REPRESENTATION;
		if( aBtnLight.IsChecked() )
			eViewType = VIEWTYPE_LIGHT;
		if( aBtnTexture.IsChecked() )
			eViewType = VIEWTYPE_TEXTURE;
		if( aBtnMaterial.IsChecked() )
			eViewType = VIEWTYPE_MATERIAL;

		// Geometrie
		if( eViewType == VIEWTYPE_GEO )
		{
			aFtHorizontal.Show();
			aNumHorizontal.Show();
			aFtVertical.Show();
			aNumVertical.Show();
            aFLSegments.Show();
			aFtPercentDiagonal.Show();
			aMtrPercentDiagonal.Show();
			aFtBackscale.Show();
			aMtrBackscale.Show();
			aFtEndAngle.Show();
			aMtrEndAngle.Show();
			aFtDepth.Show();
			aMtrDepth.Show();
            aFLGeometrie.Show();

			aBtnNormalsObj.Show();
			aBtnNormalsFlat.Show();
			aBtnNormalsSphere.Show();
			aBtnTwoSidedLighting.Show();
			aBtnNormalsInvert.Show();
            aFLNormals.Show();
			aBtnDoubleSided.Show();
		}
		else
		{
			aFtHorizontal.Hide();
			aNumHorizontal.Hide();
			aFtVertical.Hide();
			aNumVertical.Hide();
            aFLSegments.Hide();
			aFtPercentDiagonal.Hide();
			aMtrPercentDiagonal.Hide();
			aFtBackscale.Hide();
			aMtrBackscale.Hide();
			aFtEndAngle.Hide();
			aMtrEndAngle.Hide();
			aFtDepth.Hide();
			aMtrDepth.Hide();
            aFLGeometrie.Hide();

			aBtnNormalsObj.Hide();
			aBtnNormalsFlat.Hide();
			aBtnNormalsSphere.Hide();
			aBtnTwoSidedLighting.Hide();
			aBtnNormalsInvert.Hide();
            aFLNormals.Hide();
			aBtnDoubleSided.Hide();
		}

		// Darstellung
		if( eViewType == VIEWTYPE_REPRESENTATION )
		{
			aFtShademode.Show();
			aLbShademode.Show();
			aBtnShadow3d.Show();
			aFtSlant.Show();
			aMtrSlant.Show();
            aFLShadow.Show();
			aFtDistance.Show();
			aMtrDistance.Show();
			aFtFocalLeng.Show();
			aMtrFocalLength.Show();
            aFLCamera.Show();
            aFLRepresentation.Show();
		}
		else
		{
			aFtShademode.Hide();
			aLbShademode.Hide();
			aBtnShadow3d.Hide();
			aFtSlant.Hide();
			aMtrSlant.Hide();
            aFLShadow.Hide();
			aFtDistance.Hide();
			aMtrDistance.Hide();
			aFtFocalLeng.Hide();
			aMtrFocalLength.Hide();
            aFLCamera.Hide();
            aFLRepresentation.Hide();
		}

		// Beleuchtung
		if( eViewType == VIEWTYPE_LIGHT )
		{
			aBtnLight1.Show();
			aBtnLight2.Show();
			aBtnLight3.Show();
			aBtnLight4.Show();
			aBtnLight5.Show();
			aBtnLight6.Show();
			aBtnLight7.Show();
			aBtnLight8.Show();
			//aLbLight1.Show();
			aBtnLightColor.Show();
            aFTLightsource.Show();
			aLbAmbientlight.Show();
			aBtnAmbientColor.Show();
            aFTAmbientlight.Show();
            aFLLight.Show();
			//aFtLightX.Show();
			//aFtLightY.Show();
			//aFtLightZ.Show();
			//aGrpLightInfo.Show();

			ColorLB* pLb = GetLbByButton();
			if( pLb )
				pLb->Show();

			aCtlLightPreview.Show();
			aCtlPreview.Hide();
		}
		else
		{
			aBtnLight1.Hide();
			aBtnLight2.Hide();
			aBtnLight3.Hide();
			aBtnLight4.Hide();
			aBtnLight5.Hide();
			aBtnLight6.Hide();
			aBtnLight7.Hide();
			aBtnLight8.Hide();
			aLbLight1.Hide();
			aLbLight2.Hide();
			aLbLight3.Hide();
			aLbLight4.Hide();
			aLbLight5.Hide();
			aLbLight6.Hide();
			aLbLight7.Hide();
			aLbLight8.Hide();
			aBtnLightColor.Hide();
            aFTLightsource.Hide();
			aLbAmbientlight.Hide();
			aBtnAmbientColor.Hide();
            aFTAmbientlight.Hide();
            aFLLight.Hide();

			if( !aCtlPreview.IsVisible() )
			{
				aCtlPreview.Show();
				aCtlLightPreview.Hide();
			}
		}

		// Texturen
		if( eViewType == VIEWTYPE_TEXTURE )
		{
			aFtTexKind.Show();
			aBtnTexLuminance.Show();
			aBtnTexColor.Show();
			aFtTexMode.Show();
			aBtnTexReplace.Show();
			aBtnTexModulate.Show();
			//aBtnTexBlend.Show();
			aFtTexProjectionX.Show();
			aBtnTexParallelX.Show();
			aBtnTexCircleX.Show();
			aBtnTexObjectX.Show();
			aFtTexProjectionY.Show();
			aBtnTexParallelY.Show();
			aBtnTexCircleY.Show();
			aBtnTexObjectY.Show();
			aFtTexFilter.Show();
			aBtnTexFilter.Show();
            aFLTexture.Show();
		}
		else
		{
			aFtTexKind.Hide();
			aBtnTexLuminance.Hide();
			aBtnTexColor.Hide();
			aFtTexMode.Hide();
			aBtnTexReplace.Hide();
			aBtnTexModulate.Hide();
			aBtnTexBlend.Hide();
			aFtTexProjectionX.Hide();
			aBtnTexParallelX.Hide();
			aBtnTexCircleX.Hide();
			aBtnTexObjectX.Hide();
			aFtTexProjectionY.Hide();
			aBtnTexParallelY.Hide();
			aBtnTexCircleY.Hide();
			aBtnTexObjectY.Hide();
			aFtTexFilter.Hide();
			aBtnTexFilter.Hide();
            aFLTexture.Hide();
		}

		// Material
		if( eViewType == VIEWTYPE_MATERIAL )
		{
			aFtMatFavorites.Show();
			aLbMatFavorites.Show();
			aFtMatColor.Show();
			aLbMatColor.Show();
			aBtnMatColor.Show();
			aFtMatEmission.Show();
			aLbMatEmission.Show();
			aBtnEmissionColor.Show();
			aFtMatSpecular.Show();
			aLbMatSpecular.Show();
			aBtnSpecularColor.Show();
			aFtMatSpecularIntensity.Show();
			aMtrMatSpecularIntensity.Show();
            aFLMatSpecular.Show();
            aFLMaterial.Show();
		}
		else
		{
			aFtMatFavorites.Hide();
			aLbMatFavorites.Hide();
			aFtMatColor.Hide();
			aLbMatColor.Hide();
			aBtnMatColor.Hide();
			aFtMatEmission.Hide();
			aLbMatEmission.Hide();
			aBtnEmissionColor.Hide();
			aFtMatSpecular.Hide();
			aLbMatSpecular.Hide();
			aBtnSpecularColor.Hide();
			aFtMatSpecularIntensity.Hide();
			aMtrMatSpecularIntensity.Hide();
            aFLMatSpecular.Hide();
            aFLMaterial.Hide();
		}
		if( bUpdatePreview && !aBtnLight.IsChecked() )
			UpdatePreview();

	}
	else
	{
		aBtnGeo.Check( eViewType == VIEWTYPE_GEO );
		aBtnRepresentation.Check( eViewType == VIEWTYPE_REPRESENTATION );
		aBtnLight.Check( eViewType == VIEWTYPE_LIGHT );
		aBtnTexture.Check( eViewType == VIEWTYPE_TEXTURE );
		aBtnMaterial.Check( eViewType == VIEWTYPE_MATERIAL );
	}
	return( 0L );
}

// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, ClickHdl, PushButton *, pBtn )
{
	sal_Bool bUpdatePreview = sal_False;

	if( pBtn )
	{
		sal_uInt16 nSId = 0;

		if( pBtn == &aBtnConvertTo3D )
		{
			nSId = SID_CONVERT_TO_3D;
		}
		else if( pBtn == &aBtnLatheObject )
		{
			nSId = SID_CONVERT_TO_3D_LATHE_FAST;
		}
		// Geometrie
		else if( pBtn == &aBtnNormalsObj ||
				 pBtn == &aBtnNormalsFlat ||
				 pBtn == &aBtnNormalsSphere )
		{
			aBtnNormalsObj.Check( pBtn == &aBtnNormalsObj );
			aBtnNormalsFlat.Check( pBtn == &aBtnNormalsFlat );
			aBtnNormalsSphere.Check( pBtn == &aBtnNormalsSphere );
			bUpdatePreview = sal_True;
		}
		else if( pBtn == &aBtnLight1 ||
				 pBtn == &aBtnLight2 ||
				 pBtn == &aBtnLight3 ||
				 pBtn == &aBtnLight4 ||
				 pBtn == &aBtnLight5 ||
				 pBtn == &aBtnLight6 ||
				 pBtn == &aBtnLight7 ||
				 pBtn == &aBtnLight8 )
		{
			// Beleuchtung
			ColorLB* pLb = GetLbByButton( pBtn );
			pLb->Show();

			if( pBtn->IsChecked() )
			{
				SetUILightState( *(ImageButton*)pBtn, !GetUILightState( *(ImageButton*)pBtn ) );
			}
			else
			{
				pBtn->Check();

				if( pBtn != &aBtnLight1 && aBtnLight1.IsChecked() )
				{
					aBtnLight1.Check( sal_False );
					aLbLight1.Hide();
				}
				if( pBtn != &aBtnLight2 && aBtnLight2.IsChecked() )
				{
					aBtnLight2.Check( sal_False );
					aLbLight2.Hide();
				}
				if( pBtn != &aBtnLight3 && aBtnLight3.IsChecked() )
				{
					aBtnLight3.Check( sal_False );
					aLbLight3.Hide();
				}
				if( pBtn != &aBtnLight4 && aBtnLight4.IsChecked() )
				{
					aBtnLight4.Check( sal_False );
					aLbLight4.Hide();
				}
				if( pBtn != &aBtnLight5 && aBtnLight5.IsChecked() )
				{
					aBtnLight5.Check( sal_False );
					aLbLight5.Hide();
				}
				if( pBtn != &aBtnLight6 && aBtnLight6.IsChecked() )
				{
					aBtnLight6.Check( sal_False );
					aLbLight6.Hide();
				}
				if( pBtn != &aBtnLight7 && aBtnLight7.IsChecked() )
				{
					aBtnLight7.Check( sal_False );
					aLbLight7.Hide();
				}
				if( pBtn != &aBtnLight8 && aBtnLight8.IsChecked() )
				{
					aBtnLight8.Check( sal_False );
					aLbLight8.Hide();
				}
			}
			sal_Bool bEnable = GetUILightState( *(ImageButton*)pBtn );
			aBtnLightColor.Enable( bEnable );
			pLb->Enable( bEnable );

			ClickLightHdl( pBtn );
			bUpdatePreview = sal_True;
		}
		// Texturen
		else if( pBtn == &aBtnTexLuminance ||
				 pBtn == &aBtnTexColor )
		{
			aBtnTexLuminance.Check( pBtn == &aBtnTexLuminance );
			aBtnTexColor.Check( pBtn == &aBtnTexColor );
			bUpdatePreview = sal_True;
		}
		else if( pBtn == &aBtnTexReplace ||
				 pBtn == &aBtnTexModulate )// ||
				 //pBtn == &aBtnTexBlend )
		{
			aBtnTexReplace.Check( pBtn == &aBtnTexReplace );
			aBtnTexModulate.Check( pBtn == &aBtnTexModulate );
			//aBtnTexBlend.Check( pBtn == &aBtnTexBlend );
			bUpdatePreview = sal_True;
		}
		else if( pBtn == &aBtnTexParallelX ||
				 pBtn == &aBtnTexCircleX ||
				 pBtn == &aBtnTexObjectX )
		{
			aBtnTexParallelX.Check( pBtn == &aBtnTexParallelX );
			aBtnTexCircleX.Check( pBtn == &aBtnTexCircleX );
			aBtnTexObjectX.Check( pBtn == &aBtnTexObjectX );
			bUpdatePreview = sal_True;
		}
		else if( pBtn == &aBtnTexParallelY ||
				 pBtn == &aBtnTexCircleY ||
				 pBtn == &aBtnTexObjectY )
		{
			aBtnTexParallelY.Check( pBtn == &aBtnTexParallelY );
			aBtnTexCircleY.Check( pBtn == &aBtnTexCircleY );
			aBtnTexObjectY.Check( pBtn == &aBtnTexObjectY );
			bUpdatePreview = sal_True;
		}
		else if( pBtn == &aBtnShadow3d  )
		{
			pBtn->Check( !pBtn->IsChecked() );
			aFtSlant.Enable( pBtn->IsChecked() );
			aMtrSlant.Enable( pBtn->IsChecked() );
			bUpdatePreview = sal_True;
		}
		// Sonstige (keine Gruppen)
		else if( pBtn != NULL )
		{
			pBtn->Check( !pBtn->IsChecked() );
			bUpdatePreview = sal_True;
		}

		if( nSId > 0 )
		{
            SfxDispatcher* pDispatcher = LocalGetDispatcher(pBindings);
            if (pDispatcher != NULL)
            {
                SfxBoolItem aItem( nSId, sal_True );
                pDispatcher->Execute(
                    nSId, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
            }
		}
		else if( bUpdatePreview == sal_True )
			UpdatePreview();
	}
	return( 0L );
}

//------------------------------------------------------------------------

IMPL_LINK( Svx3DWin, ClickColorHdl, PushButton *, pBtn )
{
	SvColorDialog aColorDlg( this );
	ColorLB* pLb;

	if( pBtn == &aBtnLightColor )
		pLb = GetLbByButton();
	else if( pBtn == &aBtnAmbientColor )
		pLb = &aLbAmbientlight;
	else if( pBtn == &aBtnMatColor )
		pLb = &aLbMatColor;
	else if( pBtn == &aBtnEmissionColor )
		pLb = &aLbMatEmission;
	else // if( pBtn == &aBtnSpecularColor )
		pLb = &aLbMatSpecular;

	Color aColor = pLb->GetSelectEntryColor();

	aColorDlg.SetColor( aColor );
	if( aColorDlg.Execute() == RET_OK )
	{
		aColor = aColorDlg.GetColor();
		if( LBSelectColor( pLb, aColor ) )
			SelectHdl( pLb );
	}
	return( 0L );
}

// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, SelectHdl, void *, p )
{
	if( p )
	{
		Color aColor;
		sal_Bool bUpdatePreview = sal_False;

		// Material
		if( p == &aLbMatFavorites )
		{
			Color aColObj( COL_WHITE );
			Color aColEmis( COL_BLACK );
			Color aColSpec( COL_WHITE );
			sal_uInt16 nSpecIntens = 20;

			sal_uInt16 nPos = aLbMatFavorites.GetSelectEntryPos();
			switch( nPos )
			{
				case 1: // Metall
				{
					aColObj = Color(230,230,255);
					aColEmis = Color(10,10,30);
					aColSpec = Color(200,200,200);
					nSpecIntens = 20;
				}
				break;

				case 2: // Gold
				{
					aColObj = Color(230,255,0);
					aColEmis = Color(51,0,0);
					aColSpec = Color(255,255,240);
					nSpecIntens = 20;
				}
				break;

				case 3: // Chrom
				{
					aColObj = Color(36,117,153);
					aColEmis = Color(18,30,51);
					aColSpec = Color(230,230,255);
					nSpecIntens = 2;
				}
				break;

				case 4: // Plastik
				{
					aColObj = Color(255,48,57);
					aColEmis = Color(35,0,0);
					aColSpec = Color(179,202,204);
					nSpecIntens = 60;
				}
				break;

				case 5: // Holz
				{
					aColObj = Color(153,71,1);
					aColEmis = Color(21,22,0);
					aColSpec = Color(255,255,153);
					nSpecIntens = 75;
				}
				break;
			}
			LBSelectColor( &aLbMatColor, aColObj );
			LBSelectColor( &aLbMatEmission, aColEmis );
			LBSelectColor( &aLbMatSpecular, aColSpec );
			aMtrMatSpecularIntensity.SetValue( nSpecIntens );

			bUpdatePreview = sal_True;
		}
		else if( p == &aLbMatColor ||
				 p == &aLbMatEmission ||
				 p == &aLbMatSpecular )
		{
			aLbMatFavorites.SelectEntryPos( 0 );
			bUpdatePreview = sal_True;
		}
		// Beleuchtung
		else if( p == &aLbAmbientlight )
		{
			bUpdatePreview = sal_True;
		}
		else if( p == &aLbLight1 ||
				 p == &aLbLight2 ||
				 p == &aLbLight3 ||
				 p == &aLbLight4 ||
				 p == &aLbLight5 ||
				 p == &aLbLight6 ||
				 p == &aLbLight7 ||
				 p == &aLbLight8 )
		{
			bUpdatePreview = sal_True;
		}
		else if( p == &aLbShademode )
			bUpdatePreview = sal_True;

		if( bUpdatePreview == sal_True )
			UpdatePreview();
	}
	return( 0L );
}

// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, ModifyHdl, void*, pField )
{
	if( pField )
	{
		sal_Bool bUpdatePreview = sal_False;

		// Material
		if( pField == &aMtrMatSpecularIntensity )
		{
			bUpdatePreview = sal_True;
		}
		else if( pField == &aNumHorizontal )
		{
			bUpdatePreview = sal_True;
		}
		else if( pField == &aNumVertical )
		{
			bUpdatePreview = sal_True;
		}
		else if( pField == &aMtrSlant )
		{
			bUpdatePreview = sal_True;
		}

		if( bUpdatePreview == sal_True )
			UpdatePreview();
	}
	return( 0L );
}

// -----------------------------------------------------------------------

IMPL_LINK( Svx3DWin, ClickLightHdl, PushButton*, pBtn )
{

	if( pBtn )
	{
		sal_uInt16 nLightSource = GetLightSource( pBtn );
		ColorLB* pLb = GetLbByButton( pBtn );
		Color aColor( pLb->GetSelectEntryColor() );
        SfxItemSet aLightItemSet(aCtlLightPreview.GetSvx3DLightControl().Get3DAttributes());
        const bool bOnOff(GetUILightState( *(ImageButton*)pBtn ));

        switch(nLightSource)
        {
            case 0: aLightItemSet.Put(Svx3DLightcolor1Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff1Item(bOnOff)); break;
            case 1: aLightItemSet.Put(Svx3DLightcolor2Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff2Item(bOnOff)); break;
            case 2: aLightItemSet.Put(Svx3DLightcolor3Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff3Item(bOnOff)); break;
            case 3: aLightItemSet.Put(Svx3DLightcolor4Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff4Item(bOnOff)); break;
            case 4: aLightItemSet.Put(Svx3DLightcolor5Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff5Item(bOnOff)); break;
            case 5: aLightItemSet.Put(Svx3DLightcolor6Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff6Item(bOnOff)); break;
            case 6: aLightItemSet.Put(Svx3DLightcolor7Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff7Item(bOnOff)); break;
            default:
            case 7: aLightItemSet.Put(Svx3DLightcolor8Item(aColor)); aLightItemSet.Put(Svx3DLightOnOff8Item(bOnOff)); break;
        }

        aCtlLightPreview.GetSvx3DLightControl().Set3DAttributes(aLightItemSet);
		aCtlLightPreview.GetSvx3DLightControl().SelectLight(nLightSource);
		aCtlLightPreview.CheckSelection();
	}
	return( 0L );
}


// -----------------------------------------------------------------------
IMPL_LINK( Svx3DWin, DoubleClickHdl, void*, EMPTYARG )
{
	//sal_uInt16 nItemId = aCtlFavorites.GetSelectItemId();

	//SfxItemSet* pSet = (SfxItemSet*) pFavorSetList->GetObject( nItemId - 1 );
	//Update( *pSet );

	// und zuweisen
	ClickAssignHdl( NULL );

	return( 0L );
}

// -----------------------------------------------------------------------

IMPL_LINK( Svx3DWin, ChangeLightCallbackHdl, void*, EMPTYARG )
{
	return( 0L );
}


// -----------------------------------------------------------------------

IMPL_LINK( Svx3DWin, ChangeSelectionCallbackHdl, void*, EMPTYARG )
{
	const sal_uInt32 nLight(aCtlLightPreview.GetSvx3DLightControl().GetSelectedLight());
	PushButton* pBtn = 0;

	switch( nLight )
	{
		case 0: pBtn = &aBtnLight1; break;
		case 1: pBtn = &aBtnLight2; break;
		case 2: pBtn = &aBtnLight3; break;
		case 3: pBtn = &aBtnLight4; break;
		case 4: pBtn = &aBtnLight5; break;
		case 5: pBtn = &aBtnLight6; break;
		case 6: pBtn = &aBtnLight7; break;
		case 7: pBtn = &aBtnLight8; break;
		default: break;
	}

	if( pBtn )
		ClickHdl( pBtn );
	else
	{
		// Zustand: Keine Lampe selektiert
		if( aBtnLight1.IsChecked() )
		{
			aBtnLight1.Check( sal_False );
			aLbLight1.Enable( sal_False );
		}
		else if( aBtnLight2.IsChecked() )
		{
			aBtnLight2.Check( sal_False );
			aLbLight2.Enable( sal_False );
		}
		else if( aBtnLight3.IsChecked() )
		{
			aBtnLight3.Check( sal_False );
			aLbLight3.Enable( sal_False );
		}
		else if( aBtnLight4.IsChecked() )
		{
			aBtnLight4.Check( sal_False );
			aLbLight4.Enable( sal_False );
		}
		else if( aBtnLight5.IsChecked() )
		{
			aBtnLight5.Check( sal_False );
			aLbLight5.Enable( sal_False );
		}
		else if( aBtnLight6.IsChecked() )
		{
			aBtnLight6.Check( sal_False );
			aLbLight6.Enable( sal_False );
		}
		else if( aBtnLight7.IsChecked() )
		{
			aBtnLight7.Check( sal_False );
			aLbLight7.Enable( sal_False );
		}
		else if( aBtnLight8.IsChecked() )
		{
			aBtnLight8.Check( sal_False );
			aLbLight8.Enable( sal_False );
		}
		aBtnLightColor.Enable( sal_False );
	}

	return( 0L );
}

// -----------------------------------------------------------------------
// Methode um sicherzustellen, dass die LB auch mit einer Farbe gesetzt ist
// Liefert sal_True zurueck, falls Farbe hinzugefuegt wurde
// -----------------------------------------------------------------------
sal_Bool Svx3DWin::LBSelectColor( ColorLB* pLb, const Color& rColor )
{
	sal_Bool bRet = sal_False;

	pLb->SetNoSelection();
	pLb->SelectEntry( rColor );
	if( pLb->GetSelectEntryCount() == 0 )
	{
		String aStr(SVX_RES(RID_SVXFLOAT3D_FIX_R));

		aStr += String::CreateFromInt32((sal_Int32)rColor.GetRed());
		aStr += sal_Unicode(' ');
		aStr += String(SVX_RES(RID_SVXFLOAT3D_FIX_G));
		aStr += String::CreateFromInt32((sal_Int32)rColor.GetGreen());
		aStr += sal_Unicode(' ');
		aStr += String(SVX_RES(RID_SVXFLOAT3D_FIX_B));
		aStr += String::CreateFromInt32((sal_Int32)rColor.GetBlue());

		sal_uInt16 nPos = pLb->InsertEntry( rColor, aStr );
		pLb->SelectEntryPos( nPos );
		bRet = sal_True;
	}
	return( bRet );
}

// -----------------------------------------------------------------------
void Svx3DWin::UpdatePreview()
{
	if( pModel == NULL )
		pModel = new FmFormModel();

	if(bOnly3DChanged)
	{
		// slot executen
        SfxDispatcher* pDispatcher = LocalGetDispatcher(pBindings);
        if (pDispatcher != NULL)
        {
            SfxBoolItem aItem( SID_3D_STATE, sal_True );
            pDispatcher->Execute(
                SID_3D_STATE, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
        }
		// Flag zuruecksetzen
		bOnly3DChanged = sal_False;
	}

	// ItemSet besorgen
	SfxItemSet aSet( pModel->GetItemPool(), SDRATTR_START, SDRATTR_END);

	// Attribute holen und im Preview setzen
	GetAttr( aSet );
	aCtlPreview.Set3DAttributes( aSet );
	aCtlLightPreview.GetSvx3DLightControl().Set3DAttributes( aSet );
}

//////////////////////////////////////////////////////////////////////////////
// document is to be reloaded, destroy remembered ItemSet (#83951#)
void Svx3DWin::DocumentReload()
{
	if(mpRemember2DAttributes)
		delete mpRemember2DAttributes;
	mpRemember2DAttributes = 0L;
}

// -----------------------------------------------------------------------
void Svx3DWin::InitColorLB( const SdrModel* pDoc )
{
	aLbLight1.Fill( pDoc->GetColorTableFromSdrModel() );
	aLbLight2.CopyEntries( aLbLight1 );
	aLbLight3.CopyEntries( aLbLight1 );
	aLbLight4.CopyEntries( aLbLight1 );
	aLbLight5.CopyEntries( aLbLight1 );
	aLbLight6.CopyEntries( aLbLight1 );
	aLbLight7.CopyEntries( aLbLight1 );
	aLbLight8.CopyEntries( aLbLight1 );
	aLbAmbientlight.CopyEntries( aLbLight1 );
	aLbMatColor.CopyEntries( aLbLight1 );
	aLbMatEmission.CopyEntries( aLbLight1 );
	aLbMatSpecular.CopyEntries( aLbLight1 );

	// Erstmal...
	Color aColWhite( COL_WHITE );
	Color aColBlack( COL_BLACK );
	aLbLight1.SelectEntry( aColWhite );
	aLbLight2.SelectEntry( aColWhite );
	aLbLight3.SelectEntry( aColWhite );
	aLbLight4.SelectEntry( aColWhite );
	aLbLight5.SelectEntry( aColWhite );
	aLbLight6.SelectEntry( aColWhite );
	aLbLight7.SelectEntry( aColWhite );
	aLbLight8.SelectEntry( aColWhite );
	aLbAmbientlight.SelectEntry( aColBlack );
	aLbMatColor.SelectEntry( aColWhite );
	aLbMatEmission.SelectEntry( aColBlack );
	aLbMatSpecular.SelectEntry( aColWhite );
}

// -----------------------------------------------------------------------
sal_uInt16 Svx3DWin::GetLightSource( const PushButton* pBtn )
{
	sal_uInt16 nLight = 8;

	if( pBtn == NULL )
	{
		if( aBtnLight1.IsChecked() )
			nLight = 0;
		else if( aBtnLight2.IsChecked() )
			nLight = 1;
		else if( aBtnLight3.IsChecked() )
			nLight = 2;
		else if( aBtnLight4.IsChecked() )
			nLight = 3;
		else if( aBtnLight5.IsChecked() )
			nLight = 4;
		else if( aBtnLight6.IsChecked() )
			nLight = 5;
		else if( aBtnLight7.IsChecked() )
			nLight = 6;
		else if( aBtnLight8.IsChecked() )
			nLight = 7;
	}
	else
	{
		if( pBtn == &aBtnLight1 )
			nLight = 0;
		else if( pBtn == &aBtnLight2 )
			nLight = 1;
		else if( pBtn == &aBtnLight3 )
			nLight = 2;
		else if( pBtn == &aBtnLight4 )
			nLight = 3;
		else if( pBtn == &aBtnLight5 )
			nLight = 4;
		else if( pBtn == &aBtnLight6 )
			nLight = 5;
		else if( pBtn == &aBtnLight7 )
			nLight = 6;
		else if( pBtn == &aBtnLight8 )
			nLight = 7;
	}
	return( nLight );
};

// -----------------------------------------------------------------------
ColorLB* Svx3DWin::GetLbByButton( const PushButton* pBtn )
{
	ColorLB* pLb = NULL;

	if( pBtn == NULL )
	{
		if( aBtnLight1.IsChecked() )
			pLb = &aLbLight1;
		else if( aBtnLight2.IsChecked() )
			pLb = &aLbLight2;
		else if( aBtnLight3.IsChecked() )
			pLb = &aLbLight3;
		else if( aBtnLight4.IsChecked() )
			pLb = &aLbLight4;
		else if( aBtnLight5.IsChecked() )
			pLb = &aLbLight5;
		else if( aBtnLight6.IsChecked() )
			pLb = &aLbLight6;
		else if( aBtnLight7.IsChecked() )
			pLb = &aLbLight7;
		else if( aBtnLight8.IsChecked() )
			pLb = &aLbLight8;
	}
	else
	{
		if( pBtn == &aBtnLight1 )
			pLb = &aLbLight1;
		else if( pBtn == &aBtnLight2 )
			pLb = &aLbLight2;
		else if( pBtn == &aBtnLight3 )
			pLb = &aLbLight3;
		else if( pBtn == &aBtnLight4 )
			pLb = &aLbLight4;
		else if( pBtn == &aBtnLight5 )
			pLb = &aLbLight5;
		else if( pBtn == &aBtnLight6 )
			pLb = &aLbLight6;
		else if( pBtn == &aBtnLight7 )
			pLb = &aLbLight7;
		else if( pBtn == &aBtnLight8 )
			pLb = &aLbLight8;
	}
	return( pLb );
};

/*************************************************************************
|*
|* Ableitung vom SfxChildWindow als "Behaelter" fuer Effekte
|*
\************************************************************************/
__EXPORT Svx3DChildWindow::Svx3DChildWindow( Window* _pParent,
														 sal_uInt16 nId,
														 SfxBindings* pBindings,
														 SfxChildWinInfo* pInfo ) :
	SfxChildWindow( _pParent, nId )
{
	Svx3DWin* pWin = new Svx3DWin( pBindings, this, _pParent );
	pWindow = pWin;

	eChildAlignment = SFX_ALIGN_NOALIGNMENT;

	pWin->Initialize( pInfo );
}

/*************************************************************************
|*
|* ControllerItem fuer 3DStatus
|*
\************************************************************************/
Svx3DCtrlItem::Svx3DCtrlItem( sal_uInt16 _nId,
								Svx3DWin* pWin,
								SfxBindings* _pBindings) :
	SfxControllerItem( _nId, *_pBindings ),
	p3DWin( pWin )
{
}

// -----------------------------------------------------------------------
void __EXPORT Svx3DCtrlItem::StateChanged( sal_uInt16 /*nSId*/,
						SfxItemState /*eState*/, const SfxPoolItem* /*pItem*/ )
{
}

/*************************************************************************
|*
|* ControllerItem fuer Status Slot SID_CONVERT_TO_3D
|*
\************************************************************************/

SvxConvertTo3DItem::SvxConvertTo3DItem(sal_uInt16 _nId, SfxBindings* _pBindings)
:	SfxControllerItem(_nId, *_pBindings),
	bState(sal_False)
{
}

void SvxConvertTo3DItem::StateChanged(sal_uInt16 /*_nId*/, SfxItemState eState, const SfxPoolItem* /*pState*/)
{
	sal_Bool bNewState = (eState != SFX_ITEM_DISABLED);
	if(bNewState != bState)
	{
		bState = bNewState;
        SfxDispatcher* pDispatcher = LocalGetDispatcher(&GetBindings());
        if (pDispatcher != NULL)
        {
            SfxBoolItem aItem( SID_3D_STATE, sal_True );
            pDispatcher->Execute(
                SID_3D_STATE, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD, &aItem, 0L);
        }
	}
}
