dialogs.c 14.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/* The GIMP -- an image manipulation program
 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
 *
 * 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 "config.h"

#include <gtk/gtk.h>

23 24
#include "libgimpwidgets/gimpwidgets.h"

25
#include "dialogs-types.h"
26

Michael Natterer's avatar
Michael Natterer committed
27
#include "core/gimp.h"
28 29
#include "core/gimpcontext.h"

30
#include "widgets/gimpdialogfactory.h"
31
#include "widgets/gimphelp-ids.h"
32
#include "widgets/gimpmenufactory.h"
33

34 35 36
#include "dialogs.h"
#include "dialogs-constructors.h"

37 38
#include "gimp-intl.h"

39

40 41 42
GimpDialogFactory *global_dialog_factory  = NULL;
GimpDialogFactory *global_dock_factory    = NULL;
GimpDialogFactory *global_toolbox_factory = NULL;
43 44


45
static const GimpDialogFactoryEntry toplevel_entries[] =
46
{
47
  /*  foreign toplevels without constructor  */
48
  { "gimp-brightness-contrast-tool-dialog", NULL, NULL, NULL, NULL,
49
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
50
  { "gimp-color-picker-tool-dialog", NULL, NULL, NULL, NULL,
51
    NULL, 0, TRUE,  TRUE,  TRUE, FALSE },
52
  { "gimp-colorize-tool-dialog", NULL, NULL, NULL, NULL,
53
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
54
  { "gimp-crop-tool-dialog", NULL, NULL, NULL, NULL,
55
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
56
  { "gimp-curves-tool-dialog", NULL, NULL, NULL, NULL,
57
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
58
  { "gimp-color-balance-tool-dialog", NULL, NULL, NULL, NULL,
59
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
60
  { "gimp-hue-saturation-tool-dialog", NULL, NULL, NULL, NULL,
61
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
62
  { "gimp-levels-tool-dialog", NULL, NULL, NULL, NULL,
63
    NULL, 0, TRUE,  TRUE,  TRUE, FALSE },
64
  { "gimp-measure-tool-dialog", NULL, NULL, NULL, NULL,
65
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
66
  { "gimp-posterize-tool-dialog", NULL, NULL, NULL, NULL,
67
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
68
  { "gimp-rotate-tool-dialog", NULL, NULL, NULL, NULL,
69
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
70
  { "gimp-scale-tool-dialog", NULL, NULL, NULL, NULL,
71
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
72
  { "gimp-shear-tool-dialog", NULL, NULL, NULL, NULL,
73
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
74
  { "gimp-text-tool-dialog", NULL, NULL, NULL, NULL,
75
    NULL, 0, TRUE,  TRUE,  TRUE,  FALSE },
76
  { "gimp-threshold-tool-dialog", NULL, NULL, NULL, NULL,
77
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
78
  { "gimp-perspective-tool-dialog", NULL, NULL, NULL, NULL,
79 80
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },

81
  { "gimp-toolbox-color-dialog", NULL, NULL, NULL, NULL,
82
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
83
  { "gimp-gradient-editor-color-dialog", NULL, NULL, NULL, NULL,
84
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },
85
  { "gimp-palette-editor-color-dialog", NULL, NULL, NULL, NULL,
86 87
    NULL, 0, TRUE,  TRUE,  FALSE, FALSE },

88
  { "gimp-colormap-editor-color-dialog", NULL, NULL, NULL, NULL,
89 90
    NULL, 0, FALSE, TRUE,  FALSE, FALSE },

91
  /*  ordinary toplevels  */
92 93 94 95 96 97 98 99 100 101 102 103
  { "gimp-image-new-dialog", NULL, NULL, NULL, NULL,
    dialogs_image_new_new, 0,
    FALSE, TRUE,  FALSE, FALSE },
  { "gimp-file-open-dialog", NULL, NULL, NULL, NULL,
    dialogs_file_open_new, 0,
    TRUE,  TRUE,  TRUE,  FALSE },
  { "gimp-file-open-location-dialog", NULL, NULL, NULL, NULL,
    dialogs_file_open_location_new, 0,
    FALSE, TRUE,  FALSE, FALSE },
  { "gimp-file-save-dialog", NULL, NULL, NULL, NULL,
    dialogs_file_save_new, 0,
    FALSE, TRUE,  TRUE,  FALSE },
104 105

  /*  singleton toplevels  */
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
  { "gimp-preferences-dialog", NULL, NULL, NULL, NULL,
    dialogs_preferences_get, 0,
    TRUE,  TRUE,  FALSE, FALSE },
  { "gimp-module-dialog", NULL, NULL, NULL, NULL,
    dialogs_module_get, 0,
    TRUE,  TRUE,  TRUE,  FALSE },
  { "gimp-tips-dialog", NULL, NULL, NULL, NULL,
    dialogs_tips_get, 0,
    TRUE,  FALSE, FALSE, FALSE },
  { "gimp-about-dialog", NULL, NULL, NULL, NULL,
    dialogs_about_get, 0,
    TRUE,  FALSE, FALSE, FALSE },
  { "gimp-error-dialog", NULL, NULL, NULL, NULL,
    dialogs_error_get, 0,
    TRUE,  FALSE, FALSE, FALSE },
  { "gimp-quit-dialog", NULL, NULL, NULL, NULL,
    dialogs_quit_get, 0,
    TRUE,  FALSE, FALSE, FALSE }
124 125
};

126
static const GimpDialogFactoryEntry dock_entries[] =
127
{
128
  /*  singleton dockables  */
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
  { "gimp-tool-options",
    N_("Tool Options"), NULL, GIMP_STOCK_TOOL_OPTIONS,
    GIMP_HELP_TOOL_OPTIONS_DIALOG,
    dialogs_tool_options_get, 0,
    TRUE,  FALSE, FALSE, TRUE },
  { "gimp-device-status",
    N_("Devices"), N_("Device Status"), GIMP_STOCK_DEVICE_STATUS,
    GIMP_HELP_DEVICE_STATUS_DIALOG,
    dialogs_device_status_get, 0,
    TRUE,  FALSE, FALSE, TRUE },
  { "gimp-error-console",
    N_("Errors"), N_("Error Console"), GIMP_STOCK_WARNING,
    GIMP_HELP_ERRORS_DIALOG,
    dialogs_error_console_get, 0,
    TRUE,  FALSE, FALSE, TRUE },
144

145
  /*  list views  */
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
  { "gimp-image-list",
    N_("Images"), NULL, GIMP_STOCK_IMAGES,
    GIMP_HELP_IMAGE_DIALOG,
    dialogs_image_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-brush-list",
    N_("Brushes"), NULL, GIMP_STOCK_BRUSH,
    GIMP_HELP_BRUSH_DIALOG,
    dialogs_brush_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-pattern-list",
    N_("Patterns"), NULL, GIMP_STOCK_PATTERN,
    GIMP_HELP_PATTERN_DIALOG,
    dialogs_pattern_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-gradient-list",
    N_("Gradients"), NULL, GIMP_STOCK_GRADIENT,
    GIMP_HELP_GRADIENT_DIALOG,
    dialogs_gradient_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-palette-list",
    N_("Palettes"), NULL, GIMP_STOCK_PALETTE,
    GIMP_HELP_PALETTE_DIALOG,
    dialogs_palette_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-font-list",
    N_("Fonts"), NULL, GIMP_STOCK_FONT,
    GIMP_HELP_FONT_DIALOG,
    dialogs_font_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-tool-list",
    N_("Tools"), NULL, GIMP_STOCK_TOOLS,
    GIMP_HELP_TOOLS_DIALOG,
    dialogs_tool_list_view_new, GIMP_VIEW_SIZE_SMALL,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-buffer-list",
    N_("Buffers"), NULL, GIMP_STOCK_BUFFER,
    GIMP_HELP_BUFFER_DIALOG,
    dialogs_buffer_list_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-document-list",
    N_("History"), N_("Document History"), GTK_STOCK_OPEN,
    GIMP_HELP_DOCUMENT_DIALOG,
    dialogs_document_list_new, GIMP_VIEW_SIZE_LARGE,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-template-list",
    N_("Templates"), N_("Image Templates"), GIMP_STOCK_TEMPLATE,
    GIMP_HELP_TEMPLATE_DIALOG,
    dialogs_template_list_new, GIMP_VIEW_SIZE_SMALL,
    FALSE, FALSE, FALSE, TRUE },
196

197
  /*  grid views  */
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
  { "gimp-image-grid",
    N_("Images"), NULL, GIMP_STOCK_IMAGES,
    GIMP_HELP_IMAGE_DIALOG,
    dialogs_image_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-brush-grid",
    N_("Brushes"), NULL, GIMP_STOCK_BRUSH,
    GIMP_HELP_BRUSH_DIALOG,
    dialogs_brush_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-pattern-grid",
    N_("Patterns"), NULL, GIMP_STOCK_PATTERN,
    GIMP_HELP_PATTERN_DIALOG,
    dialogs_pattern_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-gradient-grid",
    N_("Gradients"), NULL, GIMP_STOCK_GRADIENT,
    GIMP_HELP_GRADIENT_DIALOG,
    dialogs_gradient_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-palette-grid",
    N_("Palettes"), NULL, GIMP_STOCK_PALETTE,
    GIMP_HELP_PALETTE_DIALOG,
    dialogs_palette_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-font-grid",
    N_("Fonts"), NULL, GIMP_STOCK_FONT,
    GIMP_HELP_FONT_DIALOG,
    dialogs_font_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-tool-grid",
    N_("Tools"), NULL, GIMP_STOCK_TOOLS,
    GIMP_HELP_TOOLS_DIALOG,
    dialogs_tool_grid_view_new, GIMP_VIEW_SIZE_SMALL,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-buffer-grid",
    N_("Buffers"), NULL, GIMP_STOCK_BUFFER,
    GIMP_HELP_BUFFER_DIALOG,
    dialogs_buffer_grid_view_new, GIMP_VIEW_SIZE_MEDIUM,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-document-grid",
    N_("History"), N_("Document History"), GTK_STOCK_OPEN,
    GIMP_HELP_DOCUMENT_DIALOG,
    dialogs_document_grid_new, GIMP_VIEW_SIZE_LARGE,
    FALSE, FALSE, FALSE, TRUE },
243

244
  /*  image related  */
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
  { "gimp-layer-list",
    N_("Layers"), NULL, GIMP_STOCK_LAYERS,
    GIMP_HELP_LAYER_DIALOG,
    dialogs_layer_list_view_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-channel-list",
    N_("Channels"), NULL, GIMP_STOCK_CHANNELS,
    GIMP_HELP_CHANNEL_DIALOG,
    dialogs_channel_list_view_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-vectors-list",
    N_("Paths"), NULL, GIMP_STOCK_PATHS,
    GIMP_HELP_PATH_DIALOG,
    dialogs_vectors_list_view_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-indexed-palette",
    N_("Colormap"), N_("Indexed Palette"), GIMP_STOCK_INDEXED_PALETTE,
    GIMP_HELP_INDEXED_PALETTE_DIALOG,
    dialogs_colormap_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-histogram-editor",
    N_("Histogram"), NULL, GIMP_STOCK_HISTOGRAM,
    GIMP_HELP_HISTOGRAM_DIALOG,
    dialogs_histogram_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-selection-editor",
    N_("Selection"), N_("Selection Editor"), GIMP_STOCK_TOOL_RECT_SELECT,
    GIMP_HELP_SELECTION_DIALOG,
    dialogs_selection_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
  { "gimp-undo-history",
    N_("Undo"), N_("Undo History"), GIMP_STOCK_UNDO_HISTORY,
    GIMP_HELP_UNDO_DIALOG,
    dialogs_undo_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
280

281
  /*  display related  */
282 283 284 285 286
  { "gimp-navigation-view",
    N_("Navigation"), N_("Display Navigation"), GIMP_STOCK_NAVIGATION,
    GIMP_HELP_NAVIGATION_DIALOG,
    dialogs_navigation_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
287

288
  /*  editors  */
289 290 291 292 293
  { "gimp-color-editor",
    N_("FG/BG"), N_("FG/BG Color"), GIMP_STOCK_DEFAULT_COLORS,
    GIMP_HELP_COLOR_DIALOG,
    dialogs_color_editor_new, 0,
    FALSE, FALSE, FALSE, TRUE },
294

295
  /*  singleton editors  */
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
  { "gimp-brush-editor",
    N_("Brush Editor"), NULL, GIMP_STOCK_BRUSH,
    GIMP_HELP_BRUSH_EDITOR_DIALOG,
    dialogs_brush_editor_get, 0,
    TRUE,  FALSE, FALSE, TRUE },
  { "gimp-gradient-editor",
    N_("Gradient Editor"), NULL, GIMP_STOCK_GRADIENT,
    GIMP_HELP_GRADIENT_EDITOR_DIALOG,
    dialogs_gradient_editor_get, 0,
    TRUE,  FALSE, FALSE, TRUE },
  { "gimp-palette-editor",
    N_("Palette Editor"), NULL, GIMP_STOCK_PALETTE,
    GIMP_HELP_PALETTE_EDITOR_DIALOG,
    dialogs_palette_editor_get, 0,
    TRUE,  FALSE, FALSE, TRUE }
311 312 313 314 315
};


/*  public functions  */

316
void
317 318
dialogs_init (Gimp            *gimp,
              GimpMenuFactory *menu_factory)
319
{
320 321
  gint i;

322
  g_return_if_fail (GIMP_IS_GIMP (gimp));
323
  g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory));
324

Michael Natterer's avatar
Michael Natterer committed
325 326 327 328
  global_dialog_factory = gimp_dialog_factory_new ("toplevel",
						   gimp_get_user_context (gimp),
						   NULL,
						   NULL);
329

330 331
  global_toolbox_factory = gimp_dialog_factory_new ("toolbox",
                                                    gimp_get_user_context (gimp),
332
                                                    menu_factory,
333
                                                    dialogs_toolbox_get);
334 335
  gimp_dialog_factory_set_constructor (global_toolbox_factory,
                                       dialogs_dockable_constructor);
336

Michael Natterer's avatar
Michael Natterer committed
337 338
  global_dock_factory = gimp_dialog_factory_new ("dock",
						 gimp_get_user_context (gimp),
339
						 menu_factory,
Michael Natterer's avatar
Michael Natterer committed
340
						 dialogs_dock_new);
341 342
  gimp_dialog_factory_set_constructor (global_dock_factory,
                                       dialogs_dockable_constructor);
343

Michael Natterer's avatar
Michael Natterer committed
344
  for (i = 0; i < G_N_ELEMENTS (toplevel_entries); i++)
345 346
    gimp_dialog_factory_register_entry (global_dialog_factory,
					toplevel_entries[i].identifier,
347 348 349 350
					gettext (toplevel_entries[i].name),
					gettext (toplevel_entries[i].blurb),
					toplevel_entries[i].stock_id,
					toplevel_entries[i].help_id,
351
					toplevel_entries[i].new_func,
352
					toplevel_entries[i].preview_size,
353 354
					toplevel_entries[i].singleton,
					toplevel_entries[i].session_managed,
355 356
					toplevel_entries[i].remember_size,
					toplevel_entries[i].remember_if_open);
357

Michael Natterer's avatar
Michael Natterer committed
358
  for (i = 0; i < G_N_ELEMENTS (dock_entries); i++)
359 360
    gimp_dialog_factory_register_entry (global_dock_factory,
					dock_entries[i].identifier,
361 362 363 364
					gettext (dock_entries[i].name),
					gettext (dock_entries[i].blurb),
					dock_entries[i].stock_id,
					dock_entries[i].help_id,
365
					dock_entries[i].new_func,
366
					dock_entries[i].preview_size,
367 368
					dock_entries[i].singleton,
					dock_entries[i].session_managed,
369 370
					dock_entries[i].remember_size,
					dock_entries[i].remember_if_open);
371
}
372 373

void
Michael Natterer's avatar
Michael Natterer committed
374
dialogs_exit (Gimp *gimp)
375
{
376 377
  g_return_if_fail (GIMP_IS_GIMP (gimp));

378 379
  if (global_dialog_factory)
    {
380
      g_object_unref (global_dialog_factory);
381 382 383
      global_dialog_factory = NULL;
    }

384 385 386 387 388 389 390 391
  /*  destroy the "global_toolbox_factory" _before_ destroying the
   *  "global_dock_factory" because the "global_toolbox_factory" owns
   *  dockables which were created by the "global_dock_factory".  This
   *  way they are properly removed from the "global_dock_factory", which
   *  would complain about stale entries otherwise.
   */
  if (global_toolbox_factory)
    {
392
      g_object_unref (global_toolbox_factory);
393 394 395
      global_toolbox_factory = NULL;
    }

396 397
  if (global_dock_factory)
    {
398
      g_object_unref (global_dock_factory);
399 400
      global_dock_factory = NULL;
    }
401
}
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419

GtkWidget *
dialogs_get_toolbox (void)
{
  GList *list;

  g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (global_toolbox_factory), NULL);

  for (list = global_toolbox_factory->open_dialogs;
       list;
       list = g_list_next (list))
    {
      if (GTK_WIDGET_TOPLEVEL (list->data))
        return list->data;
    }

  return NULL;
}