/* AbiSource Application Framework
 * Copyright (C) 1998 AbiSource, Inc.
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  
 * 02111-1307, USA.
 */

#ifndef XAP_Dialog_Insert_Symbol_H
#define XAP_Dialog_Insert_Symbol_H

/* #include "xap_Frame.h" */
#include "xap_Dialog.h"
/* #include "xap_Draw_Symbol.h" */
#include "gr_Graphics.h"

/* #include "xav_View.h" */
class AV_View;

class XAP_Frame;
class XAP_Draw_Symbol;

class ABI_EXPORT XAP_Insert_symbol_listener
	{
	public:
		virtual ~XAP_Insert_symbol_listener() {}

		virtual void setView( AV_View * /*pJustPocussedView*/) {};
		virtual bool insertSymbol(UT_UCSChar Char, const char *p_font_name) = 0;
	};

class ABI_EXPORT XAP_Dialog_Insert_Symbol : public XAP_Dialog_Modeless
{
 public:
	XAP_Dialog_Insert_Symbol(XAP_DialogFactory * pDlgFactory, XAP_Dialog_Id id);
	virtual ~XAP_Dialog_Insert_Symbol(void);

	//------------------------------------------------------------
	// All these are needed for a modeless dialog

	virtual void     useStart(void);
	virtual void     useEnd(void);
	virtual void	 runModal(XAP_Frame * pFrame) = 0;
	virtual void	 runModeless(XAP_Frame * pFrame) = 0;
        virtual void     destroy(void)=0;
        virtual void     activate(void)=0;
	void		 setActiveFrame(XAP_Frame *pFrame);
	virtual void		notifyActiveFrame(XAP_Frame *pFrame) = 0;

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

        void             ConstructWindowName(void);
	// read these back
	UT_UCSChar	     getInsertedSymbol(void);
	char *     getInsertedFont(void);
	typedef enum { a_OK, a_CANCEL} tAnswer;
	XAP_Dialog_Insert_Symbol::tAnswer    getAnswer(void) const;
	void setListener(XAP_Insert_symbol_listener *p_listener_in)
	{
		m_pListener = p_listener_in;
	}

 protected:
	// handle the XP-job of drawing our symbols.
	void   _updateDrawSymbol();

	// handle the XP-job of laying out  our matrix of symbols
	void   _createSymbolFromGC(GR_Graphics * gc, UT_uint32 width,
							   UT_uint32 height);

	// handle the XP-job of drawing our symbol onto the preview area.
	void   _updateDrawSymbolarea( UT_UCSChar c, UT_UCSChar p);

	// handle the XP-job of constructing the preview area
	void   _createSymbolareaFromGC(GR_Graphics * gc, UT_uint32 width,
								   UT_uint32 height);
	void   _onInsertButton();
	void   _insert(UT_UCSChar c, const char* symfont);

	// This function returns the current Symbol Map class
	XAP_Draw_Symbol *  _getCurrentSymbolMap();

	// This function lays out the symbol matrix
	XAP_Draw_Symbol *  m_DrawSymbol;

	// This variable stores the current symbol font
	GR_Font *		   m_Insert_Symbol_font;
	char			   m_FontName[50];
        char                       m_WindowName[100];
	// This is character selected.
	UT_UCSChar	       m_Inserted_Symbol;

	XAP_Dialog_Insert_Symbol::tAnswer   m_answer;

	XAP_Insert_symbol_listener*			m_pListener;
};

#endif /* XAP_Dialog_Insert_Symbol_H */
