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

#include "sdpage.hxx"
#include "View.hxx"
#include "pres.hxx"

namespace sd {

static bool implIsMultiPresObj( PresObjKind eKind )
{
	switch( eKind )
	{
	case PRESOBJ_OUTLINE:
	case PRESOBJ_GRAPHIC:
	case PRESOBJ_OBJECT:
	case PRESOBJ_CHART:
	case PRESOBJ_ORGCHART:
	case PRESOBJ_TABLE:
	case PRESOBJ_IMAGE:
	case PRESOBJ_MEDIA:
		return true;
	default:
		return false;
	}
}

SdrObject* View::GetEmptyPresentationObject( PresObjKind eKind )
{
	SdrObject* pEmptyObj = 0;

	SdrPageView*	pPV = GetSdrPageView();
	if( pPV )
	{
		SdPage* pPage = static_cast< SdPage* >( pPV->GetPage() );
		if( pPage && !pPage->IsMasterPage() )
		{
			// first try selected shape
			if ( AreObjectsMarked() )
			{
				/**********************************************************
				* Is an empty graphic object available?
				**********************************************************/
				const SdrMarkList& rMarkList = GetMarkedObjectList();

				if (rMarkList.GetMarkCount() == 1)
				{
					SdrMark* pMark = rMarkList.GetMark(0);
					SdrObject* pObj = pMark->GetMarkedSdrObj();

					if( pObj->IsEmptyPresObj() && implIsMultiPresObj( pPage->GetPresObjKind(pObj) ) )
						pEmptyObj = pObj;
				}
			}

			// try to find empty pres obj of same type
			if( !pEmptyObj )
			{
				int nIndex = 1;
				do
				{
					pEmptyObj = pPage->GetPresObj(eKind, nIndex++ );
				}
				while( (pEmptyObj != 0) && (!pEmptyObj->IsEmptyPresObj()) );
			}

			// last try to find empty pres obj of multiple type
			if( !pEmptyObj )
			{
				const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();

    			for( std::list< SdrObject* >::const_iterator iter( rShapes.begin() ); iter != rShapes.end(); iter++ )
    			{
    				if( (*iter)->IsEmptyPresObj() && implIsMultiPresObj(pPage->GetPresObjKind(*iter)) )
    				{
						pEmptyObj = (*iter);
						break;
					}
				}
			}
		}
	}

	return pEmptyObj;
}

}
