/*
* This is a plug-in for GIMP.
*
* Generates clickable image maps.
*
* Copyright (C) 1998-2006 Maurits Rijk m.rijk@chello.nl
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#include "config.h"
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include "imap_about.h"
#include "imap_circle.h"
#include "imap_file.h"
#include "imap_grid.h"
#include "imap_main.h"
#include "imap_menu.h"
#include "imap_menu_funcs.h"
#include "imap_polygon.h"
#include "imap_preferences.h"
#include "imap_rectangle.h"
#include "imap_settings.h"
#include "imap_stock.h"
#include "imap_source.h"
#include "libgimp/stdplugins-intl.h"
static Menu_t _menu;
static GtkUIManager *ui_manager;
GtkWidget*
menu_get_widget(const gchar *path)
{
return gtk_ui_manager_get_widget (ui_manager, path);
}
static void
set_sensitive (const gchar *path, gboolean sensitive)
{
GtkAction *action = gtk_ui_manager_get_action (ui_manager, path);
g_object_set (action, "sensitive", sensitive, NULL);
}
static void
menu_mru(GtkWidget *widget, gpointer data)
{
MRU_t *mru = get_mru();
char *filename = (char*) data;
if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) {
load(filename);
} else {
do_file_error_dialog(_("Error opening file"), filename);
mru_remove(mru, filename);
menu_build_mru_items(mru);
}
}
void
menu_set_zoom_sensitivity(gint factor)
{
set_sensitive ("/MainMenu/ViewMenu/ZoomIn", factor < 8);
set_sensitive ("/MainMenu/ViewMenu/ZoomOut", factor > 1);
}
void
menu_set_zoom(gint factor)
{
menu_set_zoom_sensitivity (factor);
}
void
menu_shapes_selected(gint count)
{
gboolean sensitive = (count > 0);
set_sensitive ("/MainMenu/EditMenu/Cut", sensitive);
set_sensitive ("/MainMenu/EditMenu/Copy", sensitive);
set_sensitive ("/MainMenu/EditMenu/Clear", sensitive);
set_sensitive ("/MainMenu/EditMenu/EditAreaInfo", sensitive);
set_sensitive ("/MainMenu/EditMenu/DeselectAll", sensitive);
}
static void
command_list_changed(Command_t *command, gpointer data)
{
GtkAction *action;
gchar *label;
action = gtk_ui_manager_get_action (ui_manager, "/MainMenu/EditMenu/Undo");
label = g_strdup_printf (_("_Undo %s"),
command && command->name ? command->name : "");
g_object_set (action,
"label", label,
"sensitive", command != NULL,
NULL);
g_free (label);
command = command_list_get_redo_command();
action = gtk_ui_manager_get_action (ui_manager, "/MainMenu/EditMenu/Redo");
label = g_strdup_printf (_("_Redo %s"),
command && command->name ? command->name : "");
g_object_set (action,
"label", label,
"sensitive", command != NULL,
NULL);
g_free (label);
}
static void
paste_buffer_added(Object_t *obj, gpointer data)
{
set_sensitive("/MainMenu/EditMenu/Paste", TRUE);
}
static void
paste_buffer_removed(Object_t *obj, gpointer data)
{
set_sensitive("/MainMenu/EditMenu/Paste", FALSE);
}
/* Normal items */
static const GtkActionEntry entries[] =
{
{ "FileMenu", NULL,
N_("_File") },
{ "Open", GIMP_ICON_DOCUMENT_OPEN,
N_("_Open..."), NULL, N_("Open"),
do_file_open_dialog},
{ "Save", GIMP_ICON_DOCUMENT_SAVE,
N_("_Save..."), NULL, N_("Save"),
save},
{ "SaveAs", GIMP_ICON_DOCUMENT_SAVE_AS,
N_("Save _As..."), "S", NULL,
do_file_save_as_dialog},
{ "Close", GIMP_ICON_CLOSE, N_("_Close"), "w", NULL, do_close},
{ "Quit", GIMP_ICON_APPLICATION_EXIT,
N_("_Quit"), "q", NULL, do_quit},
{ "EditMenu", NULL, N_("_Edit") },
{ "Undo", GIMP_ICON_EDIT_UNDO,
N_("_Undo"), NULL, N_("Undo"), do_undo},
{ "Redo", GIMP_ICON_EDIT_REDO,
N_("_Redo"), NULL, N_("Redo"), do_redo},
{ "Cut", GIMP_ICON_EDIT_CUT,
N_("Cu_t"), "x", N_("Cut"), do_cut},
{ "Copy", GIMP_ICON_EDIT_COPY,
N_("_Copy"), "c", N_("Copy"), do_copy},
{ "Paste", GIMP_ICON_EDIT_PASTE,
N_("_Paste"), "v", N_("Paste"), do_paste},
{ "Clear", GIMP_ICON_EDIT_DELETE,
N_("_Delete"), NULL, N_("Delete"), do_clear},
{ "SelectAll", NULL,
N_("Select _All"), "A", NULL, do_select_all},
{ "DeselectAll", NULL,
N_("D_eselect All"), "A", NULL,
do_deselect_all},
{ "EditAreaInfo", GIMP_ICON_EDIT
, N_("Edit Area _Info..."), NULL,
N_("Edit selected area info"), do_edit_selected_shape},
{ "Preferences", GIMP_ICON_PREFERENCES_SYSTEM,
N_("_Preferences"), NULL, N_("Preferences"),
do_preferences_dialog},
{ "MoveToFront", IMAP_STOCK_TO_FRONT, "", NULL, N_("Move Area to Front"),
do_move_to_front},
{ "SendToBack", IMAP_STOCK_TO_BACK, "", NULL, N_("Move Area to Bottom"),
do_send_to_back},
{ "DeleteArea", NULL, N_("Delete Area"), NULL, NULL, NULL},
{ "MoveUp", GIMP_ICON_GO_UP, N_("Move Up"), NULL, NULL, NULL},
{ "MoveDown", GIMP_ICON_GO_DOWN, N_("Move Down"), NULL, NULL, NULL},
{ "InsertPoint", NULL, N_("Insert Point"), NULL, NULL, polygon_insert_point},
{ "DeletePoint", NULL, N_("Delete Point"), NULL, NULL, polygon_delete_point},
{ "ViewMenu", NULL, N_("_View") },
{ "Source", NULL, N_("Source..."), NULL, NULL, do_source_dialog},
{ "ZoomIn", GIMP_ICON_ZOOM_IN, N_("Zoom _In"), "plus", N_("Zoom in"), do_zoom_in},
{ "ZoomOut", GIMP_ICON_ZOOM_OUT, N_("Zoom _Out"), "minus", N_("Zoom out"), do_zoom_out},
{ "ZoomToMenu", NULL, N_("_Zoom To") },
{ "MappingMenu", NULL, N_("_Mapping") },
{ "EditMapInfo", GIMP_ICON_DIALOG_INFORMATION, N_("Edit Map Info..."), NULL,
N_("Edit Map Info"), do_settings_dialog},
{ "ToolsMenu", NULL, N_("_Tools") },
{ "GridSettings", NULL, N_("Grid Settings..."), NULL, NULL,
do_grid_settings_dialog},
{ "UseGimpGuides", NULL, N_("Use GIMP Guides..."), NULL, NULL,
do_use_gimp_guides_dialog},
{ "CreateGuides", NULL, N_("Create Guides..."), NULL, NULL,
do_create_guides_dialog},
{ "HelpMenu", NULL, N_("_Help") },
{ "Contents", GIMP_ICON_HELP, N_("_Contents"), NULL, NULL, imap_help},
{ "About", GIMP_ICON_HELP_ABOUT, N_("_About"), NULL, NULL, do_about_dialog},
{ "ZoomMenu", NULL, N_("_Zoom") },
};
/* Toggle items */
static const GtkToggleActionEntry toggle_entries[] = {
{ "AreaList", NULL, N_("Area List"), NULL, NULL, NULL, TRUE },
{ "Grid", GIMP_ICON_GRID, N_("_Grid"), NULL, N_("Grid"), toggle_grid, FALSE }
};
static const GtkRadioActionEntry color_entries[] = {
{ "Color", NULL, N_("Color"), NULL, NULL, 0},
{ "Gray", NULL, N_("Gray"), NULL, NULL, 1},
};
static const GtkRadioActionEntry mapping_entries[] = {
{ "Arrow", GIMP_ICON_CURSOR, N_("Arrow"), NULL,
N_("Select existing area"), 0},
{ "Rectangle", IMAP_STOCK_RECTANGLE, N_("Rectangle"), NULL,
N_("Define Rectangle area"), 1},
{ "Circle", IMAP_STOCK_CIRCLE, N_("Circle"), NULL,
N_("Define Circle/Oval area"), 2},
{ "Polygon", IMAP_STOCK_POLYGON, N_("Polygon"), NULL,
N_("Define Polygon area"), 3},
};
static const GtkRadioActionEntry zoom_entries[] = {
{ "Zoom1:1", NULL, "1:1", NULL, NULL, 0},
{ "Zoom1:2", NULL, "1:2", NULL, NULL, 1},
{ "Zoom1:3", NULL, "1:3", NULL, NULL, 2},
{ "Zoom1:4", NULL, "1:4", NULL, NULL, 3},
{ "Zoom1:5", NULL, "1:5", NULL, NULL, 4},
{ "Zoom1:6", NULL, "1:6", NULL, NULL, 5},
{ "Zoom1:7", NULL, "1:7", NULL, NULL, 6},
{ "Zoom1:8", NULL, "1:8", NULL, NULL, 7},
};
static const gchar ui_description[] =
""
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
" "
" "
""
" "
" "
" "
" "
" "
" "
"";
Menu_t*
make_menu(GtkWidget *main_vbox, GtkWidget *window)
{
GtkWidget *menubar;
GtkActionGroup *action_group;
GtkAccelGroup *accel_group;
GError *error;
action_group = gtk_action_group_new ("MenuActions");
gtk_action_group_set_translation_domain (action_group, NULL);
gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries),
window);
gtk_action_group_add_toggle_actions (action_group, toggle_entries,
G_N_ELEMENTS (toggle_entries), window);
gtk_action_group_add_radio_actions (action_group, color_entries,
G_N_ELEMENTS (color_entries), 0,
G_CALLBACK (set_preview_color), NULL);
gtk_action_group_add_radio_actions (action_group, zoom_entries,
G_N_ELEMENTS (zoom_entries), 0,
G_CALLBACK (set_zoom_factor), NULL);
gtk_action_group_add_radio_actions (action_group, mapping_entries,
G_N_ELEMENTS (mapping_entries), 0,
G_CALLBACK (set_func), window);
ui_manager = gtk_ui_manager_new ();
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
accel_group = gtk_ui_manager_get_accel_group (ui_manager);
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
error = NULL;
if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1,
&error))
{
g_warning ("building menus failed: %s", error->message);
g_error_free (error);
/* exit (EXIT_FAILURE); */
}
menubar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu");
gtk_widget_show (menubar);
gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
paste_buffer_add_add_cb(paste_buffer_added, NULL);
paste_buffer_add_remove_cb(paste_buffer_removed, NULL);
set_sensitive ("/MainMenu/EditMenu/Paste", FALSE);
menu_shapes_selected (0);
menu_set_zoom_sensitivity (1);
command_list_add_update_cb (command_list_changed, NULL);
command_list_changed (NULL, NULL);
return &_menu;
}
void
menu_build_mru_items(MRU_t *mru)
{
GList *p;
gint position = 0;
int i;
return;
if (_menu.nr_off_mru_items) {
GList *children;
children = gtk_container_get_children(GTK_CONTAINER(_menu.open_recent));
p = g_list_nth(children, position);
for (i = 0; i < _menu.nr_off_mru_items; i++, p = p->next) {
gtk_widget_destroy((GtkWidget*) p->data);
}
g_list_free(children);
}
i = 0;
for (p = mru->list; p; p = p->next, i++) {
GtkWidget *item = insert_item_with_label(_menu.open_recent, position++,
(gchar*) p->data,
menu_mru, p->data);
if (i < 9) {
guchar accelerator_key = '1' + i;
add_accelerator(item, accelerator_key, GDK_CONTROL_MASK);
}
}
_menu.nr_off_mru_items = i;
}
void
do_main_popup_menu(GdkEventButton *event)
{
GtkWidget *popup = gtk_ui_manager_get_widget (ui_manager, "/PopupMenu");
gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL,
event->button, event->time);
}
void
menu_check_grid(gboolean check)
{
GtkAction *action = gtk_ui_manager_get_action (ui_manager,
"/MainMenu/ToolsMenu/Grid");
gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), check);
}
GtkWidget*
make_toolbar(GtkWidget *main_vbox, GtkWidget *window)
{
GtkWidget *toolbar;
toolbar = gtk_ui_manager_get_widget (ui_manager, "/Toolbar");
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
gtk_container_set_border_width (GTK_CONTAINER (toolbar), 0);
gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, FALSE, 0);
gtk_widget_show (toolbar);
return toolbar;
}
GtkWidget*
make_tools(GtkWidget *window)
{
GtkWidget *toolbar;
toolbar = gtk_ui_manager_get_widget (ui_manager, "/Tools");
gtk_orientable_set_orientation (GTK_ORIENTABLE (toolbar),
GTK_ORIENTATION_VERTICAL);
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
gtk_container_set_border_width (GTK_CONTAINER (toolbar), 0);
gtk_widget_show (toolbar);
return toolbar;
}
GtkWidget*
make_selection_toolbar(void)
{
GtkWidget *toolbar;
toolbar = gtk_ui_manager_get_widget (ui_manager, "/Selection");
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
gtk_orientable_set_orientation (GTK_ORIENTABLE (toolbar),
GTK_ORIENTATION_VERTICAL);
gtk_container_set_border_width (GTK_CONTAINER (toolbar), 0);
gtk_widget_show (toolbar);
return toolbar;
}