updated for version 7.0003
diff --git a/src/gui_kde.cc b/src/gui_kde.cc
new file mode 100644
index 0000000..772e457
--- /dev/null
+++ b/src/gui_kde.cc
@@ -0,0 +1,587 @@
+/* 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$
+ *
+ */
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <kmenubar.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+
+#include <qscrollbar.h>
+#include <qcursor.h>
+#include <qmessagebox.h>
+#include <qiconset.h>
+#include <qtextcodec.h>
+#include "gui_kde_widget.h"
+
+extern "C" {
+#include "vim.h"
+}
+
+#undef dbf
+#undef db
+#undef mputs
+
+#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
+
+
+#ifdef FEAT_TOOLBAR
+#ifndef FEAT_KDETOOLBAR
+/*
+ * Icons used by the toolbar code.
+ *///{{{
+#include "../pixmaps/tb_new.xpm"
+#include "../pixmaps/tb_open.xpm"
+#include "../pixmaps/tb_close.xpm"
+#include "../pixmaps/tb_save.xpm"
+#include "../pixmaps/tb_print.xpm"
+#include "../pixmaps/tb_cut.xpm"
+#include "../pixmaps/tb_copy.xpm"
+#include "../pixmaps/tb_paste.xpm"
+#include "../pixmaps/tb_find.xpm"
+#include "../pixmaps/tb_find_next.xpm"
+#include "../pixmaps/tb_find_prev.xpm"
+#include "../pixmaps/tb_find_help.xpm"
+#include "../pixmaps/tb_exit.xpm"
+#include "../pixmaps/tb_undo.xpm"
+#include "../pixmaps/tb_redo.xpm"
+#include "../pixmaps/tb_help.xpm"
+#include "../pixmaps/tb_macro.xpm"
+#include "../pixmaps/tb_make.xpm"
+#include "../pixmaps/tb_save_all.xpm"
+#include "../pixmaps/tb_jump.xpm"
+#include "../pixmaps/tb_ctags.xpm"
+#include "../pixmaps/tb_load_session.xpm"
+#include "../pixmaps/tb_save_session.xpm"
+#include "../pixmaps/tb_new_session.xpm"
+#include "../pixmaps/tb_blank.xpm"
+#include "../pixmaps/tb_maximize.xpm"
+#include "../pixmaps/tb_split.xpm"
+#include "../pixmaps/tb_minimize.xpm"
+#include "../pixmaps/tb_shell.xpm"
+#include "../pixmaps/tb_replace.xpm"
+#include "../pixmaps/tb_vsplit.xpm"
+#include "../pixmaps/tb_maxwidth.xpm"
+#include "../pixmaps/tb_minwidth.xpm"
+//}}}
+/*
+ * These are the pixmaps used for the default buttons.
+ * Order must exactly match toolbar_names[] in menu.c!
+ *///{{{
+static char **(built_in_pixmaps[]) =
+{
+ tb_new_xpm,
+ tb_open_xpm,
+ tb_save_xpm,
+ tb_undo_xpm,
+ tb_redo_xpm,
+ tb_cut_xpm,
+ tb_copy_xpm,
+ tb_paste_xpm,
+ tb_print_xpm,
+ tb_help_xpm,
+ tb_find_xpm,
+ tb_save_all_xpm,
+ tb_save_session_xpm,
+ tb_new_session_xpm,
+ tb_load_session_xpm,
+ tb_macro_xpm,
+ tb_replace_xpm,
+ tb_close_xpm,
+ tb_maximize_xpm,
+ tb_minimize_xpm,
+ tb_split_xpm,
+ tb_shell_xpm,
+ tb_find_prev_xpm,
+ tb_find_next_xpm,
+ tb_find_help_xpm,
+ tb_make_xpm,
+ tb_jump_xpm,
+ tb_ctags_xpm,
+ tb_vsplit_xpm,
+ tb_maxwidth_xpm,
+ tb_minwidth_xpm,
+ tb_exit_xpm
+};//}}}
+#else
+const char *kdeicons[] = {
+ "filenew",
+ "fileopen",
+ "filesave",
+ "undo",
+ "redo",
+ "editcut",
+ "editcopy",
+ "editpaste",
+ "fileprint",
+ "contents2",
+ "filefind",
+ "save_all",
+ "fileexport",
+ "filenew",
+ "fileimport",
+ "run",
+ "edit",
+ "fileclose",
+ "",
+ "",
+ "split",
+ "openterm",
+ "previous",
+ "next",
+ "help",
+ "make",
+ "goto",
+ "run",
+ "vsplit",
+ "maxwidth",
+ "minwidth",
+ "quit"
+};
+#endif
+/*
+ * creates a blank pixmap using tb_blank
+ */
+ QPixmap
+pixmap_create_from_xpm(char **xpm)//{{{
+{
+ return(QPixmap((const char **)xpm));
+}//}}}
+
+/*
+ * creates a pixmap by using a built-in number
+ */
+ QPixmap
+pixmap_create_by_num(int pixmap_num)//{{{
+{
+#ifdef FEAT_KDETOOLBAR
+ if (pixmap_num >= 0 && (unsigned)pixmap_num < (sizeof(kdeicons)
+ / sizeof(kdeicons[0])) - 1) {
+
+ KIconLoader *il = kapp->iconLoader(); //new KIconLoader();
+ QString icon;
+ icon=QString(kdeicons[pixmap_num]);
+ return il->loadIcon(icon,KIcon::MainToolbar);
+ }
+ return QPixmap();
+#else
+ if (pixmap_num >= 0 && (unsigned)pixmap_num < (sizeof(built_in_pixmaps)
+ / sizeof(built_in_pixmaps[0])) - 1)
+ return pixmap_create_from_xpm(built_in_pixmaps[pixmap_num]);
+ else return QPixmap();
+#endif
+}//}}}
+
+/*
+ * Creates a pixmap by using the pixmap "name" found in 'runtimepath'/bitmaps/
+ */
+ QPixmap
+pixmap_create_by_dir(char_u *name)//{{{
+{
+ char_u full_pathname[MAXPATHL + 1];
+
+ if (gui_find_bitmap(name, full_pathname, "xpm") == OK) {
+ return QPixmap((const char *)full_pathname);
+ }
+ else return QPixmap();
+}//}}}
+
+
+ QPixmap
+pixmap_create_from_file(char_u *file)
+{
+ return QPixmap((const char*)file);
+}
+#endif
+
+ void
+gui_mch_add_menu(vimmenu_T * menu, int idx)//{{{
+{
+#ifdef FEAT_MENU
+ QPopupMenu *me;
+ vimmenu_T *parent = menu->parent;
+
+ if (menu_is_popup(menu->name)) {
+ menu->widget = new QPopupMenu(vmw , (const char *) menu->name);
+ QObject::connect( menu->widget, SIGNAL(activated(int)), vmw, SLOT(menu_activated(int)) );
+ return;
+ }
+
+ if (!menu_is_menubar(menu->name))
+ return;
+
+ if (parent) {
+ idx++; // for tearoffs to be first in menus
+ me = new QPopupMenu(parent->widget, (const char *) menu->name);
+ parent->widget->insertItem( QString((const char *)menu->name), me, (int)me, idx);
+ } else {
+ me = new QPopupMenu(vmw->menuBar() , (const char *) menu->name);
+ vmw->menuBar()->insertItem( QString((const char *)menu->name), me , (int) me, idx);
+ }
+
+ me->setCaption((const char*)( menu->dname ));
+ if (vmw->have_tearoff) me->insertTearOffHandle(0,0);
+ QObject::connect( me, SIGNAL(activated(int)), vmw, SLOT(menu_activated(int)) );
+ menu->widget = me;
+#endif
+}//}}}
+
+
+ void
+gui_mch_add_menu_item(vimmenu_T * menu, int idx)//{{{
+{
+#ifdef FEAT_MENU
+ vimmenu_T *parent = menu->parent;
+#ifdef FEAT_TOOLBAR
+ if (menu_is_toolbar(parent->name)) {
+ QPixmap pix;
+ if ( menu_is_separator(menu->name) )
+ {
+ vmw->toolBar()->insertSeparator();
+ return;
+ }
+ if (menu->iconfile != NULL) {
+ pix = pixmap_create_from_file(menu->iconfile);
+ }
+ if (!menu->icon_builtin) {
+ pix = pixmap_create_by_dir(menu->name);
+ }
+ if (pix.isNull() && menu->iconidx >= 0) {
+ pix = pixmap_create_by_num(menu->iconidx);
+ }
+#ifndef FEAT_KDETOOLBAR
+ if (pix.isNull()) {
+ pix = pixmap_create_from_xpm(tb_blank_xpm);
+ }
+#endif
+ if (pix.isNull()) return; // failed
+ vmw->toolBar()->insertButton (
+ pix,
+ (int) menu , // id
+ true,
+ (char *) (menu->strings[MENU_INDEX_TIP]) , // tooltip or text
+ idx
+ );
+ menu->parent=parent;
+ return;
+ }
+#endif // FEAT_TOOLBAR
+
+ idx++;
+ if ( menu_is_separator(menu->name) ) {
+ parent->widget->insertSeparator();
+ return;
+ }
+ parent->widget->insertItem(QString((const char *)menu->name), (int)menu, idx );
+#endif
+}//}}}
+
+
+ void
+gui_mch_set_text_area_pos(int x, int y, int w, int h)//{{{
+{
+ int X = 0;
+ int Y = 0;
+ if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+ && !vmw->menuBar()->isTopLevelMenu()
+#endif
+ )
+ Y += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+ if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+ vmw->toolBar()->barPos()==KToolBar::Top)
+ Y += vmw->toolBar()->height();
+
+ if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+ vmw->toolBar()->barPos()==KToolBar::Left)
+ X += vmw->toolBar()->width();
+#endif // FEAT_TOOLBAR
+
+ gui.w->setGeometry(x+X,y+Y,w,h);
+}//}}}
+
+
+#if defined(FEAT_MENU) || defined(PROTO)
+/*
+ * Enable or disable mnemonics for the toplevel menus.
+ */
+ void
+gui_gtk_set_mnemonics(int enable)//{{{ // TO BE REMOVED
+{
+}//}}}
+
+ void
+toggle_tearoffs(vimmenu_T *menu, int enable)//{{{
+{
+ while (menu != NULL) {
+ if (!menu_is_popup(menu->name)) {
+ if (menu->widget != 0) {
+ if (enable) menu->widget->insertTearOffHandle(0,0);
+ else menu->widget->removeItem(0);
+ }
+ toggle_tearoffs(menu->children, enable);
+ }
+ menu = menu->next;
+ }
+}//}}}
+
+ void
+gui_mch_toggle_tearoffs(int enable)//{{{
+{
+ vmw->have_tearoff=enable;
+ toggle_tearoffs(root_menu, enable);
+}//}}}
+#endif
+
+
+#if defined(FEAT_MENU) || defined(PROTO)
+/*
+ * Destroy the machine specific menu widget.
+ */
+ void
+gui_mch_destroy_menu(vimmenu_T * menu)//{{{
+{
+#ifdef FEAT_TOOLBAR
+ if (menu->parent && menu_is_toolbar(menu->parent->name)) {
+ vmw->toolBar()->removeItem( (int) menu );
+ return;
+ }
+#endif
+ if(menu->parent){
+ menu->parent->widget->removeItem((int)menu );
+ }
+ if (menu->widget){
+ delete menu->widget;
+ }
+ menu->widget = 0;
+}//}}}
+#endif /* FEAT_MENU */
+
+
+/*
+ * Scrollbar stuff.
+ */
+
+ void
+gui_mch_set_scrollbar_thumb(scrollbar_T * sb, long val, long size, long max)//{{{
+{
+ if (!sb->w) return;
+
+ sb->w->setRange(0, max+1-size);
+ sb->w->setValue(val);
+
+ sb->w->setLineStep(1);
+ sb->w->setPageStep(size);
+}//}}}
+
+ void
+gui_mch_set_scrollbar_pos(scrollbar_T * sb, int x, int y, int w, int h)//{{{
+{
+ if (!sb->w) return;
+ //we add the menubar and toolbar height/width
+ int X = 0;
+ int Y = 0;
+
+ if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled()
+#if QT_VERSION>=300
+ && !vmw->menuBar()->isTopLevelMenu()
+#endif
+ )
+ Y += vmw->menuBar()->height();
+#ifdef FEAT_TOOLBAR
+ if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+ vmw->toolBar()->barPos()==KToolBar::Top)
+ Y += vmw->toolBar()->height();
+
+ if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() &&
+ vmw->toolBar()->barPos()==KToolBar::Left)
+ X += vmw->toolBar()->width();
+#endif //FEAT_TOOLBAR
+ if (sb->w->orientation() == Qt::Vertical) {
+ bool leftscroll=gui.which_scrollbars[SBAR_LEFT];
+ bool rightscroll=gui.which_scrollbars[SBAR_RIGHT];
+ if (x<20) leftscroll=true;
+ else rightscroll=true;
+ if (x<20) sb->w->setGeometry(X,y+Y,w,h);
+ else sb->w->setGeometry(vmw->width()-w-1+X, y+Y,w,h);
+ } else {
+ sb->w->setGeometry(x+X,y+Y,w,h);
+ }
+}//}}}
+
+/* SBAR_VERT or SBAR_HORIZ */
+ void
+gui_mch_create_scrollbar(scrollbar_T * sb, int orient)//{{{
+{
+ sbpool->create(sb,orient);
+ if (orient==SBAR_VERT)
+ gui.scrollbar_width = sb->w->sizeHint().width();
+ else
+ gui.scrollbar_height = sb->w->sizeHint().height();
+}//}}}
+
+ void
+gui_mch_destroy_scrollbar(scrollbar_T * sb)//{{{
+{
+ sbpool->destroy(sb);
+}//}}}
+
+#if defined(FEAT_BROWSE) || defined(PROTO)
+/*
+ * Implementation of the file selector related stuff
+ */
+
+/*
+ * Put up a file requester.
+ * Returns the selected name in allocated memory, or NULL for Cancel.
+ * saving, select file to write
+ * title title for the window
+ * dflt default name
+ * ext not used (extension added)
+ * initdir initial directory, NULL for current dir
+ * filter not used (file name filter)
+ */
+/*ARGSUSED*/
+char_u *
+gui_mch_browse(int saving,//{{{
+ char_u * title,
+ char_u * dflt,
+ char_u * ext,
+ char_u * initdir,
+ char_u * filter)
+{
+ char * filt_glob;
+ if (filter != (char_u *) 0x0 ) {
+ filter = vim_strsave(filter);
+ strtok((char *) filter, "(");
+ filt_glob = strtok(0L, ")");
+ } else
+ filt_glob = (char *) filter;
+
+ gui_mch_mousehide(FALSE);
+
+ QString s;
+ if (! saving)
+ s = KFileDialog::getOpenFileName( (char *) initdir, (char *) filt_glob, vmw, (char *) title );
+ else
+ s = KFileDialog::getSaveFileName( );
+
+ if (filter)
+ vim_free(filter);
+
+ if (s.isNull())
+ return NULL;
+ QCString unistring = vmw->codec->fromUnicode(s);
+ char_u * s2 = (char_u *)(const char*)unistring;
+ if (s2)
+ s2 = vim_strsave( s2 );
+
+ return s2;
+}//}}}
+
+#endif /* FEAT_BROWSE */
+
+#ifdef FEAT_GUI_DIALOG
+
+/* ARGSUSED */
+int
+gui_mch_dialog(int type, /* type of dialog *///{{{
+ char_u * title, /* title of dialog */
+ char_u * message, /* message text */
+ char_u * buttons, /* names of buttons */
+ int def_but, /* default button */
+ char_u *textfield)
+{
+ gui_mch_mousehide(FALSE);
+ VimDialog vd(type, title, message, buttons, def_but,textfield);
+ int ret = vd.exec();
+ return ret;
+}//}}}
+
+
+#endif /* FEAT_GUI_DIALOG */
+
+#if defined(FEAT_MENU) || defined(PROTO)
+ void
+gui_mch_show_popupmenu(vimmenu_T * menu)//{{{
+{
+ menu->widget->popup(QCursor::pos());
+}//}}}
+
+void
+gui_make_popup (char_u *pathname) {//{{{
+ vimmenu_T *menu = gui_find_menu(pathname);
+
+ if (menu != NULL) {
+ menu->widget->popup(QCursor::pos());
+ }
+}//}}}
+#endif
+
+
+
+/* Find and Replace implementations */
+ void
+gui_mch_find_dialog(exarg_T * eap)//{{{
+{
+ // char_u* entry_text;
+ //int exact_word=FALSE;
+ // entry_text = get_find_dialog_text(eap->arg,&exact_word);
+
+ vmw->finddlg->setCaseSensitive(true);
+
+ /* if(entry_text!=NULL) {
+ vmw->finddlg->setText(QString((char*)entry_text));
+ // exact match should go there, hopefully KDE old KEdFind/KEdReplace will be replaced in KDE 4 as pple wanted KDE 3's Find/Replace to be kept
+ }*/ // Don't use it, KDE keeps old search in memory and vim give \\Csearch, which is difficult to handle
+ // vim_free(entry_text);
+
+ vmw->finddlg->show();
+}//}}}
+
+ void
+gui_mch_replace_dialog(exarg_T * eap)//{{{
+{
+ // char_u* entry_text;
+ //int exact_word=FALSE;
+
+ // entry_text = get_find_dialog_text(eap->arg,&exact_word);
+
+ /* if(entry_text!=NULL) {
+ vmw->repldlg->setText(QString((char*)entry_text));
+ // exact match should go there, hopefully KDE old KEdFind/KEdReplace will be replaced in KDE 4 as pple wanted KDE 3's Find/Replace to be kept
+ }*/
+ //vim_free(entry_text);
+
+ vmw->repldlg->show();
+}//}}}
+
+ void
+ex_helpfind(exarg_T *eap)//{{{
+{
+ do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp");
+}//}}}