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



#include <vcl/svapp.hxx>

#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>

#include "global.hxx"
#include "globstr.hrc"
#include "cfgids.hxx"
#include "viewopti.hxx"
#include "rechead.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include "miscuno.hxx"

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

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

TYPEINIT1(ScTpViewItem,	SfxPoolItem);

#define SC_VERSION ((sal_uInt16)302)


//========================================================================
// class ScGridOptions
//========================================================================


void ScGridOptions::SetDefaults()
{
	*this = ScGridOptions();

	//	Raster-Defaults sind jetzt zwischen den Apps unterschiedlich
	//	darum hier selber eintragen (alles in 1/100mm)

	if ( ScOptionsUtil::IsMetricSystem() )
	{
		nFldDrawX = 1000;	// 1cm
		nFldDrawY = 1000;
		nFldSnapX = 1000;
		nFldSnapY = 1000;
	}
	else
	{
		nFldDrawX = 1270;	// 0,5"
		nFldDrawY = 1270;
		nFldSnapX = 1270;
		nFldSnapY = 1270;
	}
	nFldDivisionX = 1;
	nFldDivisionY = 1;
}

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

const ScGridOptions& ScGridOptions::operator=( const ScGridOptions& rCpy )
{
	nFldDrawX		= rCpy.nFldDrawX;		// UINT32
	nFldDrawX		= rCpy.nFldDrawX;
	nFldDivisionX	= rCpy.nFldDivisionX;
	nFldDrawY		= rCpy.nFldDrawY;
	nFldDivisionY	= rCpy.nFldDivisionY;
	nFldSnapX		= rCpy.nFldSnapX;
	nFldSnapY		= rCpy.nFldSnapY;
	bUseGridsnap	= rCpy.bUseGridsnap;	// BitBool
	bSynchronize	= rCpy.bSynchronize;
	bGridVisible	= rCpy.bGridVisible;
	bEqualGrid		= rCpy.bEqualGrid;

	return *this;
}

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

int ScGridOptions::operator==( const ScGridOptions& rCpy ) const
{
	return (   nFldDrawX		== rCpy.nFldDrawX
			&& nFldDrawX		== rCpy.nFldDrawX
			&& nFldDivisionX	== rCpy.nFldDivisionX
			&& nFldDrawY		== rCpy.nFldDrawY
			&& nFldDivisionY	== rCpy.nFldDivisionY
			&& nFldSnapX		== rCpy.nFldSnapX
			&& nFldSnapY		== rCpy.nFldSnapY
			&& bUseGridsnap		== rCpy.bUseGridsnap
			&& bSynchronize		== rCpy.bSynchronize
			&& bGridVisible		== rCpy.bGridVisible
			&& bEqualGrid		== rCpy.bEqualGrid );
}


//========================================================================
// class ScViewOptions
//========================================================================

ScViewOptions::ScViewOptions()
{
	SetDefaults();
}

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

ScViewOptions::ScViewOptions( const ScViewOptions& rCpy )
{
	*this = rCpy;
}

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

__EXPORT ScViewOptions::~ScViewOptions()
{
}

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

void ScViewOptions::SetDefaults()
{
	aOptArr[ VOPT_FORMULAS	  ] =
	aOptArr[ VOPT_SYNTAX	  ] =
	aOptArr[ VOPT_HELPLINES   ] = sal_False;

    aOptArr[ VOPT_NOTES		  ] =
	aOptArr[ VOPT_NULLVALS	  ] =
	aOptArr[ VOPT_VSCROLL	  ] =
	aOptArr[ VOPT_HSCROLL	  ] =
	aOptArr[ VOPT_TABCONTROLS ] =
	aOptArr[ VOPT_OUTLINER	  ] =
	aOptArr[ VOPT_HEADER	  ] =
	aOptArr[ VOPT_GRID		  ] =
	aOptArr[ VOPT_ANCHOR	  ] =
	aOptArr[ VOPT_PAGEBREAKS  ] =
	aOptArr[ VOPT_SOLIDHANDLES] =   // default is enhanced handles
	aOptArr[ VOPT_BIGHANDLES  ] =   // default is big handles
	aOptArr[ VOPT_CLIPMARKS	  ] = sal_True;

	aModeArr[VOBJ_TYPE_OLE ]  =
	aModeArr[VOBJ_TYPE_CHART] =
	aModeArr[VOBJ_TYPE_DRAW ] = VOBJ_MODE_SHOW;

	aGridCol     = Color( SC_STD_GRIDCOLOR );
	aGridColName = ScGlobal::GetRscString( STR_GRIDCOLOR );

	aGridOpt.SetDefaults();
}

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

