~ubuntu-branches/ubuntu/natty/bluefish/natty-proposed

« back to all changes in this revision

Viewing changes to src/gui.c

  • Committer: Bazaar Package Importer
  • Author(s): Davide Puricelli (evo)
  • Date: 2005-04-23 17:05:18 UTC
  • mto: (1.1.5 upstream) (5.1.2 sid)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20050423170518-izh2k25xve7ui1jx
Tags: upstream-1.0
ImportĀ upstreamĀ versionĀ 1.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Bluefish HTML Editor
 
2
 * gui.c - the main GUI
 
3
 *
 
4
 * Copyright (C) 2002-2004 Olivier Sessink
 
5
 *
 
6
 * This program is free software; you can redistribute it and/or modify
 
7
 * it under the terms of the GNU General Public License as published by
 
8
 * the Free Software Foundation; either version 2 of the License, or
 
9
 * (at your option) any later version.
 
10
 *
 
11
 * This program is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 * GNU General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU General Public License
 
17
 * along with this program; if not, write to the Free Software
 
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
19
 */
 
20
/* #define DEBUG */
 
21
 
 
22
#include <gtk/gtk.h>
 
23
#include <time.h> /* nanosleep() */
 
24
#include <string.h> /* strchr() */
 
25
#include <unistd.h> /* exit() */
 
26
#include <stdlib.h> /* exit() on Solaris */
 
27
 
 
28
#include "config.h"
 
29
 
 
30
#include "bluefish.h"
 
31
#include "gui.h"
 
32
#include "document.h" /* file_new_cb() */
 
33
#include "gtk_easy.h"
 
34
#include "menu.h" /* menu_create_main(), recent_menu_init() */
 
35
#include "bf_lib.h" /* get_int_from_string() */
 
36
#include "pixmap.h"  /* new_pixmap(); */
 
37
#include "undo_redo.h" /* undo_cb() redo_cb() etc. */
 
38
#include "snr2.h" /* search_cb, replace_cb */
 
39
#include "html_table.h"
 
40
#include "html.h"
 
41
#include "html2.h"
 
42
#include "wizards.h"
 
43
#include "image.h"
 
44
#include "html_form.h"
 
45
#include "filebrowser.h"
 
46
#include "stringlist.h"
 
47
#include "preferences.h" /* open_preferences_cb */
 
48
#include "outputbox.h" /* init_outputbox() */
 
49
#include "fref.h"
 
50
#include "bookmark.h"
 
51
#include "project.h"
 
52
 
 
53
#ifdef HAVE_LIBASPELL
 
54
#include "bfspell.h"
 
55
#endif /* HAVE_LIBASPELL */
 
56
 
 
57
typedef struct {
 
58
        GtkWidget *window;
 
59
        GtkWidget *label;
 
60
} Tsplashscreen;
 
61
 
 
62
/******************************/
 
63
/* global vars for this module */
 
64
/******************************/
 
65
#ifndef NOSPLASH
 
66
static Tsplashscreen splashscreen;
 
67
#endif
 
68
/**************************/
 
69
/* start of the functions */
 
70
/**************************/
 
71
 
 
72
/**
 
73
 * notebook_hide:
 
74
 *
 
75
 * Hides the notebook. Used when loading a large amount of files, to avoid
 
76
 * slowing things down. Shows a "Stand by..." label instead..
 
77
 *
 
78
 * Return value: void
 
79
 **/
 
80
void notebook_hide(Tbfwin *bfwin) {
 
81
        gtk_widget_hide (bfwin->notebook);
 
82
        gtk_widget_show (bfwin->notebook_fake);
 
83
}
 
84
 
 
85
/**
 
86
 * notebook_show:
 
87
 *
 
88
 * Shows the notebook, after a notebook_hide() has been called.
 
89
 *
 
90
 * Return value: void
 
91
 **/
 
92
void notebook_show(Tbfwin *bfwin) {
 
93
        gtk_widget_hide (bfwin->notebook_fake);
 
94
        gtk_widget_show (bfwin->notebook);      
 
95
}
 
96
 
 
97
void notebook_changed(Tbfwin *bfwin, gint newpage) {
 
98
        gint cur = newpage;
 
99
        gint doclistlen;
 
100
        DEBUG_MSG("notebook_changed, doclistlen=%d, newpage=%d, notebook_curpage=%d, last_notebook_page=%d, curdoc=%p\n"
 
101
                        ,g_list_length(bfwin->documentlist)
 
102
                        ,newpage
 
103
                        ,gtk_notebook_get_current_page(GTK_NOTEBOOK(bfwin->notebook))
 
104
                        ,bfwin->last_notebook_page
 
105
                        ,bfwin->current_document
 
106
                        );
 
107
        if (newpage == -1) {
 
108
                /* this returns -1 if there is no current page */
 
109
                cur = gtk_notebook_get_current_page(GTK_NOTEBOOK(bfwin->notebook));
 
110
        }
 
111
        if ((bfwin->last_notebook_page == cur) 
 
112
                && (bfwin->current_document != NULL)
 
113
                && (bfwin->current_document == g_list_nth_data(bfwin->documentlist, cur))) {
 
114
                DEBUG_MSG("notebook_changed, NOT CHANGED cur=%d, documentlist[cur]==current_document (=%p), RETURNING\n",cur,bfwin->current_document);
 
115
                return;
 
116
        }
 
117
        doclistlen = g_list_length(bfwin->documentlist);
 
118
        if (cur == -1) {
 
119
                if (doclistlen > 0) {
 
120
                        DEBUG_MSG("notebook_changed, WEIRD 1 cur=%d, but doclistlen=%d RETURNING\n",cur,doclistlen);
 
121
                        bfwin->last_notebook_page = -2;
 
122
                        return;
 
123
                }
 
124
        }
 
125
        if (doclistlen == 0) {
 
126
                DEBUG_MSG("notebook_changed, doclistlen=%d, before doc_new()!\n",doclistlen);
 
127
                bfwin->current_document = doc_new(bfwin,TRUE);
 
128
                bfwin->last_notebook_page = 1;
 
129
                DEBUG_MSG("notebook_changed, after doc_new(), returning\n");
 
130
                return;
 
131
        }
 
132
        /* if the documentlist has length 1, cur should not be larger then 0, if 2, cur should not be larger then 1, etc.*/
 
133
        if (cur >= doclistlen) {
 
134
                DEBUG_MSG("notebook_changed, DOCALREADYCLOSED, cur=%d, doclistlen=%d, RETURNING\n", cur, doclistlen);
 
135
                bfwin->last_notebook_page = -2;
 
136
                return;
 
137
        }
 
138
        bfwin->current_document = g_list_nth_data(bfwin->documentlist, cur);
 
139
        if (bfwin->current_document == NULL) {
 
140
                DEBUG_MSG("notebook_changed, WEIRD 2, doclist[%d] == NULL, RETURNING\n",cur);
 
141
                return;
 
142
        }
 
143
        DEBUG_MSG("notebook_changed, current_document=%p\n",bfwin->current_document);
 
144
        bfwin->last_notebook_page = cur;
 
145
        /* now we flush the queue first, so that we don't call doc_activate 
 
146
        on _this_ document if the user has another close click in the queue */
 
147
        flush_queue();
 
148
 
 
149
        doc_activate(bfwin->current_document);
 
150
/*      bmark_adjust_visible(bfwin);*/
 
151
}
 
152
 
 
153
gboolean switch_to_document_by_index(Tbfwin *bfwin,gint index) {
 
154
        if (index >= 0) {
 
155
                gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), (index));
 
156
/*              notebook_changed();*/
 
157
                return TRUE;
 
158
        }
 
159
        return FALSE;
 
160
}
 
161
 
 
162
gboolean switch_to_document_by_pointer(Tbfwin *bfwin,Tdocument *document) {
 
163
        gint index;
 
164
 
 
165
        index = g_list_index(bfwin->documentlist, document);
 
166
        return switch_to_document_by_index(bfwin,index);
 
167
}
 
168
 
 
169
gboolean switch_to_document_by_filename(Tbfwin *bfwin,gchar *filename) {
 
170
        gint index;
 
171
 
 
172
        index = documentlist_return_index_from_filename(bfwin->documentlist,filename);
 
173
        return switch_to_document_by_index(bfwin,index);
 
174
}
 
175
 
 
176
 
 
177
static void notebook_switch_page_lcb(GtkWidget *notebook,GtkNotebookPage *page,gint page_num,Tbfwin *bfwin) {
 
178
        DEBUG_MSG("notebook_switch_page_lcb, page=%d\n", page_num);
 
179
        notebook_changed(bfwin,page_num);
 
180
}
 
181
 
 
182
void gui_notebook_switch(Tbfwin *bfwin,guint action,GtkWidget *widget) {
 
183
        switch (action) {
 
184
                case 1: gtk_notebook_prev_page(GTK_NOTEBOOK(bfwin->notebook));
 
185
                break;
 
186
                case 2: gtk_notebook_next_page(GTK_NOTEBOOK(bfwin->notebook));
 
187
                break;
 
188
                case 3: gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), 0);
 
189
                break;
 
190
                case 4: gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), -1);
 
191
        }
 
192
}
 
193
 
 
194
static void left_panel_notify_position_lcb(GObject *object,GParamSpec *pspec,gpointer data){
 
195
        gint position;
 
196
        g_object_get(object, pspec->name, &position, NULL);
 
197
        DEBUG_MSG("left_panel_notify_position_lcb, new position=%d\n", position);
 
198
        if (main_v->props.restore_dimensions) {
 
199
                if (main_v->props.left_panel_left) {
 
200
                        main_v->props.left_panel_width = position;
 
201
                } else {
 
202
                        main_v->props.left_panel_width = main_v->globses.main_window_w - position;
 
203
                }
 
204
        }
 
205
}
 
206
 
 
207
GtkWidget *left_panel_build(Tbfwin *bfwin) {
 
208
        GtkWidget *fileb;
 
209
        GtkWidget *left_notebook = gtk_notebook_new();
 
210
        GtkWidget *fref;
 
211
        GtkWidget *bmarks;
 
212
        gtk_notebook_set_tab_pos(GTK_NOTEBOOK(left_notebook),main_v->props.leftpanel_tabposition);
 
213
        gtk_notebook_set_show_tabs(GTK_NOTEBOOK(left_notebook), TRUE);
 
214
        gtk_notebook_set_show_border(GTK_NOTEBOOK(left_notebook), FALSE);
 
215
        gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(left_notebook), 0);
 
216
        gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(left_notebook), 0);
 
217
        gtk_notebook_popup_enable(GTK_NOTEBOOK(left_notebook));
 
218
        fileb = filebrowser_init(bfwin);
 
219
        fref = fref_gui(bfwin);
 
220
        bmarks = bmark_gui(bfwin);
 
221
        gtk_notebook_append_page_menu(GTK_NOTEBOOK(left_notebook),fileb,new_pixmap(105),gtk_label_new(_("Filebrowser")));
 
222
        gtk_notebook_append_page_menu(GTK_NOTEBOOK(left_notebook),fref,new_pixmap(106),gtk_label_new(_("Function reference")));
 
223
        gtk_notebook_append_page_menu(GTK_NOTEBOOK(left_notebook),bmarks,new_pixmap(104),gtk_label_new(_("Bookmarks")));
 
224
        gtk_widget_show_all(left_notebook);
 
225
        gtk_notebook_set_current_page(GTK_NOTEBOOK(left_notebook),0);
 
226
        return left_notebook;
 
227
}
 
228
 
 
229
/**
 
230
 * if there is a left panel, this function will rebuild all widgets
 
231
 */
 
232
void left_panel_rebuild(Tbfwin *bfwin) {
 
233
        if (bfwin->hpane) {
 
234
                DEBUG_MSG("left_panel_rebuild, destroying widgets\n");
 
235
                gtk_widget_destroy(bfwin->leftpanel_notebook);
 
236
                DEBUG_MSG("left_panel_rebuild, cleanup\n");
 
237
                filebrowser_cleanup(bfwin);
 
238
                fref_cleanup(bfwin);
 
239
                bmark_cleanup(bfwin);
 
240
                DEBUG_MSG("left_panel_rebuild, re-init\n");
 
241
                bfwin->leftpanel_notebook = left_panel_build(bfwin);
 
242
                if (main_v->props.left_panel_left) {
 
243
                        gtk_paned_add1(GTK_PANED(bfwin->hpane), bfwin->leftpanel_notebook);
 
244
                } else {
 
245
                        gtk_paned_add2(GTK_PANED(bfwin->hpane), bfwin->leftpanel_notebook);
 
246
                }
 
247
                gtk_widget_show_all(bfwin->leftpanel_notebook);
 
248
        }
 
249
}
 
