Mercurial > vim
comparison src/gui_kde_wid.cc @ 20:4ac1dce8dd5e v7.0012
updated for version 7.0012
author | vimboss |
---|---|
date | Mon, 26 Jul 2004 12:53:41 +0000 |
parents | |
children | 8ff7fd162d3c |
comparison
equal
deleted
inserted
replaced
19:a81bc802c17c | 20:4ac1dce8dd5e |
---|---|
1 /* vi:set ts=8 sts=4 sw=4: | |
2 * | |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 */ | |
8 | |
9 /* | |
10 * Porting to KDE(2) was done by | |
11 * | |
12 * (C) 2000 by Thomas Capricelli <orzel@freehackers.org> | |
13 * | |
14 * Please visit http://freehackers.org/kvim for other vim- or | |
15 * kde-related coding. | |
16 * | |
17 * $Id$ | |
18 * | |
19 */ | |
20 | |
21 #include <assert.h> | |
22 #include <qpainter.h> | |
23 #include <qevent.h> | |
24 #include <qpushbutton.h> | |
25 #include <qscrollbar.h> | |
26 #include <qlayout.h> | |
27 #include <qclipboard.h> | |
28 #include <qdragobject.h> | |
29 #include <qstrlist.h> | |
30 #include <qmenubar.h> | |
31 #include <qtextcodec.h> | |
32 #if QT_VERSION>=300 | |
33 #include <qptrlist.h> | |
34 #include <ktip.h> | |
35 #endif | |
36 #include <kglobal.h> | |
37 #include <kconfig.h> | |
38 #include <kaboutapplication.h> | |
39 #include <dcopclient.h> | |
40 #include <kaboutkde.h> | |
41 #include <kbugreport.h> | |
42 #include <kurldrag.h> | |
43 #include <kmenubar.h> | |
44 #include <ktoolbar.h> | |
45 #include <kstandarddirs.h> | |
46 #include "gui_kde_wid.h" | |
47 #include <qxembed.h> | |
48 | |
49 extern "C" | |
50 { | |
51 #include "version.h" | |
52 } | |
53 | |
54 // Pixmap for dialog | |
55 #ifdef FEAT_GUI_DIALOG | |
56 # include "../../pixmaps/alert.xpm" | |
57 # include "../../pixmaps/error.xpm" | |
58 # include "../../pixmaps/generic.xpm" | |
59 # include "../../pixmaps/info.xpm" | |
60 # include "../../pixmaps/quest.xpm" | |
61 #endif | |
62 | |
63 /** | |
64 * Keycodes recognized by vim. | |
65 */ | |
66 struct special_key {//{{{ | |
67 int qtkey; | |
68 char_u code0; | |
69 char_u code1; | |
70 } special_keys[] = | |
71 { | |
72 { Qt::Key_Up, 'k', 'u' }, | |
73 { Qt::Key_Down, 'k', 'd' }, | |
74 { Qt::Key_Left, 'k', 'l' }, | |
75 { Qt::Key_Right, 'k', 'r' }, | |
76 { Qt::Key_F1, 'k', '1' }, | |
77 { Qt::Key_F2, 'k', '2' }, | |
78 { Qt::Key_F3, 'k', '3' }, | |
79 { Qt::Key_F4, 'k', '4' }, | |
80 { Qt::Key_F5, 'k', '5' }, | |
81 { Qt::Key_F6, 'k', '6' }, | |
82 { Qt::Key_F7, 'k', '7' }, | |
83 { Qt::Key_F8, 'k', '8' }, | |
84 { Qt::Key_F9, 'k', '9' }, | |
85 { Qt::Key_F10, 'k', ';' }, | |
86 { Qt::Key_F11, 'F', '1' }, | |
87 { Qt::Key_F12, 'F', '2' }, | |
88 { Qt::Key_F13, 'F', '3' }, | |
89 { Qt::Key_F14, 'F', '4' }, | |
90 { Qt::Key_F15, 'F', '5' }, | |
91 { Qt::Key_F16, 'F', '6' }, | |
92 { Qt::Key_F17, 'F', '7' }, | |
93 { Qt::Key_F18, 'F', '8' }, | |
94 { Qt::Key_F19, 'F', '9' }, | |
95 { Qt::Key_F20, 'F', 'A' }, | |
96 { Qt::Key_F21, 'F', 'B' }, | |
97 { Qt::Key_F22, 'F', 'C' }, | |
98 { Qt::Key_F23, 'F', 'D' }, | |
99 { Qt::Key_F24, 'F', 'E' }, | |
100 { Qt::Key_F25, 'F', 'F' }, | |
101 { Qt::Key_F26, 'F', 'G' }, | |
102 { Qt::Key_F27, 'F', 'H' }, | |
103 { Qt::Key_F28, 'F', 'I' }, | |
104 { Qt::Key_F29, 'F', 'J' }, | |
105 { Qt::Key_F30, 'F', 'K' }, | |
106 { Qt::Key_F31, 'F', 'L' }, | |
107 { Qt::Key_F32, 'F', 'M' }, | |
108 { Qt::Key_F33, 'F', 'N' }, | |
109 { Qt::Key_F34, 'F', 'O' }, | |
110 { Qt::Key_F35, 'F', 'P' }, | |
111 { Qt::Key_Help, '%', '1' }, | |
112 // { Qt::Key_Undo, '&', '8' }, <= hmmm ? | |
113 { Qt::Key_BackSpace, 'k', 'b' }, | |
114 { Qt::Key_Insert, KS_EXTRA, KE_KINS }, | |
115 { Qt::Key_Delete, KS_EXTRA, KE_KDEL }, | |
116 { Qt::Key_Home, 'K', '1' }, | |
117 { Qt::Key_End, 'K', '4' }, | |
118 { Qt::Key_Prior, 'K', '3' }, | |
119 { Qt::Key_Next, 'K', '5' }, | |
120 { Qt::Key_Print, '%', '9' }, | |
121 | |
122 { Qt::Key_Plus, 'K', '6'}, | |
123 { Qt::Key_Minus, 'K', '7'}, | |
124 { Qt::Key_Slash, 'K', '8'}, | |
125 { Qt::Key_multiply, 'K', '9'}, | |
126 { Qt::Key_Enter, 'K', 'A'}, | |
127 { Qt::Key_Period, 'K', 'B'}, | |
128 | |
129 { Qt::Key_0, 'K', 'C'}, | |
130 { Qt::Key_1, 'K', 'D'}, | |
131 { Qt::Key_2, 'K', 'E'}, | |
132 { Qt::Key_3, 'K', 'F'}, | |
133 { Qt::Key_4, 'K', 'G'}, | |
134 { Qt::Key_5, 'K', 'H'}, | |
135 { Qt::Key_6, 'K', 'I'}, | |
136 { Qt::Key_7, 'K', 'J'}, | |
137 { Qt::Key_8, 'K', 'K'}, | |
138 { Qt::Key_9, 'K', 'L'}, | |
139 /* End of list marker: */ | |
140 { 0, 0, 0 } | |
141 };//}}} | |
142 | |
143 #ifdef FEAT_CLIENTSERVER | |
144 typedef int (*QX11EventFilter) (XEvent*); | |
145 extern QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter); | |
146 static QX11EventFilter oldFilter = 0; | |
147 static int kvim_x11_event_filter( XEvent* e); | |
148 #endif | |
149 void gui_keypress(QKeyEvent *e); | |
150 | |
151 /* | |
152 * Return OK if the key with the termcap name "name" is supported. | |
153 */ | |
154 int | |
155 gui_mch_haskey(char_u * name)//{{{ | |
156 { | |
157 for (int i=0; special_keys[i].qtkey != 0; i++) | |
158 if (name[0] == special_keys[i].code0 && | |
159 name[1] == special_keys[i].code1) | |
160 return OK; | |
161 return FAIL; | |
162 }//}}} | |
163 | |
164 /* | |
165 * custom Frame for drawing ... | |
166 */ | |
167 void VimWidget::paintEvent( QPaintEvent *e)//{{{ | |
168 { | |
169 QRect r = e->rect(); | |
170 gui_redraw(r.x(), r.y(), r.width(), r.height() ); | |
171 }//}}} | |
172 | |
173 void VimWidget::draw_string(int x, int y, QString s, int len, int flags)//{{{ | |
174 { | |
175 gui.current_font->setBold( flags & DRAW_BOLD ); | |
176 gui.current_font->setUnderline( flags & DRAW_UNDERL ); | |
177 gui.current_font->setItalic(flags & DRAW_ITALIC); | |
178 painter->setBackgroundMode( flags & DRAW_TRANSP ? Qt::TransparentMode : Qt::OpaqueMode); | |
179 painter->setFont( *(gui.current_font) ); | |
180 painter->drawText( x, y, s, len); | |
181 }//}}} | |
182 | |
183 void VimWidget::mousePressEvent(QMouseEvent *event)//{{{ | |
184 { | |
185 int button=0; | |
186 int modifiers=0; | |
187 ButtonState state = event->state(); | |
188 ButtonState buttons = event->button(); | |
189 | |
190 //Look at button states | |
191 if (buttons & QMouseEvent::LeftButton) | |
192 button |= MOUSE_LEFT; | |
193 if (buttons & QMouseEvent::RightButton) | |
194 button |= MOUSE_RIGHT; | |
195 if (buttons & QMouseEvent::MidButton) | |
196 button |= MOUSE_MIDDLE; | |
197 //Look for keyboard modifiers | |
198 if (state & QMouseEvent::ShiftButton) | |
199 modifiers |= MOUSE_SHIFT; | |
200 if (state & QMouseEvent::ControlButton) | |
201 modifiers |= MOUSE_CTRL; | |
202 if (state & QMouseEvent::AltButton) | |
203 modifiers |= MOUSE_ALT; | |
204 gui_send_mouse_event(button,event->x(),event->y(),FALSE,modifiers); | |
205 #if QT_VERSION>=300 | |
206 QByteArray params; | |
207 QDataStream stream(params, IO_WriteOnly); | |
208 stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col; | |
209 kapp->dcopClient()->emitDCOPSignal("mousePEvent(QCString,int,int,int,int)", params); | |
210 #endif | |
211 event->accept(); | |
212 }//}}} | |
213 | |
214 #if defined(FEAT_SESSION) | |
215 void VimMainWindow::saveGlobalProperties (KConfig *conf) | |
216 { | |
217 //we write a mksession file to a file written in the user's ~/.kde/share/config/ | |
218 //the name of the file in saved in 'conf' | |
219 //when restoring app, we source this file | |
220 #if 0 //disabled for release | |
221 QString filename = KGlobal::dirs()->localkdedir() + KGlobal::dirs()->kde_default("config") + kapp->randomString(10); | |
222 QString cmd("mksession "); | |
223 cmd+=filename; | |
224 do_cmdline_cmd((char_u*)cmd.latin1()); | |
225 conf->writePathEntry("sessionfile", filename); | |
226 conf->sync(); | |
227 #endif | |
228 } | |
229 | |
230 void VimMainWindow::readGlobalProperties (KConfig *conf) | |
231 { | |
232 #if 0 | |
233 QString filename = conf->readPathEntry("sessionfile"); | |
234 if (filename.isNull()) return; | |
235 QString cmd("source "); | |
236 cmd+=filename; | |
237 do_cmdline_cmd((char_u*)cmd.latin1()); | |
238 #endif | |
239 } | |
240 #endif | |
241 | |
242 void VimMainWindow::wheelEvent (QWheelEvent *event)//{{{ | |
243 { | |
244 ButtonState state = event->state(); | |
245 int button=0; | |
246 int modifiers=0; | |
247 | |
248 if (event->delta()>0) | |
249 button|=MOUSE_4; | |
250 else button|=MOUSE_5; | |
251 | |
252 if (state & ShiftButton) | |
253 modifiers|=MOUSE_SHIFT; | |
254 if (state & ControlButton) | |
255 modifiers|=MOUSE_CTRL; | |
256 if (state & AltButton) | |
257 modifiers|=MOUSE_ALT; | |
258 | |
259 gui_send_mouse_event(button,event->x(),event->y(),FALSE,modifiers); | |
260 #if QT_VERSION>=300 | |
261 QByteArray params; | |
262 QDataStream stream(params, IO_WriteOnly); | |
263 stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col; | |
264 kapp->dcopClient()->emitDCOPSignal("mouseWhlEvent(QCString, int, int,int,int)", params); | |
265 #endif | |
266 event->accept(); | |
267 }//}}} | |
268 | |
269 void VimWidget::mouseDoubleClickEvent(QMouseEvent *event)//{{{ | |
270 { | |
271 ButtonState state = event->state(); | |
272 ButtonState buttons = event->button(); | |
273 int modifiers=0; | |
274 int button=0; | |
275 | |
276 //Look at button states | |
277 if (buttons & LeftButton) | |
278 button|=MOUSE_LEFT; | |
279 if (buttons & RightButton) | |
280 button|=MOUSE_RIGHT; | |
281 if (buttons & MidButton) | |
282 button|=MOUSE_MIDDLE; | |
283 | |
284 //Look for keyboard modifiers | |
285 if (state & ShiftButton) | |
286 modifiers|=MOUSE_SHIFT; | |
287 if (state & ControlButton) | |
288 modifiers|=MOUSE_CTRL; | |
289 if (state & AltButton) | |
290 modifiers|=MOUSE_ALT; | |
291 | |
292 gui_send_mouse_event(button,event->x(),event->y(),TRUE,modifiers); | |
293 #if QT_VERSION>=300 | |
294 QByteArray params; | |
295 QDataStream stream(params, IO_WriteOnly); | |
296 stream << kapp->dcopClient()->appId() << button << modifiers << gui.row << gui.col; | |
297 kapp->dcopClient()->emitDCOPSignal("mouseDblClickEvent(QCString, int, int,int,int)", params); | |
298 #endif | |
299 event->accept(); | |
300 }//}}} | |
301 | |
302 void VimWidget::mouseMoveEvent(QMouseEvent *event){//{{{ | |
303 ButtonState state = event->state(); | |
304 int modifiers=0; | |
305 int button=0; | |
306 | |
307 gui_mch_mousehide(FALSE); | |
308 | |
309 //Look at button states | |
310 //warning: we use state here, this is important ! | |
311 if (state & QMouseEvent::LeftButton || state & QMouseEvent::RightButton || state & QMouseEvent::MidButton) | |
312 button|=MOUSE_DRAG; | |
313 | |
314 //Look for keyboard modifiers | |
315 if (state & ShiftButton) | |
316 modifiers|=MOUSE_SHIFT; | |
317 if (state & ControlButton) | |
318 modifiers|=MOUSE_CTRL; | |
319 if (state & AltButton) | |
320 modifiers|=MOUSE_ALT; | |
321 if (button!=MOUSE_DRAG) | |
322 gui_mouse_moved(event->x(),event->y()); | |
323 else | |
324 gui_send_mouse_event(MOUSE_DRAG,event->x(),event->y(),FALSE,modifiers); | |
325 }//}}} | |
326 | |
327 void VimWidget::mouseReleaseEvent(QMouseEvent *event)//{{{ | |
328 { | |
329 ButtonState state = event->state(); | |
330 int modifiers=0; | |
331 | |
332 //Look for keyboard modifiers | |
333 if (state & ShiftButton) | |
334 modifiers|=MOUSE_SHIFT; | |
335 if (state & ControlButton) | |
336 modifiers|=MOUSE_CTRL; | |
337 if (state & AltButton) | |
338 modifiers|=MOUSE_ALT; | |
339 | |
340 gui_send_mouse_event(MOUSE_RELEASE,event->x(),event->y(),FALSE,modifiers); | |
341 event->accept(); | |
342 }//}}} | |
343 | |
344 /* | |
345 * The main widget (everything but toolbar/menubar) | |
346 */ | |
347 VimWidget::VimWidget( QWidget *parent, const char *name, WFlags f )//{{{ | |
348 :QWidget(parent, name, f) | |
349 ,DCOPObject("KVim") | |
350 #ifdef FEAT_MZSCHEME | |
351 ,mzscheme_timer_id(-1) | |
352 #endif | |
353 { | |
354 //to be able to show/hide the cursor when moving the mouse | |
355 setMouseTracking(true); | |
356 painter=new QPainter(this); | |
357 | |
358 setKeyCompression(true); | |
359 setFocusPolicy( QWidget::StrongFocus ); | |
360 setAcceptDrops(TRUE); // DND | |
361 blink_state = BLINK_NONE; | |
362 blink_on_time = 700; | |
363 blink_off_time = 400; | |
364 blink_wait_time = 250; | |
365 connect( &blink_timer, SIGNAL( timeout() ), SLOT( blink_cursor() )); | |
366 connect( &wait_timer, SIGNAL( timeout() ), SLOT ( wait_timeout() )); | |
367 }//}}} | |
368 | |
369 void VimWidget::execNormal(QString command)//{{{ | |
370 { | |
371 QString cmd("execute 'normal "); | |
372 cmd+=command; | |
373 cmd+="'"; | |
374 QCString unistring = vmw->codec->fromUnicode(cmd); | |
375 do_cmdline_cmd((char_u *)(const char*)unistring); | |
376 gui_update_screen(); | |
377 }//}}} | |
378 | |
379 void VimWidget::execInsert(QString command)//{{{ | |
380 { | |
381 QString cmd("execute 'normal i"); | |
382 cmd+=command; | |
383 cmd+="'"; | |
384 QCString unistring = vmw->codec->fromUnicode(cmd); | |
385 do_cmdline_cmd((char_u *)(const char*)unistring); | |
386 gui_update_screen(); | |
387 }//}}} | |
388 | |
389 void VimWidget::execRaw(QString command)//{{{ | |
390 { | |
391 QString cmd("execute '"); | |
392 cmd+=command; | |
393 cmd+="'"; | |
394 QCString unistring = vmw->codec->fromUnicode(cmd); | |
395 do_cmdline_cmd((char_u *)(const char*)unistring); | |
396 gui_update_screen(); | |
397 }//}}} | |
398 | |
399 void VimWidget::execCmd(QString command)//{{{ | |
400 { | |
401 QCString unistring = vmw->codec->fromUnicode(command); | |
402 do_cmdline_cmd((char_u *)(const char*)unistring); | |
403 gui_update_screen(); | |
404 }//}}} | |
405 | |
406 QString VimWidget::eval(QString expr)//{{{ | |
407 { | |
408 #ifdef FEAT_EVAL | |
409 QCString unistring = vmw->codec->fromUnicode(expr); | |
410 QString val((const char *)eval_to_string((char_u *)(const char*)unistring,NULL)); | |
411 return val; | |
412 #else | |
413 return QString::null; | |
414 #endif | |
415 }//}}} | |
416 | |
417 void VimWidget::wait(long wtime)//{{{ | |
418 { | |
419 if ( wait_timer.isActive() ) wait_timer.stop(); | |
420 wait_done = false; | |
421 wait_timer.start( wtime, true); | |
422 }//}}} | |
423 | |
424 void VimWidget::wait_timeout() //{{{ | |
425 { | |
426 wait_done = true; | |
427 }//}}} | |
428 | |
429 void VimWidget::dragEnterEvent (QDragEnterEvent *e)//{{{ | |
430 { | |
431 #if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) || defined(PROTO) | |
432 e->accept(QUriDrag::canDecode(e)); | |
433 #else | |
434 e->ignore(); | |
435 #endif | |
436 }//}}} | |
437 | |
438 void VimWidget::dropEvent (QDropEvent *e) // {{{ | |
439 { | |
440 #if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) || defined(PROTO) | |
441 QStrList urls; | |
442 | |
443 char_u **fnames; | |
444 int redo_dirs = FALSE; | |
445 int i; | |
446 int n; | |
447 int nfiles; | |
448 int url = FALSE; | |
449 | |
450 /* Count how many items there may be and normalize delimiters. */ | |
451 | |
452 if (QUriDrag::decode(e, urls)) | |
453 { | |
454 n = urls.count(); | |
455 fnames = (char_u **)lalloc((n+1) * sizeof(char_u *), TRUE); | |
456 nfiles = 0; | |
457 #if QT_VERSION>=300 | |
458 QPtrListIterator<char> it(urls); | |
459 for (; it.current(); ++it ) | |
460 { | |
461 KURL u(*it); | |
462 #else | |
463 for (i=0;i<urls.count();++i) | |
464 { | |
465 KURL u(urls.at(i)); | |
466 #endif | |
467 if ( !u.isLocalFile() ) | |
468 url = TRUE; | |
469 else | |
470 { | |
471 fnames[nfiles] = (char_u *)strdup((const char *)u.path()); | |
472 ++nfiles; | |
473 } | |
474 } | |
475 /* Real files (i.e. not http and not ftp) */ | |
476 if (url == FALSE) | |
477 { | |
478 if (nfiles == 1) | |
479 { | |
480 if (mch_isdir(fnames[0])) | |
481 { | |
482 /* Handle dropping a directory on Vim. */ | |
483 if (mch_chdir((char *)fnames[0]) == 0) | |
484 { | |
485 free(fnames[0]); | |
486 fnames[0] = NULL; | |
487 redo_dirs = TRUE; | |
488 } | |
489 } | |
490 } | |
491 else | |
492 { | |
493 /* Ignore any directories */ | |
494 for (i = 0; i < nfiles; ++i) | |
495 { | |
496 if (mch_isdir(fnames[i])) | |
497 { | |
498 vim_free(fnames[i]); | |
499 fnames[i] = NULL; | |
500 } | |
501 } | |
502 } | |
503 | |
504 if (0) | |
505 { | |
506 /* Shift held down, change to first file's directory */ | |
507 if (fnames[0] != NULL && vim_chdirfile(fnames[0]) == OK) | |
508 redo_dirs = TRUE; | |
509 } | |
510 else | |
511 { | |
512 char_u dirname[MAXPATHL]; | |
513 char_u *s; | |
514 if (mch_dirname(dirname, MAXPATHL) == OK) | |
515 for (i = 0; i < nfiles; ++i) | |
516 if (fnames[i] != NULL) | |
517 { | |
518 s = shorten_fname(fnames[i], dirname); | |
519 if (s != NULL && (s = vim_strsave(s)) != NULL) | |
520 { | |
521 vim_free(fnames[i]); | |
522 fnames[i] = s; | |
523 } | |
524 } | |
525 } | |
526 } | |
527 | |
528 /* Handle the drop, :edit or :split to get to the file */ | |
529 handle_drop(nfiles, fnames, FALSE); | |
530 | |
531 if (redo_dirs) | |
532 shorten_fnames(TRUE); | |
533 } | |
534 | |
535 /* Update the screen display */ | |
536 update_screen(NOT_VALID); | |
537 #ifdef FEAT_MENU | |
538 gui_update_menus(0); | |
539 #endif | |
540 setcursor(); | |
541 out_flush(); | |
542 gui_update_cursor(FALSE, FALSE); | |
543 gui_mch_flush(); | |
544 #endif | |
545 } // }}} | |
546 | |
547 void VimWidget::keyPressEvent( QKeyEvent *e ) // {{{ | |
548 { | |
549 gui_keypress(e); | |
550 } // }}} | |
551 | |
552 void gui_keypress(QKeyEvent *e) { // {{{ | |
553 int key = (int)e->key(); | |
554 int modifiers = 0,i; | |
555 uchar string[256],string2[256]; | |
556 uchar *s,*d; | |
557 Qt::ButtonState state = e->state(); | |
558 | |
559 QCString unistring = vmw->codec->fromUnicode(e->text()); | |
560 if (unistring.length()>0) | |
561 strncpy((char*)string, (const char*)unistring,unistring.length()); | |
562 string[unistring.length()] = 0; | |
563 int len=unistring.length(); | |
564 | |
565 // ignore certain keys | |
566 if (key == Qt::Key_Shift || key == Qt::Key_Alt || key == Qt::Key_Control || key == Qt::Key_Meta | |
567 || key == Qt::Key_CapsLock || key == Qt::Key_NumLock || key == Qt::Key_ScrollLock ) | |
568 { | |
569 e->ignore(); | |
570 return; | |
571 } | |
572 | |
573 #ifdef FEAT_MBYTE | |
574 if (input_conv.vc_type != CONV_NONE) | |
575 { | |
576 mch_memmove(string2, string, len); | |
577 len = convert_input(string2, len, sizeof(string2)); | |
578 s = string2; | |
579 } | |
580 else | |
581 #endif | |
582 s = string; | |
583 d = string; | |
584 for (i = 0; i < len; ++i) | |
585 { | |
586 *d++ = s[i]; | |
587 if (d[-1] == CSI && d + 2 < string + sizeof(string)) | |
588 { | |
589 /* Turn CSI into K_CSI. */ | |
590 *d++ = KS_EXTRA; | |
591 *d++ = (int)KE_CSI; | |
592 } | |
593 } | |
594 len = d - string; | |
595 | |
596 | |
597 // change shift-tab (backtab) into S_TAB | |
598 if ( key == Qt::Key_BackTab && state & Qt::ShiftButton) | |
599 key = Qt::Key_Tab; | |
600 | |
601 // Change C-@ and C-2 in NUL ? Gtk does this | |
602 if ( (key == Qt::Key_2 || key == Qt::Key_At) | |
603 && state & Qt::ControlButton ) | |
604 { | |
605 string[0] = NUL; | |
606 len = 1; | |
607 } | |
608 else if (len == 0 && (key == Qt::Key_Space || key == Qt::Key_Tab)) | |
609 { | |
610 /* When there are modifiers, these keys get zero length; we need the | |
611 * original key here to be able to add a modifier below. */ | |
612 string[0] = (key & 0xff); | |
613 len = 1; | |
614 } | |
615 /* Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character | |
616 * that already has the 8th bit set. | |
617 * Don't do this for <S-M-Tab>, that should become K_S_TAB with ALT. */ | |
618 if (len == 1 | |
619 && (key != Qt::Key_BackSpace && key != Qt::Key_Delete) | |
620 && (string[0] & 0x80) == 0 | |
621 && (state & Qt::AltButton) | |
622 && !(key == Qt::Key_Tab && (state & Qt::ShiftButton))) | |
623 { | |
624 string[0] |= 0x80; | |
625 #ifdef FEAT_MBYTE | |
626 if (enc_utf8) // convert to utf-8 | |
627 { | |
628 string[1] = string[0] & 0xbf; | |
629 string[0] = ((unsigned)string[0] >> 6) + 0xc0; | |
630 if (string[1] == CSI) | |
631 { | |
632 string[2] = KS_EXTRA; | |
633 string[3] = (int)KE_CSI; | |
634 len = 4; | |
635 } | |
636 else | |
637 len = 2; | |
638 } | |
639 #endif | |
640 } | |
641 | |
642 /* Check for special keys, making sure BS and DEL are recognised. */ | |
643 if (len == 0 || key == Qt::Key_BackSpace || key == Qt::Key_Delete) | |
644 { | |
645 while (special_keys[i].qtkey != 0 && special_keys[i].qtkey != key ) i++; | |
646 if (special_keys[i].qtkey != 0) | |
647 { | |
648 string[0] = CSI; | |
649 string[1] = special_keys[i].code0; | |
650 string[2] = special_keys[i].code1; | |
651 len = -3; | |
652 } | |
653 /* | |
654 for (i = 0; special_keys[i].qtkey != 0 ; i++) | |
655 { | |
656 if (special_keys[i].qtkey == key ) | |
657 { | |
658 string[0] = CSI; | |
659 string[1] = special_keys[i].code0; | |
660 string[2] = special_keys[i].code1; | |
661 len = -3; | |
662 break; | |
663 } | |
664 }*/ | |
665 } | |
666 | |
667 if (len == 0) | |
668 { | |
669 //no need to dump that, that's a QT problem, we can't do anything | |
670 //dbf("Unrecognised Key : %X %s", key, e->text().latin1()); | |
671 e->ignore(); | |
672 return; | |
673 } | |
674 | |
675 | |
676 /* Special keys (and a few others) may have modifiers */ | |
677 if (len == -3 || key == Qt::Key_Space || key == Qt::Key_Tab || | |
678 key == Qt::Key_Return || key == Qt::Key_Enter || | |
679 key == Qt::Key_Escape) | |
680 { | |
681 | |
682 modifiers = 0; | |
683 if (state & Qt::ShiftButton) modifiers |= MOD_MASK_SHIFT; | |
684 if (state & Qt::ControlButton) modifiers |= MOD_MASK_CTRL; | |
685 if (state & Qt::AltButton) modifiers |= MOD_MASK_ALT; | |
686 | |
687 /* | |
688 * For some keys a shift modifier is translated into another key | |
689 * code. Do we need to handle the case where len != 1 and | |
690 * string[0] != CSI? | |
691 */ | |
692 if (len == -3) | |
693 key = TO_SPECIAL(string[1], string[2]); | |
694 else | |
695 key = string[0]; | |
696 | |
697 key = simplify_key(key, &modifiers); | |
698 if (key == CSI) key=K_CSI; | |
699 | |
700 if (IS_SPECIAL(key)) | |
701 { | |
702 string[0] = CSI; | |
703 string[1] = K_SECOND(key); | |
704 string[2] = K_THIRD(key); | |
705 len = 3; | |
706 } | |
707 else | |
708 { | |
709 string[0] = key; | |
710 len = 1; | |
711 } | |
712 | |
713 | |
714 if (modifiers!=0) | |
715 { | |
716 uchar string2[10]; | |
717 string2[0] = CSI; | |
718 string2[1] = KS_MODIFIER; | |
719 string2[2] = modifiers; | |
720 add_to_input_buf(string2, 3); | |
721 } | |
722 | |
723 } /* special keys */ | |
724 | |
725 if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) | |
726 || (string[0] == intr_char && intr_char != Ctrl_C))) | |
727 { | |
728 trash_input_buf(); | |
729 got_int = TRUE; | |
730 } | |
731 | |
732 add_to_input_buf(string, len); | |
733 if (p_mh) | |
734 gui_mch_mousehide(TRUE); | |
735 | |
736 //DCOP Embedding stuff | |
737 //if we are here then the user has type something in the window, thus we can easily imagine that : | |
738 // 1 - text has changed (emit textChanged()) | |
739 // 2 - characters were interactively inserted (emit charactersInteractivelyInserted()) | |
740 // 3 - cursor position has changed ( emit cursorPositionChanged() ) | |
741 // 4 - selection has changed ? dunno yet //XXX | |
742 // 5 - undo changed too ? (each character typed in makes the undo changes anyway) | |
743 // conclusion : this makes a lot of things to send to the vim kpart, maybe too much | |
744 // for now i'll just send : keyboardEvent to the kpart with the event string as parameter, | |
745 // with current current position | |
746 // i'll do the same for mouseEvents | |
747 #if QT_VERSION>=300 | |
748 QByteArray params; | |
749 QDataStream stream(params, IO_WriteOnly); | |
750 stream << kapp->dcopClient()->appId() << unistring << gui.row << gui.col; | |
751 kapp->dcopClient()->emitDCOPSignal("keyboardEvent(QCString, QCString,int,int)", params); | |
752 #endif | |
753 e->ignore(); | |
754 } // }}} | |
755 | |
756 #ifdef FEAT_CLIENTSERVER | |
757 void VimWidget::serverActivate(WId id) //{{{ | |
758 { | |
759 if (serverName == NULL && serverDelayedStartName != NULL) | |
760 { | |
761 commWindow = id; | |
762 (void)serverRegisterName(qt_xdisplay(), serverDelayedStartName); | |
763 } | |
764 else | |
765 serverChangeRegisteredWindow( qt_xdisplay(), id); | |
766 }//}}} | |
767 #endif | |
768 | |
769 #ifdef FEAT_XIM | |
770 void VimWidget::imStartEvent(QIMEvent *e) | |
771 { | |
772 e->accept(); | |
773 } | |
774 | |
775 void VimWidget::imEndEvent(QIMEvent *e) | |
776 { | |
777 uchar string[256]; | |
778 | |
779 QCString unistring = vmw->codec->fromUnicode(e->text()); | |
780 if (unistring.length()>0) | |
781 strncpy((char*)string, (const char*)unistring,unistring.length()); | |
782 string[unistring.length()] = 0; | |
783 int len=unistring.length(); | |
784 | |
785 add_to_input_buf(string, len); | |
786 e->accept(); | |
787 } | |
788 | |
789 void VimWidget::imComposeEvent(QIMEvent *e) | |
790 { | |
791 //i should do something here, displaying the text somewhere ... (status area ?) | |
792 e->accept(); | |
793 } | |
794 #endif | |
795 | |
796 | |
797 void VimMainWindow::lock() | |
798 { | |
799 locked=true; | |
800 } | |
801 | |
802 void VimMainWindow::unlock() | |
803 { | |
804 locked=false; | |
805 } | |
806 | |
807 bool VimMainWindow::isLocked() | |
808 { | |
809 return locked; | |
810 } | |
811 | |
812 // ->resize VimWidget if not locked | |
813 // | |
814 void VimMainWindow::resizeEvent ( QResizeEvent *e ) //{{{ | |
815 { | |
816 if ( vmw->isLocked() ) return; | |
817 //remove toolbar and menubar height | |
818 int height = e->size().height(); | |
819 int width = e->size().width(); | |
820 | |
821 if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled() | |
822 #if QT_VERSION>=300 | |
823 && !vmw->menuBar()->isTopLevelMenu() | |
824 #endif | |
825 ) | |
826 height -= vmw->menuBar()->height(); | |
827 #ifdef FEAT_TOOLBAR | |
828 if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() && | |
829 (vmw->toolBar()->barPos()==KToolBar::Top || | |
830 vmw->toolBar()->barPos()==KToolBar::Bottom)) | |
831 height -= vmw->toolBar()->height(); | |
832 | |
833 if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() && | |
834 (vmw->toolBar()->barPos()==KToolBar::Left || | |
835 vmw->toolBar()->barPos()==KToolBar::Right)) | |
836 width -= vmw->toolBar()->width(); | |
837 #endif | |
838 height = ( ((int)(height/gui.char_height))*gui.char_height ); | |
839 if (!vmw->isLocked()) gui_resize_shell(width,height); | |
840 }//}}} | |
841 | |
842 void VimWidget::focusInEvent( QFocusEvent * fe ) // {{{ | |
843 { | |
844 gui_focus_change(true); | |
845 | |
846 if (blink_state == BLINK_NONE) | |
847 gui_mch_start_blink(); | |
848 } // }}} | |
849 | |
850 void VimWidget::focusOutEvent( QFocusEvent * fe )//{{{ | |
851 { | |
852 gui_focus_change(false); | |
853 | |
854 if (blink_state != BLINK_NONE) | |
855 gui_mch_stop_blink(); | |
856 }//}}} | |
857 | |
858 void VimWidget::set_blink_time( long wait, long on, long off)//{{{ | |
859 { | |
860 blink_wait_time = wait; | |
861 blink_on_time = on; | |
862 blink_off_time = off; | |
863 }//}}} | |
864 | |
865 void VimWidget::start_cursor_blinking()//{{{ | |
866 { | |
867 if (blink_timer.isActive()) blink_timer.stop(); | |
868 | |
869 /* Only switch blinking on if none of the times is zero */ | |
870 if (blink_wait_time && blink_on_time && blink_off_time && gui.in_focus) | |
871 { | |
872 blink_state = BLINK_ON; | |
873 gui_update_cursor(TRUE, FALSE); | |
874 // The first blink appears after wait_time | |
875 blink_timer.start( blink_wait_time, true); | |
876 } | |
877 }//}}} | |
878 | |
879 void VimWidget::blink_cursor()//{{{ | |
880 { | |
881 if (blink_state == BLINK_ON) | |
882 { | |
883 // set cursor off | |
884 gui_undraw_cursor(); | |
885 blink_state = BLINK_OFF; | |
886 blink_timer.start( blink_off_time, true); | |
887 } | |
888 else | |
889 { | |
890 // set cursor on | |
891 gui_update_cursor(TRUE, FALSE); | |
892 blink_state = BLINK_ON; | |
893 blink_timer.start( blink_on_time, true); | |
894 } | |
895 }//}}} | |
896 | |
897 void VimWidget::stop_cursor_blinking()//{{{ | |
898 { | |
899 if (blink_timer.isActive()) blink_timer.stop(); | |
900 | |
901 if (blink_state == BLINK_OFF) | |
902 gui_update_cursor(TRUE, FALSE); | |
903 | |
904 blink_state = BLINK_NONE; | |
905 }//}}} | |
906 | |
907 #ifdef FEAT_MZSCHEME | |
908 void VimWidget::timerEvent( QTimerEvent * evnt)//{{{ | |
909 { | |
910 if (evnt->timerId() == mzscheme_timer_id) | |
911 timer_proc(); | |
912 }//}}} | |
913 | |
914 void VimWidget::enable_mzscheme_threads()//{{{ | |
915 { | |
916 mzscheme_timer_id = startTimer(p_mzq); | |
917 }//}}} | |
918 | |
919 void VimWidget::disable_mzscheme_threads()//{{{ | |
920 { | |
921 killTimer(mzscheme_timer_id); | |
922 }//}}} | |
923 #endif | |
924 | |
925 void VimWidget::flash()//{{{ | |
926 { | |
927 QPainter p(this); | |
928 | |
929 p.setRasterOp(Qt::XorROP); | |
930 p.fillRect(geometry(),QColor(0xFF,0xFF,0xFF)); | |
931 p.flush(); | |
932 //FIXME: Make this a little smarter. Maybe add a timer or something | |
933 usleep(19000); | |
934 p.fillRect(geometry(),QColor(0xFF,0xFF,0xFF)); | |
935 p.flush(); | |
936 p.end(); | |
937 }//}}} | |
938 | |
939 | |
940 /* | |
941 * The main Window | |
942 */ | |
943 VimMainWindow::VimMainWindow ( const char *name , WFlags f)//{{{ | |
944 :KMainWindow(0L, name,f) | |
945 { | |
946 #ifdef FEAT_CLIENTSERVER | |
947 oldFilter = qt_set_x11_event_filter( kvim_x11_event_filter ); | |
948 #endif | |
949 if (echo_wid_arg== 1) | |
950 { | |
951 fprintf(stderr, "WID: %ld\n", (long)winId()); | |
952 fflush(stderr); | |
953 } | |
954 | |
955 w = new VimWidget(this, "main vim widget"); | |
956 gui.w = w; | |
957 setFocusProxy(w); | |
958 w->setFocus(); | |
959 have_tearoff=0; | |
960 | |
961 finddlg=new KEdFind (this,0,false); | |
962 repldlg=new KEdReplace (this,0,false); | |
963 QObject::connect( finddlg, SIGNAL(search()), this, SLOT(slotSearch()) ); | |
964 QObject::connect( repldlg, SIGNAL(find()), this, SLOT(slotFind()) ); | |
965 QObject::connect( repldlg, SIGNAL(replace()), this, SLOT(slotReplace()) ); | |
966 QObject::connect( repldlg, SIGNAL(replaceAll()), this, SLOT(slotReplaceAll()) ); | |
967 | |
968 #ifdef FEAT_TOOLBAR | |
969 connect(toolBar(), SIGNAL(clicked(int)), this, SLOT(menu_activated(int))); | |
970 #endif | |
971 #ifdef FEAT_CLIENTSERVER | |
972 w->serverActivate(winId()); | |
973 | |
974 if (serverName!=NULL) | |
975 kapp->dcopClient()->registerAs(QCString((const char*)serverName),false); | |
976 else if (serverDelayedStartName!=NULL) | |
977 kapp->dcopClient()->registerAs(QCString((const char*)serverDelayedStartName),false); | |
978 else if (argServerName!=NULL) | |
979 kapp->dcopClient()->registerAs(argServerName->utf8(),false); | |
980 #else | |
981 if (argServerName!=NULL) | |
982 kapp->dcopClient()->registerAs(argServerName->utf8(),false); | |
983 #endif | |
984 QXEmbed::initialize(); | |
985 | |
986 }//{{{ | |
987 | |
988 bool VimMainWindow::queryClose()//{{{ | |
989 { | |
990 gui_shell_closed(); | |
991 return true; | |
992 }//}}} | |
993 | |
994 bool VimMainWindow::queryExit()//{{{ | |
995 { | |
996 return true; | |
997 }//}}} | |
998 | |
999 void VimMainWindow::menu_activated(int dx)//{{{ | |
1000 { | |
1001 #ifdef FEAT_MENU | |
1002 if (!dx) { // tearoff | |
1003 return; | |
1004 } | |
1005 gui_mch_set_foreground(); | |
1006 gui_menu_cb((VimMenu *) dx); | |
1007 #endif | |
1008 }//}}} | |
1009 | |
1010 | |
1011 void VimMainWindow::clipboard_selection_update(){//{{{ | |
1012 if (kapp->clipboard()->ownsSelection()) | |
1013 clip_own_selection(&clip_star); | |
1014 else | |
1015 clip_lose_selection(&clip_star); | |
1016 }//}}} | |
1017 | |
1018 void VimMainWindow::clipboard_data_update(){//{{{ | |
1019 #if QT_VERSION>=300 | |
1020 if (kapp->clipboard()->ownsClipboard()) | |
1021 clip_own_selection(&clip_plus); | |
1022 else | |
1023 clip_lose_selection(&clip_plus); | |
1024 #else | |
1025 if (kapp->clipboard()->ownsSelection()) | |
1026 clip_own_selection(&clip_star); | |
1027 else | |
1028 clip_lose_selection(&clip_star); | |
1029 #endif | |
1030 }//}}} | |
1031 | |
1032 void VimMainWindow::slotSearch()//{{{ | |
1033 { | |
1034 QString find_text; | |
1035 bool direction_down = TRUE; | |
1036 bool casesensitive = TRUE; | |
1037 int flags = FRD_FINDNEXT; | |
1038 | |
1039 find_text = finddlg->getText(); | |
1040 direction_down = !(finddlg->get_direction()); | |
1041 casesensitive = finddlg->case_sensitive(); | |
1042 // if (casesensitive) find_text = "\\C" + find_text; | |
1043 // else find_text = "\\c" + find_text; | |
1044 if (casesensitive) flags|=FRD_MATCH_CASE; | |
1045 QCString unistring = vmw->codec->fromUnicode(find_text); | |
1046 gui_do_findrepl(flags, (char_u *)(const char *)unistring, NULL,(int)direction_down); | |
1047 }//}}} | |
1048 | |
1049 void VimMainWindow::slotFind()//{{{ | |
1050 { | |
1051 QString find_text; | |
1052 bool direction_down=TRUE; | |
1053 bool casesensitive = TRUE; | |
1054 int flags = FRD_R_FINDNEXT; | |
1055 | |
1056 find_text=repldlg->getText(); | |
1057 direction_down = !(repldlg->get_direction()); | |
1058 casesensitive = repldlg->case_sensitive(); | |
1059 // if (casesensitive) find_text = "\\C" + find_text; | |
1060 // else find_text = "\\c" + find_text; | |
1061 if (casesensitive) flags|=FRD_MATCH_CASE; | |
1062 | |
1063 QCString unistring = vmw->codec->fromUnicode(find_text); | |
1064 gui_do_findrepl(flags, (char_u *)(const char *)unistring, NULL,(int)direction_down); | |
1065 }//}}} | |
1066 | |
1067 void VimMainWindow::slotReplace()//{{{ | |
1068 { | |
1069 QString find_text; | |
1070 QString repl_text; | |
1071 bool direction_down=TRUE; | |
1072 bool casesensitive = TRUE; | |
1073 int flags = FRD_REPLACE; | |
1074 | |
1075 find_text=repldlg->getText(); | |
1076 repl_text=repldlg->getReplaceText(); | |
1077 direction_down = !(repldlg->get_direction()); | |
1078 //if (casesensitive) find_text = "\\C" + find_text; | |
1079 //else find_text = "\\c" + find_text; | |
1080 if (casesensitive) flags|=FRD_MATCH_CASE; | |
1081 | |
1082 QCString unistring = vmw->codec->fromUnicode(find_text); | |
1083 QCString unistring2 = vmw->codec->fromUnicode(repl_text); | |
1084 gui_do_findrepl(flags, (char_u *)(const char *)unistring,(char_u *)(const char*)unistring2,(int)direction_down); | |
1085 }//}}} | |
1086 | |
1087 void VimMainWindow::slotReplaceAll()//{{{ | |
1088 { | |
1089 QString find_text; | |
1090 QString repl_text; | |
1091 bool direction_down=TRUE; | |
1092 bool casesensitive = TRUE; | |
1093 int flags = FRD_REPLACEALL; | |
1094 | |
1095 find_text=repldlg->getText(); | |
1096 repl_text=repldlg->getReplaceText(); | |
1097 direction_down = !(repldlg->get_direction()); | |
1098 casesensitive = repldlg->case_sensitive(); | |
1099 // if (casesensitive) find_text = "\\C" + find_text; | |
1100 // else find_text = "\\c" + find_text; | |
1101 if (casesensitive) flags|=FRD_MATCH_CASE; | |
1102 QCString unistring = vmw->codec->fromUnicode(find_text); | |
1103 QCString unistring2 = vmw->codec->fromUnicode(repl_text); | |
1104 gui_do_findrepl(flags, (char_u *)(const char *)unistring,(char_u *)(const char*)unistring2,(int)direction_down); | |
1105 }//}}} | |
1106 | |
1107 void VimMainWindow::showAboutKDE() | |
1108 { | |
1109 KAboutKDE *kde = new KAboutKDE(this); | |
1110 kde->show(); | |
1111 } | |
1112 | |
1113 void VimMainWindow::showAboutApplication()//{{{ | |
1114 { | |
1115 KAboutData *aboutData = new KAboutData ( | |
1116 "kvim" | |
1117 , I18N_NOOP("KVim") | |
1118 , VIM_VERSION_SHORT | |
1119 , I18N_NOOP("Vim in a KDE interface") | |
1120 , 0 | |
1121 , "(c) Vim Team, \":help credits\" for more infos.\nType \":help iccf\" to see how you can help the children in Uganda" | |
1122 , 0l | |
1123 , "http://freehackers.org/kvim" | |
1124 , "kvim-dev@freenux.org" | |
1125 ); | |
1126 | |
1127 aboutData->addAuthor("Bram Moolenaar", | |
1128 I18N_NOOP("Main vim author"), | |
1129 "Bram@vim.org", | |
1130 "http://www.vim.org/"); | |
1131 aboutData->addAuthor("Thomas Capricelli", | |
1132 I18N_NOOP("KDE porting"), | |
1133 "orzel@freehackers.org", | |
1134 "http://orzel.freehackers.org"); | |
1135 aboutData->addAuthor("Philippe Fremy", | |
1136 I18N_NOOP("KDE porting"), | |
1137 "pfremy@chez.com", | |
1138 "http://www.freehackers.org/kvim"); | |
1139 aboutData->addAuthor("Mark Westcott", | |
1140 I18N_NOOP("Qtopia porting, maintainer of the Qtopia part"), | |
1141 "mark@houseoffish.org", | |
1142 "http://houseoffish.org"); | |
1143 aboutData->addAuthor("Mickael Marchand", | |
1144 I18N_NOOP("KDE porting, maintainer"), | |
1145 "marchand@kde.org", | |
1146 "http://freenux.org"); | |
1147 aboutData->addAuthor("Many other people", | |
1148 I18N_NOOP("type :help credits for more infos") | |
1149 ); | |
1150 aboutData->addCredit("Vince Negri", | |
1151 I18N_NOOP("Antialiasing support, Color fixes"), | |
1152 "vnegri@asl-electronics.co.uk"); | |
1153 aboutData->addCredit("Malte Starostik", | |
1154 I18N_NOOP("Patch for performance improvement"), | |
1155 "malte@kde.org"); | |
1156 aboutData->addCredit("Mark Stosberg", | |
1157 I18N_NOOP("Provided a FreeBSD box to debug KVim on BSD"), | |
1158 "mark@summersault.com" | |
1159 ); | |
1160 aboutData->addCredit("Henrik Skott", | |
1161 I18N_NOOP("Font patch when KDE not configured"), | |
1162 "henrik.skott@hem.utfors.se" | |
1163 ); | |
1164 aboutData->addCredit("Kailash Sethuraman", | |
1165 I18N_NOOP("NetBSD configure/compilation fixes") | |
1166 ); | |
1167 aboutData->setLicenseText( | |
1168 "KVim as an extension of Vim follows Vim license : \n\ | |
1169 Vim is Charityware. You can use and copy it as much as you like, but you are\n\ | |
1170 encouraged to make a donation to orphans in Uganda. Please read the file\n\ | |
1171 runtime/doc/uganda.txt for details.\n\ | |
1172 \n\ | |
1173 There are no restrictions on distributing an unmodified copy of Vim. Parts of\n\ | |
1174 Vim may also be distributed, but this text must always be included. You are\n\ | |
1175 allowed to include executables that you made from the unmodified Vim sources,\n\ | |
1176 your own usage examples and Vim scripts.\n\ | |
1177 \n\ | |
1178 If you distribute a modified version of Vim, you are encouraged to send the\n\ | |
1179 maintainer a copy, including the source code. Or make it available to the\n\ | |
1180 maintainer through ftp; let him know where it can be found. If the number of\n\ | |
1181 changes is small (e.g., a modified Makefile) e-mailing the diffs will do.\n\ | |
1182 When the maintainer asks for it (in any way) you must make your changes,\n\ | |
1183 including source code, available to him.\n\ | |
1184 \n\ | |
1185 The maintainer reserves the right to include any changes in the official\n\ | |
1186 version of Vim. This is negotiable. You are not allowed to distribute a\n\ | |
1187 modified version of Vim when you are not willing to make the source code\n\ | |
1188 available to the maintainer.\n\ | |
1189 \n\ | |
1190 The current maintainer is Bram Moolenaar <Bram@vim.org>. If this changes, it\n\ | |
1191 will be announced in appropriate places (most likely www.vim.org and\n\ | |
1192 comp.editors). When it is completely impossible to contact the maintainer,\n\ | |
1193 the obligation to send him modified source code ceases.\n\ | |
1194 \n\ | |
1195 It is not allowed to remove these restrictions from the distribution of the\n\ | |
1196 Vim sources or parts of it. These restrictions may also be used for previous\n\ | |
1197 Vim releases instead of the text that was included with it."); | |
1198 | |
1199 KAboutApplication *about = new KAboutApplication(aboutData); | |
1200 about->show(); | |
1201 }//}}} | |
1202 | |
1203 void VimMainWindow::showTipOfTheDay() | |
1204 { | |
1205 #if QT_VERSION>=300 | |
1206 KTipDialog::showTip (vmw,QString::null,true); | |
1207 #endif | |
1208 } | |
1209 | |
1210 void VimMainWindow::buffersToolbar() | |
1211 { | |
1212 | |
1213 } | |
1214 | |
1215 void VimMainWindow::showBugReport() | |
1216 { | |
1217 KBugReport *bug= new KBugReport(this,true); | |
1218 bug->show(); | |
1219 } | |
1220 /* | |
1221 * Vim Dialog | |
1222 * | |
1223 * Returns: | |
1224 * 0: Cancel | |
1225 * 1- : nb of the pressed button | |
1226 */ | |
1227 | |
1228 VimDialog::VimDialog (int type, /* type of dialog *///{{{ | |
1229 char_u * title, /* title of dialog */ | |
1230 char_u * message, /* message text */ | |
1231 char_u * buttons, /* names of buttons */ | |
1232 int def_but, /* default button */ | |
1233 char_u *textfield ) /* input field */ | |
1234 :QDialog(vmw, "vim generic dialog", true), // true is for "modal" | |
1235 mapper(this, "dialog signal mapper") | |
1236 { | |
1237 /* | |
1238 * Create Icon | |
1239 */ | |
1240 char ** icon_data; | |
1241 switch (type) | |
1242 { | |
1243 case VIM_GENERIC: | |
1244 icon_data = generic_xpm; | |
1245 break; | |
1246 case VIM_ERROR: | |
1247 icon_data = error_xpm; | |
1248 break; | |
1249 case VIM_WARNING: | |
1250 icon_data = alert_xpm; | |
1251 break; | |
1252 case VIM_INFO: | |
1253 icon_data = info_xpm; | |
1254 break; | |
1255 case VIM_QUESTION: | |
1256 icon_data = quest_xpm; | |
1257 break; | |
1258 default: | |
1259 icon_data = generic_xpm; | |
1260 }; | |
1261 QLabel * icon = new QLabel( this ); | |
1262 icon->setPixmap( QPixmap( (const char **) icon_data ) ); | |
1263 icon->setFixedSize( icon->sizeHint() ); | |
1264 | |
1265 QLabel * text = new QLabel( (const char *)message, this ); | |
1266 text->setAlignment( AlignHCenter | AlignVCenter | ExpandTabs ); | |
1267 | |
1268 QStringList buttonText = QStringList::split( DLG_BUTTON_SEP, (char *) buttons); | |
1269 int butNb = buttonText.count(); | |
1270 | |
1271 /* | |
1272 * Layout | |
1273 */ | |
1274 | |
1275 QVBoxLayout * vly = new QVBoxLayout( this, 5, 5 ); | |
1276 QHBoxLayout * hly1 = new QHBoxLayout( vly, 5); | |
1277 hly1->addWidget( icon ); | |
1278 hly1->addWidget( text ); | |
1279 QHBoxLayout * hly3 = new QHBoxLayout ( vly , 5); | |
1280 if (textfield!=NULL) | |
1281 { | |
1282 entry = new QLineEdit((const char *)textfield,this); | |
1283 entry->setText((const char *)textfield); | |
1284 hly3->addWidget( entry ); | |
1285 ret=textfield; | |
1286 } | |
1287 else | |
1288 entry=NULL; | |
1289 | |
1290 QHBoxLayout * hly2 = new QHBoxLayout( vly, 15); | |
1291 QString s; | |
1292 QPushButton * pushButton = 0L; | |
1293 for (int i=0; i<butNb; i++) | |
1294 { | |
1295 s = buttonText[i]; | |
1296 pushButton = new QPushButton(s, this ); | |
1297 if (s.find('&') != -1) | |
1298 pushButton->setAccel(s.at(s.find('&')+1).latin1()); | |
1299 | |
1300 hly2->addWidget( pushButton ); | |
1301 if (i == def_but-1) | |
1302 { | |
1303 pushButton->setDefault( true ); | |
1304 pushButton->setAutoDefault( true ); | |
1305 setResult( i+1 ); | |
1306 } | |
1307 connect(pushButton, SIGNAL(clicked()), &mapper, SLOT(map())); | |
1308 mapper.setMapping(pushButton, i+1); | |
1309 } | |
1310 connect( &mapper, SIGNAL(mapped(int)), this, SLOT(done(int))); | |
1311 | |
1312 setCaption((const char *) title); | |
1313 | |
1314 vly->activate(); | |
1315 }//}}} | |
1316 | |
1317 void VimDialog::done(int r) | |
1318 { | |
1319 if (entry!=NULL) | |
1320 { | |
1321 if (r) | |
1322 { | |
1323 QCString unistring=vmw->codec->fromUnicode(entry->text()); | |
1324 STRCPY(ret,(const char*)unistring); | |
1325 } | |
1326 else | |
1327 *ret=NUL; | |
1328 } | |
1329 QDialog::done(r); | |
1330 } | |
1331 | |
1332 /* | |
1333 * ScrollBar pool handling | |
1334 */ | |
1335 SBPool::SBPool(void)//{{{ | |
1336 :mapper(this, "SBPool signal mapper") | |
1337 { | |
1338 connect(&mapper, SIGNAL(mapped(int)), this, SLOT(sbUsed(int))); | |
1339 }//}}} | |
1340 | |
1341 | |
1342 void SBPool::create(GuiScrollbar * sb, int orient)//{{{ | |
1343 { | |
1344 switch(orient) | |
1345 { | |
1346 case SBAR_HORIZ: | |
1347 sb->w = new QScrollBar(QScrollBar::Horizontal, vmw); | |
1348 break; | |
1349 case SBAR_VERT: | |
1350 sb->w = new QScrollBar(QScrollBar::Vertical, vmw); | |
1351 break; | |
1352 default: | |
1353 sb->w = 0; | |
1354 return; | |
1355 } | |
1356 | |
1357 connect(sb->w, SIGNAL(valueChanged(int)), &mapper, SLOT(map())); | |
1358 mapper.setMapping(sb->w, (int)sb); | |
1359 }//}}} | |
1360 | |
1361 | |
1362 void SBPool::sbUsed(int who)//{{{ | |
1363 { | |
1364 GuiScrollbar *sb = (GuiScrollbar*)who; | |
1365 gui_drag_scrollbar( sb, sb->w->value(), FALSE); | |
1366 }//}}} | |
1367 | |
1368 | |
1369 void SBPool::destroy(GuiScrollbar * sb)//{{{ | |
1370 { | |
1371 if (!sb->w) return; | |
1372 | |
1373 delete sb->w; | |
1374 sb->w = 0; | |
1375 }//}}} | |
1376 | |
1377 #ifdef FEAT_CLIENTSERVER | |
1378 static int kvim_x11_event_filter( XEvent* e)//{{{ | |
1379 { | |
1380 if (e->xproperty.type == PropertyNotify | |
1381 && e->xproperty.atom == commProperty | |
1382 && e->xproperty.window == commWindow | |
1383 && e->xproperty.state == PropertyNewValue) | |
1384 serverEventProc(qt_xdisplay(), e); | |
1385 | |
1386 if (oldFilter) return oldFilter( e ); | |
1387 return FALSE; | |
1388 }//}}} | |
1389 #endif | |
1390 | |
1391 //add some QT 3 fonts usefull functions | |
1392 #if QT_VERSION<300 | |
1393 QString KVimUtils::toString(QFont *f) | |
1394 { | |
1395 QStringList l; | |
1396 l.append(f->family()); | |
1397 l.append(QString::number(f->pointSize())); | |
1398 l.append(QString::number(f->pixelSize())); | |
1399 l.append(QString::number((int)f->styleHint())); | |
1400 l.append(QString::number(f->weight())); | |
1401 l.append(QString::number((int)f->italic())); | |
1402 l.append(QString::number((int)f->underline())); | |
1403 l.append(QString::number((int)f->strikeOut())); | |
1404 l.append(QString::number((int)f->fixedPitch())); | |
1405 l.append(QString::number((int)f->rawMode())); | |
1406 return l.join(","); | |
1407 } | |
1408 | |
1409 bool KVimUtils::fromString(QFont *f, QString descrip) | |
1410 { | |
1411 QStringList l(QStringList::split(',', descrip)); | |
1412 | |
1413 int count = l.count(); | |
1414 if (count != 10 && count != 9) | |
1415 return FALSE; | |
1416 | |
1417 f->setFamily(l[0]); | |
1418 f->setPointSize(l[1].toInt()); | |
1419 if ( count == 9 ) | |
1420 { | |
1421 f->setStyleHint((QFont::StyleHint) l[2].toInt()); | |
1422 f->setWeight(l[3].toInt()); | |
1423 f->setItalic(l[4].toInt()); | |
1424 f->setUnderline(l[5].toInt()); | |
1425 f->setStrikeOut(l[6].toInt()); | |
1426 f->setFixedPitch(l[7].toInt()); | |
1427 f->setRawMode(l[8].toInt()); | |
1428 } | |
1429 else | |
1430 { | |
1431 f->setPixelSize(l[2].toInt()); | |
1432 f->setStyleHint((QFont::StyleHint) l[3].toInt()); | |
1433 f->setWeight(l[4].toInt()); | |
1434 f->setItalic(l[5].toInt()); | |
1435 f->setUnderline(l[6].toInt()); | |
1436 f->setStrikeOut(l[7].toInt()); | |
1437 f->setFixedPitch(l[8].toInt()); | |
1438 f->setRawMode(l[9].toInt()); | |
1439 } | |
1440 return TRUE; | |
1441 } | |
1442 #endif | |
1443 | |
1444 QString KVimUtils::convertEncodingName(QString name) | |
1445 { | |
1446 if (name.startsWith("ucs") || name.startsWith("utf-16")) return QString("utf16"); | |
1447 if (name=="cp950") return QString("Big5"); | |
1448 return QString(); | |
1449 } |