/**************************************************************
 * 
 * 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 <svx/sdr/properties/circleproperties.hxx>
#include <svl/itemset.hxx>
#include <svl/style.hxx>
#include <svx/svddef.hxx>
#include <editeng/eeitem.hxx>
#include <svx/svdocirc.hxx>
#include <svx/sxcikitm.hxx>
#include <svx/sxciaitm.hxx>
#include <svx/sxciaitm.hxx>

//////////////////////////////////////////////////////////////////////////////

namespace sdr
{
	namespace properties
	{
		// create a new itemset
		SfxItemSet& CircleProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
		{
			return *(new SfxItemSet(rPool,

				// range from SdrAttrObj
				SDRATTR_START, SDRATTR_SHADOW_LAST,
				SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
				SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,

				// range from SdrCircObj
				SDRATTR_CIRC_FIRST, SDRATTR_CIRC_LAST,

				// range from SdrTextObj
				EE_ITEMS_START, EE_ITEMS_END,

				// end
				0, 0));
		}

		CircleProperties::CircleProperties(SdrObject& rObj)
		:	RectangleProperties(rObj)
		{
		}

		CircleProperties::CircleProperties(const CircleProperties& rProps, SdrObject& rObj)
		:	RectangleProperties(rProps, rObj)
		{
		}

		CircleProperties::~CircleProperties()
		{
		}
		
		BaseProperties& CircleProperties::Clone(SdrObject& rObj) const
		{
			return *(new CircleProperties(*this, rObj));
		}

		void CircleProperties::ItemSetChanged(const SfxItemSet& rSet)
		{
			SdrCircObj& rObj = (SdrCircObj&)GetSdrObject();

			// call parent
			RectangleProperties::ItemSetChanged(rSet);

			// local changes
			rObj.ImpSetAttrToCircInfo();
		}

		void CircleProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr)
		{
			SdrCircObj& rObj = (SdrCircObj&)GetSdrObject();

			// local changes
			rObj.SetXPolyDirty();

			// call parent
			RectangleProperties::SetStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);

			// local changes
			rObj.ImpSetAttrToCircInfo();
		}

		void CircleProperties::ForceDefaultAttributes()
		{
			SdrCircObj& rObj = (SdrCircObj&)GetSdrObject();
			SdrCircKind eKindA = SDRCIRC_FULL;
			SdrObjKind eKind = rObj.GetCircleKind();

			if(eKind == OBJ_SECT)
			{
				eKindA = SDRCIRC_SECT;
			}
			else if(eKind == OBJ_CARC)
			{
				eKindA = SDRCIRC_ARC;
			}
			else if(eKind == OBJ_CCUT)
			{
				eKindA = SDRCIRC_CUT;
			}

			if(eKindA != SDRCIRC_FULL)
			{
				// force ItemSet
				GetObjectItemSet();

				mpItemSet->Put(SdrCircKindItem(eKindA));

				if(rObj.GetStartWink())
				{
					mpItemSet->Put(SdrCircStartAngleItem(rObj.GetStartWink()));
				}

				if(rObj.GetEndWink() != 36000)
				{
					mpItemSet->Put(SdrCircEndAngleItem(rObj.GetEndWink()));
				}
			}

			// call parent after SetObjectItem(SdrCircKindItem())
			// because ForceDefaultAttr() will call
			// ImpSetAttrToCircInfo() which needs a correct
			// SdrCircKindItem
			RectangleProperties::ForceDefaultAttributes();
		}
	} // end of namespace properties
} // end of namespace sdr

//////////////////////////////////////////////////////////////////////////////
// eof