250
 
 
251
void left_panel_show_hide_toggle(Tbfwin *bfwin,gboolean first_time, gboolean show, gboolean sync_menu) {
 
252
        if (sync_menu) {
 
253
                DEBUG_MSG("left_panel_show_hide_toggle, trying to sync menu\n");
 
254
                setup_toggle_item_from_widget(bfwin->menubar, "/View/View Sidebar", show);
 
255
        }
 
256
        if (!first_time && ((show && bfwin->hpane) || (!show && bfwin->hpane == NULL))) {
 
257
                DEBUG_MSG("left_panel_show_hide_toggle, retrurning!!, show=%d, bfwin->hpane=%p, first_time=%d\n",show,bfwin->hpane,first_time);
 
258
                return;
 
259
        } 
 
260
 
 
261
        if (!first_time) {
 
262
                gtk_widget_ref(bfwin->notebook_box);
 
263
                if (show) {
 
264
                        gtk_container_remove(GTK_CONTAINER(bfwin->middlebox), bfwin->notebook_box);
 
265
                } else {
 
266
                        gtk_container_remove(GTK_CONTAINER(bfwin->hpane), bfwin->notebook_box);
 
267
                        gtk_widget_destroy(bfwin->hpane);
 
268
                        filebrowser_cleanup(bfwin);
 
269
                        fref_cleanup(bfwin);
 
270
                        bmark_cleanup(bfwin); 
 
271
                }
 
272
        }
 
273
        if (show) {
 
274
                bfwin->hpane = gtk_hpaned_new();
 
275
                if (main_v->props.left_panel_left) {
 
276
                        DEBUG_MSG("set paned position to %d (left)\n",main_v->props.left_panel_width);
 
277
                        gtk_paned_set_position(GTK_PANED(bfwin->hpane), main_v->props.left_panel_width);
 
278
                } else {
 
279
                        DEBUG_MSG("set paned position to %d (right)\n",main_v->globses.main_window_w - main_v->props.left_panel_width);
 
280
                        gtk_paned_set_position(GTK_PANED(bfwin->hpane), main_v->globses.main_window_w - main_v->props.left_panel_width);
 
281
                }
 
282
                g_signal_connect(G_OBJECT(bfwin->hpane),"notify::position",G_CALLBACK(left_panel_notify_position_lcb), NULL);
 
283
                bfwin->leftpanel_notebook = left_panel_build(bfwin);
 
284
                gtk_paned_add1(GTK_PANED(bfwin->hpane), main_v->props.left_panel_left ? bfwin->leftpanel_notebook : bfwin->notebook_box);
 
285
                gtk_paned_add2(GTK_PANED(bfwin->hpane), main_v->props.left_panel_left ? bfwin->notebook_box : bfwin->leftpanel_notebook);
 
286
                gtk_box_pack_start(GTK_BOX(bfwin->middlebox), bfwin->hpane, TRUE, TRUE, 0);
 
287
                gtk_widget_show(bfwin->hpane);
 
288
        } else {
 
289
                bfwin->hpane = NULL;
 
290
                bfwin->leftpanel_notebook = NULL;
 
291
                gtk_box_pack_start(GTK_BOX(bfwin->middlebox), bfwin->notebook_box, TRUE, TRUE, 0);
 
292
        }
 
293
        if (!first_time) {
 
294
                gtk_widget_unref(bfwin->notebook_box);
 
295
        }
 
296
}
 
297
 
 
298
void gui_set_title(Tbfwin *bfwin, Tdocument *doc) {
 
299
        gchar *title, *prfilepart;
 
300
        const gchar *tablabel;
 
301
        tablabel = gtk_label_get_text(GTK_LABEL(doc->tab_label));
 
302
        if (bfwin->project) {
 
303
                prfilepart = g_strconcat(bfwin->project->name," - ",tablabel,NULL);
 
304
        } else {
 
305
                prfilepart = g_strdup(tablabel);
 
306
        }
 
307
        title = g_strconcat(prfilepart, " - Bluefish "VERSION,NULL);
 
308
        gtk_window_set_title(GTK_WINDOW(bfwin->main_window),title);
 
309
        /*rename_window_entry_in_all_windows(bfwin, title);*/
 
310
        g_free(title);
 
311
        g_free(prfilepart);
 
312
}
 
313
 
 
314
void gui_apply_settings(Tbfwin *bfwin) {
 
315
        gtk_notebook_set_tab_pos(GTK_NOTEBOOK(bfwin->notebook),main_v->props.document_tabposition);
 
316
        /* We don't want to set the tab position if the left panel is hidden */
 
317
        if (bfwin->leftpanel_notebook) {
 
318
                gtk_notebook_set_tab_pos(GTK_NOTEBOOK(bfwin->leftpanel_notebook),main_v->props.leftpanel_tabposition);
 
319
 
 
320
                /* check if the left panel needs to move over to the right */
 
321
                if (main_v->props.left_panel_left && bfwin->leftpanel_notebook == GTK_PANED(bfwin->hpane)->child1) {
 
322
                        DEBUG_MSG("gui_apply_settings, left panel is on the right location\n");
 
323
                } else {
 
324
                        left_panel_show_hide_toggle(bfwin,FALSE, FALSE, FALSE);
 
325
                        left_panel_show_hide_toggle(bfwin,FALSE, TRUE, FALSE);
 
326
                }
 
327
        }
 
328
}
 
329
 
 
330
typedef struct {
 
331
        const gchar *ident;
 
332
        void (*func)();
 
333
        gint pixmaptype;
 
334
        const gchar *tooltiptext;
 
335
} Ttoolbaritem;
 
336
 
 
337
typedef struct {
 
338
        Ttoolbaritem *tbitem;
 
339
        GtkWidget *button;
 
340
        Tbfwin *bfwin;
 
341
}Tquickbaritem;
 
342
 
 
343
static void bold_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
344
        general_html_menu_cb(bfwin, 1, NULL);
 
345
}
 
346
static void italic_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
347
        general_html_menu_cb(bfwin, 2, NULL);
 
348
}
 
349
static void paragraph_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
350
        general_html_menu_cb(bfwin, 5, NULL);
 
351
}
 
352
static void break_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
353
        general_html_menu_cb(bfwin, 6, NULL);
 
354
}
 
355
static void breakclear_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
356
        general_html_menu_cb(bfwin, 41, NULL);
 
357
}
 
358
static void nbsp_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
359
        general_html_menu_cb(bfwin, 7, NULL);
 
360
}
 
361
static void center_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
362
        general_html_menu_cb(bfwin, 8, NULL);
 
363
}
 
364
static void rightjustify_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
365
        general_html_menu_cb(bfwin, 9, NULL);
 
366
}
 
367
static void comment_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
368
        general_html_menu_cb(bfwin, 10, NULL);
 
369
}
 
370
static void fontsizeplus1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
371
        general_html_menu_cb(bfwin, 11, NULL);
 
372
}
 
373
static void fontsizeminus1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
374
        general_html_menu_cb(bfwin, 12, NULL);
 
375
}
 
376
static void preformatted_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
377
        general_html_menu_cb(bfwin, 13, NULL);
 
378
}
 
379
static void subscript_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
380
        general_html_menu_cb(bfwin, 14, NULL);
 
381
}
 
382
static void superscript_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
383
        general_html_menu_cb(bfwin, 15, NULL);
 
384
}
 
385
static void strong_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
386
        general_html_menu_cb(bfwin, 16, NULL);
 
387
}
 
388
static void emphasis_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
389
        general_html_menu_cb(bfwin, 17, NULL);
 
390
}
 
391
static void heading1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
392
        general_html_menu_cb(bfwin, 18, NULL);
 
393
}
 
394
static void heading2_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
395
        general_html_menu_cb(bfwin, 19, NULL);
 
396
}
 
397
static void heading3_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
398
        general_html_menu_cb(bfwin, 20, NULL);
 
399
}
 
400
static void heading4_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
401
        general_html_menu_cb(bfwin, 21, NULL);
 
402
}
 
403
static void heading5_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
404
        general_html_menu_cb(bfwin, 22, NULL);
 
405
}
 
406
static void heading6_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
407
        general_html_menu_cb(bfwin, 23, NULL);
 
408
}
 
409
static void table_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
410
        general_html_menu_cb(bfwin, 24, NULL);
 
411
}
 
412
static void tablerow_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
413
        general_html_menu_cb(bfwin, 25, NULL);
 
414
}
 
415
static void tableheader_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
416
        general_html_menu_cb(bfwin, 26, NULL);
 
417
}
 
418
static void tabledata_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
419
        general_html_menu_cb(bfwin, 27, NULL);
 
420
}
 
421
static void tablecaption_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
422
        general_html_menu_cb(bfwin, 28, NULL);
 
423
}
 
424
static void frameset_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
425
        general_html_menu_cb(bfwin, 29, NULL);
 
426
}
 
427
static void frame_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
428
        general_html_menu_cb(bfwin, 30, NULL);
 
429
}
 
430
static void noframes_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
431
        general_html_menu_cb(bfwin, 31, NULL);
 
432
}
 
433
static void target_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
434
        general_html_menu_cb(bfwin, 32, NULL);
 
435
}
 
436
static void unorderedlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
437
        general_html_menu_cb(bfwin, 33, NULL);
 
438
}
 
439
static void orderedlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
440
        general_html_menu_cb(bfwin, 34, NULL);
 
441
}
 
442
static void listitem_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
443
        general_html_menu_cb(bfwin, 35, NULL);
 
444
}
 
445
static void definitionlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
446
        general_html_menu_cb(bfwin, 36, NULL);
 
447
}
 
448
static void definitionterm_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
449
        general_html_menu_cb(bfwin, 37, NULL);
 
450
}
 
451
static void definition_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
452
        general_html_menu_cb(bfwin, 38, NULL);
 
453
}
 
454
static void style_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
455
        general_html_menu_cb(bfwin, 42, NULL);
 
456
}
 
457
static void dfn_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
458
        general_html_menu_cb(bfwin, 48, NULL);
 
459
}
 
460
static void code_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
461
        general_html_menu_cb(bfwin, 49, NULL);
 
462
}
 
463
static void samp_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
464
        general_html_menu_cb(bfwin, 50, NULL);
 
465
}
 
466
static void kbd_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
467
        general_html_menu_cb(bfwin, 51, NULL);
 
468
}
 
469
static void var_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
470
        general_html_menu_cb(bfwin, 52, NULL);
 
471
}
 
472
static void cite_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
473
        general_html_menu_cb(bfwin, 53, NULL);
 
474
}
 
475
static void abbr_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
476
        general_html_menu_cb(bfwin, 54, NULL);
 
477
}
 
478
static void acronym_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
479
        general_html_menu_cb(bfwin, 55, NULL);
 
480
}
 
481
 
 
482
static void quickstart_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
483
        quickstart_dialog(bfwin,NULL);
 
484
}
 
485
static void body_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
486
        body_dialog(bfwin,NULL);
 
487
}
 
488
static void quickanchor_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
489
        DEBUG_MSG("quickanchor_clicked_lcb, calling quickanchor_dialog with bfwin=%p and data=NULL\n",bfwin);
 
490
        quickanchor_dialog(bfwin, NULL);
 
491
}
 
492
static void quickrule_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
493
        quickrule_dialog(bfwin,NULL);
 
494
}
 
495
static void email_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
496
        email_dialog(bfwin,NULL);
 
497
}
 
498
static void fontdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
499
        font_dialog(bfwin,NULL);
 
500
}
 
501
static void basefont_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
502
        basefont_dialog(bfwin,NULL);
 
503
}
 
504
static void framesetdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
505
        frameset_dialog(bfwin,NULL);
 
506
}
 
507
static void framedialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
508
        frame_dialog(bfwin,NULL);
 
509
}
 
510
static void quicklist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
511
        quicklist_dialog(bfwin,NULL);
 
512
}
 
513
static void link_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
514
        linkdialog_dialog(bfwin,NULL);
 
515
}
 
516
static void formdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
517
        formdialog_dialog(bfwin,NULL);
 
518
}
 
519
static void inputbuttondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
520
        inputdialog_dialog(bfwin, NULL, "submit");
 
521
}
 
522
static void textdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
523
        inputdialog_dialog(bfwin, NULL, "text");
 
524
}
 
525
static void hiddendialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
526
        inputdialog_dialog(bfwin, NULL, "hidden");
 
527
}
 
528
static void textareadialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
529
        textareadialog_dialog(bfwin,NULL);
 
530
}
 
531
static void radiodialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
532
        inputdialog_dialog(bfwin, NULL, "radio");
 
533
}
 
534
static void checkdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
535
        inputdialog_dialog(bfwin, NULL, "checkbox");
 
536
}
 
537
static void selectdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
538
        selectdialog_dialog(bfwin,NULL);
 
539
}
 
