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

// INCLUDE ---------------------------------------------------------------

#ifndef GCC
#endif

#include <sfx2/styfitem.hxx>
#include <svtools/localresaccess.hxx>
#include <tools/debug.hxx>

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

class SfxStyleFamilyItem_Impl
{
	Bitmap aBitmap;
	Image   aImage;
};

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

// Implementierung des Resource-Konstruktors

SfxStyleFamilyItem::SfxStyleFamilyItem( const ResId &rResId ) :

	Resource( rResId.SetRT( RSC_SFX_STYLE_FAMILY_ITEM ) )

{
	sal_uIntPtr nMask = ReadLongRes();

	if(nMask & RSC_SFX_STYLE_ITEM_LIST)
	{
		sal_uIntPtr nCount = ReadLongRes();
		for( sal_uIntPtr i = 0; i < nCount; i++ )
		{
			SfxFilterTupel *pTupel = new SfxFilterTupel;
			pTupel->aName = ReadStringRes();
			long lFlags = ReadLongRes();
			pTupel->nFlags = (sal_uInt16)lFlags;
			aFilterList.Insert(pTupel, LIST_APPEND);
		}
	}
	if(nMask & RSC_SFX_STYLE_ITEM_BITMAP)
	{
		aBitmap = Bitmap(ResId((RSHEADER_TYPE *)GetClassRes(),*rResId.GetResMgr()));
		IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) );
	}
	if(nMask & RSC_SFX_STYLE_ITEM_TEXT)
	{
		aText = ReadStringRes();
	}
	if(nMask & RSC_SFX_STYLE_ITEM_HELPTEXT)
	{
		aHelpText = ReadStringRes();
	}
	if(nMask & RSC_SFX_STYLE_ITEM_STYLEFAMILY)
	{
		nFamily = (sal_uInt16)ReadLongRes();
	}
	else
		nFamily = SFX_STYLE_FAMILY_PARA;
	if(nMask & RSC_SFX_STYLE_ITEM_IMAGE)
	{
		aImage = Image(ResId((RSHEADER_TYPE *)GetClassRes(),*rResId.GetResMgr()));
		IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) );
	}
	else
		aImage = Image(aBitmap);
}

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

// Destruktor; gibt interne Daten frei

SfxStyleFamilyItem::~SfxStyleFamilyItem()
{
	SfxFilterTupel *pTupel = aFilterList.First();
	while(pTupel)
	{
		delete pTupel;
		pTupel = aFilterList.Next();
	}
}

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

// Implementierung des Resource-Konstruktors

SfxStyleFamilies::SfxStyleFamilies( const ResId& rResId ) :

	Resource( rResId.SetRT( RSC_SFX_STYLE_FAMILIES ).SetAutoRelease( sal_False ) ),
	aEntryList( 4, 1 )
{
	sal_uIntPtr nCount = ReadLongRes();
	for( sal_uIntPtr i = 0; i < nCount; i++ )
	{
		const ResId aResId((RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr());
		SfxStyleFamilyItem *pItem = new SfxStyleFamilyItem(aResId);
		IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) );
		aEntryList.Insert(pItem, LIST_APPEND);
	}

	FreeResource();

	updateImages( rResId, BMP_COLOR_NORMAL );
}

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

// Destruktor; gibt interne Daten frei

SfxStyleFamilies::~SfxStyleFamilies()
{
	SfxStyleFamilyItem *pItem = aEntryList.First();

	while(pItem)
	{
		delete pItem;
		pItem = aEntryList.Next();
	}
}


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

sal_Bool SfxStyleFamilies::updateImages( const ResId& _rId, const BmpColorMode _eMode )
{
	sal_Bool bSuccess = sal_False;

	{
		::svt::OLocalResourceAccess aLocalRes( _rId );

		// check if the image list is present
		ResId aImageListId( (sal_uInt16)_eMode + 1, *_rId.GetResMgr() );
		aImageListId.SetRT( RSC_IMAGELIST );

		if ( aLocalRes.IsAvailableRes( aImageListId ) )
		{	// there is such a list
			ImageList aImages( aImageListId );

			// number of styles items/images
			sal_uInt16 nCount = aImages.GetImageCount( );
			DBG_ASSERT( Count() == nCount, "SfxStyleFamilies::updateImages: found the image list, but missing some bitmaps!" );
			if ( nCount > Count() )
				nCount = Count();

			// set the images on the items
			for ( sal_uInt16 i = 0; i < nCount; ++i )
			{
				SfxStyleFamilyItem* pItem = static_cast< SfxStyleFamilyItem* >( aEntryList.GetObject( i ) );
				pItem->SetImage( aImages.GetImage( aImages.GetImageId( i ) ) );
			}

			bSuccess = sal_True;
		}
	}

	return bSuccess;
}
