1
/* Bluefish HTML Editor
4
* Copyright (C) 2002-2004 Olivier Sessink
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.
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.
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
23
#include <time.h> /* nanosleep() */
24
#include <string.h> /* strchr() */
25
#include <unistd.h> /* exit() */
26
#include <stdlib.h> /* exit() on Solaris */
32
#include "document.h" /* file_new_cb() */
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"
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() */
55
#endif /* HAVE_LIBASPELL */
62
/******************************/
63
/* global vars for this module */
64
/******************************/
66
static Tsplashscreen splashscreen;
68
/**************************/
69
/* start of the functions */
70
/**************************/
75
* Hides the notebook. Used when loading a large amount of files, to avoid
76
* slowing things down. Shows a "Stand by..." label instead..
80
void notebook_hide(Tbfwin *bfwin) {
81
gtk_widget_hide (bfwin->notebook);
82
gtk_widget_show (bfwin->notebook_fake);
88
* Shows the notebook, after a notebook_hide() has been called.
92
void notebook_show(Tbfwin *bfwin) {
93
gtk_widget_hide (bfwin->notebook_fake);
94
gtk_widget_show (bfwin->notebook);
97
void notebook_changed(Tbfwin *bfwin, gint newpage) {
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)
103
,gtk_notebook_get_current_page(GTK_NOTEBOOK(bfwin->notebook))
104
,bfwin->last_notebook_page
105
,bfwin->current_document
108
/* this returns -1 if there is no current page */
109
cur = gtk_notebook_get_current_page(GTK_NOTEBOOK(bfwin->notebook));
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);
117
doclistlen = g_list_length(bfwin->documentlist);
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;
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");
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;
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);
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 */
149
doc_activate(bfwin->current_document);
150
/* bmark_adjust_visible(bfwin);*/
153
gboolean switch_to_document_by_index(Tbfwin *bfwin,gint index) {
155
gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), (index));
156
/* notebook_changed();*/
162
gboolean switch_to_document_by_pointer(Tbfwin *bfwin,Tdocument *document) {
165
index = g_list_index(bfwin->documentlist, document);
166
return switch_to_document_by_index(bfwin,index);
169
gboolean switch_to_document_by_filename(Tbfwin *bfwin,gchar *filename) {
172
index = documentlist_return_index_from_filename(bfwin->documentlist,filename);
173
return switch_to_document_by_index(bfwin,index);
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);
182
void gui_notebook_switch(Tbfwin *bfwin,guint action,GtkWidget *widget) {
184
case 1: gtk_notebook_prev_page(GTK_NOTEBOOK(bfwin->notebook));
186
case 2: gtk_notebook_next_page(GTK_NOTEBOOK(bfwin->notebook));
188
case 3: gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), 0);
190
case 4: gtk_notebook_set_page(GTK_NOTEBOOK(bfwin->notebook), -1);
194
static void left_panel_notify_position_lcb(GObject *object,GParamSpec *pspec,gpointer data){
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;
202
main_v->props.left_panel_width = main_v->globses.main_window_w - position;
207
GtkWidget *left_panel_build(Tbfwin *bfwin) {
209
GtkWidget *left_notebook = gtk_notebook_new();
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;
230
* if there is a left panel, this function will rebuild all widgets
232
void left_panel_rebuild(Tbfwin *bfwin) {
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);
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);
245
gtk_paned_add2(GTK_PANED(bfwin->hpane), bfwin->leftpanel_notebook);
247
gtk_widget_show_all(bfwin->leftpanel_notebook);
251
void left_panel_show_hide_toggle(Tbfwin *bfwin,gboolean first_time, gboolean show, gboolean 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);
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);
262
gtk_widget_ref(bfwin->notebook_box);
264
gtk_container_remove(GTK_CONTAINER(bfwin->middlebox), bfwin->notebook_box);
266
gtk_container_remove(GTK_CONTAINER(bfwin->hpane), bfwin->notebook_box);
267
gtk_widget_destroy(bfwin->hpane);
268
filebrowser_cleanup(bfwin);
270
bmark_cleanup(bfwin);
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);
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);
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);
290
bfwin->leftpanel_notebook = NULL;
291
gtk_box_pack_start(GTK_BOX(bfwin->middlebox), bfwin->notebook_box, TRUE, TRUE, 0);
294
gtk_widget_unref(bfwin->notebook_box);
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);
305
prfilepart = g_strdup(tablabel);
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);*/
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);
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");
324
left_panel_show_hide_toggle(bfwin,FALSE, FALSE, FALSE);
325
left_panel_show_hide_toggle(bfwin,FALSE, TRUE, FALSE);
334
const gchar *tooltiptext;
338
Ttoolbaritem *tbitem;
343
static void bold_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
344
general_html_menu_cb(bfwin, 1, NULL);
346
static void italic_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
347
general_html_menu_cb(bfwin, 2, NULL);
349
static void paragraph_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
350
general_html_menu_cb(bfwin, 5, NULL);
352
static void break_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
353
general_html_menu_cb(bfwin, 6, NULL);
355
static void breakclear_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
356
general_html_menu_cb(bfwin, 41, NULL);
358
static void nbsp_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
359
general_html_menu_cb(bfwin, 7, NULL);
361
static void center_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
362
general_html_menu_cb(bfwin, 8, NULL);
364
static void rightjustify_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
365
general_html_menu_cb(bfwin, 9, NULL);
367
static void comment_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
368
general_html_menu_cb(bfwin, 10, NULL);
370
static void fontsizeplus1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
371
general_html_menu_cb(bfwin, 11, NULL);
373
static void fontsizeminus1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
374
general_html_menu_cb(bfwin, 12, NULL);
376
static void preformatted_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
377
general_html_menu_cb(bfwin, 13, NULL);
379
static void subscript_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
380
general_html_menu_cb(bfwin, 14, NULL);
382
static void superscript_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
383
general_html_menu_cb(bfwin, 15, NULL);
385
static void strong_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
386
general_html_menu_cb(bfwin, 16, NULL);
388
static void emphasis_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
389
general_html_menu_cb(bfwin, 17, NULL);
391
static void heading1_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
392
general_html_menu_cb(bfwin, 18, NULL);
394
static void heading2_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
395
general_html_menu_cb(bfwin, 19, NULL);
397
static void heading3_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
398
general_html_menu_cb(bfwin, 20, NULL);
400
static void heading4_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
401
general_html_menu_cb(bfwin, 21, NULL);
403
static void heading5_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
404
general_html_menu_cb(bfwin, 22, NULL);
406
static void heading6_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
407
general_html_menu_cb(bfwin, 23, NULL);
409
static void table_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
410
general_html_menu_cb(bfwin, 24, NULL);
412
static void tablerow_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
413
general_html_menu_cb(bfwin, 25, NULL);
415
static void tableheader_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
416
general_html_menu_cb(bfwin, 26, NULL);
418
static void tabledata_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
419
general_html_menu_cb(bfwin, 27, NULL);
421
static void tablecaption_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
422
general_html_menu_cb(bfwin, 28, NULL);
424
static void frameset_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
425
general_html_menu_cb(bfwin, 29, NULL);
427
static void frame_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
428
general_html_menu_cb(bfwin, 30, NULL);
430
static void noframes_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
431
general_html_menu_cb(bfwin, 31, NULL);
433
static void target_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
434
general_html_menu_cb(bfwin, 32, NULL);
436
static void unorderedlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
437
general_html_menu_cb(bfwin, 33, NULL);
439
static void orderedlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
440
general_html_menu_cb(bfwin, 34, NULL);
442
static void listitem_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
443
general_html_menu_cb(bfwin, 35, NULL);
445
static void definitionlist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
446
general_html_menu_cb(bfwin, 36, NULL);
448
static void definitionterm_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
449
general_html_menu_cb(bfwin, 37, NULL);
451
static void definition_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
452
general_html_menu_cb(bfwin, 38, NULL);
454
static void style_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
455
general_html_menu_cb(bfwin, 42, NULL);
457
static void dfn_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
458
general_html_menu_cb(bfwin, 48, NULL);
460
static void code_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
461
general_html_menu_cb(bfwin, 49, NULL);
463
static void samp_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
464
general_html_menu_cb(bfwin, 50, NULL);
466
static void kbd_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
467
general_html_menu_cb(bfwin, 51, NULL);
469
static void var_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
470
general_html_menu_cb(bfwin, 52, NULL);
472
static void cite_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
473
general_html_menu_cb(bfwin, 53, NULL);
475
static void abbr_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
476
general_html_menu_cb(bfwin, 54, NULL);
478
static void acronym_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
479
general_html_menu_cb(bfwin, 55, NULL);
482
static void quickstart_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
483
quickstart_dialog(bfwin,NULL);
485
static void body_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
486
body_dialog(bfwin,NULL);
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);
492
static void quickrule_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
493
quickrule_dialog(bfwin,NULL);
495
static void email_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
496
email_dialog(bfwin,NULL);
498
static void fontdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
499
font_dialog(bfwin,NULL);
501
static void basefont_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
502
basefont_dialog(bfwin,NULL);
504
static void framesetdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
505
frameset_dialog(bfwin,NULL);
507
static void framedialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
508
frame_dialog(bfwin,NULL);
510
static void quicklist_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
511
quicklist_dialog(bfwin,NULL);
513
static void link_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
514
linkdialog_dialog(bfwin,NULL);
516
static void formdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
517
formdialog_dialog(bfwin,NULL);
519
static void inputbuttondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
520
inputdialog_dialog(bfwin, NULL, "submit");
522
static void textdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
523
inputdialog_dialog(bfwin, NULL, "text");
525
static void hiddendialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
526
inputdialog_dialog(bfwin, NULL, "hidden");
528
static void textareadialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
529
textareadialog_dialog(bfwin,NULL);
531
static void radiodialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
532
inputdialog_dialog(bfwin, NULL, "radio");
534
static void checkdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
535
inputdialog_dialog(bfwin, NULL, "checkbox");
537
static void selectdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
538
selectdialog_dialog(bfwin,NULL);
540
static void optiondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
541
optiondialog_dialog(bfwin,NULL);
543
static void optgroupdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
544
optgroupdialog_dialog(bfwin,NULL);
546
static void buttondialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
547
buttondialog_dialog(bfwin,NULL);
549
static void image_insert_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
550
image_insert_dialog(bfwin,NULL);
552
static void thumbnail_insert_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
553
thumbnail_insert_dialog(bfwin);
555
static void multi_thumbnail_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
556
multi_thumbnail_dialog(bfwin);
558
static void tabledialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
559
tabledialog_dialog(bfwin,NULL);
561
static void tablerowdialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
562
tablerowdialog_dialog(bfwin,NULL);
564
static void tableheaddialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
565
tableheaddialog_dialog(bfwin,NULL);
567
static void tabledatadialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
568
tabledatadialog_dialog(bfwin,NULL);
570
static void tablewizard_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
571
tablewizard_dialog(bfwin);
573
static void framewizard_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
574
framewizard_dialog(bfwin);
576
static void span_dialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
577
span_dialog(bfwin,NULL);
579
static void div_dialog_clicked_lcb(GtkWidget *widget, Tbfwin *bfwin) {
580
div_dialog(bfwin,NULL);
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 */
675
static void html_toolbar_remove_from_quickbar_lcb(GtkMenuItem *menuitem, Ttoolbaritem *tbitem) {
677
main_v->globses.quickbar_items = remove_from_stringlist(main_v->globses.quickbar_items, tbitem->ident);
678
bfwlist = g_list_first(main_v->bfwinlist);
680
Tquickbaritem *qbi=NULL;
681
Tbfwin *bfwin = BFWIN(bfwlist->data);
682
GList *tmplist = g_list_first(bfwin->toolbar_quickbar_children);
685
if (qbi->tbitem == tbitem) {
688
tmplist = g_list_next(tmplist);
691
gtk_widget_hide(qbi->button);
692
gtk_widget_destroy(qbi->button);
695
bfwlist = g_list_next(bfwlist);
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);
703
tmplist = g_list_first(BFWIN(winlist->data)->toolbar_quickbar_children);
708
if (qbi->tbitem == tbitem) {
709
DEBUG_MSG("get_quickbar_item_position, quickbar item is at %d\n", pos);
713
tmplist = g_list_next(tmplist);
715
DEBUG_MSG("get_quickbar_item_position, not found, return -1!\n");
719
static gboolean html_toolbar_quickbar_item_button_press_lcb(GtkWidget *widget,GdkEventButton *bevent,Ttoolbaritem *tbitem);
721
static void html_toolbar_quickbar_switch(Ttoolbaritem *tbitem, gboolean moveright) {
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));
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);
732
DEBUG_MSG("html_toolbar_quickbar_switch, nothing found in config list at pos=%d, RETURN\n",pos);
735
tmp2 = (moveright) ? g_list_next(tmp1) : g_list_previous(tmp1);
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));
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));
743
/* now switch the widgets in every window that has a quickbar */
744
tmplist = g_list_first(main_v->bfwinlist);
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) {
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));
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);
774
tmplist = g_list_next(tmplist);
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);
787
Tbfwin *bfwin = BFWIN(winlist->data);
790
pos = get_quickbar_item_position(tbitem);
791
tmplist = g_list_nth(bfwin->toolbar_quickbar_children, pos);
795
if (pos) { / * pos > 0 * /
796
gtk_widget_destroy(qbi->button);
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;
810
other = g_list_previous(tmplist);
811
list_switch_order(tmplist, other);
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);
819
winlist = g_list_next(winlist);
821
we don't create this list here so we don't need to free it!!
822
g_list_free(winlist);*/
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);
831
GList *tmplist, *other;
832
Tbfwin *bfwin = BFWIN(winlist->data);
834
pos = get_quickbar_item_position(tbitem);
835
tmplist = g_list_nth(bfwin->toolbar_quickbar_children, pos);
839
gtk_widget_hide(qbi->button);
840
gtk_widget_destroy(qbi->button);
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;
851
other = g_list_next(tmplist);
852
list_switch_order(tmplist, other);
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);
860
winlist = g_list_next(winlist);
862
/ * g_list_free(winlist); */
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 ());
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);
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);
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 ());
922
static void html_toolbar_add_items(Tbfwin *bfwin, GtkWidget *html_toolbar, Ttoolbaritem *tbi, gint from, gint to) {
925
for (i=from;i<=to;i++) {
926
if (tbi[i].func == NULL) {
927
gtk_toolbar_append_space(GTK_TOOLBAR(html_toolbar));
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]);
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;
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));
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);
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));
966
void make_html_toolbar(Tbfwin *bfwin) {
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
972
GtkWidget *html_toolbar, *html_notebook;
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);
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");
987
gint i, numitems=(sizeof(tbi)/sizeof(Ttoolbaritem));
988
tmplist = g_list_first(main_v->globses.quickbar_items);
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);
1004
tmplist = g_list_next(tmplist);
1007
gtk_notebook_append_page(GTK_NOTEBOOK(html_notebook), bfwin->toolbar_quickbar, gtk_label_new(_(" Quick bar ")));
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 ")));
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 ")));
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 ")));
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 ")));
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 ")));
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 ")));
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 ")));
1048
gtk_widget_show_all(html_notebook);
1051
static void doc_indent_lcb(GtkWidget *wid,Tbfwin *bfwin) {
1052
if (bfwin->current_document) {
1053
doc_indent_selection(bfwin->current_document,0);
1056
static void doc_unindent_lcb(GtkWidget *wid,Tbfwin *bfwin) {
1057
if (bfwin->current_document) {
1058
doc_indent_selection(bfwin->current_document,1);
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);
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);
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 */
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);
1120
gtk_widget_show_all(toolbar);
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);
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);
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);
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);
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;
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);
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);
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;
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);
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;
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);
1213
DEBUG_MSG("on_drag_data_cb, TARGET_STRING, url=%s\n",url);
1214
} else { /* TARGET_UTI_LIST*/
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);
1223
DEBUG_MSG("on_drag_data_cb, TARGET_URI_LIST, url=%s, filename=%s\n",url,filename);
1226
tmp2 = strrchr(url, '#');
1228
len -= strlen(tmp2);
1230
filename = g_strndup(url, len);
1232
DEBUG_MSG("on_drag_data_cb, TARGET_URI_LIST, url=%s\n",url);
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);
1238
gtk_drag_finish(context, TRUE, (mode == GDK_ACTION_COPY), time);
1243
void gui_bfwin_cleanup(Tbfwin *bfwin) {
1245
/* call all cleanup functions here */
1246
/*remove_window_entry_from_all_windows(bfwin);*/
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);
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
1257
tmplist = g_list_first(bfwin->documentlist);
1260
bmark_cleanup(bfwin);
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);
1273
DEBUG_MSG("main_window_destroy_lcb, bfwin is free'ed\n");
1274
if (NULL == main_v->bfwinlist) {
1275
bluefish_exit_request();
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?'
1284
DEBUG_MSG("main_window_delete_event_lcb, started\n");
1285
if (bfwin->project) {
1286
return !project_save_and_close(bfwin);
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 */
1297
/* no changed documents, but there might be changed bookmarks */
1298
bmark_store_all(bfwin);
1304
void gui_create_main(Tbfwin *bfwin, GList *filenames) {
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);
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));
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);
1319
vbox = gtk_vbox_new(FALSE, 0);
1320
gtk_container_add(GTK_CONTAINER(bfwin->main_window), vbox);
1321
gtk_widget_show(vbox);
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);
1332
/* add_window_entry_to_all_windows(bfwin);
1333
add_allwindows_entries_to_window(bfwin);*/
1334
/* then the toolbars */
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);
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);
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);
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);
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);
1363
/* Fake-label (for notebook_hide() and _show() ;) */
1364
bfwin->notebook_fake = gtk_label_new(_("Stand by..."));
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));
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);
1381
init_output_box(bfwin, vbox);
1383
left_panel_show_hide_toggle(bfwin,TRUE, (bfwin->project && bfwin->project->view_left_panel) || (!bfwin->project && main_v->props.view_left_panel), FALSE);
1385
/* finally the statusbar */
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);
1409
/* We have to know when the notebook changes */
1410
gui_notebook_bind_signals(bfwin);
1412
/* everything is ready - we can start loading documents */
1413
/* start to open an empty doc */
1414
file_new_cb(NULL, bfwin);
1416
DEBUG_MSG("gui_create_main, we have filenames, load them\n");
1417
docs_new_from_files(bfwin,filenames,(bfwin->project != NULL));
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);
1427
/* drag n drop support */
1428
const GtkTargetEntry drag_dest_types[] = {
1429
{"text/uri-list", 0, TARGET_URI_LIST },
1430
{"STRING", 0, TARGET_STRING},
1432
gtk_drag_dest_set(bfwin->main_window, (GTK_DEST_DEFAULT_ALL)
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);
1440
void gui_show_main(Tbfwin *bfwin) {
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);
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);
1451
/***********************/
1452
/* statusbar functions */
1453
/***********************/
1457
} Tstatusbar_remove;
1459
static gint statusbar_remove(gpointer sr) {
1460
gtk_statusbar_remove(GTK_STATUSBAR(((Tstatusbar_remove *)sr)->bfwin->statusbar), 0, ((Tstatusbar_remove *)sr)->message_id);
1465
void statusbar_message(Tbfwin *bfwin,gchar *message, gint time) {
1466
if (bfwin->statusbar) {
1467
Tstatusbar_remove *sr = g_new(Tstatusbar_remove,1);
1469
sr->message_id = gtk_statusbar_push(GTK_STATUSBAR(bfwin->statusbar), 0, message);
1470
gtk_timeout_add(time, statusbar_remove, sr);
1475
/***********************/
1476
/* GOTO line functions */
1477
/***********************/
1486
static void tgl_destroy_lcb(GtkWidget * widget, Tgotoline *tgl) {
1487
window_destroy(tgl->win);
1491
static void tgl_ok_clicked_lcb(GtkWidget * widget, Tgotoline *tgl)
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);
1502
doc_select_line(tgl->bfwin->current_document, linenum, TRUE);
1505
if (GTK_TOGGLE_BUTTON(tgl->check)->active) {
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);
1515
tgl_destroy_lcb(NULL, tgl);
1520
static void tgl_fromsel_clicked_lcb(GtkWidget * widget, Tgotoline *tgl) {
1524
cb = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
1525
string = gtk_clipboard_wait_for_text(cb);
1527
gtk_entry_set_text(GTK_ENTRY(tgl->entry), string);
1529
tgl_ok_clicked_lcb(widget, tgl);
1532
static void tgl_cancel_clicked_lcb(GtkWidget *widget, gpointer data) {
1533
tgl_destroy_lcb(NULL, data);
1536
void tgl_enter_lcb (GtkWidget *widget, gpointer ud) {
1539
tgl_ok_clicked_lcb (widget, tgl);
1542
void go_to_line_win_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
1544
GtkWidget *but1, *vbox, *hbox, *label;
1546
tgl = g_new(Tgotoline, 1);
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);
1553
hbox = gtk_hbox_new(FALSE, 12);
1554
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1556
label = gtk_label_new_with_mnemonic(_("_Line number:"));
1557
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
1559
tgl->entry = boxed_entry_with_text(NULL, 20, hbox);
1560
gtk_label_set_mnemonic_widget(GTK_LABEL(label), tgl->entry); /* mnemonic for label */
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);
1565
tgl->check = boxed_checkbut_with_value(_("Keep _dialog"), 0, vbox);
1567
gtk_box_pack_start(GTK_BOX(vbox), gtk_hseparator_new(), TRUE, TRUE, 0);
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);
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);
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);
1582
gtk_widget_show_all(tgl->win);
1585
void go_to_line_from_selection_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
1590
cb = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
1591
string = gtk_clipboard_wait_for_text(cb);
1593
linenum = get_int_from_string(string);
1595
doc_select_line(bfwin->current_document, linenum, TRUE);
1602
void splash_screen_set_label(gchar *label) {
1603
static struct timespec const req = { 0, 10000000};
1605
g_print("Setting splash label to %s\n", label);
1607
gtk_label_set(GTK_LABEL(splashscreen.label),label);
1609
nanosleep(&req, NULL);
1612
GtkWidget *start_splash_screen() {
1613
static struct timespec const req = { 0, 100000000};
1614
GtkWidget *image, *vbox;
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);
1624
color.green = 65535;
1625
gtk_widget_modify_bg(splashscreen.window, GTK_STATE_NORMAL,&color);
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);
1636
GdkPixbuf* pixbuf= gdk_pixbuf_new_from_file(BLUEFISH_SPLASH_FILENAME,&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);
1648
gtk_widget_show(splashscreen.window);
1650
DEBUG_MSG("start_splash_screen, should be visible\n");
1651
nanosleep(&req, NULL);
1652
return splashscreen.window;
1654
#endif /* #ifndef NOSPLASH */
1656
void gui_set_html_toolbar_visible(Tbfwin *bfwin, gboolean visible, gboolean 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);
1661
if (gtk_container_children(GTK_CONTAINER(bfwin->html_toolbar_hb)) == NULL) {
1662
make_html_toolbar(bfwin);
1664
widget_set_visible(bfwin->html_toolbar_hb,visible);
1666
void gui_set_main_toolbar_visible(Tbfwin *bfwin, gboolean visible, gboolean 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);
1671
if (gtk_container_children(GTK_CONTAINER(bfwin->main_toolbar_hb)) == NULL) {
1672
make_main_toolbar(bfwin);
1674
widget_set_visible(bfwin->main_toolbar_hb,visible);
1676
void gui_set_custom_menu_visible(Tbfwin *bfwin, gboolean visible, gboolean 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);
1681
if (gtk_container_children(GTK_CONTAINER(bfwin->custom_menu_hb)) == NULL) {
1682
make_cust_menubar(bfwin,bfwin->custom_menu_hb);
1684
widget_set_visible(bfwin->custom_menu_hb,visible);
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);
1692
if (bfwin->project) bfwin->project->view_main_toolbar = active;;
1693
gui_set_main_toolbar_visible(bfwin, active, FALSE);
1696
if (bfwin->project) bfwin->project->view_html_toolbar = active;
1697
gui_set_html_toolbar_visible(bfwin, active, FALSE);
1700
if (bfwin->project) bfwin->project->view_custom_menu = active;
1701
gui_set_custom_menu_visible(bfwin, active, FALSE);
1704
if (bfwin->project) bfwin->project->view_left_panel = active;
1705
left_panel_show_hide_toggle(bfwin,FALSE, active, FALSE);
1708
g_print("gui_toggle_hidewidget_cb should NEVER be called with action %d\n", action);
1714
Tbfwin *gui_new_window(GList *filenames, Tproject *project) {
1715
Tbfwin *bfwin = g_new0(Tbfwin,1);
1716
bfwin->bmark_files = NULL; /* Oskar */
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);
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);
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);
1734
void gui_window_menu_cb(Tbfwin *bfwin,guint callback_action, GtkWidget *widget) {
1735
switch (callback_action) {
1737
gui_new_window(NULL, NULL);
1739
case 2: /* close the window */
1740
if (main_window_delete_event_lcb(NULL, NULL, bfwin) == FALSE) {
1741
gtk_widget_destroy(bfwin->main_window);