540
static void optiondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
541
        optiondialog_dialog(bfwin,NULL);
 
542
}
 
543
static void optgroupdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
544
        optgroupdialog_dialog(bfwin,NULL);
 
545
}
 
546
static void buttondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
547
        buttondialog_dialog(bfwin,NULL);
 
548
}
 
549
static void image_insert_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
550
        image_insert_dialog(bfwin,NULL);
 
551
}
 
552
static void thumbnail_insert_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
553
        thumbnail_insert_dialog(bfwin);
 
554
}
 
555
static void multi_thumbnail_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
556
        multi_thumbnail_dialog(bfwin);
 
557
}
 
558
static void tabledialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
559
        tabledialog_dialog(bfwin,NULL);
 
560
}
 
561
static void tablerowdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
562
        tablerowdialog_dialog(bfwin,NULL);
 
563
}
 
564
static void tableheaddialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
565
        tableheaddialog_dialog(bfwin,NULL);
 
566
}
 
567
static void tabledatadialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
568
        tabledatadialog_dialog(bfwin,NULL);
 
569
}
 
570
static void tablewizard_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
571
        tablewizard_dialog(bfwin);
 
572
}
 
573
static void framewizard_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
574
        framewizard_dialog(bfwin);
 
575
}
 
576
static void span_dialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
577
        span_dialog(bfwin,NULL);
 
578
}
 
579
static void div_dialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
 
580
        div_dialog(bfwin,NULL);
 
581
}
 
582
 
 
583
 
 
584
static Ttoolbaritem tbi[] = {
 
585
        {"quickstart...", quickstart_clicked_lcb,13 , N_("QuickStart...")},
 
586
        {"body...", body_clicked_lcb, 14, N_("Body...")},
 
587
        {"bold", bold_clicked_lcb,  15, N_("Bold")},
 
588
        {"italic", italic_clicked_lcb,  16, N_("Italic")},
 
589
        {"paragraph", paragraph_clicked_lcb,  19, N_("Paragraph")},
 
590
        {"break", break_clicked_lcb,  20, N_("Break")},
 
591
        {"breakclear", breakclear_clicked_lcb,  21, N_("Break and clear")},
 
592
        {"nbsp", nbsp_clicked_lcb,  22, N_("Non-breaking space")},
 
593
        {"", NULL, 0, NULL}, /* spacing */
 
594
        {"anchor...", quickanchor_clicked_lcb,23 , N_("Anchor...")},
 
595
        {"rule...", quickrule_clicked_lcb, 24, N_("Rule...")},
 
596
        {"center", center_clicked_lcb,  28, N_("Center")},
 
597
        {"rightjustify", rightjustify_clicked_lcb,  29, N_("Right Justify")},
 
598
        {"comment", comment_clicked_lcb, 30 , N_("Comment")},
 
599
        {"email...", email_clicked_lcb, 31, N_("E-Mail...")},
 
600
        {"font...",fontdialog_clicked_lcb , 32, N_("Font...")},
 
601
        {"basefont...", basefont_clicked_lcb, 33, N_("Base Font Size...")},
 
602
        {"", NULL, 0, NULL}, /* spacing */
 
603
        {"fontsize+1", fontsizeplus1_clicked_lcb, 34 , N_("Font Size +1")},
 
604
        {"fontsize-1", fontsizeminus1_clicked_lcb,  35, N_("Font Size -1")},
 
605
        {"preformatted", preformatted_clicked_lcb,  36, N_("Preformatted Text")},
 
606
        {"subscript", subscript_clicked_lcb,  37, N_("Subscript")},
 
607
        {"superscript", superscript_clicked_lcb,  38, N_("Superscript")},
 
608
        {"strong", strong_clicked_lcb,  15, N_("Strong")},
 
609
        {"emphasis", emphasis_clicked_lcb,  16, N_("Emphasis")},
 
610
        {"", NULL, 0, NULL}, /* spacing */
 
611
        {"heading1", heading1_clicked_lcb,  39, N_("Heading 1")},
 
612
        {"heading2", heading2_clicked_lcb,  40, N_("Heading 2")},
 
613
        {"heading3", heading3_clicked_lcb,  41, N_("Heading 3")},
 
614
        {"heading4", heading4_clicked_lcb,  42, N_("Heading 4")},
 
615
        {"heading5", heading5_clicked_lcb,  43, N_("Heading 5")},
 
616
        {"heading6", heading6_clicked_lcb,  44, N_("Heading 6")},
 
617
        {"tablewizard...",tablewizard_clicked_lcb, 45, N_("Table Wizard...")},
 
618
        {"", NULL, 0, NULL}, /* spacing */
 
619
        {"table...",tabledialog_clicked_lcb, 46, N_("Table...")},
 
620
        {"tablerow...", tablerowdialog_clicked_lcb, 47, N_("Table Row...")},
 
621
        {"tableheader...", tableheaddialog_clicked_lcb, 48, N_("Table Header...")},
 
622
        {"tabledata...", tabledatadialog_clicked_lcb, 49, N_("Table Data...")},
 
623
        {"", NULL, 0, NULL}, /* spacing */
 
624
        {"table", table_clicked_lcb,  50, N_("Table")},
 
625
        {"tablerow", tablerow_clicked_lcb,  51, N_("Table Row")},
 
626
        {"tableheader", tableheader_clicked_lcb,  52, N_("Table Header")},
 
627
        {"tabledata", tabledata_clicked_lcb,  53, N_("Table Data")},
 
628
        {"tablecaption", tablecaption_clicked_lcb,  54, N_("Table Caption")},
 
629
        {"framewizard...",framewizard_clicked_lcb , 55, N_("Frame Wizard...")},
 
630
        {"", NULL, 0, NULL}, /* spacing */
 
631
        {"frameset...", framesetdialog_clicked_lcb,56 , N_("Frameset...")},
 
632
        {"frame...",framedialog_clicked_lcb , 57, N_("Frame...")},
 
633
        {"", NULL, 0, NULL}, /* spacing */
 
634
        {"frameset", frameset_clicked_lcb, 58 , N_("Frameset")},
 
635
        {"frame", frame_clicked_lcb,  59, N_("Frame")},
 
636
        {"noframes", noframes_clicked_lcb,  60, N_("Noframes")},
 
637
        {"target", target_clicked_lcb,  61, N_("Target")},
 
638
        {"form...",formdialog_clicked_lcb , 62, N_("Form...")},
 
639
        {"inputbutton...", inputbuttondialog_clicked_lcb, 63, N_("Input Button...")},
 
640
        {"text...",textdialog_clicked_lcb , 65, N_("Input Text...")},
 
641
        {"hidden...", hiddendialog_clicked_lcb, 66, N_("Input Hidden...")},
 
642
        {"textarea...",textareadialog_clicked_lcb , 67, N_("Textarea...")},
 
643
        {"radiobutton...", radiodialog_clicked_lcb, 68, N_("Input Radio Button...")},
 
644
        {"checkbox...", checkdialog_clicked_lcb, 69, N_("Input Check Box...")},
 
645
        {"select...", selectdialog_clicked_lcb, 70, N_("Select...")},
 
646
        {"option...",optiondialog_clicked_lcb , 71, N_("Option...")},
 
647
        {"optiongroup...", optgroupdialog_clicked_lcb, 72, N_("Option group...")},
 
648
        {"button...", buttondialog_clicked_lcb, 63, N_("Button...")},
 
649
        {"quicklist...", quicklist_clicked_lcb, 73, N_("Quick List...")},
 
650
        {"unorderedlist", unorderedlist_clicked_lcb,  74, N_("Unordered List")},
 
651
        {"orderedlist", orderedlist_clicked_lcb,  75, N_("Ordered List")},
 
652
        {"listitem", listitem_clicked_lcb,  76, N_("List Item")},
 
653
        {"definitionlist", definitionlist_clicked_lcb,  77, N_("Definition List")},
 
654
        {"definitionterm", definitionterm_clicked_lcb,  78, N_("Definition Term")},
 
655
        {"definition", definition_clicked_lcb,  79, N_("Definition")},
 
656
        {"createstylesheet...", new_css_dialog, 85, N_("Create stylesheet...")},
 
657
        {"span...", span_dialog_clicked_lcb,86 , N_("Span...")},
 
658
        {"div...",div_dialog_clicked_lcb,87 , N_("Div...")},
 
659
        {"style", style_clicked_lcb, 89, N_("Style")},
 
660
        {"linkstylesheet...", link_clicked_lcb,90 , N_("Link to stylesheet...")},
 
661
        {"image...", image_insert_clicked_lcb, 25, N_("Insert image...")},
 
662
        {"thumbnail...", thumbnail_insert_clicked_lcb, 26, N_("Insert thumbnail...")},
 
663
        {"mthumbnail...", multi_thumbnail_clicked_lcb, 27, N_("Multi thumbnail...")},
 
664
        {"dfn", dfn_clicked_lcb,  93, N_("Definition")},
 
665
        {"code", code_clicked_lcb,  94, N_("Code")},
 
666
        {"samp", samp_clicked_lcb,  95, N_("Sample")},
 
667
        {"kbd", kbd_clicked_lcb,  96, N_("Keyboard")},
 
668
        {"var", var_clicked_lcb,  97, N_("Variable")},
 
669
        {"cite", cite_clicked_lcb,  98, N_("Citation")},
 
670
        {"abbr", abbr_clicked_lcb,  99, N_("Abbreviation")},
 
671
        {"acronym", acronym_clicked_lcb,  100, N_("Acronym")},
 
672
        {"", NULL, 0, NULL} /* spacing */
 
673
};
 
674
 
 
675
static void html_toolbar_remove_from_quickbar_lcb(GtkMenuItem *menuitem, Ttoolbaritem *tbitem) {
 
676
        GList *bfwlist;
 
677
        main_v->globses.quickbar_items = remove_from_stringlist(main_v->globses.quickbar_items, tbitem->ident);
 
678
        bfwlist = g_list_first(main_v->bfwinlist);
 
679
        while (bfwlist) {
 
680
                Tquickbaritem *qbi=NULL;
 
681
                Tbfwin *bfwin = BFWIN(bfwlist->data);
 
682
                GList *tmplist  = g_list_first(bfwin->toolbar_quickbar_children);
 
683
                while (tmplist) {
 
684
                        qbi = tmplist->data;
 
685
                        if (qbi->tbitem == tbitem) {
 
686
                                break;
 
687
                        }
 
688
                        tmplist = g_list_next(tmplist);
 
689
                }
 
690
                if (qbi) {
 
691
                        gtk_widget_hide(qbi->button);
 
692
                        gtk_widget_destroy(qbi->button);
 
693
                        g_free(qbi);
 
694
                }
 
695
                bfwlist = g_list_next(bfwlist);
 
696
        }
 
697
}
 
698
 
 
699
/* return the position in the quickbar GList of a tool bar item */
 
700
gint get_quickbar_item_position(Ttoolbaritem *tbitem) {
 
701
        GList *tmplist, *winlist = g_list_first(main_v->bfwinlist);
 
702
        gint pos = 0;
 
703
        tmplist  = g_list_first(BFWIN(winlist->data)->toolbar_quickbar_children);
 
704
 
 
705
        while (tmplist) {
 
706
                Tquickbaritem *qbi;
 
707
                qbi = tmplist->data;
 
708
                if (qbi->tbitem == tbitem) {
 
709
                        DEBUG_MSG("get_quickbar_item_position, quickbar item is at %d\n", pos);
 
710
                        return pos;
 
711
                }
 
712
                pos += 1;
 
713
                tmplist = g_list_next(tmplist);
 
714
        }
 
715
        DEBUG_MSG("get_quickbar_item_position, not found, return -1!\n");
 
716
        return -1;
 
717
}
 
718
 
 
719
static gboolean html_toolbar_quickbar_item_button_press_lcb(GtkWidget *widget,GdkEventButton *bevent,Ttoolbaritem *tbitem);
 
