/** -*- erwin-c -*-
erwin - really simple html editor
Copyright (C) 1999-2005 Adrian Reber
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
File: erwindialogs.c
Description: most of the dialogs are here
Changes:
01 Jul 2002: first entry
10 Jul 2002: complete rewrite of help_about_menu()
15 Jul 2002: port to gtk2 completed
*/
/* $Id: erwindialogs.c,v 1.20 2005/01/19 20:59:44 adrian Exp $ */
#ifndef lint
static const char vcid[] = "$Id: erwindialogs.c,v 1.20 2005/01/19 20:59:44 adrian Exp $";
#endif /* lint */
#include "xpm/logo_new1.xpm"
#include "erwin.h"
#include "erwinfunctions.h"
#include
#include
#include
extern GtkWidget *main_window;
extern gint from_beginning;
struct font_options font_options;
void table_wizard(GtkWidget * widget)
{
GtkWidget *dialog;
GtkWidget *button;
GtkWidget *label;
GtkWidget *table;
GtkWidget *spinner1;
GtkWidget *spinner2;
GtkAdjustment *adj;
if (rendered())
return;
table_values.rows = 1;
table_values.cols = 1;
dialog = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dialog), PACKAGE);
gtk_window_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
gtk_signal_connect(GTK_OBJECT(dialog), "delete_event",
GTK_SIGNAL_FUNC(destroy_message), NULL);
gtk_signal_connect(GTK_OBJECT(dialog), "destroy", GTK_SIGNAL_FUNC(destroy_message), NULL);
table = gtk_table_new(2, 4, FALSE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 5);
label = gtk_label_new("Rows: ");
gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 10, 10);
adj = (GtkAdjustment *) gtk_adjustment_new(1.0, 1.0, 99.0, 1.0, 4.0, 0.0);
spinner1 = gtk_spin_button_new(adj, 0, 0);
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner1), TRUE);
gtk_signal_connect_object(GTK_OBJECT(spinner1), "changed",
GTK_SIGNAL_FUNC(get_value_1), NULL);
gtk_widget_show(spinner1);
gtk_table_attach(GTK_TABLE(table), spinner1, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 10, 10);
label = gtk_label_new("Columns: ");
gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 10, 10);
adj = (GtkAdjustment *) gtk_adjustment_new(1.0, 1.0, 99.0, 1.0, 4.0, 0.0);
spinner2 = gtk_spin_button_new(adj, 0, 0);
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner2), TRUE);
gtk_widget_show(spinner2);
gtk_table_attach(GTK_TABLE(table), spinner2, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 10, 10);
gtk_signal_connect_object(GTK_OBJECT(spinner2), "changed",
GTK_SIGNAL_FUNC(get_value_2), NULL);
gtk_widget_show(table);
button = gtk_button_new_with_label("Make it so!");
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(destroy_table_wizard), GTK_OBJECT(dialog));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, FALSE, 5);
gtk_widget_show(button);
gtk_widget_show(dialog);
}
void message()
{
display_dialog("Message ...", "Text is to short to save");
}
void open_file_dlg()
{
GtkWidget *dialog;
GtkFileFilter *filter_all = gtk_file_filter_new();
GtkFileFilter *filter_html = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter_all, "*");
gtk_file_filter_set_name(filter_all, "All Files");
gtk_file_filter_add_pattern(filter_html, "*html");
gtk_file_filter_set_name(filter_html, "HTML Files");
dialog = gtk_file_chooser_dialog_new("Open File",
GTK_WINDOW(main_window),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN,
GTK_RESPONSE_ACCEPT, NULL);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_all);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_html);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
char *filename;
char *directory;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
_open_file_ok(filename);
g_free(filename);
}
gtk_widget_destroy(dialog);
}
void save_file_dlg(struct document *document)
{
GtkWidget *dialog;
if (!document)
document =
(g_list_nth
(documents, gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_main))))->data;
dialog = gtk_file_chooser_dialog_new("Save File As...",
GTK_WINDOW(main_window),
GTK_FILE_CHOOSER_ACTION_SAVE,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE,
GTK_RESPONSE_ACCEPT, NULL);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
char *filename;
char *directory;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
document->filename = g_string_assign(document->filename, filename);
save_file_ok(document);
g_free(filename);
}
gtk_widget_destroy(dialog);
}
void close_body_dialog(GtkWidget * widget, gpointer data)
{
gtk_grab_remove(GTK_WIDGET(data));
gtk_widget_destroy(GTK_WIDGET(data));
}
void body_dialog()
{
GtkWidget *button;
GtkWidget *hbox;
GtkWidget *hbox_1;
if (rendered())
return;
body_elements.dialog = gtk_dialog_new();
gtk_signal_connect(GTK_OBJECT(body_elements.dialog), "destroy",
GTK_SIGNAL_FUNC(close_body_dialog), body_elements.dialog);
gtk_window_set_title(GTK_WINDOW(body_elements.dialog), "Body");
gtk_window_position(GTK_WINDOW(body_elements.dialog), GTK_WIN_POS_CENTER);
gtk_container_border_width(GTK_CONTAINER(body_elements.dialog), 5);
hbox = gtk_vbox_new(TRUE, TRUE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(body_elements.dialog)->vbox), hbox, TRUE, TRUE, 0);
/* TITLE */
entry_in_frame("Title", &body_elements.title);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.title.frame, TRUE, TRUE, 0);
/* BGCOLOR */
entry_in_frame("Background Color", &body_elements.bgcolor);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.bgcolor.frame, TRUE, TRUE, 0);
/* TEXT */
entry_in_frame("Text Color", &body_elements.text);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.text.frame, TRUE, TRUE, 0);
/* LINK */
entry_in_frame("Link Color", &body_elements.link);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.link.frame, TRUE, TRUE, 0);
/* VLINK */
entry_in_frame("Visited Link Color", &body_elements.vlink);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.vlink.frame, TRUE, TRUE, 0);
/* ALINK */
entry_in_frame("Active Link Color", &body_elements.alink);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.alink.frame, TRUE, TRUE, 0);
/*BACKGROUD IMAGE */
hbox_1 = entry_in_frame("Background Image", &body_elements.background);
gtk_box_pack_start(GTK_BOX(hbox), body_elements.background.frame, TRUE, TRUE, 5);
button = gtk_button_new_with_label("Browse Image");
gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(body_img_function), NULL);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_box_pack_start(GTK_BOX(hbox_1), button, FALSE, FALSE, 50);
gtk_widget_show(button);
/* GENERATOR TAG */
body_elements.insert_generator =
gtk_check_button_new_with_label
("Insert ");
gtk_box_pack_start(GTK_BOX(hbox),
GTK_WIDGET(body_elements.insert_generator), FALSE, FALSE, 0);
gtk_widget_show(body_elements.insert_generator);
/*DOCUMENT TYPE TAG */
body_elements.content_type =
gtk_check_button_new_with_label
("Insert ");
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(body_elements.content_type), FALSE, FALSE, 0);
gtk_widget_show(body_elements.content_type);
button = gtk_button_new_with_label("Make it so!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(ok_body_dialog), body_elements.dialog);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(body_elements.dialog)->
action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
button = gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(close_body_dialog), body_elements.dialog);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(body_elements.dialog)->
action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_show(hbox);
gtk_widget_show(body_elements.dialog);
gtk_grab_add(body_elements.dialog);
}
void href_dialog()
{
GList *list;
GtkWidget *dialog;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *button;
GtkTextIter start, end;
GtkTextBuffer *buffer = NULL;
if (rendered())
return;
list = NULL;
list = g_list_append(list, "none");
list = g_list_append(list, "http://");
list = g_list_append(list, "ftp://");
list = g_list_append(list, "mailto:");
dialog = gtk_dialog_new();
gtk_signal_connect_object(GTK_OBJECT(dialog), "destroy",
(GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT(dialog));
gtk_window_set_title(GTK_WINDOW(dialog), "Insert Hyperlink");
vbox = gtk_vbox_new(TRUE, TRUE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, 0);
hbox = gtk_hbox_new(TRUE, TRUE);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
combo_in_frame("Protocol", &hyperlink.protocol, list);
gtk_box_pack_start(GTK_BOX(hbox), hyperlink.protocol.frame, TRUE, TRUE, 0);
entry_in_frame("Link Destination", &hyperlink.link);
gtk_box_pack_start(GTK_BOX(hbox), hyperlink.link.frame, TRUE, TRUE, 0);
entry_in_frame("Link Name", &hyperlink.name);
gtk_box_pack_start(GTK_BOX(vbox), hyperlink.name.frame, TRUE, TRUE, 0);
buffer = get_text_buffer();
gtk_text_buffer_get_start_iter(buffer, &start);
gtk_text_buffer_get_start_iter(buffer, &end);
if (gtk_text_buffer_get_selection_bounds(buffer, &start, &end))
gtk_entry_set_text(GTK_ENTRY(hyperlink.name.entry),
gtk_text_buffer_get_text(buffer, &start, &end, FALSE));
button = gtk_button_new_with_label("Make it so!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(href_function_ok), dialog);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
button = gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(close_body_dialog), dialog);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_grab_add(dialog);
gtk_widget_show(dialog);
}
void close_font_dialog(GtkWidget * widget, gpointer data)
{
GtkTextBuffer *buffer = NULL;
GtkTextMark *mark = NULL;
GtkTextIter iter;
buffer = get_text_buffer();
mark = gtk_text_buffer_get_mark(buffer, "font_dialog");
if (mark)
gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
if (data) {
gtk_text_buffer_insert(buffer, &iter, (gchar *) data, -1);
gtk_text_iter_set_offset(&iter,
gtk_text_iter_get_offset(&iter) - strlen((gchar *) data));
gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter);
gtk_text_iter_set_offset(&iter,
gtk_text_iter_get_offset(&iter) + strlen((gchar *) data));
gtk_text_buffer_move_mark_by_name(buffer, "selection_bound", &iter);
}
gtk_grab_remove(GTK_WIDGET(font_options.dialog));
gtk_widget_destroy(GTK_WIDGET(font_options.dialog));
focus_text_view();
}
void font_dialog()
{
GtkWidget *hbox;
GtkWidget *vbox;
GtkAdjustment *adj;
GtkWidget *button;
GtkWidget *frame;
gchar *selected = NULL;
GtkTextIter start, end;
GtkTextBuffer *buffer = NULL;
if (rendered())
return;
buffer = get_text_buffer();
gtk_text_buffer_get_start_iter(buffer, &start);
gtk_text_buffer_get_end_iter(buffer, &end);
if (gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) {
selected = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
gtk_text_buffer_create_mark(buffer, "font_dialog", &start, FALSE);
_DEBUG_ fprintf(stderr, "%s:selected:%s\n", PACKAGE, selected);
clean_selected();
}
font_options.dialog = gtk_dialog_new();
gtk_signal_connect(GTK_OBJECT(font_options.dialog), "destroy",
GTK_SIGNAL_FUNC(close_body_dialog), font_options.dialog);
gtk_window_set_title(GTK_WINDOW(font_options.dialog), "Font Options");
gtk_window_position(GTK_WINDOW(font_options.dialog), GTK_WIN_POS_CENTER);
gtk_container_border_width(GTK_CONTAINER(font_options.dialog), 5);
hbox = gtk_vbox_new(TRUE, TRUE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(font_options.dialog)->vbox), hbox, TRUE, TRUE, 0);
/* FONT FACE */
entry_in_frame("Font Face", &font_options.face);
gtk_box_pack_start(GTK_BOX(hbox), font_options.face.frame, TRUE, TRUE, 0);
/* FONT COLOR */
entry_in_frame("Font Color", &font_options.color);
gtk_box_pack_start(GTK_BOX(hbox), font_options.color.frame, TRUE, TRUE, 0);
/* FONT SIZE */
frame = gtk_frame_new("Font Size");
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
vbox = gtk_hbox_new(TRUE, TRUE);
gtk_container_add(GTK_CONTAINER(frame), vbox);
adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 7.0, 1.0, 0.0, 0.0);
font_options.size = gtk_spin_button_new(adj, 0, 0);
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(font_options.size), TRUE);
//gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (font_options.size),
// GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start(GTK_BOX(vbox), font_options.size, TRUE, TRUE, 0);
gtk_widget_show(vbox);
gtk_widget_show(frame);
gtk_widget_show(font_options.size);
gtk_widget_show(hbox);
button = gtk_button_new_with_label("Make it so!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(font_function_ok), selected);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(font_options.dialog)->
action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_grab_default(button);
button = gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(close_font_dialog), selected);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(font_options.dialog)->
action_area), button, FALSE, FALSE, 0);
gtk_widget_show(button);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_widget_show(font_options.dialog);
gtk_grab_add(font_options.dialog);
}
void help_about_menu(GtkWidget * widget)
{
GtkWidget *label;
GtkWidget *button;
GtkWidget *about;
GtkWidget *hbox;
GtkWidget *vbox;
char version[256];
char endian[64];
about = gtk_dialog_new();
gtk_signal_connect(GTK_OBJECT(about), "destroy", GTK_SIGNAL_FUNC(ungrab_message), NULL);
gtk_window_set_title(GTK_WINDOW(about), "About erwin");
gtk_container_border_width(GTK_CONTAINER(about), 0);
button = gtk_button_new_with_label("Make it so!");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(close_message_dialog), about);
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->action_area), button, FALSE, FALSE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show(hbox);
label =
gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data((const char **) logo_new1_xpm));
gtk_misc_set_padding(GTK_MISC(label), 10, 10);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
vbox = gtk_vbox_new(TRUE, 5);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2);
gtk_widget_show(vbox);
label =
gtk_label_new(PACKAGE " Release " VERSION
" - really simple html editor\n" "The \"" RELEASE_NAME "\" - Release\n"
PACKAGE
" comes with ABSOLUTELY NO WARRANTY\nfor details read the license.");
gtk_misc_set_padding(GTK_MISC(label), 2, 2);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
label =
gtk_label_new("Copyright (C) 1999 David Vogler\n"
"Copyright (C) 1999-2005 Adrian Reber");
gtk_misc_set_padding(GTK_MISC(label), 1, 1);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
label =
gtk_label_new("Homepage: http://lisas.de/erwin/\n"
"Comments and patches to adrian@lisas.de");
gtk_misc_set_padding(GTK_MISC(label), 2, 2);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
label =
gtk_label_new("The name " PACKAGE
" means absolutely nothing.\nNot even a recursive acronym.\n");
gtk_misc_set_padding(GTK_MISC(label), 1, 1);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
vbox = gtk_vbox_new(TRUE, 5);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), vbox, TRUE, TRUE, 2);
gtk_widget_show(vbox);
#ifdef WORDS_BIGENDIAN
strcpy(endian, "on a big endian machine");
#else
strcpy(endian, "on a little endian machine");
#endif /* WORDS_BIGENDIAN */
snprintf(version, 254,
"This is %s-%s compiled with GTK-%d.%d.%d and LIBXML-%s\n%s", PACKAGE,
VERSION, GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION,
LIBXML_DOTTED_VERSION, endian);
label = gtk_label_new(version);
gtk_misc_set_padding(GTK_MISC(label), 1, 1);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
gtk_widget_show(about);
gtk_grab_add(about);
}