Color ScViewOptions::GetGridColor( String* pStrName ) const
{
	if ( pStrName )
		*pStrName = aGridColName;

	return aGridCol;
}

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

const ScViewOptions& ScViewOptions::operator=( const ScViewOptions& rCpy )
{
	sal_uInt16 i;

	for ( i=0; i<MAX_OPT; i++ )	 aOptArr [i] = rCpy.aOptArr[i];
	for ( i=0; i<MAX_TYPE; i++ ) aModeArr[i] = rCpy.aModeArr[i];

	aGridCol     	= rCpy.aGridCol;
	aGridColName 	= rCpy.aGridColName;
	aGridOpt		= rCpy.aGridOpt;

	return *this;
}

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

int ScViewOptions::operator==( const ScViewOptions& rOpt ) const
{
	sal_Bool	bEqual = sal_True;
	sal_uInt16	i;

	for ( i=0; i<MAX_OPT && bEqual; i++ )  bEqual = (aOptArr [i] == rOpt.aOptArr[i]);
	for ( i=0; i<MAX_TYPE && bEqual; i++ ) bEqual = (aModeArr[i] == rOpt.aModeArr[i]);

	bEqual = bEqual && (aGridCol       == rOpt.aGridCol);
	bEqual = bEqual && (aGridColName   == rOpt.aGridColName);
	bEqual = bEqual && (aGridOpt 	   == rOpt.aGridOpt);

	return bEqual;
}

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

SvxGridItem* ScViewOptions::CreateGridItem( sal_uInt16 nId /* = SID_ATTR_GRID_OPTIONS */ ) const
{
	SvxGridItem* pItem = new SvxGridItem( nId );

	pItem->SetFldDrawX		( aGridOpt.GetFldDrawX() );
	pItem->SetFldDivisionX	( aGridOpt.GetFldDivisionX() );
	pItem->SetFldDrawY   	( aGridOpt.GetFldDrawY() );
	pItem->SetFldDivisionY	( aGridOpt.GetFldDivisionY() );
	pItem->SetFldSnapX		( aGridOpt.GetFldSnapX() );
	pItem->SetFldSnapY   	( aGridOpt.GetFldSnapY() );
	pItem->SetUseGridSnap	( aGridOpt.GetUseGridSnap() );
	pItem->SetSynchronize	( aGridOpt.GetSynchronize() );
	pItem->SetGridVisible	( aGridOpt.GetGridVisible() );
	pItem->SetEqualGrid		( aGridOpt.GetEqualGrid() );

	return pItem;
}

//========================================================================
//      ScTpViewItem - Daten fuer die ViewOptions-TabPage
//========================================================================

//UNUSED2008-05  ScTpViewItem::ScTpViewItem( sal_uInt16 nWhichP ) : SfxPoolItem( nWhichP )
//UNUSED2008-05  {
//UNUSED2008-05  }

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

ScTpViewItem::ScTpViewItem( sal_uInt16 nWhichP, const ScViewOptions& rOpt )
    :   SfxPoolItem ( nWhichP ),
		theOptions	( rOpt )
{
}

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

ScTpViewItem::ScTpViewItem( const ScTpViewItem& rItem )
	:   SfxPoolItem	( rItem ),
		theOptions	( rItem.theOptions )
{
}

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

__EXPORT ScTpViewItem::~ScTpViewItem()
{
}

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

String __EXPORT ScTpViewItem::GetValueText() const
{
	return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("ScTpViewItem") );
}

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

int __EXPORT ScTpViewItem::operator==( const SfxPoolItem& rItem ) const
{
	DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal Which or Type" );

	const ScTpViewItem& rPItem = (const ScTpViewItem&)rItem;

	return ( theOptions == rPItem.theOptions );
}

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

