/**************************************************************
 * 
 * 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_svtools.hxx"

#ifdef _MSC_VER
#pragma hdrstop
#endif

//_________________________________________________________________________________________________________________
//	includes
//_________________________________________________________________________________________________________________

#include <svtools/optionsdrawinglayer.hxx>
#include <unotools/configmgr.hxx>
#include <unotools/configitem.hxx>
#include <tools/debug.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <vcl/svapp.hxx>
#include <vcl/outdev.hxx>

//_________________________________________________________________________________________________________________
//	namespaces
//_________________________________________________________________________________________________________________

using namespace ::utl					;
using namespace ::rtl					;
using namespace ::osl					;
using namespace ::com::sun::star::uno	;

//_________________________________________________________________________________________________________________
//	const
//_________________________________________________________________________________________________________________

#define	ROOTNODE_START			   		OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Drawinglayer"	))
#define	DEFAULT_OVERLAYBUFFER			sal_True
#define	DEFAULT_PAINTBUFFER				sal_True
#define	DEFAULT_STRIPE_COLOR_A			0
#define	DEFAULT_STRIPE_COLOR_B			16581375
#define	DEFAULT_STRIPE_LENGTH			4

// #i73602#
// #i74769#, #i75172# : Change default for Calc and Writer to True
#define	DEFAULT_OVERLAYBUFFER_CALC			sal_True
#define	DEFAULT_OVERLAYBUFFER_WRITER		sal_True
#define	DEFAULT_OVERLAYBUFFER_DRAWIMPRESS	sal_True

// #i74769#, #i75172#
#define	DEFAULT_PAINTBUFFER_CALC			sal_True
#define	DEFAULT_PAINTBUFFER_WRITER			sal_True
#define	DEFAULT_PAINTBUFFER_DRAWIMPRESS		sal_True

// #i4219#
#define	DEFAULT_MAXIMUMPAPERWIDTH			300
#define	DEFAULT_MAXIMUMPAPERHEIGHT			300
#define	DEFAULT_MAXIMUMPAPERLEFTMARGIN		9999
#define	DEFAULT_MAXIMUMPAPERRIGHTMARGIN		9999
#define	DEFAULT_MAXIMUMPAPERTOPMARGIN		9999
#define	DEFAULT_MAXIMUMPAPERBOTTOMMARGIN	9999

// primitives
#define	DEFAULT_ANTIALIASING                        sal_True
#define	DEFAULT_SNAPHORVERLINESTODISCRETE			sal_True
#define	DEFAULT_SOLIDDRAGCREATE                     sal_True
#define	DEFAULT_RENDERDECORATEDTEXTDIRECT           sal_True
#define	DEFAULT_RENDERSIMPLETEXTDIRECT              sal_True
#define	DEFAULT_QUADRATIC3DRENDERLIMIT              1000000
#define	DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT     45000

// #i97672# selection settings
#define	DEFAULT_TRANSPARENTSELECTION                sal_True
#define DEFAULT_TRANSPARENTSELECTIONPERCENT			75
#define DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT    70

#define	PROPERTYNAME_OVERLAYBUFFER		OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer"	))
#define	PROPERTYNAME_PAINTBUFFER		OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer"		))
#define	PROPERTYNAME_STRIPE_COLOR_A		OUString(RTL_CONSTASCII_USTRINGPARAM("StripeColorA"		))
#define	PROPERTYNAME_STRIPE_COLOR_B		OUString(RTL_CONSTASCII_USTRINGPARAM("StripeColorB"		))
#define	PROPERTYNAME_STRIPE_LENGTH		OUString(RTL_CONSTASCII_USTRINGPARAM("StripeLength"		))

// #i73602#
#define	PROPERTYNAME_OVERLAYBUFFER_CALC			OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_Calc"))
#define	PROPERTYNAME_OVERLAYBUFFER_WRITER		OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_Writer"))
#define	PROPERTYNAME_OVERLAYBUFFER_DRAWIMPRESS	OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_DrawImpress"))

// #i74769#, #i75172#
#define	PROPERTYNAME_PAINTBUFFER_CALC			OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_Calc"))
#define	PROPERTYNAME_PAINTBUFFER_WRITER			OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_Writer"))
#define	PROPERTYNAME_PAINTBUFFER_DRAWIMPRESS	OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_DrawImpress"))

// #i4219#
#define	PROPERTYNAME_MAXIMUMPAPERWIDTH OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperWidth"))
#define	PROPERTYNAME_MAXIMUMPAPERHEIGHT OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperHeight"))
#define	PROPERTYNAME_MAXIMUMPAPERLEFTMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperLeftMargin"))
#define	PROPERTYNAME_MAXIMUMPAPERRIGHTMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperRightMargin"))
#define	PROPERTYNAME_MAXIMUMPAPERTOPMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperTopMargin"))
#define	PROPERTYNAME_MAXIMUMPAPERBOTTOMMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperBottomMargin"))

// primitives
#define	PROPERTYNAME_ANTIALIASING OUString(RTL_CONSTASCII_USTRINGPARAM("AntiAliasing"))
#define	PROPERTYNAME_SNAPHORVERLINESTODISCRETE OUString(RTL_CONSTASCII_USTRINGPARAM("SnapHorVerLinesToDiscrete"))
#define	PROPERTYNAME_SOLIDDRAGCREATE OUString(RTL_CONSTASCII_USTRINGPARAM("SolidDragCreate"))
#define	PROPERTYNAME_RENDERDECORATEDTEXTDIRECT OUString(RTL_CONSTASCII_USTRINGPARAM("RenderDecoratedTextDirect"))
#define	PROPERTYNAME_RENDERSIMPLETEXTDIRECT OUString(RTL_CONSTASCII_USTRINGPARAM("RenderSimpleTextDirect"))
#define	PROPERTYNAME_QUADRATIC3DRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("Quadratic3DRenderLimit"))
#define	PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("QuadraticFormControlRenderLimit"))

// #i97672# selection settings
#define	PROPERTYNAME_TRANSPARENTSELECTION OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelection"))
#define	PROPERTYNAME_TRANSPARENTSELECTIONPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelectionPercent"))
#define	PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("SelectionMaximumLuminancePercent"))

#define	PROPERTYHANDLE_OVERLAYBUFFER				0
#define	PROPERTYHANDLE_PAINTBUFFER					1
#define	PROPERTYHANDLE_STRIPE_COLOR_A				2
#define	PROPERTYHANDLE_STRIPE_COLOR_B				3
#define	PROPERTYHANDLE_STRIPE_LENGTH				4

// #i73602#
#define	PROPERTYHANDLE_OVERLAYBUFFER_CALC			5
#define	PROPERTYHANDLE_OVERLAYBUFFER_WRITER			6
#define	PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS	7

// #i74769#, #i75172#
#define	PROPERTYHANDLE_PAINTBUFFER_CALC				8
#define	PROPERTYHANDLE_PAINTBUFFER_WRITER			9
#define	PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS		10

// #i4219#
#define	PROPERTYHANDLE_MAXIMUMPAPERWIDTH			11
#define	PROPERTYHANDLE_MAXIMUMPAPERHEIGHT			12
#define	PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN		13
#define	PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN		14
#define	PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN		15
#define	PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN		16

// primitives
#define	PROPERTYHANDLE_ANTIALIASING                     17
#define	PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE        18
#define	PROPERTYHANDLE_SOLIDDRAGCREATE					19
#define	PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT        20
#define	PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT           21
#define	PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT           22
#define	PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT  23

// #i97672# selection settings
#define	PROPERTYHANDLE_TRANSPARENTSELECTION             24
#define	PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT      25
#define	PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT 26

#define	PROPERTYCOUNT								27

class SvtOptionsDrawinglayer_Impl : public ConfigItem
{
public:

//---------------------------------------------------------------------------------------------------------
//	constructor / destructor
//---------------------------------------------------------------------------------------------------------

	 SvtOptionsDrawinglayer_Impl();
	~SvtOptionsDrawinglayer_Impl();

//---------------------------------------------------------------------------------------------------------
//	overloaded methods of baseclass
//---------------------------------------------------------------------------------------------------------

	virtual void Commit();
    virtual void Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames);

//---------------------------------------------------------------------------------------------------------
//	public interface
//---------------------------------------------------------------------------------------------------------

	sal_Bool	IsOverlayBuffer() const;
	sal_Bool	IsPaintBuffer() const;
	Color		GetStripeColorA() const;
	Color		GetStripeColorB() const;
	sal_uInt16	GetStripeLength() const;

	// #i73602#
	sal_Bool	IsOverlayBuffer_Calc() const;
	sal_Bool	IsOverlayBuffer_Writer() const;
	sal_Bool	IsOverlayBuffer_DrawImpress() const;

	// #i74769#, #i75172#
	sal_Bool	IsPaintBuffer_Calc() const;
	sal_Bool	IsPaintBuffer_Writer() const;
	sal_Bool	IsPaintBuffer_DrawImpress() const;

	void		SetOverlayBuffer( sal_Bool bState );
	void		SetPaintBuffer( sal_Bool bState );
	void		SetStripeColorA( Color aColor );
	void		SetStripeColorB( Color aColor );
	void		SetStripeLength( sal_uInt16 nLength );

	// #i73602#
	void		SetOverlayBuffer_Calc( sal_Bool bState );
	void		SetOverlayBuffer_Writer( sal_Bool bState );
	void		SetOverlayBuffer_DrawImpress( sal_Bool bState );

	// #i74769#, #i75172#
	void		SetPaintBuffer_Calc( sal_Bool bState );
	void		SetPaintBuffer_Writer( sal_Bool bState );
	void		SetPaintBuffer_DrawImpress( sal_Bool bState );

	// #i4219#
	sal_uInt32 GetMaximumPaperWidth() const;
	sal_uInt32 GetMaximumPaperHeight() const;
	sal_uInt32 GetMaximumPaperLeftMargin() const;
	sal_uInt32 GetMaximumPaperRightMargin() const;
	sal_uInt32 GetMaximumPaperTopMargin() const;
	sal_uInt32 GetMaximumPaperBottomMargin() const;

	void SetMaximumPaperWidth(sal_uInt32 nNew);
	void SetMaximumPaperHeight(sal_uInt32 nNew);
	void SetMaximumPaperLeftMargin(sal_uInt32 nNew);
	void SetMaximumPaperRightMargin(sal_uInt32 nNew);
	void SetMaximumPaperTopMargin(sal_uInt32 nNew);
	void SetMaximumPaperBottomMargin(sal_uInt32 nNew);

    // helper
    sal_Bool IsAAPossibleOnThisSystem() const;

    // primitives
	sal_Bool	IsAntiAliasing() const;
	sal_Bool	IsSnapHorVerLinesToDiscrete() const;
	sal_Bool	IsSolidDragCreate() const;
	sal_Bool	IsRenderDecoratedTextDirect() const;
	sal_Bool	IsRenderSimpleTextDirect() const;
	sal_uInt32  GetQuadratic3DRenderLimit() const;
	sal_uInt32  GetQuadraticFormControlRenderLimit() const;

    void		SetAntiAliasing( sal_Bool bState );
    void		SetSnapHorVerLinesToDiscrete( sal_Bool bState );
	void		SetSolidDragCreate( sal_Bool bState );
	void		SetRenderDecoratedTextDirect( sal_Bool bState );
	void		SetRenderSimpleTextDirect( sal_Bool bState );
	void        SetQuadratic3DRenderLimit(sal_uInt32 nNew);
	void        SetQuadraticFormControlRenderLimit(sal_uInt32 nNew);

	// #i97672# selection settings
	sal_Bool	IsTransparentSelection() const;
	sal_uInt16	GetTransparentSelectionPercent() const;
	sal_uInt16	GetSelectionMaximumLuminancePercent() const;

	void		SetTransparentSelection( sal_Bool bState );
	void		SetTransparentSelectionPercent( sal_uInt16 nPercent );
	void		SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent );

//-------------------------------------------------------------------------------------------------------------
//	private methods
//-------------------------------------------------------------------------------------------------------------

private:

	static Sequence< OUString > impl_GetPropertyNames();

//-------------------------------------------------------------------------------------------------------------
//	private member
//-------------------------------------------------------------------------------------------------------------

private:

		sal_Bool	m_bOverlayBuffer;
		sal_Bool	m_bPaintBuffer;
		Color		m_bStripeColorA;
		Color		m_bStripeColorB;
		sal_uInt16	m_nStripeLength;

		// #i73602#
		sal_Bool	m_bOverlayBuffer_Calc;
		sal_Bool	m_bOverlayBuffer_Writer;
		sal_Bool	m_bOverlayBuffer_DrawImpress;

		// #i74769#, #i75172#
		sal_Bool	m_bPaintBuffer_Calc;
		sal_Bool	m_bPaintBuffer_Writer;
		sal_Bool	m_bPaintBuffer_DrawImpress;

		// #i4219#
		sal_uInt32	m_nMaximumPaperWidth;
		sal_uInt32	m_nMaximumPaperHeight;
		sal_uInt32	m_nMaximumPaperLeftMargin;
		sal_uInt32	m_nMaximumPaperRightMargin;
		sal_uInt32	m_nMaximumPaperTopMargin;
		sal_uInt32	m_nMaximumPaperBottomMargin;

        // primitives
		sal_Bool	m_bAntiAliasing;
		sal_Bool	m_bSnapHorVerLinesToDiscrete;
		sal_Bool	m_bSolidDragCreate;
		sal_Bool	m_bRenderDecoratedTextDirect;
		sal_Bool	m_bRenderSimpleTextDirect;
		sal_uInt32	m_nQuadratic3DRenderLimit;
		sal_uInt32	m_nQuadraticFormControlRenderLimit;

		// #i97672# selection settings
		sal_uInt16	m_nTransparentSelectionPercent;
		sal_uInt16	m_nSelectionMaximumLuminancePercent;
		sal_Bool	m_bTransparentSelection;

        // local values
        bool        m_bAllowAA : 1;
        bool        m_bAllowAAChecked : 1;
};

//_________________________________________________________________________________________________________________
//	definitions
//_________________________________________________________________________________________________________________

//*****************************************************************************************************************
//	constructor
//*****************************************************************************************************************
SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() :
	ConfigItem( ROOTNODE_START	),
	m_bOverlayBuffer( DEFAULT_OVERLAYBUFFER ),
	m_bPaintBuffer( DEFAULT_PAINTBUFFER ),
	m_bStripeColorA(Color(DEFAULT_STRIPE_COLOR_A)),
	m_bStripeColorB(Color(DEFAULT_STRIPE_COLOR_B)),
	m_nStripeLength(DEFAULT_STRIPE_LENGTH),

	// #i73602#
	m_bOverlayBuffer_Calc( DEFAULT_OVERLAYBUFFER_CALC ),
	m_bOverlayBuffer_Writer( DEFAULT_OVERLAYBUFFER_WRITER ),
	m_bOverlayBuffer_DrawImpress( DEFAULT_OVERLAYBUFFER_DRAWIMPRESS ),

	// #i74769#, #i75172#
	m_bPaintBuffer_Calc( DEFAULT_PAINTBUFFER_CALC ),
	m_bPaintBuffer_Writer( DEFAULT_PAINTBUFFER_WRITER ),
	m_bPaintBuffer_DrawImpress( DEFAULT_PAINTBUFFER_DRAWIMPRESS ),

	// #i4219#
	m_nMaximumPaperWidth(DEFAULT_MAXIMUMPAPERWIDTH),
	m_nMaximumPaperHeight(DEFAULT_MAXIMUMPAPERHEIGHT),
	m_nMaximumPaperLeftMargin(DEFAULT_MAXIMUMPAPERLEFTMARGIN),
	m_nMaximumPaperRightMargin(DEFAULT_MAXIMUMPAPERRIGHTMARGIN),
	m_nMaximumPaperTopMargin(DEFAULT_MAXIMUMPAPERTOPMARGIN),
	m_nMaximumPaperBottomMargin(DEFAULT_MAXIMUMPAPERBOTTOMMARGIN),

    // primitives
	m_bAntiAliasing(DEFAULT_ANTIALIASING),
	m_bSnapHorVerLinesToDiscrete(DEFAULT_SNAPHORVERLINESTODISCRETE),
	m_bSolidDragCreate(DEFAULT_SOLIDDRAGCREATE),
	m_bRenderDecoratedTextDirect(DEFAULT_RENDERDECORATEDTEXTDIRECT),
	m_bRenderSimpleTextDirect(DEFAULT_RENDERSIMPLETEXTDIRECT),
	m_nQuadratic3DRenderLimit(DEFAULT_QUADRATIC3DRENDERLIMIT),
	m_nQuadraticFormControlRenderLimit(DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT),

	// #i97672# selection settings
	m_nTransparentSelectionPercent(DEFAULT_TRANSPARENTSELECTIONPERCENT),
	m_nSelectionMaximumLuminancePercent(DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT),
	m_bTransparentSelection(DEFAULT_TRANSPARENTSELECTION),

    // local values
    m_bAllowAA(true),
    m_bAllowAAChecked(false)
{
	Sequence< OUString >	seqNames( impl_GetPropertyNames() );
	Sequence< Any >			seqValues	= GetProperties( seqNames )	;

	DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nI miss some values of configuration keys!\n" );

	// Copy values from list in right order to ouer internal member.
	sal_Int32 nPropertyCount = seqValues.getLength();
	sal_Int32 nProperty	= 0;

	for( nProperty=0; nProperty<nPropertyCount; ++nProperty )
	{
		DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nInvalid property value for property detected!\n" );

        switch( nProperty )
        {
            case PROPERTYHANDLE_OVERLAYBUFFER:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer\"?" );
				seqValues[nProperty] >>= m_bOverlayBuffer;
			}
			break;

            case PROPERTYHANDLE_PAINTBUFFER:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer\"?" );
				seqValues[nProperty] >>= m_bPaintBuffer;
			}
			break;

			case PROPERTYHANDLE_STRIPE_COLOR_A:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeColorA\"?" );
				sal_Int32 nValue = 0;
				seqValues[nProperty] >>= nValue;
				m_bStripeColorA = nValue;
			}
			break;

			case PROPERTYHANDLE_STRIPE_COLOR_B:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeColorB\"?" );
				sal_Int32 nValue = 0;
				seqValues[nProperty] >>= nValue;
				m_bStripeColorB = nValue;
			}
			break;

			case PROPERTYHANDLE_STRIPE_LENGTH:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeLength\"?" );
				seqValues[nProperty] >>= m_nStripeLength;
			}
			break;

			// #i73602#
            case PROPERTYHANDLE_OVERLAYBUFFER_CALC:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_Calc\"?" );
				seqValues[nProperty] >>= m_bOverlayBuffer_Calc;
			}
			break;

			case PROPERTYHANDLE_OVERLAYBUFFER_WRITER:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_Writer\"?" );
				seqValues[nProperty] >>= m_bOverlayBuffer_Writer;
			}
			break;

			case PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_DrawImpress\"?" );
				seqValues[nProperty] >>= m_bOverlayBuffer_DrawImpress;
			}
			break;

			// #i74769#, #i75172#
            case PROPERTYHANDLE_PAINTBUFFER_CALC:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_Calc\"?" );
				seqValues[nProperty] >>= m_bPaintBuffer_Calc;
			}
			break;

			case PROPERTYHANDLE_PAINTBUFFER_WRITER:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_Writer\"?" );
				seqValues[nProperty] >>= m_bPaintBuffer_Writer;
			}
			break;

			case PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_DrawImpress\"?" );
				seqValues[nProperty] >>= m_bPaintBuffer_DrawImpress;
			}
			break;

			// #i4219#
			case PROPERTYHANDLE_MAXIMUMPAPERWIDTH:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperWidth\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperWidth;
			}
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERHEIGHT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperHeight\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperHeight;
			}
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperLeftMargin\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperLeftMargin;
			}
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperRightMargin\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperRightMargin;
			}
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperTopMargin\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperTopMargin;
			}
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperBottomMargin\"?" );
				seqValues[nProperty] >>= m_nMaximumPaperBottomMargin;
			}
			break;

            // primitives
            case PROPERTYHANDLE_ANTIALIASING:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\AntiAliasing\"?" );
				seqValues[nProperty] >>= m_bAntiAliasing;
			}
			break;

            // primitives
            case PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SnapHorVerLinesToDiscrete\"?" );
				seqValues[nProperty] >>= m_bSnapHorVerLinesToDiscrete;
			}
			break;

            case PROPERTYHANDLE_SOLIDDRAGCREATE:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SolidDragCreate\"?" );
				seqValues[nProperty] >>= m_bSolidDragCreate;
			}
			break;

            case PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\RenderDecoratedTextDirect\"?" );
				seqValues[nProperty] >>= m_bRenderDecoratedTextDirect;
			}
			break;

            case PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\RenderSimpleTextDirect\"?" );
				seqValues[nProperty] >>= m_bRenderSimpleTextDirect;
			}
			break;

            case PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\Quadratic3DRenderLimit\"?" );
				seqValues[nProperty] >>= m_nQuadratic3DRenderLimit;
			}
			break;

            case PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\QuadraticFormControlRenderLimit\"?" );
				seqValues[nProperty] >>= m_nQuadraticFormControlRenderLimit;
			}
			break;

			// #i97672# selection settings
            case PROPERTYHANDLE_TRANSPARENTSELECTION:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelection\"?" );
				seqValues[nProperty] >>= m_bTransparentSelection;
			}
			break;
			
			case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelectionPercent\"?" );
				seqValues[nProperty] >>= m_nTransparentSelectionPercent;
			}
			
			case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT:
			{
				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SelectionMaximumLuminancePercent\"?" );
				seqValues[nProperty] >>= m_nSelectionMaximumLuminancePercent;
			}
			break;
        }
	}
}

//*****************************************************************************************************************
//	destructor
//*****************************************************************************************************************
SvtOptionsDrawinglayer_Impl::~SvtOptionsDrawinglayer_Impl()
{
	if( IsModified() )
		Commit();
}

//*****************************************************************************************************************
//	Commit
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::Commit()
{
	Sequence< OUString >	aSeqNames( impl_GetPropertyNames() );
	Sequence< Any >			aSeqValues( aSeqNames.getLength() );

	for( sal_Int32 nProperty = 0, nCount = aSeqNames.getLength(); nProperty < nCount; ++nProperty )
	{
        switch( nProperty )
        {
            case PROPERTYHANDLE_OVERLAYBUFFER:
				aSeqValues[nProperty] <<= m_bOverlayBuffer;
			break;

            case PROPERTYHANDLE_PAINTBUFFER:
				aSeqValues[nProperty] <<= m_bPaintBuffer;
			break;

			case PROPERTYHANDLE_STRIPE_COLOR_A:
				aSeqValues[nProperty] <<= m_bStripeColorA.GetColor();
			break;

			case PROPERTYHANDLE_STRIPE_COLOR_B:
				aSeqValues[nProperty] <<= m_bStripeColorB.GetColor();
			break;

			case PROPERTYHANDLE_STRIPE_LENGTH:
				aSeqValues[nProperty] <<= m_nStripeLength;
			break;

			// #i73602#
            case PROPERTYHANDLE_OVERLAYBUFFER_CALC:
				aSeqValues[nProperty] <<= m_bOverlayBuffer_Calc;
			break;

			case PROPERTYHANDLE_OVERLAYBUFFER_WRITER:
				aSeqValues[nProperty] <<= m_bOverlayBuffer_Writer;
			break;

			case PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS:
				aSeqValues[nProperty] <<= m_bOverlayBuffer_DrawImpress;
			break;

			// #i74769#, #i75172#
            case PROPERTYHANDLE_PAINTBUFFER_CALC:
				aSeqValues[nProperty] <<= m_bPaintBuffer_Calc;
			break;

			case PROPERTYHANDLE_PAINTBUFFER_WRITER:
				aSeqValues[nProperty] <<= m_bPaintBuffer_Writer;
			break;

			case PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS:
				aSeqValues[nProperty] <<= m_bPaintBuffer_DrawImpress;
			break;

			// #i4219#
			case PROPERTYHANDLE_MAXIMUMPAPERWIDTH:
				aSeqValues[nProperty] <<= m_nMaximumPaperWidth;
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERHEIGHT:
				aSeqValues[nProperty] <<= m_nMaximumPaperHeight;
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN:
				aSeqValues[nProperty] <<= m_nMaximumPaperLeftMargin;
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN:
				aSeqValues[nProperty] <<= m_nMaximumPaperRightMargin;
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN:
				aSeqValues[nProperty] <<= m_nMaximumPaperTopMargin;
			break;

			case PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN:
				aSeqValues[nProperty] <<= m_nMaximumPaperBottomMargin;
			break;

            // primitives
            case PROPERTYHANDLE_ANTIALIASING:
				aSeqValues[nProperty] <<= m_bAntiAliasing;
			break;

            case PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE:
				aSeqValues[nProperty] <<= m_bSnapHorVerLinesToDiscrete;
			break;

            case PROPERTYHANDLE_SOLIDDRAGCREATE:
				aSeqValues[nProperty] <<= m_bSolidDragCreate;
			break;

            case PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT:
				aSeqValues[nProperty] <<= m_bRenderDecoratedTextDirect;
			break;

            case PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT:
				aSeqValues[nProperty] <<= m_bRenderSimpleTextDirect;
			break;

            case PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT:
				aSeqValues[nProperty] <<= m_nQuadratic3DRenderLimit;
			break;

            case PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT:
				aSeqValues[nProperty] <<= m_nQuadraticFormControlRenderLimit;
			break;

			// #i97672# selection settings
            case PROPERTYHANDLE_TRANSPARENTSELECTION:
				aSeqValues[nProperty] <<= m_bTransparentSelection;
			break;

			case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT:
				aSeqValues[nProperty] <<= m_nTransparentSelectionPercent;
			break;

			case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT:
				aSeqValues[nProperty] <<= m_nSelectionMaximumLuminancePercent;
			break;
        }
	}

	PutProperties( aSeqNames, aSeqValues );
}

void SvtOptionsDrawinglayer_Impl::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& )
{
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer() const
{
	return m_bOverlayBuffer;
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer() const
{
	return m_bPaintBuffer;
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
Color SvtOptionsDrawinglayer_Impl::GetStripeColorA() const
{
	return m_bStripeColorA;
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
Color SvtOptionsDrawinglayer_Impl::GetStripeColorB() const
{
	return m_bStripeColorB;
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_uInt16 SvtOptionsDrawinglayer_Impl::GetStripeLength() const
{
	return m_nStripeLength;
}

// #i73602#
sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_Calc() const
{
	return m_bOverlayBuffer_Calc;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_Writer() const
{
	return m_bOverlayBuffer_Writer;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_DrawImpress() const
{
	return m_bOverlayBuffer_DrawImpress;
}

// #i74769#, #i75172#
sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_Calc() const
{
	return m_bPaintBuffer_Calc;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_Writer() const
{
	return m_bPaintBuffer_Writer;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_DrawImpress() const
{
	return m_bPaintBuffer_DrawImpress;
}

// #i4219#
sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperWidth() const
{
	return m_nMaximumPaperWidth;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperHeight() const
{
	return m_nMaximumPaperHeight;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperLeftMargin() const
{
	return m_nMaximumPaperLeftMargin;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperRightMargin() const
{
	return m_nMaximumPaperRightMargin;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperTopMargin() const
{
	return m_nMaximumPaperTopMargin;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperBottomMargin() const
{
	return m_nMaximumPaperBottomMargin;
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer( sal_Bool bState )
{
	if(m_bOverlayBuffer != bState)
	{
		m_bOverlayBuffer = bState;
		SetModified();
	}
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::SetPaintBuffer( sal_Bool bState )
{
	if(m_bPaintBuffer != bState)
	{
		m_bPaintBuffer = bState;
		SetModified();
	}
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::SetStripeColorA( Color aColor )
{
	if(m_bStripeColorA != aColor)
	{
		m_bStripeColorA = aColor;
		SetModified();
	}
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::SetStripeColorB( Color aColor )
{
	if(m_bStripeColorB != aColor)
	{
		m_bStripeColorB = aColor;
		SetModified();
	}
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer_Impl::SetStripeLength( sal_uInt16 nLength )
{
	if(m_nStripeLength != nLength)
	{
		m_nStripeLength = nLength;
		SetModified();
	}
}

// #i73602#
void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_Calc( sal_Bool bState )
{
	if(m_bOverlayBuffer_Calc != bState)
	{
		m_bOverlayBuffer_Calc = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_Writer( sal_Bool bState )
{
	if(m_bOverlayBuffer_Writer != bState)
	{
		m_bOverlayBuffer_Writer = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_DrawImpress( sal_Bool bState )
{
	if(m_bOverlayBuffer_DrawImpress != bState)
	{
		m_bOverlayBuffer_DrawImpress = bState;
		SetModified();
	}
}

// #i74769#, #i75172#
void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_Calc( sal_Bool bState )
{
	if(m_bPaintBuffer_Calc != bState)
	{
		m_bPaintBuffer_Calc = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_Writer( sal_Bool bState )
{
	if(m_bPaintBuffer_Writer != bState)
	{
		m_bPaintBuffer_Writer = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_DrawImpress( sal_Bool bState )
{
	if(m_bPaintBuffer_DrawImpress != bState)
	{
		m_bPaintBuffer_DrawImpress = bState;
		SetModified();
	}
}

// #i4219#
void SvtOptionsDrawinglayer_Impl::SetMaximumPaperWidth( sal_uInt32 nNew )
{
	if(m_nMaximumPaperWidth != nNew)
	{
		m_nMaximumPaperWidth = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetMaximumPaperHeight( sal_uInt32 nNew )
{
	if(m_nMaximumPaperHeight != nNew)
	{
		m_nMaximumPaperHeight = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetMaximumPaperLeftMargin( sal_uInt32 nNew )
{
	if(m_nMaximumPaperLeftMargin != nNew)
	{
		m_nMaximumPaperLeftMargin = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetMaximumPaperRightMargin( sal_uInt32 nNew )
{
	if(m_nMaximumPaperRightMargin != nNew)
	{
		m_nMaximumPaperRightMargin = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetMaximumPaperTopMargin( sal_uInt32 nNew )
{
	if(m_nMaximumPaperTopMargin != nNew)
	{
		m_nMaximumPaperTopMargin = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetMaximumPaperBottomMargin( sal_uInt32 nNew )
{
	if(m_nMaximumPaperBottomMargin != nNew)
	{
		m_nMaximumPaperBottomMargin = nNew;
		SetModified();
	}
}

// helper
sal_Bool SvtOptionsDrawinglayer_Impl::IsAAPossibleOnThisSystem() const
{
    if(!m_bAllowAAChecked)
    {
        SvtOptionsDrawinglayer_Impl* pThat = const_cast< SvtOptionsDrawinglayer_Impl* >(this);
        pThat->m_bAllowAAChecked = true;

#ifdef WIN32
        // WIN32 uses GDIPlus with VCL forthe first incarnation; this will be enhanced
        // in the future to use canvases and the canvas renderer, thus a AA-abled
        // canvas needs to be checked here in the future.
        // Currently, just allow AA for WIN32
#endif

	    // check XRenderExtension
	    if(m_bAllowAA && !Application::GetDefaultDevice()->supportsOperation( OutDevSupport_TransparentRect ))
	    {
		    pThat->m_bAllowAA = false;
	    }
    }

    return m_bAllowAA;
}

// primitives
sal_Bool SvtOptionsDrawinglayer_Impl::IsAntiAliasing() const
{
	return m_bAntiAliasing;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsSnapHorVerLinesToDiscrete() const
{
	return m_bSnapHorVerLinesToDiscrete;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsSolidDragCreate() const
{
	return m_bSolidDragCreate;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsRenderDecoratedTextDirect() const
{
	return m_bRenderDecoratedTextDirect;
}

sal_Bool SvtOptionsDrawinglayer_Impl::IsRenderSimpleTextDirect() const
{
	return m_bRenderSimpleTextDirect;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetQuadratic3DRenderLimit() const
{
	return m_nQuadratic3DRenderLimit;
}

sal_uInt32 SvtOptionsDrawinglayer_Impl::GetQuadraticFormControlRenderLimit() const
{
	return m_nQuadraticFormControlRenderLimit;
}

void SvtOptionsDrawinglayer_Impl::SetAntiAliasing( sal_Bool bState )
{
	if(m_bAntiAliasing != bState)
	{
		m_bAntiAliasing = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetSnapHorVerLinesToDiscrete( sal_Bool bState )
{
	if(m_bSnapHorVerLinesToDiscrete != bState)
	{
		m_bSnapHorVerLinesToDiscrete = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetSolidDragCreate( sal_Bool bState )
{
	if(m_bSolidDragCreate != bState)
	{
		m_bSolidDragCreate = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetRenderDecoratedTextDirect( sal_Bool bState )
{
	if(m_bRenderDecoratedTextDirect != bState)
	{
		m_bRenderDecoratedTextDirect = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetRenderSimpleTextDirect( sal_Bool bState )
{
	if(m_bRenderSimpleTextDirect != bState)
	{
		m_bRenderSimpleTextDirect = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetQuadratic3DRenderLimit(sal_uInt32 nNew)
{
	if(m_nQuadratic3DRenderLimit != nNew)
	{
		m_nQuadratic3DRenderLimit = nNew;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetQuadraticFormControlRenderLimit(sal_uInt32 nNew)
{
	if(m_nQuadraticFormControlRenderLimit != nNew)
	{
		m_nQuadraticFormControlRenderLimit = nNew;
		SetModified();
	}
}

// #i97672# selection settings
sal_Bool SvtOptionsDrawinglayer_Impl::IsTransparentSelection() const
{
	return m_bTransparentSelection;
}

void SvtOptionsDrawinglayer_Impl::SetTransparentSelection( sal_Bool bState )
{
	if(m_bTransparentSelection != bState)
	{
		m_bTransparentSelection = bState;
		SetModified();
	}
}

void SvtOptionsDrawinglayer_Impl::SetTransparentSelectionPercent( sal_uInt16 nPercent )
{
	if(m_nTransparentSelectionPercent != nPercent)
	{
		m_nTransparentSelectionPercent = nPercent;
		SetModified();
	}
}

sal_uInt16 SvtOptionsDrawinglayer_Impl::GetTransparentSelectionPercent() const
{
	return m_nTransparentSelectionPercent;
}

void SvtOptionsDrawinglayer_Impl::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent )
{
	if(m_nSelectionMaximumLuminancePercent != nPercent)
	{
		m_nSelectionMaximumLuminancePercent = nPercent;
		SetModified();
	}
}

sal_uInt16 SvtOptionsDrawinglayer_Impl::GetSelectionMaximumLuminancePercent() const
{
	return m_nSelectionMaximumLuminancePercent;
}

//*****************************************************************************************************************
//	private method
//*****************************************************************************************************************
Sequence< OUString > SvtOptionsDrawinglayer_Impl::impl_GetPropertyNames()
{
	// Build static list of configuration key names.
	static const OUString pProperties[] =
	{
		PROPERTYNAME_OVERLAYBUFFER		,
		PROPERTYNAME_PAINTBUFFER		,
		PROPERTYNAME_STRIPE_COLOR_A		,
		PROPERTYNAME_STRIPE_COLOR_B		,
		PROPERTYNAME_STRIPE_LENGTH		,

		// #i73602#
		PROPERTYNAME_OVERLAYBUFFER_CALC,
		PROPERTYNAME_OVERLAYBUFFER_WRITER,
		PROPERTYNAME_OVERLAYBUFFER_DRAWIMPRESS,

		// #i74769#, #i75172#
		PROPERTYNAME_PAINTBUFFER_CALC,
		PROPERTYNAME_PAINTBUFFER_WRITER,
		PROPERTYNAME_PAINTBUFFER_DRAWIMPRESS,

		// #i4219#
		PROPERTYNAME_MAXIMUMPAPERWIDTH,
		PROPERTYNAME_MAXIMUMPAPERHEIGHT,
		PROPERTYNAME_MAXIMUMPAPERLEFTMARGIN,
		PROPERTYNAME_MAXIMUMPAPERRIGHTMARGIN,
		PROPERTYNAME_MAXIMUMPAPERTOPMARGIN,
		PROPERTYNAME_MAXIMUMPAPERBOTTOMMARGIN,

        // primitives
        PROPERTYNAME_ANTIALIASING,
		PROPERTYNAME_SNAPHORVERLINESTODISCRETE,
        PROPERTYNAME_SOLIDDRAGCREATE,
        PROPERTYNAME_RENDERDECORATEDTEXTDIRECT,
        PROPERTYNAME_RENDERSIMPLETEXTDIRECT,
        PROPERTYNAME_QUADRATIC3DRENDERLIMIT,
        PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT,
		
		// #i97672# selection settings
		PROPERTYNAME_TRANSPARENTSELECTION,
		PROPERTYNAME_TRANSPARENTSELECTIONPERCENT,
		PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT
    };

	// Initialize return sequence with these list ...
	static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
	// ... and return it.
	return seqPropertyNames;
}

//*****************************************************************************************************************
//	initialize static member
//	DON'T DO IT IN YOUR HEADER!
//	see definition for further informations
//*****************************************************************************************************************
SvtOptionsDrawinglayer_Impl* SvtOptionsDrawinglayer::m_pDataContainer = NULL;
sal_Int32 SvtOptionsDrawinglayer::m_nRefCount = 0;

//*****************************************************************************************************************
//	constructor
//*****************************************************************************************************************
SvtOptionsDrawinglayer::SvtOptionsDrawinglayer()
{
    // Global access, must be guarded (multithreading!).
    MutexGuard aGuard( GetOwnStaticMutex() );
	// Increase ouer refcount ...
	++m_nRefCount;
	// ... and initialize ouer data container only if it not already!
    if( m_pDataContainer == NULL )
	{
        m_pDataContainer = new SvtOptionsDrawinglayer_Impl();
	}
}

//*****************************************************************************************************************
//	destructor
//*****************************************************************************************************************
SvtOptionsDrawinglayer::~SvtOptionsDrawinglayer()
{
    // Global access, must be guarded (multithreading!)
    MutexGuard aGuard( GetOwnStaticMutex() );
	// Decrease ouer refcount.
	--m_nRefCount;
	// If last instance was deleted ...
	// we must destroy ouer static data container!
    if( m_nRefCount <= 0 )
	{
		delete m_pDataContainer;
		m_pDataContainer = NULL;
	}
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsOverlayBuffer();
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsPaintBuffer();
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
Color SvtOptionsDrawinglayer::GetStripeColorA() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetStripeColorA();
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
Color SvtOptionsDrawinglayer::GetStripeColorB() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetStripeColorB();
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
sal_uInt16 SvtOptionsDrawinglayer::GetStripeLength() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetStripeLength();
}

// #i73602#
sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_Calc() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsOverlayBuffer_Calc();
}

sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_Writer() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsOverlayBuffer_Writer();
}

sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_DrawImpress() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsOverlayBuffer_DrawImpress();
}

// #i74769#, #i75172#
sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_Calc() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsPaintBuffer_Calc();
}

sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_Writer() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsPaintBuffer_Writer();
}

sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_DrawImpress() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsPaintBuffer_DrawImpress();
}

// #i4219#
sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperWidth() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperWidth();
}

sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperHeight() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperHeight();
}

sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperLeftMargin() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperLeftMargin();
}

sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperRightMargin() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperRightMargin();
}

sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperTopMargin() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperTopMargin();
}

sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperBottomMargin() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetMaximumPaperBottomMargin();
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer::SetOverlayBuffer( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetOverlayBuffer( bState );
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer::SetPaintBuffer( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetPaintBuffer( bState );
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer::SetStripeColorA( Color aColor )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetStripeColorA( aColor );
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer::SetStripeColorB( Color aColor )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetStripeColorB( aColor );
}

//*****************************************************************************************************************
//	public method
//*****************************************************************************************************************
void SvtOptionsDrawinglayer::SetStripeLength( sal_uInt16 nLength )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetStripeLength( nLength );
}

// #i73602#
void SvtOptionsDrawinglayer::SetOverlayBuffer_Calc( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetOverlayBuffer_Calc( bState );
}

void SvtOptionsDrawinglayer::SetOverlayBuffer_Writer( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetOverlayBuffer_Writer( bState );
}

void SvtOptionsDrawinglayer::SetOverlayBuffer_DrawImpress( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetOverlayBuffer_DrawImpress( bState );
}

// #i74769#, #i75172#
void SvtOptionsDrawinglayer::SetPaintBuffer_Calc( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetPaintBuffer_Calc( bState );
}

void SvtOptionsDrawinglayer::SetPaintBuffer_Writer( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetPaintBuffer_Writer( bState );
}

void SvtOptionsDrawinglayer::SetPaintBuffer_DrawImpress( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetPaintBuffer_DrawImpress( bState );
}

// #i4219#
void SvtOptionsDrawinglayer::SetMaximumPaperWidth( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperWidth( nNew );
}

void SvtOptionsDrawinglayer::SetMaximumPaperHeight( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperHeight( nNew );
}

void SvtOptionsDrawinglayer::SetMaximumPaperLeftMargin( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperLeftMargin( nNew );
}

void SvtOptionsDrawinglayer::SetMaximumPaperRightMargin( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperRightMargin( nNew );
}

void SvtOptionsDrawinglayer::SetMaximumPaperTopMargin( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperTopMargin( nNew );
}

void SvtOptionsDrawinglayer::SetMaximumPaperBottomMargin( sal_uInt32 nNew )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetMaximumPaperBottomMargin( nNew );
}

// helper
sal_Bool SvtOptionsDrawinglayer::IsAAPossibleOnThisSystem() const
{
	return m_pDataContainer->IsAAPossibleOnThisSystem();
}

// primitives
sal_Bool SvtOptionsDrawinglayer::IsAntiAliasing() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsAntiAliasing() && IsAAPossibleOnThisSystem();
}

sal_Bool SvtOptionsDrawinglayer::IsSnapHorVerLinesToDiscrete() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsAntiAliasing() && m_pDataContainer->IsSnapHorVerLinesToDiscrete();
}

sal_Bool SvtOptionsDrawinglayer::IsSolidDragCreate() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsSolidDragCreate();
}

sal_Bool SvtOptionsDrawinglayer::IsRenderDecoratedTextDirect() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsRenderDecoratedTextDirect();
}

sal_Bool SvtOptionsDrawinglayer::IsRenderSimpleTextDirect() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsRenderSimpleTextDirect();
}

sal_uInt32 SvtOptionsDrawinglayer::GetQuadratic3DRenderLimit() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetQuadratic3DRenderLimit();
}

sal_uInt32 SvtOptionsDrawinglayer::GetQuadraticFormControlRenderLimit() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->GetQuadraticFormControlRenderLimit();
}

void SvtOptionsDrawinglayer::SetAntiAliasing( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetAntiAliasing( bState );
}

void SvtOptionsDrawinglayer::SetSnapHorVerLinesToDiscrete( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetSnapHorVerLinesToDiscrete( bState );
}

void SvtOptionsDrawinglayer::SetSolidDragCreate( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetSolidDragCreate( bState );
}

void SvtOptionsDrawinglayer::SetRenderDecoratedTextDirect( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetRenderDecoratedTextDirect( bState );
}

void SvtOptionsDrawinglayer::SetRenderSimpleTextDirect( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetRenderSimpleTextDirect( bState );
}

void SvtOptionsDrawinglayer::SetQuadratic3DRenderLimit(sal_uInt32 nNew)
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetQuadratic3DRenderLimit( nNew );
}

void SvtOptionsDrawinglayer::SetQuadraticFormControlRenderLimit(sal_uInt32 nNew)
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetQuadraticFormControlRenderLimit( nNew );
}

// #i97672# selection settings
sal_Bool SvtOptionsDrawinglayer::IsTransparentSelection() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	return m_pDataContainer->IsTransparentSelection();
}

void SvtOptionsDrawinglayer::SetTransparentSelection( sal_Bool bState )
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	m_pDataContainer->SetTransparentSelection( bState );
}

sal_uInt16 SvtOptionsDrawinglayer::GetTransparentSelectionPercent() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	sal_uInt16 aRetval(m_pDataContainer->GetTransparentSelectionPercent());

	// crop to range [10% .. 90%]
	if(aRetval < 10)
	{
		aRetval = 10;
	}

	if(aRetval > 90)
	{
		aRetval = 90;
	}

	return aRetval;
}

void SvtOptionsDrawinglayer::SetTransparentSelectionPercent( sal_uInt16 nPercent )
{
    MutexGuard aGuard( GetOwnStaticMutex() );

    // crop to range [10% .. 90%]
	if(nPercent < 10)
	{
		nPercent = 10;
	}

	if(nPercent > 90)
	{
		nPercent = 90;
	}

    m_pDataContainer->SetTransparentSelectionPercent( nPercent );
}

sal_uInt16 SvtOptionsDrawinglayer::GetSelectionMaximumLuminancePercent() const
{
    MutexGuard aGuard( GetOwnStaticMutex() );
	sal_uInt16 aRetval(m_pDataContainer->GetSelectionMaximumLuminancePercent());

	// crop to range [0% .. 100%]
	if(aRetval > 90)
	{
		aRetval = 90;
	}

	return aRetval;
}

Color SvtOptionsDrawinglayer::getHilightColor() const
{
    Color aRetval(Application::GetSettings().GetStyleSettings().GetHighlightColor());
    const basegfx::BColor aSelection(aRetval.getBColor());
    const double fLuminance(aSelection.luminance());
    const double fMaxLum(GetSelectionMaximumLuminancePercent() / 100.0);

    if(fLuminance > fMaxLum)
    {
        const double fFactor(fMaxLum / fLuminance);
        const basegfx::BColor aNewSelection(
            aSelection.getRed() * fFactor,
            aSelection.getGreen() * fFactor,
            aSelection.getBlue() * fFactor);

        aRetval = Color(aNewSelection);
    }

    return aRetval;
}

void SvtOptionsDrawinglayer::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent )
{
    MutexGuard aGuard( GetOwnStaticMutex() );

    // crop to range [0% .. 100%]
	if(nPercent > 90)
	{
		nPercent = 90;
	}

    m_pDataContainer->SetSelectionMaximumLuminancePercent( nPercent );
}

//*****************************************************************************************************************
//	private method
//*****************************************************************************************************************
Mutex& SvtOptionsDrawinglayer::GetOwnStaticMutex()
{
	// Initialize static mutex only for one time!
    static Mutex* pMutex = NULL;
	// If these method first called (Mutex not already exist!) ...
    if( pMutex == NULL )
    {
		// ... we must create a new one. Protect follow code with the global mutex -
		// It must be - we create a static variable!
        MutexGuard aGuard( Mutex::getGlobalMutex() );
		// We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
        if( pMutex == NULL )
        {
			// Create the new mutex and set it for return on static variable.
            static Mutex aMutex;
            pMutex = &aMutex;
        }
    }
	// Return new created or already existing mutex object.
    return *pMutex;
}

// eof

