//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Defines the interface that tools implement to allow views to call
//			through them.
//
//===========================================================================//

#ifndef TOOLINTERFACE_H
#define TOOLINTERFACE_H
#ifdef _WIN32
#pragma once
#endif


class CMapView2D;
class CMapView3D;
class CMapViewLogical;
class CRender2D;
class CRender3D;
class CMapDoc;
class CMapClass;
class Vector2D;
class CChunkFile;
class CSaveInfo;

#define	HANDLE_RADIUS		4

enum ChunkFileResult_t;


enum ToolID_t
{
	TOOL_NONE = -1,
	TOOL_POINTER,
	TOOL_BLOCK,
	TOOL_ENTITY,
	TOOL_CAMERA,
	TOOL_DECAL,
	TOOL_MAGNIFY,
	TOOL_MORPH,
	TOOL_CLIPPER,
	TOOL_EDITCORDON,
	TOOL_FACEEDIT_MATERIAL,
	TOOL_FACEEDIT_DISP,
	TOOL_OVERLAY,
	TOOL_AXIS_HANDLE,
	TOOL_POINT_HANDLE,
	TOOL_SPHERE,
	TOOL_PICK_FACE,
	TOOL_PICK_ENTITY,
	TOOL_PICK_ANGLES,
	TOOL_SWEPT_HULL,
	TOOL_PLAYERHULL_HANDLE,
};

enum
{
	constrainNone		= 0x00,	// transformation with no constrains
	constrainOnlyHorz	= 0x01,	// only horizontal translations
	constrainOnlyVert	= 0x02, // only vertical translations
	constrainSnap		= 0x04,	// rounds to document snap grid
	constrainIntSnap	= 0x08,	// rounds value to one unit (integer)
	constrainHalfSnap	= 0x10, // rounds to half of snap grid
	constrainCenter		= 0x20,
	constrainMoveAll	= 0x40, // translate all handles
};


class CBaseTool
{
public:

	inline CBaseTool();
    virtual ~CBaseTool() {}

	//
	// Called by the tool manager to activate/deactivate tools.
	//

	virtual void Init( CMapDoc *pDocument );

    void Activate();
    void Deactivate();
	virtual bool CanDeactivate( void ) { return true; }

	virtual bool IsTranslating(void) { return false; }	// return true if tool is currently changing objects
	inline bool IsActiveTool( void ) { return m_bActiveTool; }

	// true if tool has objects to work on
	virtual bool IsEmpty() { return m_bEmpty; }

	// detach tool from any object working on
	virtual void SetEmpty() { m_bEmpty = true; }

	// attach a certain object to that tool
	virtual void Attach(CMapClass *pObject) {};

	//
	// Notifications for tool activation/deactivation.
	//
    virtual void OnActivate() {}
    virtual void OnDeactivate() {}

	virtual ToolID_t GetToolID(void) { return TOOL_NONE; }

	virtual const char* GetVMFChunkName() { return NULL; }
	virtual ChunkFileResult_t LoadVMF(CChunkFile *pFile) { return (ChunkFileResult_t)0; /*ChunkFile_Ok*/ }
	virtual ChunkFileResult_t SaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo) { return (ChunkFileResult_t)0 ; /*ChunkFile_Ok*/ }
	//
	// Messages sent by the 3D view:
	//
	virtual bool OnContextMenu3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint) { return false; }
	virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseDblClk3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnMouseWheel3D( CMapView3D *pView, UINT nFlags, short zDelta, const Vector2D &vPoint) { return false; }

	virtual bool OnKeyDown3D( CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnKeyUp3D( CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnChar3D( CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }

	//
	// Messages sent by the 2D view:
	//
	virtual bool OnContextMenu2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint) { return false; }
	virtual bool OnLMouseDown2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseUp2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseDblClk2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseDown2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseUp2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnMouseMove2D( CMapView2D *pView, UINT nFlags, const Vector2D &vPoint ) { return true; }
	virtual bool OnMouseWheel2D( CMapView2D *pView, UINT nFlags, short zDelta, const Vector2D &vPoint) { return false; }

	virtual bool OnKeyDown2D( CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnKeyUp2D( CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnChar2D( CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }

	//
	// Messages sent by the logical view:
	//
	virtual bool OnContextMenuLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint) { return false; }
	virtual bool OnLMouseDownLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseUpLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnLMouseDblClkLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseDownLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnRMouseUpLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return false; }
	virtual bool OnMouseMoveLogical( CMapViewLogical *pView, UINT nFlags, const Vector2D &vPoint ) { return true; }
	virtual bool OnMouseWheelLogical( CMapViewLogical *pView, UINT nFlags, short zDelta, const Vector2D &vPoint) { return false; }

	virtual bool OnKeyDownLogical( CMapViewLogical *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnKeyUpLogical( CMapViewLogical *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }
	virtual bool OnCharLogical( CMapViewLogical *pView, UINT nChar, UINT nRepCnt, UINT nFlags ) { return false; }

	//
	// Rendering.
	//
	virtual void RenderTool2D( CRender2D *pRender ) {}
	virtual void RenderToolLogical( CRender2D *pRender ) {}
	virtual void RenderTool3D( CRender3D *pRender ) {}
	virtual void UpdateStatusBar( void ) {}

protected:

	bool m_bActiveTool;		// Set to true when this is the active tool.
	bool m_bEmpty;		// true if the tool has objects to work on
	CMapDoc *m_pDocument;
};


//-----------------------------------------------------------------------------
// Purpose: Constructor.
//-----------------------------------------------------------------------------
CBaseTool::CBaseTool()
{
	m_bEmpty = true;
	m_bActiveTool = false;
	m_pDocument = NULL;
}

#endif // TOOLINTERFACE_H