SfxPoolItem* __EXPORT ScTpViewItem::Clone( SfxItemPool * ) const
{
	return new ScTpViewItem( *this );
}

//==================================================================
//	Config Item containing view options
//==================================================================

#define CFGPATH_LAYOUT		"Office.Calc/Layout"

#define SCLAYOUTOPT_GRIDLINES		0
#define SCLAYOUTOPT_GRIDCOLOR		1
#define SCLAYOUTOPT_PAGEBREAK		2
#define SCLAYOUTOPT_GUIDE			3
#define SCLAYOUTOPT_SIMPLECONT		4
#define SCLAYOUTOPT_LARGECONT		5
#define SCLAYOUTOPT_COLROWHDR		6
#define SCLAYOUTOPT_HORISCROLL		7
#define SCLAYOUTOPT_VERTSCROLL		8
#define SCLAYOUTOPT_SHEETTAB		9
#define SCLAYOUTOPT_OUTLINE			10
#define SCLAYOUTOPT_COUNT			11

#define CFGPATH_DISPLAY		"Office.Calc/Content/Display"

#define SCDISPLAYOPT_FORMULA		0
#define SCDISPLAYOPT_ZEROVALUE		1
#define SCDISPLAYOPT_NOTETAG		2
#define SCDISPLAYOPT_VALUEHI		3
#define SCDISPLAYOPT_ANCHOR			4
#define SCDISPLAYOPT_TEXTOVER		5
#define SCDISPLAYOPT_OBJECTGRA		6
#define SCDISPLAYOPT_CHART			7
#define SCDISPLAYOPT_DRAWING		8
#define SCDISPLAYOPT_COUNT			9

#define CFGPATH_GRID		"Office.Calc/Grid"

#define SCGRIDOPT_RESOLU_X			0
#define SCGRIDOPT_RESOLU_Y			1
#define SCGRIDOPT_SUBDIV_X			2
#define SCGRIDOPT_SUBDIV_Y			3
#define SCGRIDOPT_OPTION_X			4
#define SCGRIDOPT_OPTION_Y			5
#define SCGRIDOPT_SNAPTOGRID		6
#define SCGRIDOPT_SYNCHRON			7
#define SCGRIDOPT_VISIBLE			8
#define SCGRIDOPT_SIZETOGRID		9
#define SCGRIDOPT_COUNT				10


Sequence<OUString> ScViewCfg::GetLayoutPropertyNames()
{
	static const char* aPropNames[] =
	{
		"Line/GridLine",			// SCLAYOUTOPT_GRIDLINES
		"Line/GridLineColor",		// SCLAYOUTOPT_GRIDCOLOR
		"Line/PageBreak",			// SCLAYOUTOPT_PAGEBREAK
		"Line/Guide",				// SCLAYOUTOPT_GUIDE
		"Line/SimpleControlPoint",	// SCLAYOUTOPT_SIMPLECONT
		"Line/LargeControlPoint",	// SCLAYOUTOPT_LARGECONT
		"Window/ColumnRowHeader",	// SCLAYOUTOPT_COLROWHDR
		"Window/HorizontalScroll",	// SCLAYOUTOPT_HORISCROLL
		"Window/VerticalScroll",	// SCLAYOUTOPT_VERTSCROLL
		"Window/SheetTab",			// SCLAYOUTOPT_SHEETTAB
		"Window/OutlineSymbol"		// SCLAYOUTOPT_OUTLINE
	};
	Sequence<OUString> aNames(SCLAYOUTOPT_COUNT);
	OUString* pNames = aNames.getArray();
	for(int i = 0; i < SCLAYOUTOPT_COUNT; i++)
		pNames[i] = OUString::createFromAscii(aPropNames[i]);

	return aNames;
}

