/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef _SVX_GALOBJ_HXX_
#define _SVX_GALOBJ_HXX_

#include <tools/urlobj.hxx>
#include <vcl/graph.hxx>
#include "svx/galmisc.hxx"

// -----------
// - Defines -
// -----------

#define S_THUMB 80

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

#define SGA_FORMAT_NONE					0x00000000L
#define	SGA_FORMAT_STRING				0x00000001L
#define	SGA_FORMAT_GRAPHIC				0x00000010L
#define	SGA_FORMAT_SOUND				0x00000100L
#define	SGA_FORMAT_OLE					0x00001000L
#define	SGA_FORMAT_SVDRAW				0x00010000L
#define SGA_FORMAT_ALL					0xFFFFFFFFL

// ----------------
// - GalSoundType -
// ----------------

enum GalSoundType
{
	SOUND_STANDARD = 0,
	SOUND_COMPUTER = 1,
	SOUND_MISC = 2,
	SOUND_MUSIC = 3,
	SOUND_NATURE = 4,
	SOUND_SPEECH = 5,
	SOUND_TECHNIC = 6,
	SOUND_ANIMAL = 7
};

// -------------
// - SgaObject -
// -------------

class SVX_DLLPUBLIC SgaObject
{
	friend class GalleryTheme;

private:

	void					ImplUpdateURL( const INetURLObject& rNewURL ) { aURL = rNewURL; } 

protected:

	BitmapEx				aThumbBmp; // Allow transparence to survive
	GDIMetaFile				aThumbMtf;
	INetURLObject			aURL;
	String					aUserName;
	String					aTitle;
	sal_Bool					bIsValid;
	sal_Bool					bIsThumbBmp;

	virtual void 			WriteData( SvStream& rOut, const String& rDestDir ) const;
	virtual void 			ReadData( SvStream& rIn, sal_uInt16& rReadVersion );

	sal_Bool					CreateThumb( const Graphic& rGraphic );

public:
							SgaObject();
	virtual					~SgaObject() {};

	virtual SgaObjKind		GetObjKind() const = 0;
	virtual sal_uInt16			GetVersion() const = 0;

	virtual BitmapEx		GetThumbBmp() const { return aThumbBmp; }
	const GDIMetaFile&		GetThumbMtf() const { return aThumbMtf; }
	const INetURLObject&	GetURL() const { return aURL; }
	sal_Bool					IsValid() const { return bIsValid; }
	sal_Bool					IsThumbBitmap() const { return bIsThumbBmp; }

    const String            GetTitle() const;
    void                    SetTitle( const String& rTitle );

	friend SvStream& 		operator<<( SvStream& rOut, const SgaObject& rObj );
	friend SvStream& 		operator>>( SvStream& rIn, SgaObject& rObj );

    BitmapEx createPreviewBitmapEx(const Size& rSizePixel) const;
};

// ------------------
// - SgaObjectSound -
// ------------------

class SgaObjectSound : public SgaObject
{
private:

	GalSoundType		eSoundType;

	virtual void 		WriteData( SvStream& rOut, const String& rDestDir ) const;
	virtual void 		ReadData( SvStream& rIn, sal_uInt16& rReadVersion );

	virtual sal_uInt16		GetVersion() const { return 6; }

public:

						SgaObjectSound();
						SgaObjectSound( const INetURLObject& rURL );
	virtual 	   	   ~SgaObjectSound();

	virtual SgaObjKind	GetObjKind() const { return SGA_OBJ_SOUND; }
	virtual BitmapEx	GetThumbBmp() const;
	GalSoundType		GetSoundType() const { return eSoundType; }
};

// -------------------
// - SgaObjectSvDraw -
// -------------------

class FmFormModel;

class SgaObjectSvDraw : public SgaObject
{
	using SgaObject::CreateThumb;

private:

	sal_Bool				CreateThumb( const FmFormModel& rModel );

	virtual void 		WriteData( SvStream& rOut, const String& rDestDir ) const;
	virtual void 		ReadData( SvStream& rIn, sal_uInt16& rReadVersion );

	virtual sal_uInt16		GetVersion() const { return 5; }

public:

						SgaObjectSvDraw();
						SgaObjectSvDraw( const FmFormModel& rModel, const INetURLObject& rURL );
						SgaObjectSvDraw( SvStream& rIStm, const INetURLObject& rURL );
	virtual 	   	   ~SgaObjectSvDraw() {};

	virtual SgaObjKind	GetObjKind() const { return SGA_OBJ_SVDRAW; }
};

// ----------------
// - SgaObjectBmp -
// ----------------

class SgaObjectBmp: public SgaObject
{
private:

	void				Init( const Graphic& rGraphic, const INetURLObject& rURL );

	virtual void   		WriteData( SvStream& rOut, const String& rDestDir ) const;
	virtual void   		ReadData( SvStream& rIn, sal_uInt16& rReadVersion );

	virtual sal_uInt16		GetVersion() const { return 5; }

public:

						SgaObjectBmp();
						SgaObjectBmp( const INetURLObject& rURL );
						SgaObjectBmp( const Graphic& rGraphic, const INetURLObject& rURL, const String& rFormat );
	virtual				~SgaObjectBmp() {};

	virtual SgaObjKind	GetObjKind() const { return SGA_OBJ_BMP; }
};

// -----------------
// - SgaObjectAnim -
// -----------------

class SgaObjectAnim : public SgaObjectBmp
{
private:

						SgaObjectAnim( const INetURLObject& ) {};

public:

						SgaObjectAnim();
						SgaObjectAnim( const Graphic& rGraphic, const INetURLObject& rURL, const String& rFormatName );

	virtual 	   	   ~SgaObjectAnim() {};

	virtual SgaObjKind	GetObjKind() const { return SGA_OBJ_ANIM; }
};

// -----------------
// - SgaObjectINet -
// -----------------

class SgaObjectINet : public SgaObjectAnim
{
private:

						SgaObjectINet( const INetURLObject& ) {};

public:

						SgaObjectINet();
						SgaObjectINet( const Graphic& rGraphic, const INetURLObject& rURL, const String& rFormatName );

	virtual 	   	   ~SgaObjectINet() {};

	virtual SgaObjKind	GetObjKind() const { return SGA_OBJ_INET; }
};
#endif
