/* vi:set ts=8 sts=0 sw=8:
 *
 * VIM - Vi IMproved		by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 */

/*
 * Porting to KDE(2) was done by
 *
 *  (C) 2000 by Thomas Capricelli <orzel@freehackers.org>
 *
 *  Please visit http://freehackers.org/kvim for other vim- or
 *  kde-related coding.
 *
 *  $Id$
 *
 */

#ifndef GUI_KDE_WIDGET
#define GUI_KDE_WIDGET

#if 1
#define dbf( format, args... ) { printf( "%s" " : " format "\n" , __FUNCTION__ , ## args ); fflush(stdout); }
#define db()       { printf( "%s\n", __FUNCTION__ );fflush(stdout); }
#else
#define dbf(format, args... )
#define db()
#endif

#define UNIX	    // prevent a warning : a symbol is defined twice in X and Qt

#include <qdialog.h>
#include <qlabel.h>
#include <qsignalmapper.h>
#include <qtimer.h>
#include <qmainwindow.h>
#include <qapplication.h>
#include <qevent.h>
#include <qlineedit.h>
#include <qpainter.h>
#include <qwidget.h>
#include <qpopupmenu.h>
#include <klocale.h>
#include <kapp.h>
#include <kcmdlineargs.h>
#include <kaboutdata.h>
#include <keditcl.h>
#include <kaboutdata.h>
#if (KDE_VERSION>=290)
#include <kmainwindow.h>
#else
#include <ktmainwindow.h>
#endif
#include <kparts/part.h>
#include <kurl.h>
#include "kvim_iface.h"

#undef UNIX	    // prevent a warning
extern "C" {
#include "vim.h"
}

class QPushButton;
class QDialog;
class QLineEdit;
class QSignalMapper;
class QPaintEvent;

enum BlinkState
{
	BLINK_NONE,
	BLINK_ON,
	BLINK_OFF
};

class VimWidget : public QWidget, virtual public KVim
{
	Q_OBJECT

public:
	VimWidget(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
	virtual void paintEvent(QPaintEvent *);
	void	draw_string(int x, int y, QString s, int len, int flags);

	/** Init the blinking time */
	void set_blink_time(long, long, long);
	void start_cursor_blinking();
	void stop_cursor_blinking();
	void wait(long);
#ifdef FEAT_CLIENTSERVER
	void serverActivate(WId id);
#endif
#ifdef FEAT_MZSCHEME
	void enable_mzscheme_threads();
	void disable_mzscheme_threads();
#endif
	void flash();

	/** DCOP */
	void execNormal(QString command);
	void execInsert(QString command);
	void execRaw(QString command);
	void execCmd(QString command);
	QString eval(QString expr);

	bool wait_done;
	BlinkState blink_state;
	QPainter *painter;
	QPopupMenu *menu;
	virtual void setMicroFocusHint(int x, int y, int w, int h, bool text=TRUE, QFont *f = 0)
	{
	    QWidget::setMicroFocusHint(x, y, w, h, text, f);
	}

protected:
	virtual void keyPressEvent(QKeyEvent *);
	virtual void mousePressEvent(QMouseEvent *);
	virtual void mouseDoubleClickEvent(QMouseEvent *);
	virtual void mouseReleaseEvent(QMouseEvent *);
	virtual void mouseMoveEvent(QMouseEvent *);
	virtual void focusInEvent(QFocusEvent *);
	virtual void focusOutEvent(QFocusEvent *);
	virtual void dragEnterEvent(QDragEnterEvent *);
	virtual void dropEvent(QDropEvent *);
#ifdef FEAT_XIM
	virtual void imStartEvent(QIMEvent *);
	virtual void imEndEvent(QIMEvent *);
	virtual void imComposeEvent(QIMEvent *);
#endif
#ifdef FEAT_MZSCHEME
	virtual void timerEvent(QTimerEvent *);
#endif

	/* cursor blinking stuff */
	QTimer blink_timer;
	long blink_wait_time, blink_on_time, blink_off_time;

	/* wait for input */
	QTimer	wait_timer;

#ifdef FEAT_MZSCHEME
	int	mzscheme_timer_id;
#endif

public slots:
	void    blink_cursor();
	void	wait_timeout();
};

class VimMainWindow : public KMainWindow
{
	Q_OBJECT

public:
	VimMainWindow(const char *name = 0L, WFlags f = WDestructiveClose);

	/** called when the widget closes */
//	bool close(bool alsoDelete);
	VimWidget	*w;
	KEdFind		*finddlg;
	KEdReplace      *repldlg;
	int		have_tearoff;
	QTextCodec      *codec;

public slots:
	void    menu_activated(int dx);
	void	clipboard_selection_update();
	void	clipboard_data_update();
	void    slotSearch();
	void    slotFind();
	void    slotReplace();
	void    slotReplaceAll();
	void    showAboutApplication();
	void    showAboutKDE();
	void    showBugReport();
	void    showTipOfTheDay();
	void    buffersToolbar();
	bool    isLocked();
	void    lock();
	void    unlock();

protected:
	virtual void wheelEvent(QWheelEvent *);
	virtual void resizeEvent(QResizeEvent *e);

#if defined(FEAT_SESSION)
	void saveGlobalProperties(KConfig *conf);
	void readGlobalProperties(KConfig *conf);
#endif
	bool queryClose();
	bool queryExit();
	bool locked;
};


class VimDialog : public QDialog
{
	Q_OBJECT
public:
	VimDialog(int type,		/* type of dialog */
	       unsigned char *title,		/* title of dialog */
	       unsigned char *message,	/* message text */
	       unsigned char *buttons,	/* names of buttons */
	       int def_but,		/* default button */
	       char_u *textfield);		/* input text */
private:
	QSignalMapper	mapper;
	QLineEdit	*entry;
	char_u		*ret;
	int		butNb;

protected slots:
	void done(int);
};


/*
 * QScrollBar  pool
 */
struct GuiScrollbar;

class SBPool : public QObject
{
	Q_OBJECT
public:
	SBPool(void);
	void create(GuiScrollbar * sb, int orient);
	void destroy(GuiScrollbar * sb);
public slots:
	void sbUsed(int who);
private:
	QSignalMapper mapper;
};

class KVimUtils
{
public:
	static QString convertEncodingName(QString);
#if QT_VERSION<300
	static bool fromString(QFont*,QString);
	static QString toString(QFont*);
#endif
};

extern VimMainWindow	*vmw;
extern SBPool		*sbpool;
extern QString		*argServerName;

#define QSTR(x)	\
	(has_mbyte ? \
		(enc_utf8 ? \
			QString::fromUtf8((const char *)x) : \
			QString::fromLocal8Bit((const char *)x)) : \
		QString((const char *)x))

#endif // GUI_KDE_WIDGET