Sequence<OUString> ScViewCfg::GetDisplayPropertyNames()
{
	static const char* aPropNames[] =
	{
		"Formula",					// SCDISPLAYOPT_FORMULA
		"ZeroValue",				// SCDISPLAYOPT_ZEROVALUE
		"NoteTag",					// SCDISPLAYOPT_NOTETAG
		"ValueHighlighting",		// SCDISPLAYOPT_VALUEHI
		"Anchor",					// SCDISPLAYOPT_ANCHOR
		"TextOverflow",				// SCDISPLAYOPT_TEXTOVER
		"ObjectGraphic",			// SCDISPLAYOPT_OBJECTGRA
		"Chart",					// SCDISPLAYOPT_CHART
		"DrawingObject"				// SCDISPLAYOPT_DRAWING
	};
	Sequence<OUString> aNames(SCDISPLAYOPT_COUNT);
	OUString* pNames = aNames.getArray();
	for(int i = 0; i < SCDISPLAYOPT_COUNT; i++)
		pNames[i] = OUString::createFromAscii(aPropNames[i]);

	return aNames;
}

Sequence<OUString> ScViewCfg::GetGridPropertyNames()
{
	static const char* aPropNames[] =
	{
		"Resolution/XAxis/NonMetric",	// SCGRIDOPT_RESOLU_X
		"Resolution/YAxis/NonMetric",	// SCGRIDOPT_RESOLU_Y
		"Subdivision/XAxis",			// SCGRIDOPT_SUBDIV_X
		"Subdivision/YAxis",			// SCGRIDOPT_SUBDIV_Y
		"Option/XAxis/NonMetric",		// SCGRIDOPT_OPTION_X
		"Option/YAxis/NonMetric",		// SCGRIDOPT_OPTION_Y
		"Option/SnapToGrid",			// SCGRIDOPT_SNAPTOGRID
		"Option/Synchronize",			// SCGRIDOPT_SYNCHRON
		"Option/VisibleGrid",			// SCGRIDOPT_VISIBLE
		"Option/SizeToGrid"				// SCGRIDOPT_SIZETOGRID
	};
	Sequence<OUString> aNames(SCGRIDOPT_COUNT);
	OUString* pNames = aNames.getArray();
	for(int i = 0; i < SCGRIDOPT_COUNT; i++)
		pNames[i] = OUString::createFromAscii(aPropNames[i]);

	//	adjust for metric system
	if (ScOptionsUtil::IsMetricSystem())
	{
		pNames[SCGRIDOPT_RESOLU_X] = OUString::createFromAscii( "Resolution/XAxis/Metric" );
		pNames[SCGRIDOPT_RESOLU_Y] = OUString::createFromAscii( "Resolution/YAxis/Metric" );
		pNames[SCGRIDOPT_OPTION_X] = OUString::createFromAscii( "Option/XAxis/Metric" );
		pNames[SCGRIDOPT_OPTION_Y] = OUString::createFromAscii( "Option/YAxis/Metric" );
	}

	return aNames;
}


