summaryrefslogtreecommitdiffstats
path: root/plug-ins/imagemap/imap_preferences.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plug-ins/imagemap/imap_preferences.c527
1 files changed, 527 insertions, 0 deletions
diff --git a/plug-ins/imagemap/imap_preferences.c b/plug-ins/imagemap/imap_preferences.c
new file mode 100644
index 0000000..218aa46
--- /dev/null
+++ b/plug-ins/imagemap/imap_preferences.c
@@ -0,0 +1,527 @@
+/*
+ * This is a plug-in for GIMP.
+ *
+ * Generates clickable image maps.
+ *
+ * Copyright (C) 1998-2005 Maurits Rijk m.rijk@chello.nl
+ *
+ * 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 3 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, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib/gstdio.h>
+
+#include "libgimp/gimp.h"
+#include "libgimp/gimpui.h"
+
+#include "imap_command.h"
+#include "imap_file.h"
+#include "imap_main.h"
+#include "imap_menu.h"
+#include "imap_misc.h"
+#include "imap_mru.h"
+#include "imap_preferences.h"
+#include "imap_table.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+typedef struct {
+ DefaultDialog_t *dialog;
+ GtkWidget *notebook;
+ GtkWidget *ncsa;
+ GtkWidget *cern;
+ GtkWidget *csim;
+ GtkWidget *prompt_for_area_info;
+ GtkWidget *require_default_url;
+ GtkWidget *show_area_handle;
+ GtkWidget *keep_circles_round;
+ GtkWidget *show_url_tip;
+ GtkWidget *use_doublesized;
+
+ GtkWidget *undo_levels;
+ GtkWidget *mru_size;
+
+ GtkWidget *normal_fg;
+ GtkWidget *normal_bg;
+ GtkWidget *selected_fg;
+ GtkWidget *selected_bg;
+ GtkWidget *interactive_fg;
+ GtkWidget *interactive_bg;
+
+ GtkWidget *threshold;
+ GtkWidget *auto_convert;
+
+ PreferencesData_t *old_data;
+} PreferencesDialog_t;
+
+static void get_button_colors (PreferencesDialog_t *dialog,
+ ColorSelData_t *colors);
+
+static gint
+parse_map_type(void)
+{
+ char *token = strtok(NULL, " )");
+ if (!strcmp(token, "ncsa"))
+ return NCSA;
+ else if (!strcmp(token, "cern"))
+ return CERN;
+ return CSIM;
+}
+
+static gint
+parse_yes_no(void)
+{
+ char *token = strtok(NULL, " )");
+ return (gint) strcmp(token, "no");
+}
+
+static gint
+parse_int(void)
+{
+ char *token = strtok(NULL, " )");
+ return (gint) atoi(token);
+}
+
+static void
+parse_color(GdkColor *gdk_color)
+{
+ gdk_color->red = (guint16) parse_int();
+ gdk_color->green = (guint16) parse_int();
+ gdk_color->blue = (guint16) parse_int();
+}
+
+static void
+parse_mru_entry(void)
+{
+ char *filename = strtok(NULL, " )");
+ mru_add(get_mru(), filename);
+}
+
+static void
+parse_line(PreferencesData_t *data, char *line)
+{
+ char *token;
+ ColorSelData_t *colors = &data->colors;
+
+ line++; /* Skip '(' */
+ token = strtok(line, " ");
+
+ if (!strcmp(token, "default-map-type")) {
+ data->default_map_type = parse_map_type();
+ }else if (!strcmp(token, "prompt-for-area-info")) {
+ data->prompt_for_area_info = parse_yes_no();
+ } else if (!strcmp(token, "require-default-url")) {
+ data->require_default_url = parse_yes_no();
+ } else if (!strcmp(token, "show-area-handle")) {
+ data->show_area_handle = parse_yes_no();
+ } else if (!strcmp(token, "keep-circles-round")) {
+ data->keep_circles_round = parse_yes_no();
+ } else if (!strcmp(token, "show-url-tip")) {
+ data->show_url_tip = parse_yes_no();
+ } else if (!strcmp(token, "use-doublesized")) {
+ data->use_doublesized = parse_yes_no();
+ } else if (!strcmp(token, "mru-size")) {
+ data->mru_size = parse_int();
+ if (data->mru_size < 1)
+ data->mru_size = 1;
+ } else if (!strcmp(token, "undo-levels")) {
+ data->undo_levels = parse_int();
+ if (data->undo_levels < 1)
+ data->undo_levels = 1;
+ } else if (!strcmp(token, "normal-fg-color")) {
+ parse_color(&colors->normal_fg);
+ } else if (!strcmp(token, "normal-bg-color")) {
+ parse_color(&colors->normal_bg);
+ } else if (!strcmp(token, "selected-fg-color")) {
+ parse_color(&colors->selected_fg);
+ } else if (!strcmp(token, "selected-bg-color")) {
+ parse_color(&colors->selected_bg);
+ } else if (!strcmp(token, "interactive-fg-color")) {
+ parse_color(&colors->interactive_fg);
+ } else if (!strcmp(token, "interactive-bg-color")) {
+ parse_color(&colors->interactive_bg);
+ } else if (!strcmp(token, "mru-entry")) {
+ parse_mru_entry();
+ } else {
+ /* Unrecognized, just ignore rest of line */
+ }
+}
+
+gboolean
+preferences_load(PreferencesData_t *data)
+{
+ FILE *in;
+ char buf[256];
+ gchar *filename;
+
+ filename = gimp_personal_rc_file ("imagemaprc");
+
+ in = g_fopen(filename, "rb");
+ g_free(filename);
+ if (in) {
+ while (fgets(buf, sizeof(buf), in)) {
+ if (*buf != '\n' && *buf != '#') {
+ parse_line(data, buf);
+ }
+ }
+ fclose(in);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void
+preferences_save(PreferencesData_t *data)
+{
+ FILE *out;
+ gchar *filename;
+ ColorSelData_t *colors = &data->colors;
+
+ filename = gimp_personal_rc_file ("imagemaprc");
+
+ out = g_fopen(filename, "wb");
+ if (out) {
+ fprintf(out, "# Image map plug-in resource file\n\n");
+ if (data->default_map_type == NCSA)
+ fprintf(out, "(default-map-type ncsa)\n");
+ else if (data->default_map_type == CERN)
+ fprintf(out, "(default-map-type cern)\n");
+ else
+ fprintf(out, "(default-map-type csim)\n");
+
+ fprintf(out, "(prompt-for-area-info %s)\n",
+ (data->prompt_for_area_info) ? "yes" : "no");
+ fprintf(out, "(require-default-url %s)\n",
+ (data->require_default_url) ? "yes" : "no");
+ fprintf(out, "(show-area-handle %s)\n",
+ (data->show_area_handle) ? "yes" : "no");
+ fprintf(out, "(keep-circles-round %s)\n",
+ (data->keep_circles_round) ? "yes" : "no");
+ fprintf(out, "(show-url-tip %s)\n",
+ (data->show_url_tip) ? "yes" : "no");
+ fprintf(out, "(use-doublesized %s)\n",
+ (data->use_doublesized) ? "yes" : "no");
+
+ fprintf(out, "(undo-levels %d)\n", data->undo_levels);
+ fprintf(out, "(mru-size %d)\n", data->mru_size);
+
+ fprintf(out, "(normal-fg-color %d %d %d)\n",
+ colors->normal_fg.red, colors->normal_fg.green,
+ colors->normal_fg.blue);
+ fprintf(out, "(normal-bg-color %d %d %d)\n",
+ colors->normal_bg.red, colors->normal_bg.green,
+ colors->normal_bg.blue);
+ fprintf(out, "(selected-fg-color %d %d %d)\n",
+ colors->selected_fg.red, colors->selected_fg.green,
+ colors->selected_fg.blue);
+ fprintf(out, "(selected-bg-color %d %d %d)\n",
+ colors->selected_bg.red, colors->selected_bg.green,
+ colors->selected_bg.blue);
+ fprintf(out, "(interactive-fg-color %d %d %d)\n",
+ colors->interactive_fg.red, colors->interactive_fg.green,
+ colors->interactive_fg.blue);
+ fprintf(out, "(interactive-bg-color %d %d %d)\n",
+ colors->interactive_bg.red, colors->interactive_bg.green,
+ colors->interactive_bg.blue);
+
+ mru_write(get_mru(), out);
+
+ fclose(out);
+ } else {
+ do_file_error_dialog( _("Couldn't save resource file:"), filename);
+ }
+ g_free(filename);
+}
+
+static void
+preferences_ok_cb(gpointer data)
+{
+ PreferencesDialog_t *param = (PreferencesDialog_t*) data;
+ PreferencesData_t *old_data = param->old_data;
+ ColorSelData_t *colors = &old_data->colors;
+ MRU_t *mru = get_mru();
+
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->cern)))
+ old_data->default_map_type = CERN;
+ else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->ncsa)))
+ old_data->default_map_type = NCSA;
+ else
+ old_data->default_map_type = CSIM;
+
+ old_data->prompt_for_area_info = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->prompt_for_area_info));
+ old_data->require_default_url = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->require_default_url));
+ old_data->show_area_handle = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->show_area_handle));
+ old_data->keep_circles_round = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->keep_circles_round));
+ old_data->show_url_tip = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->show_url_tip));
+ old_data->use_doublesized = gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(param->use_doublesized));
+
+ old_data->mru_size =
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->mru_size));
+ old_data->undo_levels =
+ gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->undo_levels));
+ mru_set_size(mru, old_data->mru_size);
+ menu_build_mru_items(mru);
+ command_list_set_undo_level(old_data->undo_levels);
+
+ get_button_colors (param, colors);
+
+ set_sash_size(old_data->use_doublesized);
+ preview_redraw();
+}
+
+static void
+get_button_color (GtkWidget *button, GdkColor *color)
+{
+ GimpRGB rgb;
+ gimp_color_button_get_color (GIMP_COLOR_BUTTON (button), &rgb);
+ color->red = rgb.r * 0xffff;
+ color->green = rgb.g * 0xffff;
+ color->blue = rgb.b * 0xffff;
+}
+
+static void
+get_button_colors(PreferencesDialog_t *dialog, ColorSelData_t *colors)
+{
+ get_button_color (dialog->normal_fg, &colors->normal_fg);
+ get_button_color (dialog->normal_bg, &colors->normal_bg);
+ get_button_color (dialog->selected_fg, &colors->selected_fg);
+ get_button_color (dialog->selected_bg, &colors->selected_bg);
+ get_button_color (dialog->interactive_fg, &colors->interactive_fg);
+ get_button_color (dialog->interactive_bg, &colors->interactive_bg);
+}
+
+static void
+set_button_color (GtkWidget *button, GdkColor *color)
+{
+ GimpRGB rgb;
+ gimp_rgb_set (&rgb, color->red, color->green, color->blue);
+ gimp_rgb_multiply (&rgb, 1.0 / 0xffff);
+ gimp_color_button_set_color (GIMP_COLOR_BUTTON (button), &rgb);
+}
+
+static void
+set_button_colors(PreferencesDialog_t *dialog, ColorSelData_t *colors)
+{
+ set_button_color (dialog->normal_fg, &colors->normal_fg);
+ set_button_color (dialog->normal_bg, &colors->normal_bg);
+ set_button_color (dialog->selected_fg, &colors->selected_fg);
+ set_button_color (dialog->selected_bg, &colors->selected_bg);
+ set_button_color (dialog->interactive_fg, &colors->interactive_fg);
+ set_button_color (dialog->interactive_bg, &colors->interactive_bg);
+}
+
+static GtkWidget*
+create_tab(GtkWidget *notebook, const gchar *label, gint rows, gint cols)
+{
+ GtkWidget *table;
+ GtkWidget *vbox;
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
+ gtk_widget_show(vbox);
+
+ table = gtk_table_new(rows, cols, FALSE);
+ gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(table), 12);
+ gtk_table_set_row_spacings(GTK_TABLE(table), 6);
+ gtk_table_set_col_spacings(GTK_TABLE(table), 6);
+ gtk_widget_show(table);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox,
+ gtk_label_new_with_mnemonic(label));
+
+ return table;
+}
+
+static void
+create_general_tab(PreferencesDialog_t *data, GtkWidget *notebook)
+{
+ GtkWidget *table = create_tab(notebook, _("General"), 7, 2);
+ GtkWidget *frame;
+ GtkWidget *hbox;
+
+ frame = gimp_frame_new( _("Default Map Type"));
+ gtk_widget_show(frame);
+ gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 2, 0, 1);
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+ gtk_widget_show(hbox);
+ data->ncsa = gtk_radio_button_new_with_mnemonic_from_widget(NULL, "_NCSA");
+ gtk_box_pack_start(GTK_BOX(hbox), data->ncsa, TRUE, TRUE, 10);
+ gtk_widget_show(data->ncsa);
+ data->cern = gtk_radio_button_new_with_mnemonic_from_widget(
+ GTK_RADIO_BUTTON(data->ncsa), "C_ERN");
+ gtk_box_pack_start(GTK_BOX(hbox), data->cern, TRUE, TRUE, 10);
+ gtk_widget_show(data->cern);
+ data->csim = gtk_radio_button_new_with_mnemonic_from_widget(
+ GTK_RADIO_BUTTON(data->cern), "C_SIM");
+ gtk_box_pack_start(GTK_BOX(hbox), data->csim, TRUE, TRUE, 10);
+ gtk_widget_show(data->csim);
+
+ data->prompt_for_area_info =
+ create_check_button_in_table(table, 1, 0, _("_Prompt for area info"));
+ data->require_default_url =
+ create_check_button_in_table(table, 2, 0, _("_Require default URL"));
+ data->show_area_handle =
+ create_check_button_in_table(table, 3, 0, _("Show area _handles"));
+ data->keep_circles_round =
+ create_check_button_in_table(table, 4, 0, _("_Keep NCSA circles true"));
+ data->show_url_tip =
+ create_check_button_in_table(table, 5, 0, _("Show area URL _tip"));
+ data->use_doublesized =
+ create_check_button_in_table(table, 6, 0,
+ _("_Use double-sized grab handles"));
+ gtk_widget_show(frame);
+}
+
+static void
+create_menu_tab(PreferencesDialog_t *data, GtkWidget *notebook)
+{
+ GtkWidget *table = create_tab(notebook, _("Menu"), 2, 2);
+ GtkWidget *label;
+
+ label = create_label_in_table(table, 0, 0,
+ _("Number of _undo levels (1 - 99):"));
+ data->undo_levels = create_spin_button_in_table(table, label, 0, 1, 1, 1,
+ 99);
+
+ label = create_label_in_table(table, 1, 0,
+ _("Number of M_RU entries (1 - 16):"));
+ data->mru_size = create_spin_button_in_table(table, label, 1, 1, 1, 1, 16);
+}
+
+static GtkWidget*
+create_color_field(PreferencesDialog_t *data, GtkWidget *table, gint row,
+ gint col)
+{
+ GimpRGB color = {0.0, 0.0, 0.0, 1.0};
+ GtkWidget *area = gimp_color_button_new (_("Select Color"), 16, 8, &color,
+ GIMP_COLOR_AREA_FLAT);
+ gimp_color_button_set_update (GIMP_COLOR_BUTTON (area), TRUE);
+ gtk_table_attach_defaults (GTK_TABLE (table), area, col, col + 1, row,
+ row + 1);
+ gtk_widget_show (area);
+
+ return area;
+}
+
+static void
+create_colors_tab(PreferencesDialog_t *data, GtkWidget *notebook)
+{
+ GtkWidget *table = create_tab(notebook, _("Colors"), 3, 3);
+
+ create_label_in_table(table, 0, 0, _("Normal:"));
+ data->normal_fg = create_color_field(data, table, 0, 1);
+ data->normal_bg = create_color_field(data, table, 0, 2);
+
+ create_label_in_table(table, 1, 0, _("Selected:"));
+ data->selected_fg = create_color_field(data, table, 1, 1);
+ data->selected_bg = create_color_field(data, table, 1, 2);
+
+ create_label_in_table(table, 2, 0, _("Interaction:"));
+ data->interactive_fg = create_color_field(data, table, 2, 1);
+ data->interactive_bg = create_color_field(data, table, 2, 2);
+}
+
+#ifdef _NOT_READY_YET_
+static void
+create_contiguous_regions_tab(PreferencesDialog_t *data, GtkWidget *notebook)
+{
+ GtkWidget *table = create_tab(notebook, _("Co_ntiguous Region"), 2, 2);
+ GtkWidget *label;
+
+ label = create_label_in_table(table, 0, 0,
+ _("_Threshold:"));
+ data->auto_convert =
+ create_check_button_in_table(table, 1, 0, _("_Automatically convert"));
+}
+#endif
+
+static PreferencesDialog_t*
+create_preferences_dialog(void)
+{
+ PreferencesDialog_t *data = g_new(PreferencesDialog_t, 1);
+ DefaultDialog_t *dialog;
+ GtkWidget *notebook;
+
+ data->dialog = dialog = make_default_dialog( _("General Preferences"));
+ default_dialog_set_ok_cb(dialog, preferences_ok_cb, (gpointer) data);
+
+ data->notebook = notebook = gtk_notebook_new();
+ gtk_box_pack_start (GTK_BOX (data->dialog->vbox), notebook, TRUE, TRUE, 0);
+ create_general_tab(data, notebook);
+ create_menu_tab(data, notebook);
+ create_colors_tab(data, notebook);
+#ifdef _NOT_READY_YET_
+ create_contiguous_regions_tab(data, notebook);
+#endif
+ gtk_widget_show(notebook);
+
+ return data;
+}
+
+void
+do_preferences_dialog(void)
+{
+ static PreferencesDialog_t *dialog;
+ PreferencesData_t *old_data;
+ GtkWidget *map_type;
+
+ if (!dialog) {
+ dialog = create_preferences_dialog();
+ }
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(dialog->notebook), 0);
+ dialog->old_data = old_data = get_preferences();
+
+ if (old_data->default_map_type == CERN)
+ map_type = dialog->cern;
+ else if (old_data->default_map_type == NCSA)
+ map_type = dialog->ncsa;
+ else
+ map_type = dialog->csim;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(map_type), TRUE);
+
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(dialog->prompt_for_area_info),
+ old_data->prompt_for_area_info);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->require_default_url),
+ old_data->require_default_url);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_area_handle),
+ old_data->show_area_handle);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->keep_circles_round),
+ old_data->keep_circles_round);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->show_url_tip),
+ old_data->show_url_tip);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->use_doublesized),
+ old_data->use_doublesized);
+
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->undo_levels),
+ old_data->undo_levels);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(dialog->mru_size),
+ old_data->mru_size);
+
+ set_button_colors(dialog, &old_data->colors);
+
+ default_dialog_show(dialog->dialog);
+}