diff --git a/ChangeLog b/ChangeLog index 6ffbce4878..5ffa1e429f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sun Oct 24 22:53:17 MEST 1999 Sven Neumann + + * plug-ins/imagemap/* updated imagemap to version 1.3 + Sun Oct 24 16:49:13 CEST 1999 Marc Lehmann * tools/pdbgen/pdb/drawable.pdb, all calls: fixed some improperly diff --git a/plug-ins/imagemap/ChangeLog b/plug-ins/imagemap/ChangeLog index 314a429e93..0d62a1174a 100644 --- a/plug-ins/imagemap/ChangeLog +++ b/plug-ins/imagemap/ChangeLog @@ -1,20 +1,55 @@ -Sat Aug 28 16:32:03 1999 Maurits Rijk +Thu Oct 21 19:58:39 1999 Maurits Rijk + + * release version 1.3 + +Sat Oct 9 11:39:14 1999 Maurits Rijk + + * imap_main.c (dialog): removed some obsolete funcs. + +Sun Oct 3 20:25:32 1999 Maurits Rijk + + * imap_grid.c: prepare for i8n + + * imap_polygon.c (polygon_free_list): added + (polygon_assign): free list before adding new points + +Sun Sep 26 13:44:15 1999 Maurits Rijk + + * imap_cmd_select_prev.c: created + + * imap_cmd_select_prev.h: created + + * imap_cmd_select_next.c: created + + * imap_cmd_select_next.h: created + + * imap_cmd_object_move.c: created + + * imap_cmd_object_move.h: created + +Wed Sep 8 19:07:19 1999 Maurits Rijk + + * imap_taglist.h: created + + * imap_taglist.c: created + +Sat Aug 28 16:32:03 1999 Maurits Rijk * release version 1.2 -Sun Aug 15 16:54:43 1999 Maurits Rijk +Sun Aug 15 16:54:43 1999 Maurits Rijk * imap_cmd_select_region.h: created * imap_cmd_move_sash.c: created -Mon Aug 9 22:33:12 1999 Maurits Rijk +Mon Aug 9 22:33:12 1999 Maurits Rijk * imap_cmd_cut_object.c: created * imap_cmd_cut_object.h: created -Sun Aug 8 12:54:44 1999 Maurits Rijk +Sun Aug 8 12:54:44 1999 Maurits Rijk * imap_cmd_cut.c: created @@ -26,26 +61,26 @@ Sun Aug 8 12:54:44 1999 Maurits Rijk * imap_object_popup.h: created -Sat Jul 31 12:34:00 1999 Maurits Rijk +Sat Jul 31 12:34:00 1999 Maurits Rijk * imap_toolbar.c: Added redo and undo button to toolbar. -Wed Jul 28 22:17:09 1999 Maurits Rijk +Wed Jul 28 22:17:09 1999 Maurits Rijk * imap_object.c (object_on_button_press): fixed 'round to grid' bug for polygons. -Tue Jul 27 23:19:00 1999 Maurits Rijk +Tue Jul 27 23:19:00 1999 Maurits Rijk * imap_edit_area_info.c: use BrowseWidget_t for URL. -Mon Jul 26 22:00:58 1999 Maurits Rijk +Mon Jul 26 22:00:58 1999 Maurits Rijk * imap_browse.c: created * imap_object.c (object_list_move_selected_up): fixed move up/down bug. -Mon Jun 28 18:05:24 1999 Maurits Rijk +Mon Jun 28 18:05:24 1999 Maurits Rijk * imap_main.c (dialog): fixed annoying bug diff --git a/plug-ins/imagemap/Makefile.am b/plug-ins/imagemap/Makefile.am index d95acc6d87..e295c8e0f2 100644 --- a/plug-ins/imagemap/Makefile.am +++ b/plug-ins/imagemap/Makefile.am @@ -73,12 +73,16 @@ imagemap_SOURCES = \ imap_cmd_move_down.h \ imap_cmd_move_sash.c \ imap_cmd_move_sash.h \ + imap_cmd_move_selected.c \ + imap_cmd_move_selected.h \ imap_cmd_move_to_front.c \ imap_cmd_move_to_front.h \ imap_cmd_move_up.c \ imap_cmd_move_up.h \ imap_cmd_object_down.c \ imap_cmd_object_down.h \ + imap_cmd_object_move.c \ + imap_cmd_object_move.h \ imap_cmd_object_up.c \ imap_cmd_object_up.h \ imap_cmd_paste.c \ @@ -87,6 +91,10 @@ imagemap_SOURCES = \ imap_cmd_select.h \ imap_cmd_select_all.c \ imap_cmd_select_all.h \ + imap_cmd_select_next.c \ + imap_cmd_select_next.h \ + imap_cmd_select_prev.c \ + imap_cmd_select_prev.h \ imap_cmd_select_region.c \ imap_cmd_select_region.h \ imap_cmd_send_to_back.c \ @@ -147,6 +155,8 @@ imagemap_SOURCES = \ imap_string.h \ imap_table.c \ imap_table.h \ + imap_taglist.c \ + imap_taglist.h \ imap_toolbar.c \ imap_toolbar.h \ imap_tools.c \ diff --git a/plug-ins/imagemap/NEWS b/plug-ins/imagemap/NEWS index ea13b61b33..0288220504 100644 --- a/plug-ins/imagemap/NEWS +++ b/plug-ins/imagemap/NEWS @@ -1,3 +1,17 @@ +What's new in GIMP Imagemap plug-in 1.3 + +* 'Follow' mode to dynamically update object dimensions. +* Added 'Most recently used' and 'Number of Undo levels' to Preferences menu. +* Movement of objects with cursor keys (left/right/up/down). Select next/prev + object with TAB key. +* Double-click in selection brings up Area dialog. +* Drop links (e.g. from Netscape) into the selection list updates the URL. +* Drop links (e.g. from Netscape) onto an object in the preview window updates + the URL. +* A few bug fixes. +* Lot's of internationalization preparations. +* Grid can be dynamically updated when changing grid parameters. + What's new in GIMP Imagemap plug-in 1.2 * Implemented Undo/Redo diff --git a/plug-ins/imagemap/README b/plug-ins/imagemap/README index 96a1721a0a..4ea720df20 100644 --- a/plug-ins/imagemap/README +++ b/plug-ins/imagemap/README @@ -1,4 +1,4 @@ -This is the GIMP Imagemap plug-in version 1.2. See the INSTALL file for +This is the GIMP Imagemap plug-in version 1.3. See the INSTALL file for build instructions. More information can be found on my homepage at diff --git a/plug-ins/imagemap/TODO b/plug-ins/imagemap/TODO index d3bf8a944d..2179ed31e0 100644 --- a/plug-ins/imagemap/TODO +++ b/plug-ins/imagemap/TODO @@ -1,14 +1,6 @@ -Version 1.3 - - * 'Follow' mode to dynamically update object dimensions. - * Configuration script - * Handle double-click in selection - * Movement/resizing of objects with cursor keys. - * implement dynamically adjustable grid. - * Snap to grid during resize. - Version 1.4 + * Snap to grid during resize. * 'Divider' object. * Move polygon sides. * Gimp style guides. @@ -16,6 +8,7 @@ Version 1.4 Version 1.5 * Standalone version + * Configuration script * Warning icon for area's without URL. * Add HTML 4.0 tags (TABINDEX, ACCESKEY) * User-definable tags @@ -46,5 +39,9 @@ Miscellaneous * Compare image-name in HTML file with loaded image and issue warning if different. * Restrict to screen size for large images. -* Internationalization -* Drag & drop within selection +* Don't redraw complete polygon while moving a sash. +* Compliancy with GIMP 1.1.x: + - Use GIMP's 1.1.x new help system + - Tear-off menu's + - Arrow button with similar action as pop-up in upper left of preview window + - Paner widget in lower right of preview window for fast navigation. \ No newline at end of file diff --git a/plug-ins/imagemap/imap_about.c b/plug-ins/imagemap/imap_about.c index 8d649943b9..15f4f55cc9 100644 --- a/plug-ins/imagemap/imap_about.c +++ b/plug-ins/imagemap/imap_about.c @@ -23,21 +23,22 @@ #include "imap_about.h" #include "imap_default_dialog.h" +#include "libgimp/stdplugins-intl.h" void do_about_dialog(void) { static DefaultDialog_t *dialog; if (!dialog) { - dialog = make_default_dialog("About"); + dialog = make_default_dialog(_("About")); default_dialog_hide_cancel_button(dialog); default_dialog_hide_apply_button(dialog); default_dialog_set_label( dialog, - "Imagemap plug-in 1.2\n\n" - "Copyright(c) 1999 by Maurits Rijk\n" - "lpeek.mrijk@consunet.nl \n\n" - " Released under the GNU General Public License "); + _("Imagemap plug-in 1.3\n\n" + "Copyright(c) 1999 by Maurits Rijk\n" + "lpeek.mrijk@consunet.nl \n\n" + " Released under the GNU General Public License ")); } default_dialog_show(dialog); } diff --git a/plug-ins/imagemap/imap_browse.c b/plug-ins/imagemap/imap_browse.c index 66a84e9929..45c108843f 100644 --- a/plug-ins/imagemap/imap_browse.c +++ b/plug-ins/imagemap/imap_browse.c @@ -22,7 +22,6 @@ */ #include "imap_browse.h" -#include "imap_main.h" #include "open.xpm" @@ -88,7 +87,6 @@ browse_widget_new(const gchar *name) GdkPixmap *icon; GdkBitmap *mask; GtkStyle *style; - GtkWidget *top = get_top_widget(); browse->file_selection = NULL; browse->name = name; @@ -107,10 +105,11 @@ browse_widget_new(const gchar *name) gtk_widget_show(browse->file); browse->button = button = gtk_button_new(); - style = gtk_widget_get_style(top); - icon = gdk_pixmap_create_from_xpm_d(top->window, &mask, - &style->bg[GTK_STATE_NORMAL], - open_xpm); + style = gtk_widget_get_style(button); + icon = gdk_pixmap_colormap_create_from_xpm_d( + button->window, gtk_widget_get_colormap(button), &mask, + &style->bg[GTK_STATE_NORMAL], open_xpm); + iconw = gtk_pixmap_new(icon, mask); gtk_widget_show(iconw); gtk_container_add(GTK_CONTAINER(button), iconw); diff --git a/plug-ins/imagemap/imap_cern_parse.c b/plug-ins/imagemap/imap_cern_parse.c index 251777460b..f800033c43 100644 --- a/plug-ins/imagemap/imap_cern_parse.c +++ b/plug-ins/imagemap/imap_cern_parse.c @@ -216,7 +216,7 @@ static const short yycheck[] = { 3, 0, 15, 12, 10, 0, 14, 12, 15 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/lib/bison.simple" +#line 3 "bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. @@ -409,7 +409,7 @@ __yy_memcpy (char *to, char *from, int count) #endif #endif -#line 196 "/usr/lib/bison.simple" +#line 196 "bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -794,7 +794,7 @@ case 22: break;} } /* the action file gets copied in in place of this dollarsign */ -#line 498 "/usr/lib/bison.simple" +#line 498 "bison.simple" yyvsp -= yylen; yyssp -= yylen; diff --git a/plug-ins/imagemap/imap_circle.c b/plug-ins/imagemap/imap_circle.c index 0f83e1a232..784f39e15d 100644 --- a/plug-ins/imagemap/imap_circle.c +++ b/plug-ins/imagemap/imap_circle.c @@ -24,6 +24,7 @@ #include #include "imap_circle.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_misc.h" #include "imap_object_popup.h" @@ -33,7 +34,7 @@ static gboolean circle_is_valid(Object_t *obj); static Object_t *circle_clone(Object_t *obj); -static Object_t *circle_assign(Object_t *obj, Object_t *des); +static void circle_assign(Object_t *obj, Object_t *des); static void circle_draw(Object_t* obj, GdkWindow *window, GdkGC* gc); static void circle_draw_sashes(Object_t* obj, GdkWindow *window, GdkGC* gc); static MoveSashFunc_t circle_near_sash(Object_t *obj, gint x, gint y); @@ -42,7 +43,7 @@ static void circle_get_dimensions(Object_t *obj, gint *x, gint *y, gint *width, gint *height); static void circle_resize(Object_t *obj, gint percentage_x, gint percentage_y); static void circle_move(Object_t *obj, gint dx, gint dy); -static gpointer circle_create_info_tab(GtkWidget *notebook); +static gpointer circle_create_info_widget(GtkWidget *frame); static void circle_fill_info_tab(Object_t *obj, gpointer data); static void circle_set_initial_focus(Object_t *obj, gpointer data); static void circle_update(Object_t* obj, gpointer data); @@ -55,6 +56,7 @@ static void circle_write_ncsa(Object_t* obj, gpointer param, static char** circle_get_icon_data(void); static ObjectClass_t circle_class = { + "Circle", NULL, /* info_dialog */ NULL, /* icon */ NULL, /* mask */ @@ -71,7 +73,8 @@ static ObjectClass_t circle_class = { circle_get_dimensions, circle_resize, circle_move, - circle_create_info_tab, + circle_create_info_widget, + circle_fill_info_tab, /* circle_update_info_widget */ circle_fill_info_tab, circle_set_initial_focus, circle_update, @@ -110,7 +113,7 @@ circle_clone(Object_t *obj) return &clone->obj; } -static Object_t* +static void circle_assign(Object_t *obj, Object_t *des) { Circle_t *src_circle = ObjectToCircle(obj); @@ -118,7 +121,6 @@ circle_assign(Object_t *obj, Object_t *des) des_circle->x = src_circle->x; des_circle->y = src_circle->y; des_circle->r = src_circle->r; - return object_copy(obj, des); } static void @@ -206,45 +208,73 @@ circle_move(Object_t *obj, gint dx, gint dy) } typedef struct { + Object_t *obj; GtkWidget *x; GtkWidget *y; GtkWidget *r; } CircleProperties_t; +static void +x_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((CircleProperties_t*) data)->obj; + gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToCircle(obj)->x = x; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +y_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((CircleProperties_t*) data)->obj; + gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToCircle(obj)->y = y; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +r_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((CircleProperties_t*) data)->obj; + gint r = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToCircle(obj)->r = r; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + static gpointer -circle_create_info_tab(GtkWidget *notebook) +circle_create_info_widget(GtkWidget *frame) { CircleProperties_t *props = g_new(CircleProperties_t, 1); - GtkWidget *vbox, *table, *label; + GtkWidget *table; gint max_width = get_image_width(); gint max_height = get_image_height(); - vbox = gtk_vbox_new(FALSE, 1); - gtk_widget_show(vbox); - table = gtk_table_new(3, 3, FALSE); - gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_set_border_width(GTK_CONTAINER(table), 10); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_widget_show(table); - create_label_in_table(table, 0, 0, "Center x:"); + create_label_in_table(table, 0, 0, _("Center x:")); props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1); - create_label_in_table(table, 0, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->x), "changed", + (GtkSignalFunc) x_changed_cb, (gpointer) props); + create_label_in_table(table, 0, 2, _("pixels")); - create_label_in_table(table, 1, 0, "Center y:"); + create_label_in_table(table, 1, 0, _("Center y:")); props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1); - create_label_in_table(table, 1, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->y), "changed", + (GtkSignalFunc) y_changed_cb, (gpointer) props); + create_label_in_table(table, 1, 2, _("pixels")); - create_label_in_table(table, 2, 0, "Radius:"); + create_label_in_table(table, 2, 0, _("Radius:")); props->r = create_spin_button_in_table(table, 2, 1, 1, 1, G_MAXINT); - create_label_in_table(table, 2, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->r), "changed", + (GtkSignalFunc) r_changed_cb, (gpointer) props); + create_label_in_table(table, 2, 2, _("pixels")); - label = gtk_label_new("Circle"); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); - return props; } @@ -254,6 +284,7 @@ circle_fill_info_tab(Object_t *obj, gpointer data) Circle_t *circle = ObjectToCircle(obj); CircleProperties_t *props = (CircleProperties_t*) data; + props->obj = obj; gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->x), circle->x); gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->y), circle->y); gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->r), circle->r); diff --git a/plug-ins/imagemap/imap_cmd_clear.c b/plug-ins/imagemap/imap_cmd_clear.c index c9a4deac33..fad23940da 100644 --- a/plug-ins/imagemap/imap_cmd_clear.c +++ b/plug-ins/imagemap/imap_cmd_clear.c @@ -23,9 +23,10 @@ #include "imap_cmd_clear.h" #include "imap_cmd_delete.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean clear_command_execute(Command_t *parent); +static CmdExecuteValue_t clear_command_execute(Command_t *parent); static void clear_command_undo(Command_t *parent); static void clear_command_redo(Command_t *parent); @@ -46,7 +47,7 @@ clear_command_new(ObjectList_t *list) { ClearCommand_t *command = g_new(ClearCommand_t, 1); command->list = list; - return command_init(&command->parent, "Clear", &clear_command_class); + return command_init(&command->parent, _("Clear"), &clear_command_class); } static void @@ -57,7 +58,7 @@ remove_one_object(Object_t *obj, gpointer data) delete_command_new(command->list, obj)); } -static gboolean +static CmdExecuteValue_t clear_command_execute(Command_t *parent) { ClearCommand_t *command = (ClearCommand_t*) parent; @@ -68,7 +69,7 @@ clear_command_execute(Command_t *parent) object_list_remove_remove_cb(command->list, id); redraw_preview(); /* Fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_copy.c b/plug-ins/imagemap/imap_cmd_copy.c index 201948a4ee..28cba18bb2 100644 --- a/plug-ins/imagemap/imap_cmd_copy.c +++ b/plug-ins/imagemap/imap_cmd_copy.c @@ -21,10 +21,10 @@ * */ -#include #include "imap_cmd_copy.h" +#include "libgimp/stdplugins-intl.h" -static gboolean copy_command_execute(Command_t *parent); +static CmdExecuteValue_t copy_command_execute(Command_t *parent); static void copy_command_undo(Command_t *parent); static CommandClass_t copy_command_class = { @@ -46,17 +46,17 @@ copy_command_new(ObjectList_t *list) CopyCommand_t *command = g_new(CopyCommand_t, 1); command->list = list; command->paste_buffer = NULL; - return command_init(&command->parent, "Copy", ©_command_class); + return command_init(&command->parent, _("Copy"), ©_command_class); } -static gboolean +static CmdExecuteValue_t copy_command_execute(Command_t *parent) { CopyCommand_t *command = (CopyCommand_t*) parent; command->paste_buffer = object_list_copy(command->paste_buffer, get_paste_buffer()); object_list_copy_to_paste_buffer(command->list); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_copy_object.c b/plug-ins/imagemap/imap_cmd_copy_object.c index 7c8a3bfabc..2d8fe566ec 100644 --- a/plug-ins/imagemap/imap_cmd_copy_object.c +++ b/plug-ins/imagemap/imap_cmd_copy_object.c @@ -22,9 +22,10 @@ */ #include "imap_cmd_copy_object.h" +#include "libgimp/stdplugins-intl.h" static void copy_object_command_destruct(Command_t *parent); -static gboolean copy_object_command_execute(Command_t *parent); +static CmdExecuteValue_t copy_object_command_execute(Command_t *parent); static void copy_object_command_undo(Command_t *parent); static CommandClass_t copy_object_command_class = { @@ -46,7 +47,8 @@ copy_object_command_new(Object_t *obj) CopyObjectCommand_t *command = g_new(CopyObjectCommand_t, 1); command->obj = object_ref(obj); command->paste_buffer = NULL; - return command_init(&command->parent, "Copy", ©_object_command_class); + return command_init(&command->parent, _("Copy"), + ©_object_command_class); } static void @@ -56,7 +58,7 @@ copy_object_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t copy_object_command_execute(Command_t *parent) { CopyObjectCommand_t *command = (CopyObjectCommand_t*) parent; @@ -67,7 +69,7 @@ copy_object_command_execute(Command_t *parent) clear_paste_buffer(); object_list_append(paste_buffer, object_clone(command->obj)); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_create.c b/plug-ins/imagemap/imap_cmd_create.c index b50eea6f81..eced0b2a41 100644 --- a/plug-ins/imagemap/imap_cmd_create.c +++ b/plug-ins/imagemap/imap_cmd_create.c @@ -22,9 +22,10 @@ */ #include "imap_cmd_create.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean create_command_execute(Command_t *parent); +static CmdExecuteValue_t create_command_execute(Command_t *parent); static void create_command_destruct(Command_t *parent); static void create_command_undo(Command_t *parent); @@ -48,7 +49,7 @@ create_command_new(ObjectList_t *list, Object_t *obj) CreateCommand_t *command = g_new(CreateCommand_t, 1); command->list = list; command->obj = object_ref(obj); - return command_init(&command->parent, "Create", &create_command_class); + return command_init(&command->parent, _("Create"), &create_command_class); } static void @@ -58,14 +59,14 @@ create_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t create_command_execute(Command_t *parent) { CreateCommand_t *command = (CreateCommand_t*) parent; command->changed = object_list_get_changed(command->list); object_list_append(command->list, object_ref(command->obj)); redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_cut.c b/plug-ins/imagemap/imap_cmd_cut.c index 8bd9e87e84..3807a13220 100644 --- a/plug-ins/imagemap/imap_cmd_cut.c +++ b/plug-ins/imagemap/imap_cmd_cut.c @@ -23,10 +23,11 @@ #include "imap_cmd_delete.h" #include "imap_cmd_cut.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void cut_command_destruct(Command_t *parent); -static gboolean cut_command_execute(Command_t *parent); +static CmdExecuteValue_t cut_command_execute(Command_t *parent); static void cut_command_undo(Command_t *parent); static void cut_command_redo(Command_t *parent); @@ -49,7 +50,7 @@ cut_command_new(ObjectList_t *list) CutCommand_t *command = g_new(CutCommand_t, 1); command->list = list; command->paste_buffer = NULL; - return command_init(&command->parent, "Cut", &cut_command_class); + return command_init(&command->parent, _("Cut"), &cut_command_class); } static void @@ -67,7 +68,7 @@ remove_one_object(Object_t *obj, gpointer data) delete_command_new(command->list, obj)); } -static gboolean +static CmdExecuteValue_t cut_command_execute(Command_t *parent) { CutCommand_t *command = (CutCommand_t*) parent; @@ -80,7 +81,7 @@ cut_command_execute(Command_t *parent) object_list_remove_remove_cb(command->list, id); redraw_preview(); /* Fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_cut_object.c b/plug-ins/imagemap/imap_cmd_cut_object.c index ae7a261c99..0b8b5a2c0d 100644 --- a/plug-ins/imagemap/imap_cmd_cut_object.c +++ b/plug-ins/imagemap/imap_cmd_cut_object.c @@ -24,9 +24,10 @@ #include "imap_cmd_copy_object.h" #include "imap_cmd_cut_object.h" #include "imap_cmd_delete.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean cut_object_command_execute(Command_t *parent); +static CmdExecuteValue_t cut_object_command_execute(Command_t *parent); static void cut_object_command_undo(Command_t *parent); static void cut_object_command_redo(Command_t *parent); @@ -47,19 +48,19 @@ cut_object_command_new(Object_t *obj) CutObjectCommand_t *command = g_new(CutObjectCommand_t, 1); Command_t *parent; - parent = command_init(&command->parent, "Cut", &cut_object_command_class); - + parent = command_init(&command->parent, _("Cut"), + &cut_object_command_class); command_add_subcommand(parent, copy_object_command_new(obj)); command_add_subcommand(parent, delete_command_new(obj->list, obj)); return parent; } -static gboolean +static CmdExecuteValue_t cut_object_command_execute(Command_t *parent) { redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_delete.c b/plug-ins/imagemap/imap_cmd_delete.c index 15eae0f5c1..2bb27149e7 100644 --- a/plug-ins/imagemap/imap_cmd_delete.c +++ b/plug-ins/imagemap/imap_cmd_delete.c @@ -22,11 +22,11 @@ */ #include "imap_cmd_delete.h" - +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void delete_command_destruct(Command_t *parent); -static gboolean delete_command_execute(Command_t *parent); +static CmdExecuteValue_t delete_command_execute(Command_t *parent); static void delete_command_undo(Command_t *parent); static CommandClass_t delete_command_class = { @@ -50,7 +50,7 @@ delete_command_new(ObjectList_t *list, Object_t *obj) DeleteCommand_t *command = g_new(DeleteCommand_t, 1); command->list = list; command->obj = object_ref(obj); - return command_init(&command->parent, "Delete", + return command_init(&command->parent, _("Delete"), &delete_command_class); } @@ -61,14 +61,14 @@ delete_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t delete_command_execute(Command_t *parent) { DeleteCommand_t *command = (DeleteCommand_t*) parent; command->changed = object_list_get_changed(command->list); command->position = object_get_position_in_list(command->obj); object_list_remove(command->list, command->obj); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_delete_point.c b/plug-ins/imagemap/imap_cmd_delete_point.c index 7dc4855c35..21282a9083 100644 --- a/plug-ins/imagemap/imap_cmd_delete_point.c +++ b/plug-ins/imagemap/imap_cmd_delete_point.c @@ -22,10 +22,11 @@ */ #include "imap_cmd_delete_point.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_polygon.h" -static gboolean delete_point_command_execute(Command_t *parent); +static CmdExecuteValue_t delete_point_command_execute(Command_t *parent); static void delete_point_command_undo(Command_t *parent); static CommandClass_t delete_point_command_class = { @@ -53,11 +54,11 @@ delete_point_command_new(Object_t *obj, GdkPoint *point) command->copy = *point; command->position = g_list_index(command->polygon->points, (gpointer) point); - return command_init(&command->parent, "Delete Point", + return command_init(&command->parent, _("Delete Point"), &delete_point_command_class); } -static gboolean +static CmdExecuteValue_t delete_point_command_execute(Command_t *parent) { DeletePointCommand_t *command = (DeletePointCommand_t*) parent; @@ -67,7 +68,7 @@ delete_point_command_execute(Command_t *parent) g_free(p->data); polygon->points = g_list_remove_link(polygon->points, p); redraw_preview(); /* Fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_edit_object.c b/plug-ins/imagemap/imap_cmd_edit_object.c index 29ec52de20..8eb30a6fba 100644 --- a/plug-ins/imagemap/imap_cmd_edit_object.c +++ b/plug-ins/imagemap/imap_cmd_edit_object.c @@ -22,7 +22,7 @@ */ #include "imap_cmd_edit_object.h" - +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void edit_object_command_destruct(Command_t *parent); @@ -47,7 +47,7 @@ edit_object_command_new(Object_t *obj) EditObjectCommand_t *command = g_new(EditObjectCommand_t, 1); command->obj = object_ref(obj); command->copy = object_clone(obj); - return command_init(&command->parent, "Edit Object", + return command_init(&command->parent, _("Edit Object"), &edit_object_command_class); } diff --git a/plug-ins/imagemap/imap_cmd_guides.c b/plug-ins/imagemap/imap_cmd_guides.c index ca7113d3ae..7913167a4e 100644 --- a/plug-ins/imagemap/imap_cmd_guides.c +++ b/plug-ins/imagemap/imap_cmd_guides.c @@ -26,6 +26,7 @@ #include "imap_cmd_create.h" #include "imap_default_dialog.h" #include "imap_cmd_guides.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_rectangle.h" #include "imap_table.h" @@ -66,7 +67,7 @@ guides_ok_cb(gpointer data) rows = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->no_down)); cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(param->no_across)); - subcommand_start("Create Guides"); + subcommand_start(_("Create Guides")); y = top; for (i = 0; i < rows; i++) { gint x = left; @@ -106,7 +107,7 @@ recalc_bounds(GtkWidget *widget, gpointer data) bound_w = (width + hspace) * cols - hspace; bound_h = (height + vspace) * rows - vspace; - sprintf(bounds, "Resulting Guide Bounds: %d,%d to %d,%d (%d areas)", + sprintf(bounds, _("Resulting Guide Bounds: %d,%d to %d,%d (%d areas)"), left, top, left + bound_w, top + bound_h, rows * cols); if (left + bound_w > get_image_width() || top + bound_h > get_image_height()) { @@ -130,10 +131,10 @@ make_guides_dialog() default_dialog_set_ok_cb(dialog, guides_ok_cb, data); label = gtk_label_new( - "Guides are pre-defined rectangles covering the image. You define\n" - "them by their width, height, and spacing from each other. This\n" - "allows you to rapidly create the most common image map type -\n" - "image collection of \"thumbnails\", suitable for navigation bars."); + _("Guides are pre-defined rectangles covering the image. You define\n" + "them by their width, height, and spacing from each other. This\n" + "allows you to rapidly create the most common image map type -\n" + "image collection of \"thumbnails\", suitable for navigation bars.")); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); gtk_container_set_border_width( GTK_CONTAINER(GTK_DIALOG(dialog->dialog)->vbox), 10); @@ -158,42 +159,42 @@ make_guides_dialog() gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog->dialog)->vbox), table); gtk_widget_show(table); - create_label_in_table(table, 0, 0, "Width"); + create_label_in_table(table, 0, 0, _("Width")); data->width = create_spin_button_in_table(table, 0, 1, 32, 1, 100); gtk_signal_connect(GTK_OBJECT(data->width), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 0, 2, "Left Start at"); + create_label_in_table(table, 0, 2, _("Left Start at")); data->left = create_spin_button_in_table(table, 0, 3, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->left), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 1, 0, "Height"); + create_label_in_table(table, 1, 0, _("Height")); data->height = create_spin_button_in_table(table, 1, 1, 32, 1, 100); gtk_signal_connect(GTK_OBJECT(data->height), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 1, 2, "Top Start at"); + create_label_in_table(table, 1, 2, _("Top Start at")); data->top = create_spin_button_in_table(table, 1, 3, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->top), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 2, 0, "Horz. Spacing"); + create_label_in_table(table, 2, 0, _("Horz. Spacing")); data->horz_spacing = create_spin_button_in_table(table, 2, 1, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->horz_spacing), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 2, 2, "No. Across"); + create_label_in_table(table, 2, 2, _("No. Across")); data->no_across = create_spin_button_in_table(table, 2, 3, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->no_across), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 3, 0, "Vert. Spacing"); + create_label_in_table(table, 3, 0, _("Vert. Spacing")); data->vert_spacing = create_spin_button_in_table(table, 3, 1, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->vert_spacing), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); - create_label_in_table(table, 3, 2, "No. Down"); + create_label_in_table(table, 3, 2, _("No. Down")); data->no_down = create_spin_button_in_table(table, 3, 3, 0, 0, 100); gtk_signal_connect(GTK_OBJECT(data->no_down), "changed", GTK_SIGNAL_FUNC(recalc_bounds), (gpointer) data); @@ -218,11 +219,11 @@ init_guides_dialog(GuidesDialog_t *dialog, ObjectList_t *list) char dimension[128]; dialog->list = list; - sprintf(dimension, "Image dimensions: %d x %d", get_image_width(), + sprintf(dimension, _("Image dimensions: %d x %d"), get_image_width(), get_image_height()); gtk_label_set_text(GTK_LABEL(dialog->image_dimensions), dimension); gtk_label_set_text(GTK_LABEL(dialog->guide_bounds), - "Resulting Guide Bounds: 0,0 to 0,0 (0 areas)"); + _("Resulting Guide Bounds: 0,0 to 0,0 (0 areas)")); gtk_widget_grab_focus(dialog->width); } @@ -238,7 +239,7 @@ do_create_guides_dialog(ObjectList_t *list) default_dialog_show(dialog->dialog); } -static gboolean guides_command_execute(Command_t *parent); +static CmdExecuteValue_t guides_command_execute(Command_t *parent); static CommandClass_t guides_command_class = { NULL, /* guides_command_destruct */ @@ -257,13 +258,13 @@ guides_command_new(ObjectList_t *list) { GuidesCommand_t *command = g_new(GuidesCommand_t, 1); command->list = list; - return command_init(&command->parent, "Guides", &guides_command_class); + return command_init(&command->parent, _("Guides"), &guides_command_class); } -static gboolean +static CmdExecuteValue_t guides_command_execute(Command_t *parent) { GuidesCommand_t *command = (GuidesCommand_t*) parent; do_create_guides_dialog(command->list); - return FALSE; + return CMD_DESTRUCT; } diff --git a/plug-ins/imagemap/imap_cmd_insert_point.c b/plug-ins/imagemap/imap_cmd_insert_point.c index ed645880e4..e240f5633f 100644 --- a/plug-ins/imagemap/imap_cmd_insert_point.c +++ b/plug-ins/imagemap/imap_cmd_insert_point.c @@ -22,10 +22,11 @@ */ #include "imap_cmd_insert_point.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_polygon.h" -static gboolean insert_point_command_execute(Command_t *parent); +static CmdExecuteValue_t insert_point_command_execute(Command_t *parent); static void insert_point_command_undo(Command_t *parent); static CommandClass_t insert_point_command_class = { @@ -53,11 +54,11 @@ insert_point_command_new(Object_t *obj, gint x, gint y, gint edge) command->x = x; command->y = y; command->edge = edge; - return command_init(&command->parent, "Insert Point", + return command_init(&command->parent, _("Insert Point"), &insert_point_command_class); } -static gboolean +static CmdExecuteValue_t insert_point_command_execute(Command_t *parent) { InsertPointCommand_t *command = (InsertPointCommand_t*) parent; @@ -75,7 +76,7 @@ insert_point_command_execute(Command_t *parent) } redraw_preview(); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_move.c b/plug-ins/imagemap/imap_cmd_move.c index f2081969c4..ec7eaaa920 100644 --- a/plug-ins/imagemap/imap_cmd_move.c +++ b/plug-ins/imagemap/imap_cmd_move.c @@ -21,35 +21,63 @@ * */ -#include "imap_cmd_copy.h" +#include "imap_cmd_move.h" +#include "imap_cmd_object_move.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void move_command_destruct(Command_t *parent); -static gboolean move_command_execute(Command_t *parent); -static void move_command_undo(Command_t *parent); +static CmdExecuteValue_t move_command_execute(Command_t *parent); CommandClass_t move_command_class = { move_command_destruct, move_command_execute, - move_command_undo, + NULL, /* move_command_undo */ NULL /* move_command_redo */ }; typedef struct { Command_t parent; + PreferencesData_t *preferences; + Preview_t *preview; Object_t *obj; - gint dx; - gint dy; + gint start_x; + gint start_y; + gint obj_start_x; + gint obj_start_y; + gint obj_x; + gint obj_y; + gint obj_width; + gint obj_height; + + gint image_width; + gint image_height; + + GdkCursorType cursor; /* Remember previous cursor */ + gboolean moved_first_time; } MoveCommand_t; Command_t* -move_command_new(Object_t *obj, gint dx, gint dy) +move_command_new(Preview_t *preview, Object_t *obj, gint x, gint y) { MoveCommand_t *command = g_new(MoveCommand_t, 1); + + command->preferences = get_preferences(); + command->preview = preview; command->obj = object_ref(obj); - command->dx = dx; - command->dy = dy; - return command_init(&command->parent, "Move", &move_command_class); + command->start_x = x; + command->start_y = y; + object_get_dimensions(obj, &command->obj_x, &command->obj_y, + &command->obj_width, &command->obj_height); + command->obj_start_x = command->obj_x; + command->obj_start_y = command->obj_y; + + command->image_width = get_image_width(); + command->image_height = get_image_height(); + + command->moved_first_time = TRUE; + + return command_init(&command->parent, _("Move"), &move_command_class); } static void @@ -59,20 +87,79 @@ move_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean -move_command_execute(Command_t *parent) +static void +button_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) { - MoveCommand_t *command = (MoveCommand_t*) parent; - object_move(command->obj, command->dx, command->dy); - redraw_preview(); /* fix me! */ - return TRUE; + MoveCommand_t *command = (MoveCommand_t*) data; + Object_t *obj = command->obj; + gint dx = get_real_coord((gint) event->x) - command->start_x; + gint dy = get_real_coord((gint) event->y) - command->start_y; + + if (command->moved_first_time) { + command->moved_first_time = FALSE; + command->cursor = preview_set_cursor(command->preview, GDK_FLEUR); + gdk_gc_set_function(command->preferences->normal_gc, GDK_EQUIV); + gdk_gc_set_function(command->preferences->selected_gc, GDK_EQUIV); + hide_url(); + } + + if (command->obj_x + dx < 0) + dx = -command->obj_x; + if (command->obj_x + command->obj_width + dx > command->image_width) + dx = command->image_width - command->obj_width - command->obj_x; + if (command->obj_y + dy < 0) + dy = -command->obj_y; + if (command->obj_y + command->obj_height + dy > command->image_height) + dy = command->image_height - command->obj_height - command->obj_y; + + if (dx || dy) { + command->start_x = get_real_coord((gint) event->x); + command->start_y = get_real_coord((gint) event->y); + command->obj_x += dx; + command->obj_y += dy; + + object_draw(obj, widget->window); + object_move(obj, dx, dy); + object_draw(obj, widget->window); + } } static void -move_command_undo(Command_t *parent) +button_release(GtkWidget *widget, GdkEventButton *event, gpointer data) { - MoveCommand_t *command = (MoveCommand_t*) parent; - object_move(command->obj, -command->dx, -command->dy); - redraw_preview(); /* fix me! */ + MoveCommand_t *command = (MoveCommand_t*) data; + + gtk_signal_disconnect_by_func(GTK_OBJECT(widget), + (GtkSignalFunc) button_motion, data); + gtk_signal_disconnect_by_func(GTK_OBJECT(widget), + (GtkSignalFunc) button_release, data); + + if (!command->moved_first_time) { + preview_set_cursor(command->preview, command->cursor); + gdk_gc_set_function(command->preferences->normal_gc, GDK_COPY); + gdk_gc_set_function(command->preferences->selected_gc, GDK_COPY); + show_url(); + } + command->obj_x -= command->obj_start_x; + command->obj_y -= command->obj_start_y; + if (command->obj_x || command->obj_y) + command_list_add(object_move_command_new(command->obj, command->obj_x, + command->obj_y)); + + preview_thaw(); +} + +static CmdExecuteValue_t +move_command_execute(Command_t *parent) +{ + MoveCommand_t *command = (MoveCommand_t*) parent; + GtkWidget *widget = command->preview->preview; + + preview_freeze(); + gtk_signal_connect(GTK_OBJECT(widget), "button_release_event", + (GtkSignalFunc) button_release, command); + gtk_signal_connect(GTK_OBJECT(widget), "motion_notify_event", + (GtkSignalFunc) button_motion, command); + return CMD_DESTRUCT; } diff --git a/plug-ins/imagemap/imap_cmd_move.h b/plug-ins/imagemap/imap_cmd_move.h index f9fc30dc76..16240c1f2c 100644 --- a/plug-ins/imagemap/imap_cmd_move.h +++ b/plug-ins/imagemap/imap_cmd_move.h @@ -26,7 +26,8 @@ #include "imap_command.h" #include "imap_object.h" +#include "imap_preview.h" -Command_t *move_command_new(Object_t *obj, gint x, gint y); +Command_t *move_command_new(Preview_t *preview, Object_t *obj, gint x, gint y); #endif /* _IMAP_CMD_MOVE_H */ diff --git a/plug-ins/imagemap/imap_cmd_move_down.c b/plug-ins/imagemap/imap_cmd_move_down.c index d4622ca17a..cc8df55499 100644 --- a/plug-ins/imagemap/imap_cmd_move_down.c +++ b/plug-ins/imagemap/imap_cmd_move_down.c @@ -23,9 +23,10 @@ #include "imap_cmd_copy.h" #include "imap_cmd_object_down.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean move_down_command_execute(Command_t *parent); +static CmdExecuteValue_t move_down_command_execute(Command_t *parent); static void move_down_command_undo(Command_t *parent); static void move_down_command_redo(Command_t *parent); @@ -48,7 +49,7 @@ move_down_command_new(ObjectList_t *list) MoveDownCommand_t *command = g_new(MoveDownCommand_t, 1); command->list = list; command->add = FALSE; - return command_init(&command->parent, "Move Down", + return command_init(&command->parent, _("Move Down"), &move_down_command_class); } @@ -67,7 +68,7 @@ move_down_one_object(Object_t *obj, gpointer data) } } -static gboolean +static CmdExecuteValue_t move_down_command_execute(Command_t *parent) { MoveDownCommand_t *command = (MoveDownCommand_t*) parent; @@ -78,7 +79,7 @@ move_down_command_execute(Command_t *parent) object_list_remove_move_cb(command->list, id); redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_move_sash.c b/plug-ins/imagemap/imap_cmd_move_sash.c index bf122c23a3..3418a556a6 100644 --- a/plug-ins/imagemap/imap_cmd_move_sash.c +++ b/plug-ins/imagemap/imap_cmd_move_sash.c @@ -23,6 +23,7 @@ #include "imap_cmd_copy.h" #include "imap_cmd_edit_object.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" COMMAND_PROTO(move_sash_command); @@ -60,7 +61,7 @@ move_sash_command_new(GtkWidget *widget, Object_t *obj, command->image_height = get_image_height(); command->sash_func = sash_func; - parent = command_init(&command->parent, "Move Sash", + parent = command_init(&command->parent, _("Move Sash"), &move_sash_command_class); command_add_subcommand(parent, edit_object_command_new(obj)); @@ -105,6 +106,7 @@ sash_move(GtkWidget *widget, GdkEventMotion *event, gpointer data) object_draw(obj, widget->window); command->sash_func(obj, dx, dy); + object_emit_geometry_signal(obj); object_draw(obj, widget->window); } @@ -121,23 +123,25 @@ sash_end(GtkWidget *widget, GdkEventButton *event, gpointer data) if (obj->class->normalize) object_normalize(obj); gdk_gc_set_function(get_preferences()->selected_gc, GDK_COPY); - redraw_preview(); +/* redraw_preview(); */ + preview_thaw(); show_url(); } -static gboolean +static CmdExecuteValue_t move_sash_command_execute(Command_t *parent) { MoveSashCommand_t *command = (MoveSashCommand_t*) parent; hide_url(); + preview_freeze(); gtk_signal_connect(GTK_OBJECT(command->widget), "button_release_event", (GtkSignalFunc) sash_end, command); gtk_signal_connect(GTK_OBJECT(command->widget), "motion_notify_event", (GtkSignalFunc) sash_move, command); gdk_gc_set_function(get_preferences()->selected_gc, GDK_EQUIV); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_move_selected.c b/plug-ins/imagemap/imap_cmd_move_selected.c new file mode 100644 index 0000000000..e680ee8849 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_move_selected.c @@ -0,0 +1,76 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#include "imap_cmd_move_selected.h" +#include "libgimp/stdplugins-intl.h" +#include "imap_main.h" + +static CmdExecuteValue_t move_selected_command_execute(Command_t *parent); +static void move_selected_command_undo(Command_t *parent); + +CommandClass_t move_selected_command_class = { + NULL, /* move_selected_command_destruct */ + move_selected_command_execute, + move_selected_command_undo, + NULL /* move_selected_command_redo */ +}; + +typedef struct { + Command_t parent; + ObjectList_t *list; + gint dx; + gint dy; +} MoveSelectedCommand_t; + +Command_t* +move_selected_command_new(ObjectList_t *list, gint dx, gint dy) +{ + MoveSelectedCommand_t *command = g_new(MoveSelectedCommand_t, 1); + command->list = list; + command->dx = dx; + command->dy = dy; + return command_init(&command->parent, _("Move Selected Objects"), + &move_selected_command_class); +} + +static CmdExecuteValue_t +move_selected_command_execute(Command_t *parent) +{ + MoveSelectedCommand_t *command = (MoveSelectedCommand_t*) parent; + object_list_move_selected(command->list, command->dx, command->dy); +#ifdef _OLD_ + redraw_preview(); /* fix me! */ +#endif + return CMD_APPEND; +} + +static void +move_selected_command_undo(Command_t *parent) +{ + MoveSelectedCommand_t *command = (MoveSelectedCommand_t*) parent; + object_list_move_selected(command->list, -command->dx, -command->dy); +#ifdef _OLD_ + redraw_preview(); /* fix me! */ +#endif +} + diff --git a/plug-ins/imagemap/imap_cmd_move_selected.h b/plug-ins/imagemap/imap_cmd_move_selected.h new file mode 100644 index 0000000000..2f81d8c925 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_move_selected.h @@ -0,0 +1,32 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#ifndef _IMAP_CMD_MOVE_SELECTED_H +#define _IMAP_CMD_MOVE_SELECTED_H + +#include "imap_command.h" +#include "imap_object.h" + +Command_t *move_selected_command_new(ObjectList_t *list, gint dx, gint dy); + +#endif /* _IMAP_CMD_MOVE_SELECTED_H */ diff --git a/plug-ins/imagemap/imap_cmd_move_to_front.c b/plug-ins/imagemap/imap_cmd_move_to_front.c index 7368b1df6a..ff772d228a 100644 --- a/plug-ins/imagemap/imap_cmd_move_to_front.c +++ b/plug-ins/imagemap/imap_cmd_move_to_front.c @@ -26,7 +26,7 @@ #include "imap_cmd_move_to_front.h" #include "imap_main.h" -static gboolean move_to_front_command_execute(Command_t *parent); +static CmdExecuteValue_t move_to_front_command_execute(Command_t *parent); static void move_to_front_command_undo(Command_t *parent); static void move_to_front_command_redo(Command_t *parent); @@ -67,7 +67,7 @@ add_one_object(Object_t *obj, gpointer data) create_command_new(command->list, obj)); } -static gboolean +static CmdExecuteValue_t move_to_front_command_execute(Command_t *parent) { MoveToFrontCommand_t *command = (MoveToFrontCommand_t*) parent; @@ -80,7 +80,7 @@ move_to_front_command_execute(Command_t *parent) redraw_preview(); /* Fix me! */ object_list_remove_remove_cb(command->list, id1); object_list_remove_add_cb(command->list, id2); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_move_up.c b/plug-ins/imagemap/imap_cmd_move_up.c index 4d93cd859e..ead69badb0 100644 --- a/plug-ins/imagemap/imap_cmd_move_up.c +++ b/plug-ins/imagemap/imap_cmd_move_up.c @@ -23,9 +23,10 @@ #include "imap_cmd_move_up.h" #include "imap_cmd_object_up.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean move_up_command_execute(Command_t *parent); +static CmdExecuteValue_t move_up_command_execute(Command_t *parent); static void move_up_command_undo(Command_t *parent); static void move_up_command_redo(Command_t *parent); @@ -48,7 +49,7 @@ move_up_command_new(ObjectList_t *list) MoveUpCommand_t *command = g_new(MoveUpCommand_t, 1); command->list = list; command->add = FALSE; - return command_init(&command->parent, "Move Up", &move_up_command_class); + return command_init(&command->parent, _("Move Up"), &move_up_command_class); } static void @@ -66,7 +67,7 @@ move_up_one_object(Object_t *obj, gpointer data) } } -static gboolean +static CmdExecuteValue_t move_up_command_execute(Command_t *parent) { MoveUpCommand_t *command = (MoveUpCommand_t*) parent; @@ -77,7 +78,7 @@ move_up_command_execute(Command_t *parent) object_list_remove_move_cb(command->list, id); redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_object_down.c b/plug-ins/imagemap/imap_cmd_object_down.c index 85a4311e08..e214831e13 100644 --- a/plug-ins/imagemap/imap_cmd_object_down.c +++ b/plug-ins/imagemap/imap_cmd_object_down.c @@ -22,10 +22,11 @@ */ #include "imap_cmd_copy.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void object_down_command_destruct(Command_t *parent); -static gboolean object_down_command_execute(Command_t *parent); +static CmdExecuteValue_t object_down_command_execute(Command_t *parent); static void object_down_command_undo(Command_t *parent); CommandClass_t object_down_command_class = { @@ -47,7 +48,7 @@ object_down_command_new(ObjectList_t *list, Object_t *obj) ObjectDownCommand_t *command = g_new(ObjectDownCommand_t, 1); command->list = list; command->obj = object_ref(obj); - return command_init(&command->parent, "Move Down", + return command_init(&command->parent, _("Move Down"), &object_down_command_class); } @@ -58,13 +59,13 @@ object_down_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t object_down_command_execute(Command_t *parent) { ObjectDownCommand_t *command = (ObjectDownCommand_t*) parent; object_list_move_down(command->list, command->obj); redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_object_move.c b/plug-ins/imagemap/imap_cmd_object_move.c new file mode 100644 index 0000000000..21dbaaa374 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_object_move.c @@ -0,0 +1,84 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#include "imap_cmd_object_move.h" +#include "libgimp/stdplugins-intl.h" +#include "imap_main.h" + +static void object_move_command_destruct(Command_t *parent); +static CmdExecuteValue_t object_move_command_execute(Command_t *parent); +static void object_move_command_undo(Command_t *parent); + +CommandClass_t object_move_command_class = { + object_move_command_destruct, + object_move_command_execute, + object_move_command_undo, + NULL /* object_move_command_redo */ +}; + +typedef struct { + Command_t parent; + Object_t *obj; + gint dx; + gint dy; +} ObjectMoveCommand_t; + +Command_t* +object_move_command_new(Object_t *obj, gint dx, gint dy) +{ + ObjectMoveCommand_t *command = g_new(ObjectMoveCommand_t, 1); + command->obj = object_ref(obj); + command->dx = dx; + command->dy = dy; + return command_init(&command->parent, _("Move"), + &object_move_command_class); +} + +static void +object_move_command_destruct(Command_t *parent) +{ + ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent; + object_unref(command->obj); +} + +static CmdExecuteValue_t +object_move_command_execute(Command_t *parent) +{ + ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent; + object_move(command->obj, command->dx, command->dy); +#ifdef _OLD_ + redraw_preview(); /* fix me! */ +#endif + return CMD_APPEND; +} + +static void +object_move_command_undo(Command_t *parent) +{ + ObjectMoveCommand_t *command = (ObjectMoveCommand_t*) parent; + object_move(command->obj, -command->dx, -command->dy); +#ifdef _OLD_ + redraw_preview(); /* fix me! */ +#endif +} + diff --git a/plug-ins/imagemap/imap_cmd_object_move.h b/plug-ins/imagemap/imap_cmd_object_move.h new file mode 100644 index 0000000000..f729497d2e --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_object_move.h @@ -0,0 +1,32 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#ifndef _IMAP_CMD_OBJECT_MOVE_H +#define _IMAP_CMD_OBJECT_MOVE_H + +#include "imap_command.h" +#include "imap_object.h" + +Command_t *object_move_command_new(Object_t *obj, gint x, gint y); + +#endif /* _IMAP_CMD_OBJECT_MOVE_H */ diff --git a/plug-ins/imagemap/imap_cmd_object_up.c b/plug-ins/imagemap/imap_cmd_object_up.c index 4291d1ba88..a2d2c5e2e8 100644 --- a/plug-ins/imagemap/imap_cmd_object_up.c +++ b/plug-ins/imagemap/imap_cmd_object_up.c @@ -22,10 +22,11 @@ */ #include "imap_cmd_copy.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void object_up_command_destruct(Command_t *parent); -static gboolean object_up_command_execute(Command_t *parent); +static CmdExecuteValue_t object_up_command_execute(Command_t *parent); static void object_up_command_undo(Command_t *parent); CommandClass_t object_up_command_class = { @@ -47,7 +48,7 @@ object_up_command_new(ObjectList_t *list, Object_t *obj) ObjectUpCommand_t *command = g_new(ObjectUpCommand_t, 1); command->list = list; command->obj = object_ref(obj); - return command_init(&command->parent, "Move Up", + return command_init(&command->parent, _("Move Up"), &object_up_command_class); } @@ -58,13 +59,13 @@ object_up_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t object_up_command_execute(Command_t *parent) { ObjectUpCommand_t *command = (ObjectUpCommand_t*) parent; object_list_move_up(command->list, command->obj); redraw_preview(); /* fix me! */ - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_paste.c b/plug-ins/imagemap/imap_cmd_paste.c index a36a239c72..70338dc26e 100644 --- a/plug-ins/imagemap/imap_cmd_paste.c +++ b/plug-ins/imagemap/imap_cmd_paste.c @@ -23,9 +23,10 @@ #include "imap_cmd_create.h" #include "imap_cmd_paste.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean paste_command_execute(Command_t *parent); +static CmdExecuteValue_t paste_command_execute(Command_t *parent); static CommandClass_t paste_command_class = { NULL, /* paste_command_destruct, */ @@ -44,7 +45,7 @@ paste_command_new(ObjectList_t *list) { PasteCommand_t *command = g_new(PasteCommand_t, 1); command->list = list; - return command_init(&command->parent, "Paste", &paste_command_class); + return command_init(&command->parent, _("Paste"), &paste_command_class); } static void @@ -55,7 +56,7 @@ paste_one_object(Object_t *obj, gpointer data) create_command_new(command->list, obj)); } -static gboolean +static CmdExecuteValue_t paste_command_execute(Command_t *parent) { PasteCommand_t *command = (PasteCommand_t*) parent; @@ -65,7 +66,7 @@ paste_command_execute(Command_t *parent) object_list_paste(command->list); redraw_preview(); /* Fix me! */ object_list_remove_add_cb(command->list, id); - return TRUE; + return CMD_APPEND; } diff --git a/plug-ins/imagemap/imap_cmd_select.c b/plug-ins/imagemap/imap_cmd_select.c index 3e1d1ad03d..8b0c54e801 100644 --- a/plug-ins/imagemap/imap_cmd_select.c +++ b/plug-ins/imagemap/imap_cmd_select.c @@ -22,11 +22,11 @@ */ #include "imap_cmd_select.h" - +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void select_command_destruct(Command_t *parent); -static gboolean select_command_execute(Command_t *parent); +static CmdExecuteValue_t select_command_execute(Command_t *parent); static void select_command_undo(Command_t *parent); static CommandClass_t select_command_class = { @@ -46,7 +46,7 @@ select_command_new(Object_t *obj) { SelectCommand_t *command = g_new(SelectCommand_t, 1); command->obj = object_ref(obj); - return command_init(&command->parent, "Select", &select_command_class); + return command_init(&command->parent, _("Select"), &select_command_class); } static void @@ -56,12 +56,12 @@ select_command_destruct(Command_t *parent) object_unref(command->obj); } -static gboolean +static CmdExecuteValue_t select_command_execute(Command_t *parent) { SelectCommand_t *command = (SelectCommand_t*) parent; object_select(command->obj); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_select_all.c b/plug-ins/imagemap/imap_cmd_select_all.c index 474845ed9f..00762dd4be 100644 --- a/plug-ins/imagemap/imap_cmd_select_all.c +++ b/plug-ins/imagemap/imap_cmd_select_all.c @@ -23,9 +23,10 @@ #include "imap_cmd_select.h" #include "imap_cmd_select_all.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean select_all_command_execute(Command_t *parent); +static CmdExecuteValue_t select_all_command_execute(Command_t *parent); static void select_all_command_undo(Command_t *parent); static void select_all_command_redo(Command_t *parent); @@ -46,7 +47,7 @@ select_all_command_new(ObjectList_t *list) { SelectAllCommand_t *command = g_new(SelectAllCommand_t, 1); command->list = list; - return command_init(&command->parent, "Select All", + return command_init(&command->parent, _("Select All"), &select_all_command_class); } @@ -57,20 +58,20 @@ select_one_object(Object_t *obj, gpointer data) command_add_subcommand(&command->parent, select_command_new(obj)); } -static gboolean +static CmdExecuteValue_t select_all_command_execute(Command_t *parent) { SelectAllCommand_t *command = (SelectAllCommand_t*) parent; gpointer id; - gboolean rvalue; + CmdExecuteValue_t rvalue; id = object_list_add_select_cb(command->list, select_one_object, command); if (object_list_select_all(command->list)) { redraw_preview(); /* Fix me! */ - rvalue = TRUE; + rvalue = CMD_APPEND; } else { - rvalue = FALSE; + rvalue = CMD_DESTRUCT; } object_list_remove_select_cb(command->list, id); return rvalue; diff --git a/plug-ins/imagemap/imap_cmd_select_next.c b/plug-ins/imagemap/imap_cmd_select_next.c new file mode 100644 index 0000000000..dccfe9a377 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_select_next.c @@ -0,0 +1,91 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#include "imap_cmd_select.h" +#include "imap_cmd_select_next.h" +#include "imap_cmd_unselect.h" +#include "libgimp/stdplugins-intl.h" +#include "imap_main.h" + +static CmdExecuteValue_t select_next_command_execute(Command_t *parent); +static void select_next_command_undo(Command_t *command); +static void select_next_command_redo(Command_t *command); + +static CommandClass_t select_next_command_class = { + NULL, /* select_next_command_destruct */ + select_next_command_execute, + select_next_command_undo, + select_next_command_redo +}; + +typedef struct { + Command_t parent; + ObjectList_t *list; +} SelectNextCommand_t; + +Command_t* +select_next_command_new(ObjectList_t *list) +{ + SelectNextCommand_t *command = g_new(SelectNextCommand_t, 1); + command->list = list; + return command_init(&command->parent, _("Select Next"), + &select_next_command_class); +} + +static void +select_one_object(Object_t *obj, gpointer data) +{ + SelectNextCommand_t *command = (SelectNextCommand_t*) data; + Command_t *sub_command; + + sub_command = (obj->selected) + ? select_command_new(obj) : unselect_command_new(obj); + command_add_subcommand(&command->parent, sub_command); +} + +static CmdExecuteValue_t +select_next_command_execute(Command_t *parent) +{ + SelectNextCommand_t *command = (SelectNextCommand_t*) parent; + ObjectList_t *list = command->list; + gpointer id; + + id = object_list_add_select_cb(list, select_one_object, command); + object_list_select_next(list); + object_list_remove_select_cb(list, id); + return CMD_APPEND; +} + +static void +select_next_command_undo(Command_t *command) +{ + redraw_preview(); /* Fix me! */ +} + +static void +select_next_command_redo(Command_t *command) +{ + redraw_preview(); /* Fix me! */ +} + + diff --git a/plug-ins/imagemap/imap_cmd_select_next.h b/plug-ins/imagemap/imap_cmd_select_next.h new file mode 100644 index 0000000000..97e48a83fd --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_select_next.h @@ -0,0 +1,32 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#ifndef _IMAP_CMD_SELECT_NEXT_H +#define _IMAP_CMD_SELECT_NEXT_H + +#include "imap_command.h" +#include "imap_object.h" + +Command_t *select_next_command_new(ObjectList_t *list); + +#endif /* _IMAP_CMD_SELECT_NEXT_H */ diff --git a/plug-ins/imagemap/imap_cmd_select_prev.c b/plug-ins/imagemap/imap_cmd_select_prev.c new file mode 100644 index 0000000000..190b0894ef --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_select_prev.c @@ -0,0 +1,90 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#include "imap_cmd_select.h" +#include "imap_cmd_select_prev.h" +#include "imap_cmd_unselect.h" +#include "imap_main.h" + +static CmdExecuteValue_t select_prev_command_execute(Command_t *parent); +static void select_prev_command_undo(Command_t *command); +static void select_prev_command_redo(Command_t *command); + +static CommandClass_t select_prev_command_class = { + NULL, /* select_prev_command_destruct */ + select_prev_command_execute, + select_prev_command_undo, + select_prev_command_redo +}; + +typedef struct { + Command_t parent; + ObjectList_t *list; +} SelectPrevCommand_t; + +Command_t* +select_prev_command_new(ObjectList_t *list) +{ + SelectPrevCommand_t *command = g_new(SelectPrevCommand_t, 1); + command->list = list; + return command_init(&command->parent, "Select Previous", + &select_prev_command_class); +} + +static void +select_one_object(Object_t *obj, gpointer data) +{ + SelectPrevCommand_t *command = (SelectPrevCommand_t*) data; + Command_t *sub_command; + + sub_command = (obj->selected) + ? select_command_new(obj) : unselect_command_new(obj); + command_add_subcommand(&command->parent, sub_command); +} + +static CmdExecuteValue_t +select_prev_command_execute(Command_t *parent) +{ + SelectPrevCommand_t *command = (SelectPrevCommand_t*) parent; + ObjectList_t *list = command->list; + gpointer id; + + id = object_list_add_select_cb(list, select_one_object, command); + object_list_select_prev(list); + object_list_remove_select_cb(list, id); + return CMD_APPEND; +} + +static void +select_prev_command_undo(Command_t *command) +{ + redraw_preview(); /* Fix me! */ +} + +static void +select_prev_command_redo(Command_t *command) +{ + redraw_preview(); /* Fix me! */ +} + + diff --git a/plug-ins/imagemap/imap_cmd_select_prev.h b/plug-ins/imagemap/imap_cmd_select_prev.h new file mode 100644 index 0000000000..a718eb5903 --- /dev/null +++ b/plug-ins/imagemap/imap_cmd_select_prev.h @@ -0,0 +1,32 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#ifndef _IMAP_CMD_SELECT_PREV_H +#define _IMAP_CMD_SELECT_PREV_H + +#include "imap_command.h" +#include "imap_object.h" + +Command_t *select_prev_command_new(ObjectList_t *list); + +#endif /* _IMAP_CMD_SELECT_PREV_H */ diff --git a/plug-ins/imagemap/imap_cmd_select_region.c b/plug-ins/imagemap/imap_cmd_select_region.c index 7861455ac7..746fd7dd5c 100644 --- a/plug-ins/imagemap/imap_cmd_select_region.c +++ b/plug-ins/imagemap/imap_cmd_select_region.c @@ -25,9 +25,10 @@ #include "imap_cmd_select.h" #include "imap_cmd_select_region.h" #include "imap_cmd_unselect_all.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean select_region_command_execute(Command_t *parent); +static CmdExecuteValue_t select_region_command_execute(Command_t *parent); static void select_region_command_undo(Command_t *parent); static void select_region_command_redo(Command_t *parent); @@ -45,6 +46,7 @@ typedef struct { gint x; gint y; Object_t *obj; + Command_t *unselect_command; } SelectRegionCommand_t; Command_t* @@ -58,11 +60,12 @@ select_region_command_new(GtkWidget *widget, ObjectList_t *list, gint x, command->list = list; command->x = x; command->y = y; - (void) command_init(&command->parent, "Select Region", + (void) command_init(&command->parent, _("Select Region"), &select_region_command_class); sub_command = unselect_all_command_new(list, NULL); command_add_subcommand(&command->parent, sub_command); + command->unselect_command = sub_command; return &command->parent; } @@ -96,6 +99,7 @@ select_release(GtkWidget *widget, GdkEventButton *event, gpointer data) Object_t *obj = command->obj; Rectangle_t *rectangle = ObjectToRectangle(obj); gpointer id; + gint count; gtk_signal_disconnect_by_func(GTK_OBJECT(widget), (GtkSignalFunc) select_motion, data); @@ -107,19 +111,24 @@ select_release(GtkWidget *widget, GdkEventButton *event, gpointer data) gdk_gc_set_function(get_preferences()->normal_gc, GDK_COPY); id = object_list_add_select_cb(command->list, select_one_object, command); - if (object_list_select_region(command->list, rectangle->x, rectangle->y, - rectangle->width, rectangle->height)) - redraw_preview(); + count = object_list_select_region(command->list, rectangle->x, rectangle->y, + rectangle->width, rectangle->height); object_list_remove_select_cb(command->list, id); + if (count) { + redraw_preview(); /* Fix me! */ + command_list_add(&command->parent); + } else { /* Nothing selected */ + if (command->unselect_command->sub_commands) + command_list_add(&command->parent); + } object_unref(obj); } -static gboolean +static CmdExecuteValue_t select_region_command_execute(Command_t *parent) { SelectRegionCommand_t *command = (SelectRegionCommand_t*) parent; -/* Command_t *sub_command; */ command->obj = create_rectangle(command->x, command->y, 0, 0); gtk_signal_connect(GTK_OBJECT(command->widget), "button_release_event", @@ -127,14 +136,9 @@ select_region_command_execute(Command_t *parent) gtk_signal_connect(GTK_OBJECT(command->widget), "motion_notify_event", (GtkSignalFunc) select_motion, command); -#ifdef _OLD_ - sub_command = unselect_all_command_new(command->list, NULL); - command_add_subcommand(parent, sub_command); - command_execute(sub_command); -#endif gdk_gc_set_function(get_preferences()->normal_gc, GDK_EQUIV); - return TRUE; + return CMD_IGNORE; } static void diff --git a/plug-ins/imagemap/imap_cmd_send_to_back.c b/plug-ins/imagemap/imap_cmd_send_to_back.c index e4d8b61936..cd8e7391aa 100644 --- a/plug-ins/imagemap/imap_cmd_send_to_back.c +++ b/plug-ins/imagemap/imap_cmd_send_to_back.c @@ -24,9 +24,10 @@ #include "imap_cmd_create.h" #include "imap_cmd_delete.h" #include "imap_cmd_send_to_back.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" -static gboolean send_to_back_command_execute(Command_t *parent); +static CmdExecuteValue_t send_to_back_command_execute(Command_t *parent); static void send_to_back_command_undo(Command_t *parent); static void send_to_back_command_redo(Command_t *parent); @@ -47,7 +48,7 @@ send_to_back_command_new(ObjectList_t *list) { SendToBackCommand_t *command = g_new(SendToBackCommand_t, 1); command->list = list; - return command_init(&command->parent, "Send To Back", + return command_init(&command->parent, _("Send To Back"), &send_to_back_command_class); } @@ -67,7 +68,7 @@ add_one_object(Object_t *obj, gpointer data) create_command_new(command->list, obj)); } -static gboolean +static CmdExecuteValue_t send_to_back_command_execute(Command_t *parent) { SendToBackCommand_t *command = (SendToBackCommand_t*) parent; @@ -80,7 +81,7 @@ send_to_back_command_execute(Command_t *parent) redraw_preview(); /* Fix me! */ object_list_remove_remove_cb(command->list, id1); object_list_remove_add_cb(command->list, id2); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_unselect.c b/plug-ins/imagemap/imap_cmd_unselect.c index fd5be1792a..7c5b569f46 100644 --- a/plug-ins/imagemap/imap_cmd_unselect.c +++ b/plug-ins/imagemap/imap_cmd_unselect.c @@ -22,11 +22,11 @@ */ #include "imap_cmd_unselect.h" - +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" static void unselect_command_destruct(Command_t *parent); -static gboolean unselect_command_execute(Command_t *parent); +static CmdExecuteValue_t unselect_command_execute(Command_t *parent); static void unselect_command_undo(Command_t *parent); static CommandClass_t unselect_command_class = { @@ -46,7 +46,7 @@ unselect_command_new(Object_t *obj) { UnselectCommand_t *command = g_new(UnselectCommand_t, 1); command->obj = object_ref(obj); - return command_init(&command->parent, "Unselect", + return command_init(&command->parent, _("Unselect"), &unselect_command_class); } @@ -57,12 +57,12 @@ unselect_command_destruct(Command_t *command) object_unref(unselect_command->obj); } -static gboolean +static CmdExecuteValue_t unselect_command_execute(Command_t *command) { UnselectCommand_t *unselect_command = (UnselectCommand_t*) command; object_unselect(unselect_command->obj); - return TRUE; + return CMD_APPEND; } static void diff --git a/plug-ins/imagemap/imap_cmd_unselect_all.c b/plug-ins/imagemap/imap_cmd_unselect_all.c index e09ec8134a..ab4383cb7e 100644 --- a/plug-ins/imagemap/imap_cmd_unselect_all.c +++ b/plug-ins/imagemap/imap_cmd_unselect_all.c @@ -23,6 +23,7 @@ #include "imap_cmd_unselect.h" #include "imap_cmd_unselect_all.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" COMMAND_PROTO(unselect_all_command); @@ -46,7 +47,7 @@ unselect_all_command_new(ObjectList_t *list, Object_t *exception) UnselectAllCommand_t *command = g_new(UnselectAllCommand_t, 1); command->list = list; command->exception = (exception) ? object_ref(exception) : exception; - return command_init(&command->parent, "Unselect All", + return command_init(&command->parent, _("Unselect All"), &unselect_all_command_class); } @@ -65,20 +66,20 @@ select_one_object(Object_t *obj, gpointer data) command_add_subcommand(&command->parent, unselect_command_new(obj)); } -static gboolean +static CmdExecuteValue_t unselect_all_command_execute(Command_t *parent) { UnselectAllCommand_t *command = (UnselectAllCommand_t*) parent; gpointer id; - gboolean rvalue; + CmdExecuteValue_t rvalue; id = object_list_add_select_cb(command->list, select_one_object, command); if (object_list_deselect_all(command->list, command->exception)) { redraw_preview(); /* Fix me! */ - rvalue = TRUE; + rvalue = CMD_APPEND; } else { - rvalue = FALSE; + rvalue = CMD_DESTRUCT; } object_list_remove_select_cb(command->list, id); return rvalue; diff --git a/plug-ins/imagemap/imap_command.c b/plug-ins/imagemap/imap_command.c index b1e7975ac5..4f67f7790a 100755 --- a/plug-ins/imagemap/imap_command.c +++ b/plug-ins/imagemap/imap_command.c @@ -24,7 +24,6 @@ #include #include "imap_command.h" -#define DEFAULT_UNDO_LEVELS 10 #define INFINITE_UNDO_LEVELS -1 static void command_destruct(Command_t *command); @@ -169,10 +168,38 @@ subcommand_end(void) command_list_end(_current_command_list); } +static void +_command_list_set_undo_level(CommandList_t *list, gint level) +{ + gint diff = g_list_length(list->list) - level; + if (diff > 0) { + GList *p, *q; + /* first remove data at the front */ + for (p = list->list; diff && p != list->undo; p = q, diff--) { + Command_t *curr = (Command_t*) p->data; + q = p->next; + command_destruct(curr); + list->list = g_list_remove_link(list->list, p); + } + + /* If still to long start removing redo levels at the end */ + for (p = g_list_last(list->list); diff && p != list->undo; p = q, + diff--) { + Command_t *curr = (Command_t*) p->data; + q = p->prev; + command_destruct(curr); + list->list = g_list_remove_link(list->list, p); + } + command_list_callback_call(&list->update_cb, + (Command_t*) list->undo->data); + } + list->undo_levels = level; +} + void command_list_set_undo_level(gint level) { - /* Fix me */ + _command_list_set_undo_level(&_command_list, level); } Command_t* @@ -219,9 +246,10 @@ command_execute(Command_t *command) if (command->sub_commands) command_list_execute(command->sub_commands); if (command->class->execute) { - if (command->class->execute(command)) + CmdExecuteValue_t value = command->class->execute(command); + if (value == CMD_APPEND) command_list_add(command); - else + else if (value == CMD_DESTRUCT) command_destruct(command); } } @@ -324,7 +352,7 @@ command_add_subcommand(Command_t *command, Command_t *sub_command) subcommand_list_add(command->sub_commands, sub_command); } -static gboolean basic_command_execute(Command_t *command); +static CmdExecuteValue_t basic_command_execute(Command_t *command); static CommandClass_t basic_command_class = { NULL, /* basic_command_destruct */ @@ -346,11 +374,11 @@ command_new(void (*func)(void)) return command_init(&command->parent, "Unknown", &basic_command_class); } -static gboolean +static CmdExecuteValue_t basic_command_execute(Command_t *command) { ((BasicCommand_t*) command)->func(); - return FALSE; + return CMD_DESTRUCT; } diff --git a/plug-ins/imagemap/imap_command.h b/plug-ins/imagemap/imap_command.h index 60807b8798..7303a2a89d 100755 --- a/plug-ins/imagemap/imap_command.h +++ b/plug-ins/imagemap/imap_command.h @@ -26,19 +26,23 @@ #include "imap_object.h" +#define DEFAULT_UNDO_LEVELS 10 + typedef struct CommandClass_t CommandClass_t; typedef struct Command_t Command_t; typedef struct CommandList_t CommandList_t; +typedef enum {CMD_APPEND, CMD_DESTRUCT, CMD_IGNORE} CmdExecuteValue_t; + #define COMMAND_PROTO(class) \ static void class##_destruct(Command_t *command); \ -static gboolean class##_execute(Command_t *command); \ +static CmdExecuteValue_t class##_execute(Command_t *command); \ static void class##_undo(Command_t *command); \ static void class##_redo(Command_t *command) struct CommandClass_t { void (*destruct)(Command_t*); - gboolean (*execute)(Command_t*); + CmdExecuteValue_t (*execute)(Command_t*); void (*undo)(Command_t*); void (*redo)(Command_t*); }; diff --git a/plug-ins/imagemap/imap_csim.y b/plug-ins/imagemap/imap_csim.y index ba8d790ad9..300ec6a23b 100755 --- a/plug-ins/imagemap/imap_csim.y +++ b/plug-ins/imagemap/imap_csim.y @@ -157,16 +157,16 @@ tag : shape_tag shape_tag : SHAPE '=' STRING { - if (!strcasecmp($3, "RECT")) { + if (!g_strcasecmp($3, "RECT")) { current_object = create_rectangle(0, 0, 0, 0); current_type = RECTANGLE; - } else if (!strcasecmp($3, "CIRCLE")) { + } else if (!g_strcasecmp($3, "CIRCLE")) { current_object = create_circle(0, 0, 0); current_type = CIRCLE; - } else if (!strcasecmp($3, "POLY")) { + } else if (!g_strcasecmp($3, "POLY")) { current_object = create_polygon(NULL); current_type = POLYGON; - } else if (!strcasecmp($3, "DEFAULT")) { + } else if (!g_strcasecmp($3, "DEFAULT")) { current_type = UNDEFINED; } } diff --git a/plug-ins/imagemap/imap_edit_area_info.c b/plug-ins/imagemap/imap_edit_area_info.c index dc00613d10..762610f81f 100644 --- a/plug-ins/imagemap/imap_edit_area_info.c +++ b/plug-ins/imagemap/imap_edit_area_info.c @@ -29,6 +29,7 @@ #include "imap_default_dialog.h" #include "imap_edit_area_info.h" #include "imap_main.h" +#include "libgimp/stdplugins-intl.h" #include "imap_table.h" static gint callback_lock; @@ -163,7 +164,7 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_widget_show(table); - frame = gtk_frame_new("Link Type"); + frame = gtk_frame_new(_("Link Type")); gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 2, 0, 1); gtk_widget_show(frame); @@ -172,53 +173,55 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) gtk_widget_show(subtable); dialog->web_site = create_radio_button_in_table(subtable, NULL, 0, 0, - "Web Site"); + _("Web Site")); gtk_signal_connect(GTK_OBJECT(dialog->web_site), "toggled", (GtkSignalFunc) select_web_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->web_site)); dialog->ftp_site = create_radio_button_in_table(subtable, group, 0, 1, - "Ftp Site"); + _("Ftp Site")); gtk_signal_connect(GTK_OBJECT(dialog->ftp_site), "toggled", (GtkSignalFunc) select_ftp_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->ftp_site)); dialog->gopher = create_radio_button_in_table(subtable, group, 0, 2, - "Gopher"); + _("Gopher")); gtk_signal_connect(GTK_OBJECT(dialog->gopher), "toggled", (GtkSignalFunc) select_gopher_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->gopher)); dialog->other = create_radio_button_in_table(subtable, group, 0, 3, - "Other"); + _("Other")); gtk_signal_connect(GTK_OBJECT(dialog->other), "toggled", (GtkSignalFunc) select_other_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->other)); - dialog->file = create_radio_button_in_table(subtable, group, 1, 0, "File"); + dialog->file = create_radio_button_in_table(subtable, group, 1, 0, + _("File")); gtk_signal_connect(GTK_OBJECT(dialog->file), "toggled", (GtkSignalFunc) select_file_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->file)); - dialog->wais = create_radio_button_in_table(subtable, group, 1, 1, "WAIS"); + dialog->wais = create_radio_button_in_table(subtable, group, 1, 1, + _("WAIS")); gtk_signal_connect(GTK_OBJECT(dialog->wais), "toggled", (GtkSignalFunc) select_wais_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->wais)); dialog->telnet = create_radio_button_in_table(subtable, group, 1, 2, - "Telnet"); + _("Telnet")); gtk_signal_connect(GTK_OBJECT(dialog->telnet), "toggled", (GtkSignalFunc) select_telnet_cb, (gpointer) dialog); group = gtk_radio_button_group(GTK_RADIO_BUTTON(dialog->telnet)); dialog->email = create_radio_button_in_table(subtable, group, 1, 3, - "e-mail"); + _("e-mail")); gtk_signal_connect(GTK_OBJECT(dialog->email), "toggled", (GtkSignalFunc) select_email_cb, (gpointer) dialog); create_label_in_table( table, 2, 0, - "URL to activate when this area is clicked: (required)"); + _("URL to activate when this area is clicked: (required)")); browse = browse_widget_new("Select HTML file"); browse_widget_set_filter(browse, relative_filter, (gpointer) dialog); @@ -228,23 +231,70 @@ create_link_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) GTK_SIGNAL_FUNC(url_changed), dialog); dialog->relative_link = create_check_button_in_table(table, 4, 0, - "Relative link"); + _("Relative link")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->relative_link), TRUE); create_label_in_table( table, 6, 0, - "Target frame name/ID: (optional - used for FRAMES only)"); + _("Target frame name/ID: (optional - used for FRAMES only)")); dialog->target = create_entry_in_table(table, 7, 0); create_label_in_table(table, 9, 0, - "Comment about this area: (optional)"); + _("Comment about this area: (optional)")); dialog->comment = create_entry_in_table(table, 10, 0); - label = gtk_label_new("Link"); + label = gtk_label_new(_("Link")); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); } +static void +geometry_changed(Object_t *obj, gpointer data) +{ + AreaInfoDialog_t *dialog = (AreaInfoDialog_t*) data; + if (dialog->geometry_lock) { + dialog->geometry_lock = FALSE; + } else { + if (dialog->obj == obj) { + object_update_info_widget(obj, dialog->infotab); + obj->class->assign(obj, dialog->clone); + } + } +} + +static void +toggle_preview_cb(GtkWidget *widget, AreaInfoDialog_t *param) +{ + param->preview = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + edit_area_info_dialog_emit_geometry_signal(param); +} + +static void +create_info_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) +{ + GtkWidget *vbox, *frame, *preview, *label; + Object_t *obj = dialog->obj; + + vbox = gtk_vbox_new(FALSE, 1); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); + gtk_widget_show(vbox); + + frame = gtk_frame_new(_("Dimensions")); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + preview = gtk_check_button_new_with_label(_("Preview")); + gtk_signal_connect(GTK_OBJECT(preview), "toggled", + (GtkSignalFunc) toggle_preview_cb, (gpointer) dialog); + gtk_box_pack_start(GTK_BOX(vbox), preview, FALSE, FALSE, 0); + gtk_widget_show(preview); + + dialog->infotab = obj->class->create_info_widget(frame); + + label = gtk_label_new(obj->class->name); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); +} + static void create_java_script_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) { @@ -271,24 +321,37 @@ create_java_script_tab(AreaInfoDialog_t *dialog, GtkWidget *notebook) create_label_in_table(table, 9, 0, "onBlur (HTML 4.0):"); dialog->blur = create_entry_in_table(table, 10, 0); - label = gtk_label_new("JavaScript"); + label = gtk_label_new(_("JavaScript")); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); } +static gboolean +object_was_changed(AreaInfoDialog_t *dialog) +{ + Object_t *clone = dialog->clone; + Object_t *obj = dialog->obj; + gint old_x, old_y, old_width, old_height; + gint new_x, new_y, new_width, new_height; + + object_get_dimensions(clone, &old_x, &old_y, &old_width, &old_height); + object_get_dimensions(obj, &new_x, &new_y, &new_width, &new_height); + + return new_x != old_x || new_y != old_y || new_width != old_width || + new_height != old_height || clone->selected != obj->selected; +} + static void edit_area_ok_cb(gpointer data) { AreaInfoDialog_t *param = (AreaInfoDialog_t*) data; Object_t *obj = param->obj; - gint old_x, old_y, old_width, old_height; - gint new_x, new_y, new_width, new_height; + + object_list_remove_geometry_cb(obj->list, param->geometry_cb_id); /* Fix me: nasty hack */ if (param->add) command_list_add(edit_object_command_new(obj)); - object_get_dimensions(obj, &old_x, &old_y, &old_width, &old_height); - object_set_url(obj, gtk_entry_get_text(GTK_ENTRY(param->url))); object_set_target(obj, gtk_entry_get_text(GTK_ENTRY(param->target))); object_set_comment(obj, gtk_entry_get_text(GTK_ENTRY(param->comment))); @@ -301,17 +364,27 @@ edit_area_ok_cb(gpointer data) update_shape(obj); object_unlock(obj); - object_get_dimensions(obj, &new_x, &new_y, &new_width, &new_height); - if (new_x != old_x || new_y != old_y || new_width != old_width || - new_height != old_height) + if (object_was_changed(param)) redraw_preview(); + object_unref(param->clone); } static void edit_area_cancel_cb(gpointer data) { - Object_t *obj = ((AreaInfoDialog_t*) data)->obj; + AreaInfoDialog_t *dialog = (AreaInfoDialog_t*) data; + Object_t *obj = dialog->obj; + gboolean changed = object_was_changed(dialog); + gboolean selected = obj->selected; + + object_list_remove_geometry_cb(obj->list, dialog->geometry_cb_id); object_unlock(obj); + object_assign(dialog->clone, obj); + obj->selected = selected; + object_unref(dialog->clone); + + if (changed) + redraw_preview(); } static void @@ -335,9 +408,11 @@ create_edit_area_info_dialog(Object_t *obj) AreaInfoDialog_t *data = g_new(AreaInfoDialog_t, 1); GtkWidget *notebook; + data->geometry_lock = FALSE; + data->preview = FALSE; data->obj = obj; data->browse = NULL; - data->dialog = make_default_dialog("Area Settings"); + data->dialog = make_default_dialog(_("Area Settings")); default_dialog_set_ok_cb(data->dialog, edit_area_ok_cb, data); default_dialog_set_cancel_cb(data->dialog, edit_area_cancel_cb, data); @@ -349,7 +424,7 @@ create_edit_area_info_dialog(Object_t *obj) gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data->dialog->dialog)->vbox), notebook, TRUE, TRUE, 10); create_link_tab(data, notebook); - data->infotab = obj->class->create_info_tab(notebook); + create_info_tab(data, notebook); create_java_script_tab(data, notebook); gtk_widget_show(notebook); @@ -365,8 +440,9 @@ edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj, object_unlock(dialog->obj); object_lock(obj); dialog->obj = obj; + dialog->clone = object_clone(obj); dialog->add = add; - obj->class->fill_info_tab(obj, dialog->infotab); + object_fill_info_tab(obj, dialog->infotab); gtk_entry_set_text(GTK_ENTRY(dialog->url), obj->url); gtk_entry_set_text(GTK_ENTRY(dialog->target), obj->target); gtk_entry_set_text(GTK_ENTRY(dialog->comment), obj->comment); @@ -376,9 +452,20 @@ edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj, gtk_entry_set_text(GTK_ENTRY(dialog->blur), obj->blur); gtk_widget_grab_focus(dialog->url); - sprintf(title, "Area #%d Settings", object_get_position_in_list(obj) + 1); + dialog->geometry_cb_id = + object_list_add_geometry_cb(obj->list, geometry_changed, dialog); + + sprintf(title, _("Area #%d Settings"), + object_get_position_in_list(obj) + 1); default_dialog_set_title(dialog->dialog, title); default_dialog_show(dialog->dialog); } - +void +edit_area_info_dialog_emit_geometry_signal(AreaInfoDialog_t *dialog) +{ + if (dialog->preview) { + dialog->geometry_lock = TRUE; + object_emit_geometry_signal(dialog->obj); + } +} diff --git a/plug-ins/imagemap/imap_edit_area_info.h b/plug-ins/imagemap/imap_edit_area_info.h index 3ce4d9bc29..a8e49d5428 100644 --- a/plug-ins/imagemap/imap_edit_area_info.h +++ b/plug-ins/imagemap/imap_edit_area_info.h @@ -34,7 +34,10 @@ typedef struct AreaInfoDialog_t AreaInfoDialog_t; struct AreaInfoDialog_t { DefaultDialog_t *dialog; Object_t *obj; + Object_t *clone; gboolean add; + gboolean geometry_lock; + gboolean preview; GtkWidget *notebook; GtkWidget *web_site; @@ -55,10 +58,12 @@ struct AreaInfoDialog_t { GtkWidget *blur; GtkWidget *browse; gpointer infotab; + gpointer geometry_cb_id; }; AreaInfoDialog_t *create_edit_area_info_dialog(Object_t *obj); void edit_area_info_dialog_show(AreaInfoDialog_t *dialog, Object_t *obj, gboolean add); +void edit_area_info_dialog_emit_geometry_signal(AreaInfoDialog_t *dialog); #endif /* _IMAP_EDIT_AREA_INFO_H */ diff --git a/plug-ins/imagemap/imap_file.c b/plug-ins/imagemap/imap_file.c index 26edbcabbe..5feb43d4ed 100644 --- a/plug-ins/imagemap/imap_file.c +++ b/plug-ins/imagemap/imap_file.c @@ -26,6 +26,7 @@ #include "imap_default_dialog.h" #include "imap_file.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_table.h" @@ -42,7 +43,7 @@ open_cb(GtkWidget *widget, gpointer data) gtk_widget_hide((GtkWidget*) data); load(filename); } else { - do_file_error_dialog("Error opening file", filename); + do_file_error_dialog(_("Error opening file"), filename); } } @@ -51,7 +52,7 @@ do_file_open_dialog(void) { static GtkWidget *dialog; if (!dialog) { - dialog = gtk_file_selection_new("Load Imagemap"); + dialog = gtk_file_selection_new(_("Load Imagemap")); gtk_signal_connect_object( GTK_OBJECT(GTK_FILE_SELECTION(dialog)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(dialog)); @@ -74,13 +75,13 @@ do_file_exists_dialog(gpointer data) static DefaultDialog_t *dialog; if (!dialog) { - dialog = make_default_dialog("File exists!"); + dialog = make_default_dialog(_("File exists!")); default_dialog_hide_apply_button(dialog); default_dialog_set_ok_cb(dialog, really_overwrite, data); default_dialog_set_label( dialog, - "File already exists.\n" - " Do you really want to overwrite? "); + _("File already exists.\n" + " Do you really want to overwrite? ")); } default_dialog_show(dialog); } @@ -111,7 +112,7 @@ do_file_save_as_dialog(void) { static GtkWidget *dialog; if (!dialog) { - dialog = gtk_file_selection_new("Save Imagemap"); + dialog = gtk_file_selection_new(_("Save Imagemap")); gtk_signal_connect_object( GTK_OBJECT(GTK_FILE_SELECTION(dialog)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(dialog)); @@ -134,7 +135,7 @@ create_file_error_dialog() DefaultDialog_t *dialog; GtkWidget *table; - file_dialog->dialog = dialog = make_default_dialog("Error"); + file_dialog->dialog = dialog = make_default_dialog(_("Error")); default_dialog_hide_apply_button(dialog); default_dialog_hide_cancel_button(dialog); diff --git a/plug-ins/imagemap/imap_grid.c b/plug-ins/imagemap/imap_grid.c index 6d10727951..34a9008225 100644 --- a/plug-ins/imagemap/imap_grid.c +++ b/plug-ins/imagemap/imap_grid.c @@ -22,6 +22,7 @@ */ #include "imap_grid.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_menu.h" #include "imap_popup.h" @@ -43,8 +44,9 @@ static void grid_settings_ok_cb(gpointer data) { GridDialog_t *param = (GridDialog_t*) data; + gint new_snap; - grid_snap = GTK_TOGGLE_BUTTON(param->snap)->active; + new_snap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(param->snap)); grid_width = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(param->width)); grid_height = gtk_spin_button_get_value_as_int( @@ -54,10 +56,12 @@ grid_settings_ok_cb(gpointer data) grid_top = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(param->top)); - main_toolbar_set_grid(grid_snap); - popup_check_grid(grid_snap); - menu_check_grid(grid_snap); - + if (grid_snap != new_snap) { + grid_snap = new_snap; + main_toolbar_set_grid(grid_snap); + popup_check_grid(grid_snap); + menu_check_grid(grid_snap); + } redraw_preview(); } @@ -65,18 +69,63 @@ static void snap_toggled_cb(GtkWidget *widget, gpointer data) { GridDialog_t *param = (GridDialog_t*) data; - gint sensitive = GTK_TOGGLE_BUTTON(widget)->active; + gint sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(param->type_frame, sensitive); gtk_widget_set_sensitive(param->granularity_frame, sensitive); gtk_widget_set_sensitive(param->offset_frame, sensitive); + gtk_widget_set_sensitive(param->preview, sensitive); } static void type_toggled_cb(GtkWidget *widget, gpointer data) { - if (GTK_WIDGET_STATE(widget) & GTK_STATE_SELECTED) + if (GTK_WIDGET_STATE(widget) & GTK_STATE_SELECTED) { grid_type = (gint) data; + redraw_preview(); + } +} + +static void +toggle_preview_cb(GtkWidget *widget, GridDialog_t *param) +{ + param->enable_preview = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + redraw_preview(); +} + +static void +grid_assign_value(GtkWidget *widget, gpointer data, gint *value) +{ + GridDialog_t *dialog = (GridDialog_t*) data; + if (dialog->enable_preview) { + *value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + redraw_preview(); /* Fix me! */ + } +} + +static void +width_changed_cb(GtkWidget *widget, gpointer data) +{ + grid_assign_value(widget, data, &grid_width); +} + +static void +height_changed_cb(GtkWidget *widget, gpointer data) +{ + grid_assign_value(widget, data, &grid_height); +} + +static void +left_changed_cb(GtkWidget *widget, gpointer data) +{ + grid_assign_value(widget, data, &grid_left); +} + +static void +top_changed_cb(GtkWidget *widget, gpointer data) +{ + grid_assign_value(widget, data, &grid_top); } static GridDialog_t* @@ -90,10 +139,10 @@ create_grid_settings_dialog() GtkWidget *button; GSList* group; - data->dialog = dialog = make_default_dialog("Grid Settings"); + data->dialog = dialog = make_default_dialog(_("Grid Settings")); default_dialog_set_ok_cb(dialog, grid_settings_ok_cb, (gpointer) data); - main_table = gtk_table_new(3, 2, FALSE); + main_table = gtk_table_new(4, 2, FALSE); gtk_container_set_border_width(GTK_CONTAINER(main_table), 10); gtk_table_set_row_spacings(GTK_TABLE(main_table), 10); gtk_table_set_col_spacings(GTK_TABLE(main_table), 10); @@ -101,27 +150,27 @@ create_grid_settings_dialog() main_table, TRUE, TRUE, 10); gtk_widget_show(main_table); - data->snap = gtk_check_button_new_with_label("Snap-To Grid Enabled"); + data->snap = gtk_check_button_new_with_label(_("Snap-To Grid Enabled")); gtk_signal_connect(GTK_OBJECT(data->snap), "toggled", (GtkSignalFunc) snap_toggled_cb, data); gtk_table_attach_defaults(GTK_TABLE(main_table), data->snap, 0, 1, 0, 1); gtk_widget_show(data->snap); - data->type_frame = frame = gtk_frame_new("Grid Visibility and Type"); + data->type_frame = frame = gtk_frame_new(_("Grid Visibility and Type")); gtk_widget_show(frame); gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 0, 2, 1, 2); hbox = gtk_hbox_new(FALSE, 1); gtk_container_add(GTK_CONTAINER(frame), hbox); gtk_widget_show(hbox); - data->hidden = button = gtk_radio_button_new_with_label(NULL, "Hidden"); + data->hidden = button = gtk_radio_button_new_with_label(NULL, _("Hidden")); gtk_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) type_toggled_cb, (gpointer) GRID_HIDDEN); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10); gtk_widget_show(button); group = gtk_radio_button_group(GTK_RADIO_BUTTON(button)); - data->lines = button = gtk_radio_button_new_with_label(group, "Lines"); + data->lines = button = gtk_radio_button_new_with_label(group, _("Lines")); gtk_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) type_toggled_cb, (gpointer) GRID_LINES); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); @@ -129,40 +178,60 @@ create_grid_settings_dialog() gtk_widget_show(button); group = gtk_radio_button_group(GTK_RADIO_BUTTON(button)); - data->crosses = button = gtk_radio_button_new_with_label(group, "Crosses"); + data->crosses = button = gtk_radio_button_new_with_label(group, + _("Crosses")); gtk_signal_connect(GTK_OBJECT(button), "toggled", (GtkSignalFunc) type_toggled_cb, (gpointer) GRID_CROSSES); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 10); gtk_widget_show(button); - data->granularity_frame = frame = gtk_frame_new("Grid Granularity"); + data->granularity_frame = frame = gtk_frame_new(_("Grid Granularity")); gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 0, 1, 2, 3); table = gtk_table_new(2, 3, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 10); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_add(GTK_CONTAINER(frame), table); - create_label_in_table(table, 0, 0, "Width"); + + create_label_in_table(table, 0, 0, _("Width")); data->width = create_spin_button_in_table(table, 0, 1, 15, 1, 100); - create_label_in_table(table, 0, 2, "pixels"); - create_label_in_table(table, 1, 0, "Height"); + gtk_signal_connect(GTK_OBJECT(data->width), "changed", + (GtkSignalFunc) width_changed_cb, (gpointer) data); + create_label_in_table(table, 0, 2, _("pixels")); + + create_label_in_table(table, 1, 0, _("Height")); data->height = create_spin_button_in_table(table, 1, 1, 15, 1, 100); - create_label_in_table(table, 1, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(data->height), "changed", + (GtkSignalFunc) height_changed_cb, (gpointer) data); + create_label_in_table(table, 1, 2, _("pixels")); + gtk_widget_show(table); gtk_widget_show(frame); - data->offset_frame = frame = gtk_frame_new("Grid Offset"); + data->offset_frame = frame = gtk_frame_new(_("Grid Offset")); gtk_table_attach_defaults(GTK_TABLE(main_table), frame, 1, 2, 2, 3); table = gtk_table_new(2, 2, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 10); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_add(GTK_CONTAINER(frame), table); + data->left = create_spin_button_in_table(table, 0, 0, 0, 0, 100); - create_label_in_table(table, 0, 1, "pixels from left"); + gtk_signal_connect(GTK_OBJECT(data->left), "changed", + (GtkSignalFunc) left_changed_cb, (gpointer) data); + create_label_in_table(table, 0, 1, _("pixels from left")); + data->top = create_spin_button_in_table(table, 1, 0, 0, 0, 100); - create_label_in_table(table, 1, 1, "pixels from top"); + gtk_signal_connect(GTK_OBJECT(data->top), "changed", + (GtkSignalFunc) top_changed_cb, (gpointer) data); + create_label_in_table(table, 1, 1, _("pixels from top")); + + data->preview = create_check_button_in_table(main_table, 3, 0, + _("Preview")); + gtk_signal_connect(GTK_OBJECT(data->preview), "toggled", + (GtkSignalFunc) toggle_preview_cb, (gpointer) data); + gtk_widget_show(data->preview); snap_toggled_cb(data->snap, data); @@ -234,14 +303,11 @@ draw_grid(GtkWidget *preview) gdk_gc_set_line_attributes(grid_gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_BEVEL); } - - gdk_gc_set_function(preview->style->black_gc, GDK_INVERT); if (grid_type == GRID_LINES) - draw_lines(preview->window, preview->style->black_gc, width, height); + draw_lines(preview->window, grid_gc, width, height); else draw_crosses(preview->window, preview->style->black_gc, width, height); - gdk_gc_set_function(preview->style->black_gc, GDK_COPY); } } @@ -253,14 +319,39 @@ toggle_grid(void) return grid_snap; } +static gint +grid_nearest_x(gint x) +{ + return grid_left + (x - grid_left + grid_width / 2) / grid_width + * grid_width; +} + +static gint +grid_nearest_y(gint y) +{ + return grid_top + (y - grid_top + grid_height / 2) / grid_height + * grid_height; +} + void round_to_grid(gint *x, gint *y) { if (grid_snap) { - *x = grid_left + (*x - grid_left + grid_width / 2) / grid_width - * grid_width; - *y = grid_top + (*y - grid_top + grid_height / 2) / grid_height - * grid_height; + *x = grid_nearest_x(*x); + *y = grid_nearest_y(*y); } } +gboolean +grid_near_x(gint x) +{ + return grid_snap && grid_type != GRID_HIDDEN + && abs(grid_nearest_x(x) - x) <= 1; +} + +gboolean +grid_near_y(gint y) +{ + return grid_snap && grid_type != GRID_HIDDEN + && abs(grid_nearest_x(y) - y) <= 1; +} diff --git a/plug-ins/imagemap/imap_grid.h b/plug-ins/imagemap/imap_grid.h index 48c4a6fe8b..4593268c31 100644 --- a/plug-ins/imagemap/imap_grid.h +++ b/plug-ins/imagemap/imap_grid.h @@ -39,6 +39,9 @@ typedef struct { GtkWidget *hidden; GtkWidget *lines; GtkWidget *crosses; + GtkWidget *preview; + + gboolean enable_preview; } GridDialog_t; void do_grid_settings_dialog(); @@ -46,4 +49,7 @@ void draw_grid(GtkWidget *preview); gboolean toggle_grid(); void round_to_grid(gint *x, gint *y); +gboolean grid_near_x(gint x); +gboolean grid_near_y(gint y); + #endif /* _IMAP_GRID_H */ diff --git a/plug-ins/imagemap/imap_main.c b/plug-ins/imagemap/imap_main.c index 0055cfa84a..92139f8264 100644 --- a/plug-ins/imagemap/imap_main.c +++ b/plug-ins/imagemap/imap_main.c @@ -26,6 +26,7 @@ #include #include #include "libgimp/gimp.h" +#include "gdk/gdkkeysyms.h" /* for keyboard values */ #include "gtk/gtk.h" #include "imap_about.h" @@ -38,11 +39,15 @@ #include "imap_cmd_move.h" #include "imap_cmd_move_down.h" #include "imap_cmd_move_sash.h" +#include "imap_cmd_move_selected.h" #include "imap_cmd_move_to_front.h" #include "imap_cmd_move_up.h" +#include "imap_cmd_object_move.h" #include "imap_cmd_paste.h" #include "imap_cmd_select.h" #include "imap_cmd_select_all.h" +#include "imap_cmd_select_next.h" +#include "imap_cmd_select_prev.h" #include "imap_cmd_select_region.h" #include "imap_cmd_send_to_back.h" #include "imap_cmd_unselect.h" @@ -51,6 +56,7 @@ #include "imap_edit_area_info.h" #include "imap_file.h" #include "imap_grid.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_menu.h" #include "imap_object.h" @@ -73,7 +79,7 @@ /* Global variables */ static MapInfo_t _map_info; static PreferencesData_t _preferences = {CSIM, TRUE, FALSE, TRUE, TRUE, FALSE, -FALSE, 4}; +FALSE, DEFAULT_UNDO_LEVELS, DEFAULT_MRU_SIZE}; static MRU_t *_mru; static GdkCursorType _cursor; @@ -124,6 +130,8 @@ static void query() static int nargs = sizeof (args) / sizeof (args[0]); static int nreturn_vals = 0; + INIT_I18N(); + gimp_install_procedure("plug_in_imagemap", "Creates a clickable imagemap.", "", @@ -146,6 +154,8 @@ run(char *name, int n_params, GParam *param, int *nreturn_vals, GRunModeType run_mode; GStatusType status = STATUS_SUCCESS; + INIT_I18N_UI(); + *nreturn_vals = 1; *return_vals = values; @@ -194,12 +204,6 @@ get_preferences(void) return &_preferences; } -GtkWidget* -get_top_widget(void) -{ - return _dlg; -} - static void init_preferences(void) { @@ -242,6 +246,9 @@ init_preferences(void) gdk_gc_set_background(_preferences.normal_gc, &colors->normal_bg); gdk_gc_set_foreground(_preferences.selected_gc, &colors->selected_fg); gdk_gc_set_background(_preferences.selected_gc, &colors->selected_bg); + + mru_set_size(_mru, _preferences.mru_size); + command_list_set_undo_level(_preferences.undo_levels); } /* Get yellow for tooltips */ @@ -377,13 +384,13 @@ draw_polygon(GdkWindow *window, GdkGC *gc, GList *list) static gboolean _preview_redraw_blocked; -static void +void preview_freeze(void) { _preview_redraw_blocked = TRUE; } -static void +void preview_thaw(void) { _preview_redraw_blocked = FALSE; @@ -393,7 +400,8 @@ preview_thaw(void) void redraw_preview(void) { - preview_redraw(_preview); + if (!_preview_redraw_blocked) + preview_redraw(_preview); } static void @@ -509,8 +517,8 @@ main_set_title(const char *filename) char *p; g_strreplace(&_filename, filename); - p = (filename) ? g_basename(filename) : ""; - sprintf(title, "%s - ImageMap 1.2", p); + p = (filename) ? g_basename(filename) : _(""); + sprintf(title, "%s - ImageMap 1.3", p); gtk_window_set_title(GTK_WINDOW(_dlg), title); } @@ -540,67 +548,6 @@ hide_url(void) statusbar_clear_status(_statusbar); } -static gint start_x, start_y; -static gint obj_start_x, obj_start_y; -static gint obj_x, obj_y, obj_width, obj_height; -static gboolean _moved_first_time = TRUE; - -static void -button_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) -{ - Object_t *obj = (Object_t*) data; - gint dx = GET_REAL_COORD((gint) event->x) - start_x; - gint dy = GET_REAL_COORD((gint) event->y) - start_y; - - if (_moved_first_time) { - _moved_first_time = FALSE; - preview_set_cursor(_preview, GDK_FLEUR); - gdk_gc_set_function(_preferences.normal_gc, GDK_EQUIV); - gdk_gc_set_function(_preferences.selected_gc, GDK_EQUIV); - hide_url(); - } - - if (obj_x + dx < 0) - dx = -obj_x; - if (obj_x + obj_width + dx > _image_width) - dx = _image_width - obj_width - obj_x; - if (obj_y + dy < 0) - dy = -obj_y; - if (obj_y + obj_height + dy > _image_height) - dy = _image_height - obj_height - obj_y; - - if (dx || dy) { - start_x = GET_REAL_COORD((gint) event->x); - start_y = GET_REAL_COORD((gint) event->y); - obj_x += dx; - obj_y += dy; - - object_draw(obj, widget->window); - object_move(obj, dx, dy); - object_draw(obj, widget->window); - } -} - -static void -button_release(GtkWidget *widget, GdkEventButton *event, gpointer data) -{ - gtk_signal_disconnect_by_func(GTK_OBJECT(widget), - (GtkSignalFunc) button_motion, data); - gtk_signal_disconnect_by_func(GTK_OBJECT(widget), - (GtkSignalFunc) button_release, data); - _moved_first_time = TRUE; - preview_set_cursor(_preview, _cursor); - gdk_gc_set_function(_preferences.normal_gc, GDK_COPY); - gdk_gc_set_function(_preferences.selected_gc, GDK_COPY); - redraw_preview(); - show_url(); - - obj_x -= obj_start_x; - obj_y -= obj_start_y; - if (obj_x || obj_y) - command_list_add(move_command_new((Object_t*) data, obj_x, obj_y)); -} - void select_shape(GtkWidget *widget, GdkEventButton *event) { @@ -640,15 +587,8 @@ select_shape(GtkWidget *widget, GdkEventButton *event) } command_execute(command); - start_x = x; - start_y = y; - object_get_dimensions(obj, &obj_x, &obj_y, &obj_width, &obj_height); - obj_start_x = obj_x; - obj_start_y = obj_y; - gtk_signal_connect(GTK_OBJECT(widget), "button_release_event", - (GtkSignalFunc) button_release, obj); - gtk_signal_connect(GTK_OBJECT(widget), "motion_notify_event", - (GtkSignalFunc) button_motion, obj); + command = move_command_new(_preview, obj, x, y); + command_execute(command); } else { /* Start selection rectangle */ command = select_region_command_new(widget, _shapes, x, y); command_execute(command); @@ -725,12 +665,12 @@ do_data_changed_dialog(void (*continue_cb)(gpointer), gpointer param) static DefaultDialog_t *dialog; if (!dialog) { - dialog = make_default_dialog("Data changed"); + dialog = make_default_dialog(_("Data changed")); default_dialog_hide_apply_button(dialog); default_dialog_set_label( dialog, - " Some data has been changed. \n" - "Do you really want to continue?"); + _(" Some data has been changed. \n" + "Do you really want to continue?")); } default_dialog_set_ok_cb(dialog, continue_cb, param); default_dialog_show(dialog); @@ -833,7 +773,7 @@ save_as_cern(gpointer param, OutputFunc_t output) write_cern_comment(param, output); output(param, "-:Please do not edit lines starting with \"#$\"\n"); write_cern_comment(param, output); - output(param, "VERSION:1.2\n"); + output(param, "VERSION:1.3\n"); write_cern_comment(param, output); output(param, "TITLE:%s\n", _map_info.title); write_cern_comment(param, output); @@ -868,7 +808,7 @@ save_as_csim(gpointer param, OutputFunc_t output) output(param, "\n"); output(param, "\n"); - output(param, "\n"); + output(param, "\n"); output(param, "\n", _map_info.author); description = g_strdup(_map_info.description); @@ -892,7 +832,7 @@ save_as_ncsa(gpointer param, OutputFunc_t output) output(param, "#$-:Image Map file created by GIMP Imagemap Plugin\n"); output(param, "#$-:GIMP Imagemap Plugin by Maurits Rijk\n"); output(param, "#$-:Please do not edit lines starting with \"#$\"\n"); - output(param, "#$VERSION:1.2\n"); + output(param, "#$VERSION:1.3\n"); output(param, "#$TITLE:%s\n", _map_info.title); output(param, "#$AUTHOR:%s\n", _map_info.author); output(param, "#$FORMAT:ncsa\n"); @@ -1051,6 +991,17 @@ preview_move(GtkWidget *widget, GdkEventMotion *event) statusbar_clear_status(_statusbar); } } +#ifdef _NOT_READY_YET_ + if (!obj) { + if (grid_near_x(x)) { + preview_set_cursor(_preview, GDK_SB_H_DOUBLE_ARROW); + } else if (grid_near_y(y)) { + preview_set_cursor(_preview, GDK_SB_V_DOUBLE_ARROW); + } else { + preview_set_cursor(_preview, _cursor); + } + } +#endif } static void @@ -1072,13 +1023,103 @@ button_press(GtkWidget* widget, GdkEventButton* event, gpointer data) _button_press_func(widget, event, _button_press_param); } -#ifdef _NOT_READY_YET_ +/* A few global vars for key movement */ + +static gint _timeout; +static guint _keyval; +static gint _dx, _dy; + +static void +move_selected_objects(gint dx, gint dy, gboolean fast) +{ + if (fast) { + dx *= 5; + dy *= 5; + } + _dx += dx; + _dy += dy; + + gdk_gc_set_function(_preferences.normal_gc, GDK_EQUIV); + gdk_gc_set_function(_preferences.selected_gc, GDK_EQUIV); + object_list_draw_selected(_shapes, _preview->preview->window); + object_list_move_selected(_shapes, dx, dy); + object_list_draw_selected(_shapes, _preview->preview->window); + gdk_gc_set_function(_preferences.normal_gc, GDK_COPY); + gdk_gc_set_function(_preferences.selected_gc, GDK_COPY); +} + +static gboolean +key_timeout_cb(gpointer data) +{ + switch (_keyval) { + case GDK_Left: + case GDK_Right: + case GDK_Up: + case GDK_Down: + command_list_add(move_selected_command_new(_shapes, _dx, _dy)); + _dx = _dy = 0; + break; + } + preview_thaw(); + return FALSE; +} + +static gboolean +key_press_cb(GtkWidget *widget, GdkEventKey *event) +{ + gint handled = FALSE; + gboolean shift = event->state & GDK_SHIFT_MASK; + Command_t *command; + + preview_freeze(); + if (_timeout) + gtk_timeout_remove(_timeout); + + switch (event->keyval) { + case GDK_Left: + move_selected_objects(-1, 0, shift); + handled = TRUE; + break; + case GDK_Right: + move_selected_objects(1, 0, shift); + handled = TRUE; + break; + case GDK_Up: + move_selected_objects(0, -1, shift); + handled = TRUE; + break; + case GDK_Down: + move_selected_objects(0, 1, shift); + handled = TRUE; + break; + case GDK_Tab: + if (shift) + command = select_prev_command_new(_shapes); + else + command = select_next_command_new(_shapes); + command_execute(command); + handled = TRUE; + break; + } + if (handled) + gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); + + return handled; +} + +static gboolean +key_release_cb(GtkWidget *widget, GdkEventKey *event) +{ + _keyval = event->keyval; + _timeout = gtk_timeout_add(250, key_timeout_cb, NULL); + return FALSE; +} + static void geometry_changed(Object_t *obj, gpointer data) { - redraw_preview(); + redraw_preview(); /* Fix me! */ } -#endif static void data_changed(Object_t *obj, gpointer data) @@ -1286,7 +1327,6 @@ dialog(GDrawable *drawable) GtkWidget *hbox; GtkWidget *main_vbox; Tools_t *tools; - guchar *color_cube; gchar **argv; gint argc = 1; Menu_t *menu; @@ -1300,13 +1340,9 @@ dialog(GDrawable *drawable) gdk_set_use_xshm(gimp_use_xshm()); gtk_preview_set_gamma(gimp_gamma()); - gtk_preview_set_install_cmap(gimp_install_cmap()); - color_cube = gimp_color_cube(); - gtk_preview_set_color_cube(color_cube[0], color_cube[1], - color_cube[2], color_cube[3]); gtk_widget_set_default_visual(gtk_preview_get_visual()); - gtk_widget_set_default_colormap(gtk_preview_get_cmap()); + gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); _shapes = make_object_list(); @@ -1319,6 +1355,11 @@ dialog(GDrawable *drawable) gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE); gtk_signal_connect(GTK_OBJECT(dlg), "destroy", (GtkSignalFunc) close_callback, NULL); + gtk_signal_connect(GTK_OBJECT(dlg), "key_press_event", + (GtkSignalFunc) key_press_cb, NULL); + gtk_signal_connect(GTK_OBJECT(dlg), "key_release_event", + (GtkSignalFunc) key_release_cb, NULL); + main_vbox = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); gtk_container_add(GTK_CONTAINER(dlg), main_vbox); @@ -1394,7 +1435,7 @@ dialog(GDrawable *drawable) add_preview_button_press_event(_preview, (GtkSignalFunc) button_press); gtk_container_add(GTK_CONTAINER(hbox), _preview->window); -/* object_list_add_changed_cb(_shapes, geometry_changed, NULL); */ + object_list_add_geometry_cb(_shapes, geometry_changed, NULL); object_list_add_update_cb(_shapes, data_changed, NULL); object_list_add_add_cb(_shapes, data_changed, NULL); object_list_add_remove_cb(_shapes, data_changed, NULL); diff --git a/plug-ins/imagemap/imap_main.h b/plug-ins/imagemap/imap_main.h index 555c8ecfbc..6af217a0d3 100644 --- a/plug-ins/imagemap/imap_main.h +++ b/plug-ins/imagemap/imap_main.h @@ -24,12 +24,9 @@ #ifndef _IMAP_MAIN_H #define _IMAP_MAIN_H -#include "gtk/gtk.h" - #include "imap_mru.h" #include "imap_object.h" #include "imap_preferences.h" -#include "imap_preview.h" typedef enum {NCSA, CERN, CSIM} MapFormat_t; @@ -55,7 +52,7 @@ GdkColor *get_yellow(void); MRU_t *get_mru(void); MapInfo_t *get_map_info(void); PreferencesData_t *get_preferences(void); -GtkWidget *get_top_widget(void); + gint get_image_width(void); gint get_image_height(void); @@ -91,7 +88,10 @@ void edit_shape(gint x, gint y); void do_popup_menu(GdkEventButton *event); void draw_shapes(GtkWidget *preview); + void redraw_preview(void); +void preview_freeze(void); +void preview_thaw(void); void show_url(void); void hide_url(void); diff --git a/plug-ins/imagemap/imap_menu.c b/plug-ins/imagemap/imap_menu.c index e56c05098c..2a423bc1ce 100644 --- a/plug-ins/imagemap/imap_menu.c +++ b/plug-ins/imagemap/imap_menu.c @@ -449,14 +449,14 @@ menu_build_mru_items(MRU_t *mru) } i = 0; - for (p = mru->list; p; p = p->next, i++) + for (p = mru->list; p; p = p->next, i++) { insert_item_with_label(_menu.file_menu, position++, (gchar*) p->data, menu_mru, p->data); + } insert_separator(_menu.file_menu, position); _menu.nr_off_mru_items = i + 1; } - void menu_select_arrow(void) { diff --git a/plug-ins/imagemap/imap_mru.c b/plug-ins/imagemap/imap_mru.c index d6854afecc..bf912a6bd9 100644 --- a/plug-ins/imagemap/imap_mru.c +++ b/plug-ins/imagemap/imap_mru.c @@ -25,8 +25,6 @@ #include "imap_mru.h" -#define DEFAULT_MRU_SIZE 4 - MRU_t* mru_create(void) { @@ -85,9 +83,10 @@ mru_set_first(MRU_t *mru, const gchar *filename) void mru_set_size(MRU_t *mru, gint size) { - if (size < mru->max_size) { - /* fix me */ - } + gint diff; + + for (diff = g_list_length(mru->list) - size; diff > 0; diff--) + mru_remove_link(mru, g_list_last(mru->list)); mru->max_size = size; } diff --git a/plug-ins/imagemap/imap_mru.h b/plug-ins/imagemap/imap_mru.h index a077044420..d9a3f90000 100644 --- a/plug-ins/imagemap/imap_mru.h +++ b/plug-ins/imagemap/imap_mru.h @@ -28,6 +28,8 @@ #include "gtk/gtk.h" +#define DEFAULT_MRU_SIZE 4 + typedef struct { GList *list; gint max_size; diff --git a/plug-ins/imagemap/imap_object.c b/plug-ins/imagemap/imap_object.c index 76c9f12768..9a090757c8 100644 --- a/plug-ins/imagemap/imap_object.c +++ b/plug-ins/imagemap/imap_object.c @@ -152,6 +152,12 @@ object_list_remove_move_cb(ObjectList_t *list, gpointer id) object_list_callback_remove(&list->move_cb, id); } +void +object_list_remove_geometry_cb(ObjectList_t *list, gpointer id) +{ + object_list_callback_remove(&list->geometry_cb, id); +} + Object_t* object_init(Object_t *obj, ObjectClass_t *class) { @@ -216,7 +222,7 @@ object_clone(Object_t *obj) return clone; } -Object_t* +static Object_t* object_copy(Object_t *src, Object_t *des) { des->class = src->class; @@ -235,7 +241,8 @@ object_copy(Object_t *src, Object_t *des) Object_t* object_assign(Object_t *obj, Object_t *des) { - return obj->class->assign(obj, des); + obj->class->assign(obj, des); + return object_copy(obj, des); } void @@ -271,6 +278,13 @@ object_unselect(Object_t *obj) object_list_callback_call(&obj->list->select_cb, obj); } +void +object_move(Object_t *obj, gint dx, gint dy) +{ + obj->class->move(obj, dx, dy); + object_list_callback_call(&obj->list->geometry_cb, obj); +} + void object_remove(Object_t *obj) { @@ -343,6 +357,18 @@ object_emit_changed_signal(Object_t *obj) object_list_callback_call(&obj->list->changed_cb, obj); } +void +object_emit_geometry_signal(Object_t *obj) +{ + object_list_callback_call(&obj->list->geometry_cb, obj); +} + +void +object_emit_update_signal(Object_t *obj) +{ + object_list_callback_call(&obj->list->update_cb, obj); +} + GdkPixmap* object_get_icon(Object_t *obj, GtkWidget *widget, GdkBitmap **mask) { @@ -556,6 +582,17 @@ object_list_draw(ObjectList_t *list, GdkWindow *window) object_draw((Object_t*) p->data, window); } +void +object_list_draw_selected(ObjectList_t *list, GdkWindow *window) +{ + GList *p; + for (p = list->list; p; p = p->next) { + Object_t *obj = (Object_t*) p->data; + if (obj->selected) + object_draw(obj, window); + } +} + Object_t* object_list_find(ObjectList_t *list, gint x, gint y) { @@ -706,6 +743,44 @@ object_list_select_all(ObjectList_t *list) return count; } +void +object_list_select_next(ObjectList_t *list) +{ + GList *p; + for (p = list->list; p; p = p->next) { + Object_t *obj = (Object_t*) p->data; + if (obj->selected) { + object_unselect(obj); + p = (p->next) ? p->next : list->list; + object_select((Object_t*) p->data); + for (p = p->next; p; p = p->next) { + obj = (Object_t*) p->data; + if (obj->selected) + object_unselect(obj); + } + break; + } + } +} + +void object_list_select_prev(ObjectList_t *list) +{ + GList *p; + for (p = list->list; p; p = p->next) { + Object_t *obj = (Object_t*) p->data; + if (obj->selected) { + GList *q = (p->prev) ? p->prev : g_list_last(list->list); + for (; p; p = p->next) { + obj = (Object_t*) p->data; + if (obj->selected) + object_unselect(obj); + } + object_select((Object_t*) q->data); + break; + } + } +} + gint object_list_select_region(ObjectList_t *list, gint x, gint y, gint width, gint height) @@ -784,6 +859,17 @@ object_list_swap_next(ObjectList_t *list, GList *p) object_list_callback_call(&list->move_cb, (Object_t*) p->next->data); } +void +object_list_move_selected(ObjectList_t *list, gint dx, gint dy) +{ + GList *p; + for (p = list->list; p; p = p->next) { + Object_t *obj = (Object_t*) p->data; + if (obj->selected) + object_move(obj, dx, dy); + } +} + void object_list_move_up(ObjectList_t *list, Object_t *obj) { diff --git a/plug-ins/imagemap/imap_object.h b/plug-ins/imagemap/imap_object.h index 27567f4271..7606c78ff3 100644 --- a/plug-ins/imagemap/imap_object.h +++ b/plug-ins/imagemap/imap_object.h @@ -54,6 +54,7 @@ typedef void (*OutputFunc_t)(gpointer, const char*, ...); struct AreaInfoDialog_t; struct ObjectClass_t { + gchar *name; AreaInfoDialog_t *info_dialog; GdkPixmap *icon; GdkBitmap *mask; @@ -61,7 +62,7 @@ struct ObjectClass_t { gboolean (*is_valid)(Object_t *obj); void (*destruct)(Object_t *obj); Object_t* (*clone)(Object_t *obj); - Object_t* (*assign)(Object_t *obj, Object_t *des); + void (*assign)(Object_t *obj, Object_t *des); void (*normalize)(Object_t *obj); void (*draw)(Object_t *obj, GdkWindow *window, GdkGC* gc); void (*draw_sashes)(Object_t *obj, GdkWindow *window, GdkGC* gc); @@ -71,7 +72,8 @@ struct ObjectClass_t { gint *height); void (*resize)(Object_t *obj, gint percentage_x, gint percentage_y); void (*move)(Object_t *obj, gint dx, gint dy); - gpointer (*create_info_tab)(GtkWidget *notebook); + gpointer (*create_info_widget)(GtkWidget *frame); + void (*update_info_widget)(Object_t *obj, gpointer data); void (*fill_info_tab)(Object_t *obj, gpointer data); void (*set_initial_focus)(Object_t *obj, gpointer data); void (*update)(Object_t *obj, gpointer data); @@ -86,13 +88,13 @@ struct ObjectClass_t { Object_t *object_ref(Object_t *obj); void object_unref(Object_t *obj); Object_t* object_init(Object_t *obj, ObjectClass_t *class); -Object_t* object_copy(Object_t *src, Object_t *des); Object_t* object_clone(Object_t *obj); Object_t* object_assign(Object_t *src, Object_t *des); void object_draw(Object_t *obj, GdkWindow *window); void object_edit(Object_t *obj, gboolean add); void object_select(Object_t *obj); void object_unselect(Object_t *obj); +void object_move(Object_t *obj, gint dx, gint dy); void object_remove(Object_t *obj); void object_lock(Object_t *obj); void object_unlock(Object_t *obj); @@ -105,7 +107,10 @@ void object_set_focus(Object_t *obj, const gchar *focus); void object_set_blur(Object_t *obj, const gchar *blur); gint object_get_position_in_list(Object_t *obj); GdkPixmap* object_get_icon(Object_t *obj, GtkWidget *widget, GdkBitmap **mask); + void object_emit_changed_signal(Object_t *obj); +void object_emit_geometry_signal(Object_t *obj); +void object_emit_update_signal(Object_t *obj); #define object_is_valid(obj) \ ((obj)->class->is_valid(obj)) @@ -116,15 +121,18 @@ void object_emit_changed_signal(Object_t *obj); #define object_normalize(obj) \ ((obj)->class->normalize(obj)) -#define object_move(obj, dx, dy) \ - ((obj)->class->move((obj), (dx), (dy))) - #define object_resize(obj, per_x, per_y) \ ((obj)->class->resize((obj), (per_x), (per_y))) #define object_update(obj, data) \ ((obj)->class->update((obj), (data))) +#define object_update_info_widget(obj, data) \ + ((obj)->class->update_info_widget((obj), (data))) + +#define object_fill_info_tab(obj, data) \ + ((obj)->class->fill_info_tab((obj), (data))) + typedef struct { Object_t *obj; gboolean (*finish)(Object_t *obj, gint x, gint y); @@ -164,6 +172,7 @@ void object_list_remove(ObjectList_t *list, Object_t *object); void object_list_remove_link(ObjectList_t *list, GList *link); void object_list_update(ObjectList_t *list, Object_t *object); void object_list_draw(ObjectList_t *list, GdkWindow *window); +void object_list_draw_selected(ObjectList_t *list, GdkWindow *window); Object_t *object_list_find(ObjectList_t *list, gint x, gint y); Object_t *object_list_near_sash(ObjectList_t *list, gint x, gint y, MoveSashFunc_t *sash_func); @@ -176,12 +185,15 @@ void object_list_remove_all(ObjectList_t *list); void object_list_delete_selected(ObjectList_t *list); void object_list_edit_selected(ObjectList_t *list); gint object_list_select_all(ObjectList_t *list); +void object_list_select_next(ObjectList_t *list); +void object_list_select_prev(ObjectList_t *list); gint object_list_select_region(ObjectList_t *list, gint x, gint y, gint width, gint height); gint object_list_deselect_all(ObjectList_t *list, Object_t *exception); gint object_list_nr_selected(ObjectList_t *list); void object_list_resize(ObjectList_t *list, gint percentage_x, gint percentage_y); +void object_list_move_selected(ObjectList_t *list, gint dx, gint dy); void object_list_move_up(ObjectList_t *list, Object_t *obj); void object_list_move_down(ObjectList_t *list, Object_t *obj); void object_list_move_selected_up(ObjectList_t *list); @@ -222,6 +234,7 @@ void object_list_remove_add_cb(ObjectList_t *list, gpointer id); void object_list_remove_select_cb(ObjectList_t *list, gpointer id); void object_list_remove_remove_cb(ObjectList_t *list, gpointer id); void object_list_remove_move_cb(ObjectList_t *list, gpointer id); +void object_list_remove_geometry_cb(ObjectList_t *list, gpointer id); #define object_list_clear_changed(list) ((list)->changed = FALSE) #define object_list_set_changed(list, ischanged) \ diff --git a/plug-ins/imagemap/imap_polygon.c b/plug-ins/imagemap/imap_polygon.c index 25240e4d40..7102ed9cf5 100644 --- a/plug-ins/imagemap/imap_polygon.c +++ b/plug-ins/imagemap/imap_polygon.c @@ -25,8 +25,8 @@ #include #include "imap_cmd_delete_point.h" -#include "imap_grid.h" #include "imap_cmd_insert_point.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_misc.h" #include "imap_object_popup.h" @@ -40,7 +40,7 @@ static gboolean polygon_is_valid(Object_t *obj); static void polygon_destruct(Object_t *obj); static Object_t *polygon_clone(Object_t *obj); -static Object_t *polygon_assign(Object_t *obj, Object_t *des); +static void polygon_assign(Object_t *obj, Object_t *des); static void polygon_draw(Object_t* obj, GdkWindow *window, GdkGC* gc); static void polygon_draw_sashes(Object_t* obj, GdkWindow *window, GdkGC* gc); static MoveSashFunc_t polygon_near_sash(Object_t *obj, gint x, gint y); @@ -50,7 +50,8 @@ static void polygon_get_dimensions(Object_t *obj, gint *x, gint *y, static void polygon_resize(Object_t *obj, gint percentage_x, gint percentage_y); static void polygon_move(Object_t *obj, gint dx, gint dy); -static gpointer polygon_create_info_tab(GtkWidget *notebook); +static gpointer polygon_create_info_widget(GtkWidget *frame); +static void polygon_update_info_widget(Object_t *obj, gpointer data); static void polygon_fill_info_tab(Object_t *obj, gpointer data); static void polygon_set_initial_focus(Object_t *obj, gpointer data); static void polygon_update(Object_t* obj, gpointer data); @@ -64,6 +65,7 @@ static void polygon_do_popup(Object_t *obj, GdkEventButton *event); static char** polygon_get_icon_data(void); static ObjectClass_t polygon_class = { + N_("Polygon"), NULL, /* info_dialog */ NULL, /* icon */ NULL, /* mask */ @@ -80,7 +82,8 @@ static ObjectClass_t polygon_class = { polygon_get_dimensions, polygon_resize, polygon_move, - polygon_create_info_tab, + polygon_create_info_widget, + polygon_update_info_widget, polygon_fill_info_tab, polygon_set_initial_focus, polygon_update, @@ -99,13 +102,19 @@ create_polygon(GList *points) return object_init(&polygon->obj, &polygon_class); } +static void +polygon_free_list(Polygon_t *polygon) +{ + g_list_foreach(polygon->points, (GFunc) g_free, NULL); + g_list_free(polygon->points); + polygon->points = NULL; +} + static void polygon_destruct(Object_t *obj) { Polygon_t *polygon = ObjectToPolygon(obj); - - g_list_foreach(polygon->points, (GFunc) g_free, NULL); - g_list_free(polygon->points); + polygon_free_list(polygon); } static gboolean @@ -130,19 +139,19 @@ polygon_clone(Object_t *obj) return &clone->obj; } -static Object_t* +static void polygon_assign(Object_t *obj, Object_t *des) { Polygon_t *src_polygon = ObjectToPolygon(obj); Polygon_t *des_polygon = ObjectToPolygon(des); GList *p; + polygon_free_list(des_polygon); for (p = src_polygon->points; p; p = p->next) { GdkPoint *point = (GdkPoint*) p->data; des_polygon->points = g_list_append(des_polygon->points, new_point(point->x, point->y)); } - return object_copy(obj, des); } static void @@ -163,13 +172,14 @@ polygon_draw_sashes(Object_t *obj, GdkWindow *window, GdkGC *gc) } } -static GdkPoint *sash_point; +static GdkPoint *_sash_point; +static gint _sash_index; static void move_sash(Object_t *obj, gint dx, gint dy) { - sash_point->x += dx; - sash_point->y += dy; + _sash_point->x += dx; + _sash_point->y += dy; } static MoveSashFunc_t @@ -177,10 +187,12 @@ polygon_near_sash(Object_t *obj, gint x, gint y) { Polygon_t *polygon = ObjectToPolygon(obj); GList *p; - for (p = polygon->points; p; p = p->next) { + + _sash_index = 0; + for (p = polygon->points; p; p = p->next, _sash_index++) { GdkPoint *point = (GdkPoint*) p->data; if (near_sash(point->x, point->y, x, y)) { - sash_point = point; + _sash_point = point; return move_sash; } } @@ -276,6 +288,7 @@ polygon_move(Object_t *obj, gint dx, gint dy) } typedef struct { + Object_t *obj; GtkWidget *list; GtkWidget *x; GtkWidget *y; @@ -284,6 +297,7 @@ typedef struct { GtkWidget *append; GtkWidget *remove; gint selected_row; + gint timeout; } PolygonProperties_t; static void @@ -293,6 +307,8 @@ select_row_cb(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gchar *text; data->selected_row = row; + _sash_point = g_list_nth(ObjectToPolygon(data->obj)->points, row)->data; + gtk_clist_get_text(GTK_CLIST(data->list), row, 0, &text); gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->x), atoi(text)); @@ -345,20 +361,39 @@ remove_button_clicked(GtkWidget *widget, PolygonProperties_t *data) set_buttons_sensitivity(data); } -static gpointer -polygon_create_info_tab(GtkWidget *notebook) +static void +x_changed_cb(GtkWidget *widget, gpointer data) { - PolygonProperties_t *data = g_new(PolygonProperties_t, 1); - GtkWidget *hbox, *swin, *table, *label; + Object_t *obj = ((PolygonProperties_t*) data)->obj; + gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + _sash_point->x = x; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +y_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((PolygonProperties_t*) data)->obj; + gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + _sash_point->y = y; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static gpointer +polygon_create_info_widget(GtkWidget *frame) +{ + PolygonProperties_t *props = g_new(PolygonProperties_t, 1); + GtkWidget *hbox, *swin, *table; GtkWidget *list; gint max_width = get_image_width(); gint max_height = get_image_height(); - gchar *titles[] = {"x (pixels)", "y (pixels)"}; + gchar *titles[] = {N_("x (pixels)"), N_("y (pixels)")}; hbox = gtk_hbox_new(FALSE, 1); + gtk_container_add(GTK_CONTAINER(frame), hbox); gtk_widget_show(hbox); - data->list = list = gtk_clist_new_with_titles(2, titles); + props->list = list = gtk_clist_new_with_titles(2, titles); gtk_clist_column_titles_passive(GTK_CLIST(list)); swin = gtk_scrolled_window_new(NULL, NULL); @@ -379,7 +414,7 @@ polygon_create_info_tab(GtkWidget *notebook) gtk_clist_set_column_justification(GTK_CLIST(list), 1, GTK_JUSTIFY_RIGHT); gtk_signal_connect(GTK_OBJECT(list), "select_row", - GTK_SIGNAL_FUNC(select_row_cb), data); + GTK_SIGNAL_FUNC(select_row_cb), props); gtk_clist_set_selection_mode(GTK_CLIST(list), GTK_SELECTION_SINGLE); gtk_widget_show(list); @@ -391,43 +426,71 @@ polygon_create_info_tab(GtkWidget *notebook) gtk_widget_show(table); create_label_in_table(table, 0, 0, "x:"); - data->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1); - gtk_widget_set_usize(data->x, 64, -1); - create_label_in_table(table, 0, 2, "pixels"); + props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1); + gtk_signal_connect(GTK_OBJECT(props->x), "changed", + (GtkSignalFunc) x_changed_cb, (gpointer) props); + gtk_widget_set_usize(props->x, 64, -1); + create_label_in_table(table, 0, 2, _("pixels")); create_label_in_table(table, 1, 0, "y:"); - data->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1); - gtk_widget_set_usize(data->y, 64, -1); - create_label_in_table(table, 1, 2, "pixels"); + props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1); + gtk_signal_connect(GTK_OBJECT(props->y), "changed", + (GtkSignalFunc) y_changed_cb, (gpointer) props); + gtk_widget_set_usize(props->y, 64, -1); + create_label_in_table(table, 1, 2, _("pixels")); - data->update = gtk_button_new_with_label("Update"); - gtk_signal_connect(GTK_OBJECT(data->update), "clicked", - GTK_SIGNAL_FUNC(update_button_clicked), data); - gtk_table_attach_defaults(GTK_TABLE(table), data->update, 1, 2, 2, 3); - gtk_widget_show(data->update); + props->update = gtk_button_new_with_label(_("Update")); + gtk_signal_connect(GTK_OBJECT(props->update), "clicked", + GTK_SIGNAL_FUNC(update_button_clicked), props); + gtk_table_attach_defaults(GTK_TABLE(table), props->update, 1, 2, 2, 3); + gtk_widget_show(props->update); - data->insert = gtk_button_new_with_label("Insert"); - gtk_signal_connect(GTK_OBJECT(data->insert), "clicked", - GTK_SIGNAL_FUNC(insert_button_clicked), data); - gtk_table_attach_defaults(GTK_TABLE(table), data->insert, 1, 2, 3, 4); - gtk_widget_show(data->insert); + props->insert = gtk_button_new_with_label(_("Insert")); + gtk_signal_connect(GTK_OBJECT(props->insert), "clicked", + GTK_SIGNAL_FUNC(insert_button_clicked), props); + gtk_table_attach_defaults(GTK_TABLE(table), props->insert, 1, 2, 3, 4); + gtk_widget_show(props->insert); - data->append = gtk_button_new_with_label("Append"); - gtk_signal_connect(GTK_OBJECT(data->append), "clicked", - GTK_SIGNAL_FUNC(append_button_clicked), data); - gtk_table_attach_defaults(GTK_TABLE(table), data->append, 1, 2, 4, 5); - gtk_widget_show(data->append); + props->append = gtk_button_new_with_label(_("Append")); + gtk_signal_connect(GTK_OBJECT(props->append), "clicked", + GTK_SIGNAL_FUNC(append_button_clicked), props); + gtk_table_attach_defaults(GTK_TABLE(table), props->append, 1, 2, 4, 5); + gtk_widget_show(props->append); - data->remove = gtk_button_new_with_label("Remove"); - gtk_signal_connect(GTK_OBJECT(data->remove), "clicked", - GTK_SIGNAL_FUNC(remove_button_clicked), data); - gtk_table_attach_defaults(GTK_TABLE(table), data->remove, 1, 2, 5, 6); - gtk_widget_show(data->remove); + props->remove = gtk_button_new_with_label(_("Remove")); + gtk_signal_connect(GTK_OBJECT(props->remove), "clicked", + GTK_SIGNAL_FUNC(remove_button_clicked), props); + gtk_table_attach_defaults(GTK_TABLE(table), props->remove, 1, 2, 5, 6); + gtk_widget_show(props->remove); - label = gtk_label_new("Polygon"); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, label); + props->timeout = 0; - return data; + return props; +} + +static gint +update_timeout(gpointer data) +{ + PolygonProperties_t *props = (PolygonProperties_t*) data; + polygon_fill_info_tab(props->obj, data); + return FALSE; +} + +static void +polygon_update_info_widget(Object_t *obj, gpointer data) +{ + PolygonProperties_t *props = (PolygonProperties_t*) data; + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->x), _sash_point->x); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(props->y), _sash_point->y); + + if (props->selected_row != _sash_index) { + props->selected_row = _sash_index; + gtk_clist_select_row(GTK_CLIST(props->list), _sash_index, -1); + } + if (props->timeout) + gtk_timeout_remove(props->timeout); + props->timeout = gtk_timeout_add(1000, update_timeout, data); } static void @@ -437,6 +500,7 @@ polygon_fill_info_tab(Object_t *obj, gpointer data) PolygonProperties_t *props = (PolygonProperties_t*) data; GList *p; + props->obj = obj; gtk_clist_freeze(GTK_CLIST(props->list)); gtk_clist_clear(GTK_CLIST(props->list)); for (p = polygon->points; p; p = p->next) { @@ -446,12 +510,11 @@ polygon_fill_info_tab(Object_t *obj, gpointer data) text[0] = x; text[1] = y; - sprintf(x, "%d", point->x); sprintf(y, "%d", point->y); gtk_clist_append(GTK_CLIST(props->list), text); } - gtk_clist_select_row(GTK_CLIST(props->list), 0, -1); + gtk_clist_select_row(GTK_CLIST(props->list), _sash_index, -1); gtk_clist_thaw(GTK_CLIST(props->list)); set_buttons_sensitivity(props); @@ -548,7 +611,7 @@ static void polygon_delete_point(GtkWidget *widget, gpointer data) { Command_t *command = delete_point_command_new(get_popup_object(), - sash_point); + _sash_point); command_execute(command); } @@ -599,7 +662,7 @@ polygon_do_popup(Object_t *obj, GdkEventButton *event) static ObjectPopup_t *delete_popup; if (!delete_popup) { delete_popup = make_object_popup(); - object_popup_prepend_menu(delete_popup, "Delete Point", + object_popup_prepend_menu(delete_popup, _("Delete Point"), polygon_delete_point, delete_popup); } object_handle_popup(delete_popup, obj, event); @@ -613,7 +676,7 @@ polygon_do_popup(Object_t *obj, GdkEventButton *event) if (!insert_popup) { insert_popup = make_object_popup(); - object_popup_prepend_menu(insert_popup, "Insert Point", + object_popup_prepend_menu(insert_popup, _("Insert Point"), polygon_insert_point, insert_popup); } object_handle_popup(insert_popup, obj, event); diff --git a/plug-ins/imagemap/imap_preferences.c b/plug-ins/imagemap/imap_preferences.c index 7b243a8a2f..fa024264a0 100644 --- a/plug-ins/imagemap/imap_preferences.c +++ b/plug-ins/imagemap/imap_preferences.c @@ -25,9 +25,14 @@ #include #include +#include "libgimp/gimpenv.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" @@ -100,6 +105,10 @@ parse_line(PreferencesData_t *data, char *line) 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(); + } else if (!strcmp(token, "undo-levels")) { + data->undo_levels = parse_int(); } else if (!strcmp(token, "normal-fg-color")) { parse_color(&colors->normal_fg); } else if (!strcmp(token, "normal-bg-color")) { @@ -110,8 +119,6 @@ parse_line(PreferencesData_t *data, char *line) parse_color(&colors->selected_bg); } else if (!strcmp(token, "mru-entry")) { parse_mru_entry(); - } else if (!strcmp(token, "mru-size")) { - data->mru_size = parse_int(); } else { /* Unrecognized, just ignore rest of line */ } @@ -124,7 +131,7 @@ preferences_load(PreferencesData_t *data) char buf[256]; gchar *filename; - filename = g_strconcat(getenv("HOME"), "/.gimp/imagemaprc", NULL); + filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL); in = fopen(filename, "r"); g_free(filename); @@ -147,7 +154,7 @@ preferences_save(PreferencesData_t *data) gchar *filename; ColorSelData_t *colors = &data->colors; - filename = g_strconcat(getenv("HOME"), "/.gimp/imagemaprc", NULL); + filename = g_strconcat(gimp_directory(), "/imagemaprc", NULL); out = fopen(filename, "w"); if (out) { @@ -171,6 +178,10 @@ preferences_save(PreferencesData_t *data) (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); @@ -199,6 +210,7 @@ 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; @@ -220,6 +232,14 @@ preferences_ok_cb(gpointer data) 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); + *colors = param->new_colors; gdk_gc_set_foreground(old_data->normal_gc, &colors->normal_fg); @@ -446,6 +466,33 @@ create_general_tab(PreferencesDialog_t *data, GtkWidget *notebook) gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); } +static void +create_menu_tab(PreferencesDialog_t *data, GtkWidget *notebook) +{ + GtkWidget *table; + GtkWidget *label; + GtkWidget *vbox; + + vbox = gtk_vbox_new(FALSE, 1); + gtk_widget_show(vbox); + + table = gtk_table_new(2, 2, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(table), 10); + gtk_table_set_row_spacings(GTK_TABLE(table), 10); + gtk_table_set_col_spacings(GTK_TABLE(table), 10); + gtk_widget_show(table); + + create_label_in_table(table, 0, 0, "Number of Undo levels (1 - 99):"); + data->undo_levels = create_spin_button_in_table(table, 0, 1, 1, 1, 99); + + create_label_in_table(table, 1, 0, "Number of MRU entries (1 - 16):"); + data->mru_size = create_spin_button_in_table(table, 1, 1, 1, 1, 16); + + label = gtk_label_new("Menu"); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); +} + static GtkWidget* create_color_field(PreferencesDialog_t *data, GtkWidget *table, gint row, gint col, GtkSignalFunc func) @@ -498,7 +545,7 @@ static void switch_page(GtkWidget *widget, GtkNotebookPage *page, gint page_num, gpointer data) { - if (page_num == 1) { + if (page_num == 2) { PreferencesDialog_t *param = (PreferencesDialog_t*) data; set_button_colors(param, ¶m->old_colors); } @@ -523,6 +570,7 @@ create_preferences_dialog() gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog->dialog)->vbox), notebook, TRUE, TRUE, 10); create_general_tab(data, notebook); + create_menu_tab(data, notebook); create_colors_tab(data, notebook); gtk_widget_show(notebook); @@ -566,5 +614,10 @@ do_preferences_dialog(void) 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); + default_dialog_show(dialog->dialog); } diff --git a/plug-ins/imagemap/imap_preferences.h b/plug-ins/imagemap/imap_preferences.h index 7a886fa9cb..ecc1059409 100644 --- a/plug-ins/imagemap/imap_preferences.h +++ b/plug-ins/imagemap/imap_preferences.h @@ -41,6 +41,7 @@ typedef struct { gboolean keep_circles_round; gboolean show_url_tip; gboolean use_doublesized; + gint undo_levels; gint mru_size; ColorSelData_t colors; GdkGC *normal_gc; @@ -59,6 +60,10 @@ typedef struct { 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; diff --git a/plug-ins/imagemap/imap_preview.c b/plug-ins/imagemap/imap_preview.c index a3b8a7800c..fc4edddeeb 100644 --- a/plug-ins/imagemap/imap_preview.c +++ b/plug-ins/imagemap/imap_preview.c @@ -23,10 +23,10 @@ #include "libgimp/gimp.h" +#include "imap_cmd_edit_object.h" #include "imap_grid.h" #include "imap_main.h" #include "imap_preview.h" -#include "imap_rectangle.h" #define PREVIEW_MASK GDK_EXPOSURE_MASK | \ GDK_MOTION_NOTIFY | \ @@ -338,13 +338,43 @@ preview_zoom(Preview_t *preview, gint zoom_factor) preview_redraw(preview); } -void +GdkCursorType preview_set_cursor(Preview_t *preview, GdkCursorType cursor_type) { + GdkCursorType prev_cursor = preview->cursor; GdkCursor *cursor = gdk_cursor_new(cursor_type); gdk_window_set_cursor(preview->window->window, cursor); gdk_cursor_destroy(cursor); gdk_flush(); + preview->cursor = cursor_type; + return prev_cursor; +} + +static GtkTargetEntry target_table[] = { + {"STRING", 0, 1 }, + {"text/plain", 0, 2 } +}; + +static void +handle_drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y, + GtkSelectionData *data, guint info, guint time) +{ + gboolean success = FALSE; + if (data->length >= 0 && data->format == 8) { + ObjectList_t *list = get_shapes(); + Object_t *obj; + + x = get_real_coord(x); + y = get_real_coord(y); + obj = object_list_find(list, x, y); + if (obj && !obj->locked) { + command_list_add(edit_object_command_new(obj)); + object_set_url(obj, data->data); + object_emit_update_signal(obj); + success = TRUE; + } + } + gtk_drag_finish(context, success, FALSE, time); } Preview_t* @@ -367,6 +397,12 @@ make_preview(GDrawable *drawable) (GtkSignalFunc) preview_expose, data); + /* Handle drop of links in preview widget */ + gtk_drag_dest_set(preview, GTK_DEST_DEFAULT_ALL, target_table, + 2, GDK_ACTION_COPY); + gtk_signal_connect(GTK_OBJECT(preview), "drag_data_received", + GTK_SIGNAL_FUNC(handle_drop), NULL); + data->width = gimp_drawable_width(drawable->id); data->height = gimp_drawable_height(drawable->id); gtk_preview_size(GTK_PREVIEW(preview), data->width, data->height); diff --git a/plug-ins/imagemap/imap_preview.h b/plug-ins/imagemap/imap_preview.h index a7aa329516..e734ae77e8 100644 --- a/plug-ins/imagemap/imap_preview.h +++ b/plug-ins/imagemap/imap_preview.h @@ -38,6 +38,8 @@ typedef struct { gint height; gint exp_id; GPixelRgn src_rgn; + + GdkCursorType cursor; } Preview_t; Preview_t *make_preview(GDrawable *drawable); @@ -52,6 +54,7 @@ gint preview_get_width(GtkWidget *preview); gint preview_get_height(GtkWidget *preview); void preview_zoom(Preview_t *preview, gint zoom_factor); -void preview_set_cursor(Preview_t *preview, GdkCursorType cursor_type); +GdkCursorType preview_set_cursor(Preview_t *preview, + GdkCursorType cursor_type); #endif /* _IMAP_PREVIEW_H */ diff --git a/plug-ins/imagemap/imap_rectangle.c b/plug-ins/imagemap/imap_rectangle.c index 4de9a169d8..d786f2d4a2 100644 --- a/plug-ins/imagemap/imap_rectangle.c +++ b/plug-ins/imagemap/imap_rectangle.c @@ -21,6 +21,7 @@ * */ +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_misc.h" #include "imap_object_popup.h" @@ -31,7 +32,7 @@ static gboolean rectangle_is_valid(Object_t *obj); static Object_t *rectangle_clone(Object_t *obj); -static Object_t *rectangle_assign(Object_t *obj, Object_t *des); +static void rectangle_assign(Object_t *obj, Object_t *des); static void rectangle_normalize(Object_t *obj); static void rectangle_draw(Object_t *obj, GdkWindow *window, GdkGC* gc); static void rectangle_draw_sashes(Object_t *obj, GdkWindow *window, GdkGC* gc); @@ -42,7 +43,7 @@ static void rectangle_get_dimensions(Object_t *obj, gint *x, gint *y, static void rectangle_resize(Object_t *obj, gint percentage_x, gint percentage_y); static void rectangle_move(Object_t *obj, gint dx, gint dy); -static gpointer rectangle_create_info_tab(GtkWidget *notebook); +static gpointer rectangle_create_info_widget(GtkWidget *frame); static void rectangle_fill_info_tab(Object_t *obj, gpointer data); static void rectangle_set_initial_focus(Object_t *obj, gpointer data); static void rectangle_update(Object_t *obj, gpointer data); @@ -55,6 +56,7 @@ static void rectangle_write_ncsa(Object_t *obj, gpointer param, static char** rectangle_get_icon_data(void); static ObjectClass_t rectangle_class = { + N_("Rectangle"), NULL, /* info_dialog */ NULL, /* icon */ NULL, /* mask */ @@ -71,7 +73,8 @@ static ObjectClass_t rectangle_class = { rectangle_get_dimensions, rectangle_resize, rectangle_move, - rectangle_create_info_tab, + rectangle_create_info_widget, + rectangle_fill_info_tab, /* rectangle_update_info_widget */ rectangle_fill_info_tab, rectangle_set_initial_focus, rectangle_update, @@ -128,7 +131,7 @@ rectangle_clone(Object_t *obj) return &clone->obj; } -static Object_t* +static void rectangle_assign(Object_t *obj, Object_t *des) { Rectangle_t *src_rectangle = ObjectToRectangle(obj); @@ -137,7 +140,6 @@ rectangle_assign(Object_t *obj, Object_t *des) des_rectangle->y = src_rectangle->y; des_rectangle->width = src_rectangle->width; des_rectangle->height = src_rectangle->height; - return object_copy(obj, des); } static void @@ -317,58 +319,81 @@ typedef struct { GtkWidget *height; } RectangleProperties_t; -#ifdef _NOT_READY_YET_ static void x_changed_cb(GtkWidget *widget, gpointer data) { Object_t *obj = ((RectangleProperties_t*) data)->obj; gint x = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); ObjectToRectangle(obj)->x = x; - object_emit_changed_signal(obj); + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +y_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((RectangleProperties_t*) data)->obj; + gint y = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToRectangle(obj)->y = y; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +width_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((RectangleProperties_t*) data)->obj; + gint width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToRectangle(obj)->width = width; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); +} + +static void +height_changed_cb(GtkWidget *widget, gpointer data) +{ + Object_t *obj = ((RectangleProperties_t*) data)->obj; + gint height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + ObjectToRectangle(obj)->height = height; + edit_area_info_dialog_emit_geometry_signal(obj->class->info_dialog); } -#endif static gpointer -rectangle_create_info_tab(GtkWidget *notebook) +rectangle_create_info_widget(GtkWidget *frame) { RectangleProperties_t *props = g_new(RectangleProperties_t, 1); - GtkWidget *vbox, *table, *label; + GtkWidget *table; gint max_width = get_image_width(); gint max_height = get_image_height(); - vbox = gtk_vbox_new(FALSE, 1); - gtk_widget_show(vbox); - - table = gtk_table_new(5, 3, FALSE); - gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + table = gtk_table_new(4, 3, FALSE); + gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_set_border_width(GTK_CONTAINER(table), 10); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_widget_show(table); - create_label_in_table(table, 0, 0, "Upper left x:"); + create_label_in_table(table, 0, 0, _("Upper left x:")); props->x = create_spin_button_in_table(table, 0, 1, 1, 0, max_width - 1); -/* gtk_signal_connect(GTK_OBJECT(props->x), "changed", - (GtkSignalFunc) x_changed_cb, (gpointer) props); */ - create_label_in_table(table, 0, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->x), "changed", + (GtkSignalFunc) x_changed_cb, (gpointer) props); + create_label_in_table(table, 0, 2, _("pixels")); - create_label_in_table(table, 1, 0, "Upper left y:"); + create_label_in_table(table, 1, 0, _("Upper left y:")); props->y = create_spin_button_in_table(table, 1, 1, 1, 0, max_height - 1); - create_label_in_table(table, 1, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->y), "changed", + (GtkSignalFunc) y_changed_cb, (gpointer) props); + create_label_in_table(table, 1, 2, _("pixels")); - create_label_in_table(table, 2, 0, "Width:"); + create_label_in_table(table, 2, 0, _("Width:")); props->width = create_spin_button_in_table(table, 2, 1, 1, 1, max_width); - create_label_in_table(table, 2, 2, "pixels"); + gtk_signal_connect(GTK_OBJECT(props->width), "changed", + (GtkSignalFunc) width_changed_cb, (gpointer) props); + create_label_in_table(table, 2, 2, _("pixels")); - create_label_in_table(table, 3, 0, "Height:"); + create_label_in_table(table, 3, 0, _("Height:")); props->height = create_spin_button_in_table(table, 3, 1, 1, 1, max_height); - create_label_in_table(table, 3, 2, "pixels"); - -/* create_check_button_in_table(table, 4, 0, "Preview");*/ - - label = gtk_label_new("Rectangle"); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); + gtk_signal_connect(GTK_OBJECT(props->height), "changed", + (GtkSignalFunc) height_changed_cb, (gpointer) props); + create_label_in_table(table, 3, 2, _("pixels")); return props; } diff --git a/plug-ins/imagemap/imap_selection.c b/plug-ins/imagemap/imap_selection.c index 20fab253c2..f0e18abd31 100644 --- a/plug-ins/imagemap/imap_selection.c +++ b/plug-ins/imagemap/imap_selection.c @@ -23,10 +23,12 @@ #include +#include "imap_cmd_edit_object.h" #include "imap_cmd_select.h" #include "imap_cmd_unselect.h" #include "imap_cmd_unselect_all.h" #include "imap_edit_area_info.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_misc.h" #include "imap_selection.h" @@ -62,14 +64,16 @@ select_row_cb(GtkWidget *widget, gint row, gint column, GdkEventButton *event, { data->selected_child = widget; data->selected_row = row; - + set_buttons(data); if (data->select_lock) { data->select_lock = FALSE; } else { Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(data->list), row); Command_t *command; - if (event->state & GDK_SHIFT_MASK) { + /* Note: event can be NULL if select_row_cb is called as a result of + a key press! */ + if (event && event->state & GDK_SHIFT_MASK) { command = select_command_new(obj); } else { Command_t *sub_command; @@ -104,6 +108,39 @@ unselect_row_cb(GtkWidget *widget, gint row, gint column, set_buttons(data); } +static void +row_move_cb(GtkWidget *widget, gint src, gint des) +{ + printf("move: %d %d\n", src, des); +} + +static gboolean doubleclick; + +static void +button_press_cb(GtkWidget *widget, GdkEventButton *event, Selection_t *data) +{ + if (event->button == 1) { + if (doubleclick) { + gint row, column; + doubleclick = FALSE; + if (gtk_clist_get_selection_info(GTK_CLIST(widget), (gint) event->x, + (gint) event->y, &row, &column)) { + Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(data->list), row); + object_edit(obj, TRUE); + } + } else { + doubleclick = TRUE; + } + } +} + +static void +button_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + if (event->button == 1) + doubleclick = FALSE; +} + static void selection_command(GtkWidget *widget, gpointer data) { @@ -264,6 +301,32 @@ toggle_order(GtkWidget *widget, gint column, gpointer data) /* Fix me! */ } +static GtkTargetEntry target_table[] = { + {"STRING", 0, 1 }, + {"text/plain", 0, 2 } +}; + +static void +handle_drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y, + GtkSelectionData *data, guint info, guint time) +{ + gboolean success = FALSE; + if (data->length >= 0 && data->format == 8) { + gint row, column; + if (gtk_clist_get_selection_info(GTK_CLIST(widget), x, y, &row, + &column)) { + Object_t *obj = gtk_clist_get_row_data(GTK_CLIST(widget), row + 1); + if (!obj->locked) { + command_list_add(edit_object_command_new(obj)); + object_set_url(obj, data->data); + object_emit_update_signal(obj); + success = TRUE; + } + } + } + gtk_drag_finish(context, success, FALSE, time); +} + Selection_t* make_selection(GtkWidget *window, ObjectList_t *object_list) { @@ -271,7 +334,7 @@ make_selection(GtkWidget *window, ObjectList_t *object_list) GtkWidget *swin, *frame, *hbox; GtkWidget *toolbar; GtkWidget *list; - gchar *titles[] = {"#", "URL", "Target", "Comment"}; + gchar *titles[] = {"#", N_("URL"), N_("Target"), N_("Comment")}; data->object_list = object_list; data->selected_child = NULL; @@ -292,21 +355,20 @@ make_selection(GtkWidget *window, ObjectList_t *object_list) gtk_container_add(GTK_CONTAINER(hbox), toolbar); /* Create selection */ - frame = gtk_frame_new("Selection"); + frame = gtk_frame_new(_("Selection")); gtk_container_set_border_width(GTK_CONTAINER(frame), 10); gtk_container_add(GTK_CONTAINER(hbox), frame); gtk_widget_show(frame); data->list = list = gtk_clist_new_with_titles(4, titles); + GTK_WIDGET_UNSET_FLAGS(data->list, GTK_CAN_FOCUS); gtk_clist_column_titles_passive(GTK_CLIST(list)); gtk_clist_column_title_active(GTK_CLIST(list), 0); gtk_clist_set_column_width(GTK_CLIST(list), 0, 16); gtk_clist_set_column_width(GTK_CLIST(list), 1, 80); gtk_clist_set_column_width(GTK_CLIST(list), 2, 64); gtk_clist_set_column_width(GTK_CLIST(list), 3, 64); - - gtk_signal_connect(GTK_OBJECT(list), "click_column", - GTK_SIGNAL_FUNC(toggle_order), (gpointer) data); + gtk_clist_set_reorderable(GTK_CLIST(list), TRUE); /* Create scrollable window */ swin = gtk_scrolled_window_new(NULL, NULL); @@ -315,19 +377,35 @@ make_selection(GtkWidget *window, ObjectList_t *object_list) gtk_widget_show(swin); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), list); - - gtk_object_set_user_data(GTK_OBJECT(list), data); gtk_widget_show(list); + /* Drop support */ + gtk_drag_dest_set(list, GTK_DEST_DEFAULT_ALL, target_table, + 2, GDK_ACTION_COPY); + gtk_signal_connect(GTK_OBJECT(list), "drag_data_received", + GTK_SIGNAL_FUNC(handle_drop), NULL); + + /* Callbacks we are interested in */ + gtk_signal_connect(GTK_OBJECT(list), "click_column", + GTK_SIGNAL_FUNC(toggle_order), data); gtk_signal_connect(GTK_OBJECT(list), "select_row", GTK_SIGNAL_FUNC(select_row_cb), data); gtk_signal_connect(GTK_OBJECT(list), "unselect_row", GTK_SIGNAL_FUNC(unselect_row_cb), data); + gtk_signal_connect(GTK_OBJECT(list), "row_move", + GTK_SIGNAL_FUNC(row_move_cb), data); + + /* For handling doubleclick */ + gtk_signal_connect(GTK_OBJECT(list), "button_press_event", + GTK_SIGNAL_FUNC(button_press_cb), data); + gtk_signal_connect(GTK_OBJECT(list), "button_release_event", + GTK_SIGNAL_FUNC(button_release_cb), data); + gtk_clist_set_selection_mode(GTK_CLIST(list), GTK_SELECTION_MULTIPLE); set_buttons(data); - /* Set callbacks we're interested in */ + /* Set object list callbacks we're interested in */ object_list_add_add_cb(object_list, object_added_cb, data); object_list_add_update_cb(object_list, object_updated_cb, data); object_list_add_remove_cb(object_list, object_removed_cb, data); diff --git a/plug-ins/imagemap/imap_settings.c b/plug-ins/imagemap/imap_settings.c index f4862b1c7d..113700062d 100644 --- a/plug-ins/imagemap/imap_settings.c +++ b/plug-ins/imagemap/imap_settings.c @@ -22,6 +22,7 @@ */ #include "imap_browse.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_settings.h" #include "imap_string.h" @@ -63,7 +64,7 @@ make_settings_dialog() DefaultDialog_t *dialog; GSList *group; - dialog = data->dialog = make_default_dialog("Settings for this Mapfile"); + dialog = data->dialog = make_default_dialog(_("Settings for this Mapfile")); default_dialog_set_ok_cb(dialog, settings_ok_cb, (gpointer) data); table = gtk_table_new(9, 3, FALSE); @@ -74,21 +75,21 @@ make_settings_dialog() gtk_container_set_border_width(GTK_CONTAINER(table), 10); gtk_widget_show(table); - create_label_in_table(table, 0, 0, "Filename:"); + create_label_in_table(table, 0, 0, _("Filename:")); data->filename = create_label_in_table(table, 0, 1, ""); - create_label_in_table(table, 1, 0, "Image name:"); - data->imagename = browse_widget_new("Select Image File"); + create_label_in_table(table, 1, 0, _("Image name:")); + data->imagename = browse_widget_new(_("Select Image File")); gtk_table_attach_defaults(GTK_TABLE(table), data->imagename->hbox, 1, 2, 1, 2); - create_label_in_table(table, 2, 0, "Title:"); + create_label_in_table(table, 2, 0, _("Title:")); data->title = create_entry_in_table(table, 2, 1); - create_label_in_table(table, 3, 0, "Author:"); + create_label_in_table(table, 3, 0, _("Author:")); data->author = create_entry_in_table(table, 3, 1); - create_label_in_table(table, 4, 0, "Default URL:"); + create_label_in_table(table, 4, 0, _("Default URL:")); data->default_url = create_entry_in_table(table, 4, 1); - create_label_in_table(table, 5, 0, "Description:"); + create_label_in_table(table, 5, 0, _("Description:")); data->description = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(data->description), TRUE); @@ -103,7 +104,7 @@ make_settings_dialog() GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show(vscrollbar); - frame = gtk_frame_new("Map file format"); + frame = gtk_frame_new(_("Map file format")); gtk_widget_show(frame); gtk_table_attach_defaults(GTK_TABLE(table), frame, 1, 2, 9, 10); hbox = gtk_hbox_new(FALSE, 1); @@ -144,7 +145,7 @@ do_settings_dialog(void) dialog = make_settings_dialog(); gtk_label_set_text(GTK_LABEL(dialog->filename), - (filename) ? filename : ""); + (filename) ? filename : _("")); browse_widget_set_filename(dialog->imagename, info->image_name); gtk_entry_set_text(GTK_ENTRY(dialog->title), info->title); gtk_entry_set_text(GTK_ENTRY(dialog->author), info->author); @@ -164,3 +165,4 @@ do_settings_dialog(void) gtk_text_insert(GTK_TEXT(dialog->description), NULL, NULL, NULL, info->description, -1); } + diff --git a/plug-ins/imagemap/imap_source.c b/plug-ins/imagemap/imap_source.c index cd72fcdca2..deabd268e6 100644 --- a/plug-ins/imagemap/imap_source.c +++ b/plug-ins/imagemap/imap_source.c @@ -25,6 +25,7 @@ #include #include "imap_default_dialog.h" +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_source.h" @@ -50,7 +51,7 @@ do_source_dialog(void) if (!dialog) { GtkWidget *window; - dialog = make_default_dialog("View Source"); + dialog = make_default_dialog(_("View Source")); default_dialog_hide_cancel_button(dialog); default_dialog_hide_apply_button(dialog); diff --git a/plug-ins/imagemap/imap_statusbar.c b/plug-ins/imagemap/imap_statusbar.c index 20c1ced5ce..93ad0dfd96 100644 --- a/plug-ins/imagemap/imap_statusbar.c +++ b/plug-ins/imagemap/imap_statusbar.c @@ -60,6 +60,7 @@ make_statusbar(GtkWidget *main_vbox, GtkWidget *window) statusbar->xy = gtk_entry_new(); gtk_widget_set_usize(statusbar->xy, 64, -1); gtk_entry_set_editable(GTK_ENTRY(statusbar->xy), FALSE); + GTK_WIDGET_UNSET_FLAGS(statusbar->xy, GTK_CAN_FOCUS); gtk_box_pack_start(GTK_BOX(hbox), statusbar->xy, FALSE, FALSE, 0); gtk_widget_show(statusbar->xy); @@ -74,6 +75,7 @@ make_statusbar(GtkWidget *main_vbox, GtkWidget *window) statusbar->dimension = gtk_entry_new(); gtk_widget_set_usize(statusbar->dimension, 64, -1); gtk_entry_set_editable(GTK_ENTRY(statusbar->dimension), FALSE); + GTK_WIDGET_UNSET_FLAGS(statusbar->dimension, GTK_CAN_FOCUS); gtk_box_pack_start(GTK_BOX(hbox), statusbar->dimension, FALSE, FALSE, 0); gtk_widget_show(statusbar->dimension); diff --git a/plug-ins/imagemap/imap_string.c b/plug-ins/imagemap/imap_string.c index 5f04e38185..0b78b0dc47 100644 --- a/plug-ins/imagemap/imap_string.c +++ b/plug-ins/imagemap/imap_string.c @@ -26,7 +26,10 @@ gchar* g_strreplace(gchar **old_str, const gchar *new_str) { - g_free(*old_str); - return *old_str = g_strdup(new_str); + if (*old_str != new_str) { + g_free(*old_str); + *old_str = g_strdup(new_str); + } + return *old_str; } diff --git a/plug-ins/imagemap/imap_taglist.c b/plug-ins/imagemap/imap_taglist.c new file mode 100644 index 0000000000..860360ee14 --- /dev/null +++ b/plug-ins/imagemap/imap_taglist.c @@ -0,0 +1,122 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#include +#include "imap_string.h" +#include "imap_taglist.h" + +static Tag_t* +tag_create(const gchar *name, const gchar *value) +{ + Tag_t *tag = g_new(Tag_t, 1); + tag->name = g_strdup(name); + tag->value = g_strdup(value); + return tag; +} + +static Tag_t* +tag_clone(Tag_t *src) +{ + return tag_create(src->name, src->value); +} + +static void +tag_destruct(Tag_t *tag) +{ + g_free(tag->name); + g_free(tag->value); + g_free(tag); +} + +static void +tag_write(Tag_t *tag) +{ + printf("\"%s\"=\"%s\"\n", tag->name, tag->value); +} + +TagList_t* +taglist_create(void) +{ + TagList_t *tlist = g_new(TagList_t, 1); + tlist->list = NULL; + return tlist; +} + +TagList_t* +taglist_clone(TagList_t *src) +{ + return taglist_copy(src, taglist_create()); +} + +static void +taglist_remove_all(TagList_t *tlist) +{ + GList *p; + for (p = tlist->list; p; p = p->next) + tag_destruct((Tag_t*) p->data); + g_list_free(tlist->list); + tlist->list = NULL; +} + +TagList_t* +taglist_copy(TagList_t *src, TagList_t *des) +{ + GList *p; + + taglist_remove_all(des); + for (p = src->list; p; p = p->next) + des->list = g_list_append(des->list, tag_clone((Tag_t*) p->data)); + return des; +} + +void +taglist_destruct(TagList_t *tlist) +{ + taglist_remove_all(tlist); + g_free(tlist); +} + +void +taglist_set(TagList_t *tlist, const gchar *name, const gchar *value) +{ + GList *p; + Tag_t *tag; + + for (p = tlist->list; p; p = p->next) { + tag = (Tag_t*) p->data; + if (!g_strcasecmp(tag->name, name)) { + g_strreplace(&tag->value, value); + return; + } + } + /* Tag not found, add a new tag */ + tlist->list = g_list_append(tlist->list, tag_create(name, value)); +} + +void +taglist_write(TagList_t *tlist) +{ + GList *p; + for (p = tlist->list; p; p = p->next) + tag_write((Tag_t*) p->data); +} diff --git a/plug-ins/imagemap/imap_taglist.h b/plug-ins/imagemap/imap_taglist.h new file mode 100755 index 0000000000..3c93a1ccbb --- /dev/null +++ b/plug-ins/imagemap/imap_taglist.h @@ -0,0 +1,45 @@ +/* + * This is a plug-in for the GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.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 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. + * + */ + +#ifndef _IMAP_TAGLIST_H +#define _IMAP_TAGLIST_H + +#include + +typedef struct { + gchar *name; + gchar *value; +} Tag_t; + +typedef struct { + GList *list; +} TagList_t; + +TagList_t *taglist_create(void); +TagList_t *taglist_clone(TagList_t *src); +TagList_t *taglist_copy(TagList_t *src, TagList_t *des); +void taglist_destruct(TagList_t *tlist); +void taglist_set(TagList_t *tlist, const gchar *id, const gchar *value); +void taglist_write(TagList_t *tlist); + +#endif /* _IMAP_TAGLIST_H */ diff --git a/plug-ins/imagemap/imap_toolbar.c b/plug-ins/imagemap/imap_toolbar.c index cd8191e445..9344484c31 100644 --- a/plug-ins/imagemap/imap_toolbar.c +++ b/plug-ins/imagemap/imap_toolbar.c @@ -21,6 +21,7 @@ * */ +#include "libgimp/stdplugins-intl.h" #include "imap_main.h" #include "imap_misc.h" #include "imap_toolbar.h" @@ -107,59 +108,60 @@ make_toolbar(GtkWidget *main_vbox, GtkWidget *window) gtk_container_add(GTK_CONTAINER(handlebox), toolbar); make_toolbar_icon(toolbar, window, open_xpm, "Open", - "Open", toolbar_command, &data->cmd_open); - make_toolbar_icon(toolbar, window, save_xpm, "Save", + _("Open"), toolbar_command, &data->cmd_open); + make_toolbar_icon(toolbar, window, save_xpm, _("Save"), "Save", toolbar_command, &data->cmd_save); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); make_toolbar_icon(toolbar, window, preferences_xpm, "Preferences", - "Preferences", toolbar_command, &data->cmd_preferences); + _("Preferences"), toolbar_command, + &data->cmd_preferences); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); data->undo = make_toolbar_icon(toolbar, window, undo_xpm, "Undo", - "Undo", toolbar_command, &data->cmd_undo); + _("Undo"), toolbar_command, &data->cmd_undo); gtk_widget_set_sensitive(data->undo, FALSE); data->redo = make_toolbar_icon(toolbar, window, redo_xpm, "Redo", - "Redo", toolbar_command, &data->cmd_redo); + _("Redo"), toolbar_command, &data->cmd_redo); gtk_widget_set_sensitive(data->redo, FALSE); command_list_add_update_cb(command_list_changed, data); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); data->cut = make_toolbar_icon(toolbar, window, cut_xpm, "Cut", - "Cut", toolbar_command, &data->cmd_cut); + _("Cut"), toolbar_command, &data->cmd_cut); gtk_widget_set_sensitive(data->cut, FALSE); data->copy = make_toolbar_icon(toolbar, window, copy_xpm, "Copy", - "Copy", toolbar_command, &data->cmd_copy); + _("Copy"), toolbar_command, &data->cmd_copy); gtk_widget_set_sensitive(data->copy, FALSE); paste = make_toolbar_icon(toolbar, window, paste_xpm, "Paste", - "Paste", toolbar_command, &data->cmd_paste); + _("Paste"), toolbar_command, &data->cmd_paste); gtk_widget_set_sensitive(paste, FALSE); paste_buffer_add_add_cb(paste_buffer_added, (gpointer) paste); paste_buffer_add_remove_cb(paste_buffer_removed, (gpointer) paste); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); data->zoom_in = make_toolbar_icon(toolbar, window, zoom_in_xpm, "ZoomIn", - "Zoom in", toolbar_command, + _("Zoom in"), toolbar_command, &data->cmd_zoom_in); data->zoom_out = make_toolbar_icon(toolbar, window, zoom_out_xpm, "ZoomOut", - "Zoom out", toolbar_command, + _("Zoom out"), toolbar_command, &data->cmd_zoom_out); gtk_widget_set_sensitive(data->zoom_out, FALSE); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); make_toolbar_icon(toolbar, window, map_info_xpm, "EditMapInfo", - "Edit Map Info", toolbar_command, + _("Edit Map Info"), toolbar_command, &data->cmd_edit_map_info); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); data->to_front = make_toolbar_icon(toolbar, window, to_front_xpm, "ToFront", - "Move To Front", toolbar_command, + _("Move To Front"), toolbar_command, &data->cmd_move_to_front); gtk_widget_set_sensitive(data->to_front, FALSE); data->to_back = make_toolbar_icon(toolbar, window, to_back_xpm, "ToBack", - "Send To Back", toolbar_command, + _("Send To Back"), toolbar_command, &data->cmd_send_to_back); gtk_widget_set_sensitive(data->to_back, FALSE); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); data->grid = make_toolbar_toggle_icon(toolbar, window, grid_xpm, "Grid", - "Grid", toolbar_command, + _("Grid"), toolbar_command, &data->cmd_grid); gtk_widget_show(toolbar); diff --git a/plug-ins/imagemap/imap_tools.c b/plug-ins/imagemap/imap_tools.c index 6b7a4b9609..6709420013 100644 --- a/plug-ins/imagemap/imap_tools.c +++ b/plug-ins/imagemap/imap_tools.c @@ -24,6 +24,7 @@ #include "imap_circle.h" #include "imap_edit_area_info.h" #include "imap_main.h" +#include "libgimp/stdplugins-intl.h" #include "imap_menu.h" #include "imap_misc.h" #include "imap_polygon.h" @@ -125,27 +126,27 @@ make_tools(GtkWidget *window) gtk_container_add(GTK_CONTAINER(handlebox), toolbar); _tools.arrow = make_toolbar_radio_icon(toolbar, window, NULL, arrow_xpm, - "Select", "Select existing area", + "Select", _("Select existing area"), arrow_clicked, NULL); _tools.rectangle = make_toolbar_radio_icon(toolbar, window, _tools.arrow, rectangle_xpm, "Rectangle", - "Define Rectangle area", + _("Define Rectangle area"), rectangle_clicked, NULL); _tools.circle = make_toolbar_radio_icon(toolbar, window, _tools.rectangle, circle_xpm, "Circle", - "Define Circle/Oval area", + _("Define Circle/Oval area"), circle_clicked, NULL); _tools.polygon = make_toolbar_radio_icon(toolbar, window, _tools.circle, polygon_xpm, "Polygon", - "Define Polygon area", + _("Define Polygon area"), polygon_clicked, NULL); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); _tools.edit = make_toolbar_icon(toolbar, window, edit_xpm, "Edit", - "Edit selected area info", tools_command, + _("Edit selected area info"), tools_command, &_tools.cmd_edit); gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); _tools.delete = make_toolbar_icon(toolbar, window, delete_xpm, "Delete", - "Delete selected area", tools_command, + _("Delete selected area"), tools_command, &_tools.cmd_delete); gtk_widget_show(toolbar); diff --git a/po-plug-ins/ChangeLog b/po-plug-ins/ChangeLog index 279e9c3e73..036072577e 100644 --- a/po-plug-ins/ChangeLog +++ b/po-plug-ins/ChangeLog @@ -1,7 +1,11 @@ +Sun Oct 24 22:52:01 MEST 1999 Sven Neumann + + * POTFILES.in: added imagemap plug-in + Sun Oct 24 18:58:16 MEST 1999 Sven Neumann * de.po: Checked in first german version - (done by Felix Natter + (done by Felix Natter and Daniel Eggert ) 1999-10-21 Kjartan Maraas diff --git a/po-plug-ins/POTFILES.in b/po-plug-ins/POTFILES.in index 72c4282df9..96f1a638f5 100644 --- a/po-plug-ins/POTFILES.in +++ b/po-plug-ins/POTFILES.in @@ -3,20 +3,20 @@ plug-ins/AlienMap/AlienMap.c plug-ins/AlienMap2/AlienMap2.c -plug-ins/common/CEL.c -plug-ins/common/CML_explorer.c plug-ins/Lighting/lighting_main.c plug-ins/Lighting/lighting_ui.c +plug-ins/bmp/bmp.c +plug-ins/bmp/bmpread.c +plug-ins/bmp/bmpwrite.c +plug-ins/borderaverage/borderaverage.c +plug-ins/common/CEL.c +plug-ins/common/CML_explorer.c plug-ins/common/animationplay.c plug-ins/common/animoptimize.c plug-ins/common/apply_lens.c plug-ins/common/autocrop.c plug-ins/common/autostretch_hsv.c plug-ins/common/blur.c -plug-ins/bmp/bmp.c -plug-ins/bmp/bmpread.c -plug-ins/bmp/bmpwrite.c -plug-ins/borderaverage/borderaverage.c plug-ins/common/bumpmap.c plug-ins/common/bz2.c plug-ins/common/c_astretch.c @@ -29,6 +29,21 @@ plug-ins/common/cubism.c plug-ins/common/decompose.c plug-ins/common/depthmerge.c plug-ins/common/destripe.c +plug-ins/common/gif.c +plug-ins/common/gifload.c +plug-ins/common/film.c +plug-ins/common/normalize.c +plug-ins/common/oilify.c +plug-ins/common/png.c +plug-ins/common/ps.c +plug-ins/common/rotate.c +plug-ins/common/rotators.c +plug-ins/common/threshold_alpha.c +plug-ins/common/warp.c +plug-ins/common/xbm.c +plug-ins/common/xpm.c +plug-ins/common/xwd.c +plug-ins/common/zealouscrop.c plug-ins/gap/gap_arr_dialog.c plug-ins/gap/gap_dbbrowser_utils.c plug-ins/gap/gap_filter_foreach.c @@ -43,8 +58,6 @@ plug-ins/gap/gap_range_ops.c plug-ins/gap/gap_resi_dialog.c plug-ins/gap/gap_split.c plug-ins/gap/resize.c -plug-ins/common/gif.c -plug-ins/common/gifload.c plug-ins/gimpressionist/brush.c plug-ins/gimpressionist/color.c plug-ins/gimpressionist/general.c @@ -60,31 +73,54 @@ plug-ins/gimpressionist/preview.c plug-ins/gimpressionist/repaint.c plug-ins/gimpressionist/size.c plug-ins/gimpressionist/sizemap.c -plug-ins/common/guillotine.c -plug-ins/common/jpeg.c -plug-ins/common/lic.c -plug-ins/common/mail.c +plug-ins/imagemap/imap_about.c +plug-ins/imagemap/imap_circle.c +plug-ins/imagemap/imap_cmd_clear.c +plug-ins/imagemap/imap_cmd_copy.c +plug-ins/imagemap/imap_cmd_copy_object.c +plug-ins/imagemap/imap_cmd_create.c +plug-ins/imagemap/imap_cmd_cut.c +plug-ins/imagemap/imap_cmd_cut_object.c +plug-ins/imagemap/imap_cmd_delete.c +plug-ins/imagemap/imap_cmd_delete_point.c +plug-ins/imagemap/imap_cmd_edit_object.c +plug-ins/imagemap/imap_cmd_guides.c +plug-ins/imagemap/imap_cmd_insert_point.c +plug-ins/imagemap/imap_cmd_move.c +plug-ins/imagemap/imap_cmd_move_down.c +plug-ins/imagemap/imap_cmd_move_sash.c +plug-ins/imagemap/imap_cmd_move_up.c +plug-ins/imagemap/imap_cmd_object_down.c +plug-ins/imagemap/imap_cmd_object_up.c +plug-ins/imagemap/imap_cmd_paste.c +plug-ins/imagemap/imap_cmd_select.c +plug-ins/imagemap/imap_cmd_select_all.c +plug-ins/imagemap/imap_cmd_select_region.c +plug-ins/imagemap/imap_cmd_send_to_back.c +plug-ins/imagemap/imap_cmd_unselect.c +plug-ins/imagemap/imap_cmd_unselect_all.c +plug-ins/imagemap/imap_edit_area_info.c +plug-ins/imagemap/imap_file.c +plug-ins/imagemap/imap_grid.c +plug-ins/imagemap/imap_main.c +plug-ins/imagemap/imap_polygon.c +plug-ins/imagemap/imap_rectangle.c +plug-ins/imagemap/imap_selection.c +plug-ins/imagemap/imap_settings.c +plug-ins/imagemap/imap_source.c +plug-ins/imagemap/imap_toolbar.c +plug-ins/imagemap/imap_tools.c +plug-ins/imagemap/imap_cmd_move_selected.c +plug-ins/imagemap/imap_cmd_object_move.c +plug-ins/imagemap/imap_cmd_select_next.c plug-ins/mosaic/mosaic.c -plug-ins/common/normalize.c -plug-ins/common/oilify.c -plug-ins/common/png.c plug-ins/print/print-escp2.c plug-ins/print/print-pcl.c plug-ins/print/print-ps.c plug-ins/print/print.c -plug-ins/common/ps.c -plug-ins/common/rotate.c -plug-ins/common/rotators.c -plug-ins/sel2path/sel2path.c -plug-ins/struc/struc.c -plug-ins/common/threshold_alpha.c -plug-ins/common/warp.c -plug-ins/common/xbm.c -plug-ins/common/xpm.c -plug-ins/common/xwd.c -plug-ins/common/zealouscrop.c plug-ins/script-fu/script-fu-console.c plug-ins/script-fu/script-fu-scripts.c plug-ins/script-fu/script-fu-server.c plug-ins/script-fu/script-fu.c -plug-ins/common/film.c +plug-ins/sel2path/sel2path.c +plug-ins/struc/struc.c