720
 
 
721
static void html_toolbar_quickbar_switch(Ttoolbaritem *tbitem, gboolean moveright) {
 
722
        gint pos;
 
723
 
 
724
        /* first we look for the current location of this item */       
 
725
        pos = get_quickbar_item_position(tbitem);
 
726
        DEBUG_MSG("html_toolbar_quickbar_switch, found item %s at pos=%d, config list length=%d\n",tbitem->ident,pos,g_list_length(main_v->globses.quickbar_items));
 
727
        if (pos >= 0) {
 
728
                GList *tmp1, *tmp2, *tmplist;
 
729
                /* then we move this item to the new place in the config list */
 
730
                tmp1 = g_list_nth(main_v->globses.quickbar_items, pos);
 
731
                if (!tmp1) {
 
732
                        DEBUG_MSG("html_toolbar_quickbar_switch, nothing found in config list at pos=%d, RETURN\n",pos);
 
733
                        return;
 
734
                }
 
735
                tmp2 = (moveright) ? g_list_next(tmp1) : g_list_previous(tmp1);
 
736
                if (!tmp2) {
 
737
                        DEBUG_MSG("html_toolbar_quickbar_switch, no tmp2 found, moveright=%d, list length=%d RETURN\n",moveright,g_list_length(main_v->globses.quickbar_items));
 
738
                        return;
 
739
                }
 
740
                list_switch_order(tmp1, tmp2);
 
741
                DEBUG_MSG("html_toolbar_quickbar_switch, after list_switch_order, list length=%d\n",g_list_length(main_v->globses.quickbar_items));
 
742
                
 
743
                /* now switch the widgets in every window that has a quickbar */
 
744
                tmplist = g_list_first(main_v->bfwinlist);
 
745
                while (tmplist) {
 
746
                        Tbfwin *bfwin = BFWIN(tmplist->data);
 
747
                        DEBUG_MSG("html_toolbar_quickbar_switch, checking bfwin=%p\n",bfwin);
 
748
                        if (bfwin->toolbar_quickbar && bfwin->toolbar_quickbar_children) {
 
749
                                Tquickbaritem *qbi1;
 
750
                                DEBUG_MSG("retrieving quickbaritem from pos %d\n",pos);
 
751
                                tmp1 = g_list_nth(bfwin->toolbar_quickbar_children, pos);
 
752
                                tmp2 = (moveright) ? g_list_next(tmp1) : g_list_previous(tmp1);
 
753
                                qbi1 = (Tquickbaritem *)tmp1->data;
 
754
                                list_switch_order(tmp1, tmp2);
 
755
                                DEBUG_MSG("html_toolbar_quickbar_switch, quickbaritem %p has tbitem %s\n",qbi1, qbi1->tbitem->ident);
 
756
                                /* I don't know why the next bit of code doesn't work... bug in gtk? */
 
757
                                /*g_object_ref(G_OBJECT(qbi1->button));
 
758
                                DEBUG_MSG("html_toolbar_quickbar_switch, detaching widget!, button=%p, button->parent=%p, toolbar=%p\n",qbi1->button,qbi1->button->parent,bfwin->toolbar_quickbar);
 
759
                                gtk_container_remove(GTK_CONTAINER(bfwin->toolbar_quickbar),qbi1->button);
 
760
                                DEBUG_MSG("html_toolbar_quickbar_switch, attaching widget at pos %d\n",(moveright)?pos+1:pos-1);
 
761
                                gtk_toolbar_insert_widget(GTK_TOOLBAR(bfwin->toolbar_quickbar),qbi1->button,
 
762
                                                        _(qbi1->tbitem->tooltiptext),"",(moveright)?pos+1:pos-1);
 
763
                                g_object_unref(G_OBJECT(qbi1->button));
 
764
                                */
 
765
                                /* this workaround bit of code removes (and thus destroys) the button and creates a new identical button on the new location */
 
766
                                DEBUG_MSG("html_toolbar_quickbar_switch, about to destroy button,(toolbar has %d children)\n",g_list_length(GTK_TOOLBAR(bfwin->toolbar_quickbar)->children));
 
767
                                gtk_container_remove(GTK_CONTAINER(bfwin->toolbar_quickbar),qbi1->button);
 
768
                                DEBUG_MSG("html_toolbar_quickbar_switch, inserting widget at pos %d (toolbar has %d children)\n",(moveright)?pos+1:pos-1, g_list_length(GTK_TOOLBAR(bfwin->toolbar_quickbar)->children));
 
769
                                qbi1->button = gtk_toolbar_insert_item(GTK_TOOLBAR(bfwin->toolbar_quickbar), NULL, _(qbi1->tbitem->tooltiptext),
 
770
                                                        "", new_pixmap(qbi1->tbitem->pixmaptype), G_CALLBACK(qbi1->tbitem->func), bfwin, (moveright)?pos+1:pos-1);
 
771
                                g_signal_connect(qbi1->button, "button-press-event", G_CALLBACK(html_toolbar_quickbar_item_button_press_lcb), tbitem);
 
772
                                gtk_widget_show(qbi1->button);
 
773
                        }
 
774
                        tmplist = g_list_next(tmplist);
 
775
                }
 
776
                
 
777
        }
 
778
}
 
779
 
 
780
static void html_toolbar_quickbar_move_left_lcb(GtkMenuItem *menuitem, Ttoolbaritem *tbitem) {
 
781
        html_toolbar_quickbar_switch(tbitem, FALSE);
 
782
/*      GList *winlist = g_list_first(main_v->bfwinlist); 
 
783
        DEBUG_MSG("moving tbitem %p left on quickbars\n", tbitem);
 
784
        while (winlist) {
 
785
                GList *tmplist;
 
786
                gint pos;
 
787
                Tbfwin *bfwin = BFWIN(winlist->data);
 
788
                Tquickbaritem *qbi;
 
789
 
 
790
                pos = get_quickbar_item_position(tbitem);
 
791
                tmplist = g_list_nth(bfwin->toolbar_quickbar_children, pos);
 
792
                qbi = tmplist->data;
 
793
 
 
794
                if (qbi) {
 
795
                        if (pos) { / * pos > 0 * /
 
796
                                gtk_widget_destroy(qbi->button);
 
797
                        }
 
798
                        g_free(qbi);
 
799
                }
 
800
                
 
801
                if (pos) {
 
802
                        GList *other;
 
803
                        qbi = g_new(Tquickbaritem,1);
 
804
                        qbi->button = gtk_toolbar_insert_item(GTK_TOOLBAR(bfwin->toolbar_quickbar), NULL, _(tbitem->tooltiptext),
 
805
                                                        "", new_pixmap(tbitem->pixmaptype), G_CALLBACK(tbitem->func), bfwin, pos-1);
 
806
                        g_signal_connect(qbi->button, "button-press-event", G_CALLBACK(html_toolbar_quickbar_item_button_press_lcb), tbitem);
 
807
                        gtk_widget_show(qbi->button);
 
808
                        qbi->tbitem = tbitem;
 
809
                        
 
810
                        other = g_list_previous(tmplist);
 
811
                        list_switch_order(tmplist, other);
 
812
                        
 
813
                        tmplist = g_list_nth(main_v->globses.quickbar_items, pos);
 
814
                        other = g_list_previous(tmplist);
 
815
                        list_switch_order(tmplist, other);
 
816
                        g_list_free(tmplist);
 
817
                        g_list_free(other);
 
818
                }
 
819
                winlist = g_list_next(winlist);
 
820
        }
 
821
         we don't create this list here so we don't need to free it!!
 
822
        g_list_free(winlist);*/
 
823
}
 
824
 
 
825
static void html_toolbar_quickbar_move_right_lcb(GtkMenuItem *menuitem, Ttoolbaritem *tbitem) {
 
826
        html_toolbar_quickbar_switch(tbitem, TRUE);
 
827
/*      GList *winlist = g_list_first(main_v->bfwinlist); 
 
828
        DEBUG_MSG("moving tbitem %p right on quickbars\n", tbitem);
 
829
        while (winlist) {
 
830
                gint pos;
 
831
                GList *tmplist, *other;
 
832
                Tbfwin *bfwin = BFWIN(winlist->data);
 
833
                Tquickbaritem *qbi;
 
834
                pos = get_quickbar_item_position(tbitem);
 
835
                tmplist = g_list_nth(bfwin->toolbar_quickbar_children, pos);
 
836
                qbi = tmplist->data;
 
837
 
 
838
                if (qbi) {
 
839
                        gtk_widget_hide(qbi->button);
 
840
                        gtk_widget_destroy(qbi->button);
 
841
                        g_free(qbi);
 
842
                }
 
843
                
 
844
                qbi = g_new(Tquickbaritem,1);
 
845
                qbi->button = gtk_toolbar_insert_item(GTK_TOOLBAR(bfwin->toolbar_quickbar), NULL, _(tbitem->tooltiptext),
 
846
                                                        "", new_pixmap(tbitem->pixmaptype), G_CALLBACK(tbitem->func), bfwin, pos+1);
 
847
                g_signal_connect(qbi->button, "button-press-event", G_CALLBACK(html_toolbar_quickbar_item_button_press_lcb), tbitem);
 
848
                gtk_widget_show(qbi->button);
 
849
                qbi->tbitem = tbitem;
 
850
                
 
851
                other = g_list_next(tmplist);
 
852
                list_switch_order(tmplist, other);
 
853
                        
 
854
                tmplist = g_list_nth(main_v->globses.quickbar_items, pos);
 
855
                other = g_list_next(tmplist);
 
856
                list_switch_order(tmplist, other);
 
857
                g_list_free(tmplist);
 
858
                g_list_free(other);
 
859
                
 
860
                winlist = g_list_next(winlist);
 
861
        }
 
862
        / * g_list_free(winlist); */
 
863
}
 
864
 
 
865
static gboolean html_toolbar_quickbar_item_button_press_lcb(GtkWidget *widget,GdkEventButton *bevent,Ttoolbaritem *tbitem) {
 
866
        if (bevent->button == 3) {
 
867
                GtkWidget *menu = gtk_menu_new ();
 
868
                GtkWidget *menuitem = gtk_menu_item_new_with_label(_("Remove from quickbar"));
 
869
                GtkWidget *itemleft = gtk_menu_item_new_with_label(_("Move Left"));
 
870
                GtkWidget *itemright = gtk_menu_item_new_with_label(_("Move Right"));
 
871
                GtkWidget *sep = gtk_separator_menu_item_new();
 
872
                DEBUG_MSG("popup for tbitem %p\n", tbitem);
 
873
                g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(html_toolbar_remove_from_quickbar_lcb), tbitem);
 
874
                g_signal_connect(G_OBJECT(itemleft), "activate", G_CALLBACK(html_toolbar_quickbar_move_left_lcb), tbitem);
 
875
                g_signal_connect(G_OBJECT(itemright), "activate", G_CALLBACK(html_toolbar_quickbar_move_right_lcb), tbitem);
 
876
                gtk_menu_append(GTK_MENU(menu), itemleft);
 
877
                gtk_menu_append(GTK_MENU(menu), itemright);
 
878
                gtk_menu_append(GTK_MENU(menu), sep);
 
879
                gtk_menu_append(GTK_MENU(menu), menuitem);
 
880
                gtk_widget_show_all (menu);
 
881
                gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
 
882
                          NULL, widget, 0, gtk_get_current_event_time ());
 
883
                return TRUE;
 
884
        }
 
885
        return FALSE;
 
886
}
 
887
 
 
888
static void html_toolbar_add_to_quickbar_lcb(GtkMenuItem *menuitem, Ttoolbaritem *tbitem) {
 
889
        GList *tmplist = g_list_first(main_v->bfwinlist);
 
890
        DEBUG_MSG("adding tbitem %p to quickbars\n", tbitem);
 
891
        main_v->globses.quickbar_items = add_to_stringlist(main_v->globses.quickbar_items, tbitem->ident);
 
892
        while (tmplist) {
 
893
                Tquickbaritem *qbi;
 
894
                Tbfwin *bfwin = BFWIN(tmplist->data);
 
895
                qbi = g_new(Tquickbaritem,1);
 
896
                qbi->button = gtk_toolbar_append_item(GTK_TOOLBAR(bfwin->toolbar_quickbar), NULL, _(tbitem->tooltiptext),
 
897
                                                        "", new_pixmap(tbitem->pixmaptype), G_CALLBACK(tbitem->func), bfwin);
 
898
                g_signal_connect(qbi->button, "button-press-event", G_CALLBACK(html_toolbar_quickbar_item_button_press_lcb), tbitem);
 
899
                gtk_widget_show(qbi->button);
 
900
                qbi->tbitem = tbitem;
 
901
                bfwin->toolbar_quickbar_children = g_list_append(bfwin->toolbar_quickbar_children, qbi);
 
902
                tmplist = g_list_next(tmplist);
 
903
        }
 
904
}
 
905
 
 
906
static gboolean html_toolbar_item_button_press_lcb(GtkWidget *widget,GdkEventButton *bevent,Ttoolbaritem *tbitem) {
 
907
        DEBUG_MSG("html_toolbar_item_button_press_lcb, button=%d\n", bevent->button);
 
908
        if (bevent->button == 3) {
 
909
                GtkWidget *menu = gtk_menu_new ();
 
910
                GtkWidget *menuitem = gtk_menu_item_new_with_label(_("Add to quickbar"));
 
911
                DEBUG_MSG("popup for tbitem %p\n", tbitem);
 
912
                g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(html_toolbar_add_to_quickbar_lcb), tbitem);
 
913
                gtk_menu_append(GTK_MENU(menu), menuitem);
 
914
                gtk_widget_show_all (menu);
 
915
                gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
 
916
                          NULL, widget, 0, gtk_get_current_event_time ());
 
