blob: 2be18b9b7a8fc7f47a17dc474f113b276f52c9bb [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$
*
*/
#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_wid.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");
}//}}}