ScViewCfg::ScViewCfg() :
	aLayoutItem( OUString::createFromAscii( CFGPATH_LAYOUT ) ),
	aDisplayItem( OUString::createFromAscii( CFGPATH_DISPLAY ) ),
	aGridItem( OUString::createFromAscii( CFGPATH_GRID ) )
{
	sal_Int32 nIntVal = 0;

	Sequence<OUString> aNames = GetLayoutPropertyNames();
	Sequence<Any> aValues = aLayoutItem.GetProperties(aNames);
	aLayoutItem.EnableNotification(aNames);
	const Any* pValues = aValues.getConstArray();
	DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
	if(aValues.getLength() == aNames.getLength())
	{
		for(int nProp = 0; nProp < aNames.getLength(); nProp++)
		{
			DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
			if(pValues[nProp].hasValue())
			{
				switch(nProp)
				{
					case SCLAYOUTOPT_GRIDCOLOR:
						if ( pValues[nProp] >>= nIntVal )
							SetGridColor( Color(nIntVal), EMPTY_STRING );
						break;
					case SCLAYOUTOPT_GRIDLINES:
						SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_PAGEBREAK:
						SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_GUIDE:
						SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_SIMPLECONT:
						// content is reversed
						SetOption( VOPT_SOLIDHANDLES, !ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_LARGECONT:
						SetOption( VOPT_BIGHANDLES, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_COLROWHDR:
						SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_HORISCROLL:
						SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_VERTSCROLL:
						SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_SHEETTAB:
						SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCLAYOUTOPT_OUTLINE:
						SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
				}
			}
		}
	}
	aLayoutItem.SetCommitLink( LINK( this, ScViewCfg, LayoutCommitHdl ) );

	aNames = GetDisplayPropertyNames();
	aValues = aDisplayItem.GetProperties(aNames);
	aDisplayItem.EnableNotification(aNames);
	pValues = aValues.getConstArray();
	DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
	if(aValues.getLength() == aNames.getLength())
	{
		for(int nProp = 0; nProp < aNames.getLength(); nProp++)
		{
			DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
			if(pValues[nProp].hasValue())
			{
				switch(nProp)
				{
					case SCDISPLAYOPT_FORMULA:
						SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_ZEROVALUE:
						SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_NOTETAG:
						SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_VALUEHI:
						SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_ANCHOR:
						SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_TEXTOVER:
						SetOption( VOPT_CLIPMARKS, ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCDISPLAYOPT_OBJECTGRA:
						if ( pValues[nProp] >>= nIntVal )
						{
							//#i80528# adapt to new range eventually
							if((sal_Int32)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int32)VOBJ_MODE_SHOW;

							SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal);
						}
						break;
					case SCDISPLAYOPT_CHART:
						if ( pValues[nProp] >>= nIntVal )
						{
							//#i80528# adapt to new range eventually
							if((sal_Int32)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int32)VOBJ_MODE_SHOW;

							SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal);
						}
						break;
					case SCDISPLAYOPT_DRAWING:
						if ( pValues[nProp] >>= nIntVal )
						{
							//#i80528# adapt to new range eventually
							if((sal_Int32)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int32)VOBJ_MODE_SHOW;

							SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal);
						}
						break;
				}
			}
		}
	}
	aDisplayItem.SetCommitLink( LINK( this, ScViewCfg, DisplayCommitHdl ) );

	ScGridOptions aGrid = GetGridOptions();		//! initialization necessary?
	aNames = GetGridPropertyNames();
	aValues = aGridItem.GetProperties(aNames);
	aGridItem.EnableNotification(aNames);
	pValues = aValues.getConstArray();
	DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
	if(aValues.getLength() == aNames.getLength())
	{
		for(int nProp = 0; nProp < aNames.getLength(); nProp++)
		{
			DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
			if(pValues[nProp].hasValue())
			{
				switch(nProp)
				{
					case SCGRIDOPT_RESOLU_X:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldDrawX( nIntVal );
						break;
					case SCGRIDOPT_RESOLU_Y:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldDrawY( nIntVal );
						break;
					case SCGRIDOPT_SUBDIV_X:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldDivisionX( nIntVal );
						break;
					case SCGRIDOPT_SUBDIV_Y:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldDivisionY( nIntVal );
						break;
					case SCGRIDOPT_OPTION_X:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldSnapX( nIntVal );
						break;
					case SCGRIDOPT_OPTION_Y:
						if (pValues[nProp] >>= nIntVal) aGrid.SetFldSnapY( nIntVal );
						break;
					case SCGRIDOPT_SNAPTOGRID:
						aGrid.SetUseGridSnap( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCGRIDOPT_SYNCHRON:
						aGrid.SetSynchronize( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCGRIDOPT_VISIBLE:
						aGrid.SetGridVisible( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
					case SCGRIDOPT_SIZETOGRID:
						aGrid.SetEqualGrid( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
						break;
				}
			}
		}
	}
	SetGridOptions( aGrid );
	aGridItem.SetCommitLink( LINK( this, ScViewCfg, GridCommitHdl ) );
}

IMPL_LINK( ScViewCfg, LayoutCommitHdl, void *, EMPTYARG )
{
	Sequence<OUString> aNames = GetLayoutPropertyNames();
	Sequence<Any> aValues(aNames.getLength());
	Any* pValues = aValues.getArray();

	for(int nProp = 0; nProp < aNames.getLength(); nProp++)
	{
		switch(nProp)
		{
			case SCLAYOUTOPT_GRIDCOLOR:
				pValues[nProp] <<= (sal_Int32) GetGridColor().GetColor();
				break;
			case SCLAYOUTOPT_GRIDLINES:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_GRID ) );
				break;
			case SCLAYOUTOPT_PAGEBREAK:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_PAGEBREAKS ) );
				break;
			case SCLAYOUTOPT_GUIDE:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_HELPLINES ) );
				break;
			case SCLAYOUTOPT_SIMPLECONT:
				// content is reversed
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], !GetOption( VOPT_SOLIDHANDLES ) );
				break;
			case SCLAYOUTOPT_LARGECONT:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_BIGHANDLES ) );
				break;
			case SCLAYOUTOPT_COLROWHDR:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_HEADER ) );
				break;
			case SCLAYOUTOPT_HORISCROLL:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_HSCROLL ) );
				break;
			case SCLAYOUTOPT_VERTSCROLL:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_VSCROLL ) );
				break;
			case SCLAYOUTOPT_SHEETTAB:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_TABCONTROLS ) );
				break;
			case SCLAYOUTOPT_OUTLINE:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_OUTLINER ) );
				break;
		}
	}
	aLayoutItem.PutProperties(aNames, aValues);

	return 0;
}