917
                return TRUE;
 
918
        }
 
919
        return FALSE;
 
920
}
 
921
 
 
922
static void html_toolbar_add_items(Tbfwin *bfwin, GtkWidget *html_toolbar, Ttoolbaritem *tbi, gint from, gint to) {
 
923
        gint i;
 
924
        GtkWidget *item;
 
925
        for (i=from;i<=to;i++) {
 
926
                if (tbi[i].func == NULL) {
 
927
                        gtk_toolbar_append_space(GTK_TOOLBAR(html_toolbar));
 
928
                } else {
 
929
                        item = gtk_toolbar_append_item(GTK_TOOLBAR(html_toolbar), NULL, _(tbi[i].tooltiptext),
 
930
                                                NULL, new_pixmap(tbi[i].pixmaptype), G_CALLBACK(tbi[i].func), bfwin);
 
931
                        g_signal_connect(item, "button-press-event", G_CALLBACK(html_toolbar_item_button_press_lcb), &tbi[i]);
 
932
                        DEBUG_MSG("adding tbitem %p to html_toolbar\n", &tbi[i]);
 
933
                }
 
934
        }
 
935
}
 
936
 
 
937
static void html_toolbar_add_items_to_submenu(Tbfwin *bfwin, GtkWidget *html_toolbar, Ttoolbaritem *tbi, gint from, gint to, gchar *menulabel, gint menupix) {
 
938
        GtkWidget *menu_bar, *sub_menu, *menu_item, *pixmap;
 
939
        GtkTooltips *tooltips;
 
940
        gint i;
 
941
        
 
942
        tooltips = gtk_tooltips_new();  
 
943
        sub_menu = gtk_menu_new();
 
944
        for (i=from;i<=to;i++) {
 
945
                if (tbi[i].func == NULL) {
 
946
                        gtk_toolbar_append_space(GTK_TOOLBAR(html_toolbar));
 
947
                } else {
 
948
                        menu_item = gtk_menu_item_new();
 
949
                        gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), menu_item, _(tbi[i].tooltiptext), NULL);
 
950
                        gtk_container_add(GTK_CONTAINER(menu_item), new_pixmap(tbi[i].pixmaptype));
 
951
                        g_signal_connect(GTK_OBJECT(menu_item), "activate", G_CALLBACK(tbi[i].func), bfwin);
 
952
                        g_signal_connect(menu_item, "button-press-event", G_CALLBACK(html_toolbar_item_button_press_lcb), &tbi[i]);
 
953
                        gtk_menu_append(GTK_MENU(sub_menu), menu_item);
 
954
                }
 
955
        }
 
956
        menu_bar = gtk_menu_bar_new();
 
957
        menu_item = gtk_menu_item_new();
 
958
        gtk_container_add(GTK_CONTAINER(menu_item),new_pixmap(menupix));
 
959
        gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), sub_menu);
 
960
        gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), menu_item);
 
961
        pixmap = new_pixmap(menupix);
 
962
        gtk_toolbar_append_element(GTK_TOOLBAR(html_toolbar),GTK_TOOLBAR_CHILD_WIDGET,menu_bar,NULL,menulabel,NULL,pixmap,NULL,NULL);
 
963
        gtk_object_sink(GTK_OBJECT(pixmap));
 
964
}
 
965
 
 
966
void make_html_toolbar(Tbfwin *bfwin) {
 
967
/*
 
968
 * every item with a ... in the tooltip brings up a dialog, every item
 
969
 * without the ... in the tooltip will directly insert html code
 
970
 *
 
971
 */
 
972
        GtkWidget *html_toolbar, *html_notebook;
 
973
 
 
974
        DEBUG_MSG("make_html_toolbar, started\n");
 
975
        html_notebook = gtk_notebook_new();
 
976
        gtk_notebook_set_tab_pos(GTK_NOTEBOOK(html_notebook), GTK_POS_TOP);
 
977
        gtk_notebook_set_show_tabs(GTK_NOTEBOOK(html_notebook), TRUE);
 
978
        gtk_notebook_set_show_border(GTK_NOTEBOOK(html_notebook), TRUE);
 
979
        gtk_notebook_set_page(GTK_NOTEBOOK(html_notebook), 0);
 
980
        gtk_container_add(GTK_CONTAINER(bfwin->html_toolbar_hb), html_notebook);
 
981
 
 
982
        bfwin->toolbar_quickbar = gtk_toolbar_new();
 
983
        gtk_toolbar_set_style(GTK_TOOLBAR(bfwin->toolbar_quickbar), GTK_TOOLBAR_ICONS);
 
984
        DEBUG_MSG("make_html_toolbar, creating quickbar\n");
 
985
        {
 
986
                GList *tmplist;
 
987
                gint i, numitems=(sizeof(tbi)/sizeof(Ttoolbaritem));
 
988
                tmplist = g_list_first(main_v->globses.quickbar_items);
 
989
                while (tmplist) {
 
990
                        gchar *tmpstr = tmplist->data;
 
991
                        DEBUG_MSG("make_html_toolbar, searching for %s\n", tmpstr);
 
992
                        for (i=0;i<numitems;i++) {
 
993
                                if (strcmp(tbi[i].ident, tmpstr)==0) {
 
994
                                        Tquickbaritem *qbi = g_new(Tquickbaritem,1);
 
995
                                        qbi->button = gtk_toolbar_append_item(GTK_TOOLBAR(bfwin->toolbar_quickbar), NULL, _(tbi[i].tooltiptext),
 
996
                                                "", new_pixmap(tbi[i].pixmaptype), G_CALLBACK(tbi[i].func), bfwin);
 
997
                                        g_signal_connect(qbi->button, "button-press-event", G_CALLBACK(html_toolbar_quickbar_item_button_press_lcb), &tbi[i]);
 
998
                                        qbi->tbitem = &tbi[i];
 
999
                                        bfwin->toolbar_quickbar_children = g_list_append(bfwin->toolbar_quickbar_children, qbi);
 
1000
                                        DEBUG_MSG("make_html_toolbar, appended %s as quickbaritem %p to quickbar %p\n",qbi->tbitem->ident, qbi,bfwin->toolbar_quickbar);
 
1001
                                        break;
 
1002
                                }
 
1003
                        }
 
1004
                        tmplist = g_list_next(tmplist);
 
1005
                }
 
1006
        }
 
1007
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), bfwin->toolbar_quickbar, gtk_label_new(_(" Quick bar ")));
 
1008
 
 
1009
        html_toolbar = gtk_toolbar_new();
 
1010
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1011
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 0, 14);
 
1012
        html_toolbar_add_items_to_submenu(bfwin,html_toolbar, tbi, 26, 31, _("Heading"), 91);
 
1013
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 76, 78);
 
1014
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" Standard bar ")));
 
1015
 
 
1016
        html_toolbar = gtk_toolbar_new();
 
1017
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1018
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 15, 25);
 
1019
        html_toolbar_add_items_to_submenu(bfwin,html_toolbar, tbi, 79, 86, _("Context formatting"), 103);
 
1020
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 25, 31);
 
1021
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" Fonts ")));
 
1022
 
 
1023
        html_toolbar = gtk_toolbar_new();
 
1024
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1025
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 32, 43);
 
1026
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" Tables ")));
 
1027
 
 
1028
        html_toolbar = gtk_toolbar_new();
 
1029
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1030
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 44, 52);
 
1031
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" Frames ")));
 
1032
 
 
1033
        html_toolbar = gtk_toolbar_new();
 
1034
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1035
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 53, 63);
 
1036
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" Forms ")));
 
1037
 
 
1038
        html_toolbar = gtk_toolbar_new();
 
1039
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1040
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 64, 70);
 
1041
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" List ")));
 
1042
 
 
1043
        html_toolbar = gtk_toolbar_new();
 
1044
        gtk_toolbar_set_style(GTK_TOOLBAR(html_toolbar), GTK_TOOLBAR_ICONS);
 
1045
        html_toolbar_add_items(bfwin,html_toolbar, tbi, 71, 73);
 
1046
        gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), html_toolbar, gtk_label_new(_(" CSS ")));
 
1047
 
 
1048
        gtk_widget_show_all(html_notebook);
 
1049
}
 
1050
 
 
1051
static void doc_indent_lcb(GtkWidget *wid,Tbfwin *bfwin) {
 
1052
        if (bfwin->current_document) {
 
1053
                doc_indent_selection(bfwin->current_document,0);
 
1054
        }
 
1055
}
 
1056
static void doc_unindent_lcb(GtkWidget *wid,Tbfwin *bfwin) {
 
1057
        if (bfwin->current_document) {
 
1058
                doc_indent_selection(bfwin->current_document,1);
 
1059
        }
 
1060
}
 
1061
        
 
1062
 
 
1063
 
 
1064
void make_main_toolbar(Tbfwin *bfwin) {
 
1065
        GtkWidget *toolbar = gtk_toolbar_new ();
 
1066
        DEBUG_MSG("make_main_toolbar, started\n");
 
1067
        gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar), GTK_ORIENTATION_HORIZONTAL);
 
1068
        gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
 
1069
        gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_LARGE_TOOLBAR);
 
1070
        gtk_container_add (GTK_CONTAINER(bfwin->main_toolbar_hb), toolbar);
 
1071
 
 
1072
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_NEW, _("New"),
 
1073
                                                                "", G_CALLBACK(file_new_cb), bfwin, -1);
 
1074
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_OPEN, _("Open..."),
 
1075
                                                                "", G_CALLBACK(file_open_cb), bfwin, -1);
 
1076
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_SAVE, _("Save"),
 
1077
                                                                "", G_CALLBACK(file_save_cb), bfwin, -1);
 
1078
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_SAVE_AS, _("Save As..."),    
 
1079
                                                                "", G_CALLBACK(file_save_as_cb), bfwin, -1);
 
1080
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_CLOSE, _("Close"),   
 
1081
                                                                "", G_CALLBACK(file_close_cb), bfwin, -1);              
 
1082
        gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
 
1083
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_CUT, _("Cut"),       
 
1084
                                                                "", G_CALLBACK(edit_cut_cb), bfwin, -1);
 
1085
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_COPY, _("Copy"),     
 
1086
                                                                "", G_CALLBACK(edit_copy_cb), bfwin, -1);
 
1087
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_PASTE, _("Paste"),   
 
1088
                                                                "", G_CALLBACK(edit_paste_cb), bfwin, -1);
 
1089
        gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));                                                               
 
1090
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_FIND, _("Find..."),  
 
1091
                                                                "", G_CALLBACK(search_cb), bfwin, -1);
 
1092
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_FIND_AND_REPLACE, _("Replace..."),   
 
1093
                                                                "", G_CALLBACK(replace_cb), bfwin, -1);
 
1094
        gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));                                                               
 
1095
        bfwin->toolbar_undo = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_UNDO, _("Undo"),       
 
1096
                                                                "", G_CALLBACK(undo_cb), bfwin, -1);
 
1097
        bfwin->toolbar_redo = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_REDO, _("Redo"),       
 
1098
                                                                "", G_CALLBACK(redo_cb), bfwin, -1);
 
1099
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
1100
        gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, _("Shift Left"),
 
1101
                                                        "", new_pixmap(111), G_CALLBACK(doc_unindent_lcb), bfwin);
 
1102
        gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, _("Shift Right"),
 
1103
                                                        "", new_pixmap(110), G_CALLBACK(doc_indent_lcb), bfwin);
 
1104
 
 
1105
/*
 
1106
        gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL, _("Print..."), "",
 
1107
                                                        new_pixmap(015), G_CALLBACK(file_print_cb), NULL);*/
 
1108
#ifdef HAVE_LIBASPELL
 
1109
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_SPELL_CHECK, _("Spellcheck..."),
 
1110
                                                        "", G_CALLBACK(spell_check_cb), bfwin, -1);
 
1111
#endif /* HAVE_LIBASPELL */
 
1112
 
 
1113
        gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), NULL,
 
1114
                                                        _("View in browser"), "",
 
1115
                                                        new_pixmap(102), G_CALLBACK(browser_toolbar_cb), bfwin);
 
1116
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
1117
        gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), GTK_STOCK_PREFERENCES, _("Preferences..."),    
 
1118
                                                                "", G_CALLBACK(open_preferences_cb), NULL, -1); 
 
1119
 
 
1120
        gtk_widget_show_all(toolbar);
 
1121
}
 
