2 front end for gtk/gnome version
4 Copyright (C) 1996, 1997 the Free Software Foundation
6 Authors: 1996, 1997 Paul Sheer
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
29 #include "gdk/gdkkeysyms.h"
30 #include "gtk/gtkmain.h"
31 #include "gtk/gtkselection.h"
32 #include "gtk/gtksignal.h"
34 #include "mousemark.h"
36 #define EDIT_BORDER_ROOM 1
37 #define MIN_EDIT_WIDTH_LINES 20
38 #define MIN_EDIT_HEIGHT_LINES 10
40 #define GDK_FONT_XFONT(font) (((GdkFontPrivate*) font)->xfont)
42 int edit_key_emulation
= 0;
43 int column_highlighting
= 0;
45 static GtkWidgetClass
*parent_class
= NULL
;
47 WEdit
*edit_init (WEdit
* edit
, int lines
, int columns
, const char *filename
, const char *text
, const char *dir
, unsigned long text_size
);
48 void edit_destroy_callback (CWidget
* w
);
49 int edit_translate_key (unsigned int x_keycode
, long x_key
, int x_state
, int *cmd
, int *ch
);
50 void gtk_edit_alloc_colors (GtkEdit
*edit
, GdkColormap
*colormap
);
51 static void gtk_edit_set_position (GtkEditable
*editable
, gint position
);
52 void edit_mouse_mark (WEdit
* edit
, XEvent
* event
, int double_click
);
53 void edit_move_to_prev_col (WEdit
* edit
, long p
);
54 int edit_load_file_from_filename (WEdit
*edit
, char *exp
);
55 static void gtk_edit_set_selection (GtkEditable
* editable
, gint start
, gint end
);
57 guchar gtk_edit_font_width_per_char
[256];
58 int gtk_edit_option_text_line_spacing
;
59 int gtk_edit_option_font_ascent
;
60 int gtk_edit_option_font_descent
;
61 int gtk_edit_option_font_mean_width
;
62 int gtk_edit_fixed_font
;
64 #if defined NEVER_DEFINED_ONLY_A_HACK
65 const char *dummy_txt_0
= _("&Dismiss");
66 const char *dummy_txt_1
= _(" Enter file name: ");
69 static void clear_focus_area (GtkEdit
*edit
, gint area_x
, gint area_y
, gint area_width
, gint area_height
)
74 void gtk_edit_freeze (GtkEdit
*edit
)
79 void gtk_edit_insert (GtkEdit
*edit
,
87 edit_insert (GTK_EDIT (edit
)->editor
, *chars
++);
90 void gtk_edit_set_editable (GtkEdit
*text
,
96 void gtk_edit_thaw (GtkEdit
*text
)
102 void gtk_edit_configure_font_dimensions (GtkEdit
* edit
)
110 f
= GDK_FONT_XFONT (edit
->editable
.widget
.style
->font
);
111 p
= _ ("The Quick Brown Fox Jumps Over The Lazy Dog");
112 for (i
= ' '; i
<= '~'; i
++)
114 if (XTextWidth (f
, "M", 1) == XTextWidth (f
, "M", 1))
115 gtk_edit_fixed_font
= 1;
117 gtk_edit_fixed_font
= 0;
118 XTextExtents (f
, q
, '~' - ' ', &direction
, >k_edit_option_font_ascent
, >k_edit_option_font_descent
, &s
);
119 gtk_edit_option_font_mean_width
= XTextWidth (f
, p
, strlen (p
)) / strlen (p
);
120 for (i
= 0; i
< 256; i
++) {
121 t
= (unsigned char) i
;
122 if (i
> f
->max_char_or_byte2
|| i
< f
->min_char_or_byte2
) {
123 gtk_edit_font_width_per_char
[i
] = 0;
125 gtk_edit_font_width_per_char
[i
] = XTextWidth (f
, (char *) &t
, 1);
130 void gtk_edit_set_adjustments (GtkEdit
* edit
,
131 GtkAdjustment
* hadj
,
132 GtkAdjustment
* vadj
)
134 g_return_if_fail (edit
!= NULL
);
135 g_return_if_fail (GTK_IS_EDIT (edit
));
137 if (edit
->hadj
&& (edit
->hadj
!= hadj
)) {
138 gtk_signal_disconnect_by_data (GTK_OBJECT (edit
->hadj
), edit
);
139 gtk_object_unref (GTK_OBJECT (edit
->hadj
));
141 if (edit
->vadj
&& (edit
->vadj
!= vadj
)) {
142 gtk_signal_disconnect_by_data (GTK_OBJECT (edit
->vadj
), edit
);
143 gtk_object_unref (GTK_OBJECT (edit
->vadj
));
146 hadj
= GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
149 vadj
= GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
151 if (edit
->hadj
!= hadj
) {
153 gtk_object_ref (GTK_OBJECT (edit
->hadj
));
154 gtk_object_sink (GTK_OBJECT (edit
->hadj
));
157 gtk_signal_connect (GTK_OBJECT (edit
->hadj
), "changed",
158 (GtkSignalFunc
) gtk_edit_adjustment
,
160 gtk_signal_connect (GTK_OBJECT (edit
->hadj
), "value_changed",
161 (GtkSignalFunc
) gtk_edit_adjustment
,
163 gtk_signal_connect (GTK_OBJECT (edit
->hadj
), "disconnect",
164 (GtkSignalFunc
) gtk_edit_disconnect
,
168 if (edit
->vadj
!= vadj
) {
170 gtk_object_ref (GTK_OBJECT (edit
->vadj
));
171 gtk_object_sink (GTK_OBJECT (edit
->vadj
));
174 gtk_signal_connect (GTK_OBJECT (edit
->vadj
), "changed",
175 (GtkSignalFunc
) gtk_edit_adjustment
,
177 gtk_signal_connect (GTK_OBJECT (edit
->vadj
), "value_changed",
178 (GtkSignalFunc
) gtk_edit_adjustment
,
180 gtk_signal_connect (GTK_OBJECT (edit
->vadj
), "disconnect",
181 (GtkSignalFunc
) gtk_edit_disconnect
,
187 GtkWidget
*gtk_edit_new (GtkAdjustment
* hadj
,
188 GtkAdjustment
* vadj
)
191 edit
= gtk_type_new (gtk_edit_get_type ());
192 gtk_edit_set_adjustments (edit
, hadj
, vadj
);
193 gtk_edit_configure_font_dimensions (edit
);
194 return GTK_WIDGET (edit
);
197 static void gtk_edit_realize (GtkWidget
* widget
)
200 GtkEditable
*editable
;
201 GdkWindowAttr attributes
;
202 GdkColormap
*colormap
;
203 gint attributes_mask
;
205 g_return_if_fail (widget
!= NULL
);
206 g_return_if_fail (GTK_IS_EDIT (widget
));
208 edit
= GTK_EDIT (widget
);
209 editable
= GTK_EDITABLE (widget
);
210 GTK_WIDGET_SET_FLAGS (edit
, GTK_REALIZED
);
212 attributes
.window_type
= GDK_WINDOW_CHILD
;
213 attributes
.x
= widget
->allocation
.x
;
214 attributes
.y
= widget
->allocation
.y
;
215 attributes
.width
= widget
->allocation
.width
;
216 attributes
.height
= widget
->allocation
.height
;
217 attributes
.wclass
= GDK_INPUT_OUTPUT
;
218 attributes
.visual
= gtk_widget_get_visual (widget
);
219 colormap
= attributes
.colormap
= gtk_widget_get_colormap (widget
);
220 attributes
.event_mask
= gtk_widget_get_events (widget
);
221 attributes
.event_mask
|= (GDK_EXPOSURE_MASK
|
222 GDK_BUTTON_PRESS_MASK
|
223 GDK_BUTTON_RELEASE_MASK
|
224 GDK_BUTTON_MOTION_MASK
|
225 GDK_ENTER_NOTIFY_MASK
|
226 GDK_LEAVE_NOTIFY_MASK
|
227 GDK_KEY_RELEASE_MASK
|
229 attributes_mask
= GDK_WA_X
| GDK_WA_Y
| GDK_WA_VISUAL
| GDK_WA_COLORMAP
;
231 widget
->window
= gdk_window_new (gtk_widget_get_parent_window (widget
), &attributes
, attributes_mask
);
232 gdk_window_set_user_data (widget
->window
, edit
);
234 attributes
.x
= (widget
->style
->klass
->xthickness
+ EDIT_BORDER_ROOM
);
235 attributes
.y
= (widget
->style
->klass
->ythickness
+ EDIT_BORDER_ROOM
);
236 attributes
.width
= widget
->allocation
.width
- attributes
.x
* 2;
237 attributes
.height
= widget
->allocation
.height
- attributes
.y
* 2;
239 edit
->text_area
= gdk_window_new (widget
->window
, &attributes
, attributes_mask
);
240 gdk_window_set_user_data (edit
->text_area
, edit
);
242 widget
->style
= gtk_style_attach (widget
->style
, widget
->window
);
244 gtk_edit_alloc_colors (edit
, colormap
);
246 /* Can't call gtk_style_set_background here because it's handled specially */
247 gdk_window_set_background (widget
->window
, &edit
->color
[1]);
248 gdk_window_set_background (edit
->text_area
, &edit
->color
[1]);
250 edit
->gc
= gdk_gc_new (edit
->text_area
);
251 gdk_gc_set_exposures (edit
->gc
, TRUE
);
252 gdk_gc_set_foreground (edit
->gc
, &edit
->color
[26]);
253 gdk_gc_set_background (edit
->gc
, &edit
->color
[1]);
256 gdk_window_show (edit
->text_area
);
258 if (editable
->selection_start_pos
!= editable
->selection_end_pos
)
259 gtk_editable_claim_selection (editable
, TRUE
, GDK_CURRENT_TIME
);
262 if ((widget
->allocation
.width
> 1) || (widget
->allocation
.height
> 1))
263 recompute_geometry (edit
);
267 static void gtk_edit_unrealize (GtkWidget
* widget
)
271 g_return_if_fail (widget
!= NULL
);
272 g_return_if_fail (GTK_IS_EDIT (widget
));
274 edit
= GTK_EDIT (widget
);
276 gdk_window_set_user_data (edit
->text_area
, NULL
);
277 gdk_window_destroy (edit
->text_area
);
278 edit
->text_area
= NULL
;
280 gdk_gc_destroy (edit
->gc
);
283 if (GTK_WIDGET_CLASS (parent_class
)->unrealize
)
284 (*GTK_WIDGET_CLASS (parent_class
)->unrealize
) (widget
);
287 static void gtk_edit_destroy (GtkObject
* object
)
291 g_return_if_fail (object
!= NULL
);
292 g_return_if_fail (GTK_IS_EDIT (object
));
294 edit
= (GtkEdit
*) object
;
296 gtk_object_unref (GTK_OBJECT (edit
->hadj
));
300 gtk_object_unref (GTK_OBJECT (edit
->vadj
));
304 gtk_timeout_remove (edit
->timer
);
307 edit_clean (edit
->editor
);
312 GTK_OBJECT_CLASS (parent_class
)->destroy (object
);
315 static void gtk_edit_style_set (GtkWidget
* widget
,
316 GtkStyle
* previous_style
)
320 g_return_if_fail (widget
!= NULL
);
321 g_return_if_fail (GTK_IS_EDIT (widget
));
323 edit
= GTK_EDIT (widget
);
324 if (GTK_WIDGET_REALIZED (widget
)) {
325 gdk_window_set_background (widget
->window
, &edit
->color
[1]);
326 gdk_window_set_background (edit
->text_area
, &edit
->color
[1]);
329 if ((widget
->allocation
.width
> 1) || (widget
->allocation
.height
> 1))
330 recompute_geometry (edit
);
333 if (GTK_WIDGET_DRAWABLE (widget
))
334 gdk_window_clear (widget
->window
);
337 static void gtk_edit_draw_focus (GtkWidget
* widget
)
343 g_return_if_fail (widget
!= NULL
);
344 g_return_if_fail (GTK_IS_EDIT (widget
));
346 edit
= GTK_EDIT (widget
);
348 if (GTK_WIDGET_DRAWABLE (widget
)) {
349 gint ythick
= widget
->style
->klass
->ythickness
;
350 gint xthick
= widget
->style
->klass
->xthickness
;
351 gint xextra
= EDIT_BORDER_ROOM
;
352 gint yextra
= EDIT_BORDER_ROOM
;
354 /* TDEBUG (("in gtk_edit_draw_focus\n")); */
358 width
= widget
->allocation
.width
;
359 height
= widget
->allocation
.height
;
361 if (GTK_WIDGET_HAS_FOCUS (widget
)) {
369 gdk_draw_rectangle (widget
->window
,
370 widget
->style
->fg_gc
[GTK_STATE_NORMAL
],
372 widget
->allocation
.width
- 1,
373 widget
->allocation
.height
- 1);
375 gtk_draw_shadow (widget
->style
, widget
->window
,
376 GTK_STATE_NORMAL
, GTK_SHADOW_IN
,
377 x
, y
, width
, height
);
382 height
-= 2 * ythick
;
384 if (widget
->style
->bg_pixmap
[GTK_STATE_NORMAL
]) {
386 clear_focus_area (edit
, x
, y
, width
, yextra
);
388 clear_focus_area (edit
, x
, y
+ yextra
,
389 xextra
, y
+ height
- 2 * yextra
);
391 clear_focus_area (edit
, x
+ width
- xextra
, y
+ yextra
,
392 xextra
, height
- 2 * ythick
);
394 clear_focus_area (edit
, x
, x
+ height
- yextra
, width
, yextra
);
395 } else if (!GTK_WIDGET_HAS_FOCUS (widget
)) {
396 gdk_draw_rectangle (widget
->window
,
397 widget
->style
->base_gc
[GTK_STATE_NORMAL
], FALSE
,
405 TDEBUG (("in gtk_edit_draw_focus (undrawable !!!)\n"));
410 static void gtk_edit_size_request (GtkWidget
* widget
,
411 GtkRequisition
* requisition
)
418 g_return_if_fail (widget
!= NULL
);
419 g_return_if_fail (GTK_IS_EDIT (widget
));
420 g_return_if_fail (requisition
!= NULL
);
422 xthickness
= widget
->style
->klass
->xthickness
+ EDIT_BORDER_ROOM
;
423 ythickness
= widget
->style
->klass
->ythickness
+ EDIT_BORDER_ROOM
;
425 char_height
= MIN_EDIT_HEIGHT_LINES
* (widget
->style
->font
->ascent
+
426 widget
->style
->font
->descent
);
428 char_width
= MIN_EDIT_WIDTH_LINES
* (gdk_text_width (widget
->style
->font
,
429 "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
433 requisition
->width
= char_width
+ xthickness
* 2;
434 requisition
->height
= char_height
+ ythickness
* 2;
437 static void gtk_edit_size_allocate (GtkWidget
* widget
,
438 GtkAllocation
* allocation
)
441 GtkEditable
*editable
;
443 g_return_if_fail (widget
!= NULL
);
444 g_return_if_fail (GTK_IS_EDIT (widget
));
445 g_return_if_fail (allocation
!= NULL
);
447 edit
= GTK_EDIT (widget
);
448 editable
= GTK_EDITABLE (widget
);
450 widget
->allocation
= *allocation
;
451 if (GTK_WIDGET_REALIZED (widget
)) {
452 gdk_window_move_resize (widget
->window
,
453 allocation
->x
, allocation
->y
,
454 allocation
->width
, allocation
->height
);
456 gdk_window_move_resize (edit
->text_area
,
457 widget
->style
->klass
->xthickness
+ EDIT_BORDER_ROOM
,
458 widget
->style
->klass
->ythickness
+ EDIT_BORDER_ROOM
,
459 widget
->allocation
.width
- (widget
->style
->klass
->xthickness
+
460 EDIT_BORDER_ROOM
) * 2,
461 widget
->allocation
.height
- (widget
->style
->klass
->ythickness
+
462 EDIT_BORDER_ROOM
) * 2);
465 recompute_geometry (edit
);
470 static void gtk_edit_draw (GtkWidget
* widget
,
474 g_return_if_fail (widget
!= NULL
);
475 g_return_if_fail (GTK_IS_EDIT (widget
));
476 g_return_if_fail (area
!= NULL
);
478 if (GTK_WIDGET_DRAWABLE (widget
)) {
479 /* convert the gtk expose to a coolwidget expose */
480 XExposeEvent xexpose
;
483 xexpose
.width
= area
->width
;
484 xexpose
.height
= area
->height
;
485 edit
= GTK_EDIT (widget
);
486 edit_render_expose (edit
->editor
, &xexpose
);
487 edit_status (edit
->editor
);
491 void gtk_edit_set_colors (GtkEdit
*win
)
493 edit_set_foreground_colors (
494 color_palette (option_editor_fg_normal
),
495 color_palette (option_editor_fg_bold
),
496 color_palette (option_editor_fg_italic
)
498 edit_set_background_colors (
499 color_palette (option_editor_bg_normal
),
500 color_palette (option_editor_bg_abnormal
),
501 color_palette (option_editor_bg_marked
),
502 color_palette (option_editor_bg_marked_abnormal
),
503 color_palette (option_editor_bg_highlighted
)
505 edit_set_cursor_color (
506 color_palette (option_editor_fg_cursor
)
511 gtk_edit_expose (GtkWidget
* widget
,
512 GdkEventExpose
* event
)
515 g_return_val_if_fail (widget
!= NULL
, FALSE
);
516 g_return_val_if_fail (GTK_IS_EDIT (widget
), FALSE
);
517 g_return_val_if_fail (event
!= NULL
, FALSE
);
519 if (GTK_WIDGET_DRAWABLE (widget
)) {
520 /* convert the gtk expose to a coolwidget expose */
521 XExposeEvent xexpose
;
522 xexpose
.x
= event
->area
.x
;
523 xexpose
.y
= event
->area
.y
;
524 xexpose
.width
= event
->area
.width
;
525 xexpose
.height
= event
->area
.height
;
526 edit
= GTK_EDIT (widget
);
527 gtk_edit_set_colors (edit
);
528 edit_render_expose (edit
->editor
, &xexpose
);
529 edit_status (edit
->editor
);
534 void edit_update_screen (WEdit
* e
)
541 edit_scroll_screen_over_cursor (e
);
542 edit_update_curs_row (e
);
543 edit_update_curs_col (e
);
545 update_scroll_bars (e
);
549 if (e
->force
& REDRAW_COMPLETELY
)
550 e
->force
|= REDRAW_PAGE
;
552 /* pop all events for this window for internal handling */
553 if (e
->force
& (REDRAW_CHAR_ONLY
| REDRAW_COMPLETELY
)) {
554 edit_render_keypress (e
);
556 } else if (CCheckWindowEvent (e
->widget
->winid
, ButtonPressMask
| ButtonReleaseMask
| ButtonMotionMask
, 0)
558 e
->force
|= REDRAW_PAGE
;
562 edit_render_keypress (e
);
567 void gtk_edit_mouse_redraw (WEdit
* edit
, long click
)
569 edit
->force
|= REDRAW_PAGE
| REDRAW_LINE
;
570 edit_update_curs_row (edit
);
571 edit_update_curs_col (edit
);
572 edit
->prev_col
= edit_get_col (edit
);
573 edit_update_screen (edit
);
574 edit
->search_start
= click
;
577 /* returns the position in the edit buffer of a window click */
578 static long edit_get_click_pos (WEdit
* edit
, int x
, int y
)
581 /* (1) goto to left margin */
582 click
= edit_bol (edit
, edit
->curs1
);
584 /* (1) move up or down */
585 if (y
> (edit
->curs_row
+ 1))
586 click
= edit_move_forward (edit
, click
, y
- (edit
->curs_row
+ 1), 0);
587 if (y
< (edit
->curs_row
+ 1))
588 click
= edit_move_backward (edit
, click
, (edit
->curs_row
+ 1) - y
);
590 /* (3) move right to x pos */
591 click
= edit_move_forward3 (edit
, click
, x
- edit
->start_col
- 1, 0);
595 static void edit_translate_xy (int xs
, int ys
, int *x
, int *y
)
597 *x
= xs
- EDIT_TEXT_HORIZONTAL_OFFSET
;
598 *y
= (ys
- EDIT_TEXT_VERTICAL_OFFSET
- option_text_line_spacing
/ 2 - 1) / FONT_PIX_PER_LINE
+ 1;
601 static gint
gtk_edit_button_press_release (GtkWidget
* widget
,
602 GdkEventButton
* event
)
604 GtkEditable
*editable
;
607 static GdkAtom ctext_atom
= GDK_NONE
;
608 int x_text
= 0, y_text
= 0;
610 static long button_down_pos
;
611 static long dragging
= 0;
613 g_return_val_if_fail (widget
!= NULL
, FALSE
);
614 g_return_val_if_fail (GTK_IS_EDIT (widget
), FALSE
);
615 g_return_val_if_fail (event
!= NULL
, FALSE
);
617 if (ctext_atom
== GDK_NONE
)
618 ctext_atom
= gdk_atom_intern ("COMPOUND_TEXT", FALSE
);
620 edit
= GTK_EDIT (widget
);
622 editable
= GTK_EDITABLE (widget
);
624 if (!GTK_WIDGET_HAS_FOCUS (widget
))
625 if (!(event
->state
& (GDK_CONTROL_MASK
| GDK_SHIFT_MASK
)))
626 gtk_widget_grab_focus (widget
);
628 edit_translate_xy (event
->x
, event
->y
, &x_text
, &y_text
);
629 mouse_pos
= edit_get_click_pos (e
, x_text
, y_text
);
631 switch (event
->type
) {
632 case GDK_BUTTON_RELEASE
:
635 case GDK_MOTION_NOTIFY
:
636 if (mouse_pos
== button_down_pos
)
639 edit_cursor_move (e
, mouse_pos
- e
->curs1
);
640 gtk_edit_set_selection (GTK_EDITABLE (widget
), mouse_pos
, button_down_pos
);
641 gtk_edit_mouse_redraw (e
, mouse_pos
);
643 case GDK_BUTTON_PRESS
:
645 if (event
->button
== 2) {
646 edit_cursor_move (e
, mouse_pos
- e
->curs1
);
647 editable
->current_pos
= mouse_pos
;
648 gtk_selection_convert (GTK_WIDGET (edit
), GDK_SELECTION_PRIMARY
,
649 ctext_atom
, event
->time
);
650 gtk_edit_mouse_redraw (e
, mouse_pos
);
651 editable
->selection_start_pos
= e
->mark1
;
652 editable
->selection_end_pos
= e
->mark2
;
655 button_down_pos
= mouse_pos
;
657 if (editable
->has_selection
)
658 if (mouse_pos
>= editable
->selection_start_pos
659 && mouse_pos
< editable
->selection_end_pos
)
660 gtk_edit_set_selection (GTK_EDITABLE (widget
), mouse_pos
, mouse_pos
);
662 edit_cursor_move (e
, mouse_pos
- e
->curs1
);
663 gtk_edit_mouse_redraw (e
, mouse_pos
);
665 case GDK_2BUTTON_PRESS
:
667 edit_cursor_move (e
, mouse_pos
- e
->curs1
);
668 edit_right_word_move (e
, 1);
669 mouse_pos
= e
->curs1
;
670 edit_left_word_move (e
, 1);
671 button_down_pos
= e
->curs1
;
672 gtk_edit_set_selection (GTK_EDITABLE (widget
), mouse_pos
, button_down_pos
);
673 gtk_edit_mouse_redraw (e
, mouse_pos
);
675 case GDK_3BUTTON_PRESS
:
677 mouse_pos
= edit_bol (e
, mouse_pos
);
678 edit_cursor_move (e
, mouse_pos
- e
->curs1
);
679 button_down_pos
= edit_eol (e
, mouse_pos
) + 1;
680 gtk_edit_set_selection (GTK_EDITABLE (widget
), mouse_pos
, button_down_pos
);
681 gtk_edit_mouse_redraw (e
, mouse_pos
);
687 editable
->current_pos
= e
->curs1
;
692 gtk_edit_button_motion (GtkWidget
* widget
,
693 GdkEventMotion
* event
)
695 return gtk_edit_button_press_release (widget
, (GdkEventButton
*) event
);
698 static guint
toggle_bit (guint x
, guint mask
)
700 unsigned long m
= -1;
702 return x
& (m
- mask
);
707 int mod_type_key (guint x
)
729 /* get a 15 bit "almost unique" key sym that includes keyboard modifier
730 info in the top 3 bits */
731 short key_sym_mod (gint key
, gint state
)
733 if (key
&& !mod_type_key (key
)) {
734 key
= toggle_bit (key
, 0x1000 * ((state
& GDK_SHIFT_MASK
) != 0));
735 key
= toggle_bit (key
, 0x2000 * ((state
& GDK_CONTROL_MASK
) != 0));
736 key
= toggle_bit (key
, 0x4000 * ((state
& GDK_MOD1_MASK
) != 0));
743 static gint
gtk_edit_key_press (GtkWidget
* widget
, GdkEventKey
* event
)
745 GtkEditable
*editable
;
748 gint command
= 0, insert
= -1, r
= 0;
750 g_return_val_if_fail (widget
!= NULL
, FALSE
);
751 g_return_val_if_fail (GTK_IS_EDIT (widget
), FALSE
);
752 g_return_val_if_fail (event
!= NULL
, FALSE
);
753 edit
= GTK_EDIT (widget
);
754 editable
= GTK_EDITABLE (widget
);
756 if (!edit_translate_key (0, event
->keyval
, event
->state
, &command
, &insert
)) {
760 state
= event
->state
;
761 if (!command
&& insert
< 0) { /* no translation took place, so lets see if we have a macro */
762 if ((key
== GDK_r
|| key
== GDK_R
) && (state
& ControlMask
)) {
763 command
= e
->macro_i
< 0 ? CK_Begin_Record_Macro
: CK_End_Record_Macro
;
765 command
= key_sym_mod (key
, state
);
767 command
= CK_Macro (command
);
770 r
= edit_execute_key_command (e
, command
, insert
);
772 edit_update_screen (e
);
773 editable
->selection_start_pos
= e
->mark1
;
774 editable
->selection_end_pos
= ((e
->mark2
< 0) ? e
->curs1
: e
->mark2
);
775 editable
->has_selection
= editable
->selection_start_pos
!= editable
->selection_end_pos
;
776 editable
->current_pos
= e
->curs1
;
780 /**********************************************************************/
782 /**********************************************************************/
786 static void get_home_dir (void)
788 if (home_dir
) /* already been set */
790 home_dir
= getenv ("HOME");
793 home_dir
= strdup (home_dir
);
796 home_dir
= (getpwuid (geteuid ()))->pw_dir
;
799 home_dir
= strdup (home_dir
);
802 fprintf (stderr
, _("gtkedit.c: HOME environment variable not set and no passwd entry - aborting\n"));
806 static gchar
*gtk_edit_get_chars (GtkEditable
* editable
,
813 g_return_val_if_fail (editable
!= NULL
, NULL
);
814 g_return_val_if_fail (GTK_IS_EDIT (editable
), NULL
);
815 edit
= GTK_EDIT (editable
);
817 end_pos
= edit
->editor
->last_byte
;
818 if ((start_pos
< 0) ||
819 (end_pos
> edit
->editor
->last_byte
) ||
820 (end_pos
< start_pos
))
822 retval
= malloc (end_pos
- start_pos
+ 1);
823 retval
[end_pos
- start_pos
] = '\0';
824 for (i
= 0; start_pos
< end_pos
; start_pos
++, i
++)
825 retval
[i
] = (gchar
) edit_get_byte (edit
->editor
, start_pos
);
829 static void gtk_edit_set_selection (GtkEditable
* editable
,
833 GtkEdit
*edit
= GTK_EDIT (editable
);
837 end
= edit
->editor
->last_byte
;
838 editable
->selection_start_pos
= e
->mark1
= MIN (start
, end
);
839 editable
->selection_end_pos
= e
->mark2
= MAX (start
, end
);
840 editable
->has_selection
= (e
->mark2
!= e
->mark1
);
841 gtk_edit_mouse_redraw (e
, e
->curs1
);
842 gtk_editable_claim_selection (editable
, TRUE
, GDK_CURRENT_TIME
);
845 static void gtk_edit_insert_text (GtkEditable
* editable
,
846 const gchar
* new_text
,
847 gint new_text_length
,
850 GtkEdit
*edit
= GTK_EDIT (editable
);
851 edit_cursor_move (edit
->editor
, *position
- edit
->editor
->curs1
);
852 while (new_text_length
--)
853 edit_insert_ahead (edit
->editor
, new_text
[new_text_length
]);
854 *position
= edit
->editor
->curs1
;
857 static void gtk_edit_class_init (GtkEditClass
* class)
859 GtkObjectClass
*object_class
;
860 GtkWidgetClass
*widget_class
;
861 GtkEditableClass
*editable_class
;
863 object_class
= (GtkObjectClass
*) class;
864 widget_class
= (GtkWidgetClass
*) class;
865 editable_class
= (GtkEditableClass
*) class;
867 parent_class
= gtk_type_class (gtk_editable_get_type ());
869 object_class
->destroy
= gtk_edit_destroy
;
871 widget_class
->realize
= gtk_edit_realize
;
872 widget_class
->unrealize
= gtk_edit_unrealize
;
873 widget_class
->style_set
= gtk_edit_style_set
;
874 widget_class
->draw_focus
= gtk_edit_draw_focus
;
875 widget_class
->size_request
= gtk_edit_size_request
;
876 widget_class
->size_allocate
= gtk_edit_size_allocate
;
877 widget_class
->draw
= gtk_edit_draw
;
878 widget_class
->expose_event
= gtk_edit_expose
;
879 widget_class
->button_press_event
= gtk_edit_button_press_release
;
880 widget_class
->button_release_event
= gtk_edit_button_press_release
;
881 widget_class
->motion_notify_event
= gtk_edit_button_motion
;
883 widget_class
->key_press_event
= gtk_edit_key_press
;
885 widget_class
->focus_in_event
= gtk_edit_focus_in
;
886 widget_class
->focus_out_event
= gtk_edit_focus_out
;
888 widget_class
->focus_in_event
= 0;
889 widget_class
->focus_out_event
= 0;
891 editable_class
->insert_text
= gtk_edit_insert_text
;
893 editable_class
->delete_text
= gtk_edit_delete_text
;
894 editable_class
->update_text
= gtk_edit_update_text
;
896 editable_class
->delete_text
= 0;
897 editable_class
->update_text
= 0;
900 editable_class
->get_chars
= gtk_edit_get_chars
;
901 editable_class
->set_selection
= gtk_edit_set_selection
;
902 editable_class
->set_position
= gtk_edit_set_position
;
906 editable_class
->set_position
= 0;
912 static void gtk_edit_init (GtkEdit
* edit
)
914 static int made_directory
= 0;
916 GTK_WIDGET_SET_FLAGS (edit
, GTK_CAN_FOCUS
);
918 edit
->editor
= edit_init (0, 80, 25, 0, "", "/", 0);
919 edit
->editor
->macro_i
= -1;
920 edit
->editor
->widget
= edit
;
926 gtk_edit_configure_font_dimensions (edit
);
928 if (!made_directory
) {
929 mkdir (catstrs (home_dir
, EDIT_DIR
, 0), 0700);
932 GTK_EDITABLE (edit
)->editable
= TRUE
;
936 gtk_edit_get_type (void)
938 static guint edit_type
= 0;
941 GtkTypeInfo edit_info
=
945 sizeof (GtkEditClass
),
946 (GtkClassInitFunc
) gtk_edit_class_init
,
947 (GtkObjectInitFunc
) gtk_edit_init
,
948 (GtkArgSetFunc
) NULL
,
949 (GtkArgGetFunc
) NULL
,
952 edit_type
= gtk_type_unique (gtk_editable_get_type (), &edit_info
);
957 #include <libgnomeui/gtkcauldron.h>
958 #include <libgnomeui/gnome-stock.h>
960 char *gtk_edit_dialog_get_save_file (guchar
* dir
, guchar
* def
, guchar
* title
)
963 s
= gtk_dialog_cauldron (
964 title
, GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_GRAB
,
965 " ( ( (Filename:)d | %Fgxf )f )xf / ( %Bxfgrq || %Bxfgq )f ",
966 &def
, "filename", title
,
967 GNOME_STOCK_BUTTON_OK
,
968 GNOME_STOCK_BUTTON_CANCEL
970 if (s
== GTK_CAULDRON_ESCAPE
|| !s
|| s
== GNOME_STOCK_BUTTON_CANCEL
)
975 char *gtk_edit_dialog_get_load_file (guchar
* dir
, guchar
* def
, guchar
* title
)
978 s
= gtk_dialog_cauldron (
979 title
, GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_GRAB
,
980 " ( ( (Filename:)d | %Fgxf )f )xf / ( %Bxfgrq || %Bxfgq )f ",
981 &def
, "filename", title
,
982 GNOME_STOCK_BUTTON_OK
,
983 GNOME_STOCK_BUTTON_CANCEL
985 if (s
== GTK_CAULDRON_ESCAPE
|| !s
|| s
== GNOME_STOCK_BUTTON_CANCEL
)
990 void gtk_edit_dialog_message (guchar
* heading
, char *fmt
,...)
995 vsprintf (s
, fmt
, ap
);
997 gtk_dialog_cauldron (
998 heading
, GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_GRAB
,
999 " [ ( %Ld )xf ]xf / ( %Bxfgq )f ",
1001 GNOME_STOCK_BUTTON_CANCEL
1006 int gtk_edit_dialog_query (guchar
* heading
, guchar
* first
,...)
1012 va_start (ap
, first
);
1014 while ((buttons
[n
++] = va_arg (ap
, char *)) && n
< 15);
1017 strcpy (s
, " [ ( %Lxf )xf ]xf / ( ");
1019 while (buttons
[n
]) {
1020 strcat (s
, " %Bqxf ");
1027 r
= gtk_dialog_cauldron (heading
, GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_IGNOREENTER
| GTK_CAULDRON_GRAB
, s
, first
,
1028 buttons
[0], buttons
[1], buttons
[2], buttons
[3],
1029 buttons
[4], buttons
[5], buttons
[6], buttons
[7],
1030 buttons
[8], buttons
[9], buttons
[10], buttons
[11],
1031 buttons
[12], buttons
[13], buttons
[14], buttons
[15]
1034 if (r
== GTK_CAULDRON_ESCAPE
|| !r
|| r
== GNOME_STOCK_BUTTON_CANCEL
)
1036 while (buttons
[n
]) {
1037 if (!strcmp (buttons
[n
], r
))
1044 void gtk_edit_dialog_error (guchar
* heading
, char *fmt
, ...)
1049 vsprintf (s
, fmt
, ap
);
1051 gtk_dialog_cauldron (
1052 heading
, GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_GRAB
,
1053 " [ ( %Ld )xf ]xf / ( %Bxfgq )f",
1055 GNOME_STOCK_BUTTON_CANCEL
1062 struct color_matrix_struct
{
1063 unsigned int R
, G
, B
;
1064 } color_matrix
[27] =
1095 void gtk_edit_alloc_colors (GtkEdit
*edit
, GdkColormap
*colormap
)
1098 for (i
= 0; i
< 27; i
++) {
1099 edit
->color
[i
].red
= (gushort
) color_matrix
[i
].R
<< 8;
1100 edit
->color
[i
].green
= (gushort
) color_matrix
[i
].G
<< 8;
1101 edit
->color
[i
].blue
= (gushort
) color_matrix
[i
].B
<< 8;
1102 if (!gdk_color_alloc (colormap
, &edit
->color
[i
]))
1103 g_warning ("cannot allocate color");
1105 edit
->color_last_pixel
= 27;
1108 int allocate_color (WEdit
*edit
, gchar
*color
)
1111 win
= (GtkEdit
*) edit
->widget
;
1114 if (*color
>= '0' && *color
<= '9') {
1115 return atoi (color
);
1121 if (!gdk_color_parse (color
, &c
))
1123 if (!gdk_color_alloc (gtk_widget_get_colormap(GTK_WIDGET (edit
->widget
)), &c
))
1125 for (i
= 0; i
< (GTK_EDIT (edit
->widget
))->color_last_pixel
; i
++)
1126 if (color_palette (i
) == c
.pixel
)
1128 GTK_EDIT (edit
->widget
)->color
[(GTK_EDIT (edit
->widget
))->color_last_pixel
].pixel
= c
.pixel
;
1129 return (GTK_EDIT (edit
->widget
))->color_last_pixel
++;
1133 static void gtk_edit_set_position (GtkEditable
* editable
, gint position
)
1136 edit
= GTK_EDIT(editable
)->editor
;
1137 edit_cursor_move (edit
, position
- edit
->curs1
);
1138 edit_move_to_prev_col (edit
, 0);
1139 edit
->force
|= REDRAW_PAGE
;
1140 edit
->search_start
= 0;
1141 edit_update_curs_row (edit
);
1145 /* returns 1 on error */
1146 gint
gtk_edit_load_file_from_filename (GtkWidget
* edit
, const gchar
* filename
)
1148 return edit_load_file_from_filename (GTK_EDIT (edit
)->editor
, (char *) filename
);
1151 void gtk_edit_set_top_line (GtkWidget
* e
, int line
)
1154 edit
= GTK_EDIT (e
)->editor
;
1155 edit_move_display (edit
, line
- edit
->num_widget_lines
/ 2 - 1);
1156 edit
->force
|= REDRAW_COMPLETELY
;
1159 void gtk_edit_set_cursor_line (GtkWidget
* e
, int line
)
1162 edit
= GTK_EDIT (e
)->editor
;
1163 edit_move_to_line (edit
, line
- 1);
1164 edit
->force
|= REDRAW_COMPLETELY
;
1167 void about_cb (GtkWidget
* widget
, void *data
)
1169 gtk_dialog_cauldron ("About", GTK_CAULDRON_TOPLEVEL
| GTK_CAULDRON_GRAB
, " [ (Mcedit - an editor for the midnight commander\n\
1170 ported from Cooledit - a user friendly text editor for the X Window System.)xf ]xf / ( %Bgqxf )f ", GNOME_STOCK_BUTTON_OK
);
1174 void gtk_edit_command (GtkEdit
* edit
, gint command
)
1177 gtk_widget_grab_focus (GTK_WIDGET (edit
));
1178 r
= edit_execute_key_command (edit
->editor
, command
, -1);
1180 edit_update_screen (edit
->editor
);
1183 void gtk_edit_quit (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Exit
); }
1185 void gtk_edit_load_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Load
); }
1186 void gtk_edit_new_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_New
); }
1187 void gtk_edit_save_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Save
); }
1188 void gtk_edit_save_as_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Save_As
); }
1189 void gtk_edit_insert_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Insert_File
); }
1190 void gtk_edit_copy_to_file (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Save_Block
); }
1192 void gtk_edit_clip_cut (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_XCut
); }
1193 void gtk_edit_clip_copy (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_XStore
); }
1194 void gtk_edit_clip_paste (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_XPaste
); }
1196 void gtk_edit_toggle_mark (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Mark
); }
1197 void gtk_edit_search (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Find
); }
1198 void gtk_edit_search_again (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Find_Again
); }
1199 void gtk_edit_replace (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Replace
); }
1200 void gtk_edit_copy (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Copy
); }
1201 void gtk_edit_move (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Move
); }
1202 void gtk_edit_delete (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Remove
); }
1203 void gtk_edit_undo (GtkEdit
* widget
, void *data
) { GtkEdit
*edit
= (GtkEdit
*) data
; gtk_edit_command (edit
, CK_Undo
); }
1206 struct _GnomeUIInfo
{
1207 GnomeUIInfoType type
;
1209 gchar
*hint
; /* For toolbar items, the tooltip. For menu items, the status bar message */
1211 /* For an item, toggleitem, or radioitem, procedure to call when activated.
1212 For a subtree, point to the GnomeUIInfo array for that subtree.
1213 For a radioitem lead entry, point to the GnomeUIInfo array for
1214 the radio item group. For the radioitem array, procedure to
1215 call when activated. For a help item, specifies the help node to load
1216 (or NULL for main prog's name)
1217 For builder data, point to the GnomeUIBuilderData structure for the following items */
1220 gpointer unused_data
;
1221 GnomeUIPixmapType pixmap_type
;
1223 * a pointer to the char for the pixmap (GNOME_APP_PIXMAP_DATA),
1224 * a char* for the filename (GNOME_APP_PIXMAP_FILENAME),
1225 * or a char* for the stock pixmap name (GNOME_APP_PIXMAP_STOCK).
1227 gpointer pixmap_info
;
1228 guint accelerator_key
; /* Accelerator key... Set to 0 to ignore */
1229 GdkModifierType ac_mods
; /* An OR of the masks for the accelerator */
1230 GtkWidget
*widget
; /* Filled in by gnome_app_create* */
1235 typedef struct _TbItems TbItems
;
1237 char *key
, *text
, *tooltip
, *icon
;
1238 void (*cb
) (GtkEdit
*, void *);
1239 GtkWidget
*widget
; /* will be filled in */
1244 static TbItems tb_items
[] =
1246 {"F1", N_("Help"), N_("Interactive help browser"), GNOME_STOCK_MENU_BLANK
, 0, NULL
},
1247 {"F2", N_("Save"), N_("Save to current file name"), GNOME_STOCK_MENU_SAVE
, gtk_edit_save_file
, NULL
},
1248 {"F3", N_("Mark"), N_("Toggle In/Off invisible marker to highlight text"), GNOME_STOCK_MENU_BLANK
, gtk_edit_toggle_mark
, NULL
},
1249 {"F4", N_("Replc"), N_("Find and replace strings/regular expressions"), GNOME_STOCK_MENU_SRCHRPL
, gtk_edit_replace
, NULL
},
1250 {"F5", N_("Copy"), N_("Copy highlighted block to cursor position"), GNOME_STOCK_MENU_COPY
, gtk_edit_copy
, NULL
},
1252 {"F6", N_("Move"), N_("Move highlighted block to cursor position"), GNOME_STOCK_MENU_BLANK
, gtk_edit_move
, NULL
},
1253 {"F7", N_("Find"), N_("Find strings/regular expressions"), GNOME_STOCK_MENU_SEARCH
, gtk_edit_search
, NULL
},
1254 {"F8", N_("Dlete"), N_("Delete highlighted text"), GNOME_STOCK_MENU_BLANK
, gtk_edit_delete
, NULL
},
1255 {"F9", N_("Menu"), N_("Pull down menu"), GNOME_STOCK_MENU_BLANK
, /* gtk_edit_menu*/ 0, NULL
},
1256 {"F10", N_("Quit"), N_("Exit editor"), GNOME_STOCK_MENU_QUIT
, gtk_edit_quit
, NULL
},
1260 static GtkWidget
*create_toolbar (GtkWidget
* window
, GtkEdit
* edit
)
1264 toolbar
= gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL
, GTK_TOOLBAR_BOTH
);
1265 for (t
= &tb_items
[0]; t
->text
; t
++) {
1266 t
->widget
= gtk_toolbar_append_item (GTK_TOOLBAR (toolbar
),
1270 gnome_stock_pixmap_widget (window
, t
->icon
),
1277 /* returns 1 on error */
1278 int edit (const char *file
, int line
)
1281 GtkWidget
*edit
, *statusbar
;
1283 edit
= gtk_edit_new (NULL
, NULL
);
1284 app
= gnome_app_new ("mcedit", (char *) (file
? file
: "Mcedit"));
1287 static GnomeUIInfo file_menu
[] =
1289 GNOMEUIINFO_MENU_OPEN_ITEM( gtk_edit_load_file
, NULL
),
1290 GNOMEUIINFO_MENU_NEW_ITEM( "_New", N_ ("Clear the edit buffer"), gtk_edit_new_file
, NULL
),
1291 GNOMEUIINFO_SEPARATOR
,
1292 GNOMEUIINFO_MENU_SAVE_ITEM( gtk_edit_save_file
, NULL
),
1293 GNOMEUIINFO_MENU_SAVE_AS_ITEM( gtk_edit_save_as_file
, NULL
),
1294 GNOMEUIINFO_SEPARATOR
,
1295 GNOMEUIINFO_ITEM_DATA( N_ ("Insert File"), N_ ("Insert text from a file"),
1296 gtk_edit_insert_file
, NULL
, NULL
),
1297 GNOMEUIINFO_ITEM_DATA( N_ ("Copy to file"), N_ ("copy a block to a file"),
1298 gtk_edit_copy_to_file
, NULL
, NULL
),
1299 GNOMEUIINFO_SEPARATOR
,
1300 GNOMEUIINFO_MENU_EXIT_ITEM(gtk_edit_quit
, NULL
),
1305 static GnomeUIInfo edit_menu
[] =
1307 GNOMEUIINFO_MENU_COPY_ITEM(gtk_edit_clip_copy
, NULL
),
1308 GNOMEUIINFO_MENU_CUT_ITEM( gtk_edit_clip_cut
, NULL
),
1309 GNOMEUIINFO_MENU_PASTE_ITEM( gtk_edit_clip_paste
, NULL
),
1310 GNOMEUIINFO_SEPARATOR
,
1311 GNOMEUIINFO_MENU_UNDO_ITEM(gtk_edit_undo
, NULL
),
1315 static GnomeUIInfo search_menu
[] =
1317 GNOMEUIINFO_MENU_FIND_ITEM(gtk_edit_search
, NULL
),
1318 GNOMEUIINFO_MENU_FIND_AGAIN_ITEM(gtk_edit_search_again
, NULL
),
1319 GNOMEUIINFO_MENU_REPLACE_ITEM(gtk_edit_replace
, NULL
),
1323 static GnomeUIInfo help_menu
[] =
1325 GNOMEUIINFO_MENU_ABOUT_ITEM(about_cb
, NULL
),
1327 GNOMEUIINFO_SEPARATOR
,
1328 GNOMEUIINFO_HELP ("hello"),
1333 GnomeUIInfo main_menu
[] =
1335 GNOMEUIINFO_MENU_FILE_TREE(file_menu
),
1336 GNOMEUIINFO_MENU_EDIT_TREE(edit_menu
),
1337 GNOMEUIINFO_SUBTREE (N_ ("Search/Replace"), search_menu
),
1338 GNOMEUIINFO_MENU_HELP_TREE(help_menu
),
1342 gtk_widget_realize (app
);
1343 statusbar
= gtk_entry_new ();
1344 gtk_entry_set_editable (GTK_ENTRY (statusbar
), 0);
1345 gtk_widget_set_usize (app
, 400, 400);
1346 gnome_app_create_menus_with_data (GNOME_APP (app
), main_menu
, edit
);
1347 gnome_app_set_contents (GNOME_APP (app
), edit
);
1348 gnome_app_set_statusbar (GNOME_APP (app
), GTK_WIDGET (statusbar
));
1349 GTK_EDIT (edit
)->menubar
= GNOME_APP (app
)->menubar
;
1350 GTK_EDIT (edit
)->status
= statusbar
;
1351 gnome_app_set_toolbar(GNOME_APP (app
), GTK_TOOLBAR(create_toolbar(app
, GTK_EDIT (edit
))));
1352 GTK_EDIT(edit
)->destroy_me
= gtk_widget_destroy
;
1353 GTK_EDIT(edit
)->destroy_me_user_data
= app
;
1355 gtk_widget_show (edit
);
1356 gtk_widget_realize (edit
);
1359 if (gtk_edit_load_file_from_filename (edit
, file
)) {
1360 gtk_widget_destroy (app
);
1363 gtk_edit_set_cursor_line (edit
, line
);
1364 gtk_widget_show_all (app
);
1365 gtk_widget_grab_focus (edit
);