Mercurial > vim
diff src/gui_kde.cc @ 11:4424b47a0797
updated for version 7.0003
author | vimboss |
---|---|
date | Wed, 30 Jun 2004 16:16:41 +0000 |
parents | |
children | 4ac1dce8dd5e |
line wrap: on
line diff
new file mode 100644 --- /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"); +}//}}}