1122
 
 
1123
void gui_set_undo_redo_widgets(Tbfwin *bfwin, gboolean undo, gboolean redo) {
 
1124
        if (GTK_WIDGET_VISIBLE(bfwin->main_toolbar_hb)) {
 
1125
                gtk_widget_set_sensitive(bfwin->toolbar_redo, redo);
 
1126
                gtk_widget_set_sensitive(bfwin->toolbar_undo, undo);
 
1127
        }
 
1128
        
 
1129
        menuitem_set_sensitive(bfwin->menubar, "/Edit/Undo", undo);
 
1130
        menuitem_set_sensitive(bfwin->menubar, "/Edit/Undo All", undo);
 
1131
        menuitem_set_sensitive(bfwin->menubar, "/Edit/Redo", redo);
 
1132
        menuitem_set_sensitive(bfwin->menubar, "/Edit/Redo All", redo);
 
1133
}
 
1134
 
 
1135
void gui_set_document_widgets(Tdocument *doc) {
 
1136
        GtkItemFactory *tmp1 = gtk_item_factory_from_widget(BFWIN(doc->bfwin)->menubar);
 
1137
        setup_toggle_item(tmp1,("/Document/Highlight Syntax"), (doc->highlightstate && doc->hl->highlightlist != NULL));
 
1138
        /*gtk_widget_set_sensitive(gtk_item_factory_get_widget(tmp1,_("/Document/Highlight Syntax")), (doc->hl->highlightlist != NULL));*/
 
1139
        gui_set_undo_redo_widgets(doc->bfwin, doc_has_undo_list(doc), doc_has_redo_list(doc));
 
1140
        setup_toggle_item(gtk_item_factory_from_widget(BFWIN(doc->bfwin)->menubar),"/Document/Wrap", doc->wrapstate);
 
1141
        setup_toggle_item(gtk_item_factory_from_widget(BFWIN(doc->bfwin)->menubar),"/Document/Line Numbers", doc->linenumberstate);
 
1142
        setup_toggle_item(gtk_item_factory_from_widget(BFWIN(doc->bfwin)->menubar),"/Document/Auto Close HTML tags", doc->autoclosingtag);
 
1143
        menu_current_document_set_toggle_wo_activate(BFWIN(doc->bfwin),doc->hl, doc->encoding);
 
1144
}
 
1145
 
 
1146
void gui_notebook_bind_signals(Tbfwin *bfwin) {
 
1147
        bfwin->notebook_switch_signal = g_signal_connect_after(G_OBJECT(bfwin->notebook),"switch-page",G_CALLBACK(notebook_switch_page_lcb), bfwin);
 
1148
}
 
1149
 
 
1150
void gui_notebook_unbind_signals(Tbfwin *bfwin) {
 
1151
if (bfwin->notebook_switch_signal != 0) {
 
1152
                g_signal_handler_disconnect(G_OBJECT(bfwin->notebook),bfwin->notebook_switch_signal);
 
1153
                bfwin->notebook_switch_signal = 0;
 
1154
        }
 
1155
}
 
1156
 
 
1157
static gboolean gui_main_window_configure_event_lcb(GtkWidget *widget,GdkEvent *revent,Tbfwin *bfwin) {
 
1158
        if (main_v->props.restore_dimensions) {
 
1159
                if (revent->type == GDK_CONFIGURE) {
 
1160
                        GdkEventConfigure *event = (GdkEventConfigure *)revent;
 
1161
                        if (main_v->globses.main_window_w > 0 ) {
 
1162
                                main_v->globses.main_window_w = event->width;
 
1163
                                main_v->globses.main_window_h = event->height;
 
1164
                                DEBUG_MSG("gui_main_window_configure_event_lcb, width=%d, height=%d\n",main_v->globses.main_window_w,main_v->globses.main_window_h);
 
1165
                        }
 
1166
                } else if (revent->type == GDK_WINDOW_STATE) {
 
1167
                        GdkEventWindowState *event = (GdkEventWindowState *)revent;
 
1168
                        if (event->new_window_state == GDK_WINDOW_STATE_MAXIMIZED && main_v->globses.main_window_w > 0) {
 
1169
                                main_v->globses.main_window_w = -1 * main_v->globses.main_window_w; /* negative means it is maximized !! */
 
1170
                                DEBUG_MSG("gui_main_window_configure_event_lcb, maximized!! width=%d\n",main_v->globses.main_window_w);
 
1171
                        } else if (event->new_window_state != GDK_WINDOW_STATE_MAXIMIZED && main_v->globses.main_window_w < 0) {
 
1172
                                main_v->globses.main_window_w = -1 * main_v->globses.main_window_w; /* make it positive again */
 
1173
                                DEBUG_MSG("gui_main_window_configure_event_lcb, NOT-maximized, width=%d\n",main_v->globses.main_window_w);
 
1174
                        }
 
1175
                }
 
1176
        }
 
1177
        return FALSE;
 
1178
}
 
1179
 
 
1180
enum {
 
1181
TARGET_URI_LIST,
 
1182
TARGET_STRING
 
1183
} Tdnd_types;
 
1184
static void main_win_on_drag_data_lcb(GtkWidget * widget, GdkDragContext * context
 
1185
                        , gint x, gint y, GtkSelectionData * data
 
1186
                        , guint info, guint time, Tbfwin *bfwin) {
 
1187
        gchar *filename, *url;
 
1188
        int mode = 0;
 
1189
        gint url_is_local;
 
1190
 
 
1191
        if ((data->length == 0) || (data->format != 8) || ((info != TARGET_STRING) && (info != TARGET_URI_LIST))) {
 
1192
                DEBUG_MSG("on_drag_data_cb, currently unknown DnD object, need to do string comparision\n");
 
1193
                gtk_drag_finish(context, FALSE, TRUE, time);
 
1194
                return;
 
1195
        }
 
1196
 
 
1197
        /* netscape sends URL's labelled as string */
 
1198
        if (info == TARGET_STRING) {
 
1199
                gchar *stringdata = g_strndup((gchar *)data->data, data->length);
 
1200
                if (strchr(stringdata, ':')) {
 
1201
                        DEBUG_MSG("on_drag_data_cb, TARGET_STRING contains :, so it's probably an URL\n");
 
1202
                        info = TARGET_URI_LIST;
 
1203
                }
 
1204
                g_free(stringdata);
 
1205
        }
 
1206
 
 
1207
        /* construct both filename and url from the given data */
 
1208
        if (info == TARGET_STRING) {
 
1209
                filename = g_strndup((gchar *)data->data, data->length);
 
1210
                filename = trunc_on_char(trunc_on_char(filename, '\n'), '\r');
 
1211
                url = g_strconcat("file:", filename, NULL);
 
1212
                url_is_local = 1;
 
1213
                DEBUG_MSG("on_drag_data_cb, TARGET_STRING, url=%s\n",url);
 
1214
        } else { /* TARGET_UTI_LIST*/
 
1215
                gchar *tmp2;
 
1216
                gint len;
 
1217
 
 
1218
                url = g_strndup((gchar *)data->data, data->length);
 
1219
                url = trunc_on_char(trunc_on_char(url, '\n'), '\r');
 
1220
                if (strncmp(url, "file://", 7) == 0) {
 
1221
                        filename = g_strdup(url+7);
 
1222
                        url_is_local = 1;
 
1223
                        DEBUG_MSG("on_drag_data_cb, TARGET_URI_LIST, url=%s, filename=%s\n",url,filename);
 
1224
                } else {
 
1225
                        len = strlen(url);
 
1226
                        tmp2 = strrchr(url, '#');
 
1227
                        if (tmp2) {
 
1228
                                len -= strlen(tmp2);
 
1229
                        }
 
1230
                        filename = g_strndup(url, len);
 
1231
                        url_is_local = 0;
 
1232
                        DEBUG_MSG("on_drag_data_cb, TARGET_URI_LIST, url=%s\n",url);
 
1233
                }
 
1234
        }
 
1235
        DEBUG_MSG("on_drag_data_cb, filename='%s', url='%s'\n", filename, url);
 
1236
        doc_new_with_file(bfwin,url_is_local ? filename : url, FALSE, FALSE);
 
1237
 
 
1238
        gtk_drag_finish(context, TRUE, (mode == GDK_ACTION_COPY), time);
 
1239
        g_free(filename);
 
1240
        g_free(url);
 
1241
}
 
1242
 
 
1243
void gui_bfwin_cleanup(Tbfwin *bfwin) {
 
1244
        GList *tmplist;
 
1245
        /* call all cleanup functions here */
 
1246
        /*remove_window_entry_from_all_windows(bfwin);*/
 
1247
        
 
1248
        /* all documents have to be freed for this window */
 
1249
        tmplist = g_list_first(bfwin->documentlist);
 
1250
        DEBUG_MSG("gui_bfwin_cleanup, have %d documents in window %p\n",g_list_length(bfwin->documentlist),bfwin);
 
1251
        while (tmplist) {
 
1252
                DEBUG_MSG("gui_bfwin_cleanup closing doc=%p\n",tmplist->data);
 
1253
                doc_destroy(DOCUMENT(tmplist->data), TRUE);
 
1254
                /* no this is not an indefinite loop, because the documents remove themselves
 
1255
                from the documentlist, we remove the top document untill there are no documents
 
1256
                left */
 
1257
                tmplist = g_list_first(bfwin->documentlist);
 
1258
        }
 
1259
        
 
1260
        bmark_cleanup(bfwin);
 
1261
}
 
1262
 
 
1263
void main_window_destroy_lcb(GtkWidget *widget,Tbfwin *bfwin) {
 
1264
        DEBUG_MSG("main_window_destroy_lcb, started\n");
 
1265
        DEBUG_MSG("main_window_destroy_lcb, will hide the window now\n");
 
1266
        gtk_widget_hide(bfwin->main_window);
 
1267
        main_v->bfwinlist = g_list_remove(main_v->bfwinlist, bfwin);
 
1268
        DEBUG_MSG("main_window_destroy_lcb, bfwin(%p) is removed from bfwinlist\n",bfwin);
 
1269
        gui_bfwin_cleanup(bfwin);
 
1270
        DEBUG_MSG("main_window_destroy_lcb, will destroy the window now\n");
 
1271
        gtk_widget_destroy(bfwin->main_window);
 
1272
        g_free(bfwin);
 
1273
        DEBUG_MSG("main_window_destroy_lcb, bfwin is free'ed\n");
 
1274
        if (NULL == main_v->bfwinlist) {
 
1275
                bluefish_exit_request();
 
1276
        }
 
1277
}
 
1278
gboolean main_window_delete_event_lcb(GtkWidget *widget,GdkEvent *event,Tbfwin *bfwin) {
 
1279
        /* If you return FALSE in the "delete_event" signal handler,
 
1280
         * GTK will emit the "destroy" signal. Returning TRUE means
 
1281
         * you don't want the window to be destroyed.
 
1282
         * This is useful for popping up 'are you sure you want to quit?'
 
1283
         * type dialogs. */
 
1284
        DEBUG_MSG("main_window_delete_event_lcb, started\n");
 
1285
        if (bfwin->project) {
 
1286
                return !project_save_and_close(bfwin);
 
1287
        } else {
 
1288
                if (bfwin->documentlist && test_docs_modified(bfwin->documentlist)) {
 
1289
                        DEBUG_MSG("main_window_delete_event_lcb, we have changed documents!\n");
 
1290
                        bfwin_close_all_documents(bfwin, TRUE);
 
1291
                        if (bfwin->documentlist && test_docs_modified(bfwin->documentlist)) {
 
1292
                                DEBUG_MSG("main_window_delete_event_lcb, we STILL have changed documents!?!\n");
 
1293
                                /* if there are still documents modified we should cancel the closing */
 
1294
                                return TRUE;
 
1295
                        }
 
1296
                } else {
 
1297
                        /* no changed documents, but there might be changed bookmarks */
 
1298
                        bmark_store_all(bfwin);
 
1299
                }
 
1300
        }
 
1301
        return FALSE;
 
1302
}
 