IMPL_LINK( ScViewCfg, DisplayCommitHdl, void *, EMPTYARG )
{
	Sequence<OUString> aNames = GetDisplayPropertyNames();
	Sequence<Any> aValues(aNames.getLength());
	Any* pValues = aValues.getArray();

	for(int nProp = 0; nProp < aNames.getLength(); nProp++)
	{
		switch(nProp)
		{
			case SCDISPLAYOPT_FORMULA:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_FORMULAS ) );
				break;
			case SCDISPLAYOPT_ZEROVALUE:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_NULLVALS ) );
				break;
			case SCDISPLAYOPT_NOTETAG:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_NOTES ) );
				break;
			case SCDISPLAYOPT_VALUEHI:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_SYNTAX ) );
				break;
			case SCDISPLAYOPT_ANCHOR:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_ANCHOR ) );
				break;
			case SCDISPLAYOPT_TEXTOVER:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], GetOption( VOPT_CLIPMARKS ) );
				break;
			case SCDISPLAYOPT_OBJECTGRA:
				pValues[nProp] <<= (sal_Int32) GetObjMode( VOBJ_TYPE_OLE );
				break;
			case SCDISPLAYOPT_CHART:
				pValues[nProp] <<= (sal_Int32) GetObjMode( VOBJ_TYPE_CHART );
				break;
			case SCDISPLAYOPT_DRAWING:
				pValues[nProp] <<= (sal_Int32) GetObjMode( VOBJ_TYPE_DRAW );
				break;
		}
	}
	aDisplayItem.PutProperties(aNames, aValues);

	return 0;
}

IMPL_LINK( ScViewCfg, GridCommitHdl, void *, EMPTYARG )
{
	const ScGridOptions& rGrid = GetGridOptions();

	Sequence<OUString> aNames = GetGridPropertyNames();
	Sequence<Any> aValues(aNames.getLength());
	Any* pValues = aValues.getArray();

	for(int nProp = 0; nProp < aNames.getLength(); nProp++)
	{
		switch(nProp)
		{
			case SCGRIDOPT_RESOLU_X:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldDrawX();
				break;
			case SCGRIDOPT_RESOLU_Y:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldDrawY();
				break;
			case SCGRIDOPT_SUBDIV_X:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldDivisionX();
				break;
			case SCGRIDOPT_SUBDIV_Y:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldDivisionY();
				break;
			case SCGRIDOPT_OPTION_X:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldSnapX();
				break;
			case SCGRIDOPT_OPTION_Y:
				pValues[nProp] <<= (sal_Int32) rGrid.GetFldSnapY();
				break;
			case SCGRIDOPT_SNAPTOGRID:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], rGrid.GetUseGridSnap() );
				break;
			case SCGRIDOPT_SYNCHRON:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], rGrid.GetSynchronize() );
				break;
			case SCGRIDOPT_VISIBLE:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], rGrid.GetGridVisible() );
				break;
			case SCGRIDOPT_SIZETOGRID:
				ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], rGrid.GetEqualGrid() );
				break;
		}
	}
	aGridItem.PutProperties(aNames, aValues);

	return 0;
}

void ScViewCfg::SetOptions( const ScViewOptions& rNew )
{
	*(ScViewOptions*)this = rNew;
	aLayoutItem.SetModified();
	aDisplayItem.SetModified();
	aGridItem.SetModified();
}


