/* 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 * * Please visit http://freehackers.org/kvim for other vim- or * kde-related coding. * * $Id$ * */ #include #include #include #include #include #include #include #include #include #include #include #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"); }//}}}