1303
 
 
1304
void gui_create_main(Tbfwin *bfwin, GList *filenames) {
 
1305
        GtkWidget *vbox;
 
1306
        DEBUG_MSG("gui_create_main, bfwin=%p, bfwin->bookmarkstore=%p\n",bfwin,bfwin->bookmarkstore);
 
1307
        bfwin->main_window = window_full2(_("New Bluefish Window"), GTK_WIN_POS_CENTER, 0, G_CALLBACK(main_window_destroy_lcb), bfwin, FALSE, NULL);
 
1308
        gtk_window_set_role(GTK_WINDOW(bfwin->main_window), "bluefish");
 
1309
        if (main_v->globses.main_window_w > 0) {
 
1310
                gtk_window_set_default_size(GTK_WINDOW(bfwin->main_window), main_v->globses.main_window_w, main_v->globses.main_window_h);
 
1311
        } else {
 
1312
                gtk_window_set_default_size(GTK_WINDOW(bfwin->main_window), main_v->globses.main_window_w * -1, main_v->globses.main_window_h);
 
1313
                gtk_window_maximize(GTK_WINDOW(bfwin->main_window));
 
1314
        }
 
1315
        g_signal_connect(G_OBJECT(bfwin->main_window), "delete_event", G_CALLBACK(main_window_delete_event_lcb), bfwin);
 
1316
        g_signal_connect(G_OBJECT(bfwin->main_window), "configure-event", G_CALLBACK(gui_main_window_configure_event_lcb), bfwin);
 
1317
        g_signal_connect(G_OBJECT(bfwin->main_window), "window-state-event", G_CALLBACK(gui_main_window_configure_event_lcb), bfwin);
 
1318
 
 
1319
        vbox = gtk_vbox_new(FALSE, 0);
 
1320
        gtk_container_add(GTK_CONTAINER(bfwin->main_window), vbox);
 
1321
        gtk_widget_show(vbox);
 
1322
 
 
1323
        /* first a menubar */
 
1324
        DEBUG_MSG("gui_create_main, starting menu_create_main\n");
 
1325
        menu_create_main(bfwin, vbox);
 
1326
        DEBUG_MSG("gui_create_main, starting recent_menu\n");
 
1327
        recent_menu_init(bfwin);
 
1328
        DEBUG_MSG("gui_create_main, starting external-encoding_menu\n");
 
1329
        external_menu_rebuild(bfwin);
 
1330
        encoding_menu_rebuild(bfwin);
 
1331
        snr2_init(bfwin);
 
1332
/*      add_window_entry_to_all_windows(bfwin);
 
1333
        add_allwindows_entries_to_window(bfwin);*/
 
1334
        /* then the toolbars */
 
1335
        {
 
1336
                DEBUG_MSG("gui_create_main, creating handles for all menu/toolbars\n");
 
1337
                bfwin->main_toolbar_hb = gtk_handle_box_new();
 
1338
                gtk_box_pack_start(GTK_BOX(vbox), bfwin->main_toolbar_hb, FALSE, FALSE, 0);
 
1339
                bfwin->html_toolbar_hb = gtk_handle_box_new();
 
1340
                gtk_box_pack_start(GTK_BOX(vbox), bfwin->html_toolbar_hb, FALSE, FALSE, 0);
 
1341
                bfwin->custom_menu_hb = gtk_handle_box_new();
 
1342
                gtk_box_pack_start(GTK_BOX(vbox), bfwin->custom_menu_hb, FALSE, FALSE, 0);
 
1343
 
 
1344
                if ((bfwin->project && bfwin->project->view_main_toolbar) || (!bfwin->project && main_v->props.view_main_toolbar)) {
 
1345
                        make_main_toolbar(bfwin);
 
1346
                        gtk_widget_show(bfwin->main_toolbar_hb);
 
1347
                }
 
1348
                if ((bfwin->project && bfwin->project->view_html_toolbar) || (!bfwin->project && main_v->props.view_html_toolbar)) {
 
1349
                        make_html_toolbar(bfwin);
 
1350
                        gtk_widget_show(bfwin->html_toolbar_hb);
 
1351
                }
 
1352
                if ((bfwin->project && bfwin->project->view_custom_menu) || (!bfwin->project && main_v->props.view_custom_menu)) {
 
1353
                        make_cust_menubar(bfwin,bfwin->custom_menu_hb);
 
1354
                        gtk_widget_show(bfwin->custom_menu_hb);
 
1355
                }
 
1356
        }
 
1357
        
 
1358
        /* then the work area */
 
1359
        bfwin->middlebox = gtk_hbox_new(TRUE, 0);
 
1360
        gtk_box_pack_start(GTK_BOX(vbox), bfwin->middlebox, TRUE, TRUE, 0);
 
1361
        gtk_widget_show(bfwin->middlebox);
 
1362
 
 
1363
        /* Fake-label (for notebook_hide() and _show() ;) */
 
1364
        bfwin->notebook_fake = gtk_label_new(_("Stand by..."));
 
1365
        
 
1366
        /* notebook with the text widget in there */
 
1367
        bfwin->notebook = gtk_notebook_new();
 
1368
        gtk_notebook_set_tab_pos(GTK_NOTEBOOK(bfwin->notebook),main_v->props.document_tabposition);
 
1369
        gtk_notebook_set_show_tabs(GTK_NOTEBOOK(bfwin->notebook), TRUE);
 
1370
        gtk_notebook_set_show_border(GTK_NOTEBOOK(bfwin->notebook), FALSE);
 
1371
        gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(bfwin->notebook), 0);
 
1372
        gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(bfwin->notebook), 0);
 
1373
        gtk_notebook_popup_enable(GTK_NOTEBOOK(bfwin->notebook));
 
1374
 
 
1375
        /* Add notebook and its fake friend to their common hbox. */
 
1376
        bfwin->notebook_box = gtk_hbox_new (TRUE, 0);
 
1377
        gtk_box_pack_start(GTK_BOX(bfwin->notebook_box), bfwin->notebook, TRUE, TRUE, 0);
 
1378
        gtk_box_pack_start(GTK_BOX(bfwin->notebook_box), bfwin->notebook_fake, TRUE, TRUE, 0);
 
1379
 
 
1380
        /* output_box */
 
1381
        init_output_box(bfwin, vbox);
 
1382
 
 
1383
        left_panel_show_hide_toggle(bfwin,TRUE, (bfwin->project && bfwin->project->view_left_panel) || (!bfwin->project && main_v->props.view_left_panel), FALSE);
 
1384
 
 
1385
        /* finally the statusbar */
 
1386
        {
 
1387
                GtkWidget *hbox;
 
1388
                gint onecharwidth;
 
1389
                hbox = gtk_hbox_new(FALSE,0);
 
1390
                gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
1391
                bfwin->statusbar = gtk_statusbar_new();
 
1392
                gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(bfwin->statusbar), FALSE);
 
1393
                gtk_box_pack_start(GTK_BOX(hbox), bfwin->statusbar, TRUE, TRUE, 0);
 
1394
                bfwin->statusbar_lncol = gtk_statusbar_new();
 
1395
                gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(bfwin->statusbar_lncol), FALSE);
 
1396
                gtk_box_pack_start(GTK_BOX(hbox), bfwin->statusbar_lncol, FALSE, FALSE, 0);
 
1397
                /* I hope the 'w' is an average width character */
 
1398
                onecharwidth = widget_get_string_size(bfwin->statusbar_lncol, "w");
 
1399
                gtk_widget_set_size_request(GTK_WIDGET(bfwin->statusbar_lncol), 17*onecharwidth, -1);
 
1400
                bfwin->statusbar_insovr = gtk_statusbar_new();
 
1401
                gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(bfwin->statusbar_insovr), FALSE);
 
1402
                gtk_box_pack_start(GTK_BOX(hbox), bfwin->statusbar_insovr, FALSE, FALSE, 0);
 
1403
                gtk_widget_set_size_request(GTK_WIDGET(bfwin->statusbar_insovr), onecharwidth * 4, -1);
 
1404
                bfwin->statusbar_editmode = gtk_statusbar_new();
 
1405
                gtk_box_pack_start(GTK_BOX(hbox), bfwin->statusbar_editmode, FALSE, FALSE, 0);
 
1406
                gtk_widget_set_size_request(GTK_WIDGET(bfwin->statusbar_editmode), onecharwidth * 25, -1);
 
1407
                gtk_widget_show_all(hbox);
 
1408
        }
 
1409
        /* We have to know when the notebook changes */
 
1410
        gui_notebook_bind_signals(bfwin);
 
1411
        
 
1412
        /* everything is ready - we can start loading documents */
 
1413
        /* start to open an empty doc */
 
1414
        file_new_cb(NULL, bfwin);
 
1415
        if (filenames) {
 
1416
                DEBUG_MSG("gui_create_main, we have filenames, load them\n");
 
1417
                docs_new_from_files(bfwin,filenames,(bfwin->project != NULL));
 
1418
        }
 
1419
 
 
1420
        gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), 0);
 
1421
        gtk_notebook_set_scrollable(GTK_NOTEBOOK(bfwin->notebook), TRUE);
 
1422
        /* don't use show_all since some widgets are and should be hidden */
 
1423
        gtk_widget_show(bfwin->notebook);
 
1424
        gtk_widget_show (bfwin->notebook_box);
 
1425
 
 
1426
        {
 
1427
                /* drag n drop support */
 
1428
                const GtkTargetEntry drag_dest_types[] = {
 
1429
                        {"text/uri-list", 0, TARGET_URI_LIST },
 
1430
                        {"STRING", 0, TARGET_STRING},
 
1431
                };
 
1432
                gtk_drag_dest_set(bfwin->main_window, (GTK_DEST_DEFAULT_ALL)
 
1433
                                ,drag_dest_types, 2
 
1434
                                ,(GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE |
 
1435
                                GDK_ACTION_LINK | GDK_ACTION_PRIVATE | GDK_ACTION_ASK));
 
1436
                g_signal_connect(G_OBJECT(bfwin->main_window), "drag_data_received", G_CALLBACK(main_win_on_drag_data_lcb), bfwin);
 
1437
        }
 
1438
}
 
1439
 
 
1440
void gui_show_main(Tbfwin *bfwin) {
 
1441
        /* show all */
 
1442
        DEBUG_MSG("gui_show_main, before show\n");
 
1443
        /* don't use show_all since some widgets are and should be hidden */
 
1444
        gtk_widget_show(bfwin->main_window);
 
1445
        flush_queue();
 
1446
        doc_scroll_to_cursor(bfwin->current_document);
 
1447
        if ((bfwin->project && bfwin->project->view_left_panel) || (!bfwin->project && main_v->props.view_left_panel)) {
 
1448
                filebrowser_scroll_initial(bfwin);
 
1449
        }
 
1450
}
 
1451
/***********************/
 
1452
/* statusbar functions */
 
1453
/***********************/
 
1454
typedef struct {
 
1455
        gint message_id;
 
1456
        Tbfwin *bfwin;
 
1457
} Tstatusbar_remove;
 
1458
 
 
1459
static gint statusbar_remove(gpointer sr) {
 
1460
        gtk_statusbar_remove(GTK_STATUSBAR(((Tstatusbar_remove *)sr)->bfwin->statusbar), 0, ((Tstatusbar_remove *)sr)->message_id);
 
1461
        g_free(sr);
 
1462
        return FALSE;
 
1463
}
 
1464
 
 
1465
void statusbar_message(Tbfwin *bfwin,gchar *message, gint time) {
 
1466
        if (bfwin->statusbar) {
 
1467
                Tstatusbar_remove *sr = g_new(Tstatusbar_remove,1);
 
1468
                sr->bfwin = bfwin;
 
1469
                sr->message_id = gtk_statusbar_push(GTK_STATUSBAR(bfwin->statusbar), 0, message);
 
1470
                gtk_timeout_add(time, statusbar_remove, sr);
 
1471
        }
 
1472
}
 
1473
 
 
1474
 
 
1475
/***********************/
 
1476
/* GOTO line functions */
 
1477
/***********************/
 
1478
 
 
1479
typedef struct {
 
1480
        GtkWidget *win;
 
1481
        GtkWidget *entry;
 
1482
        GtkWidget *check;
 
1483
        Tbfwin *bfwin;
 
1484
} Tgotoline;
 
1485
 
 
1486
static void tgl_destroy_lcb(GtkWidget * widget, Tgotoline *tgl) {
 
1487
        window_destroy(tgl->win);
 
1488
        g_free(tgl);
 
1489
}
 
1490
 
 
1491
static void tgl_ok_clicked_lcb(GtkWidget * widget, Tgotoline *tgl)
 
1492
{
 
1493
        gchar *linestr;
 
1494
        gint linenum;
 
1495
 
 
1496
        linestr = gtk_editable_get_chars(GTK_EDITABLE(tgl->entry), 0, -1);
 
1497
        linenum = get_int_from_string(linestr);
 
1498
        DEBUG_MSG("tgl_ok_clicked_lcb, going to line %d (linestr=%s)\n", linenum, linestr);
 
1499
        g_free(linestr);
 
1500
        
 
1501
        if (linenum > 0) {
 
1502
                doc_select_line(tgl->bfwin->current_document, linenum, TRUE);
 
1503
        }
 
1504
 
 
1505
        if (GTK_TOGGLE_BUTTON(tgl->check)->active) {
 
1506
                if (linenum > 0) {
 
1507
                        gchar *new_text;
 
1508
                        gint position=0;
 
1509
                        gtk_editable_delete_text (GTK_EDITABLE(tgl->entry), 0, -1);
 
1510
                        new_text = g_strdup_printf("%d", linenum);
 
1511
                        gtk_editable_insert_text(GTK_EDITABLE(tgl->entry),new_text,strlen(new_text),&position);
 
1512
                        g_free(new_text);
 
1513
                }
 
1514
        } else {
 
1515
                tgl_destroy_lcb(NULL, tgl);
 
1516
        }
 
1517
 
 
1518
}
 
