blob: 4eb67be72d9ec653e81e7d0b4986a213417553ee [file] [log] [blame]
/* 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