/**************************************************************
 *
 * 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 _IMAPWND_HXX
#define _IMAPWND_HXX

#include <vcl/dialog.hxx>
#include <vcl/fixed.hxx>
#include <vcl/button.hxx>
#include <vcl/menu.hxx>
#include <svl/itempool.hxx>
#include <svtools/imapobj.hxx>
#include <svtools/transfer.hxx>
#include <svtools/imap.hxx>
#include <sfx2/frame.hxx>
#include <svx/graphctl.hxx>

#include <com/sun/star/frame/XFrame.hpp>

/*************************************************************************
|*
|*
|*
\************************************************************************/

struct NotifyInfo
{
	String	aMarkURL;
	String  aMarkAltText;
	String	aMarkTarget;
	sal_Bool	bNewObj;
	sal_Bool	bOneMarked;
	sal_Bool	bActivated;
};


struct NotifyPosSize
{
	Size	aPictureSize;
	Point	aMousePos;
	sal_Bool	bPictureSize;
	sal_Bool	bMousePos;
};


/*************************************************************************
|*
|*
|*
\************************************************************************/

#define SVD_IMAP_USERDATA	0x0001

const sal_uInt32 IMapInventor = sal_uInt32('I') * 0x00000001+
							sal_uInt32('M') * 0x00000100+
							sal_uInt32('A') * 0x00010000+
							sal_uInt32('P') * 0x01000000;


typedef boost::shared_ptr< IMapObject > IMapObjectPtr;

class IMapUserData : public SdrObjUserData
{
	// #i98386# use boost::shared_ptr here due to cloning possibilities
	IMapObjectPtr			mpObj;

public:

							IMapUserData() :
								SdrObjUserData	( IMapInventor, SVD_IMAP_USERDATA, 0 ),
								mpObj			( ) {}

							IMapUserData( const IMapObjectPtr& rIMapObj ) :
								SdrObjUserData	( IMapInventor, SVD_IMAP_USERDATA, 0 ),
								mpObj			( rIMapObj ) {}

							IMapUserData( const IMapUserData& rIMapUserData ) :
								SdrObjUserData	( IMapInventor, SVD_IMAP_USERDATA, 0 ),
								mpObj			( rIMapUserData.mpObj ) {}

							~IMapUserData() { }

    virtual SdrObjUserData* Clone( SdrObject * ) const { return new IMapUserData( *this ); }

	void					SetObject( const IMapObjectPtr& rIMapObj ) { mpObj = rIMapObj; }
	const IMapObjectPtr		GetObject() const { return mpObj; }
	void					ReplaceObject( const IMapObjectPtr& pNewIMapObject ) { mpObj = pNewIMapObject; }
};


/*************************************************************************
|*
|*
|*
\************************************************************************/
/* move to cui //CHINA001
class URLDlg : public ModalDialog
{
    FixedLine           aFlURL;
	FixedText			aFtURL1;
	Edit				aEdtURL;
	FixedText			aFtURLDescription;
	Edit				aEdtURLDescription;
	FixedText			aFtTarget;
	ComboBox			aCbbTargets;
	FixedText			aFtName;
	Edit				aEdtName;
	OKButton			aBtnOk;
	CancelButton		aBtnCancel;

public:

						URLDlg( Window* pWindow,
								const String& rURL, const String& rDescription,
								const String& rTarget, const String& rName,
								TargetList& rTargetList );

	String				GetURL() const { return aEdtURL.GetText(); }
	String				GetDescription() const { return aEdtURLDescription.GetText(); }
	String				GetTarget() const { return aCbbTargets.GetText(); }
	String				GetName() const { return aEdtName.GetText(); }
};
*/

/*************************************************************************
|*
|*
|*
\************************************************************************/

class IMapWindow : public GraphCtrl, public DropTargetHelper
{
	NotifyInfo			aInfo;
	ImageMap			aIMap;
	TargetList			aTargetList;
	Link				aInfoLink;
	SfxItemPool*		pIMapPool;
	SfxItemInfo*		pItemInfo;
    ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >
                        mxDocumentFrame;

						DECL_LINK( MenuSelectHdl, Menu* );
						DECL_LINK( MouseTimerHdl, Timer* );

protected:

	// GraphCtrl
	virtual void		MouseButtonUp(const MouseEvent& rMEvt);
	virtual void		Command(const CommandEvent& rCEvt);
	virtual void		RequestHelp( const HelpEvent& rHEvt );
	virtual void		SdrObjCreated( const SdrObject& rObj );
	virtual void		SdrObjChanged( const SdrObject& rObj );
	virtual void		MarkListHasChanged();
	virtual	void		InitSdrModel();

	// DropTargetHelper
	virtual sal_Int8	AcceptDrop( const AcceptDropEvent& rEvt );
	virtual sal_Int8	ExecuteDrop( const ExecuteDropEvent& rEvt );

	void				CreateImageMap();
	void				ReplaceImageMap( const ImageMap& rNewImageMap, sal_Bool bScaleToGraphic );

	void				ClearTargetList();

	SdrObject*			CreateObj( const IMapObject* pIMapObj );
	IMapObject*			GetIMapObj( const SdrObject* pSdrObj ) const;
	SdrObject*			GetSdrObj( const IMapObject* pIMapObj ) const;
	SdrObject*			GetHitSdrObj( const Point& rPosPixel ) const;

	void				UpdateInfo( sal_Bool bNewObj );

public:

						IMapWindow( Window* pParent, const ResId& rResId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rxDocumentFrame );
						~IMapWindow();

	sal_Bool				ReplaceActualIMapInfo( const NotifyInfo& rNewInfo );

	void				SetImageMap( const ImageMap& rImageMap );
	const ImageMap&		GetImageMap();

	void				SetCurrentObjState( sal_Bool bActive );
	void				DoMacroAssign();
	void				DoPropertyDialog();

	void				SetInfoLink( const Link& rLink ) { aInfoLink = rLink; }
	const Link&			GetInfoLink() const { return aInfoLink; }

	void				SetTargetList( TargetList& rTargetList );
	const TargetList&	GetTargetList() const { return aTargetList; }

	const NotifyInfo&	GetInfo() const { return aInfo; }

	void				CreateDefaultObject();
	void				SelectFirstObject();
	void				StartPolyEdit();

	virtual void		KeyInput( const KeyEvent& rKEvt );
};


#endif