1519
 
 
1520
static void tgl_fromsel_clicked_lcb(GtkWidget * widget, Tgotoline *tgl) {
 
1521
        gchar *string;
 
1522
        GtkClipboard* cb;
 
1523
 
 
1524
        cb = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
 
1525
        string = gtk_clipboard_wait_for_text(cb);
 
1526
        if (string) {
 
1527
                gtk_entry_set_text(GTK_ENTRY(tgl->entry), string);
 
1528
        }
 
1529
        tgl_ok_clicked_lcb(widget, tgl);
 
1530
}
 
1531
 
 
1532
static void tgl_cancel_clicked_lcb(GtkWidget *widget, gpointer data) {
 
1533
        tgl_destroy_lcb(NULL, data);
 
1534
}
 
1535
 
 
1536
void tgl_enter_lcb (GtkWidget *widget, gpointer ud) {
 
1537
     Tgotoline *tgl;
 
1538
     tgl = ud;
 
1539
     tgl_ok_clicked_lcb (widget, tgl);
 
1540
}
 
1541
 
 
1542
void go_to_line_win_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
 
1543
        Tgotoline *tgl;
 
1544
        GtkWidget *but1, *vbox, *hbox, *label;
 
1545
        
 
1546
        tgl = g_new(Tgotoline, 1);
 
1547
        tgl->bfwin = bfwin;
 
1548
        tgl->win = window_full(_("Goto line"), GTK_WIN_POS_MOUSE
 
1549
                                                  ,12, G_CALLBACK(tgl_destroy_lcb), tgl, TRUE);
 
1550
        vbox = gtk_vbox_new(FALSE, 12);
 
1551
        gtk_container_add(GTK_CONTAINER(tgl->win), vbox);
 
1552
 
 
1553
        hbox = gtk_hbox_new(FALSE, 12);
 
1554
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
1555
 
 
1556
        label = gtk_label_new_with_mnemonic(_("_Line number:"));
 
1557
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
1558
 
 
1559
        tgl->entry = boxed_entry_with_text(NULL, 20, hbox);
 
1560
        gtk_label_set_mnemonic_widget(GTK_LABEL(label), tgl->entry); /* mnemonic for label */
 
1561
 
 
1562
        but1 = bf_generic_mnemonic_button(_("From _selection"), G_CALLBACK(tgl_fromsel_clicked_lcb), tgl);
 
1563
        gtk_box_pack_start(GTK_BOX(hbox), but1, FALSE, FALSE, 0);
 
1564
 
 
1565
        tgl->check = boxed_checkbut_with_value(_("Keep _dialog"), 0, vbox);
 
1566
        
 
1567
        gtk_box_pack_start(GTK_BOX(vbox), gtk_hseparator_new(), TRUE, TRUE, 0);
 
1568
        
 
1569
        hbox = gtk_hbutton_box_new();
 
1570
        gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_END);
 
1571
        gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 12);
 
1572
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);       
 
1573
        
 
1574
        but1 = bf_stock_cancel_button(G_CALLBACK(tgl_cancel_clicked_lcb), tgl);
 
1575
        gtk_box_pack_start(GTK_BOX(hbox), but1, FALSE, FALSE, 0);
 
1576
        gtk_widget_grab_focus (tgl->entry);
 
1577
 
 
1578
        but1 = bf_stock_ok_button(G_CALLBACK(tgl_ok_clicked_lcb), tgl);
 
1579
        gtk_box_pack_start(GTK_BOX(hbox), but1, FALSE, FALSE, 0);
 
1580
        gtk_window_set_default(GTK_WINDOW(tgl->win), but1);
 
1581
 
 
1582
        gtk_widget_show_all(tgl->win);
 
1583
}
 
1584
 
 
1585
void go_to_line_from_selection_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
 
1586
        gchar *string;
 
1587
        GtkClipboard* cb;
 
1588
        gint linenum;
 
1589
 
 
1590
        cb = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
 
1591
        string = gtk_clipboard_wait_for_text(cb);
 
1592
        if (string) {
 
1593
                linenum = get_int_from_string(string);
 
1594
                if (linenum > 0) {
 
1595
                        doc_select_line(bfwin->current_document, linenum, TRUE);
 
1596
                }
 
1597
        }
 
1598
}
 
1599
 
 
1600
#ifndef NOSPLASH
 
1601
 
 
1602
void splash_screen_set_label(gchar *label) {
 
1603
        static struct timespec const req = { 0, 10000000};
 
1604
#ifdef DEBUG
 
1605
        g_print("Setting splash label to %s\n", label);
 
1606
#endif
 
1607
        gtk_label_set(GTK_LABEL(splashscreen.label),label);
 
1608
        flush_queue();
 
1609
        nanosleep(&req, NULL);
 
1610
}
 
1611
 
 
1612
GtkWidget *start_splash_screen() {
 
1613
        static struct timespec const req = { 0, 100000000};
 
1614
        GtkWidget *image, *vbox;
 
1615
        GdkColor color;
 
1616
 
 
1617
        splashscreen.window = window_with_title(CURRENT_VERSION_NAME, GTK_WIN_POS_CENTER_ALWAYS, 0);
 
1618
        gtk_window_set_default_icon_list(default_icon_list());
 
1619
        gtk_window_set_decorated(GTK_WINDOW(splashscreen.window), FALSE);
 
1620
        gtk_window_set_role(GTK_WINDOW(splashscreen.window), "splash");
 
1621
        gtk_window_set_resizable(GTK_WINDOW(splashscreen.window),FALSE);
 
1622
        color.red = 65535;
 
1623
        color.blue = 65535;
 
1624
        color.green = 65535;
 
1625
        gtk_widget_modify_bg(splashscreen.window, GTK_STATE_NORMAL,&color);
 
1626
 
 
1627
 
 
1628
        vbox = gtk_vbox_new(FALSE, 0);
 
1629
        gtk_container_add(GTK_CONTAINER(splashscreen.window), vbox);
 
1630
        gtk_widget_show(vbox);
 
1631
        splashscreen.label = gtk_label_new(_("starting bluefish"));
 
1632
        gtk_box_pack_end(GTK_BOX(vbox),splashscreen.label , FALSE, FALSE, 0);
 
1633
        gtk_widget_show(splashscreen.label);
 
1634
        {
 
1635
                GError *error=NULL;
 
1636
                GdkPixbuf* pixbuf= gdk_pixbuf_new_from_file(BLUEFISH_SPLASH_FILENAME,&error);
 
1637
                if (error) {
 
1638
                        g_print("ERROR while loading splash screen: %s\n", error->message);
 
1639
                        g_error_free(error);
 
1640
                } else if (pixbuf) {
 
1641
                        image = gtk_image_new_from_pixbuf(pixbuf);
 
1642
                        gtk_box_pack_end(GTK_BOX(vbox), image, FALSE, FALSE, 0);
 
1643
                        g_object_unref(pixbuf);
 
1644
                        gtk_widget_show(image);
 
1645
                }
 
1646
        }
 
1647
 
 
1648
        gtk_widget_show(splashscreen.window);
 
1649
        flush_queue();
 
1650
        DEBUG_MSG("start_splash_screen, should be visible\n");
 
1651
        nanosleep(&req, NULL);
 
1652
        return splashscreen.window;
 
1653
}
 
1654
#endif /* #ifndef NOSPLASH */
 
1655
 
 
1656
void gui_set_html_toolbar_visible(Tbfwin *bfwin, gboolean visible, gboolean sync_menu) {
 
1657
        if (sync_menu) {
 
1658
                DEBUG_MSG("gui_set_html_toolbar_visible, trying to sync menu\n");
 
1659
                setup_toggle_item_from_widget(bfwin->menubar, "/View/View HTML Toolbar", visible);
 
1660
        }
 
1661
        if (gtk_container_children(GTK_CONTAINER(bfwin->html_toolbar_hb)) == NULL) {
 
1662
                make_html_toolbar(bfwin);
 
1663
        }
 
1664
        widget_set_visible(bfwin->html_toolbar_hb,visible);
 
1665
}
 
1666
void gui_set_main_toolbar_visible(Tbfwin *bfwin, gboolean visible, gboolean sync_menu) {
 
1667
        if (sync_menu) {
 
1668
                DEBUG_MSG("gui_set_main_toolbar_visible, trying to sync menu\n");
 
1669
                setup_toggle_item_from_widget(bfwin->menubar, "/View/View Main Toolbar", visible);
 
1670
        }
 
1671
        if (gtk_container_children(GTK_CONTAINER(bfwin->main_toolbar_hb)) == NULL) {
 
1672
                make_main_toolbar(bfwin);
 
1673
        }
 
1674
        widget_set_visible(bfwin->main_toolbar_hb,visible);
 
1675
}
 
1676
void gui_set_custom_menu_visible(Tbfwin *bfwin, gboolean visible, gboolean sync_menu) {
 
1677
        if (sync_menu) {
 
1678
                DEBUG_MSG("gui_set_custom_menu_visible, trying to sync menu\n");
 
1679
                setup_toggle_item_from_widget(bfwin->menubar, "/View/View Custom Menu", visible);
 
1680
        }
 
1681
        if (gtk_container_children(GTK_CONTAINER(bfwin->custom_menu_hb)) == NULL) {
 
1682
                make_cust_menubar(bfwin,bfwin->custom_menu_hb);
 
1683
        }
 
1684
        widget_set_visible(bfwin->custom_menu_hb,visible);
 
1685
}
 
1686
 
 
1687
void gui_toggle_hidewidget_cb(Tbfwin *bfwin,guint action,GtkWidget *widget) {
 
1688
        gboolean active = GTK_CHECK_MENU_ITEM(widget)->active;
 
1689
        DEBUG_MSG("gui_toggle_hidewidget_cb, action=%d, active=%d\n",action,active);
 
1690
        switch (action) {
 
1691
        case 1:
 
1692
                if (bfwin->project) bfwin->project->view_main_toolbar = active;;
 
1693
                gui_set_main_toolbar_visible(bfwin, active, FALSE);
 
1694
        break;
 
1695
        case 2:
 
1696
                if (bfwin->project) bfwin->project->view_html_toolbar = active;
 
1697
                gui_set_html_toolbar_visible(bfwin, active, FALSE);
 
1698
        break;
 
1699
        case 3:
 
1700
                if (bfwin->project) bfwin->project->view_custom_menu = active;
 
1701
                gui_set_custom_menu_visible(bfwin, active, FALSE);
 
1702
        break;
 
1703
        case 4:
 
1704
                if (bfwin->project) bfwin->project->view_left_panel = active;
 
1705
                left_panel_show_hide_toggle(bfwin,FALSE, active, FALSE);
 
1706
        break;
 
1707
        default:
 
1708
                g_print("gui_toggle_hidewidget_cb should NEVER be called with action %d\n", action);
 
1709
                exit(1);
 
1710
        break;
 
1711
        }
 
1712
}
 
1713
 
 
1714
Tbfwin *gui_new_window(GList *filenames, Tproject *project) {
 
1715
        Tbfwin *bfwin = g_new0(Tbfwin,1);
 
1716
        bfwin->bmark_files = NULL; /* Oskar */
 
1717
        if (project) {
 
1718
                bfwin->project = project;
 
1719
                bfwin->session = project->session;
 
1720
                bfwin->bookmarkstore = project->bookmarkstore;
 
1721
                DEBUG_MSG("gui_new_window, bfwin=%p, bfwin->bookmarkstore=%p (from project %p)\n",bfwin,bfwin->bookmarkstore,project);
 
1722
        } else {
 
1723
                bfwin->session = main_v->session;
 
1724
                bfwin->bookmarkstore = main_v->bookmarkstore;
 
1725
                DEBUG_MSG("gui_new_window, bfwin=%p, bfwin->bookmarkstore=%p (from main_v)\n",bfwin,bfwin->bookmarkstore);
 
1726
        }
 
1727
        gui_create_main(bfwin,filenames);
 
1728
        /* never comment this out again Jim! */
 
1729
        main_v->bfwinlist = g_list_append(main_v->bfwinlist, bfwin);
 
1730
        gui_show_main(bfwin);
 
1731
        return bfwin;
 
1732
}
 
1733
 
 
1734
void gui_window_menu_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
 
1735
        switch (callback_action) {
 
1736
                case 1:
 
1737
                        gui_new_window(NULL, NULL);
 
1738
                break;
 
1739
                case 2: /* close the window */
 
1740
                        if (main_window_delete_event_lcb(NULL, NULL, bfwin) == FALSE) {
 
1741
                                gtk_widget_destroy(bfwin->main_window);
 
1742
                        }
 
1743
                break;
 
1744
        }
 
1745
}