diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..8c55b1a49210cf2ab0e30637d4191de32e5a1ee4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*.{c, h}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8836c4fbe71d5c11ca8c6df90870b2a9ca955e7f..3ba6c96a725a6cb653b54ed42cdde137d070c116 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,9 @@ doc/*/graphics/*.eps doc/*/.epsfigures doc/*/dia_html /build/win32/Thumbs.db +compile +.vscode/ +tests/sizeof +tests/testsvg +bindings/html +**/.dirstamp diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000000000000000000000000000000000000..d5a51a6ac10b0c80e91e6a3cc4c2be3307d86649 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,17 @@ +* Sheets editor is broken +* GtkAction needs porting to GAction (and therefore menubar GtkUIManager -> GMenuModel) +* We need G\[tk\]Application to use GAction so we need a cleaner split between cli and GUI +* Reorganise dia & libdia into dia, libdia & libdiaui where most widgetry lives in libdiaui + and ideally libdia doesn't depend on Gtk at all +* Keyboard shortcuts are tempremental when working with DiaCanvas +* Scroll wheel is broken for DiaCanvas, Probably need to implement GtkScrollable and use + a standard GtkScrolledWindow instead of a pair of GtkScrollbar +* DiaDisplay should probably be a GtkGrid subclass +* DiaObject & co whould ideally become GObjects with much of the property infrastructure + being ported to GObject properties or other system open to introspection +* Plugin API/ABI is already broken and poorly defined, We could avoid reinventing the + wheel by using libpeas which would give us the chance to support plugins in languages + other than C +* PyDia is largly broken (not least by being Py2 & using PyGtk) but with libpeas we + could probably just drop it without loosing much +* Navigation tool is largly broken, esp on Wayland diff --git a/app/Makefile.am b/app/Makefile.am index e924a26330ea6c60fdf4f5305f4a8895e882314c..6e1f7b49c9553571f19b374757282312b715bfe2 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -9,7 +9,7 @@ AM_CPPFLAGS = \ $(DEBUG_FLAGS) \ $(GTK_CFLAGS) \ $(GTK_MAC_CFLAGS) \ - $(LIBART_CFLAGS) \ + $(CAIRO_CFLAGS) \ -DPREFIX=\""$(prefix)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" \ @@ -125,41 +125,43 @@ dia_core_files = \ connectionpoint_ops.c \ disp_callbacks.c \ disp_callbacks.h \ + dia-canvas.c \ + dia-canvas.h \ display.c \ display.h \ select.c \ select.h \ - color_area.c \ - color_area.h \ - linewidth_area.c \ - linewidth_area.h \ + dia-colour-area.c \ + dia-colour-area.h \ + dia-line-width-area.c \ + dia-line-width-area.h \ grid.c \ grid.h \ handle_ops.c \ handle_ops.h \ interface.c \ interface.h \ + widgets/dia-sheet-chooser.c \ + widgets/dia-sheet-chooser.h \ toolbox.c \ toolbox.h \ dia-app-icons.h \ - modify_tool.c \ - modify_tool.h \ - scroll_tool.c \ - scroll_tool.h \ - create_object.c \ - create_object.h \ - magnify.c \ - magnify.h \ + tools/modify_tool.c \ + tools/modify_tool.h \ + tools/scroll_tool.c \ + tools/scroll_tool.h \ + tools/create_object.c \ + tools/create_object.h \ + tools/magnify.c \ + tools/magnify.h \ menus.c \ menus.h \ cut_n_paste.c \ cut_n_paste.h \ - render_gdk.c \ - render_gdk.h \ ruler.c \ ruler.h \ - tool.c \ - tool.h \ + tools/tool.c \ + tools/tool.h \ diapagelayout.c \ diapagelayout.h \ pagesetup.c \ @@ -172,12 +174,6 @@ dia_core_files = \ plugin-manager.h \ dia-props.c \ dia-props.h \ - gtkwrapbox.h \ - gtkwrapbox.c \ - gtkhwrapbox.h \ - gtkhwrapbox.c \ - gtkvwrapbox.h \ - gtkvwrapbox.c \ cursor.c \ cursor.h \ splash.c \ @@ -210,8 +206,8 @@ dia_core_files = \ highlight.h \ textedit.c \ textedit.h \ - textedit_tool.c \ - textedit_tool.h \ + tools/textedit_tool.c \ + tools/textedit_tool.h \ diagrid.h dia_SOURCES = \ @@ -223,7 +219,7 @@ EFENCE = dia_LDADD = ../lib/libdia.la \ $(EFENCE) \ $(APP_LIBS) $(Z_LIBS) $(FREETYPE_LIBS) $(GTK_LIBS) $(PNG_LIBS) $(INTLLIBS) $(INTLOBJS) \ - $(XML_LIBS) $(LIBART_LIBS) $(GLIB_LIBS) $(GTK_MAC_LIBS) + $(XML_LIBS) $(GLIB_LIBS) $(GTK_MAC_LIBS) ## Bonobo embeddable dia. Commented out, because it's a bit raw. ## Especially the configure/make parts. diff --git a/app/app_procs.c b/app/app_procs.c index dfd84e9c4d7f474b49a965e33d30aea3417894a7..3af6c914823336419d5ab7e838729c5c479cd64f 100644 --- a/app/app_procs.c +++ b/app/app_procs.c @@ -50,9 +50,9 @@ #include "app_procs.h" #include "object.h" #include "commands.h" -#include "tool.h" +#include "tools/tool.h" #include "interface.h" -#include "modify_tool.h" +#include "tools/modify_tool.h" #include "group.h" #include "message.h" #include "display.h" @@ -327,13 +327,9 @@ do_convert(const char *infname, * are quite some filter selecting their output format by it. --hb */ if (size) { - if (ef == filter_export_get_by_name ("png-libart")) /* the warning we get is appropriate, don't cast */ - ef->export_func(diagdata, ctx, outfname, infname, size); - else { - g_warning ("--size parameter unsupported for %s filter", - ef->unique_name ? ef->unique_name : "selected"); - ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); - } + g_warning ("--size parameter unsupported for %s filter", + ef->unique_name ? ef->unique_name : "selected"); + ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); } else ef->export_func(diagdata, ctx, outfname, infname, ef->user_data); @@ -369,15 +365,8 @@ dump_dependencies(void) #ifdef G_THREADS_ENABLED "threads " #endif -#ifdef HAVE_CAIRO "cairo " -#endif -#ifdef HAVE_LIBART - "libart " -#endif -#ifdef HAVE_PANGOCAIRO "pangocairo " -#endif "\n"); /* print out all those dependies, both compile and runtime if possible @@ -437,13 +426,7 @@ dump_dependencies(void) #else g_print ("pango : version not available (>= 1.14.x)\n"); /* Pango did not provide such */ #endif -#if HAVE_CAIRO -# ifdef CAIRO_VERSION_STRING g_print ("cairo : %s (%s)\n", cairo_version_string(), CAIRO_VERSION_STRING); -# else - g_print ("cairo : %s (%d.%d.%d)\n", cairo_version_string(), CAIRO_VERSION_MAJOR, CAIRO_VERSION_MINOR, CAIRO_VERSION_MICRO); -# endif -#endif #if 0 { gchar linkedname[1024]; @@ -491,11 +474,7 @@ handle_initial_diagram(const char *in_file_name, /* First try guessing based on extension */ export_file_name = build_output_file_name(in_file_name, export_file_format, outdir); - /* to make the --size hack even uglier but work again for the only filter supporting it */ - if ( size && strcmp(export_file_format, "png") == 0) - ef = filter_export_get_by_name ("png-libart"); - if (!ef) - ef = filter_guess_export_filter(export_file_name); + ef = filter_guess_export_filter(export_file_name); if (ef == NULL) { ef = filter_export_get_by_name(export_file_format); if (ef == NULL) { @@ -511,10 +490,6 @@ handle_initial_diagram(const char *in_file_name, g_free(export_file_name); } else if (out_file_name) { DiaExportFilter *ef = NULL; - - /* if this looks like an ugly hack to you, agreed ;) */ - if (size && strstr(out_file_name, ".png")) - ef = filter_export_get_by_name ("png-libart"); made_conversions |= do_convert(in_file_name, out_file_name, ef, size, show_layers); @@ -528,9 +503,9 @@ handle_initial_diagram(const char *in_file_name, if (diagram != NULL) { diagram_update_extents(diagram); if (app_is_interactive()) { - layer_dialog_set_diagram(diagram); + layer_dialog_set_diagram(diagram); /* the display initial diagram holds two references */ - new_display(diagram); + dia_display_new (diagram); } else { g_object_unref(diagram); } @@ -681,11 +656,6 @@ app_init (int argc, char **argv) argv0 = (argc > 0) ? argv[0] : "(none)"; -#if GTK_CHECK_VERSION(2,24,0) - /* ... use setlocale directly? */ -#else - gtk_set_locale(); -#endif setlocale(LC_NUMERIC, "C"); _setup_textdomains (); @@ -698,78 +668,70 @@ app_init (int argc, char **argv) if (!g_option_context_parse (context, &argc, &argv, &error)) { if (error) { /* IMO !error here is a bug upstream, triggered e.g. with --gdk-debug=updates */ - g_print ("%s", error->message); - g_error_free (error); + g_print ("%s", error->message); + g_error_free (error); } else { - g_print (_("Invalid option?")); + g_print (_("Invalid option?")); } g_option_context_free(context); exit(1); } + /* second level check of command line options, existance of input files etc. */ if (filenames) { while (filenames[i] != NULL) { - gchar *filename; - gchar *testpath; - - if (g_str_has_prefix (filenames[i], "file://")) { - filename = g_filename_from_uri (filenames[i], NULL, NULL); - if (!g_utf8_validate(filename, -1, NULL)) { - gchar *tfn = filename; - filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); - g_free(tfn); - } - } else - filename = g_filename_to_utf8 (filenames[i], -1, NULL, NULL, NULL); - - if (!filename) { - g_print (_("Filename conversion failed: %s\n"), filenames[i]); - continue; - } - - if (g_path_is_absolute(filename)) - testpath = filename; - else - testpath = g_build_filename(input_directory ? input_directory : ".", filename, NULL); - - /* we still have a problem here, if GLib's file name encoding would not be utf-8 */ - if (g_file_test (testpath, G_FILE_TEST_IS_REGULAR)) - files = g_slist_append(files, filename); - else { - g_print (_("Missing input: %s\n"), filename); - g_free (filename); - } - if (filename != testpath) - g_free (testpath); - ++i; + gchar *filename; + gchar *testpath; + + if (g_str_has_prefix (filenames[i], "file://")) { + filename = g_filename_from_uri (filenames[i], NULL, NULL); + if (!g_utf8_validate(filename, -1, NULL)) { + gchar *tfn = filename; + filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); + g_free(tfn); + } + } else { + filename = g_filename_to_utf8 (filenames[i], -1, NULL, NULL, NULL); + } + if (!filename) { + g_print (_("Filename conversion failed: %s\n"), filenames[i]); + continue; + } + + if (g_path_is_absolute(filename)) + testpath = filename; + else + testpath = g_build_filename(input_directory ? input_directory : ".", filename, NULL); + + /* we still have a problem here, if GLib's file name encoding would not be utf-8 */ + if (g_file_test (testpath, G_FILE_TEST_IS_REGULAR)) { + files = g_slist_append(files, filename); + } else { + g_print (_("Missing input: %s\n"), filename); + g_free (filename); + } + + if (filename != testpath) + g_free (testpath); + ++i; } } + /* given some files to output (or something;)), we are not starting up the UI */ if (export_file_name || export_file_format || size || credits || version || list_filters) dia_is_interactive = FALSE; - } if (argv && dia_is_interactive) { -# if defined(G_THREADS_ENABLED) && !GLIB_CHECK_VERSION(2,32,0) - g_thread_init (NULL); -# endif - gtk_init(&argc, &argv); - } - else { -#if defined(G_THREADS_ENABLED) && !GLIB_CHECK_VERSION(2,32,0) - g_thread_init (NULL); -#endif -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init(); -#endif + gtk_init (&argc, &argv); + } else { /* * On Windows there is no command line without display so that gtk_init is harmless. * On X11 we need gtk_init_check() to avoid exit() just because there is no display * running outside of X11. */ - if (!gtk_init_check(&argc, &argv)) + if (!gtk_init_check (&argc, &argv)) dia_log_message ("Running without display"); } @@ -778,14 +740,14 @@ app_init (int argc, char **argv) gchar *ver_locale; #if (defined __TIME__) && (defined __DATE__) /* TRANSLATOR: 2nd and 3rd %s are time and date respectively. */ - ver_utf8 = g_strdup_printf(_("Dia version %s, compiled %s %s\n"), VERSION, __TIME__, __DATE__); + ver_utf8 = g_strdup_printf (_("Dia version %s, compiled %s %s\n"), VERSION, __TIME__, __DATE__); #else - ver_utf8 = g_strdup_printf(_("Dia version %s\n"), VERSION); + ver_utf8 = g_strdup_printf (_("Dia version %s\n"), VERSION); #endif - ver_locale = g_locale_from_utf8(ver_utf8, -1, NULL, NULL, NULL); - printf("%s\n", ver_locale); - g_free(ver_locale); - g_free(ver_utf8); + ver_locale = g_locale_from_utf8 (ver_utf8, -1, NULL, NULL, NULL); + g_printf ("%s\n", ver_locale); + g_free (ver_locale); + g_free (ver_utf8); if (verbose) dump_dependencies(); exit(0); @@ -794,9 +756,9 @@ app_init (int argc, char **argv) if (!dia_is_interactive) log_to_stderr = TRUE; - libdia_init ( (dia_is_interactive ? DIA_INTERACTIVE : 0) - | (log_to_stderr ? DIA_MESSAGE_STDERR : 0) - | (verbose ? DIA_VERBOSE : 0) ); + libdia_init ( (dia_is_interactive ? DIA_INTERACTIVE : 0) + | (log_to_stderr ? DIA_MESSAGE_STDERR : 0) + | (verbose ? DIA_VERBOSE : 0) ); if (credits) { print_credits(); @@ -807,22 +769,22 @@ app_init (int argc, char **argv) create_user_dirs(); if (!nosplash) - app_splash_init(""); + app_splash_init (""); /* Init cursors: */ - default_cursor = gdk_cursor_new(GDK_LEFT_PTR); - ddisplay_set_all_cursor(default_cursor); + default_cursor = gdk_cursor_new (GDK_LEFT_PTR); + dia_display_set_all_cursor (default_cursor); } - dia_register_plugins(); - dia_register_builtin_plugin(internal_plugin_init); + dia_register_plugins (); + dia_register_builtin_plugin (internal_plugin_init); if (list_filters) { print_filters_list (verbose); exit (0); } - load_all_sheets(); /* new mechanism */ + load_all_sheets (); /* new mechanism */ dia_log_message ("object defaults"); { @@ -832,11 +794,11 @@ app_init (int argc, char **argv) } debug_break(); - if (object_get_type("Standard - Box") == NULL) { - message_error(_("Couldn't find standard objects when looking for " - "object-libs; exiting...\n")); - g_critical( _("Couldn't find standard objects when looking for " - "object-libs in '%s'; exiting...\n"), dia_get_lib_directory("dia")); + if (object_get_type ("Standard - Box") == NULL) { + message_error (_("Couldn't find standard objects when looking for " + "object-libs; exiting...\n")); + g_critical (_("Couldn't find standard objects when looking for " + "object-libs in '%s'; exiting...\n"), dia_get_lib_directory("dia")); exit(1); } @@ -848,7 +810,7 @@ app_init (int argc, char **argv) if (dia_is_interactive) { /* further initialization *before* reading files */ - active_tool = create_modify_tool(); + active_tool = g_object_new (DIA_TYPE_MODIFY_TOOL, NULL); dia_log_message ("ui creation"); if (use_integrated_ui) { @@ -877,9 +839,9 @@ app_init (int argc, char **argv) } dia_log_message ("diagrams"); - made_conversions = handle_all_diagrams(files, export_file_name, - export_file_format, size, show_layers, - input_directory, output_directory); + made_conversions = handle_all_diagrams (files, export_file_name, + export_file_format, size, show_layers, + input_directory, output_directory); if (dia_is_interactive && files == NULL && !nonew) { if (use_integrated_ui) { @@ -903,7 +865,7 @@ app_init (int argc, char **argv) /* I think this is done in diagram_init() with a call to * layer_dialog_update_diagram_list() */ layer_dialog_set_diagram(diagram); - new_display(diagram); + dia_display_new (diagram); } } } @@ -1020,16 +982,12 @@ app_exit(void) gtk_window_set_title (GTK_WINDOW(dialog), _("Quit Dia")); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + button = gtk_button_new_with_label (_("Cancel")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); - button = gtk_button_new_from_stock (GTK_STOCK_QUIT); + button = gtk_button_new_with_label (_("Quit")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_OK); gtk_widget_show_all (dialog); @@ -1061,7 +1019,7 @@ app_exit(void) slist = dia->displays; while (slist!=NULL) { - DDisplay *ddisp = (DDisplay *)slist->data; + DiaDisplay *ddisp = (DiaDisplay *)slist->data; slist = g_slist_next(slist); gtk_widget_destroy(ddisp->shell); diff --git a/app/authors.h b/app/authors.h index 56393dec6f00bd1f607697fccde0a6b8fb853552..15e50272208ae1fba63cef9fbd29e3ad23567ca9 100644 --- a/app/authors.h +++ b/app/authors.h @@ -60,7 +60,10 @@ static const gchar *authors[] = { "Alexander Larsson ", - /* current maintainer */ + /* "acting" maintainer */ + "Zander Brown ", + + /* "out for lunch" maintainer */ "Hans Breuer ", /* other author(s) */ diff --git a/app/color_area.c b/app/color_area.c deleted file mode 100644 index 4d2471a3b193dd30680dbe87cee80c0f2d1458a2..0000000000000000000000000000000000000000 --- a/app/color_area.c +++ /dev/null @@ -1,494 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "../lib/color.h" -#include "intl.h" - -#include "color_area.h" -#include "attributes.h" -#include "persistence.h" - -#define FORE_AREA 0 -#define BACK_AREA 1 -#define SWAP_AREA 2 -#define DEF_AREA 3 - -#define FOREGROUND 0 -#define BACKGROUND 1 - -/* Global variables */ -int active_color = 0; - -/* Static variables */ -GtkWidget *color_area; -static GdkGC *color_area_gc = NULL; -static GdkGC *mask_gc = NULL; -static GdkPixmap *color_area_pixmap = NULL; -static GdkBitmap *color_area_mask = NULL; -static GdkPixmap *default_pixmap = NULL; -static GdkBitmap *default_mask = NULL; -static GdkPixmap *swap_pixmap = NULL; -static GdkBitmap *swap_mask = NULL; - -static GtkWidget *color_select = NULL; -static int color_select_active = 0; -static int edit_color; -static Color stored_foreground; -static Color stored_background; - - -static void -color_selection_ok (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs); -static gint -color_selection_delete (GtkWidget *w, - GdkEvent *event, - GtkColorSelectionDialog *cs); -static gint -color_selection_destroy (GtkWidget *w, - GtkColorSelectionDialog *cs); -static void -color_selection_changed (GtkWidget *w, - GtkColorSelectionDialog *cs); - -/* Local functions */ -static int -color_area_target (int x, - int y) -{ - gint rect_w, rect_h; - gint width, height; - - gdk_drawable_get_size (color_area_pixmap, &width, &height); - - rect_w = width * 0.65; - rect_h = height * 0.65; - - /* foreground active */ - if (x > 0 && x < rect_w && - y > 0 && y < rect_h) - return FORE_AREA; - else if (x > (width - rect_w) && x < width && - y > (height - rect_h) && y < height) - return BACK_AREA; - else if (x > 0 && x < (width - rect_w) && - y > rect_h && y < height) - return DEF_AREA; - else if (x > rect_w && x < width && - y > 0 && y < (height - rect_h)) - return SWAP_AREA; - else - return -1; -} - -static void -color_area_draw () -{ - Color col; - GdkColor *win_bg; - GdkColor fg, bg; - gint rect_w, rect_h; - gint width, height; - gint def_width, def_height; - gint swap_width, swap_height; - GdkColor mask_pattern; - GtkStyle *style; - - /* Check we haven't gotten initial expose yet, - * no point in drawing anything - */ - if (!color_area_pixmap || !color_area_gc) - return; - - gdk_drawable_get_size (color_area_pixmap, &width, &height); - - style = gtk_widget_get_style(color_area); - win_bg = &(style->bg[GTK_STATE_NORMAL]); - col = attributes_get_foreground(); - color_convert(&col, &fg); - col = attributes_get_background(); - color_convert(&col, &bg); - - rect_w = width * 0.65; - rect_h = height * 0.65; - - /* initialize the mask to transparent */ - mask_pattern.pixel = 0; - gdk_gc_set_foreground (mask_gc, &mask_pattern); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, 0, 0, -1, -1); - - /* set the mask's gc to opaque */ - mask_pattern.pixel = 1; - gdk_gc_set_foreground (mask_gc, &mask_pattern); - - gdk_gc_set_foreground (color_area_gc, win_bg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - 0, 0, width, height); - - gdk_gc_set_foreground (color_area_gc, &bg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - (width - rect_w), (height - rect_h), rect_w, rect_h); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, - (width - rect_w), (height - rect_h), rect_w, rect_h); - - if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, - GTK_SHADOW_OUT, - NULL, color_area, NULL, - (width - rect_w), (height - rect_h), - rect_w, rect_h); - else - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, - GTK_SHADOW_IN, - NULL, color_area, NULL, - (width - rect_w), (height - rect_h), - rect_w, rect_h); - - gdk_gc_set_foreground (color_area_gc, &fg); - gdk_draw_rectangle (color_area_pixmap, color_area_gc, 1, - 0, 0, rect_w, rect_h); - gdk_draw_rectangle (color_area_mask, mask_gc, TRUE, - 0, 0, rect_w, rect_h); - - if (active_color == FOREGROUND) - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, - GTK_SHADOW_IN, - NULL, color_area, NULL, - 0, 0, - rect_w, rect_h); - else - gtk_paint_shadow (style, color_area_pixmap, GTK_STATE_NORMAL, - GTK_SHADOW_OUT, - NULL, color_area, NULL, - 0, 0, - rect_w, rect_h); - - /* draw the default pixmap */ - gdk_drawable_get_size (default_pixmap, &def_width, &def_height); - gdk_draw_drawable (color_area_pixmap, color_area_gc, default_pixmap, - 0, 0, 0, height - def_height, def_width, def_height); - gdk_draw_drawable (color_area_mask, mask_gc, default_mask, - 0, 0, 0, height - def_height, def_width, def_height); - - /* draw the swap pixmap */ - gdk_drawable_get_size (swap_pixmap, &swap_width, &swap_height); - gdk_draw_drawable (color_area_pixmap, color_area_gc, swap_pixmap, - 0, 0, width - swap_width, 0, swap_width, swap_height); - gdk_draw_drawable (color_area_mask, mask_gc, swap_mask, - 0, 0, width - swap_width, 0, swap_width, swap_height); - - /* draw the widget */ - gdk_gc_set_clip_mask (color_area_gc, color_area_mask); - gdk_gc_set_clip_origin (color_area_gc, 0, 0); - gdk_draw_drawable (gtk_widget_get_window(color_area), color_area_gc, color_area_pixmap, - 0, 0, 0, 0, width, height); - - /* reset the clip mask */ - gdk_gc_set_clip_mask (color_area_gc, NULL); -} - -static void -color_selection_ok (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - GtkColorSelection *colorsel; - GdkColor color; - guint alpha; - Color col; - - colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); - - gtk_color_selection_get_current_color(colorsel,&color); - GDK_COLOR_TO_DIA(color, col); - - alpha = gtk_color_selection_get_current_alpha(colorsel); - col.alpha = alpha / 65535.0; - - if (edit_color == FOREGROUND) { - attributes_set_foreground(&col); - } else { - attributes_set_background(&col); - } - color_area_draw (); - - /* gtk_color_selection_set_currentcolor(colorsel,&color);*/ - - gtk_widget_hide(color_select); - color_select_active = 0; -} - -static void -color_selection_cancel (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - if (color_select != NULL) - gtk_widget_hide(color_select); - color_select_active = 0; - attributes_set_foreground(&stored_foreground); - attributes_set_background(&stored_background); - - color_area_draw (); -} - -static gint -color_selection_delete (GtkWidget *w, - GdkEvent *event, - GtkColorSelectionDialog *cs) -{ - color_selection_cancel(w,cs); - return TRUE; -} - -static gint -color_selection_destroy (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - color_select = NULL; - color_selection_cancel(w,cs); - return TRUE; -} - -static void -color_selection_changed (GtkWidget *w, - GtkColorSelectionDialog *cs) -{ - GtkColorSelection *colorsel; - GdkColor color; - guint alpha; - Color col; - - colorsel=GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(cs)); - - gtk_color_selection_get_current_color(colorsel,&color); - GDK_COLOR_TO_DIA(color, col); - - alpha = gtk_color_selection_get_current_alpha(colorsel); - col.alpha = alpha / 65535.0; - - if (edit_color == FOREGROUND) { - attributes_set_foreground(&col); - } else { - attributes_set_background(&col); - } - color_area_draw (); -} - -static void -color_area_edit (void) -{ - Color col; - GtkWidget *window; - GdkColor color; - GtkColorSelectionDialog *csd; - GtkColorSelection *colorsel; - - if (!color_select_active) { - stored_foreground = attributes_get_foreground(); - stored_background = attributes_get_background(); - } - - if (active_color == FOREGROUND) { - col = attributes_get_foreground(); - edit_color = FOREGROUND; - } else { - col = attributes_get_background(); - edit_color = BACKGROUND; - } - - if (color_select) { - window = color_select; - csd = GTK_COLOR_SELECTION_DIALOG (window); - colorsel = GTK_COLOR_SELECTION ( - gtk_color_selection_dialog_get_color_selection (csd)); - - gtk_window_set_title(GTK_WINDOW(color_select), - edit_color==FOREGROUND? - _("Select foreground color"): - _("Select background color")); - if (! color_select_active) { - gtk_widget_show (color_select); - } - } else { - GtkButton *button; - - window = color_select = - gtk_color_selection_dialog_new(edit_color==FOREGROUND? - _("Select foreground color"): - _("Select background color")); - csd = GTK_COLOR_SELECTION_DIALOG (window); - colorsel = GTK_COLOR_SELECTION ( - gtk_color_selection_dialog_get_color_selection (csd)); - - color_select_active = 1; - gtk_color_selection_set_has_opacity_control (colorsel, TRUE); - - gtk_color_selection_set_has_palette (colorsel, TRUE); - - gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); - - g_signal_connect (G_OBJECT (window), "delete_event", - G_CALLBACK(color_selection_delete), - window); - - g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK(color_selection_destroy), - window); - - g_signal_connect (G_OBJECT (colorsel), - "color_changed", - G_CALLBACK(color_selection_changed), - window); - - g_object_get (G_OBJECT (window), "ok-button", &button, NULL); - g_signal_connect (button, "clicked", - G_CALLBACK(color_selection_ok), - window); - - g_object_get (G_OBJECT (window), "cancel-button", &button, NULL); - g_signal_connect (button, "clicked", - G_CALLBACK(color_selection_cancel), - window); - - /* Make sure window is shown before setting its colors: */ - gtk_widget_show_now (color_select); - } - DIA_COLOR_TO_GDK(col, color); - - gtk_color_selection_set_current_color(colorsel, &color); - gtk_color_selection_set_current_alpha(colorsel, (guint)(col.alpha * 65535.0)); -} - -static gint -color_area_events (GtkWidget *widget, - GdkEvent *event) -{ - GdkEventButton *bevent; - int target; - - switch (event->type) - { - case GDK_CONFIGURE: - if (color_area_pixmap) - { - g_object_unref (color_area_pixmap); - g_object_unref (color_area_mask); - } - - color_area_pixmap = gdk_pixmap_new (gtk_widget_get_window(color_area), - color_area->allocation.width, - color_area->allocation.height, -1); - color_area_mask = gdk_pixmap_new (gtk_widget_get_window(color_area), - color_area->allocation.width, - color_area->allocation.height, 1); - break; - case GDK_EXPOSE: -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(color_area)) -#else - if (GTK_WIDGET_DRAWABLE (color_area)) -#endif - { - if (!color_area_gc) - { - color_area_gc = gdk_gc_new (gtk_widget_get_window(color_area)); - mask_gc = gdk_gc_new (color_area_mask); - } - - color_area_draw (); - } - break; - case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - - if (bevent->button == 1) { - switch ((target = color_area_target (bevent->x, bevent->y))) { - case FORE_AREA: - case BACK_AREA: - if (target == active_color) { - color_area_edit (); - } else { - active_color = target; - color_area_draw(); - } - break; - case SWAP_AREA: - attributes_swap_fgbg(); - color_area_draw(); - break; - case DEF_AREA: - attributes_default_fgbg(); - color_area_draw(); - break; - } - } - break; - - default: - break; - } - - return FALSE; -} - -#include "pixmaps/swap.xpm" -#include "pixmaps/default.xpm" - -GtkWidget * -color_area_create (int width, - int height, - GtkWidget *parent, - GtkStyle *style) -{ - GtkWidget *event_box; - - default_pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), &default_mask, - &style->bg[GTK_STATE_NORMAL], default_xpm); - swap_pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), &swap_mask, - &style->bg[GTK_STATE_NORMAL], swap_xpm); - - attributes_set_foreground(persistence_register_color("fg_color", &color_black)); - attributes_set_background(persistence_register_color("bg_color", &color_white)); - - event_box = gtk_event_box_new(); - color_area = gtk_drawing_area_new (); - gtk_widget_set_size_request (color_area, width, height); - gtk_widget_set_events (color_area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect (G_OBJECT (color_area), "event", - G_CALLBACK(color_area_events), - NULL); - - gtk_widget_show(color_area); - gtk_container_add(GTK_CONTAINER(event_box), color_area); - return event_box; -} diff --git a/app/commands.c b/app/commands.c index a5ad14febb56f56fbfa94a23c2f468bfa9697ffb..0c7ca5aaefaaec8d6517e6b9510e8a80ce655261 100644 --- a/app/commands.c +++ b/app/commands.c @@ -101,7 +101,7 @@ file_pagesetup_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram(); if (!dia) return; create_page_setup_dlg(dia); } @@ -110,12 +110,12 @@ void file_print_callback (GtkAction *_action) { Diagram *dia; - DDisplay *ddisp; + DiaDisplay *ddisp; GtkAction *action; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram(); if (!dia) return; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; action = menus_get_action ("FilePrintGTK"); @@ -136,8 +136,8 @@ void file_close_callback (GtkAction *action) { /* some people use tear-off menus and insist to close non existing displays */ - if (ddisplay_active()) - ddisplay_close(ddisplay_active()); + if (dia_display_active()) + dia_display_close(dia_display_active()); } void @@ -150,7 +150,7 @@ file_new_callback (GtkAction *action) name = g_strdup_printf(_("Diagram%d.dia"), untitled_nr++); filename = g_filename_from_utf8(name, -1, NULL, NULL, NULL); dia = new_diagram(filename); - new_display(dia); + dia_display_new (dia); dia_diagram_add (dia); /* notify DiagramTree etc. */ g_free (name); g_free (filename); @@ -171,7 +171,7 @@ file_preferences_callback (GtkAction *action) */ static void -insert_text(DDisplay *ddisp, Focus *focus, const gchar *text) +insert_text(DiaDisplay *ddisp, Focus *focus, const gchar *text) { ObjectChange *change = NULL; int modified = FALSE, any_modified = FALSE; @@ -181,10 +181,10 @@ insert_text(DDisplay *ddisp, Focus *focus, const gchar *text) gchar *next_line = g_utf8_strchr(text, -1, '\n'); if (next_line != text) { gint len = g_utf8_strlen(text, (next_line-text)); - modified = (*focus->key_event)(focus, 0, GDK_A, text, len, &change); + modified = (*focus->key_event)(focus, 0, GDK_KEY_A, text, len, &change); } if (next_line != NULL) { - modified = (*focus->key_event)(focus, 0, GDK_Return, "\n", 1, &change); + modified = (*focus->key_event)(focus, 0, GDK_KEY_Return, "\n", 1, &change); text = g_utf8_next_char(next_line); } else { text = NULL; @@ -217,7 +217,7 @@ received_clipboard_text_handler(GtkClipboard *clipboard, const gchar *text, gpointer data) { - DDisplay *ddisp = (DDisplay *)data; + DiaDisplay *ddisp = (DiaDisplay *)data; Focus *focus = get_active_focus((DiagramData *) ddisp->diagram); if (text == NULL) return; @@ -236,11 +236,11 @@ received_clipboard_text_handler(GtkClipboard *clipboard, * Callback for gtk_clipboard_request_image */ static void -received_clipboard_image_handler(GtkClipboard *clipboard, - GdkPixbuf *pixbuf, - gpointer data) +received_clipboard_image_handler (GtkClipboard *clipboard, + GdkPixbuf *pixbuf, + gpointer data) { - DDisplay *ddisp = (DDisplay *)data; + DiaDisplay *ddisp = (DiaDisplay *)data; Diagram *dia = ddisp->diagram; GList *list = dia->data->selected; ObjectChange *change = NULL; @@ -274,7 +274,7 @@ received_clipboard_image_handler(GtkClipboard *clipboard, Handle *handle2; DiaObject *obj; - pt = ddisplay_get_clicked_position(ddisp); + pt = dia_display_get_clicked_position (ddisp); snap_to_grid(ddisp, &pt.x, &pt.y); if ( ((type = object_get_type ("Standard - Image")) != NULL) @@ -294,7 +294,7 @@ received_clipboard_image_handler(GtkClipboard *clipboard, diagram_select(dia, obj); object_add_updates(obj, dia); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); diagram_flush(dia); } else { message_warning (_("No selected object can take an image.")); @@ -313,7 +313,7 @@ received_clipboard_content_handler (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer user_data) { - DDisplay *ddisp = (DDisplay *)user_data; + DiaDisplay *ddisp = (DiaDisplay *)user_data; GdkAtom type_atom; gchar *type_name; gint len; @@ -362,12 +362,12 @@ void edit_paste_image_callback (GtkAction *action) { GtkClipboard *clipboard = gtk_clipboard_get(GDK_NONE); - DDisplay *ddisp; + DiaDisplay *ddisp; GdkAtom *targets; gint n_targets; gboolean done = FALSE; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; if (gtk_clipboard_wait_for_targets (clipboard, &targets, &n_targets)) { @@ -525,9 +525,9 @@ void edit_copy_callback (GtkAction *action) { GList *copy_list; - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; if (textedit_mode(ddisp)) { @@ -577,7 +577,7 @@ edit_copy_callback (GtkAction *action) cnp_store_objects(object_copy_list(copy_list), 1); g_list_free(copy_list); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } } @@ -585,10 +585,10 @@ void edit_cut_callback (GtkAction *action) { GList *cut_list; - DDisplay *ddisp; + DiaDisplay *ddisp; Change *change; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; if (textedit_mode(ddisp)) { @@ -602,7 +602,7 @@ edit_cut_callback (GtkAction *action) change = undo_delete_objects_children(ddisp->diagram, cut_list); (change->apply)(change, ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); diagram_flush(ddisp->diagram); diagram_modified(ddisp->diagram); @@ -615,13 +615,13 @@ void edit_paste_callback (GtkAction *action) { GList *paste_list; - DDisplay *ddisp; + DiaDisplay *ddisp; Point paste_corner; Point delta; Change *change; int generation = 0; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; if (textedit_mode(ddisp)) { #ifndef GDK_WINDOWING_X11 @@ -678,11 +678,11 @@ void edit_duplicate_callback (GtkAction *action) { GList *duplicate_list; - DDisplay *ddisp; + DiaDisplay *ddisp; Point delta; Change *change; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; duplicate_list = object_copy_list(diagram_get_sorted_selected(ddisp->diagram)); @@ -703,13 +703,13 @@ edit_duplicate_callback (GtkAction *action) diagram_flush(ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } void objects_move_up_layer(GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); GList *selected_list; Change *change; @@ -725,13 +725,13 @@ objects_move_up_layer(GtkAction *action) diagram_flush(ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } void objects_move_down_layer(GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); GList *selected_list; Change *change; @@ -749,14 +749,14 @@ objects_move_down_layer(GtkAction *action) diagram_flush(ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } void edit_copy_text_callback (GtkAction *action) { Focus *focus; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); DiaObject *obj; GPtrArray *textprops; TextProperty *prop; @@ -793,13 +793,13 @@ void edit_cut_text_callback (GtkAction *action) { Focus *focus; - DDisplay *ddisp; + DiaDisplay *ddisp; DiaObject *obj; GPtrArray *textprops; TextProperty *prop; ObjectChange *change; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; focus = get_active_focus((DiagramData *) ddisp->diagram); @@ -839,9 +839,9 @@ edit_cut_text_callback (GtkAction *action) void edit_paste_text_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; #ifndef GDK_WINDOWING_X11 @@ -857,7 +857,7 @@ void edit_delete_callback (GtkAction *action) { GList *delete_list; - DDisplay *ddisp; + DiaDisplay *ddisp; /* Avoid crashing while moving or resizing and deleting ... */ if (gdk_pointer_is_grabbed ()) { @@ -865,7 +865,7 @@ edit_delete_callback (GtkAction *action) return; } - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; if (textedit_mode(ddisp)) { ObjectChange *change = NULL; @@ -886,7 +886,7 @@ edit_delete_callback (GtkAction *action) diagram_modified(ddisp->diagram); diagram_update_extents(ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); diagram_flush(ddisp->diagram); undo_set_transactionpoint(ddisp->diagram->undo); @@ -897,7 +897,7 @@ edit_undo_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; /* Handle text undo edit here! */ @@ -914,7 +914,7 @@ edit_redo_callback (GtkAction *action) Diagram *dia; /* Handle text undo edit here! */ - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; undo_apply_to_next_tp(dia->undo); @@ -933,8 +933,8 @@ help_manual_callback (GtkAction *action) const char *dentry; GError *error = NULL; GdkScreen *screen; - DDisplay *ddisp; - ddisp = ddisplay_active(); + DiaDisplay *ddisp; + ddisp = dia_display_active (); screen = ddisp ? gtk_widget_get_screen (GTK_WIDGET(ddisp->shell)) : gdk_screen_get_default (); if (gtk_show_uri(screen, "ghelp:dia", gtk_get_current_event_time (), NULL)) { @@ -1038,18 +1038,13 @@ help_about_callback (GtkAction *action) gchar *filename = g_build_filename (dirname, "dia-splash.png", NULL); GdkPixbuf *logo = gdk_pixbuf_new_from_file(filename, NULL); -#if GTK_CHECK_VERSION(2,24,0) - /* rely on gtk_show_uri doing the right thing internally */ -#else - gtk_about_dialog_set_url_hook ((GtkAboutDialogActivateLinkFunc)activate_url, NULL, NULL); -#endif gtk_show_about_dialog (NULL, "logo", logo, "name", "Dia", "version", VERSION, "comments", _("A program for drawing structured diagrams."), - "copyright", "(C) 1998-2011 The Free Software Foundation and the authors", - "website", "http://live.gnome.org/Dia", + "copyright", "© 2018 Zander Brown et al\n(C) 1998-2011 The Free Software Foundation and the authors", + "website", "https://wiki.gnome.org/Apps/Dia/", "authors", authors, "documenters", documentors, "translator-credits", strcmp (translators, "translator_credits-PLEASE_ADD_YOURSELF_HERE") @@ -1065,23 +1060,23 @@ help_about_callback (GtkAction *action) void view_zoom_in_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_zoom_middle(ddisp, M_SQRT2); + dia_display_zoom_middle (ddisp, M_SQRT2); } void view_zoom_out_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_zoom_middle(ddisp, M_SQRT1_2); + dia_display_zoom_middle (ddisp, M_SQRT1_2); } void @@ -1096,28 +1091,28 @@ view_zoom_set_callback (GtkAction *action) void view_show_cx_pts_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; int old_val; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; old_val = ddisp->show_cx_pts; ddisp->show_cx_pts = gtk_toggle_action_get_active (action); if (old_val != ddisp->show_cx_pts) { - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_add_update_all (ddisp); + dia_display_flush (ddisp); } } void view_unfullscreen (void) { - DDisplay *ddisp; + DiaDisplay *ddisp; GtkToggleAction *item; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; /* find the menuitem */ @@ -1130,10 +1125,10 @@ view_unfullscreen (void) void view_fullscreen_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; int fs; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; fs = gtk_toggle_action_get_active (action); @@ -1147,67 +1142,67 @@ view_fullscreen_callback (GtkToggleAction *action) void view_aa_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; int aa; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; aa = gtk_toggle_action_get_active (action); if (aa != ddisp->aa_renderer) { - ddisplay_set_renderer(ddisp, aa); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_set_renderer (ddisp, aa); + dia_display_add_update_all (ddisp); + dia_display_flush (ddisp); } } void view_visible_grid_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; guint old_val; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; old_val = ddisp->grid.visible; ddisp->grid.visible = gtk_toggle_action_get_active (action); if (old_val != ddisp->grid.visible) { - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_add_update_all (ddisp); + dia_display_flush (ddisp); } } void view_snap_to_grid_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_set_snap_to_grid(ddisp, gtk_toggle_action_get_active (action)); + dia_display_set_snap_to_grid (ddisp, gtk_toggle_action_get_active (action)); } void view_snap_to_objects_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_set_snap_to_objects(ddisp, gtk_toggle_action_get_active (action)); + dia_display_set_snap_to_objects (ddisp, gtk_toggle_action_get_active (action)); } void view_toggle_rulers_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; if (!gtk_toggle_action_get_active (action)) { @@ -1224,9 +1219,9 @@ view_toggle_rulers_callback (GtkToggleAction *action) void view_toggle_scrollbars_callback (GtkToggleAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; if (gtk_toggle_action_get_active (action)) { @@ -1242,50 +1237,50 @@ view_new_view_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; - new_display(dia); + dia_display_new (dia); } extern void view_clone_view_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - copy_display(ddisp); + dia_display_copy (ddisp); } void view_show_all_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_show_all (ddisp); + dia_display_show_all (ddisp); } void view_redraw_callback (GtkAction *action) { - DDisplay *ddisp; - ddisp = ddisplay_active(); + DiaDisplay *ddisp; + ddisp = dia_display_active (); if (!ddisp) return; - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_add_update_all (ddisp); + dia_display_flush (ddisp); } void view_diagram_properties_callback (GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + ddisp = dia_display_active (); if (!ddisp) return; diagram_properties_show(ddisp->diagram); } @@ -1313,7 +1308,7 @@ layers_add_layer_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; diagram_edit_layer (dia, NULL); @@ -1324,7 +1319,7 @@ layers_rename_layer_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; diagram_edit_layer (dia, dia->data->active_layer); @@ -1333,75 +1328,75 @@ layers_rename_layer_callback (GtkAction *action) void objects_place_over_callback (GtkAction *action) { - diagram_place_over_selected(ddisplay_active_diagram()); + diagram_place_over_selected (dia_display_active_diagram()); } void objects_place_under_callback (GtkAction *action) { - diagram_place_under_selected(ddisplay_active_diagram()); + diagram_place_under_selected (dia_display_active_diagram()); } void objects_place_up_callback (GtkAction *action) { - diagram_place_up_selected(ddisplay_active_diagram()); + diagram_place_up_selected (dia_display_active_diagram()); } void objects_place_down_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_place_down_selected(ddisplay_active_diagram()); + diagram_place_down_selected (dia_display_active_diagram()); } void objects_parent_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_parent_selected(ddisplay_active_diagram()); + diagram_parent_selected (dia_display_active_diagram()); } void objects_unparent_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_unparent_selected(ddisplay_active_diagram()); + diagram_unparent_selected (dia_display_active_diagram()); } void objects_unparent_children_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_unparent_children_selected(ddisplay_active_diagram()); + diagram_unparent_children_selected (dia_display_active_diagram()); } void objects_group_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_group_selected(ddisplay_active_diagram()); - ddisplay_do_update_menu_sensitivity(ddisp); + diagram_group_selected (dia_display_active_diagram()); + dia_display_do_update_menu_sensitivity (ddisp); } void objects_ungroup_callback (GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; - diagram_ungroup_selected(ddisplay_active_diagram()); - ddisplay_do_update_menu_sensitivity(ddisp); + diagram_ungroup_selected (dia_display_active_diagram()); + dia_display_do_update_menu_sensitivity (ddisp); } void @@ -1409,8 +1404,8 @@ dialogs_properties_callback (GtkAction *action) { Diagram *dia; - dia = ddisplay_active_diagram(); - if (!dia || textedit_mode(ddisplay_active())) return; + dia = dia_display_active_diagram (); + if (!dia || textedit_mode(dia_display_active ())) return; if (dia->data->selected != NULL) { object_list_properties_show(dia, dia->data->selected); @@ -1422,7 +1417,7 @@ dialogs_properties_callback (GtkAction *action) void dialogs_layers_callback (GtkAction *action) { - layer_dialog_set_diagram(ddisplay_active_diagram()); + layer_dialog_set_diagram (dia_display_active_diagram()); layer_dialog_show(); } @@ -1435,7 +1430,7 @@ objects_align_h_callback (GtkAction *action) Diagram *dia; GList *objects; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; /* HACK align is suffix to action name */ @@ -1460,7 +1455,7 @@ objects_align_h_callback (GtkAction *action) return; } - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; objects = dia->data->selected; @@ -1482,7 +1477,7 @@ objects_align_v_callback (GtkAction *action) Diagram *dia; GList *objects; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp || textedit_mode(ddisp)) return; /* HACK align is suffix to action name */ @@ -1507,7 +1502,7 @@ objects_align_v_callback (GtkAction *action) return; } - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; objects = dia->data->selected; @@ -1527,7 +1522,7 @@ objects_align_connected_callback (GtkAction *action) Diagram *dia; GList *objects; - dia = ddisplay_active_diagram(); + dia = dia_display_active_diagram (); if (!dia) return; objects = dia->data->selected; @@ -1555,6 +1550,6 @@ dia_file_open (const gchar *filename, if (diagram != NULL) { diagram_update_extents(diagram); layer_dialog_set_diagram(diagram); - new_display(diagram); + dia_display_new (diagram); } } diff --git a/app/confirm.c b/app/confirm.c index 89b0803e0cfe1a9301c0595709aab5834e816087..e342b75f71ae57f3a6de4fedfc0466fa9584134b 100644 --- a/app/confirm.c +++ b/app/confirm.c @@ -60,11 +60,7 @@ confirm_export_size (Diagram *dia, GtkWindow *parent, guint flags) return TRUE; /* message and limits depend on the flags give */ -#if GLIB_CHECK_VERSION(2,30,0) size = g_format_size (bytes); -#else - size = g_format_size_for_display (bytes); -#endif /* See: https://live.gnome.org/TranslationProject/DevGuidelines/Plurals */ if (flags & CONFIRM_PRINT) msg = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, diff --git a/app/connectionpoint_ops.c b/app/connectionpoint_ops.c index 26d078c3074154ae2b1b1039c8bc87e03af7471b..3befb43e4b8bf65b03857f4b54c6d47088f27789 100644 --- a/app/connectionpoint_ops.c +++ b/app/connectionpoint_ops.c @@ -21,28 +21,27 @@ #include "connectionpoint_ops.h" #include "object_ops.h" -#include "color.h" #include "object.h" #include "connectionpoint.h" #define CONNECTIONPOINT_SIZE 7 #define CHANGED_TRESHOLD 0.001 -static Color connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 }; +static GdkRGBA connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 }; #define CP_SZ (CONNECTIONPOINT_SIZE/2) static void -connectionpoint_draw(ConnectionPoint *conpoint, - DDisplay *ddisp, - DiaRenderer *renderer, - DiaInteractiveRendererInterface *irenderer, - Color *color) +connectionpoint_draw (ConnectionPoint *conpoint, + DiaDisplay *ddisp, + DiaRenderer *renderer, + DiaInteractiveRendererInterface *irenderer, + GdkRGBA *color) { int x,y; Point *point = &conpoint->pos; - ddisplay_transform_coords(ddisp, point->x, point->y, &x, &y); + dia_display_transform_coords (ddisp, point->x, point->y, &x, &y); irenderer->draw_pixel_line (renderer, x-CP_SZ,y-CP_SZ, @@ -56,10 +55,10 @@ connectionpoint_draw(ConnectionPoint *conpoint, } void -object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp) +object_draw_connectionpoints (DiaObject *obj, DiaDisplay *ddisp) { int i; - static Color midpoint_color = { 1.0, 0.0, 0.0, 1.0 }; + static GdkRGBA midpoint_color = { 1.0, 0.0, 0.0, 1.0 }; DiaRenderer *renderer = ddisp->renderer; DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (ddisp->renderer); DiaInteractiveRendererInterface *irenderer = @@ -76,8 +75,8 @@ object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp) if (dia_object_get_num_connections(obj) > 1) { const Rectangle *bbox = dia_object_get_bounding_box (obj); - real w = ddisplay_transform_length (ddisp, bbox->right - bbox->left); - real h = ddisplay_transform_length (ddisp, bbox->bottom - bbox->top); + real w = dia_display_transform_length (ddisp, bbox->right - bbox->left); + real h = dia_display_transform_length (ddisp, bbox->bottom - bbox->top); int n = dia_object_get_num_connections(obj); /* just comparing the sizes is still drawing more CPs than useful - try 50% */ @@ -178,7 +177,7 @@ diagram_update_connections_object(Diagram *dia, DiaObject *obj, } void -ddisplay_connect_selected(DDisplay *ddisp) +dia_display_connect_selected (DiaDisplay *ddisp) { GList *list; @@ -190,7 +189,7 @@ ddisplay_connect_selected(DDisplay *ddisp) for (i=0; inum_handles; i++) { if (selected_obj->handles[i]->connect_type != HANDLE_NONCONNECTABLE) { - object_connect_display(ddisp, selected_obj, selected_obj->handles[i], FALSE); + object_connect_display(ddisp, selected_obj, selected_obj->handles[i], FALSE); } } diff --git a/app/connectionpoint_ops.h b/app/connectionpoint_ops.h index df8c0d202625fbcf1de1775fdbd83a403f7bba6f..79d500966b188a60f6fddd6d24676af6e0a7ed8a 100644 --- a/app/connectionpoint_ops.h +++ b/app/connectionpoint_ops.h @@ -24,13 +24,13 @@ G_BEGIN_DECLS -void object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp); +void object_draw_connectionpoints(DiaObject *obj, DiaDisplay *ddisp); void connectionpoint_add_update(ConnectionPoint *conpoint, Diagram *dia); void diagram_update_connections_selection(Diagram *dia); void diagram_update_connections_object(Diagram *dia, DiaObject *obj, int update_nonmoved); -void ddisplay_connect_selected(DDisplay *ddisp); +void dia_display_connect_selected(DiaDisplay *ddisp); void diagram_unconnect_selected(Diagram *dia); G_END_DECLS diff --git a/app/create_object.c b/app/create_object.c deleted file mode 100644 index 6804123b620a9cb5bf9a5e722750f95b5627a921..0000000000000000000000000000000000000000 --- a/app/create_object.c +++ /dev/null @@ -1,309 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 "create_object.h" -#include "connectionpoint_ops.h" -#include "handle_ops.h" -#include "object_ops.h" -#include "preferences.h" -#include "undo.h" -#include "cursor.h" -#include "highlight.h" -#include "textedit.h" -#include "parent.h" -#include "message.h" -#include "object.h" -#include "intl.h" -#include "menus.h" - -static void create_object_button_press(CreateObjectTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void create_object_button_release(CreateObjectTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void create_object_motion(CreateObjectTool *tool, GdkEventMotion *event, - DDisplay *ddisp); -static void create_object_double_click(CreateObjectTool *tool, GdkEventMotion *event, - DDisplay *ddisp); - - -static void -create_object_button_press(CreateObjectTool *tool, GdkEventButton *event, - DDisplay *ddisp) -{ - Point clickedpoint, origpoint; - Handle *handle1; - Handle *handle2; - DiaObject *obj; - - ddisplay_untransform_coords(ddisp, - (int)event->x, (int)event->y, - &clickedpoint.x, &clickedpoint.y); - - origpoint = clickedpoint; - - snap_to_grid(ddisp, &clickedpoint.x, &clickedpoint.y); - - obj = dia_object_default_create (tool->objtype, &clickedpoint, - tool->user_data, - &handle1, &handle2); - - tool->obj = obj; /* ensure that tool->obj is initialised in case we - return early. */ - if (!obj) { - tool->moving = FALSE; - tool->handle = NULL; - message_error(_("'%s' creation failed"), tool->objtype ? tool->objtype->name : "NULL"); - return; - } - - diagram_add_object(ddisp->diagram, obj); - - /* Try a connect */ - if (handle1 != NULL && - handle1->connect_type != HANDLE_NONCONNECTABLE) { - ConnectionPoint *connectionpoint; - connectionpoint = - object_find_connectpoint_display(ddisp, &origpoint, obj, TRUE); - if (connectionpoint != NULL) { - (obj->ops->move)(obj, &origpoint); - } - } - - if (!(event->state & GDK_SHIFT_MASK)) { - /* Not Multi-select => remove current selection */ - diagram_remove_all_selected(ddisp->diagram, TRUE); - } - diagram_select(ddisp->diagram, obj); - - /* Connect first handle if possible: */ - if ((handle1!= NULL) && - (handle1->connect_type != HANDLE_NONCONNECTABLE)) { - object_connect_display(ddisp, obj, handle1, TRUE); - } - - object_add_updates(obj, ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); - diagram_flush(ddisp->diagram); - - if (handle2 != NULL) { - tool->handle = handle2; - tool->moving = TRUE; - tool->last_to = handle2->pos; - - gdk_pointer_grab (gtk_widget_get_window(ddisp->canvas), FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); - } else { - diagram_update_extents(ddisp->diagram); - tool->moving = FALSE; - } - -} - -static void -create_object_double_click(CreateObjectTool *tool, GdkEventMotion *event, - DDisplay *ddisp) -{ -} - -static void -create_object_button_release(CreateObjectTool *tool, GdkEventButton *event, - DDisplay *ddisp) -{ - GList *list = NULL; - DiaObject *obj = tool->obj; - gboolean reset; - - GList *parent_candidates; - - g_return_if_fail (obj != NULL); - if (!obj) /* not sure if this isn't enough */ - return; /* could be a legal invariant */ - - if (tool->moving) { - gdk_pointer_ungrab (event->time); - - object_add_updates(tool->obj, ddisp->diagram); - tool->obj->ops->move_handle(tool->obj, tool->handle, &tool->last_to, - NULL, HANDLE_MOVE_CREATE_FINAL, 0); - object_add_updates(tool->obj, ddisp->diagram); - - } - - parent_candidates = - layer_find_objects_containing_rectangle(obj->parent_layer, - &obj->bounding_box); - - /* whole object must be within another object to parent it */ - for (; parent_candidates != NULL; parent_candidates = g_list_next(parent_candidates)) { - DiaObject *parent_obj = (DiaObject *) parent_candidates->data; - if (obj != parent_obj - && object_within_parent(obj, parent_obj)) { - Change *change = undo_parenting(ddisp->diagram, parent_obj, obj, TRUE); - (change->apply)(change, ddisp->diagram); - break; - /* - obj->parent = parent_obj; - parent_obj->children = g_list_append(parent_obj->children, obj); - */ - } - } - g_list_free(parent_candidates); - - list = g_list_prepend(list, tool->obj); - - undo_insert_objects(ddisp->diagram, list, 1); - - if (tool->moving) { - if (tool->handle->connect_type != HANDLE_NONCONNECTABLE) { - object_connect_display(ddisp, tool->obj, tool->handle, TRUE); - diagram_update_connections_selection(ddisp->diagram); - diagram_flush(ddisp->diagram); - } - tool->moving = FALSE; - tool->handle = NULL; - tool->obj = NULL; - } - - { - /* remove position from status bar */ - GtkStatusbar *statusbar = GTK_STATUSBAR (ddisp->modified_status); - guint context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); - gtk_statusbar_pop (statusbar, context_id); - } - - highlight_reset_all(ddisp->diagram); - reset = prefs.reset_tools_after_create != tool->invert_persistence; - /* kind of backward: first starting editing to see if it is possible at all, than GUI reflection */ - if (textedit_activate_object(ddisp, obj, NULL) && reset) { - gtk_action_activate (menus_get_action ("ToolsTextedit")); - reset = FALSE; /* don't switch off textedit below */ - } - diagram_update_extents(ddisp->diagram); - diagram_modified(ddisp->diagram); - - undo_set_transactionpoint(ddisp->diagram->undo); - - if (reset) - tool_reset(); - ddisplay_set_all_cursor(default_cursor); - ddisplay_do_update_menu_sensitivity(ddisp); -} - -static void -create_object_motion(CreateObjectTool *tool, GdkEventMotion *event, - DDisplay *ddisp) -{ - Point to; - ConnectionPoint *connectionpoint = NULL; - gchar *postext; - GtkStatusbar *statusbar; - guint context_id; - - if (!tool->moving) - return; - - ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); - - /* make sure the new object is restricted to its parent */ - parent_handle_move_out_check(tool->obj, &to); - - /* Move to ConnectionPoint if near: */ - if (tool->handle != NULL && - tool->handle->connect_type != HANDLE_NONCONNECTABLE) { - connectionpoint = - object_find_connectpoint_display(ddisp, &to, tool->obj, TRUE); - - if (connectionpoint != NULL) { - to = connectionpoint->pos; - highlight_object(connectionpoint->object, DIA_HIGHLIGHT_CONNECTIONPOINT, ddisp->diagram); - ddisplay_set_all_cursor(get_cursor(CURSOR_CONNECT)); - } - } - - if (connectionpoint == NULL) { - /* No connectionopoint near, then snap to grid (if enabled) */ - snap_to_grid(ddisp, &to.x, &to.y); - highlight_reset_all(ddisp->diagram); - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); - } - - object_add_updates(tool->obj, ddisp->diagram); - tool->obj->ops->move_handle(tool->obj, tool->handle, &to, connectionpoint, - HANDLE_MOVE_CREATE, 0); - object_add_updates(tool->obj, ddisp->diagram); - - /* Put current mouse position in status bar */ - statusbar = GTK_STATUSBAR (ddisp->modified_status); - context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); - - postext = g_strdup_printf("%.3f, %.3f - %.3f, %.3f", - tool->obj->bounding_box.left, - tool->obj->bounding_box.top, - tool->obj->bounding_box.right, - tool->obj->bounding_box.bottom); - - gtk_statusbar_pop (statusbar, context_id); - gtk_statusbar_push (statusbar, context_id, postext); - - g_free(postext); - - diagram_flush(ddisp->diagram); - - tool->last_to = to; - - return; -} - - - -Tool * -create_create_object_tool(DiaObjectType *objtype, void *user_data, - int invert_persistence) -{ - CreateObjectTool *tool; - - tool = g_new0(CreateObjectTool, 1); - tool->tool.type = CREATE_OBJECT_TOOL; - tool->tool.button_press_func = (ButtonPressFunc) &create_object_button_press; - tool->tool.button_release_func = (ButtonReleaseFunc) &create_object_button_release; - tool->tool.motion_func = (MotionFunc) &create_object_motion; - tool->tool.double_click_func = (DoubleClickFunc) &create_object_double_click; - - tool->objtype = objtype; - tool->user_data = user_data; - tool->moving = FALSE; - tool->invert_persistence = invert_persistence; - - ddisplay_set_all_cursor(get_cursor(CURSOR_CREATE)); - - return (Tool *) tool; -} - -void free_create_object_tool(Tool *tool) -{ - CreateObjectTool *real_tool = (CreateObjectTool *)tool; - - if (real_tool->moving) { /* should not get here, but see bug #619246 */ - gdk_pointer_ungrab (GDK_CURRENT_TIME); - ddisplay_set_all_cursor(default_cursor); - } - g_free(tool); -} diff --git a/app/cursor.c b/app/cursor.c index 54f0549e6ab3e3ffe25c92d99928a1f20eb95d04..29d2abca91ab533f40f446bdb556b3780b83002c 100644 --- a/app/cursor.c +++ b/app/cursor.c @@ -83,7 +83,7 @@ get_cursor(DiaCursorType ctype) if (cursors[ctype].gdk_cursor_number != DIA_CURSOR) { new_cursor = gdk_cursor_new(cursors[ctype].gdk_cursor_number); } else { - DDisplay *active_display = ddisplay_active (); + DiaDisplay *active_display = dia_display_active (); if (active_display != NULL) new_cursor = create_cursor(gtk_widget_get_window(active_display->canvas), cursors[ctype].data, @@ -106,11 +106,7 @@ create_cursor(GdkWindow *window, GdkDisplay *display; g_return_val_if_fail(window != NULL, NULL); -#if GTK_CHECK_VERSION (2,24,0) display = gdk_window_get_display (window); -#else - display = gdk_drawable_get_display (GDK_DRAWABLE (window)); -#endif pixbuf = gdk_pixbuf_new_from_inline(-1, data, FALSE, NULL); diff --git a/app/defaults.c b/app/defaults.c index 9800831e3c0cf2a9113d251276f77865ea178a12..d994572f88881c48a96919b8813172e495b79abe 100644 --- a/app/defaults.c +++ b/app/defaults.c @@ -43,9 +43,9 @@ static void create_dialog() dialog = gtk_dialog_new_with_buttons( _("Object defaults"), NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); diff --git a/app/dia-application.c b/app/dia-application.c index cc9e422d4c0988e68935d06ba9dcf52ebdc1920a..2288d471949ed6c983264413fbb6d03093d0ba6c 100644 --- a/app/dia-application.c +++ b/app/dia-application.c @@ -11,8 +11,6 @@ diagtree_show_callback #include "dia-application.h" #include "display.h" -#include - enum { DIAGRAM_ADD, DIAGRAM_CHANGE, @@ -37,9 +35,9 @@ struct _DiaApplicationClass void (*diagram_change) (DiaApplication *app, Diagram *diagram, guint flags); void (*diagram_remove) (DiaApplication *app, Diagram *diagram); - void (*display_add) (DiaApplication *app, DDisplay *display); - void (*display_change) (DiaApplication *app, DDisplay *display, guint flags); - void (*display_remove) (DiaApplication *app, DDisplay *display); + void (*display_add) (DiaApplication *app, DiaDisplay *display); + void (*display_change) (DiaApplication *app, DiaDisplay *display, guint flags); + void (*display_remove) (DiaApplication *app, DiaDisplay *display); }; /** @@ -65,31 +63,25 @@ dia_application_class_init (DiaApplicationClass *klass) G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (DiaApplicationClass, diagram_add), - NULL, NULL, - dia_marshal_VOID__OBJECT, + NULL, NULL, NULL, G_TYPE_NONE, - 1, - DIA_TYPE_DIAGRAM); + 1, DIA_TYPE_DIAGRAM); _dia_application_signals[DIAGRAM_CHANGE] = g_signal_new ("diagram_change", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (DiaApplicationClass, diagram_change), - NULL, NULL, - dia_marshal_VOID__OBJECT_UINT_POINTER, + NULL, NULL, NULL, G_TYPE_NONE, - 3, - DIA_TYPE_DIAGRAM, G_TYPE_UINT, G_TYPE_POINTER); + 3, DIA_TYPE_DIAGRAM, G_TYPE_UINT, G_TYPE_POINTER); _dia_application_signals[DIAGRAM_REMOVE] = g_signal_new ("diagram_remove", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (DiaApplicationClass, diagram_remove), - NULL, NULL, - dia_marshal_VOID__OBJECT, + NULL, NULL, NULL, G_TYPE_NONE, - 1, - DIA_TYPE_DIAGRAM); + 1, DIA_TYPE_DIAGRAM); } static void diff --git a/app/dia-canvas.c b/app/dia-canvas.c new file mode 100644 index 0000000000000000000000000000000000000000..c6ec17e70cd4a9114c3a6682cd33d577ba441223 --- /dev/null +++ b/app/dia-canvas.c @@ -0,0 +1,264 @@ +#include +#include + +#include "dia-canvas.h" +#include "disp_callbacks.h" +#include "toolbox.h" +#include "display.h" +#include "interface.h" +#include "object.h" + +typedef struct _DiaCanvasPrivate DiaCanvasPrivate; + +struct _DiaCanvasPrivate { + DiaDisplay *display; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaCanvas, dia_canvas, GTK_TYPE_DRAWING_AREA, + G_ADD_PRIVATE (DiaCanvas)) + +enum { + PROP_DISPLAY = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +GtkWidget * +dia_canvas_new (DiaDisplay *ddisp) +{ + return g_object_new (DIA_TYPE_CANVAS, + "display", ddisp, + NULL); +} + +DiaDisplay * +dia_canvas_get_display (DiaCanvas *self) +{ + DiaCanvasPrivate *priv; + + g_return_val_if_fail (self != NULL, NULL); + + priv = dia_canvas_get_instance_private (DIA_CANVAS (self)); + + return priv->display; +} + +static gboolean +dia_canvas_drag_drop (GtkWidget *self, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + if (gtk_drag_get_source_widget (context) != NULL) { + /* we only accept drops from the same instance of the application, + * as the drag data is a pointer in our address space */ + return TRUE; + } + gtk_drag_finish (context, FALSE, FALSE, time); + return FALSE; +} + +static void +dia_canvas_drag_data_received (GtkWidget *self, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time) +{ + DiaDisplay *ddisp = dia_canvas_get_display (DIA_CANVAS (self)); + if (gtk_selection_data_get_format (data) == 8 && + gtk_selection_data_get_length (data) == sizeof (ToolButtonData *) && + gtk_drag_get_source_widget (context) != NULL) { + ToolButtonData *tooldata = *(ToolButtonData **) gtk_selection_data_get_data (data); + /* g_message("Tool drop %s at (%d, %d)", (gchar *)tooldata->extra_data, x, y);*/ + dia_display_drop_object (ddisp, x, y, + object_get_type ((gchar *) tooldata->extra_data), + tooldata->user_data); + + gtk_drag_finish (context, TRUE, FALSE, time); + } else { + dia_dnd_file_drag_data_received (self, context, x, y, data, info, time, ddisp); + } + /* ensure the right window has the focus for text editing */ + gtk_window_present (GTK_WINDOW (ddisp->shell)); +} + +/*! + * Called when the widget's window "size, position or stacking" + * changes. Needs GDK_STRUCTURE_MASK set. + */ +static void +dia_canvas_size_allocate (GtkWidget *self, + GtkAllocation *alloc) +{ + int width, height; + DiaDisplay *ddisp = dia_canvas_get_display (DIA_CANVAS (self)); + + if (ddisp->renderer) { + width = dia_renderer_get_width_pixels (ddisp->renderer); + height = dia_renderer_get_height_pixels (ddisp->renderer); + } else { + /* We can continue even without a renderer here because + * dia_display_resize_canvas () does the setup for us. + */ + width = height = 0; + } + + /* Only do this when size is really changing */ + if (width != alloc->width || height != alloc->height) { + g_message ("Canvas size change..."); + dia_display_resize_canvas (ddisp, alloc->width, alloc->height); + dia_display_update_scrollbars(ddisp); + } + + /* If the UI is not integrated, resizing should set the resized + * window as active. With integrated UI, there is only one window. + */ + if (is_integrated_ui () == 0) + display_set_active(ddisp); + + GTK_WIDGET_CLASS (dia_canvas_parent_class)->size_allocate (self, alloc); +} + +static gboolean +dia_canvas_draw (GtkWidget *self, + cairo_t *ctx) +{ + GSList *l; + Rectangle *r, totrect; + DiaInteractiveRendererInterface *renderer; + DiaDisplay *ddisp = dia_canvas_get_display (DIA_CANVAS (self)); + + g_return_val_if_fail (ddisp->renderer != NULL, FALSE); + + /* Renders updates to pixmap + copies display_areas to canvas(screen) */ + renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); + + /* Only update if update_areas exist */ + l = ddisp->update_areas; + if (l != NULL) + { + totrect = *(Rectangle *) l->data; + + g_return_val_if_fail ( renderer->clip_region_clear != NULL + && renderer->clip_region_add_rect != NULL, FALSE); + + renderer->clip_region_clear (ddisp->renderer); + + while(l!=NULL) { + r = (Rectangle *) l->data; + + rectangle_union(&totrect, r); + renderer->clip_region_add_rect (ddisp->renderer, r); + + l = g_slist_next(l); + } + /* Free update_areas list: */ + l = ddisp->update_areas; + while(l!=NULL) { + g_free(l->data); + l = g_slist_next(l); + } + g_slist_free(ddisp->update_areas); + ddisp->update_areas = NULL; + + totrect.left -= 0.1; + totrect.right += 0.1; + totrect.top -= 0.1; + totrect.bottom += 0.1; + + dia_display_render_pixmap(ddisp, &totrect); + } + + dia_interactive_renderer_paint (ddisp->renderer, + ctx, + gtk_widget_get_allocated_width (self), + gtk_widget_get_allocated_height (self)); + + return FALSE; +} + +static void +dia_canvas_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaCanvas *self = DIA_CANVAS (object); + DiaCanvasPrivate *priv = dia_canvas_get_instance_private (self); + + switch (property_id) { + case PROP_DISPLAY: + priv->display = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_canvas_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaCanvas *self = DIA_CANVAS (object); + DiaCanvasPrivate *priv = dia_canvas_get_instance_private (self); + + switch (property_id) { + case PROP_DISPLAY: + g_value_set_object (value, priv->display); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_canvas_class_init (DiaCanvasClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->set_property = dia_canvas_set_property; + object_class->get_property = dia_canvas_get_property; + + properties[PROP_DISPLAY] = + g_param_spec_object ("display", + "Display", + "Editor this canvas is part of", + DIA_TYPE_DISPLAY, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + widget_class->drag_drop = dia_canvas_drag_drop; + widget_class->drag_data_received = dia_canvas_drag_data_received; + widget_class->size_allocate = dia_canvas_size_allocate; + widget_class->draw = dia_canvas_draw; + + gtk_widget_class_set_css_name (widget_class, "dia-canvas"); +} + +static void +dia_canvas_init (DiaCanvas * self) +{ + gtk_widget_add_events (GTK_WIDGET (self), + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK); + gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE); + g_signal_connect (G_OBJECT (self), "event", + G_CALLBACK (dia_display_canvas_events), NULL); + + canvas_setup_drag_dest (GTK_WIDGET (self)); +} diff --git a/app/dia-canvas.h b/app/dia-canvas.h new file mode 100644 index 0000000000000000000000000000000000000000..56f9bf015afafdefc0d42da9b3ec3a1e3e3912a6 --- /dev/null +++ b/app/dia-canvas.h @@ -0,0 +1,22 @@ +#ifndef __DIACANVAS_H__ +#define __DIACANVAS_H__ + +#include +#include +#include "display.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_CANVAS (dia_canvas_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaCanvas, dia_canvas, DIA, CANVAS, GtkDrawingArea) + +struct _DiaCanvasClass { + GtkDrawingAreaClass parent_class; +}; + +GtkWidget *dia_canvas_new (DiaDisplay *ddisp); +DiaDisplay *dia_canvas_get_display (DiaCanvas *self); + +G_END_DECLS + +#endif diff --git a/app/dia-colour-area.c b/app/dia-colour-area.c new file mode 100644 index 0000000000000000000000000000000000000000..ba5026ed1f1712270dd016a9a29adf8c16cf1fa0 --- /dev/null +++ b/app/dia-colour-area.c @@ -0,0 +1,286 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "intl.h" + +#include "dia-colour-area.h" +#include "attributes.h" +#include "persistence.h" + +#define FORE_AREA 0 +#define BACK_AREA 1 +#define SWAP_AREA 2 +#define DEF_AREA 3 + +#define FOREGROUND 0 +#define BACKGROUND 1 + +G_DEFINE_TYPE (DiaColourArea, dia_colour_area, GTK_TYPE_EVENT_BOX) + +/* Local functions */ +static int +dia_colour_area_target (DiaColourArea *self, + int x, + int y) +{ + gint rect_w, rect_h; + gint width, height; + + width = gtk_widget_get_allocated_width (GTK_WIDGET (self)); + height = gtk_widget_get_allocated_height (GTK_WIDGET (self)); + + rect_w = width * 0.65; + rect_h = height * 0.65; + + /* foreground active */ + if (x > 0 && x < rect_w && + y > 0 && y < rect_h) + return FORE_AREA; + else if (x > (width - rect_w) && x < width && + y > (height - rect_h) && y < height) + return BACK_AREA; + else if (x > 0 && x < (width - rect_w) && + y > rect_h && y < height) + return DEF_AREA; + else if (x > rect_w && x < width && + y > 0 && y < (height - rect_h)) + return SWAP_AREA; + else + return -1; +} + +static gboolean +dia_colour_area_draw (GtkWidget *self, cairo_t *ctx) +{ + GdkRGBA fg, bg; + gint rect_w, rect_h; + gint width, height; + gint img_width, img_height; + DiaColourArea *priv = DIA_COLOUR_AREA (self); + + width = gtk_widget_get_allocated_width (self); + height = gtk_widget_get_allocated_height (self); + + fg = attributes_get_foreground(); + bg = attributes_get_background(); + + rect_w = width * 0.65; + rect_h = height * 0.65; + + gdk_cairo_set_source_rgba (ctx, &bg); + + cairo_rectangle (ctx, + (width - rect_w), (height - rect_h), rect_w, rect_h); + cairo_fill (ctx); + + gdk_cairo_set_source_rgba (ctx, &fg); + cairo_rectangle (ctx, 0, 0, rect_w, rect_h); + cairo_fill (ctx); + + /* draw the default colours pixmap */ + img_width = gdk_pixbuf_get_width (priv->reset); + img_height = gdk_pixbuf_get_height (priv->reset); + gdk_cairo_set_source_pixbuf (ctx, priv->reset, 0, height - img_height); + cairo_rectangle (ctx, 0, height - img_height, img_width, img_height); + cairo_fill (ctx); + + /* draw the swap pixmap */ + img_width = gdk_pixbuf_get_width (priv->swap); + img_height = gdk_pixbuf_get_height (priv->swap); + gdk_cairo_set_source_pixbuf (ctx, priv->swap, width - img_width, 0); + cairo_rectangle (ctx, width - img_width, 0, img_width, img_height); + cairo_fill (ctx); + + return FALSE; +} + +static void +dia_colour_area_response (GtkDialog *chooser, + gint response, + DiaColourArea *self) +{ + if (response == GTK_RESPONSE_OK) { + GdkRGBA color; + + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (chooser), &color); + + if (self->edit_color == FOREGROUND) { + attributes_set_foreground (&color); + } else { + attributes_set_background (&color); + } + } else { + attributes_set_foreground(&self->stored_foreground); + attributes_set_background(&self->stored_background); + } + + gtk_widget_hide (self->color_select); + self->color_select_active = 0; + + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); +} + +static void +dia_colour_area_edit (DiaColourArea *self) +{ + GtkWidget *window; + GdkRGBA color; + + if (!self->color_select_active) { + self->stored_foreground = attributes_get_foreground(); + self->stored_background = attributes_get_background(); + } + + if (self->active_color == FOREGROUND) { + color = attributes_get_foreground(); + self->edit_color = FOREGROUND; + } else { + color = attributes_get_background(); + self->edit_color = BACKGROUND; + } + + if (self->color_select) { + window = self->color_select; + + gtk_window_set_title (GTK_WINDOW (self->color_select), + self->edit_color == FOREGROUND ? + _("Select foreground color") : _("Select background color")); + + if (!self->color_select_active) { + gtk_widget_show (self->color_select); + } + } else { + window = self->color_select = + gtk_color_chooser_dialog_new (self->edit_color == FOREGROUND ? + _("Select foreground color") : _("Select background color"), + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)))); + + self->color_select_active = 1; + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (window), TRUE); + + g_signal_connect (G_OBJECT (window), "response", + G_CALLBACK (dia_colour_area_response), self); + + /* Make sure window is shown before setting its colors: */ + gtk_widget_show (self->color_select); + } + + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (self->color_select), &color); +} + +static gint +dia_colour_area_event (GtkWidget *widget, + GdkEvent *event) +{ + DiaColourArea *self = DIA_COLOUR_AREA (widget); + GdkEventButton *bevent; + int target; + + switch (event->type) { + case GDK_BUTTON_PRESS: + bevent = (GdkEventButton *) event; + + if (bevent->button == 1) { + switch ((target = dia_colour_area_target (self, bevent->x, bevent->y))) { + case FORE_AREA: + case BACK_AREA: + if (target == self->active_color) { + dia_colour_area_edit (self); + } else { + self->active_color = target; + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + } + break; + case SWAP_AREA: + attributes_swap_fgbg(); + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + break; + case DEF_AREA: + attributes_default_fgbg(); + /* Trigger redraw */ + gtk_widget_queue_draw (GTK_WIDGET (self)); + break; + } + } + break; + + default: + break; + } + + return FALSE; +} + +#include "pixmaps/swap.xpm" +#include "pixmaps/default.xpm" + +static void +dia_colour_area_class_init (DiaColourAreaClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_colour_area_draw; + widget_class->event = dia_colour_area_event; + + attributes_set_foreground (persistence_register_color ("fg_color", &color_black)); + attributes_set_background (persistence_register_color ("bg_color", &color_white)); +} + +static void +dia_colour_area_init (DiaColourArea *self) +{ + self->reset = gdk_pixbuf_new_from_xpm_data (default_xpm); + self->swap = gdk_pixbuf_new_from_xpm_data (swap_xpm); + + self->active_color = 0; + + self->color_select = NULL; + self->color_select_active = 0; + + gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); + + gtk_widget_set_tooltip_text (GTK_WIDGET (self), + _("Foreground & background colors for new objects. " + "The small black and white squares reset colors. " + "The small arrows swap colors. Double-click to " + "change colors.")); +} + +GtkWidget * +dia_colour_area_new (int width, + int height) +{ + GtkWidget *event_box; + + event_box = g_object_new (DIA_TYPE_COLOUR_AREA, NULL); + gtk_widget_set_size_request (event_box, width, height); + + gtk_widget_show (event_box); + + return event_box; +} diff --git a/app/color_area.h b/app/dia-colour-area.h similarity index 60% rename from app/color_area.h rename to app/dia-colour-area.h index 56f753f1cb95bc0420b1a184ddeba0198beafbfa..364dc9ab42fa08dc0d3b1dcc44ac31b5f28a88f3 100644 --- a/app/color_area.h +++ b/app/dia-colour-area.h @@ -15,11 +15,33 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef COLOR_AREA_H -#define COLOR_AREA_H +#ifndef COLOUR_AREA_H +#define COLOUR_AREA_H #include -GtkWidget *color_area_create (int width, int height, GtkWidget *parent, GtkStyle *style); +G_BEGIN_DECLS -#endif /* COLOR_AREA_H */ +#define DIA_TYPE_COLOUR_AREA (dia_colour_area_get_type ()) +G_DECLARE_FINAL_TYPE (DiaColourArea, dia_colour_area, DIA, COLOUR_AREA, GtkEventBox) + +struct _DiaColourArea +{ + GtkEventBox parent; + int active_color; + + GdkPixbuf *reset; + GdkPixbuf *swap; + + GtkWidget *color_select; + int color_select_active; + int edit_color; + GdkRGBA stored_foreground; + GdkRGBA stored_background; +}; + +GtkWidget *dia_colour_area_new (int width, int height); + +G_END_DECLS + +#endif /* COLOUR_AREA_H */ diff --git a/app/dia-line-width-area.c b/app/dia-line-width-area.c new file mode 100644 index 0000000000000000000000000000000000000000..dec70690214fdca2bc6a4a1567f9007d380d9ef2 --- /dev/null +++ b/app/dia-line-width-area.c @@ -0,0 +1,261 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "dia-line-width-area.h" +#include "attributes.h" +#include "persistence.h" +#include "intl.h" + +#if !defined(rint) +# include +# define rint(x) floor ((x) + 0.5) +#endif + +#define BASE_WIDTH 0.05 +#define PIXELS_BETWEEN_LINES 6 +#define NUMLINES 5 + +#define X_OFFSET(i) (PIXELS_BETWEEN_LINES*(i)+((i)-1)*(i)/2) + +#define AREA_WIDTH X_OFFSET(NUMLINES+1) +#define AREA_HEIGHT 42 + +G_DEFINE_TYPE (DiaLineWidthArea, dia_line_width_area, GTK_TYPE_EVENT_BOX) + +static int +linewidth_area_target (int x, int y) +{ + int i; + int x_offs; + for (i=1;i<=NUMLINES;i++) { + x_offs = X_OFFSET(i); + if ((x>=x_offs-PIXELS_BETWEEN_LINES/2) && + (x 0.0005 || + (width/BASE_WIDTH > NUMLINES)) { + return 0; + } else { + return width/BASE_WIDTH+1.0005; + } +} + +static void +dia_line_width_area_dialog_respond (GtkWidget *widget, + gint response_id, + DiaLineWidthArea *self) +{ + if (response_id == GTK_RESPONSE_OK) { + float newvalue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (self->button)); + self->active = linewidth_number_from_width (newvalue); + /* Trigger redraw */ + gtk_widget_queue_draw (self); + attributes_set_default_linewidth (newvalue); + } + gtk_widget_hide(self->dialog); +} + +static void +dia_line_width_area_dialog_ok (GtkWidget *widget, DiaLineWidthArea *self) +{ + gtk_dialog_response (GTK_DIALOG (self->dialog), GTK_RESPONSE_OK); +} + +/* Crashes with gtk_widget_destroyed, so use this instead */ +static void +dialog_destroyed(GtkWidget *widget, gpointer data) +{ + GtkWidget **wid = (GtkWidget**)data; + if (wid) *wid = NULL; +} + +static void +dia_line_width_area_create_dialog (DiaLineWidthArea *self, + GtkWindow *toplevel) +{ + GtkWidget *hbox; + GtkWidget *label; + GtkAdjustment *adj; + + self->dialog = gtk_dialog_new_with_buttons (_("Line width"), toplevel, 0, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG(self->dialog), GTK_RESPONSE_OK); + gtk_window_set_role (GTK_WINDOW (self->dialog), "linewidth_window"); + gtk_window_set_resizable (GTK_WINDOW (self->dialog), TRUE); + gtk_container_set_border_width (GTK_CONTAINER (self->dialog), 2); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + label = gtk_label_new(_("Line width:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + adj = (GtkAdjustment *) gtk_adjustment_new(0.1, 0.00, 10.0, 0.01, 0.05, 0.0); + self->button = gtk_spin_button_new(adj, attributes_get_default_linewidth(), 2); + gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(self->button), TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(self->button), TRUE); + gtk_box_pack_start(GTK_BOX (hbox), self->button, TRUE, TRUE, 0); + gtk_widget_show (self->button); + gtk_widget_show(hbox); + gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG (self->dialog))), hbox, TRUE, TRUE, 0); + + gtk_widget_show (self->button); + + g_signal_connect(G_OBJECT (self->dialog), "response", + G_CALLBACK (dia_line_width_area_dialog_respond), self); + g_signal_connect_after (G_OBJECT (self->button), "activate", + G_CALLBACK (dia_line_width_area_dialog_ok), self); + + g_signal_connect (G_OBJECT (self->dialog), "delete_event", + G_CALLBACK(gtk_widget_hide), NULL); + g_signal_connect (G_OBJECT (self->dialog), "destroy", + G_CALLBACK(dialog_destroyed), &self->dialog); + + persistence_register_window (GTK_WINDOW (self->dialog)); +} + +static gboolean +dia_line_width_area_draw (GtkWidget *self, cairo_t *ctx) +{ + GdkRGBA fg; + int width, height; + int i; + int x_offs; + GtkStyle *style; + double dashes[] = { 3 }; + DiaLineWidthArea *priv = DIA_LINE_WIDTH_AREA (self); + + cairo_set_line_width (ctx, 1); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + cairo_set_dash (ctx, dashes, 1, 0); + + width = gtk_widget_get_allocated_width (self); + height = gtk_widget_get_allocated_height (self); + + style = gtk_widget_get_style (self); + + gtk_style_context_get_color (gtk_widget_get_style_context (self), + gtk_widget_get_state_flags (self), + &fg); + + gdk_cairo_set_source_rgba (ctx, &fg); + + for (i = 0; i <= NUMLINES; i++) { + x_offs = X_OFFSET(i); + + cairo_rectangle (ctx, x_offs, 2, i, height - 4); + cairo_fill (ctx); + } + + if (priv->active != 0) { + cairo_rectangle (ctx, X_OFFSET(priv->active) - 2, 0, + priv->active + 4, height - 1); + cairo_stroke (ctx); + } + + return FALSE; +} + +static gint +dia_line_width_area_event (GtkWidget *self, + GdkEvent *event) +{ + GdkEventButton *bevent; + GdkEventConfigure *cevent; + int target; + DiaLineWidthArea *priv = DIA_LINE_WIDTH_AREA (self); + + switch (event->type) + { + case GDK_BUTTON_PRESS: + bevent = (GdkEventButton *) event; + if (bevent->button == 1) { + target = linewidth_area_target (bevent->x, bevent->y); + if (target != 0) { + priv->active = target; + /* Trigger redraw */ + gtk_widget_queue_draw (self); + attributes_set_default_linewidth(BASE_WIDTH*(target-1)); + } + } + break; + + case GDK_2BUTTON_PRESS: + if (priv->dialog == NULL) + dia_line_width_area_create_dialog (priv, GTK_WINDOW (gtk_widget_get_toplevel (self))); + else + gtk_widget_grab_focus (priv->button); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->button), attributes_get_default_linewidth ()); + + gtk_widget_show (priv->dialog); + break; + + default: + break; + } + + return FALSE; +} + +static void +dia_line_width_area_class_init (DiaLineWidthAreaClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_line_width_area_draw; + widget_class->event = dia_line_width_area_event; + + attributes_set_default_linewidth (persistence_register_real ("linewidth", 0.1)); +} + +static void +dia_line_width_area_init (DiaLineWidthArea *self) +{ + self->active = linewidth_number_from_width (attributes_get_default_linewidth ()); + + gtk_widget_set_events (GTK_WIDGET (self), GDK_BUTTON_PRESS_MASK); + gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Line widths. Click on a line to set the default line width for new objects. Double-click to set the line width more precisely.")); +} + + +GtkWidget * +dia_line_width_area_new () +{ + GtkWidget *event_box; + + event_box = g_object_new (DIA_TYPE_LINE_WIDTH_AREA, NULL); + gtk_widget_set_size_request (event_box, AREA_WIDTH, AREA_HEIGHT); + + gtk_widget_show (event_box); + + return event_box; +} diff --git a/app/linewidth_area.h b/app/dia-line-width-area.h similarity index 74% rename from app/linewidth_area.h rename to app/dia-line-width-area.h index d32b037fc2672fc9862501ba73a9015736d2e11d..33eb7d104164568d3acea0846a1baa1a5e15a8f0 100644 --- a/app/linewidth_area.h +++ b/app/dia-line-width-area.h @@ -20,7 +20,19 @@ #include -GtkWidget *linewidth_area_create (void); +#define DIA_TYPE_LINE_WIDTH_AREA (dia_line_width_area_get_type ()) +G_DECLARE_FINAL_TYPE (DiaLineWidthArea, dia_line_width_area, DIA, LINE_WIDTH_AREA, GtkEventBox) + +struct _DiaLineWidthArea +{ + GtkEventBox parent; + + int active; + GtkWidget *dialog; + GtkWidget *button; +}; + +GtkWidget *dia_line_width_area_new (); #endif /* LINEWDITH_AREA_H */ diff --git a/app/dia-props.c b/app/dia-props.c index 49aa6ff0fa58b37225b0e92fb3c8b7e2a48d480a..5aa170e05ce45fe26736cf0f2be2f64458696ae5 100644 --- a/app/dia-props.c +++ b/app/dia-props.c @@ -48,7 +48,7 @@ static void diagram_properties_update_sensitivity(GtkToggleButton *widget, gpointer userdata) { - Diagram *dia = ddisplay_active_diagram(); + Diagram *dia = dia_display_active_diagram(); gboolean dyn_grid, square_grid, hex_grid; if (!dia) @@ -84,16 +84,17 @@ create_diagram_properties_dialog(Diagram *dia) dialog = gtk_dialog_new_with_buttons( _("Diagram Properties"), - GTK_WINDOW(ddisplay_active()->shell), + GTK_WINDOW(dia_display_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CANCEL, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); dialog_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox), 0); gtk_window_set_role(GTK_WINDOW(dialog), "diagram_properties"); @@ -106,138 +107,134 @@ create_diagram_properties_dialog(Diagram *dia) G_CALLBACK(gtk_widget_destroyed), &dialog); notebook = gtk_notebook_new(); - gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); + gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); gtk_box_pack_start(GTK_BOX(dialog_vbox), notebook, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(notebook), 2); gtk_widget_show(notebook); /* the grid page */ - table = gtk_table_new(3,3,FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 2); - gtk_table_set_row_spacings(GTK_TABLE(table), 1); - gtk_table_set_col_spacings(GTK_TABLE(table), 2); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 1); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); dynamic_check = gtk_check_button_new_with_label(_("Dynamic grid")); - gtk_table_attach(GTK_TABLE(table), dynamic_check, 1,2, 0,1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), dynamic_check, 1, 0, 1, 1); g_signal_connect(G_OBJECT(dynamic_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); gtk_widget_show(dynamic_check); - label = gtk_label_new(_("x")); - gtk_table_attach(GTK_TABLE(table), label, 1,2, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); - label = gtk_label_new(_("y")); - gtk_table_attach(GTK_TABLE(table), label, 2,3, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + label = gtk_label_new (_("x")); + gtk_grid_attach (GTK_GRID (table), label, 1, 1, 1, 1); + gtk_widget_show (label); + label = gtk_label_new (_("y")); + gtk_grid_attach (GTK_GRID (table), label, 2, 1, 1, 1); + gtk_widget_show (label); label = gtk_label_new(_("Spacing")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_x_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_x_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), width_x_entry, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(width_x_entry); + gtk_widget_set_hexpand (width_x_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), width_x_entry, 1, 2, 1, 1); + gtk_widget_show (width_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 10.0, 0.1, 10.0, 0)); width_y_entry = gtk_spin_button_new(adj, 1.0, 3); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(width_y_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), width_y_entry, 2,3, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(width_y_entry); + gtk_widget_set_hexpand (width_y_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), width_y_entry, 2, 2, 1, 1); + gtk_widget_show (width_y_entry); label = gtk_label_new(_("Visible spacing")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 3,4, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID(table), label, 0, 3, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_x_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_x_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), visible_x_entry, 1,2, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(visible_x_entry); + gtk_widget_set_hexpand (visible_x_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), visible_x_entry, 1, 3, 1, 1); + gtk_widget_show (visible_x_entry); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); visible_y_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(visible_y_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), visible_y_entry, 2,3, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(visible_y_entry); + gtk_widget_set_hexpand (visible_y_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), visible_y_entry, 2, 3, 1, 1); + gtk_widget_show (visible_y_entry); /* Hexes! */ hex_check = gtk_check_button_new_with_label(_("Hex grid")); - gtk_table_attach(GTK_TABLE(table), hex_check, 1,2, 4,5, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), hex_check, 1, 4, 1, 1); g_signal_connect(G_OBJECT(hex_check), "toggled", G_CALLBACK(diagram_properties_update_sensitivity), NULL); gtk_widget_show(hex_check); label = gtk_label_new(_("Hex grid size")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 5,6, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 5, 1, 1); + gtk_widget_show (label); adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.0, 100.0, 1.0, 10.0, 0)); hex_size_entry = gtk_spin_button_new(adj, 1.0, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(hex_size_entry), TRUE); - gtk_table_attach(GTK_TABLE(table), hex_size_entry, 1,2, 5,6, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(hex_size_entry); + gtk_widget_set_hexpand (hex_size_entry, TRUE); + gtk_grid_attach (GTK_GRID (table), hex_size_entry, 1, 5, 1, 1); + gtk_widget_show (hex_size_entry); - label = gtk_label_new(_("Grid")); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); - gtk_widget_show(table); - gtk_widget_show(label); + label = gtk_label_new (_("Grid")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label); + gtk_widget_show (table); + gtk_widget_show (label); /* The background page */ - table = gtk_table_new(1,2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 2); - gtk_table_set_row_spacings(GTK_TABLE(table), 1); - gtk_table_set_col_spacings(GTK_TABLE(table), 2); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 2); + gtk_grid_set_row_spacing (GTK_GRID (table), 1); + gtk_grid_set_column_spacing (GTK_GRID (table), 2); label = gtk_label_new(_("Background")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 0,1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_widget_show(label); - bg_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), bg_colour, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(bg_colour); + bg_colour = gtk_color_button_new (); + gtk_widget_set_hexpand (bg_colour, TRUE); + gtk_grid_attach (GTK_GRID(table), bg_colour, 1, 0, 1, 1); + gtk_widget_show (bg_colour); label = gtk_label_new(_("Grid Lines")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + gtk_widget_show (label); - grid_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), grid_colour, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(grid_colour); + grid_colour = gtk_color_button_new (); + gtk_widget_set_hexpand (grid_colour, TRUE); + gtk_grid_attach (GTK_GRID (table), grid_colour, 1, 1, 1, 1); + gtk_widget_show (grid_colour); label = gtk_label_new(_("Page Breaks")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(label); - - pagebreak_colour = dia_color_selector_new(); - gtk_table_attach(GTK_TABLE(table), pagebreak_colour, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + gtk_widget_show (label); + + pagebreak_colour = gtk_color_button_new (); + gtk_widget_set_hexpand (pagebreak_colour, TRUE); + gtk_grid_attach (GTK_GRID (table), pagebreak_colour, 1, 2, 1, 1); gtk_widget_show(pagebreak_colour); label = gtk_label_new(_("Colors")); @@ -280,12 +277,12 @@ diagram_properties_retrieve(Diagram *dia) gtk_spin_button_set_value(GTK_SPIN_BUTTON(hex_size_entry), dia->grid.hex_size); - dia_color_selector_set_color(bg_colour, - &dia->data->bg_color); - dia_color_selector_set_color(grid_colour, - &dia->grid.colour); - dia_color_selector_set_color(pagebreak_colour, - &dia->pagebreak_color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (bg_colour), + &dia->data->bg_color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (grid_colour), + &dia->grid.colour); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pagebreak_colour), + &dia->pagebreak_color); diagram_properties_update_sensitivity(GTK_TOGGLE_BUTTON(dynamic_check), dia); @@ -305,7 +302,7 @@ diagram_properties_show(Diagram *dia) diagram_properties_retrieve(dia); gtk_window_set_transient_for(GTK_WINDOW(dialog), - GTK_WINDOW (ddisplay_active()->shell)); + GTK_WINDOW (dia_display_active()->shell)); gtk_widget_show(dialog); } @@ -314,7 +311,7 @@ diagram_properties_respond(GtkWidget *widget, gint response_id, gpointer user_data) { - Diagram *active_diagram = ddisplay_active_diagram(); + Diagram *active_diagram = dia_display_active_diagram(); if (response_id == GTK_RESPONSE_OK || response_id == GTK_RESPONSE_APPLY) { @@ -343,12 +340,12 @@ diagram_properties_respond(GtkWidget *widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hex_check)); active_diagram->grid.hex_size = gtk_spin_button_get_value(GTK_SPIN_BUTTON(hex_size_entry)); - dia_color_selector_get_color(bg_colour, - &active_diagram->data->bg_color); - dia_color_selector_get_color(grid_colour, - &active_diagram->grid.colour); - dia_color_selector_get_color(pagebreak_colour, - &active_diagram->pagebreak_color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (bg_colour), + &active_diagram->data->bg_color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (grid_colour), + &active_diagram->grid.colour); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (pagebreak_colour), + &active_diagram->pagebreak_color); diagram_add_update_all(active_diagram); diagram_flush(active_diagram); diagram_set_modified(active_diagram, TRUE); diff --git a/app/dia.def b/app/dia.def index b94c1c1da2e43c0f44819bccc8f7dbe417745d0a..f6b3208d01c7a51fc94b3e23fbb5435e0b6498a7 100644 --- a/app/dia.def +++ b/app/dia.def @@ -1,20 +1,20 @@ EXPORTS ; all these exports are only required for pydia - ddisplay_active - ddisplay_add_update_all - ddisplay_close - ddisplay_flush - ddisplay_resize_canvas - ddisplay_scroll - ddisplay_scroll_down - ddisplay_scroll_left - ddisplay_scroll_right - ddisplay_scroll_up - ddisplay_set_origo - ddisplay_set_title - ddisplay_show_all - ddisplay_zoom - new_display + dia_display_active + dia_display_add_update_all + dia_display_close + dia_display_flush + dia_display_resize_canvas + dia_display_scroll + dia_display_scroll_down + dia_display_scroll_left + dia_display_scroll_right + dia_display_scroll_up + dia_display_set_origo + dia_display_set_title + dia_display_show_all + dia_display_zoom + dia_display_new diagram_add_update diagram_add_update_all diagram_find_clicked_object diff --git a/app/diagram.c b/app/diagram.c index bd1387613e3ae2337d77c56d7403ef2f1c0a50f5..f21fcdae47ce529ff34676ca3d8328f71e6fe87a 100644 --- a/app/diagram.c +++ b/app/diagram.c @@ -41,7 +41,6 @@ #include "autosave.h" #include "dynamic_refresh.h" #include "textedit.h" -#include "lib/diamarshal.h" #include "parent.h" #include "diacontext.h" @@ -148,12 +147,10 @@ diagram_class_init (DiagramClass *klass) diagram_signals[REMOVED] = g_signal_new ("removed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (DiagramClass, removed), - NULL, NULL, - dia_marshal_VOID__VOID, - G_TYPE_NONE, 0); + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiagramClass, removed), + NULL, NULL, NULL, G_TYPE_NONE, 0); klass->removed = _diagram_removed; @@ -413,9 +410,9 @@ diagram_modified(Diagram *dia) g_free (extra); displays = dia->displays; while (displays!=NULL) { - DDisplay *ddisp = (DDisplay *) displays->data; + DiaDisplay *ddisp = (DiaDisplay *) displays->data; - ddisplay_set_title(ddisp, title); + dia_display_set_title (ddisp, title); displays = g_slist_next(displays); } @@ -536,13 +533,13 @@ object_within_parent(DiaObject *obj, DiaObject *p) /* This is the real implementation of the sensitivity update. - TODO: move it to the DDisplay as it belongs to it IMHO + TODO: move it to the DiaDisplay as it belongs to it IMHO */ void diagram_update_menu_sensitivity (Diagram *dia) { gint selected_count = dia ? g_list_length (dia->data->selected) : 0; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); gboolean focus_active = dia ? (get_active_focus(dia->data) != NULL) : FALSE; gboolean textedit_active = ddisp ? textedit_mode(ddisp) : FALSE; GtkAction *action; @@ -656,13 +653,13 @@ diagram_update_menu_sensitivity (Diagram *dia) void -diagram_add_ddisplay(Diagram *dia, DDisplay *ddisp) +diagram_add_display(Diagram *dia, DiaDisplay *ddisp) { dia->displays = g_slist_prepend(dia->displays, ddisp); } void -diagram_remove_ddisplay(Diagram *dia, DDisplay *ddisp) +diagram_remove_display(Diagram *dia, DiaDisplay *ddisp) { dia->displays = g_slist_remove(dia->displays, ddisp); @@ -819,7 +816,7 @@ diagram_select_list(Diagram *dia, GList *list) list = g_list_next(list); } if (get_active_focus((DiagramData*) dia) == NULL) { - textedit_activate_first(ddisplay_active()); + textedit_activate_first(dia_display_active()); } g_signal_handlers_unblock_by_func (dia, DIA_DIAGRAM_DATA_GET_CLASS (dia)->selection_changed, NULL); g_signal_emit_by_name (dia, "selection_changed", g_list_length (dia->data->selected)); @@ -854,13 +851,13 @@ void diagram_add_update_all(Diagram *dia) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_add_update_all(ddisp); + dia_display_add_update_all(ddisp); l = g_slist_next(l); } @@ -870,13 +867,13 @@ void diagram_add_update(Diagram *dia, const Rectangle *update) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_add_update(ddisp, update); + dia_display_add_update(ddisp, update); l = g_slist_next(l); } @@ -892,13 +889,13 @@ diagram_add_update_with_border(Diagram *dia, const Rectangle *update, int pixel_border) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_add_update_with_border(ddisp, update, pixel_border); + dia_display_add_update_with_border(ddisp, update, pixel_border); l = g_slist_next(l); } @@ -909,13 +906,13 @@ diagram_add_update_pixels(Diagram *dia, Point *point, int pixel_width, int pixel_height) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_add_update_pixels(ddisp, point, pixel_width, pixel_height); + dia_display_add_update_pixels(ddisp, point, pixel_width, pixel_height); l = g_slist_next(l); } @@ -925,12 +922,12 @@ void diagram_flush(Diagram *dia) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_flush(ddisp); + dia_display_flush(ddisp); l = g_slist_next(l); } @@ -1025,13 +1022,13 @@ diagram_update_extents(Diagram *dia) if (data_update_extents(dia->data)) { /* Update scrollbars because extents were changed: */ GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_update_scrollbars(ddisp); + dia_display_update_scrollbars(ddisp); l = g_slist_next(l); } @@ -1473,16 +1470,16 @@ static void diagram_update_for_filename(Diagram *dia) { GSList *l; - DDisplay *ddisp; + DiaDisplay *ddisp; char *title; title = diagram_get_name(dia); l = dia->displays; while (l!=NULL) { - ddisp = (DDisplay *) l->data; + ddisp = (DiaDisplay *) l->data; - ddisplay_set_title(ddisp, title); + dia_display_set_title(ddisp, title); l = g_slist_next(l); } diff --git a/app/diagram.h b/app/diagram.h index 1c213cfa8c26f8e5ac1f8300f4875e9e85dc246d..b55096216de74050ee4f22dc6d780c968b4ff077 100644 --- a/app/diagram.h +++ b/app/diagram.h @@ -48,7 +48,7 @@ struct _Diagram { char *autosavefilename; /* Holds the name of the current autosave file * for this diagram, or NULL. */ - Color pagebreak_color; /*!< just to show page breaks */ + GdkRGBA pagebreak_color; /*!< just to show page breaks */ DiaGrid grid; /*!< the display grid */ /*! almost completely unused guides (load and save code is there) */ diff --git a/app/diagram_tree_view.c b/app/diagram_tree_view.c index cd42a91a57fa92c3919685b5724f122a830341c3..4cd094bd47591c6fd11f9cd2c05fa81c7f0247c5 100644 --- a/app/diagram_tree_view.c +++ b/app/diagram_tree_view.c @@ -112,12 +112,12 @@ _dtv_button_press (GtkWidget *widget, gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1); gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1); - if (object && diagram && ddisplay_active_diagram() == diagram) { - if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) /* double-click 'locates' */ - ddisplay_present_object (ddisplay_active(), object); + if (object && diagram && dia_display_active_diagram() == diagram) { + if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) /* double-click 'locates' */ + dia_display_present_object (dia_display_active(), object); } if (diagram) - g_object_unref(diagram); + g_object_unref(diagram); gtk_tree_path_free (path); } } @@ -380,9 +380,9 @@ _dtv_locate_item (GtkAction *action, for (displays = diagram->displays; displays != NULL; displays = g_slist_next (displays)) { - DDisplay *ddisp = (DDisplay *)displays->data; + DiaDisplay *ddisp = (DiaDisplay *)displays->data; - ddisplay_present_object (ddisp, object); + dia_display_present_object (ddisp, object); } } /* drop all references got from the model */ @@ -582,11 +582,7 @@ diagram_tree_show (void) gtk_window_set_role (GTK_WINDOW (window), "diagram_tree"); -#if GTK_CHECK_VERSION(2,20,0) if (!gtk_widget_get_visible (window)) -#else - if (!GTK_WIDGET_VISIBLE (window)) -#endif gtk_widget_show_all (window); /* FIXME: remove flicker by removing gtk_widget_show from persistence_register_window() */ diff --git a/app/diagrid.h b/app/diagrid.h index 3239d71edeac53a1a66acad0eaba73d993aaf678..0690596cb1a9114d70b9ad35cdf21fa16e1be7c3 100644 --- a/app/diagrid.h +++ b/app/diagrid.h @@ -19,7 +19,7 @@ struct _DiaGrid { gboolean dynamic; /* The color of the grid lines. */ - Color colour; + GdkRGBA colour; /** True if this grid is a hex grid. */ gboolean hex; /** Size of each edge on a hex grid. */ diff --git a/app/diapagelayout.c b/app/diapagelayout.c index a463dc81e5574e500376ec0a69ac6e8edd7b5571..204c3a0aa8538d311ca93aa829465a92fb96d7cf 100644 --- a/app/diapagelayout.c +++ b/app/diapagelayout.c @@ -37,7 +37,6 @@ #include "paper.h" #include "prefs.h" -#include "diamarshal.h" #include "diaoptionmenu.h" /* private class : noone wants to inherit and noone needs to mess with details */ @@ -47,7 +46,7 @@ typedef struct _DiaPageLayoutClass DiaPageLayoutClass; struct _DiaPageLayout { - GtkTable parent; + GtkGrid parent; /**/ GtkWidget *paper_size, *paper_label; @@ -58,8 +57,7 @@ struct _DiaPageLayout { GtkWidget *darea; - GdkGC *gc; - GdkColor white, black, blue; + GdkRGBA white, black, blue; gint papernum; /* index into page_metrics array */ /* position of paper preview */ @@ -69,7 +67,7 @@ struct _DiaPageLayout { }; struct _DiaPageLayoutClass { - GtkTableClass parent_class; + GtkGridClass parent_class; void (*changed)(DiaPageLayout *pl); }; @@ -81,11 +79,11 @@ enum { }; static guint pl_signals[LAST_SIGNAL] = { 0 }; -static GtkObjectClass *parent_class; +static GObjectClass *parent_class; static void dia_page_layout_class_init(DiaPageLayoutClass *class); static void dia_page_layout_init(DiaPageLayout *self); -static void dia_page_layout_destroy(GtkObject *object); +static void dia_page_layout_destroy(GtkWidget *object); GType dia_page_layout_get_type(void) @@ -104,7 +102,7 @@ dia_page_layout_get_type(void) 0, /* n_preallocs */ (GInstanceInitFunc) dia_page_layout_init, }; - pl_type = g_type_register_static (gtk_table_get_type (), "DiaPageLayout", &pl_info, 0); + pl_type = g_type_register_static (GTK_TYPE_GRID, "DiaPageLayout", &pl_info, 0); } return pl_type; } @@ -112,28 +110,29 @@ dia_page_layout_get_type(void) static void dia_page_layout_class_init(DiaPageLayoutClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; + GtkWidgetClass *widget_class; - object_class = (GtkObjectClass*) class; + object_class = (GObjectClass*) class; + widget_class = GTK_WIDGET_CLASS (class); parent_class = g_type_class_peek_parent (class); pl_signals[CHANGED] = - g_signal_new("changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(DiaPageLayoutClass, changed), - NULL, NULL, - dia_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_signal_new ("changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(DiaPageLayoutClass, changed), + NULL, NULL, NULL, + G_TYPE_NONE, 0); #if 0 /* FIXME ?*/ - gtk_object_class_add_signals(object_class, pl_signals, LAST_SIGNAL); + g_object_class_add_signals(object_class, pl_signals, LAST_SIGNAL); #endif - object_class->destroy = dia_page_layout_destroy; + widget_class->destroy = dia_page_layout_destroy; } static void darea_size_allocate(DiaPageLayout *self, GtkAllocation *alloc); -static gint darea_expose_event(DiaPageLayout *self, GdkEventExpose *ev); +static gint darea_draw(DiaPageLayout *self, cairo_t *ctx); static void paper_size_change(GtkWidget *widget, DiaPageLayout *self); static void orient_changed(DiaPageLayout *self); static void margin_changed(DiaPageLayout *self); @@ -147,23 +146,21 @@ dia_page_layout_init(DiaPageLayout *self) GList *paper_names; gint i; - gtk_table_resize(GTK_TABLE(self), 3, 2); - gtk_table_set_row_spacings(GTK_TABLE(self), 5); - gtk_table_set_col_spacings(GTK_TABLE(self), 5); + gtk_grid_set_row_spacing (GTK_GRID (self), 5); + gtk_grid_set_column_spacing (GTK_GRID (self), 5); /* paper size */ - frame = gtk_frame_new(_("Paper Size")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 0,1, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); + frame = gtk_frame_new (_("Paper Size")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 0, 1, 1); + gtk_widget_show (frame); - box = gtk_vbox_new(FALSE, 5); + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); - self->paper_size = dia_option_menu_new(); - gtk_box_pack_start(GTK_BOX(box), self->paper_size, TRUE, FALSE, 0); + self->paper_size = dia_option_menu_new (); + gtk_box_pack_start (GTK_BOX (box), self->paper_size, TRUE, FALSE, 0); g_signal_connect (self->paper_size, "changed", G_CALLBACK(paper_size_change), self); @@ -181,12 +178,12 @@ dia_page_layout_init(DiaPageLayout *self) gtk_widget_show(self->paper_label); /* orientation */ - frame = gtk_frame_new(_("Orientation")); - gtk_table_attach(GTK_TABLE(self), frame, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); - gtk_widget_show(frame); + frame = gtk_frame_new (_("Orientation")); + gtk_widget_set_hexpand (frame, TRUE); + gtk_grid_attach (GTK_GRID (self), frame, 1, 0, 1, 1); + gtk_widget_show (frame); - box = gtk_hbox_new(FALSE, 5); + box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_container_set_border_width(GTK_CONTAINER(box), 5); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); @@ -210,124 +207,139 @@ dia_page_layout_init(DiaPageLayout *self) gtk_widget_show(self->orient_landscape); /* margins */ - frame = gtk_frame_new(_("Margins")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 1,2, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); - - table = gtk_table_new(4, 2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); + frame = gtk_frame_new (_("Margins")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 1, 1, 1); + gtk_widget_show (frame); + + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); gtk_container_add(GTK_CONTAINER(frame), table); gtk_widget_show(table); - wid = gtk_label_new(_("Top:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->tmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->tmargin, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->tmargin); - - wid = gtk_label_new(_("Bottom:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->bmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->bmargin, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->bmargin); - - wid = gtk_label_new(_("Left:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 2,3, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->lmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->lmargin, 1,2, 2,3, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->lmargin); - - wid = gtk_label_new(_("Right:")); - gtk_misc_set_alignment(GTK_MISC(wid), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), wid, 0,1, 3,4, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->rmargin = dia_unit_spinner_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,0)), - prefs_get_length_unit()); - gtk_table_attach(GTK_TABLE(table), self->rmargin, 1,2, 3,4, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->rmargin); + wid = gtk_label_new (_("Top:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 0, 1, 1); + gtk_widget_show (wid); + + self->tmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->tmargin, TRUE); + gtk_widget_set_hexpand (self->tmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->tmargin, 1, 0, 1, 1); + gtk_widget_show (self->tmargin); + + wid = gtk_label_new (_("Bottom:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 1, 1, 1); + gtk_widget_show (wid); + + self->bmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->bmargin, TRUE); + gtk_widget_set_hexpand (self->bmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->bmargin, 1, 1, 1, 1); + gtk_widget_show (self->bmargin); + + wid = gtk_label_new (_("Left:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 2, 1, 1); + gtk_widget_show (wid); + + self->lmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10, 0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->lmargin, TRUE); + gtk_widget_set_hexpand (self->lmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->lmargin, 1, 2, 1, 1); + gtk_widget_show (self->lmargin); + + wid = gtk_label_new (_("Right:")); + gtk_label_set_xalign (GTK_LABEL (wid), 1.0); + gtk_label_set_yalign (GTK_LABEL (wid), 0.5); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 0, 3, 1, 1); + gtk_widget_show (wid); + + self->rmargin = dia_unit_spinner_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 100, 0.1, 10,0)), + prefs_get_length_unit()); + gtk_widget_set_vexpand (self->rmargin, TRUE); + gtk_widget_set_hexpand (self->rmargin, TRUE); + gtk_grid_attach (GTK_GRID (table), self->rmargin, 1, 3, 1, 1); + gtk_widget_show (self->rmargin); /* Scaling */ - frame = gtk_frame_new(_("Scaling")); - gtk_table_attach(GTK_TABLE(self), frame, 0,1, 2,3, - GTK_FILL, GTK_FILL, 0, 0); - gtk_widget_show(frame); - - table = gtk_table_new(2, 4, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_widget_show(table); - - self->scale = gtk_radio_button_new_with_label(NULL, _("Scale:")); - gtk_table_attach(GTK_TABLE(table), self->scale, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->scale); - - self->scaling = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(100,1,10000, 1,10,0)), 1, 0); - gtk_table_attach(GTK_TABLE(table), self->scaling, 1,4, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->scaling); - - self->fitto = gtk_radio_button_new_with_label( - gtk_radio_button_get_group(GTK_RADIO_BUTTON(self->scale)), _("Fit to:")); - gtk_table_attach(GTK_TABLE(table), self->fitto, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fitto); - - self->fitw = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 0)), 1, 0); - gtk_widget_set_sensitive(self->fitw, FALSE); - gtk_table_attach(GTK_TABLE(table), self->fitw, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fitw); - - wid = gtk_label_new(_("by")); - gtk_misc_set_padding(GTK_MISC(wid), 5, 0); - gtk_table_attach(GTK_TABLE(table), wid, 2,3, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(wid); - - self->fith = gtk_spin_button_new( - GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 0)), 1, 0); - gtk_widget_set_sensitive(self->fith, FALSE); - gtk_table_attach(GTK_TABLE(table), self->fith, 3,4, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->fith); + frame = gtk_frame_new (_("Scaling")); + gtk_grid_attach (GTK_GRID (self), frame, 0, 2, 1, 1); + gtk_widget_show (frame); + + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + self->scale = gtk_radio_button_new_with_label (NULL, _("Scale:")); + gtk_widget_set_vexpand (self->scale, TRUE); + gtk_grid_attach (GTK_GRID (table), self->scale, 0, 0, 1, 1); + gtk_widget_show (self->scale); + + self->scaling = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (100, 1, 10000, 1, 10, 0)), 1, 0); + gtk_widget_set_vexpand (self->scaling, TRUE); + gtk_widget_set_hexpand (self->scaling, TRUE); + gtk_grid_attach (GTK_GRID (table), self->scaling, 1, 0, 3, 1); + gtk_widget_show (self->scaling); + + self->fitto = gtk_radio_button_new_with_label ( + gtk_radio_button_get_group (GTK_RADIO_BUTTON (self->scale)), _("Fit to:")); + gtk_widget_set_vexpand (self->fitto, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fitto, 0, 1, 1, 1); + gtk_widget_show (self->fitto); + + self->fitw = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 1000, 1, 10, 0)), 1, 0); + gtk_widget_set_sensitive (self->fitw, FALSE); + gtk_widget_set_vexpand (self->fitw, TRUE); + gtk_widget_set_hexpand (self->fitw, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fitw, 1, 1, 1, 1); + gtk_widget_show (self->fitw); + + wid = gtk_label_new (_("by")); + g_object_set (G_OBJECT (wid), + "margin-start", 5, + "margin-end", 5, + "margin-top", 0, + "margin-bottom", 0, + NULL); + gtk_widget_set_vexpand (wid, TRUE); + gtk_grid_attach (GTK_GRID (table), wid, 2, 1, 1, 1); + gtk_widget_show (wid); + + self->fith = gtk_spin_button_new ( + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 1000, 1, 10, 0)), 1, 0); + gtk_widget_set_sensitive (self->fith, FALSE); + gtk_widget_set_vexpand (self->fith, TRUE); + gtk_widget_set_hexpand (self->fith, TRUE); + gtk_grid_attach (GTK_GRID (table), self->fith, 3, 1, 1, 1); + gtk_widget_show (self->fith); /* the drawing area */ - self->darea = gtk_drawing_area_new(); - gtk_table_attach(GTK_TABLE(self), self->darea, 1,2, 1,3, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(self->darea); + self->darea = gtk_drawing_area_new (); + gtk_widget_set_vexpand (self->darea, TRUE); + gtk_widget_set_hexpand (self->darea, TRUE); + gtk_grid_attach (GTK_GRID (self), self->darea, 1, 1, 1, 2); + gtk_widget_show (self->darea); /* connect the signal handlers */ g_signal_connect_swapped(G_OBJECT(self->orient_portrait), "toggled", @@ -355,18 +367,14 @@ dia_page_layout_init(DiaPageLayout *self) g_signal_connect_swapped(G_OBJECT(self->darea), "size_allocate", G_CALLBACK(darea_size_allocate), G_OBJECT(self)); - g_signal_connect_swapped(G_OBJECT(self->darea), "expose_event", - G_CALLBACK(darea_expose_event), + g_signal_connect_swapped(G_OBJECT(self->darea), "draw", + G_CALLBACK(darea_draw), G_OBJECT(self)); - gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->white); - gdk_color_black(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->black); self->blue.red = 0; self->blue.green = 0; self->blue.blue = 0x7fff; - gdk_color_alloc(gtk_widget_get_colormap(GTK_WIDGET(self)), &self->blue); - self->gc = NULL; self->block_changed = FALSE; } @@ -605,73 +613,95 @@ darea_size_allocate(DiaPageLayout *self, GtkAllocation *allocation) } static gint -darea_expose_event(DiaPageLayout *self, GdkEventExpose *event) +darea_draw (DiaPageLayout *self, cairo_t *ctx) { - GdkWindow *window = gtk_widget_get_window(self->darea); gfloat val; gint num; - if (!window) - return FALSE; + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_width (ctx, 1); + cairo_set_antialias (ctx, CAIRO_ANTIALIAS_NONE); - if (!self->gc) - self->gc = gdk_gc_new(window); - - gdk_window_clear_area (window, - 0, 0, - self->darea->allocation.width, - self->darea->allocation.height); + cairo_set_source_rgba (ctx, 0, 0, 0, 0); + cairo_rectangle (ctx, 0, 0, + gtk_widget_get_allocated_width (self->darea), + gtk_widget_get_allocated_height (self->darea)); + cairo_fill (ctx); /* draw the page image */ - gdk_gc_set_foreground(self->gc, &self->black); - gdk_draw_rectangle(window, self->gc, TRUE, self->x+3, self->y+3, - self->width, self->height); - gdk_gc_set_foreground(self->gc, &self->white); - gdk_draw_rectangle(window, self->gc, TRUE, self->x, self->y, - self->width, self->height); - gdk_gc_set_foreground(self->gc, &self->black); - gdk_draw_rectangle(window, self->gc, FALSE, self->x, self->y, - self->width-1, self->height-1); - - gdk_gc_set_foreground(self->gc, &self->blue); + gdk_cairo_set_source_rgba (ctx, &self->black); + cairo_rectangle(ctx, self->x+3, self->y+3, self->width, self->height); + cairo_fill (ctx); + gdk_cairo_set_source_rgba (ctx, &self->white); + cairo_rectangle (ctx, self->x, self->y, self->width, self->height); + cairo_fill (ctx); + gdk_cairo_set_source_rgba (ctx, &self->black); + cairo_rectangle (ctx, self->x + 1, self->y, self->width, self->height); + cairo_stroke (ctx); + + gdk_cairo_set_source_rgba (ctx, &self->blue); /* draw margins */ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(self->orient_portrait))) { - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->tmargin)); - num = self->y + val * self->height /get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->bmargin)); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->orient_portrait))) { + /* Top */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->tmargin)); + num = self->y + val * self->height / get_paper_psheight (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Bottom */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->bmargin)); num = self->y + self->height - - val * self->height / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->lmargin)); - num = self->x + val * self->width / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->rmargin)); + val * self->height / get_paper_psheight (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Left */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->lmargin)); + num = self->x + val * self->width / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); + + /* Right */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->rmargin)); num = self->x + self->width - - val * self->width / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); + val * self->width / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); } else { - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->tmargin)); - num = self->y + val * self->height /get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->bmargin)); + /* Top */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->tmargin)); + num = self->y + val * self->height / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Bottom */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->bmargin)); num = self->y + self->height - - val * self->height / get_paper_pswidth(self->papernum); - gdk_draw_line(window, self->gc, self->x+1, num, self->x+self->width-2,num); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->lmargin)); - num = self->x + val * self->width / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); - - val = dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self->rmargin)); + val * self->height / get_paper_pswidth (self->papernum); + cairo_move_to (ctx, self->x + 2, num); + cairo_line_to (ctx, self->x + self->width, num); + cairo_stroke (ctx); + + /* Left */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->lmargin)); + num = self->x + val * self->width / get_paper_psheight (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); + + /* Right */ + val = dia_unit_spinner_get_value (DIA_UNIT_SPINNER (self->rmargin)); num = self->x + self->width - - val * self->width / get_paper_psheight(self->papernum); - gdk_draw_line(window, self->gc, num, self->y+1,num,self->y+self->height-2); + val * self->width / get_paper_psheight (self->papernum); + cairo_move_to (ctx, num + 1, self->y + 1); + cairo_line_to (ctx, num + 1, self->y + self->height - 1); + cairo_stroke (ctx); } return FALSE; @@ -693,9 +723,12 @@ static void paper_size_change(GtkWidget *widget, DiaPageLayout *self) { gchar buf[512]; + GtkAllocation alloc; + + gtk_widget_get_allocation (self->darea, &alloc); self->papernum = dia_option_menu_get_active (widget); - size_page(self, &self->darea->allocation); + size_page(self, &alloc); gtk_widget_queue_draw(self->darea); self->block_changed = TRUE; @@ -740,7 +773,10 @@ paper_size_change(GtkWidget *widget, DiaPageLayout *self) static void orient_changed(DiaPageLayout *self) { - size_page(self, &self->darea->allocation); + GtkAllocation alloc; + + gtk_widget_get_allocation (self->darea, &alloc); + size_page(self, &alloc); gtk_widget_queue_draw(self->darea); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(self->orient_portrait))) { @@ -799,17 +835,10 @@ scale_changed(DiaPageLayout *self) } static void -dia_page_layout_destroy(GtkObject *object) +dia_page_layout_destroy(GtkWidget *object) { - DiaPageLayout *self = DIA_PAGE_LAYOUT(object); - - if (self->gc) { - g_object_unref(self->gc); - self->gc = NULL; - } - - if (parent_class->destroy) - (* parent_class->destroy)(object); + if (GTK_WIDGET_CLASS (parent_class)->destroy) + (* GTK_WIDGET_CLASS (parent_class)->destroy)(object); } #ifdef PAGELAYOUT_TEST diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index 82555660111db2a23ef8f88dfc71f6bcc5bdef11..ea6126a4e7eba4e50aca20e950ffc00c27f527bd 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -28,7 +28,7 @@ #include "display.h" #include "diagram.h" -#include "tool.h" +#include "tools/tool.h" #include "interface.h" #include "focus.h" #include "object_ops.h" @@ -36,10 +36,11 @@ #include "menus.h" #include "message.h" #include "intl.h" -#include "magnify.h" +#include "tools/magnify.h" #include "diamenu.h" #include "preferences.h" -#include "scroll_tool.h" +#include "tools/scroll_tool.h" +#include "tools/textedit_tool.h" #include "commands.h" #include "textedit.h" #include "lib/parent.h" @@ -47,29 +48,28 @@ #include "object.h" #include "disp_callbacks.h" #include "create.h" +#include "dia-canvas.h" typedef struct { - GdkEvent *event; /* Button down event which may be holding */ - DDisplay *ddisp; /* DDisplay where event occurred */ - guint tag; /* Tag for timeout */ + GdkEvent *event; /* Button down event which may be holding */ + DiaDisplay *ddisp; /* DiaDisplay where event occurred */ + guint tag; /* Tag for timeout */ } HoldTimeoutData; static HoldTimeoutData hold_data = {NULL, NULL, 0}; - - static void object_menu_item_proxy(GtkWidget *widget, gpointer data) { DiaMenuItem *dia_menu_item; ObjectChange *obj_change; DiaObject *obj; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); Point last_clicked_pos; if (!ddisp) return; - last_clicked_pos = ddisplay_get_clicked_position(ddisp); + last_clicked_pos = dia_display_get_clicked_position(ddisp); obj = (DiaObject *)ddisp->diagram->data->selected->data; dia_menu_item = (DiaMenuItem *) data; @@ -102,7 +102,7 @@ static void dia_menu_free(DiaMenu *dia_menu) { if (dia_menu->app_data) - gtk_object_destroy((GtkObject *)dia_menu->app_data); + g_object_unref((GObject *)dia_menu->app_data); dia_menu->app_data = NULL; dia_menu->app_data_free = NULL; } @@ -134,7 +134,7 @@ static void _follow_link_callback (GtkAction *action, gpointer data) { DiaObject *obj; - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); gchar *url; if (!ddisp) return; @@ -173,7 +173,7 @@ add_follow_link_menu_item (GtkMenu *menu) static void _convert_to_path_callback (GtkAction *action, gpointer data) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); GList *selected, *list; ObjectChange *change_list = NULL; @@ -221,7 +221,7 @@ add_convert_to_path_menu_item (GtkMenu *menu) static void _combine_to_path_callback (GtkAction *action, gpointer data) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); GList *cut_list; DiaObject *obj; Diagram *dia; @@ -248,7 +248,7 @@ _combine_to_path_callback (GtkAction *action, gpointer data) (change->apply)(change, ddisp->diagram); undo_set_transactionpoint(ddisp->diagram->undo); } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); diagram_flush(dia); g_list_free (cut_list); } @@ -361,7 +361,7 @@ static DiaMenu empty_menu = { }; static void -popup_object_menu(DDisplay *ddisp, GdkEvent *event) +popup_object_menu (DiaDisplay *ddisp, GdkEvent *event) { Diagram *diagram; DiaObject *obj; @@ -385,7 +385,7 @@ popup_object_menu(DDisplay *ddisp, GdkEvent *event) return; } - last_clicked_pos = ddisplay_get_clicked_position(ddisp); + last_clicked_pos = dia_display_get_clicked_position(ddisp); obj = (DiaObject *)g_list_first(selected_list)->data; /* Possibly react differently at a handle? */ @@ -444,32 +444,40 @@ popup_object_menu(DDisplay *ddisp, GdkEvent *event) menu = GTK_MENU(dia_menu->app_data); /* add the properties menu item to raise the properties from the contextual menu */ - - if (event->type == GDK_BUTTON_PRESS) - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - ((GdkEventButton *)event)->button, ((GdkEventButton *)event)->time); - else if (event->type == GDK_KEY_PRESS) - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 0, ((GdkEventKey *)event)->time); - else /* warn about unexpected usage of this function */ + if (event->type == GDK_BUTTON_PRESS) { + gtk_menu_popup_at_pointer (menu, event); + } else if (event->type == GDK_KEY_PRESS) { + Rectangle *bounds = dia_object_get_bounding_box (obj); + GdkRectangle rect = { + bounds->left, + bounds->top, + bounds->right - bounds->left, + bounds->bottom - bounds->top + }; + gtk_menu_popup_at_rect (menu, + ((GdkEventAny *)event)->window, + &rect, + GDK_GRAVITY_SOUTH_WEST, + GDK_GRAVITY_NORTH_WEST, + event); + } else { + /* warn about unexpected usage of this function */ g_warning ("Unhandled GdkEvent type=%d", event->type); + } } gint -ddisplay_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) +dia_display_focus_in_event (GtkWidget *widget, GdkEventFocus *event, gpointer data) { - DDisplay *ddisp; + DiaDisplay *ddisp; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE); g_return_val_if_fail (data != NULL, FALSE); - ddisp = (DDisplay *)data; + ddisp = (DiaDisplay *)data; -#if GTK_CHECK_VERSION(2,21,6) g_assert (event->in == TRUE); -#else - GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); -#endif gtk_im_context_focus_in(GTK_IM_CONTEXT(ddisp->im_context)); @@ -477,9 +485,9 @@ ddisplay_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) } gint -ddisplay_focus_out_event(GtkWidget *widget, GdkEventFocus *event,gpointer data) +dia_display_focus_out_event (GtkWidget *widget, GdkEventFocus *event,gpointer data) { - DDisplay *ddisp; + DiaDisplay *ddisp; int return_val; g_return_val_if_fail (widget != NULL, FALSE); @@ -488,13 +496,9 @@ ddisplay_focus_out_event(GtkWidget *widget, GdkEventFocus *event,gpointer data) return_val = FALSE; - ddisp = (DDisplay *)data; + ddisp = (DiaDisplay *)data; -#if GTK_CHECK_VERSION(2,21,6) g_assert (event->in == FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); -#endif gtk_im_context_focus_out(GTK_IM_CONTEXT(ddisp->im_context)); @@ -502,28 +506,28 @@ ddisplay_focus_out_event(GtkWidget *widget, GdkEventFocus *event,gpointer data) } void -ddisplay_realize(GtkWidget *widget, gpointer data) +dia_display_realize (GtkWidget *widget, gpointer data) { - DDisplay *ddisp; + DiaDisplay *ddisp; g_return_if_fail(widget != NULL); g_return_if_fail(data != NULL); - ddisp = (DDisplay *)data; + ddisp = (DiaDisplay *)data; gtk_im_context_set_client_window(GTK_IM_CONTEXT(ddisp->im_context), gtk_widget_get_window(widget)); } void -ddisplay_unrealize (GtkWidget *widget, gpointer data) +dia_display_unrealize (GtkWidget *widget, gpointer data) { - DDisplay *ddisp; + DiaDisplay *ddisp; g_return_if_fail (widget != NULL); g_return_if_fail (data != NULL); - ddisp = (DDisplay *) data; + ddisp = (DiaDisplay *) data; if (ddisp->im_context) gtk_im_context_set_client_window(GTK_IM_CONTEXT(ddisp->im_context), @@ -531,7 +535,7 @@ ddisplay_unrealize (GtkWidget *widget, gpointer data) } void -ddisplay_popup_menu(DDisplay *ddisp, GdkEventButton *event) +dia_display_popup_menu (DiaDisplay *ddisp, GdkEventButton *event) { GtkWidget *menu; @@ -541,7 +545,7 @@ ddisplay_popup_menu(DDisplay *ddisp, GdkEventButton *event) event->button, event->time); } static void -handle_key_event(DDisplay *ddisp, Focus *focus, +handle_key_event (DiaDisplay *ddisp, Focus *focus, guint keystate, guint keysym, const gchar *str, int strlen) { @@ -576,8 +580,9 @@ handle_key_event(DDisplay *ddisp, Focus *focus, void -ddisplay_im_context_commit(GtkIMContext *context, const gchar *str, - DDisplay *ddisp) +dia_display_im_context_commit (GtkIMContext *context, + const gchar *str, + DiaDisplay *ddisp) { /* When using IM, we'll not get many key events past the IM filter, mostly IM Commits. @@ -588,20 +593,20 @@ ddisplay_im_context_commit(GtkIMContext *context, const gchar *str, Focus *focus = get_active_focus((DiagramData *) ddisp->diagram); - ddisplay_im_context_preedit_reset(ddisp, focus); + dia_display_im_context_preedit_reset(ddisp, focus); if (focus != NULL) handle_key_event(ddisp, focus, 0, 0, str, g_utf8_strlen(str,-1)); } void -ddisplay_im_context_preedit_changed(GtkIMContext *context, - DDisplay *ddisp) +dia_display_im_context_preedit_changed(GtkIMContext *context, + DiaDisplay *ddisp) { gint cursor_pos; Focus *focus = get_active_focus((DiagramData *) ddisp->diagram); - ddisplay_im_context_preedit_reset(ddisp, focus); + dia_display_im_context_preedit_reset (ddisp, focus); gtk_im_context_get_preedit_string(context, &ddisp->preedit_string, &ddisp->preedit_attrs, &cursor_pos); @@ -610,13 +615,13 @@ ddisplay_im_context_preedit_changed(GtkIMContext *context, handle_key_event(ddisp, focus, 0, 0, ddisp->preedit_string, g_utf8_strlen(ddisp->preedit_string,-1)); } else { - ddisplay_im_context_preedit_reset(ddisp, focus); + dia_display_im_context_preedit_reset(ddisp, focus); } } } static void -_scroll_page (DDisplay *ddisp, Direction dir) +_scroll_page (DiaDisplay *ddisp, Direction dir) { Point delta = {0, 0}; @@ -634,29 +639,29 @@ _scroll_page (DDisplay *ddisp, Direction dir) delta.y = ddisp->diagram->data->paper.height * ddisp->diagram->data->paper.scaling; break; } - ddisplay_scroll(ddisp, &delta); - ddisplay_flush(ddisp); + dia_display_scroll(ddisp, &delta); + dia_display_flush(ddisp); } static void -_scroll_step (DDisplay *ddisp, guint keyval) +_scroll_step (DiaDisplay *ddisp, guint keyval) { switch (keyval) { - case GDK_Up : - ddisplay_scroll_up(ddisp); - ddisplay_flush(ddisp); + case GDK_KEY_Up : + dia_display_scroll_up(ddisp); + dia_display_flush(ddisp); break; - case GDK_Down: - ddisplay_scroll_down(ddisp); - ddisplay_flush(ddisp); + case GDK_KEY_Down: + dia_display_scroll_down(ddisp); + dia_display_flush(ddisp); break; - case GDK_Left: - ddisplay_scroll_left(ddisp); - ddisplay_flush(ddisp); + case GDK_KEY_Left: + dia_display_scroll_left(ddisp); + dia_display_flush(ddisp); break; - case GDK_Right: - ddisplay_scroll_right(ddisp); - ddisplay_flush(ddisp); + case GDK_KEY_Right: + dia_display_scroll_right(ddisp); + dia_display_flush(ddisp); break; default : g_assert_not_reached (); @@ -679,13 +684,12 @@ hold_remove_handler(void) * If this function is called, then the button must still be down, * indicating that the user has pressed and held the button, but not moved * the pointer (mouse). - * Dynamic data is cleaned up in ddisplay_canvas_events + * Dynamic data is cleaned up in dia_display_canvas_events */ static gboolean hold_timeout_handler(gpointer data) { - if (active_tool->button_hold_func) - (*active_tool->button_hold_func) (active_tool, (GdkEventButton *)(hold_data.event), hold_data.ddisp); + dia_tool_button_hold (active_tool, (GdkEventButton *)(hold_data.event), hold_data.ddisp); hold_remove_handler(); return FALSE; } @@ -694,9 +698,9 @@ hold_timeout_handler(gpointer data) /** Main input handler for a diagram canvas. */ gint -ddisplay_canvas_events (GtkWidget *canvas, - GdkEvent *event, - DDisplay *ddisp) +dia_display_canvas_events (GtkWidget *canvas, + GdkEvent *event, + gpointer data) { GdkEventMotion *mevent; GdkEventButton *bevent; @@ -713,6 +717,7 @@ ddisplay_canvas_events (GtkWidget *canvas, int key_handled; int im_context_used; static gboolean moving = FALSE; + DiaDisplay *ddisp = dia_canvas_get_display (DIA_CANVAS (canvas)); return_val = FALSE; @@ -728,45 +733,45 @@ ddisplay_canvas_events (GtkWidget *canvas, { case GDK_SCROLL_UP: if (sevent->state & GDK_SHIFT_MASK) - ddisplay_scroll_left(ddisp); + dia_display_scroll_left(ddisp); else if (sevent->state & GDK_CONTROL_MASK) { - ddisplay_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y); + dia_display_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y); /* zooming with the wheel in small steps 1^(1/8) */ - ddisplay_zoom_centered(ddisp, &middle, 1.090508); + dia_display_zoom_centered(ddisp, &middle, 1.090508); } else - ddisplay_scroll_up(ddisp); + dia_display_scroll_up(ddisp); break; case GDK_SCROLL_DOWN: if (sevent->state & GDK_SHIFT_MASK) - ddisplay_scroll_right(ddisp); + dia_display_scroll_right(ddisp); else if (sevent->state & GDK_CONTROL_MASK) { - ddisplay_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y); + dia_display_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y); /* zooming with the wheel in small steps 1/(1^(1/8)) */ - ddisplay_zoom_centered(ddisp, &middle, 0.917004); + dia_display_zoom_centered(ddisp, &middle, 0.917004); } else - ddisplay_scroll_down(ddisp); + dia_display_scroll_down(ddisp); break; case GDK_SCROLL_LEFT: - ddisplay_scroll_left(ddisp); + dia_display_scroll_left(ddisp); break; case GDK_SCROLL_RIGHT: - ddisplay_scroll_right(ddisp); + dia_display_scroll_right(ddisp); break; default: break; } - ddisplay_flush (ddisp); + dia_display_flush (ddisp); break; case GDK_FOCUS_CHANGE: { - GdkEventFocus *focus = (GdkEventFocus*)event; - hold_remove_handler(); - if (focus->in) { - display_set_active(ddisp); - ddisplay_do_update_menu_sensitivity(ddisp); - } + GdkEventFocus *focus = (GdkEventFocus*)event; + hold_remove_handler(); + if (focus->in) { + display_set_active(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); + } break; } case GDK_2BUTTON_PRESS: @@ -779,8 +784,7 @@ ddisplay_canvas_events (GtkWidget *canvas, case 1: if (transient_tool) break; - if (active_tool->double_click_func) - (*active_tool->double_click_func) (active_tool, bevent, ddisp); + dia_tool_double_click (active_tool, bevent, ddisp); break; case 2: @@ -797,8 +801,8 @@ ddisplay_canvas_events (GtkWidget *canvas, case GDK_BUTTON_PRESS: display_set_active(ddisp); bevent = (GdkEventButton *) event; - - ddisplay_set_clicked_point (ddisp, bevent->x, bevent->y); + + dia_display_set_clicked_point (ddisp, bevent->x, bevent->y); switch (bevent->button) { @@ -806,10 +810,9 @@ ddisplay_canvas_events (GtkWidget *canvas, if (transient_tool) break; /* get the focus again, may be lost by zoom combo */ - moving = TRUE; - gtk_widget_grab_focus(canvas); - if (active_tool->button_press_func) - (*active_tool->button_press_func) (active_tool, bevent, ddisp); + moving = TRUE; + gtk_widget_grab_focus (canvas); + dia_tool_button_press (active_tool, bevent, ddisp); /* Detect user holding down the button. * Set timeout for 1sec. If timeout is called, user must still @@ -821,12 +824,11 @@ ddisplay_canvas_events (GtkWidget *canvas, case 2: if (ddisp->menu_bar == NULL && !is_integrated_ui()) { popup_object_menu(ddisp, event); + } else if (!transient_tool) { + gtk_widget_grab_focus(canvas); + transient_tool = g_object_new (DIA_TYPE_SCROLL_TOOL, NULL); + dia_tool_button_press (transient_tool, bevent, ddisp); } - else if (!transient_tool) { - gtk_widget_grab_focus(canvas); - transient_tool = create_scroll_tool(); - (*transient_tool->button_press_func) (transient_tool, bevent, ddisp); - } break; case 3: @@ -838,7 +840,7 @@ ddisplay_canvas_events (GtkWidget *canvas, popup_object_menu(ddisp, event); break; } - ddisplay_popup_menu(ddisp, bevent); + dia_display_popup_menu(ddisp, bevent); break; } else { @@ -854,33 +856,28 @@ ddisplay_canvas_events (GtkWidget *canvas, display_set_active(ddisp); bevent = (GdkEventButton *) event; - switch (bevent->button) - { - case 1: - if (moving) - moving = FALSE; - if (active_tool->button_release_func) - (*active_tool->button_release_func) (active_tool, - bevent, ddisp); - /* Button Press and Hold - remove handler then deallocate memory */ - hold_remove_handler(); - break; - - case 2: - if (transient_tool) { - (*transient_tool->button_release_func) (transient_tool, - bevent, ddisp); - - tool_free(transient_tool); - transient_tool = NULL; - } - break; - - case 3: - break; - - default: - break; + switch (bevent->button) { + case 1: + if (moving) + moving = FALSE; + dia_tool_button_release (active_tool, bevent, ddisp); + /* Button Press and Hold - remove handler then deallocate memory */ + hold_remove_handler(); + break; + + case 2: + if (transient_tool) { + dia_tool_button_release (transient_tool, bevent, ddisp); + dia_tool_deactivate (transient_tool); + transient_tool = NULL; + } + break; + + case 3: + break; + + default: + break; } break; @@ -897,10 +894,10 @@ ddisplay_canvas_events (GtkWidget *canvas, mevent->state = tmask; mevent->is_hint = FALSE; } - if (transient_tool && (*transient_tool->motion_func)) - (*transient_tool->motion_func) (transient_tool, mevent, ddisp); - else if (active_tool->motion_func) - (*active_tool->motion_func) (active_tool, mevent, ddisp); + if (transient_tool) + dia_tool_motion (transient_tool, mevent, ddisp); + else + dia_tool_motion (active_tool, mevent, ddisp); break; case GDK_KEY_PRESS: @@ -924,15 +921,15 @@ ddisplay_canvas_events (GtkWidget *canvas, GTK_IM_CONTEXT(ddisp->im_context), kevent)) { switch (kevent->keyval) { - case GDK_Tab: + case GDK_KEY_Tab: focus = textedit_move_focus(ddisp, focus, (state & GDK_SHIFT_MASK) == 0); obj = focus_get_object(focus); break; - case GDK_Escape: + case GDK_KEY_Escape: textedit_deactivate_focus(); tool_reset (); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); break; default: /*! key event not swallowed by the input method ? */ @@ -957,45 +954,45 @@ ddisplay_canvas_events (GtkWidget *canvas, return_val = TRUE; switch(kevent->keyval) { - case GDK_Home : - case GDK_KP_Home : + case GDK_KEY_Home : + case GDK_KEY_KP_Home : /* match upper left corner of the diagram with it's view */ - ddisplay_set_origo(ddisp, ddisp->diagram->data->extents.left, ddisp->diagram->data->extents.top); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); + dia_display_set_origo(ddisp, ddisp->diagram->data->extents.left, ddisp->diagram->data->extents.top); + dia_display_update_scrollbars(ddisp); + dia_display_add_update_all(ddisp); break; - case GDK_End : - case GDK_KP_End : + case GDK_KEY_End : + case GDK_KEY_KP_End : /* match lower right corner of the diagram with it's view */ visible = &ddisp->visible; - ddisplay_set_origo(ddisp, + dia_display_set_origo(ddisp, ddisp->diagram->data->extents.right - (visible->right - visible->left), ddisp->diagram->data->extents.bottom - (visible->bottom - visible->top)); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); + dia_display_update_scrollbars(ddisp); + dia_display_add_update_all(ddisp); break; - case GDK_Page_Up : - case GDK_KP_Page_Up : + case GDK_KEY_Page_Up : + case GDK_KEY_KP_Page_Up : _scroll_page (ddisp, !(state & GDK_CONTROL_MASK) ? DIR_UP : DIR_LEFT); break; - case GDK_Page_Down : - case GDK_KP_Page_Down : + case GDK_KEY_Page_Down : + case GDK_KEY_KP_Page_Down : _scroll_page (ddisp, !(state & GDK_CONTROL_MASK) ? DIR_DOWN : DIR_RIGHT); break; - case GDK_Up: - case GDK_Down: - case GDK_Left: - case GDK_Right: + case GDK_KEY_Up: + case GDK_KEY_Down: + case GDK_KEY_Left: + case GDK_KEY_Right: if (g_list_length (ddisp->diagram->data->selected) > 0) { Diagram *dia = ddisp->diagram; GList *objects = dia->data->selected; - Direction dir = GDK_Up == kevent->keyval ? DIR_UP : - GDK_Down == kevent->keyval ? DIR_DOWN : - GDK_Right == kevent->keyval ? DIR_RIGHT : DIR_LEFT; + Direction dir = GDK_KEY_Up == kevent->keyval ? DIR_UP : + GDK_KEY_Down == kevent->keyval ? DIR_DOWN : + GDK_KEY_Right == kevent->keyval ? DIR_RIGHT : DIR_LEFT; object_add_updates_list(objects, dia); object_list_nudge(objects, dia, dir, /* step one pixel or more with */ - ddisplay_untransform_length (ddisp, (state & GDK_SHIFT_MASK) ? 10 : 1)); + dia_display_untransform_length (ddisp, (state & GDK_SHIFT_MASK) ? 10 : 1)); diagram_update_connections_selection(dia); object_add_updates_list(objects, dia); diagram_modified(dia); @@ -1006,27 +1003,27 @@ ddisplay_canvas_events (GtkWidget *canvas, _scroll_step (ddisp, kevent->keyval); } break; - case GDK_KP_Add: - case GDK_plus: - ddisplay_zoom_middle(ddisp, M_SQRT2); + case GDK_KEY_KP_Add: + case GDK_KEY_plus: + dia_display_zoom_middle(ddisp, M_SQRT2); break; - case GDK_KP_Subtract: - case GDK_minus: - ddisplay_zoom_middle(ddisp, M_SQRT1_2); + case GDK_KEY_KP_Subtract: + case GDK_KEY_minus: + dia_display_zoom_middle(ddisp, M_SQRT1_2); break; - case GDK_Shift_L: - case GDK_Shift_R: - if (active_tool->type == MAGNIFY_TOOL) + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + if (DIA_IS_MAGNIFY_TOOL (active_tool)) set_zoom_out(active_tool); break; - case GDK_Escape: + case GDK_KEY_Escape: view_unfullscreen(); break; - case GDK_F2: - case GDK_Return: + case GDK_KEY_F2: + case GDK_KEY_Return: gtk_action_activate (menus_get_action ("ToolsTextedit")); break; - case GDK_Menu: + case GDK_KEY_Menu: popup_object_menu (ddisp, event); break; default: @@ -1051,9 +1048,9 @@ ddisplay_canvas_events (GtkWidget *canvas, return_val = TRUE; } else { switch(kevent->keyval) { - case GDK_Shift_L: - case GDK_Shift_R: - if (active_tool->type == MAGNIFY_TOOL) + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + if (DIA_IS_MAGNIFY_TOOL (active_tool)) set_zoom_in(active_tool); break; default: @@ -1070,50 +1067,43 @@ ddisplay_canvas_events (GtkWidget *canvas, } gint -ddisplay_hsb_update (GtkAdjustment *adjustment, - DDisplay *ddisp) +dia_display_hsb_update (GtkAdjustment *adjustment, + DiaDisplay *ddisp) { - ddisplay_set_origo(ddisp, gtk_adjustment_get_value (adjustment), ddisp->origo.y); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_set_origo(ddisp, gtk_adjustment_get_value (adjustment), ddisp->origo.y); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); return FALSE; } gint -ddisplay_vsb_update (GtkAdjustment *adjustment, - DDisplay *ddisp) +dia_display_vsb_update (GtkAdjustment *adjustment, + DiaDisplay *ddisp) { - ddisplay_set_origo(ddisp, ddisp->origo.x, gtk_adjustment_get_value (adjustment)); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_set_origo(ddisp, ddisp->origo.x, gtk_adjustment_get_value (adjustment)); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); return FALSE; } gint -ddisplay_delete (GtkWidget *widget, GdkEvent *event, gpointer data) +dia_display_delete (GtkWidget *widget, GdkEvent *event, gpointer data) { - DDisplay *ddisp; + DiaDisplay *ddisp; - ddisp = (DDisplay *)data; + ddisp = (DiaDisplay *)data; - ddisplay_close(ddisp); + dia_display_close(ddisp); return TRUE; } -void -ddisplay_destroy (GtkWidget *widget, gpointer data) -{ - DDisplay *ddisp; - - ddisp = (DDisplay *) data; - - ddisplay_really_destroy(ddisp); -} - /* returns NULL if object cannot be created */ DiaObject * -ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype, - gpointer user_data) +dia_display_drop_object (DiaDisplay *ddisp, + gint x, + gint y, + DiaObjectType *otype, + gpointer user_data) { Point droppoint; Point droppoint_orig; @@ -1123,7 +1113,7 @@ ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype, real click_distance; gboolean avoid_reset; - ddisplay_untransform_coords(ddisp, x, y, &droppoint.x, &droppoint.y); + dia_display_untransform_coords(ddisp, x, y, &droppoint.x, &droppoint.y); /* save it before snap_to_grid modifies it */ droppoint_orig = droppoint; @@ -1137,7 +1127,7 @@ ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype, if (!obj) return NULL; - click_distance = ddisplay_untransform_length(ddisp, 3.0); + click_distance = dia_display_untransform_length(ddisp, 3.0); /* Notice that using diagram_find_clicked_object doesn't allow any object * below the first to be a parent. This should be fixed. @@ -1218,7 +1208,7 @@ ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype, object_connect_display(ddisp, obj, handle1, FALSE); } object_add_updates(obj, ddisp->diagram); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); diagram_flush(ddisp->diagram); list = g_list_prepend(NULL, obj); diff --git a/app/disp_callbacks.h b/app/disp_callbacks.h index 84c5a25a0d960dca4a1338fcc597d6a891010d7c..fa27a5f839e18a5bd432735b98f059f0c1951896 100644 --- a/app/disp_callbacks.h +++ b/app/disp_callbacks.h @@ -20,25 +20,24 @@ #include "display.h" -gint ddisplay_focus_in_event (GtkWidget *widget, GdkEventFocus *event, +gint dia_display_focus_in_event (GtkWidget *widget, GdkEventFocus *event, gpointer data); -gint ddisplay_focus_out_event (GtkWidget *widget, GdkEventFocus *event, +gint dia_display_focus_out_event (GtkWidget *widget, GdkEventFocus *event, gpointer data); -void ddisplay_realize (GtkWidget *widget, gpointer data); -void ddisplay_unrealize (GtkWidget *widget, gpointer data); +void dia_display_realize (GtkWidget *widget, gpointer data); +void dia_display_unrealize (GtkWidget *widget, gpointer data); -gint ddisplay_canvas_events (GtkWidget *, GdkEvent *, DDisplay *ddisp); -void ddisplay_popup_menu(DDisplay *ddisp, GdkEventButton *event); -gint ddisplay_hsb_update (GtkAdjustment *adjustment, DDisplay *ddisp); -gint ddisplay_vsb_update (GtkAdjustment *adjustment, DDisplay *ddisp); -gint ddisplay_delete (GtkWidget *widget, GdkEvent *event, gpointer data); -void ddisplay_destroy (GtkWidget *widget, gpointer data); +gint dia_display_canvas_events (GtkWidget *, GdkEvent *, gpointer data); +void dia_display_popup_menu(DiaDisplay *ddisp, GdkEventButton *event); +gint dia_display_hsb_update (GtkAdjustment *adjustment, DiaDisplay *ddisp); +gint dia_display_vsb_update (GtkAdjustment *adjustment, DiaDisplay *ddisp); +gint dia_display_delete (GtkWidget *widget, GdkEvent *event, gpointer data); -DiaObject *ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype, +DiaObject *dia_display_drop_object(DiaDisplay *ddisp, gint x, gint y, DiaObjectType *otype, gpointer user_data); -void ddisplay_im_context_commit(GtkIMContext *context, const gchar *str, - DDisplay *ddisp); -void ddisplay_im_context_preedit_changed(GtkIMContext *context, - DDisplay *ddisp); +void dia_display_im_context_commit(GtkIMContext *context, const gchar *str, + DiaDisplay *ddisp); +void dia_display_im_context_preedit_changed(GtkIMContext *context, + DiaDisplay *ddisp); #endif /* DISP_CALLBACKS_H */ diff --git a/app/display.c b/app/display.c index 076d04685a1db62424060e48eadaae5ee1434b2c..e37977206c15ea011299344317019296668dbea5 100644 --- a/app/display.c +++ b/app/display.c @@ -32,7 +32,6 @@ #include "disp_callbacks.h" #include "interface.h" #include "focus.h" -#include "color.h" #include "object.h" #include "handle_ops.h" #include "connectionpoint_ops.h" @@ -44,17 +43,28 @@ #include "layer_dialog.h" #include "load_save.h" #include "dia-props.h" -#include "render_gdk.h" +#include "renderer/diacairo.h" #include "diatransform.h" #include "recent_files.h" #include "filedlg.h" +G_DEFINE_TYPE (DiaDisplay, dia_display, G_TYPE_OBJECT) + +enum { + PROP_DIAGRAM = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + static GdkCursor *current_cursor = NULL; GdkCursor *default_cursor = NULL; -static DDisplay *active_display = NULL; +static DiaDisplay *active_display = NULL; +static void dia_display_free_update_areas (DiaDisplay *ddisp); +static void initialize_display_widgets (DiaDisplay *ddisp); +static void selection_changed (Diagram *dia, int n, DiaDisplay *ddisp); typedef struct _IRectangle { int top, bottom; @@ -62,7 +72,179 @@ typedef struct _IRectangle { } IRectangle; static void -update_zoom_status(DDisplay *ddisp) +dia_display_finalize (GObject *obj) +{ + DiaDisplay *ddisp = DIA_DISPLAY (obj); + + g_signal_handlers_disconnect_by_func (ddisp->diagram, selection_changed, ddisp); + + g_object_unref (G_OBJECT (ddisp->im_context)); + ddisp->im_context = NULL; + + dia_display_im_context_preedit_reset (ddisp, get_active_focus ((DiagramData *) ddisp->diagram)); + + if (GTK_WINDOW (ddisp->shell) == gtk_window_get_transient_for (GTK_WINDOW (interface_get_toolbox_shell ()))) { + /* we have to break the connection otherwise the toolbox will be closed */ + gtk_window_set_transient_for (GTK_WINDOW (interface_get_toolbox_shell ()), NULL); + } + + /* This calls dia_display_really_destroy */ + if (ddisp->is_standalone_window) { + gtk_widget_destroy (ddisp->shell); + } else { + gtk_widget_destroy (ddisp->container); + + if (active_display == ddisp) + display_set_active (NULL); + + if (ddisp->diagram) { + diagram_remove_display (ddisp->diagram, ddisp); + /* if we are the last user of the diagram it will be unref'ed */ + g_clear_object (&ddisp->diagram); + } + + g_clear_object (&ddisp->renderer); + + /* Free update_areas list: */ + dia_display_free_update_areas (ddisp); + } +} + +static void +dia_display_constructed (GObject *obj) +{ + Rectangle visible; + int preset; + DiaDisplay *self = DIA_DISPLAY (obj); + + /* Ideally this would be done in _init but taking the safe approach to + * porting for now */ + + self->grid.visible = prefs.grid.visible; + preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->diagram), "show-grid")); + if (preset != 0) + self->grid.visible = (preset > 0 ? TRUE : FALSE); + self->grid.snap = prefs.grid.snap; + preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->diagram), "snap-to-grid")); + if (preset != 0) + self->grid.snap = (preset > 0 ? TRUE : FALSE); + + self->show_cx_pts = prefs.show_cx_pts; + preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->diagram), "show-connection-points")); + if (preset != 0) + self->show_cx_pts = (preset > 0 ? TRUE : FALSE); + + self->autoscroll = TRUE; + self->mainpoint_magnetism = prefs.snap_object; + preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->diagram), "snap-to-object")); + if (preset != 0) + self->mainpoint_magnetism = (preset > 0 ? TRUE : FALSE); + + self->aa_renderer = prefs.view_antialiased; + preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->diagram), "antialiased")); + if (preset != 0) + self->aa_renderer = (preset > 0 ? TRUE : FALSE); + + self->update_areas = NULL; + + self->clicked_position.x = self->clicked_position.y = 0.0; + + diagram_add_display (self->diagram, self); + g_signal_connect (self->diagram, "selection_changed", G_CALLBACK (selection_changed), self); + self->origo.x = 0.0; + self->origo.y = 0.0; + self->zoom_factor = prefs.new_view.zoom / 100.0 * DDISPLAY_NORMAL_ZOOM; + if ((self->diagram) && (self->diagram->data)) { + Rectangle *extents = &self->diagram->data->extents; + + visible.left = extents->left; + visible.top = extents->top; + } else { + visible.left = 0.0; + visible.top = 0.0; + } + visible.right = visible.left + prefs.new_view.width / self->zoom_factor; + visible.bottom = visible.top + prefs.new_view.height / self->zoom_factor; + + self->visible = visible; + + initialize_display_widgets (self); + + G_OBJECT_CLASS (dia_display_parent_class)->constructed (obj); +} + +static void +dia_display_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaDisplay *self = DIA_DISPLAY (object); + + switch (property_id) { + case PROP_DIAGRAM: + self->diagram = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_display_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaDisplay *self = DIA_DISPLAY (object); + + switch (property_id) { + case PROP_DIAGRAM: + g_value_set_object (value, self->diagram); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_display_class_init (DiaDisplayClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_display_finalize; + object_class->constructed = dia_display_constructed; + object_class->set_property = dia_display_set_property; + object_class->get_property = dia_display_get_property; + + properties[PROP_DIAGRAM] = g_param_spec_object ("diagram", + NULL, NULL, + DIA_TYPE_DIAGRAM, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); +} + +static void +dia_display_init (DiaDisplay *self) +{ + +} + +DiaDisplay * +dia_display_new (Diagram *diagram) +{ + return g_object_new (DIA_TYPE_DISPLAY, + "diagram", diagram, + NULL); +} + +static void +update_zoom_status(DiaDisplay *ddisp) { gchar* zoom_text; @@ -87,7 +269,7 @@ update_zoom_status(DDisplay *ddisp) } static void -selection_changed (Diagram* dia, int n, DDisplay* ddisp) +selection_changed (Diagram* dia, int n, DiaDisplay* ddisp) { GtkStatusbar *statusbar; guint context_id; @@ -129,7 +311,7 @@ selection_changed (Diagram* dia, int n, DDisplay* ddisp) gtk_statusbar_pop (statusbar, context_id); } /* selection-changed signal can also be emitted from outside of the dia core */ - ddisplay_do_update_menu_sensitivity (ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } /** Initialize the various GTK-level thinks in a display after the internal @@ -137,7 +319,7 @@ selection_changed (Diagram* dia, int n, DDisplay* ddisp) * @param ddisp A display with all non-GTK/GDK items set. */ static void -initialize_display_widgets(DDisplay *ddisp) +initialize_display_widgets(DiaDisplay *ddisp) { Diagram *dia = ddisp->diagram; gchar *filename; @@ -146,10 +328,10 @@ initialize_display_widgets(DDisplay *ddisp) ddisp->im_context = gtk_im_multicontext_new(); g_signal_connect (G_OBJECT (ddisp->im_context), "commit", - G_CALLBACK (ddisplay_im_context_commit), ddisp); + G_CALLBACK (dia_display_im_context_commit), ddisp); ddisp->preedit_string = NULL; g_signal_connect (G_OBJECT (ddisp->im_context), "preedit_changed", - G_CALLBACK (ddisplay_im_context_preedit_changed), + G_CALLBACK (dia_display_im_context_preedit_changed), ddisp); ddisp->preedit_attrs = NULL; @@ -162,9 +344,9 @@ initialize_display_widgets(DDisplay *ddisp) create_display_shell(ddisp, prefs.new_view.width, prefs.new_view.height, filename, prefs.new_view.use_menu_bar); - ddisplay_update_statusbar (ddisp); + dia_display_update_statusbar (ddisp); - ddisplay_set_cursor(ddisp, current_cursor); + dia_display_set_cursor(ddisp, current_cursor); } /** Make a copy of an existing display. The original does not need to have @@ -175,14 +357,16 @@ initialize_display_widgets(DDisplay *ddisp) * new_display initializes before calling initialize_display_widgets()). * @returns A newly allocated display, inserted into the diagram list, with * same basic layout as the original. + * + * TODO: I don't like this function, can we kill it? */ -DDisplay * -copy_display(DDisplay *orig_ddisp) +DiaDisplay * +dia_display_copy (DiaDisplay *orig_ddisp) { - DDisplay *ddisp; + DiaDisplay *ddisp; Diagram *dia = orig_ddisp->diagram; - ddisp = g_new0(DDisplay,1); + ddisp = g_object_new (DIA_TYPE_DISPLAY, NULL); ddisp->diagram = orig_ddisp->diagram; /* Every display has its own reference */ @@ -199,12 +383,10 @@ copy_display(DDisplay *orig_ddisp) ddisp->aa_renderer = orig_ddisp->aa_renderer; ddisp->update_areas = orig_ddisp->update_areas; - ddisp->display_areas = orig_ddisp->display_areas; - ddisp->update_id = 0; ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0; - diagram_add_ddisplay(dia, ddisp); + diagram_add_display(dia, ddisp); g_signal_connect (dia, "selection_changed", G_CALLBACK(selection_changed), ddisp); ddisp->origo = orig_ddisp->origo; ddisp->zoom_factor = orig_ddisp->zoom_factor; @@ -214,80 +396,8 @@ copy_display(DDisplay *orig_ddisp) return ddisp; /* set the user data */ } - -/** Create a new display for a diagram, using prefs settings. - * @param dia Otherwise initialize diagram to create a display for. - * @returns A newly created display. - */ -DDisplay * -new_display(Diagram *dia) -{ - DDisplay *ddisp; - Rectangle visible; - int preset; - - ddisp = g_new0(DDisplay,1); - - ddisp->diagram = dia; - /* Every display has it's own reference */ - g_object_ref(dia); - - ddisp->grid.visible = prefs.grid.visible; - preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(dia), "show-grid")); - if (preset != 0) - ddisp->grid.visible = (preset > 0 ? TRUE : FALSE); - ddisp->grid.snap = prefs.grid.snap; - preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(dia), "snap-to-grid")); - if (preset != 0) - ddisp->grid.snap = (preset > 0 ? TRUE : FALSE); - - ddisp->show_cx_pts = prefs.show_cx_pts; - preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(dia), "show-connection-points")); - if (preset != 0) - ddisp->show_cx_pts = (preset > 0 ? TRUE : FALSE); - - ddisp->autoscroll = TRUE; - ddisp->mainpoint_magnetism = prefs.snap_object; - preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(dia), "snap-to-object")); - if (preset != 0) - ddisp->mainpoint_magnetism = (preset > 0 ? TRUE : FALSE); - - ddisp->aa_renderer = prefs.view_antialiased; - preset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(dia), "antialiased")); - if (preset != 0) - ddisp->aa_renderer = (preset > 0 ? TRUE : FALSE); - - ddisp->update_areas = NULL; - ddisp->display_areas = NULL; - ddisp->update_id = 0; - - ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0; - - diagram_add_ddisplay(dia, ddisp); - g_signal_connect (dia, "selection_changed", G_CALLBACK(selection_changed), ddisp); - ddisp->origo.x = 0.0; - ddisp->origo.y = 0.0; - ddisp->zoom_factor = prefs.new_view.zoom/100.0*DDISPLAY_NORMAL_ZOOM; - if ((ddisp->diagram) && (ddisp->diagram->data)) { - Rectangle *extents = &ddisp->diagram->data->extents; - - visible.left = extents->left; - visible.top = extents->top; - } else { - visible.left = 0.0; - visible.top = 0.0; - } - visible.right = visible.left + prefs.new_view.width/ddisp->zoom_factor; - visible.bottom = visible.top + prefs.new_view.height/ddisp->zoom_factor; - - ddisp->visible = visible; - - initialize_display_widgets(ddisp); - return ddisp; /* set the user data */ -} - void -ddisplay_transform_coords_double(DDisplay *ddisp, +dia_display_transform_coords_double(DiaDisplay *ddisp, coord x, coord y, double *xi, double *yi) { @@ -301,7 +411,7 @@ ddisplay_transform_coords_double(DDisplay *ddisp, void -ddisplay_transform_coords(DDisplay *ddisp, +dia_display_transform_coords(DiaDisplay *ddisp, coord x, coord y, int *xi, int *yi) { @@ -317,21 +427,21 @@ ddisplay_transform_coords(DDisplay *ddisp, /* Takes real length and returns pixel length */ real -ddisplay_transform_length(DDisplay *ddisp, real len) +dia_display_transform_length(DiaDisplay *ddisp, real len) { return len * ddisp->zoom_factor; } /* Takes pixel length and returns real length */ real -ddisplay_untransform_length(DDisplay *ddisp, real len) +dia_display_untransform_length(DiaDisplay *ddisp, real len) { return len / ddisp->zoom_factor; } void -ddisplay_untransform_coords(DDisplay *ddisp, +dia_display_untransform_coords(DiaDisplay *ddisp, int xi, int yi, coord *x, coord *y) { @@ -345,40 +455,26 @@ ddisplay_untransform_coords(DDisplay *ddisp, void -ddisplay_add_update_pixels(DDisplay *ddisp, Point *point, +dia_display_add_update_pixels(DiaDisplay *ddisp, Point *point, int pixel_width, int pixel_height) { Rectangle rect; real size_x, size_y; - size_x = ddisplay_untransform_length(ddisp, pixel_width+1); - size_y = ddisplay_untransform_length(ddisp, pixel_height+1); + size_x = dia_display_untransform_length(ddisp, pixel_width+1); + size_y = dia_display_untransform_length(ddisp, pixel_height+1); rect.left = point->x - size_x/2.0; rect.top = point->y - size_y/2.0; rect.right = point->x + size_x/2.0; rect.bottom = point->y + size_y/2.0; - ddisplay_add_update(ddisp, &rect); -} - -/** Free display_areas list */ -static void -ddisplay_free_display_areas(DDisplay *ddisp) -{ - GSList *l; - l = ddisp->display_areas; - while(l!=NULL) { - g_free(l->data); - l = g_slist_next(l); - } - g_slist_free(ddisp->display_areas); - ddisp->display_areas = NULL; + dia_display_add_update(ddisp, &rect); } /** Free update_areas list */ static void -ddisplay_free_update_areas(DDisplay *ddisp) +dia_display_free_update_areas(DiaDisplay *ddisp) { GSList *l; l = ddisp->update_areas; @@ -394,46 +490,38 @@ ddisplay_free_update_areas(DDisplay *ddisp) * Throws out old updates, since everything will be updated anyway. */ void -ddisplay_add_update_all(DDisplay *ddisp) +dia_display_add_update_all(DiaDisplay *ddisp) { if (ddisp->update_areas != NULL) { - ddisplay_free_update_areas(ddisp); + dia_display_free_update_areas(ddisp); } - if (ddisp->display_areas != NULL) { - ddisplay_free_display_areas(ddisp); - } - ddisplay_add_update(ddisp, &ddisp->visible); + dia_display_add_update(ddisp, &ddisp->visible); } /** Marks a rectangle for update, with a pixel border around it. */ void -ddisplay_add_update_with_border(DDisplay *ddisp, const Rectangle *rect, +dia_display_add_update_with_border(DiaDisplay *ddisp, const Rectangle *rect, int pixel_border) { Rectangle r; - real size = ddisplay_untransform_length(ddisp, pixel_border+1); + real size = dia_display_untransform_length(ddisp, pixel_border+1); r.left = rect->left-size; r.top = rect->top-size; r.right = rect->right+size; r.bottom = rect->bottom+size; - ddisplay_add_update(ddisp, &r); + dia_display_add_update(ddisp, &r); } void -ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect) +dia_display_add_update(DiaDisplay *ddisp, const Rectangle *rect) { Rectangle *r; - int top,bottom,left,right; - Rectangle *visible; - int width, height; if (!ddisp->renderer) return; /* can happen at creation time of the diagram */ - width = dia_renderer_get_width_pixels (ddisp->renderer); - height = dia_renderer_get_height_pixels (ddisp->renderer); if (!rectangle_intersects(rect, &ddisp->visible)) return; @@ -450,126 +538,11 @@ ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect) rectangle_intersection(r, &ddisp->visible); } - visible = &ddisp->visible; - left = floor( (r->left - visible->left) * (real)width / - (visible->right - visible->left) ) - 1; - top = floor( (r->top - visible->top) * (real)height / - (visible->bottom - visible->top) ) - 1; - right = ceil( (r->right - visible->left) * (real)width / - (visible->right - visible->left) ) + 1; - bottom = ceil( (r->bottom - visible->top) * (real)height / - (visible->bottom - visible->top) ) + 1; - - ddisplay_add_display_area(ddisp, - left, top, - right, bottom); -} - -void -ddisplay_add_display_area(DDisplay *ddisp, - int left, int top, - int right, int bottom) -{ - IRectangle *r; - - if (!ddisp->renderer) - return; /* if we don't have a renderer yet prefer ignoring over crashing */ - if (left < 0) - left = 0; - if (top < 0) - top = 0; - if (right > dia_renderer_get_width_pixels (ddisp->renderer)) - right = dia_renderer_get_width_pixels (ddisp->renderer); - if (bottom > dia_renderer_get_height_pixels (ddisp->renderer)) - bottom = dia_renderer_get_height_pixels (ddisp->renderer); - - /* draw some rectangles to show where updates are...*/ - /* - gdk_draw_rectangle(gtk_widget_get_window(ddisp->canvas), - gtk_widget_get_style(ddisp->canvas)->black_gc, TRUE, - left, top, right-left,bottom-top); - */ - /* Temporarily just do a union of all Irectangles: */ - if (ddisp->display_areas==NULL) { - r = g_new(IRectangle,1); - r->top = top; r->bottom = bottom; - r->left = left; r->right = right; - ddisp->display_areas = g_slist_prepend(ddisp->display_areas, r); - } else { - r = (IRectangle *) ddisp->display_areas->data; - - r->top = MIN( r->top, top ); - r->bottom = MAX( r->bottom, bottom ); - r->left = MIN( r->left, left ); - r->right = MAX( r->right, right ); - } -} - -static gboolean -ddisplay_update_handler(DDisplay *ddisp) -{ - GSList *l; - IRectangle *ir; - Rectangle *r, totrect; - DiaInteractiveRendererInterface *renderer; - - g_return_val_if_fail (ddisp->renderer != NULL, FALSE); - - /* Renders updates to pixmap + copies display_areas to canvas(screen) */ - renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); - - /* Only update if update_areas exist */ - l = ddisp->update_areas; - if (l != NULL) - { - totrect = *(Rectangle *) l->data; - - g_return_val_if_fail ( renderer->clip_region_clear != NULL - && renderer->clip_region_add_rect != NULL, FALSE); - - renderer->clip_region_clear (ddisp->renderer); - - while(l!=NULL) { - r = (Rectangle *) l->data; - - rectangle_union(&totrect, r); - renderer->clip_region_add_rect (ddisp->renderer, r); - - l = g_slist_next(l); - } - /* Free update_areas list: */ - ddisplay_free_update_areas(ddisp); - - totrect.left -= 0.1; - totrect.right += 0.1; - totrect.top -= 0.1; - totrect.bottom += 0.1; - - ddisplay_render_pixmap(ddisp, &totrect); - } - - l = ddisp->display_areas; - while(l!=NULL) { - ir = (IRectangle *) l->data; - - g_return_val_if_fail (renderer->copy_to_window, FALSE); - renderer->copy_to_window(ddisp->renderer, - gtk_widget_get_window(ddisp->canvas), - ir->left, ir->top, - ir->right - ir->left, ir->bottom - ir->top); - - l = g_slist_next(l); - } - - ddisplay_free_display_areas(ddisp); - - ddisp->update_id = 0; - - return FALSE; + gtk_widget_queue_draw (ddisp->canvas); } void -ddisplay_flush(DDisplay *ddisp) +dia_display_flush(DiaDisplay *ddisp) { /* if no update is queued, queue update * @@ -579,20 +552,15 @@ ddisplay_flush(DDisplay *ddisp) * GTK_PRIORITY_RESIZE = (G_PRIORITY_HIGH_IDLE + 10) * Dia's canvas rendering is in between */ - if (!ddisp->update_id) - ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, ddisp, NULL); - if (ddisp->display_areas) { - IRectangle *r = (IRectangle *)ddisp->display_areas->data; - dia_log_message ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom); - } + gtk_widget_queue_draw (ddisp->canvas); } static void -ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer, +dia_display_obj_render(DiaObject *obj, DiaRenderer *renderer, int active_layer, gpointer data) { - DDisplay *ddisp = (DDisplay *)data; + DiaDisplay *ddisp = (DiaDisplay *)data; DiaInteractiveRendererInterface *irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); DiaHighlightType hltype = data_object_get_highlight(DIA_DIAGRAM_DATA(ddisp->diagram), obj); @@ -609,7 +577,7 @@ ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer, } void -ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update) +dia_display_render_pixmap(DiaDisplay *ddisp, Rectangle *update) { GList *list; DiaObject *obj; @@ -632,8 +600,8 @@ ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update) if (update) { int x0, y0, x1, y1; - ddisplay_transform_coords (ddisp, update->left, update->top, &x0, &y0); - ddisplay_transform_coords (ddisp, update->right, update->bottom, &x1, &y1); + dia_display_transform_coords (ddisp, update->left, update->top, &x0, &y0); + dia_display_transform_coords (ddisp, update->right, update->bottom, &x1, &y1); renderer->fill_pixel_rect (ddisp->renderer, x0, y0, x1-x0, y1-y0, &ddisp->diagram->data->bg_color); @@ -652,7 +620,7 @@ ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update) timer = g_timer_new(); #endif data_render(ddisp->diagram->data, ddisp->renderer, update, - ddisplay_obj_render, (gpointer) ddisp); + dia_display_obj_render, (gpointer) ddisp); #ifdef TRACES g_print ("data_render(%g%%) took %g seconds\n", ddisp->zoom_factor * 5.0, g_timer_elapsed (timer, NULL)); g_timer_destroy (timer); @@ -671,7 +639,7 @@ ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update) } void -ddisplay_update_scrollbars(DDisplay *ddisp) +dia_display_update_scrollbars(DiaDisplay *ddisp) { Rectangle *extents = &ddisp->diagram->data->extents; Rectangle *visible = &ddisp->visible; @@ -703,7 +671,7 @@ ddisplay_update_scrollbars(DDisplay *ddisp) } void -ddisplay_set_origo(DDisplay *ddisp, coord x, coord y) +dia_display_set_origo(DiaDisplay *ddisp, coord x, coord y) { Rectangle *extents = &ddisp->diagram->data->extents; Rectangle *visible = &ddisp->visible; @@ -726,14 +694,14 @@ ddisplay_set_origo(DDisplay *ddisp, coord x, coord y) visible->left = ddisp->origo.x; visible->top = ddisp->origo.y; - visible->right = ddisp->origo.x + ddisplay_untransform_length(ddisp, width); - visible->bottom = ddisp->origo.y + ddisplay_untransform_length(ddisp, height); + visible->right = ddisp->origo.x + dia_display_untransform_length(ddisp, width); + visible->bottom = ddisp->origo.y + dia_display_untransform_length(ddisp, height); - ddisplay_update_rulers (ddisp, extents, visible); + dia_display_update_rulers (ddisp, extents, visible); } void -ddisplay_zoom(DDisplay *ddisp, Point *point, real magnify) +dia_display_zoom(DiaDisplay *ddisp, Point *point, real magnify) { Rectangle *visible; real width, height, old_zoom; @@ -760,11 +728,11 @@ ddisplay_zoom(DDisplay *ddisp, Point *point, real magnify) height = (visible->bottom - visible->top)/magnify; - ddisplay_set_origo(ddisp, point->x - width/2.0, point->y - height/2.0); + dia_display_set_origo(ddisp, point->x - width/2.0, point->y - height/2.0); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_update_scrollbars(ddisp); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); update_zoom_status (ddisp); } @@ -772,7 +740,7 @@ ddisplay_zoom(DDisplay *ddisp, Point *point, real magnify) /* Zoom around the middle point of the visible area */ void -ddisplay_zoom_middle(DDisplay *ddisp, real magnify) +dia_display_zoom_middle(DiaDisplay *ddisp, real magnify) { Point middle; Rectangle *visible; @@ -781,7 +749,7 @@ ddisplay_zoom_middle(DDisplay *ddisp, real magnify) middle.x = visible->left*0.5 + visible->right*0.5; middle.y = visible->top*0.5 + visible->bottom*0.5; - ddisplay_zoom (ddisp, &middle, magnify); + dia_display_zoom (ddisp, &middle, magnify); } /* @@ -791,7 +759,7 @@ ddisplay_zoom_middle(DDisplay *ddisp, real magnify) from "jumping" around while zooming in and out. */ void -ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify) +dia_display_zoom_centered(DiaDisplay *ddisp, Point *point, real magnify) { Rectangle *visible; real width, height; @@ -815,11 +783,11 @@ ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify) ddisp->zoom_factor *= magnify; /* set new origin based on the calculated ratios before zooming */ - ddisplay_set_origo(ddisp, point->x-(width*rx),point->y-(height*ry)); + dia_display_set_origo(ddisp, point->x-(width*rx),point->y-(height*ry)); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_update_scrollbars(ddisp); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); update_zoom_status (ddisp); } @@ -827,7 +795,7 @@ ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify) /** Set the display's snap-to-grid setting, updating menu and button * in the process */ void -ddisplay_set_snap_to_grid(DDisplay *ddisp, gboolean snap) +dia_display_set_snap_to_grid(DiaDisplay *ddisp, gboolean snap) { GtkToggleAction *snap_to_grid; ddisp->grid.snap = snap; @@ -837,12 +805,12 @@ ddisplay_set_snap_to_grid(DDisplay *ddisp, gboolean snap) integrated_ui_toolbar_grid_snap_synchronize_to_display (ddisp); /* Currently, this can cause double emit, but that's a small problem. */ gtk_toggle_action_set_active (snap_to_grid, ddisp->grid.snap); - ddisplay_update_statusbar(ddisp); + dia_display_update_statusbar(ddisp); } /** Update the button showing whether snap-to-grid is on */ static void -update_snap_grid_status(DDisplay *ddisp) +update_snap_grid_status(DiaDisplay *ddisp) { if (ddisp->grid_status) { @@ -854,7 +822,7 @@ update_snap_grid_status(DDisplay *ddisp) /** Set the display's mainpoint magnetism setting, updating menu and button * in the process */ void -ddisplay_set_snap_to_objects(DDisplay *ddisp, gboolean magnetic) +dia_display_set_snap_to_objects(DiaDisplay *ddisp, gboolean magnetic) { GtkToggleAction *mainpoint_magnetism; ddisp->mainpoint_magnetism = magnetic; @@ -864,12 +832,12 @@ ddisplay_set_snap_to_objects(DDisplay *ddisp, gboolean magnetic) integrated_ui_toolbar_object_snap_synchronize_to_display (ddisp); /* Currently, this can cause double emit, but that's a small problem. */ gtk_toggle_action_set_active (mainpoint_magnetism, ddisp->mainpoint_magnetism); - ddisplay_update_statusbar(ddisp); + dia_display_update_statusbar(ddisp); } /** Update the button showing whether mainpoint magnetism is on */ static void -update_mainpoint_status(DDisplay *ddisp) +update_mainpoint_status(DiaDisplay *ddisp) { if (ddisp->mainpoint_status) { @@ -880,18 +848,20 @@ update_mainpoint_status(DDisplay *ddisp) /** Scroll display to where point x,y (window coords) is visible */ gboolean -ddisplay_autoscroll(DDisplay *ddisp, int x, int y) +dia_display_autoscroll(DiaDisplay *ddisp, int x, int y) { guint16 width, height; Point scroll; + GtkAllocation alloc; if (! ddisp->autoscroll) return FALSE; scroll.x = scroll.y = 0; - width = GTK_WIDGET(ddisp->canvas)->allocation.width; - height = GTK_WIDGET(ddisp->canvas)->allocation.height; + gtk_widget_get_allocation (GTK_WIDGET (ddisp->canvas), &alloc); + width = alloc.width; + height = alloc.height; if (x < 0) { @@ -915,13 +885,13 @@ ddisplay_autoscroll(DDisplay *ddisp, int x, int y) { gboolean scrolled; - scroll.x = ddisplay_untransform_length(ddisp, scroll.x); - scroll.y = ddisplay_untransform_length(ddisp, scroll.y); + scroll.x = dia_display_untransform_length(ddisp, scroll.x); + scroll.y = dia_display_untransform_length(ddisp, scroll.y); - scrolled = ddisplay_scroll(ddisp, &scroll); + scrolled = dia_display_scroll(ddisp, &scroll); if (scrolled) { - ddisplay_flush(ddisp); + dia_display_flush(ddisp); return TRUE; } } @@ -930,7 +900,7 @@ ddisplay_autoscroll(DDisplay *ddisp, int x, int y) /** Scroll the display by delta (diagram coords) */ gboolean -ddisplay_scroll(DDisplay *ddisp, Point *delta) +dia_display_scroll(DiaDisplay *ddisp, Point *delta) { Rectangle *visible = &ddisp->visible; real width = visible->right - visible->left; @@ -959,58 +929,58 @@ ddisplay_scroll(DDisplay *ddisp, Point *delta) if ( (new_origo.x != ddisp->origo.x) || (new_origo.y != ddisp->origo.y) ) { - ddisplay_set_origo(ddisp, new_origo.x, new_origo.y); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); + dia_display_set_origo(ddisp, new_origo.x, new_origo.y); + dia_display_update_scrollbars(ddisp); + dia_display_add_update_all(ddisp); return TRUE; } return FALSE; } -void ddisplay_scroll_up(DDisplay *ddisp) +void dia_display_scroll_up(DiaDisplay *ddisp) { Point delta; delta.x = 0; delta.y = -(ddisp->visible.bottom - ddisp->visible.top)/4.0; - ddisplay_scroll(ddisp, &delta); + dia_display_scroll(ddisp, &delta); } -void ddisplay_scroll_down(DDisplay *ddisp) +void dia_display_scroll_down(DiaDisplay *ddisp) { Point delta; delta.x = 0; delta.y = (ddisp->visible.bottom - ddisp->visible.top)/4.0; - ddisplay_scroll(ddisp, &delta); + dia_display_scroll(ddisp, &delta); } -void ddisplay_scroll_left(DDisplay *ddisp) +void dia_display_scroll_left(DiaDisplay *ddisp) { Point delta; delta.x = -(ddisp->visible.right - ddisp->visible.left)/4.0; delta.y = 0; - ddisplay_scroll(ddisp, &delta); + dia_display_scroll(ddisp, &delta); } -void ddisplay_scroll_right(DDisplay *ddisp) +void dia_display_scroll_right(DiaDisplay *ddisp) { Point delta; delta.x = (ddisp->visible.right - ddisp->visible.left)/4.0; delta.y = 0; - ddisplay_scroll(ddisp, &delta); + dia_display_scroll(ddisp, &delta); } /** Scroll display to have the diagram point p at the center. * Returns TRUE if anything changed. */ gboolean -ddisplay_scroll_center_point(DDisplay *ddisp, Point *p) +dia_display_scroll_center_point(DiaDisplay *ddisp, Point *p) { Point center; @@ -1020,13 +990,13 @@ ddisplay_scroll_center_point(DDisplay *ddisp, Point *p) center.y = (ddisp->visible.top+ddisp->visible.bottom)/2; point_sub(p, ¢er); - return ddisplay_scroll(ddisp, p); + return dia_display_scroll(ddisp, p); } /** Scroll display so that obj is centered. * Returns TRUE if anything changed. */ gboolean -ddisplay_scroll_to_object(DDisplay *ddisp, DiaObject *obj) +dia_display_scroll_to_object(DiaDisplay *ddisp, DiaObject *obj) { Rectangle r = obj->bounding_box; @@ -1035,13 +1005,13 @@ ddisplay_scroll_to_object(DDisplay *ddisp, DiaObject *obj) p.y = (r.top+r.bottom)/2; display_set_active(ddisp); - return ddisplay_scroll_center_point(ddisp, &p); + return dia_display_scroll_center_point(ddisp, &p); } /** Ensure the object is visible but minimize scrolling */ gboolean -ddisplay_present_object(DDisplay *ddisp, DiaObject *obj) +dia_display_present_object(DiaDisplay *ddisp, DiaObject *obj) { const Rectangle *r = dia_object_get_enclosing_box(obj); const Rectangle *v = &ddisp->visible; @@ -1064,7 +1034,7 @@ ddisplay_present_object(DDisplay *ddisp, DiaObject *obj) else if (r->bottom > v->bottom) delta.y = r->bottom - v->bottom; - ddisplay_scroll(ddisp, &delta); + dia_display_scroll(ddisp, &delta); return TRUE; } return FALSE; @@ -1074,11 +1044,11 @@ ddisplay_present_object(DDisplay *ddisp, DiaObject *obj) * Remember the last clicked point given in pixel coodinates */ void -ddisplay_set_clicked_point(DDisplay *ddisp, int x, int y) +dia_display_set_clicked_point(DiaDisplay *ddisp, int x, int y) { Point pt; - ddisplay_untransform_coords(ddisp, x, y, &pt.x, &pt.y); + dia_display_untransform_coords(ddisp, x, y, &pt.x, &pt.y); ddisp->clicked_position = pt; } @@ -1086,143 +1056,84 @@ ddisplay_set_clicked_point(DDisplay *ddisp, int x, int y) /*! Get the last clicked point in diagram coordinates */ Point -ddisplay_get_clicked_position(DDisplay *ddisp) +dia_display_get_clicked_position(DiaDisplay *ddisp) { return ddisp->clicked_position; } - -/** - * Kind of dirty way to initialize an anti-aliased renderer, maybe there - * should be some plug-in interface to do this. - * With the Libart renderer being a deprecated plug-in and the cairo renderer - * offering a lot of features including proper highlighting it seems reasonable - * to have default at cairo, although you loose a lot when it is switched off ;) - */ -static DiaRenderer * -new_aa_renderer (DDisplay *ddisp) -{ - GType renderer_type; - - renderer_type = g_type_from_name ("DiaCairoInteractiveRenderer"); - if (renderer_type) { - DiaRenderer *renderer = g_object_new(renderer_type, NULL); - g_object_set (renderer, - "zoom", &ddisp->zoom_factor, - "rect", &ddisp->visible, - NULL); - return renderer; - } - - renderer_type = g_type_from_name ("DiaLibartRenderer"); - if (renderer_type) { - DiaRenderer *renderer = g_object_new(renderer_type, NULL); - g_object_set (renderer, - "transform", dia_transform_new (&ddisp->visible, &ddisp->zoom_factor), - NULL); - return renderer; - } - - /* we really should not come here but instead disable the menu command earlier */ - message_warning (_("No antialiased renderer found")); - /* fallback: built-in libart renderer */ - return new_gdk_renderer (ddisp); -} - void -ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer) +dia_display_set_renderer(DiaDisplay *ddisp, int aa_renderer) { int width, height; GdkWindow *window = gtk_widget_get_window(ddisp->canvas); - - /* dont mix new renderer with old updates */ - if (ddisp->update_id) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } + GtkAllocation alloc; if (ddisp->renderer) g_object_unref (ddisp->renderer); ddisp->aa_renderer = aa_renderer; - width = ddisp->canvas->allocation.width; - height = ddisp->canvas->allocation.height; + gtk_widget_get_allocation (GTK_WIDGET (ddisp->canvas), &alloc); + width = alloc.width; + height = alloc.height; - if (ddisp->aa_renderer){ - ddisp->renderer = new_aa_renderer (ddisp); - } else { - ddisp->renderer = new_gdk_renderer(ddisp); + if (!ddisp->aa_renderer){ + g_message ("Only antialias renderers supported"); } + ddisp->renderer = dia_cairo_interactive_renderer_new (); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); if (window) dia_renderer_set_size(ddisp->renderer, window, width, height); } void -ddisplay_resize_canvas(DDisplay *ddisp, +dia_display_resize_canvas(DiaDisplay *ddisp, int width, int height) { if (ddisp->renderer==NULL) { - if (ddisp->aa_renderer) - ddisp->renderer = new_aa_renderer (ddisp); - else - ddisp->renderer = new_gdk_renderer(ddisp); + if (!ddisp->aa_renderer){ + g_message ("Only antialias renderers supported"); + } + ddisp->renderer = dia_cairo_interactive_renderer_new (); + g_object_set (ddisp->renderer, + "zoom", &ddisp->zoom_factor, + "rect", &ddisp->visible, + NULL); } dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height); - ddisplay_set_origo(ddisp, ddisp->origo.x, ddisp->origo.y); + dia_display_set_origo(ddisp, ddisp->origo.x, ddisp->origo.y); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); } -DDisplay * -ddisplay_active(void) +DiaDisplay * +dia_display_active(void) { return active_display; } Diagram * -ddisplay_active_diagram(void) +dia_display_active_diagram(void) { - DDisplay *ddisp = ddisplay_active (); + DiaDisplay *ddisp = dia_display_active (); if (!ddisp) return NULL; return ddisp->diagram; } -static void -ddisp_destroy(DDisplay *ddisp) -{ - g_signal_handlers_disconnect_by_func (ddisp->diagram, selection_changed, ddisp); - - g_object_unref (G_OBJECT (ddisp->im_context)); - ddisp->im_context = NULL; - - ddisplay_im_context_preedit_reset(ddisp, get_active_focus((DiagramData *) ddisp->diagram)); - - if (GTK_WINDOW(ddisp->shell) == gtk_window_get_transient_for(GTK_WINDOW(interface_get_toolbox_shell()))) { - /* we have to break the connection otherwise the toolbox will be closed */ - gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()), NULL); - } - - /* This calls ddisplay_really_destroy */ - if (ddisp->is_standalone_window) - gtk_widget_destroy (ddisp->shell); - else { - gtk_widget_destroy (ddisp->container); - ddisplay_really_destroy (ddisp); - } -} - static void are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */ gint response_id, gpointer user_data) /* the display */ { - DDisplay *ddisp = (DDisplay *)user_data; + DiaDisplay *ddisp = (DiaDisplay *)user_data; gboolean close_ddisp = TRUE; switch (response_id) { @@ -1232,7 +1143,7 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */ /* we have to open the file dlg, close this one first */ gtk_widget_destroy(widget); if (file_save_as(ddisp->diagram, ddisp)) - ddisp_destroy (ddisp); + g_object_unref (ddisp); /* no way back */ return; } else { @@ -1244,14 +1155,10 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */ if (close_ddisp) /* saving succeeded */ recent_file_history_add(ddisp->diagram->filename); - if (ddisp->update_id && close_ddisp) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } /* fall through */ case GTK_RESPONSE_NO : if (close_ddisp) - ddisp_destroy (ddisp); + g_object_unref (ddisp); /* fall through */ case GTK_RESPONSE_CANCEL : case GTK_RESPONSE_NONE : @@ -1264,7 +1171,7 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */ } void -ddisplay_close(DDisplay *ddisp) +dia_display_close (DiaDisplay *ddisp) { Diagram *dia; GtkWidget *dialog, *button; @@ -1276,7 +1183,7 @@ ddisplay_close(DDisplay *ddisp) if ( (g_slist_length(dia->displays) > 1) || (!diagram_is_modified(dia)) ) { - ddisp_destroy(ddisp); + g_object_unref (ddisp); return; } @@ -1294,31 +1201,27 @@ ddisplay_close(DDisplay *ddisp) "has not been saved. Save changes now?"), fname); gtk_window_set_title (GTK_WINDOW(dialog), _("Close Diagram")); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + button = gtk_button_new_with_label (_("Cancel")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL); button = gtk_button_new_with_mnemonic (_("_Discard Changes")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_NO); /* button = gtk_button_new_with_label (_("Save and Close")); */ - button = gtk_button_new_from_stock (GTK_STOCK_SAVE); + button = gtk_button_new_with_label (_("Save")); gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_YES); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_YES); g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK(are_you_sure_close_dialog_respond), - ddisp); + G_CALLBACK (are_you_sure_close_dialog_respond), + ddisp); gtk_widget_show_all(dialog); } void -display_update_menu_state(DDisplay *ddisp) +display_update_menu_state(DiaDisplay *ddisp) { GtkToggleAction *rulers; GtkToggleAction *visible_grid; @@ -1334,17 +1237,13 @@ display_update_menu_state(DDisplay *ddisp) antialiased = GTK_TOGGLE_ACTION (menus_get_action ("ViewAntialiased")); gtk_action_set_sensitive (menus_get_action ("ViewAntialiased"), - g_type_from_name ("DiaCairoInteractiveRenderer") != 0 || g_type_from_name ("DiaLibartRenderer") != 0); + g_type_from_name ("DiaCairoInteractiveRenderer") != 0); - ddisplay_do_update_menu_sensitivity (ddisp); + dia_display_do_update_menu_sensitivity (ddisp); gtk_toggle_action_set_active (rulers, display_get_rulers_showing(ddisp)); -#if GTK_CHECK_VERSION(2,20,0) scrollbars_shown = gtk_widget_get_visible (ddisp->hsb); -#else - scrollbars_shown = GTK_WIDGET_VISIBLE (ddisp->hsb); -#endif gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (menus_get_action ("ViewShowscrollbars")), scrollbars_shown); @@ -1360,7 +1259,7 @@ display_update_menu_state(DDisplay *ddisp) } void -ddisplay_do_update_menu_sensitivity (DDisplay *ddisp) +dia_display_do_update_menu_sensitivity (DiaDisplay *ddisp) { Diagram *dia; @@ -1373,42 +1272,8 @@ ddisplay_do_update_menu_sensitivity (DDisplay *ddisp) diagram_update_menu_sensitivity (dia); } - - -/* This is called when ddisp->shell is destroyed... */ -void -ddisplay_really_destroy(DDisplay *ddisp) -{ - if (active_display == ddisp) - display_set_active(NULL); - - /* last chance to avoid crashing in the idle update */ - if (ddisp->update_id) { - g_source_remove (ddisp->update_id); - ddisp->update_id = 0; - } - - if (ddisp->diagram) { - diagram_remove_ddisplay(ddisp->diagram, ddisp); - /* if we are the last user of the diagram it will be unref'ed */ - g_object_unref(ddisp->diagram); - ddisp->diagram = NULL; - } - - g_object_unref (ddisp->renderer); - ddisp->renderer = NULL; - - /* Free update_areas list: */ - ddisplay_free_update_areas(ddisp); - /* Free display_areas list */ - ddisplay_free_display_areas(ddisp); - - g_free(ddisp); -} - - void -ddisplay_set_title(DDisplay *ddisp, char *title) +dia_display_set_title (DiaDisplay *ddisp, char *title) { if (ddisp->is_standalone_window) gtk_window_set_title (GTK_WINDOW (ddisp->shell), title); @@ -1420,15 +1285,13 @@ ddisplay_set_title(DDisplay *ddisp, char *title) gint num_pages = gtk_notebook_get_n_pages (notebook); gint num; GtkWidget *page; - for (num = 0 ; num < num_pages ; num++) - { - page = gtk_notebook_get_nth_page (notebook,num); - if (g_object_get_data (G_OBJECT (page), "DDisplay") == ddisp) - { - GtkLabel *label = g_object_get_data (G_OBJECT (page), "tab-label"); + for (num = 0 ; num < num_pages ; num++) { + page = gtk_notebook_get_nth_page (notebook, num); + if (g_object_get_data (G_OBJECT (page), DIA_DISPLAY_DATA_HACK) == ddisp) { + GtkWidget *label = g_object_get_data (page, "tab-label"); /* not using the passed in title here, because it may be too long */ - gchar *name = diagram_get_name(ddisp->diagram); - gtk_label_set_text(label,name); + gchar *name = diagram_get_name (ddisp->diagram); + gtk_label_set_label (GTK_LABEL (label), name); g_free(name); break; } @@ -1444,10 +1307,10 @@ ddisplay_set_title(DDisplay *ddisp, char *title) } void -ddisplay_set_all_cursor(GdkCursor *cursor) +dia_display_set_all_cursor(GdkCursor *cursor) { Diagram *dia; - DDisplay *ddisp; + DiaDisplay *ddisp; GList *list; GSList *slist; @@ -1459,9 +1322,9 @@ ddisplay_set_all_cursor(GdkCursor *cursor) slist = dia->displays; while (slist != NULL) { - ddisp = (DDisplay *) slist->data; + ddisp = (DiaDisplay *) slist->data; - ddisplay_set_cursor(ddisp, cursor); + dia_display_set_cursor(ddisp, cursor); slist = g_slist_next(slist); } @@ -1471,7 +1334,7 @@ ddisplay_set_all_cursor(GdkCursor *cursor) } void -ddisplay_set_cursor(DDisplay *ddisp, GdkCursor *cursor) +dia_display_set_cursor(DiaDisplay *ddisp, GdkCursor *cursor) { if (gtk_widget_get_window(ddisp->canvas)) gdk_window_set_cursor(gtk_widget_get_window(ddisp->canvas), cursor); @@ -1479,7 +1342,7 @@ ddisplay_set_cursor(DDisplay *ddisp, GdkCursor *cursor) /** Returns whether the rulers are currently showing on the display. */ -gboolean display_get_rulers_showing(DDisplay *ddisp) { +gboolean display_get_rulers_showing(DiaDisplay *ddisp) { return ddisp->rulers_are_showing; } @@ -1491,7 +1354,7 @@ gboolean display_get_rulers_showing(DDisplay *ddisp) { * when GTK_WIDGET_IS_VISIBLE(w) will indicate true. * @param ddisp The display to show the rulers on. */ -void display_rulers_show (DDisplay *ddisp) +void display_rulers_show (DiaDisplay *ddisp) { if (ddisp) { @@ -1501,11 +1364,7 @@ void display_rulers_show (DDisplay *ddisp) gtk_widget_show (ddisp->hrule); gtk_widget_show (ddisp->vrule); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (parent)) -#else - if (GTK_WIDGET_VISIBLE (parent)) -#endif gtk_widget_queue_resize (parent); ddisp->rulers_are_showing = TRUE; @@ -1519,7 +1378,7 @@ void display_rulers_show (DDisplay *ddisp) * when GTK_WIDGET_IS_VISIBLE(w) will indicate false. * @param ddisp The display to hide the rulers on. */ -void display_rulers_hide (DDisplay *ddisp) +void display_rulers_hide (DiaDisplay *ddisp) { if (ddisp) { @@ -1529,11 +1388,7 @@ void display_rulers_hide (DDisplay *ddisp) gtk_widget_hide (ddisp->hrule); gtk_widget_hide (ddisp->vrule); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible (parent)) -#else - if (GTK_WIDGET_VISIBLE (parent)) -#endif gtk_widget_queue_resize (parent); ddisp->rulers_are_showing = FALSE; @@ -1541,7 +1396,7 @@ void display_rulers_hide (DDisplay *ddisp) } void -ddisplay_update_statusbar(DDisplay *ddisp) +dia_display_update_statusbar(DiaDisplay *ddisp) { update_zoom_status (ddisp); update_snap_grid_status (ddisp); @@ -1549,7 +1404,7 @@ ddisplay_update_statusbar(DDisplay *ddisp) } void -display_set_active(DDisplay *ddisp) +display_set_active(DiaDisplay *ddisp) { if (ddisp != active_display) { active_display = ddisp; @@ -1580,7 +1435,7 @@ display_set_active(DDisplay *ddisp) for (num = 0 ; num < num_pages ; num++) { page = gtk_notebook_get_nth_page (notebook,num); - if (g_object_get_data (G_OBJECT (page), "DDisplay") == ddisp) + if (g_object_get_data (G_OBJECT (page), DIA_DISPLAY_DATA_HACK) == ddisp) { gtk_notebook_set_current_page (notebook,num); break; @@ -1594,10 +1449,10 @@ display_set_active(DDisplay *ddisp) update_zoom_status (ddisp); /* Snap to grid */ - ddisplay_set_snap_to_grid (ddisp, ddisp->grid.snap); /* menus */ + dia_display_set_snap_to_grid (ddisp, ddisp->grid.snap); /* menus */ /* Object snapping */ - ddisplay_set_snap_to_objects (ddisp, ddisp->mainpoint_magnetism); + dia_display_set_snap_to_objects (ddisp, ddisp->mainpoint_magnetism); display_update_menu_state (ddisp); @@ -1612,7 +1467,7 @@ display_set_active(DDisplay *ddisp) } void -ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus) +dia_display_im_context_preedit_reset(DiaDisplay *ddisp, Focus *focus) { if (ddisp->preedit_string != NULL) { if (focus != NULL) { @@ -1620,7 +1475,7 @@ ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus) ObjectChange *change; for (i = 0; i < g_utf8_strlen(ddisp->preedit_string, -1); i++) { - (focus->key_event)(focus, 0, GDK_BackSpace, NULL, 0, &change); + (focus->key_event)(focus, 0, GDK_KEY_BackSpace, NULL, 0, &change); } } @@ -1641,7 +1496,7 @@ ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus) * focus is active (i.e. no text is being edited). */ Focus * -ddisplay_active_focus(DDisplay *ddisp) +dia_display_active_focus(DiaDisplay *ddisp) { /* The functions doing the transition rely on this being slightly * out of sync with get_active_focus(). But we would not need the @@ -1660,13 +1515,13 @@ ddisplay_active_focus(DDisplay *ddisp) * this display. */ void -ddisplay_set_active_focus(DDisplay *ddisp, Focus *focus) +dia_display_set_active_focus(DiaDisplay *ddisp, Focus *focus) { ddisp->active_focus = focus; } void -ddisplay_show_all (DDisplay *ddisp) +dia_display_show_all (DiaDisplay *ddisp) { Diagram *dia; real magnify_x, magnify_y; @@ -1706,10 +1561,10 @@ ddisplay_show_all (DDisplay *ddisp) (dia->data->extents.bottom - dia->data->extents.top) / 2.0; } - ddisplay_zoom (ddisp, &middle, + dia_display_zoom (ddisp, &middle, ((magnify_x -typedef struct _DDisplay DDisplay; - #include "geometry.h" #include "diagram.h" + +typedef struct _DiaDisplay DiaDisplay; + #include "grid.h" #include "diarenderer.h" @@ -37,6 +38,8 @@ G_BEGIN_DECLS #define DDISPLAY_NORMAL_ZOOM 20.0 #define DDISPLAY_MIN_ZOOM 0.2 +#define DIA_DISPLAY_DATA_HACK "DiaDisplay" + /* The zoom amount should be uniform. Pixels per cm should be defined by the * renderer alone. But that'd take a lot of fiddling in renderers. */ /* @@ -44,7 +47,9 @@ G_BEGIN_DECLS #define DDISPLAY_NORMAL_ZOOM 1.0 #define DDISPLAY_MIN_ZOOM 0.01 */ -struct _DDisplay { +struct _DiaDisplay { + GObject parent; + Diagram *diagram; /* pointer to the associated diagram */ GtkWidget *shell; /* shell widget for this ddisplay */ @@ -59,7 +64,7 @@ struct _DDisplay { /* menu bar widgets */ GtkMenuItem *rulers; - GtkWidget *zoom_status; + GtkWidget *zoom_status; GtkWidget *grid_status; GtkWidget *mainpoint_status; GtkWidget *modified_status; @@ -75,7 +80,7 @@ struct _DDisplay { Grid grid; /* the grid in this display */ - gboolean show_cx_pts; /* Connection points toggle boolean */ + gboolean show_cx_pts; /* Connection points toggle boolean */ gboolean autoscroll; gboolean mainpoint_magnetism; /* Mainpoints snapped from entire obj*/ @@ -83,8 +88,6 @@ struct _DDisplay { DiaRenderer *renderer; GSList *update_areas; /* Update areas list */ - GSList *display_areas; /* Display areas list */ - guint update_id; /* idle handler ID for redraws */ GtkIMContext *im_context; @@ -114,90 +117,90 @@ struct _DDisplay { extern GdkCursor *default_cursor; -DDisplay *new_display(Diagram *dia); -DDisplay *copy_display(DDisplay *orig_ddisp); +#define DIA_TYPE_DISPLAY (dia_display_get_type ()) +G_DECLARE_FINAL_TYPE (DiaDisplay, dia_display, DIA, DISPLAY, GObject) + +DiaDisplay *dia_display_new (Diagram *diagram); +DiaDisplay *dia_display_copy (DiaDisplay *self); + /* Normal destroy is done through shell widget destroy event. */ -void ddisplay_really_destroy(DDisplay *ddisp); -void ddisplay_transform_coords_double(DDisplay *ddisp, +void dia_display_transform_coords_double(DiaDisplay *ddisp, coord x, coord y, double *xi, double *yi); -void ddisplay_transform_coords(DDisplay *ddisp, +void dia_display_transform_coords(DiaDisplay *ddisp, coord x, coord y, int *xi, int *yi); -void ddisplay_untransform_coords(DDisplay *ddisp, +void dia_display_untransform_coords(DiaDisplay *ddisp, int xi, int yi, coord *x, coord *y); -real ddisplay_transform_length(DDisplay *ddisp, real len); -real ddisplay_untransform_length(DDisplay *ddisp, real len); -void ddisplay_add_update_pixels(DDisplay *ddisp, Point *point, +real dia_display_transform_length(DiaDisplay *ddisp, real len); +real dia_display_untransform_length(DiaDisplay *ddisp, real len); +void dia_display_add_update_pixels(DiaDisplay *ddisp, Point *point, int pixel_width, int pixel_height); -void ddisplay_add_update_all(DDisplay *ddisp); -void ddisplay_add_update_with_border(DDisplay *ddisp, const Rectangle *rect, +void dia_display_add_update_all(DiaDisplay *ddisp); +void dia_display_add_update_with_border(DiaDisplay *ddisp, const Rectangle *rect, int pixel_border); -void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect); -void ddisplay_add_display_area(DDisplay *ddisp, - int left, int top, - int right, int bottom); -void ddisplay_flush(DDisplay *ddisp); -void ddisplay_update_scrollbars(DDisplay *ddisp); -void ddisplay_set_origo(DDisplay *ddisp, +void dia_display_add_update(DiaDisplay *ddisp, const Rectangle *rect); +void dia_display_flush(DiaDisplay *ddisp); +void dia_display_update_scrollbars(DiaDisplay *ddisp); +void dia_display_set_origo(DiaDisplay *ddisp, coord x, coord y); -void ddisplay_zoom(DDisplay *ddisp, Point *point, +void dia_display_zoom(DiaDisplay *ddisp, Point *point, real zoom_factor); -void ddisplay_zoom_middle(DDisplay *ddisp, real magnify); +void dia_display_zoom_middle(DiaDisplay *ddisp, real magnify); -void ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify); -void ddisplay_set_snap_to_grid(DDisplay *ddisp, gboolean snap); -void ddisplay_set_snap_to_objects(DDisplay *ddisp, gboolean magnetic); -void ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer); -void ddisplay_resize_canvas(DDisplay *ddisp, +void dia_display_zoom_centered(DiaDisplay *ddisp, Point *point, real magnify); +void dia_display_set_snap_to_grid(DiaDisplay *ddisp, gboolean snap); +void dia_display_set_snap_to_objects(DiaDisplay *ddisp, gboolean magnetic); +void dia_display_set_renderer(DiaDisplay *ddisp, int aa_renderer); +void dia_display_resize_canvas(DiaDisplay *ddisp, int width, int height); -void ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update); +void dia_display_render_pixmap(DiaDisplay *ddisp, Rectangle *update); -DDisplay *ddisplay_active(void); -Diagram *ddisplay_active_diagram(void); +DiaDisplay *dia_display_active(void); +Diagram *dia_display_active_diagram(void); -void ddisplay_close(DDisplay *ddisp); +void dia_display_close(DiaDisplay *ddisp); -void ddisplay_set_title(DDisplay *ddisp, char *title); -void ddisplay_set_cursor(DDisplay *ddisp, GdkCursor *cursor); -void ddisplay_set_all_cursor(GdkCursor *cursor); +void dia_display_set_title(DiaDisplay *ddisp, char *title); +void dia_display_set_cursor(DiaDisplay *ddisp, GdkCursor *cursor); +void dia_display_set_all_cursor(GdkCursor *cursor); -void ddisplay_set_clicked_point(DDisplay *ddisp, int x, int y); -Point ddisplay_get_clicked_position(DDisplay *ddisp); +void dia_display_set_clicked_point(DiaDisplay *ddisp, int x, int y); +Point dia_display_get_clicked_position(DiaDisplay *ddisp); -gboolean display_get_rulers_showing(DDisplay *ddisp); -void display_rulers_show (DDisplay *ddisp); -void display_rulers_hide (DDisplay *ddisp); -void ddisplay_update_rulers (DDisplay *ddisp, const Rectangle *extents, const Rectangle *visible); +gboolean display_get_rulers_showing(DiaDisplay *ddisp); +void display_rulers_show (DiaDisplay *ddisp); +void display_rulers_hide (DiaDisplay *ddisp); +void dia_display_update_rulers (DiaDisplay *ddisp, const Rectangle *extents, const Rectangle *visible); -gboolean ddisplay_scroll(DDisplay *ddisp, Point *delta); -gboolean ddisplay_autoscroll(DDisplay *ddisp, int x, int y); -void ddisplay_scroll_up(DDisplay *ddisp); -void ddisplay_scroll_down(DDisplay *ddisp); -void ddisplay_scroll_left(DDisplay *ddisp); -void ddisplay_scroll_right(DDisplay *ddisp); -gboolean ddisplay_scroll_center_point(DDisplay *ddisp, Point *p); -gboolean ddisplay_scroll_to_object(DDisplay *ddisp, DiaObject *obj); -gboolean ddisplay_present_object(DDisplay *ddisp, DiaObject *obj); +gboolean dia_display_scroll(DiaDisplay *ddisp, Point *delta); +gboolean dia_display_autoscroll(DiaDisplay *ddisp, int x, int y); +void dia_display_scroll_up(DiaDisplay *ddisp); +void dia_display_scroll_down(DiaDisplay *ddisp); +void dia_display_scroll_left(DiaDisplay *ddisp); +void dia_display_scroll_right(DiaDisplay *ddisp); +gboolean dia_display_scroll_center_point(DiaDisplay *ddisp, Point *p); +gboolean dia_display_scroll_to_object(DiaDisplay *ddisp, DiaObject *obj); +gboolean dia_display_present_object(DiaDisplay *ddisp, DiaObject *obj); -void ddisplay_show_all (DDisplay *ddisp); +void dia_display_show_all (DiaDisplay *ddisp); -void display_update_menu_state(DDisplay *ddisp); -void ddisplay_update_statusbar(DDisplay *ddisp); -void ddisplay_do_update_menu_sensitivity (DDisplay *ddisp); +void display_update_menu_state(DiaDisplay *ddisp); +void dia_display_update_statusbar(DiaDisplay *ddisp); +void dia_display_do_update_menu_sensitivity (DiaDisplay *ddisp); -void display_set_active(DDisplay *ddisp); +void display_set_active(DiaDisplay *ddisp); -void ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus); +void dia_display_im_context_preedit_reset(DiaDisplay *ddisp, Focus *focus); -Focus *ddisplay_active_focus(DDisplay *ddisp); -void ddisplay_set_active_focus(DDisplay *ddisp, Focus *focus); +Focus *dia_display_active_focus(DiaDisplay *ddisp); +void dia_display_set_active_focus(DiaDisplay *ddisp, Focus *focus); -void diagram_add_ddisplay(Diagram *dia, DDisplay *ddisp); -void diagram_remove_ddisplay(Diagram *dia, DDisplay *ddisp); +void diagram_add_display(Diagram *dia, DiaDisplay *ddisp); +void diagram_remove_display(Diagram *dia, DiaDisplay *ddisp); G_END_DECLS diff --git a/app/exit_dialog.c b/app/exit_dialog.c index e4c5decc5250aa3643900241952679d61cab5bc8..03042778428b34efe411809bb08f485b9bb3a2de 100644 --- a/app/exit_dialog.c +++ b/app/exit_dialog.c @@ -72,19 +72,15 @@ GtkWidget * exit_dialog_make (GtkWindow * parent_window, gchar * title) { - GtkWidget * dialog = gtk_dialog_new_with_buttons (title, parent_window, - GTK_DIALOG_MODAL, - _("Do Not Exit"), - EXIT_DIALOG_EXIT_CANCEL, - _("Exit Without Save"), - EXIT_DIALOG_EXIT_NO_SAVE, - _("Save Selected"), - EXIT_DIALOG_EXIT_SAVE_SELECTED, - NULL); + GtkWidget *dialog = g_object_new (GTK_TYPE_MESSAGE_DIALOG, + "title", title, + "text", _("Closing diagrams without saving"), + "secondary-text", _("Some diagrams have unsaved changes. Save changes now?"), + "transient-for", parent_window, + "modal", TRUE, + NULL); + GtkWidget* vbox = gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog)); - GtkBox * vbox = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG(dialog))); - - GtkWidget * label = gtk_label_new (_("The following are not saved:")); GtkWidget * scrolled; GtkWidget * button; @@ -97,13 +93,22 @@ exit_dialog_make (GtkWindow * parent_window, GdkGeometry geometry = { 0 }; - gtk_box_pack_start (vbox, label, FALSE, FALSE, 0); - - gtk_widget_show (label); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("Cancel"), + EXIT_DIALOG_EXIT_CANCEL, + _("Discard Changes"), + EXIT_DIALOG_EXIT_NO_SAVE, + _("Save"), + EXIT_DIALOG_EXIT_SAVE_SELECTED, + NULL); /* Scrolled window for displaying things which need saving */ scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_box_pack_start (vbox, scrolled, TRUE, TRUE, 0); + g_object_set (scrolled, + "height-request", 100, + "shadow-type", GTK_SHADOW_IN, + NULL); + gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0); gtk_widget_show (scrolled); model = gtk_list_store_new (NUM_COL, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); @@ -127,17 +132,13 @@ exit_dialog_make (GtkWindow * parent_window, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes (_("Path"), renderer, - "text", PATH_COL, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), PATH_COL); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled), GTK_WIDGET (treeview)); + gtk_container_add (GTK_CONTAINER (scrolled), treeview); - hbox = gtk_hbox_new (FALSE, 3); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); diff --git a/app/filedlg.c b/app/filedlg.c index e42194129ae1c0b36afd2f98bd20fe76e0b2f8d1..72d99c60440937913f0b0a6f857d789965900de6 100644 --- a/app/filedlg.c +++ b/app/filedlg.c @@ -188,16 +188,8 @@ create_open_menu(void) GList *tmp; -#if GTK_CHECK_VERSION(2,24,0) menu = gtk_combo_box_text_new (); -#else - menu = gtk_combo_box_new_text (); -#endif -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu), _("By extension")); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(menu), _("By extension")); -#endif for (tmp = filter_get_import_filters(); tmp != NULL; tmp = tmp->next) { DiaImportFilter *ifilter = tmp->data; @@ -206,11 +198,7 @@ create_open_menu(void) if (!ifilter) continue; filter_label = filter_get_import_filter_label(ifilter); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu), filter_label); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX(menu), filter_label); -#endif g_free(filter_label); } g_signal_connect(G_OBJECT(menu), "changed", @@ -249,14 +237,14 @@ file_open_response_callback(GtkWidget *fs, GSList *displays_head = displays; diagram->displays = NULL; for (; displays != NULL; displays = g_slist_next(displays)) { - DDisplay *loaded_display = (DDisplay *)displays->data; + DiaDisplay *loaded_display = (DiaDisplay *)displays->data; copy_display(loaded_display); g_free(loaded_display); } g_slist_free(displays_head); } else { */ - new_display(diagram); + dia_display_new (diagram); } } } @@ -272,7 +260,7 @@ void file_open_callback(GtkAction *action) { if (!opendlg) { - DDisplay *ddisp; + DiaDisplay *ddisp; Diagram *dia = NULL; GtkWindow *parent_window; gchar *filename = NULL; @@ -282,7 +270,7 @@ file_open_callback(GtkAction *action) * /File/Open ... */ - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (ddisp) { dia = ddisp->diagram; parent_window = GTK_WINDOW(ddisp->shell); @@ -292,8 +280,8 @@ file_open_callback(GtkAction *action) persistence_register_integer ("import-filter", 0); opendlg = gtk_file_chooser_dialog_new(_("Open Diagram"), parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Open"), GTK_RESPONSE_ACCEPT, NULL); /* is activating gvfs really that easy - at least it works for samba shares*/ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(opendlg), FALSE); @@ -312,11 +300,7 @@ file_open_callback(GtkAction *action) G_CALLBACK(gtk_widget_destroyed), &opendlg); } else { gtk_widget_set_sensitive(opendlg, TRUE); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible(opendlg)) -#else - if (GTK_WIDGET_VISIBLE(opendlg)) -#endif return; } if (!gtk_file_chooser_get_extra_widget(GTK_FILE_CHOOSER(opendlg))) { @@ -326,7 +310,7 @@ file_open_callback(GtkAction *action) options = gtk_frame_new(_("Open Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); @@ -441,7 +425,7 @@ file_save_as_response_callback(GtkWidget *fs, gtk_widget_destroy(GTK_WIDGET(fs)); } -static GtkWidget *file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp); +static GtkWidget *file_save_as_dialog_prepare (Diagram *dia, DiaDisplay *ddisp); /** * Respond to the File/Save As.. menu @@ -453,11 +437,11 @@ static GtkWidget *file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp); void file_save_as_callback(GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; Diagram *dia; GtkWidget *dlg; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; dia = ddisp->diagram; @@ -467,7 +451,7 @@ file_save_as_callback(GtkAction *action) } gboolean -file_save_as(Diagram *dia, DDisplay *ddisp) +file_save_as (Diagram *dia, DiaDisplay *ddisp) { GtkWidget *dlg; gint response; @@ -483,7 +467,7 @@ file_save_as(Diagram *dia, DDisplay *ddisp) } static GtkWidget * -file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp) +file_save_as_dialog_prepare (Diagram *dia, DiaDisplay *ddisp) { gchar *filename = NULL; @@ -493,8 +477,8 @@ file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp) savedlg = gtk_file_chooser_dialog_new(_("Save Diagram"), GTK_WINDOW(ddisp->shell), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Save"), GTK_RESPONSE_ACCEPT, NULL); /* vfs saving is as easy - if you see 'bad file descriptor' there is * something wrong with the permissions of the share ;) */ @@ -529,11 +513,7 @@ file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp) g_signal_handlers_unblock_by_func(G_OBJECT(compressbutton), toggle_compress_callback, NULL); if (g_object_get_data (G_OBJECT (savedlg), "user_data") != NULL) g_object_unref (g_object_get_data (G_OBJECT (savedlg), "user_data")); -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_visible(savedlg)) { -#else - if (GTK_WIDGET_VISIBLE(savedlg)) { -#endif /* keep a refernce to the diagram */ g_object_ref(dia); g_object_set_data (G_OBJECT (savedlg), "user_data", dia); @@ -572,7 +552,7 @@ file_save_callback(GtkAction *action) { Diagram *diagram; - diagram = ddisplay_active_diagram(); + diagram = dia_display_active_diagram(); if (!diagram) return; if (diagram->unsaved) { @@ -659,16 +639,8 @@ create_export_menu(void) GtkWidget *menu; GList *tmp; -#if GTK_CHECK_VERSION(2,24,0) menu = gtk_combo_box_text_new (); -#else - menu = gtk_combo_box_new_text (); -#endif -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(menu), _("By extension")); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(menu), _("By extension")); -#endif for (tmp = filter_get_export_filters(); tmp != NULL; tmp = tmp->next) { DiaExportFilter *ef = tmp->data; @@ -677,11 +649,7 @@ create_export_menu(void) if (!ef) continue; filter_label = filter_get_export_filter_label(ef); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(menu), filter_label); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX(menu), filter_label); -#endif g_free(filter_label); } g_signal_connect(G_OBJECT(menu), "changed", @@ -764,11 +732,11 @@ file_export_response_callback(GtkWidget *fs, void file_export_callback(GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; Diagram *dia; gchar *filename = NULL; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; dia = ddisp->diagram; @@ -780,8 +748,8 @@ file_export_callback(GtkAction *action) exportdlg = gtk_file_chooser_dialog_new(_("Export Diagram"), GTK_WINDOW(ddisp->shell), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Save"), GTK_RESPONSE_ACCEPT, NULL); /* export via vfs gives: Permission denied - but only if you do not * have write permissions ;) */ @@ -799,7 +767,7 @@ file_export_callback(GtkAction *action) options = gtk_frame_new(_("Export Options")); gtk_frame_set_shadow_type(GTK_FRAME(options), GTK_SHADOW_ETCHED_IN); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_container_add(GTK_CONTAINER(options), hbox); gtk_widget_show(hbox); diff --git a/app/filedlg.h b/app/filedlg.h index ae981802620cd947d15e6cab5b29d57751128d0d..1eb3d8ffc2fc0f3c1ce8c6c829d92860f892a576 100644 --- a/app/filedlg.h +++ b/app/filedlg.h @@ -29,6 +29,6 @@ void file_save_callback(GtkAction *action); void file_save_as_callback(GtkAction *action); void file_export_callback(GtkAction *action); -gboolean file_save_as(Diagram *dia, DDisplay *ddisp); +gboolean file_save_as (Diagram *dia, DiaDisplay *ddisp); #endif diff --git a/app/find-and-replace.c b/app/find-and-replace.c index 3961ee5d09f2f1ffaec768fc7013f0509f811ac6..48ab47f4bf076065dbf4e57faded36db40232dd6 100644 --- a/app/find-and-replace.c +++ b/app/find-and-replace.c @@ -380,7 +380,7 @@ fnr_respond (GtkWidget *widget, gint response_id, gpointer data) { const gchar *search = gtk_entry_get_text (g_object_get_data (G_OBJECT (widget), "search-entry")); const gchar *replace; - DDisplay *ddisp = (DDisplay*)data; + DiaDisplay *ddisp = (DiaDisplay*)data; SearchData sd = { 0, }; sd.diagram = ddisp->diagram; sd.flags = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( @@ -410,7 +410,7 @@ fnr_respond (GtkWidget *widget, gint response_id, gpointer data) diagram_flush(ddisp->diagram); } diagram_select (ddisp->diagram, sd.last); - ddisplay_present_object (ddisp, sd.last); + dia_display_present_object (ddisp, sd.last); } break; case RESPONSE_REPLACE : @@ -454,7 +454,7 @@ fnr_respond (GtkWidget *widget, gint response_id, gpointer data) } static void -fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp) +fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DiaDisplay *ddisp) { GtkWidget *vbox; GtkWidget *hbox; @@ -476,7 +476,7 @@ fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - hbox = gtk_hbox_new (FALSE, 12); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); label = gtk_label_new_with_mnemonic (_("_Search for:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); search_entry = gtk_entry_new (); @@ -489,7 +489,7 @@ fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp if (is_replace) { GtkWidget *replace_entry; - hbox = gtk_hbox_new (FALSE, 12); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); label = gtk_label_new_with_mnemonic (_("Replace _with:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); replace_entry = gtk_entry_new (); @@ -524,10 +524,10 @@ fnr_dialog_setup_common (GtkWidget *dialog, gboolean is_replace, DDisplay *ddisp void edit_find_callback(GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; GtkWidget *dialog; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; /* no static var, instead we are attaching the dialog to the diplay shell */ @@ -536,8 +536,8 @@ edit_find_callback(GtkAction *action) dialog = gtk_dialog_new_with_buttons ( _("Find"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_FIND, RESPONSE_FIND, + _("Close"), GTK_RESPONSE_CLOSE, + _("Find"), RESPONSE_FIND, NULL); fnr_dialog_setup_common (dialog, FALSE, ddisp); @@ -553,10 +553,10 @@ edit_find_callback(GtkAction *action) void edit_replace_callback(GtkAction *action) { - DDisplay *ddisp; + DiaDisplay *ddisp; GtkWidget *dialog; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; /* no static var, instead we are attaching the dialog to the diplay shell */ @@ -566,17 +566,15 @@ edit_replace_callback(GtkAction *action) dialog = gtk_dialog_new_with_buttons ( _("Replace"), GTK_WINDOW (ddisp->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + _("Close"), GTK_RESPONSE_CLOSE, _("Replace _All"), RESPONSE_REPLACE_ALL, NULL); /* not adding the button in the list above to modify it's text; * the default "Find and Replace" is just too long for my taste ;) */ button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Replace"), RESPONSE_REPLACE); - gtk_button_set_image (GTK_BUTTON (button), - gtk_image_new_from_stock (GTK_STOCK_FIND_AND_REPLACE, GTK_ICON_SIZE_BUTTON)); - gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_FIND, RESPONSE_FIND); + gtk_dialog_add_button (GTK_DIALOG (dialog), _("Find"), RESPONSE_FIND); fnr_dialog_setup_common (dialog, TRUE, ddisp); } diff --git a/app/grid.c b/app/grid.c index 7ac60c0f27eee39b21a6066f93461630502ab1c8..70f172b1749e27df8b96dc342da2c43bdf2e9981 100644 --- a/app/grid.c +++ b/app/grid.c @@ -33,15 +33,15 @@ * grid mode. */ static void -calculate_dynamic_grid(DDisplay *ddisp, real *width_x, real *width_y) +calculate_dynamic_grid (DiaDisplay *ddisp, real *width_x, real *width_y) { - real zoom = ddisplay_untransform_length(ddisp, 1.0); + real zoom = dia_display_untransform_length (ddisp, 1.0); real ret, tmp; /* Twiddle zoom to make change-over appropriate */ zoom *= 5; ret = pow(10, ceil(log10(zoom))); /* dont' make it too small or huge (this is in pixels) */ - tmp = ddisplay_transform_length(ddisp, ret); + tmp = dia_display_transform_length (ddisp, ret); if (tmp < 10.0) ret *= 2.0; else if (tmp > 35.0) @@ -51,7 +51,7 @@ calculate_dynamic_grid(DDisplay *ddisp, real *width_x, real *width_y) } gboolean -grid_step (DDisplay *ddisp, GtkOrientation orientation, +grid_step (DiaDisplay *ddisp, GtkOrientation orientation, real *start, int *ipos, gboolean *is_major) { real length; @@ -69,7 +69,7 @@ grid_step (DDisplay *ddisp, GtkOrientation orientation, if(major_count < 0) major_count -= major_lines * major_count; major_count %= major_lines; } - ddisplay_transform_coords(ddisp, + dia_display_transform_coords(ddisp, orientation == GTK_ORIENTATION_HORIZONTAL ? pos : 0, orientation == GTK_ORIENTATION_VERTICAL ? pos : 0, &x, &y); @@ -82,7 +82,7 @@ grid_step (DDisplay *ddisp, GtkOrientation orientation, } static void -grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length) +grid_draw_horizontal_lines(DiaDisplay *ddisp, Rectangle *update, real length) { int x, y; real pos; @@ -95,8 +95,8 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length) irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); pos = ceil( update->top / length ) * length; - ddisplay_transform_coords(ddisp, update->left, pos, &x, &y); - ddisplay_transform_coords(ddisp, update->right, update->bottom, &width, &height); + dia_display_transform_coords(ddisp, update->left, pos, &x, &y); + dia_display_transform_coords(ddisp, update->right, update->bottom, &width, &height); /* Explanatory note from Lawrence Withers (lwithers@users.sf.net): @@ -120,18 +120,18 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length) DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); else DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, - ddisplay_untransform_length(ddisp, 31)); + dia_display_untransform_length(ddisp, 31)); major_count = (major_count+1)%major_lines; } irenderer->draw_pixel_line(renderer, x, y, width, y, &ddisp->diagram->grid.colour); pos += length; - ddisplay_transform_coords(ddisp, update->left, pos, &x, &y); + dia_display_transform_coords(ddisp, update->left, pos, &x, &y); } } static void -grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length) +grid_draw_vertical_lines(DiaDisplay *ddisp, Rectangle *update, real length) { int x = 0, y = 0; real pos; @@ -144,7 +144,7 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length) irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); pos = ceil( update->left / length ) * length; - ddisplay_transform_coords(ddisp, update->right, update->bottom, &width, &height); + dia_display_transform_coords(ddisp, update->right, update->bottom, &width, &height); if (major_lines) { major_count = ROUND (pos/length); @@ -153,13 +153,13 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length) } while (x < width) { - ddisplay_transform_coords(ddisp, pos, update->top, &x, &y); + dia_display_transform_coords(ddisp, pos, update->top, &x, &y); if (major_lines) { if (major_count == 0) DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); else DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, - ddisplay_untransform_length(ddisp, 31)); + dia_display_untransform_length(ddisp, 31)); major_count = (major_count+1)%major_lines; } irenderer->draw_pixel_line(renderer, x, y, x, height, @@ -169,7 +169,7 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length) } static void -grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) +grid_draw_hex(DiaDisplay *ddisp, Rectangle *update, real length) { real horiz_pos, vert_pos; int to_x, to_y, x, y; @@ -183,8 +183,8 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) while (vert_pos <= update->bottom) { horiz_pos = ceil( (update->left) / (3 * length) ) * length * 3 - length * 2.5; while (horiz_pos <= update->right) { - ddisplay_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos + length, vert_pos, &to_x, &y); + dia_display_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos + length, vert_pos, &to_x, &y); irenderer->draw_pixel_line(renderer, x, y, to_x, y, @@ -200,8 +200,8 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) while (vert_pos <= update->bottom) { horiz_pos = ceil( (update->left) / (3 * length) ) * length * 3 - length; while (horiz_pos <= update->right) { - ddisplay_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos+length, vert_pos, &to_x, &y); + dia_display_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos+length, vert_pos, &to_x, &y); irenderer->draw_pixel_line(renderer, x, y, to_x, y, @@ -217,15 +217,15 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) while (vert_pos <= update->bottom) { horiz_pos = ceil( (update->left) / (3 * length) ) * length * 3 - length * 2.5; while (horiz_pos <= update->right) { - ddisplay_transform_coords(ddisp, horiz_pos + length, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos + 1.5 * length, vert_pos + length * sqrt(3) * 0.5, &to_x, &to_y); + dia_display_transform_coords(ddisp, horiz_pos + length, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos + 1.5 * length, vert_pos + length * sqrt(3) * 0.5, &to_x, &to_y); irenderer->draw_pixel_line(renderer, x, y, to_x, to_y, &ddisp->diagram->grid.colour); - ddisplay_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos - 0.5 * length, vert_pos + length * sqrt(3) * 0.5, &to_x, &to_y); + dia_display_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos - 0.5 * length, vert_pos + length * sqrt(3) * 0.5, &to_x, &to_y); irenderer->draw_pixel_line(renderer, x, y, to_x, to_y, @@ -241,15 +241,15 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) while (vert_pos <= update->bottom) { horiz_pos = ceil( (update->left) / (3 * length) ) * length * 3 - length; while (horiz_pos <= update->right) { - ddisplay_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos - 0.5 * length, vert_pos + 0.5 * sqrt(3) * length, &to_x, &to_y); + dia_display_transform_coords(ddisp, horiz_pos, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos - 0.5 * length, vert_pos + 0.5 * sqrt(3) * length, &to_x, &to_y); irenderer->draw_pixel_line(renderer, x, y, to_x, to_y, &ddisp->diagram->grid.colour); - ddisplay_transform_coords(ddisp, horiz_pos + length, vert_pos, &x, &y); - ddisplay_transform_coords(ddisp, horiz_pos + 1.5 * length, vert_pos + 0.5 * sqrt(3) * length, &to_x, &to_y); + dia_display_transform_coords(ddisp, horiz_pos + length, vert_pos, &x, &y); + dia_display_transform_coords(ddisp, horiz_pos + 1.5 * length, vert_pos + 0.5 * sqrt(3) * length, &to_x, &to_y); irenderer->draw_pixel_line(renderer, x, y, to_x, to_y, @@ -263,7 +263,7 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length) } void -grid_draw(DDisplay *ddisp, Rectangle *update) +grid_draw(DiaDisplay *ddisp, Rectangle *update) { Grid *grid = &ddisp->grid; DiaRenderer *renderer = ddisp->renderer; @@ -287,8 +287,8 @@ grid_draw(DDisplay *ddisp, Rectangle *update) if (ddisp->diagram->grid.hex) { grid_draw_hex(ddisp, update, width_w); } else { - if (ddisplay_transform_length(ddisp, width_y) >= 2.0 && - ddisplay_transform_length(ddisp, width_x) >= 2.0) { + if (dia_display_transform_length(ddisp, width_y) >= 2.0 && + dia_display_transform_length(ddisp, width_x) >= 2.0) { /* Vertical lines: */ grid_draw_vertical_lines(ddisp, update, width_x); /* Horizontal lines: */ @@ -299,7 +299,7 @@ grid_draw(DDisplay *ddisp, Rectangle *update) } void -pagebreak_draw(DDisplay *ddisp, Rectangle *update) +pagebreak_draw(DiaDisplay *ddisp, Rectangle *update) { DiaRenderer *renderer = ddisp->renderer; DiaInteractiveRendererInterface *irenderer; @@ -320,7 +320,7 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update) DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); else DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, - ddisplay_untransform_length(ddisp, 31)); + dia_display_untransform_length(ddisp, 31)); if (dia->data->paper.fitto) { origx = dia->data->extents.left; @@ -330,7 +330,7 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update) /* vertical lines ... */ pos = origx + ceil((update->left - origx) / pwidth) * pwidth; while (pos <= update->right) { - ddisplay_transform_coords(ddisp, pos,0,&x,&y); + dia_display_transform_coords(ddisp, pos,0,&x,&y); irenderer->draw_pixel_line(renderer, x, 0, x, height, &dia->pagebreak_color); @@ -339,7 +339,7 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update) /* Horizontal lines: */ pos = origy + ceil((update->top - origy) / pheight) * pheight; while (pos <= update->bottom) { - ddisplay_transform_coords(ddisp, 0,pos,&x,&y); + dia_display_transform_coords(ddisp, 0,pos,&x,&y); irenderer->draw_pixel_line(renderer, 0, y, width, y, &dia->pagebreak_color); @@ -349,7 +349,7 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update) } void -snap_to_grid(DDisplay *ddisp, coord *x, coord *y) +snap_to_grid(DiaDisplay *ddisp, coord *x, coord *y) { if (ddisp->grid.snap) { if (ddisp->diagram->grid.hex) { diff --git a/app/grid.h b/app/grid.h index 13a6c712a6d83b02282835a7601e8d397f053500..0b4c524931654f2dba443133752c3a1f13b7d22e 100644 --- a/app/grid.h +++ b/app/grid.h @@ -30,11 +30,11 @@ struct _Grid { #include "display.h" -void grid_draw(DDisplay *ddisp, Rectangle *update); -void pagebreak_draw(DDisplay *ddisp, Rectangle *update); -void snap_to_grid(DDisplay *ddisp, coord *x, coord *y); +void grid_draw (DiaDisplay *ddisp, Rectangle *update); +void pagebreak_draw (DiaDisplay *ddisp, Rectangle *update); +void snap_to_grid (DiaDisplay *ddisp, coord *x, coord *y); -gboolean grid_step (DDisplay *ddisp, GtkOrientation orientation, +gboolean grid_step (DiaDisplay *ddisp, GtkOrientation orientation, real *start, int *ipos, gboolean *is_major); #endif /* GRID_H */ diff --git a/app/gtkhwrapbox.c b/app/gtkhwrapbox.c deleted file mode 100644 index 30f5a46f17c26a6b64bac3484becdf179a7c2205..0000000000000000000000000000000000000000 --- a/app/gtkhwrapbox.c +++ /dev/null @@ -1,637 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkHWrapBox: Horizontal wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkhwrapbox.h" -#include - - -/* --- prototypes --- */ -static void gtk_hwrap_box_class_init (GtkHWrapBoxClass *klass); -static void gtk_hwrap_box_init (GtkHWrapBox *hwbox); -static void gtk_hwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_hwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_row_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_height, - gboolean *can_vexpand); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_hwrap_box_get_type (void) -{ - static GType hwrap_box_type = 0; - - if (! hwrap_box_type) - { - const GTypeInfo hwrap_box_info = - { - sizeof (GtkHWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_hwrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkHWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_hwrap_box_init, - }; - - hwrap_box_type = g_type_register_static (GTK_TYPE_WRAP_BOX, "GtkHWrapBox", - &hwrap_box_info, 0); - } - - return hwrap_box_type; -} - -static void -gtk_hwrap_box_class_init (GtkHWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkWrapBoxClass *wrap_box_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - wrap_box_class = GTK_WRAP_BOX_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - widget_class->size_request = gtk_hwrap_box_size_request; - widget_class->size_allocate = gtk_hwrap_box_size_allocate; - - wrap_box_class->rlist_line_children = reverse_list_row_children; -} - -static void -gtk_hwrap_box_init (GtkHWrapBox *hwbox) -{ - hwbox->max_child_width = 0; - hwbox->max_child_height = 0; -} - -GtkWidget* -gtk_hwrap_box_new (gboolean homogeneous) -{ - return g_object_new (GTK_TYPE_HWRAP_BOX, "homogeneous", homogeneous, NULL); -} - -static inline void -get_child_requisition (GtkWrapBox *wbox, - GtkWidget *child, - GtkRequisition *child_requisition) -{ - if (wbox->homogeneous) - { - GtkHWrapBox *hwbox = GTK_HWRAP_BOX (wbox); - - child_requisition->width = hwbox->max_child_width; - child_requisition->height = hwbox->max_child_height; - } - else - gtk_widget_get_child_requisition (child, child_requisition); -} - -static gfloat -get_layout_size (GtkHWrapBox *this, - guint max_width, - guint *width_inc) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (this); - GtkWrapBoxChild *child; - guint n_rows, left_over = 0, total_height = 0; - gboolean last_row_filled = TRUE; - - *width_inc = this->max_child_width + 1; - - n_rows = 0; - for (child = wbox->children; child; child = child->next) - { - GtkWrapBoxChild *row_child; - GtkRequisition child_requisition; - guint row_width, row_height, n = 1; - -#if GTK_CHECK_VERSION(2,20,0) - if (!gtk_widget_get_visible (child->widget)) -#else - if (!GTK_WIDGET_VISIBLE (child->widget)) -#endif - continue; - - get_child_requisition (wbox, child->widget, &child_requisition); - if (!last_row_filled) - *width_inc = MIN (*width_inc, child_requisition.width - left_over); - row_width = child_requisition.width; - row_height = child_requisition.height; - for (row_child = child->next; row_child && n < wbox->child_limit; row_child = row_child->next) - { -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (row_child->widget)) -#else - if (GTK_WIDGET_VISIBLE (row_child->widget)) -#endif - { - get_child_requisition (wbox, row_child->widget, &child_requisition); - if (row_width + wbox->hspacing + child_requisition.width > max_width) - break; - row_width += wbox->hspacing + child_requisition.width; - row_height = MAX (row_height, child_requisition.height); - n++; - } - child = row_child; - } - last_row_filled = n >= wbox->child_limit; - left_over = last_row_filled ? 0 : max_width - (row_width + wbox->hspacing); - total_height += (n_rows ? wbox->vspacing : 0) + row_height; - n_rows++; - } - - if (*width_inc > this->max_child_width) - *width_inc = 0; - - return MAX (total_height, 1); -} - -static void -gtk_hwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkHWrapBox *this = GTK_HWRAP_BOX (widget); - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - gfloat ratio_dist, layout_width = 0; - guint row_inc = 0; - - g_return_if_fail (requisition != NULL); - - requisition->width = 0; - requisition->height = 0; - this->max_child_width = 0; - this->max_child_height = 0; - - /* size_request all children */ - for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - - this->max_child_width = MAX (this->max_child_width, child_requisition.width); - this->max_child_height = MAX (this->max_child_height, child_requisition.height); - } - - /* figure all possible layouts */ - ratio_dist = 32768; - layout_width = this->max_child_width; - do - { - gfloat layout_height; - gfloat ratio, dist; - - layout_width += row_inc; - layout_height = get_layout_size (this, layout_width, &row_inc); - ratio = layout_width / layout_height; /**/ - dist = MAX (ratio, wbox->aspect_ratio) - MIN (ratio, wbox->aspect_ratio); - if (dist < ratio_dist) - { - ratio_dist = dist; - requisition->width = layout_width; - requisition->height = layout_height; - } - - /* g_print ("ratio for width %d height %d = %f\n", - (gint) layout_width, - (gint) layout_height, - ratio); - */ - } - while (row_inc); - - requisition->width += GTK_CONTAINER (wbox)->border_width * 2; /**/ - requisition->height += GTK_CONTAINER (wbox)->border_width * 2; /**/ - /* g_print ("chosen: width %d, height %d\n", - requisition->width, - requisition->height); - */ -} - -static GSList* -reverse_list_row_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line) -{ - GSList *slist = NULL; - guint width = 0, row_width = area->width; - GtkWrapBoxChild *child = *child_p; - - *max_child_size = 0; - *expand_line = FALSE; - -#if GTK_CHECK_VERSION(2,20,0) - while (child && !gtk_widget_get_visible (child->widget)) -#else - while (child && !GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - *child_p = child->next; - child = *child_p; - } - - if (child) - { - GtkRequisition child_requisition; - guint n = 1; - - get_child_requisition (wbox, child->widget, &child_requisition); - width += child_requisition.width; - *max_child_size = MAX (*max_child_size, child_requisition.height); - *expand_line |= child->vexpand; - slist = g_slist_prepend (slist, child); - *child_p = child->next; - child = *child_p; - - while (child && n < wbox->child_limit) - { -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - get_child_requisition (wbox, child->widget, &child_requisition); - if (width + wbox->hspacing + child_requisition.width > row_width || - child->wrapped) - break; - width += wbox->hspacing + child_requisition.width; - *max_child_size = MAX (*max_child_size, child_requisition.height); - *expand_line |= child->vexpand; - slist = g_slist_prepend (slist, child); - n++; - } - *child_p = child->next; - child = *child_p; - } - } - - return slist; -} - -static void -layout_row (GtkWrapBox *wbox, - GtkAllocation *area, - GSList *children, - guint children_per_line, - gboolean vexpand) -{ - GSList *slist; - guint n_children = 0, n_expand_children = 0, have_expand_children = 0; - gint total_width = 0; - gfloat x, width, extra; - GtkAllocation child_allocation; - - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - GtkRequisition child_requisition; - - n_children++; - if (child->hexpand) - n_expand_children++; - - get_child_requisition (wbox, child->widget, &child_requisition); - total_width += child_requisition.width; - } - - width = MAX (1, area->width - (n_children - 1) * wbox->hspacing); - if (width > total_width) - extra = width - total_width; - else - extra = 0; - have_expand_children = n_expand_children && extra; - - x = area->x; - if (wbox->homogeneous) - { - width = MAX (1, area->width - (children_per_line - 1) * wbox->hspacing); - width /= ((gdouble) children_per_line); - extra = 0; - } - else if (have_expand_children && wbox->justify != GTK_JUSTIFY_FILL) - { - width = extra; - extra /= ((gdouble) n_expand_children); - } - else - { - if (wbox->justify == GTK_JUSTIFY_FILL) - { - width = extra; - have_expand_children = TRUE; - n_expand_children = n_children; - extra /= ((gdouble) n_expand_children); - } - else if (wbox->justify == GTK_JUSTIFY_CENTER) - { - x += extra / 2; - width = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_LEFT) - { - width = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_RIGHT) - { - x += extra; - width = 0; - extra = 0; - } - } - - n_children = 0; - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - - child_allocation.x = x; - child_allocation.y = area->y; - if (wbox->homogeneous) - { - child_allocation.height = area->height; - child_allocation.width = width; - x += child_allocation.width + wbox->hspacing; - } - else - { - GtkRequisition child_requisition; - - get_child_requisition (wbox, child->widget, &child_requisition); - - if (child_requisition.height >= area->height) - child_allocation.height = area->height; - else - { - child_allocation.height = child_requisition.height; - if (wbox->line_justify == GTK_JUSTIFY_FILL || child->vfill) - child_allocation.height = area->height; - else if (child->vexpand || wbox->line_justify == GTK_JUSTIFY_CENTER) - child_allocation.y += (area->height - child_requisition.height) / 2; - else if (wbox->line_justify == GTK_JUSTIFY_BOTTOM) - child_allocation.y += area->height - child_requisition.height; - } - - if (have_expand_children) - { - child_allocation.width = child_requisition.width; - if (child->hexpand || wbox->justify == GTK_JUSTIFY_FILL) - { - guint space; - - n_expand_children--; - space = extra * n_expand_children; - space = width - space; - width -= space; - if (child->hfill) - child_allocation.width += space; - else - { - child_allocation.x += space / 2; - x += space; - } - } - } - else - { - /* g_print ("child_allocation.x %d += %d * %f ", - child_allocation.x, n_children, extra); */ - child_allocation.x += n_children * extra; - /* g_print ("= %d\n", - child_allocation.x); */ - child_allocation.width = MIN (child_requisition.width, - area->width - child_allocation.x + area->x); - } - } - - x += child_allocation.width + wbox->hspacing; - gtk_widget_size_allocate (child->widget, &child_allocation); - n_children++; - } -} - -typedef struct _Line Line; -struct _Line -{ - GSList *children; - guint16 min_size; - guint expand : 1; - Line *next; -}; - -static void -layout_rows (GtkWrapBox *wbox, - GtkAllocation *area) -{ - GtkWrapBoxChild *next_child; - guint min_height; - gboolean vexpand; - GSList *slist; - Line *line_list = NULL; - guint total_height = 0, n_expand_lines = 0, n_lines = 0; - gfloat shrink_height; - guint children_per_line; - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_height, - &vexpand); - slist = g_slist_reverse (slist); - - children_per_line = g_slist_length (slist); - while (slist) - { -#if GLIB_CHECK_VERSION(2,10,0) - Line *line = g_slice_new (Line); -#else - Line *line = g_new (Line, 1); -#endif - - line->children = slist; - line->min_size = min_height; - total_height += min_height; - line->expand = vexpand; - if (vexpand) - n_expand_lines++; - line->next = line_list; - line_list = line; - n_lines++; - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_height, - &vexpand); - slist = g_slist_reverse (slist); - } - - if (total_height > area->height) - shrink_height = total_height - area->height; - else - shrink_height = 0; - - if (1) /* reverse lines and shrink */ - { - Line *prev = NULL, *last = NULL; - gfloat n_shrink_lines = n_lines; - - while (line_list) - { - Line *tmp = line_list->next; - - if (shrink_height) - { - Line *line = line_list; - guint shrink_fract = shrink_height / n_shrink_lines + 0.5; - - if (line->min_size > shrink_fract) - { - shrink_height -= shrink_fract; - line->min_size -= shrink_fract; - } - else - { - shrink_height -= line->min_size - 1; - line->min_size = 1; - } - } - n_shrink_lines--; - - last = line_list; - line_list->next = prev; - prev = line_list; - line_list = tmp; - } - line_list = last; - } - - if (n_lines) - { - Line *line; - gfloat y, height, extra = 0; - - height = area->height; - height = MAX (n_lines, height - (n_lines - 1) * wbox->vspacing); - - if (wbox->homogeneous) - height /= ((gdouble) n_lines); - else if (n_expand_lines) - { - height = MAX (0, height - total_height); - extra = height / ((gdouble) n_expand_lines); - } - else - height = 0; - - y = area->y; - line = line_list; - while (line) - { - GtkAllocation row_allocation; - Line *next_line = line->next; - - row_allocation.x = area->x; - row_allocation.width = area->width; - if (wbox->homogeneous) - row_allocation.height = height; - else - { - row_allocation.height = line->min_size; - - if (line->expand) - row_allocation.height += extra; - } - - row_allocation.y = y; - - y += row_allocation.height + wbox->vspacing; - layout_row (wbox, - &row_allocation, - line->children, - children_per_line, - line->expand); - - g_slist_free (line->children); -#if (!GLIB_CHECK_VERSION(2,10,0)) - g_free (line); -#endif - line = next_line; - } - -#if GLIB_CHECK_VERSION(2,10,0) - g_slice_free_chain (Line, line_list, next); -#endif - } -} - -static void -gtk_hwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkAllocation area; - gint border = GTK_CONTAINER (wbox)->border_width; /**/ - - widget->allocation = *allocation; - area.x = allocation->x + border; - area.y = allocation->y + border; - area.width = MAX (1, (gint) allocation->width - border * 2); - area.height = MAX (1, (gint) allocation->height - border * 2); - - /**/ - /* g_print ("got: width %d, height %d\n", - allocation->width, - allocation->height); - */ - /**/ - - layout_rows (wbox, &area); -} diff --git a/app/gtkhwrapbox.h b/app/gtkhwrapbox.h deleted file mode 100644 index 5a4ea943ae8deb54ad44df5372470957556f128c..0000000000000000000000000000000000000000 --- a/app/gtkhwrapbox.h +++ /dev/null @@ -1,70 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkHWrapBox: Horizontal wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_HWRAP_BOX_H__ -#define __GTK_HWRAP_BOX_H__ - - -#include "gtkwrapbox.h" - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_HWRAP_BOX (gtk_hwrap_box_get_type ()) -#define GTK_HWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_HWRAP_BOX, GtkHWrapBox)) -#define GTK_HWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_HWRAP_BOX, GtkHWrapBoxClass)) -#define GTK_IS_HWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_HWRAP_BOX)) -#define GTK_IS_HWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HWRAP_BOX)) -#define GTK_HWRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_HWRAP_BOX, GtkHWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkHWrapBox GtkHWrapBox; -typedef struct _GtkHWrapBoxClass GtkHWrapBoxClass; - - -/* --- GtkHWrapBox --- */ -struct _GtkHWrapBox -{ - GtkWrapBox parent_widget; - - /**/ - guint max_child_width; - guint max_child_height; - /**/ -}; - -struct _GtkHWrapBoxClass -{ - GtkWrapBoxClass parent_class; -}; - - -/* --- prototypes --- */ -GType gtk_hwrap_box_get_type (void) G_GNUC_CONST; -GtkWidget * gtk_hwrap_box_new (gboolean homogeneous); - - -G_END_DECLS - -#endif /* __GTK_HWRAP_BOX_H__ */ diff --git a/app/gtkvwrapbox.c b/app/gtkvwrapbox.c deleted file mode 100644 index f648e0d771e415fbdb68f1d3e6b1f08da4c1cc69..0000000000000000000000000000000000000000 --- a/app/gtkvwrapbox.c +++ /dev/null @@ -1,637 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkVWrapBox: Vertical wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkvwrapbox.h" -#include - - -/* --- prototypes --- */ -static void gtk_vwrap_box_class_init (GtkVWrapBoxClass *klass); -static void gtk_vwrap_box_init (GtkVWrapBox *vwbox); -static void gtk_vwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_vwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static GSList* reverse_list_col_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_width, - gboolean *can_hexpand); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_vwrap_box_get_type (void) -{ - static GType vwrap_box_type = 0; - - if (! vwrap_box_type) - { - const GTypeInfo vwrap_box_info = - { - sizeof (GtkVWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_vwrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkVWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_vwrap_box_init, - }; - - vwrap_box_type = g_type_register_static (GTK_TYPE_WRAP_BOX, "GtkVWrapBox", - &vwrap_box_info, 0); - } - - return vwrap_box_type; -} - -static void -gtk_vwrap_box_class_init (GtkVWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkWrapBoxClass *wrap_box_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - wrap_box_class = GTK_WRAP_BOX_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - widget_class->size_request = gtk_vwrap_box_size_request; - widget_class->size_allocate = gtk_vwrap_box_size_allocate; - - wrap_box_class->rlist_line_children = reverse_list_col_children; -} - -static void -gtk_vwrap_box_init (GtkVWrapBox *vwbox) -{ - vwbox->max_child_height = 0; - vwbox->max_child_width = 0; -} - -GtkWidget* -gtk_vwrap_box_new (gboolean homogeneous) -{ - return g_object_new (GTK_TYPE_VWRAP_BOX, "homogeneous", homogeneous, NULL); -} - -static inline void -get_child_requisition (GtkWrapBox *wbox, - GtkWidget *child, - GtkRequisition *child_requisition) -{ - if (wbox->homogeneous) - { - GtkVWrapBox *vwbox = GTK_VWRAP_BOX (wbox); - - child_requisition->height = vwbox->max_child_height; - child_requisition->width = vwbox->max_child_width; - } - else - gtk_widget_get_child_requisition (child, child_requisition); -} - -static gfloat -get_layout_size (GtkVWrapBox *this, - guint max_height, - guint *height_inc) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (this); - GtkWrapBoxChild *child; - guint n_cols, left_over = 0, total_width = 0; - gboolean last_col_filled = TRUE; - - *height_inc = this->max_child_height + 1; - - n_cols = 0; - for (child = wbox->children; child; child = child->next) - { - GtkWrapBoxChild *col_child; - GtkRequisition child_requisition; - guint col_height, col_width, n = 1; - -#if GTK_CHECK_VERSION(2,20,0) - if (!gtk_widget_get_visible (child->widget)) -#else - if (!GTK_WIDGET_VISIBLE (child->widget)) -#endif - continue; - - get_child_requisition (wbox, child->widget, &child_requisition); - if (!last_col_filled) - *height_inc = MIN (*height_inc, child_requisition.height - left_over); - col_height = child_requisition.height; - col_width = child_requisition.width; - for (col_child = child->next; col_child && n < wbox->child_limit; col_child = col_child->next) - { -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (col_child->widget)) -#else - if (GTK_WIDGET_VISIBLE (col_child->widget)) -#endif - { - get_child_requisition (wbox, col_child->widget, &child_requisition); - if (col_height + wbox->vspacing + child_requisition.height > max_height) - break; - col_height += wbox->vspacing + child_requisition.height; - col_width = MAX (col_width, child_requisition.width); - n++; - } - child = col_child; - } - last_col_filled = n >= wbox->child_limit; - left_over = last_col_filled ? 0 : max_height - (col_height + wbox->vspacing); - total_width += (n_cols ? wbox->hspacing : 0) + col_width; - n_cols++; - } - - if (*height_inc > this->max_child_height) - *height_inc = 0; - - return MAX (total_width, 1); -} - -static void -gtk_vwrap_box_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkVWrapBox *this = GTK_VWRAP_BOX (widget); - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - gfloat ratio_dist, layout_height = 0; - guint col_inc = 0; - - g_return_if_fail (requisition != NULL); - - requisition->height = 0; - requisition->width = 0; - this->max_child_height = 0; - this->max_child_width = 0; - - /* size_request all children */ - for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child->widget, &child_requisition); - - this->max_child_height = MAX (this->max_child_height, child_requisition.height); - this->max_child_width = MAX (this->max_child_width, child_requisition.width); - } - - /* figure all possible layouts */ - ratio_dist = 32768; - layout_height = this->max_child_height; - do - { - gfloat layout_width; - gfloat ratio, dist; - - layout_height += col_inc; - layout_width = get_layout_size (this, layout_height, &col_inc); - ratio = layout_width / layout_height; /**/ - dist = MAX (ratio, wbox->aspect_ratio) - MIN (ratio, wbox->aspect_ratio); - if (dist < ratio_dist) - { - ratio_dist = dist; - requisition->height = layout_height; - requisition->width = layout_width; - } - - /* g_print ("ratio for height %d width %d = %f\n", - (gint) layout_height, - (gint) layout_width, - ratio); - */ - } - while (col_inc); - - requisition->width += GTK_CONTAINER (wbox)->border_width * 2; /**/ - requisition->height += GTK_CONTAINER (wbox)->border_width * 2; /**/ - /* g_print ("chosen: height %d, width %d\n", - requisition->height, - requisition->width); - */ -} - -static GSList* -reverse_list_col_children (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line) -{ - GSList *slist = NULL; - guint height = 0, col_height = area->height; - GtkWrapBoxChild *child = *child_p; - - *max_child_size = 0; - *expand_line = FALSE; - -#if GTK_CHECK_VERSION(2,20,0) - while (child && !gtk_widget_get_visible (child->widget)) -#else - while (child && !GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - *child_p = child->next; - child = *child_p; - } - - if (child) - { - GtkRequisition child_requisition; - guint n = 1; - - get_child_requisition (wbox, child->widget, &child_requisition); - height += child_requisition.height; - *max_child_size = MAX (*max_child_size, child_requisition.width); - *expand_line |= child->hexpand; - slist = g_slist_prepend (slist, child); - *child_p = child->next; - child = *child_p; - - while (child && n < wbox->child_limit) - { -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget)) -#else - if (GTK_WIDGET_VISIBLE (child->widget)) -#endif - { - get_child_requisition (wbox, child->widget, &child_requisition); - if (height + wbox->vspacing + child_requisition.height > col_height || - child->wrapped) - break; - height += wbox->vspacing + child_requisition.height; - *max_child_size = MAX (*max_child_size, child_requisition.width); - *expand_line |= child->hexpand; - slist = g_slist_prepend (slist, child); - n++; - } - *child_p = child->next; - child = *child_p; - } - } - - return slist; -} - -static void -layout_col (GtkWrapBox *wbox, - GtkAllocation *area, - GSList *children, - guint children_per_line, - gboolean hexpand) -{ - GSList *slist; - guint n_children = 0, n_expand_children = 0, have_expand_children = 0; - gint total_height = 0; - gfloat y, height, extra; - GtkAllocation child_allocation; - - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - GtkRequisition child_requisition; - - n_children++; - if (child->vexpand) - n_expand_children++; - - get_child_requisition (wbox, child->widget, &child_requisition); - total_height += child_requisition.height; - } - - height = MAX (1, area->height - (n_children - 1) * wbox->vspacing); - if (height > total_height) - extra = height - total_height; - else - extra = 0; - have_expand_children = n_expand_children && extra; - - y = area->y; - if (wbox->homogeneous) - { - height = MAX (1, area->height - (children_per_line - 1) * wbox->vspacing); - height /= ((gdouble) children_per_line); - extra = 0; - } - else if (have_expand_children && wbox->justify != GTK_JUSTIFY_FILL) - { - height = extra; - extra /= ((gdouble) n_expand_children); - } - else - { - if (wbox->justify == GTK_JUSTIFY_FILL) - { - height = extra; - have_expand_children = TRUE; - n_expand_children = n_children; - extra /= ((gdouble) n_expand_children); - } - else if (wbox->justify == GTK_JUSTIFY_CENTER) - { - y += extra / 2; - height = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_LEFT) - { - height = 0; - extra = 0; - } - else if (wbox->justify == GTK_JUSTIFY_RIGHT) - { - y += extra; - height = 0; - extra = 0; - } - } - - n_children = 0; - for (slist = children; slist; slist = slist->next) - { - GtkWrapBoxChild *child = slist->data; - - child_allocation.y = y; - child_allocation.x = area->x; - if (wbox->homogeneous) - { - child_allocation.width = area->width; - child_allocation.height = height; - y += child_allocation.height + wbox->vspacing; - } - else - { - GtkRequisition child_requisition; - - get_child_requisition (wbox, child->widget, &child_requisition); - - if (child_requisition.width >= area->width) - child_allocation.width = area->width; - else - { - child_allocation.width = child_requisition.width; - if (wbox->line_justify == GTK_JUSTIFY_FILL || child->hfill) - child_allocation.width = area->width; - else if (child->hexpand || wbox->line_justify == GTK_JUSTIFY_CENTER) - child_allocation.x += (area->width - child_requisition.width) / 2; - else if (wbox->line_justify == GTK_JUSTIFY_BOTTOM) - child_allocation.x += area->width - child_requisition.width; - } - - if (have_expand_children) - { - child_allocation.height = child_requisition.height; - if (child->vexpand || wbox->justify == GTK_JUSTIFY_FILL) - { - guint space; - - n_expand_children--; - space = extra * n_expand_children; - space = height - space; - height -= space; - if (child->vfill) - child_allocation.height += space; - else - { - child_allocation.y += space / 2; - y += space; - } - } - } - else - { - /* g_print ("child_allocation.y %d += %d * %f ", - child_allocation.y, n_children, extra); */ - child_allocation.y += n_children * extra; - /* g_print ("= %d\n", - child_allocation.y); */ - child_allocation.height = MIN (child_requisition.height, - area->height - child_allocation.y + area->y); - } - } - - y += child_allocation.height + wbox->vspacing; - gtk_widget_size_allocate (child->widget, &child_allocation); - n_children++; - } -} - -typedef struct _Line Line; -struct _Line -{ - GSList *children; - guint16 min_size; - guint expand : 1; - Line *next; -}; - -static void -layout_cols (GtkWrapBox *wbox, - GtkAllocation *area) -{ - GtkWrapBoxChild *next_child; - guint min_width; - gboolean hexpand; - GSList *slist; - Line *line_list = NULL; - guint total_width = 0, n_expand_lines = 0, n_lines = 0; - gfloat shrink_width; - guint children_per_line; - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_width, - &hexpand); - slist = g_slist_reverse (slist); - - children_per_line = g_slist_length (slist); - while (slist) - { -#if GLIB_CHECK_VERSION(2,10,0) - Line *line = g_slice_new (Line); -#else - Line *line = g_new (Line, 1); -#endif - - line->children = slist; - line->min_size = min_width; - total_width += min_width; - line->expand = hexpand; - if (hexpand) - n_expand_lines++; - line->next = line_list; - line_list = line; - n_lines++; - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - area, - &min_width, - &hexpand); - slist = g_slist_reverse (slist); - } - - if (total_width > area->width) - shrink_width = total_width - area->width; - else - shrink_width = 0; - - if (1) /* reverse lines and shrink */ - { - Line *prev = NULL, *last = NULL; - gfloat n_shrink_lines = n_lines; - - while (line_list) - { - Line *tmp = line_list->next; - - if (shrink_width) - { - Line *line = line_list; - guint shrink_fract = shrink_width / n_shrink_lines + 0.5; - - if (line->min_size > shrink_fract) - { - shrink_width -= shrink_fract; - line->min_size -= shrink_fract; - } - else - { - shrink_width -= line->min_size - 1; - line->min_size = 1; - } - } - n_shrink_lines--; - - last = line_list; - line_list->next = prev; - prev = line_list; - line_list = tmp; - } - line_list = last; - } - - if (n_lines) - { - Line *line; - gfloat x, width, extra = 0; - - width = area->width; - width = MAX (n_lines, width - (n_lines - 1) * wbox->hspacing); - - if (wbox->homogeneous) - width /= ((gdouble) n_lines); - else if (n_expand_lines) - { - width = MAX (0, width - total_width); - extra = width / ((gdouble) n_expand_lines); - } - else - width = 0; - - x = area->x; - line = line_list; - while (line) - { - GtkAllocation col_allocation; - Line *next_line = line->next; - - col_allocation.y = area->y; - col_allocation.height = area->height; - if (wbox->homogeneous) - col_allocation.width = width; - else - { - col_allocation.width = line->min_size; - - if (line->expand) - col_allocation.width += extra; - } - - col_allocation.x = x; - - x += col_allocation.width + wbox->hspacing; - layout_col (wbox, - &col_allocation, - line->children, - children_per_line, - line->expand); - - g_slist_free (line->children); -#if (!GLIB_CHECK_VERSION(2,10,0)) - g_free (line); -#endif - line = next_line; - } - -#if GLIB_CHECK_VERSION(2,10,0) - g_slice_free_chain (Line, line_list, next); -#endif - } -} - -static void -gtk_vwrap_box_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkAllocation area; - gint border = GTK_CONTAINER (wbox)->border_width; /**/ - - widget->allocation = *allocation; - area.y = allocation->y + border; - area.x = allocation->x + border; - area.height = MAX (1, (gint) allocation->height - border * 2); - area.width = MAX (1, (gint) allocation->width - border * 2); - - /**/ - /* g_print ("got: width %d, height %d\n", - allocation->width, - allocation->height); - */ - /**/ - - layout_cols (wbox, &area); -} diff --git a/app/gtkvwrapbox.h b/app/gtkvwrapbox.h deleted file mode 100644 index 7a618a630b259ac2b9d4296c37eede90eb9bf514..0000000000000000000000000000000000000000 --- a/app/gtkvwrapbox.h +++ /dev/null @@ -1,70 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkVWrapBox: Vertical wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_VWRAP_BOX_H__ -#define __GTK_VWRAP_BOX_H__ - - -#include "gtkwrapbox.h" - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_VWRAP_BOX (gtk_vwrap_box_get_type ()) -#define GTK_VWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_VWRAP_BOX, GtkVWrapBox)) -#define GTK_VWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_VWRAP_BOX, GtkVWrapBoxClass)) -#define GTK_IS_VWRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_VWRAP_BOX)) -#define GTK_IS_VWRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_VWRAP_BOX)) -#define GTK_VWRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_VWRAP_BOX, GtkVWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkVWrapBox GtkVWrapBox; -typedef struct _GtkVWrapBoxClass GtkVWrapBoxClass; - - -/* --- GtkVWrapBox --- */ -struct _GtkVWrapBox -{ - GtkWrapBox parent_widget; - - /**/ - guint max_child_width; - guint max_child_height; - /**/ -}; - -struct _GtkVWrapBoxClass -{ - GtkWrapBoxClass parent_class; -}; - - -/* --- prototypes --- */ -GType gtk_vwrap_box_get_type (void) G_GNUC_CONST; -GtkWidget * gtk_vwrap_box_new (gboolean homogeneous); - - -G_END_DECLS - -#endif /* __GTK_VWRAP_BOX_H__ */ diff --git a/app/gtkwrapbox.c b/app/gtkwrapbox.c deleted file mode 100644 index 6043de02793d675e1685374578a0cfaf795d5594..0000000000000000000000000000000000000000 --- a/app/gtkwrapbox.c +++ /dev/null @@ -1,957 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkWrapBox: Wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include "gtkwrapbox.h" -#include - - -/* --- properties --- */ -enum { - PROP_0, - PROP_HOMOGENEOUS, - PROP_JUSTIFY, - PROP_HSPACING, - PROP_VSPACING, - PROP_LINE_JUSTIFY, - PROP_ASPECT_RATIO, - PROP_CURRENT_RATIO, - PROP_CHILD_LIMIT -}; - -enum { - CHILD_PROP_0, - CHILD_PROP_POSITION, - CHILD_PROP_HEXPAND, - CHILD_PROP_HFILL, - CHILD_PROP_VEXPAND, - CHILD_PROP_VFILL, - CHILD_PROP_WRAPPED -}; - - -/* --- prototypes --- */ -static void gtk_wrap_box_class_init (GtkWrapBoxClass *klass); -static void gtk_wrap_box_init (GtkWrapBox *wbox); -static void gtk_wrap_box_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_set_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_get_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - GValue *value, - GParamSpec *pspec); -static void gtk_wrap_box_map (GtkWidget *widget); -static void gtk_wrap_box_unmap (GtkWidget *widget); -static gint gtk_wrap_box_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_wrap_box_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_wrap_box_remove (GtkContainer *container, - GtkWidget *widget); -static void gtk_wrap_box_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); -static GType gtk_wrap_box_child_type (GtkContainer *container); - - -/* --- variables --- */ -static gpointer parent_class = NULL; - - -/* --- functions --- */ -GType -gtk_wrap_box_get_type (void) -{ - static GType wrap_box_type = 0; - - if (! wrap_box_type) - { - const GTypeInfo wrap_box_info = - { - sizeof (GtkWrapBoxClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_wrap_box_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkWrapBox), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_wrap_box_init, - }; - - wrap_box_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkWrapBox", - &wrap_box_info, 0); - } - - return wrap_box_type; -} - -static void -gtk_wrap_box_class_init (GtkWrapBoxClass *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = G_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - container_class = GTK_CONTAINER_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - object_class->set_property = gtk_wrap_box_set_property; - object_class->get_property = gtk_wrap_box_get_property; - - widget_class->map = gtk_wrap_box_map; - widget_class->unmap = gtk_wrap_box_unmap; - widget_class->expose_event = gtk_wrap_box_expose; - - container_class->add = gtk_wrap_box_add; - container_class->remove = gtk_wrap_box_remove; - container_class->forall = gtk_wrap_box_forall; - container_class->child_type = gtk_wrap_box_child_type; - container_class->set_child_property = gtk_wrap_box_set_child_property; - container_class->get_child_property = gtk_wrap_box_get_child_property; - - class->rlist_line_children = NULL; - - g_object_class_install_property (object_class, - PROP_HOMOGENEOUS, - g_param_spec_boolean ("homogeneous", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_JUSTIFY, - g_param_spec_enum ("justify", - NULL, - NULL, - GTK_TYPE_JUSTIFICATION, - GTK_JUSTIFY_LEFT, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_HSPACING, - g_param_spec_uint ("hspacing", - NULL, - NULL, - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_VSPACING, - g_param_spec_uint ("vspacing", - NULL, - NULL, - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_LINE_JUSTIFY, - g_param_spec_enum ("line-justify", - NULL, - NULL, - GTK_TYPE_JUSTIFICATION, - GTK_JUSTIFY_BOTTOM, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_ASPECT_RATIO, - g_param_spec_float ("aspect-ratio", - NULL, - NULL, - 0.0, - G_MAXFLOAT, - 1.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_CURRENT_RATIO, - g_param_spec_float ("current-ratio", - NULL, - NULL, - 0.0, - G_MAXFLOAT, - 1.0, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, - PROP_CHILD_LIMIT, - g_param_spec_uint ("max-children-per-line", - NULL, - NULL, - 1, - 32767, - 32767, - G_PARAM_READWRITE)); - - gtk_container_class_install_child_property (container_class, - CHILD_PROP_POSITION, - g_param_spec_int ("position", - NULL, - NULL, - -1, G_MAXINT, 0, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_HEXPAND, - g_param_spec_boolean ("hexpand", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_HFILL, - g_param_spec_boolean ("hfill", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_VEXPAND, - g_param_spec_boolean ("vexpand", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_VFILL, - g_param_spec_boolean ("vfill", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - gtk_container_class_install_child_property (container_class, - CHILD_PROP_WRAPPED, - g_param_spec_boolean ("wrapped", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); -} - -static void -gtk_wrap_box_init (GtkWrapBox *wbox) -{ -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_has_window (GTK_WIDGET (wbox), FALSE); -#else - GTK_WIDGET_SET_FLAGS (wbox, GTK_NO_WINDOW); -#endif - - wbox->homogeneous = FALSE; - wbox->hspacing = 0; - wbox->vspacing = 0; - wbox->justify = GTK_JUSTIFY_LEFT; - wbox->line_justify = GTK_JUSTIFY_BOTTOM; - wbox->n_children = 0; - wbox->children = NULL; - wbox->aspect_ratio = 1.0; - wbox->child_limit = 32767; -} - -static void -gtk_wrap_box_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (object); - - switch (property_id) - { - case PROP_HOMOGENEOUS: - gtk_wrap_box_set_homogeneous (wbox, g_value_get_boolean (value)); - break; - case PROP_JUSTIFY: - gtk_wrap_box_set_justify (wbox, g_value_get_enum (value)); - break; - case PROP_LINE_JUSTIFY: - gtk_wrap_box_set_line_justify (wbox, g_value_get_enum (value)); - break; - case PROP_HSPACING: - gtk_wrap_box_set_hspacing (wbox, g_value_get_uint (value)); - break; - case PROP_VSPACING: - gtk_wrap_box_set_vspacing (wbox, g_value_get_uint (value)); - break; - case PROP_ASPECT_RATIO: - gtk_wrap_box_set_aspect_ratio (wbox, g_value_get_float (value)); - break; - case PROP_CHILD_LIMIT: - if (wbox->child_limit != g_value_get_uint (value)) - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (object); - GtkWidget *widget = GTK_WIDGET (object); - - switch (property_id) - { - case PROP_HOMOGENEOUS: - g_value_set_boolean (value, wbox->homogeneous); - break; - case PROP_JUSTIFY: - g_value_set_enum (value, wbox->justify); - break; - case PROP_LINE_JUSTIFY: - g_value_set_enum (value, wbox->line_justify); - break; - case PROP_HSPACING: - g_value_set_uint (value, wbox->hspacing); - break; - case PROP_VSPACING: - g_value_set_uint (value, wbox->vspacing); - break; - case PROP_ASPECT_RATIO: - g_value_set_float (value, wbox->aspect_ratio); - break; - case PROP_CURRENT_RATIO: - g_value_set_float (value, (((gfloat) widget->allocation.width) / - ((gfloat) widget->allocation.height))); - break; - case PROP_CHILD_LIMIT: - g_value_set_uint (value, wbox->child_limit); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_set_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - gboolean hexpand = FALSE, hfill = FALSE; - gboolean vexpand = FALSE, vfill = FALSE; - gboolean wrapped = FALSE; - - if (property_id != CHILD_PROP_POSITION) - gtk_wrap_box_query_child_packing (wbox, child, - &hexpand, &hfill, - &vexpand, &vfill, - &wrapped); - - switch (property_id) - { - case CHILD_PROP_POSITION: - gtk_wrap_box_reorder_child (wbox, child, g_value_get_int (value)); - break; - case CHILD_PROP_HEXPAND: - gtk_wrap_box_set_child_packing (wbox, child, - g_value_get_boolean (value), hfill, - vexpand, vfill, - wrapped); - break; - case CHILD_PROP_HFILL: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, g_value_get_boolean (value), - vexpand, vfill, - wrapped); - break; - case CHILD_PROP_VEXPAND: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - g_value_get_boolean (value), vfill, - wrapped); - break; - case CHILD_PROP_VFILL: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - vexpand, g_value_get_boolean (value), - wrapped); - break; - case CHILD_PROP_WRAPPED: - gtk_wrap_box_set_child_packing (wbox, child, - hexpand, hfill, - vexpand, vfill, - g_value_get_boolean (value)); - break; - default: - GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); - break; - } -} - -static void -gtk_wrap_box_get_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - gboolean hexpand = FALSE, hfill = FALSE; - gboolean vexpand = FALSE, vfill = FALSE; - gboolean wrapped = FALSE; - - if (property_id != CHILD_PROP_POSITION) - gtk_wrap_box_query_child_packing (wbox, child, - &hexpand, &hfill, - &vexpand, &vfill, - &wrapped); - - switch (property_id) - { - GtkWrapBoxChild *child_info; - guint i; - case CHILD_PROP_POSITION: - i = 0; - for (child_info = wbox->children; child_info; child_info = child_info->next) - { - if (child_info->widget == child) - break; - i += 1; - } - g_value_set_int (value, child_info ? i : -1); - break; - case CHILD_PROP_HEXPAND: - g_value_set_boolean (value, hexpand); - break; - case CHILD_PROP_HFILL: - g_value_set_boolean (value, hfill); - break; - case CHILD_PROP_VEXPAND: - g_value_set_boolean (value, vexpand); - break; - case CHILD_PROP_VFILL: - g_value_set_boolean (value, vfill); - break; - case CHILD_PROP_WRAPPED: - g_value_set_boolean (value, wrapped); - break; - default: - GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); - break; - } -} - -static GType -gtk_wrap_box_child_type (GtkContainer *container) -{ - return GTK_TYPE_WIDGET; -} - -void -gtk_wrap_box_set_homogeneous (GtkWrapBox *wbox, - gboolean homogeneous) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - homogeneous = homogeneous != FALSE; - if (wbox->homogeneous != homogeneous) - { - wbox->homogeneous = homogeneous; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_hspacing (GtkWrapBox *wbox, - guint hspacing) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - if (wbox->hspacing != hspacing) - { - wbox->hspacing = hspacing; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_vspacing (GtkWrapBox *wbox, - guint vspacing) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - if (wbox->vspacing != vspacing) - { - wbox->vspacing = vspacing; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_justify (GtkWrapBox *wbox, - GtkJustification justify) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (justify <= GTK_JUSTIFY_FILL); - - if (wbox->justify != justify) - { - wbox->justify = justify; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_line_justify (GtkWrapBox *wbox, - GtkJustification line_justify) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (line_justify <= GTK_JUSTIFY_FILL); - - if (wbox->line_justify != line_justify) - { - wbox->line_justify = line_justify; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_set_aspect_ratio (GtkWrapBox *wbox, - gfloat aspect_ratio) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - - aspect_ratio = CLAMP (aspect_ratio, 1.0 / 256.0, 256.0); - - if (wbox->aspect_ratio != aspect_ratio) - { - wbox->aspect_ratio = aspect_ratio; - gtk_widget_queue_resize (GTK_WIDGET (wbox)); - } -} - -void -gtk_wrap_box_pack (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill) -{ - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (child->parent == NULL); - - gtk_wrap_box_pack_wrapped (wbox, child, hexpand, hfill, vexpand, vfill, FALSE); -} - -void -gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - g_return_if_fail (child->parent == NULL); - -#if GLIB_CHECK_VERSION(2,10,0) - child_info = g_slice_new (GtkWrapBoxChild); -#else - child_info = g_new (GtkWrapBoxChild, 1); -#endif - - child_info->widget = child; - child_info->hexpand = hexpand ? TRUE : FALSE; - child_info->hfill = hfill ? TRUE : FALSE; - child_info->vexpand = vexpand ? TRUE : FALSE; - child_info->vfill = vfill ? TRUE : FALSE; - child_info->wrapped = wrapped ? TRUE : FALSE; - child_info->next = NULL; - if (wbox->children) - { - GtkWrapBoxChild *last = wbox->children; - - while (last->next) - last = last->next; - last->next = child_info; - } - else - wbox->children = child_info; - wbox->n_children++; - - gtk_widget_set_parent (child, GTK_WIDGET (wbox)); - -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_realized (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_REALIZED (wbox)) -#endif - gtk_widget_realize (child); - -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (GTK_WIDGET (wbox)) && gtk_widget_get_visible (child)) -#else - if (GTK_WIDGET_VISIBLE (wbox) && GTK_WIDGET_VISIBLE (child)) -#endif - { -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_mapped (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_MAPPED (wbox)) -#endif - gtk_widget_map (child); - - gtk_widget_queue_resize (child); - } -} - -void -gtk_wrap_box_reorder_child (GtkWrapBox *wbox, - GtkWidget *child, - gint position) -{ - GtkWrapBoxChild *child_info, *last = NULL; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - for (child_info = wbox->children; child_info; last = child_info, child_info = last->next) - if (child_info->widget == child) - break; - - if (child_info && wbox->children->next) - { - GtkWrapBoxChild *tmp; - - if (last) - last->next = child_info->next; - else - wbox->children = child_info->next; - - last = NULL; - tmp = wbox->children; - while (position && tmp->next) - { - position--; - last = tmp; - tmp = last->next; - } - - if (position) - { - tmp->next = child_info; - child_info->next = NULL; - } - else - { - child_info->next = tmp; - if (last) - last->next = child_info; - else - wbox->children = child_info; - } - -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) -#endif - gtk_widget_queue_resize (child); - } -} - -void -gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean *hexpand, - gboolean *hfill, - gboolean *vexpand, - gboolean *vfill, - gboolean *wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - for (child_info = wbox->children; child_info; child_info = child_info->next) - if (child_info->widget == child) - break; - - if (child_info) - { - if (hexpand) - *hexpand = child_info->hexpand; - if (hfill) - *hfill = child_info->hfill; - if (vexpand) - *vexpand = child_info->vexpand; - if (vfill) - *vfill = child_info->vfill; - if (wrapped) - *wrapped = child_info->wrapped; - } -} - -void -gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped) -{ - GtkWrapBoxChild *child_info; - - g_return_if_fail (GTK_IS_WRAP_BOX (wbox)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - hexpand = hexpand != FALSE; - hfill = hfill != FALSE; - vexpand = vexpand != FALSE; - vfill = vfill != FALSE; - wrapped = wrapped != FALSE; - - for (child_info = wbox->children; child_info; child_info = child_info->next) - if (child_info->widget == child) - break; - - if (child_info && - (child_info->hexpand != hexpand || child_info->vexpand != vexpand || - child_info->hfill != hfill || child_info->vfill != vfill || - child_info->wrapped != wrapped)) - { - child_info->hexpand = hexpand; - child_info->hfill = hfill; - child_info->vexpand = vexpand; - child_info->vfill = vfill; - child_info->wrapped = wrapped; - -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child) && gtk_widget_get_visible (GTK_WIDGET (wbox))) -#else - if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (wbox)) -#endif - gtk_widget_queue_resize (child); - } -} - -guint* -gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, - guint *_n_lines) -{ - GtkWrapBoxChild *next_child = NULL; - GtkAllocation area, *allocation; - gboolean expand_line; - GSList *slist; - guint max_child_size, border, n_lines = 0, *lines = NULL; - - if (_n_lines) - *_n_lines = 0; - g_return_val_if_fail (GTK_IS_WRAP_BOX (wbox), NULL); - - allocation = >K_WIDGET (wbox)->allocation; - border = GTK_CONTAINER (wbox)->border_width; - area.x = allocation->x + border; - area.y = allocation->y + border; - area.width = MAX (1, (gint) allocation->width - border * 2); - area.height = MAX (1, (gint) allocation->height - border * 2); - - next_child = wbox->children; - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - &area, - &max_child_size, - &expand_line); - while (slist) - { - guint l = n_lines++; - - lines = g_renew (guint, lines, n_lines); - lines[l] = g_slist_length (slist); - g_slist_free (slist); - - slist = GTK_WRAP_BOX_GET_CLASS (wbox)->rlist_line_children (wbox, - &next_child, - &area, - &max_child_size, - &expand_line); - } - - if (_n_lines) - *_n_lines = n_lines; - - return lines; -} - -static void -gtk_wrap_box_map (GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - -#if GTK_CHECK_VERSION(2,20,0) - gtk_widget_set_mapped (GTK_WIDGET (wbox), TRUE); -#else - GTK_WIDGET_SET_FLAGS (wbox, GTK_MAPPED); -#endif - - for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget) && -#else - if (GTK_WIDGET_VISIBLE (child->widget) && -#endif -#if GTK_CHECK_VERSION(2,20,0) - !gtk_widget_get_mapped (child->widget)) -#else - !GTK_WIDGET_MAPPED (child->widget)) -#endif - gtk_widget_map (child->widget); -} - -static void -gtk_wrap_box_unmap (GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (widget); - GtkWrapBoxChild *child; - -#if GTK_CHECK_VERSION(2,20,0) - gtk_widget_set_mapped (GTK_WIDGET (wbox), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (wbox, GTK_MAPPED); -#endif - - for (child = wbox->children; child; child = child->next) -#if GTK_CHECK_VERSION(2,20,0) - if (gtk_widget_get_visible (child->widget) && -#else - if (GTK_WIDGET_VISIBLE (child->widget) && -#endif -#if GTK_CHECK_VERSION(2,20,0) - gtk_widget_get_mapped (child->widget)) -#else - GTK_WIDGET_MAPPED (child->widget)) -#endif - gtk_widget_unmap (child->widget); -} - -static gint -gtk_wrap_box_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - return GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); -} - -static void -gtk_wrap_box_add (GtkContainer *container, - GtkWidget *widget) -{ - gtk_wrap_box_pack (GTK_WRAP_BOX (container), widget, FALSE, TRUE, FALSE, TRUE); -} - -static void -gtk_wrap_box_remove (GtkContainer *container, - GtkWidget *widget) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - GtkWrapBoxChild *child, *last = NULL; - - child = wbox->children; - while (child) - { - if (child->widget == widget) - { - gboolean was_visible; - -#if GTK_CHECK_VERSION(2,20,0) - was_visible = gtk_widget_get_visible (widget); -#else - was_visible = GTK_WIDGET_VISIBLE (widget); -#endif - gtk_widget_unparent (widget); - - if (last) - last->next = child->next; - else - wbox->children = child->next; -#if GLIB_CHECK_VERSION(2,10,0) - g_slice_free (GtkWrapBoxChild, child); -#else - g_free (child); -#endif - wbox->n_children--; - - if (was_visible) - gtk_widget_queue_resize (GTK_WIDGET (container)); - - break; - } - - last = child; - child = last->next; - } -} - -static void -gtk_wrap_box_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkWrapBox *wbox = GTK_WRAP_BOX (container); - GtkWrapBoxChild *child; - - child = wbox->children; - while (child) - { - GtkWidget *widget = child->widget; - - child = child->next; - - callback (widget, callback_data); - } -} diff --git a/app/gtkwrapbox.h b/app/gtkwrapbox.h deleted file mode 100644 index e557b5da7940e4c3b46afe1bee0fb05542d1fbc0..0000000000000000000000000000000000000000 --- a/app/gtkwrapbox.h +++ /dev/null @@ -1,136 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkWrapBox: Wrapping box widget - * Copyright (C) 1999 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GTK_WRAP_BOX_H__ -#define __GTK_WRAP_BOX_H__ - - -#include - -G_BEGIN_DECLS - - -/* --- type macros --- */ -#define GTK_TYPE_WRAP_BOX (gtk_wrap_box_get_type ()) -#define GTK_WRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBox)) -#define GTK_WRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass)) -#define GTK_IS_WRAP_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WRAP_BOX)) -#define GTK_IS_WRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WRAP_BOX)) -#define GTK_WRAP_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass)) - - -/* --- typedefs --- */ -typedef struct _GtkWrapBox GtkWrapBox; -typedef struct _GtkWrapBoxClass GtkWrapBoxClass; -typedef struct _GtkWrapBoxChild GtkWrapBoxChild; - -/* --- GtkWrapBox --- */ -struct _GtkWrapBox -{ - GtkContainer container; - - guint homogeneous : 1; - guint justify : 4; - guint line_justify : 4; - guint8 hspacing; - guint8 vspacing; - guint16 n_children; - GtkWrapBoxChild *children; - gfloat aspect_ratio; /* 1/256..256 */ - guint child_limit; -}; -struct _GtkWrapBoxClass -{ - GtkContainerClass parent_class; - - GSList* (*rlist_line_children) (GtkWrapBox *wbox, - GtkWrapBoxChild **child_p, - GtkAllocation *area, - guint *max_child_size, - gboolean *expand_line); -}; -struct _GtkWrapBoxChild -{ - GtkWidget *widget; - guint hexpand : 1; - guint hfill : 1; - guint vexpand : 1; - guint vfill : 1; - guint wrapped : 1; - - GtkWrapBoxChild *next; -}; -#define GTK_JUSTIFY_TOP GTK_JUSTIFY_LEFT -#define GTK_JUSTIFY_BOTTOM GTK_JUSTIFY_RIGHT - - -/* --- prototypes --- */ -GType gtk_wrap_box_get_type (void) G_GNUC_CONST; -void gtk_wrap_box_set_homogeneous (GtkWrapBox *wbox, - gboolean homogeneous); -void gtk_wrap_box_set_hspacing (GtkWrapBox *wbox, - guint hspacing); -void gtk_wrap_box_set_vspacing (GtkWrapBox *wbox, - guint vspacing); -void gtk_wrap_box_set_justify (GtkWrapBox *wbox, - GtkJustification justify); -void gtk_wrap_box_set_line_justify (GtkWrapBox *wbox, - GtkJustification line_justify); -void gtk_wrap_box_set_aspect_ratio (GtkWrapBox *wbox, - gfloat aspect_ratio); -void gtk_wrap_box_pack (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill); -void gtk_wrap_box_pack_wrapped (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped); -void gtk_wrap_box_reorder_child (GtkWrapBox *wbox, - GtkWidget *child, - gint position); -void gtk_wrap_box_query_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean *hexpand, - gboolean *hfill, - gboolean *vexpand, - gboolean *vfill, - gboolean *wrapped); -void gtk_wrap_box_set_child_packing (GtkWrapBox *wbox, - GtkWidget *child, - gboolean hexpand, - gboolean hfill, - gboolean vexpand, - gboolean vfill, - gboolean wrapped); -guint* gtk_wrap_box_query_line_lengths (GtkWrapBox *wbox, - guint *n_lines); - - -G_END_DECLS - -#endif /* __GTK_WRAP_BOX_H__ */ diff --git a/app/handle_ops.c b/app/handle_ops.c index 03fe31d92312411b22dc8b7b5bb8708ed3e8c4f8..69a72a9a4086a5f698ef0346f88864352dd28843 100644 --- a/app/handle_ops.c +++ b/app/handle_ops.c @@ -19,12 +19,11 @@ #include "handle_ops.h" #include "handle.h" -#include "color.h" /* This value is best left odd so that the handles are centered. */ #define HANDLE_SIZE 9 -static const Color handle_color[NUM_HANDLE_TYPES<<1] = +static const GdkRGBA handle_color[NUM_HANDLE_TYPES<<1] = { { 0.0, 0.0, 0.5, 1.0 }, /* HANDLE_NON_MOVABLE */ { 0.0, 1.0, 0.0, 1.0 }, /* HANDLE_MAJOR_CONTROL */ @@ -35,7 +34,7 @@ static const Color handle_color[NUM_HANDLE_TYPES<<1] = { 0.7, 0.4, 0.0, 1.0 }, /* HANDLE_MINOR_CONTROL */ }; -static const Color handle_color_connected[NUM_HANDLE_TYPES<<1] = +static const GdkRGBA handle_color_connected[NUM_HANDLE_TYPES<<1] = { { 0.0, 0.0, 0.5, 1.0 }, /* HANDLE_NON_MOVABLE */ { 1.0, 0.0, 0.0, 1.0 }, /* HANDLE_MAJOR_CONTROL */ @@ -47,16 +46,16 @@ static const Color handle_color_connected[NUM_HANDLE_TYPES<<1] = }; void -handle_draw(Handle *handle, DDisplay *ddisp) +handle_draw(Handle *handle, DiaDisplay *ddisp) { gboolean some_selected; int x,y; DiaRenderer *renderer = ddisp->renderer; DiaInteractiveRendererInterface *irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); - const Color *color; + const GdkRGBA *color; - ddisplay_transform_coords(ddisp, handle->pos.x, handle->pos.y, &x, &y); + dia_display_transform_coords(ddisp, handle->pos.x, handle->pos.y, &x, &y); /* change handle color to reflect different behaviour for multiple selected */ /* this code relies on the fact that only selected objects get their handles drawn */ some_selected = g_list_length (ddisp->diagram->data->selected) > 1; @@ -78,7 +77,7 @@ handle_draw(Handle *handle, DDisplay *ddisp) y - HANDLE_SIZE/2 + 1, HANDLE_SIZE-2, HANDLE_SIZE-2, /* it does not change the color, but does not reflect taht in the signature */ - (Color *)color); + (GdkRGBA *)color); irenderer->draw_pixel_rect(renderer, x - HANDLE_SIZE/2, @@ -112,7 +111,7 @@ handle_add_update(Handle *handle, Diagram *dia) /* Call this after diagram_find_closest_handle() */ int -handle_is_clicked(DDisplay *ddisp, Handle *handle, Point *pos) +handle_is_clicked(DiaDisplay *ddisp, Handle *handle, Point *pos) { real dx, dy; int idx, idy; @@ -123,8 +122,8 @@ handle_is_clicked(DDisplay *ddisp, Handle *handle, Point *pos) dx = ABS(handle->pos.x - pos->x); dy = ABS(handle->pos.y - pos->y); - idx = ddisplay_transform_length(ddisp, dx); - idy = ddisplay_transform_length(ddisp, dy); + idx = dia_display_transform_length(ddisp, dx); + idy = dia_display_transform_length(ddisp, dy); return (idx<(HANDLE_SIZE+1)/2) && (idy<(HANDLE_SIZE+1)/2); } diff --git a/app/handle_ops.h b/app/handle_ops.h index 54ffcf02c0463e4743da7cd74852d48599c29255..f71df6a2e2c13c48c6097bd50bd803fe4a4c6202 100644 --- a/app/handle_ops.h +++ b/app/handle_ops.h @@ -21,8 +21,8 @@ #include "diatypes.h" #include "display.h" -void handle_draw(Handle *handle, DDisplay *ddisp); +void handle_draw(Handle *handle, DiaDisplay *ddisp); void handle_add_update(Handle *handle, Diagram *dia); -int handle_is_clicked(DDisplay *ddisp, Handle *handle, Point *pos); +int handle_is_clicked(DiaDisplay *ddisp, Handle *handle, Point *pos); #endif /* HANDLE_OPS_H */ diff --git a/app/highlight.h b/app/highlight.h index 8913de6bbe848d2b8a345e749a26fb221bfc14f7..ac737ff8ee19e6f930aaf57681c3cf382fb3b79c 100644 --- a/app/highlight.h +++ b/app/highlight.h @@ -22,7 +22,6 @@ #include "diatypes.h" #include "diagram.h" -#include "color.h" /* Each object holds the color it is highlighted with. */ diff --git a/app/interface.c b/app/interface.c index 4bf12676b1e1ee9a21428a8ada7cc85c5f89e346..c72528947ec732d55a70753e73fc61374c3d5bf1 100644 --- a/app/interface.c +++ b/app/interface.c @@ -47,8 +47,9 @@ #include #include "dia-app-icons.h" +#include "dia-canvas.h" -static void +void dia_dnd_file_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -56,13 +57,9 @@ dia_dnd_file_drag_data_received (GtkWidget *widget, GtkSelectionData *data, guint info, guint time, - DDisplay *ddisp) + DiaDisplay *ddisp) { -#if GTK_CHECK_VERSION(2,22,0) switch (gdk_drag_context_get_selected_action(context)) -#else - switch (context->action) -#endif { case GDK_ACTION_DEFAULT: case GDK_ACTION_COPY: @@ -102,9 +99,9 @@ dia_dnd_file_drag_data_received (GtkWidget *widget, diagram_update_extents(diagram); layer_dialog_set_diagram(diagram); - if (diagram->displays == NULL) { - new_display(diagram); - } + if (diagram->displays == NULL) { + dia_display_new (diagram); + } } pFrom = strstr(pTo, "file:"); @@ -141,28 +138,28 @@ int is_integrated_ui (void) static void grid_toggle_snap(GtkWidget *widget, gpointer data) { - DDisplay *ddisp = (DDisplay *)data; - ddisplay_set_snap_to_grid(ddisp, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); + DiaDisplay *ddisp = (DiaDisplay *)data; + dia_display_set_snap_to_grid (ddisp, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } static void interface_toggle_mainpoint_magnetism(GtkWidget *widget, gpointer data) { - DDisplay *ddisp = (DDisplay *)data; - ddisplay_set_snap_to_objects(ddisp, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + DiaDisplay *ddisp = (DiaDisplay *)data; + dia_display_set_snap_to_objects (ddisp, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); + dia_display_add_update_all(ddisp); + dia_display_flush(ddisp); } static gint origin_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { - DDisplay *ddisp = (DDisplay *)data; + DiaDisplay *ddisp = (DiaDisplay *)data; display_set_active(ddisp); - ddisplay_popup_menu(ddisp, event); + dia_display_popup_menu (ddisp, event); /* stop the signal emission so the button doesn't grab the * pointer from us */ @@ -174,21 +171,21 @@ origin_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) void view_zoom_set (float factor) { - DDisplay *ddisp; + DiaDisplay *ddisp; real scale; - ddisp = ddisplay_active(); + ddisp = dia_display_active(); if (!ddisp) return; scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM; - ddisplay_zoom_middle(ddisp, scale / ddisp->zoom_factor); + dia_display_zoom_middle(ddisp, scale / ddisp->zoom_factor); } static void zoom_activate_callback(GtkWidget *item, gpointer user_data) { - DDisplay *ddisp = (DDisplay *)user_data; + DiaDisplay *ddisp = (DiaDisplay *)user_data; const gchar *zoom_text = gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(ddisp->zoom_status), "user_data"))); float zoom_amount, magnify; @@ -209,13 +206,13 @@ zoom_activate_callback(GtkWidget *item, gpointer user_data) g_free(zoomamount); magnify = (zoom_amount*DDISPLAY_NORMAL_ZOOM/100.0)/ddisp->zoom_factor; if (fabs(magnify - 1.0) > 0.000001) { - ddisplay_zoom_middle(ddisp, magnify); + dia_display_zoom_middle (ddisp, magnify); } } } static void -zoom_add_zoom_amount(GtkWidget *menu, gchar *text, DDisplay *ddisp) +zoom_add_zoom_amount (GtkWidget *menu, gchar *text, DiaDisplay *ddisp) { GtkWidget *menuitem = gtk_menu_item_new_with_label(text); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); @@ -228,7 +225,7 @@ zoom_add_zoom_amount(GtkWidget *menu, gchar *text, DDisplay *ddisp) static void zoom_popup_menu(GtkWidget *button, GdkEventButton *event, gpointer user_data) { /* display_set_active(ddisp); */ - /* ddisplay_popup_menu(ddisp, event); */ + /* dia_display_popup_menu(ddisp, event); */ GtkMenu *menu = GTK_MENU(user_data); @@ -240,14 +237,14 @@ zoom_popup_menu(GtkWidget *button, GdkEventButton *event, gpointer user_data) { } static GtkWidget* -create_zoom_widget(DDisplay *ddisp) { +create_zoom_widget(DiaDisplay *ddisp) { GtkWidget *combo; GtkWidget *entry; GtkWidget *menu; GtkWidget *button; GtkWidget *arrow; - combo = gtk_hbox_new(FALSE, 0); + combo = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); entry = gtk_entry_new(); g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK(zoom_activate_callback), @@ -258,11 +255,7 @@ create_zoom_widget(DDisplay *ddisp) { gtk_widget_show(entry); button = gtk_button_new(); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); -#endif arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_box_pack_start(GTK_BOX(combo), button, TRUE, TRUE, 0); @@ -287,46 +280,6 @@ create_zoom_widget(DDisplay *ddisp) { return combo; } -static gboolean -display_drop_callback(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time) -{ - if (gtk_drag_get_source_widget(context) != NULL) { - /* we only accept drops from the same instance of the application, - * as the drag data is a pointer in our address space */ - return TRUE; - } - gtk_drag_finish (context, FALSE, FALSE, time); - return FALSE; -} - -static void -display_data_received_callback (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - DDisplay *ddisp) -{ - if (gtk_selection_data_get_format(data) == 8 && - gtk_selection_data_get_length(data) == sizeof(ToolButtonData *) && - gtk_drag_get_source_widget(context) != NULL) { - ToolButtonData *tooldata = *(ToolButtonData **)gtk_selection_data_get_data(data); - /* g_message("Tool drop %s at (%d, %d)", (gchar *)tooldata->extra_data, x, y);*/ - ddisplay_drop_object(ddisp, x, y, - object_get_type((gchar *)tooldata->extra_data), - tooldata->user_data); - - gtk_drag_finish (context, TRUE, FALSE, time); - } else { - dia_dnd_file_drag_data_received (widget, context, x, y, data, info, time, ddisp); - } - /* ensure the right window has the focus for text editing */ - gtk_window_present(GTK_WINDOW(ddisp->shell)); -} - /** * @param button The notebook close button. * @param user_data Container widget (e.g. VBox). @@ -336,126 +289,28 @@ close_notebook_page_callback (GtkButton *button, gpointer user_data) { GtkBox *page = user_data; - DDisplay *ddisp = g_object_get_data (G_OBJECT (page), "DDisplay"); + DiaDisplay *ddisp = g_object_get_data (G_OBJECT (page), DIA_DISPLAY_DATA_HACK); /* When the page widget is destroyed it removes itself from the notebook */ - ddisplay_close (ddisp); -} - -/*! - * Called when the widget's window "size, position or stacking" - * changes. Needs GDK_STRUCTURE_MASK set. - */ -static gboolean -canvas_configure_event (GtkWidget *widget, - GdkEventConfigure *cevent, - DDisplay *ddisp) -{ - gboolean new_size = FALSE; - int width, height; - - g_return_val_if_fail (widget == ddisp->canvas, FALSE); - - - if (ddisp->renderer) { - width = dia_renderer_get_width_pixels (ddisp->renderer); - height = dia_renderer_get_height_pixels (ddisp->renderer); - } else { - /* We can continue even without a renderer here because - * ddisplay_resize_canvas () does the setup for us. - */ - width = height = 0; - } - - /* Only do this when size is really changing */ - if (width != cevent->width || height != cevent->height) { - g_print ("Canvas size change...\n"); - ddisplay_resize_canvas (ddisp, cevent->width, cevent->height); - ddisplay_update_scrollbars(ddisp); - /* on resize stop further propagation - does not help */ - new_size = TRUE; - } - - /* If the UI is not integrated, resizing should set the resized - * window as active. With integrated UI, there is only one window. - */ - if (is_integrated_ui () == 0) - display_set_active(ddisp); - - /* continue propagation with FALSE */ - return new_size; -} - -/* Got when an area previously obscured need to be redrawn. - * Needs GDK_EXPOSURE_MASK. - * Gone with gtk+-3.0 or better replaced by "draw". - */ -static gboolean -canvas_expose_event (GtkWidget *widget, - GdkEventExpose *event, - DDisplay *ddisp) -{ - ddisplay_add_display_area (ddisp, - event->area.x, event->area.y, - event->area.x + event->area.width, - event->area.y + event->area.height); - ddisplay_flush(ddisp); - return FALSE; -} - -static GtkWidget * -create_canvas (DDisplay *ddisp) -{ - GtkWidget *canvas = gtk_drawing_area_new(); - - /* Dia's canvas does it's double buffering alone so switch off GTK's */ - gtk_widget_set_double_buffered (canvas, FALSE); - - gtk_widget_set_events (canvas, - GDK_EXPOSURE_MASK | - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_STRUCTURE_MASK | GDK_ENTER_NOTIFY_MASK | - GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); - g_signal_connect (G_OBJECT (canvas), "configure-event", - G_CALLBACK (canvas_configure_event), ddisp); - g_signal_connect (G_OBJECT (canvas), "expose-event", - G_CALLBACK (canvas_expose_event), ddisp); -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_focus (canvas, TRUE); -#else - GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_FOCUS); -#endif - g_signal_connect (G_OBJECT (canvas), "event", - G_CALLBACK(ddisplay_canvas_events), - ddisp); - - canvas_setup_drag_dest (canvas); - g_signal_connect (G_OBJECT (canvas), "drag_drop", - G_CALLBACK(display_drop_callback), NULL); - g_signal_connect (G_OBJECT (canvas), "drag_data_received", - G_CALLBACK(display_data_received_callback), ddisp); - g_object_set_data (G_OBJECT (canvas), "user_data", (gpointer) ddisp); - - return canvas; + dia_display_close (ddisp); } /* Shared helper functions for both UI cases */ static void -_ddisplay_setup_rulers (DDisplay *ddisp, GtkWidget *shell, GtkWidget *table) +_dia_display_setup_rulers (DiaDisplay *ddisp, GtkWidget *shell, GtkWidget *table) { ddisp->hrule = dia_ruler_new (GTK_ORIENTATION_HORIZONTAL, shell, ddisp); ddisp->vrule = dia_ruler_new (GTK_ORIENTATION_VERTICAL, shell, ddisp); /* harder to change position in the table, but we did not do it for years ;) */ - gtk_table_attach (GTK_TABLE (table), ddisp->hrule, 1, 2, 0, 1, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->vrule, 0, 1, 1, 2, - GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->hrule, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->hrule, 1, 0, 1, 1); + gtk_widget_set_vexpand (ddisp->vrule, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->vrule, 0, 1, 1, 1); } static void -_ddisplay_setup_events (DDisplay *ddisp, GtkWidget *shell) +_dia_display_setup_events (DiaDisplay *ddisp, GtkWidget *shell) { gtk_widget_set_events (shell, GDK_POINTER_MOTION_MASK | @@ -463,51 +318,43 @@ _ddisplay_setup_events (DDisplay *ddisp, GtkWidget *shell) GDK_FOCUS_CHANGE_MASK); g_signal_connect (G_OBJECT (shell), "focus_out_event", - G_CALLBACK (ddisplay_focus_out_event), ddisp); + G_CALLBACK (dia_display_focus_out_event), ddisp); g_signal_connect (G_OBJECT (shell), "focus_in_event", - G_CALLBACK (ddisplay_focus_in_event), ddisp); + G_CALLBACK (dia_display_focus_in_event), ddisp); g_signal_connect (G_OBJECT (shell), "realize", - G_CALLBACK (ddisplay_realize), ddisp); + G_CALLBACK (dia_display_realize), ddisp); g_signal_connect (G_OBJECT (shell), "unrealize", - G_CALLBACK (ddisplay_unrealize), ddisp); + G_CALLBACK (dia_display_unrealize), ddisp); } static void -_ddisplay_setup_scrollbars (DDisplay *ddisp, GtkWidget *table, int width, int height) +_dia_display_setup_scrollbars (DiaDisplay *ddisp, GtkWidget *table, int width, int height) { /* The adjustment datums */ ddisp->hsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, width, 1, (width-1)/4, width-1)); ddisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, (height-1)/4, height-1)); - ddisp->hsb = gtk_hscrollbar_new (ddisp->hsbdata); -#if GTK_CHECK_VERSION(2,18,0) + ddisp->hsb = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, ddisp->hsbdata); gtk_widget_set_can_focus (ddisp->hsb, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (ddisp->hsb, GTK_CAN_FOCUS); -#endif - ddisp->vsb = gtk_vscrollbar_new (ddisp->vsbdata); -#if GTK_CHECK_VERSION(2,18,0) + ddisp->vsb = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, ddisp->vsbdata); gtk_widget_set_can_focus (ddisp->vsb, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS (ddisp->vsb, GTK_CAN_FOCUS); -#endif /* set up the scrollbar observers */ g_signal_connect (G_OBJECT (ddisp->hsbdata), "value_changed", - G_CALLBACK(ddisplay_hsb_update), ddisp); + G_CALLBACK(dia_display_hsb_update), ddisp); g_signal_connect (G_OBJECT (ddisp->vsbdata), "value_changed", - G_CALLBACK(ddisplay_vsb_update), ddisp); + G_CALLBACK(dia_display_vsb_update), ddisp); /* harder to change position in the table, but we did not do it for years ;) */ - gtk_table_attach (GTK_TABLE (table), ddisp->hsb, 0, 2, 2, 3, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->vsb, 2, 3, 0, 2, - GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->hsb, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->hsb, 0, 2, 2, 1); + gtk_widget_set_vexpand (ddisp->vsb, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->vsb, 2, 0, 1, 2); gtk_widget_show (ddisp->hsb); gtk_widget_show (ddisp->vsb); } static void -_ddisplay_setup_navigation (DDisplay *ddisp, GtkWidget *table, gboolean top_left) +_dia_display_setup_navigation (DiaDisplay *ddisp, GtkWidget *table, gboolean top_left) { GtkWidget *navigation_button; @@ -517,13 +364,14 @@ _ddisplay_setup_navigation (DDisplay *ddisp, GtkWidget *table, gboolean top_left _("Pops up the Navigation window.")); gtk_widget_show(navigation_button); + gtk_widget_set_halign (GTK_WIDGET (navigation_button), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (navigation_button), GTK_ALIGN_FILL); + /* harder to change position in the table, but we did not do it for years ;) */ if (top_left) - gtk_table_attach (GTK_TABLE (table), navigation_button, 0, 1, 0, 1, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), navigation_button, 0, 0, 1, 1); else - gtk_table_attach (GTK_TABLE (table), navigation_button, 2, 3, 2, 3, - GTK_FILL, GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), navigation_button, 2, 2, 1, 1); if (!ddisp->origin) ddisp->origin = g_object_ref (navigation_button); } @@ -532,7 +380,7 @@ _ddisplay_setup_navigation (DDisplay *ddisp, GtkWidget *table, gboolean top_left * @param title */ static void -use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) +use_integrated_ui_for_display_shell(DiaDisplay *ddisp, char *title) { GtkWidget *table; GtkWidget *label; /* Text label for the notebook page */ @@ -548,12 +396,12 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) ddisp->shell = GTK_WIDGET (ui.main_window); ddisp->modified_status = GTK_WIDGET (ui.statusbar); - tab_label_container = gtk_hbox_new(FALSE,3); + tab_label_container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); label = gtk_label_new( title ); gtk_box_pack_start( GTK_BOX(tab_label_container), label, FALSE, FALSE, 0 ); gtk_widget_show (label); /* Create a new tab page */ - ddisp->container = gtk_vbox_new(FALSE, 0); + ddisp->container = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); /* */ /* don't allow focus on the close button */ @@ -567,8 +415,8 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) gtk_widget_modify_style (close_button, rcstyle); g_object_unref (rcstyle), - image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, - GTK_ICON_SIZE_MENU); + image = gtk_image_new_from_icon_name ("window-close-symbolic", + GTK_ICON_SIZE_MENU); gtk_container_add (GTK_CONTAINER(close_button), image); g_signal_connect (G_OBJECT (close_button), "clicked", @@ -580,43 +428,37 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) gtk_widget_show (image); /* Set events for new tab page */ - _ddisplay_setup_events (ddisp, ddisp->container); + _dia_display_setup_events (ddisp, ddisp->container); notebook_page_index = gtk_notebook_append_page (GTK_NOTEBOOK(ui.diagram_notebook), ddisp->container, tab_label_container); - g_object_set_data (G_OBJECT (ddisp->container), "DDisplay", ddisp); + g_object_set_data (G_OBJECT (ddisp->container), DIA_DISPLAY_DATA_HACK, ddisp); g_object_set_data (G_OBJECT (ddisp->container), "tab-label", label); - g_object_set_data (G_OBJECT (ddisp->container), "window", ui.main_window); /* the table containing all widgets */ - table = gtk_table_new (3, 3, FALSE); - gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_col_spacing (GTK_TABLE (table), 1, 2); - gtk_table_set_row_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2); - gtk_container_set_border_width (GTK_CONTAINER (table), 2); + table = gtk_grid_new (); - gtk_box_pack_start( GTK_BOX(ddisp->container), table, TRUE, TRUE, 0 ); + gtk_box_pack_start (GTK_BOX (ddisp->container), table, TRUE, TRUE, 0); /* scrollbars, rulers, canvas, menu popup button */ ddisp->origin = NULL; - _ddisplay_setup_rulers (ddisp, ddisp->container, table); + _dia_display_setup_rulers (ddisp, ddisp->container, table); /* Get the width/height of the Notebook child area */ /* TODO: Fix width/height hardcoded values */ width = 100; height = 100; - _ddisplay_setup_scrollbars (ddisp, table, width, height); - _ddisplay_setup_navigation (ddisp, table, TRUE); + _dia_display_setup_scrollbars (ddisp, table, width, height); + _dia_display_setup_navigation (ddisp, table, TRUE); - ddisp->canvas = create_canvas (ddisp); + ddisp->canvas = dia_canvas_new (ddisp); /* place all remaining widgets (no 'origin' anymore, since navigation is top-left */ - gtk_table_attach (GTK_TABLE (table), ddisp->canvas, 1, 2, 1, 2, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_set_hexpand (ddisp->canvas, TRUE); + gtk_widget_set_vexpand (ddisp->canvas, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->canvas, 1, 1, 1, 1); ddisp->common_toolbar = ui.toolbar; /* Stand-alone window menubar */ @@ -651,7 +493,7 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title) * @param use_mbar Flag to indicate whether to add a menubar to the window */ void -create_display_shell(DDisplay *ddisp, +create_display_shell(DiaDisplay *ddisp, int width, int height, char *title, int use_mbar) { @@ -695,23 +537,16 @@ create_display_shell(DDisplay *ddisp, g_object_set_data (G_OBJECT (ddisp->shell), "user_data", (gpointer) ddisp); - _ddisplay_setup_events (ddisp, ddisp->shell); + _dia_display_setup_events (ddisp, ddisp->shell); /* following two not shared with integrated UI */ g_signal_connect (G_OBJECT (ddisp->shell), "delete_event", - G_CALLBACK (ddisplay_delete), ddisp); - g_signal_connect (G_OBJECT (ddisp->shell), "destroy", - G_CALLBACK (ddisplay_destroy), ddisp); + G_CALLBACK (dia_display_delete), ddisp); /* the table containing all widgets */ - table = gtk_table_new (4, 3, FALSE); - gtk_table_set_col_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_col_spacing (GTK_TABLE (table), 1, 2); - gtk_table_set_row_spacing (GTK_TABLE (table), 0, 1); - gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2); - gtk_container_set_border_width (GTK_CONTAINER (table), 2); + table = gtk_grid_new (); if (use_mbar) { - root_vbox = gtk_vbox_new (FALSE, 1); + root_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_add (GTK_CONTAINER (ddisp->shell), root_vbox); gtk_box_pack_end (GTK_BOX (root_vbox), table, TRUE, TRUE, 0); } @@ -724,11 +559,7 @@ create_display_shell(DDisplay *ddisp, /* scrollbars, rulers, canvas, menu popup button */ if (!use_mbar) { ddisp->origin = gtk_button_new(); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_focus (ddisp->origin, FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(ddisp->origin, GTK_CAN_FOCUS); -#endif widget = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(ddisp->origin), widget); gtk_widget_set_tooltip_text(widget, _("Diagram menu.")); @@ -741,18 +572,18 @@ create_display_shell(DDisplay *ddisp, gtk_frame_set_shadow_type (GTK_FRAME (ddisp->origin), GTK_SHADOW_OUT); } - _ddisplay_setup_rulers (ddisp, ddisp->shell, table); - _ddisplay_setup_scrollbars (ddisp, table, width, height); - _ddisplay_setup_navigation (ddisp, table, FALSE); + _dia_display_setup_rulers (ddisp, ddisp->shell, table); + _dia_display_setup_scrollbars (ddisp, table, width, height); + _dia_display_setup_navigation (ddisp, table, FALSE); - ddisp->canvas = create_canvas (ddisp); + ddisp->canvas = dia_canvas_new (ddisp); /* pack all remaining widgets */ - gtk_table_attach (GTK_TABLE (table), ddisp->origin, 0, 1, 0, 1, - GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach (GTK_TABLE (table), ddisp->canvas, 1, 2, 1, 2, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, - GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_grid_attach (GTK_GRID (table), ddisp->origin, 0, 0, 1, 1); + gtk_widget_set_hexpand (ddisp->canvas, TRUE); + gtk_widget_set_vexpand (ddisp->canvas, TRUE); + gtk_grid_attach (GTK_GRID (table), ddisp->canvas, 1, 1, 1, 1); + /* TODO rob use per window accel */ ddisp->accel_group = menus_get_display_accels (); @@ -765,11 +596,11 @@ create_display_shell(DDisplay *ddisp, } /* the statusbars */ - status_hbox = gtk_hbox_new (FALSE, 2); + status_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); /* Zoom status pseudo-optionmenu */ ddisp->zoom_status = create_zoom_widget(ddisp); - zoom_hbox = gtk_hbox_new(FALSE, 0); + zoom_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); zoom_label = gtk_label_new(_("Zoom")); gtk_box_pack_start (GTK_BOX(zoom_hbox), zoom_label, FALSE, FALSE, 0); @@ -807,8 +638,9 @@ create_display_shell(DDisplay *ddisp, gtk_box_pack_start (GTK_BOX (status_hbox), ddisp->modified_status, TRUE, TRUE, 0); - gtk_table_attach (GTK_TABLE (table), status_hbox, 0, 3, 3, 4, - GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_set_halign (GTK_WIDGET (status_hbox), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (status_hbox), GTK_ALIGN_FILL); + gtk_grid_attach (GTK_GRID (table), status_hbox, 0, 3, 3, 1); display_rulers_show (ddisp); gtk_widget_show (ddisp->zoom_status); @@ -827,7 +659,7 @@ create_display_shell(DDisplay *ddisp, gtk_widget_show (ddisp->shell); /* before showing up, checking canvas's REAL size */ - if (use_mbar && ddisp->hrule->allocation.width > width) + if (use_mbar && gtk_widget_get_allocated_width (ddisp->hrule) > width) { /* The menubar is not shrinkable, so the shell will have at least * the menubar's width. If the diagram's requested width is smaller, @@ -836,7 +668,7 @@ create_display_shell(DDisplay *ddisp, * that will be allocated, which the same as the hrule got. */ - width = ddisp->hrule->allocation.width; + width = gtk_widget_get_allocated_width (ddisp->hrule); gtk_adjustment_set_upper (ddisp->hsbdata, width); gtk_adjustment_set_page_increment (ddisp->hsbdata, (width - 1) / 4); @@ -856,7 +688,7 @@ create_display_shell(DDisplay *ddisp, * @param ddisp The display to hide the rulers on. */ void -ddisplay_update_rulers (DDisplay *ddisp, +dia_display_update_rulers (DiaDisplay *ddisp, const Rectangle *extents, const Rectangle *visible) { @@ -1001,8 +833,7 @@ create_integrated_ui (void) G_CALLBACK (toolbox_destroy), window); - main_vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), main_vbox); gtk_widget_show (main_vbox); @@ -1010,7 +841,7 @@ create_integrated_ui (void) statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (main_vbox), statusbar, FALSE, TRUE, 0); /* HBox for everything below the menubar and toolbars */ - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_end (GTK_BOX (main_vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); @@ -1025,7 +856,7 @@ create_integrated_ui (void) gtk_widget_show (notebook); /* Toolbox widget */ - wrapbox = toolbox_create(); + wrapbox = dia_toolbox_new(); gtk_box_pack_start (GTK_BOX (hbox), wrapbox, FALSE, TRUE, 0); g_signal_connect (G_OBJECT (wrapbox), "drag_data_received", @@ -1099,11 +930,10 @@ create_toolbox () g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (toolbox_destroy), window); - main_vbox = gtk_vbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), main_vbox); - wrapbox = toolbox_create(); + wrapbox = dia_toolbox_new(); gtk_box_pack_end (GTK_BOX (main_vbox), wrapbox, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (wrapbox), "drag_data_received", G_CALLBACK (dia_dnd_file_drag_data_received), @@ -1154,11 +984,7 @@ integrated_ui_toolbar_is_showing (void) { if (ui.toolbar) { -#if GTK_CHECK_VERSION(2,20,0) return gtk_widget_get_visible (GTK_WIDGET (ui.toolbar))? TRUE : FALSE; -#else - return GTK_WIDGET_VISIBLE (ui.toolbar)? TRUE : FALSE; -#endif } return FALSE; } @@ -1187,11 +1013,7 @@ integrated_ui_layer_view_is_showing (void) { if (ui.layer_view) { -#if GTK_CHECK_VERSION(2,20,0) return gtk_widget_get_visible (GTK_WIDGET (ui.layer_view))? TRUE : FALSE; -#else - return GTK_WIDGET_VISIBLE (ui.layer_view)? TRUE : FALSE; -#endif } return FALSE; } diff --git a/app/interface.h b/app/interface.h index 9e9b9c0adbe58a8e2ef8ec9f7dca3b20df2b1b53..64655d7d64ac01944a31fef0259f4b978b4d466d 100644 --- a/app/interface.h +++ b/app/interface.h @@ -38,7 +38,7 @@ void integrated_ui_layer_view_show (gboolean show); int is_integrated_ui (void); -void create_display_shell(DDisplay *ddisp, +void create_display_shell(DiaDisplay *ddisp, int width, int height, char *title, int use_mbar); @@ -55,8 +55,15 @@ extern GtkWidget *modify_tool_button; void view_zoom_set (float zoom_factor); /* zoom_factor is 10 * percentage */ -void fill_sheet_menu(void); - void close_notebook_page_callback (GtkButton *button, gpointer user_data); +void dia_dnd_file_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time, + DiaDisplay *ddisp); + #endif /* INTERFACE_H */ diff --git a/app/layer_dialog.c b/app/layer_dialog.c index 70e1384a56a8aea368abc149ee60541fdd9cb0dc..37bf4b408052b4a7f817575a30f544dcf07032a4 100644 --- a/app/layer_dialog.c +++ b/app/layer_dialog.c @@ -29,7 +29,6 @@ #include #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkListItem, gtk_list_new, ... */ #include #include "intl.h" @@ -56,7 +55,7 @@ typedef struct _EditLayerDialog EditLayerDialog; struct _DiaLayerWidget { - GtkListItem list_item; + GtkListBoxRow parent; Diagram *dia; Layer *layer; @@ -86,14 +85,13 @@ struct _EditLayerDialog { struct _DiaLayerWidgetClass { - GtkListItemClass parent_class; + GtkListBoxRowClass parent_class; }; GType dia_layer_widget_get_type(void); struct LayerDialog { GtkWidget *dialog; - GtkWidget *diagram_omenu; GtkWidget *layer_list; @@ -163,11 +161,11 @@ static void layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata); static void layer_dialog_edit_layer(DiaLayerWidget *layer_widget, Diagram *dia, Layer *layer); static ButtonData buttons[] = { - { GTK_STOCK_ADD, layer_dialog_new_callback, N_("New Layer") }, - { GTK_STOCK_EDIT, layer_dialog_rename_callback, N_("Rename Layer") }, - { GTK_STOCK_GO_UP, layer_dialog_raise_callback, N_("Raise Layer") }, - { GTK_STOCK_GO_DOWN, layer_dialog_lower_callback, N_("Lower Layer") }, - { GTK_STOCK_DELETE, layer_dialog_delete_callback, N_("Delete Layer") }, + { "list-add-symbolic", layer_dialog_new_callback, N_("New Layer") }, + { "document-edit-symbolic", layer_dialog_rename_callback, N_("Rename Layer") }, + { "go-up-symbolic", layer_dialog_raise_callback, N_("Raise Layer") }, + { "go-down-symbolic", layer_dialog_lower_callback, N_("Lower Layer") }, + { "list-remove-symbolic", layer_dialog_delete_callback, N_("Delete Layer") }, }; enum { @@ -187,31 +185,19 @@ static int num_buttons = sizeof(buttons)/sizeof(ButtonData); #define INSENSITIVE 2 static GtkWidget * -create_button_box(GtkWidget *parent, gboolean show_labels) +create_button_box(GtkWidget *parent) { GtkWidget *button; GtkWidget *button_box; int i; - button_box = gtk_hbox_new (TRUE, 1); + button_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + gtk_box_set_homogeneous (GTK_BOX (button_box), TRUE); for (i=0;itype) { @@ -247,10 +233,10 @@ layer_list_events (GtkWidget *widget, case GDK_KEY_PRESS: kevent = (GdkEventKey *) event; switch (kevent->keyval) { - case GDK_Up: + case GDK_KEY_Up: /* printf ("up arrow\n"); */ break; - case GDK_Down: + case GDK_KEY_Down: /* printf ("down arrow\n"); */ break; default: @@ -300,16 +286,14 @@ GtkWidget * create_layer_view_widget (void) layer_dialog->diagram = NULL; - layer_dialog->dialog = vbox = gtk_vbox_new (FALSE, 1); + layer_dialog->dialog = vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); - hbox = gtk_hbox_new (FALSE, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); label = gtk_label_new (_ ("Layers:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); gtk_widget_show (label); - layer_dialog->diagram_omenu = NULL; - /* Hide Button */ hide_button = gtk_button_new (); gtk_button_set_relief (GTK_BUTTON (hide_button), GTK_RELIEF_NONE); @@ -321,8 +305,8 @@ GtkWidget * create_layer_view_widget (void) gtk_widget_modify_style (hide_button, rcstyle); g_object_unref (rcstyle); - image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, - GTK_ICON_SIZE_MENU); + image = gtk_image_new_from_icon_name ("window-close-symbolic", + GTK_ICON_SIZE_MENU); gtk_container_add (GTK_CONTAINER(hide_button), image); g_signal_connect (G_OBJECT (hide_button), "clicked", @@ -333,7 +317,7 @@ GtkWidget * create_layer_view_widget (void) gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 2); gtk_widget_show_all (hbox); - button_box = create_button_box(vbox, FALSE); + button_box = create_button_box(vbox); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); @@ -348,9 +332,9 @@ GtkWidget * create_layer_view_widget (void) GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 2); - layer_dialog->layer_list = list = gtk_list_new(); + layer_dialog->layer_list = list = gtk_list_box_new(); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_BROWSE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); @@ -395,19 +379,12 @@ layer_dialog_create(void) vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - hbox = gtk_hbox_new(FALSE, 1); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); label = gtk_label_new(_("Diagram:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); gtk_widget_show (label); - layer_dialog->diagram_omenu = omenu = gtk_option_menu_new(); - gtk_box_pack_start(GTK_BOX(hbox), omenu, TRUE, TRUE, 2); - gtk_widget_show (omenu); - - menu = gtk_menu_new(); - gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); gtk_widget_show (hbox); @@ -421,9 +398,9 @@ layer_dialog_create(void) GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 2); - layer_dialog->layer_list = list = gtk_list_new(); + layer_dialog->layer_list = list = gtk_list_box_new(); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_BROWSE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); @@ -433,7 +410,7 @@ layer_dialog_create(void) g_signal_connect (G_OBJECT (list), "event", G_CALLBACK (layer_list_events), NULL); - button_box = create_button_box(dialog, TRUE); + button_box = create_button_box(dialog); gtk_box_pack_start (GTK_BOX (vbox), button_box, FALSE, FALSE, 2); gtk_widget_show (button_box); @@ -442,7 +419,7 @@ layer_dialog_create(void) gtk_dialog_get_action_area (GTK_DIALOG(dialog))), 2); - button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); + button = gtk_button_new_with_label (_("Close")); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG(dialog))), button, TRUE, TRUE, 0); g_signal_connect_swapped(G_OBJECT (button), "clicked", @@ -515,9 +492,9 @@ layer_dialog_new_callback(GtkWidget *widget, gpointer gdata) next_layer_num++); layer = new_layer(new_layer_name, dia->data); - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + assert(gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); data_add_layer_at(dia->data, layer, dia->data->layers->len - pos); @@ -529,9 +506,9 @@ layer_dialog_new_callback(GtkWidget *widget, gpointer gdata) list = g_list_prepend(list, layer_widget); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), list, pos); + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), layer_widget, pos); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), GTK_LIST_BOX_ROW (selected)); undo_layer(dia, layer, TYPE_ADD_LAYER, dia->data->layers->len - pos); undo_set_transactionpoint(dia->undo); @@ -545,7 +522,7 @@ layer_dialog_rename_callback(GtkWidget *widget, gpointer gdata) Diagram *dia; Layer *layer; dia = layer_dialog->diagram; - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); layer = dia->data->active_layer; layer_dialog_edit_layer (DIA_LAYER_WIDGET (selected), dia, layer); } @@ -561,8 +538,8 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); layer = dia->data->active_layer; @@ -570,7 +547,7 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) diagram_add_update_all(dia); diagram_flush(dia); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); gtk_container_remove(GTK_CONTAINER(layer_dialog->layer_list), selected); undo_layer(dia, layer, TYPE_DELETE_LAYER, @@ -580,7 +557,7 @@ layer_dialog_delete_callback(GtkWidget *widget, gpointer gdata) if (--pos<0) pos = 0; - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), GTK_LIST_BOX_ROW (selected)); } } @@ -596,28 +573,25 @@ layer_dialog_raise_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); if (pos > 0) { layer = DIA_LAYER_WIDGET(selected)->layer; data_raise_layer(dia->data, layer); - list = g_list_prepend(list, selected); - g_object_ref(selected); - gtk_list_remove_items(GTK_LIST(layer_dialog->layer_list), - list); + gtk_container_remove (GTK_CONTAINER (layer_dialog->layer_list), selected); + + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), + selected, pos - 1); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), - list, pos - 1); - g_object_unref(selected); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos-1); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), selected); diagram_add_update_all(dia); diagram_flush(dia); @@ -641,28 +615,25 @@ layer_dialog_lower_callback(GtkWidget *widget, gpointer gdata) dia = layer_dialog->diagram; if ((dia != NULL) && (dia->data->layers->len>1)) { - assert(GTK_LIST(layer_dialog->layer_list)->selection != NULL); - selected = GTK_LIST(layer_dialog->layer_list)->selection->data; + assert (gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)) != NULL); + selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (layer_dialog->layer_list)); - pos = gtk_list_child_position(GTK_LIST(layer_dialog->layer_list), selected); + pos = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (selected)); if (pos < dia->data->layers->len-1) { layer = DIA_LAYER_WIDGET(selected)->layer; data_lower_layer(dia->data, layer); - list = g_list_prepend(list, selected); - g_object_ref(selected); - gtk_list_remove_items(GTK_LIST(layer_dialog->layer_list), - list); + gtk_container_remove (GTK_CONTAINER (layer_dialog->layer_list), selected); - gtk_list_insert_items(GTK_LIST(layer_dialog->layer_list), - list, pos + 1); + gtk_list_box_insert (GTK_LIST_BOX (layer_dialog->layer_list), + selected, pos + 1); g_object_unref(selected); - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), pos+1); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), selected); diagram_add_update_all(dia); diagram_flush(dia); @@ -701,66 +672,6 @@ layer_dialog_update_diagram_list(void) layer_dialog_create(); } g_assert(layer_dialog != NULL); /* must be valid now */ - /* oh this options: here integrated UI ;( */ - if (!layer_dialog->diagram_omenu) - return; - - new_menu = gtk_menu_new(); - - current_nr = -1; - - i = 0; - dia_list = dia_open_diagrams(); - while (dia_list != NULL) { - dia = (Diagram *) dia_list->data; - - if (dia == layer_dialog->diagram) { - current_nr = i; - } - - filename = strrchr(dia->filename, G_DIR_SEPARATOR); - if (filename==NULL) { - filename = dia->filename; - } else { - filename++; - } - - menu_item = gtk_menu_item_new_with_label(filename); - - g_signal_connect (G_OBJECT (menu_item), "activate", - G_CALLBACK (layer_dialog_select_diagram_callback), dia); - - gtk_menu_append( GTK_MENU(new_menu), menu_item); - gtk_widget_show (menu_item); - - dia_list = g_list_next(dia_list); - i++; - } - - if (dia_open_diagrams()==NULL) { - menu_item = gtk_menu_item_new_with_label (_("none")); - g_signal_connect (G_OBJECT (menu_item), "activate", - G_CALLBACK (layer_dialog_select_diagram_callback), NULL); - gtk_menu_append( GTK_MENU(new_menu), menu_item); - gtk_widget_show (menu_item); - } - - gtk_option_menu_remove_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu)); - - gtk_option_menu_set_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - new_menu); - - gtk_option_menu_set_history(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - current_nr); - gtk_menu_set_active(GTK_MENU(new_menu), current_nr); - - if (current_nr == -1) { - dia = NULL; - if (dia_open_diagrams()!=NULL) { - dia = (Diagram *) dia_open_diagrams()->data; - } - layer_dialog_set_diagram(dia); - } } void @@ -786,6 +697,8 @@ _layer_widget_clear_layer (GtkWidget *widget, gpointer user_data) { DiaLayerWidget *lw = DIA_LAYER_WIDGET(widget); lw->layer = NULL; + + gtk_container_remove (GTK_WIDGET (user_data), widget); } void @@ -806,15 +719,8 @@ layer_dialog_set_diagram(Diagram *dia) g_assert(layer_dialog != NULL); /* must be valid now */ gtk_container_foreach (GTK_CONTAINER(layer_dialog->layer_list), - _layer_widget_clear_layer, NULL); - gtk_list_clear_items(GTK_LIST(layer_dialog->layer_list), 0, -1); + _layer_widget_clear_layer, layer_dialog->layer_list); layer_dialog->diagram = dia; - if (dia != NULL) { - i = g_list_index(dia_open_diagrams(), dia); - if (i >= 0 && layer_dialog->diagram_omenu != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(layer_dialog->diagram_omenu), - i); - } if (dia != NULL) { data = dia->data; @@ -828,7 +734,8 @@ layer_dialog_set_diagram(Diagram *dia) if (layer==active_layer) sel_pos = j; } - gtk_list_select_item(GTK_LIST(layer_dialog->layer_list), sel_pos); + gtk_list_box_select_row (GTK_LIST_BOX (layer_dialog->layer_list), + gtk_list_box_get_row_at_index (GTK_LIST_BOX (layer_dialog->layer_list), sel_pos)); } } @@ -855,7 +762,7 @@ dia_layer_widget_unrealize(GtkWidget *widget) lw->edit_dialog = NULL; } - (* GTK_WIDGET_CLASS (gtk_type_class(gtk_list_item_get_type ()))->unrealize) (widget); + (* GTK_WIDGET_CLASS (g_type_class_peek(GTK_TYPE_LIST_BOX_ROW))->unrealize) (widget); } static void @@ -890,7 +797,7 @@ dia_layer_widget_exclusive_connectable(DiaLayerWidget *layer_widget) } /* Now, toggle the connectability for all layers except the specified one */ - list = GTK_LIST(layer_dialog->layer_list)->children; + list = gtk_container_get_children (GTK_CONTAINER (layer_dialog->layer_list)); while (list) { lw = DIA_LAYER_WIDGET(list->data); if (lw != layer_widget) @@ -976,7 +883,7 @@ dia_layer_widget_init(DiaLayerWidget *lw) GtkWidget *connectable; GtkWidget *label; - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); lw->dia = NULL; lw->layer = NULL; @@ -1022,10 +929,12 @@ dia_layer_widget_init(DiaLayerWidget *lw) gtk_container_add(GTK_CONTAINER(lw), hbox); - g_signal_connect (G_OBJECT (lw), "select", + + /* TODO: Fix layer switching */ + /*g_signal_connect (G_OBJECT (lw), "select" G_CALLBACK (dia_layer_select_callback), NULL); g_signal_connect (G_OBJECT (lw), "deselect", - G_CALLBACK (dia_layer_deselect_callback), NULL); + G_CALLBACK (dia_layer_deselect_callback), NULL);*/ } GType @@ -1046,7 +955,7 @@ dia_layer_widget_get_type(void) (GInstanceInitFunc)dia_layer_widget_init, }; - dlw_type = g_type_register_static (gtk_list_item_get_type (), + dlw_type = g_type_register_static (GTK_TYPE_LIST_BOX_ROW, "DiaLayerWidget", &dlw_info, 0); } @@ -1059,7 +968,7 @@ dia_layer_widget_new(Diagram *dia, Layer *layer) { GtkWidget *widget; - widget = GTK_WIDGET ( gtk_type_new (dia_layer_widget_get_type ())); + widget = GTK_WIDGET ( g_object_new (dia_layer_widget_get_type (), NULL)); dia_layer_set_layer(DIA_LAYER_WIDGET(widget), dia, layer); /* These may get toggled when the button is set without the widget being @@ -1131,7 +1040,7 @@ static void edit_layer_add_ok_callback (GtkWidget *w, gpointer client_data) { EditLayerDialog *dialog = (EditLayerDialog *) client_data; - Diagram *dia = ddisplay_active_diagram(); + Diagram *dia = dia_display_active_diagram(); Layer *layer; int pos = data_layer_get_index (dia->data, dia->data->active_layer) + 1; @@ -1158,7 +1067,7 @@ static void edit_layer_rename_ok_callback (GtkWidget *w, gpointer client_data) { EditLayerDialog *dialog = (EditLayerDialog *) client_data; - Diagram *dia = ddisplay_active_diagram(); + Diagram *dia = dia_display_active_diagram(); Layer *layer = dia->data->active_layer; g_free (layer->name); @@ -1224,19 +1133,19 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye /* handle the wm close signal */ g_signal_connect (G_OBJECT (dialog->dialog), "delete_event", - G_CALLBACK (edit_layer_delete_callback), - dialog); + G_CALLBACK (edit_layer_delete_callback), + dialog); g_signal_connect (G_OBJECT (dialog->dialog), "destroy", - G_CALLBACK (gtk_widget_destroy), - &dialog->dialog); + G_CALLBACK (gtk_widget_destroy), + &dialog->dialog); /* the main vbox */ - vbox = gtk_vbox_new (FALSE, 1); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog->dialog))), vbox, TRUE, TRUE, 0); /* the name entry hbox, label and entry */ - hbox = gtk_hbox_new (FALSE, 1); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new (_("Layer name:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); @@ -1257,12 +1166,8 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye gtk_widget_show (dialog->name_entry); gtk_widget_show (hbox); - button = gtk_button_new_from_stock (GTK_STOCK_OK); -#if GTK_CHECK_VERSION(2,18,0) + button = gtk_button_new_with_label (_("Okay")); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); if (layer_widget) @@ -1278,12 +1183,8 @@ layer_dialog_edit_layer (DiaLayerWidget *layer_widget, Diagram *dia, Layer *laye gtk_widget_grab_default (button); gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); -#if GTK_CHECK_VERSION(2,18,0) + button = gtk_button_new_with_label (_("Cancel")); gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog->dialog))), button, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (button), "clicked", diff --git a/app/linewidth_area.c b/app/linewidth_area.c deleted file mode 100644 index 6baf0ea40a6c4c7ec3f3e021d585a3db97bb36a6..0000000000000000000000000000000000000000 --- a/app/linewidth_area.c +++ /dev/null @@ -1,283 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "linewidth_area.h" -#include "attributes.h" -#include "persistence.h" -#include "intl.h" - -#if !defined(rint) -# include -# define rint(x) floor ((x) + 0.5) -#endif - -#define BASE_WIDTH 0.05 -#define PIXELS_BETWEEN_LINES 6 -#define NUMLINES 5 - -#define X_OFFSET(i) (PIXELS_BETWEEN_LINES*(i)+((i)-1)*(i)/2) - -#define AREA_WIDTH X_OFFSET(NUMLINES+1) -#define AREA_HEIGHT 42 - -static void linewidth_create_dialog(GtkWindow *toplevel); - -static int active_linewidth = 2; -static GdkGC *linewidth_area_gc = NULL; -static GdkPixmap *linewidth_area_pixmap = NULL; - -static GtkWidget *linewidth_area_widget = NULL; -static GtkWidget *linewidth_dialog = NULL; -static GtkWidget *linewidth_button = NULL; - -static int -linewidth_area_target (int x, int y) -{ - int i; - int x_offs; - for (i=1;i<=NUMLINES;i++) { - x_offs = X_OFFSET(i); - if ((x>=x_offs-PIXELS_BETWEEN_LINES/2) && - (xbg[GTK_STATE_NORMAL]); - win_fg = &(style->fg[GTK_STATE_NORMAL]); - - gdk_gc_set_foreground (linewidth_area_gc, win_bg); - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 1, - 0, 0, width, height); - - gdk_gc_set_foreground (linewidth_area_gc, win_fg); - - for (i=0;i<=NUMLINES;i++) { - x_offs = X_OFFSET(i); - - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 1, - x_offs, 2, i, height-4); - - } - - if (active_linewidth != 0) { - gdk_draw_rectangle (linewidth_area_pixmap, linewidth_area_gc, 0, - X_OFFSET(active_linewidth)-2, 0, - active_linewidth+4, height-1); - } - - gdk_draw_drawable (gtk_widget_get_window(linewidth_area), linewidth_area_gc, linewidth_area_pixmap, - 0, 0, 0, 0, width, height); -} - -static gint -linewidth_area_events (GtkWidget *widget, - GdkEvent *event) -{ - GdkEventButton *bevent; - GdkEventConfigure *cevent; - int target; - - switch (event->type) - { - case GDK_CONFIGURE: - cevent = (GdkEventConfigure *) event; - if (cevent->width > 1) { - linewidth_area_pixmap = gdk_pixmap_new (gtk_widget_get_window(widget), - cevent->width, - cevent->height, -1); - } - break; - case GDK_EXPOSE: - linewidth_area_draw (linewidth_area_widget); - break; - - case GDK_BUTTON_PRESS: - bevent = (GdkEventButton *) event; - if (bevent->button == 1) { - target = linewidth_area_target (bevent->x, bevent->y); - - if (target != 0) { - active_linewidth = target; - linewidth_area_draw(linewidth_area_widget); - attributes_set_default_linewidth(BASE_WIDTH*(target-1)); - } - } - break; - - case GDK_2BUTTON_PRESS: - if (linewidth_dialog == NULL) - linewidth_create_dialog(GTK_WINDOW (gtk_widget_get_toplevel (widget))); - else - gtk_widget_grab_focus(linewidth_button); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(linewidth_button), attributes_get_default_linewidth()); - - gtk_widget_show(linewidth_dialog); - break; - - default: - break; - } - - return FALSE; -} - - -static int -linewidth_number_from_width(real width) -{ - if (fabs(width/BASE_WIDTH-rint(width/BASE_WIDTH)) > 0.0005 || - (width/BASE_WIDTH > NUMLINES)) { - return 0; - } else { - return width/BASE_WIDTH+1.0005; - } -} - -GtkWidget * -linewidth_area_create (void) -{ - GtkWidget *linewidth_area; - GtkWidget *event_box; - - attributes_set_default_linewidth(persistence_register_real("linewidth", 0.1)); - active_linewidth = linewidth_number_from_width(attributes_get_default_linewidth()); - - event_box = gtk_event_box_new(); - linewidth_area = gtk_drawing_area_new (); - gtk_widget_set_size_request (linewidth_area, AREA_WIDTH, AREA_HEIGHT); - gtk_widget_set_events (linewidth_area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect (G_OBJECT (linewidth_area), "event", - G_CALLBACK(linewidth_area_events), - NULL); - - linewidth_area_widget = linewidth_area; - - gtk_container_add(GTK_CONTAINER(event_box), linewidth_area); - gtk_widget_show(linewidth_area); - return event_box; -} - -static void -get_current_line_width() -{ - float newvalue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (linewidth_button)); - active_linewidth = linewidth_number_from_width(newvalue); - linewidth_area_draw(GTK_WIDGET(linewidth_area_widget)); - attributes_set_default_linewidth(newvalue); -} - -static void -linewidth_dialog_respond(GtkWidget *widget, gint response_id, gpointer data) -{ - if (response_id == GTK_RESPONSE_OK) { - get_current_line_width(); - } - gtk_widget_hide(linewidth_dialog); -} - -static void -linewidth_dialog_ok(GtkWidget *widget, gpointer data) -{ - gtk_dialog_response(GTK_DIALOG(linewidth_dialog), GTK_RESPONSE_OK); -} - -/* Crashes with gtk_widget_destroyed, so use this instead */ -static void -dialog_destroyed(GtkWidget *widget, gpointer data) -{ - GtkWidget **wid = (GtkWidget**)data; - if (wid) *wid = NULL; -} - -static void -linewidth_create_dialog(GtkWindow *toplevel) -{ - GtkWidget *hbox; - GtkWidget *label; - GtkAdjustment *adj; - - linewidth_dialog = gtk_dialog_new_with_buttons( - _("Line width"), toplevel, - 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG(linewidth_dialog), GTK_RESPONSE_OK); - gtk_window_set_role (GTK_WINDOW (linewidth_dialog), "linewidth_window"); - gtk_window_set_resizable (GTK_WINDOW (linewidth_dialog), TRUE); - gtk_container_set_border_width (GTK_CONTAINER (linewidth_dialog), 2); - - hbox = gtk_hbox_new(FALSE, 5); - label = gtk_label_new(_("Line width:")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); - gtk_widget_show (label); - adj = (GtkAdjustment *) gtk_adjustment_new(0.1, 0.00, 10.0, 0.01, 0.05, 0.0); - linewidth_button = gtk_spin_button_new(adj, attributes_get_default_linewidth(), 2); - gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(linewidth_button), TRUE); - gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(linewidth_button), TRUE); - gtk_box_pack_start(GTK_BOX (hbox), linewidth_button, TRUE, TRUE, 0); - gtk_widget_show (linewidth_button); - gtk_widget_show(hbox); - gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG (linewidth_dialog))), hbox, TRUE, TRUE, 0); - - gtk_widget_show (linewidth_button); - - g_signal_connect(G_OBJECT (linewidth_dialog), "response", - G_CALLBACK (linewidth_dialog_respond), NULL); - g_signal_connect_after(G_OBJECT (linewidth_button), "activate", - G_CALLBACK (linewidth_dialog_ok), NULL); - - g_signal_connect (G_OBJECT (linewidth_dialog), "delete_event", - G_CALLBACK(gtk_widget_hide), NULL); - g_signal_connect (G_OBJECT (linewidth_dialog), "destroy", - G_CALLBACK(dialog_destroyed), &linewidth_dialog); - - persistence_register_window (GTK_WINDOW (linewidth_dialog)); -} diff --git a/app/load_save.c b/app/load_save.c index a41e0280958aca8d694ede5447c5758343a49810..1f23219f678a0631df4baded1c1d2c0e611867e0 100644 --- a/app/load_save.c +++ b/app/load_save.c @@ -19,7 +19,6 @@ /* so we get fdopen declared even when compiling with -ansi */ #define _POSIX_C_SOURCE 200809L -#define _BSD_SOURCE 1 /* to get the prototype for fchmod() */ #include #ifdef HAVE_UNISTD_H #include @@ -950,7 +949,7 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx) if (g_slist_length(diagram->displays) == 1) { xmlNodePtr dispinfo; /* store some display attributes */ - DDisplay *ddisp = diagram->displays->data; + DiaDisplay *ddisp = diagram->displays->data; attr = new_attribute((ObjectNode)tree, "display"); dispinfo = data_add_composite(attr, "display", ctx); @@ -1234,50 +1233,29 @@ diagram_autosave(Diagram *dia) Diagram *diagram; while (diagrams != NULL) { diagram = (Diagram *)diagrams->data; - if (diagram == dia && - diagram_is_modified(diagram) && - !diagram->autosaved) { - save_filename = g_strdup_printf("%s.autosave", dia->filename); + if (diagram == dia && + diagram_is_modified(diagram) && + !diagram->autosaved) { + AutoSaveInfo *asi = g_new (AutoSaveInfo, 1); + GError *error = NULL; + save_filename = g_strdup_printf("%s.autosave", dia->filename); + if (dia->autosavefilename != NULL) - g_free(dia->autosavefilename); - dia->autosavefilename = save_filename; -#ifdef G_THREADS_ENABLED - if (g_thread_supported ()) { - AutoSaveInfo *asi = g_new (AutoSaveInfo, 1); - GError *error = NULL; + g_free(dia->autosavefilename); - asi->clone = diagram_data_clone (dia->data); - asi->filename = g_strdup (save_filename); - asi->ctx = dia_context_new (_("Auto save")); - -#if GLIB_CHECK_VERSION(2,32,0) - if (!g_thread_try_new ("Autosave", _autosave_in_thread, asi, &error)) { -#else - if (!g_thread_create (_autosave_in_thread, asi, FALSE, &error)) { -#endif - message_error ("%s", error->message); - g_error_free (error); - } - /* FIXME: need better synchronization */ - dia->autosaved = TRUE; - } else { - /* no extra threads supported, stay in this one */ - DiaContext *ctx = dia_context_new (_("Auto save")); - dia_context_set_filename (ctx, save_filename); - diagram_data_raw_save(dia->data, save_filename, ctx); - dia->autosaved = TRUE; - dia_context_release (ctx); - } -#else - { - DiaContext *ctx = dia_context_new (_("Auto save")); - dia_context_set_filename (ctx, save_filename); - diagram_data_raw_save(dia->data, save_filename, ctx); - dia->autosaved = TRUE; - dia_context_release (ctx); + dia->autosavefilename = save_filename; + + asi->clone = diagram_data_clone (dia->data); + asi->filename = g_strdup (save_filename); + asi->ctx = dia_context_new (_("Auto save")); + + if (!g_thread_try_new ("Autosave", _autosave_in_thread, asi, &error)) { + message_error ("%s", error->message); + g_error_free (error); } -#endif + /* FIXME: need better synchronization */ + dia->autosaved = TRUE; return; } diagrams = g_list_next(diagrams); diff --git a/app/makefile.mingw b/app/makefile.mingw index dfd4db7e7036d7dd4638a3d5e5f79f0c8b929abe..0fb9d49ff2777872bddd68677343b6b10e9b225e 100644 --- a/app/makefile.mingw +++ b/app/makefile.mingw @@ -8,18 +8,16 @@ PRJ_TOP = .. PACKAGE = dia include $(TOP)/glib/build/win32/make.mingw -LIBART = $(TOP)/libart_lgpl - # -DHAVE_LIBPNG PKG_CFLAGS = -DHAVE_CONFIG_H \ -fno-exceptions \ -I.. $(GLIB_CFLAGS) $(GTK2_CFLAGS) \ $(LIBXML2_CFLAGS) $(PNG_CFLAGS) \ - -I$(PRJ_TOP)/lib -I$(LIBART)/.. -DHAVE_LIBART + -I$(PRJ_TOP)/lib PKG_LINK = $(GLIB_LIBS) $(GTK2_LIBS) $(PANGO_LIBS) \ $(LIBXML2_LIBS) $(PNG_LIBS) \ - -L $(PRJ_TOP)/lib -llibdia -L $(LIBART) -llibart \ + -L $(PRJ_TOP)/lib -llibdia \ OBJECTS = \ autosave.o \ @@ -70,9 +68,6 @@ OBJECTS = \ properties-dialog.o \ recent_files.o \ render_eps.o \ - render_gdk.o \ - render_libart.o \ - render_pixmap.o \ scroll_tool.o \ select.o \ sheets.o \ diff --git a/app/makefile.msc b/app/makefile.msc index 50d5c0db504ded2bb0d0b13871363e262e64ea7e..496cd0290b2141224dabde1b9be66bb5e9f8c7dc 100644 --- a/app/makefile.msc +++ b/app/makefile.msc @@ -15,7 +15,7 @@ DEFINES = \ -DWIN32 \ -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED \ -PKG_LINK = $(GTK2_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(PANGOWIN32_LIBS) $(PANGOCAIRO_LIBS) \ +PKG_LINK = $(GTK2_LIBS) $(GLIB_LIBS) $(GTHREAD_LIBS) $(PANGOWIN32_LIBS) \ $(LIBXML2_LIBS) \ $(PRJ_TOP)\lib\libdia.lib $(CAIRO_LIBS) \ $(GDK_PIXBUF_LIBS) $(INTL_LIBS) \ diff --git a/app/menus.c b/app/menus.c index b39bb73da07050d2a6bbed02ab5621fdf64458a6..fb573b7d48ba144254730fc0cefa79a779c03564 100644 --- a/app/menus.c +++ b/app/menus.c @@ -27,7 +27,7 @@ #include "intl.h" #include "menus.h" -#include "tool.h" +#include "tools/tool.h" #include "commands.h" #include "message.h" #include "interface.h" @@ -46,16 +46,6 @@ #include "toolbox.h" #include "diagram_tree.h" -#define DIA_STOCK_GROUP "dia-stock-group" -#define DIA_STOCK_UNGROUP "dia-stock-ungroup" -#define DIA_STOCK_LAYER_ADD "dia-stock-layer-add" -#define DIA_STOCK_LAYER_RENAME "dia-stock-layer-rename" -#define DIA_STOCK_OBJECTS_LAYER_ABOVE "dia-stock-objects-layer-above" -#define DIA_STOCK_OBJECTS_LAYER_BELOW "dia-stock-objects-layer-below" -#define DIA_STOCK_LAYERS "dia-stock-layers" - -#define DIA_SHOW_TEAROFFS TRUE - /* Integrated UI Toolbar Constants */ #define DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO "dia-integrated-toolbar-zoom-combo_entry" #define DIA_INTEGRATED_TOOLBAR_SNAP_GRID "dia-integrated-toolbar-snap-grid" @@ -70,8 +60,6 @@ create_integrated_ui_toolbar (void); static void add_plugin_actions (GtkUIManager *ui_manager, const char *base_path); -gchar *build_ui_filename (const gchar* name); - /* Active/inactive state is set in diagram_update_menu_sensitivity() * in diagram.c */ @@ -89,19 +77,19 @@ gchar *build_ui_filename (const gchar* name); static const GtkActionEntry common_entries[] = { { "File", NULL, N_("_File"), NULL, NULL, NULL }, - { "FileNew", GTK_STOCK_NEW, NULL, FIRST_MODIFIER "N", N_("Create a new diagram"), G_CALLBACK (file_new_callback) }, - { "FileOpen", GTK_STOCK_OPEN, N_("_Open\342\200\246"),FIRST_MODIFIER "O", N_("Open a diagram file"), G_CALLBACK (file_open_callback) }, - { "FileQuit", GTK_STOCK_QUIT, NULL, FIRST_MODIFIER "Q", N_("Quit Dia"), G_CALLBACK (file_quit_callback) }, + { "FileNew", NULL, N_("New"), FIRST_MODIFIER "N", N_("Create a new diagram"), G_CALLBACK (file_new_callback) }, + { "FileOpen", NULL, N_("_Open\342\200\246"),FIRST_MODIFIER "O", N_("Open a diagram file"), G_CALLBACK (file_open_callback) }, + { "FileQuit", NULL, N_("Quit"), FIRST_MODIFIER "Q", N_("Quit Dia"), G_CALLBACK (file_quit_callback) }, { "Help", NULL, N_("_Help"), NULL, NULL, NULL }, - { "HelpContents", GTK_STOCK_HELP, NULL, "F1", N_("Dia help"), G_CALLBACK (help_manual_callback) }, - { "HelpAbout", GTK_STOCK_ABOUT, NULL, NULL, N_("Dia version, authors, license"), G_CALLBACK (help_about_callback) } + { "HelpContents", NULL, N_("Help"), "F1", N_("Dia help"), G_CALLBACK (help_manual_callback) }, + { "HelpAbout", NULL, N_("About Dia"), NULL, N_("Dia version, authors, license"), G_CALLBACK (help_about_callback) } }; /* Actions for toolbox menu */ static const GtkActionEntry toolbox_entries[] = { { "FileSheets", NULL, N_("Sheets and Objects\342\200\246"), "F9", N_("Manage sheets and their objects"), G_CALLBACK (sheets_dialog_show_callback) }, - { "FilePrefs", GTK_STOCK_PREFERENCES, NULL, NULL, N_("Dia preferences"), G_CALLBACK (file_preferences_callback) }, + { "FilePrefs", NULL, N_("Preferences"), NULL, N_("Dia preferences"), G_CALLBACK (file_preferences_callback) }, { "FilePlugins", NULL, N_("Plugins\342\200\246"), NULL, N_("Manage plug-ins"), G_CALLBACK (file_plugins_callback) }, { "FileTree", NULL, N_("_Diagram Tree"), "F8", N_("Tree representation of diagrams"), G_CALLBACK (diagram_tree_show) } }; @@ -116,26 +104,26 @@ static const GtkToggleActionEntry integrated_ui_view_toggle_entries[] = /* Actions for diagram window */ static const GtkActionEntry display_entries[] = { - { "FileSave", GTK_STOCK_SAVE, NULL, FIRST_MODIFIER "S", N_("Save the diagram"), G_CALLBACK (file_save_callback) }, - { "FileSaveas", GTK_STOCK_SAVE_AS, N_("Save _As\342\200\246"), FIRST_MODIFIER "S", N_("Save the diagram with a new name"), G_CALLBACK (file_save_as_callback) }, - { "FileExport", GTK_STOCK_CONVERT, N_("_Export\342\200\246"), NULL, N_("Export the diagram"), G_CALLBACK (file_export_callback) }, - { "DiagramProperties", GTK_STOCK_PROPERTIES, N_("_Diagram Properties"), "Return", N_("Modify diagram properties (grid, background)"), G_CALLBACK (view_diagram_properties_callback) }, + { "FileSave", NULL, N_("Save"), FIRST_MODIFIER "S", N_("Save the diagram"), G_CALLBACK (file_save_callback) }, + { "FileSaveas", NULL, N_("Save _As\342\200\246"), FIRST_MODIFIER "S", N_("Save the diagram with a new name"), G_CALLBACK (file_save_as_callback) }, + { "FileExport", NULL, N_("_Export\342\200\246"), NULL, N_("Export the diagram"), G_CALLBACK (file_export_callback) }, + { "DiagramProperties", NULL, N_("_Diagram Properties"), "Return", N_("Modify diagram properties (grid, background)"), G_CALLBACK (view_diagram_properties_callback) }, { "FilePagesetup", NULL, N_("Page Set_up\342\200\246"), NULL, N_("Modify the diagram pagination"), G_CALLBACK (file_pagesetup_callback) }, - { "FilePrint", GTK_STOCK_PRINT, N_("_Print\342\200\246"), FIRST_MODIFIER "P", N_("Print the diagram"), G_CALLBACK (file_print_callback) }, - { "FileClose", GTK_STOCK_CLOSE, NULL, FIRST_MODIFIER "W", N_("Close the diagram"), G_CALLBACK (file_close_callback) }, + { "FilePrint", NULL, N_("_Print\342\200\246"), FIRST_MODIFIER "P", N_("Print the diagram"), G_CALLBACK (file_print_callback) }, + { "FileClose", NULL, N_("Close"), FIRST_MODIFIER "W", N_("Close the diagram"), G_CALLBACK (file_close_callback) }, { "Edit", NULL, N_("_Edit"), NULL, NULL, NULL }, - { "EditUndo", GTK_STOCK_UNDO, NULL, FIRST_MODIFIER "Z", N_("Undo"), G_CALLBACK (edit_undo_callback) }, - { "EditRedo", GTK_STOCK_REDO, NULL, FIRST_MODIFIER "Z", N_("Redo"), G_CALLBACK (edit_redo_callback) }, + { "EditUndo", NULL, N_("Undo"), FIRST_MODIFIER "Z", N_("Undo"), G_CALLBACK (edit_undo_callback) }, + { "EditRedo", NULL, N_("Redo"), FIRST_MODIFIER "Z", N_("Redo"), G_CALLBACK (edit_redo_callback) }, - { "EditCopy", GTK_STOCK_COPY, NULL, FIRST_MODIFIER "C", N_("Copy selection"), G_CALLBACK (edit_copy_callback) }, - { "EditCut", GTK_STOCK_CUT, NULL, FIRST_MODIFIER "X", N_("Cut selection"), G_CALLBACK (edit_cut_callback) }, - { "EditPaste", GTK_STOCK_PASTE, NULL, FIRST_MODIFIER "V", N_("Paste selection"), G_CALLBACK (edit_paste_callback) }, + { "EditCopy", NULL, N_("Copy"), FIRST_MODIFIER "C", N_("Copy selection"), G_CALLBACK (edit_copy_callback) }, + { "EditCut", NULL, N_("Cut"), FIRST_MODIFIER "X", N_("Cut selection"), G_CALLBACK (edit_cut_callback) }, + { "EditPaste", NULL, N_("Paste"), FIRST_MODIFIER "V", N_("Paste selection"), G_CALLBACK (edit_paste_callback) }, { "EditDuplicate", NULL, N_("_Duplicate"), FIRST_MODIFIER "D", N_("Duplicate selection"), G_CALLBACK (edit_duplicate_callback) }, - { "EditDelete", GTK_STOCK_DELETE, NULL, "Delete", N_("Delete selection"), G_CALLBACK (edit_delete_callback) }, + { "EditDelete", NULL, N_("Delete"), "Delete", N_("Delete selection"), G_CALLBACK (edit_delete_callback) }, - { "EditFind", GTK_STOCK_FIND, N_("_Find\342\200\246"), FIRST_MODIFIER "F", N_("Search for text"), G_CALLBACK (edit_find_callback) }, - { "EditReplace", GTK_STOCK_FIND_AND_REPLACE, N_("_Replace\342\200\246"), FIRST_MODIFIER "H", N_("Search and replace text"), G_CALLBACK (edit_replace_callback) }, + { "EditFind", NULL, N_("_Find\342\200\246"), FIRST_MODIFIER "F", N_("Search for text"), G_CALLBACK (edit_find_callback) }, + { "EditReplace", NULL, N_("_Replace\342\200\246"), FIRST_MODIFIER "H", N_("Search and replace text"), G_CALLBACK (edit_replace_callback) }, /* the following used to bind to C which collides with Unicode input. * doesn't work either */ @@ -146,14 +134,14 @@ static const GtkActionEntry display_entries[] = { "EditPasteImage", NULL, N_("Paste _Image"), FIRST_MODIFIER "V", N_("Insert image from clipboard"), G_CALLBACK (edit_paste_image_callback) }, { "Layers", NULL, N_("_Layers"), NULL, NULL, NULL }, - { "LayerAdd", DIA_STOCK_LAYER_ADD, N_("Add Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_add_layer_callback) }, - { "LayerRename", DIA_STOCK_LAYER_RENAME, N_("Rename Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_rename_layer_callback) }, - { "ObjectsLayerAbove", DIA_STOCK_OBJECTS_LAYER_ABOVE, N_("Move Selection to Layer above"), NULL, NULL, G_CALLBACK (objects_move_up_layer) }, - { "ObjectsLayerBelow", DIA_STOCK_OBJECTS_LAYER_BELOW, N_("Move Selection to Layer below"), NULL, NULL, G_CALLBACK (objects_move_down_layer) }, - { "DiagramLayers", DIA_STOCK_LAYERS, N_("_Layers\342\200\246"), FIRST_MODIFIER "L", NULL, G_CALLBACK (dialogs_layers_callback) }, + { "LayerAdd", NULL, N_("Add Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_add_layer_callback) }, + { "LayerRename", NULL, N_("Rename Layer\342\200\246"), NULL, NULL, G_CALLBACK (layers_rename_layer_callback) }, + { "ObjectsLayerAbove", NULL, N_("Move Selection to Layer above"), NULL, NULL, G_CALLBACK (objects_move_up_layer) }, + { "ObjectsLayerBelow", NULL, N_("Move Selection to Layer below"), NULL, NULL, G_CALLBACK (objects_move_down_layer) }, + { "DiagramLayers", NULL, N_("_Layers\342\200\246"), FIRST_MODIFIER "L", NULL, G_CALLBACK (dialogs_layers_callback) }, { "View", NULL, N_("_View"), NULL, NULL, NULL }, - { "ViewZoomin", GTK_STOCK_ZOOM_IN, NULL, FIRST_MODIFIER "plus", N_("Zoom in"), G_CALLBACK (view_zoom_in_callback) }, - { "ViewZoomout", GTK_STOCK_ZOOM_OUT, NULL, FIRST_MODIFIER "minus", N_("Zoom out"), G_CALLBACK (view_zoom_out_callback) }, + { "ViewZoomin", NULL, N_("Zoom In"), FIRST_MODIFIER "plus", N_("Zoom in"), G_CALLBACK (view_zoom_in_callback) }, + { "ViewZoomout", NULL, N_("Zoom Out"), FIRST_MODIFIER "minus", N_("Zoom out"), G_CALLBACK (view_zoom_out_callback) }, { "ViewZoom", NULL, N_("_Zoom"), NULL, NULL, NULL }, { "ViewZoom16000", NULL, N_("1600%"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom8000", NULL, N_("800%"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, @@ -161,39 +149,39 @@ static const GtkActionEntry display_entries[] = { "ViewZoom2830", NULL, N_("283"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom2000", NULL, N_("200"), "2", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom1410", NULL, N_("141"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, - { "ViewZoom1000", GTK_STOCK_ZOOM_100, NULL, "1", NULL, G_CALLBACK (view_zoom_set_callback) }, + { "ViewZoom1000", NULL, N_("Normal Size"), "1", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom850", NULL, N_("85"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom707", NULL, N_("70.7"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom500", NULL, N_("50"), "5", NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom354", NULL, N_("35.4"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, { "ViewZoom250", NULL, N_("25"), NULL, NULL, G_CALLBACK (view_zoom_set_callback) }, /* Show All, Best Fit. Same as the Gimp, Ctrl+E */ - { "ViewShowall", GTK_STOCK_ZOOM_FIT, NULL, FIRST_MODIFIER "E", N_("Zoom fit"), G_CALLBACK (view_show_all_callback) }, + { "ViewShowall", NULL, N_("Best Fit"), FIRST_MODIFIER "E", N_("Zoom fit"), G_CALLBACK (view_show_all_callback) }, /* "display_toggle_entries" items go here */ { "ViewNewview", NULL, N_("New _View"), NULL, NULL, G_CALLBACK (view_new_view_callback) }, { "ViewCloneview", NULL, N_("C_lone View"), NULL, NULL, G_CALLBACK (view_clone_view_callback) }, - { "ViewRedraw", GTK_STOCK_REFRESH, NULL, NULL, NULL, G_CALLBACK (view_redraw_callback) }, + { "ViewRedraw", NULL, N_("Refresh"), NULL, NULL, G_CALLBACK (view_redraw_callback) }, { "Objects", NULL, N_("_Objects"), NULL, NULL }, - { "ObjectsSendtoback", GTK_STOCK_GOTO_BOTTOM, N_("Send to _Back"), FIRST_MODIFIER "B", N_("Move selection to the bottom"), G_CALLBACK (objects_place_under_callback) }, - { "ObjectsBringtofront", GTK_STOCK_GOTO_TOP, N_("Bring to _Front"), FIRST_MODIFIER "F", N_("Move selection to the top"), G_CALLBACK (objects_place_over_callback) }, - { "ObjectsSendbackwards", GTK_STOCK_GO_DOWN, N_("Send Backwards"), NULL, NULL, G_CALLBACK (objects_place_down_callback) }, - { "ObjectsBringforwards", GTK_STOCK_GO_UP, N_("Bring Forwards"), NULL, NULL, G_CALLBACK (objects_place_up_callback) }, + { "ObjectsSendtoback", NULL, N_("Send to _Back"), FIRST_MODIFIER "B", N_("Move selection to the bottom"), G_CALLBACK (objects_place_under_callback) }, + { "ObjectsBringtofront", NULL, N_("Bring to _Front"), FIRST_MODIFIER "F", N_("Move selection to the top"), G_CALLBACK (objects_place_over_callback) }, + { "ObjectsSendbackwards", NULL, N_("Send Backwards"), NULL, NULL, G_CALLBACK (objects_place_down_callback) }, + { "ObjectsBringforwards", NULL, N_("Bring Forwards"), NULL, NULL, G_CALLBACK (objects_place_up_callback) }, - { "ObjectsGroup", DIA_STOCK_GROUP, N_("_Group"), FIRST_MODIFIER "G", N_("Group selected objects"), G_CALLBACK (objects_group_callback) }, + { "ObjectsGroup", NULL, N_("_Group"), FIRST_MODIFIER "G", N_("Group selected objects"), G_CALLBACK (objects_group_callback) }, /* deliberately not using Ctrl+U for Ungroup */ - { "ObjectsUngroup", DIA_STOCK_UNGROUP, N_("_Ungroup"), FIRST_MODIFIER "G", N_("Ungroup selected groups"), G_CALLBACK (objects_ungroup_callback) }, + { "ObjectsUngroup", NULL, N_("_Ungroup"), FIRST_MODIFIER "G", N_("Ungroup selected groups"), G_CALLBACK (objects_ungroup_callback) }, { "ObjectsParent", NULL, N_("_Parent"), FIRST_MODIFIER "K", NULL, G_CALLBACK (objects_parent_callback) }, { "ObjectsUnparent", NULL, N_("_Unparent"), FIRST_MODIFIER "K", NULL, G_CALLBACK (objects_unparent_callback) }, { "ObjectsUnparentchildren", NULL, N_("_Unparent Children"), NULL, NULL, G_CALLBACK (objects_unparent_children_callback) }, { "ObjectsAlign", NULL, N_("Align"), NULL, NULL, NULL }, - { "ObjectsAlignLeft", GTK_STOCK_JUSTIFY_LEFT, NULL, "L", NULL, G_CALLBACK (objects_align_h_callback) }, - { "ObjectsAlignCenter", GTK_STOCK_JUSTIFY_CENTER, NULL, "C", NULL, G_CALLBACK (objects_align_h_callback) }, - { "ObjectsAlignRight", GTK_STOCK_JUSTIFY_RIGHT, NULL, "R", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignLeft", NULL, N_("Left"), "L", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignCenter", NULL, N_("Center"), "C", NULL, G_CALLBACK (objects_align_h_callback) }, + { "ObjectsAlignRight", NULL, N_("Right"), "R", NULL, G_CALLBACK (objects_align_h_callback) }, { "ObjectsAlignTop", NULL, N_("Top"), "T", NULL, G_CALLBACK (objects_align_v_callback) }, { "ObjectsAlignMiddle", NULL, N_("Middle"), "M", NULL, G_CALLBACK (objects_align_v_callback) }, @@ -205,7 +193,7 @@ static const GtkActionEntry display_entries[] = { "ObjectsAlignStacked", NULL, N_("Stacked"), "S", NULL, G_CALLBACK (objects_align_v_callback) }, { "ObjectsAlignConnected", NULL, N_("Connected"), "O", NULL, G_CALLBACK (objects_align_connected_callback) }, - { "ObjectsProperties", GTK_STOCK_PROPERTIES, NULL, "Return", NULL, G_CALLBACK (dialogs_properties_callback) }, + { "ObjectsProperties", NULL, N_("Properties"), "Return", NULL, G_CALLBACK (dialogs_properties_callback) }, { "Select", NULL, N_("_Select"), NULL, NULL, NULL }, { "SelectAll", NULL, N_("All"), FIRST_MODIFIER "A", NULL, G_CALLBACK (select_all_callback) }, @@ -255,7 +243,7 @@ static const GtkActionEntry tool_entries[] = /* Toggle-Actions for diagram window */ static const GtkToggleActionEntry display_toggle_entries[] = { - { "ViewFullscreen", GTK_STOCK_FULLSCREEN, NULL, "F11", NULL, G_CALLBACK (view_fullscreen_callback) }, + { "ViewFullscreen", NULL, N_("Fullscreen"), "F11", NULL, G_CALLBACK (view_fullscreen_callback) }, { "ViewAntialiased", NULL, N_("_Antialiased"), NULL, NULL, G_CALLBACK (view_aa_callback) }, { "ViewShowgrid", NULL, N_("Show _Grid"), NULL, NULL, G_CALLBACK (view_visible_grid_callback) }, { "ViewSnaptogrid", NULL, N_("_Snap to Grid"), NULL, NULL, G_CALLBACK (view_snap_to_grid_callback) }, @@ -354,18 +342,6 @@ load_accels(void) g_free(accelfilename); } } -static gint -save_accels(gpointer data) -{ - gchar *accelfilename; - - accelfilename = dia_config_filename("menurc"); - if (accelfilename) { - gtk_accel_map_save (accelfilename); - g_free (accelfilename); - } - return TRUE; -} /** * Synchronized the Object snap property button with the display. @@ -374,7 +350,7 @@ save_accels(gpointer data) void integrated_ui_toolbar_object_snap_synchronize_to_display(gpointer param) { - DDisplay *ddisp = param; + DiaDisplay *ddisp = param; if (ddisp && ddisp->common_toolbar) { GtkToggleButton *b = g_object_get_data (G_OBJECT (ddisp->common_toolbar), @@ -392,10 +368,10 @@ integrated_ui_toolbar_object_snap_synchronize_to_display(gpointer param) static void integrated_ui_toolbar_object_snap_toggle(GtkToggleButton *b, gpointer *not_used) { - DDisplay *ddisp = ddisplay_active (); + DiaDisplay *ddisp = dia_display_active (); if (ddisp) { - ddisplay_set_snap_to_objects (ddisp, gtk_toggle_button_get_active (b)); + dia_display_set_snap_to_objects (ddisp, gtk_toggle_button_get_active (b)); } } @@ -406,7 +382,7 @@ integrated_ui_toolbar_object_snap_toggle(GtkToggleButton *b, gpointer *not_used) void integrated_ui_toolbar_grid_snap_synchronize_to_display(gpointer param) { - DDisplay *ddisp = param; + DiaDisplay *ddisp = param; if (ddisp && ddisp->common_toolbar) { GtkToggleButton *b = g_object_get_data (G_OBJECT (ddisp->common_toolbar), @@ -424,10 +400,10 @@ integrated_ui_toolbar_grid_snap_synchronize_to_display(gpointer param) static void integrated_ui_toolbar_grid_snap_toggle(GtkToggleButton *b, gpointer *not_used) { - DDisplay *ddisp = ddisplay_active (); + DiaDisplay *ddisp = dia_display_active (); if (ddisp) { - ddisplay_set_snap_to_grid (ddisp, gtk_toggle_button_get_active (b)); + dia_display_set_snap_to_grid (ddisp, gtk_toggle_button_get_active (b)); } } @@ -464,7 +440,7 @@ static void integrated_ui_toolbar_add_custom_item (GtkToolbar *toolbar, GtkWidge GtkWidget *c; /* container */ tool_item = gtk_tool_item_new (); - c = gtk_vbox_new (FALSE, 0); + c = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (tool_item), c); gtk_box_set_homogeneous (GTK_BOX (c), TRUE); /* Centers the button */ gtk_box_pack_start (GTK_BOX (c), w, FALSE, FALSE, 0); @@ -500,11 +476,7 @@ integrated_ui_toolbar_zoom_combo_selection_changed (GtkComboBox *combo, { float zoom_percent; gchar * text; -#if GTK_CHECK_VERSION(2,24,0) - text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (combo)); -#else - text = gtk_combo_box_get_active_text (combo); -#endif + text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT (combo)); if (sscanf (text, "%f", &zoom_percent) == 1) { view_zoom_set (zoom_percent * 10.0); @@ -581,18 +553,13 @@ create_integrated_ui_toolbar (void) g_free (uifile); /* Zoom Combo Box Entry */ -#if GTK_CHECK_VERSION(2,24,0) w = gtk_combo_box_text_new_with_entry (); -#else - w = gtk_combo_box_entry_new_text (); -#endif g_object_set_data (G_OBJECT (toolbar), DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO, w); integrated_ui_toolbar_add_custom_item (toolbar, w); -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), ZOOM_FIT); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("800%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("400%")); @@ -604,19 +571,6 @@ create_integrated_ui_toolbar (void) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("50%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("25%")); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (w), _("10%")); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (w), ZOOM_FIT); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("800%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("400%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("300%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("200%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("150%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("100%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("75%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("50%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("25%")); - gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("10%")); -#endif g_signal_connect (G_OBJECT (w), "changed", @@ -672,7 +626,6 @@ create_integrated_ui_toolbar (void) static GtkActionGroup * create_or_ref_tool_actions (void) { - GtkIconFactory *icon_factory; GtkActionGroup *actions; GtkAction *action; int i; @@ -684,36 +637,23 @@ create_or_ref_tool_actions (void) gtk_action_group_set_translation_domain (actions, NULL); gtk_action_group_set_translate_func (actions, _dia_translate, NULL, NULL); - gtk_action_group_add_actions (actions, tool_entries, - G_N_ELEMENTS (tool_entries), NULL); - - icon_factory = gtk_icon_factory_new (); + gtk_action_group_add_actions (actions, + tool_entries, + G_N_ELEMENTS (tool_entries), NULL); for (i = 0; i < num_tools; i++) { action = gtk_action_group_get_action (actions, tool_data[i].action_name); if (action != NULL) { g_signal_connect (G_OBJECT (action), "activate", - G_CALLBACK (tool_menu_select), - &tool_data[i].callback_data); + G_CALLBACK (tool_menu_select), + &tool_data[i].callback_data); gtk_action_set_tooltip (action, tool_data[i].tool_desc); - - { - GdkPixbuf *pb = tool_get_pixbuf (&tool_data[i]); - GtkIconSet *is = gtk_icon_set_new_from_pixbuf (pb); - - /* not sure if the action name is unique enough */ - gtk_icon_factory_add (icon_factory, tool_data[i].action_name, is); - gtk_action_set_stock_id (action, tool_data[i].action_name); - - g_object_unref (pb); - } } else { g_warning ("couldn't find tool menu item %s", tool_data[i].action_name); } } - gtk_icon_factory_add_default (icon_factory); return actions; } @@ -786,63 +726,6 @@ add_plugin_actions (GtkUIManager *ui_manager, const gchar *base_path) } } -static void -_add_stock_icon (GtkIconFactory *factory, const char *name, const guint8 *data, const size_t size) -{ - GdkPixbuf *pixbuf; - GtkIconSet *set; - GError *err = NULL; - - pixbuf = gdk_pixbuf_new_from_inline (size, data, FALSE, &err); - if (err) { - g_warning ("%s", err->message); - g_error_free (err); - err = NULL; - } - set = gtk_icon_set_new_from_pixbuf (pixbuf); - gtk_icon_factory_add (factory, name, set); - g_object_unref (pixbuf); - pixbuf = NULL; -} - -static void -register_stock_icons (void) -{ - GtkIconFactory *factory; - - factory = gtk_icon_factory_new (); - - _add_stock_icon (factory, DIA_STOCK_GROUP, dia_group_icon, sizeof(dia_group_icon)); - _add_stock_icon (factory, DIA_STOCK_UNGROUP, dia_ungroup_icon, sizeof(dia_ungroup_icon)); - - _add_stock_icon (factory, DIA_STOCK_LAYER_ADD, dia_layer_add, sizeof(dia_layer_add)); - _add_stock_icon (factory, DIA_STOCK_LAYER_RENAME, dia_layer_rename, sizeof(dia_layer_rename)); - _add_stock_icon (factory, DIA_STOCK_OBJECTS_LAYER_ABOVE, dia_objects_layer_above, sizeof(dia_objects_layer_above)); - _add_stock_icon (factory, DIA_STOCK_OBJECTS_LAYER_BELOW, dia_objects_layer_below, sizeof(dia_objects_layer_below)); - _add_stock_icon (factory, DIA_STOCK_LAYERS, dia_layers, sizeof(dia_layers)); - - gtk_icon_factory_add_default (factory); - g_object_unref (factory); - factory = NULL; -} - -gchar* -build_ui_filename (const gchar* name) -{ - gchar* uifile; - - if (g_getenv ("DIA_BASE_PATH") != NULL) { - /* a small hack cause the final destination and the local path differ */ - const gchar* p = strrchr (name, '/'); - if (p != NULL) - name = p+1; - uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); - } else - uifile = dia_get_data_directory (name); - - return uifile; -} - /*! * Not sure why this service is not provided by GTK+. * We are passing tooltips into the actions (especially recent file menu). @@ -934,8 +817,6 @@ _setup_global_actions (void) g_return_if_fail (_ui_manager == NULL); g_return_if_fail (toolbox_actions == NULL); - register_stock_icons (); - /* for the toolbox menu */ toolbox_actions = gtk_action_group_new ("toolbox-actions"); gtk_action_group_set_translation_domain (toolbox_actions, NULL); @@ -959,7 +840,6 @@ _setup_global_actions (void) G_CALLBACK (_action_done), NULL); - gtk_ui_manager_set_add_tearoffs (_ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (_ui_manager, toolbox_actions, 0); tool_actions = create_or_ref_tool_actions (); @@ -993,7 +873,6 @@ menus_init(void) "connect_proxy", G_CALLBACK (_ui_manager_connect_proxy), NULL); - gtk_ui_manager_set_add_tearoffs (display_ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (display_ui_manager, display_actions, 0); gtk_ui_manager_insert_action_group (display_ui_manager, tool_actions, 0); if (!gtk_ui_manager_add_ui_from_string (display_ui_manager, ui_info, -1, &error)) { @@ -1022,11 +901,6 @@ menus_init(void) /* after creating all menu items */ load_accels (); -#if GTK_CHECK_VERSION(2,24,0) - g_print ("TODO: Check accels being saved ..."); -#else - gtk_quit_add(1, save_accels, NULL); -#endif } void @@ -1125,7 +999,6 @@ menus_create_display_menubar (GtkUIManager **ui_manager, tool_actions = create_or_ref_tool_actions (); *ui_manager = gtk_ui_manager_new (); - gtk_ui_manager_set_add_tearoffs (*ui_manager, DIA_SHOW_TEAROFFS); gtk_ui_manager_insert_action_group (*ui_manager, *actions, 0); gtk_ui_manager_insert_action_group (*ui_manager, tool_actions, 0); g_object_unref (G_OBJECT (tool_actions)); @@ -1277,12 +1150,12 @@ plugin_callback (GtkWidget *widget, gpointer data) } /* and finally invoke it */ if (cbf->callback) { - DDisplay *ddisp = NULL; + DiaDisplay *ddisp = NULL; DiagramData* diadata = NULL; ObjectChange *change; /* stuff from the toolbox menu should never get a diagram to modify */ if (strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU)) != 0) { - ddisp = ddisplay_active(); + ddisp = dia_display_active(); diadata = ddisp ? ddisp->diagram->data : NULL; } change = cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data); diff --git a/app/navigation.c b/app/navigation.c index 704bb8b83704cccacfc0da1efe0c77cb81f4f1f4..a9d76b6e0fbc875911701d1095f5c6bde923d19e 100644 --- a/app/navigation.c +++ b/app/navigation.c @@ -26,7 +26,7 @@ #include "diagram.h" #include "display.h" -#include "diagdkrenderer.h" +#include "renderer/diacairo.h" #include "navigation.h" @@ -48,7 +48,6 @@ struct _NavigationWindow /*miniframe*/ int frame_w; int frame_h; - GdkGC * gc; GdkCursor * cursor; /*factors to translate thumbnail coordinates to adjustement values*/ @@ -56,10 +55,10 @@ struct _NavigationWindow gdouble vadj_coef; /*diagram thumbnail's buffer*/ - GdkPixmap * buffer; + cairo_surface_t *surface; /*display to navigate*/ - DDisplay * ddisp; + DiaDisplay * ddisp; }; typedef struct _NavigationWindow NavigationWindow; @@ -78,7 +77,7 @@ static void on_button_navigation_popup_released (GtkButton * button, gpointer un static void reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page); -static gboolean on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused); +static gboolean on_da_draw (GtkWidget * widget, cairo_t *ctx); static gboolean on_da_motion_notify_event (GtkWidget * widget, GdkEventMotion * event, gpointer unused); static gboolean on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer popup_window); @@ -100,17 +99,15 @@ static char * nav_xpm[] = { }; GtkWidget * -navigation_popup_new (DDisplay *ddisp) +navigation_popup_new (DiaDisplay *ddisp) { GtkWidget * button; GtkWidget * image; - GdkPixmap * pixmap; - GdkBitmap * mask = NULL; + GdkPixbuf * pixbuf; GtkStyle * style; button = gtk_button_new (); - gtk_container_set_border_width (GTK_CONTAINER (button), 0); gtk_button_set_relief (GTK_BUTTON(button), GTK_RELIEF_NONE); g_signal_connect (G_OBJECT (button), "pressed", G_CALLBACK (on_button_navigation_popup_pressed), ddisp); @@ -119,15 +116,10 @@ navigation_popup_new (DDisplay *ddisp) G_CALLBACK (on_button_navigation_popup_released), NULL); style = gtk_widget_get_style (button); - pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(button), - &mask, - &(style->bg[GTK_STATE_NORMAL]), - nav_xpm); + pixbuf = gdk_pixbuf_new_from_xpm_data (nav_xpm); - image = gtk_image_new_from_pixmap (pixmap, mask); - g_object_unref(pixmap); - g_object_unref(mask); + image = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref(pixbuf); gtk_container_add (GTK_CONTAINER (button), image); gtk_widget_show(image); @@ -150,11 +142,11 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) Rectangle rect;/*diagram's extents*/ real zoom;/*zoom factor for thumbnail rendering*/ - GtkStyle *style; + DiaCairoRenderer *renderer; memset (nav, 0, sizeof(NavigationWindow)); /*--Retrieve the diagram's data*/ - nav->ddisp = (DDisplay *) _ddisp; + nav->ddisp = (DiaDisplay *) _ddisp; data = nav->ddisp->diagram->data; /*--Calculate sizes*/ @@ -177,14 +169,14 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) nav->height = MIN( nav->max_size, (rect.bottom - rect.top) * zoom); /*size: display canvas <--> frame cursor*/ - diagram_width = (int) ddisplay_transform_length (nav->ddisp, (rect.right - rect.left)); - diagram_height = (int) ddisplay_transform_length (nav->ddisp, (rect.bottom - rect.top)); + diagram_width = (int) dia_display_transform_length (nav->ddisp, (rect.right - rect.left)); + diagram_height = (int) dia_display_transform_length (nav->ddisp, (rect.bottom - rect.top)); if (diagram_width * diagram_height == 0) return; /* don't crash with no size, i.e. empty diagram */ - canvas_width = nav->ddisp->canvas->allocation.width; - canvas_height = nav->ddisp->canvas->allocation.height; + canvas_width = gtk_widget_get_allocated_width (nav->ddisp->canvas); + canvas_height = gtk_widget_get_allocated_height (nav->ddisp->canvas); nav->frame_w = nav->width * canvas_width / diagram_width; nav->frame_h = nav->height * canvas_height / diagram_height; @@ -194,11 +186,11 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) /*and store the ratio thumbnail/adjustement(speedup on motion)*/ adj = nav->ddisp->hsbdata; reset_sc_adj (adj, rect.left, rect.right, canvas_width / nav->ddisp->zoom_factor); - nav->hadj_coef = (adj->upper - adj->page_size - adj->lower) / (nav->width - nav->frame_w); + nav->hadj_coef = (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj) - gtk_adjustment_get_lower (adj)) / (nav->width - nav->frame_w); adj = nav->ddisp->vsbdata; reset_sc_adj (adj, rect.top, rect.bottom, canvas_height / nav->ddisp->zoom_factor); - nav->vadj_coef = (adj->upper - adj->page_size - adj->lower) / (nav->height - nav->frame_h); + nav->vadj_coef = (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj) - gtk_adjustment_get_lower (adj)) / (nav->height - nav->frame_h); } /*--GUI*/ @@ -220,8 +212,8 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) | GDK_BUTTON_RELEASE_MASK ); - g_signal_connect (G_OBJECT (drawing_area), "expose_event", - G_CALLBACK (on_da_expose_event), NULL); + g_signal_connect (G_OBJECT (drawing_area), "draw", + G_CALLBACK (on_da_draw), NULL); g_signal_connect (G_OBJECT (drawing_area), "motion_notify_event", G_CALLBACK (on_da_motion_notify_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "button_release_event", @@ -234,24 +226,20 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) gtk_widget_show (frame); gtk_widget_show (popup_window); - /*miniframe style*/ - nav->gc = gdk_gc_new (gtk_widget_get_window (drawing_area)); - gdk_gc_set_line_attributes (nav->gc, - FRAME_THICKNESS, - GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); - /*cursor*/ if (MIN(nav->frame_h, nav->frame_w) > STD_CURSOR_MIN) { nav->cursor = gdk_cursor_new (GDK_FLEUR); } else { /*the miniframe is very small, so we use a minimalist cursor*/ - gchar cursor_none_data[] = { 0x00 }; - GdkBitmap * bitmap; - GdkColor fg = { 0, 65535, 65535, 65535}; - GdkColor bg = { 0, 0, 0, 0 }; - - bitmap = gdk_bitmap_create_from_data(NULL, cursor_none_data, 1, 1); - nav->cursor = gdk_cursor_new_from_pixmap(bitmap, bitmap, &fg, &bg, 1, 1); - g_object_unref(bitmap); + gchar cursor_none_data[] = { 0x00, 0xFF, 0xFF }; + GdkPixbuf * pixbuf; + + pixbuf = gdk_pixbuf_new_from_data (cursor_none_data, + GDK_COLORSPACE_RGB, + FALSE, + 8, 1, 1, 0, + NULL, NULL); + nav->cursor = gdk_cursor_new_from_pixbuf (gdk_display_get_default(), pixbuf, 1, 1); + g_object_unref(pixbuf); } /*grab the pointer*/ @@ -261,34 +249,18 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) nav->cursor, GDK_CURRENT_TIME); - /*buffer to draw the thumbnail on*/ - nav->buffer = gdk_pixmap_new (gtk_widget_get_window (drawing_area), - nav->width, nav->height, -1); - style = gtk_widget_get_style (drawing_area); - gdk_draw_rectangle (nav->buffer, - style->black_gc, TRUE, - 0, 0, nav->width, nav->height); - - {/*--Render the thumbnail*/ - DiaGdkRenderer *renderer; - GdkColor color; - - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = nav->buffer;/*render on the thumbnail buffer*/ - renderer->gc = gdk_gc_new (nav->buffer); - - /*Background color*/ - color_convert (&data->bg_color, &color); - gdk_gc_set_foreground (renderer->gc, &color); - gdk_draw_rectangle (renderer->pixmap, renderer->gc, 1, 0, 0, nav->width, nav->height); - - /*render the data*/ - data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); - - g_object_ref (renderer->pixmap); - g_object_unref (renderer); - } + /* surface to draw the thumbnail on */ + nav->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + nav->width, nav->height); + + renderer = g_object_new (g_type_from_name ("DiaCairoRenderer"), NULL); + renderer->scale = zoom; + renderer->surface = cairo_surface_reference (nav->surface); + + /*render the data*/ + data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); + + g_object_unref (renderer); nav->is_first_expose = TRUE;/*set to request to draw the miniframe*/ } @@ -298,53 +270,48 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp) static void reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page) { - adj->page_size = page; + gtk_adjustment_set_page_size (adj, page); - adj->lower = lower; - adj->upper = upper; + gtk_adjustment_set_lower (adj, lower); + gtk_adjustment_set_upper (adj, upper); - if (adj->value < lower) adj->value = lower; - if (adj->value > (upper - page)) adj->value = upper - page; + if (gtk_adjustment_get_value (adj) < lower) gtk_adjustment_set_value (adj, lower); + if (gtk_adjustment_get_value (adj) > (upper - page)) gtk_adjustment_set_value (adj, upper - page); gtk_adjustment_changed(adj); } static gboolean -on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused) +on_da_draw (GtkWidget * widget, cairo_t *ctx) { - GtkStyle *style = gtk_widget_get_style (widget); - /*refresh the part outdated by the event*/ - gdk_draw_drawable (gtk_widget_get_window (widget), -#if GTK_CHECK_VERSION(2,18,0) - style->fg_gc[gtk_widget_get_state (widget)], -#else - style->fg_gc[GTK_WIDGET_STATE (widget)], -#endif - GDK_PIXMAP(nav->buffer), - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); - - /*the first time, display the current display's state*/ - if(nav->is_first_expose){ + GtkAdjustment * adj; + int x, y; - GtkAdjustment * adj; - int x, y; + cairo_set_line_width (ctx, FRAME_THICKNESS); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); - adj = nav->ddisp->hsbdata; - x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1; + /*refresh the part outdated by the event*/ + cairo_set_source_surface (ctx, nav->surface, 0, 0); + cairo_rectangle (ctx, 0, 0, + gtk_widget_get_allocated_width (widget), + gtk_widget_get_allocated_height (widget)); + cairo_fill (ctx); - adj = nav->ddisp->vsbdata; - y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1; + adj = nav->ddisp->hsbdata; + x = (gtk_adjustment_get_value (adj) - gtk_adjustment_get_lower (adj)) / (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)) * (nav->width) +1; - /*draw directly on the window, do not buffer the miniframe*/ - gdk_draw_rectangle (gtk_widget_get_window (widget), - nav->gc, FALSE, - x, y, nav->frame_w, nav->frame_h); + adj = nav->ddisp->vsbdata; + y = (gtk_adjustment_get_value (adj) - gtk_adjustment_get_lower (adj)) / (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)) * (nav->height) +1; - nav->is_first_expose = FALSE; - } + /*draw directly on the window, do not buffer the miniframe*/ + cairo_set_source_rgb (ctx, 0, 0, 0); + cairo_rectangle (ctx, x, y, nav->frame_w, nav->frame_h); + cairo_stroke (ctx); + + nav->is_first_expose = FALSE; + return FALSE; } @@ -354,7 +321,6 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo { GtkAdjustment * adj; gboolean value_changed; - GtkStyle *style; int w = nav->frame_w; int h = nav->frame_h; @@ -370,15 +336,15 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo adj = nav->ddisp->hsbdata; value_changed = FALSE; if (w/2 <= event->x && event->x <= (nav->width - w/2)){ - adj->value = adj->lower + x * nav->hadj_coef; + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj) + x * nav->hadj_coef); value_changed = TRUE; } - else if (x == 0 && adj->value != adj->lower){/*you've been too fast! :)*/ - adj->value = adj->lower; + else if (x == 0 && gtk_adjustment_get_value (adj) != gtk_adjustment_get_lower (adj)){/*you've been too fast! :)*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); value_changed = TRUE; } - else if (x == (nav->width - w) && adj->value != (adj->upper - adj->page_size)){/*idem*/ - adj->value = adj->upper - adj->page_size; + else if (x == (nav->width - w) && gtk_adjustment_get_value (adj) != (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))){/*idem*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); value_changed = TRUE; } if (value_changed) gtk_adjustment_value_changed(adj); @@ -386,35 +352,22 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo adj = nav->ddisp->vsbdata; value_changed = FALSE; if (h/2 <= event->y && event->y <= (nav->height - h/2)){ - adj->value = adj->lower + y * nav->vadj_coef; + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj) + y * nav->vadj_coef); value_changed = TRUE; } - else if (y == 0 && adj->value != adj->lower){/*you've been too fast! :)*/ - adj->value = adj->lower; + else if (y == 0 && gtk_adjustment_get_value (adj) != gtk_adjustment_get_lower (adj)){/*you've been too fast! :)*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj)); value_changed = TRUE; } - else if (y == (nav->height - h) && adj->value != (adj->upper - adj->page_size)){/*idem*/ - adj->value = adj->upper - adj->page_size; + else if (y == (nav->height - h) && gtk_adjustment_get_value (adj) != (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))){/*idem*/ + gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); value_changed = TRUE; } if (value_changed) gtk_adjustment_value_changed(adj); + /* Trigger redraw */ + gdk_window_invalidate_rect (gtk_widget_get_window (drawing_area), NULL, TRUE); -/*--Draw the miniframe*/ -/*refresh from the buffer*/ - style = gtk_widget_get_style (drawing_area); - gdk_draw_drawable (gtk_widget_get_window (drawing_area), -#if GTK_CHECK_VERSION(2,18,0) - style->fg_gc[gtk_widget_get_state (drawing_area)], -#else - style->fg_gc[GTK_WIDGET_STATE (drawing_area)], -#endif - GDK_PIXMAP(nav->buffer), - 0, 0, 0, 0, nav->width, nav->height); -/*draw directly on the window, do not buffer the miniframe*/ - gdk_draw_rectangle (gtk_widget_get_window (drawing_area), - nav->gc, FALSE, - x, y, w, h); return FALSE; } @@ -425,16 +378,8 @@ on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer /* Apparently there are circumstances where this is run twice for one popup * Protected calls to avoid crashing on second pass. */ - if (nav->buffer) - g_object_unref (nav->buffer); - nav->buffer = NULL; - - if (nav->gc) - g_object_unref (nav->gc); - nav->gc = NULL; - if (nav->cursor) - gdk_cursor_unref (nav->cursor); + g_object_unref (nav->cursor); nav->cursor = NULL; if (nav->popup_window) diff --git a/app/navigation.h b/app/navigation.h index 558744ecaa3ef99109b75d9343744563048b3233..cc64ab5cebf168f90d0f8ca1da3310938c4e291a 100644 --- a/app/navigation.h +++ b/app/navigation.h @@ -40,6 +40,6 @@ * * Returns: a new #GtkButton. **/ -GtkWidget * navigation_popup_new (DDisplay *ddisp); +GtkWidget * navigation_popup_new (DiaDisplay *ddisp); #endif diff --git a/app/object_ops.c b/app/object_ops.c index 3d4f049707debc5e9acffd4d26b87c6adf0dcbb5..29a2d6da0c088017d33486ab84f4e4883e1240af 100644 --- a/app/object_ops.c +++ b/app/object_ops.c @@ -78,7 +78,7 @@ object_add_updates_list(GList *list, Diagram *dia) * in this call (anded to the display-wide setting). */ ConnectionPoint * -object_find_connectpoint_display(DDisplay *ddisp, Point *pos, +object_find_connectpoint_display(DiaDisplay *ddisp, Point *pos, DiaObject *notthis, gboolean snap_to_objects) { real distance; @@ -90,7 +90,7 @@ object_find_connectpoint_display(DDisplay *ddisp, Point *pos, diagram_find_closest_connectionpoint(ddisp->diagram, &connectionpoint, pos, notthis); - distance = ddisplay_transform_length(ddisp, distance); + distance = dia_display_transform_length(ddisp, distance); if (distance < OBJECT_CONNECT_DISTANCE) { return connectionpoint; } @@ -119,7 +119,7 @@ object_find_connectpoint_display(DDisplay *ddisp, Point *pos, /* pushes undo info */ void -object_connect_display(DDisplay *ddisp, DiaObject *obj, Handle *handle, +object_connect_display(DiaDisplay *ddisp, DiaObject *obj, Handle *handle, gboolean snap_to_objects) { ConnectionPoint *connectionpoint; diff --git a/app/object_ops.h b/app/object_ops.h index 82a3cc71f2a4219e7026c8c21db89ee0713f9789..d9f1be9a2da075a9954599a981d2f8f0eb573899 100644 --- a/app/object_ops.h +++ b/app/object_ops.h @@ -34,12 +34,12 @@ void object_add_updates(DiaObject *obj, Diagram *dia); void object_add_updates_list(GList *list, Diagram *dia); -ConnectionPoint *object_find_connectpoint_display(DDisplay *ddisp, +ConnectionPoint *object_find_connectpoint_display(DiaDisplay *ddisp, Point *pos, DiaObject *notthis, gboolean snap_to_objects); -void object_connect_display(DDisplay *ddisp, DiaObject *obj, +void object_connect_display(DiaDisplay *ddisp, DiaObject *obj, Handle *handle, gboolean snap_to_objects); /* Adds Undo info for connected objects. */ diff --git a/app/pagesetup.c b/app/pagesetup.c index 0a6ed2ac658729ca08c0b13f6211389117214f97..bcc2d61e45f1d2e27302800dc6159faceb4c68e4 100644 --- a/app/pagesetup.c +++ b/app/pagesetup.c @@ -75,11 +75,11 @@ create_page_setup_dlg(Diagram *dia) g_object_ref(ps->dia); ps->window = gtk_dialog_new_with_buttons( _("Page Setup"), - GTK_WINDOW (ddisplay_active()->shell), + GTK_WINDOW (dia_display_active()->shell), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(ps->window), GTK_RESPONSE_OK); vbox = gtk_dialog_get_content_area(GTK_DIALOG(ps->window)); diff --git a/app/pixmaps/default.xpm b/app/pixmaps/default.xpm index bc8b2fecf104de0040d59f6d68d297dcd1dc857f..9566f91bc882f8580dc8e74f52ca70e1dc590076 100644 --- a/app/pixmaps/default.xpm +++ b/app/pixmaps/default.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * default_xpm[] = { +static const char * default_xpm[] = { "13 13 4 1", " c None", ". c #919191", diff --git a/app/pixmaps/swap.xpm b/app/pixmaps/swap.xpm index ed72def7dac6e7ffee5a503d8036e219c6557773..4fb87cf693b68fe6ed115e8c9e2f04709adb6668 100644 --- a/app/pixmaps/swap.xpm +++ b/app/pixmaps/swap.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * swap_xpm[] = { +static const char * swap_xpm[] = { "13 13 3 1", " c None", ". c #919191", diff --git a/app/plugin-manager.c b/app/plugin-manager.c index d9000f70ed553d7abcd0f8c47a8bc11d6cda8f0d..e1f83b39ce78a7a814045f661069dd16b3fdc7c1 100644 --- a/app/plugin-manager.c +++ b/app/plugin-manager.c @@ -207,7 +207,7 @@ get_plugin_manager(void) dialog = gtk_dialog_new_with_buttons( _("Plugins"), NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + _("Close"), GTK_RESPONSE_CLOSE, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); diff --git a/app/preferences.c b/app/preferences.c index c45cd38d5ac0e4bdc0b218ea1238483648a26aea..a2dbabcce0fd55acefa1f0dedd703ae74973651f 100644 --- a/app/preferences.c +++ b/app/preferences.c @@ -91,8 +91,8 @@ static int default_int_w = 500; static int default_int_h = 400; static int default_undo_depth = 15; static guint default_recent_documents = 5; -static Color default_colour = DEFAULT_GRID_COLOR; -static Color pbreak_colour = DEFAULT_PAGEBREAK_COLOR; +static GdkRGBA default_colour = DEFAULT_GRID_COLOR; +static GdkRGBA pbreak_colour = DEFAULT_PAGEBREAK_COLOR; static const gchar *default_paper_name = NULL; static const gchar *default_length_unit = "Centimeter"; static const gchar *default_fontsize_unit = "Point"; @@ -101,7 +101,7 @@ static const char *default_favored_filter = N_("any"); struct DiaPrefsTab { char *title; - GtkTable *table; + GtkGrid *table; int row; }; @@ -301,8 +301,8 @@ prefs_set_defaults(void) *(real *)ptr = persistence_register_real(prefs_data[i].name, *(real *)ptr); break; case PREF_COLOUR: - *(Color *)ptr = *(Color *)prefs_data[i].default_value; - *(Color *)ptr = *persistence_register_color(prefs_data[i].name, (Color *)ptr); + *(GdkRGBA *)ptr = *(GdkRGBA *)prefs_data[i].default_value; + *(GdkRGBA *)ptr = *persistence_register_color(prefs_data[i].name, (GdkRGBA *)ptr); break; case PREF_CHOICE: case PREF_STRING: @@ -345,7 +345,7 @@ prefs_save(void) persistence_set_real(prefs_data[i].name, *(real *)ptr); break; case PREF_COLOUR: - persistence_set_color(prefs_data[i].name, (Color *)ptr); + persistence_set_color(prefs_data[i].name, (GdkRGBA *)ptr); break; case PREF_CHOICE: case PREF_STRING: @@ -385,7 +385,7 @@ prefs_set_value_in_widget(GtkWidget * widget, DiaPrefData *data, (gfloat) (*((real *)ptr))); break; case PREF_COLOUR: - dia_color_selector_set_color(widget, (Color *)ptr); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (widget), (GdkRGBA *)ptr); break; case PREF_CHOICE: { GList *names = (data->choice_list_function)(data); @@ -436,9 +436,9 @@ prefs_get_value_from_widget(GtkWidget * widget, DiaPrefData *data, } break; case PREF_COLOUR: { - Color prev = *(Color *)ptr; - dia_color_selector_get_color(widget, (Color *)ptr); - changed = memcmp (&prev, ptr, sizeof(Color)); + GdkRGBA prev = *(GdkRGBA *)ptr; + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (widget), (GdkRGBA *)ptr); + changed = memcmp (&prev, ptr, sizeof(GdkRGBA)); } break; case PREF_CHOICE: { @@ -515,26 +515,18 @@ prefs_get_property_widget(DiaPrefData *data) gtk_widget_set_size_request (widget, 80, -1); break; case PREF_COLOUR: - widget = dia_color_selector_new(); + widget = gtk_color_button_new(); break; case PREF_STRING: widget = gtk_entry_new(); break; case PREF_CHOICE: { GList *names; -#if GTK_CHECK_VERSION(2,24,0) widget = gtk_combo_box_text_new (); -#else - widget = gtk_combo_box_new_text (); -#endif for (names = (data->choice_list_function)(data); names != NULL; names = g_list_next(names)) { -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), (gchar *)names->data); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (widget), (gchar *)names->data); -#endif } break; } @@ -572,8 +564,8 @@ prefs_create_dialog(void) GtkWidget *label; GtkWidget *dialog_vbox; GtkWidget *notebook; - GtkTable *top_table = NULL; /* top level table for the tab */ - GtkTable *current_table = NULL; + GtkGrid *top_table = NULL; /* top level table for the tab */ + GtkGrid *current_table = NULL; int i; int tab_idx = -1; @@ -584,9 +576,9 @@ prefs_create_dialog(void) _("Preferences"), GTK_WINDOW(interface_get_toolbox_shell()), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Close"), GTK_RESPONSE_CLOSE, + _("Apply"), GTK_RESPONSE_APPLY, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(prefs_dialog), GTK_RESPONSE_OK); gtk_window_set_resizable (GTK_WINDOW (prefs_dialog), TRUE); @@ -616,10 +608,10 @@ prefs_create_dialog(void) label = gtk_label_new(gettext(prefs_tabs[i].title)); gtk_widget_show(label); - table = gtk_table_new (9, 2, FALSE); - prefs_tabs[i].table = GTK_TABLE(table); - gtk_widget_set_size_request(table, -1, -1); - gtk_widget_show(table); + table = gtk_grid_new (); + prefs_tabs[i].table = GTK_GRID (table); + gtk_widget_set_size_request (table, -1, -1); + gtk_widget_show (table); #ifdef SCROLLED_PAGES notebook_page = gtk_scrolled_window_new (NULL, NULL); @@ -660,12 +652,13 @@ prefs_create_dialog(void) case PREF_NONE: widget = gtk_frame_new(gettext(prefs_data[i].label_text)); gtk_widget_show (widget); - gtk_table_attach (current_table, widget, 0, 2, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); - current_table = GTK_TABLE(gtk_table_new (9, 2, FALSE)); - gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(current_table)); - gtk_widget_show(GTK_WIDGET(current_table)); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 0, row, 2, 1); + current_table = GTK_GRID (gtk_grid_new ()); + gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (current_table)); + gtk_widget_show (GTK_WIDGET (current_table)); break; case PREF_END_GROUP: current_table = top_table; @@ -673,24 +666,27 @@ prefs_create_dialog(void) case PREF_BOOLEAN: widget = gtk_check_button_new_with_label (gettext(prefs_data[i].label_text)); gtk_widget_show (widget); - gtk_table_attach (current_table, widget, 0, 2, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 0, row, 2, 1); break; default: label = gtk_label_new (gettext(prefs_data[i].label_text)); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.3); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.3); gtk_widget_show (label); - gtk_table_attach (current_table, label, 0, 1, - row, row + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_widget_set_hexpand (GTK_WIDGET (label), TRUE); + gtk_widget_set_valign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, label, 0, row, 1, 1); widget = prefs_get_property_widget(&prefs_data[i]); if (widget != NULL) { - gtk_table_attach (current_table, widget, 1, 2, - row, row + 1, - GTK_FILL, GTK_FILL, 1, 1); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_FILL); + gtk_grid_attach (current_table, widget, 1, row, 1, 1); } break; } @@ -769,7 +765,7 @@ update_floating_toolbox(DiaPrefData *pref, gpointer ptr) GSList *displays; for (displays = diagram->displays; displays != NULL; displays = g_slist_next(displays)) { - DDisplay *ddisp = (DDisplay *)displays->data; + DiaDisplay *ddisp = (DiaDisplay *)displays->data; gtk_window_set_transient_for(GTK_WINDOW(interface_get_toolbox_shell()), GTK_WINDOW(ddisp->shell)); } diff --git a/app/properties-dialog.c b/app/properties-dialog.c index 16e086b3b1f9a64383c04aff43296e60993c0347..d6f096129709b735dd743bedb5668f73e67d0209 100644 --- a/app/properties-dialog.c +++ b/app/properties-dialog.c @@ -55,19 +55,27 @@ create_dialog(GtkWidget *parent) { /* GtkWidget *actionbox; */ /* GList *buttons; */ - - dialog = gtk_dialog_new_with_buttons( - _("Object properties"), - parent ? GTK_WINDOW (parent) : NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); + gboolean header; + + g_object_get (gtk_settings_get_default (), + "gtk-dialogs-use-header", &header, + NULL); + dialog = g_object_new (GTK_TYPE_DIALOG, + "title", _("Object properties"), + "transient-for", parent ? GTK_WINDOW (parent) : NULL, + "destroy-with-parent", TRUE, + "use-header-bar", header, + NULL); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, + _("Apply"), GTK_RESPONSE_APPLY, + NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); dialog_vbox = gtk_dialog_get_content_area (GTK_DIALOG(dialog)); + gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox), 0); gtk_window_set_role(GTK_WINDOW (dialog), "properties_window"); @@ -133,29 +141,28 @@ properties_respond(GtkWidget *widget, object_add_updates_list(current_objects, current_dia); for (tmp = current_objects; tmp != NULL; tmp = tmp->next) { - DiaObject *current_obj = (DiaObject*)tmp->data; - obj_change = current_obj->ops->apply_properties_from_dialog(current_obj, object_part); - object_add_updates(current_obj, current_dia); - diagram_update_connections_object(current_dia, current_obj, TRUE); + DiaObject *current_obj = (DiaObject*)tmp->data; + obj_change = current_obj->ops->apply_properties_from_dialog(current_obj, object_part); + object_add_updates(current_obj, current_dia); + diagram_update_connections_object(current_dia, current_obj, TRUE); - if (obj_change != NULL) { - undo_object_change(current_dia, current_obj, obj_change); - set_tp = set_tp && TRUE; - } else - set_tp = FALSE; - - diagram_object_modified(current_dia, current_obj); + if (obj_change != NULL) { + undo_object_change(current_dia, current_obj, obj_change); + set_tp = set_tp && TRUE; + } else + set_tp = FALSE; + diagram_object_modified(current_dia, current_obj); } diagram_modified(current_dia); diagram_update_extents(current_dia); if (set_tp) { - undo_set_transactionpoint(current_dia->undo); + undo_set_transactionpoint(current_dia->undo); } else { - message_warning(_("This object doesn't support Undo/Redo.\n" - "Undo information erased.")); - undo_clear(current_dia->undo); + message_warning(_("This object doesn't support Undo/Redo.\n" + "Undo information erased.")); + undo_clear(current_dia->undo); } diagram_flush(current_dia); @@ -181,11 +188,7 @@ properties_respond(GtkWidget *widget, static void properties_give_focus(GtkWidget *widget, gpointer data) { -#if GTK_CHECK_VERSION(2,20,0) if (gtk_widget_get_can_focus(widget)) { -#else - if (GTK_WIDGET_CAN_FOCUS(widget)) { -#endif gtk_widget_grab_focus(widget); } else { if (GTK_IS_CONTAINER(widget)) { @@ -220,7 +223,7 @@ object_list_properties_show(Diagram *dia, GList *objects) { GtkWidget *properties; DiaObject *one_obj; - GtkWidget *parent = ddisplay_active() ? ddisplay_active()->shell : NULL; + GtkWidget *parent = dia_display_active() ? dia_display_active()->shell : NULL; if (!dialog) create_dialog(parent); clear_dialog_globals(); diff --git a/app/recent_files.c b/app/recent_files.c index d8a5e0cdad76ee9d3b8f76e852d0fa3aa0166756..e8f26710df172a745ab8f1f8f1d3228c4c6a6a82 100644 --- a/app/recent_files.c +++ b/app/recent_files.c @@ -159,7 +159,7 @@ open_recent_file_callback(GtkWidget *widget, gpointer data) diagram_update_extents(diagram); layer_dialog_set_diagram(diagram); if (diagram->displays == NULL) { - new_display(diagram); + dia_display_new (diagram); } } else recent_file_history_remove (filename); diff --git a/app/render_gdk.c b/app/render_gdk.c deleted file mode 100644 index 930e36bd513a11e87ec65068b07451bd05442d97..0000000000000000000000000000000000000000 --- a/app/render_gdk.c +++ /dev/null @@ -1,313 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#include -#include -#include - -#include "object.h" -#include "message.h" -#include "render_gdk.h" -#include "diagdkrenderer.h" - - -/** Used for highlighting mainpoint connections. */ -static Color cp_main_color = { 1.0, 0.8, 0.0, 1.0 }; -/** Used for highlighting normal connections. */ -static Color cp_color = { 1.0, 0.0, 0.0, 1.0 }; - -static Color text_edit_color = {1.0, 1.0, 0.0, 1.0 }; - - -static void clip_region_clear(DiaRenderer *renderer); -static void clip_region_add_rect(DiaRenderer *renderer, - Rectangle *rect); - -static void draw_pixel_line(DiaRenderer *renderer, - int x1, int y1, - int x2, int y2, - Color *color); -static void draw_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void fill_pixel_rect(DiaRenderer *renderer, - int x, int y, - int width, int height, - Color *color); -static void set_size (DiaRenderer *renderer, - gpointer window, - int width, int height); -static void copy_to_window (DiaRenderer *renderer, - gpointer window, - int x, int y, int width, int height); -static void draw_object_highlighted (DiaRenderer *renderer, - DiaObject *object, - DiaHighlightType type); - -typedef struct _DiaGdkInteractiveRenderer DiaGdkInteractiveRenderer; -struct _DiaGdkInteractiveRenderer -{ - DiaGdkRenderer parent_instance; /*!< inheritance in object oriented C */ -}; -typedef struct _DiaGdkInteractiveRendererClass DiaGdkInteractiveRendererClass; -struct _DiaGdkInteractiveRendererClass -{ - DiaGdkRendererClass parent_class; /*!< the base class */ -}; -static GType dia_gdk_interactive_renderer_get_type (void); -#define DIA_TYPE_GDK_INTERACTIVE_RENDERER (dia_gdk_interactive_renderer_get_type ()) -#define DIA_GDK_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_GDK_INTERACTIVE_RENDERER, DiaGdkInteractiveRenderer)) - -static void -dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface) -{ - iface->clip_region_clear = clip_region_clear; - iface->clip_region_add_rect = clip_region_add_rect; - iface->draw_pixel_line = draw_pixel_line; - iface->draw_pixel_rect = draw_pixel_rect; - iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; - iface->set_size = set_size; - iface->draw_object_highlighted = draw_object_highlighted; -} - -G_DEFINE_TYPE_WITH_CODE (DiaGdkInteractiveRenderer, dia_gdk_interactive_renderer, DIA_TYPE_GDK_RENDERER, - G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, dia_gdk_renderer_iface_init)); - -static void -dia_gdk_interactive_renderer_class_init(DiaGdkInteractiveRendererClass *klass) -{ -} -static void -dia_gdk_interactive_renderer_init(DiaGdkInteractiveRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER(object); - DiaRenderer *dia_renderer = DIA_RENDERER(object); - - dia_renderer->is_interactive = 1; - - renderer->gc = NULL; - renderer->pixmap = NULL; - renderer->clip_region = NULL; -} - -DiaRenderer * -new_gdk_renderer(DDisplay *ddisp) -{ - DiaGdkRenderer *renderer; - - renderer = g_object_new (DIA_TYPE_GDK_INTERACTIVE_RENDERER, NULL); - renderer->transform = dia_transform_new (&ddisp->visible, &ddisp->zoom_factor); - - return DIA_RENDERER(renderer); -} - -static void -set_size(DiaRenderer *object, gpointer window, - int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (window) - renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); - else /* the integrated UI insist to call us too early */ - renderer->pixmap = gdk_pixmap_new(NULL, width, height, 24); - - if (renderer->gc == NULL) { - renderer->gc = gdk_gc_new(renderer->pixmap); - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); - } -} - -static void -copy_to_window (DiaRenderer *object, gpointer window, - int x, int y, int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - static GdkGC *copy_gc = NULL; - - if (!copy_gc) - copy_gc = gdk_gc_new(window); - - gdk_draw_drawable (GDK_WINDOW(window), - copy_gc, - renderer->pixmap, - x, y, - x, y, - width, height); -} - -static void -clip_region_clear(DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); - - renderer->clip_region = gdk_region_new(); - - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -} - -static void -clip_region_add_rect(DiaRenderer *object, - Rectangle *rect) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkRectangle clip_rect; - int x1,y1; - int x2,y2; - - dia_transform_coords(renderer->transform, rect->left, rect->top, &x1, &y1); - dia_transform_coords(renderer->transform, rect->right, rect->bottom, &x2, &y2); - - clip_rect.x = x1; - clip_rect.y = y1; - clip_rect.width = x2 - x1 + 1; - clip_rect.height = y2 - y1 + 1; - - gdk_region_union_with_rect( renderer->clip_region, &clip_rect ); - - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -} - -static void -draw_pixel_line(DiaRenderer *object, - int x1, int y1, - int x2, int y2, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - dia_gdk_renderer_set_dashes(renderer, x1+y1); - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if ( (x1 < 0 && x2 < 0) - || (y1 < 0 && y2 < 0) - || (x1 > target_width && x2 > target_width) - || (y1 > target_height && y2 > target_height)) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_line(renderer->pixmap, gc, x1, y1, x2, y2); -} - -static void -draw_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - dia_gdk_renderer_set_dashes(renderer, x+y); - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if (x + width < 0 || y + height < 0 || x > target_width || y > target_height) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_rectangle (renderer->pixmap, gc, FALSE, - x, y, width, height); -} - -static void -fill_pixel_rect(DiaRenderer *object, - int x, int y, - int width, int height, - Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - int target_width, target_height; - - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &target_width, &target_height); - - if (x + width < 0 || y + height < 0 || x > target_width || y > target_height) - return; /* clip early rather than failing in Gdk */ - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - /* reset stippling (alpha emulation) */ - gdk_gc_set_fill(gc, GDK_SOLID); - renderer->current_alpha = 1.0; - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - x, y, width, height); -} - -static void -draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type) -{ - DiaGdkRenderer *gdk_rend = DIA_GDK_RENDERER(renderer); - Color *color = NULL; - switch (type) { - case DIA_HIGHLIGHT_CONNECTIONPOINT: - color = &cp_color; - break; - case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: - color = &cp_main_color; - break; - case DIA_HIGHLIGHT_TEXT_EDIT: - color = &text_edit_color; - break; - case DIA_HIGHLIGHT_NONE: - color = NULL; - break; - } - if( color ) { - gdk_rend->highlight_color = color; - object->ops->draw(object, renderer); - gdk_rend->highlight_color = NULL; - } - - object->ops->draw(object, renderer); -} - diff --git a/app/render_gdk.h b/app/render_gdk.h deleted file mode 100644 index 21dcd88aed90b1fec547e27843d42e35a45b749c..0000000000000000000000000000000000000000 --- a/app/render_gdk.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 RENDER_GDK_H -#define RENDER_GDK_H - -#include "display.h" - -DiaRenderer *new_gdk_renderer(DDisplay *ddisp); - -#endif /* RENDER_GDK_H */ diff --git a/app/ruler.c b/app/ruler.c index c26b055199b3eeeed8fec9fbebde99d1950bb4be..85dc8755688632e394105e0e440097d749b9be2f 100644 --- a/app/ruler.c +++ b/app/ruler.c @@ -41,7 +41,7 @@ typedef struct _DiaRuler { GtkDrawingArea parent; - DDisplay *ddisp; + DiaDisplay *ddisp; GtkOrientation orientation; gdouble lower; @@ -58,124 +58,82 @@ G_DEFINE_TYPE (DiaRuler, dia_ruler, GTK_TYPE_DRAWING_AREA) static gboolean dia_ruler_draw (GtkWidget *widget, - cairo_t *cr) + cairo_t *cr) { DiaRuler *ruler = DIA_RULER(widget); + GtkStyleContext *style_context = gtk_widget_get_style_context (widget); + PangoLayout *layout; + int x, y, dx, dy, width, height; + GdkRGBA fg; + real pos; -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable (widget)) -#else - if (GTK_WIDGET_DRAWABLE (widget)) -#endif - { - GtkStyle *style = gtk_widget_get_style (widget); - PangoLayout *layout; - int x, y, dx, dy, width, height; - real pos; - - layout = gtk_widget_create_pango_layout (widget, "012456789"); -#if GTK_CHECK_VERSION(3,0,0) - width = gtk_widget_get_allocated_width (widget); - height = gtk_widget_get_allocated_height (widget); -#else - width = widget->allocation.width; - height = widget->allocation.height; -#endif - dx = (ruler->orientation == GTK_ORIENTATION_VERTICAL) ? width/3 : 0; - dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; - -#if GTK_CHECK_VERSION(2,18,0) - gdk_cairo_set_source_color (cr, &style->text[gtk_widget_get_state(widget)]); -#else - gdk_cairo_set_source_color (cr, &style->text[GTK_WIDGET_STATE(widget)]); -#endif - cairo_set_line_width (cr, 1); + gtk_style_context_get_color (style_context, gtk_widget_get_state_flags (widget), &fg); - pos = ruler->lower; - for (x = 0, y = 0; x < width && y < height;) - { - gboolean is_major; - int n; + layout = gtk_widget_create_pango_layout (widget, "012456789"); - if (!grid_step (ruler->ddisp, ruler->orientation, &pos, - (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? &x : &y, - &is_major)) - break; - - /* ticks */ - n = (is_major ? 1 : 2); - /* + .5 for pixel aligned lines */ - cairo_move_to (cr, x + 3*dx + .5, y + 3*dy + .5); - cairo_line_to (cr, x + n*dx + .5, y + n*dy + .5); - cairo_stroke (cr); - - /* label */ - if (is_major) - { - gchar text[G_ASCII_DTOSTR_BUF_SIZE*2]; + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); - g_snprintf (text, sizeof(text)-1, "%g", pos); - pango_layout_set_markup (layout, text, -1); - pango_layout_context_changed (layout); - cairo_save (cr); - if (ruler->orientation == GTK_ORIENTATION_VERTICAL) - { - cairo_translate (cr, x, y); - cairo_rotate (cr, -G_PI/2.0); - cairo_move_to (cr, 2, 0); - } - else - { - cairo_move_to (cr, x+2, 0); - } - pango_cairo_show_layout (cr, layout); - cairo_restore (cr); - } - } - g_object_unref (layout); - /* arrow */ - if (ruler->position > ruler->lower && ruler->position < ruler->upper) - { - real pos = ruler->position; - if (ruler->orientation == GTK_ORIENTATION_VERTICAL) - { - ddisplay_transform_coords (ruler->ddisp, 0, pos, &x, &y); - cairo_move_to (cr, 3*dx, y); - cairo_line_to (cr, 2*dx, y - dx); - cairo_line_to (cr, 2*dx, y + dx); - cairo_fill (cr); - } - else - { - ddisplay_transform_coords (ruler->ddisp, pos, 0, &x, &y); - cairo_move_to (cr, x, 3*dy); - cairo_line_to (cr, x + dy, 2*dy); - cairo_line_to (cr, x - dy, 2*dy); - cairo_fill (cr); - } - } + dx = (ruler->orientation == GTK_ORIENTATION_VERTICAL) ? width/3 : 0; + dy = (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? height/3 : 0; + + gdk_cairo_set_source_rgba (cr, &fg); + cairo_set_line_width (cr, 1); + + pos = ruler->lower; + for (x = 0, y = 0; x < width && y < height;) { + gboolean is_major; + int n; + + if (!grid_step (ruler->ddisp, ruler->orientation, &pos, + (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) ? &x : &y, + &is_major)) + break; + + /* ticks */ + n = (is_major ? 1 : 2); + /* + .5 for pixel aligned lines */ + cairo_move_to (cr, x + 3*dx + .5, y + 3*dy + .5); + cairo_line_to (cr, x + n*dx + .5, y + n*dy + .5); + cairo_stroke (cr); + + /* label */ + if (is_major) { + gchar text[G_ASCII_DTOSTR_BUF_SIZE*2]; + + g_snprintf (text, sizeof(text)-1, "%g", pos); + pango_layout_set_markup (layout, text, -1); + pango_layout_context_changed (layout); + cairo_save (cr); + if (ruler->orientation == GTK_ORIENTATION_VERTICAL) { + cairo_translate (cr, x, y); + cairo_rotate (cr, -G_PI/2.0); + cairo_move_to (cr, 2, 0); + } else { + cairo_move_to (cr, x+2, 0); + } + pango_cairo_show_layout (cr, layout); + cairo_restore (cr); } - return FALSE; -} - -/* Wrapper can go with Gtk+-3.0 */ -static gboolean -dia_ruler_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable (widget)) -#else - if (GTK_WIDGET_DRAWABLE (widget)) -#endif - { - GdkWindow *window = gtk_widget_get_window(widget); - cairo_t *cr = gdk_cairo_create (window); - - dia_ruler_draw (widget, cr); - - cairo_destroy (cr); + } + g_object_unref (layout); + /* arrow */ + if (ruler->position > ruler->lower && ruler->position < ruler->upper) { + real pos = ruler->position; + if (ruler->orientation == GTK_ORIENTATION_VERTICAL) { + dia_display_transform_coords (ruler->ddisp, 0, pos, &x, &y); + cairo_move_to (cr, 3*dx, y); + cairo_line_to (cr, 2*dx, y - dx); + cairo_line_to (cr, 2*dx, y + dx); + cairo_fill (cr); + } else { + dia_display_transform_coords (ruler->ddisp, pos, 0, &x, &y); + cairo_move_to (cr, x, 3*dy); + cairo_line_to (cr, x + dy, 2*dy); + cairo_line_to (cr, x - dy, 2*dy); + cairo_fill (cr); } + } return FALSE; } @@ -193,22 +151,16 @@ dia_ruler_motion_notify (GtkWidget *widget, gdk_event_request_motions (event); x = event->x; y = event->y; -#if GTK_CHECK_VERSION(3,0,0) + width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); -#else - width = widget->allocation.width; - height = widget->allocation.height; -#endif - - gdk_drawable_get_size (widget->window, &width, &height); if (ruler->orientation == GTK_ORIENTATION_HORIZONTAL) { /* get old position in display coordinates */ - ddisplay_transform_coords (ruler->ddisp, ruler->position, 0, &x0, &y0); + dia_display_transform_coords (ruler->ddisp, ruler->position, 0, &x0, &y0); /* update ruler position with original coords */ - ddisplay_untransform_coords (ruler->ddisp, x, y, &ruler->position, &tmp); + dia_display_untransform_coords (ruler->ddisp, x, y, &ruler->position, &tmp); /* reuse x,y to restrict invalidation */ y0 = y = 0; x0 = MAX(x0 - height/2, 0); @@ -217,18 +169,14 @@ dia_ruler_motion_notify (GtkWidget *widget, } else { - ddisplay_transform_coords (ruler->ddisp, 0, ruler->position, &x0, &y0); - ddisplay_untransform_coords (ruler->ddisp, x, y, &tmp, &ruler->position); + dia_display_transform_coords (ruler->ddisp, 0, ruler->position, &x0, &y0); + dia_display_untransform_coords (ruler->ddisp, x, y, &tmp, &ruler->position); x0 = x = 0; y0 = MAX(y0 - width/2, 0); y = MAX(y - width/2, 0); height = width; } -#if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) -#else - if (GTK_WIDGET_DRAWABLE (ruler)) -#endif { #if 0 /* this is a bit too expensive - on a slow enough computer the indicators lags */ @@ -248,9 +196,7 @@ dia_ruler_class_init (DiaRulerClass *klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); -#if !GTK_CHECK_VERSION(3,0,0) - widget_class->expose_event = dia_ruler_expose_event; -#endif + widget_class->draw = dia_ruler_draw; } static void @@ -259,7 +205,7 @@ dia_ruler_init (DiaRuler *rule) } GtkWidget * -dia_ruler_new (GtkOrientation orientation, GtkWidget *shell, DDisplay *ddisp) +dia_ruler_new (GtkOrientation orientation, GtkWidget *shell, DiaDisplay *ddisp) { GtkWidget *rule = g_object_new (DIA_TYPE_RULER, NULL); /* calculate from style settings */ @@ -294,11 +240,7 @@ dia_ruler_set_range (GtkWidget *self, ruler->position = position; ruler->max_size = max_size; -# if GTK_CHECK_VERSION(2,18,0) if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) -# else - if (GTK_WIDGET_DRAWABLE (ruler)) -# endif { gtk_widget_queue_draw (GTK_WIDGET (ruler)); /* XXX: draw arrow at mouse position */ diff --git a/app/ruler.h b/app/ruler.h index 8dc758bfa86e793ec6f1709e59619cc82e8d42b1..b14dcf5bc3c2dfc344c01f70f6fec92183747e5b 100644 --- a/app/ruler.h +++ b/app/ruler.h @@ -4,13 +4,13 @@ #include "display.h" -GtkWidget *dia_ruler_new (GtkOrientation orientation, - GtkWidget *shell, - DDisplay *ddisp); +GtkWidget *dia_ruler_new (GtkOrientation orientation, + GtkWidget *shell, + DiaDisplay *ddisp); -void dia_ruler_set_range (GtkWidget *ruler, - gdouble lower, - gdouble upper, - gdouble position, - gdouble max_size); +void dia_ruler_set_range (GtkWidget *ruler, + gdouble lower, + gdouble upper, + gdouble position, + gdouble max_size); #endif diff --git a/app/scroll_tool.c b/app/scroll_tool.c deleted file mode 100644 index e9ce9ff63dcfd750ccccb919e639eaec1312f42d..0000000000000000000000000000000000000000 --- a/app/scroll_tool.c +++ /dev/null @@ -1,155 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 "scroll_tool.h" -#include "handle_ops.h" -#include "object_ops.h" -#include "connectionpoint_ops.h" -#include "message.h" -#include "cursor.h" - -static void scroll_button_press(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void scroll_button_release(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void scroll_motion(ScrollTool *tool, GdkEventMotion *event, - DDisplay *ddisp); -static void scroll_double_click(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp); - -Tool * -create_scroll_tool(void) -{ - ScrollTool *tool; - - tool = g_new0(ScrollTool, 1); - tool->tool.type = SCROLL_TOOL; - tool->tool.button_press_func = (ButtonPressFunc) &scroll_button_press; - tool->tool.button_release_func = (ButtonReleaseFunc) &scroll_button_release; - tool->tool.motion_func = (MotionFunc) &scroll_motion; - tool->tool.double_click_func = (DoubleClickFunc) &scroll_double_click; - - tool->scrolling = FALSE; - tool->use_hand = TRUE; - - ddisplay_set_all_cursor(get_cursor(CURSOR_GRAB)); - - return (Tool *)tool; -} - -void -free_scroll_tool(Tool *tool) -{ - g_free(tool); - ddisplay_set_all_cursor(default_cursor); - -} - -static void -scroll_double_click(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp) -{ - /* Do nothing */ -} - -static void -scroll_button_press(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp) -{ - Point clickedpoint; - - tool->use_hand = (event->state & GDK_SHIFT_MASK) == 0; - if (tool->use_hand) - ddisplay_set_all_cursor(get_cursor(CURSOR_GRABBING)); - else - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); - - ddisplay_untransform_coords(ddisp, - (int)event->x, (int)event->y, - &clickedpoint.x, &clickedpoint.y); - - tool->scrolling = TRUE; - tool->last_pos = clickedpoint; -} - - - - -static void -scroll_motion(ScrollTool *tool, GdkEventMotion *event, - DDisplay *ddisp) -{ - Point to; - Point delta; - - /* set the cursor appropriately, and change use_hand if needed */ - if (!tool->scrolling) { - /* try to minimise the number of cursor type changes */ - if ((event->state & GDK_SHIFT_MASK) == 0) { - if (!tool->use_hand) { - tool->use_hand = TRUE; - ddisplay_set_all_cursor(get_cursor(CURSOR_GRAB)); - } - } else - if (tool->use_hand) { - tool->use_hand = FALSE; - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); - } - return; - } - - ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); - - if (tool->use_hand) { - delta = tool->last_pos; - point_sub(&delta, &to); - - tool->last_pos = to; - point_add(&tool->last_pos, &delta); - - /* we use this so you can scroll past the edge of the image */ - point_add(&delta, &ddisp->origo); - ddisplay_set_origo(ddisp, delta.x, delta.y); - ddisplay_update_scrollbars(ddisp); - ddisplay_add_update_all(ddisp); - } else { - delta = to; - point_sub(&delta, &tool->last_pos); - point_scale(&delta, 0.5); - - ddisplay_scroll(ddisp, &delta); - tool->last_pos = to; - } - ddisplay_flush(ddisp); -} - - -static void -scroll_button_release(ScrollTool *tool, GdkEventButton *event, - DDisplay *ddisp) -{ - tool->use_hand = (event->state & GDK_SHIFT_MASK) == 0; - if (tool->use_hand) { - ddisplay_set_all_cursor(get_cursor(CURSOR_GRAB)); - } else - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); - - tool->scrolling = FALSE; -} - diff --git a/app/select.c b/app/select.c index 738562ecb4eee00bcfbdc0e09eed0cc0037519f2..1e7f0ec4b4cb52f2a425c7b0e0f0db76fe69f35a 100644 --- a/app/select.c +++ b/app/select.c @@ -35,7 +35,7 @@ select_all_callback(GtkAction *action) { Diagram *dia; GList *objects; - DDisplay * ddisp = ddisplay_active(); + DiaDisplay * ddisp = dia_display_active(); if (!ddisp || textedit_mode(ddisp)) return; dia = ddisp->diagram; @@ -52,7 +52,7 @@ select_all_callback(GtkAction *action) objects = g_list_next(objects); } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); } @@ -61,14 +61,14 @@ void select_none_callback(GtkAction *action) { Diagram * dia; - DDisplay * ddisp = ddisplay_active(); + DiaDisplay * ddisp = dia_display_active(); if (!ddisp || textedit_mode(ddisp)) return; dia = ddisp->diagram; diagram_remove_all_selected(dia, TRUE); - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); } @@ -78,7 +78,7 @@ select_invert_callback(GtkAction *action) { Diagram *dia; GList *tmp; - DDisplay * ddisp = ddisplay_active(); + DiaDisplay * ddisp = dia_display_active(); if (!ddisp || textedit_mode(ddisp)) return; dia = ddisp->diagram; @@ -95,7 +95,7 @@ select_invert_callback(GtkAction *action) } } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); @@ -108,7 +108,7 @@ void select_connected_callback(GtkAction *action) { Diagram *dia; - DDisplay * ddisp = ddisplay_active(); + DiaDisplay * ddisp = dia_display_active(); GList *objects, *tmp; if (!ddisp || textedit_mode(ddisp)) return; @@ -150,7 +150,7 @@ select_connected_callback(GtkAction *action) } } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); } @@ -201,7 +201,7 @@ select_transitively(Diagram *dia, DiaObject *obj) void select_transitive_callback(GtkAction *action) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); Diagram *dia; GList *objects, *tmp; @@ -214,7 +214,7 @@ select_transitive_callback(GtkAction *action) select_transitively(dia, (DiaObject *)tmp->data); } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); } @@ -224,7 +224,7 @@ select_same_type_callback(GtkAction *action) { /* For now, do a brute force version: Check vs. all earlier selected. Later, we should really sort the selecteds first to avoid n^2 */ - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); Diagram *dia; GList *objects, *tmp, *tmp2; @@ -250,7 +250,7 @@ select_same_type_callback(GtkAction *action) } } - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity(ddisp); object_add_updates_list(dia->data->selected, dia); diagram_flush(dia); } @@ -258,7 +258,7 @@ select_same_type_callback(GtkAction *action) void select_style_callback(GtkAction *action, GtkRadioAction *current, gpointer user_data) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active(); if (!ddisp || textedit_mode(ddisp)) return; /* simply set the selection style to the value of `action' */ diff --git a/app/sheets.c b/app/sheets.c index a7166c572804f51e48c77e8fd40e21848d31bb6b..35671f828b4b20e0016d2f7576373df31718b2f1 100644 --- a/app/sheets.c +++ b/app/sheets.c @@ -39,7 +39,6 @@ #include "sheets.h" #include "sheets_dialog.h" #include "intl.h" -#include "gtkhwrapbox.h" #include "preferences.h" #include "toolbox.h" /* just for interface_current_sheet_name */ #include "commands.h" /* sheets_dialog_show_callback */ @@ -82,7 +81,7 @@ sheets_append_sheet_object_mod(SheetObject *so, SheetMod *sm) /* Given a Sheet, create a SheetMod wrapper for a list of SheetObjectMod's */ SheetMod * -sheets_append_sheet_mods(Sheet *sheet) +sheets_append_sheet_mods(DiaSheet *sheet) { SheetMod *sheet_mod; GSList *sheet_objects_list; @@ -123,18 +122,16 @@ menu_item_compare_labels(gconstpointer a, gconstpointer b) } void -sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, - gchar *sheet_name) +sheets_optionmenu_create (GtkWidget *option_menu, + GtkWidget *wrapbox, + gchar *sheet_name) { - GtkWidget *optionmenu_menu; GSList *sheets_list; GList *menu_item_list; /* Delete the contents, if any, of this optionemnu first */ - optionmenu_menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(option_menu)); - gtk_container_foreach(GTK_CONTAINER(optionmenu_menu), - (GtkCallback)gtk_widget_destroy, NULL); + gtk_combo_box_text_remove_all (GTK_COMBO_BOX_TEXT (option_menu)); for (sheets_list = sheets_mods_list; sheets_list; sheets_list = g_slist_next(sheets_list)) @@ -151,29 +148,16 @@ sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, continue; { - menu_item = gtk_menu_item_new_with_label(gettext(sheet_mod->sheet.name)); - - gtk_menu_append(GTK_MENU(optionmenu_menu), menu_item); - - if (sheet_mod->sheet.scope == SHEET_SCOPE_SYSTEM) - tip = g_strdup_printf(_("%s\nSystem sheet"), sheet_mod->sheet.description); - else - tip = g_strdup_printf(_("%s\nUser sheet"), sheet_mod->sheet.description); - - gtk_widget_set_tooltip_text(menu_item, tip); - g_free(tip); + // TODO: Don't gettext here + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (option_menu), gettext(sheet_mod->sheet.name)); } - - gtk_widget_show(menu_item); - - g_object_set_data(G_OBJECT(menu_item), "wrapbox", wrapbox); - - g_signal_connect(G_OBJECT(menu_item), "activate", - G_CALLBACK(on_sheets_dialog_optionmenu_activate), - (gpointer)sheet_mod); } + + g_signal_connect (G_OBJECT (option_menu), "changed", + G_CALLBACK (on_sheets_dialog_optionmenu_activate), + NULL); - menu_item_list = gtk_container_get_children(GTK_CONTAINER(optionmenu_menu)); + menu_item_list = NULL/*gtk_container_get_children(GTK_CONTAINER(optionmenu_menu))*/; /* If we were passed a sheet_name, then make the optionmenu point to that name after creation */ @@ -187,14 +171,14 @@ sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, menu_item_compare_labels); if (list) index = g_list_position(menu_item_list, list); - gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), index); + /*gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), index); gtk_menu_item_activate(GTK_MENU_ITEM(g_list_nth_data(menu_item_list, - index))); + index)));*/ } else { - gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), 0); - gtk_menu_item_activate(GTK_MENU_ITEM(menu_item_list->data)); + /*gtk_option_menu_set_history(GTK_OPTION_MENU(option_menu), 0); + gtk_menu_item_activate(GTK_MENU_ITEM(menu_item_list->data));*/ } g_list_free(menu_item_list); @@ -290,12 +274,10 @@ sheets_dialog_create(void) wrapbox = gtk_bin_get_child (GTK_BIN(sw)); if (wrapbox) gtk_container_remove(GTK_CONTAINER(sw), wrapbox); - wrapbox = gtk_hwrap_box_new(FALSE); + wrapbox = gtk_grid_new (); g_object_ref(wrapbox); g_object_set_data(G_OBJECT(sheets_dialog), "wrapbox_right", wrapbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), wrapbox); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); gtk_widget_show(wrapbox); g_object_set_data(G_OBJECT(wrapbox), "is_left", FALSE); option_menu = lookup_widget(sheets_dialog, "optionmenu_right"); @@ -306,12 +288,10 @@ sheets_dialog_create(void) wrapbox = gtk_bin_get_child (GTK_BIN(sw)); if (wrapbox) gtk_container_remove(GTK_CONTAINER(sw), wrapbox); - wrapbox = gtk_hwrap_box_new(FALSE); + wrapbox = gtk_grid_new (); g_object_ref(wrapbox); g_object_set_data(G_OBJECT(sheets_dialog), "wrapbox_left", wrapbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), wrapbox); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); gtk_widget_show(wrapbox); g_object_set_data(G_OBJECT(wrapbox), "is_left", (gpointer)TRUE); option_menu = lookup_widget(sheets_dialog, "optionmenu_left"); @@ -322,24 +302,18 @@ sheets_dialog_create(void) void create_object_pixmap(SheetObject *so, GtkWidget *parent, - GdkPixmap **pixmap, GdkBitmap **mask) + GdkPixbuf **pixmap) { GtkStyle *style; g_assert(so); g_assert(pixmap); - g_assert(mask); style = gtk_widget_get_style(parent); if (so->pixmap != NULL) { - *pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(parent), - mask, - &style->bg[GTK_STATE_NORMAL], - (gchar **)so->pixmap); + *pixmap = gdk_pixbuf_new_from_xpm_data((const gchar **)so->pixmap); } else { @@ -363,23 +337,16 @@ create_object_pixmap(SheetObject *so, GtkWidget *parent, g_object_unref (pixbuf); pixbuf = cropped; } - gdk_pixbuf_render_pixmap_and_mask(pixbuf, pixmap, mask, 1.0); - g_object_unref(pixbuf); + *pixmap = pixbuf; } else { message_warning ("%s", error->message); g_error_free (error); - *pixmap = gdk_pixmap_colormap_create_from_xpm_d - (NULL, - gtk_widget_get_colormap(parent), - mask, - &style->bg[GTK_STATE_NORMAL], - (gchar **)missing); + *pixmap = gdk_pixbuf_new_from_xpm_data((const gchar **)missing); } } else { *pixmap = NULL; - *mask = NULL; } } } @@ -398,7 +365,7 @@ lookup_widget (GtkWidget *widget, if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else - parent = widget->parent; + parent = gtk_widget_get_parent (widget); if (parent == NULL) break; widget = parent; diff --git a/app/sheets.h b/app/sheets.h index 6d6d4817c0f4ae6d89318fd0ceee8b0628a110d5..d3d0b914aba982cdf68e6b7bdd13b1584b81b940 100644 --- a/app/sheets.h +++ b/app/sheets.h @@ -55,7 +55,7 @@ struct _SheetObjectMod struct _SheetMod { - Sheet sheet; + DiaSheet sheet; enum { SHEETMOD_TYPE_NORMAL, SHEETMOD_TYPE_UNASSIGNED } type; /* reserved for future use */ @@ -70,11 +70,11 @@ extern GtkWidget *sheets_dialog; extern GtkWidget *sheets_dialog_optionmenu_menu; SheetObjectMod *sheets_append_sheet_object_mod(SheetObject *so, SheetMod *sm); -SheetMod *sheets_append_sheet_mods(Sheet *sheet); +SheetMod *sheets_append_sheet_mods(DiaSheet *sheet); void sheets_optionmenu_create(GtkWidget *option_menu, GtkWidget *wrapbox, gchar *sheet_name); void create_object_pixmap(SheetObject *so, GtkWidget *parent, - GdkPixmap **pixmap, GdkBitmap **mask); + GdkPixbuf **pixmap); gchar *sheet_object_mod_get_type_string(SheetObjectMod *som); diff --git a/app/sheets_dialog.c b/app/sheets_dialog.c index ce5358f5df90ef730745bed090473ebdc6703d2e..865ecfee6add78f5f4863289d7a9ca7d0ada3d4c 100644 --- a/app/sheets_dialog.c +++ b/app/sheets_dialog.c @@ -47,6 +47,7 @@ #include "intl.h" #include "persistence.h" +#include "dia_dirs.h" static void sheets_dialog_destroyed (GtkWidget *widget, gpointer user_data) @@ -57,9 +58,6 @@ sheets_dialog_destroyed (GtkWidget *widget, gpointer user_data) g_object_set_data (G_OBJECT(widget), "_sheet_dialogs_builder", NULL); } -/* FIXME: header? */ -gchar *build_ui_filename (const gchar* name); - static GtkBuilder * builder_new_from_file (const char *filename) { @@ -82,8 +80,6 @@ create_sheets_main_dialog (void) { GtkWidget *sheets_main_dialog; GtkWidget *optionmenu_left, *optionmenu_right; - GtkWidget *optionmenu_left_menu, *optionmenu_right_menu; - GtkWidget *glade_menuitem; GtkBuilder *builder; builder = builder_new_from_file ("ui/sheets-main-dialog.xml"); @@ -94,15 +90,8 @@ create_sheets_main_dialog (void) G_CALLBACK (sheets_dialog_destroyed), NULL); optionmenu_right = GTK_WIDGET (gtk_builder_get_object (builder, "optionmenu_right")); - optionmenu_right_menu = gtk_menu_new (); - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu_right), optionmenu_right_menu); optionmenu_left = GTK_WIDGET (gtk_builder_get_object (builder, "optionmenu_left")); - optionmenu_left_menu = gtk_menu_new (); - glade_menuitem = gtk_menu_item_new_with_label (""); - gtk_widget_show (glade_menuitem); - gtk_menu_append (GTK_MENU (optionmenu_left_menu), glade_menuitem); - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu_left), optionmenu_left_menu); g_signal_connect (gtk_builder_get_object (builder,"sheets_main_dialog"), "delete_event", G_CALLBACK (on_sheets_main_dialog_delete_event), @@ -250,27 +239,15 @@ create_sheets_shapeselection_dialog (void) GtkWidget *ok_button; GtkWidget *cancel_button1; - sheets_shapeselection_dialog = gtk_file_selection_new (_("Select SVG Shape File")); - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); - gtk_container_set_border_width (GTK_CONTAINER (sheets_shapeselection_dialog), 10); - - ok_button = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->ok_button; - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "ok_button", ok_button); - gtk_widget_show (ok_button); -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_default (GTK_WIDGET (ok_button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); -#endif + sheets_shapeselection_dialog = gtk_file_chooser_dialog_new (_("Select SVG Shape File"), + NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + NULL); - cancel_button1 = GTK_FILE_SELECTION (sheets_shapeselection_dialog)->cancel_button; - gtk_object_set_data (GTK_OBJECT (sheets_shapeselection_dialog), "cancel_button1", cancel_button1); - gtk_widget_show (cancel_button1); -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_default (GTK_WIDGET (cancel_button1), TRUE); -#else - GTK_WIDGET_SET_FLAGS (cancel_button1, GTK_CAN_DEFAULT); -#endif + ok_button = gtk_dialog_add_button (GTK_DIALOG (sheets_shapeselection_dialog), _("Open"), GTK_RESPONSE_OK); + cancel_button1 = gtk_dialog_add_button (GTK_DIALOG (sheets_shapeselection_dialog), _("Open"), GTK_RESPONSE_CANCEL); + + g_object_set_data (G_OBJECT (sheets_shapeselection_dialog), "sheets_shapeselection_dialog", sheets_shapeselection_dialog); g_signal_connect (G_OBJECT (ok_button), "clicked", G_CALLBACK (on_sheets_shapeselection_dialog_button_ok_clicked), diff --git a/app/sheets_dialog_callbacks.c b/app/sheets_dialog_callbacks.c index b21042ae72fb9f681bdfbcf73ff3c68b678e77cb..a8f07b7abfc2d23b3c9c498ff6f41ff8798978e7 100644 --- a/app/sheets_dialog_callbacks.c +++ b/app/sheets_dialog_callbacks.c @@ -54,8 +54,6 @@ #include #include -#include "gtkwrapbox.h" - #include "dia_dirs.h" #include "dia_xml_libxml.h" #include "plug-ins.h" @@ -255,7 +253,7 @@ sheets_dialog_wrapbox_add_line_break(GtkWidget *wrapbox) SheetMod *sm; GtkWidget *button; GtkStyle *style; - GdkPixmap *pixmap, *mask; + GdkPixbuf *pixmap, *mask; GtkWidget *gtkpixmap; sm = g_object_get_data(G_OBJECT(wrapbox), "sheet_mod"); @@ -272,18 +270,13 @@ sheets_dialog_wrapbox_add_line_break(GtkWidget *wrapbox) gtk_container_set_border_width(GTK_CONTAINER(button), 0); style = gtk_widget_get_style(wrapbox); - pixmap = - gdk_pixmap_colormap_create_from_xpm_d(NULL, - gtk_widget_get_colormap(wrapbox), - &mask, - &style->bg[GTK_STATE_NORMAL], - line_break_xpm); - - gtkpixmap = gtk_pixmap_new(pixmap, mask); + pixmap = gdk_pixbuf_new_from_xpm_data ((const gchar **) line_break_xpm); + + gtkpixmap = gtk_image_new_from_pixbuf (pixmap); gtk_container_add(GTK_CONTAINER(button), gtkpixmap); gtk_widget_show(gtkpixmap); - gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), button, FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), button, FALSE, TRUE, FALSE, TRUE);*/ gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Line Break")); @@ -319,7 +312,7 @@ sheets_dialog_create_object_button(SheetObjectMod *som, SheetMod *sm, GtkWidget *wrapbox) { GtkWidget *button; - GdkPixmap *pixmap, *mask; + GdkPixbuf *pixmap; GtkWidget *gtkpixmap; button = gtk_radio_button_new(radio_group); @@ -328,8 +321,8 @@ sheets_dialog_create_object_button(SheetObjectMod *som, SheetMod *sm, gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE); gtk_container_set_border_width(GTK_CONTAINER(button), 0); - create_object_pixmap(&som->sheet_object, wrapbox, &pixmap, &mask); - gtkpixmap = gtk_pixmap_new(pixmap, mask); + create_object_pixmap(&som->sheet_object, wrapbox, &pixmap); + gtkpixmap = gtk_image_new_from_pixbuf (pixmap); gtk_container_add(GTK_CONTAINER(button), gtkpixmap); gtk_widget_show(gtkpixmap); @@ -351,7 +344,7 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *wrapbox; - Sheet *sheet; + DiaSheet *sheet; GtkWidget *optionmenu; GSList *object_mod_list; GtkWidget *hidden_button; @@ -395,9 +388,6 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, radio_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(hidden_button)); - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(wrapbox), 4 * 1.0 / 9); - /* MCNFIXME: calculate this */ - g_object_set_data(G_OBJECT(wrapbox), "sheet_mod", user_data); for (object_mod_list = sheet->objects; object_mod_list; @@ -415,8 +405,8 @@ on_sheets_dialog_optionmenu_activate (GtkMenuItem *menuitem, button = sheets_dialog_create_object_button(som, user_data, wrapbox); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(wrapbox), button, - FALSE, TRUE, FALSE, TRUE, som->sheet_object.line_break); + /*gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(wrapbox), button, + FALSE, TRUE, FALSE, TRUE, som->sheet_object.line_break);*/ gtk_widget_show(button); } @@ -455,17 +445,7 @@ SheetsDialogMoveDir; #define \ SHEETS_DIALOG_MOVE_NONE SHEETS_DIALOG_MOVE_UP -static void -_gtk_wrap_box_set_child_forced_break (GtkWrapBox* box, GtkWidget* child, - gboolean wrapped) -{ - gboolean hexpand, hfill, vexpand, vfill, dummy; - gtk_wrap_box_query_child_packing (box, child, &hexpand, &hfill, - &vexpand, &vfill, &dummy); - gtk_wrap_box_set_child_packing (box, child, hexpand, hfill, - vexpand, vfill, wrapped); -} static void sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) { @@ -496,8 +476,6 @@ sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) } som->sheet_object.line_break = TRUE; - _gtk_wrap_box_set_child_forced_break(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(iter_list->data), TRUE); } else { @@ -509,8 +487,6 @@ sheets_dialog_normalize_line_breaks(GtkWidget *wrapbox, SheetsDialogMoveDir dir) } som->sheet_object.line_break = FALSE; - _gtk_wrap_box_set_child_forced_break(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(iter_list->data), FALSE); } is_line_break = FALSE; } @@ -590,8 +566,6 @@ sheets_dialog_move_up_or_down(SheetsDialogMoveDir dir) active_button = g_object_get_data(G_OBJECT(wrapbox), "active_button"); button_pos = g_list_index(button_list, active_button); - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), - GTK_WIDGET(active_button), button_pos + dir); g_list_free(button_list); sheets_dialog_normalize_line_breaks(wrapbox, dir); @@ -756,7 +730,7 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, SheetObjectMod *som; SheetMod *sm; SheetObject *sheet_obj; - Sheet *sheet; + DiaSheet *sheet; GtkWidget *optionmenu; case SHEETS_NEW_DIALOG_TYPE_SVG_SHAPE: @@ -845,8 +819,8 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, sm->mod = SHEETMOD_MOD_CHANGED; active_button = sheets_dialog_create_object_button(som, sm, wrapbox); - gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), active_button, - FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(wrapbox), active_button, + FALSE, TRUE, FALSE, TRUE);*/ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(active_button), TRUE); gtk_widget_show(active_button); @@ -861,8 +835,8 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, pos = g_list_index(button_list, active_button); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_last(button_list) ->data), TRUE); - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), - g_list_last(button_list)->data, pos + 1); + /*gtk_wrap_box_reorder_child(GTK_WRAP_BOX(wrapbox), + g_list_last(button_list)->data, pos + 1);*/ sheets_dialog_normalize_line_breaks(wrapbox, SHEETS_DIALOG_MOVE_NONE); @@ -891,7 +865,7 @@ on_sheets_new_dialog_button_ok_clicked (GtkButton *button, entry = lookup_widget(sheets_new_dialog, "entry_sheet_description"); sheet_descrip = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); - sheet = g_new0(Sheet, 1); + sheet = g_object_new (DIA_TYPE_SHEET, NULL); sheet->name = sheet_name; sheet->filename = ""; sheet->description = sheet_descrip; @@ -946,8 +920,8 @@ on_sheets_shapeselection_dialog_button_ok_clicked GtkWidget *entry; filename = - gtk_file_selection_get_filename( - GTK_FILE_SELECTION(sheets_shapeselection_dialog)); + gtk_file_chooser_get_filename( + GTK_FILE_CHOOSER(sheets_shapeselection_dialog)); entry = lookup_widget(sheets_new_dialog, "combo_entry_from_file"); /* Since this is a filename entry from the dialog, no utf is needed */ @@ -1458,8 +1432,8 @@ sheets_dialog_copy_object(GtkWidget *active_button, GtkWidget *target_wrapbox) sm->mod = SHEETMOD_MOD_CHANGED; button = sheets_dialog_create_object_button(som_new, sm, target_wrapbox); - gtk_wrap_box_pack(GTK_WRAP_BOX(target_wrapbox), button, - FALSE, TRUE, FALSE, TRUE); + /*gtk_wrap_box_pack(GTK_WRAP_BOX(target_wrapbox), button, + FALSE, TRUE, FALSE, TRUE);*/ gtk_widget_show(button); sheets_dialog_apply_revert_set_sensitive(TRUE); @@ -1599,7 +1573,7 @@ copy_file(gchar *src, gchar *dst) /* write a sheet to ~/.dia/sheets */ static gboolean -write_user_sheet(Sheet *sheet) +write_user_sheet(DiaSheet *sheet) { FILE *file; xmlDocPtr doc; @@ -1789,7 +1763,7 @@ touch_file(gchar *filename) static gint sheets_find_sheet(gconstpointer a, gconstpointer b) { - if (!strcmp(((Sheet *)a)->name, ((Sheet *)b)->name)) + if (!strcmp(((DiaSheet *)a)->name, ((DiaSheet *)b)->name)) return 0; else return 1; @@ -1815,7 +1789,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, { GSList *sheet_object_mods_list; GSList *list; - Sheet *new_sheet = NULL; + DiaSheet *new_sheet = NULL; case SHEETMOD_MOD_NEW: write_user_sheet(&sm->sheet); @@ -1823,7 +1797,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheet_object_mods_list = sm->sheet.objects; sm->sheet.objects = NULL; /* we have to transfer 'permanent' memory */ - new_sheet = g_new0 (Sheet, 1); + new_sheet = g_object_new (DIA_TYPE_SHEET, NULL); *new_sheet = sm->sheet; register_sheet(new_sheet); @@ -1841,8 +1815,8 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheet_append_sheet_obj(new_sheet, new_object); } - dia_sort_sheets(); - fill_sheet_menu(); + dia_sort_sheets(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_CHANGED: @@ -1854,7 +1828,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, sheets_list = g_slist_find_custom(sheets_list, &sm->sheet, sheets_find_sheet); g_assert(sheets_list); - ((Sheet *)(sheets_list->data))->objects = NULL; + ((DiaSheet *)(sheets_list->data))->objects = NULL; for (list = sheet_object_mods_list; list; list = g_slist_next(list)) { @@ -1869,7 +1843,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, *new_object = som->sheet_object; sheet_append_sheet_obj(sheets_list->data, new_object); } - fill_sheet_menu(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_DELETED: @@ -1886,7 +1860,7 @@ on_sheets_dialog_button_apply_clicked (GtkButton *button, g_warning ("No sheets left?"); dia_sort_sheets(); - fill_sheet_menu(); + /* TODO: Get ref to toolbox/avoid explicit call dia_toolbox_update_sheets (); */ break; case SHEETMOD_MOD_NONE: diff --git a/app/splash.c b/app/splash.c index fecf445f0a979e3b0a177f7a2b9fbf9bbc685373..0405f2e6793948f39c712784ebbf6f780b986e12 100644 --- a/app/splash.c +++ b/app/splash.c @@ -29,7 +29,7 @@ get_logo_pixmap (void) static GtkWidget* splash = NULL; static void -splash_expose (GtkWidget *widget, GdkEventExpose *event) +splash_draw (GtkWidget *widget, cairo_t *event) { /* this gets called after the splash screen gets exposed ... */ gtk_main_quit(); @@ -51,7 +51,7 @@ app_splash_init (const gchar* fname) gtk_window_set_resizable (GTK_WINDOW (splash), FALSE); gtk_window_set_position (GTK_WINDOW (splash), GTK_WIN_POS_CENTER); - vbox = gtk_vbox_new (FALSE, 2); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_add (GTK_CONTAINER(splash), vbox); @@ -71,10 +71,11 @@ app_splash_init (const gchar* fname) gtk_widget_show_all (splash); - signal_id = g_signal_connect_after(G_OBJECT(splash), "expose_event", - G_CALLBACK(splash_expose), NULL); + signal_id = g_signal_connect_after(G_OBJECT(splash), "draw", + G_CALLBACK(splash_draw), NULL); - /* splash_expose gets us out of this */ + /* splash_draw gets us out of this */ + /* TODO: Why? */ gtk_main(); g_signal_handler_disconnect(G_OBJECT(splash), signal_id); } diff --git a/app/textedit.c b/app/textedit.c index 6bd282f555f9ef44c9dcbe7aaec5fc03d8f5ebcb..976447934a49af4378ecc201fb964b3744855ccb 100644 --- a/app/textedit.c +++ b/app/textedit.c @@ -54,13 +54,13 @@ typedef struct TextEditChange { Text *text; } TextEditChange; -static void textedit_end_edit(DDisplay *ddisp, Focus *focus); +static void textedit_end_edit(DiaDisplay *ddisp, Focus *focus); /** Returns TRUE if the given display is currently in text-edit mode. */ gboolean -textedit_mode(DDisplay *ddisp) +textedit_mode(DiaDisplay *ddisp) { - return ddisplay_active_focus(ddisp) != NULL; + return dia_display_active_focus(ddisp) != NULL; } /** Perform the necessary changes to the display according to whether @@ -71,7 +71,7 @@ textedit_mode(DDisplay *ddisp) * @param ddisp The display to set according to mode. */ static void -textedit_display_change(DDisplay *ddisp) +textedit_display_change(DiaDisplay *ddisp) { } @@ -81,7 +81,7 @@ textedit_display_change(DDisplay *ddisp) * @param ddisp The display that editing happens in. */ static void -textedit_enter(DDisplay *ddisp) +textedit_enter(DiaDisplay *ddisp) { if (textedit_mode(ddisp)) { return; @@ -98,13 +98,13 @@ textedit_enter(DDisplay *ddisp) * @param ddisp The display that editing happens in. */ static void -textedit_exit(DDisplay *ddisp) +textedit_exit(DiaDisplay *ddisp) { if (!textedit_mode(ddisp)) { return; } - if (ddisplay_active_focus(ddisp) != NULL) { - textedit_end_edit(ddisp, ddisplay_active_focus(ddisp)); + if (dia_display_active_focus(ddisp) != NULL) { + textedit_end_edit(ddisp, dia_display_active_focus(ddisp)); } /* Set object-edit menus */ /* Set object-edit key-event handler */ @@ -119,13 +119,13 @@ textedit_exit(DDisplay *ddisp) * @param focus The text focus to edit */ static void -textedit_begin_edit(DDisplay *ddisp, Focus *focus) +textedit_begin_edit(DiaDisplay *ddisp, Focus *focus) { g_assert(dia_object_is_selected(focus_get_object(focus))); if (!textedit_mode(ddisp)) { textedit_enter(ddisp); } - ddisplay_set_active_focus(ddisp, focus); + dia_display_set_active_focus(ddisp, focus); highlight_object(focus->obj, DIA_HIGHLIGHT_TEXT_EDIT, ddisp->diagram); object_add_updates(focus->obj, ddisp->diagram); } @@ -137,7 +137,7 @@ textedit_begin_edit(DDisplay *ddisp, Focus *focus) * @param focus The text focus to stop editing */ static void -textedit_end_edit(DDisplay *ddisp, Focus *focus) +textedit_end_edit(DiaDisplay *ddisp, Focus *focus) { /* During destruction of the diagram the display may already be gone */ if (!ddisp) @@ -151,12 +151,12 @@ textedit_end_edit(DDisplay *ddisp, Focus *focus) highlight_object_off(focus->obj, ddisp->diagram); object_add_updates(focus->obj, ddisp->diagram); diagram_object_modified(ddisp->diagram, focus->obj); - ddisplay_set_active_focus(ddisp, NULL); + dia_display_set_active_focus(ddisp, NULL); } /** Move the text edit focus either backwards or forwards. */ Focus * -textedit_move_focus(DDisplay *ddisp, Focus *focus, gboolean forwards) +textedit_move_focus(DiaDisplay *ddisp, Focus *focus, gboolean forwards) { g_return_val_if_fail (ddisp != NULL, NULL); if (focus != NULL) { @@ -182,7 +182,7 @@ textedit_move_focus(DDisplay *ddisp, Focus *focus, gboolean forwards) * with doing request_focus(), which merely puts one in the focus list). */ void -textedit_activate_focus(DDisplay *ddisp, Focus *focus, Point *clicked) +textedit_activate_focus(DiaDisplay *ddisp, Focus *focus, Point *clicked) { Focus *old_focus = get_active_focus((DiagramData *) ddisp->diagram); if (old_focus != NULL) { @@ -203,7 +203,7 @@ textedit_activate_focus(DDisplay *ddisp, Focus *focus, Point *clicked) * Returns true if there is something to text edit. */ gboolean -textedit_activate_object(DDisplay *ddisp, DiaObject *obj, Point *clicked) +textedit_activate_object(DiaDisplay *ddisp, DiaObject *obj, Point *clicked) { Focus *new_focus; @@ -232,7 +232,7 @@ textedit_activate_object(DDisplay *ddisp, DiaObject *obj, Point *clicked) * text to edit, otherwise it will take us out of text-edit mode. */ gboolean -textedit_activate_first(DDisplay *ddisp) +textedit_activate_first(DiaDisplay *ddisp) { Focus *new_focus = NULL; GList *tmp, *selected = diagram_get_sorted_selected(ddisp->diagram); @@ -269,14 +269,14 @@ textedit_activate_first(DDisplay *ddisp) void textedit_deactivate_focus(void) { - if (ddisplay_active() != NULL) { - DiagramData *dia = (DiagramData *) ddisplay_active()->diagram; + if (dia_display_active() != NULL) { + DiagramData *dia = (DiagramData *) dia_display_active()->diagram; Focus *focus = get_active_focus(dia); if (focus != NULL) { remove_focus_on_diagram(dia); } /* This also ends the edit */ - textedit_exit(ddisplay_active()); + textedit_exit(dia_display_active()); } } @@ -291,8 +291,8 @@ textedit_remove_focus(DiaObject *obj, Diagram *diagram) /* TODO: make sure the focus is deactivated */ } /* This also ends the edit */ - if (ddisplay_active() != NULL) { - textedit_exit(ddisplay_active()); + if (dia_display_active() != NULL) { + textedit_exit(dia_display_active()); } } @@ -308,8 +308,8 @@ textedit_remove_focus_all(Diagram *diagram) } reset_foci_on_diagram((DiagramData *) diagram); /* This also ends the edit */ - if (ddisplay_active() != NULL) { - textedit_exit(ddisplay_active()); + if (dia_display_active() != NULL) { + textedit_exit(dia_display_active()); } } diff --git a/app/textedit.h b/app/textedit.h index 2e2b63d97fdc1cb3706c3eef8bd1576a7fb6828a..1a7fad2f6045f1b99e4a7ca6360032d2d64d2320 100644 --- a/app/textedit.h +++ b/app/textedit.h @@ -24,12 +24,12 @@ #include "diatypes.h" #include "display.h" -Focus *textedit_move_focus(DDisplay *ddisp, Focus *focus, gboolean forwards); +Focus *textedit_move_focus(DiaDisplay *ddisp, Focus *focus, gboolean forwards); -gboolean textedit_mode(DDisplay *ddisp); -void textedit_activate_focus(DDisplay *ddisp, Focus *focus, Point *clicked); -gboolean textedit_activate_object(DDisplay *ddisp, DiaObject *obj, Point *clicked); -gboolean textedit_activate_first(DDisplay *ddisp); +gboolean textedit_mode(DiaDisplay *ddisp); +void textedit_activate_focus(DiaDisplay *ddisp, Focus *focus, Point *clicked); +gboolean textedit_activate_object(DiaDisplay *ddisp, DiaObject *obj, Point *clicked); +gboolean textedit_activate_first(DiaDisplay *ddisp); void textedit_deactivate_focus(void); void textedit_remove_focus(DiaObject *obj, Diagram *diagram); void textedit_remove_focus_all(Diagram *diagram); diff --git a/app/tool.c b/app/tool.c deleted file mode 100644 index 492af30cd86a475fa0fd00a8c6f1cd0b547ad09e..0000000000000000000000000000000000000000 --- a/app/tool.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 "tool.h" -#include "create_object.h" -#include "magnify.h" -#include "modify_tool.h" -#include "scroll_tool.h" -#include "textedit_tool.h" -#include "interface.h" -#include "defaults.h" -#include "object.h" - -Tool *active_tool = NULL; -Tool *transient_tool = NULL; -static GtkWidget *active_button = NULL; -static GtkWidget *former_button = NULL; - -void -tool_select_former(void) -{ - if (former_button) { - g_signal_emit_by_name(G_OBJECT(former_button), "clicked", - GTK_BUTTON(former_button), NULL); - } -} - -void -tool_reset(void) -{ - g_signal_emit_by_name(G_OBJECT(modify_tool_button), "clicked", - GTK_BUTTON(modify_tool_button), NULL); -} - -void -tool_get(ToolState *state) -{ - state->type = active_tool->type; - state->button = active_button; - if (state->type == CREATE_OBJECT_TOOL) { - state->user_data = ((CreateObjectTool *)active_tool)->user_data; - state->extra_data = ((CreateObjectTool *)active_tool)->objtype->name; - state->invert_persistence = ((CreateObjectTool *)active_tool)->invert_persistence; - } - else - { - state->user_data = NULL; - state->extra_data = NULL; - state->invert_persistence = 0; - } -} - -void -tool_restore(const ToolState *state) -{ - tool_select(state->type, state->extra_data, state->user_data, state->button, - state->invert_persistence); -} - -void -tool_free(Tool *tool) -{ - switch(tool->type) { - case MODIFY_TOOL: - free_modify_tool(tool); - break; - case CREATE_OBJECT_TOOL: - free_create_object_tool(tool); - break; - case MAGNIFY_TOOL: - free_magnify_tool(tool); - break; - case SCROLL_TOOL: - free_scroll_tool(tool); - break; - case TEXTEDIT_TOOL : - free_textedit_tool(tool); - break; - default: - g_assert(0); - } -} - -void -tool_select(ToolType type, gpointer extra_data, - gpointer user_data, GtkWidget *button, - int invert_persistence) -{ - if (button) - former_button = active_button; - - tool_free(active_tool); - switch(type) { - case MODIFY_TOOL: - active_tool = create_modify_tool(); - break; - case CREATE_OBJECT_TOOL: - active_tool = - create_create_object_tool(object_get_type((char *)extra_data), - (void *) user_data, invert_persistence); - break; - case MAGNIFY_TOOL: - active_tool = create_magnify_tool(); - break; - case SCROLL_TOOL: - active_tool = create_scroll_tool(); - break; - case TEXTEDIT_TOOL : - active_tool = create_textedit_tool(); - break; - default: - g_assert(0); - } - if (button) - active_button = button; -} - -void -tool_options_dialog_show(ToolType type, gpointer extra_data, - gpointer user_data, GtkWidget *button, - int invert_persistence) -{ - DiaObjectType *objtype; - - if (active_tool->type != type) - tool_select(type,extra_data,user_data,button,invert_persistence); - - switch(type) { - case MODIFY_TOOL: - break; - case CREATE_OBJECT_TOOL: - objtype = object_get_type((char *)extra_data); - defaults_show(objtype, user_data); - break; - case MAGNIFY_TOOL: - break; - case SCROLL_TOOL: - break; - case TEXTEDIT_TOOL : - break; - } -} diff --git a/app/tool.h b/app/tool.h deleted file mode 100644 index 174eda1a4e1f97c4b2b42da32347ef305373461c..0000000000000000000000000000000000000000 --- a/app/tool.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 TOOL_H -#define TOOL_H - -#include - -typedef struct _Tool Tool; -typedef struct _ToolState ToolState; - -typedef enum _ToolType ToolType; - -#include "display.h" - -typedef void (* ButtonPressFunc) (Tool *, GdkEventButton *, DDisplay *ddisp); -typedef void (* ButtonHoldFunc) (Tool *, GdkEventButton *, DDisplay *ddisp); -typedef void (* DoubleClickFunc) (Tool *, GdkEventButton *, DDisplay *ddisp); -typedef void (* ButtonReleaseFunc) (Tool *, GdkEventButton *, DDisplay *ddisp); -typedef void (* MotionFunc) (Tool *, GdkEventMotion *, DDisplay *ddisp); - -enum _ToolType { - CREATE_OBJECT_TOOL, - MAGNIFY_TOOL, - MODIFY_TOOL, - SCROLL_TOOL, - TEXTEDIT_TOOL -}; - -struct _Tool { - ToolType type; - - /* Action functions */ - ButtonPressFunc button_press_func; - ButtonHoldFunc button_hold_func; - ButtonReleaseFunc button_release_func; - MotionFunc motion_func; - DoubleClickFunc double_click_func; -}; - -struct _ToolState { - ToolType type; - gpointer extra_data; - gpointer user_data; - GtkWidget *button; - int invert_persistence; -}; - -extern Tool *active_tool, *transient_tool; - -void tool_get(ToolState *state); -void tool_restore(const ToolState *state); -void tool_free(Tool *tool); -void tool_select(ToolType type, gpointer extra_data, gpointer user_date, - GtkWidget *button, int invert_persistence); -void tool_select_former(void); -void tool_reset(void); -void tool_options_dialog_show(ToolType type, gpointer extra_data, - gpointer user_data,GtkWidget *button, - int invert_persistence); - -#endif /* TOOL_H */ diff --git a/app/toolbox.c b/app/toolbox.c index 8fdb424e1092ef8aa122af0dd9fc141c9e47691b..cc764282395e0f3daa19f49d009400b228de7e2a 100644 --- a/app/toolbox.c +++ b/app/toolbox.c @@ -19,21 +19,18 @@ #include #include -#include "gtkwrapbox.h" -#include "gtkhwrapbox.h" -#include "diaarrowchooser.h" -#include "dialinechooser.h" -#include "diadynamicmenu.h" #include "attributes.h" #include "sheet.h" -#include "color_area.h" +#include "dia-colour-area.h" +#include "dia-line-width-area.h" +#include "widgets/dia-sheet-chooser.h" +#include "widgets/dia-arrow-chooser.h" #include "intl.h" #include "message.h" #include "object.h" #include "widgets.h" -#include "linewidth_area.h" #include "preferences.h" #include "persistence.h" @@ -41,9 +38,17 @@ #include "pixmaps/missing.xpm" +#include "tools/textedit_tool.h" +#include "tools/create_object.h" +#include "tools/magnify.h" +#include "tools/modify_tool.h" +#include "tools/scroll_tool.h" + #include #include "dia-app-icons.h" +G_DEFINE_TYPE (DiaToolbox, dia_toolbox, GTK_TYPE_BOX) + /* HB: file dnd stuff lent by The Gimp, not fully understood but working ... */ enum @@ -61,9 +66,6 @@ static GtkTargetEntry toolbox_target_table[] = static guint toolbox_n_targets = (sizeof (toolbox_target_table) / sizeof (toolbox_target_table[0])); -static GtkWidget *sheet_option_menu; -static GtkWidget *sheet_wbox; - GtkWidget *modify_tool_button; gchar *interface_current_sheet_name; static GSList *tool_group = NULL; @@ -159,14 +161,12 @@ ToolButton tool_data[] = "I", "ToolsImage", { CREATE_OBJECT_TOOL, "Standard - Image", NULL } -#ifdef HAVE_CAIRO }, { NULL, N_("Outline"), NULL, "ToolsOutline", { CREATE_OBJECT_TOOL, "Standard - Outline", NULL } -#endif } }; @@ -178,12 +178,12 @@ const int num_tools = NUM_TOOLS; static GtkWidget *tool_widgets[NUM_TOOLS]; -static Sheet * +static DiaSheet * get_sheet_by_name(const gchar *name) { GSList *tmp; for (tmp = get_sheets_list(); tmp != NULL; tmp = tmp->next) { - Sheet *sheet = tmp->data; + DiaSheet *sheet = tmp->data; /* There is something fishy with comparing both forms: the english and the localized one. * But we should be on the safe side here, especially when bug #328570 gets tackled. */ @@ -245,24 +245,18 @@ tool_setup_drag_source(GtkWidget *button, ToolButtonData *tooldata, } static void -fill_sheet_wbox(Sheet *sheet) +fill_sheet_wbox (DiaToolbox *self, DiaSheet *sheet) { - int rows; + int i = 0; GSList *tmp; GtkWidget *first_button = NULL; - - gtk_container_foreach(GTK_CONTAINER(sheet_wbox), - (GtkCallback)gtk_widget_destroy, NULL); - tool_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(tool_widgets[0])); + gtk_container_foreach (GTK_CONTAINER (self->items), + (GtkCallback) gtk_widget_destroy, NULL); + tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (tool_widgets[0])); /* Remember sheet 'name' for 'Sheets and Objects' dialog */ interface_current_sheet_name = sheet->name; - /* set the aspect ratio on the wbox */ - rows = ceil(g_slist_length(sheet->objects) / (double)COLUMNS); - if (rows<1) rows = 1; - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(sheet_wbox), - COLUMNS * 1.0 / rows); for (tmp = sheet->objects; tmp != NULL; tmp = tmp->next) { SheetObject *sheet_obj = tmp->data; GdkPixbuf *pixbuf = NULL; @@ -277,22 +271,22 @@ fill_sheet_wbox(Sheet *sheet) pixbuf = gdk_pixbuf_new_from_file(sheet_obj->pixmap_file, &gerror); if (pixbuf != NULL) { - int width = gdk_pixbuf_get_width (pixbuf); - int height = gdk_pixbuf_get_height (pixbuf); - if (width > 22 && prefs.fixed_icon_size) { - GdkPixbuf *cropped; - g_warning ("Shape icon '%s' size wrong, cropped.", sheet_obj->pixmap_file); - cropped = gdk_pixbuf_new_subpixbuf (pixbuf, - (width - 22) / 2, height > 22 ? (height - 22) / 2 : 0, - 22, height > 22 ? 22 : height); - g_object_unref (pixbuf); - pixbuf = cropped; - } + int width = gdk_pixbuf_get_width (pixbuf); + int height = gdk_pixbuf_get_height (pixbuf); + if (width > 22 && prefs.fixed_icon_size) { + GdkPixbuf *cropped; + g_warning ("Shape icon '%s' size wrong, cropped.", sheet_obj->pixmap_file); + cropped = gdk_pixbuf_new_subpixbuf (pixbuf, + (width - 22) / 2, height > 22 ? (height - 22) / 2 : 0, + 22, height > 22 ? 22 : height); + g_object_unref (pixbuf); + pixbuf = cropped; + } } else { - pixbuf = gdk_pixbuf_new_from_xpm_data (missing); + pixbuf = gdk_pixbuf_new_from_xpm_data (missing); - message_warning("failed to load icon for file\n %s\n cause=%s", - sheet_obj->pixmap_file,gerror?gerror->message:"[NULL]"); + message_warning("failed to load icon for file\n %s\n cause=%s", + sheet_obj->pixmap_file,gerror?gerror->message:"[NULL]"); } } else { DiaObjectType *type; @@ -307,15 +301,16 @@ fill_sheet_wbox(Sheet *sheet) button = gtk_radio_button_new (tool_group); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); - gtk_container_set_border_width (GTK_CONTAINER (button), 0); tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); gtk_container_add (GTK_CONTAINER (button), image); - gtk_widget_show(image); + gtk_widget_show (image); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(sheet_wbox), button, - FALSE, TRUE, FALSE, TRUE, sheet_obj->line_break); - gtk_widget_show(button); + if (sheet_obj->line_break) { + i += COLUMNS - (i % COLUMNS); + } + gtk_grid_attach (GTK_GRID (self->items), button, i % COLUMNS, i / COLUMNS, 1, 1); + gtk_widget_show (button); data = g_new(ToolButtonData, 1); data->type = CREATE_OBJECT_TOOL; @@ -334,243 +329,199 @@ fill_sheet_wbox(Sheet *sheet) g_object_unref(pixbuf); gtk_widget_set_tooltip_text (button, gettext(sheet_obj->description)); + + i++; } /* If the selection is in the old sheet, steal it */ if (active_tool != NULL && - active_tool->type == CREATE_OBJECT_TOOL && + DIA_IS_CREATE_TOOL (active_tool) && first_button != NULL) g_signal_emit_by_name(G_OBJECT(first_button), "toggled", GTK_BUTTON(first_button), NULL); } static void -sheet_option_menu_changed(DiaDynamicMenu *menu, gpointer user_data) -{ - char *string = dia_dynamic_menu_get_entry(menu); - Sheet *sheet = get_sheet_by_name(string); - if (sheet == NULL) { - message_warning(_("No sheet named %s"), string); - } else { - persistence_set_string("last-sheet-selected", string); - fill_sheet_wbox(sheet); - } - g_free(string); -} - -static int -cmp_names (const void *a, const void *b) -{ - return g_utf8_collate(gettext( (gchar *)a ), gettext( (gchar *)b )); -} - -static GList * -get_sheet_names() +sheet_selected (DiaSheetChooser *chooser, + DiaSheet *sheet, + DiaToolbox *self) { - GSList *tmp; - GList *names = NULL; - for (tmp = get_sheets_list(); tmp != NULL; tmp = tmp->next) { - Sheet *sheet = tmp->data; - names = g_list_append(names, sheet->name); - } - /* Already sorted in lib/ but here we sort by the localized (display-)name */ - return g_list_sort (names, cmp_names); + persistence_set_string ("last-sheet-selected", DIA_SHEET (sheet)->name); + fill_sheet_wbox (self, sheet); } static void -create_sheet_dropdown_menu(GtkWidget *parent) +create_sheet_dropdown_menu (DiaToolbox *self) { - GList *sheet_names = get_sheet_names(); - - if (sheet_option_menu != NULL) { - gtk_container_remove(GTK_CONTAINER(parent), sheet_option_menu); - sheet_option_menu = NULL; + GSList *sheets = get_sheets_list(); + GSList *l; + GtkWidget *button; + DiaSheet *tmp; + gchar *sheetname; + DiaSheet *sheet; + + self->sheets = g_list_store_new (DIA_TYPE_SHEET); + + /* TODO: Handle this & translations better */ + tmp = get_sheet_by_name ("Assorted"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + tmp = get_sheet_by_name ("Flowchart"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + tmp = get_sheet_by_name ("UML"); + g_object_set_data (G_OBJECT (tmp), "dia-list-top", GINT_TO_POINTER (TRUE)); + g_list_store_append (self->sheets, tmp); + + for (l = sheets; l != NULL; l = l->next) { + if (g_strcmp0 (DIA_SHEET (l->data)->name, "Assorted") == 0 || + g_strcmp0 (DIA_SHEET (l->data)->name, "Flowchart") == 0 || + g_strcmp0 (DIA_SHEET (l->data)->name, "UML") == 0) { + continue; + } + g_list_store_append (self->sheets, DIA_SHEET (l->data)); } - sheet_option_menu = - dia_dynamic_menu_new_stringlistbased(_("Other sheets"), sheet_names, - NULL, "sheets"); - g_signal_connect(DIA_DYNAMIC_MENU(sheet_option_menu), "value-changed", - G_CALLBACK(sheet_option_menu_changed), sheet_option_menu); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "Assorted"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "Flowchart"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - "UML"); - /* gtk_widget_set_size_request(sheet_option_menu, 20, -1);*/ - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), sheet_option_menu, - TRUE, TRUE, FALSE, FALSE, TRUE); - /* 15 was a magic number that goes beyond the standard objects and the divider. */ - gtk_wrap_box_reorder_child(GTK_WRAP_BOX(parent), - sheet_option_menu, NUM_TOOLS+1); - gtk_widget_show(sheet_option_menu); -} + button = dia_sheet_chooser_new (); + g_signal_connect (G_OBJECT (button), "sheet-selected", + G_CALLBACK (sheet_selected), self); -void -fill_sheet_menu(void) -{ - gchar *selection = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(sheet_option_menu)); - create_sheet_dropdown_menu(gtk_widget_get_parent(sheet_option_menu)); - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), selection); - g_free(selection); + sheetname = persistence_register_string ("last-sheet-selected", _("Flowchart")); + sheet = get_sheet_by_name (sheetname); + fill_sheet_wbox (self, sheet); + g_free (sheetname); + + dia_sheet_chooser_set_model (DIA_SHEET_CHOOSER (button), G_LIST_MODEL (self->sheets), sheet); + gtk_box_pack_start (GTK_BOX (self), button, FALSE, FALSE, 0); + gtk_widget_show (button); } static void -create_sheets(GtkWidget *parent) +create_sheets (DiaToolbox *self) { - GtkWidget *separator; - GtkWidget *label; GtkWidget *swin; - gchar *sheetname; - Sheet *sheet; - separator = gtk_hseparator_new (); - /* add a bit of padding around the separator */ - label = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(label), separator, TRUE, TRUE, 3); - gtk_widget_show(label); - - gtk_wrap_box_pack_wrapped (GTK_WRAP_BOX(parent), label, TRUE,TRUE, FALSE,FALSE, TRUE); - gtk_widget_show(separator); - - create_sheet_dropdown_menu(parent); - - swin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), swin, TRUE, TRUE, TRUE, TRUE, TRUE); - gtk_widget_show(swin); - - sheet_wbox = gtk_hwrap_box_new(FALSE); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(sheet_wbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(sheet_wbox), GTK_JUSTIFY_LEFT); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), sheet_wbox); - gtk_widget_show(sheet_wbox); - - sheetname = persistence_register_string("last-sheet-selected", _("Flowchart")); - sheet = get_sheet_by_name(sheetname); - if (sheet == NULL) { - /* Couldn't find it */ - } else { - fill_sheet_wbox(sheet); - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(sheet_option_menu), - sheetname); - } - g_free(sheetname); + self->items = g_object_new (GTK_TYPE_GRID, + "column-homogeneous", TRUE, + "column-spacing", 4, + "row-spacing", 4, + NULL); + + create_sheet_dropdown_menu (self); + + swin = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (swin), + TRUE); + gtk_box_pack_start (GTK_BOX (self), swin, FALSE, FALSE, 0); + gtk_widget_show (swin); + + gtk_container_add (GTK_CONTAINER (swin), self->items); + gtk_widget_show (self->items); } static void -create_color_area (GtkWidget *parent) +create_color_area (DiaToolbox *self) { - GtkWidget *frame; - GtkWidget *alignment; GtkWidget *col_area; GtkWidget *line_area; - GtkStyle *style; GtkWidget *hbox; - gtk_widget_ensure_style(parent); - style = gtk_widget_get_style(parent); - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), frame, TRUE, TRUE, FALSE, FALSE, TRUE); - - hbox = gtk_hbox_new (FALSE, 1); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); - gtk_container_add (GTK_CONTAINER (frame), hbox); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_end (GTK_BOX (self), hbox, FALSE, FALSE, 0); /* Color area: */ - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - - col_area = color_area_create (54, 42, parent, style); - gtk_container_add (GTK_CONTAINER (alignment), col_area); - - - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - gtk_widget_set_tooltip_text (col_area, - _("Foreground & background colors for new objects. " - "The small black and white squares reset colors. " - "The small arrows swap colors. Double-click to " - "change colors.")); - - gtk_widget_show (alignment); + col_area = dia_colour_area_new (54, 42); + gtk_widget_set_halign (col_area, GTK_ALIGN_CENTER); + gtk_widget_set_valign (col_area, GTK_ALIGN_CENTER); + gtk_box_pack_start (GTK_BOX (hbox), col_area, TRUE, TRUE, 0); /* Linewidth area: */ - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_container_set_border_width (GTK_CONTAINER (alignment), 3); - - line_area = linewidth_area_create (); - gtk_container_add (GTK_CONTAINER (alignment), line_area); - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - gtk_widget_set_tooltip_text(line_area, _("Line widths. Click on a line to set the default line width for new objects. Double-click to set the line width more precisely.")); - gtk_widget_show (alignment); + line_area = dia_line_width_area_new (); + gtk_widget_set_halign (col_area, GTK_ALIGN_CENTER); + gtk_widget_set_valign (col_area, GTK_ALIGN_CENTER); + gtk_box_pack_start (GTK_BOX (hbox), line_area, TRUE, TRUE, 0); gtk_widget_show (col_area); gtk_widget_show (line_area); gtk_widget_show (hbox); - gtk_widget_show (frame); } static void -change_start_arrow_style(Arrow arrow, gpointer user_data) +change_start_arrow_style (DiaArrowChooser *chooser, gpointer user_data) { - attributes_set_default_start_arrow(arrow); + attributes_set_default_start_arrow (dia_arrow_chooser_get_arrow (chooser)); } + static void -change_end_arrow_style(Arrow arrow, gpointer user_data) +change_end_arrow_style (DiaArrowChooser *chooser, gpointer user_data) { - attributes_set_default_end_arrow(arrow); + attributes_set_default_end_arrow (dia_arrow_chooser_get_arrow (chooser)); } + static void -change_line_style(LineStyle lstyle, real dash_length, gpointer user_data) +change_line_style(DiaLineChooser *selector, gpointer user_data) { - attributes_set_default_line_style(lstyle, dash_length); + LineStyle lstyle; + real dash_length; + dia_line_chooser_get_line_style (selector, &lstyle, &dash_length); + attributes_set_default_line_style (lstyle, dash_length); } static void -create_lineprops_area(GtkWidget *parent) +create_lineprops_area (DiaToolbox *self) { + GtkWidget *box; GtkWidget *chooser; Arrow arrow; real dash_length; LineStyle style; gchar *arrow_name; - chooser = dia_arrow_chooser_new(TRUE, change_start_arrow_style, NULL); - gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent), chooser, FALSE, TRUE, FALSE, TRUE, TRUE); - arrow.width = persistence_register_real("start-arrow-width", DEFAULT_ARROW_WIDTH); - arrow.length = persistence_register_real("start-arrow-length", DEFAULT_ARROW_LENGTH); - arrow_name = persistence_register_string("start-arrow-type", "None"); - arrow.type = arrow_type_from_name(arrow_name); - g_free(arrow_name); - dia_arrow_chooser_set_arrow(DIA_ARROW_CHOOSER(chooser), &arrow); - attributes_set_default_start_arrow(arrow); - gtk_widget_set_tooltip_text(chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); - gtk_widget_show(chooser); - - chooser = dia_line_chooser_new(change_line_style, NULL); - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), chooser, TRUE, TRUE, FALSE, TRUE); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous (GTK_BOX (box), TRUE); + gtk_style_context_add_class (gtk_widget_get_style_context (box), + GTK_STYLE_CLASS_LINKED); + gtk_box_pack_end (GTK_BOX (self), box, FALSE, FALSE, 0); + gtk_widget_show (box); + + chooser = dia_arrow_chooser_new (TRUE); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_start_arrow_style), NULL); + gtk_container_add (GTK_CONTAINER (box), chooser); + arrow.width = persistence_register_real ("start-arrow-width", DEFAULT_ARROW_WIDTH); + arrow.length = persistence_register_real ("start-arrow-length", DEFAULT_ARROW_LENGTH); + arrow_name = persistence_register_string ("start-arrow-type", "None"); + arrow.type = arrow_type_from_name (arrow_name); + g_free (arrow_name); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (chooser), &arrow); + attributes_set_default_start_arrow (arrow); + gtk_widget_set_tooltip_text (chooser, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); + gtk_widget_show (chooser); + + chooser = dia_line_chooser_new (); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_line_style), NULL); + gtk_container_add (GTK_CONTAINER (box), chooser); gtk_widget_set_tooltip_text (chooser, _("Line style for new lines. Click to pick a line style, or set line style parameters with Details\342\200\246")); - style = persistence_register_integer("line-style", LINESTYLE_SOLID); - dash_length = persistence_register_real("dash-length", DEFAULT_LINESTYLE_DASHLEN); - dia_line_chooser_set_line_style(DIA_LINE_CHOOSER(chooser), style, dash_length); - gtk_widget_show(chooser); - - chooser = dia_arrow_chooser_new(FALSE, change_end_arrow_style, NULL); - arrow.width = persistence_register_real("end-arrow-width", DEFAULT_ARROW_WIDTH); - arrow.length = persistence_register_real("end-arrow-length", DEFAULT_ARROW_LENGTH); - arrow_name = persistence_register_string("end-arrow-type", "Filled Concave"); - arrow.type = arrow_type_from_name(arrow_name); - g_free(arrow_name); - dia_arrow_chooser_set_arrow(DIA_ARROW_CHOOSER(chooser), &arrow); - attributes_set_default_end_arrow(arrow); - - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), chooser, FALSE, TRUE, FALSE, TRUE); - gtk_widget_set_tooltip_text(chooser, _("Arrow style at the end of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); - gtk_widget_show(chooser); + style = persistence_register_integer ("line-style", LINESTYLE_SOLID); + dash_length = persistence_register_real ("dash-length", DEFAULT_LINESTYLE_DASHLEN); + dia_line_chooser_set_line_style (DIA_LINE_CHOOSER (chooser), style, dash_length); + gtk_widget_show (chooser); + + chooser = dia_arrow_chooser_new (FALSE); + g_signal_connect (G_OBJECT (chooser), "value-changed", + G_CALLBACK (change_end_arrow_style), NULL); + gtk_container_add (GTK_CONTAINER (box), chooser); + arrow.width = persistence_register_real ("end-arrow-width", DEFAULT_ARROW_WIDTH); + arrow.length = persistence_register_real ("end-arrow-length", DEFAULT_ARROW_LENGTH); + arrow_name = persistence_register_string ("end-arrow-type", "Filled Concave"); + arrow.type = arrow_type_from_name (arrow_name); + g_free (arrow_name); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (chooser), &arrow); + attributes_set_default_end_arrow (arrow); + gtk_widget_set_tooltip_text (chooser, _("Arrow style at the end of new lines. Click to pick an arrow, or set arrow parameters with Details\342\200\246")); + gtk_widget_show (chooser); } void @@ -605,14 +556,18 @@ tool_get_pixbuf (ToolButton *tb) type = object_get_type((char *)tb->callback_data.extra_data); if (type == NULL) - icon_data = tool_data[0].icon_data; + icon_data = NULL; else icon_data = type->pixmap; } else { icon_data = tb->icon_data; } - if (strncmp((char*)icon_data, "GdkP", 4) == 0) { + if (icon_data == NULL) { + pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + "image-missing", 22, + 0, NULL); + } else if (strncmp((char*)icon_data, "GdkP", 4) == 0) { pixbuf = gdk_pixbuf_new_from_inline(-1, (guint8*)icon_data, TRUE, NULL); } else { const char **pixmap_data = icon_data; @@ -644,7 +599,7 @@ create_widget_from_xpm_or_gdkp(const char **icon_data, GtkWidget *button, GdkPix } static void -create_tools(GtkWidget *parent) +create_tools (DiaToolbox *self) { GtkWidget *button; GdkPixbuf *pixbuf = NULL; @@ -653,15 +608,17 @@ create_tools(GtkWidget *parent) const char **pixmap_data; int i; + self->tools = gtk_grid_new (); + gtk_widget_show (self->tools); + gtk_box_pack_start (GTK_BOX (self), self->tools, FALSE, FALSE, 0); + for (i = 0; i < NUM_TOOLS; i++) { tool_widgets[i] = button = gtk_radio_button_new (tool_group); - gtk_container_set_border_width (GTK_CONTAINER (button), 0); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_HALF); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); tool_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); - gtk_wrap_box_pack(GTK_WRAP_BOX(parent), button, - TRUE, TRUE, FALSE, TRUE); + gtk_grid_attach (GTK_GRID (self->tools), button, i % COLUMNS, i / COLUMNS, 1, 1); if (tool_data[i].callback_data.type == MODIFY_TOOL) { modify_tool_button = GTK_WIDGET(button); @@ -669,19 +626,19 @@ create_tools(GtkWidget *parent) if (tool_data[i].icon_data==NULL) { DiaObjectType *type; - type = - object_get_type((char *)tool_data[i].callback_data.extra_data); + type = object_get_type((char *)tool_data[i].callback_data.extra_data); if (type == NULL) - pixmap_data = tool_data[0].icon_data; + pixmap_data = tool_data[0].icon_data; else - pixmap_data = type->pixmap; + pixmap_data = type->pixmap; image = create_widget_from_xpm_or_gdkp(pixmap_data, button, &pixbuf); } else { image = create_widget_from_xpm_or_gdkp(tool_data[i].icon_data, button, &pixbuf); } - /* GTKBUG:? padding changes */ - gtk_misc_set_padding(GTK_MISC(image), 2, 2); + g_object_set (G_OBJECT (image), + "margin", 2, + NULL); gtk_container_add (GTK_CONTAINER (button), image); @@ -702,21 +659,19 @@ create_tools(GtkWidget *parent) tool_data[i].callback_data.widget = button; if (tool_data[i].tool_accelerator) { - guint key; - GdkModifierType mods; - gchar *alabel, *atip; - - gtk_accelerator_parse (tool_data[i].tool_accelerator, &key, &mods); + guint key; + GdkModifierType mods; + gchar *alabel, *atip; - alabel = gtk_accelerator_get_label(key, mods); - atip = g_strconcat(gettext(tool_data[i].tool_desc), " (", alabel, ")", NULL); - gtk_widget_set_tooltip_text (button, atip); - g_free (atip); - g_free (alabel); + gtk_accelerator_parse (tool_data[i].tool_accelerator, &key, &mods); + alabel = gtk_accelerator_get_label(key, mods); + atip = g_strconcat(gettext(tool_data[i].tool_desc), " (", alabel, ")", NULL); + gtk_widget_set_tooltip_text (button, atip); + g_free (atip); + g_free (alabel); } else { - gtk_widget_set_tooltip_text (button, - gettext(tool_data[i].tool_desc)); + gtk_widget_set_tooltip_text (button, gettext(tool_data[i].tool_desc)); } gtk_widget_show (image); @@ -724,33 +679,37 @@ create_tools(GtkWidget *parent) } } -GtkWidget * -toolbox_create(void) +static void +dia_toolbox_class_init (DiaToolboxClass *class) { - GtkWidget *wrapbox; - - wrapbox = gtk_hwrap_box_new(FALSE); - gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(wrapbox), 144.0 / 318.0); - gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_TOP); - gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox), GTK_JUSTIFY_LEFT); - - - /* pack the rest of the stuff */ - gtk_container_set_border_width (GTK_CONTAINER (wrapbox), 0); - gtk_widget_show (wrapbox); +} - create_tools (wrapbox); - create_sheets (wrapbox); - create_color_area (wrapbox); - create_lineprops_area (wrapbox); +static void +dia_toolbox_init (DiaToolbox *self) +{ + g_object_set (G_OBJECT (self), + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 8, + "margin", 8, + NULL); + gtk_widget_show (GTK_WIDGET (self)); + + create_tools (self); + create_sheets (self); + create_lineprops_area (self); + create_color_area (self); /* Setup toolbox area as file drop destination */ - gtk_drag_dest_set (wrapbox, - GTK_DEST_DEFAULT_ALL, - toolbox_target_table, toolbox_n_targets, - GDK_ACTION_COPY); + gtk_drag_dest_set (GTK_WIDGET (self), + GTK_DEST_DEFAULT_ALL, + toolbox_target_table, toolbox_n_targets, + GDK_ACTION_COPY); +} - return wrapbox; +GtkWidget * +dia_toolbox_new () +{ + return g_object_new (DIA_TYPE_TOOLBOX, NULL); } void diff --git a/app/toolbox.h b/app/toolbox.h index 089766b4b353e2bcddcc2f847300bceebdcb5d9b..3ca8bfbb7faecb5770a03b4320c5589bbc708f0c 100644 --- a/app/toolbox.h +++ b/app/toolbox.h @@ -1,4 +1,18 @@ -#include "tool.h" +#include "tools/tool.h" +#include "tools/create_object.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_TOOLBOX (dia_toolbox_get_type ()) +G_DECLARE_FINAL_TYPE (DiaToolbox, dia_toolbox, DIA, TOOLBOX, GtkBox) + +struct _DiaToolbox { + GtkBox parent; + + GtkWidget *tools; + GtkWidget *items; + GListStore *sheets; +}; typedef struct _ToolButton ToolButton; @@ -6,7 +20,7 @@ typedef struct _ToolButtonData ToolButtonData; struct _ToolButtonData { - ToolType type; + GType type; gpointer extra_data; gpointer user_data; /* Used by create_object_tool */ GtkWidget *widget; @@ -26,11 +40,11 @@ extern ToolButton tool_data[]; extern gchar *interface_current_sheet_name; void tool_select_update (GtkWidget *w, gpointer data); -GdkPixbuf *tool_get_pixbuf (ToolButton *tb); void toolbox_setup_drag_dest (GtkWidget *canvas); void canvas_setup_drag_dest (GtkWidget *canvas); -GtkWidget *toolbox_create(void); -void fill_sheet_menu(void); +GtkWidget *dia_toolbox_new (void); +void dia_toolbox_update_sheets (DiaToolbox *self); +G_END_DECLS diff --git a/app/tools/create_object.c b/app/tools/create_object.c new file mode 100644 index 0000000000000000000000000000000000000000..c8f33ae3a87b663c76c378e1333afaa6aaffe946 --- /dev/null +++ b/app/tools/create_object.c @@ -0,0 +1,396 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 "create_object.h" +#include "connectionpoint_ops.h" +#include "handle_ops.h" +#include "object_ops.h" +#include "preferences.h" +#include "undo.h" +#include "cursor.h" +#include "highlight.h" +#include "textedit.h" +#include "parent.h" +#include "message.h" +#include "object.h" +#include "intl.h" +#include "menus.h" + +static void create_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void create_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void create_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp); +static void create_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); + +G_DEFINE_TYPE (DiaCreateTool, dia_create_tool, DIA_TYPE_TOOL) + +enum { + PROP_INVERT_PERSISTENCE = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +static void +activate (DiaTool *tool) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (tool); + + self->moving = FALSE; + + dia_display_set_all_cursor (get_cursor (CURSOR_CREATE)); +} + +static void +deactivate (DiaTool *tool) +{ + DiaCreateTool *real_tool = DIA_CREATE_TOOL (tool); + + if (real_tool->moving) { /* should not get here, but see bug #619246 */ + gdk_pointer_ungrab (GDK_CURRENT_TIME); + dia_display_set_all_cursor (default_cursor); + } +} + +static void +dia_create_tool_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (object); + + switch (property_id) { + case PROP_INVERT_PERSISTENCE: + self->invert_persistence = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_create_tool_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (object); + + switch (property_id) { + case PROP_INVERT_PERSISTENCE: + g_value_set_boolean (value, self->invert_persistence); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_create_tool_class_init (DiaCreateToolClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + DiaToolClass *tool_class = DIA_TOOL_CLASS (klass); + + object_class->set_property = dia_create_tool_set_property; + object_class->get_property = dia_create_tool_get_property; + + properties[PROP_INVERT_PERSISTENCE] = g_param_spec_boolean ("invert-persistence", + NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + tool_class->activate = activate; + tool_class->deactivate = deactivate; + + tool_class->button_press = create_button_press; + tool_class->button_release = create_button_release; + tool_class->motion = create_motion; + tool_class->double_click = create_double_click; +} + +static void +dia_create_tool_init (DiaCreateTool *self) +{ +} + +DiaTool * +dia_create_tool_new (DiaObjectType *objtype, + gboolean invert_persistence, + void *user_data) +{ + DiaCreateTool *self = g_object_new (DIA_TYPE_CREATE_TOOL, + "invert-persistence", invert_persistence); + + /* TODO: As properties */ + self->objtype = objtype; + self->user_data = user_data; + + return DIA_TOOL (self); +} + +static void +create_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (tool); + Point clickedpoint, origpoint; + Handle *handle1; + Handle *handle2; + DiaObject *obj; + + dia_display_untransform_coords (ddisp, + (int)event->x, (int)event->y, + &clickedpoint.x, &clickedpoint.y); + + origpoint = clickedpoint; + + snap_to_grid (ddisp, &clickedpoint.x, &clickedpoint.y); + + obj = dia_object_default_create (self->objtype, &clickedpoint, + self->user_data, + &handle1, &handle2); + + self->obj = obj; /* ensure that tool->obj is initialised in case we + return early. */ + if (!obj) { + self->moving = FALSE; + self->handle = NULL; + message_error(_("'%s' creation failed"), self->objtype ? self->objtype->name : "NULL"); + return; + } + + diagram_add_object (ddisp->diagram, obj); + + /* Try a connect */ + if (handle1 != NULL && + handle1->connect_type != HANDLE_NONCONNECTABLE) { + ConnectionPoint *connectionpoint; + connectionpoint = object_find_connectpoint_display (ddisp, + &origpoint, obj, TRUE); + if (connectionpoint != NULL) { + (obj->ops->move)(obj, &origpoint); + } + } + + if (!(event->state & GDK_SHIFT_MASK)) { + /* Not Multi-select => remove current selection */ + diagram_remove_all_selected (ddisp->diagram, TRUE); + } + diagram_select (ddisp->diagram, obj); + + /* Connect first handle if possible: */ + if ((handle1!= NULL) && + (handle1->connect_type != HANDLE_NONCONNECTABLE)) { + object_connect_display (ddisp, obj, handle1, TRUE); + } + + object_add_updates (obj, ddisp->diagram); + dia_display_do_update_menu_sensitivity (ddisp); + diagram_flush (ddisp->diagram); + + if (handle2 != NULL) { + self->handle = handle2; + self->moving = TRUE; + self->last_to = handle2->pos; + + gdk_pointer_grab (gtk_widget_get_window (ddisp->canvas), FALSE, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + NULL, NULL, event->time); + dia_display_set_all_cursor (get_cursor (CURSOR_SCROLL)); + } else { + diagram_update_extents (ddisp->diagram); + self->moving = FALSE; + } + +} + +static void +create_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ +} + +static void +create_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (tool); + GList *list = NULL; + DiaObject *obj = self->obj; + gboolean reset; + + GList *parent_candidates; + + g_return_if_fail (obj != NULL); + if (!obj) /* not sure if this isn't enough */ + return; /* could be a legal invariant */ + + if (self->moving) { + gdk_pointer_ungrab (event->time); + + object_add_updates (self->obj, ddisp->diagram); + self->obj->ops->move_handle (self->obj, + self->handle, + &self->last_to, + NULL, + HANDLE_MOVE_CREATE_FINAL, + 0); + object_add_updates (self->obj, ddisp->diagram); + } + + parent_candidates = layer_find_objects_containing_rectangle (obj->parent_layer, + &obj->bounding_box); + + /* whole object must be within another object to parent it */ + for (; parent_candidates != NULL; parent_candidates = g_list_next(parent_candidates)) { + DiaObject *parent_obj = (DiaObject *) parent_candidates->data; + if (obj != parent_obj && object_within_parent (obj, parent_obj)) { + Change *change = undo_parenting (ddisp->diagram, parent_obj, obj, TRUE); + (change->apply)(change, ddisp->diagram); + break; + /* + obj->parent = parent_obj; + parent_obj->children = g_list_append(parent_obj->children, obj); + */ + } + } + g_list_free(parent_candidates); + + list = g_list_prepend (list, self->obj); + + undo_insert_objects (ddisp->diagram, list, 1); + + if (self->moving) { + if (self->handle->connect_type != HANDLE_NONCONNECTABLE) { + object_connect_display (ddisp, self->obj, self->handle, TRUE); + diagram_update_connections_selection (ddisp->diagram); + diagram_flush (ddisp->diagram); + } + self->moving = FALSE; + self->handle = NULL; + self->obj = NULL; + } + + { + /* remove position from status bar */ + GtkStatusbar *statusbar = GTK_STATUSBAR (ddisp->modified_status); + guint context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); + gtk_statusbar_pop (statusbar, context_id); + } + + highlight_reset_all (ddisp->diagram); + reset = prefs.reset_tools_after_create != self->invert_persistence; + /* kind of backward: first starting editing to see if it is possible at all, than GUI reflection */ + if (textedit_activate_object (ddisp, obj, NULL) && reset) { + gtk_action_activate (menus_get_action ("ToolsTextedit")); + reset = FALSE; /* don't switch off textedit below */ + } + diagram_update_extents (ddisp->diagram); + diagram_modified (ddisp->diagram); + + undo_set_transactionpoint (ddisp->diagram->undo); + + if (reset) + tool_reset(); + dia_display_set_all_cursor (default_cursor); + dia_display_do_update_menu_sensitivity (ddisp); +} + +static void +create_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp) +{ + DiaCreateTool *self = DIA_CREATE_TOOL (tool); + Point to; + ConnectionPoint *connectionpoint = NULL; + gchar *postext; + GtkStatusbar *statusbar; + guint context_id; + + if (!self->moving) + return; + + dia_display_untransform_coords (ddisp, event->x, event->y, &to.x, &to.y); + + /* make sure the new object is restricted to its parent */ + parent_handle_move_out_check(self->obj, &to); + + /* Move to ConnectionPoint if near: */ + if (self->handle != NULL && + self->handle->connect_type != HANDLE_NONCONNECTABLE) { + connectionpoint = object_find_connectpoint_display (ddisp, + &to, self->obj, TRUE); + + if (connectionpoint != NULL) { + to = connectionpoint->pos; + highlight_object(connectionpoint->object, DIA_HIGHLIGHT_CONNECTIONPOINT, ddisp->diagram); + dia_display_set_all_cursor(get_cursor(CURSOR_CONNECT)); + } + } + + if (connectionpoint == NULL) { + /* No connectionopoint near, then snap to grid (if enabled) */ + snap_to_grid (ddisp, &to.x, &to.y); + highlight_reset_all (ddisp->diagram); + dia_display_set_all_cursor (get_cursor (CURSOR_SCROLL)); + } + + object_add_updates (self->obj, ddisp->diagram); + self->obj->ops->move_handle (self->obj, self->handle, &to, connectionpoint, + HANDLE_MOVE_CREATE, 0); + object_add_updates (self->obj, ddisp->diagram); + + /* Put current mouse position in status bar */ + statusbar = GTK_STATUSBAR (ddisp->modified_status); + context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); + + postext = g_strdup_printf ("%.3f, %.3f - %.3f, %.3f", + self->obj->bounding_box.left, + self->obj->bounding_box.top, + self->obj->bounding_box.right, + self->obj->bounding_box.bottom); + + gtk_statusbar_pop (statusbar, context_id); + gtk_statusbar_push (statusbar, context_id, postext); + + g_free(postext); + + diagram_flush (ddisp->diagram); + + self->last_to = to; + + return; +} diff --git a/app/create_object.h b/app/tools/create_object.h similarity index 76% rename from app/create_object.h rename to app/tools/create_object.h index 9e3500ffa243890ee39c97061c4285b40afef1f2..10dcf1b25b54697bed515b7b5f088e8e6cfbf049 100644 --- a/app/create_object.h +++ b/app/tools/create_object.h @@ -21,10 +21,12 @@ #include "geometry.h" #include "tool.h" -typedef struct _CreateObjectTool CreateObjectTool; -struct _CreateObjectTool { - Tool tool; +#define DIA_TYPE_CREATE_TOOL (dia_create_tool_get_type ()) +G_DECLARE_FINAL_TYPE (DiaCreateTool, dia_create_tool, DIA, CREATE_TOOL, DiaTool) + +struct _DiaCreateTool { + DiaTool tool; DiaObjectType *objtype; void *user_data; @@ -36,8 +38,9 @@ struct _CreateObjectTool { int invert_persistence; }; - -Tool *create_create_object_tool(DiaObjectType *objtype, void *user_date, int invert_persistence); -void free_create_object_tool(Tool *tool); +DiaTool * +dia_create_tool_new (DiaObjectType *objtype, + gboolean invert_persistence, + void *user_data); #endif /* CREATE_OBJECT_H */ diff --git a/app/magnify.c b/app/tools/magnify.c similarity index 50% rename from app/magnify.c rename to app/tools/magnify.c index df4a84b75fc851c78e42576f7c88e8e6b6ad8961..b8e601489bce4735960b656e6f1f25fd76d06da5 100644 --- a/app/magnify.c +++ b/app/tools/magnify.c @@ -22,9 +22,9 @@ #include "magnify.h" #include "cursor.h" -struct _MagnifyTool { - Tool tool; - GdkGC *gc; +struct _DiaMagnifyTool { + DiaTool tool; + int box_active; int moved; int x, y; @@ -33,10 +33,14 @@ struct _MagnifyTool { gboolean zoom_out; }; +G_DEFINE_TYPE (DiaMagnifyTool, dia_magnify_tool, DIA_TYPE_TOOL) + static void -magnify_button_press(MagnifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +magnify_button_press (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaMagnifyTool *tool = DIA_MAGNIFY_TOOL (self); tool->x = tool->oldx = event->x; tool->y = tool->oldy = event->y; tool->box_active = TRUE; @@ -47,9 +51,11 @@ magnify_button_press(MagnifyTool *tool, GdkEventButton *event, } static void -magnify_button_release(MagnifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +magnify_button_release (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaMagnifyTool *tool = DIA_MAGNIFY_TOOL (self); Rectangle *visible; Point p1, p2, tl; real diff; @@ -58,10 +64,15 @@ magnify_button_release(MagnifyTool *tool, GdkEventButton *event, tool->box_active = FALSE; + dia_interactive_renderer_set_selection (ddisp->renderer, + FALSE, 0, 0, 0, 0); + dia_display_flush (ddisp); + + visible = &ddisp->visible; - ddisplay_untransform_coords(ddisp, tool->x, tool->y, &p1.x, &p1.y); - ddisplay_untransform_coords(ddisp, event->x, event->y, &p2.x, &p2.y); + dia_display_untransform_coords (ddisp, tool->x, tool->y, &p1.x, &p1.y); + dia_display_untransform_coords (ddisp, event->x, event->y, &p2.x, &p2.y); tl.x = MIN(p1.x, p2.x); tl.y = MIN(p1.y, p2.y); @@ -71,8 +82,8 @@ magnify_button_release(MagnifyTool *tool, GdkEventButton *event, if (tool->moved) { if (idiff <= 4) { - ddisplay_add_update_all(ddisp); - ddisplay_flush(ddisp); + dia_display_add_update_all (ddisp); + dia_display_flush (ddisp); } else if (!(event->state & GDK_CONTROL_MASK)) { /* the whole zoom rect should be visible, not just it's square equivalent */ real fh = fabs(p2.y - p1.y) / (visible->bottom - visible->top); @@ -80,18 +91,18 @@ magnify_button_release(MagnifyTool *tool, GdkEventButton *event, factor = 1.0 / MAX(fh, fw); tl.x += (visible->right - visible->left)/(2.0*factor); tl.y += (visible->bottom - visible->top)/(2.0*factor); - ddisplay_zoom(ddisp, &tl, factor); + dia_display_zoom (ddisp, &tl, factor); } else { factor = diff / (visible->right - visible->left); tl.x = tl.x * factor + tl.x; tl.y = tl.y * factor + tl.y; - ddisplay_zoom(ddisp, &tl, factor); + dia_display_zoom (ddisp, &tl, factor); } } else { if (event->state & GDK_SHIFT_MASK) - ddisplay_zoom(ddisp, &tl, 0.5); + dia_display_zoom (ddisp, &tl, 0.5); else - ddisplay_zoom(ddisp, &tl, 2.0); + dia_display_zoom (ddisp, &tl, 2.0); } gdk_pointer_ungrab (event->time); @@ -100,80 +111,68 @@ magnify_button_release(MagnifyTool *tool, GdkEventButton *event, typedef struct intPoint { int x,y; } intPoint; static void -magnify_motion(MagnifyTool *tool, GdkEventMotion *event, - DDisplay *ddisp) +magnify_motion (DiaMagnifyTool *self, + GdkEventMotion *event, + DiaDisplay *ddisp) { + DiaMagnifyTool *tool = DIA_MAGNIFY_TOOL (self); intPoint tl, br; if (tool->box_active) { - GdkColor white; - tool->moved = TRUE; - color_convert(&color_white, &white); - - if (tool->gc == NULL) { - tool->gc = gdk_gc_new(gtk_widget_get_window(ddisp->canvas)); - gdk_gc_set_line_attributes(tool->gc, 1, GDK_LINE_ON_OFF_DASH, - GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_foreground(tool->gc, &white); - gdk_gc_set_function(tool->gc, GDK_XOR); - } - - tl.x = MIN(tool->x, tool->oldx); tl.y = MIN(tool->y, tool->oldy); - br.x = MAX(tool->x, tool->oldx); br.y = MAX(tool->y, tool->oldy); - - gdk_draw_rectangle (gtk_widget_get_window(ddisp->canvas), - tool->gc, FALSE, tl.x, tl.y, br.x - tl.x, br.y - tl.y); - - tl.x = MIN(tool->x, event->x); tl.y = MIN(tool->y, event->y); - br.x = MAX(tool->x, event->x); br.y = MAX(tool->y, event->y); - - gdk_draw_rectangle (gtk_widget_get_window(ddisp->canvas), - tool->gc, FALSE, tl.x, tl.y, br.x - tl.x, br.y - tl.y); - - tool->oldx = event->x; - tool->oldy = event->y; + + tl.x = MIN (tool->x, event->x); tl.y = MIN (tool->y, event->y); + br.x = MAX (tool->x, event->x); br.y = MAX (tool->y, event->y); + + dia_interactive_renderer_set_selection (ddisp->renderer, + TRUE, + tl.x, tl.y, br.x - tl.x, br.y - tl.y); + dia_display_flush (ddisp); } } void -set_zoom_out(Tool *tool) +set_zoom_out (DiaTool *tool) { - ((MagnifyTool *)tool)->zoom_out = TRUE; - ddisplay_set_all_cursor(get_cursor(CURSOR_ZOOM_OUT)); + ((DiaMagnifyTool *)tool)->zoom_out = TRUE; + dia_display_set_all_cursor(get_cursor(CURSOR_ZOOM_OUT)); } void -set_zoom_in(Tool *tool) +set_zoom_in (DiaTool *tool) { - ((MagnifyTool *)tool)->zoom_out = FALSE; - ddisplay_set_all_cursor(get_cursor(CURSOR_ZOOM_IN)); + ((DiaMagnifyTool *)tool)->zoom_out = FALSE; + dia_display_set_all_cursor(get_cursor(CURSOR_ZOOM_IN)); } -Tool * -create_magnify_tool(void) +static void +activate (DiaTool *self) { - MagnifyTool *tool; + DIA_MAGNIFY_TOOL (self)->box_active = FALSE; + DIA_MAGNIFY_TOOL (self)->zoom_out = FALSE; - tool = g_new0(MagnifyTool, 1); - tool->tool.type = MAGNIFY_TOOL; - tool->tool.button_press_func = (ButtonPressFunc) &magnify_button_press; - tool->tool.button_release_func = (ButtonPressFunc) &magnify_button_release; - tool->tool.motion_func = (MotionFunc) &magnify_motion; - tool->tool.double_click_func = NULL; + dia_display_set_all_cursor(get_cursor(CURSOR_ZOOM_IN)); +} - tool->gc = NULL; - tool->box_active = FALSE; - tool->zoom_out = FALSE; +static void +deactivate (DiaTool *tool) +{ + dia_display_set_all_cursor(default_cursor); +} - ddisplay_set_all_cursor(get_cursor(CURSOR_ZOOM_IN)); - - return (Tool *) tool; +static void +dia_magnify_tool_class_init (DiaMagnifyToolClass *klass) +{ + DiaToolClass *tool_class = DIA_TOOL_CLASS (klass); + + tool_class->activate = activate; + tool_class->deactivate = deactivate; + tool_class->button_press = magnify_button_press; + tool_class->button_release = magnify_button_release; + tool_class->motion = magnify_motion; } -void -free_magnify_tool(Tool *tool) +static void +dia_magnify_tool_init (DiaMagnifyTool *self) { - g_free(tool); - ddisplay_set_all_cursor(default_cursor); } diff --git a/app/magnify.h b/app/tools/magnify.h similarity index 80% rename from app/magnify.h rename to app/tools/magnify.h index 6e218a004c42b36045719a8bd7a34bb18bd205aa..0cb3a26cfae6352c1c2fe7e0222d13ad37370794 100644 --- a/app/magnify.h +++ b/app/tools/magnify.h @@ -20,11 +20,10 @@ #include "tool.h" -typedef struct _MagnifyTool MagnifyTool; +#define DIA_TYPE_MAGNIFY_TOOL (dia_magnify_tool_get_type ()) +G_DECLARE_FINAL_TYPE (DiaMagnifyTool, dia_magnify_tool, DIA, MAGNIFY_TOOL, DiaTool) -Tool *create_magnify_tool(void); -void free_magnify_tool(Tool *tool); -void set_zoom_out(Tool *tool); -void set_zoom_in(Tool *tool); +void set_zoom_out (DiaTool *tool); +void set_zoom_in (DiaTool *tool); #endif /* MAGNIFY_H */ diff --git a/app/modify_tool.c b/app/tools/modify_tool.c similarity index 61% rename from app/modify_tool.c rename to app/tools/modify_tool.c index a7f967848b0f9fd9f4a14f5bdda8321b91b37a12..1ff3039ef901e664c9a07044875b7c5d625c9cf5 100644 --- a/app/modify_tool.c +++ b/app/tools/modify_tool.c @@ -40,25 +40,8 @@ #include "prop_text.h" #include "object.h" - -static DiaObject *click_select_object(DDisplay *ddisp, Point *clickedpoint, - GdkEventButton *event); -static int do_if_clicked_handle(DDisplay *ddisp, ModifyTool *tool, - Point *clickedpoint, - GdkEventButton *event); -static void modify_button_press(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void modify_button_hold(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void modify_button_release(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp); -static void modify_motion(ModifyTool *tool, GdkEventMotion *event, - DDisplay *ddisp); -static void modify_double_click(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp); - -struct _ModifyTool { - Tool tool; +struct _DiaModifyTool { + DiaTool tool; enum ModifyToolState state; int break_connections; @@ -68,7 +51,6 @@ struct _ModifyTool { Point last_to; Point start_at; time_t start_time; - GdkGC *gc; int x1, y1, x2, y2; Point start_box; Point end_box; @@ -79,27 +61,57 @@ struct _ModifyTool { Point *orig_pos; }; +G_DEFINE_TYPE (DiaModifyTool, dia_modify_tool, DIA_TYPE_TOOL) + +static DiaObject *click_select_object (DiaDisplay *ddisp, Point *clickedpoint, + GdkEventButton *event); +static int do_if_clicked_handle (DiaDisplay *ddisp, + DiaModifyTool *tool, + Point *clickedpoint, + GdkEventButton *event); +static void modify_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void modify_button_hold (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void modify_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void modify_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp); +static void modify_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); -Tool * -create_modify_tool(void) +static void +activate (DiaTool *self) { - ModifyTool *tool; - - tool = g_new0(ModifyTool, 1); - tool->tool.type = MODIFY_TOOL; - tool->tool.button_press_func = (ButtonPressFunc) &modify_button_press; - tool->tool.button_hold_func = (ButtonHoldFunc) &modify_button_hold; - tool->tool.button_release_func = (ButtonReleaseFunc) &modify_button_release; - tool->tool.motion_func = (MotionFunc) &modify_motion; - tool->tool.double_click_func = (DoubleClickFunc) &modify_double_click; - tool->gc = NULL; - tool->state = STATE_NONE; - tool->break_connections = FALSE; - tool->auto_scrolled = FALSE; + DIA_MODIFY_TOOL (self)->state = STATE_NONE; + DIA_MODIFY_TOOL (self)->break_connections = FALSE; + DIA_MODIFY_TOOL (self)->auto_scrolled = FALSE; - tool->orig_pos = NULL; - - return (Tool *)tool; + DIA_MODIFY_TOOL (self)->orig_pos = NULL; +} + +static void +dia_modify_tool_class_init (DiaModifyToolClass *klass) +{ + DiaToolClass *tool_class = DIA_TOOL_CLASS (klass); + + tool_class->activate = activate; + + tool_class->button_press = modify_button_press; + tool_class->button_hold = modify_button_hold; + tool_class->button_release = modify_button_release; + tool_class->motion = modify_motion; + tool_class->double_click = modify_double_click; +} + +static void +dia_modify_tool_init (DiaModifyTool *self) +{ } static ModifierKeys @@ -146,18 +158,8 @@ gdk_event_to_dia_ModifierKeys(guint event_state) return mod; } - -void -free_modify_tool(Tool *tool) -{ - ModifyTool *mtool = (ModifyTool *)tool; - if (mtool->gc) - g_object_unref(mtool->gc); - g_free(mtool); -} - static DiaObject * -click_select_object(DDisplay *ddisp, Point *clickedpoint, +click_select_object(DiaDisplay *ddisp, Point *clickedpoint, GdkEventButton *event) { Diagram *diagram; @@ -168,7 +170,7 @@ click_select_object(DDisplay *ddisp, Point *clickedpoint, /* Find the closest object to select it: */ - click_distance = ddisplay_untransform_length(ddisp, 3.0); + click_distance = dia_display_untransform_length (ddisp, 3.0); obj = diagram_find_clicked_object(diagram, clickedpoint, click_distance); @@ -183,17 +185,17 @@ click_select_object(DDisplay *ddisp, Point *clickedpoint, /*printf("Not already selected\n");*/ if (!(event->state & GDK_SHIFT_MASK)) { - /* Not Multi-select => remove current selection */ - diagram_remove_all_selected(diagram, TRUE); + /* Not Multi-select => remove current selection */ + diagram_remove_all_selected(diagram, TRUE); } diagram_select(diagram, obj); /* To be removed once text edit mode is stable. By then, * we don't want to automatically edit selected objects. - textedit_activate_object(ddisp, obj, clickedpoint); - */ + * textedit_activate_object(ddisp, obj, clickedpoint); + */ - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); object_add_updates_list(diagram->data->selected, diagram); diagram_flush(diagram); @@ -208,12 +210,12 @@ click_select_object(DDisplay *ddisp, Point *clickedpoint, diagram_flush(diagram); if (event->state & GDK_SHIFT_MASK) { /* Multi-select */ - /* Remove the selected selected */ - ddisplay_do_update_menu_sensitivity(ddisp); - diagram_unselect_object(diagram, (DiaObject *)already->data); - diagram_flush(ddisp->diagram); + /* Remove the selected selected */ + dia_display_do_update_menu_sensitivity (ddisp); + diagram_unselect_object(diagram, (DiaObject *)already->data); + diagram_flush (ddisp->diagram); } else { - return obj; + return obj; } } } /* Else part moved to allow union/intersection select */ @@ -230,46 +232,49 @@ time_micro() return tv.tv_sec*G_USEC_PER_SEC+tv.tv_usec; } -static int do_if_clicked_handle(DDisplay *ddisp, ModifyTool *tool, +static int do_if_clicked_handle (DiaDisplay *ddisp, DiaModifyTool *tool, Point *clickedpoint, GdkEventButton *event) { DiaObject *obj; Handle *handle; handle = NULL; - diagram_find_closest_handle(ddisp->diagram, &handle, &obj, clickedpoint); - if (handle_is_clicked(ddisp, handle, clickedpoint)) { + diagram_find_closest_handle (ddisp->diagram, &handle, &obj, clickedpoint); + if (handle_is_clicked (ddisp, handle, clickedpoint)) { tool->state = STATE_MOVE_HANDLE; tool->break_connections = TRUE; tool->last_to = handle->pos; tool->handle = handle; tool->object = obj; - gdk_pointer_grab (gtk_widget_get_window(ddisp->canvas), FALSE, + gdk_pointer_grab (gtk_widget_get_window (ddisp->canvas), + FALSE, GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL, event->time); tool->start_at = handle->pos; tool->start_time = time_micro(); - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); + dia_display_set_all_cursor(get_cursor(CURSOR_SCROLL)); return TRUE; } return FALSE; } static void -modify_button_press(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +modify_button_press (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaModifyTool *tool = DIA_MODIFY_TOOL (self); Point clickedpoint; DiaObject *clicked_obj; gboolean some_selected; - ddisplay_untransform_coords(ddisp, - (int)event->x, (int)event->y, - &clickedpoint.x, &clickedpoint.y); + dia_display_untransform_coords (ddisp, + (int) event->x, (int) event->y, + &clickedpoint.x, &clickedpoint.y); /* don't got to single handle movement if there is more than one object selected */ some_selected = g_list_length (ddisp->diagram->data->selected) > 1; - if (!some_selected && do_if_clicked_handle(ddisp, tool, &clickedpoint, event)) + if (!some_selected && do_if_clicked_handle (ddisp, tool, &clickedpoint, event)) return; clicked_obj = click_select_object(ddisp, &clickedpoint, event); @@ -283,12 +288,12 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event, point_sub(&tool->move_compensate, &clickedpoint); tool->break_connections = TRUE; /* unconnect when not grabbing handles, just setting to * FALSE is not enough. Need to refine the move op, too. */ - gdk_pointer_grab (gtk_widget_get_window(ddisp->canvas), FALSE, + gdk_pointer_grab (gtk_widget_get_window (ddisp->canvas), FALSE, GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL, event->time); tool->start_at = clickedpoint; tool->start_time = time_micro(); - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); + dia_display_set_all_cursor(get_cursor(CURSOR_SCROLL)); } else { tool->state = STATE_BOX_SELECT; tool->start_box = clickedpoint; @@ -296,21 +301,14 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event, tool->x1 = tool->x2 = (int) event->x; tool->y1 = tool->y2 = (int) event->y; - if (tool->gc == NULL) { - GdkColor white; - - color_convert(&color_white, &white); - tool->gc = gdk_gc_new(gtk_widget_get_window(ddisp->canvas)); - gdk_gc_set_line_attributes(tool->gc, 1, GDK_LINE_ON_OFF_DASH, - GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_foreground(tool->gc, &white); - gdk_gc_set_function(tool->gc, GDK_XOR); - } - - gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, - tool->x1, tool->y1, - tool->x2 - tool->x1, tool->y2 - tool->y1); - + dia_interactive_renderer_set_selection (ddisp->renderer, + TRUE, + tool->x1, + tool->y1, + tool->x2 - tool->x1, + tool->y2 - tool->y1); + dia_display_flush (ddisp); + gdk_pointer_grab (gtk_widget_get_window (ddisp->canvas), FALSE, GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL, event->time); @@ -319,28 +317,30 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event, static void -modify_button_hold(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +modify_button_hold (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaModifyTool *tool = DIA_MODIFY_TOOL (self); Point clickedpoint; switch (tool->state) { case STATE_MOVE_OBJECT: /* A button hold is as if user was moving object - if it is * a text object and can be edited, then the move is cancelled */ - ddisplay_untransform_coords(ddisp, - (int)event->x, (int)event->y, - &clickedpoint.x, &clickedpoint.y); + dia_display_untransform_coords (ddisp, + (int)event->x, (int)event->y, + &clickedpoint.x, &clickedpoint.y); if (tool->object != NULL && - diagram_is_selected(ddisp->diagram, tool->object)) { - if (textedit_activate_object(ddisp, tool->object, &clickedpoint)) { - /* Return tool to normal state - object is text and is in edit */ - gdk_pointer_ungrab (event->time); - tool->orig_pos = NULL; - tool->state = STATE_NONE; - /* Activate Text Edit */ - gtk_action_activate (menus_get_action ("ToolsTextedit")); + diagram_is_selected (ddisp->diagram, tool->object)) { + if (textedit_activate_object (ddisp, tool->object, &clickedpoint)) { + /* Return tool to normal state - object is text and is in edit */ + gdk_pointer_ungrab (event->time); + tool->orig_pos = NULL; + tool->state = STATE_NONE; + /* Activate Text Edit */ + gtk_action_activate (menus_get_action ("ToolsTextedit")); } } break; @@ -356,27 +356,28 @@ modify_button_hold(ModifyTool *tool, GdkEventButton *event, } static void -modify_double_click(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +modify_double_click (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { Point clickedpoint; DiaObject *clicked_obj; - ddisplay_untransform_coords(ddisp, - (int)event->x, (int)event->y, - &clickedpoint.x, &clickedpoint.y); + dia_display_untransform_coords (ddisp, + (int) event->x, (int) event->y, + &clickedpoint.x, &clickedpoint.y); clicked_obj = click_select_object(ddisp, &clickedpoint, event); if ( clicked_obj != NULL ) { - object_list_properties_show(ddisp->diagram, ddisp->diagram->data->selected); + object_list_properties_show (ddisp->diagram, ddisp->diagram->data->selected); } else { /* No object selected */ /*printf("didn't select object\n");*/ if (!(event->state & GDK_SHIFT_MASK)) { /* Not Multi-select => Remove all selected */ - ddisplay_do_update_menu_sensitivity(ddisp); - diagram_remove_all_selected(ddisp->diagram, TRUE); - diagram_flush(ddisp->diagram); + dia_display_do_update_menu_sensitivity (ddisp); + diagram_remove_all_selected (ddisp->diagram, TRUE); + diagram_flush (ddisp->diagram); } } } @@ -395,7 +396,7 @@ modify_double_click(ModifyTool *tool, GdkEventButton *event, */ static gboolean -modify_move_already(ModifyTool *tool, DDisplay *ddisp, Point *to) +modify_move_already (DiaModifyTool *tool, DiaDisplay *ddisp, Point *to) { static gboolean settings_taken = FALSE; static int double_click_time = 250; @@ -426,24 +427,26 @@ modify_move_already(ModifyTool *tool, DDisplay *ddisp, Point *to) return TRUE; } } - if (ddisplay_transform_length(ddisp, dist) > MIN_PIXELS) { - return (ddisplay_transform_length(ddisp, dist) > MIN_PIXELS); + if (dia_display_transform_length (ddisp, dist) > MIN_PIXELS) { + return (dia_display_transform_length (ddisp, dist) > MIN_PIXELS); } else { return FALSE; } } static void -modify_motion(ModifyTool *tool, GdkEventMotion *event, - DDisplay *ddisp) +modify_motion (DiaTool *self, + GdkEventMotion *event, + DiaDisplay *ddisp) { + DiaModifyTool *tool = DIA_MODIFY_TOOL (self); Point to; Point now, delta, full_delta; gboolean auto_scroll, vertical = FALSE; ConnectionPoint *connectionpoint = NULL; ObjectChange *objchange = NULL; - ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); + dia_display_untransform_coords (ddisp, event->x, event->y, &to.x, &to.y); if (tool->state==STATE_NONE) { DiaObject *obj = NULL; @@ -452,16 +455,16 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, diagram_find_closest_handle (ddisp->diagram, &handle, &obj, &to); if (handle && handle->type != HANDLE_NON_MOVABLE && handle->id >= HANDLE_RESIZE_NW && handle->id <= HANDLE_RESIZE_SE - && handle_is_clicked(ddisp, handle, &to) + && handle_is_clicked (ddisp, handle, &to) && g_list_length (ddisp->diagram->data->selected) == 1) - ddisplay_set_all_cursor(get_cursor(CURSOR_DIRECTION_0 + handle->id)); + dia_display_set_all_cursor(get_cursor(CURSOR_DIRECTION_0 + handle->id)); else - ddisplay_set_all_cursor(get_cursor(CURSOR_POINT)); + dia_display_set_all_cursor(get_cursor(CURSOR_POINT)); return; /* Fast path... */ } - auto_scroll = ddisplay_autoscroll(ddisp, event->x, event->y); + auto_scroll = dia_display_autoscroll (ddisp, event->x, event->y); - if (!modify_move_already(tool, ddisp, &to)) return; + if (!modify_move_already (tool, ddisp, &to)) return; switch (tool->state) { case STATE_MOVE_OBJECT: @@ -472,19 +475,19 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, DiaObject *obj; /* consider non-selected children affected */ - pla = list = parent_list_affected(ddisp->diagram->data->selected); + pla = list = parent_list_affected (ddisp->diagram->data->selected); tool->orig_pos = g_new(Point, g_list_length(list)); i=0; while (list != NULL) { - obj = (DiaObject *) list->data; - tool->orig_pos[i] = obj->position; - list = g_list_next(list); i++; + obj = (DiaObject *) list->data; + tool->orig_pos[i] = obj->position; + list = g_list_next(list); i++; } g_list_free (pla); } if (tool->break_connections) - diagram_unconnect_selected(ddisp->diagram); /* Pushes UNDO info */ + diagram_unconnect_selected (ddisp->diagram); /* Pushes UNDO info */ if (gdk_event_to_dia_ModifierKeys (event->state) & MODIFIER_CONTROL) { full_delta = to; @@ -493,7 +496,7 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, } point_add(&to, &tool->move_compensate); - snap_to_grid(ddisp, &to.x, &to.y); + snap_to_grid (ddisp, &to.x, &to.y); now = tool->object->position; @@ -509,14 +512,14 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, } } - object_add_updates_list(ddisp->diagram->data->selected, ddisp->diagram); - objchange = object_list_move_delta(ddisp->diagram->data->selected, &delta); + object_add_updates_list (ddisp->diagram->data->selected, ddisp->diagram); + objchange = object_list_move_delta (ddisp->diagram->data->selected, &delta); if (objchange != NULL) { - undo_object_change(ddisp->diagram, tool->object, objchange); + undo_object_change (ddisp->diagram, tool->object, objchange); } - object_add_updates_list(ddisp->diagram->data->selected, ddisp->diagram); + object_add_updates_list (ddisp->diagram->data->selected, ddisp->diagram); - object_add_updates(tool->object, ddisp->diagram); + object_add_updates (tool->object, ddisp->diagram); /* Put current mouse position in status bar */ { @@ -556,32 +559,34 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, highlight_reset_all(ddisp->diagram); if ((tool->handle->connect_type != HANDLE_NONCONNECTABLE)) { /* Move to ConnectionPoint if near: */ - connectionpoint = - object_find_connectpoint_display(ddisp, &to, tool->object, TRUE); + connectionpoint = object_find_connectpoint_display (ddisp, + &to, + tool->object, TRUE); if (connectionpoint != NULL) { DiaHighlightType type; - to = connectionpoint->pos; - if (connectionpoint->flags & CP_FLAGS_MAIN) { + to = connectionpoint->pos; + if (connectionpoint->flags & CP_FLAGS_MAIN) { type = DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN; - } else { + } else { type = DIA_HIGHLIGHT_CONNECTIONPOINT; - } - highlight_object(connectionpoint->object, type, ddisp->diagram); - ddisplay_set_all_cursor(get_cursor(CURSOR_CONNECT)); + } + highlight_object (connectionpoint->object, type, ddisp->diagram); + dia_display_set_all_cursor (get_cursor (CURSOR_CONNECT)); } } if (connectionpoint == NULL) { /* No connectionopoint near, then snap to grid (if enabled) */ - snap_to_grid(ddisp, &to.x, &to.y); - ddisplay_set_all_cursor(get_cursor(CURSOR_SCROLL)); + snap_to_grid (ddisp, &to.x, &to.y); + dia_display_set_all_cursor (get_cursor (CURSOR_SCROLL)); } if (tool->break_connections) { /* break connections to the handle currently selected. */ if (tool->handle->connected_to!=NULL) { - Change *change = undo_unconnect(ddisp->diagram, tool->object, - tool->handle); - + Change *change = undo_unconnect (ddisp->diagram, + tool->object, + tool->handle); + (change->apply)(change, ddisp->diagram); } } @@ -596,7 +601,7 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, } if (tool->orig_pos == NULL) { - tool->orig_pos = g_new(Point, 1); + tool->orig_pos = g_new (Point, 1); *tool->orig_pos = tool->handle->pos; } @@ -607,20 +612,20 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, guint context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); if (tool->object) { /* play safe */ - real w = tool->object->bounding_box.right - tool->object->bounding_box.left; - real h = tool->object->bounding_box.bottom - tool->object->bounding_box.top; + real w = tool->object->bounding_box.right - tool->object->bounding_box.left; + real h = tool->object->bounding_box.bottom - tool->object->bounding_box.top; postext = g_strdup_printf("%.3f, %.3f (%.3fx%.3f)", to.x, to.y, w, h); } else { postext = g_strdup_printf("%.3f, %.3f", to.x, to.y); } - + gtk_statusbar_pop (statusbar, context_id); gtk_statusbar_push (statusbar, context_id, postext); g_free(postext); } - object_add_updates(tool->object, ddisp->diagram); + object_add_updates (tool->object, ddisp->diagram); /* Handle undo */ if (tool->object) @@ -628,39 +633,35 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, &to, connectionpoint, HANDLE_MOVE_USER, gdk_event_to_dia_ModifierKeys(event->state)); if (objchange != NULL) { - undo_object_change(ddisp->diagram, tool->object, objchange); + undo_object_change (ddisp->diagram, tool->object, objchange); } - object_add_updates(tool->object, ddisp->diagram); + object_add_updates (tool->object, ddisp->diagram); - diagram_update_connections_selection(ddisp->diagram); - diagram_flush(ddisp->diagram); + diagram_update_connections_selection (ddisp->diagram); + diagram_flush (ddisp->diagram); break; case STATE_BOX_SELECT: - - if (!auto_scroll && !tool->auto_scrolled) - { - gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, - tool->x1, tool->y1, - tool->x2 - tool->x1, tool->y2 - tool->y1); - } - tool->end_box = to; - ddisplay_transform_coords(ddisp, - MIN(tool->start_box.x, tool->end_box.x), - MIN(tool->start_box.y, tool->end_box.y), - &tool->x1, &tool->y1); - ddisplay_transform_coords(ddisp, - MAX(tool->start_box.x, tool->end_box.x), - MAX(tool->start_box.y, tool->end_box.y), - &tool->x2, &tool->y2); - - gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, - tool->x1, tool->y1, - tool->x2 - tool->x1, tool->y2 - tool->y1); + dia_display_transform_coords (ddisp, + MIN (tool->start_box.x, tool->end_box.x), + MIN (tool->start_box.y, tool->end_box.y), + &tool->x1, &tool->y1); + dia_display_transform_coords (ddisp, + MAX(tool->start_box.x, tool->end_box.x), + MAX(tool->start_box.y, tool->end_box.y), + &tool->x2, &tool->y2); + + dia_interactive_renderer_set_selection (ddisp->renderer, + TRUE, + tool->x1, + tool->y1, + tool->x2 - tool->x1, + tool->y2 - tool->y1); + dia_display_flush (ddisp); + break; case STATE_NONE: - break; default: message_error("Internal error: Strange state in modify_tool\n"); @@ -673,7 +674,7 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event, /** Find the list of objects selected by current rubberbanding. * The list should be freed after use. */ static GList * -find_selected_objects(DDisplay *ddisp, ModifyTool *tool) +find_selected_objects(DiaDisplay *ddisp, DiaModifyTool *tool) { Rectangle r; r.left = MIN(tool->start_box.x, tool->end_box.x); @@ -687,21 +688,23 @@ find_selected_objects(DDisplay *ddisp, ModifyTool *tool) layer_find_objects_intersecting_rectangle(ddisp->diagram->data->active_layer, &r); } else { return - layer_find_objects_in_rectangle(ddisp->diagram->data->active_layer, &r); + layer_find_objects_in_rectangle (ddisp->diagram->data->active_layer, &r); } } static void -modify_button_release(ModifyTool *tool, GdkEventButton *event, - DDisplay *ddisp) +modify_button_release (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaModifyTool *tool = DIA_MODIFY_TOOL (self); Point *dest_pos, to; GList *list; int i; ObjectChange *objchange; tool->break_connections = FALSE; - ddisplay_set_all_cursor(default_cursor); + dia_display_set_all_cursor(default_cursor); /* remove position from status bar */ { @@ -714,36 +717,36 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, /* Return to normal state */ gdk_pointer_ungrab (event->time); - ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); - if (!modify_move_already(tool, ddisp, &to)) { + dia_display_untransform_coords (ddisp, event->x, event->y, &to.x, &to.y); + if (!modify_move_already (tool, ddisp, &to)) { tool->orig_pos = NULL; tool->state = STATE_NONE; return; } - diagram_update_connections_selection(ddisp->diagram); + diagram_update_connections_selection (ddisp->diagram); if (tool->orig_pos != NULL) { /* consider the non-selected children affected */ - list = parent_list_affected(ddisp->diagram->data->selected); - dest_pos = g_new(Point, g_list_length(list)); + list = parent_list_affected (ddisp->diagram->data->selected); + dest_pos = g_new (Point, g_list_length(list)); i=0; while (list != NULL) { - DiaObject *obj = (DiaObject *) list->data; - dest_pos[i] = obj->position; - list = g_list_next(list); i++; + DiaObject *obj = (DiaObject *) list->data; + dest_pos[i] = obj->position; + list = g_list_next(list); i++; } - undo_move_objects(ddisp->diagram, tool->orig_pos, dest_pos, - parent_list_affected(ddisp->diagram->data->selected)); + undo_move_objects (ddisp->diagram, tool->orig_pos, dest_pos, + parent_list_affected (ddisp->diagram->data->selected)); } - ddisplay_connect_selected(ddisp); /* pushes UNDO info */ - diagram_update_extents(ddisp->diagram); - diagram_modified(ddisp->diagram); - diagram_flush(ddisp->diagram); + dia_display_connect_selected (ddisp); /* pushes UNDO info */ + diagram_update_extents (ddisp->diagram); + diagram_modified (ddisp->diagram); + diagram_flush (ddisp->diagram); - undo_set_transactionpoint(ddisp->diagram->undo); + undo_set_transactionpoint (ddisp->diagram->undo); tool->orig_pos = NULL; tool->state = STATE_NONE; @@ -753,34 +756,34 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, tool->state = STATE_NONE; if (tool->orig_pos != NULL) { - undo_move_handle(ddisp->diagram, tool->handle, tool->object, + undo_move_handle (ddisp->diagram, tool->handle, tool->object, *tool->orig_pos, tool->last_to, gdk_event_to_dia_ModifierKeys(event->state)); } /* Final move: */ - object_add_updates(tool->object, ddisp->diagram); - objchange = tool->object->ops->move_handle(tool->object, tool->handle, + object_add_updates (tool->object, ddisp->diagram); + objchange = tool->object->ops->move_handle (tool->object, tool->handle, &tool->last_to, NULL, HANDLE_MOVE_USER_FINAL,gdk_event_to_dia_ModifierKeys(event->state)); if (objchange != NULL) { - undo_object_change(ddisp->diagram, tool->object, objchange); + undo_object_change (ddisp->diagram, tool->object, objchange); } object_add_updates(tool->object, ddisp->diagram); /* Connect if possible: */ if (tool->handle->connect_type != HANDLE_NONCONNECTABLE) { - object_connect_display(ddisp, tool->object, tool->handle, TRUE); /* pushes UNDO info */ - diagram_update_connections_selection(ddisp->diagram); + object_connect_display (ddisp, tool->object, tool->handle, TRUE); /* pushes UNDO info */ + diagram_update_connections_selection (ddisp->diagram); } - highlight_reset_all(ddisp->diagram); - diagram_flush(ddisp->diagram); + highlight_reset_all (ddisp->diagram); + diagram_flush (ddisp->diagram); - diagram_modified(ddisp->diagram); - diagram_update_extents(ddisp->diagram); + diagram_modified (ddisp->diagram); + diagram_update_extents (ddisp->diagram); - undo_set_transactionpoint(ddisp->diagram->undo); + undo_set_transactionpoint (ddisp->diagram->undo); if (tool->orig_pos != NULL) { g_free(tool->orig_pos); @@ -792,21 +795,18 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, gdk_pointer_ungrab (event->time); /* Remove last box: */ - if (!tool->auto_scrolled) { - gdk_draw_rectangle (gtk_widget_get_window (ddisp->canvas), tool->gc, FALSE, - tool->x1, tool->y1, - tool->x2 - tool->x1, tool->y2 - tool->y1); - } + dia_interactive_renderer_set_selection (ddisp->renderer, + FALSE, 0, 0, 0, 0); { GList *list, *list_to_free; - list = list_to_free = find_selected_objects(ddisp, tool); + list = list_to_free = find_selected_objects (ddisp, tool); if (selection_style == SELECT_REPLACE && !(event->state & GDK_SHIFT_MASK)) { /* Not Multi-select => Remove all selected */ - diagram_remove_all_selected(ddisp->diagram, TRUE); + diagram_remove_all_selected (ddisp->diagram, TRUE); } if (selection_style == SELECT_INTERSECTION) { @@ -815,22 +815,22 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; - if (diagram_is_selected(ddisp->diagram, obj)) { - intersection = g_list_append(intersection, obj); + if (diagram_is_selected (ddisp->diagram, obj)) { + intersection = g_list_append (intersection, obj); } - list = g_list_next(list); + list = g_list_next (list); } list = intersection; - diagram_remove_all_selected(ddisp->diagram, TRUE); + diagram_remove_all_selected (ddisp->diagram, TRUE); while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; - diagram_select(ddisp->diagram, obj); + diagram_select (ddisp->diagram, obj); - list = g_list_next(list); + list = g_list_next (list); } - g_list_free(intersection); + g_list_free (intersection); } else { while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; @@ -856,8 +856,8 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event, } - ddisplay_do_update_menu_sensitivity(ddisp); - ddisplay_flush(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); + dia_display_flush (ddisp); tool->state = STATE_NONE; break; diff --git a/app/modify_tool.h b/app/tools/modify_tool.h similarity index 88% rename from app/modify_tool.h rename to app/tools/modify_tool.h index 7b85442753af8dfc8c14aee4b0c2abb04416a584..9822e33b733decf12e421c831e4befdd2d8a7995 100644 --- a/app/modify_tool.h +++ b/app/tools/modify_tool.h @@ -21,7 +21,8 @@ #include "geometry.h" #include "tool.h" -typedef struct _ModifyTool ModifyTool; +#define DIA_TYPE_MODIFY_TOOL (dia_modify_tool_get_type ()) +G_DECLARE_FINAL_TYPE (DiaModifyTool, dia_modify_tool, DIA, MODIFY_TOOL, DiaTool) enum ModifyToolState { STATE_NONE, @@ -30,7 +31,4 @@ enum ModifyToolState { STATE_BOX_SELECT }; -Tool *create_modify_tool(void); -void free_modify_tool(Tool *tool); - #endif /* MODIFY_TOOL_H */ diff --git a/app/tools/scroll_tool.c b/app/tools/scroll_tool.c new file mode 100644 index 0000000000000000000000000000000000000000..816fe121098117105299ed389db99973b7ce4eac --- /dev/null +++ b/app/tools/scroll_tool.c @@ -0,0 +1,171 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 "scroll_tool.h" +#include "handle_ops.h" +#include "object_ops.h" +#include "connectionpoint_ops.h" +#include "message.h" +#include "cursor.h" + +static void scroll_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void scroll_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); +static void scroll_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp); +static void scroll_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp); + +G_DEFINE_TYPE (DiaScrollTool, dia_scroll_tool, DIA_TYPE_TOOL) + +static void +activate (DiaTool *tool) +{ + DiaScrollTool *self = DIA_SCROLL_TOOL (tool); + + self->scrolling = FALSE; + self->use_hand = TRUE; + + dia_display_set_all_cursor (get_cursor (CURSOR_GRAB)); +} + +static void +deactivate (DiaTool *tool) +{ + dia_display_set_all_cursor (default_cursor); +} + +static void +dia_scroll_tool_class_init (DiaScrollToolClass *klass) +{ + DiaToolClass *tool_class = DIA_TOOL_CLASS (klass); + + tool_class->activate = activate; + tool_class->deactivate = deactivate; + + tool_class->button_press = scroll_button_press; + tool_class->button_release = scroll_button_release; + tool_class->motion = scroll_motion; + tool_class->double_click = scroll_double_click; +} + +static void +dia_scroll_tool_init (DiaScrollTool *self) +{ +} + +static void +scroll_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + /* Do nothing */ +} + +static void +scroll_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + DiaScrollTool *self = DIA_SCROLL_TOOL (tool); + Point clickedpoint; + + self->use_hand = (event->state & GDK_SHIFT_MASK) == 0; + if (self->use_hand) + dia_display_set_all_cursor (get_cursor (CURSOR_GRABBING)); + else + dia_display_set_all_cursor (get_cursor (CURSOR_SCROLL)); + + dia_display_untransform_coords (ddisp, + (int)event->x, (int)event->y, + &clickedpoint.x, &clickedpoint.y); + + self->scrolling = TRUE; + self->last_pos = clickedpoint; +} + +static void +scroll_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp) +{ + DiaScrollTool *self = DIA_SCROLL_TOOL (tool); + Point to; + Point delta; + + /* set the cursor appropriately, and change use_hand if needed */ + if (!self->scrolling) { + /* try to minimise the number of cursor type changes */ + if ((event->state & GDK_SHIFT_MASK) == 0) { + if (!self->use_hand) { + self->use_hand = TRUE; + dia_display_set_all_cursor (get_cursor (CURSOR_GRAB)); + } + } else + if (self->use_hand) { + self->use_hand = FALSE; + dia_display_set_all_cursor (get_cursor (CURSOR_SCROLL)); + } + return; + } + + dia_display_untransform_coords (ddisp, event->x, event->y, &to.x, &to.y); + + if (self->use_hand) { + delta = self->last_pos; + point_sub(&delta, &to); + + self->last_pos = to; + point_add(&self->last_pos, &delta); + + /* we use this so you can scroll past the edge of the image */ + point_add(&delta, &ddisp->origo); + dia_display_set_origo (ddisp, delta.x, delta.y); + dia_display_update_scrollbars (ddisp); + dia_display_add_update_all(ddisp); + } else { + delta = to; + point_sub(&delta, &self->last_pos); + point_scale(&delta, 0.5); + + dia_display_scroll (ddisp, &delta); + self->last_pos = to; + } + dia_display_flush (ddisp); +} + +static void +scroll_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + DiaScrollTool *self = DIA_SCROLL_TOOL (tool); + self->use_hand = (event->state & GDK_SHIFT_MASK) == 0; + if (self->use_hand) { + dia_display_set_all_cursor(get_cursor(CURSOR_GRAB)); + } else + dia_display_set_all_cursor(get_cursor(CURSOR_SCROLL)); + + self->scrolling = FALSE; +} diff --git a/app/scroll_tool.h b/app/tools/scroll_tool.h similarity index 84% rename from app/scroll_tool.h rename to app/tools/scroll_tool.h index dae320a5a25fc13a0cf7d754155ee8e76679a422..a58ba0f520ebe1a5bdbf702c5131a66d23b510e7 100644 --- a/app/scroll_tool.h +++ b/app/tools/scroll_tool.h @@ -21,19 +21,17 @@ #include "geometry.h" #include "tool.h" -typedef struct _ScrollTool ScrollTool; +#define DIA_TYPE_SCROLL_TOOL (dia_scroll_tool_get_type ()) +G_DECLARE_FINAL_TYPE (DiaScrollTool, dia_scroll_tool, DIA, SCROLL_TOOL, DiaTool) -struct _ScrollTool { - Tool tool; +struct _DiaScrollTool { + DiaTool tool; int scrolling; int use_hand; Point last_pos; }; -Tool *create_scroll_tool(void); -void free_scroll_tool(Tool *tool); - #endif /* SCROLL_TOOL_H */ diff --git a/app/textedit_tool.c b/app/tools/textedit_tool.c similarity index 53% rename from app/textedit_tool.c rename to app/tools/textedit_tool.c index 657f382d12421384d31bd95159941b29f726b0cb..b81057489f5e93154e5e2dbfb3dc9b1127731a6b 100644 --- a/app/textedit_tool.c +++ b/app/tools/textedit_tool.c @@ -24,6 +24,8 @@ #include "cursor.h" #include "object_ops.h" +G_DEFINE_TYPE (DiaTextEditTool, dia_text_edit_tool, DIA_TYPE_TOOL) + /** The text edit tool. This tool allows the user to switch to a mode where * clicking on an editable text will start text edit mode. Clicking outside * of editable text will revert to selection tool. Note that clicking this @@ -31,14 +33,15 @@ * by clicking an object. */ static DiaObject * -click_select_object(DDisplay *ddisp, Point *clickedpoint, - GdkEventButton *event) +click_select_object (DiaDisplay *ddisp, + Point *clickedpoint, + GdkEventButton *event) { - real click_distance = ddisplay_untransform_length(ddisp, 3.0); + real click_distance = dia_display_untransform_length(ddisp, 3.0); Diagram *diagram = ddisp->diagram; DiaObject *obj; - ddisplay_untransform_coords(ddisp, + dia_display_untransform_coords(ddisp, (int)event->x, (int)event->y, &clickedpoint->x, &clickedpoint->y); @@ -52,120 +55,132 @@ click_select_object(DDisplay *ddisp, Point *clickedpoint, already = g_list_find(diagram->data->selected, obj); if (already == NULL) { /* Not already selected */ if (!(event->state & GDK_SHIFT_MASK)) { - /* Not Multi-select => remove current selection */ - diagram_remove_all_selected(diagram, TRUE); + /* Not Multi-select => remove current selection */ + diagram_remove_all_selected (diagram, TRUE); } - diagram_select(diagram, obj); + diagram_select (diagram, obj); } - ddisplay_do_update_menu_sensitivity(ddisp); - object_add_updates_list(diagram->data->selected, diagram); - diagram_flush(diagram); + dia_display_do_update_menu_sensitivity (ddisp); + object_add_updates_list (diagram->data->selected, diagram); + diagram_flush (diagram); return obj; } - return obj; + return obj; } static void -textedit_button_press(TexteditTool *tool, GdkEventButton *event, - DDisplay *ddisp) +text_edit_button_press (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) { + DiaTextEditTool *self = DIA_TEXT_EDIT_TOOL (tool); Point clickedpoint; Diagram *diagram = ddisp->diagram; DiaObject *obj = click_select_object (ddisp, &clickedpoint, event); if (obj) { - if (obj != tool->object) + if (obj != self->object) textedit_deactivate_focus (); /* set cursor position */ - if (textedit_activate_object(ddisp, obj, &clickedpoint)) { - tool->object = obj; - tool->start_at = clickedpoint; - tool->state = STATE_TEXT_SELECT; + if (textedit_activate_object (ddisp, obj, &clickedpoint)) { + self->object = obj; + self->start_at = clickedpoint; + self->state = STATE_TEXT_SELECT; } else { /* Clicked outside of editable object, stop editing */ - tool_reset(); + tool_reset (); } } else { textedit_deactivate_focus (); - diagram_remove_all_selected(diagram, TRUE); - tool_reset(); + diagram_remove_all_selected (diagram, TRUE); + tool_reset (); } } static void -textedit_button_release(TexteditTool *tool, GdkEventButton *event, - DDisplay *ddisp) +text_edit_button_release (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) { Point clickedpoint; DiaObject *obj = click_select_object (ddisp, &clickedpoint, event); if (obj) { - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); - tool->state = STATE_TEXT_EDIT; + DIA_TEXT_EDIT_TOOL (tool)->state = STATE_TEXT_EDIT; /* no selection in the text editing yes */ } else { /* back to modifying if we dont have an object */ - textedit_deactivate_focus(); + textedit_deactivate_focus (); tool_reset (); } } static void -textedit_motion(TexteditTool *tool, GdkEventMotion *event, - DDisplay *ddisp) +text_edit_motion (DiaTool *tool, + GdkEventMotion *event, + DiaDisplay *ddisp) { /* if we implement text selection here we could update the visual feedback */ } static void -textedit_double_click(TexteditTool *tool, GdkEventButton *event, - DDisplay *ddisp) +text_edit_double_click (DiaTool *tool, + GdkEventButton *event, + DiaDisplay *ddisp) { /* if we implment text selection this should select a word */ } -Tool * -create_textedit_tool(void) +static void +activate (DiaTool *tool) { - TexteditTool *tool; - DDisplay *ddisp; - - tool = g_new0(TexteditTool, 1); - tool->tool.type = TEXTEDIT_TOOL; - tool->tool.button_press_func = (ButtonPressFunc) &textedit_button_press; - tool->tool.button_release_func = (ButtonReleaseFunc) &textedit_button_release; - tool->tool.motion_func = (MotionFunc) &textedit_motion; - tool->tool.double_click_func = (DoubleClickFunc) &textedit_double_click; - - ddisplay_set_all_cursor(get_cursor(CURSOR_XTERM)); + DiaDisplay *ddisp; - ddisp = ddisplay_active(); + dia_display_set_all_cursor (get_cursor (CURSOR_XTERM)); + + ddisp = dia_display_active(); if (ddisp) { if (textedit_activate_first (ddisp)) { /* set the focus to the canvas area */ gtk_widget_grab_focus (ddisp->canvas); } - ddisplay_flush(ddisp); + dia_display_flush (ddisp); /* the above may have entered the textedit mode, just update in any case */ - ddisplay_do_update_menu_sensitivity(ddisp); + dia_display_do_update_menu_sensitivity (ddisp); } - - return (Tool *)tool; } -void -free_textedit_tool (Tool *tool) +static void +deactivate (DiaTool *tool) { - DDisplay *ddisp = ddisplay_active(); + DiaDisplay *ddisp = dia_display_active (); if (ddisp) { textedit_deactivate_focus (); - ddisplay_flush(ddisp); + dia_display_flush (ddisp); } - ddisplay_set_all_cursor(default_cursor); + dia_display_set_all_cursor (default_cursor); +} - g_free (tool); +static void +dia_text_edit_tool_class_init (DiaTextEditToolClass *klass) +{ + DiaToolClass *tool_class = DIA_TOOL_CLASS (klass); + + tool_class->activate = activate; + tool_class->deactivate = deactivate; + + tool_class->button_press = text_edit_button_press; + tool_class->button_release = text_edit_button_release; + tool_class->motion = text_edit_motion; + tool_class->double_click = text_edit_double_click; +} + +static void +dia_text_edit_tool_init (DiaTextEditTool *self) +{ } diff --git a/app/textedit_tool.h b/app/tools/textedit_tool.h similarity index 84% rename from app/textedit_tool.h rename to app/tools/textedit_tool.h index 5ed5807ef133bd9873d1cc624a53bb855f1eab4e..4e936b3e5106c3da1fb7b6de0df12912743d6686 100644 --- a/app/textedit_tool.h +++ b/app/tools/textedit_tool.h @@ -26,17 +26,15 @@ enum TexteditToolState { STATE_TEXT_EDIT }; -typedef struct _TexteditTool TexteditTool; +#define DIA_TYPE_TEXT_EDIT_TOOL (dia_text_edit_tool_get_type ()) +G_DECLARE_FINAL_TYPE (DiaTextEditTool, dia_text_edit_tool, DIA, TEXT_EDIT_TOOL, DiaTool) -struct _TexteditTool { - Tool tool; +struct _DiaTextEditTool { + DiaTool tool; enum TexteditToolState state; DiaObject *object; Point start_at; }; -Tool *create_textedit_tool(void); -void free_textedit_tool(Tool *tool); - #endif /* TEXTEDIT_TOOL_H */ diff --git a/app/tools/tool.c b/app/tools/tool.c new file mode 100644 index 0000000000000000000000000000000000000000..19a03f1b7a9c23d7d011705d6fe59752a7627300 --- /dev/null +++ b/app/tools/tool.c @@ -0,0 +1,279 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 "tool.h" +#include "create_object.h" +#include "magnify.h" +#include "modify_tool.h" +#include "scroll_tool.h" +#include "textedit_tool.h" +#include "interface.h" +#include "defaults.h" +#include "object.h" + +DiaTool *active_tool = NULL; +DiaTool *transient_tool = NULL; +static GtkWidget *active_button = NULL; +static GtkWidget *former_button = NULL; + + +G_DEFINE_TYPE (DiaTool, dia_tool, G_TYPE_OBJECT) + +enum { + ACTIVATE, + DEACTIVATE, + BUTTON_PRESS, + BUTTON_HOLD, + DOUBLE_CLICK, + BUTTON_RELEASE, + MOTION, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +dia_tool_class_init (DiaToolClass *klass) +{ + klass->activate = NULL; + klass->deactivate = NULL; + klass->button_press = NULL; + klass->button_hold = NULL; + klass->double_click = NULL; + klass->button_release = NULL; + klass->motion = NULL; + + signals[ACTIVATE] = g_signal_new ("activate", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, activate), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals[DEACTIVATE] = g_signal_new ("deactivate", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, activate), + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals[BUTTON_PRESS] = g_signal_new ("button-press", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, button_press), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + GDK_TYPE_EVENT, + DIA_TYPE_DISPLAY); + + signals[BUTTON_HOLD] = g_signal_new ("button-hold", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, button_hold), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + GDK_TYPE_EVENT, + DIA_TYPE_DISPLAY); + + signals[DOUBLE_CLICK] = g_signal_new ("double-click", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, double_click), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + GDK_TYPE_EVENT, + DIA_TYPE_DISPLAY); + + signals[BUTTON_RELEASE] = g_signal_new ("button-release", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, button_release), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + GDK_TYPE_EVENT, + DIA_TYPE_DISPLAY); + + signals[MOTION] = g_signal_new ("motion", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiaToolClass, motion), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + GDK_TYPE_EVENT, + DIA_TYPE_DISPLAY); +} + +static void +dia_tool_init (DiaTool *self) +{ + +} + +void +dia_tool_activate (DiaTool *self) +{ + g_signal_emit (self, signals[ACTIVATE], 0); +} + +void +dia_tool_deactivate (DiaTool *self) +{ + g_signal_emit (self, signals[DEACTIVATE], 0); +} + +void +dia_tool_button_press (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + g_signal_emit (self, signals[BUTTON_PRESS], 0, event, ddisp); +} + +void +dia_tool_button_hold (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + g_signal_emit (self, signals[BUTTON_HOLD], 0, event, ddisp); + +} + +void +dia_tool_double_click (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + g_signal_emit (self, signals[DOUBLE_CLICK], 0, event, ddisp); + +} + +void +dia_tool_button_release (DiaTool *self, + GdkEventButton *event, + DiaDisplay *ddisp) +{ + g_signal_emit (self, signals[BUTTON_RELEASE], 0, event, ddisp); + +} + +void +dia_tool_motion (DiaTool *self, + GdkEventMotion *event, + DiaDisplay *ddisp) +{ + g_signal_emit (self, signals[MOTION], 0, event, ddisp); +} + +void +tool_select_former(void) +{ + if (former_button) { + g_signal_emit_by_name(G_OBJECT(former_button), "clicked", + GTK_BUTTON(former_button), NULL); + } +} + +void +tool_reset(void) +{ + g_signal_emit_by_name(G_OBJECT(modify_tool_button), "clicked", + GTK_BUTTON(modify_tool_button), NULL); +} + +void +tool_get(ToolState *state) +{ + state->button = active_button; + if (state->type == DIA_TYPE_CREATE_TOOL) { + state->user_data = DIA_CREATE_TOOL (active_tool)->user_data; + state->extra_data = DIA_CREATE_TOOL (active_tool)->objtype->name; + state->invert_persistence = DIA_CREATE_TOOL (active_tool)->invert_persistence; + } + else + { + state->user_data = NULL; + state->extra_data = NULL; + state->invert_persistence = 0; + } +} + +void +tool_restore(const ToolState *state) +{ + tool_select (state->type, state->extra_data, state->user_data, state->button, + state->invert_persistence); +} + +void +tool_select (ToolType type, + gpointer extra_data, + gpointer user_data, + GtkWidget *button, + gboolean invert_persistence) +{ + if (button) + former_button = active_button; + + dia_tool_deactivate (active_tool); + g_object_unref (active_tool); + + switch(type) { + case MODIFY_TOOL: + active_tool = g_object_new (DIA_TYPE_MODIFY_TOOL, NULL); + break; + case CREATE_OBJECT_TOOL: + active_tool = dia_create_tool_new (object_get_type ((char *) extra_data), + invert_persistence, + (void *) user_data); + break; + case MAGNIFY_TOOL: + active_tool = g_object_new (DIA_TYPE_MAGNIFY_TOOL, NULL); + break; + case SCROLL_TOOL: + active_tool = g_object_new (DIA_TYPE_SCROLL_TOOL, NULL); + break; + case TEXTEDIT_TOOL : + active_tool = g_object_new (DIA_TYPE_TEXT_EDIT_TOOL, NULL); + break; + default: + g_assert_not_reached(); + } + + dia_tool_activate (active_tool); + + if (button) + active_button = button; +} + +void +tool_options_dialog_show (GType type, + gpointer extra_data, + gpointer user_data, + GtkWidget *button, + gboolean invert_persistence) +{ + DiaObjectType *objtype; + + if (!G_TYPE_CHECK_INSTANCE_TYPE (active_tool, type)) + tool_select (type, extra_data, user_data, button, invert_persistence); + + if (DIA_IS_CREATE_TOOL (active_tool)) { + objtype = object_get_type ((char *) extra_data); + defaults_show (objtype, user_data); + } +} diff --git a/app/tools/tool.h b/app/tools/tool.h new file mode 100644 index 0000000000000000000000000000000000000000..8447c33295b496d6526a63d919106d0d1442e745 --- /dev/null +++ b/app/tools/tool.h @@ -0,0 +1,90 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 TOOL_H +#define TOOL_H + +#include + +G_BEGIN_DECLS + +typedef struct _ToolState ToolState; + +#include "display.h" + +#define DIA_TYPE_TOOL (dia_tool_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaTool, dia_tool, DIA, TOOL, GObject) + +typedef enum _ToolType ToolType; + +enum _ToolType { + CREATE_OBJECT_TOOL, + MAGNIFY_TOOL, + MODIFY_TOOL, + SCROLL_TOOL, + TEXTEDIT_TOOL +}; + +struct _DiaToolClass { + GObjectClass parent_class; + + void (* activate) (DiaTool *); + void (* deactivate) (DiaTool *); + + void (* button_press) (DiaTool *, GdkEventButton *, DiaDisplay *ddisp); + void (* button_hold) (DiaTool *, GdkEventButton *, DiaDisplay *ddisp); + void (* double_click) (DiaTool *, GdkEventButton *, DiaDisplay *ddisp); + void (* button_release) (DiaTool *, GdkEventButton *, DiaDisplay *ddisp); + void (* motion) (DiaTool *, GdkEventMotion *, DiaDisplay *ddisp); +}; + +struct _ToolState { + GType type; + gpointer extra_data; + gpointer user_data; + GtkWidget *button; + int invert_persistence; +}; + +extern DiaTool *active_tool, *transient_tool; + +void tool_get(ToolState *state); +void tool_restore(const ToolState *state); +void tool_select (ToolType type, + gpointer extra_data, + gpointer user_date, + GtkWidget *button, + int invert_persistence); +void tool_select_former(void); +void tool_reset(void); +void tool_options_dialog_show (GType type, + gpointer extra_data, + gpointer user_data, + GtkWidget *button, + gboolean invert_persistence); + +void dia_tool_activate (DiaTool *self); +void dia_tool_deactivate (DiaTool *self); +void dia_tool_button_press (DiaTool *self, GdkEventButton *, DiaDisplay *ddisp); +void dia_tool_button_hold (DiaTool *self, GdkEventButton *, DiaDisplay *ddisp); +void dia_tool_double_click (DiaTool *self, GdkEventButton *, DiaDisplay *ddisp); +void dia_tool_button_release (DiaTool *self, GdkEventButton *, DiaDisplay *ddisp); +void dia_tool_motion (DiaTool *self, GdkEventMotion *, DiaDisplay *ddisp); + +G_END_DECLS + +#endif /* TOOL_H */ diff --git a/app/undo.c b/app/undo.c index 55201f286e4c6ecd9b21112ad7fb09c541a832e3..6cdbf25c750fa53cf40969c678f934ea23a5a126 100644 --- a/app/undo.c +++ b/app/undo.c @@ -259,7 +259,7 @@ undo_clear(UndoStack *stack) void undo_update_menus(UndoStack *stack) { - ddisplay_do_update_menu_sensitivity(ddisplay_active()); + dia_display_do_update_menu_sensitivity(dia_display_active()); } /** Marks the undo stack at the time of a save. diff --git a/app/widgets/dia-sheet-chooser.c b/app/widgets/dia-sheet-chooser.c new file mode 100644 index 0000000000000000000000000000000000000000..70dc1df436fce7de7f4141a4555e250291e7a418 --- /dev/null +++ b/app/widgets/dia-sheet-chooser.c @@ -0,0 +1,264 @@ +#include + +#include "dia-sheet-chooser.h" +#include "dia_dirs.h" + +struct _DiaSheetChooserPopover { + GtkPopover parent; + + GtkWidget *filter; + GtkWidget *list; +}; + +G_DEFINE_TYPE (DiaSheetChooserPopover, dia_sheet_chooser_popover, GTK_TYPE_POPOVER) + +enum { + SHEET_SELECTED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; +static guint popover_signals[LAST_SIGNAL] = { 0 }; + +static void +dia_sheet_chooser_popover_class_init (DiaSheetChooserPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + popover_signals[SHEET_SELECTED] = g_signal_new ("sheet-selected", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_TYPE_SHEET); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-sheet-chooser-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaSheetChooserPopover, list); + gtk_widget_class_bind_template_child (widget_class, DiaSheetChooserPopover, filter); + + g_object_unref (template_file); +} + +static GtkWidget * +render_row (gpointer item, gpointer user_data) +{ + GtkWidget *row; + GtkWidget *box; + GtkWidget *name; + GtkWidget *desc; + + row = gtk_list_box_row_new (); + /* TODO: Let's avoid the trap of set_data */ + g_object_set_data_full (G_OBJECT (row), "dia-sheet", item, g_object_unref); + g_object_set_data (G_OBJECT (row), + "dia-list-top", + g_object_get_data (G_OBJECT (item), "dia-list-top")); + gtk_widget_set_tooltip_markup (row, + g_strdup_printf ("%s\n%s", + DIA_SHEET (item)->name, + DIA_SHEET (item)->description)); + gtk_widget_show (row); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 2, + "margin", 4, + NULL); + gtk_container_add (GTK_CONTAINER (row), box); + gtk_widget_show (box); + + name = g_object_new (GTK_TYPE_LABEL, + "label", DIA_SHEET (item)->name, + "xalign", 0.0, + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 25, + NULL); + gtk_widget_show (name); + gtk_box_pack_start (GTK_BOX (box), name, FALSE, FALSE, 0); + + desc = g_object_new (GTK_TYPE_LABEL, + "label", DIA_SHEET (item)->description, + "xalign", 0.0, + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 25, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (desc), + GTK_STYLE_CLASS_DIM_LABEL); + gtk_widget_show (desc); + gtk_box_pack_start (GTK_BOX (box), desc, FALSE, FALSE, 0); + + return row; +} + +static void +header_func (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data) +{ + gboolean last = FALSE; + gboolean this = FALSE; + + if (before) + last = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (before), "dia-list-top")); + this = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "dia-list-top")); + + if (last && !this) { + GtkWidget *sep = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show (sep); + gtk_list_box_row_set_header (row, sep); + } +} + +static void +sheet_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaSheetChooserPopover *self) +{ + DiaSheet *sheet = g_object_get_data (G_OBJECT (row), "dia-sheet"); + + g_signal_emit_by_name (G_OBJECT (self), "sheet-selected", sheet); +} + +static void +sheet_activated (GtkListBox *box, + GtkListBoxRow *row, + DiaSheetChooserPopover *self) +{ + gtk_popover_popdown (GTK_POPOVER (self)); +} + +static void +dia_sheet_chooser_popover_init (DiaSheetChooserPopover *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_list_box_set_header_func (GTK_LIST_BOX (self->list), + header_func, NULL, NULL); + + g_signal_connect (G_OBJECT (self->list), "row-selected", + G_CALLBACK (sheet_selected), self); + g_signal_connect (G_OBJECT (self->list), "row-activated", + G_CALLBACK (sheet_activated), self); +} + +struct find_data { + GtkWidget *list; + DiaSheet *current; +}; + +static void +find_current (GtkWidget *row, struct find_data *current) +{ + g_return_if_fail (GTK_IS_LIST_BOX_ROW (row)); + + if (g_strcmp0 (DIA_SHEET (g_object_get_data (row, "dia-sheet"))->name, current->current->name) == 0) { + gtk_list_box_select_row (current->list, GTK_LIST_BOX_ROW (row)); + } +} + +void +dia_sheet_chooser_popover_set_model (DiaSheetChooserPopover *self, + GListModel *model, + DiaSheet *current) +{ + struct find_data find = { self->list, current }; + + gtk_list_box_bind_model (GTK_LIST_BOX (self->list), + G_LIST_MODEL (model), + render_row, NULL, NULL); + + gtk_container_foreach (GTK_CONTAINER (self->list), + (GtkCallback) find_current, + &find); +} + +GtkWidget * +dia_sheet_chooser_popover_new () +{ + return g_object_new (DIA_TYPE_SHEET_CHOOSER_POPOVER, NULL); +} + +struct _DiaSheetChooser { + GtkMenuButton parent; + + GtkWidget *label; + GtkWidget *popover; +}; + +G_DEFINE_TYPE (DiaSheetChooser, dia_sheet_chooser, GTK_TYPE_MENU_BUTTON) + +static void +propagate (DiaSheetChooserPopover *chooser, + DiaSheet *sheet, + DiaSheetChooser *self) +{ + gtk_label_set_label (GTK_LABEL (self->label), sheet->name); + + g_signal_emit_by_name (G_OBJECT (self), "sheet-selected", sheet); +} + +static void +dia_sheet_chooser_class_init (DiaSheetChooserClass *klass) +{ + signals[SHEET_SELECTED] = g_signal_new ("sheet-selected", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_TYPE_SHEET); +} + +static void +dia_sheet_chooser_init (DiaSheetChooser *self) +{ + GtkWidget *box; + GtkWidget *arrow; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (self), box); + + self->label = g_object_new (GTK_TYPE_LABEL, + "label", "[NONE]", + "ellipsize", PANGO_ELLIPSIZE_END, + "max-width-chars", 14, + "xalign", 0.0, + NULL); + gtk_widget_show (self->label); + gtk_box_pack_start (GTK_BOX (box), self->label, TRUE, TRUE, 0); + + arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (arrow); + gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, FALSE, 0); + + self->popover = dia_sheet_chooser_popover_new (); + g_signal_connect (G_OBJECT (self->popover), "sheet-selected", + G_CALLBACK (propagate), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), self->popover); +} + +void +dia_sheet_chooser_set_model (DiaSheetChooser *self, + GListModel *model, + DiaSheet *current) +{ + dia_sheet_chooser_popover_set_model (DIA_SHEET_CHOOSER_POPOVER (self->popover), + model, + current); +} + +GtkWidget * +dia_sheet_chooser_new () +{ + return g_object_new (DIA_TYPE_SHEET_CHOOSER, NULL); +} diff --git a/app/widgets/dia-sheet-chooser.h b/app/widgets/dia-sheet-chooser.h new file mode 100644 index 0000000000000000000000000000000000000000..3fb3c216c22e08d58e3334095595aaa035029c5f --- /dev/null +++ b/app/widgets/dia-sheet-chooser.h @@ -0,0 +1,23 @@ +#include + +#include "sheet.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_SHEET_CHOOSER_POPOVER (dia_sheet_chooser_popover_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheetChooserPopover, dia_sheet_chooser_popover, DIA, SHEET_CHOOSER_POPOVER, GtkPopover) + +void dia_sheet_chooser_popover_set_model (DiaSheetChooserPopover *self, + GListModel *model, + DiaSheet *current); + + +#define DIA_TYPE_SHEET_CHOOSER (dia_sheet_chooser_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheetChooser, dia_sheet_chooser, DIA, SHEET_CHOOSER, GtkMenuButton) + +GtkWidget *dia_sheet_chooser_new (); +void dia_sheet_chooser_set_model (DiaSheetChooser *self, + GListModel *model, + DiaSheet *current); + +G_END_DECLS diff --git a/bindings/Makefile.am b/bindings/Makefile.am index 162c75a037cdd5ec49bbb42c798681bebb768eb8..3d9d316dd9bbe50d4b588d624f0c123de8437a17 100644 --- a/bindings/Makefile.am +++ b/bindings/Makefile.am @@ -86,7 +86,7 @@ dia-python.cpp : $(INTERFACES) echo /* No SWIG */ > $@ endif -GCCXMLINC = -I.. -I../lib -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libxml2 -I/usr/include/libart-2.0 -I/usr/include/python2.5 -I/usr/include/libxml2 +GCCXMLINC = -I.. -I../lib -I/usr/include/gtk-2.0 -I/usr/lib64/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libxml2 -I/usr/include/python2.5 -I/usr/include/libxml2 $(srcdir)/dia-object.xml : $(INTERFACES) gccxml --gccxml-cxxflags '$(GTK_CFLAGS) $(XML_CFLAGS)' -I$(top_srcdir) -I ../lib dia-object.cpp -fxml=$@ diff --git a/bindings/dia-extra.cpp b/bindings/dia-extra.cpp index f386824a920ee99fc7b9d80d97da6f668f74bdf2..a8c349e27e63307191900d1599ecf4fcab7923ed 100644 --- a/bindings/dia-extra.cpp +++ b/bindings/dia-extra.cpp @@ -47,9 +47,6 @@ */ void dia::register_plugins () { -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init(); -#endif libdia_init (DIA_MESSAGE_STDERR); dia_register_plugins (); diff --git a/bindings/dia-properties.cpp b/bindings/dia-properties.cpp index 77e2521bbb82c14464201517d7a8bda60e1be0bf..64f915531c182da0a07ab8fae8247e1ea8e51ea6 100644 --- a/bindings/dia-properties.cpp +++ b/bindings/dia-properties.cpp @@ -165,7 +165,7 @@ dia::Property< ::Property* >::~Property () * in the .swig file. */ bool -dia::Property< ::Property* >::get (::_Color* v) const +dia::Property< ::Property* >::get (::GdkRGBA* v) const { g_return_val_if_fail (self != NULL, false); if (strcmp (self->descr->type, PROP_TYPE_COLOUR) == 0) { diff --git a/bindings/dia-properties.h b/bindings/dia-properties.h index d9f32313babc1e8b4c30fa59c422ee5de78685b9..05a5e49ddbe8e69afce827a9fddfef5ea0f64fe5 100644 --- a/bindings/dia-properties.h +++ b/bindings/dia-properties.h @@ -40,7 +40,7 @@ public : //! one more ;) virtual bool get (::_Rectangle* p) const { return false; } //! and this one ... - virtual bool get (::_Color* p) const { return false; } + virtual bool get (::GdkRGBA* p) const { return false; } //! we can also handle vector virtual bool get (const std::vector**) const { return false; } @@ -131,7 +131,7 @@ public : //! one more ;) virtual bool get (::_Rectangle* p) const; //! and this one ... - virtual bool get (::_Color* p) const; + virtual bool get (::GdkRGBA* p) const; //! we can also handle vector virtual bool get (const std::vector**) const; diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp index a3461b9ae6eed152fc0e436307a300e3fa9eeabf..2dc46d9a325f5e00acf1466edd3ff6fbebd63b79 100644 --- a/bindings/dia-renderer.cpp +++ b/bindings/dia-renderer.cpp @@ -105,14 +105,14 @@ dia::Renderer::set_font (Font* font, double height) } // Draw a line from start to end, using color and the current line style void -dia::Renderer::draw_line (Point *start, Point *end, Color *color) +dia::Renderer::draw_line (Point *start, Point *end, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_line (self, start, end, color); } // Fill and/or stroke a rectangle, given its upper-left and lower-right corners void -dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke) +dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rect (self, ul_corner, lr_corner, fill, stroke); @@ -121,7 +121,7 @@ dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color void dia::Renderer::draw_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color) + GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_arc (self, center, width, height, angle1, angle2, color); @@ -130,21 +130,21 @@ dia::Renderer::draw_arc (Point *center, double width, double height, void dia::Renderer::fill_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color) + GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->fill_arc (self, center, width, height, angle1, angle2, color); } // Draw an ellipse, given its center and the bounding box void -dia::Renderer::draw_ellipse (Point *center, double width, double height, Color *fill, Color *stroke) +dia::Renderer::draw_ellipse (Point *center, double width, double height, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_ellipse (self, center, width, height, fill, stroke); } // Print a string at pos, using the current font void -dia::Renderer::draw_string (const gchar *text, Point *pos, Alignment alignment, Color *color) +dia::Renderer::draw_string (const gchar *text, Point *pos, Alignment alignment, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_string (self, text, pos, alignment, color); @@ -159,28 +159,28 @@ dia::Renderer::draw_image (Point *point, double width, double height, Image* ima // draw a bezier line - possibly as approximation consisting of straight lines void -dia::Renderer::draw_bezier (BezPoint *points, int numpoints, Color *color) +dia::Renderer::draw_bezier (BezPoint *points, int numpoints, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_bezier (self, points, numpoints, color); } // fill a bezier line - possibly as approximation consisting of a polygon void -dia::Renderer::draw_beziergon (BezPoint *points, int numpoints, Color *fill, Color *stroke) +dia::Renderer::draw_beziergon (BezPoint *points, int numpoints, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_beziergon (self, points, numpoints, fill, stroke); } // drawing a polyline - or fallback to single line segments void -dia::Renderer::draw_polyline (Point *points, int num_points, Color *color) +dia::Renderer::draw_polyline (Point *points, int num_points, GdkRGBA *color) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_polyline (self, points, num_points, color); } // Draw a polygon, using the current line and/or fill style void -dia::Renderer::draw_polygon (Point *points, int num_points, Color *fill, Color *stroke) +dia::Renderer::draw_polygon (Point *points, int num_points, GdkRGBA *fill, GdkRGBA *stroke) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_polygon (self, points, num_points, fill, stroke); @@ -194,7 +194,7 @@ dia::Renderer::draw_text (Text* text) } // Draw a polyline with round corners void -dia::Renderer::draw_rounded_polyline (Point *points, int num_points, Color *color, double radius ) +dia::Renderer::draw_rounded_polyline (Point *points, int num_points, GdkRGBA *color, double radius ) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rounded_polyline (self, points, num_points, color, radius); @@ -202,14 +202,14 @@ dia::Renderer::draw_rounded_polyline (Point *points, int num_points, Color *colo // specialized draw_rect() with round corners void dia::Renderer::draw_rounded_rect (Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { assert (self); DIA_RENDERER_GET_CLASS(self)->draw_rounded_rect (self, ul_corner, lr_corner, fill, stroke, radius); } // specialized draw_line() for renderers with an own concept of Arrow void -dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width, Color *line_color, +dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -217,7 +217,7 @@ dia::Renderer::draw_line_with_arrows (Point *start, Point *end, real line_width } // specialized draw_line() for renderers with an own concept of Arrow void -dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, Color *color, +dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -225,7 +225,7 @@ dia::Renderer::draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, } // specialized draw_polyline() for renderers with an own concept of Arrow void -dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); @@ -233,7 +233,7 @@ dia::Renderer::draw_polyline_with_arrows (Point *points, int num_points, real li } // specialized draw_rounded_polyline() for renderers with an own concept of Arrow void -dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) { assert (self); @@ -241,7 +241,7 @@ dia::Renderer::draw_rounded_polyline_with_arrows (Point *points, int num_points, } // specialized draw_bezier() for renderers with an own concept of Arrow void -dia::Renderer::draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, Color *color, +dia::Renderer::draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { assert (self); diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h index bc7709032872e119f5e73bfe7ff5ccfdd3b8bd36..a52466f71c9f10ecf40ce123b85679e193a765c7 100644 --- a/bindings/dia-renderer.h +++ b/bindings/dia-renderer.h @@ -73,29 +73,29 @@ public : virtual void set_font (Font* font, double height); //! Draw a line from start to end, using color and the current line style //! \ingroup RendererRequired - virtual void draw_line (Point *start, Point *end, Color *color); + virtual void draw_line (Point *start, Point *end, GdkRGBA *color); //! Fill and/or stroke a rectangle, given its upper-left and lower-right corners //! \ingroup RendererRequired - virtual void draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke); + virtual void draw_rect (Point *ul_corner, Point *lr_corner, GdkRGBA *fill, GdkRGBA *stroke); //! the polygon is filled using the current fill type, no border is drawn //! \ingroup RendererRequired - virtual void draw_polygon (Point *points, int num_points, Color *fill, Color *stroke); + virtual void draw_polygon (Point *points, int num_points, GdkRGBA *fill, GdkRGBA *stroke); //! Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle //! \ingroup RendererRequired virtual void draw_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color); + GdkRGBA *color); //! Same a DrawArcFunc except the arc is filled (a pie-chart) //! \ingroup RendererRequired virtual void fill_arc (Point *center, double width, double height, double angle1, double angle2, - Color *color); + GdkRGBA *color); //! Draw an ellipse, given its center and the bounding box //! \ingroup RendererRequired - virtual void draw_ellipse (Point *center, double width, double height, Color *fill, Color *stroke); + virtual void draw_ellipse (Point *center, double width, double height, GdkRGBA *fill, GdkRGBA *stroke); //! Print a string at pos, using the current font //! \ingroup RendererRequired - virtual void draw_string (const gchar *text, Point *pos, Alignment alignment, Color *color); + virtual void draw_string (const gchar *text, Point *pos, Alignment alignment, GdkRGBA *color); //! Draw an image, given its bounding box //! \ingroup RendererRequired virtual void draw_image (Point *point, double width, double height, Image* image); @@ -106,13 +106,13 @@ public : //! draw a bezier line - possibly as approximation consisting of straight lines //! \ingroup RenderMedium - virtual void draw_bezier (BezPoint *points, int numpoints, Color *color); + virtual void draw_bezier (BezPoint *points, int numpoints, GdkRGBA *color); //! fill and/or stroke a bezier - possibly as approximation consisting of a polygon //! \ingroup RenderMedium - virtual void draw_beziergon (BezPoint *points, int numpoints, Color *fill, Color *stroke); + virtual void draw_beziergon (BezPoint *points, int numpoints, GdkRGBA *fill, GdkRGBA *stroke); //! drawing a polyline - or fallback to single line segments //! \ingroup RenderMedium - virtual void draw_polyline (Point *points, int num_points, Color *color); + virtual void draw_polyline (Point *points, int num_points, GdkRGBA *color); //! draw a Text. It holds its own information like position, style, ... //! \ingroup RenderMedium virtual void draw_text (Text* text); @@ -123,30 +123,30 @@ public : //! a polyline with round coners //! \ingroup RenderHigh - virtual void draw_rounded_polyline (Point *points, int num_points, Color *color, double radius); + virtual void draw_rounded_polyline (Point *points, int num_points, GdkRGBA *color, double radius); //! specialized draw_rect() with round corners //! \ingroup RenderHigh virtual void draw_rounded_rect (Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); //! specialized draw_line() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_line_with_arrows (Point *start, Point *end, real line_width, Color *line_color, + virtual void draw_line_with_arrows (Point *start, Point *end, real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_line() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, Color *color, + virtual void draw_arc_with_arrows (Point *start, Point *end, Point *midpoint, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_polyline() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, + virtual void draw_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); //! specialized draw_rounded_polyline() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, Color *color, + virtual void draw_rounded_polyline_with_arrows (Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); //! specialized draw_bezier() for renderers with an own concept of Arrow //! \ingroup RenderHigh - virtual void draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, Color *color, + virtual void draw_bezier_with_arrows (BezPoint *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); private : diff --git a/config.h.win32 b/config.h.win32 index 37f9a37db509868a80aca61227968830247d7f7f..c9996d1d010b9365ed0462408235b7c88f57caed 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -9,9 +9,6 @@ #define HAVE_FCNTL_H 1 #define HAVE_GDK_PIXBUF 1 -/* #undef HAVE_CAIRO */ -#define HAVE_CAIRO 1 - #define ENABLE_NLS #define HAVE_BIND_TEXTDOMAIN_CODESET #define GETTEXT_PACKAGE "dia" @@ -19,10 +16,6 @@ /* NOT: #define LOCALEDIR "../lib/locale" */ /* some non critical defines */ -#if 0 -#define HAVE_LIBART -#define HAVE_LIBPNG -#endif #define HAVE_LIBZ #define VERSION "0.97+git" diff --git a/configure.ac b/configure.ac index c99fc3f2bfbb8b437d5650d551e6cc591f23212e..52b61fbfe4f8607bf8dce0223d822b01dc59cf5b 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Process this -*- autoconf -*- file with autoconf to produce a dnl configure script. AC_INIT(dia, 0.97+git, http://bugzilla.gnome.org/enter_bug.cgi?product=dia) AC_CONFIG_SRCDIR(app/diagram.c) -AM_INIT_AUTOMAKE(AC_PACKAGE_NAME,AC_PACKAGE_VERSION) +AM_INIT_AUTOMAKE([subdir-objects]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_PREREQ(2.50) @@ -70,11 +70,8 @@ dnl Checks for libraries PKG_CHECK_MODULES(GMODULE, gmodule-2.0 gobject-2.0) AC_SUBST(GMODULE_CFLAGS) AC_SUBST(GMODULE_LIBS) -AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) -GTK_MODULES="gtk+-2.0 >= 2.16.0 glib-2.0 >= 2.20.0 libxml-2.0 gdk-pixbuf-2.0 gthread-2.0 gmodule-2.0" -PKG_CHECK_MODULES(PANGOVERSION, pango >= 1.20.0 pangocairo, , - AC_MSG_ERROR([Need Pango version 1.20.0 or higher])) +GTK_MODULES="gtk+-3.0 >= 3.10.0 glib-2.0 >= 2.20.0 libxml-2.0 gdk-pixbuf-2.0 gthread-2.0 gmodule-2.0" AC_ARG_WITH(freetype, AC_HELP_STRING([--without-freetype],[compile without FreeType support]),,with_freetype=yes) @@ -102,13 +99,6 @@ AM_CONDITIONAL(WITH_FREETYPE, test "x$with_freetype" != "xno") CFLAGS="$FREETYPE_CFLAGS $CFLAGS" -dnl Try for libart -PKG_CHECK_MODULES(LIBART,libart-2.0,have_libart=yes,have_libart=no) -if test "$have_libart" = "yes" ; then - GTK_MODULES="$GTK_MODULES libart-2.0" - AC_DEFINE(HAVE_LIBART,1,[Define if building with LIBART support]) -fi - dnl Try for poppler PKG_CHECK_MODULES(POPPLER,poppler,have_poppler=yes,have_poppler=no) if test "$have_poppler" = "yes" ; then @@ -136,24 +126,9 @@ fi AM_CONDITIONAL(HAVE_BONOBO,[test "true" = "false"]) -dnl Look for Cairo -AC_ARG_WITH(cairo, - AC_HELP_STRING([--with-cairo],[compile cairo plug-in]),,with_cairo=yes) -if test "x$with_cairo" != "xno"; then - PKG_CHECK_MODULES(CAIROVERSION, cairo >= 1.6.0, , - AC_MSG_ERROR([Need Cairo version 1.6.0 or higher])) - PKG_CHECK_MODULES(CAIRO, cairo,have_cairo=yes,have_cairo=no) - AC_SUBST(CAIRO_LIBS) - AC_SUBST(CAIRO_CFLAGS) - AC_DEFINE(HAVE_CAIRO,1,[Define if building with Cairo support]) -fi -AM_CONDITIONAL(WITH_CAIRO, test "x$with_cairo" != "xno") - -dnl with gtk+ >= 2.8 this is no longer optional -PKG_CHECK_MODULES(PANGOCAIRO,pangocairo, pangocairo_ok=yes, pangocairo_ok=no) -if test "x$pangocairo_ok" = "xyes"; then - AC_DEFINE(HAVE_PANGOCAIRO_H,1,[Defined to render text with pangocairo not cairos toy API]) -fi +PKG_CHECK_MODULES(CAIROVERSION, cairo >= 1.8.0) +AC_SUBST(CAIRO_LIBS) +AC_SUBST(CAIRO_CFLAGS) dnl XSLT @@ -600,6 +575,7 @@ else fi fi +AM_CFLAGS="$AM_CFLAGS -fdiagnostics-color=auto" AC_OUTPUT( Makefile @@ -667,7 +643,6 @@ plug-ins/drs/Makefile plug-ins/dxf/Makefile plug-ins/hpgl/Makefile plug-ins/layout/Makefile -plug-ins/libart/Makefile plug-ins/metapost/Makefile plug-ins/pixbuf/Makefile plug-ins/postscript/Makefile @@ -730,8 +705,6 @@ Configuration: can C++: ${cxx_ok} Python support: ${with_python} - Libart support (PNG export): ${have_libart} - Cairo support (PNG, PDF, print): ${with_cairo} Dia Python bindings with SWIG ${with_swig} PDF import with poppler (experimental) ${have_poppler} WMF plug-in with libEMF: ${emf_ok} diff --git a/data/Makefile.am b/data/Makefile.am index 0ca26d2af2dd1dbf7c4def13a26702fcb3cea45c..92055eaba6720a03c7fbfb2200b6c29b154c13f3 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -14,7 +14,16 @@ ui_DATA = \ sheets-edit-dialog.xml \ sheets-main-dialog.xml \ sheets-new-dialog.xml \ - sheets-remove-dialog.xml + sheets-remove-dialog.xml \ + dia-arrow-chooser-popover.ui \ + dia-sheet-chooser-popover.ui \ + dia-uml-formal-parameter-dialog.ui \ + dia-line-chooser-popover.ui \ + dia-uml-attribute-dialog.ui \ + dia-uml-operation-dialog.ui \ + dia-list-row.ui \ + dia-uml-class-editor.ui \ + dia-uml-operation-parameter-row.ui EXTRA_DIST = \ $(ui_DATA) \ diff --git a/data/dia-arrow-chooser-popover.ui b/data/dia-arrow-chooser-popover.ui new file mode 100644 index 0000000000000000000000000000000000000000..21d2cb3500464096ddc24512a5c1fcf5a83a3886 --- /dev/null +++ b/data/dia-arrow-chooser-popover.ui @@ -0,0 +1,87 @@ + + + + + + diff --git a/data/dia-line-chooser-popover.ui b/data/dia-line-chooser-popover.ui new file mode 100644 index 0000000000000000000000000000000000000000..91cff6af9da9b442b72b7bf7a48f8d530f628acf --- /dev/null +++ b/data/dia-line-chooser-popover.ui @@ -0,0 +1,98 @@ + + + + + + 10 + 0.10000000000000001 + 0.10000000000000001 + 1 + + + diff --git a/data/dia-list-row.ui b/data/dia-list-row.ui new file mode 100644 index 0000000000000000000000000000000000000000..1d73c0c91fc999aad2baecc0ab91601a970d7160 --- /dev/null +++ b/data/dia-list-row.ui @@ -0,0 +1,88 @@ + + + + + + True + False + go-up-symbolic + + + True + False + go-down-symbolic + + + diff --git a/data/dia-sheet-chooser-popover.ui b/data/dia-sheet-chooser-popover.ui new file mode 100644 index 0000000000000000000000000000000000000000..0317086b9ac45476d4419735330073da03193d42 --- /dev/null +++ b/data/dia-sheet-chooser-popover.ui @@ -0,0 +1,68 @@ + + + + + + diff --git a/data/dia-uml-attribute-dialog.ui b/data/dia-uml-attribute-dialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..89c320b5f5d7be1958695b947b988ca05a8a2e68 --- /dev/null +++ b/data/dia-uml-attribute-dialog.ui @@ -0,0 +1,246 @@ + + + + + + + diff --git a/data/dia-uml-class-editor.ui b/data/dia-uml-class-editor.ui new file mode 100644 index 0000000000000000000000000000000000000000..aa0fd41357002da7f5093772baed81b3f61d1fbd --- /dev/null +++ b/data/dia-uml-class-editor.ui @@ -0,0 +1,683 @@ + + + + + + 17 + 200 + 1 + 5 + + + 200 + 1 + 5 + + + + + + diff --git a/data/dia-uml-formal-parameter-dialog.ui b/data/dia-uml-formal-parameter-dialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..723f20f2f6bf44ea85ae62ba8b631820cc6ba638 --- /dev/null +++ b/data/dia-uml-formal-parameter-dialog.ui @@ -0,0 +1,126 @@ + + + + + + + diff --git a/data/dia-uml-operation-dialog.ui b/data/dia-uml-operation-dialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..9875896c5b61dda40b142d6572c6ea4443f9cdcf --- /dev/null +++ b/data/dia-uml-operation-dialog.ui @@ -0,0 +1,386 @@ + + + + + + + diff --git a/data/dia-uml-operation-parameter-row.ui b/data/dia-uml-operation-parameter-row.ui new file mode 100644 index 0000000000000000000000000000000000000000..a110608e4213448d0242de649580844935cf311d --- /dev/null +++ b/data/dia-uml-operation-parameter-row.ui @@ -0,0 +1,270 @@ + + + + + + + True + False + go-up-symbolic + + + True + False + go-down-symbolic + + + diff --git a/data/sheets-main-dialog.xml b/data/sheets-main-dialog.xml index 8fd7bb184b205e61b1a31209193eaaaaa4fb0f58..454edb6d421ecfc347b3c2eceb9d19a9d28ffe03 100644 --- a/data/sheets-main-dialog.xml +++ b/data/sheets-main-dialog.xml @@ -172,7 +172,7 @@ - + True True False @@ -201,7 +201,7 @@ - + True True False diff --git a/dia.doap b/dia.doap index a696963e4cc4bb1da1327a80ce9c4058e89c87c3..e6e72b52145f6d0ad882688e8d2db2d09ab3800a 100644 --- a/dia.doap +++ b/dia.doap @@ -30,9 +30,9 @@ - Hans Breuer - - hans + Zander Brown + + zbrown diff --git a/lib/.gitignore b/lib/.gitignore index 18a92c40f3decce9e76007ddfd24404b7375d721..ff539a09d348dc9ea1e95a6971b5169a28810f57 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -1,5 +1,3 @@ -diamarshal.c -diamarshal.h dia-lib-icons.h libdia.la html diff --git a/lib/Doxyfile b/lib/Doxyfile index 961b5ad1fab81fae7bf661361e66b8ac1c1e3d9e..859afa327038e70debbf822bfad110b8433e3522 100644 --- a/lib/Doxyfile +++ b/lib/Doxyfile @@ -16,8 +16,6 @@ INPUT = ../lib ../objects/standard ../objects/custom \ ../plug-ins/wpg ../plug-ins/drs #STRIP_FROM_PATH = ../ FILE_PATTERNS = *.c *.h *.dox *.py *.cpp -# define HAVE_CAIRO to get the Outline dox -PREDEFINED = HAVE_CAIRO REFERENCES_RELATION = NO VERBATIM_HEADERS = NO GENERATE_LATEX = NO diff --git a/lib/Makefile.am b/lib/Makefile.am index 48bfccc7cfa4f41685bd1459098c61915f66809a..f9421e8660843ac9e837dcc3f52d768e6ec24ac0 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -3,6 +3,9 @@ SUBDIRS=pixmaps stdprop_files = \ + list/dia-list-data.c \ + list/dia-list-store.c \ + list/dia-list-row.c \ properties.h \ properties.c \ propinternals.h \ @@ -61,9 +64,11 @@ ICON_PNGS= \ dia-lib-icons.h: $(ICON_PNGS) gdk-pixbuf-csource --build-list $(ICON_PNG_PAIRS) > dia-lib-icons.h -BUILT_SOURCES = dia-lib-icons.h diamarshal.h diamarshal.c +BUILT_SOURCES = dia-lib-icons.h libdia_la_SOURCES = \ + widgets/dialist.c \ + widgets/dialist.h \ diatypes.h \ diavar.h \ diamenu.h \ @@ -72,8 +77,6 @@ libdia_la_SOURCES = \ layer.c \ geometry.h \ geometry.c \ - color.h \ - color.c \ dia_xml.c \ dia_xml.h \ dia_xml_libxml.h \ @@ -167,10 +170,14 @@ libdia_la_SOURCES = \ diaimportrenderer.c \ diaimportrenderer.h \ diainteractiverenderer.c \ - diagdkrenderer.h \ - diagdkrenderer.c \ diapathrenderer.h \ diapathrenderer.c \ + renderer/diacairo.c \ + renderer/diacairo.h \ + renderer/diacairo-interactive.c \ + renderer/diacairo-renderer.c \ + renderer/diacairo-print.c \ + renderer/diacairo-print.h \ path-math.h \ path-math.c \ diapatternselector.h \ @@ -185,25 +192,16 @@ libdia_la_SOURCES = \ autoroute.h \ parent.c \ parent.h \ - render_pixmap.h \ - render_pixmap.c \ - diaarrowchooser.h \ - diaarrowchooser.c \ - diaarrowselector.c \ - diacolorselector.c \ - dialinestyleselector.c \ - dialinechooser.h \ - dialinechooser.c \ - diadynamicmenu.h \ - diadynamicmenu.c \ + widgets/dia-arrow-chooser.h \ + widgets/dia-arrow-chooser.c \ + widgets/dia-line-chooser-popover.c \ + widgets/dia-line-chooser.c \ diafontselector.h \ diafontselector.c \ persistence.c \ persistence.h \ diaerror.c \ diaerror.h \ - diamarshal.c \ - diamarshal.h \ debug.c \ debug.h \ prefs.c \ @@ -233,7 +231,6 @@ endif libdia_la_LIBADD = $(GTK_LIBS) AM_CPPFLAGS = \ - $(LIBART_CFLAGS) \ -DLIBDIA_COMPILATION \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(pkgdatadir)\" \ @@ -245,28 +242,13 @@ sheetdir = $(pkgdatadir)/sheets AM_CPPFLAGS += -I$(top_srcdir)/intl $(DEBUG_FLAGS) $(GDK_PIXBUF_CFLAGS) \ $(XML_CFLAGS) $(GTK_CFLAGS) \ -DDIA_SHEETDIR=\"$(sheetdir)\" \ - $(PANGOFT2_CFLAGS) $(LIBART_CFLAGS) $(UNICODE_CFLAGS) - -libdia_la_extra_sources = diamarshal.list + $(PANGOFT2_CFLAGS) $(UNICODE_CFLAGS) # # rules to generate built sources # # setup autogeneration dependancies -gen_sources = xgen-gwmh xgen-gwmc diamarshal.c diamarshal.h +gen_sources = xgen-gwmh xgen-gwmc CLEANFILES = $(gen_sources) -diamarshal.h: diamarshal.list - $(GLIB_GENMARSHAL) --prefix=dia_marshal $(srcdir)/diamarshal.list --header >> xgen-gwmh \ - && (cmp -s xgen-gwmh $(@F) || cp xgen-gwmh $(@F)) \ - && rm -f xgen-gwmh xgen-gwmh~ - -diamarshal.c: diamarshal.h - echo "#include \"diamarshal.h\"" >> xgen-gwmc \ - && $(GLIB_GENMARSHAL) --prefix=dia_marshal $(srcdir)/diamarshal.list --body >> xgen-gwmc \ - && cp xgen-gwmc $(@F) \ - && rm -f xgen-gwmc xgen-gwmc~ - - -EXTRA_DIST = libdia.def makefile.msc diamarshal.list - +EXTRA_DIST = libdia.def makefile.msc diff --git a/lib/arrows.c b/lib/arrows.c index 8df15805baaa0c93055d539c7045ff7371a6b252..e2774ba9bc39b44f69963e94161dde8637006d94 100644 --- a/lib/arrows.c +++ b/lib/arrows.c @@ -46,7 +46,7 @@ static void draw_empty_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color); + GdkRGBA *fg_color); static void calculate_double_arrow(Point *second_to, Point *second_from, const Point *to, const Point *from, real length); @@ -54,7 +54,7 @@ calculate_double_arrow(Point *second_to, Point *second_from, static void draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color); + GdkRGBA *fg_color, GdkRGBA *bg_color); static int calculate_diamond(Point *poly/*[4]*/, const Point *to, const Point *from, real length, real width); @@ -391,7 +391,7 @@ calculate_crow(Point *poly, const Point *to, const Point *from, static void draw_none_or_many(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point second_from, second_to; @@ -424,7 +424,7 @@ draw_none_or_many(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_exactly(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point vl,vt; Point bs,be; @@ -468,7 +468,7 @@ draw_one_exactly(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_or_many(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[6]; @@ -500,7 +500,7 @@ draw_one_or_many(DiaRenderer *renderer, Point *to, Point *from, static void draw_one_or_none(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point vl,vt; Point bs,be; @@ -540,7 +540,7 @@ draw_one_or_none(DiaRenderer *renderer, Point *to, Point *from, static void draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[3]; @@ -567,7 +567,7 @@ draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from, static void draw_lines(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[3]; @@ -603,7 +603,7 @@ calculate_ellipse (Point *poly, const Point *to, const Point *from, static void draw_fill_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { BezPoint bp[5]; Point vl,vt; @@ -668,7 +668,7 @@ draw_fill_ellipse(DiaRenderer *renderer, Point *to, Point *from, static void draw_empty_ellipse(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color) + GdkRGBA *fg_color) { BezPoint bp[5]; Point vl,vt; @@ -768,7 +768,7 @@ calculate_box (Point *poly, const Point *to, const Point *from, static void draw_fill_box(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color,Color *bg_color) + GdkRGBA *fg_color,GdkRGBA *bg_color) { Point poly[6]; real lw_factor,clength,cwidth; @@ -817,7 +817,7 @@ calculate_dot (Point *poly, const Point *to, const Point *from, static void draw_fill_dot(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { BezPoint bp[5]; Point vl,vt; @@ -905,7 +905,7 @@ draw_fill_dot(DiaRenderer *renderer, Point *to, Point *from, static void draw_integral(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color) + GdkRGBA *fg_color) { BezPoint bp[2]; Point vl,vt; @@ -994,7 +994,7 @@ calculate_slashed (Point *poly, const Point *to, const Point *from, static void draw_slashed(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1068,7 +1068,7 @@ calculate_halfhead(Point *poly, const Point *to, const Point *from, static void draw_halfhead(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[3]; @@ -1094,7 +1094,7 @@ draw_halfhead(DiaRenderer *renderer, Point *to, Point *from, static void draw_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *bg_color, Color *fg_color) + GdkRGBA *bg_color, GdkRGBA *fg_color) { Point poly[3]; @@ -1169,7 +1169,7 @@ calculate_diamond(Point *poly, const Point *to, const Point *from, static void draw_diamond(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { Point poly[4]; @@ -1195,7 +1195,7 @@ draw_diamond(DiaRenderer *renderer, Point *to, Point *from, static void draw_half_diamond(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[4]; @@ -1271,7 +1271,7 @@ calculate_slashed_cross(Point *poly, const Point *to, const Point *from, static void draw_slashed_cross(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1335,7 +1335,7 @@ calculate_backslash (Point *poly, const Point *to, const Point *from, static void draw_backslash(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[2]; @@ -1361,7 +1361,7 @@ draw_backslash(DiaRenderer *renderer, Point *to, Point *from, static void draw_cross(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[6]; @@ -1425,7 +1425,7 @@ calculate_double_arrow(Point *second_to, Point *second_from, static void draw_double_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *bg_color, Color *fg_color) + GdkRGBA *bg_color, GdkRGBA *fg_color) { Point second_from, second_to; @@ -1504,7 +1504,7 @@ calculate_concave(Point *poly, const Point *to, const Point *from, static void draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point poly[4]; @@ -1533,7 +1533,7 @@ draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from, static void draw_rounded(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p = *to; Point delta; @@ -1586,7 +1586,7 @@ draw_rounded(DiaRenderer *renderer, Point *to, Point *from, static void draw_open_rounded(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p = *to; Point delta; @@ -1630,7 +1630,7 @@ draw_open_rounded(DiaRenderer *renderer, Point *to, Point *from, static void draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { Point p_dot = *to, p_tri = *to, delta; real len, rayon; @@ -1680,7 +1680,7 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from, */ static void draw_three_dots(DiaRenderer *renderer, Point *to, Point *from, - real length, real width, real linewidth, Color *fg_color) + real length, real width, real linewidth, GdkRGBA *fg_color) { gdouble dot_width; @@ -1714,7 +1714,7 @@ draw_three_dots(DiaRenderer *renderer, Point *to, Point *from, static void draw_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, bg_color, fg_color); } @@ -1722,14 +1722,14 @@ draw_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, static void draw_filled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } static void draw_unfilled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_triangle(renderer, to, from, length, width, linewidth, NULL, fg_color); } @@ -1737,42 +1737,42 @@ draw_unfilled_triangle (DiaRenderer *renderer, Point *to, Point *from, static void draw_hollow_diamond (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_diamond(renderer, to, from, length, width, linewidth, bg_color, fg_color); } static void draw_filled_diamond (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_diamond(renderer, to, from, length, width, linewidth, fg_color, fg_color); } static void draw_filled_ellipse (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_ellipse(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_dot (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_dot(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_box (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_fill_box(renderer,to,from,length,width,linewidth,fg_color,fg_color); } static void draw_filled_concave (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_concave_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } @@ -1790,14 +1790,14 @@ calculate_double_triangle (Point *poly, const Point *to, const Point *from, static void draw_double_hollow_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_double_triangle(renderer, to, from, length, width, linewidth, bg_color, fg_color); } static void draw_double_filled_triangle (DiaRenderer *renderer, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { draw_double_triangle(renderer, to, from, length, width, linewidth, fg_color, fg_color); } @@ -1817,8 +1817,8 @@ struct ArrowDesc { real length, real width, real linewidth, /* the lines width also used in many arrows */ - Color *fg_color, /* the main drawin color */ - Color *bg_color); /* not always used */ + GdkRGBA *fg_color, /* the main drawin color */ + GdkRGBA *bg_color); /* not always used */ } arrow_types[] = {{NC_("Arrow", "None"),ARROW_NONE}, {NC_("Arrow", "Lines"),ARROW_LINES, calculate_arrow, draw_lines}, @@ -1906,7 +1906,7 @@ void arrow_draw(DiaRenderer *renderer, ArrowType type, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color) + GdkRGBA *fg_color, GdkRGBA *bg_color) { switch(type) { case ARROW_NONE: @@ -1957,7 +1957,7 @@ arrow_draw(DiaRenderer *renderer, ArrowType type, Arrow arrow = {type, length, width}; Rectangle bbox = {0, }; Point p1, p2; - Color col = { 1.0, 0.0, 1.0, 1.0 }; + GdkRGBA col = { 1.0, 0.0, 1.0, 1.0 }; arrow_bbox (&arrow, linewidth, to, from, &bbox); diff --git a/lib/arrows.h b/lib/arrows.h index 07ca513907e49f66b8beab143b8c243c4a6fede5..795614bbb0c98f3672d796d6eaa07ff8660f9a98 100644 --- a/lib/arrows.h +++ b/lib/arrows.h @@ -20,7 +20,6 @@ #include "diatypes.h" #include "geometry.h" -#include "color.h" #include "dia_xml.h" #include "diacontext.h" @@ -103,7 +102,7 @@ struct _Arrow { void arrow_draw(DiaRenderer *renderer, ArrowType type, Point *to, Point *from, real length, real width, real linewidth, - Color *fg_color, Color *bg_color); + GdkRGBA *fg_color, GdkRGBA *bg_color); /** following the signature pattern of lib/boundingbox.h * the arrow bounding box is returned in rect diff --git a/lib/attributes.c b/lib/attributes.c index 7a44ae3233cce2925f79ab9e7918b07479bff28e..cf4015dc97ee35aee23a0695f338e220d9defea6 100644 --- a/lib/attributes.c +++ b/lib/attributes.c @@ -21,8 +21,11 @@ #include "intl.h" #include "persistence.h" -static Color attributes_foreground = { 0.0f, 0.0f, 0.0f, 1.0f }; -static Color attributes_background = { 1.0f, 1.0f, 1.0f, 1.0f }; +GdkRGBA color_black = { 0, 0, 0, 1 }; +GdkRGBA color_white = { 1, 1, 1, 1 }; + +static GdkRGBA attributes_foreground = { 0.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA attributes_background = { 1.0f, 1.0f, 1.0f, 1.0f }; static real attributes_default_linewidth = 0.1; @@ -42,7 +45,7 @@ static real attributes_font_height = 0.8; /** Get the foreground color attribute (lines and text) * @returns The current foreground color as set in the toolbox. */ -Color +GdkRGBA attributes_get_foreground(void) { return attributes_foreground; @@ -51,7 +54,7 @@ attributes_get_foreground(void) /** Get the background color attribute (for box background and such) * @returns The current background color as set in the toolbox. */ -Color +GdkRGBA attributes_get_background(void) { return attributes_background; @@ -62,7 +65,7 @@ attributes_get_background(void) * not stored by ths function and can be freed afterwards. */ void -attributes_set_foreground(Color *color) +attributes_set_foreground(GdkRGBA *color) { attributes_foreground = *color; persistence_set_color("fg_color", color); @@ -73,7 +76,7 @@ attributes_set_foreground(Color *color) * not stored by ths function and can be freed afterwards. */ void -attributes_set_background(Color *color) +attributes_set_background(GdkRGBA *color) { attributes_background = *color; persistence_set_color("bg_color", color); @@ -84,7 +87,7 @@ attributes_set_background(Color *color) void attributes_swap_fgbg(void) { - Color temp; + GdkRGBA temp; temp = attributes_foreground; attributes_set_foreground(&attributes_background); attributes_set_background(&temp); diff --git a/lib/attributes.h b/lib/attributes.h index 490b06d9b3b9653303661d8f8dcc03bae63a3113..18c74c7086fc5d55e127f4c6db7a75da686d65dd 100644 --- a/lib/attributes.h +++ b/lib/attributes.h @@ -20,16 +20,18 @@ #include "dia-enums.h" #include "geometry.h" -#include "color.h" #include "arrows.h" #include "font.h" G_BEGIN_DECLS -Color attributes_get_foreground(void); -Color attributes_get_background(void); -void attributes_set_foreground(Color *color); -void attributes_set_background(Color *color); +extern GdkRGBA color_black; +extern GdkRGBA color_white; + +GdkRGBA attributes_get_foreground(void); +GdkRGBA attributes_get_background(void); +void attributes_set_foreground(GdkRGBA *color); +void attributes_set_background(GdkRGBA *color); void attributes_swap_fgbg(void); void attributes_default_fgbg(void); diff --git a/lib/bezier-common.c b/lib/bezier-common.c index fef28adc99bcdf517fc070ce1ff107b5b0a4ccc3..24eddeac35d193e051abcd2a70172d4f9460d672 100644 --- a/lib/bezier-common.c +++ b/lib/bezier-common.c @@ -163,7 +163,7 @@ bezier_draw_control_lines (int num_points, BezPoint *points, DiaRenderer *renderer) { - Color line_colour = { 0.0, 0.0, 0.6, 1.0 }; + GdkRGBA line_colour = { 0.0, 0.0, 0.6, 1.0 }; Point startpoint; int i; diff --git a/lib/color.c b/lib/color.c deleted file mode 100644 index 72231d6b702f5a9c9c08e2977b924318cf4178cd..0000000000000000000000000000000000000000 --- a/lib/color.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#include -#include - -#include "color.h" - -static GdkColormap *colormap = NULL; - -#ifndef G_OS_WIN32 -Color color_black = { 0.0f, 0.0f, 0.0f, 1.0f }; -Color color_white = { 1.0f, 1.0f, 1.0f, 1.0f }; -#endif - -gboolean _color_initialized = FALSE; - -/** Initialize color access (gdk) and set up default colors. - */ -void -color_init(void) -{ - if (!_color_initialized) { -#if !defined(GDK_WINDOWING_QUARTZ) - GdkVisual *visual = gtk_widget_get_default_visual(); - colormap = gdk_colormap_new (visual, FALSE); -#else - /* gdk/quartz does not implement gdk_colormap_new () */ - colormap = gdk_screen_get_system_colormap (gdk_screen_get_default ()); -#endif - - _color_initialized = TRUE; - } -} - -/** Allocate a new color object wtih the given values. - * Initializes alpha component to 1.0 - * @param r Red component (0 <= r <= 1) - * @param g Green component (0 <= g <= 1) - * @param b Blue component (0 <= b <= 1) - * @returns A newly allocated color object. This should be freed after use. - */ -Color * -color_new_rgb(float r, float g, float b) -{ - Color *col = g_new(Color, 1); - col->red = r; - col->green = g; - col->blue = b; - col->alpha = 1.0; - return col; -} - -/** Allocate a new color object wtih the given values. - * @param r Red component (0 <= r <= 1) - * @param g Green component (0 <= g <= 1) - * @param b Blue component (0 <= b <= 1) - * @param alpha Alpha component (0 <= alpha <= 1) - * @returns A newly allocated color object. This should be freed after use. - */ -Color * -color_new_rgba(float r, float g, float b, float alpha) -{ - Color *col = g_new(Color, 1); - col->red = r; - col->green = g; - col->blue = b; - col->alpha = alpha; - return col; -} - -/** Convert a Dia color object to GDK style, including handling allocation. - * @param color A color object. This will not be kept by this function. - * @param gdkcolor Return value: GDK color object to fill in. - */ -void -color_convert(const Color *color, GdkColor *gdkcolor) -{ - gdkcolor->red = (guint16)(color->red*65535); - gdkcolor->green = (guint16)(color->green*65535); - gdkcolor->blue = (guint16)(color->blue*65535); - - if (_color_initialized) { - if (!gdk_colormap_alloc_color (colormap, gdkcolor, TRUE, TRUE)) - g_warning ("color_convert failed."); - } else { - g_warning("Can't color_convert in non-interactive app (w/o color_init())"); - } -} - -/** Compare two color objects. - * @param color1 One color object - * @param color2 Another color object. - * @returns TRUE if the color objects are the same color. - */ -gboolean -color_equals(const Color *color1, const Color *color2) -{ - return (color1->red == color2->red) && - (color1->green == color2->green) && - (color1->blue == color2->blue) && - (color1->alpha == color2->alpha); -} diff --git a/lib/color.h b/lib/color.h deleted file mode 100644 index daf36c43b59ff4a7ed6210be9568322e4ecaa83b..0000000000000000000000000000000000000000 --- a/lib/color.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 COLOR_H -#define COLOR_H - -#include "diatypes.h" -#include -#include "diavar.h" - -/*! - * \brief Dia's internal color representation - * \ingroup ObjectParts - */ -struct _Color { - float red; /*!< 0..1 */ - float green; /*!< 0..1 */ - float blue; /*!< 0..1 */ - float alpha; /*!< 0..1 */ -}; - -void color_init(void); -Color *color_new_rgb(float r, float g, float b); -Color *color_new_rgba(float r, float g, float b, float alpha); -void color_convert(const Color *color, GdkColor *gdkcolor); -gboolean color_equals(const Color *color1, const Color *color2); - -#ifdef G_OS_WIN32 -static Color color_black = { 0.0f, 0.0f, 0.0f, 1.0f }; -static Color color_white = { 1.0f, 1.0f, 1.0f, 1.0f }; -#else -extern DIAVAR Color color_black; -extern DIAVAR Color color_white; -#endif - -#define DIA_COLOR_TO_GDK(from, to) \ -(to).pixel = 0; \ -(to).red = (from).red*65535; \ -(to).green = (from).green*65535; \ -(to).blue = (from).blue*65535; -#define GDK_COLOR_TO_DIA(from, to) \ -(to).red = (from).red/65535.0; \ -(to).green = (from).green/65535.0; \ -(to).blue = (from).blue/65535.0; \ -(to).alpha = 1.0; - -#endif /* COLOR_H */ diff --git a/lib/dia_dirs.c b/lib/dia_dirs.c index 99e8590c27bf637405d1802bf42e05d082ad5eea..65abe8efd3983c732a701a301b67183f68320628 100644 --- a/lib/dia_dirs.c +++ b/lib/dia_dirs.c @@ -367,3 +367,20 @@ dia_absolutize_filename (const gchar *master, const gchar *slave) g_free (path); return result; } + +gchar* +build_ui_filename (const gchar* name) +{ + gchar* uifile; + + if (g_getenv ("DIA_BASE_PATH") != NULL) { + /* a small hack cause the final destination and the local path differ */ + const gchar* p = strrchr (name, '/'); + if (p != NULL) + name = p+1; + uifile = g_build_filename (g_getenv ("DIA_BASE_PATH"), "data", name, NULL); + } else + uifile = dia_get_data_directory (name); + + return uifile; +} diff --git a/lib/dia_dirs.h b/lib/dia_dirs.h index c0cbff0564e61f8c46585a8993ea84a4c6d5c454..52c01bd4d37c03275724cc652d174a8227ad12c0 100644 --- a/lib/dia_dirs.h +++ b/lib/dia_dirs.h @@ -38,4 +38,6 @@ gchar *dia_absolutize_filename (const gchar *master, const gchar *slave); gchar *dia_get_canonical_path (const gchar *path); const gchar *dia_message_filename (const gchar *filename); +gchar *build_ui_filename (const gchar* name); + #endif /* DIA_DIRS_H */ diff --git a/lib/dia_image.c b/lib/dia_image.c index c733e697d593ff833198d0a36b52ee4f6841c2ea..7d1699e784f50e106f4c89e9e2c9a7c383590362 100644 --- a/lib/dia_image.c +++ b/lib/dia_image.c @@ -469,7 +469,7 @@ dia_image_rgb_data(const DiaImage *image) } else { guint8 *pixels = gdk_pixbuf_get_pixels(image->image); - g_memmove(rgb_pixels, pixels, height*rowstride); + memmove(rgb_pixels, pixels, height*rowstride); return rgb_pixels; } } diff --git a/lib/dia_svg.c b/lib/dia_svg.c index 44ca103ed287375238cb27fb582ed23336869e58..1e6a070779e1621df90572faa76c933b206f2697 100644 --- a/lib/dia_svg.c +++ b/lib/dia_svg.c @@ -393,7 +393,7 @@ _parse_color(gint32 *color, const char *str) * \ingroup DiaSvg */ gboolean -dia_svg_parse_color (const gchar *str, Color *color) +dia_svg_parse_color (const gchar *str, GdkRGBA *color) { gint32 c; gboolean ret = _parse_color (&c, str); diff --git a/lib/dia_svg.h b/lib/dia_svg.h index 08beca3e8baafe527e7f38f8301f1a3859b453ac..8313b66f255ac2ee7db11362226f4e36857e2f5f 100644 --- a/lib/dia_svg.h +++ b/lib/dia_svg.h @@ -56,7 +56,7 @@ struct _DiaSvgStyle { void dia_svg_style_init (DiaSvgStyle *gs, DiaSvgStyle *parent_style); void dia_svg_style_copy (DiaSvgStyle *dest, DiaSvgStyle *src); -gboolean dia_svg_parse_color(const gchar *str, Color *color); +gboolean dia_svg_parse_color(const gchar *str, GdkRGBA *color); void dia_svg_parse_style(xmlNodePtr node, DiaSvgStyle *s, real user_scale); void dia_svg_parse_style_string (DiaSvgStyle *s, real user_scale, const gchar *str); /* parse the svg sub format for pathes int an array of BezPoint */ diff --git a/lib/dia_xml.c b/lib/dia_xml.c index 2425cb9cc64f58af72b65236c0e3939876f27788..7dd040b403acf645c8c699e408595deb2c845a0a 100644 --- a/lib/dia_xml.c +++ b/lib/dia_xml.c @@ -653,7 +653,7 @@ hex_digit(char c, DiaContext *ctx) * \ingroup DiagramXmlIn */ void -data_color(DataNode data, Color *col, DiaContext *ctx) +data_color(DataNode data, GdkRGBA *col, DiaContext *ctx) { xmlChar *val; int r=0, g=0, b=0, a=0; @@ -1162,7 +1162,7 @@ convert_to_hex(float x, char *str) * \ingroup DiagramXmlOut */ void -data_add_color(AttributeNode attr, const Color *col, DiaContext *ctx) +data_add_color(AttributeNode attr, const GdkRGBA *col, DiaContext *ctx) { char buffer[1+8+1]; DataNode data_node; diff --git a/lib/dia_xml.h b/lib/dia_xml.h index 0205336aa694e977f4f940886c61b64efd9d37ac..8f9809af4923f1914d4f16d9f5ae88820150d6b9 100644 --- a/lib/dia_xml.h +++ b/lib/dia_xml.h @@ -19,8 +19,8 @@ #define DIA_XML_H #include +#include #include "geometry.h" -#include "color.h" #include "font.h" #include "diacontext.h" #include @@ -75,7 +75,7 @@ int data_int(DataNode data, DiaContext *ctx); int data_enum(DataNode data, DiaContext *ctx); real data_real(DataNode data, DiaContext *ctx); int data_boolean(DataNode data, DiaContext *ctx); -void data_color(DataNode data, Color *col, DiaContext *ctx); +void data_color(DataNode data, GdkRGBA *col, DiaContext *ctx); void data_point(DataNode data, Point *point, DiaContext *ctx); void data_bezpoint(DataNode data, BezPoint *point, DiaContext *ctx); void data_rectangle(DataNode data, Rectangle *rect, DiaContext *ctx); @@ -90,7 +90,7 @@ void data_add_int(AttributeNode attr, int data, DiaContext *ctx); void data_add_enum(AttributeNode attr, int data, DiaContext *ctx); void data_add_real(AttributeNode attr, real data, DiaContext *ctx); void data_add_boolean(AttributeNode attr, int data, DiaContext *ctx); -void data_add_color(AttributeNode attr, const Color *col, DiaContext *ctx); +void data_add_color(AttributeNode attr, const GdkRGBA *col, DiaContext *ctx); void data_add_point(AttributeNode attr, const Point *point, DiaContext *ctx); void data_add_bezpoint(AttributeNode attr, const BezPoint *point, DiaContext *ctx); void data_add_rectangle(AttributeNode attr, const Rectangle *rect, DiaContext *ctx); diff --git a/lib/diaarrowchooser.c b/lib/diaarrowchooser.c deleted file mode 100644 index 5185a942b034e70a7cc8124ae243bb2b0d17b743..0000000000000000000000000000000000000000 --- a/lib/diaarrowchooser.c +++ /dev/null @@ -1,503 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diarrowchooser.c -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/** \file diaarrowchooser.c A widget to choose arrowhead. This only select arrowhead, not width and height. - * \ingroup diawidgets - */ -#include - -#include -#include "intl.h" -#include "widgets.h" -#include "diaarrowchooser.h" -#include "render_pixmap.h" - -static const char *button_menu_key = "dia-button-menu"; -static const char *menuitem_enum_key = "dia-menuitem-value"; - -static const gchar* -_dia_translate (const gchar* term, gpointer data) -{ - const gchar* trans = term; - - if (term && *term) { - /* first try our own ... */ - trans = dgettext (GETTEXT_PACKAGE, term); - /* ... than gtk */ - if (term == trans) - trans = dgettext ("gtk20", term); - } - return trans; -} - -/* --------------- DiaArrowPreview -------------------------------- */ -static void dia_arrow_preview_set(DiaArrowPreview *arrow, - ArrowType atype, gboolean left); - -static void dia_arrow_preview_class_init (DiaArrowPreviewClass *klass); -static void dia_arrow_preview_init (DiaArrowPreview *arrow); -static gint dia_arrow_preview_expose (GtkWidget *widget, - GdkEventExpose *event); - -/** Get the class information for the arrow preview widget. - * @return A type object (statically allocated) for the arrow preview object. - */ -GType -dia_arrow_preview_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaArrowPreviewClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_preview_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaArrowPreview), - 0, - (GInstanceInitFunc) dia_arrow_preview_init - }; - - type = g_type_register_static(GTK_TYPE_MISC, "DiaArrowPreview", &info, 0); - } - - return type; -} - -/** Initialize class information for the arrow preview class. - * @param class The class object to initialize/ - */ -static void -dia_arrow_preview_class_init(DiaArrowPreviewClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS (class); - widget_class->expose_event = dia_arrow_preview_expose; -} - -/** Initialize an arrow preview widget. - * @param arrow The widget to initialize. - */ -static void -dia_arrow_preview_init(DiaArrowPreview *arrow) -{ -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_has_window (GTK_WIDGET (arrow), FALSE); -#else - GTK_WIDGET_SET_FLAGS (arrow, GTK_NO_WINDOW); -#endif - - GTK_WIDGET (arrow)->requisition.width = 40 + GTK_MISC (arrow)->xpad * 2; - GTK_WIDGET (arrow)->requisition.height = 20 + GTK_MISC (arrow)->ypad * 2; - - arrow->atype = ARROW_NONE; - arrow->left = TRUE; -} - -/** Create a new arrow preview widget. - * @param atype The type of arrow to start out selected with. - * @param left If TRUE, this preview will point to the left. - * @return A new widget. - */ -GtkWidget * -dia_arrow_preview_new(ArrowType atype, gboolean left) -{ - DiaArrowPreview *arrow = g_object_new(DIA_TYPE_ARROW_PREVIEW, NULL); - - arrow->atype = atype; - arrow->left = left; - return GTK_WIDGET(arrow); -} - -/** Set the values shown by an arrow preview widget. - * @param arrow Preview widget to change. - * @param atype New arrow type to use. - * @param left If TRUE, the preview should point to the left. - */ -static void -dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) -{ - if (arrow->atype != atype || arrow->left != left) { - arrow->atype = atype; - arrow->left = left; -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(GTK_WIDGET(arrow))) -#else - if (GTK_WIDGET_DRAWABLE(arrow)) -#endif - gtk_widget_queue_draw(GTK_WIDGET(arrow)); - } -} - -/** Expose handle for the arrow preview widget. - * @param widget The widget to display. - * @param event The event that caused the call. - * @return TRUE always. - * The expose handler gets called when the Arrow needs to be drawn. - */ -static gint -dia_arrow_preview_expose(GtkWidget *widget, GdkEventExpose *event) -{ -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(widget)) { -#else - if (GTK_WIDGET_DRAWABLE(widget)) { -#endif - Point from, to; - Point move_arrow, move_line, arrow_head; - DiaRenderer *renderer; - DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); - Arrow arrow_type; - GtkMisc *misc = GTK_MISC(widget); - gint width, height; - gint x, y; - GdkWindow *win; - int linewidth = 2; - DiaRendererClass *renderer_ops; - - width = widget->allocation.width - misc->xpad * 2; - height = widget->allocation.height - misc->ypad * 2; - x = (widget->allocation.x + misc->xpad); - y = (widget->allocation.y + misc->ypad); - - win = gtk_widget_get_window (widget); - - to.y = from.y = height/2; - if (arrow->left) { - from.x = width-linewidth; - to.x = 0; - } else { - from.x = 0; - to.x = width-linewidth; - } - - /* here we must do some acrobaticts and construct Arrow type - * variable - */ - arrow_type.type = arrow->atype; - arrow_type.length = .75*((real)height-linewidth); - arrow_type.width = .75*((real)height-linewidth); - - /* and here we calculate new arrow start and end of line points */ - calculate_arrow_point(&arrow_type, &from, &to, - &move_arrow, &move_line, - linewidth); - arrow_head = to; - point_add(&arrow_head, &move_arrow); - point_add(&to, &move_line); - - renderer = new_pixmap_renderer(win, width, height); - renderer_ops = DIA_RENDERER_GET_CLASS (renderer); - renderer_pixmap_set_pixmap(renderer, win, x, y, width, height); - renderer_ops->begin_render(renderer, NULL); - renderer_ops->set_linewidth(renderer, linewidth); - { - Color color_bg, color_fg; - GtkStyle *style = gtk_widget_get_style (widget); - /* the text colors are the best approximation to what we had */ -#if GTK_CHECK_VERSION(2,18,0) - GdkColor bg = style->base[gtk_widget_get_state(widget)]; -#else - GdkColor bg = style->base[GTK_WIDGET_STATE(widget)]; -#endif -#if GTK_CHECK_VERSION(2,18,0) - GdkColor fg = style->text[gtk_widget_get_state(widget)]; -#else - GdkColor fg = style->text[GTK_WIDGET_STATE(widget)]; -#endif - - GDK_COLOR_TO_DIA(bg, color_bg); - GDK_COLOR_TO_DIA(fg, color_fg); - renderer_ops->draw_line(renderer, &from, &to, &color_fg); - arrow_draw (renderer, arrow_type.type, - &arrow_head, &from, - arrow_type.length, - arrow_type.width, - linewidth, &color_fg, &color_bg); - } - renderer_ops->end_render(renderer); - g_object_unref(renderer); - } - - return TRUE; -} - - -/* ------- Code for DiaArrowChooser ----------------------- */ - -static void dia_arrow_chooser_class_init (DiaArrowChooserClass *klass); -static void dia_arrow_chooser_init (DiaArrowChooser *arrow); - -/** Get the class info for the arrow chooser. - * @return GType structure filled in for arrow chooser (statically allocated). - */ -GType -dia_arrow_chooser_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaArrowChooserClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_chooser_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaArrowChooser), - 0, - (GInstanceInitFunc) dia_arrow_chooser_init - }; - - type = g_type_register_static(GTK_TYPE_BUTTON, "DiaArrowChooser", &info, 0); - } - - return type; -} - -/** Generic event handle for the arrow choose. - * This just handles popping up the arrowhead menu when the button is clicked. - * @param widget The arrow chooser widget. - * @param event An event affecting the arrow chooser. - * @return TRUE if we handled the event, FALSE otherwise. - */ -static gint -dia_arrow_chooser_event(GtkWidget *widget, GdkEvent *event) -{ - if (event->type == GDK_BUTTON_PRESS && event->button.button == 1) { - GtkMenu *menu = g_object_get_data(G_OBJECT(widget), button_menu_key); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - event->button.button, event->button.time); - return TRUE; - } - - return FALSE; -} - -/** Initialize class information for the arrow choose. - * @param class Class structure to initialize private fields of. - */ -static void -dia_arrow_chooser_class_init(DiaArrowChooserClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->event = dia_arrow_chooser_event; -} - -/** Initialize an arrow choose object. - * @param arrow Newly allocated arrow choose object. - */ -static void -dia_arrow_chooser_init(DiaArrowChooser *arrow) -{ - GtkWidget *wid; - - arrow->left = FALSE; - arrow->arrow.type = ARROW_NONE; - arrow->arrow.length = DEFAULT_ARROW_LENGTH; - arrow->arrow.width = DEFAULT_ARROW_WIDTH; - - wid = dia_arrow_preview_new(ARROW_NONE, arrow->left); - gtk_container_add(GTK_CONTAINER(arrow), wid); - gtk_widget_show(wid); - arrow->preview = DIA_ARROW_PREVIEW(wid); - - arrow->dialog = NULL; -} - -/** Handle the "ressponse" event for the arrow chooser dialog. - * @param dialog The dialog that got a response. - * @param response_id The ID of the response (e.g. GTK_RESPONSE_OK) - * @param chooser The arrowchooser widget (userdata) - */ -static void -dia_arrow_chooser_dialog_response(GtkWidget *dialog, - gint response_id, - DiaArrowChooser *chooser) -{ - if (response_id == GTK_RESPONSE_OK) { - Arrow new_arrow = dia_arrow_selector_get_arrow(chooser->selector); - - if (new_arrow.type != chooser->arrow.type || - new_arrow.length != chooser->arrow.length || - new_arrow.width != chooser->arrow.width) { - chooser->arrow = new_arrow; - dia_arrow_preview_set(chooser->preview, new_arrow.type, chooser->left); - if (chooser->callback) - (* chooser->callback)(chooser->arrow, chooser->user_data); - } - } else { - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - } - gtk_widget_hide(chooser->dialog); -} - -/** Create a new arrow chooser dialog. - * @param chooser The widget to attach a dialog to. The dialog will be placed - * in chooser->dialog. - */ -static void -dia_arrow_chooser_dialog_new(DiaArrowChooser *chooser) -{ - GtkWidget *wid; - - chooser->dialog = gtk_dialog_new_with_buttons(_("Arrow Properties"), - NULL, - GTK_DIALOG_NO_SEPARATOR, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(chooser->dialog), - GTK_RESPONSE_OK); - g_signal_connect(G_OBJECT(chooser->dialog), "response", - G_CALLBACK(dia_arrow_chooser_dialog_response), chooser); - g_signal_connect(G_OBJECT(chooser->dialog), "destroy", - G_CALLBACK(gtk_widget_destroyed), &chooser->dialog); - - wid = dia_arrow_selector_new(); - gtk_container_set_border_width(GTK_CONTAINER(wid), 5); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(chooser->dialog))), wid, - TRUE, TRUE, 0); - gtk_widget_show(wid); - chooser->selector = DIA_ARROW_SELECTOR(wid); -} - -/** Display an arrow chooser dialog, creating one if necessary. - * @param widget Ignored - * @param chooser An arrowchooser widget to display in a dialog. This may - * get the dialog field set as a sideeffect. - */ -static void -dia_arrow_chooser_dialog_show(GtkWidget *widget, DiaArrowChooser *chooser) -{ - if (chooser->dialog) { - gtk_window_present(GTK_WINDOW(chooser->dialog)); - return; - } - - dia_arrow_chooser_dialog_new(chooser); - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - gtk_widget_show(chooser->dialog); -} - -/** Set a new arrow type for an arrow chooser, as selected from a menu. - * @param mi The menu item currently selected in the arrow chooser menu. - * @param chooser The arrow chooser to update. - */ -static void -dia_arrow_chooser_change_arrow_type(GtkMenuItem *mi, DiaArrowChooser *chooser) -{ - ArrowType atype = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mi), - menuitem_enum_key)); - Arrow arrow; - arrow.width = chooser->arrow.width; - arrow.length = chooser->arrow.length; - arrow.type = atype; - dia_arrow_chooser_set_arrow(chooser, &arrow); -} - -/** Create a new arrow chooser object. - * @param left If TRUE, this chooser will point its arrowheads to the left. - * @param callback void (*callback)(Arrow *arrow, gpointer user_data) which - * will be called when the arrow type or dimensions change. - * @param user_data Any user data. This will be stored in chooser->user_data. - * @return A new DiaArrowChooser widget. - */ -GtkWidget * -dia_arrow_chooser_new(gboolean left, DiaChangeArrowCallback callback, - gpointer user_data) -{ - DiaArrowChooser *chooser = g_object_new(DIA_TYPE_ARROW_CHOOSER, NULL); - GtkWidget *menu, *mi, *ar; - gint i; - - chooser->left = left; - dia_arrow_preview_set(chooser->preview, chooser->preview->atype, left); - chooser->callback = callback; - chooser->user_data = user_data; - - menu = gtk_menu_new(); - g_object_ref_sink(menu); - g_object_set_data_full(G_OBJECT(chooser), button_menu_key, menu, - (GDestroyNotify)g_object_unref); - /* although from ARROW_NONE to MAX_ARROW_TYPE-1 this is sorted by *index* to keep the order consistent with earlier releases */ - for (i = ARROW_NONE; i < MAX_ARROW_TYPE; ++i) { - ArrowType arrow_type = arrow_type_from_index(i); - mi = gtk_menu_item_new(); - g_object_set_data(G_OBJECT(mi), menuitem_enum_key, - GINT_TO_POINTER(arrow_type)); - gtk_widget_set_tooltip_text(mi, _dia_translate(arrow_get_name_from_type(arrow_type), NULL)); - ar = dia_arrow_preview_new(arrow_type, left); - - gtk_container_add(GTK_CONTAINER(mi), ar); - gtk_widget_show(ar); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_arrow_chooser_change_arrow_type), chooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show(mi); - } - mi = gtk_menu_item_new_with_label(_dia_translate("Details\342\200\246", NULL)); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_arrow_chooser_dialog_show), chooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show(mi); - - return GTK_WIDGET(chooser); -} - -/** Set the type of arrow shown by the arrow chooser. If the arrow type - * changes, the callback function will be called. - * @param chooser The chooser to update. - * @param arrow The arrow type and dimensions the chooser will dispaly. - * Should it be called as well when the dimensions change? - */ -void -dia_arrow_chooser_set_arrow(DiaArrowChooser *chooser, Arrow *arrow) -{ - if (chooser->arrow.type != arrow->type) { - dia_arrow_preview_set(chooser->preview, arrow->type, chooser->left); - chooser->arrow.type = arrow->type; - if (chooser->dialog != NULL) - dia_arrow_selector_set_arrow(chooser->selector, chooser->arrow); - if (chooser->callback) - (* chooser->callback)(chooser->arrow, chooser->user_data); - } - chooser->arrow.width = arrow->width; - chooser->arrow.length = arrow->length; -} - -/** Get the currently selected arrow type from an arrow chooser. - * @param arrow An arrow chooser to query. - * @return The arrow type that is currently selected in the chooser. - */ -ArrowType -dia_arrow_chooser_get_arrow_type(DiaArrowChooser *arrow) -{ - return arrow->arrow.type; -} - diff --git a/lib/diaarrowchooser.h b/lib/diaarrowchooser.h deleted file mode 100644 index f8d7766ef7fc248d4aa2d6c8cc7c5cc8576b361b..0000000000000000000000000000000000000000 --- a/lib/diaarrowchooser.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diarrowchooser.h -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 _DIAARROWCHOOSER_H_ -#define _DIAARROWCHOOSER_H_ - -#include - -#include "arrows.h" -#include "diatypes.h" - - -/* --------------- DiaArrowPreview -------------------------------- */ -GType dia_arrow_preview_get_type (void); - -#define DIA_TYPE_ARROW_PREVIEW (dia_arrow_preview_get_type ()) -#define DIA_ARROW_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreview)) -#define DIA_ARROW_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreviewClass)) -#define DIA_IS_ARROW_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_ARROW_PREVIEW)) -#define DIA_IS_ARROW_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_ARROW_PREVIEW)) -#define DIA_ARROW_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_PREVIEW, DiaArrowPreviewClass)) - -typedef struct _DiaArrowPreview DiaArrowPreview; -typedef struct _DiaArrowPreviewClass DiaArrowPreviewClass; - -struct _DiaArrowPreview -{ - GtkMisc misc; - ArrowType atype; - gboolean left; -}; - -struct _DiaArrowPreviewClass -{ - GtkMiscClass parent_class; -}; - -GtkWidget *dia_arrow_preview_new (ArrowType atype, gboolean left); - - -/* ------- Code for DiaArrowChooser ----------------------- */ -GType dia_arrow_chooser_get_type (void); - -#define DIA_TYPE_ARROW_CHOOSER (dia_arrow_chooser_get_type ()) -#define DIA_ARROW_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooser)) -#define DIA_ARROW_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooserClass)) -#define DIA_IS_ARROW_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_ARROW_CHOOSER)) -#define DIA_IS_ARROW_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_ARROW_CHOOSER)) -#define DIA_ARROW_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_CHOOSER, DiaArrowChooserClass)) - -typedef struct _DiaArrowChooser DiaArrowChooser; -typedef struct _DiaArrowChooserClass DiaArrowChooserClass; - -typedef void (*DiaChangeArrowCallback) (Arrow atype, gpointer user_data); - -struct _DiaArrowChooser -{ - GtkButton button; - DiaArrowPreview *preview; - Arrow arrow; - gboolean left; - - DiaChangeArrowCallback callback; - gpointer user_data; - - GtkWidget *dialog; - DiaArrowSelector *selector; -}; - -struct _DiaArrowChooserClass -{ - GtkButtonClass parent_class; -}; - -GtkWidget *dia_arrow_chooser_new (gboolean left, - DiaChangeArrowCallback callback, - gpointer user_data); -void dia_arrow_chooser_set_arrow(DiaArrowChooser *chooser, Arrow *arrow); -ArrowType dia_arrow_chooser_get_arrow_type(DiaArrowChooser *chooser); - -#endif /* _DIAARROWCHOOSER_H_ */ diff --git a/lib/diaarrowselector.c b/lib/diaarrowselector.c deleted file mode 100644 index 9812f09fcaddd0a2f42c2610b11fd80a56eedbdf..0000000000000000000000000000000000000000 --- a/lib/diaarrowselector.c +++ /dev/null @@ -1,211 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - -#include "intl.h" -#include "widgets.h" -#include "arrows.h" -#include "diaarrowchooser.h" -#include "diadynamicmenu.h" - -/************* DiaArrowSelector: ***************/ - -/* FIXME: Should these structs be in widgets.h instead? */ -struct _DiaArrowSelector -{ - GtkVBox vbox; - - GtkHBox *sizebox; - GtkLabel *sizelabel; - DiaSizeSelector *size; - - GtkWidget *omenu; -}; - -struct _DiaArrowSelectorClass -{ - GtkVBoxClass parent_class; -}; - -enum { - DAS_VALUE_CHANGED, - DAS_LAST_SIGNAL -}; - -static guint das_signals[DAS_LAST_SIGNAL] = {0}; - -static void -dia_arrow_selector_class_init (DiaArrowSelectorClass *class) -{ - das_signals[DAS_VALUE_CHANGED] - = g_signal_new("value_changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -set_size_sensitivity(DiaArrowSelector *as) -{ - int state; - gchar *entryname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(as->omenu)); - - state = (entryname != NULL) && (0 != g_ascii_strcasecmp(entryname, "None")); - g_free(entryname); - - gtk_widget_set_sensitive(GTK_WIDGET(as->sizelabel), state); - gtk_widget_set_sensitive(GTK_WIDGET(as->size), state); -} - -static void -arrow_type_change_callback(DiaDynamicMenu *ddm, gpointer userdata) -{ - set_size_sensitivity(DIA_ARROW_SELECTOR(userdata)); - g_signal_emit(DIA_ARROW_SELECTOR(userdata), - das_signals[DAS_VALUE_CHANGED], 0); -} - -static void -arrow_size_change_callback(DiaSizeSelector *size, gpointer userdata) -{ - g_signal_emit(DIA_ARROW_SELECTOR(userdata), - das_signals[DAS_VALUE_CHANGED], 0); -} - -static GtkWidget * -create_arrow_menu_item(DiaDynamicMenu *ddm, gchar *name) -{ - ArrowType atype = arrow_type_from_name(name); - GtkWidget *item = gtk_menu_item_new(); - GtkWidget *preview; - - preview = dia_arrow_preview_new(atype, FALSE); - - gtk_widget_show(preview); - gtk_container_add(GTK_CONTAINER(item), preview); - gtk_widget_show(item); - return item; -} - -static void -dia_arrow_selector_init (DiaArrowSelector *as, - gpointer g_class) -{ - GtkWidget *omenu; - GtkWidget *box; - GtkWidget *label; - GtkWidget *size; - - GList *arrow_names = get_arrow_names(); - as->omenu = - omenu = dia_dynamic_menu_new_listbased(create_arrow_menu_item, - as, - _("More arrows"), - arrow_names, - "arrow-menu"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "None"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "Lines"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(omenu), "Filled Concave"); - - gtk_box_pack_start(GTK_BOX(as), omenu, FALSE, TRUE, 0); - gtk_widget_show(omenu); - - g_signal_connect(DIA_DYNAMIC_MENU(omenu), - "value-changed", G_CALLBACK(arrow_type_change_callback), - as); - - box = gtk_hbox_new(FALSE,0); - as->sizebox = GTK_HBOX(box); - - label = gtk_label_new(_("Size: ")); - as->sizelabel = GTK_LABEL(label); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - gtk_widget_show(label); - - size = dia_size_selector_new(0.0, 0.0); - as->size = DIA_SIZE_SELECTOR(size); - gtk_box_pack_start(GTK_BOX(box), size, TRUE, TRUE, 0); - gtk_widget_show(size); - g_signal_connect(size, "value-changed", - G_CALLBACK(arrow_size_change_callback), as); - - set_size_sensitivity(as); - gtk_box_pack_start(GTK_BOX(as), box, TRUE, TRUE, 0); - - gtk_widget_show(box); -} - -GType -dia_arrow_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaArrowSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_arrow_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaArrowSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc)dia_arrow_selector_init, /* init */ - }; - - dfs_type = g_type_register_static (GTK_TYPE_VBOX, - "DiaArrowSelector", - &dfs_info, 0); - } - - return dfs_type; -} - -GtkWidget * -dia_arrow_selector_new () -{ - return GTK_WIDGET ( g_object_new (DIA_TYPE_ARROW_SELECTOR, NULL)); -} - - -Arrow -dia_arrow_selector_get_arrow(DiaArrowSelector *as) -{ - Arrow at; - gchar *arrowname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(as->omenu)); - - at.type = arrow_type_from_name(arrowname); - g_free(arrowname); - dia_size_selector_get_size(as->size, &at.width, &at.length); - return at; -} - -void -dia_arrow_selector_set_arrow (DiaArrowSelector *as, - Arrow arrow) -{ - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(as->omenu), - arrow_get_name_from_type(arrow.type)); - set_size_sensitivity(as); - dia_size_selector_set_size(DIA_SIZE_SELECTOR(as->size), arrow.width, arrow.length); -} diff --git a/lib/diacellrendererproperty.c b/lib/diacellrendererproperty.c index 512cb55d40470ab48834ee1150a19dddc97236cd..a21fd058f34a66c0878aadbe809ee5f81d894379 100644 --- a/lib/diacellrendererproperty.c +++ b/lib/diacellrendererproperty.c @@ -30,7 +30,6 @@ #include "diacellrendererproperty.h" #include "diarenderer.h" -#include "diamarshal.h" #include "message.h" enum @@ -96,11 +95,9 @@ dia_cell_renderer_property_class_init (DiaCellRendererPropertyClass *klass) G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (DiaCellRendererPropertyClass, clicked), - NULL, NULL, - dia_marshal_VOID__STRING_FLAGS, + NULL, NULL, NULL, G_TYPE_NONE, 2, - G_TYPE_STRING, - GDK_TYPE_MODIFIER_TYPE); + G_TYPE_STRING, GDK_TYPE_MODIFIER_TYPE); object_class->finalize = dia_cell_renderer_property_finalize; object_class->get_property = dia_cell_renderer_property_get_property; @@ -127,7 +124,9 @@ dia_cell_renderer_property_class_init (DiaCellRendererPropertyClass *klass) static void dia_cell_renderer_property_init (DiaCellRendererProperty *cellproperty) { - GTK_CELL_RENDERER (cellproperty)->mode = GTK_CELL_RENDERER_MODE_ACTIVATABLE; + g_object_set (G_OBJECT (cellproperty), + "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, + NULL); } static void @@ -205,6 +204,10 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, gint view_height = 0; gint calc_width; gint calc_height; + gint xpad; + gint ypad; + gfloat xalign; + gfloat yalign; #if 0 cellproperty = DIA_CELL_RENDERER_PROPERTY (cell); @@ -222,8 +225,11 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, view_height = 30; #endif - calc_width = (gint) cell->xpad * 2 + view_width; - calc_height = (gint) cell->ypad * 2 + view_height; + gtk_cell_renderer_get_padding (cell, &xpad, &ypad); + gtk_cell_renderer_get_alignment (cell, &xalign, &yalign); + + calc_width = (gint) xpad * 2 + view_width; + calc_height = (gint) ypad * 2 + view_height; if (x_offset) *x_offset = 0; if (y_offset) *y_offset = 0; @@ -233,15 +239,15 @@ dia_cell_renderer_property_get_size (GtkCellRenderer *cell, if (x_offset) { *x_offset = (((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ? - 1.0 - cell->xalign : cell->xalign) * - (cell_area->width - calc_width - 2 * cell->xpad)); - *x_offset = (MAX (*x_offset, 0) + cell->xpad); + 1.0 - xalign : xalign) * + (cell_area->width - calc_width - 2 * xpad)); + *x_offset = (MAX (*x_offset, 0) + xpad); } if (y_offset) { - *y_offset = (cell->yalign * - (cell_area->height - calc_height - 2 * cell->ypad)); - *y_offset = (MAX (*y_offset, 0) + cell->ypad); + *y_offset = (yalign * + (cell_area->height - calc_height - 2 * ypad)); + *y_offset = (MAX (*y_offset, 0) + ypad); } } diff --git a/lib/diacolorselector.c b/lib/diacolorselector.c deleted file mode 100644 index c1b859bb8a0e33e2969dc3f8dca282c58ed1f6ee..0000000000000000000000000000000000000000 --- a/lib/diacolorselector.c +++ /dev/null @@ -1,367 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - -#include "intl.h" -#include "diadynamicmenu.h" -#include "persistence.h" -#include "widgets.h" - -/************* DiaColorSelector: ***************/ -struct _DiaColorSelector -{ - GtkHBox hbox; /* just contaning the other two widgets */ - DiaDynamicMenu *ddm; /* the widget previously alone */ - GtkColorButton *color_button; /* to reflect alpha */ - gboolean use_alpha; -}; -struct _DiaColorSelectorClass -{ - GtkHBoxClass parent_class; -}; -enum { - DIA_COLORSEL_VALUE_CHANGED, - DIA_COLORSEL_LAST_SIGNAL -}; -static guint dia_colorsel_signals[DIA_COLORSEL_LAST_SIGNAL] = { 0 }; - -static GtkWidget *dia_color_selector_menu_new (DiaColorSelector *cs); - -static void -dia_color_selector_class_init (DiaColorSelector *class) -{ - dia_colorsel_signals[DIA_COLORSEL_VALUE_CHANGED] - = g_signal_new("value_changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} -static void -dia_color_selector_color_set (GtkColorButton *button, gpointer user_data) -{ - DiaColorSelector *cs = DIACOLORSELECTOR(user_data); - gchar *entry; - GdkColor gcol; - - gtk_color_button_get_color (button, &gcol); - - entry = g_strdup_printf("#%02X%02X%02X", gcol.red/256, gcol.green/256, gcol.blue/256); - dia_dynamic_menu_select_entry(cs->ddm, entry); - g_free(entry); - - g_signal_emit (G_OBJECT (cs), dia_colorsel_signals[DIA_COLORSEL_VALUE_CHANGED], 0); -} -static void -dia_color_selector_value_changed (DiaDynamicMenu *ddm, gpointer user_data) -{ - DiaColorSelector *cs = DIACOLORSELECTOR(user_data); - gchar *entry = dia_dynamic_menu_get_entry(cs->ddm); - GdkColor gcol; - - gdk_color_parse (entry, &gcol); - g_free(entry); - gtk_color_button_set_color (cs->color_button, &gcol); - - g_signal_emit (G_OBJECT (cs), dia_colorsel_signals[DIA_COLORSEL_VALUE_CHANGED], 0); -} -static void -dia_color_selector_init (DiaColorSelector *cs) -{ - cs->ddm = DIA_DYNAMIC_MENU(dia_color_selector_menu_new(cs)); - cs->color_button = GTK_COLOR_BUTTON (gtk_color_button_new ()); - - gtk_widget_show (GTK_WIDGET (cs->ddm)); - - /* default off */ - gtk_color_button_set_use_alpha (cs->color_button, cs->use_alpha); - /* delegate color changes to compound object */ - g_signal_connect (G_OBJECT (cs->color_button), "color-set", - G_CALLBACK (dia_color_selector_color_set), cs); - /* listen to menu selction to update the button */ - g_signal_connect (G_OBJECT (cs->ddm), "value-changed", - G_CALLBACK (dia_color_selector_value_changed), cs); - - if (cs->use_alpha) - gtk_widget_show (GTK_WIDGET (cs->color_button)); - - gtk_box_pack_start(GTK_BOX(cs), GTK_WIDGET(cs->ddm), TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(cs), GTK_WIDGET(cs->color_button), TRUE, TRUE, 0); -} -void -dia_color_selector_set_use_alpha (GtkWidget *widget, gboolean use_alpha) -{ - DiaColorSelector *cs = DIACOLORSELECTOR(widget); - - if (use_alpha) - gtk_widget_show (GTK_WIDGET (cs->color_button)); - else - gtk_widget_hide (GTK_WIDGET (cs->color_button)); - cs->use_alpha = use_alpha; - gtk_color_button_set_use_alpha (cs->color_button, cs->use_alpha); -} -GType -dia_color_selector_get_type (void) -{ - static GType dcs_type = 0; - - if (!dcs_type) { - static const GTypeInfo dcs_info = { - sizeof (DiaColorSelectorClass), - (GBaseInitFunc)NULL, - (GBaseFinalizeFunc)NULL, - (GClassInitFunc) dia_color_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaColorSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc) dia_color_selector_init - }; - - dcs_type = g_type_register_static (gtk_hbox_get_type (), - "DiaColorSelector", - &dcs_info, 0); - } - - return dcs_type; -} - -static GtkWidget * -dia_color_selector_create_string_item(DiaDynamicMenu *ddm, gchar *string) -{ - GtkWidget *item = gtk_menu_item_new_with_label(string); - gint r, g, b, a; - gchar *markup; - - sscanf(string, "#%2x%2x%2x%2x", &r, &g, &b, &a); - - markup = g_strdup_printf("#%02X%02X%02X", r, g, b); - - /* See http://web.umr.edu/~rhall/commentary/color_readability.htm for - * explanation of this formula */ - if (r*299+g*587+b*114 > 500 * 256) { - gchar *label = g_strdup_printf("%s", markup, string); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - } else { - gchar *label = g_strdup_printf("%s", markup, string); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - } - - g_free(markup); - return item; -} - -static void -dia_color_selector_more_ok(GtkWidget *ok, gpointer userdata) -{ - DiaColorSelector *cs = g_object_get_data(G_OBJECT(userdata), "dia-cs"); - GtkWidget *colorsel = GTK_WIDGET(userdata); - GdkColor gcol; - guint galpha; - gchar *entry; - GtkWidget *cs2 = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG(colorsel)); - - gtk_color_selection_get_current_color( - GTK_COLOR_SELECTION(cs2), - &gcol); - - galpha = gtk_color_selection_get_current_alpha( - GTK_COLOR_SELECTION(cs2)); - - entry = g_strdup_printf("#%02X%02X%02X", gcol.red/256, gcol.green/256, gcol.blue/256); - dia_dynamic_menu_select_entry(cs->ddm, entry); - g_free(entry); - /* update color button */ - gtk_color_button_set_color (cs->color_button, &gcol); - gtk_color_button_set_alpha (cs->color_button, galpha); - /* not destroying colorsel */ -} - -static void -dia_color_selector_more_callback(GtkWidget *widget, gpointer userdata) -{ - GtkColorSelectionDialog *dialog = GTK_COLOR_SELECTION_DIALOG (gtk_color_selection_dialog_new(_("Select color"))); - DiaColorSelector *cs = DIACOLORSELECTOR(userdata); - GtkColorSelection *colorsel = GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection (dialog)); - GString *palette = g_string_new (""); - GtkWidget *button; - - gchar *old_color = dia_dynamic_menu_get_entry(cs->ddm); - GtkWidget *parent; - - gtk_color_selection_set_has_opacity_control(colorsel, cs->use_alpha); - - if (cs->use_alpha) { - gtk_color_selection_set_previous_alpha (colorsel, 65535); - gtk_color_selection_set_current_alpha (colorsel, gtk_color_button_get_alpha (cs->color_button)); - } - /* Force history to the old place */ - dia_dynamic_menu_select_entry(cs->ddm, old_color); - - /* avoid crashing if the property dialog is closed before the color dialog */ - parent = widget; - while (parent && !GTK_IS_WINDOW (parent)) - parent = gtk_widget_get_parent (parent); - if (parent) { - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW(parent)); - gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); - } - - if (dia_dynamic_menu_get_default_entries(cs->ddm) != NULL) { - GList *tmplist; - int index = 0; - gboolean advance = TRUE; - - for (tmplist = dia_dynamic_menu_get_default_entries(cs->ddm); - tmplist != NULL || advance; - tmplist = g_list_next(tmplist)) { - const gchar* spec; - GdkColor color; - - /* handle both lists */ - if (!tmplist && advance) { - advance = FALSE; - tmplist = persistent_list_get_glist(dia_dynamic_menu_get_persistent_name(cs->ddm)); - if (!tmplist) - break; - } - - spec = tmplist->data; - - gdk_color_parse (spec, &color); -#if 0 - /* the easy way if the Gtk Team would decide to make it public */ - gtk_color_selection_set_palette_color (colorsel, index, &color); -#else - g_string_append (palette, spec); - g_string_append (palette, ":"); -#endif - if (0 == strcmp (spec, old_color)) { - gtk_color_selection_set_previous_color (colorsel, &color); - gtk_color_selection_set_current_color (colorsel, &color); - } - index++; - } - } - - g_object_set (gtk_widget_get_settings (GTK_WIDGET (colorsel)), "gtk-color-palette", palette->str, NULL); - gtk_color_selection_set_has_palette (colorsel, TRUE); - g_string_free (palette, TRUE); - g_free(old_color); - - g_object_get (G_OBJECT (dialog), "help-button", &button, NULL); - gtk_widget_hide(button); - - g_object_get (G_OBJECT (dialog), "ok-button", &button, NULL); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (dia_color_selector_more_ok), dialog); - - g_object_get (G_OBJECT (dialog), "ok-button", &button, NULL); - g_signal_connect_swapped (G_OBJECT (button), "clicked", - G_CALLBACK(gtk_widget_destroy), G_OBJECT(dialog)); - - g_object_set_data(G_OBJECT(dialog), "dia-cs", cs); - - gtk_widget_show(GTK_WIDGET(dialog)); -} - -static GtkWidget * -dia_color_selector_menu_new (DiaColorSelector *cs) -{ - GtkWidget *otheritem = gtk_menu_item_new_with_label(_("More colors\342\200\246")); - GtkWidget *ddm = dia_dynamic_menu_new(dia_color_selector_create_string_item, - NULL, - GTK_MENU_ITEM(otheritem), - "color-menu"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(ddm), - "#000000"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(ddm), - "#FFFFFF"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(ddm), - "#FF0000"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(ddm), - "#00FF00"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(ddm), - "#0000FF"); - g_signal_connect(G_OBJECT(otheritem), "activate", - G_CALLBACK(dia_color_selector_more_callback), cs); - gtk_widget_show(otheritem); - - return ddm; -} - -GtkWidget * -dia_color_selector_new (void) -{ - return GTK_WIDGET ( g_object_new (dia_color_selector_get_type (), NULL)); -} -void -dia_color_selector_get_color(GtkWidget *widget, Color *color) -{ - DiaColorSelector *cs = DIACOLORSELECTOR(widget); - gchar *entry = dia_dynamic_menu_get_entry(cs->ddm); - gint r, g, b; - - sscanf(entry, "#%2x%2x%2x", &r, &g, &b); - g_free(entry); - color->red = r / 255.0; - color->green = g / 255.0; - color->blue = b / 255.0; - - if (cs->use_alpha) { - color->alpha = gtk_color_button_get_alpha (cs->color_button) / 65535.0; - } else { - color->alpha = 1.0; - } -} - -void -dia_color_selector_set_color (GtkWidget *widget, - const Color *color) -{ - DiaColorSelector *cs = DIACOLORSELECTOR(widget); - gint red, green, blue; - gchar *entry; - red = color->red * 255; - green = color->green * 255; - blue = color->blue * 255; - if (color->red > 1.0 || color->green > 1.0 || color->blue > 1.0 || color->alpha > 1.0) { - printf("Color out of range: r %f, g %f, b %f, a %f\n", - color->red, color->green, color->blue, color->alpha); - red = MIN(red, 255); - green = MIN(green, 255); - blue = MIN(blue, 255); - } - entry = g_strdup_printf("#%02X%02X%02X", red, green, blue); - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(cs->ddm), entry); - g_free (entry); - - if (cs->use_alpha) { - GdkColor gcol; - - color_convert (color, &gcol); - gtk_color_button_set_color (cs->color_button, &gcol); - gtk_color_button_set_alpha (cs->color_button, MIN(color->alpha * 65535, 65535)); - } -} - diff --git a/lib/diadynamicmenu.c b/lib/diadynamicmenu.c deleted file mode 100644 index 195a4a45bdaaa0b1b8829dac26db8bd13eccce99..0000000000000000000000000000000000000000 --- a/lib/diadynamicmenu.c +++ /dev/null @@ -1,455 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#include "intl.h" -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ -#include -#include "diadynamicmenu.h" -#include "persistence.h" - -/* hidden internals for two reasosn: - * - noone is supposed to mess with the internals - * - it uses deprecated stuff - */ -struct _DiaDynamicMenu { - GtkOptionMenu parent; - - GList *default_entries; - - DDMCreateItemFunc create_func; - DDMCallbackFunc activate_func; - gpointer userdata; - - GtkMenuItem *other_item; - - gchar *persistent_name; - gint cols; - - gchar *active; - /** For the list-based versions, these are the options */ - GList *options; - -}; - -struct _DiaDynamicMenuClass { - GtkOptionMenuClass parent_class; -}; - - -/* ************************ Dynamic menus ************************ */ - -static void dia_dynamic_menu_class_init(DiaDynamicMenuClass *class); -static void dia_dynamic_menu_init(DiaDynamicMenu *self); -static void dia_dynamic_menu_create_sublist(DiaDynamicMenu *ddm, - GList *items, - DDMCreateItemFunc create); -static void dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm); -static void dia_dynamic_menu_destroy(GtkObject *object); - -enum { - DDM_VALUE_CHANGED, - DDM_LAST_SIGNAL -}; - -static guint ddm_signals[DDM_LAST_SIGNAL] = { 0 }; - -GType -dia_dynamic_menu_get_type(void) -{ - static GType us_type = 0; - - if (!us_type) { - static const GTypeInfo us_info = { - sizeof(DiaDynamicMenuClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_dynamic_menu_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof(DiaDynamicMenu), - 0, /* n_preallocs */ - (GInstanceInitFunc)dia_dynamic_menu_init, - }; - us_type = g_type_register_static( - gtk_option_menu_get_type(), - "DiaDynamicMenu", - &us_info, 0); - } - return us_type; -} - -static void -dia_dynamic_menu_class_init(DiaDynamicMenuClass *class) -{ - GtkObjectClass *object_class = (GtkObjectClass*)class; - - object_class->destroy = dia_dynamic_menu_destroy; - - ddm_signals[DDM_VALUE_CHANGED] - = g_signal_new("value-changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -dia_dynamic_menu_init(DiaDynamicMenu *self) -{ -} - -void -dia_dynamic_menu_destroy(GtkObject *object) -{ - DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(object); - GtkObjectClass *parent_class = GTK_OBJECT_CLASS(g_type_class_peek_parent(GTK_OBJECT_GET_CLASS(object))); - - if (ddm->active) - g_free(ddm->active); - ddm->active = NULL; - - if (parent_class->destroy) - (* parent_class->destroy) (object); -} - -/** Create a new dynamic menu. The entries are represented with - * gpointers. - * @param create A function that creates menuitems from gpointers. - * @param otheritem A menuitem that can be selected by the user to - * add more entries, for instance making a dialog box or a submenu. - * @param persist A string naming this menu for persistence purposes, or NULL. - - * @return A new menu - */ -GtkWidget * -dia_dynamic_menu_new(DDMCreateItemFunc create, - gpointer userdata, - GtkMenuItem *otheritem, gchar *persist) -{ - DiaDynamicMenu *ddm; - - g_assert(persist != NULL); - - ddm = DIA_DYNAMIC_MENU ( g_object_new (dia_dynamic_menu_get_type (), NULL)); - - ddm->create_func = create; - ddm->userdata = userdata; - ddm->other_item = otheritem; - ddm->persistent_name = persist; - ddm->cols = 1; - - persistence_register_list(persist); - - dia_dynamic_menu_create_menu(ddm); - - return GTK_WIDGET(ddm); -} - -/** Select the given entry, adding it if necessary */ -void -dia_dynamic_menu_select_entry(DiaDynamicMenu *ddm, const gchar *name) -{ - gint add_result = dia_dynamic_menu_add_entry(ddm, name); - if (add_result == 0) { - GList *tmp; - int i = 0; - for (tmp = ddm->default_entries; tmp != NULL; - tmp = g_list_next(tmp), i++) { - if (!g_ascii_strcasecmp(tmp->data, name)) - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), i); - } - /* Not there after all? */ - } else { - if (ddm->default_entries != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), - g_list_length(ddm->default_entries)+1); - else - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0); - } - - g_free(ddm->active); - ddm->active = g_strdup(name); - g_signal_emit(GTK_OBJECT(ddm), ddm_signals[DDM_VALUE_CHANGED], 0); -} - -static void -dia_dynamic_menu_activate(GtkWidget *item, gpointer userdata) -{ - DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(userdata); - gchar *name = g_object_get_data(G_OBJECT(item), "ddm_name"); - dia_dynamic_menu_select_entry(ddm, name); -} - -static GtkWidget * -dia_dynamic_menu_create_string_item(DiaDynamicMenu *ddm, gchar *string) -{ - GtkWidget *item = gtk_menu_item_new_with_label(gettext(string)); - return item; -} - -/** Utility function for dynamic menus that are entirely based on the - * labels in the menu. - */ -GtkWidget * -dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, - gpointer userdata, - gchar *persist) -{ - GtkWidget *ddm = dia_dynamic_menu_new(dia_dynamic_menu_create_string_item, - userdata, - otheritem, persist); - return ddm; -} - -/** Utility function for dynamic menus that are based on a submenu with - * many entries. This is useful for allowing the user to get a smaller - * subset menu out of a set too large to be easily handled by a menu. - */ -GtkWidget * -dia_dynamic_menu_new_listbased(DDMCreateItemFunc create, - gpointer userdata, - gchar *other_label, GList *items, - gchar *persist) -{ - GtkWidget *item = gtk_menu_item_new_with_label(other_label); - GtkWidget *ddm = dia_dynamic_menu_new(create, userdata, - GTK_MENU_ITEM(item), persist); - dia_dynamic_menu_create_sublist(DIA_DYNAMIC_MENU(ddm), items, create); - - gtk_widget_show(item); - return ddm; -} - -/** Utility function for dynamic menus that allow selection from a large - * number of strings. - */ -GtkWidget * -dia_dynamic_menu_new_stringlistbased(gchar *other_label, - GList *items, - gpointer userdata, - gchar *persist) -{ - return dia_dynamic_menu_new_listbased(dia_dynamic_menu_create_string_item, - userdata, - other_label, items, persist); -} - -static void -dia_dynamic_menu_create_sublist(DiaDynamicMenu *ddm, - GList *items, DDMCreateItemFunc create) -{ - GtkWidget *item = GTK_WIDGET(ddm->other_item); - - GtkWidget *submenu = gtk_menu_new(); - - for (; items != NULL; items = g_list_next(items)) { - GtkWidget *submenuitem = (create)(ddm, items->data); - /* Set callback function to cause addition of item */ - gtk_menu_shell_append(GTK_MENU_SHELL(submenu), submenuitem); - g_object_set_data(G_OBJECT(submenuitem), "ddm_name", items->data); - g_signal_connect(submenuitem, "activate", - G_CALLBACK(dia_dynamic_menu_activate), ddm); - gtk_widget_show(submenuitem); - } - - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - gtk_widget_show(submenu); -} - -/** Add a new default entry to this menu. - * The default entries are always shown, also after resets, above the - * other entries. Possible uses are standard fonts or common colors. - * The entry is added at the end of the default entries section. - * Do not add too many default entries. - * - * @param ddm A dynamic menu to add the entry to. - * @param entry An entry for the menu. - */ -void -dia_dynamic_menu_add_default_entry(DiaDynamicMenu *ddm, const gchar *entry) -{ - ddm->default_entries = g_list_append(ddm->default_entries, - g_strdup(entry)); - - dia_dynamic_menu_create_menu(ddm); -} - -/** Set the number of columns this menu uses (default 1) - * @param cols Desired # of columns (>= 1) - */ -void -dia_dynamic_menu_set_columns(DiaDynamicMenu *ddm, gint cols) -{ - ddm->cols = cols; - - dia_dynamic_menu_create_menu(ddm); -} - -/** Add a new entry to this menu. The placement depends on what sorting - * system has been chosen with dia_dynamic_menu_set_sorting_method(). - * - * @param ddm A dynamic menu to add the entry to. - * @param entry An entry for the menu. - * - * @returns 0 if the entry was one of the default entries. - * 1 if the entry was already there. - * 2 if the entry got added. - */ -gint -dia_dynamic_menu_add_entry(DiaDynamicMenu *ddm, const gchar *entry) -{ - GList *tmp; - gboolean existed; - - for (tmp = ddm->default_entries; tmp != NULL; tmp = g_list_next(tmp)) { - if (!g_ascii_strcasecmp(tmp->data, entry)) - return 0; - } - existed = persistent_list_add(ddm->persistent_name, entry); - - dia_dynamic_menu_create_menu(ddm); - - return existed?1:2; -} - -/** Returns the currently selected entry. - * @returns The name of the entry that is currently selected. This - * string should be freed by the caller. */ -gchar * -dia_dynamic_menu_get_entry(DiaDynamicMenu *ddm) -{ - return g_strdup(ddm->active); -} - -/** Rebuild the actual menu of a DDM. - * Ignores columns for now. - */ -static void -dia_dynamic_menu_create_menu(DiaDynamicMenu *ddm) -{ - GtkWidget *sep; - GList *tmplist; - GtkWidget *menu; - GtkWidget *item; - - g_object_ref(G_OBJECT(ddm->other_item)); - menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(ddm)); - if (menu != NULL) { - gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(ddm->other_item)); - gtk_container_foreach(GTK_CONTAINER(menu), - (GtkCallback)gtk_widget_destroy, NULL); - gtk_option_menu_remove_menu(GTK_OPTION_MENU(ddm)); - } - - menu = gtk_menu_new(); - - if (ddm->default_entries != NULL) { - for (tmplist = ddm->default_entries; tmplist != NULL; tmplist = g_list_next(tmplist)) { - GtkWidget *item = (ddm->create_func)(ddm, tmplist->data); - g_object_set_data(G_OBJECT(item), "ddm_name", tmplist->data); - g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(dia_dynamic_menu_activate), ddm); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - } - sep = gtk_separator_menu_item_new(); - gtk_widget_show(sep); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep); - } - - for (tmplist = persistent_list_get_glist(ddm->persistent_name); - tmplist != NULL; tmplist = g_list_next(tmplist)) { - GtkWidget *item = (ddm->create_func)(ddm, tmplist->data); - g_object_set_data(G_OBJECT(item), "ddm_name", tmplist->data); - g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(dia_dynamic_menu_activate), ddm); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - } - sep = gtk_separator_menu_item_new(); - gtk_widget_show(sep); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep); - - gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(ddm->other_item)); - g_object_unref(G_OBJECT(ddm->other_item)); - /* Eventually reset item here */ - gtk_widget_show(menu); - - item = gtk_menu_item_new_with_label(_("Reset menu")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(dia_dynamic_menu_reset), ddm); - gtk_widget_show(item); - - gtk_option_menu_set_menu(GTK_OPTION_MENU(ddm), menu); - - gtk_option_menu_set_history(GTK_OPTION_MENU(ddm), 0); -} - -/** Select the method used for sorting the non-default entries. - * @param ddm A dynamic menu - * @param sort The way the non-default entries in the menu should be sorted. - */ -void -dia_dynamic_menu_set_sorting_method(DiaDynamicMenu *ddm, DdmSortType sort) -{ -} - -/** Reset the non-default entries of a menu - */ -void -dia_dynamic_menu_reset(GtkWidget *item, gpointer userdata) -{ - DiaDynamicMenu *ddm = DIA_DYNAMIC_MENU(userdata); - gchar *active = dia_dynamic_menu_get_entry(ddm); - - persistent_list_clear(ddm->persistent_name); - - dia_dynamic_menu_create_menu(ddm); - if (active) - dia_dynamic_menu_select_entry(ddm, active); - g_free(active); -} - -/** Set the maximum number of non-default entries. - * If more than this number of entries are added, the least recently - * selected ones are removed. */ -void -dia_dynamic_menu_set_max_entries(DiaDynamicMenu *ddm, gint max) -{ -} - -/** - * Deliver the list of default entries, NULL for empty list - */ -GList * -dia_dynamic_menu_get_default_entries(DiaDynamicMenu *ddm) -{ - return ddm->default_entries; -} - -/** - * Delivers the name used for persitence - */ -const gchar * -dia_dynamic_menu_get_persistent_name(DiaDynamicMenu *ddm) -{ - return ddm->persistent_name; -} diff --git a/lib/diadynamicmenu.h b/lib/diadynamicmenu.h deleted file mode 100644 index 436b6c99ee0a9ce5ccbbc9a2211a623a5c0cfcd8..0000000000000000000000000000000000000000 --- a/lib/diadynamicmenu.h +++ /dev/null @@ -1,56 +0,0 @@ - -#ifndef DIA_DYNAMIC_MENU_H -#define DIA_DYNAMIC_MENU_H - -#include - -/* DiaDynamicMenu */ - -#define DIA_DYNAMIC_MENU(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, dia_dynamic_menu_get_type(), DiaDynamicMenu) -#define DIA_DYNAMIC_MENU_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, dia_dynamic_menu_get_type(), DiaDynamicMenuClass) -#define DIA_IS_DYNAMIC_MENU(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, dia_dynamic_menu_get_type()) - -typedef struct _DiaDynamicMenu DiaDynamicMenu; -typedef struct _DiaDynamicMenuClass DiaDynamicMenuClass; - -/** The ways the non-default entries in the menu can be sorted: - * DDM_SORT_TOP: Just add new ones at the top, removing them from the middle. - * Not currently implemented. - * DDM_SORT_NEWEST: Add new ones to the top, and move selected ones to the - * top as well. - * DDM_SORT_SORT: Sort the entries according to the CompareFunc order. - */ -typedef enum { DDM_SORT_TOP, DDM_SORT_NEWEST, DDM_SORT_SORT } DdmSortType; - -typedef GtkWidget *(* DDMCreateItemFunc)(DiaDynamicMenu *, gchar *); -typedef void (* DDMCallbackFunc)(DiaDynamicMenu *, const gchar *, gpointer); - -GType dia_dynamic_menu_get_type (void); - -GtkWidget *dia_dynamic_menu_new(DDMCreateItemFunc create, - gpointer userdata, - GtkMenuItem *otheritem, gchar *persist); -GtkWidget *dia_dynamic_menu_new_stringbased(GtkMenuItem *otheritem, - gpointer userdata, - gchar *persist); -GtkWidget *dia_dynamic_menu_new_listbased(DDMCreateItemFunc create, - gpointer userdata, - gchar *other_label, - GList *items, gchar *persist); -GtkWidget *dia_dynamic_menu_new_stringlistbased(gchar *other_label, - GList *items, - gpointer userdata, - gchar *persist); -void dia_dynamic_menu_add_default_entry(DiaDynamicMenu *ddm, const gchar *entry); -gint dia_dynamic_menu_add_entry(DiaDynamicMenu *ddm, const gchar *entry); -void dia_dynamic_menu_set_sorting_method(DiaDynamicMenu *ddm, DdmSortType sort); -void dia_dynamic_menu_reset(GtkWidget *widget, gpointer userdata); -void dia_dynamic_menu_set_max_entries(DiaDynamicMenu *ddm, gint max); -void dia_dynamic_menu_set_columns(DiaDynamicMenu *ddm, gint cols); -gchar *dia_dynamic_menu_get_entry(DiaDynamicMenu *ddm); -void dia_dynamic_menu_select_entry(DiaDynamicMenu *ddm, const gchar *entry); - -GList *dia_dynamic_menu_get_default_entries(DiaDynamicMenu *ddm); -const gchar *dia_dynamic_menu_get_persistent_name(DiaDynamicMenu *ddm); - -#endif /* DIA_DYNAMIC_MENU_H */ diff --git a/lib/diafontselector.c b/lib/diafontselector.c index d216c2f644622fb6cc055621da4145a2ce76dfa4..07215201a6c086bf0225754b7d0fad6195552f67 100644 --- a/lib/diafontselector.c +++ b/lib/diafontselector.c @@ -22,10 +22,8 @@ #include #include "intl.h" -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ #include #include "diafontselector.h" -#include "diadynamicmenu.h" #include "font.h" /************* DiaFontSelector: ***************/ @@ -34,19 +32,7 @@ * _no_ they should not, noone is supposed to mess with the internals, ever heard of information hiding? */ -struct _DiaFontSelector -{ - GtkHBox hbox; - - GtkWidget *font_omenu; - GtkOptionMenu *style_omenu; - GtkMenu *style_menu; -}; - -struct _DiaFontSelectorClass -{ - GtkHBoxClass parent_class; -}; +G_DEFINE_TYPE (DiaFontSelector, dia_font_selector, GTK_TYPE_FONT_BUTTON) enum { DFONTSEL_VALUE_CHANGED, @@ -73,307 +59,38 @@ static guint dfontsel_signals[DFONTSEL_LAST_SIGNAL] = { 0 }; * +----------------+ */ -static void dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, - gpointer data); -static void dia_font_selector_stylemenu_callback(GtkMenu *menu, - gpointer data); -static void dia_font_selector_set_styles(DiaFontSelector *fs, - const gchar *name, - DiaFontStyle dia_style); -static void dia_font_selector_set_style_menu(DiaFontSelector *fs, - PangoFontFamily *pff, - DiaFontStyle dia_style); +/* GTK3 PORT NOTES: + * + * This was implmented as two drop downs, Font & Variant in a hbox. For + * simplicity this is now a wrapper around GtkFontButton, possibly + * invesigate returning to old style ? + */ static void dia_font_selector_class_init (DiaFontSelectorClass *class) { - dfontsel_signals[DFONTSEL_VALUE_CHANGED] - = g_signal_new("value_changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static int -dia_font_selector_sort_fonts(const void *p1, const void *p2) -{ - const gchar *n1 = pango_font_family_get_name(PANGO_FONT_FAMILY(*(void**)p1)); - const gchar *n2 = pango_font_family_get_name(PANGO_FONT_FAMILY(*(void**)p2)); - return g_ascii_strcasecmp(n1, n2); -} - -static gchar* -replace_ampersands(gchar* string) -{ - gchar** pieces = g_strsplit(string, "&", -1); - gchar* escaped = g_strjoinv("&", pieces); - g_strfreev(pieces); - return escaped; -} - -static GtkWidget * -dia_font_selector_create_string_item(DiaDynamicMenu *ddm, gchar *string) -{ - GtkWidget *item = gtk_menu_item_new_with_label(string); - if (strchr(string, '&')) { - gchar *escaped = replace_ampersands(string); - gchar *label = g_strdup_printf("%s", - escaped, escaped); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - g_free(escaped); - } else { - gchar *label = g_strdup_printf("%s", - string, string); - gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item))), label); - g_free(label); - } - return item; + dfontsel_signals[DFONTSEL_VALUE_CHANGED] = + g_signal_new ("value_changed", + DIA_TYPE_FONT_SELECTOR, + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void dia_font_selector_init (DiaFontSelector *fs) { - GtkWidget *menu; - GtkWidget *omenu; - - PangoFontFamily **families; - int n_families,i; - GList *fontnames = NULL; - - pango_context_list_families (dia_font_get_context(), - &families, &n_families); - qsort(families, n_families, sizeof(PangoFontFamily*), - dia_font_selector_sort_fonts); - /* Doing it the slow way until I find a better way */ - for (i = 0; i < n_families; i++) { - fontnames = g_list_append(fontnames, - g_strdup(pango_font_family_get_name(families[i]))); - } - g_free (families); - - fs->font_omenu = dia_dynamic_menu_new_listbased(dia_font_selector_create_string_item, - fs, _("Other fonts"), - fontnames, "font-menu"); - g_signal_connect(DIA_DYNAMIC_MENU(fs->font_omenu), "value-changed", - G_CALLBACK(dia_font_selector_fontmenu_callback), fs); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "sans"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "serif"); - dia_dynamic_menu_add_default_entry(DIA_DYNAMIC_MENU(fs->font_omenu), - "monospace"); - gtk_widget_show(GTK_WIDGET(fs->font_omenu)); - - /* Now build the style menu button */ - omenu = gtk_option_menu_new(); - fs->style_omenu = GTK_OPTION_MENU(omenu); - menu = gtk_menu_new (); - /* No callback needed since fs->style_menu keeps getting replaced. */ - fs->style_menu = GTK_MENU(menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->style_omenu), menu); - - gtk_widget_show(menu); - gtk_widget_show(omenu); - - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->font_omenu), TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->style_omenu), TRUE, TRUE, 0); -} - -GType -dia_font_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaFontSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_font_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaFontSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc) dia_font_selector_init, - }; - - dfs_type = g_type_register_static (gtk_hbox_get_type (), - "DiaFontSelector", - &dfs_info, 0); - } - - return dfs_type; + gtk_font_button_set_show_size (GTK_FONT_BUTTON (fs), FALSE); } GtkWidget * dia_font_selector_new () { - return GTK_WIDGET ( g_object_new (dia_font_selector_get_type (), NULL)); -} - -static PangoFontFamily * -dia_font_selector_get_family_from_name(GtkWidget *widget, const gchar *fontname) -{ - PangoFontFamily **families; - int n_families,i; - - pango_context_list_families (dia_font_get_context(), - &families, &n_families); - /* Doing it the slow way until I find a better way */ - for (i = 0; i < n_families; i++) { - if (!(g_ascii_strcasecmp(pango_font_family_get_name(families[i]), fontname))) { - PangoFontFamily *fam = families[i]; - g_free(families); - return fam; - } - } - g_warning(_("Couldn't find font family for %s\n"), fontname); - g_free(families); - return NULL; + return g_object_new (DIA_TYPE_FONT_SELECTOR, NULL); } -static void -dia_font_selector_fontmenu_callback(DiaDynamicMenu *ddm, gpointer data) -{ - DiaFontSelector *fs = DIAFONTSELECTOR(data); - char *fontname = dia_dynamic_menu_get_entry(ddm); - dia_font_selector_set_styles(fs, fontname, -1); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); - g_free(fontname); -} - -static void -dia_font_selector_stylemenu_callback(GtkMenu *menu, gpointer data) -{ - DiaFontSelector *fs = DIAFONTSELECTOR(data); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); -} - -static char *style_labels[] = { - "Normal", - "Oblique", - "Italic", - "Ultralight", - "Ultralight-Oblique", - "Ultralight-Italic", - "Light", - "Light-Oblique", - "Light-Italic", - "Medium", - "Medium-Oblique", - "Medium-Italic", - "Demibold", - "Demibold-Oblique", - "Demibold-Italic", - "Bold", - "Bold-Oblique", - "Bold-Italic", - "Ultrabold", - "Ultrabold-Oblique", - "Ultrabold-Italic", - "Heavy", - "Heavy-Oblique", - "Heavy-Italic" -}; - -static void -dia_font_selector_set_style_menu(DiaFontSelector *fs, - PangoFontFamily *pff, - DiaFontStyle dia_style) -{ - int select = 0; - PangoFontFace **faces = NULL; - int nfaces = 0; - int i=0; - GtkWidget *menu = NULL; - long stylebits = 0; - int menu_item_nr = 0; - GSList *group = NULL; - - menu = gtk_menu_new (); - g_signal_connect(menu, "selection-done", - G_CALLBACK(dia_font_selector_stylemenu_callback), fs); - - pango_font_family_list_faces(pff, &faces, &nfaces); - - for (i = 0; i < nfaces; i++) { - PangoFontDescription *pfd = pango_font_face_describe(faces[i]); - PangoStyle style = pango_font_description_get_style(pfd); - PangoWeight weight = pango_font_description_get_weight(pfd); - /** - * This is a quick and dirty way to pick the styles present, - * sort them and avoid duplicates. - * We set a bit for each style present, bit (weight*3+style) - * From style_labels, we pick #(weight*3+style) - * where weight and style are the Dia types. - */ - /* Account for DIA_WEIGHT_NORMAL hack */ - int weightnr = (weight-200)/100; - if (weightnr < 2) weightnr ++; - else if (weightnr == 2) weightnr = 0; - stylebits |= 1 << (3*weightnr + style); - pango_font_description_free(pfd); - } - - g_free(faces); - - if (stylebits == 0) { - g_warning ("'%s' has no style!", - pango_font_family_get_name (pff) ? pango_font_family_get_name (pff) : "(null font)"); - } - - for (i = DIA_FONT_NORMAL; i <= (DIA_FONT_HEAVY | DIA_FONT_ITALIC); i+=4) { - GtkWidget *menuitem; - /** - * bad hack continued ... - */ - int weight = DIA_FONT_STYLE_GET_WEIGHT(i) >> 4; - int slant = DIA_FONT_STYLE_GET_SLANT(i) >> 2; - if (DIA_FONT_STYLE_GET_SLANT(i) > DIA_FONT_ITALIC) continue; - if (!(stylebits & (1 << (3*weight + slant)))) continue; - menuitem = gtk_radio_menu_item_new_with_label (group, style_labels[3*weight+slant]); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); - g_object_set_data(G_OBJECT(menuitem), "user_data", GINT_TO_POINTER(i)); - if (dia_style == i) { - select = menu_item_nr; - } - menu_item_nr++; - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); - } - gtk_widget_show(menu); - gtk_option_menu_remove_menu(fs->style_omenu); - gtk_option_menu_set_menu(fs->style_omenu, menu); - fs->style_menu = GTK_MENU(menu); - gtk_option_menu_set_history(GTK_OPTION_MENU(fs->style_omenu), select); - gtk_menu_set_active(fs->style_menu, select); - gtk_widget_set_sensitive(GTK_WIDGET(fs->style_omenu), menu_item_nr > 1); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_menu_get_active(fs->style_menu)), TRUE); -} - -static void -dia_font_selector_set_styles(DiaFontSelector *fs, - const gchar *name, DiaFontStyle dia_style) -{ - PangoFontFamily *pff; - pff = dia_font_selector_get_family_from_name(GTK_WIDGET(fs), name); - dia_font_selector_set_style_menu(fs, pff, dia_style); -} - - /* API functions */ -/** Set a string to be used for preview in the GTK font selector dialog. - * The start of this string will be copied. - * This function is now obsolete. - */ -void -dia_font_selector_set_preview(DiaFontSelector *fs, gchar *text) { -} /** Set the current font to be shown in the font selector. */ @@ -381,11 +98,11 @@ void dia_font_selector_set_font(DiaFontSelector *fs, DiaFont *font) { const gchar *fontname = dia_font_get_family(font); + gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (fs), + dia_font_get_description (font)); /* side effect: adds fontname to presistence list */ - dia_dynamic_menu_select_entry(DIA_DYNAMIC_MENU(fs->font_omenu), fontname); - g_signal_emit(G_OBJECT(fs), - dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); - dia_font_selector_set_styles(fs, fontname, dia_font_get_style (font)); + g_signal_emit (G_OBJECT (fs), + dfontsel_signals[DFONTSEL_VALUE_CHANGED], 0); } DiaFont * @@ -396,12 +113,15 @@ dia_font_selector_get_font(DiaFontSelector *fs) DiaFontStyle style; DiaFont *font; - fontname = dia_dynamic_menu_get_entry(DIA_DYNAMIC_MENU(fs->font_omenu)); - menuitem = gtk_menu_get_active(fs->style_menu); - if (!menuitem) /* FIXME: should not happen ??? (but does if we don't have added a style) */ + fontname = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (fs)); + + // TODO: [GTK3] What is DiaFontStyle? + /*menuitem = gtk_menu_get_active(fs->style_menu); + if (!menuitem) // FIXME: should not happen ??? (but does if we don't have added a style) style = 0; else - style = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data")); + style = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data"));*/ + style = DIA_FONT_NORMAL; font = dia_font_new(fontname, style, 1.0); g_free(fontname); return font; diff --git a/lib/diafontselector.h b/lib/diafontselector.h index 595bad1207bfafd3a1806dce1ead2028a3be3d4c..69e42aae3dc41cd8407492bd5d7ef7b8ca6bcab0 100644 --- a/lib/diafontselector.h +++ b/lib/diafontselector.h @@ -22,15 +22,15 @@ #include "diatypes.h" /* DiaFontSelector: */ -#define DIAFONTSELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_font_selector_get_type (), DiaFontSelector) -#define DIAFONTSELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_font_selector_get_type (), DiaFontSelectorClass) -#define IS_DIAFONTSELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, dia_font_selector_get_type ()) +#define DIA_TYPE_FONT_SELECTOR (dia_font_selector_get_type ()) +G_DECLARE_FINAL_TYPE (DiaFontSelector, dia_font_selector, DIA, FONT_SELECTOR, GtkFontButton) +struct _DiaFontSelector { + GtkFontButton parent; +}; -GType dia_font_selector_get_type (void); GtkWidget* dia_font_selector_new (void); void dia_font_selector_set_font (DiaFontSelector *fs, DiaFont *font); -void dia_font_selector_set_preview (DiaFontSelector *fs, gchar *text); DiaFont * dia_font_selector_get_font (DiaFontSelector *fs); #endif /* DIA_FONT_SELECTOR_H */ diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c deleted file mode 100644 index 848867209ff00c2becee6daae5bd7bd6f9a23c3e..0000000000000000000000000000000000000000 --- a/lib/diagdkrenderer.c +++ /dev/null @@ -1,953 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * diagdkrenderer.c - refactoring of the render to gdk facility - * Copyright (C) 2002 Hans Breuer - * - * 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 -#include -#include -#include - -#define PANGO_ENABLE_ENGINE -#include -#include - -#include "diagdkrenderer.h" -#include "dia_image.h" -#include "color.h" -#include "font.h" -#include "text.h" -#include "textline.h" - -#include "time.h" - -#ifdef HAVE_FREETYPE -#include -#include -#endif - - -static int get_width_pixels (DiaRenderer *); -static int get_height_pixels (DiaRenderer *); - -static void begin_render (DiaRenderer *, const Rectangle *update); -static void end_render (DiaRenderer *); - -static void set_linewidth (DiaRenderer *renderer, real linewidth); -static void set_linecaps (DiaRenderer *renderer, LineCaps mode); -static void set_linejoin (DiaRenderer *renderer, LineJoin mode); -static void set_linestyle (DiaRenderer *renderer, LineStyle mode, real length); -static void set_fillstyle (DiaRenderer *renderer, FillStyle mode); - -static void draw_line (DiaRenderer *renderer, - Point *start, Point *end, - Color *color); -static void draw_arc (DiaRenderer *renderer, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color); -static void fill_arc (DiaRenderer *renderer, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color); -static void draw_ellipse (DiaRenderer *renderer, - Point *center, - real width, real height, - Color *fill, Color *stroke); -static void draw_string (DiaRenderer *renderer, - const gchar *text, - Point *pos, - Alignment alignment, - Color *color); -static void draw_text_line (DiaRenderer *renderer, - TextLine *text, - Point *pos, - Alignment alignment, - Color *color); -static void draw_image (DiaRenderer *renderer, - Point *point, - real width, real height, - DiaImage *image); - -static void draw_rect (DiaRenderer *renderer, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); -static void draw_polyline (DiaRenderer *renderer, - Point *points, int num_points, - Color *color); -static void draw_polygon (DiaRenderer *renderer, - Point *points, int num_points, - Color *fill, Color *stroke); - -static real get_text_width (DiaRenderer *renderer, - const gchar *text, int length); - -static void dia_gdk_renderer_class_init (DiaGdkRendererClass *klass); -static void renderer_init (DiaGdkRenderer *renderer, void*); - -static gpointer parent_class = NULL; - -/** Get the type object for the GdkRenderer. - * @return A static GType object describing GdkRenderers. - */ -GType -dia_gdk_renderer_get_type(void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaGdkRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_gdk_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaGdkRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc)renderer_init /* init */ - }; - - object_type = g_type_register_static (DIA_TYPE_RENDERER, - "DiaGdkRenderer", - &object_info, 0); - } - - return object_type; -} - -/** Initialize a renderer object. - * @param renderer A renderer object to initialize. - * @param p Ignored, purpose unknown. - */ -static void -renderer_init(DiaGdkRenderer *renderer, void* p) -{ - renderer->line_width = 1; - renderer->line_style = GDK_LINE_SOLID; - renderer->cap_style = GDK_CAP_BUTT; - renderer->join_style = GDK_JOIN_ROUND; - - renderer->saved_line_style = LINESTYLE_SOLID; - renderer->dash_length = 10; - renderer->dot_length = 2; - - renderer->highlight_color = NULL; - - renderer->current_alpha = 1.0; -} - -/** Clean up a renderer object after use. - * @param object Renderer object to free subobjects from. - */ -static void -renderer_finalize(GObject *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (renderer->gc != NULL) - g_object_unref(renderer->gc); - - if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); - - if (renderer->transform) - g_object_unref (renderer->transform); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/** Initialize members of the renderer class object. This sets up a bunch - * of functions to call for various render functions. - * @param klass The class object to initialize. - */ -static void -dia_gdk_renderer_class_init(DiaGdkRendererClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = renderer_finalize; - - renderer_class->get_width_pixels = get_width_pixels; - renderer_class->get_height_pixels = get_height_pixels; - - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - - renderer_class->set_linewidth = set_linewidth; - renderer_class->set_linecaps = set_linecaps; - renderer_class->set_linejoin = set_linejoin; - renderer_class->set_linestyle = set_linestyle; - renderer_class->set_fillstyle = set_fillstyle; - - renderer_class->draw_line = draw_line; - renderer_class->draw_polygon = draw_polygon; - renderer_class->draw_arc = draw_arc; - renderer_class->fill_arc = fill_arc; - renderer_class->draw_ellipse = draw_ellipse; - - /* use _bezier from DiaRenderer */ - - renderer_class->draw_string = draw_string; - renderer_class->draw_text_line = draw_text_line; - renderer_class->draw_image = draw_image; - - /* medium level functions */ - renderer_class->draw_rect = draw_rect; - renderer_class->draw_polyline = draw_polyline; - - /* Interactive functions */ - renderer_class->get_text_width = get_text_width; -} - -/** Convert Dia color objects into GDK color objects. - * If the highlight color is set, that will be used instead. This allows - * rendering of an object to do highlight rendering. - * @param renderer The renderer to check for highlight color. - * @param col A color object to convert. - * @param gdk_col Resulting GDK convert. - */ -static void -renderer_color_convert(DiaGdkRenderer *renderer, - Color *col, GdkColor *gdk_col) -{ - if (renderer->highlight_color != NULL) { - color_convert(renderer->highlight_color, gdk_col); - } else { - color_convert(col, gdk_col); - } - if (col->alpha != renderer->current_alpha) { - if (col->alpha == 1.0) - gdk_gc_set_fill(renderer->gc, GDK_SOLID); - else { - static gchar bits[9][4] = { - { 0x00, 0x00, 0x00, 0x00 }, /* 0% */ - { 0x20, 0x02, 0x20, 0x02 }, - { 0x22, 0x88, 0x22, 0x88 }, /* 25% */ - { 0x4A, 0xA4, 0x4A, 0xA4 }, - { 0x5A, 0xA5, 0x5A, 0xA5 }, /* 50% */ - { 0x57, 0xBA, 0x57, 0xBA }, - { 0xBE, 0xEB, 0xBE, 0xEB }, /* 75% */ - { 0xEF, 0xFE, 0xEF, 0xFE }, - { 0xFF, 0xFF, 0xFF, 0xFF }, /* 100% */ - }; - GdkBitmap *stipple = gdk_bitmap_create_from_data (NULL, bits[(int)(9*col->alpha+.49)], 4, 4); - gdk_gc_set_stipple (renderer->gc, stipple); - g_object_unref (stipple); - gdk_gc_set_fill(renderer->gc, GDK_STIPPLED); - } - renderer->current_alpha = col->alpha; - } -} - -static void -begin_render (DiaRenderer *object, const Rectangle *update) -{ -} - -static void -end_render (DiaRenderer *object) -{ -} - -static void -set_linewidth (DiaRenderer *object, real linewidth) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - /* 6 pixels wide -> 3 pixels beyond normal obj */ - real border = dia_untransform_length(renderer->transform, 6); - linewidth += border; - } - - /* 0 == hairline **/ - renderer->line_width = - dia_transform_length(renderer->transform, linewidth); - - if (renderer->line_width<=0) - renderer->line_width = 1; /* Minimum 1 pixel. */ - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_linecaps (DiaRenderer *object, LineCaps mode) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - renderer->cap_style = GDK_CAP_ROUND; - } else { - switch(mode) { - case LINECAPS_DEFAULT: - case LINECAPS_BUTT: - renderer->cap_style = GDK_CAP_BUTT; - break; - case LINECAPS_ROUND: - renderer->cap_style = GDK_CAP_ROUND; - break; - case LINECAPS_PROJECTING: - renderer->cap_style = GDK_CAP_PROJECTING; - break; - } - } - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_linejoin (DiaRenderer *object, LineJoin mode) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - if (renderer->highlight_color != NULL) { - renderer->join_style = GDK_JOIN_ROUND; - } else { - switch(mode) { - case LINEJOIN_DEFAULT: - case LINEJOIN_MITER: - renderer->join_style = GDK_JOIN_MITER; - break; - case LINEJOIN_ROUND: - renderer->join_style = GDK_JOIN_ROUND; - break; - case LINEJOIN_BEVEL: - renderer->join_style = GDK_JOIN_BEVEL; - break; - default : - /* invalid mode, just here to set a breakpoint */ - renderer->join_style = GDK_JOIN_ROUND; - break; - } - } - - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -/** Set the dashes for this renderer. - * offset determines where in the pattern the dashes will start. - * It is used by the grid in particular to make the grid dashes line up. - */ -void -dia_gdk_renderer_set_dashes(DiaGdkRenderer *renderer, int offset) -{ - gint8 dash_list[6]; - int hole_width; - - switch(renderer->saved_line_style) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - break; - case LINESTYLE_DASHED: - dash_list[0] = renderer->dash_length; - dash_list[1] = renderer->dash_length; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 2); - break; - case LINESTYLE_DASH_DOT: - hole_width = (renderer->dash_length - renderer->dot_length) / 2; - if (hole_width==0) - hole_width = 1; - dash_list[0] = renderer->dash_length; - dash_list[1] = hole_width; - dash_list[2] = renderer->dot_length; - dash_list[3] = hole_width; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 4); - break; - case LINESTYLE_DASH_DOT_DOT: - hole_width = (renderer->dash_length - 2*renderer->dot_length) / 3; - if (hole_width==0) - hole_width = 1; - dash_list[0] = renderer->dash_length; - dash_list[1] = hole_width; - dash_list[2] = renderer->dot_length; - dash_list[3] = hole_width; - dash_list[4] = renderer->dot_length; - dash_list[5] = hole_width; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 6); - break; - case LINESTYLE_DOTTED: - dash_list[0] = renderer->dot_length; - dash_list[1] = renderer->dot_length; - gdk_gc_set_dashes(renderer->gc, offset, dash_list, 2); - break; - } -} - -static void -set_linestyle (DiaRenderer *object, LineStyle mode, real length) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - /* dot = 10% of len */ - real ddisp_len; - - ddisp_len = - dia_transform_length(renderer->transform, length); - - renderer->dash_length = (int)floor(ddisp_len+0.5); - renderer->dot_length = (int)floor(ddisp_len*0.1+0.5); - - if (renderer->dash_length<=0) - renderer->dash_length = 1; - if (renderer->dash_length>255) - renderer->dash_length = 255; - if (renderer->dot_length<=0) - renderer->dot_length = 1; - if (renderer->dot_length>255) - renderer->dot_length = 255; - - renderer->saved_line_style = mode; - switch(mode) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - renderer->line_style = GDK_LINE_SOLID; - break; - case LINESTYLE_DASHED: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DASH_DOT: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DASH_DOT_DOT: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - case LINESTYLE_DOTTED: - renderer->line_style = GDK_LINE_ON_OFF_DASH; - dia_gdk_renderer_set_dashes(renderer, 0); - break; - } - gdk_gc_set_line_attributes(renderer->gc, - renderer->line_width, - renderer->line_style, - renderer->cap_style, - renderer->join_style); -} - -static void -set_fillstyle (DiaRenderer *object, FillStyle mode) -{ - switch(mode) { - case FILLSTYLE_SOLID: - break; - default: - g_warning("gdk_renderer: Unsupported fill mode specified!\n"); - } -} - -static void -draw_line (DiaRenderer *object, Point *start, Point *end, Color *line_color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - - GdkGC *gc = renderer->gc; - GdkColor color; - int x1,y1,x2,y2; - - if (line_color->alpha == 0.0) - return; - - dia_transform_coords(renderer->transform, start->x, start->y, &x1, &y1); - dia_transform_coords(renderer->transform, end->x, end->y, &x2, &y2); - - renderer_color_convert(renderer, line_color, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_line(renderer->pixmap, gc, - x1, y1, x2, y2); -} - -static void -draw_polygon (DiaRenderer *object, Point *points, int num_points, - Color *fill, Color *stroke) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor color; - GdkPoint *gdk_points; - int i,x,y; - - gdk_points = g_new(GdkPoint, num_points); - - for (i=0;itransform, points[i].x, points[i].y, &x, &y); - gdk_points[i].x = x; - gdk_points[i].y = y; - } - - if (fill && fill->alpha > 0.0) { - renderer_color_convert(renderer, fill, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_polygon(renderer->pixmap, gc, TRUE, gdk_points, num_points); - } - if (stroke && stroke->alpha > 0.0) { - renderer_color_convert(renderer, stroke, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_polygon(renderer->pixmap, gc, FALSE, gdk_points, num_points); - } - g_free(gdk_points); -} - -static void -draw_fill_arc (DiaRenderer *object, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color, - gboolean fill) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - gint top, left, bottom, right; - real dangle; - gboolean counter_clockwise = angle2 > angle1; - - if (color->alpha == 0.0) - return; - - dia_transform_coords(renderer->transform, - center->x - width/2, center->y - height/2, - &left, &top); - dia_transform_coords(renderer->transform, - center->x + width/2, center->y + height/2, - &right, &bottom); - - if ((left>right) || (top>bottom)) - return; - - renderer_color_convert(renderer, color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - /* GDK wants it always counter-clockwise */ - if (counter_clockwise) - dangle = angle2-angle1; - else - dangle = angle1-angle2; - if (dangle<0) - dangle += 360.0; - - gdk_draw_arc(renderer->pixmap, - gc, fill, - left, top, right-left, bottom-top, - (int) (counter_clockwise ? angle1 : angle2) * 64.0, - (int) (dangle * 64.0)); -} -static void -draw_arc (DiaRenderer *object, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - draw_fill_arc (object, center, width, height, angle1, angle2, color, FALSE); -} - -static void -fill_arc (DiaRenderer *object, Point *center, - real width, real height, real angle1, real angle2, - Color *color) -{ - draw_fill_arc (object, center, width, height, angle1, angle2, color, TRUE); -} - -static void -draw_ellipse (DiaRenderer *object, Point *center, - real width, real height, - Color *fill, Color *stroke) -{ - if (fill && fill->alpha > 0.0) - fill_arc(object, center, width, height, 0.0, 360.0, fill); - if (stroke && stroke->alpha > 0.0) - draw_arc(object, center, width, height, 0.0, 360.0, stroke); -} - -/* Draw a highlighted version of a string. - */ -static void -draw_highlighted_string(DiaGdkRenderer *renderer, - PangoLayout *layout, - int x, int y, - GdkColor *color) -{ - gint width, height; - - pango_layout_get_pixel_size(layout, &width, &height); - - gdk_gc_set_foreground(renderer->gc, color); - - gdk_draw_rectangle (renderer->pixmap, - renderer->gc, TRUE, - x-3, y-3, - width+6, height+6); -} - -static void -draw_string (DiaRenderer *object, - const gchar *text, Point *pos, Alignment alignment, - Color *color) -{ - TextLine *text_line = text_line_new(text, object->font, object->font_height); - draw_text_line(object, text_line, pos, alignment, color); - text_line_destroy(text_line); -} - -#ifdef HAVE_FREETYPE -static void -initialize_ft_bitmap(FT_Bitmap *ftbitmap, int width, int height) -{ - int rowstride = 32*((width+31)/31); - guint8 *graybitmap = (guint8*)g_new0(guint8, height*rowstride); - - ftbitmap->rows = height; - ftbitmap->width = width; - ftbitmap->pitch = rowstride; - ftbitmap->buffer = graybitmap; - ftbitmap->num_grays = 256; - ftbitmap->pixel_mode = ft_pixel_mode_grays; - ftbitmap->palette_mode = 0; - ftbitmap->palette = 0; -} -#endif - -/** Draw a TextLine object. - * @param object The renderer object to use for transform and output - * @param text_line The TextLine to render, including font and height. - * @param pos The position to render it at. - * @param color The color to render it with. - */ -static void -draw_text_line (DiaRenderer *object, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - GdkColor gdkcolor; - int x,y; - Point start_pos; - PangoLayout* layout = NULL; - const gchar *text = text_line_get_string(text_line); - int height_pixels; - real font_height = text_line_get_height(text_line); - real scale = dia_transform_length(renderer->transform, 1.0); - - if (text == NULL || *text == '\0') return; /* Don't render empty strings. */ - - point_copy(&start_pos,pos); - - renderer_color_convert(renderer, color, &gdkcolor); - - height_pixels = dia_transform_length(renderer->transform, font_height); - if (height_pixels < 2) { /* "Greeking" instead of making tiny font */ - int width_pixels = dia_transform_length(renderer->transform, - text_line_get_width(text_line)); - gdk_gc_set_foreground(renderer->gc, &gdkcolor); - gdk_gc_set_dashes(renderer->gc, 0, (gint8*)"\1\2", 2); - dia_transform_coords(renderer->transform, start_pos.x, start_pos.y, &x, &y); - gdk_draw_line(renderer->pixmap, renderer->gc, x, y, x + width_pixels, y); - return; - } else { - start_pos.y -= text_line_get_ascent(text_line); - start_pos.x -= text_line_get_alignment_adjustment (text_line, alignment); - - dia_transform_coords(renderer->transform, - start_pos.x, start_pos.y, &x, &y); - - layout = dia_font_build_layout(text, text_line->font, - dia_transform_length(renderer->transform, text_line->height)/20.0); -#if defined(PANGO_VERSION_ENCODE) -# if (PANGO_VERSION >= PANGO_VERSION_ENCODE(1,16,0)) - /* I'd say the former Pango API was broken, i.e. leaky */ -# define HAVE_pango_layout_get_line_readonly -# endif -#endif - text_line_adjust_layout_line (text_line, -#if defined(HAVE_pango_layout_get_line_readonly) - pango_layout_get_line_readonly(layout, 0), -#else - pango_layout_get_line(layout, 0), -#endif - scale/20.0); - - if (renderer->highlight_color != NULL) { - draw_highlighted_string(renderer, layout, x, y, &gdkcolor); - } else { -#if defined HAVE_FREETYPE - { - FT_Bitmap ftbitmap; - int width, height; - GdkPixbuf *rgba = NULL; - - width = dia_transform_length(renderer->transform, - text_line_get_width(text_line)); - height = dia_transform_length(renderer->transform, - text_line_get_height(text_line)); - - if (width > 0) { - int stride; - guchar* pixels; - int i,j; - guint8 *graybitmap; - - initialize_ft_bitmap(&ftbitmap, width, height); - pango_ft2_render_layout(&ftbitmap, layout, 0, 0); - - graybitmap = ftbitmap.buffer; - - rgba = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); - stride = gdk_pixbuf_get_rowstride(rgba); - pixels = gdk_pixbuf_get_pixels(rgba); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - pixels[i*stride+j*4] = gdkcolor.red>>8; - pixels[i*stride+j*4+1] = gdkcolor.green>>8; - pixels[i*stride+j*4+2] = gdkcolor.blue>>8; - pixels[i*stride+j*4+3] = graybitmap[i*ftbitmap.pitch+j]; - } - } - g_free(graybitmap); - - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, rgba, 0, 0, x, y, width, height, GDK_RGB_DITHER_NONE, 0, 0); - - g_object_unref(G_OBJECT(rgba)); - } - } -#else - gdk_gc_set_foreground(renderer->gc, &gdkcolor); - - gdk_draw_layout(renderer->pixmap, renderer->gc, x, y, layout); -#endif - } /* !higlight_color */ - g_object_unref(G_OBJECT(layout)); - } /* !greeking */ -} - -/* Get the width of the given text in cm */ -static real -get_text_width(DiaRenderer *object, - const gchar *text, int length) -{ - real result; - TextLine *text_line; - - if (length != g_utf8_strlen(text, -1)) { - char *othertx; - int ulen; - /* A couple UTF8-chars: æblegrød Š Ť Ž ę ć ń уфхцНОПРЄ є Ґ Њ Ћ Џ */ - ulen = g_utf8_offset_to_pointer(text, length)-text; - if (!g_utf8_validate(text, ulen, NULL)) { - g_warning ("Text at char %d not valid\n", length); - } - othertx = g_strndup(text, ulen); - text_line = text_line_new(othertx, object->font, object->font_height); - } else { - text_line = text_line_new(text, object->font, object->font_height); - } - result = text_line_get_width(text_line); - text_line_destroy(text_line); - return result; -} - -static void -draw_image (DiaRenderer *object, - Point *point, - real width, real height, - DiaImage *image) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - if (renderer->highlight_color != NULL) { - Point lr; - DiaRendererClass *self_class = DIA_RENDERER_GET_CLASS (object); - - lr = *point; - lr.x += width; - lr.y += height; - self_class->draw_rect(object, point, &lr, renderer->highlight_color, NULL); - } else { - int real_width, real_height, real_x, real_y; - const GdkPixbuf *org = dia_image_pixbuf (image); - int org_width = gdk_pixbuf_get_width(org); - int org_height = gdk_pixbuf_get_height(org); - - real_width = ROUND(dia_transform_length(renderer->transform, width)); - real_height = ROUND(dia_transform_length(renderer->transform, height)); - dia_transform_coords(renderer->transform, point->x, point->y, - &real_x, &real_y); - - if (real_width == org_width && real_height == org_height) { - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, (GdkPixbuf *)org, - 0, 0, real_x, real_y, real_width, real_height, - GDK_RGB_DITHER_NORMAL, 0, 0); - } else if (real_width > org_width || real_height > org_height) { - /* don't use dia_image_draw for big zooms, it scales the whole pixbuf even if not needed */ - int sub_width = real_width - (real_x >= 0 ? 0 : -real_x); - int sub_height = real_height - (real_y >= 0 ? 0 : -real_y); - - /* we can also clip to our pixmap size */ - if (get_width_pixels (object) < sub_width) - sub_width = get_width_pixels (object); - if (get_height_pixels (object) < sub_height) - sub_height = get_height_pixels (object); - - if (sub_height > 0 && sub_width > 0) { - GdkPixbuf *scaled = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (org), - gdk_pixbuf_get_has_alpha (org), - gdk_pixbuf_get_bits_per_sample (org), - sub_width, sub_height); - double scale_x = (double)real_width/org_width; - double scale_y = (double)real_height/org_height; - gdk_pixbuf_scale (org, scaled, - 0, 0, sub_width, sub_height, - real_x >= 0 ? 0 : real_x, real_y >= 0 ? 0 : real_y, - scale_x, scale_y, GDK_INTERP_TILES); - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, scaled, - 0, 0, real_x >= 0 ? real_x : 0, real_y >= 0 ? real_y : 0, - sub_width, sub_height, GDK_RGB_DITHER_NORMAL, 0, 0); - g_object_unref (scaled); - } - } else { - /* otherwise still using the caching variant */ - GdkPixbuf *scaled = dia_image_get_scaled_pixbuf (image, real_width, real_height); - if (scaled) { - gdk_draw_pixbuf(renderer->pixmap, renderer->gc, scaled, - 0, 0, real_x, real_y, real_width, real_height, - GDK_RGB_DITHER_NORMAL, 0, 0); - - g_object_unref (scaled); - } - } - } -} - -/* - * medium level functions - */ -static void -draw_rect (DiaRenderer *self, - Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - gint top, bottom, left, right; - - dia_transform_coords(renderer->transform, - ul_corner->x, ul_corner->y, &left, &top); - dia_transform_coords(renderer->transform, - lr_corner->x, lr_corner->y, &right, &bottom); - - if ((left>right) || (top>bottom)) - return; - - if (fill && fill->alpha > 0.0) { - renderer_color_convert(renderer, fill, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - left, top, right-left, bottom-top); - } - if (stroke && stroke->alpha > 0.0) { - renderer_color_convert(renderer, stroke, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, FALSE, - left, top, right-left, bottom-top); - } -} - -static void -draw_polyline (DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self); - GdkGC *gc = renderer->gc; - GdkColor color; - GdkPoint *gdk_points; - int i,x,y; - - if (line_color->alpha == 0.0) - return; - - gdk_points = g_new(GdkPoint, num_points); - - for (i=0;itransform, points[i].x, points[i].y, &x, &y); - gdk_points[i].x = x; - gdk_points[i].y = y; - } - - renderer_color_convert(renderer, line_color, &color); - gdk_gc_set_foreground(gc, &color); - - gdk_draw_lines(renderer->pixmap, gc, gdk_points, num_points); - g_free(gdk_points); -} - -static int -get_width_pixels (DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - int width = 0; - - if (renderer->pixmap) - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), &width, NULL); - - return width; -} - -static int -get_height_pixels (DiaRenderer *object) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object); - int height = 0; - - if (renderer->pixmap) - gdk_drawable_get_size (GDK_DRAWABLE (renderer->pixmap), NULL, &height); - - return height; -} diff --git a/lib/diagdkrenderer.h b/lib/diagdkrenderer.h deleted file mode 100644 index f05ef44bf692e5c910b68559ed5a1ad0d40ab3de..0000000000000000000000000000000000000000 --- a/lib/diagdkrenderer.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef DIA_GDK_RENDERER_H -#define DIA_GDK_RENDERER_H - -#include "diatypes.h" -#include -#include "diarenderer.h" -#include "diatransform.h" - -G_BEGIN_DECLS - -#define DIA_TYPE_GDK_RENDERER (dia_gdk_renderer_get_type ()) -#define DIA_GDK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_GDK_RENDERER, DiaGdkRenderer)) -#define DIA_GDK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_GDK_RENDERER, DiaGdkRendererClass)) -#define DIA_IS_GDK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_GDK_RENDERER)) -#define DIA_GDK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_GDK_RENDERER, DiaGdkRendererClass)) - -GType dia_gdk_renderer_get_type (void) G_GNUC_CONST; -void dia_gdk_renderer_set_dashes(DiaGdkRenderer *renderer, int offset); - -/*! - * \brief Dia's first display renderer - * - * The GdkRenderer is using the native windowing system drawing functions provided by the - * respective GDK backend. With newer GTK+ versions it is deprecated, with GTK+3.0 it is gone. - * - * \extends _DiaRenderer - * - * \todo move the GdkRenderer out of the core into a plug-in (as done with LibartRenderer - */ -struct _DiaGdkRenderer -{ - DiaRenderer parent_instance; - - /*< private >*/ - DiaTransform *transform; /*!< Our link to the display settings */ - GdkPixmap *pixmap; /*!< The pixmap shown in this display */ - guint32 width; /*!< The width of the pixmap in pixels */ - guint32 height; /*!< The height of the pixmap in pixels */ - GdkGC *gc; /*!< The Gdk graphics context used */ - GdkRegion *clip_region; /*!< Clipping region in effect when interactive */ - - /* line attributes: */ - int line_width; - GdkLineStyle line_style; - GdkCapStyle cap_style; - GdkJoinStyle join_style; - - LineStyle saved_line_style; - int dash_length; - int dot_length; - - /** If non-NULL, this rendering is a highlighting with the given color. */ - Color *highlight_color; - - real current_alpha; -}; - -struct _DiaGdkRendererClass -{ - DiaRendererClass parent_class; -}; - -G_END_DECLS - -#endif /* DIA_GDK_RENDERER_H */ diff --git a/lib/diagramdata.c b/lib/diagramdata.c index d031f5d266f53c700e3fedf86e1eb889453cfeb5..14d7b618764bd7d73b31939cca057f2e0e592b51 100644 --- a/lib/diagramdata.c +++ b/lib/diagramdata.c @@ -31,7 +31,6 @@ #include "persistence.h" #include "dynamic_obj.h" -#include "diamarshal.h" static const Rectangle invalid_extents = { -1.0,-1.0,-1.0,-1.0 }; @@ -107,10 +106,14 @@ _diagram_data_selection_changed (DiagramData* dia, int n) static void diagram_data_init(DiagramData *data) { - Color* color = persistence_register_color ("new_diagram_bgcolour", &color_white); + GdkRGBA tmp; + GdkRGBA* color; gboolean compress = persistence_register_boolean ("compress_save", TRUE); Layer *first_layer; + gdk_rgba_parse (&tmp, "#FFFFFF"); + color = persistence_register_color ("new_diagram_bgcolour", &tmp); + data->extents.left = 0.0; data->extents.right = 10.0; data->extents.top = 0.0; @@ -255,37 +258,29 @@ diagram_data_class_init(DiagramDataClass *klass) diagram_data_signals[OBJECT_ADD] = g_signal_new ("object_add", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (DiagramDataClass, object_add), - NULL, NULL, - dia_marshal_VOID__POINTER_POINTER, - G_TYPE_NONE, - 2, - G_TYPE_POINTER, - G_TYPE_POINTER); + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiagramDataClass, object_add), + NULL, NULL, NULL, + G_TYPE_NONE, + 2, G_TYPE_POINTER, G_TYPE_POINTER); diagram_data_signals[OBJECT_REMOVE] = g_signal_new ("object_remove", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (DiagramDataClass, object_remove), - NULL, NULL, - dia_marshal_VOID__POINTER_POINTER, - G_TYPE_NONE, - 2, - G_TYPE_POINTER, - G_TYPE_POINTER); + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiagramDataClass, object_remove), + NULL, NULL, NULL, + G_TYPE_NONE, + 2, G_TYPE_POINTER, G_TYPE_POINTER); diagram_data_signals[SELECTION_CHANGED] = g_signal_new ("selection_changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (DiagramDataClass, selection_changed), - NULL, NULL, - dia_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (DiagramDataClass, selection_changed), + NULL, NULL, NULL, + G_TYPE_NONE, 1, G_TYPE_INT); object_class->finalize = diagram_data_finalize; klass->object_add = _diagram_data_object_add; diff --git a/lib/diagramdata.h b/lib/diagramdata.h index 9ca9cc56e8053fe7e8ddef0db8dce80b212e9019..1e4133e4b3c0436a36a261bacc0421579b6cd892 100644 --- a/lib/diagramdata.h +++ b/lib/diagramdata.h @@ -20,10 +20,10 @@ #define DIAGRAMDATA_H #include +#include #include #include "diatypes.h" -#include "color.h" #include "geometry.h" #include "paper.h" @@ -39,7 +39,7 @@ struct _NewDiagramData { gfloat scaling; gboolean fitto; gint fitwidth, fitheight; - Color bg_color, pagebreak_color, grid_color; + GdkRGBA bg_color, pagebreak_color, grid_color; int compress_save; gchar *unit, *font_unit; }; @@ -65,7 +65,7 @@ struct _DiagramData { Rectangle extents; /*!< The extents of the diagram */ - Color bg_color; /*!< The diagrams background color */ + GdkRGBA bg_color; /*!< The diagrams background color */ PaperInfo paper; /*!< info about the page info for the diagram */ gboolean is_compressed; /*!< TRUE if by default it should be save compressed. diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c index 95648ceaf5959abed6435af9bde5f9f8f446d076..f8bdb1427ce6164e7c29de0847a3555012cf4380 100644 --- a/lib/diaimportrenderer.c +++ b/lib/diaimportrenderer.c @@ -41,38 +41,38 @@ static void set_fillstyle (DiaRenderer *renderer, FillStyle mode); static void draw_line (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image (DiaRenderer *renderer, Point *point, real width, real height, @@ -80,22 +80,22 @@ static void draw_image (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_line_with_arrows (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows (DiaRenderer *renderer, @@ -103,19 +103,19 @@ static void draw_arc_with_arrows (DiaRenderer *renderer, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -124,7 +124,7 @@ static void draw_bezier_with_arrows (DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -268,8 +268,8 @@ set_fillstyle (DiaRenderer *renderer, FillStyle mode) static void _apply_style (DiaImportRenderer *self, DiaObject *obj, - const Color *fill, - const Color *stroke, + const GdkRGBA *fill, + const GdkRGBA *stroke, real radius) { GPtrArray *props = g_ptr_array_new (); @@ -310,7 +310,7 @@ _push_object (DiaImportRenderer *self, DiaObject *obj) * \memberof _DiaImportRenderer */ static void -draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) +draw_line (DiaRenderer *renderer, Point *start, Point *end, GdkRGBA *color) { Point points[2]; points[0] = *start; @@ -361,7 +361,7 @@ _make_arc (Point *center, static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = _make_arc (center, width, height, angle1, angle2); @@ -377,7 +377,7 @@ draw_arc (DiaRenderer *renderer, Point *center, static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_box (ul_corner->x, ul_corner->y, @@ -396,7 +396,7 @@ draw_rect (DiaRenderer *renderer, static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { #if 0 /* does not work till 'Standard - Arc' supports filling */ DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); @@ -422,7 +422,7 @@ fill_arc (DiaRenderer *renderer, Point *center, static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_ellipse (center->x - width / 2, center->y - height / 2, width, height); @@ -439,7 +439,7 @@ draw_ellipse (DiaRenderer *renderer, Point *center, static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_text (pos->x, pos->y); @@ -494,7 +494,7 @@ draw_image (DiaRenderer *renderer, static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_bezierline (numpoints, points, NULL, NULL); @@ -511,8 +511,8 @@ draw_bezier (DiaRenderer *renderer, static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object; @@ -531,7 +531,7 @@ draw_beziergon (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color) + GdkRGBA *color) { draw_rounded_polyline (renderer, points, num_points, color, 0.0); } @@ -544,7 +544,7 @@ draw_polyline (DiaRenderer *renderer, static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_polyline (num_points, points, NULL, NULL); @@ -560,7 +560,7 @@ draw_rounded_polyline (DiaRenderer *renderer, static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_polygon (num_points, points); @@ -576,7 +576,7 @@ draw_polygon (DiaRenderer *renderer, static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer); DiaObject *object = create_standard_box (ul_corner->x, ul_corner->y, @@ -596,7 +596,7 @@ draw_line_with_arrows(DiaRenderer *renderer, Point *startpoint, Point *endpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -619,7 +619,7 @@ static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -638,7 +638,7 @@ static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) @@ -661,7 +661,7 @@ draw_arc_with_arrows (DiaRenderer *renderer, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -688,7 +688,7 @@ draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c index 04197970fb849a15c2ae4d7aee75b1103b1e771d..64e4d784b05469c0a703d3ae8f1485e90bd26db5 100644 --- a/lib/diainteractiverenderer.c +++ b/lib/diainteractiverenderer.c @@ -31,7 +31,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface) iface->draw_pixel_line = NULL; iface->draw_pixel_rect = NULL; iface->fill_pixel_rect = NULL; - iface->copy_to_window = NULL; + iface->paint = NULL; iface->set_size = NULL; iface->draw_object_highlighted = NULL; } @@ -78,3 +78,34 @@ dia_renderer_set_size (DiaRenderer* renderer, gpointer window, irenderer->set_size (renderer, window, width, height); } +void +dia_interactive_renderer_paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height) +{ + DiaInteractiveRendererInterface *irenderer = + DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); + + g_return_if_fail (irenderer != NULL); + g_return_if_fail (irenderer->paint != NULL); + + irenderer->paint (renderer, ctx, width, height); +} + +void +dia_interactive_renderer_set_selection (DiaRenderer *renderer, + gboolean has_selection, + double x, + double y, + double width, + double height) +{ + DiaInteractiveRendererInterface *irenderer = + DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); + + g_return_if_fail (irenderer != NULL); + g_return_if_fail (irenderer->set_selection != NULL); + + irenderer->set_selection (renderer, has_selection, x, y, width, height); +} diff --git a/lib/dialib.c b/lib/dialib.c index 2d99e66cc52e805e5257b4bc28a82634df3cc2f0..4850fac43b4ee82ddfb8ea3c119f74daf2304cef 100644 --- a/lib/dialib.c +++ b/lib/dialib.c @@ -29,7 +29,6 @@ #include "dialib.h" #include "message.h" #include "utils.h" -#include "color.h" #include "object.h" #include "dia_dirs.h" #include "properties.h" /* stdprops_init() */ @@ -112,14 +111,10 @@ libdia_init (guint flags) if (flags & DIA_INTERACTIVE) { char *diagtkrc; - gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); - diagtkrc = dia_config_filename("diagtkrc"); dia_log_message ("Config from %s", diagtkrc); gtk_rc_parse(diagtkrc); g_free(diagtkrc); - - color_init(); } initialized = TRUE; diff --git a/lib/dialinechooser.c b/lib/dialinechooser.c deleted file mode 100644 index ff360db6aaa3e0e827480211ca9c5a36e86324a4..0000000000000000000000000000000000000000 --- a/lib/dialinechooser.c +++ /dev/null @@ -1,363 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialinechooser.c -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "intl.h" -#include "widgets.h" -#include "dialinechooser.h" - -static const char *button_menu_key = "dia-button-menu"; -static const char *menuitem_enum_key = "dia-menuitem-value"; - - -/* --------------- DiaLinePreview -------------------------------- */ - -static void dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle); - -static void dia_line_preview_class_init (DiaLinePreviewClass *klass); -static void dia_line_preview_init (DiaLinePreview *arrow); -static gint dia_line_preview_expose (GtkWidget *widget, - GdkEventExpose *event); - -GType -dia_line_preview_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaLinePreviewClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_preview_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaLinePreview), - 0, - (GInstanceInitFunc) dia_line_preview_init - }; - - type = g_type_register_static (GTK_TYPE_MISC, "DiaLinePreview", &info, 0); - } - - return type; -} - -static void -dia_line_preview_class_init (DiaLinePreviewClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->expose_event = dia_line_preview_expose; -} - -static void -dia_line_preview_init (DiaLinePreview *line) -{ -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_has_window (GTK_WIDGET (line), FALSE); -#else - GTK_WIDGET_SET_FLAGS (line, GTK_NO_WINDOW); -#endif - - GTK_WIDGET (line)->requisition.width = 30 + GTK_MISC (line)->xpad * 2; - GTK_WIDGET (line)->requisition.height = 15 + GTK_MISC (line)->ypad * 2; - - line->lstyle = LINESTYLE_SOLID; -} - -GtkWidget * -dia_line_preview_new (LineStyle lstyle) -{ - DiaLinePreview *line = g_object_new(DIA_TYPE_LINE_PREVIEW, NULL); - - line->lstyle = lstyle; - return GTK_WIDGET(line); -} - -static void -dia_line_preview_set(DiaLinePreview *line, LineStyle lstyle) -{ - if (line->lstyle != lstyle) { - line->lstyle = lstyle; -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(GTK_WIDGET(line))) -#else - if (GTK_WIDGET_DRAWABLE(line)) -#endif - gtk_widget_queue_draw(GTK_WIDGET(line)); - } -} - -static gint -dia_line_preview_expose(GtkWidget *widget, GdkEventExpose *event) -{ - DiaLinePreview *line = DIA_LINE_PREVIEW(widget); - GtkMisc *misc = GTK_MISC(widget); - gint width, height; - gint x, y; - GdkWindow *win; - GdkGC *gc; - GdkGCValues gcvalues; - gint8 dash_list[6]; - int line_width = 2; - GtkStyle *style; - -#if GTK_CHECK_VERSION(2,18,0) - if (gtk_widget_is_drawable(widget)) { -#else - if (GTK_WIDGET_DRAWABLE(widget)) { -#endif - width = widget->allocation.width - misc->xpad * 2; - height = widget->allocation.height - misc->ypad * 2; - x = (widget->allocation.x + misc->xpad); - y = (widget->allocation.y + misc->ypad); - - win = gtk_widget_get_window (widget); - style = gtk_widget_get_style (widget); - gc = style->fg_gc[widget->state]; - - /* increase line width */ - gdk_gc_get_values(gc, &gcvalues); - switch (line->lstyle) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_SOLID, - gcvalues.cap_style, gcvalues.join_style); - break; - case LINESTYLE_DASHED: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); - dash_list[0] = 10; - dash_list[1] = 10; - gdk_gc_set_dashes(gc, 0, dash_list, 2); - break; - case LINESTYLE_DASH_DOT: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); - dash_list[0] = 10; - dash_list[1] = 4; - dash_list[2] = 2; - dash_list[3] = 4; - gdk_gc_set_dashes(gc, 0, dash_list, 4); - break; - case LINESTYLE_DASH_DOT_DOT: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); - dash_list[0] = 10; - dash_list[1] = 2; - dash_list[2] = 2; - dash_list[3] = 2; - dash_list[4] = 2; - dash_list[5] = 2; - gdk_gc_set_dashes(gc, 0, dash_list, 6); - break; - case LINESTYLE_DOTTED: - gdk_gc_set_line_attributes(gc, line_width, GDK_LINE_ON_OFF_DASH, - gcvalues.cap_style, gcvalues.join_style); - dash_list[0] = 2; - dash_list[1] = 2; - gdk_gc_set_dashes(gc, 0, dash_list, 2); - break; - } - gdk_draw_line(win, gc, x, y+height/2, x+width, y+height/2); - gdk_gc_set_line_attributes(gc, gcvalues.line_width, gcvalues.line_style, - gcvalues.cap_style, gcvalues.join_style); - } - return TRUE; -} - - -/* ------- Code for DiaLineChooser ---------------------- */ - -static void dia_line_chooser_class_init (DiaLineChooserClass *klass); -static void dia_line_chooser_init (DiaLineChooser *arrow); - -GType -dia_line_chooser_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (DiaLineChooserClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_chooser_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (DiaLineChooser), - 0, - (GInstanceInitFunc) dia_line_chooser_init - }; - - type = g_type_register_static (GTK_TYPE_BUTTON, "DiaLineChooser", &info, 0); - } - - return type; -} - -static gint -dia_line_chooser_event(GtkWidget *widget, GdkEvent *event) -{ - if (event->type == GDK_BUTTON_PRESS && event->button.button == 1) { - GtkMenu *menu = g_object_get_data(G_OBJECT(widget), button_menu_key); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, - event->button.button, event->button.time); - return TRUE; - } - return FALSE; -} - -static void -dia_line_chooser_class_init (DiaLineChooserClass *class) -{ - GtkWidgetClass *widget_class; - - widget_class = GTK_WIDGET_CLASS(class); - widget_class->event = dia_line_chooser_event; -} - -static void -dia_line_chooser_dialog_response (GtkWidget *dialog, - gint response_id, - DiaLineChooser *lchooser) -{ - LineStyle new_style; - real new_dash; - - if (response_id == GTK_RESPONSE_OK) { - dia_line_style_selector_get_linestyle(lchooser->selector, - &new_style, &new_dash); - if (new_style != lchooser->lstyle || new_dash != lchooser->dash_length) { - lchooser->lstyle = new_style; - lchooser->dash_length = new_dash; - dia_line_preview_set(lchooser->preview, new_style); - if (lchooser->callback) - (* lchooser->callback)(new_style, new_dash, lchooser->user_data); - } - } else { - dia_line_style_selector_set_linestyle(lchooser->selector, - lchooser->lstyle, - lchooser->dash_length); - } - gtk_widget_hide(lchooser->dialog); -} - -static void -dia_line_chooser_change_line_style(GtkMenuItem *mi, DiaLineChooser *lchooser) -{ - LineStyle lstyle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mi), - menuitem_enum_key)); - - dia_line_chooser_set_line_style(lchooser, lstyle, lchooser->dash_length); -} - -void -dia_line_chooser_set_line_style(DiaLineChooser *lchooser, - LineStyle lstyle, - real dashlength) -{ - if (lstyle != lchooser->lstyle) { - dia_line_preview_set(lchooser->preview, lstyle); - lchooser->lstyle = lstyle; - dia_line_style_selector_set_linestyle(lchooser->selector, lchooser->lstyle, - lchooser->dash_length); - } - lchooser->dash_length = dashlength; - if (lchooser->callback) - (* lchooser->callback)(lchooser->lstyle, lchooser->dash_length, - lchooser->user_data); -} - -static void -dia_line_chooser_init (DiaLineChooser *lchooser) -{ - GtkWidget *wid; - GtkWidget *menu, *mi, *ln; - gint i; - - lchooser->lstyle = LINESTYLE_SOLID; - lchooser->dash_length = DEFAULT_LINESTYLE_DASHLEN; - - wid = dia_line_preview_new(LINESTYLE_SOLID); - gtk_container_add(GTK_CONTAINER(lchooser), wid); - gtk_widget_show(wid); - lchooser->preview = DIA_LINE_PREVIEW(wid); - - lchooser->dialog = gtk_dialog_new_with_buttons(_("Line Style Properties"), - NULL, - GTK_DIALOG_NO_SEPARATOR, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(lchooser->dialog), - GTK_RESPONSE_OK); - g_signal_connect(G_OBJECT(lchooser->dialog), "response", - G_CALLBACK(dia_line_chooser_dialog_response), lchooser); - - wid = dia_line_style_selector_new(); - gtk_container_set_border_width(GTK_CONTAINER(wid), 5); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(lchooser->dialog))), wid, - TRUE, TRUE, 0); - gtk_widget_show(wid); - lchooser->selector = DIALINESTYLESELECTOR(wid); - - menu = gtk_menu_new(); - g_object_ref_sink(GTK_OBJECT(menu)); - g_object_set_data_full(G_OBJECT(lchooser), button_menu_key, menu, - (GDestroyNotify)g_object_unref); - for (i = 0; i <= LINESTYLE_DOTTED; i++) { - mi = gtk_menu_item_new(); - g_object_set_data(G_OBJECT(mi), menuitem_enum_key, GINT_TO_POINTER(i)); - ln = dia_line_preview_new(i); - gtk_container_add(GTK_CONTAINER(mi), ln); - gtk_widget_show(ln); - g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(dia_line_chooser_change_line_style), lchooser); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - } - mi = gtk_menu_item_new_with_label(_("Details\342\200\246")); - g_signal_connect_swapped(G_OBJECT(mi), "activate", - G_CALLBACK(gtk_widget_show), lchooser->dialog); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); -} - -GtkWidget * -dia_line_chooser_new(DiaChangeLineCallback callback, - gpointer user_data) -{ - DiaLineChooser *chooser = g_object_new(DIA_TYPE_LINE_CHOOSER, NULL); - - chooser->callback = callback; - chooser->user_data = user_data; - - return GTK_WIDGET(chooser); -} - diff --git a/lib/dialinechooser.h b/lib/dialinechooser.h deleted file mode 100644 index 5a70104f25539130593c3b1e9ea54b8858eacbad..0000000000000000000000000000000000000000 --- a/lib/dialinechooser.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialinechooser.h -- Copyright (C) 1999 James Henstridge. - * Copyright (C) 2004 Hubert Figuiere - * - * 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 DIALINECHOOSER_H -#define DIALINECHOOSER_H - -#include "arrows.h" - -#include - -/* --------------- DiaLinePreview -------------------------------- */ -GType dia_line_preview_get_type (void); - -#define DIA_TYPE_LINE_PREVIEW (dia_line_preview_get_type ()) -#define DIA_LINE_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LINE_PREVIEW, DiaLinePreview)) -#define DIA_LINE_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LINE_PREVIEW, DiaLinePreviewClass)) -#define DIA_IS_LINE_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LINE_PREVIEW)) -#define DIA_IS_LINE_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_LINE_PREVIEW)) -#define DIA_LINE_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LINE_PREVIEW, DiaLinePreviewClass)) - -typedef struct _DiaLinePreview DiaLinePreview; -typedef struct _DiaLinePreviewClass DiaLinePreviewClass; - -struct _DiaLinePreview -{ - GtkMisc misc; - LineStyle lstyle; -}; - -struct _DiaLinePreviewClass -{ - GtkMiscClass parent_class; -}; - -GtkWidget *dia_line_preview_new (LineStyle lstyle); - - -/* ------- Code for DiaLineChooser ---------------------- */ -GType dia_line_chooser_get_type (void); - -#define DIA_TYPE_LINE_CHOOSER (dia_line_chooser_get_type ()) -#define DIA_LINE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LINE_CHOOSER, DiaLineChooser)) -#define DIA_LINE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LINE_CHOOSER, DiaLineChooserClass)) -#define DIA_IS_LINE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LINE_CHOOSER)) -#define DIA_IS_LINE_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DIA_TYPE_LINE_CHOOSER)) -#define DIA_LINE_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LINE_CHOOSER, DiaLineChooserClass)) - -typedef struct _DiaLineChooser DiaLineChooser; -typedef struct _DiaLineChooserClass DiaLineChooserClass; - -typedef void (*DiaChangeLineCallback) (LineStyle lstyle, real dash_length, - gpointer user_data); - -struct _DiaLineChooser -{ - GtkButton button; - DiaLinePreview *preview; - LineStyle lstyle; - real dash_length; - - DiaChangeLineCallback callback; - gpointer user_data; - - GtkWidget *dialog; - DiaLineStyleSelector *selector; -}; - -struct _DiaLineChooserClass -{ - GtkButtonClass parent_class; -}; - -void dia_line_chooser_set_line_style(DiaLineChooser *lchooser, - LineStyle style, - real dashlength); -GtkWidget *dia_line_chooser_new (DiaChangeLineCallback callback, - gpointer user_data); - - -#endif /* DIALINECHOOSER_H */ diff --git a/lib/dialinestyleselector.c b/lib/dialinestyleselector.c deleted file mode 100644 index 4c6c4794f82b27a243c253b432426c0949b94b7b..0000000000000000000000000000000000000000 --- a/lib/dialinestyleselector.c +++ /dev/null @@ -1,223 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 - -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu, ... */ -#include - -#include "intl.h" -#include "dialinechooser.h" -#include "widgets.h" - -/************* DiaLineStyleSelector: ***************/ -struct _DiaLineStyleSelector -{ - GtkVBox vbox; - - GtkOptionMenu *omenu; - GtkMenu *linestyle_menu; - GtkLabel *lengthlabel; - GtkSpinButton *dashlength; - -}; - -struct _DiaLineStyleSelectorClass -{ - GtkVBoxClass parent_class; -}; - -enum { - DLS_VALUE_CHANGED, - DLS_LAST_SIGNAL -}; - -static guint dls_signals[DLS_LAST_SIGNAL] = { 0 }; - -static void -dia_line_style_selector_class_init (DiaLineStyleSelectorClass *class) -{ - dls_signals[DLS_VALUE_CHANGED] - = g_signal_new("value-changed", - G_TYPE_FROM_CLASS(class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -set_linestyle_sensitivity(DiaLineStyleSelector *fs) -{ - int state; - GtkWidget *menuitem; - if (!fs->linestyle_menu) return; - menuitem = gtk_menu_get_active(fs->linestyle_menu); - state = (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "user_data")) - != LINESTYLE_SOLID); - - gtk_widget_set_sensitive(GTK_WIDGET(fs->lengthlabel), state); - gtk_widget_set_sensitive(GTK_WIDGET(fs->dashlength), state); -} - -static void -linestyle_type_change_callback(GtkMenu *menu, gpointer data) -{ - set_linestyle_sensitivity(DIALINESTYLESELECTOR(data)); - g_signal_emit(DIALINESTYLESELECTOR(data), - dls_signals[DLS_VALUE_CHANGED], 0); -} - -static void -linestyle_dashlength_change_callback(GtkSpinButton *sb, gpointer data) -{ - g_signal_emit(DIALINESTYLESELECTOR(data), - dls_signals[DLS_VALUE_CHANGED], 0); -} - -static void -dia_line_style_selector_init (DiaLineStyleSelector *fs) -{ - GtkWidget *menu; - GtkWidget *menuitem, *ln; - GtkWidget *label; - GtkWidget *length; - GtkWidget *box; - GtkAdjustment *adj; - gint i; - static const gchar *_line_style_names[LINESTYLE_DOTTED+1]; - static gboolean once = FALSE; - - if (!once) { - _line_style_names[LINESTYLE_SOLID] = Q_("line|Solid"); - _line_style_names[LINESTYLE_DASHED] = Q_("line|Dashed"); - _line_style_names[LINESTYLE_DASH_DOT] = Q_("line|Dash-Dot"); - _line_style_names[LINESTYLE_DASH_DOT_DOT] = Q_("line|Dash-Dot-Dot"); - _line_style_names[LINESTYLE_DOTTED] = Q_("line|Dotted"); - once = TRUE; - } - - menu = gtk_option_menu_new(); - fs->omenu = GTK_OPTION_MENU(menu); - - menu = gtk_menu_new (); - fs->linestyle_menu = GTK_MENU(menu); - - for (i = 0; i <= LINESTYLE_DOTTED; i++) { - menuitem = gtk_menu_item_new(); - gtk_widget_set_tooltip_text(menuitem, _line_style_names[i]); - g_object_set_data(G_OBJECT(menuitem), "user_data", GINT_TO_POINTER(i)); - ln = dia_line_preview_new(i); - gtk_container_add(GTK_CONTAINER(menuitem), ln); - gtk_widget_show(ln); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - gtk_widget_show(menuitem); - } - - gtk_menu_set_active(GTK_MENU (menu), DEFAULT_LINESTYLE); - gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->omenu), menu); - g_signal_connect(GTK_OBJECT(menu), "selection-done", - G_CALLBACK(linestyle_type_change_callback), fs); - - gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->omenu), FALSE, TRUE, 0); - gtk_widget_show(GTK_WIDGET(fs->omenu)); - - box = gtk_hbox_new(FALSE,0); - /* fs->sizebox = GTK_HBOX(box); */ - - label = gtk_label_new(_("Dash length: ")); - fs->lengthlabel = GTK_LABEL(label); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - gtk_widget_show(label); - - adj = (GtkAdjustment *)gtk_adjustment_new(0.1, 0.00, 10.0, 0.1, 1.0, 0); - length = gtk_spin_button_new(adj, DEFAULT_LINESTYLE_DASHLEN, 2); - gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(length), TRUE); - gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(length), TRUE); - fs->dashlength = GTK_SPIN_BUTTON(length); - gtk_box_pack_start(GTK_BOX (box), length, TRUE, TRUE, 0); - gtk_widget_show (length); - - g_signal_connect(G_OBJECT(length), "changed", - G_CALLBACK(linestyle_dashlength_change_callback), fs); - - set_linestyle_sensitivity(fs); - gtk_box_pack_start(GTK_BOX(fs), box, TRUE, TRUE, 0); - gtk_widget_show(box); - -} - -GType -dia_line_style_selector_get_type (void) -{ - static GType dfs_type = 0; - - if (!dfs_type) { - static const GTypeInfo dfs_info = { - sizeof (DiaLineStyleSelectorClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_line_style_selector_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaLineStyleSelector), - 0, /* n_preallocs */ - (GInstanceInitFunc) dia_line_style_selector_init, - }; - - dfs_type = g_type_register_static (gtk_vbox_get_type (), - "DiaLineStyleSelector", - &dfs_info, 0); - } - - return dfs_type; -} - -GtkWidget * -dia_line_style_selector_new () -{ - return GTK_WIDGET ( g_object_new (dia_line_style_selector_get_type (), NULL)); -} - - -void -dia_line_style_selector_get_linestyle(DiaLineStyleSelector *fs, - LineStyle *ls, real *dl) -{ - GtkWidget *menuitem; - void *align; - - menuitem = gtk_menu_get_active(fs->linestyle_menu); - align = g_object_get_data(G_OBJECT(menuitem), "user_data"); - *ls = GPOINTER_TO_INT(align); - if (dl!=NULL) { - *dl = gtk_spin_button_get_value(fs->dashlength); - } -} - -void -dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, - LineStyle linestyle, real dashlength) -{ - gtk_menu_set_active(GTK_MENU (as->linestyle_menu), linestyle); - gtk_option_menu_set_history (GTK_OPTION_MENU(as->omenu), linestyle); -/* TODO restore this later */ -/* gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(gtk_menu_get_active(GTK_MENU(as->linestyle_menu))), TRUE);*/ - set_linestyle_sensitivity(DIALINESTYLESELECTOR(as)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(as->dashlength), dashlength); -} diff --git a/lib/dialogs.c b/lib/dialogs.c index 1f2cc3681b0669c2fe9453bc3660e26c38012fb3..e4438a505dc0290fe0924e6bc56a5a63831dc287 100644 --- a/lib/dialogs.c +++ b/lib/dialogs.c @@ -67,7 +67,7 @@ dialog_add_spinbutton(GtkWidget *dialog, char *title, real min, real max, real decimals) { GtkAdjustment *limits = GTK_ADJUSTMENT(gtk_adjustment_new(10.0, min, max, 1.0, 10.0, 0)); - GtkWidget *box = gtk_hbox_new(FALSE, 10); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); GtkWidget *label = gtk_label_new(title); GtkWidget *entry = gtk_spin_button_new(limits, 10.0, decimals); diff --git a/lib/diamarshal.list b/lib/diamarshal.list deleted file mode 100644 index 67e179da8b20c2d6cf9f0a5f6ea33902c9a100ba..0000000000000000000000000000000000000000 --- a/lib/diamarshal.list +++ /dev/null @@ -1,31 +0,0 @@ -# see glib-genmarshal(1) for a detailed description of the file format, -# possible parameter types are: -# VOID indicates no return type, or no extra -# parameters. if VOID is used as the parameter -# list, no additional parameters may be present. -# BOOLEAN for boolean types (gboolean) -# CHAR for signed char types (gchar) -# UCHAR for unsigned char types (guchar) -# INT for signed integer types (gint) -# UINT for unsigned integer types (guint) -# LONG for signed long integer types (glong) -# ULONG for unsigned long integer types (gulong) -# ENUM for enumeration types (gint) -# FLAGS for flag enumeration types (guint) -# FLOAT for single-precision float types (gfloat) -# DOUBLE for double-precision float types (gdouble) -# STRING for string types (gchar*) -# BOXED for boxed (anonymous but reference counted) types (GBoxed*) -# POINTER for anonymous pointer types (gpointer) -# PARAM for GParamSpec or derived types (GParamSpec*) -# OBJECT for GObject or derived types (GObject*) -# NONE deprecated alias for VOID -# BOOL deprecated alias for BOOLEAN - -VOID: VOID -VOID: OBJECT -VOID: OBJECT,UINT,POINTER -VOID: OBJECT,OBJECT -VOID: INT -VOID: POINTER,POINTER -VOID: STRING, FLAGS diff --git a/lib/diapathrenderer.c b/lib/diapathrenderer.c index 1a836c0d873a065e9c961e4b6147e599358940c6..730066c46b7aed2433edfde373c057dd405b5b03 100644 --- a/lib/diapathrenderer.c +++ b/lib/diapathrenderer.c @@ -47,8 +47,8 @@ struct _DiaPathRenderer GPtrArray *pathes; - Color stroke; - Color fill; + GdkRGBA stroke; + GdkRGBA fill; PathLastOp last_op; }; @@ -113,8 +113,8 @@ dia_path_renderer_finalize (GObject *object) */ static GArray * _get_current_path (DiaPathRenderer *self, - const Color *stroke, - const Color *fill) + const GdkRGBA *stroke, + const GdkRGBA *fill) { GArray *path; /* creating a new path for every new color */ @@ -304,7 +304,7 @@ _path_arc_segment (GArray *path, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *points = _get_current_path (renderer, line_colour, NULL); @@ -316,7 +316,7 @@ draw_line(DiaRenderer *self, static void _polyline(DiaRenderer *self, Point *points, int num_points, - const Color *fill, const Color *stroke) + const GdkRGBA *fill, const GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); int i; @@ -339,7 +339,7 @@ _polyline(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { _polyline (self, points, num_points, NULL, line_colour); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -351,7 +351,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); @@ -372,7 +372,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -448,7 +448,7 @@ _arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - const Color *stroke, const Color *fill) + const GdkRGBA *stroke, const GdkRGBA *fill) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -464,7 +464,7 @@ draw_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, NULL); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -478,7 +478,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, NULL, color); } @@ -547,7 +547,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -557,7 +557,7 @@ draw_ellipse (DiaRenderer *self, static void _bezier (DiaRenderer *self, BezPoint *points, int numpoints, - const Color *fill, const Color *stroke) + const GdkRGBA *fill, const GdkRGBA *stroke) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); GArray *path = _get_current_path (renderer, stroke, fill); @@ -581,7 +581,7 @@ static void draw_bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier(self, points, numpoints, NULL, color); _remove_duplicated_path (DIA_PATH_RENDERER (self)); @@ -594,8 +594,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { _bezier(self, points, numpoints, fill, stroke); } @@ -647,7 +647,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { if (text && strlen(text)) { Text *text_obj; @@ -677,8 +677,8 @@ draw_image(DiaRenderer *self, { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); /* warning colors ;) */ - Color stroke = { 1.0, 0.0, 0.0, 0.75 }; - Color fill = { 1.0, 1.0, 0.0, 0.5 }; + GdkRGBA stroke = { 1.0, 0.0, 0.0, 0.75 }; + GdkRGBA fill = { 1.0, 1.0, 0.0, 0.5 }; GArray *path = _get_current_path (renderer, &stroke, &fill); Point to = *point; @@ -707,7 +707,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaPathRenderer *renderer = DIA_PATH_RENDERER (self); real rx = (lr_corner->x - ul_corner->x) / 2; diff --git a/lib/diapatternselector.c b/lib/diapatternselector.c index 7b92a66f80ad8564814be37d33011263ca3a288c..47ff7f6d6b23258734272f1868961416c27ad8d7 100644 --- a/lib/diapatternselector.c +++ b/lib/diapatternselector.c @@ -29,7 +29,7 @@ typedef struct _DiaPatternSelector DiaPatternSelector; typedef struct _DiaPatternSelectorClass DiaPatternSelectorClass; struct _DiaPatternSelector { - GtkHBox hbox; /*!< just containing the other two widgets */ + GtkBox hbox; /*!< just containing the other two widgets */ GtkWidget *state; /*!< button reflecting the state */ GtkWidget *menu_button; /*!< pop-up menu button to select presets */ @@ -37,7 +37,7 @@ struct _DiaPatternSelector }; struct _DiaPatternSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -73,7 +73,7 @@ dia_pattern_selector_class_init (DiaPatternSelectorClass *klass) static GType dia_pattern_selector_get_type (void); -G_DEFINE_TYPE (DiaPatternSelector, dia_pattern_selector, GTK_TYPE_HBOX); +G_DEFINE_TYPE (DiaPatternSelector, dia_pattern_selector, GTK_TYPE_BOX); /* GUI stuff - not completely done yet - add/remove color stops @@ -117,7 +117,7 @@ static DiaPattern * _create_preset_pattern (guint n) { DiaPattern *pat; - Color color; + GdkRGBA color; g_return_val_if_fail (n < G_N_ELEMENTS (_pattern_presets), NULL); switch (_pattern_presets[n].type) { @@ -181,6 +181,9 @@ _popup_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) static void dia_pattern_selector_init (DiaPatternSelector *ps) { + gtk_orientable_set_orientation (GTK_ORIENTABLE (ps), + GTK_ORIENTATION_HORIZONTAL); + ps->state = gtk_toggle_button_new_with_label(_("No")); g_signal_connect(G_OBJECT(ps->state), "toggled", G_CALLBACK (_pattern_toggled), ps); diff --git a/lib/diarenderer.c b/lib/diarenderer.c index 7ed882ab3701d06685f1e14466232f0228d82ee5..065420500450843f2912a2e9a13569e4309f9ee5 100644 --- a/lib/diarenderer.c +++ b/lib/diarenderer.c @@ -66,38 +66,38 @@ static void set_font (DiaRenderer *renderer, DiaFont *font, real height); static void draw_line (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image (DiaRenderer *renderer, Point *point, real width, real height, @@ -105,7 +105,7 @@ static void draw_image (DiaRenderer *renderer, static void draw_text (DiaRenderer *renderer, Text *text); static void draw_text_line (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color); + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color); static void draw_rotated_text (DiaRenderer *renderer, Text *text, Point *center, real angle); static void draw_rotated_image (DiaRenderer *renderer, @@ -116,24 +116,24 @@ static void draw_rotated_image (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static real get_text_width (DiaRenderer *renderer, const gchar *text, int length); static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_line_with_arrows (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows (DiaRenderer *renderer, @@ -141,19 +141,19 @@ static void draw_arc_with_arrows (DiaRenderer *renderer, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -162,7 +162,7 @@ static void draw_bezier_with_arrows (DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -262,7 +262,7 @@ draw_object (DiaRenderer *renderer, /* visual complaints - not completely correct */ Point pt[4]; Rectangle *bb = &object->bounding_box; - Color red = { 1.0, 0.0, 0.0, 1.0 }; + GdkRGBA red = { 1.0, 0.0, 0.0, 1.0 }; pt[0].x = matrix->xx * bb->left + matrix->xy * bb->top + matrix->x0; pt[0].y = matrix->yx * bb->left + matrix->yy * bb->top + matrix->y0; @@ -458,7 +458,7 @@ set_fillstyle (DiaRenderer *renderer, FillStyle mode) * \memberof _DiaRenderer \pure */ static void -draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) +draw_line (DiaRenderer *renderer, Point *start, Point *end, GdkRGBA *color) { g_warning ("%s::draw_line not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -475,11 +475,11 @@ draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color) static void draw_polygon (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i; - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; g_return_if_fail (num_points > 1); g_return_if_fail (color != NULL); @@ -503,7 +503,7 @@ draw_polygon (DiaRenderer *renderer, static void draw_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { g_warning ("%s::draw_arc not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -516,7 +516,7 @@ draw_arc (DiaRenderer *renderer, Point *center, static void fill_arc (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { g_warning ("%s::fill_arc not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -528,7 +528,7 @@ fill_arc (DiaRenderer *renderer, Point *center, static void draw_ellipse (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { g_warning ("%s::draw_ellipse not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -560,7 +560,7 @@ set_font (DiaRenderer *renderer, DiaFont *font, real height) static void draw_string (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { g_warning ("%s::draw_string not implemented!", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer))); @@ -685,7 +685,7 @@ draw_rotated_text (DiaRenderer *renderer, Text *text, &g_array_index (path, BezPoint, 0), path->len, &text->color); } else { - Color magenta = { 1.0, 0.0, 1.0, 1.0 }; + GdkRGBA magenta = { 1.0, 0.0, 1.0, 1.0 }; Point pt = center ? *center : text->position; DiaMatrix m = { 1, 0, 0, 1, pt.x, pt.y }; DiaMatrix t = { 1, 0, 0, 1, -pt.x, -pt.y }; @@ -738,7 +738,7 @@ draw_rotated_image (DiaRenderer *renderer, */ static void draw_text_line (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color) + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color) { DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text_line_get_font(text_line), @@ -932,7 +932,7 @@ approximate_bezier (BezierApprox *bezier, static void draw_bezier (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { BezierApprox *bezier; @@ -967,7 +967,7 @@ draw_bezier (DiaRenderer *renderer, static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { BezierApprox *bezier; @@ -1005,7 +1005,7 @@ draw_beziergon (DiaRenderer *renderer, static void draw_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (DIA_RENDERER_GET_CLASS(renderer)->draw_polygon == &draw_polygon) { g_warning ("%s::draw_rect and draw_polygon not implemented!", @@ -1035,7 +1035,7 @@ draw_rect (DiaRenderer *renderer, static void draw_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i; @@ -1078,7 +1078,7 @@ calculate_min_radius( Point *p1, Point *p2, Point *p3 ) static void draw_rounded_polyline (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer); int i = 0; @@ -1140,7 +1140,7 @@ draw_rounded_polyline (DiaRenderer *renderer, static void draw_rounded_rect (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); /* clip radius per axis to use the full API;) */ @@ -1219,7 +1219,7 @@ draw_line_with_arrows(DiaRenderer *renderer, Point *startpoint, Point *endpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1277,7 +1277,7 @@ static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1354,7 +1354,7 @@ static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) @@ -1573,7 +1573,7 @@ draw_arc_with_arrows (DiaRenderer *renderer, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1694,7 +1694,7 @@ draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -1870,7 +1870,7 @@ dia_renderer_get_height_pixels (DiaRenderer *renderer) * \relates _DiaRenderer */ void -bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i; gboolean needs_split = FALSE; @@ -1936,7 +1936,7 @@ bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *colo * \relates _DiaRenderer */ G_GNUC_UNUSED static void -bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i, n = 0; /* first draw the fills */ @@ -1978,7 +1978,7 @@ bezier_render_fill_old (DiaRenderer *renderer, BezPoint *pts, int total, Color * * \relates _DiaRenderer */ void -bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color) +bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color) { int i, n = 0; for (i = 1; i < total; ++i) { diff --git a/lib/diarenderer.h b/lib/diarenderer.h index 368becac123c5f43f26a1479c317236a839ce6b3..92be0d4e0a2c7cbefe65c6f009e097871904f87e 100644 --- a/lib/diarenderer.h +++ b/lib/diarenderer.h @@ -20,6 +20,7 @@ #ifndef DIA_RENDERER_H #define DIA_RENDERER_H +#include "attributes.h" #include "diatypes.h" #include @@ -130,35 +131,35 @@ struct _DiaRendererClass /*! Draw a line from start to end, using color and the current line style */ void (*draw_line) (DiaRenderer *renderer, Point *start, Point *end, - Color *color); + GdkRGBA *color); /*! the polygon is filled using the current fill type and stroked with the current line style */ void (*draw_polygon) (DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /*! Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle. It's counter-clockwise if angle2>angle1 */ void (*draw_arc) (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); /*! Same a DrawArcFunc except the arc is filled (a pie-chart) */ void (*fill_arc) (DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); /*! Draw an ellipse, given its center and the bounding box */ void (*draw_ellipse) (DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /*! Print a string at pos, using the current font */ void (*draw_string) (DiaRenderer *renderer, const gchar *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); /*! Draw an image, given its bounding box */ void (*draw_image) (DiaRenderer *renderer, Point *point, @@ -173,28 +174,28 @@ struct _DiaRendererClass void (*draw_bezier) (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); /*! Fill and/or stroke a closed bezier */ void (*draw_beziergon) (DiaRenderer *renderer, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); /*! Draw a line joining multiple points, using color and the current line style */ void (*draw_polyline) (DiaRenderer *renderer, Point *points, int num_points, - Color *color); + GdkRGBA *color); /*! Print a Text. It holds its own information. */ void (*draw_text) (DiaRenderer *renderer, Text *text); /*! Print a TextLine. It holds its own font/size information. */ void (*draw_text_line) (DiaRenderer *renderer, - TextLine *text_line, Point *pos, Alignment alignment, Color *color); + TextLine *text_line, Point *pos, Alignment alignment, GdkRGBA *color); /*! Draw a rectangle, given its upper-left and lower-right corners */ void (*draw_rect) (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /* * Highest level functions, probably only to be implemented by @@ -203,18 +204,18 @@ struct _DiaRendererClass /*! Draw a rounded rectangle, given its upper-left and lower-right corners */ void (*draw_rounded_rect) (DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); /*! Draw a line joining multiple points, using color and the current line style with rounded corners between segments */ void (*draw_rounded_polyline) (DiaRenderer *renderer, Point *points, int num_points, - Color *color, real radius ); + GdkRGBA *color, real radius ); /*! Highest level function doing specific arrow positioning */ void (*draw_line_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, real line_width, - Color *line_color, + GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); /*! Highest level function doing specific arrow positioning */ @@ -222,20 +223,20 @@ struct _DiaRendererClass Point *start, Point *end, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*! Highest level function doing specific arrow positioning */ void (*draw_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); @@ -244,7 +245,7 @@ struct _DiaRendererClass BezPoint *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*! allows to adapt DiaObject implementations to certain renderer capabilities */ @@ -294,26 +295,45 @@ struct _DiaInteractiveRendererInterface /*! Draw a line from start to end, using color and the current line style */ void (*draw_pixel_line) (DiaRenderer *renderer, int x1, int y1, int x2, int y2, - Color *color); + GdkRGBA *color); /*! Draw a rectangle, given its upper-left and lower-right corners in pixels. */ void (*draw_pixel_rect) (DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); /*! Fill a rectangle, given its upper-left and lower-right corners in pixels. */ void (*fill_pixel_rect) (DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); - /*! Copy already rendered content to the given window */ - void (*copy_to_window) (DiaRenderer *renderer, - gpointer window, - int x, int y, int width, int height); + GdkRGBA *color); + /*! Copy already rendered content to the given context */ + void (*paint) (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height); /*! Support for drawing selected objects highlighted */ void (*draw_object_highlighted) (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type); + /* Draw a selection box */ + void (*set_selection) (DiaRenderer *renderer, + gboolean has_selection, + double x, + double y, + double width, + double height); }; GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST; + +void dia_interactive_renderer_paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height); +void dia_interactive_renderer_set_selection (DiaRenderer *renderer, + gboolean has_selection, + double x, + double y, + double width, + double height); /*! * \brief Size adjustment to the given window * \memberof DiaInteractiveRendererInterface @@ -331,8 +351,8 @@ int dia_renderer_get_width_pixels (DiaRenderer*); int dia_renderer_get_height_pixels (DiaRenderer*); /* Some standalone render helper functiions */ -void bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color); -void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color); +void bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color); +void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, GdkRGBA *color); /*! \brief query DIA_RENDER_BOUNDING_BOXES */ int render_bounding_boxes (void); diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c index e5c6e0767176adad3eeec54be0940c4a022675ef..77983389e96f30e7e3965920cc1165efcd2004bc 100644 --- a/lib/diasvgrenderer.c +++ b/lib/diasvgrenderer.c @@ -55,7 +55,7 @@ g_ascii_formatd(buf,sizeof(buf),"%g",(d)*renderer->scale) static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour); + Point *pos, Alignment alignment, GdkRGBA *colour); /*! * \brief Initialize to SVG rendering defaults @@ -85,7 +85,7 @@ _make_pattern_key (const DiaPattern *pattern) static gboolean _color_stop_do (real ofs, - const Color *col, + const GdkRGBA *col, gpointer user_data) { xmlNodePtr parent = (xmlNodePtr)user_data; @@ -391,8 +391,8 @@ set_pattern(DiaRenderer *self, DiaPattern *pattern) */ static const gchar * get_draw_style(DiaSvgRenderer *renderer, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { static GString *str = NULL; gchar linewidth_buf[DTOSTR_BUF_SIZE]; @@ -446,7 +446,7 @@ get_draw_style(DiaSvgRenderer *renderer, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -473,7 +473,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -502,7 +502,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -534,7 +534,7 @@ draw_polygon (DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -563,7 +563,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -606,7 +606,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -650,7 +650,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -674,8 +674,8 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke, + GdkRGBA *fill, + GdkRGBA *stroke, gboolean closed) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); @@ -748,7 +748,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *stroke) + GdkRGBA *stroke) { _bezier(self, points, numpoints, NULL, stroke, FALSE); } @@ -761,13 +761,13 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); /* optimize for stroke-width==0 && fill==stroke */ if ( fill && stroke && renderer->linewidth == 0.0 - && memcmp(fill, stroke, sizeof(Color))==0) + && memcmp(fill, stroke, sizeof(GdkRGBA))==0) stroke = NULL; _bezier(self, points, numpoints, fill, stroke, TRUE); } @@ -780,7 +780,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { TextLine *text_line = text_line_new(text, self->font, self->font_height); draw_text_line(self, text_line, pos, alignment, colour); @@ -793,7 +793,7 @@ draw_string(DiaRenderer *self, */ static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour) + Point *pos, Alignment alignment, GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -907,7 +907,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; diff --git a/lib/diasvgrenderer.h b/lib/diasvgrenderer.h index 2821dd2cce17e838c180a71647375bc73a739a8a..d398da79babb975d346716271b4960d2ad90ea4c 100644 --- a/lib/diasvgrenderer.h +++ b/lib/diasvgrenderer.h @@ -48,7 +48,7 @@ struct _DiaSvgRendererClass { DiaRendererClass parent_class; - const gchar* (*get_draw_style) (DiaSvgRenderer*, Color* fill, Color *stroke); + const gchar* (*get_draw_style) (DiaSvgRenderer*, GdkRGBA* fill, GdkRGBA *stroke); }; G_END_DECLS diff --git a/lib/diatransformrenderer.c b/lib/diatransformrenderer.c index f48a24be26637ccf925ae2cc7470475002055621..60465e6a484a04433eb5720a940690f79ce1d10b 100644 --- a/lib/diatransformrenderer.c +++ b/lib/diatransformrenderer.c @@ -195,7 +195,7 @@ set_fillstyle(DiaRenderer *self, FillStyle mode) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { Point p1 = *start; Point p2 = *end; @@ -211,7 +211,7 @@ draw_line(DiaRenderer *self, static void _polyline(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { Point *a_pts = g_newa (Point, num_points); @@ -236,7 +236,7 @@ _polyline(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *stroke) + GdkRGBA *stroke) { _polyline (self, points, num_points, NULL, stroke, FALSE); } @@ -247,7 +247,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _polyline (self, points, num_points, fill, stroke, TRUE); } @@ -255,7 +255,7 @@ draw_polygon(DiaRenderer *self, static void _bezier (DiaRenderer *self, BezPoint *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { BezPoint *a_pts = g_newa (BezPoint, num_points); @@ -280,7 +280,7 @@ _arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *stroke, Color *fill) + GdkRGBA *stroke, GdkRGBA *fill) { GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint)); path_build_arc (path, center, width, height, angle1, angle2, stroke == NULL); @@ -296,7 +296,7 @@ draw_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, NULL); } @@ -309,7 +309,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, NULL, color); } @@ -321,7 +321,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint)); path_build_ellipse (path, center, width, height); @@ -336,7 +336,7 @@ static void draw_bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier(self, points, numpoints, NULL, color, FALSE); } @@ -348,8 +348,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { _bezier(self, points, numpoints, fill, stroke, TRUE); } @@ -449,7 +449,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { if (text && strlen(text)) { Text *text_obj; diff --git a/lib/diatypes.h b/lib/diatypes.h index 4748c461ec5ed3c778827cf5852cd6841e0430d4..1693aa844003145d3fa4adf13c2fb49a16da0a98 100644 --- a/lib/diatypes.h +++ b/lib/diatypes.h @@ -46,9 +46,6 @@ typedef struct _PolyBBExtras PolyBBExtras; typedef struct _LineBBExtras LineBBExtras; typedef struct _ElementBBExtras ElementBBExtras; -/* In color.h: */ -typedef struct _Color Color; - /* In connection.h: */ typedef struct _Connection Connection; @@ -62,10 +59,6 @@ typedef struct _BezierCreateData BezierCreateData; /* In dia_image.h: */ typedef struct _DiaImage DiaImage; -/* In diagdkrenderer.h: */ -typedef struct _DiaGdkRenderer DiaGdkRenderer; -typedef struct _DiaGdkRendererClass DiaGdkRendererClass; - /* In diamenu.h: */ typedef struct _DiaMenuItem DiaMenuItem; typedef struct _DiaMenu DiaMenu; @@ -164,7 +157,6 @@ typedef struct _PropDescSArrayExtra PropDescSArrayExtra; typedef struct _PropOffset PropOffset; /* In sheet.h: */ -typedef struct _Sheet Sheet; typedef struct _SheetObject SheetObject; /* In text.h: */ @@ -179,14 +171,8 @@ typedef struct _TextAttributes TextAttributes; /* In widgets.h: */ typedef struct _DiaSizeSelector DiaSizeSelector; typedef struct _DiaSizeSelectorClass DiaSizeSelectorClass; -typedef struct _DiaFontSelector DiaFontSelector; -typedef struct _DiaFontSelectorClass DiaFontSelectorClass; -typedef struct _DiaLineStyleSelector DiaLineStyleSelector; -typedef struct _DiaLineStyleSelectorClass DiaLineStyleSelectorClass; typedef struct _DiaColorSelector DiaColorSelector; typedef struct _DiaColorSelectorClass DiaColorSelectorClass; -typedef struct _DiaArrowSelector DiaArrowSelector; -typedef struct _DiaArrowSelectorClass DiaArrowSelectorClass; typedef struct _DiaFileSelector DiaFileSelector; typedef struct _DiaFileSelectorClass DiaFileSelectorClass; diff --git a/lib/geometry.c b/lib/geometry.c index 8f4810c8653be7f1d743b81abe021da6fcbe74f9..c6972e2cdea09d6d08684a922dec5839081c1b9d 100644 --- a/lib/geometry.c +++ b/lib/geometry.c @@ -26,7 +26,6 @@ /* include normal versions of the inlined functions here ... */ #undef G_INLINE_FUNC #define G_INLINE_FUNC extern -#define G_CAN_INLINE 1 #include "geometry.h" #include "object.h" diff --git a/lib/layer.c b/lib/layer.c index e1a9636b900e8d6c3c96f546ce0a32dd2b31fc0d..b4131f193edadc1296dfd6804895fa6533f65f5b 100644 --- a/lib/layer.c +++ b/lib/layer.c @@ -93,7 +93,7 @@ layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update, if (update==NULL || rectangle_intersects(update, &obj->bounding_box)) { if ((render_bounding_boxes()) && (renderer->is_interactive)) { Point p1, p2; - Color col; + GdkRGBA col; p1.x = obj->bounding_box.left; p1.y = obj->bounding_box.top; p2.x = obj->bounding_box.right; diff --git a/lib/libdia.def b/lib/libdia.def index 8d9b5b9a9452dcb48b3bcd7079143d16a5b89ec2..d509f767091f3e833bede99ca5e788d102148487 100644 --- a/lib/libdia.def +++ b/lib/libdia.def @@ -77,12 +77,6 @@ EXPORTS change_list_add change_list_create - color_convert - color_equals - color_init - color_new_rgb - color_new_rgba - composite_add_attribute composite_find_attribute @@ -190,20 +184,7 @@ EXPORTS dia_alignment_selector_get_alignment dia_alignment_selector_new dia_alignment_selector_set_alignment - dia_arrow_chooser_new - dia_arrow_chooser_set_arrow - dia_arrow_chooser_get_arrow_type - dia_arrow_chooser_get_type - dia_arrow_selector_get_arrow - dia_arrow_selector_get_type - dia_arrow_selector_new - dia_arrow_selector_set_arrow dia_assert_true - dia_color_selector_get_color -; dia_color_selector_get_type - dia_color_selector_new - dia_color_selector_set_color - dia_color_selector_set_use_alpha dia_config_filename dia_context_add_message @@ -214,20 +195,6 @@ EXPORTS dia_context_reset dia_context_set_filename - dia_dynamic_menu_get_type - dia_dynamic_menu_new - dia_dynamic_menu_new_stringbased - dia_dynamic_menu_new_listbased - dia_dynamic_menu_new_stringlistbased - dia_dynamic_menu_add_default_entry - dia_dynamic_menu_add_entry - dia_dynamic_menu_set_sorting_method - dia_dynamic_menu_reset - dia_dynamic_menu_set_max_entries - dia_dynamic_menu_set_columns - dia_dynamic_menu_get_entry - dia_dynamic_menu_select_entry - dia_file_selector_get_file dia_file_selector_get_type dia_file_selector_new @@ -323,10 +290,10 @@ EXPORTS dia_line_chooser_new - dia_line_style_selector_get_linestyle - dia_line_style_selector_get_type - dia_line_style_selector_new - dia_line_style_selector_set_linestyle + dia_line_chooser_get_linestyle + dia_line_chooser_get_type + dia_line_chooser_new + dia_line_chooser_set_linestyle dia_line_chooser_get_type dia_line_chooser_set_line_style @@ -800,8 +767,6 @@ EXPORTS libdia_init dia_log_message - dia_marshal_VOID__OBJECT_UINT_POINTER - dia_matrix_is_identity dia_matrix_get_angle_and_scales dia_matrix_set_angle_and_scales diff --git a/lib/list/dia-list-data.c b/lib/list/dia-list-data.c new file mode 100644 index 0000000000000000000000000000000000000000..ae58450d013cf204014a722f5a0c806f25ee8623 --- /dev/null +++ b/lib/list/dia-list-data.c @@ -0,0 +1,47 @@ +#include +#include "dia-list-data.h" + +G_DEFINE_INTERFACE (DiaListData, dia_list_data, G_TYPE_OBJECT) + +enum { + CHANGED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static const gchar * +dia_list_data_default_format (DiaListData *self) +{ + return G_OBJECT_TYPE_NAME (self); +} + +static void +dia_list_data_default_init (DiaListDataInterface *iface) +{ + iface->format = dia_list_data_default_format; + + signals[CHANGED] = g_signal_new ("changed", + G_TYPE_FROM_CLASS (iface), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +void +dia_list_data_changed (DiaListData *self) +{ + g_signal_emit (G_OBJECT (self), signals[CHANGED], 0); +} + +const gchar * +dia_list_data_format (DiaListData *self) +{ + DiaListDataInterface *iface; + + g_return_val_if_fail (DIA_IS_LIST_DATA (self), NULL); + + iface = DIA_LIST_DATA_GET_IFACE (self); + g_return_val_if_fail (iface->format != NULL, NULL); + + return iface->format (self); +} diff --git a/lib/list/dia-list-data.h b/lib/list/dia-list-data.h new file mode 100644 index 0000000000000000000000000000000000000000..f92576e8d1f93a77df0c37d4888f7492bd8e9264 --- /dev/null +++ b/lib/list/dia-list-data.h @@ -0,0 +1,18 @@ +#include + +#ifndef LIST_DATA_H +#define LIST_DATA_H + +#define DIA_TYPE_LIST_DATA (dia_list_data_get_type ()) +G_DECLARE_INTERFACE (DiaListData, dia_list_data, DIA, LIST_DATA, GObject) + +struct _DiaListDataInterface { + GTypeInterface parent_iface; + + const gchar * (* format) (DiaListData *self); +}; + +void dia_list_data_changed (DiaListData *self); +const gchar *dia_list_data_format (DiaListData *self); + +#endif diff --git a/lib/list/dia-list-row.c b/lib/list/dia-list-row.c new file mode 100644 index 0000000000000000000000000000000000000000..6a715bb806d1c8b963b40ce8e965ed6aa0ba8ae1 --- /dev/null +++ b/lib/list/dia-list-row.c @@ -0,0 +1,175 @@ +#include "dia-list-data.h" +#include "dia-list-row.h" +#include "dia_dirs.h" + +struct _DiaListRow { + GtkListBoxRow parent; + + GtkWidget *title; + + DiaListData *data; + DiaListStore *model; +}; + +G_DEFINE_TYPE (DiaListRow, dia_list_row, GTK_TYPE_LIST_BOX_ROW) + +enum { + PROP_DATA = 1, + PROP_MODEL, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +static void +dia_list_row_finalize (GObject *object) +{ + DiaListRow *self = DIA_LIST_ROW (object); + + g_clear_object (&self->data); + g_clear_object (&self->model); +} + +static void +display_op (DiaListData *op, + DiaListRow *row) +{ + gtk_label_set_label (GTK_LABEL (row->title), + dia_list_data_format (op)); +} + +static void +dia_list_row_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaListRow *self = DIA_LIST_ROW (object); + switch (property_id) { + case PROP_DATA: + self->data = g_value_dup_object (value); + g_signal_connect (G_OBJECT (self->data), "changed", + G_CALLBACK (display_op), self); + display_op (self->data, self); + break; + case PROP_MODEL: + self->model = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_list_row_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaListRow *self = DIA_LIST_ROW (object); + switch (property_id) { + case PROP_DATA: + g_value_set_object (value, self->data); + break; + case PROP_MODEL: + g_value_set_object (value, self->model); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +move_up (DiaListRow *self) +{ + int index; + + index = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (self)); + + g_object_ref (self->data); + dia_list_store_remove (self->model, self->data); + dia_list_store_insert (self->model, self->data, index - 1); + g_object_unref (self->data); +} + +static void +move_down (DiaListRow *self) +{ + int index; + + index = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (self)); + + g_object_ref (self->data); + dia_list_store_remove (self->model, self->data); + dia_list_store_insert (self->model, self->data, index + 1); + g_object_unref (self->data); +} + +static void +dia_list_row_class_init (DiaListRowClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = dia_list_row_finalize; + object_class->set_property = dia_list_row_set_property; + object_class->get_property = dia_list_row_get_property; + + properties[PROP_DATA] = + g_param_spec_object ("data", + "Data", + "Data this row represents", + DIA_TYPE_LIST_DATA, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + properties[PROP_MODEL] = + g_param_spec_object ("model", + "Model", + "Model this row belongs to", + DIA_TYPE_LIST_STORE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-list-row.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaListRow, title); + gtk_widget_class_bind_template_callback (widget_class, move_up); + gtk_widget_class_bind_template_callback (widget_class, move_down); + + g_object_unref (template_file); +} + +static void +dia_list_row_init (DiaListRow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GtkWidget * +dia_list_row_new (DiaListData *data, + DiaListStore *model) +{ + return g_object_new (DIA_TYPE_LIST_ROW, + "data", data, + "model", model, + NULL); +} + +DiaListData * +dia_list_row_get_data (DiaListRow *self) +{ + return g_object_ref (self->data); +} diff --git a/lib/list/dia-list-row.h b/lib/list/dia-list-row.h new file mode 100644 index 0000000000000000000000000000000000000000..a3c34d820c838cef9401246867a858d13892722d --- /dev/null +++ b/lib/list/dia-list-row.h @@ -0,0 +1,14 @@ +#include +#include "dia-list-data.h" +#include "dia-list-store.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_LIST_ROW (dia_list_row_get_type ()) +G_DECLARE_FINAL_TYPE (DiaListRow, dia_list_row, DIA, LIST_ROW, GtkListBoxRow) + +GtkWidget *dia_list_row_new (DiaListData *data, + DiaListStore *model); +DiaListData *dia_list_row_get_data (DiaListRow *self); + +G_END_DECLS diff --git a/lib/list/dia-list-store.c b/lib/list/dia-list-store.c new file mode 100644 index 0000000000000000000000000000000000000000..fa438bec170ed5aef7aefa020fcc106ce69d5cfc --- /dev/null +++ b/lib/list/dia-list-store.c @@ -0,0 +1,200 @@ +#include "dia-list-store.h" +#include +#include + +struct _DiaListStore +{ + GObject parent_instance; + + GList *data; +}; + +enum +{ + PROP_0, + PROP_ITEM_TYPE, + N_PROPERTIES +}; + +enum { + CHANGED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static void dia_list_store_iface_init (GListModelInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (DiaListStore, dia_list_store, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, dia_list_store_iface_init)); + +static void +dia_list_store_dispose (GObject *object) +{ + DiaListStore *store = DIA_LIST_STORE (object); + + g_list_free_full (store->data, g_object_unref); + + G_OBJECT_CLASS (dia_list_store_parent_class)->dispose (object); +} + +static void +dia_list_store_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_ITEM_TYPE: + g_value_set_gtype (value, DIA_TYPE_LIST_DATA); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +dia_list_store_class_init (DiaListStoreClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = dia_list_store_dispose; + object_class->get_property = dia_list_store_get_property; + + g_object_class_install_property (object_class, PROP_ITEM_TYPE, + g_param_spec_gtype ("item-type", "", "", DIA_TYPE_LIST_DATA, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + signals[CHANGED] = g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_TYPE_LIST_DATA); +} + +static GType +dia_list_store_get_item_type (GListModel *list) +{ + return DIA_TYPE_LIST_DATA; +} + +static guint +dia_list_store_get_n_items (GListModel *list) +{ + DiaListStore *store = DIA_LIST_STORE (list); + + return g_list_length (store->data); +} + +static gpointer +dia_list_store_get_item (GListModel *list, + guint position) +{ + DiaListStore *store = DIA_LIST_STORE (list); + DiaListData *item; + + item = g_list_nth_data (store->data, position); + + if (item) + return g_object_ref (item); + else + return NULL; +} + +static void +dia_list_store_iface_init (GListModelInterface *iface) +{ + iface->get_item_type = dia_list_store_get_item_type; + iface->get_n_items = dia_list_store_get_n_items; + iface->get_item = dia_list_store_get_item; +} + +static void +dia_list_store_init (DiaListStore *store) +{ + store->data = NULL; +} + +DiaListStore * +dia_list_store_new () +{ + return g_object_new (DIA_TYPE_LIST_STORE, NULL); +} + +static void +bubble_change (DiaListData *itm, + DiaListStore *self) +{ + g_signal_emit (self, signals[CHANGED], 0, itm); +} + +void +dia_list_store_insert (DiaListStore *store, + DiaListData *item, + int index) +{ + g_return_if_fail (DIA_IS_LIST_STORE (store)); + + if (index >= g_list_length (store->data)) { + dia_list_store_add (store, item); + return; + } + + store->data = g_list_insert (store->data, g_object_ref (item), index); + g_signal_connect (G_OBJECT (item), "changed", G_CALLBACK (bubble_change), store); + + g_list_model_items_changed (G_LIST_MODEL (store), index, 0, 1); +} + +void +dia_list_store_add (DiaListStore *store, + DiaListData *item) +{ + guint n_items; + + g_return_if_fail (DIA_IS_LIST_STORE (store)); + + n_items = g_list_length (store->data); + store->data = g_list_append (store->data, g_object_ref (item)); + g_signal_connect (G_OBJECT (item), "changed", G_CALLBACK (bubble_change), store); + + g_list_model_items_changed (G_LIST_MODEL (store), n_items, 0, 1); +} + +void +dia_list_store_remove (DiaListStore *store, + DiaListData *item) +{ + int index; + + g_return_if_fail (DIA_IS_LIST_STORE (store)); + + index = g_list_index (store->data, item); + store->data = g_list_remove (store->data, item); + g_signal_handlers_disconnect_by_func (G_OBJECT (item), G_CALLBACK (bubble_change), store); + g_object_unref (item); + + g_list_model_items_changed (G_LIST_MODEL (store), index, 1, 0); +} + +void +dia_list_store_empty (DiaListStore *store) +{ + guint n_items; + GList *list; + + g_return_if_fail (DIA_IS_LIST_STORE (store)); + + n_items = g_list_length (store->data); + list = store->data; + while (list) { + g_signal_handlers_disconnect_by_func (G_OBJECT (list->data), G_CALLBACK (bubble_change), store); + g_object_unref (list->data); + list = g_list_next (list); + } + g_list_free (store->data); + store->data = NULL; + + g_list_model_items_changed (G_LIST_MODEL (store), 0, n_items, 0); +} diff --git a/lib/list/dia-list-store.h b/lib/list/dia-list-store.h new file mode 100644 index 0000000000000000000000000000000000000000..e0691d0bb8b37f597877507e95df3f8db8f04068 --- /dev/null +++ b/lib/list/dia-list-store.h @@ -0,0 +1,24 @@ +#include +#include "dia-list-data.h" + +#ifndef LIST_STORE_H +#define LIST_STORE_H + +G_BEGIN_DECLS + +#define DIA_TYPE_LIST_STORE (dia_list_store_get_type ()) +G_DECLARE_FINAL_TYPE (DiaListStore, dia_list_store, DIA, LIST_STORE, GObject) + +DiaListStore *dia_list_store_new (void); +void dia_list_store_insert (DiaListStore *store, + DiaListData *item, + int index); +void dia_list_store_add (DiaListStore *store, + DiaListData *item); +void dia_list_store_remove (DiaListStore *store, + DiaListData *item); +void dia_list_store_empty (DiaListStore *store); + +G_END_DECLS + +#endif diff --git a/lib/makefile.mingw b/lib/makefile.mingw index fe62690dd8c853571061981c07de6f622b17b129..979ce3d1293d810ca580a657bade5717ee0dea15 100644 --- a/lib/makefile.mingw +++ b/lib/makefile.mingw @@ -13,7 +13,6 @@ PKG_CFLAGS = -I .. \ $(GTK2_CFLAGS) \ -DWIN32 $(LIBXML2_CFLAGS) \ $(ZLIB_CFLAGS) \ - -I $(LIBART)/.. \ $(INTL_CFLAGS) \ -DLIBDIA_COMPILATION @@ -39,10 +38,8 @@ OBJECTS = \ dia_svg.o \ dia_xml.o \ diagramdata.o \ - diagdkrenderer.o \ diagtkfontsel.o \ diainteractiverenderer.o \ - dialibartrenderer.o \ diarenderer.o \ diatransform.o \ dynamic_obj.o \ diff --git a/lib/makefile.msc b/lib/makefile.msc index 01ba2aba35edc403421f8734c86cc19d30c5660f..a4e68d38f372c6d270df8207c4ac565c507a9f88 100644 --- a/lib/makefile.msc +++ b/lib/makefile.msc @@ -21,7 +21,6 @@ DEFINES = \ # in GTK_CFLAGS: $(GLIB_CFLAGS) PKG_LINK = $(GTK2_LIBS) $(PANGOWIN32_LIBS) $(GLIB_LIBS) \ - $(PANGOCAIRO_LIBS) \ !IFDEF USEFT2 $(PANGOFT2_LIBS) \ !ENDIF @@ -70,7 +69,6 @@ OBJECTS = \ dia_xml.obj \ diaerror.obj \ diagramdata.obj \ - diagdkrenderer.obj \ diaimportrenderer.obj \ diainteractiverenderer.obj \ diarenderer.obj \ @@ -122,7 +120,6 @@ OBJECTS = \ propobject.obj \ propoffsets.obj \ propregistry.obj \ - render_pixmap.obj \ sheet.obj \ standard-path.obj \ text.obj \ diff --git a/lib/pattern.c b/lib/pattern.c index 06f1b29880ba95ccf5f1ccf5753912447ff48830..a7f69b696b1946d3d9b9e234aa0a7ef2f10a9f42 100644 --- a/lib/pattern.c +++ b/lib/pattern.c @@ -21,7 +21,6 @@ #include #include "diatypes.h" #include "pattern.h" -#include "color.h" #include typedef struct _DiaPatternClass DiaPatternClass; @@ -30,7 +29,7 @@ static GType _dia_pattern_get_type (void) G_GNUC_CONST; typedef struct _ColorStop { - Color color; + GdkRGBA color; real offset; } ColorStop; @@ -120,10 +119,10 @@ dia_pattern_set_point (DiaPattern *self, real x, real y) if (self->type == DIA_RADIAL_GRADIENT) { real dist = distance_ellipse_point (&self->start, self->radius*2, self->radius*2, 0.0, &self->other); if (dist > 0) { - /* If the point defined by fx and fy lies outside the circle defined - * by cx, cy and r, then the user agent shall set the focal point to - * the intersection of the line from (cx, cy) to (fx, fy) with the - * circle defined by cx, cy and r + /* If the point defined by �fx� and �fy� lies outside the circle defined + * by �cx�, �cy� and �r�, then the user agent shall set the focal point to + * the intersection of the line from (�cx�, �cy�) to (�fx�, �fy�) with the + * circle defined by �cx�, �cy� and �r� */ Point p1 = self->start; Point p2 = self->other; @@ -191,7 +190,7 @@ dia_pattern_get_radius (DiaPattern *self, real *r) * \ingroup DiaPattern */ void -dia_pattern_add_color (DiaPattern *self, real pos, const Color *color) +dia_pattern_add_color (DiaPattern *self, real pos, const GdkRGBA *color) { ColorStop stop; real former = 0.0; @@ -226,7 +225,7 @@ dia_pattern_set_pattern (DiaPattern *self, DiaPattern *pat) * \ingroup DiaPattern */ void -dia_pattern_get_fallback_color (DiaPattern *self, Color *color) +dia_pattern_get_fallback_color (DiaPattern *self, GdkRGBA *color) { g_return_if_fail (self != NULL && color != NULL); if (self->stops->len > 0) diff --git a/lib/pattern.h b/lib/pattern.h index 5989d0b11e74050c33d7338f3985020f43e75e93..21a86765a593072fc2d788ee9664853d58fe4801 100644 --- a/lib/pattern.h +++ b/lib/pattern.h @@ -20,10 +20,12 @@ */ #ifndef PATTERN_H #define PATTERN_H - + +#include "attributes.h" #include "diatypes.h" #include "geometry.h" #include +#include G_BEGIN_DECLS @@ -45,15 +47,15 @@ DiaPattern *dia_pattern_new (DiaPatternType pt, guint flags, real x, real y); void dia_pattern_set_radius (DiaPattern *self, real r); void dia_pattern_set_point (DiaPattern *pattern, real x, real y); -void dia_pattern_add_color (DiaPattern *pattern, real pos, const Color *stop); +void dia_pattern_add_color (DiaPattern *pattern, real pos, const GdkRGBA *stop); void dia_pattern_set_pattern (DiaPattern *pattern, DiaPattern *pat); -void dia_pattern_get_fallback_color (DiaPattern *pattern, Color *color); +void dia_pattern_get_fallback_color (DiaPattern *pattern, GdkRGBA *color); void dia_pattern_get_points (DiaPattern *pattern, Point *p1, Point *p2); void dia_pattern_get_radius (DiaPattern *pattern, real *r); void dia_pattern_get_settings (DiaPattern *pattern, DiaPatternType *type, guint *flags); -typedef gboolean (*DiaColorStopFunc) (real ofs, const Color *col, gpointer user_data); +typedef gboolean (*DiaColorStopFunc) (real ofs, const GdkRGBA *col, gpointer user_data); void dia_pattern_foreach (DiaPattern *pattern, DiaColorStopFunc fn, gpointer user_data); G_END_DECLS diff --git a/lib/persistence.c b/lib/persistence.c index 2cba2cb44487eda14412bf0f3e16aa4c7cfc5a49..232ed4ee628e029e3d19d03d4d9c93575b1722fd 100644 --- a/lib/persistence.c +++ b/lib/persistence.c @@ -226,7 +226,7 @@ persistence_load_color(gchar *role, xmlNodePtr node, DiaContext *ctx) /* Find the contents? */ attr = composite_find_attribute(node, "colorvalue"); if (attr != NULL) { - Color *colorval = g_new(Color, 1); + GdkRGBA *colorval = g_new(GdkRGBA, 1); data_color(attribute_first_data(attr), colorval, ctx); g_hash_table_insert(persistent_colors, role, colorval); } @@ -460,7 +460,7 @@ persistence_save_color(gpointer key, gpointer value, gpointer data) colornode = (ObjectNode)xmlNewChild(tree, NULL, (const xmlChar *)"color", NULL); xmlSetProp(colornode, (const xmlChar *)"role", (xmlChar *)key); - data_add_color(new_attribute(colornode, "colorvalue"), (Color *)value, ctx); + data_add_color(new_attribute(colornode, "colorvalue"), (GdkRGBA *)value, ctx); } static void @@ -606,11 +606,7 @@ persistence_window_event_handler(GtkWindow *window, GdkEvent *event, gpointer da /* silence gcc */ break; } -#if GTK_CHECK_VERSION(2,20,0) persistence_update_window(window, !gtk_widget_get_mapped(GTK_WIDGET(window))); -#else - persistence_update_window(window, !(GTK_WIDGET_MAPPED(window))); -#endif /* continue processing */ return FALSE; } @@ -624,11 +620,7 @@ persistence_window_event_handler(GtkWindow *window, GdkEvent *event, gpointer da static gboolean persistence_hide_show_window(GtkWindow *window, gpointer data) { -#if GTK_CHECK_VERSION(2,20,0) persistence_update_window(window, !(gtk_widget_get_mapped(GTK_WIDGET(window)))); -#else - persistence_update_window(window, !GTK_WIDGET_MAPPED(window)); -#endif return FALSE; } @@ -689,11 +681,7 @@ persistence_register_window(GtkWindow *window) gtk_window_get_position(window, &wininfo->x, &wininfo->y); gtk_window_get_size(window, &wininfo->width, &wininfo->height); /* Drawable means visible & mapped, what we usually think of as open. */ -#if GTK_CHECK_VERSION(2,18,0) wininfo->isopen = gtk_widget_is_drawable(GTK_WIDGET(window)); -#else - wininfo->isopen = GTK_WIDGET_DRAWABLE(GTK_WIDGET(window)); -#endif g_hash_table_insert(persistent_windows, (gchar *)name, wininfo); } if (wininfo->window != NULL && wininfo->window != window) { @@ -1212,46 +1200,46 @@ persistence_set_string(gchar *role, const gchar *newvalue) * * Remember that colors returned are private, not to be deallocated. * They will be smashed in some undefined way by persistence_set_color */ -Color * -persistence_register_color(gchar *role, Color *defaultvalue) +GdkRGBA * +persistence_register_color(gchar *role, GdkRGBA *defaultvalue) { - Color *colorval; + GdkRGBA *colorval; if (role == NULL) return 0; if (persistent_colors == NULL) { persistent_colors = _dia_hash_table_str_any_new(); } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval == NULL) { - colorval = g_new(Color, 1); + colorval = g_new(GdkRGBA, 1); *colorval = *defaultvalue; g_hash_table_insert(persistent_colors, role, colorval); } return colorval; } -Color * +GdkRGBA * persistence_get_color(gchar *role) { - Color *colorval; + GdkRGBA *colorval; if (persistent_colors == NULL) { g_warning("No persistent colors to get for %s!", role); return 0; } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval != NULL) return colorval; g_warning("No color to get for %s", role); return 0; } void -persistence_set_color(gchar *role, Color *newvalue) +persistence_set_color(gchar *role, GdkRGBA *newvalue) { - Color *colorval; + GdkRGBA *colorval; if (persistent_colors == NULL) { g_warning("No persistent colors yet for %s!", role); return; } - colorval = (Color *)g_hash_table_lookup(persistent_colors, role); + colorval = (GdkRGBA *)g_hash_table_lookup(persistent_colors, role); if (colorval != NULL) *colorval = *newvalue; else diff --git a/lib/persistence.h b/lib/persistence.h index 5980a7746eb9a0e4f3ede3f3395a85d4b7ef9fa4..db8ff51982c5c93268f1b010182eb991ae50bc68 100644 --- a/lib/persistence.h +++ b/lib/persistence.h @@ -70,8 +70,8 @@ gchar *persistence_register_string(gchar *role, gchar *defaultvalue); gchar *persistence_get_string(gchar *role); void persistence_set_string(gchar *role, const gchar *newvalue); -Color *persistence_register_color(gchar *role, Color *defaultvalue); -Color *persistence_get_color(gchar *role); -void persistence_set_color(gchar *role, Color *newvalue); +GdkRGBA *persistence_register_color(gchar *role, GdkRGBA *defaultvalue); +GdkRGBA *persistence_get_color(gchar *role); +void persistence_set_color(gchar *role, GdkRGBA *newvalue); #endif diff --git a/lib/prop_attr.c b/lib/prop_attr.c index 3da4ec8ef94c41f61ab9c6d0bc031cc75009d2ea..632b88cadb6dbf8a6361076fbf7aa0643af33578 100644 --- a/lib/prop_attr.c +++ b/lib/prop_attr.c @@ -31,7 +31,7 @@ #include "widgets.h" #include "properties.h" #include "propinternals.h" -#include "diaarrowchooser.h" +#include "widgets/dia-arrow-chooser.h" #include "diafontselector.h" /***************************/ @@ -64,7 +64,8 @@ linestyleprop_copy(LinestyleProperty *src) static WIDGET * linestyleprop_get_widget(LinestyleProperty *prop, PropDialog *dialog) { - GtkWidget *ret = dia_line_style_selector_new(); + GtkWidget *ret = dia_line_chooser_new(); + gtk_widget_set_size_request (ret, 150, -1); prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed"); return ret; } @@ -72,17 +73,17 @@ linestyleprop_get_widget(LinestyleProperty *prop, PropDialog *dialog) static void linestyleprop_reset_widget(LinestyleProperty *prop, WIDGET *widget) { - dia_line_style_selector_set_linestyle(DIALINESTYLESELECTOR(widget), - prop->style, - prop->dash); + dia_line_chooser_set_line_style (DIA_LINE_CHOOSER (widget), + prop->style, + prop->dash); } static void linestyleprop_set_from_widget(LinestyleProperty *prop, WIDGET *widget) { - dia_line_style_selector_get_linestyle(DIALINESTYLESELECTOR(widget), - &prop->style, - &prop->dash); + dia_line_chooser_get_line_style (DIA_LINE_CHOOSER (widget), + &prop->style, + &prop->dash); } static void @@ -172,7 +173,8 @@ arrowprop_copy(ArrowProperty *src) static WIDGET * arrowprop_get_widget(ArrowProperty *prop, PropDialog *dialog) { - GtkWidget *ret = dia_arrow_selector_new(); + GtkWidget *ret = dia_arrow_chooser_new (FALSE); + gtk_widget_set_size_request (ret, 150, -1); prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed"); return ret; } @@ -180,14 +182,14 @@ arrowprop_get_widget(ArrowProperty *prop, PropDialog *dialog) static void arrowprop_reset_widget(ArrowProperty *prop, WIDGET *widget) { - dia_arrow_selector_set_arrow(DIA_ARROW_SELECTOR(widget), - prop->arrow_data); + dia_arrow_chooser_set_arrow (DIA_ARROW_CHOOSER (widget), + &prop->arrow_data); } static void -arrowprop_set_from_widget(ArrowProperty *prop, WIDGET *widget) +arrowprop_set_from_widget (ArrowProperty *prop, WIDGET *widget) { - prop->arrow_data = dia_arrow_selector_get_arrow(DIA_ARROW_SELECTOR(widget)); + prop->arrow_data = dia_arrow_chooser_get_arrow (DIA_ARROW_CHOOSER (widget)); } static void @@ -290,24 +292,24 @@ colorprop_copy(ColorProperty *src) static WIDGET * colorprop_get_widget(ColorProperty *prop, PropDialog *dialog) { - GtkWidget *ret = dia_color_selector_new(); - dia_color_selector_set_use_alpha (ret, TRUE); - prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed"); + GtkWidget *ret = gtk_color_button_new(); + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (ret), TRUE); + prophandler_connect(&prop->common, G_OBJECT(ret), "color-set"); return ret; } static void colorprop_reset_widget(ColorProperty *prop, WIDGET *widget) { - dia_color_selector_set_color(widget, - &prop->color_data); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (widget), + &prop->color_data); } static void colorprop_set_from_widget(ColorProperty *prop, WIDGET *widget) { - dia_color_selector_get_color(widget, - &prop->color_data); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (widget), + &prop->color_data); } static void @@ -327,11 +329,11 @@ colorprop_get_from_offset(ColorProperty *prop, void *base, guint offset, guint offset2) { if (offset2 == 0) { - prop->color_data = struct_member(base,offset,Color); + prop->color_data = struct_member(base,offset,GdkRGBA); } else { void *base2 = struct_member(base,offset,void*); g_return_if_fail (base2 != NULL); - prop->color_data = struct_member(base2,offset2,Color); + prop->color_data = struct_member(base2,offset2,GdkRGBA); } } @@ -340,11 +342,11 @@ colorprop_set_from_offset(ColorProperty *prop, void *base, guint offset, guint offset2) { if (offset2 == 0) { - struct_member(base,offset,Color) = prop->color_data; + struct_member(base,offset,GdkRGBA) = prop->color_data; } else { void *base2 = struct_member(base,offset,void*); g_return_if_fail (base2 != NULL); - struct_member(base2,offset2,Color) = prop->color_data; + struct_member(base2,offset2,GdkRGBA) = prop->color_data; g_return_if_fail (offset2 == offsetof(Text, color)); text_set_color ((Text *)base2, &prop->color_data); } @@ -413,14 +415,14 @@ fontprop_get_widget(FontProperty *prop, PropDialog *dialog) static void fontprop_reset_widget(FontProperty *prop, WIDGET *widget) { - dia_font_selector_set_font(DIAFONTSELECTOR(widget), + dia_font_selector_set_font(DIA_FONT_SELECTOR(widget), prop->font_data); } static void fontprop_set_from_widget(FontProperty *prop, WIDGET *widget) { - prop->font_data = dia_font_selector_get_font(DIAFONTSELECTOR(widget)); + prop->font_data = dia_font_selector_get_font(DIA_FONT_SELECTOR(widget)); } static void diff --git a/lib/prop_attr.h b/lib/prop_attr.h index fb89f5d2c600a5cbead4e1cb262afbbfa7551ce7..17504221270939c5d10e375f472052f005a1606a 100644 --- a/lib/prop_attr.h +++ b/lib/prop_attr.h @@ -53,7 +53,7 @@ typedef struct { */ typedef struct { Property common; - Color color_data; + GdkRGBA color_data; } ColorProperty; /*! diff --git a/lib/prop_inttypes.c b/lib/prop_inttypes.c index 67f1ec75bdef86378c3ae8fd1ebdab7a10b49327..54b4f99b47e3a95ca0a8c3ec99518c6fdede1742 100644 --- a/lib/prop_inttypes.c +++ b/lib/prop_inttypes.c @@ -152,15 +152,6 @@ static const PropertyOps charprop_ops = { /* The BOOL property type. */ /***************************/ -static void -bool_toggled(GtkWidget *wid) -{ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(wid))) - gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(wid))), _("Yes")); - else - gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(wid))), _("No")); -} - static Property * boolprop_new(const PropDescription *pdesc, PropDescToPropPredicate reason) { @@ -181,26 +172,66 @@ boolprop_copy(BoolProperty *src) return prop; } +G_DECLARE_FINAL_TYPE (DiaSwitch, dia_switch, DIA, SWITCH, GtkSwitch) + +struct _DiaSwitch { + GtkSwitch parent; +}; + +G_DEFINE_TYPE (DiaSwitch, dia_switch, GTK_TYPE_SWITCH) + +enum { + CHANGED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +dia_switch_class_init (DiaSwitchClass *klass) +{ + signals[CHANGED] = g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +static void +bubble (DiaSwitch *self) +{ + g_signal_emit (self, signals[CHANGED], 0); +} + +static void +dia_switch_init (DiaSwitch *self) +{ + g_signal_connect (self, "notify::active", G_CALLBACK (bubble), NULL); +} + +static GtkWidget * +dia_switch_new () +{ + return g_object_new (dia_switch_get_type (), NULL); +} + static WIDGET * boolprop_get_widget(BoolProperty *prop, PropDialog *dialog) { - GtkWidget *ret = gtk_toggle_button_new_with_label(_("No")); - g_signal_connect(G_OBJECT(ret), "toggled", - G_CALLBACK (bool_toggled), NULL); - prophandler_connect(&prop->common, G_OBJECT(ret), "toggled"); + GtkWidget *ret = dia_switch_new (); + prophandler_connect(&prop->common, G_OBJECT(ret), "changed"); return ret; } static void boolprop_reset_widget(BoolProperty *prop, WIDGET *widget) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),prop->bool_data); + gtk_switch_set_active (GTK_SWITCH (widget), prop->bool_data); } static void boolprop_set_from_widget(BoolProperty *prop, WIDGET *widget) { - prop->bool_data = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); + prop->bool_data = gtk_switch_get_active (GTK_SWITCH (widget)); } static void @@ -492,17 +523,9 @@ enumprop_get_widget(EnumProperty *prop, PropDialog *dialog) PropEnumData *enumdata = prop->common.descr->extra_data; guint i; -#if GTK_CHECK_VERSION(2,24,0) ret = gtk_combo_box_text_new (); -#else - ret = gtk_combo_box_new_text (); -#endif for (i = 0; enumdata[i].name != NULL; i++) -#if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (ret), _(enumdata[i].name)); -#else - gtk_combo_box_append_text (GTK_COMBO_BOX (ret), _(enumdata[i].name)); -#endif prophandler_connect(&prop->common, G_OBJECT (ret), "changed"); } else { ret = gtk_entry_new(); /* should use spin button/option menu */ diff --git a/lib/prop_matrix.c b/lib/prop_matrix.c index 8c51ca01d4af9c9319a4d6a26f20330d5510b639..1f77b212bd8bf4dd49530b5b4afacbd303611f98 100644 --- a/lib/prop_matrix.c +++ b/lib/prop_matrix.c @@ -169,7 +169,7 @@ matrixprop_get_widget (MatrixProperty *prop, PropDialog *dialog) GtkWidget *ret, *sb; int i; - ret = gtk_hbox_new (FALSE,0); + ret = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* angle */ adj = GTK_ADJUSTMENT (gtk_adjustment_new(0.0, -180.0, 180.0, 1.0, 15.0, 0)); sb = gtk_spin_button_new(adj, 1.0, 2); diff --git a/lib/prop_pattern.c b/lib/prop_pattern.c index 93273f9e2a8cec1bb570616cd63bdc803b981927..89ef79e997be7431f4975b952f434c95fac368ba 100644 --- a/lib/prop_pattern.c +++ b/lib/prop_pattern.c @@ -104,7 +104,7 @@ data_pattern (DataNode node, DiaContext *ctx) guint nvals = attribute_num_data(attr); guint i; real offset = 0.0; - Color color = color_black; + GdkRGBA color = color_black; for (i=0; (i < nvals) && data; i++, data = data_next(data)) { attr = composite_find_attribute(data, "offset"); @@ -133,7 +133,7 @@ typedef struct } StopUserData; static gboolean -_data_add_stop (real ofs, const Color *col, gpointer user_data) +_data_add_stop (real ofs, const GdkRGBA *col, gpointer user_data) { StopUserData *ud = (StopUserData *)user_data; AttributeNode attr = ud->node; diff --git a/lib/prop_sdarray_widget.c b/lib/prop_sdarray_widget.c index 683aab3c79950984fab6da999f6716f0219bdb7d..df5d127591e8522818b46c9da118aeffa1412f20 100644 --- a/lib/prop_sdarray_widget.c +++ b/lib/prop_sdarray_widget.c @@ -454,18 +454,18 @@ _make_button_box_for_view (GtkTreeView *view, GtkTreeView *master_view) const gchar *stock; GCallback callback; } _button_data[] = { - { GTK_STOCK_ADD, G_CALLBACK (_insert_row_callback) }, - { GTK_STOCK_REMOVE, G_CALLBACK (_remove_row_callback) }, - { GTK_STOCK_GO_UP, G_CALLBACK (_upper_row_callback) }, - { GTK_STOCK_GO_DOWN, G_CALLBACK (_lower_row_callback) }, + { N_("Add"), G_CALLBACK (_insert_row_callback) }, + { N_("Remove"), G_CALLBACK (_remove_row_callback) }, + { N_("Up"), G_CALLBACK (_upper_row_callback) }, + { N_("Down"), G_CALLBACK (_lower_row_callback) }, { NULL, NULL } }; - GtkWidget *vbox = gtk_vbox_new (FALSE, 0); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); GtkWidget *button; int i; for (i = 0; _button_data[i].stock != NULL; ++i) { - button = gtk_button_new_from_stock (_button_data[i].stock); + button = gtk_button_new_with_label (_button_data[i].stock); /* start with everything disabled ... */ gtk_widget_set_sensitive (button, FALSE); g_signal_connect (G_OBJECT (button), "clicked", @@ -538,7 +538,7 @@ _arrayprop_get_widget (ArrayProperty *prop, PropDialog *dialog) * \- branch_view */ { - GtkWidget *hbox = gtk_hbox_new (FALSE /* less size for button column */, 0); + GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); GtkWidget *vbox = _make_button_box_for_view (GTK_TREE_VIEW (view), NULL); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE /* no expand */, FALSE, 0); @@ -550,8 +550,8 @@ _arrayprop_get_widget (ArrayProperty *prop, PropDialog *dialog) gtk_box_pack_start (GTK_BOX (hbox), _make_scrollable (view), TRUE /* expand */, TRUE /* fill */, 0); } else { /* almost the same once more */ - GtkWidget *hbox2 = gtk_hbox_new (FALSE /* less size for button column */, 0); - GtkWidget *vbox2 = gtk_vbox_new (FALSE, 0); + GtkWidget *hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + GtkWidget *vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); GtkWidget *vbox3 = _make_button_box_for_view (GTK_TREE_VIEW (branch_view), GTK_TREE_VIEW (view)); gtk_box_pack_start (GTK_BOX (vbox2), _make_scrollable (view), TRUE, TRUE, 0); diff --git a/lib/prop_text.c b/lib/prop_text.c index a6e6d132383f7aa642e918bea713bfadbd649aa5..68b51f5679151600bc4a3046b1ab5100696ce7cc 100644 --- a/lib/prop_text.c +++ b/lib/prop_text.c @@ -115,7 +115,7 @@ multistringprop_handle_key(GtkWidget *wid, GdkEventKey *event) /** Actually, this doesn't seem to work -- I guess the dialog closes * becore this is called :( */ - if (event->keyval == GDK_Return) + if (event->keyval == GDK_KEY_Return) return TRUE; return FALSE; } diff --git a/lib/prop_widgets.c b/lib/prop_widgets.c index 4d2a12ff8e0ee57709245567e8211bf073b42d6e..1c615d2974fcd1b0562e19841e70633d270c7e69 100644 --- a/lib/prop_widgets.c +++ b/lib/prop_widgets.c @@ -27,10 +27,9 @@ #endif #include -#undef GTK_DISABLE_DEPRECATED /* GtkList */ #include -#define WIDGET GtkWidget #include "widgets.h" +#include "widgets/dialist.h" #include "properties.h" #include "propinternals.h" @@ -38,7 +37,7 @@ /* The STATIC property type. */ /******************************/ -static WIDGET * +static GtkWidget * staticprop_get_widget(StaticProperty *prop, PropDialog *dialog) { GtkWidget *ret = NULL; @@ -69,7 +68,7 @@ static const PropertyOps staticprop_ops = { /* The BUTTON property type. */ /******************************/ -static WIDGET * +static GtkWidget * buttonprop_get_widget(ButtonProperty *prop, PropDialog *dialog) { GtkWidget *ret = NULL; @@ -100,69 +99,28 @@ static const PropertyOps buttonprop_ops = { /* The FRAME_BEGIN and FRAME_END property types. */ /**************************************************/ -struct FoldButtonInfo { - GtkWidget *unfoldbutton; - GtkWidget *frame; -}; - -static void -frame_fold_unfold(GtkWidget *button1, gpointer userdata) -{ - struct FoldButtonInfo *info = (struct FoldButtonInfo *)userdata; - - if (button1 == info->unfoldbutton) { - gtk_widget_set_sensitive (info->unfoldbutton, FALSE); - gtk_widget_hide(info->unfoldbutton); - gtk_widget_show(info->frame); - } else { - gtk_widget_hide(info->frame); - gtk_widget_show(info->unfoldbutton); - gtk_widget_set_sensitive (info->unfoldbutton, TRUE); - } -} - -static WIDGET * +static GtkWidget * frame_beginprop_get_widget(FrameProperty *prop, PropDialog *dialog) { - gchar *foldstring = g_strdup_printf("%s <<<", _(prop->common.descr->description)); - gchar *unfoldstring = g_strdup_printf("%s >>>", _(prop->common.descr->description)); - GtkWidget *frame = gtk_frame_new(NULL); - GtkWidget *vbox = gtk_vbox_new(FALSE,2); - GtkWidget *foldbutton = gtk_button_new_with_label(foldstring); - GtkWidget *unfoldbutton = gtk_button_new_with_label(unfoldstring); - - struct FoldButtonInfo *info = g_new(struct FoldButtonInfo, 1); + GtkWidget *frame = gtk_expander_new (_(prop->common.descr->description)); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); - g_free(foldstring); - g_free(unfoldstring); - - info->frame = frame; - info->unfoldbutton = unfoldbutton; - - gtk_frame_set_label_widget(GTK_FRAME(frame), foldbutton); + gtk_expander_set_expanded (GTK_EXPANDER (frame), TRUE); + gtk_expander_set_resize_toplevel (GTK_EXPANDER (frame), TRUE); gtk_container_set_border_width (GTK_CONTAINER(frame), 2); gtk_container_add(GTK_CONTAINER(frame),vbox); - gtk_widget_set_sensitive (unfoldbutton, FALSE); - gtk_widget_show(foldbutton); gtk_widget_show(frame); gtk_widget_show(vbox); - prop_dialog_add_raw(dialog, frame); - - prop_dialog_add_raw_with_flags(dialog, unfoldbutton, FALSE, FALSE); - - g_signal_connect(G_OBJECT (foldbutton), "clicked", - G_CALLBACK (frame_fold_unfold), info); - g_signal_connect(G_OBJECT (unfoldbutton), "clicked", - G_CALLBACK (frame_fold_unfold), info); + prop_dialog_add_raw(dialog, frame); prop_dialog_container_push(dialog,vbox); return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * frame_endprop_get_widget(FrameProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); @@ -203,10 +161,10 @@ static const PropertyOps frame_endprop_ops = { /* The MULTICOL_BEGIN, _COLUMN and _END property types. */ /*********************************************************/ -static WIDGET * +static GtkWidget * multicol_beginprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { - GtkWidget *multicol = gtk_hbox_new(FALSE,1); + GtkWidget *multicol = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width (GTK_CONTAINER(multicol), 2); gtk_widget_show(multicol); @@ -219,10 +177,10 @@ multicol_beginprop_get_widget(MulticolProperty *prop, PropDialog *dialog) return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * multicol_columnprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { - GtkWidget *col = gtk_vbox_new(FALSE,1); + GtkWidget *col = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); gtk_container_set_border_width (GTK_CONTAINER(col), 2); gtk_widget_show(col); @@ -237,7 +195,7 @@ multicol_columnprop_get_widget(MulticolProperty *prop, PropDialog *dialog) return NULL; } -static WIDGET * +static GtkWidget * multicol_endprop_get_widget(MulticolProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); /* the column */ @@ -294,14 +252,14 @@ static const PropertyOps multicol_endprop_ops = { /* The NOTEBOOK_BEGIN, _PAGE and _END property types. */ /*********************************************************/ -static WIDGET * +static GtkWidget * notebook_beginprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { GtkWidget *notebook = gtk_notebook_new(); - gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook),GTK_POS_TOP); - gtk_container_set_border_width (GTK_CONTAINER(notebook), 1); - gtk_widget_show(notebook); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook),GTK_POS_TOP); + gtk_notebook_set_show_border (GTK_NOTEBOOK(notebook), FALSE); + gtk_widget_show (notebook); prop_dialog_add_raw(dialog,notebook); @@ -311,10 +269,10 @@ notebook_beginprop_get_widget(NotebookProperty *prop, PropDialog *dialog) return NULL; /* there is no single widget to add with a label next to it. */ } -static WIDGET * +static GtkWidget * notebook_pageprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { - GtkWidget *page = gtk_vbox_new(FALSE,1); + GtkWidget *page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); GtkWidget *label = gtk_label_new(_(prop->common.descr->description)); gtk_container_set_border_width (GTK_CONTAINER(page), 2); @@ -331,7 +289,7 @@ notebook_pageprop_get_widget(NotebookProperty *prop, PropDialog *dialog) return NULL; } -static WIDGET * +static GtkWidget * notebook_endprop_get_widget(NotebookProperty *prop, PropDialog *dialog) { prop_dialog_container_pop(dialog); /* the page */ @@ -441,20 +399,20 @@ listprop_copy(ListProperty *src) } static void -listprop_select_child_signal(GtkList *list, +listprop_select_child_signal(DiaList *list, GtkWidget *child, ListProperty *prop) { - prop->w_selected = gtk_list_child_position(list,child); + prop->w_selected = dia_list_child_position (list, DIA_LIST_ITEM (child)); } -static WIDGET * +static GtkWidget * listprop_get_widget(ListProperty *prop, PropDialog *dialog) { - GtkWidget *ret = gtk_list_new(); + GtkWidget *ret = dia_list_new(); - gtk_list_set_selection_mode(GTK_LIST(ret),GTK_SELECTION_BROWSE); - gtk_list_unselect_all(GTK_LIST(ret)); + dia_list_set_selection_mode(DIA_LIST(ret),GTK_SELECTION_BROWSE); + dia_list_unselect_all(DIA_LIST(ret)); g_signal_connect(G_OBJECT(ret), "select-child", G_CALLBACK (listprop_select_child_signal), prop); @@ -465,28 +423,28 @@ listprop_get_widget(ListProperty *prop, PropDialog *dialog) static GtkWidget * make_item(const gchar *line) { - GtkWidget *item = gtk_list_item_new_with_label(line); + GtkWidget *item = dia_list_item_new_with_label(line); gtk_widget_show(item); return item; } static void -listprop_reset_widget(ListProperty *prop, WIDGET *widget) +listprop_reset_widget(ListProperty *prop, GtkWidget *widget) { guint i; GList *items = NULL; - gtk_list_clear_items(GTK_LIST(widget),0,-1); + dia_list_empty (DIA_LIST (widget)); for (i = 0; i < prop->lines->len; i++) { items = g_list_append(items, make_item(g_ptr_array_index(prop->lines,i))); } - gtk_list_append_items(GTK_LIST(widget),items); + dia_list_append_items (DIA_LIST (widget), items); prop->w_selected = prop->selected; - gtk_list_select_item(GTK_LIST(widget),prop->selected); + dia_list_select_item (DIA_LIST (widget), prop->selected); } static void -listprop_set_from_widget(ListProperty *prop, WIDGET *widget) +listprop_set_from_widget(ListProperty *prop, GtkWidget *widget) { prop->selected = prop->w_selected; } diff --git a/lib/propdialogs.c b/lib/propdialogs.c index b6856750fc77a88de4a89419fe763268a4266281..ae1b0cb6fc44bfb9be1cb58903ce14f41ccbaf95 100644 --- a/lib/propdialogs.c +++ b/lib/propdialogs.c @@ -45,7 +45,7 @@ prop_dialog_new(GList *objects, gboolean is_default) { PropDialog *dialog = g_new0(PropDialog,1); dialog->props = NULL; - dialog->widget = gtk_vbox_new(FALSE,1); + dialog->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); dialog->prop_widgets = g_array_new(FALSE,TRUE,sizeof(PropWidgetAssoc)); dialog->copies = NULL; dialog->curtable = NULL; @@ -112,9 +112,9 @@ prop_dialog_add_raw_with_flags(PropDialog *dialog, GtkWidget *widget, static void prop_dialog_make_curtable(PropDialog *dialog) { - GtkWidget *table = gtk_table_new(1,2,FALSE); - gtk_table_set_row_spacings(GTK_TABLE(table), 2); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); + GtkWidget *table = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (table), 8); + gtk_grid_set_column_spacing (GTK_GRID (table), 16); gtk_widget_show(table); prop_dialog_add_raw(dialog,table); @@ -125,21 +125,23 @@ prop_dialog_make_curtable(PropDialog *dialog) static void prop_dialog_add_widget(PropDialog *dialog, GtkWidget *label, GtkWidget *widget) { - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - if (!dialog->curtable) prop_dialog_make_curtable(dialog); - gtk_table_attach(GTK_TABLE(dialog->curtable),label, - 0,1, - dialog->currow, dialog->currow+1, - GTK_FILL, GTK_FILL|GTK_EXPAND, - 0,0); - gtk_table_attach(GTK_TABLE(dialog->curtable),widget, - 1,2, - dialog->currow, dialog->currow+1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, - 0,0); - gtk_widget_show(label); - gtk_widget_show(widget); + + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_halign (GTK_WIDGET (label), GTK_ALIGN_FILL); + gtk_widget_set_valign (GTK_WIDGET (label), GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (dialog->curtable), label, + 0, dialog->currow, 1, 1); + + gtk_widget_set_hexpand (GTK_WIDGET (widget), TRUE); + gtk_widget_set_halign (GTK_WIDGET (widget), GTK_ALIGN_END); + gtk_widget_set_valign (GTK_WIDGET (widget), GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (dialog->curtable), widget, + 1, dialog->currow, 1, 1); + + gtk_widget_show (label); + gtk_widget_show (widget); dialog->currow++; } @@ -270,7 +272,6 @@ prop_dialog_add_property(PropDialog *dialog, Property *prop) label = gtk_label_new(""); else label = gtk_label_new(_(prop->descr->description)); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); prop_dialog_add_widget(dialog, label, widget); } @@ -283,7 +284,7 @@ prop_dialog_add_properties(PropDialog *dialog, GPtrArray *props) if (scrollable) { GtkWidget *swin = gtk_scrolled_window_new (NULL, NULL); - GtkWidget *vbox = gtk_vbox_new(FALSE,2); + GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_box_pack_start(GTK_BOX (dialog->widget), swin, TRUE, TRUE, 0); gtk_widget_show (swin); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swin), vbox); diff --git a/lib/properties.c b/lib/properties.c index e70de4104d4156abe9e940b1a7fe98dd71139f13..21dbbcfb89c060b113f42fe47bea26e0b1ee9a83 100644 --- a/lib/properties.c +++ b/lib/properties.c @@ -34,7 +34,6 @@ #endif #undef G_INLINE_FUNC #define G_INLINE_FUNC extern -#define G_CAN_INLINE 1 #include "properties.h" #include "propinternals.h" diff --git a/lib/properties.h b/lib/properties.h index 8211b011f52edbdb57eb6c7238e7ec7fab84e3c3..3475884938b40ccf179e4d585aad7101656db7fe 100644 --- a/lib/properties.h +++ b/lib/properties.h @@ -42,7 +42,6 @@ #include "geometry.h" #include "arrows.h" -#include "color.h" #include "font.h" #include "dia_xml.h" #include "intl.h" @@ -437,10 +436,10 @@ GPtrArray *prop_list_from_single(Property *prop); /* Convenience functions to construct a prop list from standard properties */ void prop_list_add_line_width (GPtrArray *plist, real line_width); void prop_list_add_line_style (GPtrArray *plist, LineStyle line_style, real dash); -void prop_list_add_line_colour (GPtrArray *plist, const Color *color); -void prop_list_add_fill_colour (GPtrArray *plist, const Color *color); +void prop_list_add_line_colour (GPtrArray *plist, const GdkRGBA *color); +void prop_list_add_fill_colour (GPtrArray *plist, const GdkRGBA *color); void prop_list_add_show_background (GPtrArray *plist, gboolean fill); -void prop_list_add_text_colour (GPtrArray *plist, const Color *color); +void prop_list_add_text_colour (GPtrArray *plist, const GdkRGBA *color); /* addding a text(string) property - just the string no attributes */ void prop_list_add_text (GPtrArray *plist, const char *name, const char *value); diff --git a/lib/proplist.c b/lib/proplist.c index e47ba2f97308e88384a2d97e1c662beff521169b..0ce5a8ac1ad1e3850b9f11b91112f59bc77b3089 100644 --- a/lib/proplist.c +++ b/lib/proplist.c @@ -248,7 +248,7 @@ prop_list_add_line_style (GPtrArray *plist, LineStyle line_style, real dash) g_ptr_array_add (plist, prop); } static void -_prop_list_add_colour (GPtrArray *plist, const char *name, const Color *color) +_prop_list_add_colour (GPtrArray *plist, const char *name, const GdkRGBA *color) { Property *prop = make_new_prop (name, PROP_TYPE_COLOUR, 0); @@ -256,12 +256,12 @@ _prop_list_add_colour (GPtrArray *plist, const char *name, const Color *color) g_ptr_array_add (plist, prop); } void -prop_list_add_line_colour (GPtrArray *plist, const Color *color) +prop_list_add_line_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "line_colour", color); } void -prop_list_add_fill_colour (GPtrArray *plist, const Color *color) +prop_list_add_fill_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "fill_colour", color); } @@ -347,7 +347,7 @@ prop_list_add_enum (GPtrArray *plist, const char *name, int value) g_ptr_array_add (plist, prop); } void -prop_list_add_text_colour (GPtrArray *plist, const Color *color) +prop_list_add_text_colour (GPtrArray *plist, const GdkRGBA *color) { _prop_list_add_colour (plist, "text_colour", color); } diff --git a/lib/render_pixmap.c b/lib/render_pixmap.c deleted file mode 100644 index 6bf9bbf4cfc857946fc8945b7f8177924a9c7f23..0000000000000000000000000000000000000000 --- a/lib/render_pixmap.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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. - */ - -/* This renderer is similar to RenderGdk, except that it renders onto - * its own little GdkPixmap, doesn't deal with the DDisplay at all, and - * uses a 1-1 mapping between points and pixels. It is used for rendering - * arrows and lines onto selectors. This way, any change in the arrow - * definitions are automatically reflected in the selectors. - */ - -/* - * 2002-10-06 : Leaved the original comment but removed almost - * anything else. The 'RendererPixmap' now uses the DiaGdkRenderer which - * is the ported to GObject 'RendererGdk'. No more huge code duplication - * but only some renderer parametrization tweaking. --hb - */ -#include - -#include -#include -#include - -#include "render_pixmap.h" -#include "message.h" -#include "diagdkrenderer.h" - -static Rectangle rect; -static real zoom = 1.0; - -DiaRenderer * -new_pixmap_renderer(GdkWindow *window, int width, int height) -{ - DiaGdkRenderer *renderer; - GdkColor color; - - rect.left = 0; - rect.top = 0; - rect.right = width; - rect.bottom = height; - - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = gdk_pixmap_new(window, width, height, -1); - renderer->gc = gdk_gc_new(window); - - gdk_color_white(gdk_colormap_get_system(), &color); - gdk_gc_set_foreground(renderer->gc, &color); - gdk_draw_rectangle(renderer->pixmap, renderer->gc, 1, - 0, 0, width, height); - - return DIA_RENDERER(renderer); -} - -void -renderer_pixmap_set_pixmap (DiaRenderer *ren, - GdkDrawable *drawable, - int xoffset, int yoffset, - int width, int height) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (ren); - - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - if (renderer->gc != NULL) - g_object_unref(renderer->gc); - - g_object_ref(drawable); - renderer->pixmap = drawable; - renderer->gc = gdk_gc_new(drawable); - - rect.left = -xoffset; - rect.top = -yoffset; - rect.right = width; - rect.bottom = height; -} - -GdkPixmap * -renderer_pixmap_get_pixmap (DiaRenderer *ren) -{ - DiaGdkRenderer *renderer = DIA_GDK_RENDERER (ren); - - return renderer->pixmap; -} diff --git a/lib/render_pixmap.h b/lib/render_pixmap.h deleted file mode 100644 index da0b05f2127da51b4e16f07f993ede9475619358..0000000000000000000000000000000000000000 --- a/lib/render_pixmap.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 RENDER_PIXMAP_H -#define RENDER_PIXMAP_H - -#include "diarenderer.h" - -DiaRenderer *new_pixmap_renderer(GdkWindow *window, int width, int height); -void renderer_pixmap_set_pixmap(DiaRenderer *renderer, - GdkDrawable *drawable, - int xoffset, int yoffset, - int width, int height); -GdkPixmap *renderer_pixmap_get_pixmap(DiaRenderer *renderer); - -#endif /* RENDER_PIXMAP_H */ diff --git a/plug-ins/cairo/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c similarity index 81% rename from plug-ins/cairo/diacairo-interactive.c rename to lib/renderer/diacairo-interactive.c index 094cbcc12cb75fb3e45cbdf4475eb34479f176ae..6fa472b42a24d4cd826aeba0962e77a860357477 100644 --- a/plug-ins/cairo/diacairo-interactive.c +++ b/lib/renderer/diacairo-interactive.c @@ -23,23 +23,12 @@ #include "diacairo.h" #include -#include /* GTK_CHECK_VERSION */ #include "intl.h" -#include "color.h" #include "diatransform.h" #include "object.h" #include "textline.h" -/* There is a variant prepared for GTK+3 - * but it seems to be sligly slower than the original version. - */ -#if GTK_CHECK_VERSION(3,0,0) -#define DIA_CAIRO_WITH_PIXMAP 0 -#else -#define DIA_CAIRO_WITH_PIXMAP 1 -#endif - #define DIA_TYPE_CAIRO_INTERACTIVE_RENDERER (dia_cairo_interactive_renderer_get_type ()) #define DIA_CAIRO_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRenderer)) #define DIA_CAIRO_INTERACTIVE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass)) @@ -59,18 +48,20 @@ struct _DiaCairoInteractiveRenderer Rectangle *visible; real *zoom_factor; -#if DIA_CAIRO_WITH_PIXMAP - GdkPixmap *pixmap; /* The pixmap shown in this display */ - GdkGC *gc; -#else - cairo_surface_t *pixmap; /* The pixmap shown in this display */ -#endif - guint32 width; /* The width of the pixmap in pixels */ - guint32 height; /* The height of the pixmap in pixels */ - GdkRegion *clip_region; + cairo_surface_t *surface; /* The surface shown in this display */ + guint32 width; /* The width of the surface in pixels */ + guint32 height; /* The height of the surface in pixels */ + cairo_region_t *clip_region; + + /* Selection box */ + gboolean has_selection; + double selection_x; + double selection_y; + double selection_width; + double selection_height; /** If non-NULL, this rendering is a highlighting with the given color. */ - Color *highlight_color; + GdkRGBA *highlight_color; }; struct _DiaCairoInteractiveRendererClass @@ -85,21 +76,22 @@ static void clip_region_add_rect(DiaRenderer *renderer, static void draw_pixel_line(DiaRenderer *renderer, int x1, int y1, int x2, int y2, - Color *color); + GdkRGBA *color); static void draw_pixel_rect(DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); static void fill_pixel_rect(DiaRenderer *renderer, int x, int y, int width, int height, - Color *color); + GdkRGBA *color); static void set_size (DiaRenderer *renderer, gpointer window, int width, int height); -static void copy_to_window (DiaRenderer *renderer, - gpointer window, - int x, int y, int width, int height); +static void paint (DiaRenderer *renderer, + cairo_t *ctx, + int width, + int height); static void cairo_interactive_renderer_get_property (GObject *object, guint prop_id, @@ -145,7 +137,7 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) dia_renderer->is_interactive = 1; - renderer->pixmap = NULL; + renderer->surface = NULL; renderer->highlight_color = NULL; } @@ -153,18 +145,14 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p) static void cairo_interactive_renderer_finalize (GObject *object) { -#if !DIA_CAIRO_WITH_PIXMAP DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#endif DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object); if (base_renderer->cr) cairo_destroy (base_renderer->cr); base_renderer->cr = NULL; -#if !DIA_CAIRO_WITH_PIXMAP - if (renderer->pixmap) - cairo_surface_destroy (renderer->pixmap); -#endif + if (renderer->surface) + cairo_surface_destroy (renderer->surface); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -194,10 +182,10 @@ get_text_width(DiaRenderer *object, return result; } /** Used as background? for text editing */ -static Color text_edit_color = {1.0, 1.0, 0.7 }; +static GdkRGBA text_edit_color = {1.0, 1.0, 0.7 }; static real -calculate_relative_luminance (const Color *c) +calculate_relative_luminance (const GdkRGBA *c) { real R, G, B; @@ -209,7 +197,7 @@ calculate_relative_luminance (const Color *c) } static void draw_text_line (DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) + Point *pos, Alignment alignment, GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self); @@ -218,7 +206,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line, /* the high_light color is just taken as a hint, alternative needs * to have some contrast to cursor color (curently hard coded black) */ - static Color alternate_color = { 0.5, 0.5, 0.4 }; + static GdkRGBA alternate_color = { 0.5, 0.5, 0.4 }; real rl, cr1, cr2; /* just draw the box */ @@ -281,6 +269,24 @@ draw_object_highlighted (DiaRenderer *self, /* always reset when done with this object */ interactive->highlight_color = NULL; } + +static void +set_selection (DiaRenderer *renderer, + gboolean has_selection, + double x, + double y, + double width, + double height) +{ + DiaCairoInteractiveRenderer *self = DIA_CAIRO_INTERACTIVE_RENDERER (renderer); + + self->has_selection = has_selection; + self->selection_x = x; + self->selection_y = y; + self->selection_width = width; + self->selection_height = height; +} + static void dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface) { @@ -289,9 +295,10 @@ dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* ifac iface->draw_pixel_line = draw_pixel_line; iface->draw_pixel_rect = draw_pixel_rect; iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; + iface->paint = paint; iface->set_size = set_size; iface->draw_object_highlighted = draw_object_highlighted; + iface->set_selection = set_selection; } GType @@ -342,11 +349,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self); g_return_if_fail (base_renderer->cr == NULL); -#if DIA_CAIRO_WITH_PIXMAP - base_renderer->cr = gdk_cairo_create(renderer->pixmap); -#else - base_renderer->cr = cairo_create(renderer->pixmap); -#endif + base_renderer->cr = cairo_create (renderer->surface); /* Setup clipping for this sequence of render operations */ /* Must be done before the scaling because the clip is in pixel coords */ @@ -363,20 +366,16 @@ begin_render(DiaRenderer *self, const Rectangle *update) cairo_rectangle (base_renderer->cr, update->left, update->top, width, height); cairo_clip (base_renderer->cr); } -#ifdef HAVE_PANGOCAIRO_H base_renderer->layout = pango_cairo_create_layout (base_renderer->cr); -#endif cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); -#if !DIA_CAIRO_WITH_PIXMAP /* should we set the background color? Or do nothing at all? */ /* if this is drawn you can see 'clipping in action', outside of the clip it gets yellow ;) */ cairo_set_source_rgba (base_renderer->cr, 1.0, 1.0, .8, 1.0); cairo_set_operator (base_renderer->cr, CAIRO_OPERATOR_OVER); cairo_rectangle (base_renderer->cr, 0, 0, renderer->width, renderer->height); cairo_fill (base_renderer->cr); -#endif } static void @@ -479,67 +478,52 @@ set_size(DiaRenderer *object, gpointer window, renderer->width = width; renderer->height = height; -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->pixmap != NULL) - g_object_unref(renderer->pixmap); - - /* TODO: we can probably get rid of this extra pixmap and just draw directly - * to what gdk_cairo_create() gives us for the window - */ - renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1); -#else -# if GTK_CHECK_VERSION(2,22,0) - renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window), - CAIRO_CONTENT_COLOR, - width, height); -# else - { - cairo_rectangle_t extents; - - extents.x = 0; - extents.y = 0; - extents.width = width; - extents.height = height; - renderer->pixmap = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, &extents); - } -# endif -#endif + renderer->surface = gdk_window_create_similar_surface (GDK_WINDOW (window), + CAIRO_CONTENT_COLOR, + width, height); if (base_renderer->surface != NULL) cairo_surface_destroy(base_renderer->surface); -#if DIA_CAIRO_WITH_PIXMAP - if (renderer->gc == NULL) - renderer->gc = gdk_gc_new(renderer->pixmap); -#endif } static void -copy_to_window (DiaRenderer *object, gpointer window, - int x, int y, int width, int height) +paint (DiaRenderer *object, + cairo_t *ctx, + int width, + int height) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); -#if DIA_CAIRO_WITH_PIXMAP - static GdkGC *copy_gc = NULL; - - if (!copy_gc) - copy_gc = gdk_gc_new(window); - - gdk_draw_drawable (GDK_WINDOW(window), - copy_gc, - renderer->pixmap, - x, y, - x, y, - width > 0 ? width : -width, height > 0 ? height : -height); -#else - cairo_t *cr; - - cr = gdk_cairo_create (GDK_WINDOW(window)); - cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0); - cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height); - cairo_clip (cr); - cairo_paint (cr); - cairo_destroy (cr); -#endif + double dashes[1] = {3}; + cairo_save (ctx); + + cairo_set_source_surface (ctx, renderer->surface, 0.0, 0.0); + cairo_rectangle (ctx, 0, 0, width > 0 ? width : -width, height > 0 ? height : -height); + cairo_clip (ctx); + cairo_paint (ctx); + + /* If there should be a selection rectange */ + if (renderer->has_selection) { + /* Use a dark gray */ + cairo_set_source_rgba (ctx, 0.1, 0.1, 0.1, 0.8); + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + cairo_set_line_width (ctx, 1); + cairo_set_dash (ctx, dashes, 1, 0); + + /* Set the selected area */ + cairo_rectangle (ctx, + renderer->selection_x, + renderer->selection_y, + renderer->selection_width, + renderer->selection_height); + /* Add a dashed gray outline */ + cairo_stroke_preserve (ctx); + /* Very light blue tint fill */ + cairo_set_source_rgba (ctx, 0, 0, 0.85, 0.05); + cairo_fill (ctx); + } + + cairo_restore (ctx); } static void @@ -548,12 +532,9 @@ clip_region_clear(DiaRenderer *object) DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); if (renderer->clip_region != NULL) - gdk_region_destroy(renderer->clip_region); + cairo_region_destroy (renderer->clip_region); - renderer->clip_region = gdk_region_new(); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif + renderer->clip_region = cairo_region_create(); } static void @@ -561,7 +542,7 @@ clip_region_add_rect(DiaRenderer *object, Rectangle *rect) { DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkRectangle clip_rect; + cairo_rectangle_int_t clip_rect; int x1,y1; int x2,y2; @@ -577,17 +558,14 @@ clip_region_add_rect(DiaRenderer *object, clip_rect.width = x2 - x1 + 1; clip_rect.height = y2 - y1 + 1; - gdk_region_union_with_rect(renderer->clip_region, &clip_rect); -#if DIA_CAIRO_WITH_PIXMAP - gdk_gc_set_clip_region(renderer->gc, renderer->clip_region); -#endif + cairo_region_union_rectangle (renderer->clip_region, &clip_rect); } static void draw_pixel_line(DiaRenderer *object, int x1, int y1, int x2, int y2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5; @@ -610,7 +588,7 @@ static void draw_pixel_rect(DiaRenderer *object, int x, int y, int width, int height, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; @@ -632,20 +610,8 @@ static void fill_pixel_rect(DiaRenderer *object, int x, int y, int width, int height, - Color *color) + GdkRGBA *color) { -#if DIA_CAIRO_WITH_PIXMAP - /* if we do it with cairo there is something wrong with the clipping? */ - DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object); - GdkGC *gc = renderer->gc; - GdkColor gdkcolor; - - color_convert(color, &gdkcolor); - gdk_gc_set_foreground(gc, &gdkcolor); - - gdk_draw_rectangle (renderer->pixmap, gc, TRUE, - x, y, width, height); -#else DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object); double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5; double lw[2]; @@ -660,6 +626,10 @@ fill_pixel_rect(DiaRenderer *object, cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u); cairo_fill (renderer->cr); -#endif } +DiaRenderer * +dia_cairo_interactive_renderer_new () +{ + return g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL); +} diff --git a/plug-ins/cairo/diacairo-print.c b/lib/renderer/diacairo-print.c similarity index 100% rename from plug-ins/cairo/diacairo-print.c rename to lib/renderer/diacairo-print.c diff --git a/plug-ins/cairo/diacairo-print.h b/lib/renderer/diacairo-print.h similarity index 100% rename from plug-ins/cairo/diacairo-print.h rename to lib/renderer/diacairo-print.h diff --git a/plug-ins/cairo/diacairo-renderer.c b/lib/renderer/diacairo-renderer.c similarity index 94% rename from plug-ins/cairo/diacairo-renderer.c rename to lib/renderer/diacairo-renderer.c index ea22235e0d6920b60208e02a028195d3d9d43b4f..b46778b02d838a2b43c94378b2c5e0d13e2112e4 100644 --- a/plug-ins/cairo/diacairo-renderer.c +++ b/lib/renderer/diacairo-renderer.c @@ -30,24 +30,17 @@ #include #include -#ifdef HAVE_PANGOCAIRO_H #include -#endif #include /* some backend headers, win32 missing in official Cairo */ -#ifdef CAIRO_HAS_PNG_SURFACE_FEATURE -#include -#endif +#include #ifdef CAIRO_HAS_PS_SURFACE #include #endif #ifdef CAIRO_HAS_PDF_SURFACE #include #endif -#ifdef CAIRO_HAS_SVG_SURFACE -#include -#endif #include "intl.h" #include "message.h" @@ -74,7 +67,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) real lmargin = 0.0, tmargin = 0.0; gboolean paginated = renderer->surface && /* only with our own pagination, not GtkPrint */ cairo_surface_get_type (renderer->surface) == CAIRO_SURFACE_TYPE_PDF && !renderer->skip_show_page; - Color background = color_white; + GdkRGBA background = color_white; if (renderer->surface && !renderer->cr) renderer->cr = cairo_create (renderer->surface); @@ -149,10 +142,8 @@ begin_render(DiaRenderer *self, const Rectangle *update) background.blue, 1.0); } -#ifdef HAVE_PANGOCAIRO_H if (!renderer->layout) renderer->layout = pango_cairo_create_layout (renderer->cr); -#endif cairo_set_fill_rule (renderer->cr, CAIRO_FILL_RULE_EVEN_ODD); @@ -235,7 +226,7 @@ set_pattern (DiaRenderer *self, DiaPattern *pattern) } static gboolean -_add_color_stop (real ofs, const Color *col, gpointer user_data) +_add_color_stop (real ofs, const GdkRGBA *col, gpointer user_data) { cairo_pattern_t *pat = (cairo_pattern_t *)user_data; @@ -520,26 +511,10 @@ set_font(DiaRenderer *self, DiaFont *font, real height) PangoFontDescription *pfd = pango_font_description_copy (dia_font_get_description (font)); DIAG_NOTE(g_message("set_font %f %s", height, dia_font_get_family(font))); -#ifdef HAVE_PANGOCAIRO_H /* select font and size */ pango_font_description_set_absolute_size (pfd, (int)(size * FONT_SIZE_TWEAK * PANGO_SCALE)); pango_layout_set_font_description (renderer->layout, pfd); pango_font_description_free (pfd); -#else - if (renderer->cr) { - DiaFontStyle style = dia_font_get_style (font); - const char *family_name = dia_font_get_family(font); - - cairo_select_font_face ( - renderer->cr, - family_name, - DIA_FONT_STYLE_GET_SLANT(style) == DIA_FONT_NORMAL ? CAIRO_FONT_SLANT_NORMAL : CAIRO_FONT_SLANT_ITALIC, - DIA_FONT_STYLE_GET_WEIGHT(style) < DIA_FONT_MEDIUM ? CAIRO_FONT_WEIGHT_NORMAL : CAIRO_FONT_WEIGHT_BOLD); - cairo_set_font_size (renderer->cr, size); - - DIAG_STATE(renderer->cr) - } -#endif /* for the interactive case we must maintain the font field in the base class */ if (self->is_interactive) { @@ -554,7 +529,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -573,7 +548,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); int i; @@ -599,7 +574,7 @@ draw_polyline(DiaRenderer *self, static void _polygon(DiaRenderer *self, Point *points, int num_points, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -632,7 +607,7 @@ _polygon(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _polygon (self, points, num_points, fill, TRUE); @@ -643,7 +618,7 @@ draw_polygon(DiaRenderer *self, static void _rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -668,7 +643,7 @@ _rect(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _rect (self, ul_corner, lr_corner, fill, TRUE); @@ -681,7 +656,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); Point start; @@ -726,7 +701,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); Point start; @@ -763,7 +738,7 @@ static void _ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *color, + GdkRGBA *color, gboolean fill) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -800,7 +775,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { if (fill) _ellipse (self, center, width, height, fill, TRUE); @@ -812,7 +787,7 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color, + GdkRGBA *color, gboolean fill, gboolean closed) { @@ -859,7 +834,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier (self, points, numpoints, color, FALSE, FALSE); } @@ -868,8 +843,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (fill) _bezier (self, points, numpoints, fill, TRUE, TRUE); @@ -882,7 +857,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); int len = strlen(text); @@ -893,7 +868,6 @@ draw_string(DiaRenderer *self, if (len < 1) return; /* shouldn't this be handled by Dia's core ? */ cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); -#ifdef HAVE_PANGOCAIRO_H cairo_save (renderer->cr); /* alignment calculation done by pangocairo? */ pango_layout_set_alignment (renderer->layout, alignment == ALIGN_CENTER ? PANGO_ALIGN_CENTER : @@ -920,33 +894,6 @@ draw_string(DiaRenderer *self, pango_cairo_show_layout (renderer->cr, renderer->layout); /* restoring the previous scale */ cairo_restore (renderer->cr); -#else - /* using the 'toy API' */ - { - cairo_text_extents_t extents; - double x = 0, y = 0; - cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha); - cairo_text_extents (renderer->cr, - text, - &extents); - - y = pos->y; /* ?? */ - - switch (alignment) { - case ALIGN_LEFT: - x = pos->x; - break; - case ALIGN_CENTER: - x = pos->x - extents.width / 2 + +extents.x_bearing; - break; - case ALIGN_RIGHT: - x = pos->x - extents.width + extents.x_bearing; - break; - } - cairo_move_to (renderer->cr, x, y); - cairo_show_text (renderer->cr, text); - } -#endif DIAG_STATE(renderer->cr) } @@ -1139,7 +1086,7 @@ static gpointer parent_class = NULL; static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -1175,7 +1122,7 @@ draw_rounded_rect (DiaRenderer *self, static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self); @@ -1239,10 +1186,8 @@ cairo_renderer_finalize (GObject *object) cairo_destroy (renderer->cr); if (renderer->surface) cairo_surface_destroy (renderer->surface); -#ifdef HAVE_PANGOCAIRO_H if (renderer->layout) g_object_unref (renderer->layout); -#endif G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/lib/renderer/diacairo.c b/lib/renderer/diacairo.c new file mode 100644 index 0000000000000000000000000000000000000000..9d8c1ed0e4a1173f1424ceae4852503ee5c4f6e5 --- /dev/null +++ b/lib/renderer/diacairo.c @@ -0,0 +1,338 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diacairo.c -- Cairo based export plugin for dia + * Copyright (C) 2004, Hans Breuer, + * based on wpg.c + * + * 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 +#include +#include + +#include +#define G_LOG_DOMAIN "DiaCairo" +#include +#include + +#include +/* some backend headers, win32 missing in official Cairo */ +#include +#ifdef CAIRO_HAS_PS_SURFACE +#include +#endif +#ifdef CAIRO_HAS_PDF_SURFACE +#include +#endif +#ifdef CAIRO_HAS_WIN32_SURFACE +#include +/* avoid namespace collisions */ +#define Rectangle RectangleWin32 +#endif +#ifdef CAIRO_HAS_SCRIPT_SURFACE +#include +#endif + +#include + +#include "intl.h" +#include "geometry.h" +#include "dia_image.h" +#include "diarenderer.h" +#include "filter.h" +#include "plug-ins.h" + +#include "diacairo.h" +#include "diacairo-print.h" + +#if defined CAIRO_HAS_WIN32_SURFACE && CAIRO_VERSION > 10510 +#define DIA_CAIRO_CAN_EMF 1 +#pragma message ("DiaCairo can EMF;)") +#endif + +/* dia export funtion */ +gboolean +cairo_export_data(DiagramData *data, DiaContext *ctx, + const gchar *filename, const gchar *diafilename, + void* user_data) +{ + DiaCairoRenderer *renderer; + FILE *file; + real width, height; + OutputKind kind = (OutputKind)user_data; + /* the passed in filename is in GLib's filename encoding. On Linux everything + * should be fine in passing it to the C-runtime (or cairo). On win32 GLib's + * filename encdong is always utf-8, so another conversion is needed. + */ + gchar *filename_crt = (gchar *)filename; +#if DIA_CAIRO_CAN_EMF + HDC hFileDC = NULL; +#endif + + if (kind != OUTPUT_CLIPBOARD) { + file = g_fopen(filename, "wb"); /* "wb" for binary! */ + + if (file == NULL) { + dia_context_add_message_with_errno(ctx, errno, _("Can't open output file %s."), + dia_context_get_filename(ctx)); + return FALSE; + } + fclose (file); +#ifdef G_OS_WIN32 + filename_crt = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); + if (!filename_crt) { + dia_context_add_message(ctx, _("Can't convert output filename '%s' to locale encoding.\n" + "Please choose a different name to save with Cairo.\n"), + dia_context_get_filename(ctx)); + return FALSE; + } +#endif + } /* != CLIPBOARD */ + renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); + renderer->dia = data; /* FIXME: not sure if this a good idea */ + renderer->scale = 1.0; + + switch (kind) { +#ifdef CAIRO_HAS_PS_SURFACE + case OUTPUT_PS : + width = data->paper.width * (72.0 / 2.54) + 0.5; + height = data->paper.height * (72.0 / 2.54) + 0.5; + renderer->scale = data->paper.scaling * (72.0 / 2.54); + DIAG_NOTE(g_message ("PS Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_ps_surface_create (filename_crt, + width, height); /* in points? */ + /* maybe we should increase the resolution here as well */ + break; +#endif +#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS + case OUTPUT_PNGA : + renderer->with_alpha = TRUE; + /* fall through */ + case OUTPUT_PNG : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("PNG Surface %dx%d\n", (int)width, (int)height)); + /* use case screwed by API shakeup. We need to special case */ + renderer->surface = cairo_image_surface_create( + CAIRO_FORMAT_ARGB32, + (int)width, (int)height); + /* an extra refernce to make it survive end_render():cairo_surface_destroy() */ + cairo_surface_reference(renderer->surface); + break; +#endif +#ifdef CAIRO_HAS_PDF_SURFACE + case OUTPUT_PDF : +#define DPI 300.0 /* 600.0? */ + /* I just don't get how the scaling is supposed to work, dpi versus page size ? */ + renderer->scale = data->paper.scaling * (72.0 / 2.54); + /* Dia's paper.width already contains the scale, cairo needs it without + * Similar for margins, Dia's without, but cairo wants them. The full + * extents don't matter here, because we do cairo_pdf_set_size() for every page. + */ + width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) + * (72.0 / 2.54) + 0.5; + height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) + * (72.0 / 2.54) + 0.5; + DIAG_NOTE(g_message ("PDF Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_pdf_surface_create (filename_crt, + width, height); + cairo_surface_set_fallback_resolution (renderer->surface, DPI, DPI); +#undef DPI + break; +#endif + case OUTPUT_SVG : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("SVG Surface %dx%d\n", (int)width, (int)height)); + /* use case screwed by API shakeup. We need to special case */ + renderer->surface = cairo_svg_surface_create( + filename_crt, + (int)width, (int)height); + break; +#ifdef CAIRO_HAS_SCRIPT_SURFACE + case OUTPUT_CAIRO_SCRIPT : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = (data->extents.right - data->extents.left) * renderer->scale + 0.5; + height = (data->extents.bottom - data->extents.top) * renderer->scale + 0.5; + DIAG_NOTE(g_message ("CairoScript Surface %dx%d\n", (int)width, (int)height)); + { + cairo_device_t *csdev = cairo_script_create (filename_crt); + cairo_script_set_mode (csdev, CAIRO_SCRIPT_MODE_ASCII); + renderer->surface = cairo_script_surface_create(csdev, CAIRO_CONTENT_COLOR_ALPHA, + width, height); + cairo_device_destroy (csdev); + } + break; +#endif + /* finally cairo can render to MetaFiles */ +#if DIA_CAIRO_CAN_EMF + case OUTPUT_EMF : + case OUTPUT_WMF : /* different only on close/'play' */ + case OUTPUT_CLIPBOARD : + /* NOT: renderer->with_alpha = TRUE; */ + { + /* see wmf/wmf.cpp */ + /* CreateEnhMetaFile() takes 0.01 mm, but the resulting clipboard + * image is much too big, e.g. when pasting to PowerPoint. So instead + * of 1000 use sth smaller to scale? But that would need new scaling + * for line thickness as well ... + * Also there is something wrong with clipping if running on a dual screen + * sometimes parts of the diagram are clipped away. Not sure if this is + * hitting some internal width limits, maintianing the viewport ratio, + * but not the diagram boundaries. + */ + RECT bbox = { 0, 0, + (int)((data->extents.right - data->extents.left) * data->paper.scaling * 1000.0), + (int)((data->extents.bottom - data->extents.top) * data->paper.scaling * 1000.0) }; + RECT clip; + /* CreateEnhMetaFile() takes resolution 0.01 mm, */ + hFileDC = CreateEnhMetaFile (NULL, NULL, &bbox, "DiaCairo\0Diagram\0"); + +#if 0 + /* On Windows 7/64 with two wide screen monitors, the clipping of the resulting + * metafile is too small. Scaling the bbox or via SetWorldTransform() does not help. + * Maybe we need to explitily set the clipping for cairo? + */ + GetClipBox (hFileDC, &clip); /* this is the display resolution */ + if (clip.right / (real)bbox.right > clip.bottom / (real)bbox.bottom) + clip.right = clip.bottom * bbox.right / bbox.bottom; + else + clip.bottom = clip.bottom * bbox.right / bbox.bottom; + + IntersectClipRect(hFileDC, clip.left, clip.top, clip.right, clip.bottom); +#endif + renderer->surface = cairo_win32_printing_surface_create (hFileDC); + + renderer->scale = 1000.0/25.4 * data->paper.scaling; + if (LOBYTE (g_win32_get_windows_version()) > 0x05 || + LOWORD (g_win32_get_windows_version()) > 0x0105) + renderer->scale *= 0.72; /* Works w/o for XP, but not on Vista/Win7 */ + } + break; +#endif + default : + /* quite arbitrary, but consistent with ../pixbuf ;-) */ + renderer->scale = 20.0 * data->paper.scaling; + width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; + height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; + DIAG_NOTE(g_message ("Image Surface %dx%d\n", (int)width, (int)height)); + renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_A8, (int)width, (int)height); + } + + /* use extents */ + DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", + data->extents.left, data->extents.top, data->extents.right, data->extents.bottom)); + + if (OUTPUT_PDF == kind) + data_render_paginated(data, DIA_RENDERER(renderer), NULL); + else + data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL); + +#if defined CAIRO_HAS_PNG_FUNCTIONS + if (OUTPUT_PNGA == kind || OUTPUT_PNG == kind) + { + cairo_surface_write_to_png(renderer->surface, filename_crt); + cairo_surface_destroy(renderer->surface); + } +#endif +#if DIA_CAIRO_CAN_EMF + if (OUTPUT_EMF == kind) { + FILE* f = g_fopen(filename, "wb"); + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + UINT nSize = GetEnhMetaFileBits (hEmf, 0, NULL); + BYTE* pData = g_new(BYTE, nSize); + nSize = GetEnhMetaFileBits (hEmf, nSize, pData); + if (f) { + fwrite(pData,1,nSize,f); + fclose(f); + } else { + dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); + } + DeleteEnhMetaFile (hEmf); + g_free (pData); + } else if (OUTPUT_WMF == kind) { + FILE* f = g_fopen(filename, "wb"); + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + HDC hdc = GetDC(NULL); + UINT nSize = GetWinMetaFileBits (hEmf, 0, NULL, MM_ANISOTROPIC, hdc); + BYTE* pData = g_new(BYTE, nSize); + nSize = GetWinMetaFileBits (hEmf, nSize, pData, MM_ANISOTROPIC, hdc); + if (f) { + /* FIXME: write the placeable header */ + fwrite(pData,1,nSize,f); + fclose(f); + } else { + dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); + } + ReleaseDC(NULL, hdc); + DeleteEnhMetaFile (hEmf); + g_free (pData); + } else if (OUTPUT_CLIPBOARD == kind) { + HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); + if ( OpenClipboard(NULL) + && EmptyClipboard() + && SetClipboardData (CF_ENHMETAFILE, hEmf) + && CloseClipboard ()) { + hEmf = NULL; /* data now owned by clipboard */ + } else { + dia_context_add_message(ctx, _("Clipboard copy failed")); + DeleteEnhMetaFile (hEmf); + } + } +#endif + g_object_unref(renderer); + if (filename != filename_crt) + g_free (filename_crt); + return TRUE; +} + +G_GNUC_UNUSED /* keep implmentation for reference, see bug 599401 */ +static gboolean +export_print_data (DiagramData *data, DiaContext *ctx, + const gchar *filename_utf8, const gchar *diafilename, + void* user_data) +{ + OutputKind kind = (OutputKind)user_data; + GtkPrintOperation *op = create_print_operation (data, filename_utf8); + GtkPrintOperationResult res; + GError *error = NULL; + +# ifdef CAIRO_HAS_PDF_SURFACE + /* as of this writing the only format Gtk+ supports here is PDF */ + g_assert (OUTPUT_PDF == kind); +# endif + + if (!data) { + dia_context_add_message(ctx, _("Nothing to print")); + return FALSE; + } + + gtk_print_operation_set_export_filename (op, filename_utf8 ? filename_utf8 : "output.pdf"); + res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_EXPORT, NULL, &error); + if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { + dia_context_add_message(ctx, "%s", error->message); + g_error_free (error); + return FALSE; + } + return TRUE; +} diff --git a/plug-ins/cairo/diacairo.h b/lib/renderer/diacairo.h similarity index 88% rename from plug-ins/cairo/diacairo.h rename to lib/renderer/diacairo.h index b9702180981a2e8bfbaa6a05cd49dca994a965dc..260ec6673df515bbe65f37cb082ae079ebf1b918 100644 --- a/plug-ins/cairo/diacairo.h +++ b/lib/renderer/diacairo.h @@ -90,7 +90,28 @@ struct _DiaCairoRendererClass DiaRendererClass parent_class; }; +typedef enum OutputKind +{ + OUTPUT_PS = 1, + OUTPUT_PNG, + OUTPUT_PNGA, + OUTPUT_PDF, + OUTPUT_WMF, + OUTPUT_EMF, + OUTPUT_CLIPBOARD, + OUTPUT_SVG, + OUTPUT_CAIRO_SCRIPT +} OutputKind; + +gboolean cairo_export_data (DiagramData *data, + DiaContext *ctx, + const gchar *filename, + const gchar *diafilename, + void *user_data); + /* FIXME: need to think about proper registration */ GType dia_cairo_interactive_renderer_get_type (void) G_GNUC_CONST; +DiaRenderer *dia_cairo_interactive_renderer_new (void); + G_END_DECLS diff --git a/lib/sheet.c b/lib/sheet.c index 698b750fa7783622fbe5d58d46afde27762556b5..378c535ceb5df0ccbf6f3e8e0e8e5d6521411dc0 100644 --- a/lib/sheet.c +++ b/lib/sheet.c @@ -41,15 +41,29 @@ #include "object-alias.h" #include "dia_dirs.h" +G_DEFINE_TYPE (DiaSheet, dia_sheet, G_TYPE_OBJECT) + static GSList *sheets = NULL; -Sheet * -new_sheet(char *name, gchar *description, char *filename, SheetScope scope, - Sheet *shadowing) +static void +dia_sheet_class_init (DiaSheetClass *klass) +{ + +} + +static void +dia_sheet_init (DiaSheet *self) +{ + +} + +DiaSheet * +dia_sheet_new (char *name, gchar *description, char *filename, SheetScope scope, + DiaSheet *shadowing) { - Sheet *sheet; + DiaSheet *sheet; - sheet = g_new(Sheet, 1); + sheet = g_object_new (DIA_TYPE_SHEET, NULL); sheet->name = g_strdup(name); sheet->description = g_strdup(description); @@ -62,7 +76,7 @@ new_sheet(char *name, gchar *description, char *filename, SheetScope scope, } void -sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *obj) +sheet_prepend_sheet_obj(DiaSheet *sheet, SheetObject *obj) { DiaObjectType *type; @@ -77,7 +91,7 @@ sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *obj) } void -sheet_append_sheet_obj(Sheet *sheet, SheetObject *obj) +sheet_append_sheet_obj(DiaSheet *sheet, SheetObject *obj) { DiaObjectType *type; @@ -92,7 +106,7 @@ sheet_append_sheet_obj(Sheet *sheet, SheetObject *obj) } void -register_sheet(Sheet *sheet) +register_sheet(DiaSheet *sheet) { sheets = g_slist_append(sheets, (gpointer) sheet); } @@ -114,8 +128,8 @@ static void load_register_sheet(const gchar *directory,const gchar *filename, static gint dia_sheet_sort_callback(gconstpointer a, gconstpointer b) { - return g_utf8_collate(gettext( ((Sheet *)(a))->name ), - gettext( ((Sheet *)(b))->name )); + return g_utf8_collate(gettext( ((DiaSheet *)(a))->name ), + gettext( ((DiaSheet *)(b))->name )); } void @@ -205,12 +219,12 @@ load_register_sheet(const gchar *dirname, const gchar *filename, gchar *name = NULL, *description = NULL; int name_score = -1; int descr_score = -1; - Sheet *sheet = NULL; + DiaSheet *sheet = NULL; GSList *sheetp; gboolean set_line_break = FALSE; gboolean name_is_gmalloced = FALSE; - Sheet *shadowing = NULL; - Sheet *shadowing_sheet = NULL; + DiaSheet *shadowing = NULL; + DiaSheet *shadowing_sheet = NULL; /* the XML fun begins here. */ @@ -302,12 +316,12 @@ load_register_sheet(const gchar *dirname, const gchar *filename, sheetp = get_sheets_list(); while (sheetp) { - if (sheetp->data && !strcmp(((Sheet *)(sheetp->data))->name, name)) + if (sheetp->data && !strcmp(((DiaSheet *)(sheetp->data))->name, name)) { struct stat first_file, this_file; int stat_ret; - stat_ret = g_stat(((Sheet *)(sheetp->data))->filename, &first_file); + stat_ret = g_stat(((DiaSheet *)(sheetp->data))->filename, &first_file); g_assert(!stat_ret); stat_ret = g_stat(filename, &this_file); @@ -340,7 +354,7 @@ load_register_sheet(const gchar *dirname, const gchar *filename, sheetp = g_slist_next(sheetp); } - sheet = new_sheet(name, description, g_strdup(filename), scope, shadowing); + sheet = dia_sheet_new(name, description, g_strdup(filename), scope, shadowing); if (shadowing_sheet) shadowing_sheet->shadowing = sheet; /* Hilarious :-) */ diff --git a/lib/sheet.h b/lib/sheet.h index 2c47aed09bc21e3f20aee6c7ec5b1c72d2487534..8b9b240552f8af15ad0e9a6c11725720dc82329e 100644 --- a/lib/sheet.h +++ b/lib/sheet.h @@ -19,6 +19,7 @@ #define SHEET_H #include +#include #include "diatypes.h" @@ -43,13 +44,18 @@ typedef enum } SheetScope; -struct _Sheet { +#define DIA_TYPE_SHEET (dia_sheet_get_type ()) +G_DECLARE_FINAL_TYPE (DiaSheet, dia_sheet, DIA, SHEET, GObject) + +struct _DiaSheet { + GObject parent; + char *name; char *description; char *filename; SheetScope scope; - Sheet *shadowing; /* If (scope == USER), the system sheet that this + DiaSheet *shadowing; /* If (scope == USER), the system sheet that this user sheet is shadowing. If (scope == SYSTEM), there has been a name collision between a system sheet and a user @@ -60,11 +66,11 @@ struct _Sheet { GSList *objects; /* list of SheetObject */ }; -Sheet *new_sheet(char *name, char *description, char *filename, - SheetScope scope, Sheet *shadowing); -void sheet_prepend_sheet_obj(Sheet *sheet, SheetObject *type); -void sheet_append_sheet_obj(Sheet *sheet, SheetObject *type); -void register_sheet(Sheet *sheet); +DiaSheet *dia_sheet_new (char *name, char *description, char *filename, + SheetScope scope, DiaSheet *shadowing); +void sheet_prepend_sheet_obj(DiaSheet *sheet, SheetObject *type); +void sheet_append_sheet_obj(DiaSheet *sheet, SheetObject *type); +void register_sheet(DiaSheet *sheet); GSList *get_sheets_list(void); void load_all_sheets(void); diff --git a/lib/standard-path.c b/lib/standard-path.c index 23224fc294500ba0e60fb3ace9c519e2bff7cbc4..f52af0bf8a608d23aa681e6512a0551c05790bb3 100644 --- a/lib/standard-path.c +++ b/lib/standard-path.c @@ -77,13 +77,13 @@ struct _StdPath { int stroke_or_fill; - Color line_color; + GdkRGBA line_color; real line_width; LineStyle line_style; real dashlength; LineJoin line_join; LineCaps line_caps; - Color fill_color; + GdkRGBA fill_color; /*! mirroring (stdpath->stroke_or_fill & PDO_FILL) */ gboolean show_background; @@ -400,7 +400,7 @@ stdpath_draw(StdPath *stdpath, DiaRenderer *renderer) if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_HOLES)) { if (stdpath->stroke_or_fill & PDO_FILL) { - Color fill = stdpath->fill_color; + GdkRGBA fill = stdpath->fill_color; if (stdpath->pattern) { dia_pattern_get_fallback_color (stdpath->pattern, &fill); if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_PATTERN)) @@ -422,7 +422,7 @@ stdpath_draw(StdPath *stdpath, DiaRenderer *renderer) /* step-wise approach */ /* if it wouldn't RENDER_HOLES it presumably also wouldn't RENDER_PATTERN ... */ if (stdpath->stroke_or_fill & PDO_FILL) { - Color fill = stdpath->fill_color; + GdkRGBA fill = stdpath->fill_color; if (stdpath->pattern) dia_pattern_get_fallback_color (stdpath->pattern, &fill); bezier_render_fill (renderer, stdpath->points, stdpath->num_points, &fill); diff --git a/lib/text.c b/lib/text.c index 3d8684bf42db067b30651719305b541aff4785b4..3890f39e10dd7f04923bd4e66f0dc70ae0eecffd 100644 --- a/lib/text.c +++ b/lib/text.c @@ -291,7 +291,7 @@ text_set_string(Text *text, const char *string) Text * new_text(const char *string, DiaFont *font, real height, - Point *pos, Color *color, Alignment align) + Point *pos, GdkRGBA *color, Alignment align) { Text *text; @@ -323,7 +323,7 @@ new_text(const char *string, DiaFont *font, real height, * Fallback function returning a default initialized text object. */ Text * -new_text_default(Point *pos, Color *color, Alignment align) +new_text_default(Point *pos, GdkRGBA *color, Alignment align) { Text *text; DiaFont *font; @@ -422,7 +422,7 @@ text_set_position(Text *text, Point *pos) } void -text_set_color(Text *text, Color *col) +text_set_color(Text *text, GdkRGBA *col) { text->color = *col; } @@ -935,8 +935,8 @@ text_key_event(Focus *focus, text = focus->text; switch(keyval) { - case GDK_Up: - case GDK_KP_Up: + case GDK_KEY_Up: + case GDK_KEY_KP_Up: text->cursor_row--; if (text->cursor_row<0) text->cursor_row = 0; @@ -945,8 +945,8 @@ text_key_event(Focus *focus, text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Down: - case GDK_KP_Down: + case GDK_KEY_Down: + case GDK_KEY_KP_Down: text->cursor_row++; if (text->cursor_row >= text->numlines) text->cursor_row = text->numlines - 1; @@ -955,8 +955,8 @@ text_key_event(Focus *focus, text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Left: - case GDK_KP_Left: + case GDK_KEY_Left: + case GDK_KEY_KP_Left: if (keystate & GDK_CONTROL_MASK) text_move_cursor(text, WORD_START); else @@ -964,8 +964,8 @@ text_key_event(Focus *focus, if (text->cursor_pos<0) text->cursor_pos = 0; break; - case GDK_Right: - case GDK_KP_Right: + case GDK_KEY_Right: + case GDK_KEY_KP_Right: if (keystate & GDK_CONTROL_MASK) text_move_cursor(text, WORD_END); else @@ -973,19 +973,19 @@ text_key_event(Focus *focus, if (text->cursor_pos > text_get_line_strlen(text, text->cursor_row)) text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Home: - case GDK_KP_Home: + case GDK_KEY_Home: + case GDK_KEY_KP_Home: text->cursor_pos = 0; break; - case GDK_End: - case GDK_KP_End: + case GDK_KEY_End: + case GDK_KEY_KP_End: text->cursor_pos = text_get_line_strlen(text, text->cursor_row); break; - case GDK_Delete: - case GDK_KP_Delete: + case GDK_KEY_Delete: + case GDK_KEY_KP_Delete: return_val = text_delete_key_handler(focus, change); break; - case GDK_BackSpace: + case GDK_KEY_BackSpace: return_val = TRUE; row = text->cursor_row; if (text->cursor_pos <= 0) { @@ -1009,22 +1009,22 @@ text_key_event(Focus *focus, } text_delete_backward(text); break; - case GDK_Return: - case GDK_KP_Enter: + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: return_val = TRUE; *change = text_create_change(text, TYPE_SPLIT_ROW, 'Q', text->cursor_pos, text->cursor_row, focus->obj); text_split_line(text); break; - case GDK_Shift_L: - case GDK_Shift_R: - case GDK_Control_L: - case GDK_Control_R: - case GDK_Alt_L: - case GDK_Alt_R: - case GDK_Meta_L: - case GDK_Meta_R: + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + case GDK_KEY_Meta_L: + case GDK_KEY_Meta_R: return_val = FALSE; /* no text change for modifiers */ break; default: @@ -1109,7 +1109,7 @@ data_text(AttributeNode text_attr, DiaContext *ctx) DiaFont *font; real height; Point pos = {0.0, 0.0}; - Color col; + GdkRGBA col; Alignment align; AttributeNode attr; Text *text; diff --git a/lib/text.h b/lib/text.h index e8bf81787974582631f6cb36f6ec431ab10fe2a6..7f9c5acf5ec5d09cf66520c5cc0882d618ff3aa9 100644 --- a/lib/text.h +++ b/lib/text.h @@ -51,7 +51,7 @@ struct _Text { DiaFont *font; real height; Point position; - Color color; + GdkRGBA color; Alignment alignment; /* Cursor pos: */ @@ -69,8 +69,8 @@ struct _Text { /* makes an internal copy of the string */ /*! \brief Text object creation \memberof _Text */ Text *new_text(const char *string, DiaFont *font, real height, - Point *pos, Color *color, Alignment align); -Text *new_text_default(Point *pos, Color *color, Alignment align); + Point *pos, GdkRGBA *color, Alignment align); +Text *new_text_default(Point *pos, GdkRGBA *color, Alignment align); void text_destroy(Text *text); Text *text_copy(Text *text); gchar *text_get_line(const Text *text, int line); @@ -80,7 +80,7 @@ void text_set_height(Text *text, real height); real text_get_height(const Text *text); void text_set_font(Text *text, DiaFont *font); void text_set_position(Text *text, Point *pos); -void text_set_color(Text *text, Color *col); +void text_set_color(Text *text, GdkRGBA *col); void text_set_alignment(Text *text, Alignment align); real text_distance_from(Text *text, Point *point); void text_calc_boundingbox(Text *text, Rectangle *box); diff --git a/lib/textattr.h b/lib/textattr.h index 993f7fc800324dc76a765c9c336a1249509ea72d..23f4bb6258e2060a69139a4c1e61e2c5677fefb5 100644 --- a/lib/textattr.h +++ b/lib/textattr.h @@ -18,16 +18,17 @@ #ifndef TEXTATTR_H #define TEXTATTR_H +#include + #include "diatypes.h" #include "font.h" #include "geometry.h" -#include "color.h" struct _TextAttributes { DiaFont *font; real height; Point position; - Color color; + GdkRGBA color; Alignment alignment; }; diff --git a/lib/widgets.c b/lib/widgets.c index d1467630703091f140282b8cfded195fbaa9f2ae..9f97ec7c6e1432ac89c0f9ac3a2570660899ee90 100644 --- a/lib/widgets.c +++ b/lib/widgets.c @@ -23,7 +23,6 @@ #include "units.h" #include "message.h" #include "dia_dirs.h" -#include "diadynamicmenu.h" #include "diaoptionmenu.h" #include "dia-lib-icons.h" @@ -44,7 +43,7 @@ */ struct _DiaSizeSelector { - GtkHBox hbox; + GtkBox hbox; GtkSpinButton *width, *height; GtkToggleButton *aspect_locked; real ratio; @@ -53,7 +52,7 @@ struct _DiaSizeSelector struct _DiaSizeSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -150,6 +149,9 @@ dia_size_selector_init (DiaSizeSelector *ss) { GtkAdjustment *adj; + gtk_orientable_set_orientation (GTK_ORIENTABLE (ss), + GTK_ORIENTATION_HORIZONTAL); + ss->ratio = 0.0; /* Here's where we set up the real thing */ adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.01, 10, @@ -212,7 +214,7 @@ dia_size_selector_get_type (void) (GInstanceInitFunc) dia_size_selector_init }; - dss_type = g_type_register_static (gtk_hbox_get_type (), + dss_type = g_type_register_static (GTK_TYPE_BOX, "DiaSizeSelector", &dss_info, 0); } @@ -289,7 +291,7 @@ dia_alignment_selector_set_alignment (GtkWidget *as, /************* DiaFileSelector: ***************/ struct _DiaFileSelector { - GtkHBox hbox; + GtkBox hbox; GtkEntry *entry; GtkButton *browse; GtkWidget *dialog; @@ -299,7 +301,7 @@ struct _DiaFileSelector struct _DiaFileSelectorClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; enum { @@ -389,9 +391,9 @@ dia_file_selector_browse_pressed(GtkWidget *widget, gpointer data) dialog = fs->dialog = gtk_file_chooser_dialog_new (_("Select image file"), toplevel ? GTK_WINDOW(toplevel) : NULL, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Open"), GTK_RESPONSE_ACCEPT, + NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(file_open_response_callback), NULL); @@ -427,6 +429,9 @@ dia_file_selector_browse_pressed(GtkWidget *widget, gpointer data) static void dia_file_selector_init (DiaFileSelector *fs) { + gtk_orientable_set_orientation (GTK_ORIENTABLE (fs), + GTK_ORIENTATION_HORIZONTAL); + /* Here's where we set up the real thing */ fs->dialog = NULL; fs->sys_filename = NULL; @@ -464,7 +469,7 @@ dia_file_selector_get_type (void) (GInstanceInitFunc)dia_file_selector_init, }; - dfs_type = g_type_register_static (gtk_hbox_get_type (), + dfs_type = g_type_register_static (GTK_TYPE_BOX, "DiaFileSelector", &dfs_info, 0); } @@ -743,18 +748,14 @@ dia_toggle_button_new(GtkWidget *on_widget, GtkWidget *off_widget) gtk_widget_show(images->off); /* Make border as small as possible */ - gtk_misc_set_padding(GTK_MISC(images->on), 0, 0); - gtk_misc_set_padding(GTK_MISC(images->off), 0, 0); -#if GTK_CHECK_VERSION(2,18,0) + g_object_set (G_OBJECT (images->on), + "margin", 0, + NULL); + g_object_set (G_OBJECT (images->off), + "margin", 0, + NULL); gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); -#endif -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_DEFAULT); -#endif rcstyle = gtk_rc_style_new (); rcstyle->xthickness = rcstyle->ythickness = 0; diff --git a/lib/widgets.h b/lib/widgets.h index d35cb08699de932c9123caa6fc6d641bb2074830..a7c7c2b378bb642c533287f3433b5688e00b2042 100644 --- a/lib/widgets.h +++ b/lib/widgets.h @@ -23,61 +23,20 @@ #include "diatypes.h" #include "font.h" -#include "color.h" #include "arrows.h" #include "units.h" +#include "widgets/dia-line-chooser.h" /* DiaAlignmentSelector: */ GtkWidget* dia_alignment_selector_new (void); Alignment dia_alignment_selector_get_alignment (GtkWidget *as); void dia_alignment_selector_set_alignment (GtkWidget *as, Alignment align); -/* DiaLineStyleSelector: */ -#define DIALINESTYLESELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_line_style_selector_get_type (), DiaLineStyleSelector) -#define DIALINESTYLESELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_line_style_selector_get_type (), DiaLineStyleSelectorClass) -#define IS_DIALINESTYLESELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, dia_line_style_selector_get_type ()) - -GType dia_line_style_selector_get_type (void); -GtkWidget* dia_line_style_selector_new (void); -void dia_line_style_selector_get_linestyle (DiaLineStyleSelector *as, - LineStyle *linestyle, - real *dashlength); -void dia_line_style_selector_set_linestyle (DiaLineStyleSelector *as, - LineStyle linestyle, - real dashlength); - -/* DiaColorSelector: */ -#define DIACOLORSELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_color_selector_get_type (), DiaColorSelector) -#define DIACOLORSELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_color_selector_get_type (), DiaColorSelectorClass) -#define IS_DIACOLORSELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, dia_color_selector_get_type ()) - -GType dia_color_selector_get_type (void); -GtkWidget* dia_color_selector_new (void); -void dia_color_selector_set_use_alpha (GtkWidget *cs, gboolean use_alpha); -void dia_color_selector_get_color (GtkWidget *cs, Color *color); -void dia_color_selector_set_color (GtkWidget *cs, - const Color *color); - - /* DiaArrowSelector */ -#define DIA_TYPE_ARROW_SELECTOR (dia_arrow_selector_get_type()) -#define DIA_ARROW_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, dia_arrow_selector_get_type (), DiaArrowSelector)) -#define DIA_ARROW_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, dia_arrow_selector_get_type (), DiaArrowSelectorClass)) -#define DIA_IS_ARROW_SELECTOR(obj) (G_TYPE_CHECK_TYPE (obj, dia_arrow_selector_get_type ())) -#define DIA_ARROW_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_ARROW_SELECTOR, DiaArrowSelectorClass)) - #define DEFAULT_ARROW ARROW_NONE #define DEFAULT_ARROW_LENGTH DEFAULT_ARROW_SIZE #define DEFAULT_ARROW_WIDTH DEFAULT_ARROW_SIZE - -GType dia_arrow_selector_get_type (void); -GtkWidget* dia_arrow_selector_new (void); -Arrow dia_arrow_selector_get_arrow (DiaArrowSelector *as); -void dia_arrow_selector_set_arrow (DiaArrowSelector *as, - Arrow arrow); - - /* DiaFileSelector: */ #define DIAFILESELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, dia_file_selector_get_type (), DiaFileSelector) #define DIAFILESELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, dia_file_selector_get_type (), DiaFileSelectorClass) diff --git a/lib/widgets/dia-arrow-chooser.c b/lib/widgets/dia-arrow-chooser.c new file mode 100644 index 0000000000000000000000000000000000000000..38385c6d3032717d3383b822c1d0466327602196 --- /dev/null +++ b/lib/widgets/dia-arrow-chooser.c @@ -0,0 +1,508 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diarrowchooser.c -- Copyright (C) 1999 James Henstridge. + * Copyright (C) 2004 Hubert Figuiere + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** \file diaarrowchooser.c A widget to choose arrowhead. This only select arrowhead, not width and height. + * \ingroup diawidgets + */ +#include + +#include +#include "intl.h" +#include "widgets.h" +#include "dia-arrow-chooser.h" +#include "renderer/diacairo.h" +#include "dia_dirs.h" + +/* --------------- DiaArrowPreview -------------------------------- */ +static void dia_arrow_preview_set(DiaArrowPreview *arrow, + ArrowType atype, gboolean left); +static gint dia_arrow_preview_draw (GtkWidget *widget, + cairo_t *ctx); + +G_DEFINE_TYPE (DiaArrowPreview, dia_arrow_preview, GTK_TYPE_WIDGET) + +/** Initialize class information for the arrow preview class. + * @param class The class object to initialize/ + */ +static void +dia_arrow_preview_class_init(DiaArrowPreviewClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_arrow_preview_draw; +} + +/** Initialize an arrow preview widget. + * @param arrow The widget to initialize. + */ +static void +dia_arrow_preview_init (DiaArrowPreview *self) +{ + gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 24); + + self->atype = ARROW_NONE; + self->left = TRUE; +} + +/** Create a new arrow preview widget. + * @param atype The type of arrow to start out selected with. + * @param left If TRUE, this preview will point to the left. + * @return A new widget. + */ +GtkWidget * +dia_arrow_preview_new(ArrowType atype, gboolean left) +{ + DiaArrowPreview *arrow = g_object_new(DIA_TYPE_ARROW_PREVIEW, NULL); + + arrow->atype = atype; + arrow->left = left; + return GTK_WIDGET(arrow); +} + +/** Set the values shown by an arrow preview widget. + * @param arrow Preview widget to change. + * @param atype New arrow type to use. + * @param left If TRUE, the preview should point to the left. + */ +static void +dia_arrow_preview_set(DiaArrowPreview *arrow, ArrowType atype, gboolean left) +{ + if (arrow->atype != atype || arrow->left != left) { + arrow->atype = atype; + arrow->left = left; + if (gtk_widget_is_drawable(GTK_WIDGET(arrow))) + gtk_widget_queue_draw(GTK_WIDGET(arrow)); + } +} + +/** Expose handle for the arrow preview widget. + * @param widget The widget to display. + * @param event The event that caused the call. + * @return TRUE always. + * The expose handler gets called when the Arrow needs to be drawn. + */ +static gboolean +dia_arrow_preview_draw (GtkWidget *widget, cairo_t *ctx) +{ + Point from, to; + Point move_arrow, move_line, arrow_head; + DiaCairoRenderer *renderer; + DiaArrowPreview *arrow = DIA_ARROW_PREVIEW(widget); + Arrow arrow_type; + gint width, height; + GtkAllocation alloc; + int linewidth = 2; + DiaRendererClass *renderer_ops; + GtkStyleContext *context = gtk_widget_get_style_context (widget); + + gtk_widget_get_allocation (widget, &alloc); + + width = alloc.width; + height = alloc.height; + + to.y = from.y = height/2; + if (arrow->left) { + from.x = width-linewidth; + to.x = 0; + } else { + from.x = 0; + to.x = width-linewidth; + } + + /* here we must do some acrobaticts and construct Arrow type + * variable + */ + arrow_type.type = arrow->atype; + arrow_type.length = .75*((real)height-linewidth); + arrow_type.width = .75*((real)height-linewidth); + + /* and here we calculate new arrow start and end of line points */ + calculate_arrow_point(&arrow_type, &from, &to, + &move_arrow, &move_line, + linewidth); + arrow_head = to; + point_add(&arrow_head, &move_arrow); + point_add(&to, &move_line); + + renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); + renderer->with_alpha = TRUE; + renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + + renderer_ops = DIA_RENDERER_GET_CLASS (renderer); + renderer_ops->begin_render(DIA_RENDERER (renderer), NULL); + renderer_ops->set_linewidth(DIA_RENDERER (renderer), linewidth); + { + GdkRGBA fg; + GdkRGBA bg = { 0, 0, 0, 0 }; + /* the text colors are the best approximation to what we had */ + gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); + + + renderer_ops->draw_line(DIA_RENDERER (renderer), &from, &to, &fg); + arrow_draw (DIA_RENDERER (renderer), arrow_type.type, + &arrow_head, &from, + arrow_type.length, + arrow_type.width, + linewidth, &fg, &bg); + } + renderer_ops->end_render(DIA_RENDERER (renderer)); + + cairo_set_source_surface (ctx, renderer->surface, 0, 0); + cairo_paint (ctx); + + g_object_unref(renderer); + + return FALSE; +} + +typedef struct _DiaArrowChooserPopoverPrivate DiaArrowChooserPopoverPrivate; + +struct _DiaArrowChooserPopoverPrivate { + GtkWidget *list; + GtkWidget *size; + GtkWidget *size_box; + + Arrow arrow; + gboolean left; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaArrowChooserPopover, dia_arrow_chooser_popover, GTK_TYPE_POPOVER, + G_ADD_PRIVATE (DiaArrowChooserPopover)) + +enum { + DAC_POP_VALUE_CHANGED, + DAC_POP_LAST_SIGNAL +}; + +static guint dac_pop_signals[DAC_POP_LAST_SIGNAL] = { 0 }; + +enum { + DAC_POP_PROP_LEFT = 1, + DAC_POP_N_PROPS +}; +static GParamSpec* dac_pop_properties[DAC_POP_N_PROPS]; + +GtkWidget * +dia_arrow_chooser_popover_new (gboolean left) +{ + return g_object_new (DIA_TYPE_ARROW_CHOOSER_POPOVER, + "left", left, + NULL); +} + +static void +dia_arrow_chooser_popover_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaArrowChooserPopover *self = DIA_ARROW_CHOOSER_POPOVER (object); + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + switch (property_id) { + case DAC_POP_PROP_LEFT: + priv->left = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_arrow_chooser_popover_class_init (DiaArrowChooserPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->set_property = dia_arrow_chooser_popover_set_property; + + dac_pop_properties[DAC_POP_PROP_LEFT] = + g_param_spec_boolean ("left", + "Is left", + "Does the arrow point left", + TRUE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_properties (object_class, + DAC_POP_N_PROPS, + dac_pop_properties); + + dac_pop_signals[DAC_POP_VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-arrow-chooser-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, list); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, size); + gtk_widget_class_bind_template_child_private (widget_class, DiaArrowChooserPopover, size_box); + + g_object_unref (template_file); +} + +static void +row_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + ArrowType atype = arrow_type_from_index (gtk_list_box_row_get_index (row)); + + if (priv->arrow.type != atype) { + priv->arrow.type = atype; + dia_arrow_chooser_popover_set_arrow (self, &priv->arrow); + } + + gtk_widget_set_sensitive (GTK_WIDGET (priv->size_box), + g_ascii_strcasecmp (arrow_get_name_from_type (atype), "None") != 0); +} + +static void +size_changed (DiaSizeSelector *selector, + DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + dia_size_selector_get_size (DIA_SIZE_SELECTOR (priv->size), &priv->arrow.width, &priv->arrow.length); + + dia_arrow_chooser_popover_set_arrow (self, &priv->arrow); +} + +static void +dia_arrow_chooser_popover_init (DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + priv->arrow.type = ARROW_NONE; + priv->arrow.length = DEFAULT_ARROW_LENGTH; + priv->arrow.width = DEFAULT_ARROW_WIDTH; + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* although from ARROW_NONE to MAX_ARROW_TYPE-1 this is sorted by *index* to keep the order consistent with earlier releases */ + for (int i = ARROW_NONE; i < MAX_ARROW_TYPE; ++i) { + ArrowType arrow_type = arrow_type_from_index (i); + GtkWidget *ar = dia_arrow_preview_new (arrow_type, priv->left); + /* TODO: Don't gettext here */ + gtk_widget_set_tooltip_text (ar, gettext (arrow_get_name_from_type (arrow_type))); + gtk_widget_show (ar); + gtk_list_box_insert (GTK_LIST_BOX (priv->list), ar, i); + } + + g_signal_connect (G_OBJECT (priv->list), "row-selected", + G_CALLBACK (row_selected), self); + + g_signal_connect (G_OBJECT (priv->size), "value-changed", + G_CALLBACK (size_changed), self); +} + +Arrow +dia_arrow_chooser_popover_get_arrow (DiaArrowChooserPopover *self) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + return priv->arrow; +} + +void +dia_arrow_chooser_popover_set_arrow (DiaArrowChooserPopover *self, + Arrow *arrow) +{ + DiaArrowChooserPopoverPrivate *priv = dia_arrow_chooser_popover_get_instance_private (self); + + priv->arrow.type = arrow->type; + priv->arrow.width = arrow->width; + priv->arrow.length = arrow->length; + + dia_size_selector_set_size (DIA_SIZE_SELECTOR (priv->size), arrow->width, arrow->length); + gtk_list_box_select_row (GTK_LIST_BOX (priv->list), + gtk_list_box_get_row_at_index (GTK_LIST_BOX (priv->list), + arrow_index_from_type (arrow->type))); + + g_signal_emit (G_OBJECT (self), + dac_pop_signals[DAC_POP_VALUE_CHANGED], 0); +} + +/* ------- Code for DiaArrowChooser ----------------------- */ + +typedef struct _DiaArrowChooserPrivate DiaArrowChooserPrivate; + +struct _DiaArrowChooserPrivate { + gboolean left; + + GtkWidget *preview; + GtkWidget *popover; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaArrowChooser, dia_arrow_chooser, GTK_TYPE_MENU_BUTTON, + G_ADD_PRIVATE (DiaArrowChooser)) + +enum { + DAC_VALUE_CHANGED, + DAC_LAST_SIGNAL +}; + +static guint dac_signals[DAC_LAST_SIGNAL] = { 0 }; + +enum { + DAC_PROP_LEFT = 1, + DAC_N_PROPS +}; +static GParamSpec* dac_properties[DAC_N_PROPS]; + +static void +dia_arrow_chooser_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaArrowChooser *self = DIA_ARROW_CHOOSER (object); + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + switch (property_id) { + case DAC_PROP_LEFT: + priv->left = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +/** Initialize class information for the arrow choose. + * @param class Class structure to initialize private fields of. + */ +static void +dia_arrow_chooser_class_init (DiaArrowChooserClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = dia_arrow_chooser_set_property; + + dac_properties[DAC_PROP_LEFT] = + g_param_spec_boolean ("left", + "Is left", + "Does the arrow point left", + TRUE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE); + + g_object_class_install_properties (object_class, + DAC_N_PROPS, + dac_properties); + + dac_signals[DAC_VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); + + /* Just in case it's not registered when using GtkBuilder */ + g_type_ensure (dia_size_selector_get_type ()); +} + +static void +value_changed (DiaArrowChooserPopover *popover, + DiaArrowChooser *chooser) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (chooser); + Arrow arrow = dia_arrow_chooser_popover_get_arrow (popover); + + dia_arrow_preview_set (DIA_ARROW_PREVIEW (priv->preview), arrow.type, priv->left); + + g_signal_emit (G_OBJECT (chooser), dac_signals[DAC_VALUE_CHANGED], 0); +} + +/** Initialize an arrow choose object. + * @param arrow Newly allocated arrow choose object. + */ +static void +dia_arrow_chooser_init (DiaArrowChooser *self) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + GtkWidget *wid; + + wid = dia_arrow_preview_new (ARROW_NONE, priv->left); + gtk_container_add (GTK_CONTAINER (self), wid); + gtk_widget_show (wid); + priv->preview = wid; + + priv->popover = dia_arrow_chooser_popover_new (priv->left); + g_signal_connect (G_OBJECT (priv->popover), "value-changed", + G_CALLBACK (value_changed), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), priv->popover); +} + +/** Create a new arrow chooser object. + * @param left If TRUE, this chooser will point its arrowheads to the left. + * @return A new DiaArrowChooser widget. + */ +GtkWidget * +dia_arrow_chooser_new (gboolean left) +{ + return g_object_new (DIA_TYPE_ARROW_CHOOSER, + "left", left, + NULL); +} + +/** Set the type of arrow shown by the arrow chooser. If the arrow type + * changes, the callback function will be called. + * @param chooser The chooser to update. + * @param arrow The arrow type and dimensions the chooser will dispaly. + * Should it be called as well when the dimensions change? + */ +void +dia_arrow_chooser_set_arrow (DiaArrowChooser *self, Arrow *arrow) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + + dia_arrow_chooser_popover_set_arrow (DIA_ARROW_CHOOSER_POPOVER (priv->popover), + arrow); +} + +/** Get the currently selected arrow type from an arrow chooser. + * @param arrow An arrow chooser to query. + * @return The arrow type that is currently selected in the chooser. + */ +ArrowType +dia_arrow_chooser_get_arrow_type (DiaArrowChooser *self) +{ + return dia_arrow_chooser_get_arrow(self).type; +} + +Arrow +dia_arrow_chooser_get_arrow (DiaArrowChooser *self) +{ + DiaArrowChooserPrivate *priv = dia_arrow_chooser_get_instance_private (self); + + return dia_arrow_chooser_popover_get_arrow (DIA_ARROW_CHOOSER_POPOVER (priv->popover)); +} diff --git a/lib/widgets/dia-arrow-chooser.h b/lib/widgets/dia-arrow-chooser.h new file mode 100644 index 0000000000000000000000000000000000000000..1520718775107d6c55a9309cad30f276fac1dd1e --- /dev/null +++ b/lib/widgets/dia-arrow-chooser.h @@ -0,0 +1,75 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * diarrowchooser.h -- Copyright (C) 1999 James Henstridge. + * Copyright (C) 2004 Hubert Figuiere + * + * 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 _DIAARROWCHOOSER_H_ +#define _DIAARROWCHOOSER_H_ + +#include + +#include "arrows.h" +#include "diatypes.h" + + +/* --------------- DiaArrowPreview -------------------------------- */ + +#define DIA_TYPE_ARROW_PREVIEW (dia_arrow_preview_get_type ()) +G_DECLARE_FINAL_TYPE (DiaArrowPreview, dia_arrow_preview, DIA, ARROW_PREVIEW, GtkWidget) + +struct _DiaArrowPreview +{ + GtkWidget misc; + ArrowType atype; + gboolean left; +}; + +GtkWidget *dia_arrow_preview_new (ArrowType atype, gboolean left); + + +/* ------- Code for DiaArrowChooser ----------------------- */ + +#define DIA_TYPE_ARROW_CHOOSER_POPOVER (dia_arrow_chooser_popover_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaArrowChooserPopover, dia_arrow_chooser_popover, DIA, ARROW_CHOOSER_POPOVER, GtkPopover) + +struct _DiaArrowChooserPopoverClass { + GtkPopoverClass parent_class; +}; + +GtkWidget *dia_arrow_chooser_popover_new (gboolean left); +void dia_arrow_chooser_popover_set_arrow (DiaArrowChooserPopover *chooser, + Arrow *arrow); +Arrow dia_arrow_chooser_popover_get_arrow (DiaArrowChooserPopover *chooser); + + +#define DIA_TYPE_ARROW_CHOOSER (dia_arrow_chooser_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaArrowChooser, dia_arrow_chooser, DIA, ARROW_CHOOSER, GtkMenuButton) + +struct _DiaArrowChooserClass +{ + GtkMenuButtonClass parent_class; +}; + +GtkWidget *dia_arrow_chooser_new (gboolean left); +void dia_arrow_chooser_set_arrow (DiaArrowChooser *chooser, + Arrow *arrow); +Arrow dia_arrow_chooser_get_arrow (DiaArrowChooser *chooser); +ArrowType dia_arrow_chooser_get_arrow_type (DiaArrowChooser *chooser); + +#endif /* _DIAARROWCHOOSER_H_ */ diff --git a/lib/widgets/dia-line-chooser-popover.c b/lib/widgets/dia-line-chooser-popover.c new file mode 100644 index 0000000000000000000000000000000000000000..c466b8752a8d5c7a6121e5f66ad3c974a1020b72 --- /dev/null +++ b/lib/widgets/dia-line-chooser-popover.c @@ -0,0 +1,147 @@ +#include +#include + +#include "dia-line-chooser.h" +#include "dia-line-chooser-popover.h" +#include "dia_dirs.h" + +typedef struct _DiaLineChooserPopoverPrivate DiaLineChooserPopoverPrivate; + +struct _DiaLineChooserPopoverPrivate { + GtkWidget *list; + GtkWidget *length; + GtkWidget *length_box; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaLineChooserPopover, dia_line_chooser_popover, GTK_TYPE_POPOVER, + G_ADD_PRIVATE (DiaLineChooserPopover)) + +enum { + VALUE_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +GtkWidget * +dia_line_chooser_popover_new () +{ + return g_object_new (DIA_TYPE_LINE_CHOOSER_POPOVER, NULL); +} + +LineStyle +dia_line_chooser_popover_get_line_style (DiaLineChooserPopover *self, + gdouble *length) +{ + DiaLineChooserPopoverPrivate *priv = dia_line_chooser_popover_get_instance_private (self); + GtkListBoxRow *row; + GtkWidget *preview; + LineStyle style; + + row = gtk_list_box_get_selected_row (GTK_LIST_BOX (priv->list)); + preview = gtk_bin_get_child (GTK_BIN (row)); + style = dia_line_preview_get_line_style (DIA_LINE_PREVIEW (preview)); + + /* Don't both getting this if we don't have somewhere to return it */ + if (length) { + *length = gtk_spin_button_get_value (GTK_SPIN_BUTTON (priv->length)); + } + + return style; +} + +void +dia_line_chooser_popover_set_line_style (DiaLineChooserPopover *self, + LineStyle line_style) +{ + DiaLineChooserPopoverPrivate *priv = dia_line_chooser_popover_get_instance_private (self); + GtkListBoxRow *row; + + row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (priv->list), line_style); + gtk_list_box_select_row (GTK_LIST_BOX (priv->list), row); +} + +void +dia_line_chooser_popover_set_length (DiaLineChooserPopover *self, + gdouble length) +{ + DiaLineChooserPopoverPrivate *priv = dia_line_chooser_popover_get_instance_private (self); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->length), length); +} + +static void +dia_line_chooser_popover_class_init (DiaLineChooserPopoverClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + signals[VALUE_CHANGED] = g_signal_new ("value-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-line-chooser-popover.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineChooserPopover, list); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineChooserPopover, length); + gtk_widget_class_bind_template_child_private (widget_class, DiaLineChooserPopover, length_box); + + g_object_unref (template_file); +} + +static void +spin_change (GtkSpinButton *sb, gpointer data) +{ + g_signal_emit (G_OBJECT (data), + signals[VALUE_CHANGED], 0); +} + +static void +row_selected (GtkListBox *box, + GtkListBoxRow *row, + DiaLineChooserPopover *self) +{ + DiaLineChooserPopoverPrivate *priv = dia_line_chooser_popover_get_instance_private (self); + + int state; + state = dia_line_chooser_popover_get_line_style (self, NULL) + != LINESTYLE_SOLID; + + gtk_widget_set_sensitive (priv->length_box, state); + g_signal_emit (G_OBJECT (self), + signals[VALUE_CHANGED], 0); +} + +static void +dia_line_chooser_popover_init (DiaLineChooserPopover *self) +{ + DiaLineChooserPopoverPrivate *priv = dia_line_chooser_popover_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_object_set (G_OBJECT (priv->length), + "climb-rate", DEFAULT_LINESTYLE_DASHLEN, + NULL); + g_signal_connect (G_OBJECT (priv->length), "changed", + G_CALLBACK (spin_change), self); + + for (int i = 0; i <= LINESTYLE_DOTTED; i++) { + GtkWidget *style = dia_line_preview_new (i); + gtk_widget_show (style); + gtk_list_box_insert (GTK_LIST_BOX (priv->list), style, i); + } + + g_signal_connect (G_OBJECT (priv->list), "row-selected", + G_CALLBACK (row_selected), self); +} diff --git a/lib/widgets/dia-line-chooser-popover.h b/lib/widgets/dia-line-chooser-popover.h new file mode 100644 index 0000000000000000000000000000000000000000..5d3f7e719179c08e3662f8f93d2696b1912ac6f2 --- /dev/null +++ b/lib/widgets/dia-line-chooser-popover.h @@ -0,0 +1,28 @@ +#ifndef __DIALSSPOPOVER_H__ +#define __DIALSSPOPOVER_H__ + +#include +#include + +#include "dia-enums.h" + +G_BEGIN_DECLS + +#define DIA_TYPE_LINE_CHOOSER_POPOVER (dia_line_chooser_popover_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaLineChooserPopover, dia_line_chooser_popover, DIA, LINE_CHOOSER_POPOVER, GtkPopover) + +struct _DiaLineChooserPopoverClass { + GtkPopoverClass parent_class; +}; + +GtkWidget *dia_line_chooser_popover_new (void); +LineStyle dia_line_chooser_popover_get_line_style (DiaLineChooserPopover *self, + gdouble *length); +void dia_line_chooser_popover_set_line_style (DiaLineChooserPopover *self, + LineStyle line_style); +void dia_line_chooser_popover_set_length (DiaLineChooserPopover *self, + gdouble length); + +G_END_DECLS + +#endif diff --git a/lib/widgets/dia-line-chooser.c b/lib/widgets/dia-line-chooser.c new file mode 100644 index 0000000000000000000000000000000000000000..7f1ef971e54d994976136f5a92d6d72d64d2c753 --- /dev/null +++ b/lib/widgets/dia-line-chooser.c @@ -0,0 +1,240 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * 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 + +#include "intl.h" +#include "widgets.h" +#include "diaoptionmenu.h" +#include "dia-line-chooser.h" +#include "dia-line-chooser-popover.h" + +/************* DiaLinePreview: ***************/ + +G_DEFINE_TYPE (DiaLinePreview, dia_line_preview, GTK_TYPE_WIDGET) + +static gint +dia_line_preview_draw (GtkWidget *widget, cairo_t *ctx) +{ + DiaLinePreview *line = DIA_LINE_PREVIEW (widget); + GtkAllocation alloc; + gint width, height; + double dash[6]; + int length; + GdkRGBA fg; + GtkStyleContext *context = gtk_widget_get_style_context (widget); + + gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &fg); + gdk_cairo_set_source_rgba (ctx, &fg); + + gtk_widget_get_allocation (widget, &alloc); + + width = alloc.width; + height = alloc.height; + length = line->length * 20; + + cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER); + + /* Adapted from DiaCairoRenderer, TODO: Avoid duplication */ + switch (line->lstyle) { + case LINESTYLE_DEFAULT: + case LINESTYLE_SOLID: + cairo_set_dash (ctx, NULL, 0, 0); + break; + case LINESTYLE_DASHED: + dash[0] = length; + dash[1] = length; + cairo_set_dash (ctx, dash, 2, 0); + break; + case LINESTYLE_DASH_DOT: + dash[0] = length; + dash[1] = length * 0.45; + dash[2] = length * 0.1; + dash[3] = length * 0.45; + cairo_set_dash (ctx, dash, 4, 0); + break; + case LINESTYLE_DASH_DOT_DOT: + dash[0] = length; + dash[1] = length * (0.8/3); + dash[2] = length * 0.1; + dash[3] = length * (0.8/3); + dash[4] = length * 0.1; + dash[5] = length * (0.8/3); + cairo_set_dash (ctx, dash, 6, 0); + break; + case LINESTYLE_DOTTED: + dash[0] = length * 0.1; + dash[1] = length * 0.1; + cairo_set_dash (ctx, dash, 2, 0); + break; + default: + g_warning("DiaLinePreview : Unsupported line style specified!"); + } + + cairo_move_to (ctx, 0, height / 2); + cairo_line_to (ctx, width, height / 2); + cairo_stroke (ctx); + + return FALSE; +} + +static void +dia_line_preview_class_init (DiaLinePreviewClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->draw = dia_line_preview_draw; +} + +static void +dia_line_preview_init (DiaLinePreview *self) +{ + gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 24); + + self->lstyle = LINESTYLE_SOLID; + self->length = 1; /* For clarity we default quite big */ +} + +GtkWidget * +dia_line_preview_new (LineStyle lstyle) +{ + DiaLinePreview *line = g_object_new (DIA_TYPE_LINE_PREVIEW, NULL); + + line->lstyle = lstyle; + + return GTK_WIDGET (line); +} + +void +dia_line_preview_set_line_style (DiaLinePreview *self, + LineStyle lstyle, + gdouble length) +{ + if (self->lstyle != lstyle || self->length != length) { + self->lstyle = lstyle; + self->length = length; + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} + +LineStyle +dia_line_preview_get_line_style (DiaLinePreview *self) +{ + return self->lstyle; +} + +/************* DiaLineChooser: ***************/ + +typedef struct _DiaLineChooserPrivate DiaLineChooserPrivate; + +struct _DiaLineChooserPrivate { + GtkWidget *popover; + GtkWidget *preview; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaLineChooser, dia_line_chooser, GTK_TYPE_MENU_BUTTON, + G_ADD_PRIVATE (DiaLineChooser)) + +enum { + DLS_VALUE_CHANGED, + DLS_LAST_SIGNAL +}; + +static guint dls_signals[DLS_LAST_SIGNAL] = { 0 }; + +static void +dia_line_chooser_class_init (DiaLineChooserClass *class) +{ + dls_signals[DLS_VALUE_CHANGED] + = g_signal_new("value-changed", + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +value_changed (GObject *src, DiaLineChooser *self) +{ + DiaLineChooserPrivate *priv = dia_line_chooser_get_instance_private (self); + gdouble length; + LineStyle style = dia_line_chooser_popover_get_line_style (DIA_LINE_CHOOSER_POPOVER (priv->popover), + &length); + dia_line_preview_set_line_style (DIA_LINE_PREVIEW (priv->preview), style, length); + + g_signal_emit (G_OBJECT (self), + dls_signals[DLS_VALUE_CHANGED], 0); +} + +static void +dia_line_chooser_init (DiaLineChooser *self) +{ + GtkWidget *box; + DiaLineChooserPrivate *priv = dia_line_chooser_get_instance_private (self); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (self), box); + + priv->preview = dia_line_preview_new (DEFAULT_LINESTYLE); + gtk_widget_show (priv->preview); + gtk_box_pack_start (GTK_BOX (box), priv->preview, TRUE, TRUE, 0); + + priv->popover = dia_line_chooser_popover_new (); + dia_line_chooser_popover_set_line_style (DIA_LINE_CHOOSER_POPOVER (priv->popover), + DEFAULT_LINESTYLE); + g_signal_connect (G_OBJECT (priv->popover), "value-changed", + G_CALLBACK (value_changed), self); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (self), priv->popover); +} + +GtkWidget * +dia_line_chooser_new () +{ + return g_object_new (DIA_TYPE_LINE_CHOOSER, NULL); +} + +void +dia_line_chooser_get_line_style (DiaLineChooser *self, + LineStyle *ls, + gdouble *dl) +{ + DiaLineChooserPrivate *priv = dia_line_chooser_get_instance_private (self); + + *ls = dia_line_chooser_popover_get_line_style (DIA_LINE_CHOOSER_POPOVER (priv->popover), + (gdouble *) dl); +} + +void +dia_line_chooser_set_line_style (DiaLineChooser *self, + LineStyle linestyle, + gdouble dashlength) +{ + DiaLineChooserPrivate *priv = dia_line_chooser_get_instance_private (self); + + dia_line_chooser_popover_set_line_style (DIA_LINE_CHOOSER_POPOVER (priv->popover), + linestyle); + dia_line_chooser_popover_set_length (DIA_LINE_CHOOSER_POPOVER (priv->popover), + dashlength); +} diff --git a/lib/widgets/dia-line-chooser.h b/lib/widgets/dia-line-chooser.h new file mode 100644 index 0000000000000000000000000000000000000000..086ceb2c361bbd9324664f58dbe325aedc70b27f --- /dev/null +++ b/lib/widgets/dia-line-chooser.h @@ -0,0 +1,48 @@ +#ifndef __DIALSS_H__ +#define __DIALSS_H__ + +#include +#include + +#include "dia-enums.h" + +G_BEGIN_DECLS + +/* --------------- DiaLinePreview -------------------------------- */ + +#define DIA_TYPE_LINE_PREVIEW (dia_line_preview_get_type ()) +G_DECLARE_FINAL_TYPE (DiaLinePreview, dia_line_preview, DIA, LINE_PREVIEW, GtkWidget) + +struct _DiaLinePreview +{ + GtkWidget parent; + LineStyle lstyle; + gdouble length; +}; + +GtkWidget *dia_line_preview_new (LineStyle lstyle); +LineStyle dia_line_preview_get_line_style (DiaLinePreview *self); +void dia_line_preview_set_line_style (DiaLinePreview *self, + LineStyle lstyle, + gdouble length); + +/* --------------- DiaLineChooser -------------------------------- */ + +#define DIA_TYPE_LINE_CHOOSER (dia_line_chooser_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaLineChooser, dia_line_chooser, DIA, LINE_CHOOSER, GtkMenuButton) + +struct _DiaLineChooserClass { + GtkMenuButtonClass parent_class; +}; + +GtkWidget *dia_line_chooser_new (void); +void dia_line_chooser_get_line_style (DiaLineChooser *as, + LineStyle *linestyle, + gdouble *dashlength); +void dia_line_chooser_set_line_style (DiaLineChooser *as, + LineStyle linestyle, + gdouble dashlength); + +G_END_DECLS + +#endif diff --git a/lib/widgets/dialist.c b/lib/widgets/dialist.c new file mode 100644 index 0000000000000000000000000000000000000000..d2d7d033c375b50b8c4a2a865171fb1cdc038e6e --- /dev/null +++ b/lib/widgets/dialist.c @@ -0,0 +1,599 @@ +/* Minimal reimplementation of GtkList, prototyped in Vala */ + + +#include +#include +#include +#include + +#include "dialist.h" + +typedef struct _DiaListPrivate DiaListPrivate; + +struct _DiaListPrivate { + GtkWidget *real; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaList, dia_list, GTK_TYPE_FRAME, + G_ADD_PRIVATE (DiaList)) + +enum { + DIA_LIST_0_PROPERTY, + DIA_LIST_CHILDREN_PROPERTY, + DIA_LIST_SELECTION_PROPERTY, + DIA_LIST_SELECTION_MODE_PROPERTY, + DIA_LIST_NUM_PROPERTIES +}; +static GParamSpec* dia_list_properties[DIA_LIST_NUM_PROPERTIES]; + +enum { + DIA_LIST_CHILD_SELECTED_SIGNAL, + DIA_LIST_SELECTION_CHANGED_SIGNAL, + DIA_LIST_NUM_SIGNALS +}; +static guint dia_list_signals[DIA_LIST_NUM_SIGNALS] = {0}; + +typedef struct _DiaListItemPrivate DiaListItemPrivate; + +struct _DiaListItemPrivate { + GtkWidget *label; +}; + +G_DEFINE_TYPE_WITH_CODE (DiaListItem, dia_list_item, GTK_TYPE_LIST_BOX_ROW, + G_ADD_PRIVATE (DiaListItem)) + +enum { + DIA_LIST_ITEM_0_PROPERTY, + DIA_LIST_ITEM_VALUE_PROPERTY, + DIA_LIST_ITEM_NUM_PROPERTIES +}; +static GParamSpec* dia_list_item_properties[DIA_LIST_ITEM_NUM_PROPERTIES]; + +enum { + DIA_LIST_ITEM_ACTIVATE_SIGNAL, + DIA_LIST_ITEM_NUM_SIGNALS +}; +static guint dia_list_item_signals[DIA_LIST_ITEM_NUM_SIGNALS] = {0}; + +typedef struct _Block1Data Block1Data; + +struct _Block1Data { + int _ref_count_; + DiaList* self; + gint i; +}; + +static void __lambda6_ (DiaList* self, + DiaListItem* item); +static void ___lambda6__gfunc (gpointer data, + gpointer self); +static void __dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, + GtkListBoxRow* row, + gpointer self); +static void dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void dia_list_item_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec); +static void dia_list_item_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec); +static void dia_list_finalize (GObject * obj); +static void dia_list_item_finalize (GObject * obj); + +void +dia_list_select_child (DiaList* self, + DiaListItem* widget) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_row (GTK_LIST_BOX (list), GTK_LIST_BOX_ROW (widget)); + g_signal_emit (self, dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL], 0, widget); +} + +void +dia_list_unselect_child (DiaList* self, + DiaListItem* widget) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + g_return_if_fail (widget != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_row (GTK_LIST_BOX (list), GTK_LIST_BOX_ROW (widget)); +} + +static void +append_item (gpointer item, + gpointer self) +{ + GtkWidget *list; + + g_return_if_fail (item != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (DIA_LIST (self)))->real; + gtk_container_add (GTK_CONTAINER (list), GTK_WIDGET (item)); +} + +void +dia_list_append_items (DiaList* self, + GList* items) +{ + g_return_if_fail (self != NULL); + g_list_foreach (items, append_item, self); +} + +void +dia_list_set_active (DiaList *self, gint index) +{ + GtkWidget *list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (list), index); + + gtk_list_box_select_row (GTK_LIST_BOX (list), row); +} + +static void +insert_items (gpointer item, + gpointer data) +{ + DiaList* self; + GtkWidget *list; + gint pos; + + g_return_if_fail (item != NULL); + g_return_if_fail (data != NULL); + + self = ((Block1Data *) data)->self; + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + pos = ((Block1Data *) data)->i; + ((Block1Data *) data)->i = pos + 1; + gtk_list_box_insert (GTK_LIST_BOX (list), GTK_WIDGET (item), pos); +} + +void +dia_list_insert_items (DiaList* self, + GList* items, + gint i) +{ + Block1Data* _data1_; + g_return_if_fail (self != NULL); + _data1_ = g_slice_new0 (Block1Data); + _data1_->_ref_count_ = 1; + _data1_->self = g_object_ref (self); + _data1_->i = i; + g_list_foreach (items, insert_items, _data1_); + if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) { + DiaList* self; + self = _data1_->self; + g_object_unref (self); + g_slice_free (Block1Data, _data1_); + } + _data1_ = NULL; +} + + +static void +__lambda6_ (DiaList* self, + DiaListItem* item) +{ + GtkWidget *list; + + g_return_if_fail (item != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_remove (GTK_CONTAINER (list), (GtkWidget*) item); +} + +static void +___lambda6__gfunc (gpointer data, + gpointer self) +{ + __lambda6_ ((DiaList*) self, (DiaListItem*) data); +} + +void +dia_list_remove_items (DiaList* self, + GList* items) +{ + g_return_if_fail (self != NULL); + g_list_foreach (items, ___lambda6__gfunc, self); +} + +DiaListItem* +dia_list_append (DiaList *self, + const gchar *item) +{ + GtkWidget* row; + GtkWidget* list; + + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (item != NULL, NULL); + + row = dia_list_item_new_with_label (item); + gtk_widget_show_all (row); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_add (GTK_CONTAINER (list), row); + + return DIA_LIST_ITEM (row); +} + +void +dia_list_select_item (DiaList *self, + gint i) +{ + GtkWidget *list; + GtkListBoxRow *tmp; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) ((DiaListPrivate *) dia_list_get_instance_private (self)))->real; + tmp = gtk_list_box_get_row_at_index (GTK_LIST_BOX (list), i); + dia_list_select_child (self, G_TYPE_CHECK_INSTANCE_TYPE (tmp, DIA_TYPE_LIST_ITEM) ? (DIA_LIST_ITEM (tmp)) : NULL); +} + +static void +empty_widget (GtkWidget *elm, + gpointer self) +{ + GtkWidget *list; + + g_return_if_fail (elm != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + + gtk_container_remove (GTK_CONTAINER (list), elm); +} + +void +dia_list_empty (DiaList *self) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_container_foreach (GTK_CONTAINER (list), empty_widget, self); +} + +gint +dia_list_child_position (DiaList *self, + DiaListItem *row) +{ + g_return_val_if_fail (self != NULL, 0); + g_return_val_if_fail (row != NULL, 0); + + return gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (row)); +} + +void +dia_list_unselect_all (DiaList *self) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_unselect_all (GTK_LIST_BOX (list)); +} + +void +dia_list_select_all (DiaList* self) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_select_all (GTK_LIST_BOX (list)); +} + +GtkWidget * +dia_list_new (void) +{ + return g_object_new (DIA_TYPE_LIST, NULL); +} + +GList* +dia_list_get_children (DiaList* self) +{ + GList* result; + + g_return_val_if_fail (self != NULL, NULL); + + result = gtk_container_get_children (GTK_CONTAINER (((DiaListPrivate *) dia_list_get_instance_private (self))->real)); + + return result; +} + +DiaListItem* +dia_list_get_selection (DiaList* self) +{ + GtkWidget *list; + GtkListBoxRow *tmp; + + g_return_val_if_fail (self != NULL, NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + tmp = gtk_list_box_get_selected_row (GTK_LIST_BOX (list)); + return G_TYPE_CHECK_INSTANCE_TYPE (tmp, DIA_TYPE_LIST_ITEM) ? (DIA_LIST_ITEM (tmp)) : NULL; +} + +GtkSelectionMode +dia_list_get_selection_mode (DiaList* self) +{ + GtkWidget *list; + + g_return_val_if_fail (self != NULL, 0); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + + return gtk_list_box_get_selection_mode (GTK_LIST_BOX (list)); +} + +void +dia_list_set_selection_mode (DiaList* self, + GtkSelectionMode value) +{ + GtkWidget *list; + + g_return_if_fail (self != NULL); + + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), value); + g_object_notify_by_pspec (G_OBJECT (self), dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY]); +} + +static void +__dia_list___lambda8__gtk_list_box_row_selected (GtkListBox* _sender, + GtkListBoxRow* row, + gpointer self) +{ + g_signal_emit (G_OBJECT (self), dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL], 0); + if (DIA_IS_LIST_ITEM (row)) { + g_signal_emit (G_OBJECT (row), dia_list_item_signals[DIA_LIST_ITEM_ACTIVATE_SIGNAL], 0); + } +} + +static GObject * +dia_list_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam * construct_properties) +{ + GObject * obj; + GObjectClass * parent_class; + DiaList * self; + GtkWidget *list; + + parent_class = G_OBJECT_CLASS (dia_list_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + list = ((DiaListPrivate *) dia_list_get_instance_private (self))->real; + + gtk_container_add (GTK_CONTAINER (self), list); + g_signal_connect_object (list, "row-selected", (GCallback) __dia_list___lambda8__gtk_list_box_row_selected, self, 0); + + return obj; +} + +static void +dia_list_class_init (DiaListClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = dia_list_get_property; + object_class->set_property = dia_list_set_property; + object_class->constructor = dia_list_constructor; + object_class->finalize = dia_list_finalize; + + g_object_class_install_property (object_class, DIA_LIST_CHILDREN_PROPERTY, dia_list_properties[DIA_LIST_CHILDREN_PROPERTY] = g_param_spec_pointer ("children", "children", "children", G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (object_class, DIA_LIST_SELECTION_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_PROPERTY] = g_param_spec_object ("selection", "selection", "selection", DIA_TYPE_LIST_ITEM, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + g_object_class_install_property (object_class, DIA_LIST_SELECTION_MODE_PROPERTY, dia_list_properties[DIA_LIST_SELECTION_MODE_PROPERTY] = g_param_spec_enum ("selection-mode", "selection-mode", "selection-mode", gtk_selection_mode_get_type (), 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + dia_list_signals[DIA_LIST_CHILD_SELECTED_SIGNAL] = g_signal_new ("child-selected", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DIA_TYPE_LIST_ITEM); + dia_list_signals[DIA_LIST_SELECTION_CHANGED_SIGNAL] = g_signal_new ("selection-changed", DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); +} + +static void +dia_list_init (DiaList * self) +{ + ((DiaListPrivate *) dia_list_get_instance_private (self))->real = gtk_list_box_new (); +} + +static void +dia_list_finalize (GObject * obj) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST, DiaList); + g_object_unref (((DiaListPrivate *) dia_list_get_instance_private (self))->real); + G_OBJECT_CLASS (dia_list_parent_class)->finalize (obj); +} + +static void +dia_list_get_property (GObject * object, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_CHILDREN_PROPERTY: + g_value_set_pointer (value, dia_list_get_children (self)); + break; + case DIA_LIST_SELECTION_PROPERTY: + g_value_set_object (value, dia_list_get_selection (self)); + break; + case DIA_LIST_SELECTION_MODE_PROPERTY: + g_value_set_enum (value, dia_list_get_selection_mode (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +dia_list_set_property (GObject * object, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + DiaList * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST, DiaList); + switch (property_id) { + case DIA_LIST_SELECTION_MODE_PROPERTY: + dia_list_set_selection_mode (self, g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +GtkWidget * +dia_list_item_new_with_label (const gchar* lbl) +{ + return g_object_new (DIA_TYPE_LIST_ITEM, + "value", lbl, + NULL); +} + +GtkWidget * +dia_list_item_new (void) +{ + return g_object_new (DIA_TYPE_LIST_ITEM, NULL); +} + +const gchar* +dia_list_item_get_value (DiaListItem* self) +{ + const gchar *result; + GtkWidget *label; + + g_return_val_if_fail (self != NULL, NULL); + + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + result = g_strdup (gtk_label_get_label (GTK_LABEL (label))); + + return result; +} + +void +dia_list_item_set_value (DiaListItem* self, + const gchar* value) +{ + GtkWidget *label; + + g_return_if_fail (self != NULL); + + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_label_set_label (GTK_LABEL (label), g_strdup (value)); + + g_object_notify_by_pspec ((GObject *) self, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY]); +} + + +static GObject * +dia_list_item_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam * construct_properties) +{ + GObject * obj; + GObjectClass * parent_class; + DiaListItem * self; + GtkWidget *label; + + parent_class = G_OBJECT_CLASS (dia_list_item_parent_class); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + label = ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label; + gtk_container_add (GTK_CONTAINER (self), label); + return obj; +} + +static void +dia_list_item_class_init (DiaListItemClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = dia_list_item_get_property; + object_class->set_property = dia_list_item_set_property; + object_class->constructor = dia_list_item_constructor; + object_class->finalize = dia_list_item_finalize; + g_object_class_install_property (object_class, DIA_LIST_ITEM_VALUE_PROPERTY, dia_list_item_properties[DIA_LIST_ITEM_VALUE_PROPERTY] = g_param_spec_string ("value", "value", "value", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE)); + dia_list_item_signals[DIA_LIST_ITEM_ACTIVATE_SIGNAL] = + g_signal_new ("activate", + DIA_TYPE_LIST, G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0); +} + +static void +dia_list_item_init (DiaListItem *self) +{ + ((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label = g_object_new (GTK_TYPE_LABEL, + "xalign", 0.0, + "visible", TRUE, + NULL); +} + +static void +dia_list_item_finalize (GObject *obj) +{ + DiaListItem * self; + + self = G_TYPE_CHECK_INSTANCE_CAST (obj, DIA_TYPE_LIST_ITEM, DiaListItem); + + g_object_unref (((DiaListItemPrivate *) dia_list_item_get_instance_private (self))->label); + + G_OBJECT_CLASS (dia_list_item_parent_class)->finalize (obj); +} + +static void +dia_list_item_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + g_value_set_string (value, dia_list_item_get_value (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_list_item_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaListItem * self; + self = G_TYPE_CHECK_INSTANCE_CAST (object, DIA_TYPE_LIST_ITEM, DiaListItem); + switch (property_id) { + case DIA_LIST_ITEM_VALUE_PROPERTY: + dia_list_item_set_value (self, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} diff --git a/lib/widgets/dialist.h b/lib/widgets/dialist.h new file mode 100644 index 0000000000000000000000000000000000000000..b7b4d07c4ab7d702abbfeae77f45f1379dbad5e3 --- /dev/null +++ b/lib/widgets/dialist.h @@ -0,0 +1,62 @@ +#ifndef __DIALIST_H__ +#define __DIALIST_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + + +#define DIA_TYPE_LIST (dia_list_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaList, dia_list, DIA, LIST, GtkFrame) + +struct _DiaListClass { + GtkFrameClass parent_class; +}; + +#define DIA_TYPE_LIST_ITEM (dia_list_item_get_type ()) +G_DECLARE_DERIVABLE_TYPE (DiaListItem, dia_list_item, DIA, LIST_ITEM, GtkListBoxRow) + +struct _DiaListItemClass { + GtkListBoxRowClass parent_class; +}; + +void dia_list_select_child (DiaList *self, + DiaListItem *widget); +void dia_list_unselect_child (DiaList *self, + DiaListItem *widget); +void dia_list_append_items (DiaList *self, + GList *items); +void dia_list_insert_items (DiaList *self, + GList *items, + gint i); +void dia_list_remove_items (DiaList *self, + GList *items); +DiaListItem *dia_list_append (DiaList *self, + const gchar *item); +void dia_list_set_active (DiaList *self, + gint index); +void dia_list_select_item (DiaList *self, + gint i); +void dia_list_empty (DiaList *self); +gint dia_list_child_position (DiaList *self, + DiaListItem *row); +void dia_list_unselect_all (DiaList *self); +void dia_list_select_all (DiaList *self); +GtkWidget *dia_list_new (void); +GList *dia_list_get_children (DiaList *self); +DiaListItem *dia_list_get_selection (DiaList *self); +GtkSelectionMode dia_list_get_selection_mode (DiaList *self); +void dia_list_set_selection_mode (DiaList *self, + GtkSelectionMode value); +GtkWidget *dia_list_item_new_with_label (const gchar *lbl); +GtkWidget *dia_list_item_new (void); +const gchar *dia_list_item_get_value (DiaListItem *self); +void dia_list_item_set_value (DiaListItem *self, + const gchar *value); + +G_END_DECLS + +#endif diff --git a/makefile.msc b/makefile.msc index 94fedec0eecde86ee3b40b7d3ba8fcd24156e5e0..b15a5cc8267614a73cc78ec8fba1cb63f3c72980 100644 --- a/makefile.msc +++ b/makefile.msc @@ -8,7 +8,6 @@ full: build \ build\win32\bin\diaw.exe \ build\win32\bin\dia-app.dll \ build\win32\bin\libdia.dll \ - build\win32\bin\libart_lgpl_2-2.dll \ # build\win32\bin\libfontconfig-1.dll \ build\win32\bin\libgtk-win32-2.0-0.dll \ build\win32\bin\libxml2.dll \ @@ -29,7 +28,6 @@ full: build \ build\win32\dia\istar.dll \ build\win32\dia\jackson.dll \ build\win32\dia\kaos.dll \ - build\win32\dia\libart.dll \ build\win32\dia\misc.dll \ build\win32\dia\network.dll \ build\win32\dia\sadt.dll \ @@ -114,9 +112,6 @@ build\win32\bin\diaw.exe: build\win32\bin app\diaw.exe build\win32\bin\dia-app.dll: build\win32\bin app\dia-app.dll copy app\dia-app.dll build\win32\bin\dia-app.dll - -build\win32\bin\libart_lgpl_2-2.dll: build\win32\bin ..\bin\libart_lgpl_2-2.dll - copy ..\bin\libart_lgpl_2-2.dll build\win32\bin build\win32\bin\libfontconfig-1.dll: build\win32\bin ..\bin\libfontconfig-1.dll copy ..\bin\libfontconfig-1.dll build\win32\bin @@ -178,9 +173,6 @@ build\win32\dia\jackson.dll: build\win32\dia objects\Jackson\jackson.dll build\win32\dia\kaos.dll: build\win32\dia objects\KAOS\kaos.dll copy objects\KAOS\kaos.dll build\win32\dia -build\win32\dia\libart.dll: build\win32\dia plug-ins\libart\libart.dll - copy plug-ins\libart\libart.dll build\win32\dia - build\win32\dia\misc.dll: build\win32\dia objects\Misc\misc.dll copy objects\Misc\misc.dll build\win32\dia diff --git a/objects/AADL/aadl.h b/objects/AADL/aadl.h index 2247f3efb5e67567a0f24c4d1237690c7be204c5..0f2d054506cb1de85a73db1ba41f9d49906d2ba6 100755 --- a/objects/AADL/aadl.h +++ b/objects/AADL/aadl.h @@ -81,8 +81,8 @@ struct _Aadlbox int num_connections; ConnectionPoint **connections; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; Aadlbox_specific *specific; }; diff --git a/objects/AADL/edit_port_declaration.c b/objects/AADL/edit_port_declaration.c index fcc9171ec6e78e45e47987be96d1b73a1ef1fa9b..ac1be93ecfdf1e9819d7c038b2af4d9b00964dfc 100755 --- a/objects/AADL/edit_port_declaration.c +++ b/objects/AADL/edit_port_declaration.c @@ -142,7 +142,7 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj, gtk_window_set_title(GTK_WINDOW(window) , "Port Declaration"); gtk_container_set_border_width(GTK_CONTAINER(window),5); - vbox = gtk_vbox_new (FALSE, 0); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); @@ -152,13 +152,9 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj, gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0); gtk_widget_show(entry); - button = gtk_button_new_from_stock (GTK_STOCK_OK); + button = gtk_button_new_with_label (_("Okay")); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); -#endif gtk_widget_grab_default (button); gtk_widget_show (button); diff --git a/objects/Database/compound.c b/objects/Database/compound.c index 524b1a0641007099d7d28aa5ab5c8c97306cd519..6e421fc61698904ec89397ec8b5936c404c0b1d6 100644 --- a/objects/Database/compound.c +++ b/objects/Database/compound.c @@ -66,14 +66,14 @@ struct _Compound { gint num_arms; real line_width; - Color line_color; + GdkRGBA line_color; }; struct _CompoundState { ArmHandleState * handle_states; gint num_handles; /* num_arms = num_handles-1 */ real line_width; - Color line_color; + GdkRGBA line_color; }; struct _ArmHandleState { @@ -561,7 +561,7 @@ compound_draw (Compound * comp, DiaRenderer * renderer) #if DEBUG_DRAW_MP_DIRECTION { Point p = comp->mount_point.pos; - Color red = { 1.0, 0.0, 0.0, 1.0 }; + GdkRGBA red = { 1.0, 0.0, 0.0, 1.0 }; gchar dirs = comp->mount_point.directions; if (dirs & DIR_NORTH) p.y -= 1.0; diff --git a/objects/Database/database.h b/objects/Database/database.h index cb4efa02147330d7d6b2e0a1506660ca1e068b2e..b2e382a01b55c326dff79d89d1e54beee2df53c7 100644 --- a/objects/Database/database.h +++ b/objects/Database/database.h @@ -64,9 +64,9 @@ struct _Table { DiaFont * comment_font; /* colors */ - Color line_color; - Color fill_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; real border_width; @@ -129,8 +129,8 @@ struct _TableReference { real line_width; real dashlength; LineStyle line_style; - Color line_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA text_color; gchar * start_point_desc; gchar * end_point_desc; diff --git a/objects/Database/table.c b/objects/Database/table.c index 67f85f266ed3de42b32b7b27dc945f2f116e5d15..72d6e0f75be5cda101ee8cf20e8b4ffa713db638 100644 --- a/objects/Database/table.c +++ b/objects/Database/table.c @@ -77,7 +77,7 @@ static DiaMenu * table_object_menu(DiaObject *, Point *); static ObjectChange * table_show_comments_cb(DiaObject *, Point *, gpointer); static void underline_table_attribute (DiaRenderer *, Point, TableAttribute *, Table *); -static void fill_diamond (DiaRenderer *, real, real, Point *, Color *); +static void fill_diamond (DiaRenderer *, real, real, Point *, GdkRGBA *); static void table_init_fonts (Table *); static TableAttribute *table_attribute_new (void); @@ -98,7 +98,7 @@ static gchar * create_documentation_tag (gchar * comment, static void draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -606,7 +606,7 @@ static void draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -644,7 +644,7 @@ draw_comments(DiaRenderer *renderer, static void fill_diamond (DiaRenderer *renderer, real half_height, real width, - Point * lower_midpoint, Color * color) + Point * lower_midpoint, GdkRGBA * color) { Point poly[4]; @@ -672,9 +672,9 @@ table_draw_attributesbox (Table * table, DiaRenderer * renderer, Point endP; Point indicP; GList * list; - Color * text_color = &table->text_color; - Color * fill_color = &table->fill_color; - Color * line_color = &table->line_color; + GdkRGBA * text_color = &table->text_color; + GdkRGBA * fill_color = &table->fill_color; + GdkRGBA * line_color = &table->line_color; DiaFont * attr_font; real attr_font_height; real scale; diff --git a/objects/ER/attribute.c b/objects/ER/attribute.c index 61651c3ab86ac051915636d07b5052d85f2687e5..51a409a031f31788bd59d9072ddde5f72aa5a6cf 100644 --- a/objects/ER/attribute.c +++ b/objects/ER/attribute.c @@ -60,8 +60,8 @@ struct _AttributeState { gboolean multivalue; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; struct _Attribute { @@ -80,8 +80,8 @@ struct _Attribute { gboolean multivalue; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; static real attribute_distance_from(Attribute *attribute, Point *point); diff --git a/objects/ER/entity.c b/objects/ER/entity.c index 999d9d5e7f95477b4ace5bd1d8e04108e5aa1301..0fc385e79bdc99cde0cf2090011c83a16180f22d 100644 --- a/objects/ER/entity.c +++ b/objects/ER/entity.c @@ -54,8 +54,8 @@ struct _Entity { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean associative; diff --git a/objects/ER/relationship.c b/objects/ER/relationship.c index 1f89c56618c84d50d2413525faa7daddd1f7aae0..cd8d6c6ea6c419045c0488258e68e65d896b3337 100644 --- a/objects/ER/relationship.c +++ b/objects/ER/relationship.c @@ -66,8 +66,8 @@ struct _Relationship { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; }; diff --git a/objects/FS/flow-ortho.c b/objects/FS/flow-ortho.c index 06bd337c18e6259b16ac1b9b182a27be08c9238e..3931b5ed865b298ec7c48615341d562f40262926 100644 --- a/objects/FS/flow-ortho.c +++ b/objects/FS/flow-ortho.c @@ -77,9 +77,9 @@ struct _OrthflowChange { char* text ; }; -Color orthflow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; -Color orthflow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; -Color orthflow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; +GdkRGBA orthflow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; +GdkRGBA orthflow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; +GdkRGBA orthflow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; #define ORTHFLOW_WIDTH 0.1 @@ -341,7 +341,7 @@ orthflow_draw(Orthflow *orthflow, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); int n = orthflow->orth.numpoints ; - Color* render_color = &orthflow_color_signal; + GdkRGBA* render_color = &orthflow_color_signal; Point *points; real linewidth; Arrow arrow; @@ -424,7 +424,7 @@ orthflow_create(Point *startpoint, orthflow->text = text_copy( orthflow_default_label ) ; text_set_position( orthflow->text, &p ) ; } else { - Color* color = &orthflow_color_signal; + GdkRGBA* color = &orthflow_color_signal; switch (orthflow->type) { case ORTHFLOW_ENERGY: @@ -502,7 +502,7 @@ orthflow_update_data(Orthflow *orthflow) OrthConn *orth = &orthflow->orth ; DiaObject *obj = &orth->object; Rectangle rect; - Color* color = &orthflow_color_signal; + GdkRGBA* color = &orthflow_color_signal; switch (orthflow->type) { case ORTHFLOW_ENERGY: diff --git a/objects/FS/flow.c b/objects/FS/flow.c index 07086e85266db002b428022fbcda13ea0b024bda..8e6bb998fd20eb42e52774edea9fc21616a8432a 100644 --- a/objects/FS/flow.c +++ b/objects/FS/flow.c @@ -40,9 +40,9 @@ #include "pixmaps/flow.xpm" -Color flow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; -Color flow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; -Color flow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; +GdkRGBA flow_color_energy = { 1.0f, 0.0f, 0.0f, 1.0f }; +GdkRGBA flow_color_material = { 0.8f, 0.0f, 0.8f, 1.0f }; +GdkRGBA flow_color_signal = { 0.0f, 0.0f, 1.0f, 1.0f }; typedef struct _Flow Flow; typedef enum { @@ -312,7 +312,7 @@ flow_draw(Flow *flow, DiaRenderer *renderer) Point *endpoints, p1, p2; Arrow arrow; int n1 = 1, n2 = 0; - Color* render_color = NULL; + GdkRGBA* render_color = NULL; assert(flow != NULL); assert(renderer != NULL); @@ -464,7 +464,7 @@ flow_update_data(Flow *flow) Connection *conn = &flow->connection; DiaObject *obj = &conn->object; Rectangle rect; - Color* color = NULL; + GdkRGBA* color = NULL; if (connpoint_is_autogap(flow->connection.endpoint_handles[0].connected_to) || connpoint_is_autogap(flow->connection.endpoint_handles[1].connected_to)) { diff --git a/objects/GRAFCET/action.c b/objects/GRAFCET/action.c index 54d7068a28d6a26c1098715337af7f940059f51e..7da2f5036e145ec6b10edc9c463ce774c3cb8ac5 100644 --- a/objects/GRAFCET/action.c +++ b/objects/GRAFCET/action.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -327,7 +326,7 @@ action_draw(Action *action, DiaRenderer *renderer) Point ul,br,p1,p2; int i; real chunksize; - Color cl; + GdkRGBA cl; renderer_ops->set_linewidth(renderer, ACTION_LINE_WIDTH); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); diff --git a/objects/GRAFCET/boolequation.c b/objects/GRAFCET/boolequation.c index 58b9c5a754e6d250b40601b4c0870e05c80bbef5..176c0decdc547bfdfaec02a4985921f20e140682 100644 --- a/objects/GRAFCET/boolequation.c +++ b/objects/GRAFCET/boolequation.c @@ -566,7 +566,7 @@ boolequation_set_value(Boolequation *booleq, const gchar *value) Boolequation * boolequation_create(const gchar *value, DiaFont *font, real fontheight, - Color *color) + GdkRGBA *color) { Boolequation *booleq; diff --git a/objects/GRAFCET/boolequation.h b/objects/GRAFCET/boolequation.h index 050201d834a642047e0ae16bcf8170302e578902..c15e1f794d4b6953f944c0f3bcd5f35e017ee661 100644 --- a/objects/GRAFCET/boolequation.h +++ b/objects/GRAFCET/boolequation.h @@ -35,7 +35,7 @@ typedef struct _Block Block; typedef struct { DiaFont *font; real fontheight; - Color color; + GdkRGBA color; Point pos; @@ -53,7 +53,7 @@ typedef struct { extern Boolequation *boolequation_create(const gchar *value, DiaFont *font, - real fontheight, Color *color); + real fontheight, GdkRGBA *color); extern void boolequation_destroy(Boolequation *rcep); extern void boolequation_set_value(Boolequation *rcep, const gchar *value); diff --git a/objects/GRAFCET/condition.c b/objects/GRAFCET/condition.c index 49876c5be28758476b635886e3ea25d1b092414d..80d2859b1e534163853627962ba2fd7953b02814 100644 --- a/objects/GRAFCET/condition.c +++ b/objects/GRAFCET/condition.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -58,7 +57,7 @@ typedef struct _Condition { gchar *cond_value; DiaFont *cond_font; real cond_fontheight; - Color cond_color; + GdkRGBA cond_color; /* computed values : */ Rectangle labelbb; @@ -330,7 +329,7 @@ condition_create(Point *startpoint, DiaFont *default_font; real default_fontheight; - Color fg_color; + GdkRGBA fg_color; condition = g_malloc0(sizeof(Condition)); conn = &condition->connection; diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c index 5de8f85c0d5182f6db8c5f907de0ce9e160a53d7..cead2047d6eec3106c866621dba4f961521cc07f 100644 --- a/objects/GRAFCET/step.c +++ b/objects/GRAFCET/step.c @@ -72,7 +72,7 @@ typedef struct _Step { DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; Handle north,south; Point SD1,SD2,NU1,NU2; @@ -242,7 +242,7 @@ static void step_been_renamed(const gchar *sid) if (*endptr == '\0') __stepnum = snum + 1; } -static Color color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; static real step_distance_from(Step *step, Point *point) diff --git a/objects/GRAFCET/transition.c b/objects/GRAFCET/transition.c index 152f7c9cfa11f35cc377c6ca4cccd3b7f7acf552..ead5782304db383a91fe8a9fe0e0f538a2c17d43 100644 --- a/objects/GRAFCET/transition.c +++ b/objects/GRAFCET/transition.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "text.h" @@ -62,7 +61,7 @@ typedef struct _Transition { Boolequation *receptivity; DiaFont *rcep_font; real rcep_fontheight; - Color rcep_color; + GdkRGBA rcep_color; char *rcep_value; ConnectionPoint connections[2]; @@ -374,7 +373,7 @@ transition_create(Point *startpoint, Element *elem; DiaFont *default_font = NULL; real default_fontheight; - Color fg_color; + GdkRGBA fg_color; transition = g_malloc0(sizeof(Transition)); elem = &transition->element; diff --git a/objects/GRAFCET/vergent.c b/objects/GRAFCET/vergent.c index 4bd2771c335db08f0a7d0fba426dd60c7d7118d8..1434bf837bc2d38eb4ba664620cff57be2838b48 100644 --- a/objects/GRAFCET/vergent.c +++ b/objects/GRAFCET/vergent.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "geometry.h" #include "connpoint_line.h" diff --git a/objects/Istar/goal.c b/objects/Istar/goal.c index 04338535c4c1dfc049a2a3907018ef5cd4916055..401641fc87dd510c154e5991883eb4dc39f5db61 100644 --- a/objects/Istar/goal.c +++ b/objects/Istar/goal.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/softgoal.xpm" diff --git a/objects/Istar/other.c b/objects/Istar/other.c index df32736a1ee97b68f2714365aca48809a4cf776e..c39fd8a8c1c4c1f4cf8aeadd29a407ed2a00dc00 100644 --- a/objects/Istar/other.c +++ b/objects/Istar/other.c @@ -42,7 +42,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/resource.xpm" diff --git a/objects/Jackson/domain.c b/objects/Jackson/domain.c index b961c3758dfb763f08bc71df69243a84730b3cb1..a59fa9246619e6cca4f5980f60eed43c5d2d5a7b 100644 --- a/objects/Jackson/domain.c +++ b/objects/Jackson/domain.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/given_domain.xpm" diff --git a/objects/KAOS/goal.c b/objects/KAOS/goal.c index 403b4402139eef36fdecef1aa6b85815dbc3028f..a3d476254dca889524547ae015f20c0bedcaf972 100644 --- a/objects/KAOS/goal.c +++ b/objects/KAOS/goal.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/goal.xpm" diff --git a/objects/KAOS/metabinrel.c b/objects/KAOS/metabinrel.c index b8c96a180798226d3b798e79146900e23627b3c8..1384468a4b69490cdb9e0acb9ac15ff6e378634b 100644 --- a/objects/KAOS/metabinrel.c +++ b/objects/KAOS/metabinrel.c @@ -91,7 +91,7 @@ struct _Mbr { #define MBR_DEC_SIZE 1.0 -static Color color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; +static GdkRGBA color_red = { 1.0f, 0.0f, 0.0f, 1.0f }; static DiaFont *mbr_font = NULL; diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c index 8d4fac27e95c9c8ffff0f6bd7f0827d65f25b139..6604124ad13b412dcf9d210e59f207901319313d 100644 --- a/objects/KAOS/other.c +++ b/objects/KAOS/other.c @@ -43,7 +43,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/agent.xpm" diff --git a/objects/Misc/analog_clock.c b/objects/Misc/analog_clock.c index 51cd651ad700e676a4ddedc79b5a6a5c9644047f..e23f7fab5490fdaebadc1ddb351fa9a3db7bc7d4 100644 --- a/objects/Misc/analog_clock.c +++ b/objects/Misc/analog_clock.c @@ -35,7 +35,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "dynamic_obj.h" @@ -48,13 +47,13 @@ typedef struct _Chronoline { ConnectionPoint hour_tip, min_tip, sec_tip; ConnectionPoint center_cp; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; - Color arrow_color; + GdkRGBA arrow_color; real arrow_line_width; - Color sec_arrow_color; + GdkRGBA sec_arrow_color; real sec_arrow_line_width; gboolean show_ticks; diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c index 0a030ff1dc00bf89707049b752094409bcae0146..2e0052f46af1121df7b7c1fd5e50f81a8ada6363 100644 --- a/objects/Misc/diagram_as_object.c +++ b/objects/Misc/diagram_as_object.c @@ -54,9 +54,9 @@ typedef struct _DiagramAsElement { ConnectionPoint connections[NUM_CONNECTIONS]; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; gchar *filename; diff --git a/objects/Misc/grid_object.c b/objects/Misc/grid_object.c index c572d970845075d8ecdf393c56b2596624f8401d..0253d68df32fcfd6bb37a71c4c4613437865befc 100644 --- a/objects/Misc/grid_object.c +++ b/objects/Misc/grid_object.c @@ -36,7 +36,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "pixmaps/grid_object.xpm" @@ -51,13 +50,13 @@ typedef struct _Grid_Object { gint cells_cols; ConnectionPoint *cells; - Color border_color; + GdkRGBA border_color; real border_line_width; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; gint grid_rows; gint grid_cols; - Color gridline_color; + GdkRGBA gridline_color; real gridline_width; } Grid_Object; diff --git a/objects/Misc/measure.c b/objects/Misc/measure.c index 7b9626881f47813be10a600e455e17c4bc0ef948..c7c10418745b3d2072ce22a487c48d78e65d8f62 100644 --- a/objects/Misc/measure.c +++ b/objects/Misc/measure.c @@ -38,7 +38,7 @@ typedef struct _Measure { DiaFont *font; real font_height; - Color line_color; + GdkRGBA line_color; real line_width; real scale; DiaUnit unit; diff --git a/objects/Misc/n_gon.c b/objects/Misc/n_gon.c index fe7b4b1aef3eca7e32a224503ea583de45ba4efe..4071761c0abd3745f67970260bbae3aa4380ef6e 100644 --- a/objects/Misc/n_gon.c +++ b/objects/Misc/n_gon.c @@ -63,8 +63,8 @@ struct _Ngon { LineJoin line_join; real dashlength; real line_width; - Color stroke; - Color fill; + GdkRGBA stroke; + GdkRGBA fill; gboolean show_background; DiaPattern *pattern; @@ -228,7 +228,7 @@ _ngon_draw(Ngon *ng, DiaRenderer *renderer) gboolean pattern_fill = ng->show_background && ng->pattern != NULL && renderer_ops->is_capable_to(renderer, RENDER_PATTERN); - Color fill; + GdkRGBA fill; g_return_if_fail (ng->points->len); diff --git a/objects/Misc/tree.c b/objects/Misc/tree.c index 3fcd258e32077889277077ba0300a2eafe0fbabe..3e30361d2c39cf36b110b695fc8a9c80144ccf54 100644 --- a/objects/Misc/tree.c +++ b/objects/Misc/tree.c @@ -47,7 +47,7 @@ typedef struct _Tree { Handle **handles; Point *parallel_points; Point real_ends[2]; - Color line_color; + GdkRGBA line_color; } Tree; enum change_type { diff --git a/objects/SADT/annotation.c b/objects/SADT/annotation.c index 1464b08ac0a20a9770ecc7d91ff736ad1994c54d..933d7f158d996effb839e4d136cdc22aa28dd84b 100644 --- a/objects/SADT/annotation.c +++ b/objects/SADT/annotation.c @@ -48,7 +48,7 @@ typedef struct _Annotation { Text *text; - Color line_color; + GdkRGBA line_color; } Annotation; @@ -120,7 +120,7 @@ static ObjectOps annotation_ops = { #ifdef TEMPORARY_EVENT_TEST static gboolean handle_btn1(Annotation *annotation, Property *prop) { - Color col; + GdkRGBA col; col = annotation->text->color; /* g_message("in handle_btn1 for object %p col=%.2f:%.2f:%.2f", annotation,col.red,col.green,col.blue); */ diff --git a/objects/SADT/arrow.c b/objects/SADT/arrow.c index f59d3de0b5e8ae4ebfd5fa201077a79c224e28d7..144f1895a9706af1345e08f141e658b95f1491b9 100644 --- a/objects/SADT/arrow.c +++ b/objects/SADT/arrow.c @@ -32,7 +32,6 @@ #include "connectionpoint.h" #include "diarenderer.h" #include "attributes.h" -#include "color.h" #include "properties.h" #include "sadt.h" @@ -65,7 +64,7 @@ typedef struct _Sadtarrow { Sadtarrow_style style; gboolean autogray; - Color line_color; + GdkRGBA line_color; } Sadtarrow; static ObjectChange* sadtarrow_move_handle(Sadtarrow *sadtarrow, Handle *handle, @@ -229,9 +228,9 @@ sadtarrow_move(Sadtarrow *sadtarrow, Point *to) } static void draw_dot(DiaRenderer *renderer, - Point *end, Point *vect, Color *col); + Point *end, Point *vect, GdkRGBA *col); static void draw_tunnel(DiaRenderer *renderer, - Point *end, Point *vect, Color *col); + Point *end, Point *vect, GdkRGBA *col); #define GBASE .45 #define GMULT .55 @@ -243,7 +242,7 @@ sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer) OrthConn *orth = &sadtarrow->orth; Point *points; int n; - Color col; + GdkRGBA col; Arrow arrow; points = &orth->points[0]; @@ -291,7 +290,7 @@ sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer) } static void draw_dot(DiaRenderer *renderer, - Point *end, Point *vect, Color *col) + Point *end, Point *vect, GdkRGBA *col) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point vv,vp,vt,pt; @@ -320,7 +319,7 @@ static void draw_dot(DiaRenderer *renderer, } static void draw_tunnel(DiaRenderer *renderer, - Point *end, Point *vect, Color *col) + Point *end, Point *vect, GdkRGBA *col) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point vv,vp,vt1,vt2; diff --git a/objects/SADT/box.c b/objects/SADT/box.c index 1981db4131d81140f45dec78c0318b30949e3332..e70059e8df2d0f6bb5338d54a4e5f966da53f288 100644 --- a/objects/SADT/box.c +++ b/objects/SADT/box.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "pixmaps/sadtbox.xpm" @@ -65,8 +64,8 @@ typedef struct _Box { gchar *id; real padding; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; } Box; static real sadtbox_distance_from(Box *box, Point *point); diff --git a/objects/UML/Makefile.am b/objects/UML/Makefile.am index 1ea8e5e089cb30070a222d6e656dd29dae50fa78..147cf4ba9461afd4a4de960024d31e3828443939 100644 --- a/objects/UML/Makefile.am +++ b/objects/UML/Makefile.am @@ -4,13 +4,21 @@ pkglib_LTLIBRARIES = libuml_objects.la libuml_objects_la_SOURCES = \ uml.h \ uml.c \ + dia-uml-class.c \ + dia-uml-operation.c \ + dia-uml-parameter.c \ + dia-uml-attribute.c \ + dia-uml-formal-parameter.c \ class.c \ class.h \ class_dialog.h \ class_dialog.c \ - class_attributes_dialog.c \ + editor/dia-uml-class-editor.c \ + editor/dia-uml-operation-dialog.c \ + editor/dia-uml-operation-parameter-row.c \ + editor/dia-uml-attribute-dialog.c \ + editor/dia-uml-formal-parameter-dialog.c \ class_operations_dialog.c \ - class_templates_dialog.c \ note.c \ actor.c \ usecase.c \ @@ -36,17 +44,13 @@ libuml_objects_la_SOURCES = \ fork.c \ stereotype.c \ stereotype.h \ - transition.c \ - umlattribute.c \ - umloperation.c \ - umlparameter.c \ - umlformalparameter.c + transition.c libuml_objects_la_LDFLAGS = -export-dynamic -module -avoid-version $(NO_UNDEFINED) libuml_objects_la_LIBADD = $(CAIRO_LIBS) $(top_builddir)/lib/libdia.la AM_CPPFLAGS = -I$(top_srcdir)/intl -I$(srcdir)/../../lib \ - $(DEBUG_FLAGS) $(GTK_CFLAGS) $(PANGOFT2_CFLAGS) $(UNICODE_CFLAGS) + $(DEBUG_FLAGS) $(GTK_CFLAGS) $(PANGOFT2_CFLAGS) $(UNICODE_CFLAGS) -DG_LOG_DOMAIN=\"DimUml\" EXTRA_DIST = \ pixmaps/actor.xpm \ diff --git a/objects/UML/activity.c b/objects/UML/activity.c index 79301873101ef702821402e4a445135ebb50d69d..9915e3cc6398c2d8b504c5a01fc5513f1999ca3c 100644 --- a/objects/UML/activity.c +++ b/objects/UML/activity.c @@ -49,8 +49,8 @@ struct _State { Text *text; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/UML/actor.c b/objects/UML/actor.c index a65d7c15e6169da4d8ce5960deec9d2f756a0c04..9ab4e3c8f283b078a621337de17a90601105722a 100644 --- a/objects/UML/actor.c +++ b/objects/UML/actor.c @@ -44,8 +44,8 @@ struct _Actor { Text *text; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define ACTOR_WIDTH 2.2 diff --git a/objects/UML/association.c b/objects/UML/association.c index 95356990ef347d2452475a87f3dbf4d2932cee7f..3848a6a8797ca6efca59743e12a1fb124c136067 100644 --- a/objects/UML/association.c +++ b/objects/UML/association.c @@ -137,8 +137,8 @@ struct _Association { AssociationEnd end[2]; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/branch.c b/objects/UML/branch.c index cd56026df332a087550a435fd27f7d6206a6cd99..29ee0377d364268b066a0f1b2ab559f22d314313 100644 --- a/objects/UML/branch.c +++ b/objects/UML/branch.c @@ -48,8 +48,8 @@ struct _Branch { Element element; ConnectionPoint connections[NUM_CONNECTIONS]; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; static const double BRANCH_BORDERWIDTH = 0.1; @@ -244,7 +244,7 @@ static void branch_update_data(Branch *branch) branch->connections[3].pos.y = elem->corner.y + elem->height; branch->connections[3].directions = DIR_SOUTH; - extra->border_trans = BRANCH_BORDERWIDTH / 1.4142; /* not 2.0, it is rotated 45 */ + extra->border_trans = BRANCH_BORDERWIDTH / 1.4142; /* not 2.0, it is rotated 45� */ element_update_boundingbox(elem); obj->position = elem->corner; diff --git a/objects/UML/class.c b/objects/UML/class.c index 5cd7cdb24abb0bb9d5aa1000ce1056c7f64bc473..f650c1b4d4144a744f63820be6b94d03be7bf1ee 100644 --- a/objects/UML/class.c +++ b/objects/UML/class.c @@ -43,6 +43,10 @@ #include "debug.h" +#include "dia-uml-attribute.h" +#include "dia-uml-operation.h" +#include "dia-uml-formal-parameter.h" + #define UMLCLASS_BORDER 0.1 #define UMLCLASS_UNDERLINEWIDTH 0.05 #define UMLCLASS_TEMPLATE_OVERLAY_X 2.3 @@ -372,6 +376,7 @@ typedef struct _CommentState { ObjectState state; gboolean visible_comments; } CommentState; + static ObjectState* _comment_get_state (DiaObject *obj) { @@ -380,6 +385,7 @@ _comment_get_state (DiaObject *obj) state->visible_comments = ((UMLClass *)obj)->visible_comments; return (ObjectState *)state; } + static void _comment_set_state (DiaObject *obj, ObjectState *state) { @@ -457,9 +463,9 @@ umlclass_set_props(UMLClass *umlclass, GPtrArray *props) i = UMLCLASS_CONNECTIONPOINTS; list = (!umlclass->visible_attributes || umlclass->suppress_attributes) ? NULL : umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; - uml_attribute_ensure_connection_points (attr, obj); + dia_uml_attribute_ensure_connection_points (attr, obj); obj->connections[i] = attr->left_connection; obj->connections[i]->object = obj; i++; @@ -470,13 +476,13 @@ umlclass_set_props(UMLClass *umlclass, GPtrArray *props) } list = (!umlclass->visible_operations || umlclass->suppress_operations) ? NULL : umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; + DiaUmlOperation *op = (DiaUmlOperation *)list->data; - uml_operation_ensure_connection_points (op, obj); - obj->connections[i] = op->left_connection; + dia_uml_operation_ensure_connection_points (op, obj); + obj->connections[i] = op->l_connection; obj->connections[i]->object = obj; i++; - obj->connections[i] = op->right_connection; + obj->connections[i] = op->r_connection; obj->connections[i]->object = obj; i++; list = g_list_next(list); @@ -548,6 +554,7 @@ umlclass_move(UMLClass *umlclass, Point *to) return NULL; } + /** * underlines the text at the start point using the text to determine * the length of the underline. Draw a line under the text represented by @@ -572,7 +579,7 @@ uml_underline_text(DiaRenderer *renderer, DiaFont *font, real font_height, gchar *string, - Color *color, + GdkRGBA *color, real line_width, real underline_width) { @@ -720,7 +727,7 @@ static void uml_draw_comments(DiaRenderer *renderer, DiaFont *font, real font_height, - Color *text_color, + GdkRGBA *text_color, gchar *comment, gboolean comment_tagging, gint Comment_line_length, @@ -795,7 +802,7 @@ umlclass_draw_namebox(UMLClass *umlclass, DiaRenderer *renderer, Element *elem ) Point StartPoint; Point LowerRightPoint; real Yoffset; - Color *text_color = ¨class->text_color; + GdkRGBA *text_color = ¨class->text_color; @@ -880,9 +887,9 @@ umlclass_draw_attributebox(UMLClass *umlclass, DiaRenderer *renderer, Element *e Point StartPoint; Point LowerRight; DiaFont *font; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; GList *list; StartPoint.x = elem->corner.x; @@ -903,8 +910,8 @@ umlclass_draw_attributebox(UMLClass *umlclass, DiaRenderer *renderer, Element *e list = umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; - gchar *attstr = uml_get_attribute_string(attr); + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; + gchar *attstr = dia_uml_attribute_format(attr); if (attr->abstract) { font = umlclass->abstract_font; @@ -967,9 +974,9 @@ umlclass_draw_operationbox(UMLClass *umlclass, DiaRenderer *renderer, Element *e Point LowerRight; DiaFont *font; GList *list; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; StartPoint.x = elem->corner.x; @@ -994,8 +1001,8 @@ umlclass_draw_operationbox(UMLClass *umlclass, DiaRenderer *renderer, Element *e list = umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; - gchar* opstr = uml_get_operation_string(op); + DiaUmlOperation *op = (DiaUmlOperation *)list->data; + gchar* opstr = dia_uml_operation_format(op); real ascent; switch (op->inheritance_type) { @@ -1119,9 +1126,9 @@ umlclass_draw_template_parameters_box(UMLClass *umlclass, DiaRenderer *renderer, DiaFont *font = umlclass->normal_font; real font_height = umlclass->font_height; real ascent; - Color *fill_color = ¨class->fill_color; - Color *line_color = ¨class->line_color; - Color *text_color = ¨class->text_color; + GdkRGBA *fill_color = ¨class->fill_color; + GdkRGBA *line_color = ¨class->line_color; + GdkRGBA *text_color = ¨class->text_color; /* @@ -1144,7 +1151,7 @@ umlclass_draw_template_parameters_box(UMLClass *umlclass, DiaRenderer *renderer, list = umlclass->formal_params; while (list != NULL) { - gchar *paramstr = uml_get_formalparameter_string((UMLFormalParameter *)list->data); + gchar *paramstr = dia_uml_formal_parameter_format ((DiaUmlFormalParameter *) list->data); ascent = dia_font_ascent(paramstr, font, font_height); TextInsert.y += ascent; @@ -1276,7 +1283,7 @@ umlclass_update_data(UMLClass *umlclass) list = (!umlclass->visible_attributes || umlclass->suppress_attributes) ? NULL : umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; attr->left_connection->pos.x = x; attr->left_connection->pos.y = y; @@ -1306,14 +1313,14 @@ umlclass_update_data(UMLClass *umlclass) list = (!umlclass->visible_operations || umlclass->suppress_operations) ? NULL : umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; + DiaUmlOperation *op = (DiaUmlOperation *)list->data; - op->left_connection->pos.x = x; - op->left_connection->pos.y = y; - op->left_connection->directions = DIR_WEST; - op->right_connection->pos.x = x + elem->width; - op->right_connection->pos.y = y; - op->right_connection->directions = DIR_EAST; + op->l_connection->pos.x = x; + op->l_connection->pos.y = y; + op->l_connection->directions = DIR_WEST; + op->r_connection->pos.x = x + elem->width; + op->r_connection->pos.y = y; + op->r_connection->directions = DIR_EAST; if (op->needs_wrapping) { /* Wrapped */ int lines = g_list_length(op->wrappos); @@ -1442,8 +1449,8 @@ umlclass_calculate_attribute_data(UMLClass *umlclass) list = umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *) list->data; - gchar *attstr = uml_get_attribute_string(attr); + DiaUmlAttribute *attr = (DiaUmlAttribute *) list->data; + gchar *attstr = dia_uml_attribute_format(attr); if (attr->abstract) { @@ -1522,8 +1529,8 @@ umlclass_calculate_operation_data(UMLClass *umlclass) list = umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *) list->data; - gchar *opstr = uml_get_operation_string(op); + DiaUmlOperation *op = (DiaUmlOperation *) list->data; + gchar *opstr = dia_uml_operation_format(op); DiaFont *Font; real FontHeight; @@ -1733,9 +1740,9 @@ umlclass_calculate_data(UMLClass *umlclass) list = umlclass->formal_params; while (list != NULL) { - UMLFormalParameter *param = (UMLFormalParameter *) list->data; - gchar *paramstr = uml_get_formalparameter_string(param); - + DiaUmlFormalParameter *param = (DiaUmlFormalParameter *) list->data; + gchar *paramstr = dia_uml_formal_parameter_format (param); + width = dia_font_string_width(paramstr, umlclass->normal_font, umlclass->font_height); @@ -1782,6 +1789,7 @@ fill_in_fontdata(UMLClass *umlclass) umlclass->comment_font = dia_font_new_from_style(DIA_FONT_SANS | DIA_FONT_ITALIC, 0.7); } } + /** * Create an object of type class * By default this will create a object of class UMLClass. Howerver there @@ -1905,9 +1913,9 @@ static void umlclass_destroy(UMLClass *umlclass) { GList *list; - UMLAttribute *attr; - UMLOperation *op; - UMLFormalParameter *param; + DiaUmlAttribute *attr; + DiaUmlOperation *op; + DiaUmlFormalParameter *param; #ifdef DEBUG umlclass_sanity_check(umlclass, "Destroying"); @@ -1930,28 +1938,28 @@ umlclass_destroy(UMLClass *umlclass) list = umlclass->attributes; while (list != NULL) { - attr = (UMLAttribute *)list->data; - g_free(attr->left_connection); - g_free(attr->right_connection); - uml_attribute_destroy(attr); - list = g_list_next(list); + attr = (DiaUmlAttribute *)list->data; + g_free (attr->left_connection); + g_free (attr->right_connection); + g_object_unref (attr); + list = g_list_next (list); } - g_list_free(umlclass->attributes); + g_list_free (umlclass->attributes); list = umlclass->operations; while (list != NULL) { - op = (UMLOperation *)list->data; - g_free(op->left_connection); - g_free(op->right_connection); - uml_operation_destroy(op); + op = (DiaUmlOperation *)list->data; + g_free (op->l_connection); + g_free (op->r_connection); + g_object_unref (op); list = g_list_next(list); } - g_list_free(umlclass->operations); + g_list_free (umlclass->operations); list = umlclass->formal_params; while (list != NULL) { - param = (UMLFormalParameter *)list->data; - uml_formalparameter_destroy(param); + param = (DiaUmlFormalParameter *)list->data; + g_object_unref (param); list = g_list_next(list); } g_list_free(umlclass->formal_params); @@ -1973,7 +1981,7 @@ umlclass_copy(UMLClass *umlclass) Element *elem, *newelem; DiaObject *newobj; GList *list; - UMLFormalParameter *param; + DiaUmlFormalParameter *param; elem = ¨class->element; @@ -2035,25 +2043,23 @@ umlclass_copy(UMLClass *umlclass) newumlclass->attributes = NULL; list = umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; /* not copying the connection, if there was one */ - UMLAttribute *newattr = uml_attribute_copy(attr); - uml_attribute_ensure_connection_points (newattr, newobj); + DiaUmlAttribute *newattr = dia_uml_attribute_copy (attr); + dia_uml_attribute_ensure_connection_points (newattr, newobj); - newumlclass->attributes = g_list_append(newumlclass->attributes, - newattr); + newumlclass->attributes = g_list_append (newumlclass->attributes, newattr); list = g_list_next(list); } newumlclass->operations = NULL; list = umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; - UMLOperation *newop = uml_operation_copy(op); - uml_operation_ensure_connection_points (newop, newobj); + DiaUmlOperation *op = (DiaUmlOperation *) list->data; + DiaUmlOperation *newop = dia_uml_operation_copy (op); + dia_uml_operation_ensure_connection_points (newop, newobj); - newumlclass->operations = g_list_append(newumlclass->operations, - newop); + newumlclass->operations = g_list_append(newumlclass->operations, newop); list = g_list_next(list); } @@ -2062,10 +2068,9 @@ umlclass_copy(UMLClass *umlclass) newumlclass->formal_params = NULL; list = umlclass->formal_params; while (list != NULL) { - param = (UMLFormalParameter *)list->data; - newumlclass->formal_params = - g_list_append(newumlclass->formal_params, - uml_formalparameter_copy(param)); + param = (DiaUmlFormalParameter *) list->data; + newumlclass->formal_params = g_list_append (newumlclass->formal_params, + dia_uml_formal_parameter_copy (param)); list = g_list_next(list); } @@ -2087,7 +2092,7 @@ umlclass_copy(UMLClass *umlclass) (!newumlclass->suppress_attributes)) { list = newumlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; newobj->connections[i++] = attr->left_connection; newobj->connections[i++] = attr->right_connection; @@ -2099,9 +2104,9 @@ umlclass_copy(UMLClass *umlclass) (!newumlclass->suppress_operations)) { list = newumlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; - newobj->connections[i++] = op->left_connection; - newobj->connections[i++] = op->right_connection; + DiaUmlOperation *op = (DiaUmlOperation *)list->data; + newobj->connections[i++] = op->l_connection; + newobj->connections[i++] = op->r_connection; list = g_list_next(list); } @@ -2126,14 +2131,19 @@ umlclass_copy(UMLClass *umlclass) return &newumlclass->element.object; } +/* ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ +/* to/from file ------------------------------------------------------------ */ +/* ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ static void umlclass_save(UMLClass *umlclass, ObjectNode obj_node, DiaContext *ctx) { - UMLAttribute *attr; - UMLOperation *op; - UMLFormalParameter *formal_param; + DiaUmlAttribute *attr; + DiaUmlOperation *op; + DiaUmlFormalParameter *formal_param; GList *list; AttributeNode attr_node; @@ -2209,7 +2219,7 @@ umlclass_save(UMLClass *umlclass, ObjectNode obj_node, attr_node = new_attribute(obj_node, "attributes"); list = umlclass->attributes; while (list != NULL) { - attr = (UMLAttribute *) list->data; + attr = (DiaUmlAttribute *) list->data; uml_attribute_write(attr_node, attr, ctx); list = g_list_next(list); } @@ -2218,7 +2228,7 @@ umlclass_save(UMLClass *umlclass, ObjectNode obj_node, attr_node = new_attribute(obj_node, "operations"); list = umlclass->operations; while (list != NULL) { - op = (UMLOperation *) list->data; + op = (DiaUmlOperation *) list->data; uml_operation_write(attr_node, op, ctx); list = g_list_next(list); } @@ -2230,7 +2240,7 @@ umlclass_save(UMLClass *umlclass, ObjectNode obj_node, attr_node = new_attribute(obj_node, "templates"); list = umlclass->formal_params; while (list != NULL) { - formal_param = (UMLFormalParameter *) list->data; + formal_param = (DiaUmlFormalParameter *) list->data; uml_formalparameter_write(attr_node, formal_param, ctx); list = g_list_next(list); } @@ -2340,20 +2350,20 @@ umlclass_load(ObjectNode obj_node, int version, DiaContext *ctx) /* Attribute info: */ list = umlclass->attributes; while (list) { - UMLAttribute *attr = list->data; + DiaUmlAttribute *attr = list->data; g_assert(attr); - uml_attribute_ensure_connection_points (attr, obj); + dia_uml_attribute_ensure_connection_points (attr, obj); list = g_list_next(list); } /* Operations info: */ list = umlclass->operations; while (list) { - UMLOperation *op = (UMLOperation *)list->data; + DiaUmlOperation *op = (DiaUmlOperation *)list->data; g_assert(op); - uml_operation_ensure_connection_points (op, obj); + dia_uml_operation_ensure_connection_points (op, obj); list = g_list_next(list); } @@ -2443,7 +2453,7 @@ umlclass_sanity_check(UMLClass *c, gchar *msg) /* Check that attributes are set up right. */ i = 0; for (attrs = c->attributes; attrs != NULL; attrs = g_list_next(attrs)) { - UMLAttribute *attr = (UMLAttribute *)attrs->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *)attrs->data; dia_assert_true(attr->name != NULL, "%s: %p attr %d has null name\n", @@ -2481,5 +2491,3 @@ umlclass_sanity_check(UMLClass *c, gchar *msg) } /* Check that operations are set up right. */ } - - diff --git a/objects/UML/class.h b/objects/UML/class.h index 46bc07ff1110f2f9a5fb40e6cebfef08e327e394..5a2e888f89f45f3eef9c2730a2200316809f2641 100644 --- a/objects/UML/class.h +++ b/objects/UML/class.h @@ -103,9 +103,9 @@ struct _UMLClass { int comment_line_length; /**< Maximum line length for comments */ int comment_tagging; /**< bool: if the {documentation = } tag should be used */ - Color line_color; - Color fill_color; - Color text_color; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; /** Attributes: aka member variables */ GList *attributes; diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c deleted file mode 100644 index ce05bff53807fafdf1dcf747606e14a1ce93bd4b..0000000000000000000000000000000000000000 --- a/objects/UML/class_attributes_dialog.c +++ /dev/null @@ -1,603 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ -#include - -#include "class.h" -#include "diaoptionmenu.h" - -#include "class_dialog.h" - -/************************************************************ - ******************** ATTRIBUTES **************************** - ************************************************************/ - -static void -attributes_set_sensitive(UMLClassDialog *prop_dialog, gint val) -{ - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_name), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_type), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_value), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_comment), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_visible), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->attr_class_scope), val); -} - -static void -attributes_set_values(UMLClassDialog *prop_dialog, UMLAttribute *attr) -{ - gtk_entry_set_text(prop_dialog->attr_name, attr->name); - gtk_entry_set_text(prop_dialog->attr_type, attr->type); - if (attr->value != NULL) - gtk_entry_set_text(prop_dialog->attr_value, attr->value); - else - gtk_entry_set_text(prop_dialog->attr_value, ""); - - if (attr->comment != NULL) - _class_set_comment(prop_dialog->attr_comment, attr->comment); - else - _class_set_comment(prop_dialog->attr_comment, ""); - - - dia_option_menu_set_active(prop_dialog->attr_visible, attr->visibility); - gtk_toggle_button_set_active(prop_dialog->attr_class_scope, attr->class_scope); -} - -static void -attributes_clear_values(UMLClassDialog *prop_dialog) -{ - gtk_entry_set_text(prop_dialog->attr_name, ""); - gtk_entry_set_text(prop_dialog->attr_type, ""); - gtk_entry_set_text(prop_dialog->attr_value, ""); - _class_set_comment(prop_dialog->attr_comment, ""); - gtk_toggle_button_set_active(prop_dialog->attr_class_scope, FALSE); -} - -static void -attributes_get_values (UMLClassDialog *prop_dialog, UMLAttribute *attr) -{ - g_free (attr->name); - g_free (attr->type); - if (attr->value != NULL) - g_free (attr->value); - - attr->name = g_strdup (gtk_entry_get_text (prop_dialog->attr_name)); - attr->type = g_strdup (gtk_entry_get_text (prop_dialog->attr_type)); - - attr->value = g_strdup (gtk_entry_get_text(prop_dialog->attr_value)); - attr->comment = g_strdup (_class_get_comment(prop_dialog->attr_comment)); - - attr->visibility = (UMLVisibility)dia_option_menu_get_active (prop_dialog->attr_visible); - - attr->class_scope = prop_dialog->attr_class_scope->active; -} - -void -_attributes_get_current_values(UMLClassDialog *prop_dialog) -{ - UMLAttribute *current_attr; - GtkLabel *label; - char *new_str; - - if (prop_dialog != NULL && prop_dialog->current_attr != NULL) { - current_attr = (UMLAttribute *) - g_object_get_data(G_OBJECT(prop_dialog->current_attr), "user_data"); - if (current_attr != NULL) { - attributes_get_values(prop_dialog, current_attr); - label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(prop_dialog->current_attr))); - new_str = uml_get_attribute_string(current_attr); - gtk_label_set_text (label, new_str); - g_free (new_str); - } - } -} - -static void -attribute_list_item_destroy_callback(GtkWidget *list_item, - gpointer data) -{ - UMLAttribute *attr; - - attr = (UMLAttribute *) g_object_get_data(G_OBJECT(list_item), "user_data"); - - if (attr != NULL) { - uml_attribute_destroy(attr); - /*printf("Destroying list_item's user_data!\n");*/ - } -} - -static void -attributes_list_selection_changed_callback(GtkWidget *gtklist, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkObject *list_item; - UMLAttribute *attr; - - /* Due to GtkList oddities, this may get called during destroy. - * But it'll reference things that are already dead and crash. - * Thus, we stop it before it gets that bad. See bug #156706 for - * one example. - */ - if (umlclass->destroyed) - return; - - prop_dialog = umlclass->properties_dialog; - - if (!prop_dialog) - return; - - _attributes_get_current_values(prop_dialog); - - list = GTK_LIST(gtklist)->selection; - if (!list && prop_dialog) { /* No selected */ - attributes_set_sensitive(prop_dialog, FALSE); - attributes_clear_values(prop_dialog); - prop_dialog->current_attr = NULL; - return; - } - - list_item = GTK_OBJECT(list->data); - attr = (UMLAttribute *)g_object_get_data(G_OBJECT(list_item), "user_data"); - attributes_set_values(prop_dialog, attr); - attributes_set_sensitive(prop_dialog, TRUE); - - prop_dialog->current_attr = GTK_LIST_ITEM(list_item); - gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->attr_name)); -} - -static void -attributes_list_new_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkWidget *list_item; - UMLAttribute *attr; - char *utfstr; - prop_dialog = umlclass->properties_dialog; - - _attributes_get_current_values(prop_dialog); - - attr = uml_attribute_new(); - /* need to make the new ConnectionPoint valid and remember them */ - uml_attribute_ensure_connection_points (attr, ¨class->element.object); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, attr->left_connection); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, attr->right_connection); - - utfstr = uml_get_attribute_string (attr); - list_item = gtk_list_item_new_with_label (utfstr); - gtk_widget_show (list_item); - g_free (utfstr); - - g_object_set_data(G_OBJECT(list_item), "user_data", attr); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (attribute_list_item_destroy_callback), NULL); - - list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->attributes_list, list); - - if (prop_dialog->attributes_list->children != NULL) - gtk_list_unselect_child(prop_dialog->attributes_list, - GTK_WIDGET(prop_dialog->attributes_list->children->data)); - gtk_list_select_child(prop_dialog->attributes_list, list_item); -} - -static void -attributes_list_delete_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - UMLAttribute *attr; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); - - if (gtklist->selection != NULL) { - attr = (UMLAttribute *) - g_object_get_data(G_OBJECT(gtklist->selection->data), "user_data"); - - if (attr->left_connection != NULL) { - prop_dialog->deleted_connections = - g_list_prepend(prop_dialog->deleted_connections, - attr->left_connection); - prop_dialog->deleted_connections = - g_list_prepend(prop_dialog->deleted_connections, - attr->right_connection); - } - - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); - g_list_free(list); - attributes_clear_values(prop_dialog); - attributes_set_sensitive(prop_dialog, FALSE); - } -} - -static void -attributes_list_move_up_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i>0) - i--; - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } -} - -static void -attributes_list_move_down_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->attributes_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) - i++; - - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } -} - -void -_attributes_read_from_dialog(UMLClass *umlclass, - UMLClassDialog *prop_dialog, - int connection_index) -{ - GList *list; - UMLAttribute *attr; - GtkWidget *list_item; - GList *clear_list; - DiaObject *obj; - - obj = ¨class->element.object; - - /* if the currently select attribute is changed, update the state in the - * dialog info from widgets */ - _attributes_get_current_values(prop_dialog); - /* Free current attributes: */ - list = umlclass->attributes; - while (list != NULL) { - attr = (UMLAttribute *)list->data; - uml_attribute_destroy(attr); - list = g_list_next(list); - } - g_list_free (umlclass->attributes); - umlclass->attributes = NULL; - - /* Insert new attributes and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->attributes_list)->children; - clear_list = NULL; - while (list != NULL) { - list_item = GTK_WIDGET(list->data); - - clear_list = g_list_prepend (clear_list, list_item); - attr = (UMLAttribute *) - g_object_get_data(G_OBJECT(list_item), "user_data"); - g_object_set_data(G_OBJECT(list_item), "user_data", NULL); - umlclass->attributes = g_list_append(umlclass->attributes, attr); - - if (attr->left_connection == NULL) { - uml_attribute_ensure_connection_points (attr, obj); - - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, - attr->left_connection); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, - attr->right_connection); - } - - if ( (prop_dialog->attr_vis->active) && - (!prop_dialog->attr_supp->active) ) { - obj->connections[connection_index] = attr->left_connection; - connection_index++; - obj->connections[connection_index] = attr->right_connection; - connection_index++; - } else { - _umlclass_store_disconnects(prop_dialog, attr->left_connection); - object_remove_connections_to(attr->left_connection); - _umlclass_store_disconnects(prop_dialog, attr->right_connection); - object_remove_connections_to(attr->right_connection); - } - - list = g_list_next(list); - } - clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->attributes_list), clear_list); - g_list_free (clear_list); - -#if 0 /* UMLClass is *known* to be in an incositent state here, check later or crash ... */ - umlclass_sanity_check(umlclass, "Read from dialog"); -#endif -} - -void -_attributes_fill_in_dialog(UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - UMLAttribute *attr_copy; - GtkWidget *list_item; - GList *list; - int i; - -#ifdef DEBUG - umlclass_sanity_check(umlclass, "Filling in dialog"); -#endif - - prop_dialog = umlclass->properties_dialog; - - /* copy in new attributes: */ - if (prop_dialog->attributes_list->children == NULL) { - i = 0; - list = umlclass->attributes; - while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; - gchar *attrstr = uml_get_attribute_string(attr); - - list_item = gtk_list_item_new_with_label (attrstr); - attr_copy = uml_attribute_copy(attr); - /* looks wrong but required for complicated ConnectionPoint memory management */ - attr_copy->left_connection = attr->left_connection; - attr_copy->right_connection = attr->right_connection; - g_object_set_data(G_OBJECT(list_item), "user_data", (gpointer) attr_copy); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (attribute_list_item_destroy_callback), NULL); - gtk_container_add (GTK_CONTAINER (prop_dialog->attributes_list), list_item); - gtk_widget_show (list_item); - - list = g_list_next(list); i++; - g_free (attrstr); - } - /* set attributes non-sensitive */ - prop_dialog->current_attr = NULL; - attributes_set_sensitive(prop_dialog, FALSE); - attributes_clear_values(prop_dialog); - } -} - -static void -attributes_update(GtkWidget *widget, UMLClass *umlclass) -{ - _attributes_get_current_values(umlclass->properties_dialog); -} - -static int -attributes_update_event(GtkWidget *widget, GdkEventFocus *ev, UMLClass *umlclass) -{ - _attributes_get_current_values(umlclass->properties_dialog); - return 0; -} - -void -_attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *page_label; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *hbox2; - GtkWidget *table; - GtkWidget *entry; - GtkWidget *checkbox; - GtkWidget *scrolled_win; - GtkWidget *button; - GtkWidget *list; - GtkWidget *frame; - GtkWidget *omenu; - GtkWidget *scrolledwindow; - - prop_dialog = umlclass->properties_dialog; - - /* Attributes page: */ - page_label = gtk_label_new_with_mnemonic (_("_Attributes")); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - - hbox = gtk_hbox_new(FALSE, 5); - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); - gtk_widget_show (scrolled_win); - - list = gtk_list_new (); - prop_dialog->attributes_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); - gtk_widget_show (list); - - g_signal_connect (G_OBJECT (list), "selection_changed", - G_CALLBACK(attributes_list_selection_changed_callback), umlclass); - - vbox2 = gtk_vbox_new(FALSE, 5); - - button = gtk_button_new_from_stock (GTK_STOCK_NEW); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(attributes_list_new_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(attributes_list_delete_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(attributes_list_move_up_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(attributes_list_move_down_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); - - frame = gtk_frame_new(_("Attribute data")); - vbox2 = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10); - gtk_container_add (GTK_CONTAINER (frame), vbox2); - gtk_widget_show(frame); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); - - table = gtk_table_new (5, 2, FALSE); - gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); - - label = gtk_label_new(_("Name:")); - entry = gtk_entry_new(); - prop_dialog->attr_name = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (attributes_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Type:")); - entry = gtk_entry_new(); - prop_dialog->attr_type = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (attributes_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Value:")); - entry = gtk_entry_new(); - prop_dialog->attr_value = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (attributes_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (attributes_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Comment:")); - scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), - GTK_SHADOW_IN); - entry = gtk_text_view_new (); - prop_dialog->attr_comment = GTK_TEXT_VIEW(entry); - gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (entry),TRUE); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (attributes_update_event), umlclass); -#if 0 /* while the GtkEntry has a "activate" signal, GtkTextView does not. - * Maybe we should connect to "set-focus-child" instead? - */ - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (attributes_update), umlclass); -#endif - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,3,4, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 1,2,3,4, GTK_FILL | GTK_EXPAND,0, 0,2); - - - label = gtk_label_new(_("Visibility:")); - - prop_dialog->attr_visible = omenu = dia_option_menu_new (); - g_signal_connect (G_OBJECT (omenu), "changed", - G_CALLBACK (attributes_update), umlclass); - dia_option_menu_add_item(omenu, _("Public"), UML_PUBLIC); - dia_option_menu_add_item(omenu, _("Private"), UML_PRIVATE); - dia_option_menu_add_item(omenu, _("Protected"), UML_PROTECTED); - dia_option_menu_add_item(omenu, _("Implementation"), UML_IMPLEMENTATION); - - { - GtkWidget * align; - align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); - gtk_container_add(GTK_CONTAINER(align), omenu); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,4,5, GTK_FILL,0, 0,3); - gtk_table_attach (GTK_TABLE (table), align, 1,2,4,5, GTK_FILL,0, 0,3); - } - - hbox2 = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Class scope")); - prop_dialog->attr_class_scope = GTK_TOGGLE_BUTTON(checkbox); - gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0); - - gtk_widget_show(vbox2); - - gtk_widget_show_all (vbox); - gtk_widget_show (page_label); - gtk_notebook_append_page(notebook, vbox, page_label); - -} diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c index 2910924c22846db14d0d9cf1060ccbd50f97effb..f50287ea2178ad9835ba4c248a0f30cd64dac281 100644 --- a/objects/UML/class_dialog.c +++ b/objects/UML/class_dialog.c @@ -32,7 +32,6 @@ #include #include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include #include #include @@ -43,6 +42,7 @@ #include "class.h" #include "diaoptionmenu.h" #include "diafontselector.h" +#include "dia-uml-class.h" #include "class_dialog.h" @@ -50,7 +50,6 @@ void umlclass_dialog_free (UMLClassDialog *dialog) { - g_list_free(dialog->deleted_connections); gtk_widget_destroy(dialog->dialog); /* destroy-signal destroy_properties_dialog already does 'g_free(dialog);' and more */ } @@ -61,56 +60,6 @@ typedef struct _Disconnect { Handle *other_handle; } Disconnect; -typedef struct _UMLClassState UMLClassState; - -struct _UMLClassState { - real font_height; - real abstract_font_height; - real polymorphic_font_height; - real classname_font_height; - real abstract_classname_font_height; - real comment_font_height; - - DiaFont *normal_font; - DiaFont *abstract_font; - DiaFont *polymorphic_font; - DiaFont *classname_font; - DiaFont *abstract_classname_font; - DiaFont *comment_font; - - char *name; - char *stereotype; - char *comment; - - int abstract; - int suppress_attributes; - int suppress_operations; - int visible_attributes; - int visible_operations; - int visible_comments; - - int wrap_operations; - int wrap_after_char; - int comment_line_length; - int comment_tagging; - - real line_width; - Color line_color; - Color fill_color; - Color text_color; - - /* Attributes: */ - GList *attributes; - - /* Operators: */ - GList *operations; - - /* Template: */ - int template; - GList *formal_params; -}; - - typedef struct _UMLClassChange UMLClassChange; struct _UMLClassChange { @@ -124,18 +73,20 @@ struct _UMLClassChange { int applied; - UMLClassState *saved_state; + DiaUmlClass *saved_state; }; -static UMLClassState *umlclass_get_state(UMLClass *umlclass); -static ObjectChange *new_umlclass_change(UMLClass *obj, UMLClassState *saved_state, - GList *added, GList *deleted, - GList *disconnected); +static ObjectChange * +new_umlclass_change (UMLClass *obj, + DiaUmlClass *saved_state, + GList *added, + GList *deleted, + GList *disconnected); /**** Utility functions ******/ void -_umlclass_store_disconnects(UMLClassDialog *prop_dialog, - ConnectionPoint *cp) +_umlclass_store_disconnects (ConnectionPoint *cp, + GList **disconnected) { Disconnect *dis; DiaObject *connected_obj; @@ -148,13 +99,11 @@ _umlclass_store_disconnects(UMLClassDialog *prop_dialog, for (i=0;inum_handles;i++) { if (connected_obj->handles[i]->connected_to == cp) { - dis = g_new0(Disconnect, 1); - dis->cp = cp; - dis->other_object = connected_obj; - dis->other_handle = connected_obj->handles[i]; - - prop_dialog->disconnected_connections = - g_list_prepend(prop_dialog->disconnected_connections, dis); + dis = g_new0(Disconnect, 1); + dis->cp = cp; + dis->other_object = connected_obj; + dis->other_handle = connected_obj->handles[i]; + *disconnected = g_list_prepend(*disconnected, dis); } } list = g_list_next(list); @@ -168,49 +117,13 @@ _umlclass_store_disconnects(UMLClassDialog *prop_dialog, static void class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) { - const gchar *s; - - if (umlclass->name != NULL) - g_free(umlclass->name); - - s = gtk_entry_get_text (prop_dialog->classname); - if (s && s[0]) - umlclass->name = g_strdup (s); - else - umlclass->name = NULL; - - if (umlclass->stereotype != NULL) - g_free(umlclass->stereotype); - - s = gtk_entry_get_text(prop_dialog->stereotype); - if (s && s[0]) - umlclass->stereotype = g_strdup (s); - else - umlclass->stereotype = NULL; - - if (umlclass->comment != NULL) - g_free (umlclass->comment); - - s = _class_get_comment(prop_dialog->comment); - if (s && s[0]) - umlclass->comment = g_strdup (s); - else - umlclass->comment = NULL; - - umlclass->abstract = prop_dialog->abstract_class->active; - umlclass->visible_attributes = prop_dialog->attr_vis->active; - umlclass->visible_operations = prop_dialog->op_vis->active; - umlclass->wrap_operations = prop_dialog->op_wrap->active; - umlclass->wrap_after_char = gtk_spin_button_get_value_as_int(prop_dialog->wrap_after_char); - umlclass->comment_line_length = gtk_spin_button_get_value_as_int(prop_dialog->comment_line_length); - umlclass->comment_tagging = prop_dialog->comment_tagging->active; - umlclass->visible_comments = prop_dialog->comments_vis->active; - umlclass->suppress_attributes = prop_dialog->attr_supp->active; - umlclass->suppress_operations = prop_dialog->op_supp->active; umlclass->line_width = gtk_spin_button_get_value(prop_dialog->line_width); - dia_color_selector_get_color(GTK_WIDGET(prop_dialog->text_color), ¨class->text_color); - dia_color_selector_get_color(GTK_WIDGET(prop_dialog->line_color), ¨class->line_color); - dia_color_selector_get_color(GTK_WIDGET(prop_dialog->fill_color), ¨class->fill_color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (prop_dialog->text_color), + ¨class->text_color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (prop_dialog->line_color), + ¨class->line_color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (prop_dialog->fill_color), + ¨class->fill_color); umlclass->normal_font = dia_font_selector_get_font (prop_dialog->normal_font); umlclass->polymorphic_font = dia_font_selector_get_font (prop_dialog->polymorphic_font); @@ -234,32 +147,13 @@ class_fill_in_dialog(UMLClass *umlclass) prop_dialog = umlclass->properties_dialog; - if (umlclass->name) - gtk_entry_set_text(prop_dialog->classname, umlclass->name); - if (umlclass->stereotype != NULL) - gtk_entry_set_text(prop_dialog->stereotype, umlclass->stereotype); - else - gtk_entry_set_text(prop_dialog->stereotype, ""); - - if (umlclass->comment != NULL) - _class_set_comment(prop_dialog->comment, umlclass->comment); - else - _class_set_comment(prop_dialog->comment, ""); - - gtk_toggle_button_set_active(prop_dialog->abstract_class, umlclass->abstract); - gtk_toggle_button_set_active(prop_dialog->attr_vis, umlclass->visible_attributes); - gtk_toggle_button_set_active(prop_dialog->op_vis, umlclass->visible_operations); - gtk_toggle_button_set_active(prop_dialog->op_wrap, umlclass->wrap_operations); - gtk_spin_button_set_value (prop_dialog->wrap_after_char, umlclass->wrap_after_char); - gtk_spin_button_set_value (prop_dialog->comment_line_length, umlclass->comment_line_length); - gtk_toggle_button_set_active(prop_dialog->comment_tagging, umlclass->comment_tagging); - gtk_toggle_button_set_active(prop_dialog->comments_vis, umlclass->visible_comments); - gtk_toggle_button_set_active(prop_dialog->attr_supp, umlclass->suppress_attributes); - gtk_toggle_button_set_active(prop_dialog->op_supp, umlclass->suppress_operations); gtk_spin_button_set_value (prop_dialog->line_width, umlclass->line_width); - dia_color_selector_set_color(GTK_WIDGET(prop_dialog->text_color), ¨class->text_color); - dia_color_selector_set_color(GTK_WIDGET(prop_dialog->line_color), ¨class->line_color); - dia_color_selector_set_color(GTK_WIDGET(prop_dialog->fill_color), ¨class->fill_color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (prop_dialog->text_color), + ¨class->text_color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (prop_dialog->line_color), + ¨class->line_color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (prop_dialog->fill_color), + ¨class->fill_color); dia_font_selector_set_font (prop_dialog->normal_font, umlclass->normal_font); dia_font_selector_set_font (prop_dialog->polymorphic_font, umlclass->polymorphic_font); dia_font_selector_set_font (prop_dialog->abstract_font, umlclass->abstract_font); @@ -275,7 +169,7 @@ class_fill_in_dialog(UMLClass *umlclass) } static void -create_font_props_row (GtkTable *table, +create_font_props_row (GtkGrid *table, const char *kind, gint row, DiaFont *font, @@ -284,146 +178,40 @@ create_font_props_row (GtkTable *table, GtkSpinButton **heightsel) { GtkWidget *label; - GtkObject *adj; + GtkAdjustment *adj; label = gtk_label_new (kind); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach_defaults (table, label, 0, 1, row, row+1); - *fontsel = DIAFONTSELECTOR (dia_font_selector_new ()); - dia_font_selector_set_font (DIAFONTSELECTOR (*fontsel), font); - gtk_table_attach_defaults (GTK_TABLE (table), GTK_WIDGET(*fontsel), 1, 2, row, row+1); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_grid_attach (table, label, 0, row, 1, 1); + *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ()); + dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font); + gtk_grid_attach (GTK_GRID (table), GTK_WIDGET(*fontsel), 1, row, 1, 1); adj = gtk_adjustment_new (height, 0.1, 10.0, 0.1, 1.0, 0); - *heightsel = GTK_SPIN_BUTTON (gtk_spin_button_new (GTK_ADJUSTMENT(adj), 1.0, 2)); + *heightsel = GTK_SPIN_BUTTON (gtk_spin_button_new (adj, 1.0, 2)); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (*heightsel), TRUE); - gtk_table_attach_defaults (table, GTK_WIDGET (*heightsel), 2, 3, row, row+1); + gtk_grid_attach (table, GTK_WIDGET (*heightsel), 2, row, 1, 1); } static void -class_create_page(GtkNotebook *notebook, UMLClass *umlclass) +class_create_page(GtkWidget *notebook, UMLClass *umlclass) { - UMLClassDialog *prop_dialog; GtkWidget *page_label; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *hbox2; - GtkWidget *vbox; - GtkWidget *entry; - GtkWidget *scrolledwindow; - GtkWidget *checkbox; - GtkWidget *table; - GtkObject *adj; - - prop_dialog = umlclass->properties_dialog; - + /* Class page: */ page_label = gtk_label_new_with_mnemonic (_("_Class")); - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); + umlclass->properties_dialog->editor = dia_uml_class_editor_new (dia_uml_class_new (umlclass)); - table = gtk_table_new (3, 2, FALSE); - gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); - - label = gtk_label_new(_("Class name:")); - entry = gtk_entry_new(); - prop_dialog->classname = GTK_ENTRY(entry); - gtk_widget_grab_focus(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Stereotype:")); - entry = gtk_entry_new(); - prop_dialog->stereotype = GTK_ENTRY(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Comment:")); - scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 1, 2, 2, 3, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), - GTK_SHADOW_IN); - entry = gtk_text_view_new (); - prop_dialog->comment = GTK_TEXT_VIEW(entry); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); - - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); - - hbox = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Abstract")); - prop_dialog->abstract_class = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Attributes visible")); - prop_dialog->attr_vis = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - checkbox = gtk_check_button_new_with_label(_("Suppress Attributes")); - prop_dialog->attr_supp = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Operations visible")); - prop_dialog->op_vis = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - checkbox = gtk_check_button_new_with_label(_("Suppress operations")); - prop_dialog->op_supp = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(TRUE, 5); - hbox2 = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Wrap Operations")); - prop_dialog->op_wrap = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - adj = gtk_adjustment_new( umlclass->wrap_after_char, 0.0, 200.0, 1.0, 5.0, 0); - prop_dialog->wrap_after_char = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT( adj), 0.1, 0)); - gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( prop_dialog->wrap_after_char), TRUE); - gtk_spin_button_set_snap_to_ticks( GTK_SPIN_BUTTON( prop_dialog->wrap_after_char), TRUE); - prop_dialog->max_length_label = GTK_LABEL( gtk_label_new( _("Wrap after this length: "))); - gtk_box_pack_start (GTK_BOX (hbox2), GTK_WIDGET( prop_dialog->max_length_label), FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox2), GTK_WIDGET( prop_dialog->wrap_after_char), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET( hbox2), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(TRUE, 5); - hbox2 = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Comments visible")); - prop_dialog->comments_vis = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - adj = gtk_adjustment_new( umlclass->comment_line_length, 17.0, 200.0, 1.0, 5.0, 0); - prop_dialog->comment_line_length = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT( adj), 0.1, 0)); - gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( prop_dialog->comment_line_length), TRUE); - gtk_spin_button_set_snap_to_ticks( GTK_SPIN_BUTTON( prop_dialog->comment_line_length), TRUE); - prop_dialog->Comment_length_label = GTK_LABEL( gtk_label_new( _("Wrap comment after this length: "))); - gtk_box_pack_start (GTK_BOX (hbox2), GTK_WIDGET( prop_dialog->Comment_length_label), FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox2), GTK_WIDGET( prop_dialog->comment_line_length), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET( hbox2), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Show documentation tag")); - prop_dialog->comment_tagging = GTK_TOGGLE_BUTTON( checkbox ); - gtk_box_pack_start (GTK_BOX (hbox), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); - - gtk_widget_show_all (vbox); gtk_widget_show (page_label); - gtk_notebook_append_page(notebook, vbox, page_label); - -} + gtk_widget_show (umlclass->properties_dialog->editor); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), umlclass->properties_dialog->editor, page_label); +} static void -style_create_page(GtkNotebook *notebook, UMLClass *umlclass) +style_create_page(GtkWidget *notebook, UMLClass *umlclass) { UMLClassDialog *prop_dialog; GtkWidget *page_label; @@ -434,56 +222,55 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) GtkWidget *fill_color; GtkWidget *line_color; GtkWidget *table; - GtkObject *adj; + GtkAdjustment *adj; prop_dialog = umlclass->properties_dialog; /** Fonts and Colors selection **/ page_label = gtk_label_new_with_mnemonic (_("_Style")); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - table = gtk_table_new (5, 6, TRUE); + table = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); - gtk_table_set_homogeneous (GTK_TABLE (table), FALSE); /* head line */ label = gtk_label_new (_("Kind")); /* L, R, T, B */ - gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); label = gtk_label_new (_("Font")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 1, 0, 1, 1); label = gtk_label_new (_("Size")); - gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 0, 1); + gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1); /* property rows */ - create_font_props_row (GTK_TABLE (table), _("Normal"), 1, + create_font_props_row (GTK_GRID (table), _("Normal"), 1, umlclass->normal_font, umlclass->font_height, &(prop_dialog->normal_font), &(prop_dialog->normal_font_height)); - create_font_props_row (GTK_TABLE (table), _("Polymorphic"), 2, + create_font_props_row (GTK_GRID (table), _("Polymorphic"), 2, umlclass->polymorphic_font, umlclass->polymorphic_font_height, &(prop_dialog->polymorphic_font), &(prop_dialog->polymorphic_font_height)); - create_font_props_row (GTK_TABLE (table), _("Abstract"), 3, + create_font_props_row (GTK_GRID (table), _("Abstract"), 3, umlclass->abstract_font, umlclass->abstract_font_height, &(prop_dialog->abstract_font), &(prop_dialog->abstract_font_height)); - create_font_props_row (GTK_TABLE (table), _("Class Name"), 4, + create_font_props_row (GTK_GRID (table), _("Class Name"), 4, umlclass->classname_font, umlclass->classname_font_height, &(prop_dialog->classname_font), &(prop_dialog->classname_font_height)); - create_font_props_row (GTK_TABLE (table), _("Abstract Class"), 5, + create_font_props_row (GTK_GRID (table), _("Abstract Class"), 5, umlclass->abstract_classname_font, umlclass->abstract_classname_font_height, &(prop_dialog->abstract_classname_font), &(prop_dialog->abstract_classname_font_height)); - create_font_props_row (GTK_TABLE (table), _("Comment"), 6, + create_font_props_row (GTK_GRID (table), _("Comment"), 6, umlclass->comment_font, umlclass->comment_font_height, &(prop_dialog->comment_font), @@ -491,48 +278,65 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) - table = gtk_table_new (2, 4, TRUE); + table = gtk_grid_new (); + gtk_grid_set_row_homogeneous (GTK_GRID (table), TRUE); + gtk_grid_set_column_homogeneous (GTK_GRID (table), TRUE); gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); /* should probably be refactored too. */ label = gtk_label_new(_("Line Width")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 2); - adj = gtk_adjustment_new(umlclass->line_width, 0.0, G_MAXFLOAT, 0.1, 1.0, 0); - line_width = gtk_spin_button_new (GTK_ADJUSTMENT(adj), 1.0, 2); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); + adj = gtk_adjustment_new (umlclass->line_width, 0.0, G_MAXFLOAT, 0.1, 1.0, 0); + line_width = gtk_spin_button_new (adj, 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (line_width), TRUE); prop_dialog->line_width = GTK_SPIN_BUTTON(line_width); - gtk_table_attach (GTK_TABLE (table), line_width, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 3, 2); + gtk_widget_set_hexpand (line_width, TRUE); + gtk_grid_attach (GTK_GRID (table), line_width, 1, 0, 1, 1); label = gtk_label_new(_("Text Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, 0, 0, 2); - text_color = dia_color_selector_new(); - dia_color_selector_set_use_alpha (text_color, TRUE); - dia_color_selector_set_color(text_color, ¨class->text_color); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); + text_color = gtk_color_button_new(); + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (text_color), TRUE); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (text_color), ¨class->text_color); prop_dialog->text_color = (DiaColorSelector *)text_color; - gtk_table_attach (GTK_TABLE (table), text_color, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (text_color, TRUE); + gtk_grid_attach (GTK_GRID (table), text_color, 1, 1, 1, 1); label = gtk_label_new(_("Foreground Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 2); - line_color = dia_color_selector_new(); - dia_color_selector_set_use_alpha (line_color, TRUE); - dia_color_selector_set_color(line_color, ¨class->line_color); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1); + line_color = gtk_color_button_new(); + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (line_color), TRUE); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (line_color), ¨class->line_color); prop_dialog->line_color = (DiaColorSelector *)line_color; - gtk_table_attach (GTK_TABLE (table), line_color, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (line_color, TRUE); + gtk_grid_attach (GTK_GRID (table), line_color, 1, 2, 1, 1); label = gtk_label_new(_("Background Color")); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 2); - fill_color = dia_color_selector_new(); - dia_color_selector_set_color(fill_color, ¨class->fill_color); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_label_set_yalign (GTK_LABEL (label), 0.5); + gtk_widget_set_hexpand (label, TRUE); + gtk_grid_attach (GTK_GRID (table), label, 0, 3, 1, 1); + fill_color = gtk_color_button_new (); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (fill_color), ¨class->fill_color); prop_dialog->fill_color = (DiaColorSelector *)fill_color; - gtk_table_attach (GTK_TABLE (table), fill_color, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 3, 2); + + gtk_widget_set_hexpand (fill_color, TRUE); + gtk_grid_attach (GTK_GRID (table), fill_color, 1, 3, 1, 1); gtk_widget_show_all (vbox); gtk_widget_show (page_label); - gtk_notebook_append_page(notebook, vbox, page_label); + gtk_notebook_append_page(GTK_NOTEBOOK (notebook), vbox, page_label); } @@ -540,25 +344,6 @@ style_create_page(GtkNotebook *notebook, UMLClass *umlclass) ******************** ALL ***************************** ******************************************************/ -static void -switch_page_callback(GtkNotebook *notebook, - GtkNotebookPage *page) -{ - UMLClass *umlclass; - UMLClassDialog *prop_dialog; - - umlclass = (UMLClass *) - g_object_get_data(G_OBJECT(notebook), "user_data"); - - prop_dialog = umlclass->properties_dialog; - - if (prop_dialog != NULL) { - _attributes_get_current_values(prop_dialog); - _operations_get_current_values(prop_dialog); - _templates_get_current_values(prop_dialog); - } -} - static void destroy_properties_dialog (GtkWidget* widget, gpointer user_data) @@ -577,9 +362,6 @@ fill_in_dialog(UMLClass *umlclass) umlclass_sanity_check(umlclass, "Filling in dialog before attrs"); #endif class_fill_in_dialog(umlclass); - _attributes_fill_in_dialog(umlclass); - _operations_fill_in_dialog(umlclass); - _templates_fill_in_dialog(umlclass); } ObjectChange * @@ -589,8 +371,10 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) DiaObject *obj; GList *list; int num_attrib, num_ops; - GList *added, *deleted, *disconnected; - UMLClassState *old_state = NULL; + GList *added = NULL, *deleted = NULL, *disconnected = NULL; + DiaUmlClass *old_state = NULL; + DiaUmlClass *editor_state; + gboolean vis, sup; #ifdef DEBUG umlclass_sanity_check(umlclass, "Apply from dialog start"); @@ -598,18 +382,30 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) prop_dialog = umlclass->properties_dialog; - old_state = umlclass_get_state(umlclass); + old_state = dia_uml_class_new (umlclass); + + editor_state = dia_uml_class_editor_get_class (DIA_UML_CLASS_EDITOR (prop_dialog->editor)); /* Allocate enought connection points for attributes and operations. */ /* (two per op/attr) */ - if ( (prop_dialog->attr_vis->active) && (!prop_dialog->attr_supp->active)) - num_attrib = g_list_length(prop_dialog->attributes_list->children); - else + g_object_get (editor_state, + "attributes-visible", &vis, + "attributes-suppress", &sup, + NULL); + if (vis && !sup) { + num_attrib = g_list_model_get_n_items (dia_uml_class_get_attributes (editor_state)); + } else { num_attrib = 0; - if ( (prop_dialog->op_vis->active) && (!prop_dialog->op_supp->active)) - num_ops = g_list_length(prop_dialog->operations_list->children); - else + } + g_object_get (editor_state, + "operations-visible", &vis, + "operations-suppress", &sup, + NULL); + if (vis && !sup) { + num_ops = g_list_model_get_n_items (dia_uml_class_get_operations (editor_state)); + } else { num_ops = 0; + } obj = ¨class->element.object; #ifdef UML_MAINPOINT obj->num_connections = @@ -621,14 +417,12 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) obj->connections = g_realloc(obj->connections, obj->num_connections*sizeof(ConnectionPoint *)); - + /* Read from dialog and put in object: */ class_read_from_dialog(umlclass, prop_dialog); - _attributes_read_from_dialog(umlclass, prop_dialog, UMLCLASS_CONNECTIONPOINTS); /* ^^^ attribs must be called before ops, to get the right order of the connectionpoints. */ - _operations_read_from_dialog(umlclass, prop_dialog, UMLCLASS_CONNECTIONPOINTS+num_attrib*2); - _templates_read_from_dialog(umlclass, prop_dialog); + dia_uml_class_store (editor_state, umlclass, &added, &deleted, &disconnected); /* Reestablish mainpoint */ #ifdef UML_MAINPOINT @@ -637,25 +431,16 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) #endif /* unconnect from all deleted connectionpoints. */ - list = prop_dialog->deleted_connections; + list = deleted; while (list != NULL) { ConnectionPoint *connection = (ConnectionPoint *) list->data; - _umlclass_store_disconnects(prop_dialog, connection); + _umlclass_store_disconnects (connection, &disconnected); object_remove_connections_to(connection); list = g_list_next(list); } - deleted = prop_dialog->deleted_connections; - prop_dialog->deleted_connections = NULL; - - added = prop_dialog->added_connections; - prop_dialog->added_connections = NULL; - - disconnected = prop_dialog->disconnected_connections; - prop_dialog->disconnected_connections = NULL; - /* Update data: */ umlclass_calculate_data(umlclass); umlclass_update_data(umlclass); @@ -665,24 +450,13 @@ umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget) #ifdef DEBUG umlclass_sanity_check(umlclass, "Apply from dialog end"); #endif - return new_umlclass_change(umlclass, old_state, added, deleted, disconnected); -} - -static void -create_dialog_pages(GtkNotebook *notebook, UMLClass *umlclass) -{ - class_create_page(notebook, umlclass); - _attributes_create_page(notebook, umlclass); - _operations_create_page(notebook, umlclass); - _templates_create_page(notebook, umlclass); - style_create_page(notebook, umlclass); + return new_umlclass_change(umlclass, old_state, added, deleted, disconnected); } GtkWidget * umlclass_get_properties(UMLClass *umlclass, gboolean is_default) { UMLClassDialog *prop_dialog; - GtkWidget *vbox; GtkWidget *notebook; #ifdef DEBUG @@ -691,32 +465,19 @@ umlclass_get_properties(UMLClass *umlclass, gboolean is_default) if (umlclass->properties_dialog == NULL) { prop_dialog = g_new(UMLClassDialog, 1); umlclass->properties_dialog = prop_dialog; - - vbox = gtk_vbox_new(FALSE, 0); - g_object_ref_sink(vbox); - prop_dialog->dialog = vbox; - - prop_dialog->current_attr = NULL; - prop_dialog->current_op = NULL; - prop_dialog->current_param = NULL; - prop_dialog->current_templ = NULL; - prop_dialog->deleted_connections = NULL; - prop_dialog->added_connections = NULL; - prop_dialog->disconnected_connections = NULL; notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (notebook), 10); + gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); + prop_dialog->dialog = notebook; g_object_set_data(G_OBJECT(notebook), "user_data", (gpointer) umlclass); - g_signal_connect (G_OBJECT (notebook), "switch_page", - G_CALLBACK(switch_page_callback), umlclass); g_signal_connect (G_OBJECT (umlclass->properties_dialog->dialog), "destroy", G_CALLBACK(destroy_properties_dialog), umlclass); - create_dialog_pages(GTK_NOTEBOOK( notebook ), umlclass); + class_create_page(notebook, umlclass); + style_create_page(notebook, umlclass); gtk_widget_show (notebook); } @@ -730,131 +491,6 @@ umlclass_get_properties(UMLClass *umlclass, gboolean is_default) /****************** UNDO stuff: ******************/ -static void -umlclass_free_state(UMLClassState *state) -{ - GList *list; - - g_object_unref (state->normal_font); - g_object_unref (state->abstract_font); - g_object_unref (state->polymorphic_font); - g_object_unref (state->classname_font); - g_object_unref (state->abstract_classname_font); - g_object_unref (state->comment_font); - - g_free(state->name); - g_free(state->stereotype); - g_free(state->comment); - - list = state->attributes; - while (list) { - uml_attribute_destroy((UMLAttribute *) list->data); - list = g_list_next(list); - } - g_list_free(state->attributes); - - list = state->operations; - while (list) { - uml_operation_destroy((UMLOperation *) list->data); - list = g_list_next(list); - } - g_list_free(state->operations); - - list = state->formal_params; - while (list) { - uml_formalparameter_destroy((UMLFormalParameter *) list->data); - list = g_list_next(list); - } - g_list_free(state->formal_params); -} - -static UMLClassState * -umlclass_get_state(UMLClass *umlclass) -{ - UMLClassState *state = g_new0(UMLClassState, 1); - GList *list; - - state->font_height = umlclass->font_height; - state->abstract_font_height = umlclass->abstract_font_height; - state->polymorphic_font_height = umlclass->polymorphic_font_height; - state->classname_font_height = umlclass->classname_font_height; - state->abstract_classname_font_height = umlclass->abstract_classname_font_height; - state->comment_font_height = umlclass->comment_font_height; - - state->normal_font = g_object_ref (umlclass->normal_font); - state->abstract_font = g_object_ref (umlclass->abstract_font); - state->polymorphic_font = g_object_ref (umlclass->polymorphic_font); - state->classname_font = g_object_ref (umlclass->classname_font); - state->abstract_classname_font = g_object_ref (umlclass->abstract_classname_font); - state->comment_font = g_object_ref (umlclass->comment_font); - - state->name = g_strdup(umlclass->name); - state->stereotype = g_strdup(umlclass->stereotype); - state->comment = g_strdup(umlclass->comment); - - state->abstract = umlclass->abstract; - state->suppress_attributes = umlclass->suppress_attributes; - state->suppress_operations = umlclass->suppress_operations; - state->visible_attributes = umlclass->visible_attributes; - state->visible_operations = umlclass->visible_operations; - state->visible_comments = umlclass->visible_comments; - - state->wrap_operations = umlclass->wrap_operations; - state->wrap_after_char = umlclass->wrap_after_char; - state->comment_line_length = umlclass->comment_line_length; - state->comment_tagging = umlclass->comment_tagging; - - state->line_color = umlclass->line_color; - state->fill_color = umlclass->fill_color; - state->text_color = umlclass->text_color; - - state->attributes = NULL; - list = umlclass->attributes; - while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *)list->data; - UMLAttribute *attr_copy; - - attr_copy = uml_attribute_copy(attr); - /* Looks wrong, but needed fro proper restore */ - attr_copy->left_connection = attr->left_connection; - attr_copy->right_connection = attr->right_connection; - - state->attributes = g_list_append(state->attributes, attr_copy); - list = g_list_next(list); - } - - - state->operations = NULL; - list = umlclass->operations; - while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; - UMLOperation *op_copy; - - op_copy = uml_operation_copy(op); - op_copy->left_connection = op->left_connection; - op_copy->right_connection = op->right_connection; - state->operations = g_list_append(state->operations, op_copy); - list = g_list_next(list); - } - - - state->template = umlclass->template; - - state->formal_params = NULL; - list = umlclass->formal_params; - while (list != NULL) { - UMLFormalParameter *param = (UMLFormalParameter *)list->data; - UMLFormalParameter *param_copy; - - param_copy = uml_formalparameter_copy(param); - state->formal_params = g_list_append(state->formal_params, param_copy); - - list = g_list_next(list); - } - - return state; -} - static void umlclass_update_connectionpoints(UMLClass *umlclass) { @@ -862,9 +498,6 @@ umlclass_update_connectionpoints(UMLClass *umlclass) DiaObject *obj; GList *list; int connection_index; - UMLClassDialog *prop_dialog; - - prop_dialog = umlclass->properties_dialog; /* Allocate enought connection points for attributes and operations. */ /* (two per op/attr) */ @@ -891,7 +524,7 @@ umlclass_update_connectionpoints(UMLClass *umlclass) list = umlclass->attributes; while (list != NULL) { - UMLAttribute *attr = (UMLAttribute *) list->data; + DiaUmlAttribute *attr = (DiaUmlAttribute *) list->data; if ( (umlclass->visible_attributes) && (!umlclass->suppress_attributes)) { @@ -904,25 +537,20 @@ umlclass_update_connectionpoints(UMLClass *umlclass) list = g_list_next(list); } - if (prop_dialog) - gtk_list_clear_items (GTK_LIST (prop_dialog->attributes_list), 0, -1); - list = umlclass->operations; while (list != NULL) { - UMLOperation *op = (UMLOperation *) list->data; + DiaUmlOperation *op = (DiaUmlOperation *) list->data; if ( (umlclass->visible_operations) && (!umlclass->suppress_operations)) { - obj->connections[connection_index] = op->left_connection; + obj->connections[connection_index] = op->l_connection; connection_index++; - obj->connections[connection_index] = op->right_connection; + obj->connections[connection_index] = op->r_connection; connection_index++; } list = g_list_next(list); } - if (prop_dialog) - gtk_list_clear_items (GTK_LIST (prop_dialog->operations_list), 0, -1); #ifdef UML_MAINPOINT obj->connections[connection_index++] = ¨class->connections[UMLCLASS_CONNECTIONPOINTS]; @@ -931,69 +559,25 @@ umlclass_update_connectionpoints(UMLClass *umlclass) } static void -umlclass_set_state(UMLClass *umlclass, UMLClassState *state) +umlclass_set_state(UMLClass *umlclass, DiaUmlClass *state) { - umlclass->font_height = state->font_height; - umlclass->abstract_font_height = state->abstract_font_height; - umlclass->polymorphic_font_height = state->polymorphic_font_height; - umlclass->classname_font_height = state->classname_font_height; - umlclass->abstract_classname_font_height = state->abstract_classname_font_height; - umlclass->comment_font_height = state->comment_font_height; - - /* transfer ownership, but don't leak the previous font */ - g_object_unref (umlclass->normal_font); - umlclass->normal_font = state->normal_font; - g_object_unref (umlclass->abstract_font); - umlclass->abstract_font = state->abstract_font; - g_object_unref (umlclass->polymorphic_font); - umlclass->polymorphic_font = state->polymorphic_font; - g_object_unref (umlclass->classname_font); - umlclass->classname_font = state->classname_font; - g_object_unref (umlclass->abstract_classname_font); - umlclass->abstract_classname_font = state->abstract_classname_font; - g_object_unref (umlclass->comment_font); - umlclass->comment_font = state->comment_font; - - umlclass->name = state->name; - umlclass->stereotype = state->stereotype; - umlclass->comment = state->comment; - - umlclass->abstract = state->abstract; - umlclass->suppress_attributes = state->suppress_attributes; - umlclass->suppress_operations = state->suppress_operations; - umlclass->visible_attributes = state->visible_attributes; - umlclass->visible_operations = state->visible_operations; - umlclass->visible_comments = state->visible_comments; - - umlclass->wrap_operations = state->wrap_operations; - umlclass->wrap_after_char = state->wrap_after_char; - umlclass->comment_line_length = state->comment_line_length; - umlclass->comment_tagging = state->comment_tagging; - - umlclass->line_color = state->line_color; - umlclass->fill_color = state->fill_color; - umlclass->text_color = state->text_color; - - umlclass->attributes = state->attributes; - umlclass->operations = state->operations; - umlclass->template = state->template; - umlclass->formal_params = state->formal_params; - - g_free(state); + g_object_unref (state); umlclass_update_connectionpoints(umlclass); umlclass_calculate_data(umlclass); umlclass_update_data(umlclass); + /* TODO: Fix undo + dia_uml_class_store (state, umlclass); */ } static void umlclass_change_apply(UMLClassChange *change, DiaObject *obj) { - UMLClassState *old_state; + DiaUmlClass *old_state; GList *list; - old_state = umlclass_get_state(change->obj); + old_state = dia_uml_class_new (change->obj); umlclass_set_state(change->obj, change->saved_state); @@ -1013,10 +597,10 @@ umlclass_change_apply(UMLClassChange *change, DiaObject *obj) static void umlclass_change_revert(UMLClassChange *change, DiaObject *obj) { - UMLClassState *old_state; + DiaUmlClass *old_state; GList *list; - old_state = umlclass_get_state(change->obj); + old_state = dia_uml_class_new(change->obj); umlclass_set_state(change->obj, change->saved_state); @@ -1038,8 +622,7 @@ umlclass_change_free(UMLClassChange *change) { GList *list, *free_list; - umlclass_free_state(change->saved_state); - g_free(change->saved_state); + g_object_unref (change->saved_state); /* Doesn't this mean only one of add, delete can be done in each apply? */ if (change->applied) @@ -1063,19 +646,19 @@ umlclass_change_free(UMLClassChange *change) } static ObjectChange * -new_umlclass_change(UMLClass *obj, UMLClassState *saved_state, - GList *added, GList *deleted, GList *disconnected) +new_umlclass_change (UMLClass *obj, + DiaUmlClass *saved_state, + GList *added, + GList *deleted, + GList *disconnected) { UMLClassChange *change; change = g_new0(UMLClassChange, 1); - change->obj_change.apply = - (ObjectChangeApplyFunc) umlclass_change_apply; - change->obj_change.revert = - (ObjectChangeRevertFunc) umlclass_change_revert; - change->obj_change.free = - (ObjectChangeFreeFunc) umlclass_change_free; + change->obj_change.apply = (ObjectChangeApplyFunc) umlclass_change_apply; + change->obj_change.revert = (ObjectChangeRevertFunc) umlclass_change_revert; + change->obj_change.free = (ObjectChangeFreeFunc) umlclass_change_free; change->obj = obj; change->saved_state = saved_state; @@ -1087,32 +670,3 @@ new_umlclass_change(UMLClass *obj, UMLClassState *saved_state, return (ObjectChange *)change; } -/* - get the contents of a comment text view. -*/ -const gchar * -_class_get_comment(GtkTextView *view) -{ - GtkTextBuffer * buffer = gtk_text_view_get_buffer(view); - GtkTextIter start; - GtkTextIter end; - - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - - return gtk_text_buffer_get_text(buffer, &start, &end, FALSE); -} - -void -_class_set_comment(GtkTextView *view, gchar *text) -{ - GtkTextBuffer * buffer = gtk_text_view_get_buffer(view); - GtkTextIter start; - GtkTextIter end; - - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - gtk_text_buffer_delete(buffer,&start,&end); - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_insert( buffer, &start, text, strlen(text)); -} diff --git a/objects/UML/class_dialog.h b/objects/UML/class_dialog.h index 919d0b52542d7d8148f63ac8eeadb84b64f061b6..cac814affb8603477110a25177b1f4225eafc0de 100644 --- a/objects/UML/class_dialog.h +++ b/objects/UML/class_dialog.h @@ -1,4 +1,8 @@ #include "widgets.h" +#include "widgets/dialist.h" +#include "diafontselector.h" +#include "editor/dia-uml-class-editor.h" + /** * \brief Very special user interface for UMLClass parametrization * @@ -8,17 +12,6 @@ struct _UMLClassDialog { GtkWidget *dialog; - GtkEntry *classname; - GtkEntry *stereotype; - GtkTextView *comment; - - GtkToggleButton *abstract_class; - GtkToggleButton *attr_vis; - GtkToggleButton *attr_supp; - GtkToggleButton *op_vis; - GtkToggleButton *op_supp; - GtkToggleButton *comments_vis; - GtkToggleButton *op_wrap; DiaFontSelector *normal_font; DiaFontSelector *abstract_font; DiaFontSelector *polymorphic_font; @@ -31,77 +24,13 @@ struct _UMLClassDialog { GtkSpinButton *classname_font_height; GtkSpinButton *abstract_classname_font_height; GtkSpinButton *comment_font_height; - GtkSpinButton *wrap_after_char; - GtkSpinButton *comment_line_length; - GtkToggleButton *comment_tagging; GtkSpinButton *line_width; DiaColorSelector *text_color; DiaColorSelector *line_color; DiaColorSelector *fill_color; - GtkLabel *max_length_label; - GtkLabel *Comment_length_label; - - GList *disconnected_connections; - GList *added_connections; - GList *deleted_connections; - GtkList *attributes_list; - GtkListItem *current_attr; - GtkEntry *attr_name; - GtkEntry *attr_type; - GtkEntry *attr_value; - GtkTextView *attr_comment; - GtkWidget *attr_visible; - GtkToggleButton *attr_class_scope; - - GtkList *operations_list; - GtkListItem *current_op; - GtkEntry *op_name; - GtkEntry *op_type; - GtkEntry *op_stereotype; - GtkTextView *op_comment; - - GtkWidget *op_visible; - GtkToggleButton *op_class_scope; - GtkWidget *op_inheritance_type; - GtkToggleButton *op_query; - - GtkList *parameters_list; - GtkListItem *current_param; - GtkEntry *param_name; - GtkEntry *param_type; - GtkEntry *param_value; - GtkTextView *param_comment; - GtkWidget *param_kind; - GtkWidget *param_new_button; - GtkWidget *param_delete_button; - GtkWidget *param_up_button; - GtkWidget *param_down_button; - - GtkList *templates_list; - GtkListItem *current_templ; - GtkToggleButton *templ_template; - GtkEntry *templ_name; - GtkEntry *templ_type; + GtkWidget *editor; }; -void _umlclass_store_disconnects(UMLClassDialog *prop_dialog, ConnectionPoint *cp); - -const gchar *_class_get_comment(GtkTextView *); -void _class_set_comment(GtkTextView *, gchar *); - -void _attributes_get_current_values(UMLClassDialog *prop_dialog); -void _operations_get_current_values(UMLClassDialog *prop_dialog); -void _templates_get_current_values(UMLClassDialog *prop_dialog); - -void _attributes_fill_in_dialog(UMLClass *umlclass); -void _operations_fill_in_dialog(UMLClass *umlclass); -void _templates_fill_in_dialog(UMLClass *umlclass); - -void _attributes_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog, int connection_index); -void _operations_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog, int connection_index); -void _templates_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog); - -void _attributes_create_page(GtkNotebook *notebook, UMLClass *umlclass); -void _operations_create_page(GtkNotebook *notebook, UMLClass *umlclass); -void _templates_create_page(GtkNotebook *notebook, UMLClass *umlclass); +void _umlclass_store_disconnects (ConnectionPoint *cp, + GList **disconnected); diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c index 607ba22f7493e79d92ef5c0f02aba845bb20c8d4..3d12b15e44dc122b19597546d45160e8fb94dfd4 100644 --- a/objects/UML/class_operations_dialog.c +++ b/objects/UML/class_operations_dialog.c @@ -18,1128 +18,26 @@ */ #include -#include -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ #include -#include "class.h" -#include "diaoptionmenu.h" - -#include "class_dialog.h" - -/************************************************************* - ******************** OPERATIONS ***************************** - *************************************************************/ - -static void -parameters_set_sensitive(UMLClassDialog *prop_dialog, gint val) -{ - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->param_name), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->param_type), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->param_value), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->param_comment), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->param_kind), val); -} - -static void -parameters_set_values(UMLClassDialog *prop_dialog, UMLParameter *param) -{ - gtk_entry_set_text(prop_dialog->param_name, param->name); - gtk_entry_set_text(prop_dialog->param_type, param->type); - if (param->value != NULL) - gtk_entry_set_text(prop_dialog->param_value, param->value); - else - gtk_entry_set_text(prop_dialog->param_value, ""); - if (param->comment != NULL) - _class_set_comment(prop_dialog->param_comment, param->comment); - else - _class_set_comment(prop_dialog->param_comment, ""); - - dia_option_menu_set_active(prop_dialog->param_kind, param->kind); -} - -static void -parameters_clear_values(UMLClassDialog *prop_dialog) -{ - gtk_entry_set_text(prop_dialog->param_name, ""); - gtk_entry_set_text(prop_dialog->param_type, ""); - gtk_entry_set_text(prop_dialog->param_value, ""); - _class_set_comment(prop_dialog->param_comment, ""); - dia_option_menu_set_active(prop_dialog->param_kind, UML_UNDEF_KIND); - -} - -static void -parameters_get_values (UMLClassDialog *prop_dialog, UMLParameter *param) -{ - g_free(param->name); - g_free(param->type); - g_free(param->comment); - if (param->value != NULL) - g_free(param->value); - - param->name = g_strdup (gtk_entry_get_text (prop_dialog->param_name)); - param->type = g_strdup (gtk_entry_get_text (prop_dialog->param_type)); - - param->value = g_strdup (gtk_entry_get_text(prop_dialog->param_value)); - param->comment = g_strdup (_class_get_comment(prop_dialog->param_comment)); - - param->kind = (UMLParameterKind) dia_option_menu_get_active(prop_dialog->param_kind); -} - -static void -parameters_get_current_values(UMLClassDialog *prop_dialog) -{ - UMLParameter *current_param; - GtkLabel *label; - char *new_str; - - if (prop_dialog->current_param != NULL) { - current_param = (UMLParameter *) - g_object_get_data(G_OBJECT(prop_dialog->current_param), "user_data"); - if (current_param != NULL) { - parameters_get_values(prop_dialog, current_param); - label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(prop_dialog->current_param))); - new_str = uml_get_parameter_string(current_param); - gtk_label_set_text(label, new_str); - g_free(new_str); - } - } -} - - -static void -parameters_list_selection_changed_callback(GtkWidget *gtklist, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkObject *list_item; - UMLParameter *param; - - prop_dialog = umlclass->properties_dialog; - - if (!prop_dialog) - return; /* maybe hiding a bug elsewhere */ - - parameters_get_current_values(prop_dialog); - - list = GTK_LIST(gtklist)->selection; - if (!list) { /* No selected */ - parameters_set_sensitive(prop_dialog, FALSE); - parameters_clear_values(prop_dialog); - prop_dialog->current_param = NULL; - return; - } - - list_item = GTK_OBJECT(list->data); - param = (UMLParameter *)g_object_get_data(G_OBJECT(list_item), "user_data"); - parameters_set_values(prop_dialog, param); - parameters_set_sensitive(prop_dialog, TRUE); - - prop_dialog->current_param = GTK_LIST_ITEM(list_item); - gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->param_name)); -} - -static void -parameters_list_new_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkWidget *list_item; - UMLOperation *current_op; - UMLParameter *param; - char *utf; - - prop_dialog = umlclass->properties_dialog; - - parameters_get_current_values(prop_dialog); - - current_op = (UMLOperation *) - g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); - - param = uml_parameter_new(); - - utf = uml_get_parameter_string (param); - list_item = gtk_list_item_new_with_label (utf); - gtk_widget_show (list_item); - g_free (utf); - - g_object_set_data(G_OBJECT(list_item), "user_data", param); - - current_op->parameters = g_list_append(current_op->parameters, - (gpointer) param); - - list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->parameters_list, list); - - if (prop_dialog->parameters_list->children != NULL) - gtk_list_unselect_child(prop_dialog->parameters_list, - GTK_WIDGET(prop_dialog->parameters_list->children->data)); - gtk_list_select_child(prop_dialog->parameters_list, list_item); - - prop_dialog->current_param = GTK_LIST_ITEM(list_item); -} - -static void -parameters_list_delete_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - UMLOperation *current_op; - UMLParameter *param; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); - - - if (gtklist->selection != NULL) { - /* Remove from current operations parameter list: */ - current_op = (UMLOperation *) - g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); - param = (UMLParameter *) - g_object_get_data(G_OBJECT(prop_dialog->current_param), "user_data"); - - current_op->parameters = g_list_remove(current_op->parameters, - (gpointer) param); - uml_parameter_destroy(param); - - /* Remove from gtk list: */ - list = g_list_prepend(NULL, prop_dialog->current_param); - - prop_dialog->current_param = NULL; - - gtk_list_remove_items(gtklist, list); - g_list_free(list); - } -} - -static void -parameters_list_move_up_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - UMLOperation *current_op; - UMLParameter *param; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i>0) - i--; - - param = (UMLParameter *) g_object_get_data(G_OBJECT(list_item), "user_data"); - - /* Move parameter in current operations list: */ - current_op = (UMLOperation *) - g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); - - current_op->parameters = g_list_remove(current_op->parameters, - (gpointer) param); - current_op->parameters = g_list_insert(current_op->parameters, - (gpointer) param, - i); - - /* Move parameter in gtk list: */ - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - - _operations_get_current_values(prop_dialog); - } -} - -static void -parameters_list_move_down_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - UMLOperation *current_op; - UMLParameter *param; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->parameters_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) - i++; - - param = (UMLParameter *) g_object_get_data(G_OBJECT(list_item), "user_data"); - - /* Move parameter in current operations list: */ - current_op = (UMLOperation *) - g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); - - current_op->parameters = g_list_remove(current_op->parameters, - (gpointer) param); - current_op->parameters = g_list_insert(current_op->parameters, - (gpointer) param, - i); - - /* Move parameter in gtk list: */ - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - - _operations_get_current_values(prop_dialog); - } -} - -static void -operations_set_sensitive(UMLClassDialog *prop_dialog, gint val) -{ - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_name), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_type), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_stereotype), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_comment), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_visible), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_class_scope), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_inheritance_type), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_query), val); - - gtk_widget_set_sensitive(prop_dialog->param_new_button, val); - gtk_widget_set_sensitive(prop_dialog->param_delete_button, val); - gtk_widget_set_sensitive(prop_dialog->param_down_button, val); - gtk_widget_set_sensitive(prop_dialog->param_up_button, val); -} - -static void -operations_set_values(UMLClassDialog *prop_dialog, UMLOperation *op) -{ - GList *list; - UMLParameter *param; - GtkWidget *list_item; - gchar *str; - - gtk_entry_set_text(prop_dialog->op_name, op->name); - if (op->type != NULL) - gtk_entry_set_text(prop_dialog->op_type, op->type); - else - gtk_entry_set_text(prop_dialog->op_type, ""); - - if (op->stereotype != NULL) - gtk_entry_set_text(prop_dialog->op_stereotype, op->stereotype); - else - gtk_entry_set_text(prop_dialog->op_stereotype, ""); - - if (op->comment != NULL) - _class_set_comment(prop_dialog->op_comment, op->comment); - else - _class_set_comment(prop_dialog->op_comment, ""); - - dia_option_menu_set_active(prop_dialog->op_visible, op->visibility); - gtk_toggle_button_set_active(prop_dialog->op_class_scope, op->class_scope); - gtk_toggle_button_set_active(prop_dialog->op_query, op->query); - dia_option_menu_set_active(prop_dialog->op_inheritance_type, op->inheritance_type); - - gtk_list_clear_items(prop_dialog->parameters_list, 0, -1); - prop_dialog->current_param = NULL; - parameters_set_sensitive(prop_dialog, FALSE); - - list = op->parameters; - while (list != NULL) { - param = (UMLParameter *)list->data; - - str = uml_get_parameter_string (param); - list_item = gtk_list_item_new_with_label (str); - g_free (str); - - g_object_set_data(G_OBJECT(list_item), "user_data", (gpointer) param); - gtk_container_add (GTK_CONTAINER (prop_dialog->parameters_list), list_item); - gtk_widget_show (list_item); - - list = g_list_next(list); - } -} - -static void -operations_clear_values(UMLClassDialog *prop_dialog) -{ - gtk_entry_set_text(prop_dialog->op_name, ""); - gtk_entry_set_text(prop_dialog->op_type, ""); - gtk_entry_set_text(prop_dialog->op_stereotype, ""); - _class_set_comment(prop_dialog->op_comment, ""); - gtk_toggle_button_set_active(prop_dialog->op_class_scope, FALSE); - gtk_toggle_button_set_active(prop_dialog->op_query, FALSE); - - gtk_list_clear_items(prop_dialog->parameters_list, 0, -1); - prop_dialog->current_param = NULL; - parameters_set_sensitive(prop_dialog, FALSE); -} - - -static void -operations_get_values(UMLClassDialog *prop_dialog, UMLOperation *op) -{ - const gchar *s; - - g_free(op->name); - if (op->type != NULL) - g_free(op->type); - - op->name = g_strdup(gtk_entry_get_text(prop_dialog->op_name)); - op->type = g_strdup (gtk_entry_get_text(prop_dialog->op_type)); - op->comment = g_strdup(_class_get_comment(prop_dialog->op_comment)); - - s = gtk_entry_get_text(prop_dialog->op_stereotype); - if (s && s[0]) - op->stereotype = g_strdup (s); - else - op->stereotype = NULL; - - op->visibility = (UMLVisibility)dia_option_menu_get_active(prop_dialog->op_visible); - - op->class_scope = prop_dialog->op_class_scope->active; - op->inheritance_type = (UMLInheritanceType)dia_option_menu_get_active(prop_dialog->op_inheritance_type); - - op->query = prop_dialog->op_query->active; - -} +#include "uml.h" void -_operations_get_current_values(UMLClassDialog *prop_dialog) -{ - UMLOperation *current_op; - GtkLabel *label; - char *new_str; - - parameters_get_current_values(prop_dialog); - - if (prop_dialog->current_op != NULL) { - current_op = (UMLOperation *) - g_object_get_data(G_OBJECT(prop_dialog->current_op), "user_data"); - if (current_op != NULL) { - operations_get_values(prop_dialog, current_op); - label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(prop_dialog->current_op))); - new_str = uml_get_operation_string(current_op); - gtk_label_set_text (label, new_str); - g_free (new_str); - } - } -} - -static void -operations_list_item_destroy_callback(GtkWidget *list_item, - gpointer data) -{ - UMLOperation *op; - - op = (UMLOperation *) g_object_get_data(G_OBJECT(list_item), "user_data"); - - if (op != NULL) { - uml_operation_destroy(op); - /*printf("Destroying operation list_item's user_data!\n");*/ - } -} - -static void -operations_list_selection_changed_callback(GtkWidget *gtklist, - UMLClass *umlclass) +list_box_separators (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data) { - GList *list; - UMLClassDialog *prop_dialog; - GtkObject *list_item; - UMLOperation *op; + GtkWidget *current; - prop_dialog = umlclass->properties_dialog; - - if (!prop_dialog) - return; /* maybe hiding a bug elsewhere */ - - _operations_get_current_values(prop_dialog); - - list = GTK_LIST(gtklist)->selection; - if (!list) { /* No selected */ - operations_set_sensitive(prop_dialog, FALSE); - operations_clear_values(prop_dialog); - prop_dialog->current_op = NULL; + if (before == NULL) { + gtk_list_box_row_set_header (row, NULL); return; } - - list_item = GTK_OBJECT(list->data); - op = (UMLOperation *)g_object_get_data(G_OBJECT(list_item), "user_data"); - operations_set_values(prop_dialog, op); - operations_set_sensitive(prop_dialog, TRUE); - - prop_dialog->current_op = GTK_LIST_ITEM(list_item); - gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->op_name)); -} - -static void -operations_list_new_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkWidget *list_item; - UMLOperation *op; - char *utfstr; - - prop_dialog = umlclass->properties_dialog; - - _operations_get_current_values(prop_dialog); - - op = uml_operation_new(); - /* need to make new ConnectionPoints valid and remember them */ - uml_operation_ensure_connection_points (op, ¨class->element.object); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, op->left_connection); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, op->right_connection); - - - utfstr = uml_get_operation_string (op); - list_item = gtk_list_item_new_with_label (utfstr); - gtk_widget_show (list_item); - g_free (utfstr); - - g_object_set_data(G_OBJECT(list_item), "user_data", op); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (operations_list_item_destroy_callback), NULL); - - list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->operations_list, list); - - if (prop_dialog->operations_list->children != NULL) - gtk_list_unselect_child(prop_dialog->operations_list, - GTK_WIDGET(prop_dialog->operations_list->children->data)); - gtk_list_select_child(prop_dialog->operations_list, list_item); -} - -static void -operations_list_delete_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - UMLOperation *op; - - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); - - if (gtklist->selection != NULL) { - op = (UMLOperation *) - g_object_get_data(G_OBJECT(gtklist->selection->data), "user_data"); - - if (op->left_connection != NULL) { - prop_dialog->deleted_connections = - g_list_prepend(prop_dialog->deleted_connections, - op->left_connection); - prop_dialog->deleted_connections = - g_list_prepend(prop_dialog->deleted_connections, - op->right_connection); - } - - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); - g_list_free(list); - operations_clear_values(prop_dialog); - operations_set_sensitive(prop_dialog, FALSE); - } -} - -static void -operations_list_move_up_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i>0) - i--; - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } - -} - -static void -operations_list_move_down_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->operations_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) - i++; - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } -} - -void -_operations_read_from_dialog(UMLClass *umlclass, - UMLClassDialog *prop_dialog, - int connection_index) -{ - GList *list; - UMLOperation *op; - GtkWidget *list_item; - GList *clear_list; - DiaObject *obj; - - obj = ¨class->element.object; - - /* if currently select op is changed in the entries, update from widgets */ - _operations_get_current_values(prop_dialog); - - /* Free current operations: */ - list = umlclass->operations; - while (list != NULL) { - op = (UMLOperation *)list->data; - uml_operation_destroy(op); - list = g_list_next(list); - } - g_list_free (umlclass->operations); - umlclass->operations = NULL; - - /* Insert new operations and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->operations_list)->children; - clear_list = NULL; - while (list != NULL) { - list_item = GTK_WIDGET(list->data); - - clear_list = g_list_prepend (clear_list, list_item); - op = (UMLOperation *) - g_object_get_data(G_OBJECT(list_item), "user_data"); - g_object_set_data(G_OBJECT(list_item), "user_data", NULL); - umlclass->operations = g_list_append(umlclass->operations, op); - - if (op->left_connection == NULL) { - uml_operation_ensure_connection_points (op, obj); - - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, - op->left_connection); - prop_dialog->added_connections = - g_list_prepend(prop_dialog->added_connections, - op->right_connection); - } - - if ( (prop_dialog->op_vis->active) && - (!prop_dialog->op_supp->active) ) { - obj->connections[connection_index] = op->left_connection; - connection_index++; - obj->connections[connection_index] = op->right_connection; - connection_index++; - } else { - _umlclass_store_disconnects(prop_dialog, op->left_connection); - object_remove_connections_to(op->left_connection); - _umlclass_store_disconnects(prop_dialog, op->right_connection); - object_remove_connections_to(op->right_connection); - } - - list = g_list_next(list); - } - clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->operations_list), clear_list); - g_list_free (clear_list); -} - -void -_operations_fill_in_dialog(UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - UMLOperation *op_copy; - GtkWidget *list_item; - GList *list; - int i; - - prop_dialog = umlclass->properties_dialog; - - if (prop_dialog->operations_list->children == NULL) { - i = 0; - list = umlclass->operations; - while (list != NULL) { - UMLOperation *op = (UMLOperation *)list->data; - gchar *opstr = uml_get_operation_string (op); - - list_item = gtk_list_item_new_with_label (opstr); - op_copy = uml_operation_copy (op); - /* Looks wrong but is required for the complicate connections memory management */ - op_copy->left_connection = op->left_connection; - op_copy->right_connection = op->right_connection; - g_object_set_data(G_OBJECT(list_item), "user_data", (gpointer) op_copy); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (operations_list_item_destroy_callback), NULL); - gtk_container_add (GTK_CONTAINER (prop_dialog->operations_list), list_item); - gtk_widget_show (list_item); - - list = g_list_next(list); i++; - g_free (opstr); - } - - /* set operations non-sensitive */ - prop_dialog->current_op = NULL; - operations_set_sensitive(prop_dialog, FALSE); - operations_clear_values(prop_dialog); - } -} - -static void -operations_update(GtkWidget *widget, UMLClass *umlclass) -{ - _operations_get_current_values(umlclass->properties_dialog); -} - -static int -operations_update_event(GtkWidget *widget, GdkEventFocus *ev, UMLClass *umlclass) -{ - _operations_get_current_values(umlclass->properties_dialog); - return 0; -} - -static GtkWidget* -operations_data_create_hbox (UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *hbox; - GtkWidget *vbox2; - GtkWidget *table; - GtkWidget *label; - GtkWidget *entry; - GtkWidget *omenu; - GtkWidget *scrolledwindow; - GtkWidget *checkbox; - - prop_dialog = umlclass->properties_dialog; - - hbox = gtk_hbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); - - vbox2 = gtk_vbox_new(FALSE, 0); - /* table containing operation 'name' up to 'query' and also the comment */ - table = gtk_table_new (5, 3, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); - gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); - - label = gtk_label_new(_("Name:")); - entry = gtk_entry_new(); - prop_dialog->op_name = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Type:")); - entry = gtk_entry_new(); - prop_dialog->op_type = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Stereotype:")); - entry = gtk_entry_new(); - prop_dialog->op_stereotype = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); - - - label = gtk_label_new(_("Visibility:")); - - prop_dialog->op_visible = omenu = dia_option_menu_new (); - g_signal_connect (G_OBJECT (omenu), "changed", - G_CALLBACK (operations_update), umlclass); - dia_option_menu_add_item(omenu, _("Public"), UML_PUBLIC); - dia_option_menu_add_item(omenu, _("Private"), UML_PRIVATE); - dia_option_menu_add_item(omenu, _("Protected"), UML_PROTECTED); - dia_option_menu_add_item(omenu, _("Implementation"), UML_IMPLEMENTATION); - - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - /* left, right, top, bottom */ - gtk_table_attach (GTK_TABLE (table), label, 2,3,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), omenu, 3,4,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - /* end: Visibility */ - - label = gtk_label_new(_("Inheritance type:")); - - prop_dialog->op_inheritance_type = omenu = dia_option_menu_new (); - g_signal_connect (G_OBJECT (omenu), "changed", - G_CALLBACK (operations_update), umlclass); - dia_option_menu_add_item(omenu, _("Abstract"), UML_ABSTRACT); - dia_option_menu_add_item(omenu, _("Polymorphic (virtual)"), UML_POLYMORPHIC); - dia_option_menu_add_item(omenu, _("Leaf (final)"), UML_LEAF); - - gtk_table_attach (GTK_TABLE (table), label, 2,3,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), omenu, 3,4,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - /* end: Inheritance type */ - - checkbox = gtk_check_button_new_with_label(_("Class scope")); - prop_dialog->op_class_scope = GTK_TOGGLE_BUTTON(checkbox); - gtk_table_attach (GTK_TABLE (table), checkbox, 2,3,2,3, GTK_FILL,0, 0,2); - - checkbox = gtk_check_button_new_with_label(_("Query")); - prop_dialog->op_query = GTK_TOGGLE_BUTTON(checkbox); - gtk_table_attach (GTK_TABLE (table), checkbox, 3,4,2,3, GTK_FILL,0, 2,0); - - label = gtk_label_new(_("Comment:")); - scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN); - /* with GTK_POLICY_NEVER the comment filed gets smaller unti l text is entered; than it would resize the dialog! */ - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - entry = gtk_text_view_new (); - prop_dialog->op_comment = GTK_TEXT_VIEW(entry); - gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (entry),TRUE); - - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - - gtk_table_attach (GTK_TABLE (table), label, 4,5,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 4,5,1,3, GTK_FILL | GTK_EXPAND,0, 0,0); - gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0); - - return hbox; -} - -static GtkWidget* -operations_parameters_editor_create_vbox (UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *vbox2; - GtkWidget *hbox2; - GtkWidget *vbox3; - GtkWidget *label; - GtkWidget *scrolled_win; - GtkWidget *list; - GtkWidget *button; - - prop_dialog = umlclass->properties_dialog; - - vbox2 = gtk_vbox_new(FALSE, 5); - /* Parameters list label */ - hbox2 = gtk_hbox_new(FALSE, 5); - - label = gtk_label_new(_("Parameters:")); - gtk_box_pack_start( GTK_BOX(hbox2), label, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0); - - /* Parameters list editor - with of list at least width of buttons*/ - hbox2 = gtk_hbox_new(TRUE, 5); - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (hbox2), scrolled_win, TRUE, TRUE, 0); - gtk_widget_show (scrolled_win); - - list = gtk_list_new (); - prop_dialog->parameters_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); - gtk_widget_show (list); - - g_signal_connect (G_OBJECT (list), "selection_changed", - G_CALLBACK(parameters_list_selection_changed_callback), - umlclass); - - vbox3 = gtk_vbox_new(FALSE, 5); - - button = gtk_button_new_from_stock (GTK_STOCK_NEW); - prop_dialog->param_new_button = button; - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(parameters_list_new_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); - prop_dialog->param_delete_button = button; - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(parameters_list_delete_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); - prop_dialog->param_up_button = button; - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(parameters_list_move_up_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); - prop_dialog->param_down_button = button; - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(parameters_list_move_down_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox3), button, FALSE, TRUE, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (hbox2), vbox3, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0); - /* end: Parameter list editor */ - - return vbox2; -} - -static GtkWidget* -operations_parameters_data_create_vbox (UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *vbox2; - GtkWidget *frame; - GtkWidget *vbox3; - GtkWidget *table; - GtkWidget *label; - GtkWidget *entry; - GtkWidget *scrolledwindow; - GtkWidget *omenu; - - prop_dialog = umlclass->properties_dialog; - - vbox2 = gtk_vbox_new(FALSE, 5); - frame = gtk_frame_new(_("Parameter data")); - vbox3 = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox3), 5); - gtk_container_add (GTK_CONTAINER (frame), vbox3); - gtk_widget_show(frame); - gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, TRUE, 0); - - table = gtk_table_new (3, 4, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); - gtk_box_pack_start (GTK_BOX (vbox3), table, FALSE, FALSE, 0); - - label = gtk_label_new(_("Name:")); - entry = gtk_entry_new(); - prop_dialog->param_name = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Type:")); - entry = gtk_entry_new(); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - prop_dialog->param_type = GTK_ENTRY(entry); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Def. value:")); - entry = gtk_entry_new(); - prop_dialog->param_value = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (operations_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,2,3, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,2,3, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Comment:")); - scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - entry = gtk_text_view_new (); - prop_dialog->param_comment = GTK_TEXT_VIEW(entry); - gtk_container_add (GTK_CONTAINER (scrolledwindow), entry); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (entry),TRUE); - - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (operations_update_event), umlclass); - - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 2,3,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), scrolledwindow, 3,4,1,3, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Direction:")); - - prop_dialog->param_kind = omenu = dia_option_menu_new (); - g_signal_connect (G_OBJECT (omenu), "changed", - G_CALLBACK (operations_update), umlclass); - dia_option_menu_add_item(omenu, _("Undefined"), UML_UNDEF_KIND); - dia_option_menu_add_item(omenu, _("In"), UML_IN); - dia_option_menu_add_item(omenu, _("Out"), UML_OUT); - dia_option_menu_add_item(omenu, _("In & Out"), UML_INOUT); - - { - GtkWidget * align; - align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); - gtk_container_add(GTK_CONTAINER(align), omenu); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 2,3,0,1, GTK_FILL,0, 0,3); - gtk_table_attach (GTK_TABLE (table), align, 3,4,0,1, GTK_FILL,0, 0,3); + current = gtk_list_box_row_get_header (row); + if (current == NULL) { + current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show (current); + gtk_list_box_row_set_header (row, current); } - - return vbox2; -} - -void -_operations_create_page(GtkNotebook *notebook, UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *page_label; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *vbox3; - GtkWidget *scrolled_win; - GtkWidget *button; - GtkWidget *list; - GtkWidget *frame; - - prop_dialog = umlclass->properties_dialog; - - /* Operations page: */ - page_label = gtk_label_new_with_mnemonic (_("_Operations")); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - - hbox = gtk_hbox_new(FALSE, 5); - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); - gtk_widget_show (scrolled_win); - - list = gtk_list_new (); - prop_dialog->operations_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); - gtk_widget_show (list); - - g_signal_connect (G_OBJECT (list), "selection_changed", - G_CALLBACK(operations_list_selection_changed_callback), - umlclass); - - vbox2 = gtk_vbox_new(FALSE, 5); - - button = gtk_button_new_from_stock (GTK_STOCK_NEW); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(operations_list_new_callback), - umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(operations_list_delete_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(operations_list_move_up_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(operations_list_move_down_callback), umlclass); - - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); - - frame = gtk_frame_new(_("Operation data")); - vbox2 = gtk_vbox_new(FALSE, 0); - hbox = operations_data_create_hbox (umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER (frame), vbox2); - gtk_widget_show(frame); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); - - /* parameter stuff below operation stuff */ - hbox = gtk_hbox_new (FALSE, 5); - vbox3 = operations_parameters_editor_create_vbox (umlclass); - gtk_box_pack_start (GTK_BOX (hbox), vbox3, TRUE, TRUE, 5); - - vbox3 = operations_parameters_data_create_vbox (umlclass); - gtk_box_pack_start (GTK_BOX (hbox), vbox3, TRUE, TRUE, 5); - - gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 5); - - gtk_widget_show_all (vbox); - gtk_widget_show (page_label); - gtk_notebook_append_page (notebook, vbox, page_label); } diff --git a/objects/UML/class_templates_dialog.c b/objects/UML/class_templates_dialog.c deleted file mode 100644 index 9f9fadb9d7159106d390edd6f43a74475fb272fe..0000000000000000000000000000000000000000 --- a/objects/UML/class_templates_dialog.c +++ /dev/null @@ -1,465 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#undef GTK_DISABLE_DEPRECATED /* GtkList, ... */ -#include - -#include "class.h" -#include "diaoptionmenu.h" - -#include "class_dialog.h" - -/************************************************************ - ******************** TEMPLATES ***************************** - ************************************************************/ - -static void -templates_set_sensitive(UMLClassDialog *prop_dialog, gint val) -{ - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->templ_name), val); - gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->templ_type), val); -} - -static void -templates_set_values (UMLClassDialog *prop_dialog, - UMLFormalParameter *param) -{ - if (param->name) - gtk_entry_set_text(prop_dialog->templ_name, param->name); - if (param->type != NULL) - gtk_entry_set_text(prop_dialog->templ_type, param->type); -} - -static void -templates_clear_values(UMLClassDialog *prop_dialog) -{ - gtk_entry_set_text(prop_dialog->templ_name, ""); - gtk_entry_set_text(prop_dialog->templ_type, ""); -} - -static void -templates_get_values(UMLClassDialog *prop_dialog, UMLFormalParameter *param) -{ - g_free(param->name); - if (param->type != NULL) - g_free(param->type); - - param->name = g_strdup (gtk_entry_get_text (prop_dialog->templ_name)); - param->type = g_strdup (gtk_entry_get_text (prop_dialog->templ_type)); -} - - -void -_templates_get_current_values(UMLClassDialog *prop_dialog) -{ - UMLFormalParameter *current_param; - GtkLabel *label; - gchar* new_str; - - if (prop_dialog->current_templ != NULL) { - current_param = (UMLFormalParameter *) - g_object_get_data(G_OBJECT(prop_dialog->current_templ), "user_data"); - if (current_param != NULL) { - templates_get_values(prop_dialog, current_param); - label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(prop_dialog->current_templ))); - new_str = uml_get_formalparameter_string (current_param); - gtk_label_set_text(label, new_str); - g_free(new_str); - } - } -} - -static void -templates_list_item_destroy_callback(GtkWidget *list_item, - gpointer data) -{ - UMLFormalParameter *param; - - param = (UMLFormalParameter *) - g_object_get_data(G_OBJECT(list_item), "user_data"); - - if (param != NULL) { - uml_formalparameter_destroy(param); - /*printf("Destroying list_item's user_data!\n"); */ - } -} - -static void -templates_list_selection_changed_callback(GtkWidget *gtklist, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkObject *list_item; - UMLFormalParameter *param; - - prop_dialog = umlclass->properties_dialog; - - if (!prop_dialog) - return; /* maybe hiding a bug elsewhere */ - - _templates_get_current_values(prop_dialog); - - list = GTK_LIST(gtklist)->selection; - if (!list) { /* No selected */ - templates_set_sensitive(prop_dialog, FALSE); - templates_clear_values(prop_dialog); - prop_dialog->current_templ = NULL; - return; - } - - list_item = GTK_OBJECT(list->data); - param = (UMLFormalParameter *)g_object_get_data(G_OBJECT(list_item), "user_data"); - templates_set_values(prop_dialog, param); - templates_set_sensitive(prop_dialog, TRUE); - - prop_dialog->current_templ = GTK_LIST_ITEM(list_item); - gtk_widget_grab_focus(GTK_WIDGET(prop_dialog->templ_name)); -} - -static void -templates_list_new_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkWidget *list_item; - UMLFormalParameter *param; - char *utfstr; - - prop_dialog = umlclass->properties_dialog; - - _templates_get_current_values(prop_dialog); - - param = uml_formalparameter_new(); - - utfstr = uml_get_formalparameter_string (param); - list_item = gtk_list_item_new_with_label (utfstr); - gtk_widget_show (list_item); - g_free (utfstr); - - g_object_set_data(G_OBJECT(list_item), "user_data", param); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (templates_list_item_destroy_callback), NULL); - - list = g_list_append(NULL, list_item); - gtk_list_append_items(prop_dialog->templates_list, list); - - if (prop_dialog->templates_list->children != NULL) - gtk_list_unselect_child(prop_dialog->templates_list, - GTK_WIDGET(prop_dialog->templates_list->children->data)); - gtk_list_select_child(prop_dialog->templates_list, list_item); -} - -static void -templates_list_delete_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); - - if (gtklist->selection != NULL) { - list = g_list_prepend(NULL, gtklist->selection->data); - gtk_list_remove_items(gtklist, list); - g_list_free(list); - templates_clear_values(prop_dialog); - templates_set_sensitive(prop_dialog, FALSE); - } -} - -static void -templates_list_move_up_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i>0) - i--; - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } -} - -static void -templates_list_move_down_callback(GtkWidget *button, - UMLClass *umlclass) -{ - GList *list; - UMLClassDialog *prop_dialog; - GtkList *gtklist; - GtkWidget *list_item; - int i; - - prop_dialog = umlclass->properties_dialog; - gtklist = GTK_LIST(prop_dialog->templates_list); - - if (gtklist->selection != NULL) { - list_item = GTK_WIDGET(gtklist->selection->data); - - i = gtk_list_child_position(gtklist, list_item); - if (i<(g_list_length(gtklist->children)-1)) - i++; - - g_object_ref(list_item); - list = g_list_prepend(NULL, list_item); - gtk_list_remove_items(gtklist, list); - gtk_list_insert_items(gtklist, list, i); - g_object_unref(list_item); - - gtk_list_select_child(gtklist, list_item); - } -} - - -void -_templates_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog) -{ - GList *list; - UMLFormalParameter *param; - GtkWidget *list_item; - GList *clear_list; - - _templates_get_current_values(prop_dialog); /* if changed, update from widgets */ - - umlclass->template = prop_dialog->templ_template->active; - - /* Free current formal parameters: */ - list = umlclass->formal_params; - while (list != NULL) { - param = (UMLFormalParameter *)list->data; - uml_formalparameter_destroy(param); - list = g_list_next(list); - } - g_list_free (umlclass->formal_params); - umlclass->formal_params = NULL; - - /* Insert new formal params and remove them from gtklist: */ - list = GTK_LIST (prop_dialog->templates_list)->children; - clear_list = NULL; - while (list != NULL) { - list_item = GTK_WIDGET(list->data); - clear_list = g_list_prepend (clear_list, list_item); - param = (UMLFormalParameter *) - g_object_get_data(G_OBJECT(list_item), "user_data"); - g_object_set_data(G_OBJECT(list_item), "user_data", NULL); - umlclass->formal_params = g_list_append(umlclass->formal_params, param); - list = g_list_next(list); - } - clear_list = g_list_reverse (clear_list); - gtk_list_remove_items (GTK_LIST (prop_dialog->templates_list), clear_list); - g_list_free (clear_list); -} - -void -_templates_fill_in_dialog(UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - UMLFormalParameter *param_copy; - GList *list; - GtkWidget *list_item; - int i; - prop_dialog = umlclass->properties_dialog; - - gtk_toggle_button_set_active(prop_dialog->templ_template, umlclass->template); - - /* copy in new template-parameters: */ - if (prop_dialog->templates_list->children == NULL) { - i = 0; - list = umlclass->formal_params; - while (list != NULL) { - UMLFormalParameter *param = (UMLFormalParameter *)list->data; - gchar *paramstr = uml_get_formalparameter_string(param); - - list_item = gtk_list_item_new_with_label (paramstr); - param_copy = uml_formalparameter_copy(param); - g_object_set_data(G_OBJECT(list_item), "user_data", - (gpointer) param_copy); - g_signal_connect (G_OBJECT (list_item), "destroy", - G_CALLBACK (templates_list_item_destroy_callback), NULL); - gtk_container_add (GTK_CONTAINER (prop_dialog->templates_list), - list_item); - gtk_widget_show (list_item); - - list = g_list_next(list); i++; - g_free (paramstr); - } - /* set templates non-sensitive */ - prop_dialog->current_templ = NULL; - templates_set_sensitive(prop_dialog, FALSE); - templates_clear_values(prop_dialog); - } - -} - - -static void -templates_update(GtkWidget *widget, UMLClass *umlclass) -{ - _templates_get_current_values(umlclass->properties_dialog); -} - -static int -templates_update_event(GtkWidget *widget, GdkEventFocus *ev, UMLClass *umlclass) -{ - _templates_get_current_values(umlclass->properties_dialog); - return 0; -} - -void -_templates_create_page(GtkNotebook *notebook, UMLClass *umlclass) -{ - UMLClassDialog *prop_dialog; - GtkWidget *page_label; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *hbox2; - GtkWidget *table; - GtkWidget *entry; - GtkWidget *checkbox; - GtkWidget *scrolled_win; - GtkWidget *button; - GtkWidget *list; - GtkWidget *frame; - - prop_dialog = umlclass->properties_dialog; - - /* Templates page: */ - page_label = gtk_label_new_with_mnemonic (_("_Templates")); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - - hbox2 = gtk_hbox_new(FALSE, 5); - checkbox = gtk_check_button_new_with_label(_("Template class")); - prop_dialog->templ_template = GTK_TOGGLE_BUTTON(checkbox); - gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0); - - hbox = gtk_hbox_new(FALSE, 5); - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (hbox), scrolled_win, TRUE, TRUE, 0); - gtk_widget_show (scrolled_win); - - list = gtk_list_new (); - prop_dialog->templates_list = GTK_LIST(list); - gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_SINGLE); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_win))); - gtk_widget_show (list); - - g_signal_connect (G_OBJECT (list), "selection_changed", - G_CALLBACK(templates_list_selection_changed_callback), umlclass); - - vbox2 = gtk_vbox_new(FALSE, 5); - - button = gtk_button_new_from_stock (GTK_STOCK_NEW); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(templates_list_new_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_DELETE); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(templates_list_delete_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(templates_list_move_up_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK(templates_list_move_down_callback), umlclass); - gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); - - frame = gtk_frame_new(_("Formal parameter data")); - vbox2 = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), 10); - gtk_container_add (GTK_CONTAINER (frame), vbox2); - gtk_widget_show(frame); - gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0); - - table = gtk_table_new (2, 2, FALSE); - gtk_box_pack_start (GTK_BOX (vbox2), table, FALSE, FALSE, 0); - - label = gtk_label_new(_("Name:")); - entry = gtk_entry_new(); - prop_dialog->templ_name = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (templates_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (templates_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,0,1, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,0,1, GTK_FILL | GTK_EXPAND,0, 0,2); - - label = gtk_label_new(_("Type:")); - entry = gtk_entry_new(); - prop_dialog->templ_type = GTK_ENTRY(entry); - g_signal_connect (G_OBJECT (entry), "focus_out_event", - G_CALLBACK (templates_update_event), umlclass); - g_signal_connect (G_OBJECT (entry), "activate", - G_CALLBACK (templates_update), umlclass); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0,1,1,2, GTK_FILL,0, 0,0); - gtk_table_attach (GTK_TABLE (table), entry, 1,2,1,2, GTK_FILL | GTK_EXPAND,0, 0,2); - - gtk_widget_show(vbox2); - - /* TODO: Add stuff here! */ - - gtk_widget_show_all (vbox); - gtk_widget_show (page_label); - gtk_notebook_append_page (notebook, vbox, page_label); -} diff --git a/objects/UML/classicon.c b/objects/UML/classicon.c index f6dd9b92ae37611704bed6a350c651ac9c4d24f1..e515e12c398cb1957c808e84e7c472f0d8b905f7 100644 --- a/objects/UML/classicon.c +++ b/objects/UML/classicon.c @@ -49,8 +49,8 @@ struct _Classicon { int stereotype; int is_object; Text *text; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; }; diff --git a/objects/UML/component.c b/objects/UML/component.c index fe5b94372fe800f554f7c037d533f4e0c0068188..f00b504c6766308505a71e89f02efddba09eb02e 100644 --- a/objects/UML/component.c +++ b/objects/UML/component.c @@ -49,8 +49,8 @@ struct _Component { char *st_stereotype; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define COMPONENT_BORDERWIDTH 0.1 diff --git a/objects/UML/component_feature.c b/objects/UML/component_feature.c index 49a75ec7b6feaacda66a265296b84ce9e3436e1a..102538e8c65dcc3a0241f1afec062e87f0937df8 100644 --- a/objects/UML/component_feature.c +++ b/objects/UML/component_feature.c @@ -71,7 +71,7 @@ struct _Compfeat { Point text_pos; Handle text_handle; - Color line_color; + GdkRGBA line_color; real line_width; }; diff --git a/objects/UML/constraint.c b/objects/UML/constraint.c index 9f8533941ec815cadcc76845e628a7392249b0e8..8fc381039f52d7edc3c5e69bc37a6b00084d16bf 100644 --- a/objects/UML/constraint.c +++ b/objects/UML/constraint.c @@ -48,8 +48,8 @@ struct _Constraint { Point text_pos; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/dependency.c b/objects/UML/dependency.c index f5cdd89266d1adfdb5d1a206637cf0c97015147b..c5718fe52cf7fbd6c11421709690c40b49c5d1ed 100644 --- a/objects/UML/dependency.c +++ b/objects/UML/dependency.c @@ -47,8 +47,8 @@ struct _Dependency { Alignment text_align; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; int draw_arrow; char *name; diff --git a/objects/UML/dia-uml-attribute.c b/objects/UML/dia-uml-attribute.c new file mode 100644 index 0000000000000000000000000000000000000000..85d097f93cc65372905cbce304bf56a5611f0dfb --- /dev/null +++ b/objects/UML/dia-uml-attribute.c @@ -0,0 +1,388 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * umlattribute.c : refactored from uml.c, class.c to final use StdProps + * PROP_TYPE_DARRAY, a list where each element is a set + * of properies described by the same StdPropDesc + * Copyright (C) 2005 Hans Breuer + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "uml.h" +#include "dia-uml-attribute.h" +#include "list/dia-list-data.h" +#include "properties.h" + +extern PropEnumData _uml_visibilities[]; + +static PropDescription umlattribute_props[] = { + { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Name"), NULL, NULL }, + { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Type"), NULL, NULL }, + { "value", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Value"), NULL, NULL }, + { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Comment"), NULL, NULL }, + { "visibility", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Visibility"), NULL, _uml_visibilities }, + /* Kept for backward compatibility, not sure what it is meant to be --hb */ + { "abstract", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Abstract"), NULL, NULL }, + { "class_scope", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Scope"), NULL, N_("Class scope (C++ static class variable)") }, + + PROP_DESC_END +}; + +static PropOffset umlattribute_offsets[] = { + { "name", PROP_TYPE_STRING, offsetof(DiaUmlAttribute, name) }, + { "type", PROP_TYPE_STRING, offsetof(DiaUmlAttribute, type) }, + { "value", PROP_TYPE_STRING, offsetof(DiaUmlAttribute, value) }, + { "comment", PROP_TYPE_MULTISTRING, offsetof(DiaUmlAttribute, comment) }, + { "visibility", PROP_TYPE_ENUM, offsetof(DiaUmlAttribute, visibility) }, + { "abstract", PROP_TYPE_BOOL, offsetof(DiaUmlAttribute, abstract) }, + { "class_scope", PROP_TYPE_BOOL, offsetof(DiaUmlAttribute, class_scope) }, + { NULL, 0, 0 }, +}; + + +PropDescDArrayExtra umlattribute_extra = { + { umlattribute_props, umlattribute_offsets, "umlattribute" }, + (NewRecordFunc) dia_uml_attribute_new, + (FreeRecordFunc) g_object_unref +}; + +static void +dia_uml_attribute_list_data_init (DiaListDataInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (DiaUmlAttribute, dia_uml_attribute, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DIA_TYPE_LIST_DATA, + dia_uml_attribute_list_data_init)) + +enum { + PROP_NAME = 1, + PROP_TYPE, + PROP_VALUE, + PROP_COMMENT, + PROP_VISIBILITY, + PROP_CLASS_SCOPE, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + + +static void +dia_uml_attribute_finalize (GObject *object) +{ + DiaUmlAttribute *self = DIA_UML_ATTRIBUTE (object); + + g_free (self->name); + g_free (self->type); + g_free (self->value); + g_free (self->comment); + + /* free'd elsewhere */ + /* + g_free(attr->left_connection); + g_free(attr->right_connection); + */ +} + + +static void +dia_uml_attribute_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlAttribute *self = DIA_UML_ATTRIBUTE (object); + + switch (property_id) { + case PROP_NAME: + self->name = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_NAME]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_TYPE: + self->type = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_TYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_VALUE: + self->value = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_VALUE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_COMMENT: + self->comment = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_COMMENT]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_VISIBILITY: + self->visibility = g_value_get_int (value); + g_object_notify_by_pspec (object, properties[PROP_VISIBILITY]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_CLASS_SCOPE: + self->class_scope = g_value_get_boolean (value); + g_object_notify_by_pspec (object, properties[PROP_CLASS_SCOPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_attribute_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlAttribute *self = DIA_UML_ATTRIBUTE (object); + + switch (property_id) { + case PROP_NAME: + g_value_set_string (value, self->name); + break; + case PROP_TYPE: + g_value_set_string (value, self->type); + break; + case PROP_VALUE: + g_value_set_string (value, self->type); + break; + case PROP_COMMENT: + g_value_set_string (value, self->comment); + break; + case PROP_VISIBILITY: + g_value_set_int (value, self->visibility); + break; + case PROP_CLASS_SCOPE: + g_value_set_boolean (value, self->class_scope); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static const gchar * +format (DiaListData *self) +{ + return dia_uml_attribute_format (DIA_UML_ATTRIBUTE (self)); +} + +static void +dia_uml_attribute_list_data_init (DiaListDataInterface *iface) +{ + iface->format = format; +} + +static void +dia_uml_attribute_class_init (DiaUmlAttributeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_uml_attribute_finalize; + object_class->set_property = dia_uml_attribute_set_property; + object_class->get_property = dia_uml_attribute_get_property; + + properties[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Function name", + "", + G_PARAM_READWRITE); + properties[PROP_TYPE] = g_param_spec_string ("type", + "Type", + "Attribute type", + "", + G_PARAM_READWRITE); + properties[PROP_VALUE] = g_param_spec_string ("value", + "Value", + "Default value", + "", + G_PARAM_READWRITE); + properties[PROP_COMMENT] = g_param_spec_string ("comment", + "Comment", + "Comment", + "", + G_PARAM_READWRITE); + properties[PROP_VISIBILITY] = g_param_spec_int ("visibility", + "Visibility", + "Visibility", + UML_PUBLIC, + UML_IMPLEMENTATION, + UML_PUBLIC, + G_PARAM_READWRITE); + properties[PROP_CLASS_SCOPE] = g_param_spec_boolean ("class-scope", + "Class scope", + "Class scope", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); +} + +static void +dia_uml_attribute_init (DiaUmlAttribute *self) +{ + static gint next_id = 1; + + self->internal_id = next_id++; + self->name = g_strdup(""); + self->type = g_strdup(""); + self->value = NULL; + self->comment = g_strdup(""); + self->visibility = UML_PUBLIC; + self->abstract = FALSE; + self->class_scope = FALSE; + /* setup elsewhere */ + /* + attr->left_connection = g_new0(ConnectionPoint, 1); + attr->right_connection = g_new0(ConnectionPoint, 1); + */ +} + +DiaUmlAttribute * +dia_uml_attribute_new () +{ + return g_object_new (DIA_UML_TYPE_ATTRIBUTE, NULL); +} + +/** Copy the data of an attribute into another, but not the connections. + * Frees up any strings in the attribute being copied into. */ +DiaUmlAttribute * +dia_uml_attribute_copy (DiaUmlAttribute *self) +{ + DiaUmlAttribute *newattr = g_object_new (DIA_UML_TYPE_ATTRIBUTE, NULL); + + newattr->internal_id = self->internal_id; + g_free(newattr->name); + newattr->name = g_strdup(self->name); + g_free(newattr->type); + newattr->type = g_strdup(self->type); + + g_free(newattr->value); + newattr->value = g_strdup(self->value); + + g_free(newattr->comment); + newattr->comment = g_strdup (self->comment); + + newattr->visibility = self->visibility; + newattr->abstract = self->abstract; + newattr->class_scope = self->class_scope; + + return newattr; +} + +void +uml_attribute_write(AttributeNode attr_node, DiaUmlAttribute *attr, DiaContext *ctx) +{ + DataNode composite; + + composite = data_add_composite(attr_node, "umlattribute", ctx); + + data_add_string(composite_add_attribute(composite, "name"), + attr->name, ctx); + data_add_string(composite_add_attribute(composite, "type"), + attr->type, ctx); + data_add_string(composite_add_attribute(composite, "value"), + attr->value, ctx); + data_add_string(composite_add_attribute(composite, "comment"), + attr->comment, ctx); + data_add_enum(composite_add_attribute(composite, "visibility"), + attr->visibility, ctx); + data_add_boolean(composite_add_attribute(composite, "abstract"), + attr->abstract, ctx); + data_add_boolean(composite_add_attribute(composite, "class_scope"), + attr->class_scope, ctx); +} + +/* Warning, the following *must* be strictly ASCII characters (or fix the + following code for UTF-8 cleanliness */ + +char visible_char[] = { '+', '-', '#', ' ' }; + +char * +dia_uml_attribute_format (DiaUmlAttribute *attribute) +{ + int len; + char *str; + + len = 1 + (attribute->name ? strlen (attribute->name) : 0) + + (attribute->type ? strlen (attribute->type) : 0); + if (attribute->name && attribute->name[0] && attribute->type && attribute->type[0]) { + len += 2; + } + if (attribute->value != NULL && attribute->value[0] != '\0') { + len += 3 + strlen (attribute->value); + } + + str = g_malloc (sizeof (char) * (len + 1)); + + str[0] = visible_char[(int) attribute->visibility]; + str[1] = 0; + + strcat (str, attribute->name ? attribute->name : ""); + if (attribute->name && attribute->name[0] && attribute->type && attribute->type[0]) { + strcat (str, ": "); + } + strcat (str, attribute->type ? attribute->type : ""); + if (attribute->value != NULL && attribute->value[0] != '\0') { + strcat (str, " = "); + strcat (str, attribute->value); + } + + g_assert (strlen (str) == len); + + return str; +} + +/*! + * The ownership of these connection points is quite complicated. Instead of being part of + * the DiaUmlAttribute as one may expect at first, they are somewhat in between the DiaObject + * (see: DiaObject::connections and the concrete user, here UMLClass) and the DiaUmlAttribute. + * + * But with taking undo state mangement into account it gets even worse. Deleted (to be + * restored connection points) live inside the UMLClassChange until they get reverted back + * to the object *or* get free'd by umlclass_change_free() + * + * Since the implementation of attributes/operations being settable via StdProps there are + * more places to keep this stuff consitent. So here comes a tolerant helper. + * + * NOTE: Same function as uml_operation_ensure_connection_points(), + * with C++ it would be a template function ;) + */ +void +dia_uml_attribute_ensure_connection_points (DiaUmlAttribute* attr, DiaObject* obj) +{ + if (!attr->left_connection) + attr->left_connection = g_new0(ConnectionPoint,1); + attr->left_connection->object = obj; + if (!attr->right_connection) + attr->right_connection = g_new0(ConnectionPoint,1); + attr->right_connection->object = obj; +} diff --git a/objects/UML/dia-uml-attribute.h b/objects/UML/dia-uml-attribute.h new file mode 100644 index 0000000000000000000000000000000000000000..f03f10872ec8e47478eec90a340f530c0c5cf9c0 --- /dev/null +++ b/objects/UML/dia-uml-attribute.h @@ -0,0 +1,38 @@ +#include +#include "uml.h" + +#ifndef UML_ATTR_H +#define UML_ATTR_H + +#define DIA_UML_TYPE_ATTRIBUTE (dia_uml_attribute_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlAttribute, dia_uml_attribute, DIA_UML, ATTRIBUTE, GObject) + +/** \brief A list of DiaUmlAttribute is contained in UMLClass + * Some would call them member variables ;) + */ +struct _DiaUmlAttribute { + GObject parent; + gint internal_id; /**< Arbitrary integer to recognize attributes after + * the user has shuffled them in the dialog. */ + gchar *name; /**< the member variables name */ + gchar *type; /**< the return value */ + gchar *value; /**< default parameter : Can be NULL => No default value */ + gchar *comment; /**< comment */ + UMLVisibility visibility; /**< attributes visibility */ + int abstract; /**< not sure if this applicable */ + int class_scope; /**< in C++ : static member */ + + ConnectionPoint* left_connection; /**< left */ + ConnectionPoint* right_connection; /**< right */ +}; + +DiaUmlAttribute *dia_uml_attribute_new (void); +/** calculated the 'formated' representation */ +gchar *dia_uml_attribute_format (DiaUmlAttribute *attribute); +DiaUmlAttribute *dia_uml_attribute_copy (DiaUmlAttribute *attr); +void dia_uml_attribute_ensure_connection_points (DiaUmlAttribute *attr, + DiaObject *obj); + +void uml_attribute_write(AttributeNode attr_node, DiaUmlAttribute *attr, DiaContext *ctx); + +#endif \ No newline at end of file diff --git a/objects/UML/dia-uml-class.c b/objects/UML/dia-uml-class.c new file mode 100644 index 0000000000000000000000000000000000000000..b018ca4b5eaf5556ad1b7d1519f96049a1baf37a --- /dev/null +++ b/objects/UML/dia-uml-class.c @@ -0,0 +1,638 @@ +#include "dia-uml-class.h" +#include "dia-uml-operation.h" +#include "dia-uml-attribute.h" +#include "dia-uml-formal-parameter.h" +#include "list/dia-list-store.h" +#include "class_dialog.h" + +struct _DiaUmlClass { + GObject parent; + + double font_height; + double abstract_font_height; + double polymorphic_font_height; + double classname_font_height; + double abstract_classname_font_height; + double comment_font_height; + + DiaFont *normal_font; + DiaFont *abstract_font; + DiaFont *polymorphic_font; + DiaFont *classname_font; + DiaFont *abstract_classname_font; + DiaFont *comment_font; + + char *name; + char *stereotype; + char *comment; + + gboolean abstract; + gboolean suppress_attributes; + gboolean suppress_operations; + gboolean visible_attributes; + gboolean visible_operations; + gboolean visible_comments; + + int wrap_operations; + int wrap_after_char; + int comment_line_length; + int comment_tagging; + + double line_width; + GdkRGBA line_color; + GdkRGBA fill_color; + GdkRGBA text_color; + + /* Attributes: */ + DiaListStore *attributes; + + /* Operators: */ + DiaListStore *operations; + + /* Template: */ + gboolean is_template; + DiaListStore *formal_params; +}; + +G_DEFINE_TYPE (DiaUmlClass, dia_uml_class, G_TYPE_OBJECT) + +enum { + PROP_NAME = 1, + PROP_STEREOTYPE, + PROP_COMMENT, + PROP_ABSTRACT, + PROP_COMMENTS, + PROP_COMMENT_WRAP_POINT, + PROP_DOCUMENTATION_TAG, + PROP_ATTRIBUTES_VISIBLE, + PROP_ATTRIBUTES_SUPPRESS, + PROP_OPERATIONS_VISIBLE, + PROP_OPERATIONS_SUPPRESS, + PROP_OPERATIONS_WRAP, + PROP_OPERATIONS_WRAP_POINT, + PROP_IS_TEMPLATE, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +static void +clear_attrs (DiaUmlClass *self) +{ + g_clear_object (&self->normal_font); + g_clear_object (&self->abstract_font); + g_clear_object (&self->polymorphic_font); + g_clear_object (&self->classname_font); + g_clear_object (&self->abstract_classname_font); + g_clear_object (&self->comment_font); + + g_free (self->name); + g_free (self->stereotype); + g_free (self->comment); + + g_clear_object (&self->attributes); + g_clear_object (&self->operations); + g_clear_object (&self->formal_params); +} + +static void +dia_uml_class_finalize (GObject *object) +{ + DiaUmlClass *self = DIA_UML_CLASS (object); + + clear_attrs (self); +} + +static void +dia_uml_class_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlClass *self = DIA_UML_CLASS (object); + + switch (property_id) { + case PROP_NAME: + self->name = g_value_dup_string (value); + break; + case PROP_STEREOTYPE: + self->stereotype = g_value_dup_string (value); + break; + case PROP_COMMENT: + self->comment = g_value_dup_string (value); + break; + case PROP_ABSTRACT: + self->abstract = g_value_get_boolean (value); + break; + case PROP_COMMENTS: + self->visible_comments = g_value_get_boolean (value); + break; + case PROP_COMMENT_WRAP_POINT: + self->comment_line_length = g_value_get_int (value); + break; + case PROP_DOCUMENTATION_TAG: + self->comment_tagging = g_value_get_boolean (value); + break; + case PROP_ATTRIBUTES_VISIBLE: + self->visible_attributes = g_value_get_boolean (value); + break; + case PROP_ATTRIBUTES_SUPPRESS: + self->suppress_attributes = g_value_get_boolean (value); + break; + case PROP_OPERATIONS_VISIBLE: + self->visible_operations = g_value_get_boolean (value); + break; + case PROP_OPERATIONS_SUPPRESS: + self->suppress_operations = g_value_get_boolean (value); + break; + case PROP_OPERATIONS_WRAP: + self->wrap_operations = g_value_get_boolean (value); + break; + case PROP_OPERATIONS_WRAP_POINT: + self->wrap_after_char = g_value_get_int (value); + break; + case PROP_IS_TEMPLATE: + self->is_template = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_class_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlClass *self = DIA_UML_CLASS (object); + + switch (property_id) { + case PROP_NAME: + g_value_set_string (value, self->name); + break; + case PROP_STEREOTYPE: + g_value_set_string (value, self->stereotype ? self->stereotype : ""); + break; + case PROP_COMMENT: + g_value_set_string (value, self->comment ? self->comment : ""); + break; + case PROP_ABSTRACT: + g_value_set_boolean (value, self->abstract); + break; + case PROP_COMMENTS: + g_value_set_boolean (value, self->visible_comments); + break; + case PROP_COMMENT_WRAP_POINT: + g_value_set_int (value, self->comment_line_length); + break; + case PROP_DOCUMENTATION_TAG: + g_value_set_boolean (value, self->comment_tagging); + break; + case PROP_ATTRIBUTES_VISIBLE: + g_value_set_boolean (value, self->visible_attributes); + break; + case PROP_ATTRIBUTES_SUPPRESS: + g_value_set_boolean (value, self->suppress_attributes); + break; + case PROP_OPERATIONS_VISIBLE: + g_value_set_boolean (value, self->visible_operations); + break; + case PROP_OPERATIONS_SUPPRESS: + g_value_set_boolean (value, self->suppress_operations); + break; + case PROP_OPERATIONS_WRAP: + g_value_set_boolean (value, self->wrap_operations); + break; + case PROP_OPERATIONS_WRAP_POINT: + g_value_set_int (value, self->wrap_after_char); + break; + case PROP_IS_TEMPLATE: + g_value_set_boolean (value, self->is_template); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_class_class_init (DiaUmlClassClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_uml_class_finalize; + object_class->set_property = dia_uml_class_set_property; + object_class->get_property = dia_uml_class_get_property; + + properties[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Class name", + "", + G_PARAM_READWRITE); + properties[PROP_STEREOTYPE] = g_param_spec_string ("stereotype", + "Stereotype", + "Parent type", + "", + G_PARAM_READWRITE); + properties[PROP_COMMENT] = g_param_spec_string ("comment", + "Comment", + "Class comment", + "", + G_PARAM_READWRITE); + properties[PROP_ABSTRACT] = g_param_spec_boolean ("abstract", + "Abstract", + "Is an abstract class", + FALSE, + G_PARAM_READWRITE); + properties[PROP_COMMENTS] = g_param_spec_boolean ("comments", + "Comments", + "Show comments", + FALSE, + G_PARAM_READWRITE); + properties[PROP_COMMENT_WRAP_POINT] = g_param_spec_int ("comment-wrap-point", + "Comments", + "Show comments", + 17, + 200, + 17, + G_PARAM_READWRITE); + properties[PROP_DOCUMENTATION_TAG] = g_param_spec_boolean ("documentation-tag", + "Documentation tag", + "Show documentation tag", + FALSE, + G_PARAM_READWRITE); + properties[PROP_ATTRIBUTES_VISIBLE] = g_param_spec_boolean ("attributes-visible", + "Attributes visible", + "Are attributes visible", + TRUE, + G_PARAM_READWRITE); + properties[PROP_ATTRIBUTES_SUPPRESS] = g_param_spec_boolean ("attributes-suppress", + "Attributes suppress", + "Are attributes supressed", + FALSE, + G_PARAM_READWRITE); + properties[PROP_OPERATIONS_VISIBLE] = g_param_spec_boolean ("operations-visible", + "Operations visible", + "Are operations visible", + TRUE, + G_PARAM_READWRITE); + properties[PROP_OPERATIONS_SUPPRESS] = g_param_spec_boolean ("operations-suppress", + "Operations suppress", + "Are operations supressed", + FALSE, + G_PARAM_READWRITE); + properties[PROP_OPERATIONS_WRAP] = g_param_spec_boolean ("operations-wrap", + "Operations wrap", + "Should operations be wrapped", + TRUE, + G_PARAM_READWRITE); + properties[PROP_OPERATIONS_WRAP_POINT] = g_param_spec_int ("operations-wrap-point", + "Operations wrap point", + "Where operations should be wrapped", + 0, + 200, + 40, + G_PARAM_READWRITE); + properties[PROP_IS_TEMPLATE] = g_param_spec_boolean ("is-template", + "Is template", + "Is a template class", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); +} + +static void +dia_uml_class_init (DiaUmlClass *self) +{ +} + +DiaUmlClass * +dia_uml_class_new (UMLClass *klass) +{ + DiaUmlClass *self = g_object_new (DIA_UML_TYPE_CLASS, NULL); + + dia_uml_class_load (self, klass); + + return self; +} + +/* Sync from klass to self */ +void +dia_uml_class_load (DiaUmlClass *self, + UMLClass *klass) +{ + GList *list; + + clear_attrs (self); + + self->font_height = klass->font_height; + self->abstract_font_height = klass->abstract_font_height; + self->polymorphic_font_height = klass->polymorphic_font_height; + self->classname_font_height = klass->classname_font_height; + self->abstract_classname_font_height = klass->abstract_classname_font_height; + self->comment_font_height = klass->comment_font_height; + + self->normal_font = g_object_ref (klass->normal_font); + self->abstract_font = g_object_ref (klass->abstract_font); + self->polymorphic_font = g_object_ref (klass->polymorphic_font); + self->classname_font = g_object_ref (klass->classname_font); + self->abstract_classname_font = g_object_ref (klass->abstract_classname_font); + self->comment_font = g_object_ref (klass->comment_font); + + g_free (self->name); + self->name = g_strdup(klass->name); + g_free (self->stereotype); + self->stereotype = g_strdup(klass->stereotype); + g_free (self->comment); + self->comment = g_strdup(klass->comment); + + self->abstract = klass->abstract; + self->suppress_attributes = klass->suppress_attributes; + self->suppress_operations = klass->suppress_operations; + self->visible_attributes = klass->visible_attributes; + self->visible_operations = klass->visible_operations; + self->visible_comments = klass->visible_comments; + + self->wrap_operations = klass->wrap_operations; + self->wrap_after_char = klass->wrap_after_char; + self->comment_line_length = klass->comment_line_length; + self->comment_tagging = klass->comment_tagging; + + self->line_color = klass->line_color; + self->fill_color = klass->fill_color; + self->text_color = klass->text_color; + + list = klass->attributes; + self->attributes = dia_list_store_new (); + while (list != NULL) { + DiaUmlAttribute *attr = (DiaUmlAttribute *)list->data; + DiaUmlAttribute *attr_copy; + + attr_copy = dia_uml_attribute_copy (attr); + /* Looks wrong, but needed fro proper restore */ + attr_copy->left_connection = attr->left_connection; + attr_copy->right_connection = attr->right_connection; + + dia_list_store_add (self->attributes, DIA_LIST_DATA (attr_copy)); + list = g_list_next(list); + } + + list = klass->operations; + self->operations = dia_list_store_new (); + while (list != NULL) { + DiaUmlOperation *op = (DiaUmlOperation *)list->data; + DiaUmlOperation *copy = dia_uml_operation_copy (op); + + dia_uml_operation_connection_thing (copy, op); + + dia_list_store_add (self->operations, DIA_LIST_DATA (copy)); + list = g_list_next(list); + } + + self->is_template = klass->template; + + list = klass->formal_params; + self->formal_params = dia_list_store_new (); + while (list != NULL) { + DiaUmlFormalParameter *param = (DiaUmlFormalParameter *)list->data; + DiaUmlFormalParameter *copy = dia_uml_formal_parameter_copy (param); + + dia_list_store_add (self->formal_params, DIA_LIST_DATA (copy)); + list = g_list_next(list); + } +} + +/* Sync from self to klass */ +void +dia_uml_class_store (DiaUmlClass *self, + UMLClass *klass, + GList **added, + GList **removed, + GList **disconnected) +{ + GListModel *list_store; + DiaListData *itm; + DiaObject *obj; + gboolean attr_visible = TRUE; + gboolean op_visible = TRUE; + int i = 0; + int connection_index = UMLCLASS_CONNECTIONPOINTS; + + /* Cast to DiaObject (UMLClass -> Element -> DiaObject) */ + obj = &klass->element.object; + + klass->font_height = self->font_height; + klass->abstract_font_height = self->abstract_font_height; + klass->polymorphic_font_height = self->polymorphic_font_height; + klass->classname_font_height = self->classname_font_height; + klass->abstract_classname_font_height = self->abstract_classname_font_height; + klass->comment_font_height = self->comment_font_height; + + /* transfer ownership, but don't leak the previous font */ + g_clear_object (&klass->normal_font); + klass->normal_font = g_object_ref (self->normal_font); + g_clear_object (&klass->abstract_font); + klass->abstract_font = g_object_ref (self->abstract_font); + g_clear_object (&klass->polymorphic_font); + klass->polymorphic_font = g_object_ref (self->polymorphic_font); + g_clear_object (&klass->classname_font); + klass->classname_font = g_object_ref (self->classname_font); + g_clear_object (&klass->abstract_classname_font); + klass->abstract_classname_font = g_object_ref (self->abstract_classname_font); + g_clear_object (&klass->comment_font); + klass->comment_font = g_object_ref (self->comment_font); + + klass->name = self->name; + klass->stereotype = self->stereotype; + klass->comment = self->comment; + + klass->abstract = self->abstract; + klass->suppress_attributes = self->suppress_attributes; + klass->suppress_operations = self->suppress_operations; + klass->visible_attributes = self->visible_attributes; + klass->visible_operations = self->visible_operations; + klass->visible_comments = self->visible_comments; + + klass->wrap_operations = self->wrap_operations; + klass->wrap_after_char = self->wrap_after_char; + klass->comment_line_length = self->comment_line_length; + klass->comment_tagging = self->comment_tagging; + + klass->template = self->is_template; + + klass->line_color = self->line_color; + klass->fill_color = self->fill_color; + klass->text_color = self->text_color; + + /* Free current attributes: */ + g_list_free_full (klass->attributes, g_object_unref); + klass->attributes = NULL; + + /* Free current operations: */ + /* Clear those already stored */ + g_list_free_full (klass->operations, g_object_unref); + klass->operations = NULL; + + /* Free current formal parameters: */ + g_list_free_full (klass->formal_params, g_object_unref); + klass->formal_params = NULL; + + /* If attributes visible and not suppressed */ + attr_visible = (self->visible_attributes) && (!self->suppress_attributes); + + /* Insert new attributes and remove them from gtklist: */ + i = 0; + list_store = dia_uml_class_get_attributes (self); + /* Insert new operations and remove them from gtklist: */ + while ((itm = g_list_model_get_item (list_store, i))) { + DiaUmlAttribute *attr = DIA_UML_ATTRIBUTE (itm); + + klass->attributes = g_list_append (klass->attributes, g_object_ref (attr)); + + if (attr->left_connection == NULL) { + dia_uml_attribute_ensure_connection_points (attr, obj); + + *added = g_list_prepend (*added, attr->left_connection); + *added = g_list_prepend (*added, attr->right_connection); + } + + if (attr_visible) { + obj->connections[connection_index] = attr->left_connection; + connection_index++; + obj->connections[connection_index] = attr->right_connection; + connection_index++; + } else { + _umlclass_store_disconnects (attr->left_connection, disconnected); + object_remove_connections_to(attr->left_connection); + _umlclass_store_disconnects (attr->right_connection, disconnected); + object_remove_connections_to(attr->right_connection); + } + + i++; + } + + /* If operations visible and not suppressed */ + op_visible = (self->visible_operations) && (!self->suppress_operations); + + i = 0; + list_store = dia_uml_class_get_operations (self); + /* Insert new operations and remove them from gtklist: */ + while ((itm = g_list_model_get_item (list_store, i))) { + DiaUmlOperation *op = DIA_UML_OPERATION (itm); + + klass->operations = g_list_append(klass->operations, g_object_ref (op)); + + if (op->l_connection == NULL) { + dia_uml_operation_ensure_connection_points (op, obj); + + *added = g_list_prepend (*added, op->l_connection); + *added = g_list_prepend (*added, op->r_connection); + } + + if (op_visible) { + obj->connections[connection_index] = op->l_connection; + connection_index++; + obj->connections[connection_index] = op->r_connection; + connection_index++; + } else { + _umlclass_store_disconnects (op->l_connection, disconnected); + object_remove_connections_to(op->l_connection); + _umlclass_store_disconnects (op->r_connection, disconnected); + object_remove_connections_to(op->r_connection); + } + + i++; + } + + /* Insert new formal params and remove them from gtklist: */ + i = 0; + list_store = dia_uml_class_get_formal_parameters (self); + /* Insert new operations and remove them from gtklist: */ + while ((itm = g_list_model_get_item (list_store, i))) { + DiaUmlFormalParameter *param = DIA_UML_FORMAL_PARAMETER (itm); + + klass->formal_params = g_list_append(klass->formal_params, g_object_ref (param)); + + i++; + } +} + +gboolean +dia_uml_class_is_template (DiaUmlClass *klass) +{ + return klass->is_template; +} + +GListModel * +dia_uml_class_get_attributes (DiaUmlClass *self) +{ + return G_LIST_MODEL (self->attributes); +} + +GListModel * +dia_uml_class_get_operations (DiaUmlClass *self) +{ + return G_LIST_MODEL (self->operations); +} + +GListModel * +dia_uml_class_get_formal_parameters (DiaUmlClass *self) +{ + return G_LIST_MODEL (self->formal_params); +} + +/* + * Don't rely on these six being called! + * + * The DiaListStore can/will be edited directly (e.g. by DiaUmlClassEditor) + * so connect to items-changed if you want to observe these! + */ + +void +dia_uml_class_insert_operation (DiaUmlClass *self, + DiaUmlOperation *operation, + int index) +{ + dia_list_store_insert (self->operations, DIA_LIST_DATA (operation), index); +} + +void +dia_uml_class_remove_operation (DiaUmlClass *self, + DiaUmlOperation *operation) +{ + dia_list_store_remove (self->operations, DIA_LIST_DATA (operation)); +} + +void +dia_uml_class_insert_attribute (DiaUmlClass *self, + DiaUmlAttribute *attribute, + int index) +{ + dia_list_store_insert (self->attributes, DIA_LIST_DATA (attribute), index); +} + +void +dia_uml_class_remove_attribute (DiaUmlClass *self, + DiaUmlAttribute *attribute) +{ + dia_list_store_remove (self->attributes, DIA_LIST_DATA (attribute)); +} + +void +dia_uml_class_insert_formal_parameter (DiaUmlClass *self, + DiaUmlFormalParameter *param, + int index) +{ + dia_list_store_insert (self->formal_params, DIA_LIST_DATA (param), index); +} + +void +dia_uml_class_remove_formal_parameter (DiaUmlClass *self, + DiaUmlFormalParameter *param) +{ + dia_list_store_remove (self->formal_params, DIA_LIST_DATA (param)); +} diff --git a/objects/UML/dia-uml-class.h b/objects/UML/dia-uml-class.h new file mode 100644 index 0000000000000000000000000000000000000000..ab9f61ccaf76b18c4b697588f6cd44c7318202cf --- /dev/null +++ b/objects/UML/dia-uml-class.h @@ -0,0 +1,46 @@ +#include +#include "uml.h" +#include "class.h" +#include "dia-uml-attribute.h" +#include "dia-uml-operation.h" +#include "dia-uml-formal-parameter.h" + +#ifndef UML_CLASS_H +#define UML_CLASS_H + +G_BEGIN_DECLS + +#define DIA_UML_TYPE_CLASS (dia_uml_class_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlClass, dia_uml_class, DIA_UML, CLASS, GObject) + +DiaUmlClass *dia_uml_class_new (UMLClass *klass); +void dia_uml_class_load (DiaUmlClass *self, + UMLClass *klass); +void dia_uml_class_store (DiaUmlClass *self, + UMLClass *klass, + GList **added, + GList **removed, + GList **disconnected); +gboolean dia_uml_class_is_template (DiaUmlClass *klass); +GListModel *dia_uml_class_get_attributes (DiaUmlClass *self); +void dia_uml_class_remove_attribute (DiaUmlClass *self, + DiaUmlAttribute *attribute); +void dia_uml_class_insert_attribute (DiaUmlClass *self, + DiaUmlAttribute *attribute, + int index); +GListModel *dia_uml_class_get_operations (DiaUmlClass *self); +void dia_uml_class_remove_operation (DiaUmlClass *self, + DiaUmlOperation *operation); +void dia_uml_class_insert_operation (DiaUmlClass *self, + DiaUmlOperation *operation, + int index); +GListModel *dia_uml_class_get_formal_parameters (DiaUmlClass *self); +void dia_uml_class_remove_formal_parameter (DiaUmlClass *self, + DiaUmlFormalParameter *formal); +void dia_uml_class_insert_formal_parameter (DiaUmlClass *self, + DiaUmlFormalParameter *formal, + int index); + +G_END_DECLS + +#endif \ No newline at end of file diff --git a/objects/UML/dia-uml-formal-parameter.c b/objects/UML/dia-uml-formal-parameter.c new file mode 100644 index 0000000000000000000000000000000000000000..da5717717578f89bd575470e853ec50897005830 --- /dev/null +++ b/objects/UML/dia-uml-formal-parameter.c @@ -0,0 +1,230 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * umlformalparameter.c : refactored from uml.c, class.c to final use StdProps + * PROP_TYPE_DARRAY, a list where each element is a set + * of properies described by the same StdPropDesc + * Copyright (C) 2005 Hans Breuer + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "uml.h" +#include "properties.h" +#include "dia-uml-formal-parameter.h" +#include "list/dia-list-data.h" + +static PropDescription umlformalparameter_props[] = { + { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Name"), NULL, NULL }, + { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Type"), NULL, NULL }, + + PROP_DESC_END +}; + +static PropOffset umlformalparameter_offsets[] = { + { "name", PROP_TYPE_STRING, offsetof(DiaUmlFormalParameter, name) }, + { "type", PROP_TYPE_STRING, offsetof(DiaUmlFormalParameter, type) }, + { NULL, 0, 0 }, +}; + +PropDescDArrayExtra umlformalparameter_extra = { + { umlformalparameter_props, umlformalparameter_offsets, "umlformalparameter" }, + (NewRecordFunc) dia_uml_formal_parameter_new, + (FreeRecordFunc) g_object_unref +}; + + +static void +dia_uml_formal_parameter_list_data_init (DiaListDataInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (DiaUmlFormalParameter, dia_uml_formal_parameter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DIA_TYPE_LIST_DATA, + dia_uml_formal_parameter_list_data_init)) + +enum { + PROP_NAME = 1, + PROP_TYPE, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + + +static void +dia_uml_formal_parameter_finalize (GObject *object) +{ + DiaUmlFormalParameter *self = DIA_UML_FORMAL_PARAMETER (object); + + g_free (self->name); + g_free (self->type); +} + + +static void +dia_uml_formal_parameter_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlFormalParameter *self = DIA_UML_FORMAL_PARAMETER (object); + + switch (property_id) { + case PROP_NAME: + self->name = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_NAME]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case PROP_TYPE: + self->type = g_value_dup_string (value); + g_object_notify_by_pspec (object, properties[PROP_TYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_formal_parameter_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlFormalParameter *self = DIA_UML_FORMAL_PARAMETER (object); + + switch (property_id) { + case PROP_NAME: + g_value_set_string (value, self->name); + break; + case PROP_TYPE: + g_value_set_string (value, self->type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static const gchar * +format (DiaListData *self) +{ + return dia_uml_formal_parameter_format (DIA_UML_FORMAL_PARAMETER (self)); +} + +static void +dia_uml_formal_parameter_list_data_init (DiaListDataInterface *iface) +{ + iface->format = format; +} + +static void +dia_uml_formal_parameter_class_init (DiaUmlFormalParameterClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_uml_formal_parameter_finalize; + object_class->set_property = dia_uml_formal_parameter_set_property; + object_class->get_property = dia_uml_formal_parameter_get_property; + + properties[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Parameter name", + "", + G_PARAM_READWRITE); + properties[PROP_TYPE] = g_param_spec_string ("type", + "Type", + "Formal parameter type", + "", + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); +} + +static void +dia_uml_formal_parameter_init (DiaUmlFormalParameter *self) +{ + self->name = g_strdup (""); + self->type = g_strdup (""); +} + +DiaUmlFormalParameter * +dia_uml_formal_parameter_new () +{ + return g_object_new (DIA_UML_TYPE_FORMAL_PARAMETER, NULL); +} + +DiaUmlFormalParameter * +dia_uml_formal_parameter_copy (DiaUmlFormalParameter *param) +{ + DiaUmlFormalParameter *newparam; + + newparam = g_object_new (DIA_UML_TYPE_FORMAL_PARAMETER, NULL); + + newparam->name = g_strdup(param->name); + newparam->type = g_strdup(param->type); + + return newparam; +} + +void +uml_formalparameter_write(AttributeNode attr_node, DiaUmlFormalParameter *param, + DiaContext *ctx) +{ + DataNode composite; + + composite = data_add_composite(attr_node, "umlformalparameter", ctx); + + data_add_string(composite_add_attribute(composite, "name"), + param->name, ctx); + data_add_string(composite_add_attribute(composite, "type"), + param->type, ctx); +} + +gchar * +dia_uml_formal_parameter_format (DiaUmlFormalParameter *parameter) +{ + int len; + char *str; + + /* Calculate length: */ + len = parameter->name ? strlen (parameter->name) : 0; + + if (strlen (parameter->type) > 0) { + len += 1 + strlen (parameter->type); + } + + /* Generate string: */ + str = g_malloc (sizeof (char) * (len + 1)); + strcpy (str, parameter->name ? parameter->name : ""); + if (strlen (parameter->type) > 0) { + strcat (str, ":"); + strcat (str, parameter->type); + } + + g_assert (strlen (str) == len); + + return str; +} + diff --git a/objects/UML/dia-uml-formal-parameter.h b/objects/UML/dia-uml-formal-parameter.h new file mode 100644 index 0000000000000000000000000000000000000000..09e1447b5406ecb5cd66dd23740d5f79df47cd5d --- /dev/null +++ b/objects/UML/dia-uml-formal-parameter.h @@ -0,0 +1,27 @@ +#include +#include "uml.h" + +#ifndef UML_FP_H +#define UML_FP_H + +#define DIA_UML_TYPE_FORMAL_PARAMETER (dia_uml_formal_parameter_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlFormalParameter, dia_uml_formal_parameter, DIA_UML, FORMAL_PARAMETER, GObject) + +/** \brief A list of UMLFormalParameter is contained in DiaUmlOperation + * Some would call them template parameters ;) + */ +struct _DiaUmlFormalParameter { + GObject parent; + + gchar *name; /**< name */ + gchar *type; /**< Can be NULL => Type parameter */ +}; + +DiaUmlFormalParameter *dia_uml_formal_parameter_new (void); +/** calculated the 'formated' representation */ +gchar *dia_uml_formal_parameter_format (DiaUmlFormalParameter *self); +DiaUmlFormalParameter *dia_uml_formal_parameter_copy (DiaUmlFormalParameter *self); + +void uml_formalparameter_write(AttributeNode attr_node, DiaUmlFormalParameter *param, DiaContext *ctx); + +#endif diff --git a/objects/UML/dia-uml-operation.c b/objects/UML/dia-uml-operation.c new file mode 100644 index 0000000000000000000000000000000000000000..36548e028254960a53ea0a53e6fdea4221509e0d --- /dev/null +++ b/objects/UML/dia-uml-operation.c @@ -0,0 +1,696 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * umloperation.c : refactored from uml.c, class.c to final use StdProps + * PROP_TYPE_DARRAY, a list where each element is a set + * of properies described by the same StdPropDesc + * Copyright (C) 2005 Hans Breuer + * + * 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. + */ + +/* + +classType = dia.get_object_type ("UML - Class") +operType = dia.get_object_type ("UML - Operation") +paramType = dia.get_object_type ("UML - Parameter") +for c in theClasses : + klass, h1, h2 = classType.create (0,0) # p.x, p.y + for f in theFunctions : + oper, _h1, _h2 = operType.create (0,0) + oper.properties["name"] = f.name + oper.properties["type"] = f.type + + for p in f.parameters : + param, _h1, _h2 = paramType.create(0,0) + param.properties["name"] = p.name + param.properties["type"] = p.type + + oper.insert(param, -1) + klass.insert(oper, -1) + layer.add_object(klass) + + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "uml.h" +#include "properties.h" +#include "dia-uml-operation.h" +#include "list/dia-list-data.h" +#include "list/dia-list-store.h" + +static void +dia_uml_operation_list_data_init (DiaListDataInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (DiaUmlOperation, dia_uml_operation, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DIA_TYPE_LIST_DATA, + dia_uml_operation_list_data_init)) + +enum { + UML_OP_NAME = 1, + UML_OP_TYPE, + UML_OP_COMMENT, + UML_OP_STEREOTYPE, + UML_OP_VISIBILITY, + UML_OP_INHERITANCE_TYPE, + UML_OP_QUERY, + UML_OP_CLASS_SCOPE, + UML_OP_N_PROPS +}; +static GParamSpec* uml_op_properties[UML_OP_N_PROPS]; + +extern PropEnumData _uml_visibilities[]; +extern PropEnumData _uml_inheritances[]; + +static PropDescription umloperation_props[] = { + { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Name"), NULL, NULL }, + { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Type"), NULL, NULL }, + { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Comment"), NULL, NULL }, + { "stereotype", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Stereotype"), NULL, NULL }, + /* visibility: public, protected, private (other languages?) */ + { "visibility", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Visibility"), NULL, _uml_visibilities }, + { "inheritance_type", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Inheritance"), NULL, _uml_inheritances }, + { "query", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Query"), NULL, N_("C++ const method") }, + { "class_scope", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Scope"), NULL, N_("Class scope (C++ static method)") }, + { "parameters", PROP_TYPE_DARRAY, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Parameters"), NULL, NULL }, + + PROP_DESC_END +}; + +static PropOffset umloperation_offsets[] = { + { "name", PROP_TYPE_STRING, offsetof(DiaUmlOperation, name) }, + { "type", PROP_TYPE_STRING, offsetof(DiaUmlOperation, type) }, + { "comment", PROP_TYPE_MULTISTRING, offsetof(DiaUmlOperation, comment) }, + { "stereotype", PROP_TYPE_STRING, offsetof(DiaUmlOperation, stereotype) }, + { "visibility", PROP_TYPE_ENUM, offsetof(DiaUmlOperation, visibility) }, + { "inheritance_type", PROP_TYPE_ENUM, offsetof(DiaUmlOperation, inheritance_type) }, + { "query", PROP_TYPE_BOOL, offsetof(DiaUmlOperation, query) }, + { "class_scope", PROP_TYPE_BOOL, offsetof(DiaUmlOperation, class_scope) }, + { "parameters", PROP_TYPE_DARRAY, offsetof(DiaUmlOperation, parameters_hack) }, + { NULL, 0, 0 }, +}; + +PropDescDArrayExtra umloperation_extra = { + { umloperation_props, umloperation_offsets, "umloperation" }, + (NewRecordFunc) dia_uml_operation_new, + (FreeRecordFunc) g_object_unref +}; + +DiaUmlOperation * +dia_uml_operation_copy (DiaUmlOperation *srcop) +{ + DiaUmlOperation *destop; + GListModel *params; + DiaUmlParameter *newparam; + DiaListData *itm; + int i = 0; + + destop = g_object_new (DIA_UML_TYPE_OPERATION, NULL); + + destop->internal_id = srcop->internal_id; + + if (destop->name != NULL) { + g_free(destop->name); + } + destop->name = g_strdup(srcop->name); + + if (destop->type != NULL) { + g_free(destop->type); + } + if (srcop->type != NULL) { + destop->type = g_strdup(srcop->type); + } else { + destop->type = NULL; + } + + if (destop->stereotype != NULL) { + g_free(destop->stereotype); + } + if(srcop->stereotype != NULL) { + destop->stereotype = g_strdup(srcop->stereotype); + } else { + destop->stereotype = NULL; + } + + if (destop->comment != NULL) { + g_free(destop->comment); + } + if (srcop->comment != NULL) { + destop->comment = g_strdup(srcop->comment); + } else { + destop->comment = NULL; + } + + destop->visibility = srcop->visibility; + destop->class_scope = srcop->class_scope; + destop->inheritance_type = srcop->inheritance_type; + destop->query = srcop->query; + + params = dia_uml_operation_get_parameters (srcop); + while ((itm = g_list_model_get_item (params, i))) { + DiaUmlParameter *param = DIA_UML_PARAMETER (itm); + + newparam = dia_uml_parameter_new (); + newparam->name = g_strdup(param->name); + newparam->type = g_strdup(param->type); + newparam->comment = g_strdup(param->comment); + newparam->value = g_strdup(param->value); + newparam->kind = param->kind; + + dia_uml_operation_insert_parameter (destop, newparam, i); + + i++; + } + + return destop; + +#if 0 /* setup elsewhere */ + newop->left_connection = g_new0(ConnectionPoint,1); + *newop->left_connection = *op->left_connection; + newop->left_connection->object = NULL; /* must be setup later */ + + newop->right_connection = g_new0(ConnectionPoint,1); + *newop->right_connection = *op->right_connection; + newop->right_connection->object = NULL; /* must be setup later */ +#endif +} + +void +uml_operation_write(AttributeNode attr_node, DiaUmlOperation *op, DiaContext *ctx) +{ + GListModel *params; + DiaUmlParameter *param; + DataNode composite; + DataNode composite2; + AttributeNode attr_node2; + DiaListData *itm; + int i = 0; + + composite = data_add_composite(attr_node, "umloperation", ctx); + + data_add_string(composite_add_attribute(composite, "name"), + op->name, ctx); + data_add_string(composite_add_attribute(composite, "stereotype"), + op->stereotype, ctx); + data_add_string(composite_add_attribute(composite, "type"), + op->type, ctx); + data_add_enum(composite_add_attribute(composite, "visibility"), + op->visibility, ctx); + data_add_string(composite_add_attribute(composite, "comment"), + op->comment, ctx); + /* Backward compatibility */ + data_add_boolean(composite_add_attribute(composite, "abstract"), + op->inheritance_type == UML_ABSTRACT, ctx); + data_add_enum(composite_add_attribute(composite, "inheritance_type"), + op->inheritance_type, ctx); + data_add_boolean(composite_add_attribute(composite, "query"), + op->query, ctx); + data_add_boolean(composite_add_attribute(composite, "class_scope"), + op->class_scope, ctx); + + attr_node2 = composite_add_attribute(composite, "parameters"); + + params = dia_uml_operation_get_parameters (op); + while ((itm = g_list_model_get_item (params, i))) { + param = DIA_UML_PARAMETER (itm); + + composite2 = data_add_composite(attr_node2, "umlparameter", ctx); + + data_add_string(composite_add_attribute(composite2, "name"), + param->name, ctx); + data_add_string(composite_add_attribute(composite2, "type"), + param->type, ctx); + data_add_string(composite_add_attribute(composite2, "value"), + param->value, ctx); + data_add_string(composite_add_attribute(composite2, "comment"), + param->comment, ctx); + data_add_enum(composite_add_attribute(composite2, "kind"), + param->kind, ctx); + i++; + } +} + +extern char visible_char[]; + +char * +dia_uml_operation_format (DiaUmlOperation *operation) +{ + int len; + char *str; + DiaListData *itm; + int i = 0; + gboolean first = TRUE; + GListModel *params; + + /* Calculate length: */ + len = 1 + (operation->name ? strlen (operation->name) : 0) + 1; + if(operation->stereotype != NULL && operation->stereotype[0] != '\0') { + len += 5 + strlen (operation->stereotype); + } + + first = TRUE; + params = dia_uml_operation_get_parameters (operation); + while ((itm = g_list_model_get_item (params, i))) { + DiaUmlParameter *param = DIA_UML_PARAMETER (itm); + i++; + + if (!first) { + len += 1; /* ',' */ + } + first = FALSE; + + switch(param->kind) + { + case UML_UNDEF_KIND: + break; + case UML_IN: + len += 3; + break; + case UML_OUT: + len += 4; + break; + case UML_INOUT: + len += 6; + break; + } + len += (param->name ? strlen (param->name) : 0); + if (param->type != NULL) { + len += strlen (param->type); + if (param->type[0] && (param->name != NULL && param->name[0])) { + len += 1; + } + } + if (param->value != NULL && param->value[0] != '\0') { + len += 1 + strlen (param->value); + } + } + + len += 1; /* ')' */ + if (operation->type != NULL && operation->type[0]) { + len += 2 + strlen (operation->type); + } + if(operation->query != 0) { + len += 6; + } + + /* generate string: */ + str = g_malloc (sizeof (char) * (len + 1)); + + str[0] = visible_char[(int) operation->visibility]; + str[1] = 0; + + if(operation->stereotype != NULL && operation->stereotype[0] != '\0') { + strcat(str, UML_STEREOTYPE_START); + strcat(str, operation->stereotype); + strcat(str, UML_STEREOTYPE_END); + strcat(str, " "); + } + + strcat (str, operation->name ? operation->name : ""); + strcat (str, "("); + + i = 0; + first = TRUE; + while ((itm = g_list_model_get_item (params, i))) { + DiaUmlParameter *param = DIA_UML_PARAMETER (itm); + i++; + + if (!first) { + strcat (str, ","); + } + first = FALSE; + + switch(param->kind) + { + case UML_UNDEF_KIND: + break; + case UML_IN: + strcat (str, "in "); + break; + case UML_OUT: + strcat (str, "out "); + break; + case UML_INOUT: + strcat (str, "inout "); + break; + } + strcat (str, param->name ? param->name : ""); + + if (param->type != NULL) { + if (param->type[0] && (param->name != NULL && param->name[0])) { + strcat (str, ":"); + } + strcat (str, param->type); + } + + if (param->value != NULL && param->value[0] != '\0') { + strcat (str, "="); + strcat (str, param->value); + } + } + strcat (str, ")"); + + if (operation->type != NULL && + operation->type[0]) { + strcat (str, ": "); + strcat (str, operation->type); + } + + if (operation->query != 0) { + strcat(str, " const"); + } + + g_assert_cmpint (strlen (str), ==, len); + + return str; +} + +/*! + * The ownership of these connection points is quite complicated. Instead of being part of + * the DiaUmlOperation as one may expect at first, they are somewhat in between the DiaObject + * (see: DiaObject::connections and the concrete user, here UMLClass) and the DiaUmlOperation. + * + * But with taking undo state mangement into account it gets even worse. Deleted (to be + * restored connection points) live inside the UMLClassChange until they get reverted back + * to the object *or* get free'd by umlclass_change_free() + * + * Since the implementation of attributes/operations being settable via StdProps there are + * more places to keep this stuff consitent. So here comes a tolerant helper. + * + * NOTE: Same function as uml_attribute_ensure_connection_points(), + * with C++ it would be a template function ;) + */ +void +dia_uml_operation_ensure_connection_points (DiaUmlOperation* op, DiaObject* obj) +{ + if (!op->l_connection) + op->l_connection = g_new0(ConnectionPoint,1); + op->l_connection->object = obj; + if (!op->r_connection) + op->r_connection = g_new0(ConnectionPoint,1); + op->r_connection->object = obj; +} + +/* No idea why this is needed */ +void +dia_uml_operation_connection_thing (DiaUmlOperation *self, + DiaUmlOperation *from) +{ + /* Looks wrong but is required for the complicate connections memory management */ + self->l_connection = from->l_connection; + self->r_connection = from->r_connection; +} + +static void +dia_uml_operation_finalize (GObject *object) +{ + DiaUmlOperation *self = DIA_UML_OPERATION (object); + + g_free (self->name); + g_free (self->type); + g_free (self->stereotype); + g_free (self->comment); + + g_clear_object (&self->parameters); + if (self->wrappos) { + g_list_free (self->wrappos); + } + g_list_free_full (self->parameters_hack, g_object_unref); + + /* freed elsewhere */ + /* These are merely temporary reminders, don't need to unconnect */ + /* + g_free(op->left_connection); + g_free(op->right_connection); + */ +} + +static void +dia_uml_operation_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperation *self = DIA_UML_OPERATION (object); + + switch (property_id) { + case UML_OP_NAME: + self->name = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_NAME]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_TYPE: + self->type = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_TYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_COMMENT: + self->comment = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_COMMENT]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_STEREOTYPE: + self->stereotype = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_STEREOTYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_VISIBILITY: + self->visibility = g_value_get_int (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_VISIBILITY]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_INHERITANCE_TYPE: + self->inheritance_type = g_value_get_int (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_INHERITANCE_TYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_QUERY: + self->query = g_value_get_boolean (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_QUERY]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_OP_CLASS_SCOPE: + self->class_scope = g_value_get_boolean (value); + g_object_notify_by_pspec (object, uml_op_properties[UML_OP_CLASS_SCOPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_operation_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperation *self = DIA_UML_OPERATION (object); + + switch (property_id) { + case UML_OP_NAME: + g_value_set_string (value, self->name); + break; + case UML_OP_TYPE: + g_value_set_string (value, self->type); + break; + case UML_OP_COMMENT: + g_value_set_string (value, self->comment); + break; + case UML_OP_STEREOTYPE: + g_value_set_string (value, self->stereotype); + break; + case UML_OP_VISIBILITY: + g_value_set_int (value, self->visibility); + break; + case UML_OP_INHERITANCE_TYPE: + g_value_set_int (value, self->inheritance_type); + break; + case UML_OP_QUERY: + g_value_set_boolean (value, self->query); + break; + case UML_OP_CLASS_SCOPE: + g_value_set_boolean (value, self->class_scope); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static const gchar * +format (DiaListData *self) +{ + return dia_uml_operation_format (DIA_UML_OPERATION (self)); +} + +static void +dia_uml_operation_list_data_init (DiaListDataInterface *iface) +{ + iface->format = format; +} + +static void +dia_uml_operation_class_init (DiaUmlOperationClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_uml_operation_finalize; + object_class->set_property = dia_uml_operation_set_property; + object_class->get_property = dia_uml_operation_get_property; + + uml_op_properties[UML_OP_NAME] = g_param_spec_string ("name", + "Name", + "Function name", + "", + G_PARAM_READWRITE); + uml_op_properties[UML_OP_TYPE] = g_param_spec_string ("type", + "Type", + "Return type", + "", + G_PARAM_READWRITE); + uml_op_properties[UML_OP_COMMENT] = g_param_spec_string ("comment", + "Comment", + "Comment", + "", + G_PARAM_READWRITE); + uml_op_properties[UML_OP_STEREOTYPE] = g_param_spec_string ("stereotype", + "Stereotype", + "Stereotype", + "", + G_PARAM_READWRITE); + uml_op_properties[UML_OP_VISIBILITY] = g_param_spec_int ("visibility", + "Visibility", + "Visibility", + UML_PUBLIC, + UML_IMPLEMENTATION, + UML_PUBLIC, + G_PARAM_READWRITE); + uml_op_properties[UML_OP_INHERITANCE_TYPE] = g_param_spec_int ("inheritance-type", + "Inheritance type", + "Inheritance type", + UML_ABSTRACT, + UML_LEAF, + UML_LEAF, + G_PARAM_READWRITE); + uml_op_properties[UML_OP_QUERY] = g_param_spec_boolean ("query", + "Query", + "Const function", + FALSE, + G_PARAM_READWRITE); + uml_op_properties[UML_OP_CLASS_SCOPE] = g_param_spec_boolean ("class-scope", + "Class scope", + "Class scope", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + UML_OP_N_PROPS, + uml_op_properties); +} + +static void +bubble (DiaListStore *store, + DiaListData *itm, + DiaUmlOperation *self) +{ + dia_list_data_changed (DIA_LIST_DATA (self)); +} + +static void +items_changed (GListModel *list, + guint position, + guint removed, + guint added, + DiaUmlOperation *self) +{ + dia_list_data_changed (DIA_LIST_DATA (self)); +} + +static void +dia_uml_operation_init (DiaUmlOperation *self) +{ + static gint next_id = 1; + + self->internal_id = next_id++; + + self->name = g_strdup(""); + self->comment = g_strdup(""); + self->type = g_strdup(""); + self->stereotype = g_strdup(""); + self->visibility = UML_PUBLIC; + self->inheritance_type = UML_LEAF; + self->parameters = dia_list_store_new (); + g_signal_connect (self->parameters, "changed", + G_CALLBACK (bubble), self); + g_signal_connect (self->parameters, "items-changed", + G_CALLBACK (items_changed), self); +} + +DiaUmlOperation * +dia_uml_operation_new () +{ + return g_object_new (DIA_UML_TYPE_OPERATION, NULL); +} + +void +dia_uml_operation_insert_parameter (DiaUmlOperation *self, + DiaUmlParameter *parameter, + int index) +{ + dia_list_store_insert (self->parameters, DIA_LIST_DATA (parameter), index); +} + +void +dia_uml_operation_remove_parameter (DiaUmlOperation *self, + DiaUmlParameter *parameter) +{ + dia_list_store_remove (self->parameters, DIA_LIST_DATA (parameter)); +} + +GListModel * +dia_uml_operation_get_parameters (DiaUmlOperation *self) +{ + /* Instead of teaching Dia how to read into a DiaListStore we have this hack */ + if (g_list_model_get_n_items (G_LIST_MODEL (self->parameters)) == 0 && self->parameters_hack) { + GList *list = self->parameters_hack; + while (list) { + GObject *itm = list->data; + + dia_list_store_add (self->parameters, DIA_LIST_DATA (itm)); + + list = g_list_next (list); + } + g_list_free_full (self->parameters_hack, g_object_unref); + self->parameters_hack = NULL; + } + return G_LIST_MODEL (self->parameters); +} diff --git a/objects/UML/dia-uml-operation.h b/objects/UML/dia-uml-operation.h new file mode 100644 index 0000000000000000000000000000000000000000..e61cbf1b45a797bf7e41183a7f5ce37bb7c68bbe --- /dev/null +++ b/objects/UML/dia-uml-operation.h @@ -0,0 +1,66 @@ +#include +#include "uml.h" +#include "dia-uml-parameter.h" +#include "list/dia-list-store.h" + +#ifndef UML_OP_H +#define UML_OP_H + +/** In some languages there are different kinds of class inheritances */ +typedef enum _UMLInheritanceType { + UML_ABSTRACT, /**< Pure virtual method: an object of this class cannot be instanciated */ + UML_POLYMORPHIC, /**< Virtual method : could be reimplemented in derivated classes */ + UML_LEAF /**< Final method: can't be redefined in subclasses */ +} UMLInheritanceType; + +#define DIA_UML_TYPE_OPERATION (dia_uml_operation_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlOperation, dia_uml_operation, DIA_UML, OPERATION, GObject) + +/** \brief A list of DiaUmlOperation is contained in UMLClass + * Some would call them member functions ;) + */ +struct _DiaUmlOperation { + GObject parent; + + gint internal_id; /**< Arbitrary integer to recognize operations after + * the user has shuffled them in the dialog. */ + gchar *name; /**< the function name */ + gchar *type; /**< Return type, NULL => No return type */ + gchar *comment; /**< comment */ + gchar *stereotype; /**< just some string */ + UMLVisibility visibility; /**< allowed access */ + UMLInheritanceType inheritance_type; + int query; /**< Do not modify the object, in C++ this is a const function */ + int class_scope; + DiaListStore *parameters; /**< List of DiaUmlParameter */ + GList *parameters_hack; + + ConnectionPoint* l_connection; /**< left */ + ConnectionPoint* r_connection; /**< right */ + + gboolean needs_wrapping; /** Whether this operation needs wrapping */ + gint wrap_indent; /** The amount of indentation in chars */ + GList *wrappos; /** Absolute wrapping positions */ + double ascent; /** The ascent amount used for line distance in wrapping */ +}; + +DiaUmlOperation *dia_uml_operation_new (void); +/** calculated the 'formated' representation */ +gchar *dia_uml_operation_format (DiaUmlOperation *operation); +/* TODO: Why */ +DiaUmlOperation *dia_uml_operation_copy (DiaUmlOperation *op); +void dia_uml_operation_ensure_connection_points (DiaUmlOperation *oper, + DiaObject *obj); +void dia_uml_operation_connection_thing (DiaUmlOperation *self, + DiaUmlOperation *from); +void dia_uml_operation_insert_parameter (DiaUmlOperation *self, + DiaUmlParameter *parameter, + int index); +void dia_uml_operation_remove_parameter (DiaUmlOperation *self, + DiaUmlParameter *parameter); +GListModel *dia_uml_operation_get_parameters (DiaUmlOperation *self); + +void uml_operation_write(AttributeNode attr_node, DiaUmlOperation *op, DiaContext *ctx); + + +#endif \ No newline at end of file diff --git a/objects/UML/dia-uml-parameter.c b/objects/UML/dia-uml-parameter.c new file mode 100644 index 0000000000000000000000000000000000000000..ea757dce456670bc1849e722c8c25cf63253907a --- /dev/null +++ b/objects/UML/dia-uml-parameter.c @@ -0,0 +1,310 @@ +/* Dia -- an diagram creation/manipulation program + * Copyright (C) 1998 Alexander Larsson + * + * umlparameter.c : refactored from uml.c, class.c to final use StdProps + * PROP_TYPE_DARRAY, a list where each element is a set + * of properies described by the same StdPropDesc + * Copyright (C) 2005 Hans Breuer + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "dia-uml-parameter.h" +#include "list/dia-list-data.h" +#include "properties.h" + +static void +dia_uml_parameter_list_data_init (DiaListDataInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (DiaUmlParameter, dia_uml_parameter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DIA_TYPE_LIST_DATA, + dia_uml_parameter_list_data_init)) + +enum { + UML_PARA_NAME = 1, + UML_PARA_TYPE, + UML_PARA_VALUE, + UML_PARA_COMMENT, + UML_PARA_KIND, + UML_PARA_N_PROPS +}; +static GParamSpec* uml_para_properties[UML_PARA_N_PROPS]; + +static PropEnumData _uml_parameter_kinds[] = { + { N_("Undefined"), UML_UNDEF_KIND} , + { N_("In"), UML_IN }, + { N_("Out"), UML_OUT }, + { N_("In & Out"), UML_INOUT }, + { NULL, 0 } +}; + +static PropDescription umlparameter_props[] = { + { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Name"), NULL, NULL }, + { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Type"), NULL, NULL }, + { "value", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Value"), NULL, NULL }, + { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Comment"), NULL, NULL }, + { "kind", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, + N_("Kind"), NULL, _uml_parameter_kinds }, + + PROP_DESC_END +}; + +static PropOffset umlparameter_offsets[] = { + { "name", PROP_TYPE_STRING, offsetof(DiaUmlParameter, name) }, + { "type", PROP_TYPE_STRING, offsetof(DiaUmlParameter, type) }, + { "value", PROP_TYPE_STRING, offsetof(DiaUmlParameter, value) }, + { "comment", PROP_TYPE_MULTISTRING, offsetof(DiaUmlParameter, comment) }, + { "kind", PROP_TYPE_ENUM, offsetof(DiaUmlParameter, kind) }, + { NULL, 0, 0 }, +}; + +PropDescDArrayExtra umlparameter_extra = { + { umlparameter_props, umlparameter_offsets, "umlparameter" }, + (NewRecordFunc) dia_uml_parameter_new, + (FreeRecordFunc) g_object_unref +}; + +char * +dia_uml_parameter_format (DiaUmlParameter *param) +{ + int len; + char *str; + + /* Calculate length: */ + len = strlen (param->name); + + if (strlen (param->type) > 0) { + len += 1 + strlen (param->type) ; + } + + if (strlen (param->value) > 0) { + len += 1 + strlen (param->value) ; + } + + switch(param->kind) + { + case UML_UNDEF_KIND: + break; + case UML_IN: + len += 3; + break; + case UML_OUT: + len += 4; + break; + case UML_INOUT: + len += 6; + break; + } + + /* Generate string: */ + str = g_malloc (sizeof (char) * (len + 1)); + + strcpy(str, ""); + + switch(param->kind) + { + case UML_UNDEF_KIND: + break; + case UML_IN: + strcat (str, "in "); + break; + case UML_OUT: + strcat (str, "out "); + break; + case UML_INOUT: + strcat (str, "inout "); + break; + } + + + strcat (str, param->name); + + if (strlen (param->type) > 0) { + strcat (str, ":"); + strcat (str, param->type); + } + + if (strlen (param->value) > 0) { + strcat (str, "="); + strcat (str, param->value); + } + + g_assert (strlen (str) == len); + + return str; +} + +static void +dia_uml_parameter_finalize (GObject *object) +{ + DiaUmlParameter *self = DIA_UML_PARAMETER (object); + + g_free (self->name); + g_free (self->type); + if (self->value != NULL) + g_free (self->value); + g_free (self->comment); +} + +static void +dia_uml_parameter_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlParameter *self = DIA_UML_PARAMETER (object); + + switch (property_id) { + case UML_PARA_NAME: + self->name = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_para_properties[UML_PARA_NAME]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_PARA_TYPE: + self->type = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_para_properties[UML_PARA_TYPE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_PARA_VALUE: + self->value = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_para_properties[UML_PARA_VALUE]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_PARA_COMMENT: + self->comment = g_value_dup_string (value); + g_object_notify_by_pspec (object, uml_para_properties[UML_PARA_COMMENT]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + case UML_PARA_KIND: + self->kind = g_value_get_int (value); + g_object_notify_by_pspec (object, uml_para_properties[UML_PARA_KIND]); + dia_list_data_changed (DIA_LIST_DATA (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_parameter_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlParameter *self = DIA_UML_PARAMETER (object); + + switch (property_id) { + case UML_PARA_NAME: + g_value_set_string (value, self->name); + break; + case UML_PARA_TYPE: + g_value_set_string (value, self->type); + break; + case UML_PARA_VALUE: + g_value_set_string (value, self->value); + break; + case UML_PARA_COMMENT: + g_value_set_string (value, self->comment); + break; + case UML_PARA_KIND: + g_value_set_int (value, self->kind); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static const gchar * +format (DiaListData *self) +{ + return dia_uml_parameter_format (DIA_UML_PARAMETER (self)); +} + +static void +dia_uml_parameter_list_data_init (DiaListDataInterface *iface) +{ + iface->format = format; +} + +static void +dia_uml_parameter_class_init (DiaUmlParameterClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = dia_uml_parameter_finalize; + object_class->set_property = dia_uml_parameter_set_property; + object_class->get_property = dia_uml_parameter_get_property; + + uml_para_properties[UML_PARA_NAME] = g_param_spec_string ("name", + "Name", + "Function name", + "", + G_PARAM_READWRITE); + uml_para_properties[UML_PARA_TYPE] = g_param_spec_string ("type", + "Type", + "Return type", + "", + G_PARAM_READWRITE); + uml_para_properties[UML_PARA_VALUE] = g_param_spec_string ("value", + "Value", + "Default value", + "", + G_PARAM_READWRITE); + uml_para_properties[UML_PARA_COMMENT] = g_param_spec_string ("comment", + "Comment", + "Comment", + "", + G_PARAM_READWRITE); + uml_para_properties[UML_PARA_KIND] = g_param_spec_int ("kind", + "Kind", + "Parameter type", + UML_UNDEF_KIND, + UML_INOUT, + UML_UNDEF_KIND, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + UML_PARA_N_PROPS, + uml_para_properties); +} + +static void +dia_uml_parameter_init (DiaUmlParameter *self) +{ + self->name = g_strdup(""); + self->type = g_strdup(""); + self->comment = g_strdup(""); + self->value = g_strdup(""); + self->kind = UML_UNDEF_KIND; +} + +DiaUmlParameter * +dia_uml_parameter_new () +{ + return g_object_new (DIA_UML_TYPE_PARAMETER, NULL); +} + diff --git a/objects/UML/dia-uml-parameter.h b/objects/UML/dia-uml-parameter.h new file mode 100644 index 0000000000000000000000000000000000000000..e0064724e8b137a31416390e50589f363646cd2c --- /dev/null +++ b/objects/UML/dia-uml-parameter.h @@ -0,0 +1,34 @@ +#include + +#ifndef UML_PARAM_H +#define UML_PARAM_H + +/** describes the data flow between caller and callee */ +typedef enum _UMLParameterKind { + UML_UNDEF_KIND, /**< not defined */ + UML_IN, /**< by value */ + UML_OUT, /**< by ref, can be passed in uninitialized */ + UML_INOUT /**< by ref */ +} UMLParameterKind; + +#define DIA_UML_TYPE_PARAMETER (dia_uml_parameter_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlParameter, dia_uml_parameter, DIA_UML, PARAMETER, GObject) + +/** \brief A list of DiaUmlParameter is contained in DiaUmlOperation + * Some would call them functions parameters ;) + */ +struct _DiaUmlParameter { + GObject parent; + + gchar *name; /**< name*/ + gchar *type; /**< return value */ + gchar *value; /**< Initialization, can be NULL => No default value */ + gchar *comment; /**< comment */ + UMLParameterKind kind; /**< Not currently used */ +}; + +DiaUmlParameter *dia_uml_parameter_new (void); +/** calculated the 'formated' representation */ +gchar *dia_uml_parameter_format (DiaUmlParameter *param); + +#endif \ No newline at end of file diff --git a/objects/UML/editor/dia-uml-attribute-dialog.c b/objects/UML/editor/dia-uml-attribute-dialog.c new file mode 100644 index 0000000000000000000000000000000000000000..05e5269283bb5f482f23ba41ec5000972b7bba6a --- /dev/null +++ b/objects/UML/editor/dia-uml-attribute-dialog.c @@ -0,0 +1,203 @@ +#include + +#include "dia-uml-attribute-dialog.h" +#include "dia_dirs.h" +#include "uml.h" + +G_DEFINE_TYPE (DiaUmlAttributeDialog, dia_uml_attribute_dialog, GTK_TYPE_DIALOG) + +enum { + PROP_ATTRIBUTE = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +enum { + ATTRIBUTE_DELETED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +dia_uml_attribute_dialog_finalize (GObject *object) +{ + DiaUmlAttributeDialog *self = DIA_UML_ATTRIBUTE_DIALOG (object); + + g_object_unref (self->attribute); +} + +static gboolean +visibility_to (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + const gchar *name = g_value_get_string (from_value); + + if (g_strcmp0 (name, "private") == 0) { + g_value_set_int (to_value, UML_PRIVATE); + } else if (g_strcmp0 (name, "protected") == 0) { + g_value_set_int (to_value, UML_PROTECTED); + } else if (g_strcmp0 (name, "implementation") == 0) { + g_value_set_int (to_value, UML_IMPLEMENTATION); + } else { + g_value_set_int (to_value, UML_PUBLIC); + } + + return TRUE; +} + +static gboolean +visibility_from (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + int mode = g_value_get_int (from_value); + + if (mode == UML_PRIVATE) { + g_value_set_static_string (to_value, "private"); + } else if (mode == UML_PROTECTED) { + g_value_set_static_string (to_value, "protected"); + } else if (mode == UML_IMPLEMENTATION) { + g_value_set_static_string (to_value, "implementation"); + } else { + g_value_set_static_string (to_value, "public"); + } + + return TRUE; +} + +static void +dia_uml_attribute_dialog_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlAttributeDialog *self = DIA_UML_ATTRIBUTE_DIALOG (object); + + switch (property_id) { + case PROP_ATTRIBUTE: + self->attribute = g_value_dup_object (value); + g_object_bind_property (G_OBJECT (self->attribute), "name", + G_OBJECT (self->name), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->attribute), "type", + G_OBJECT (self->type), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->attribute), "value", + G_OBJECT (self->value), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->attribute), "comment", + G_OBJECT (self->comment), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + + g_object_bind_property_full (G_OBJECT (self->attribute), "visibility", + G_OBJECT (self->visibility), "active-id", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE, + visibility_from, + visibility_to, + NULL, NULL); + + g_object_bind_property (G_OBJECT (self->attribute), "class-scope", + G_OBJECT (self->scope), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_attribute_dialog_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlAttributeDialog *self = DIA_UML_ATTRIBUTE_DIALOG (object); + switch (property_id) { + case PROP_ATTRIBUTE: + g_value_set_object (value, self->attribute); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +remove_attribute (DiaUmlAttributeDialog *self) +{ + g_signal_emit (G_OBJECT (self), + signals[ATTRIBUTE_DELETED], 0, + self->attribute); + gtk_widget_destroy (GTK_WIDGET (self)); +} + +static void +dia_uml_attribute_dialog_class_init (DiaUmlAttributeDialogClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = dia_uml_attribute_dialog_finalize; + object_class->set_property = dia_uml_attribute_dialog_set_property; + object_class->get_property = dia_uml_attribute_dialog_get_property; + + properties[PROP_ATTRIBUTE] = + g_param_spec_object ("attribute", + "Attribute", + "Attribute this editor controls", + DIA_UML_TYPE_ATTRIBUTE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + signals[ATTRIBUTE_DELETED] = g_signal_new ("attribute-deleted", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_UML_TYPE_ATTRIBUTE); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-uml-attribute-dialog.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, name); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, type); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, value); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, comment); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, visibility); + gtk_widget_class_bind_template_child (widget_class, DiaUmlAttributeDialog, scope); + gtk_widget_class_bind_template_callback (widget_class, remove_attribute); + + g_object_unref (template_file); +} + +static void +dia_uml_attribute_dialog_init (DiaUmlAttributeDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GtkWidget * +dia_uml_attribute_dialog_new (GtkWindow *parent, + DiaUmlAttribute *attr) +{ + return g_object_new (DIA_UML_TYPE_ATTRIBUTE_DIALOG, + "attribute", attr, + "transient-for", parent, + "modal", TRUE, + NULL); +} diff --git a/objects/UML/editor/dia-uml-attribute-dialog.h b/objects/UML/editor/dia-uml-attribute-dialog.h new file mode 100644 index 0000000000000000000000000000000000000000..7994c42f0c617609331a14e89d79132687b0a0fa --- /dev/null +++ b/objects/UML/editor/dia-uml-attribute-dialog.h @@ -0,0 +1,22 @@ +#include +#include "uml.h" +#include "dia-uml-attribute.h" + +#define DIA_UML_TYPE_ATTRIBUTE_DIALOG (dia_uml_attribute_dialog_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlAttributeDialog, dia_uml_attribute_dialog, DIA_UML, ATTRIBUTE_DIALOG, GtkDialog) + +struct _DiaUmlAttributeDialog { + GtkDialog parent; + + GtkWidget *name; + GtkWidget *type; + GtkWidget *value; + GtkWidget *visibility; + GtkWidget *scope; + GtkTextBuffer *comment; + + DiaUmlAttribute *attribute; +}; + +GtkWidget *dia_uml_attribute_dialog_new (GtkWindow *parent, + DiaUmlAttribute *attr); diff --git a/objects/UML/editor/dia-uml-class-editor.c b/objects/UML/editor/dia-uml-class-editor.c new file mode 100644 index 0000000000000000000000000000000000000000..060662a52ac47fd713ae920e024842d70f2d251d --- /dev/null +++ b/objects/UML/editor/dia-uml-class-editor.c @@ -0,0 +1,407 @@ +#include "dia-uml-class-editor.h" +#include "list/dia-list-row.h" +#include "list/dia-list-store.h" +#include "dia-uml-operation-dialog.h" +#include "dia-uml-attribute-dialog.h" +#include "dia-uml-formal-parameter-dialog.h" +#include "dia_dirs.h" + +struct _DiaUmlClassEditor { + GtkScrolledWindow parent; + + GtkWidget *name; + GtkWidget *stereotype; + GtkTextBuffer *comment; + GtkWidget *abstract; + GtkWidget *comments; + GtkWidget *comments_wrap_point; + GtkWidget *doc_tag; + + GtkWidget *attr_visible; + GtkWidget *attr_suppress; + GtkWidget *op_visible; + GtkWidget *op_suppress; + GtkWidget *op_wrap; + GtkWidget *op_wrap_point; + GtkWidget *is_template; + + GtkWidget *attributes; + GtkWidget *operations; + GtkWidget *templates; + + DiaUmlClass *klass; +}; + +G_DEFINE_TYPE (DiaUmlClassEditor, dia_uml_class_editor, GTK_TYPE_SCROLLED_WINDOW) + +enum { + UML_CEDIT_PROP_CLASS = 1, + UML_CEDIT_N_PROPS +}; +static GParamSpec* uml_cedit_properties[UML_CEDIT_N_PROPS]; + +static void +build_lists (DiaUmlClassEditor *self) +{ + GListModel *store; + + store = dia_uml_class_get_attributes (self->klass); + gtk_list_box_bind_model (GTK_LIST_BOX (self->attributes), store, + (GtkListBoxCreateWidgetFunc) dia_list_row_new, + store, NULL); + + store = dia_uml_class_get_operations (self->klass); + gtk_list_box_bind_model (GTK_LIST_BOX (self->operations), store, + (GtkListBoxCreateWidgetFunc) dia_list_row_new, + store, NULL); + + store = dia_uml_class_get_formal_parameters (self->klass); + gtk_list_box_bind_model (GTK_LIST_BOX (self->templates), store, + (GtkListBoxCreateWidgetFunc) dia_list_row_new, + store, NULL); +} + +static void +remove_op (DiaUmlOperationDialog *dlg, + DiaUmlOperation *op, + DiaUmlClassEditor *self) +{ + dia_uml_class_remove_operation (self->klass, op); +} + +static void +add_operation (DiaUmlClassEditor *self) +{ + DiaUmlOperation *op; + GtkWidget *edit; + GtkWidget *parent; + + op = dia_uml_operation_new (); + dia_uml_class_insert_operation (self->klass, op, -1); + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + edit = dia_uml_operation_dialog_new (GTK_WINDOW (parent), op); + g_signal_connect (edit, "operation-deleted", G_CALLBACK (remove_op), self); + + gtk_widget_show (edit); +} + +static void +edit_operation (DiaUmlClassEditor *self, + GtkListBoxRow *row) +{ + GtkWidget *dlg; + GtkWidget *parent; + DiaUmlOperation *op; + + if (!DIA_IS_LIST_ROW (row)) + return; + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + op = DIA_UML_OPERATION (dia_list_row_get_data (DIA_LIST_ROW (row))); + dlg = dia_uml_operation_dialog_new (GTK_WINDOW (parent), op); + g_signal_connect (dlg, "operation-deleted", G_CALLBACK (remove_op), self); + gtk_widget_show (dlg); + g_object_unref (op); +} + +static void +remove_attr (DiaUmlAttributeDialog *dlg, + DiaUmlAttribute *attr, + DiaUmlClassEditor *self) +{ + dia_uml_class_remove_attribute (self->klass, attr); +} + +static void +add_attribute (DiaUmlClassEditor *self) +{ + DiaUmlAttribute *attr; + GtkWidget *edit; + GtkWidget *parent; + + attr = dia_uml_attribute_new (); + dia_uml_class_insert_attribute (self->klass, attr, -1); + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + edit = dia_uml_attribute_dialog_new (GTK_WINDOW (parent), attr); + g_signal_connect (edit, "attribute-deleted", G_CALLBACK (remove_attr), self); + + gtk_widget_show (edit); +} + +static void +edit_attribute (DiaUmlClassEditor *self, + GtkListBoxRow *row) +{ + GtkWidget *dlg; + GtkWidget *parent; + DiaUmlAttribute *attr; + + if (!DIA_IS_LIST_ROW (row)) + return; + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + attr = DIA_UML_ATTRIBUTE (dia_list_row_get_data (DIA_LIST_ROW (row))); + dlg = dia_uml_attribute_dialog_new (GTK_WINDOW (parent), attr); + g_signal_connect (dlg, "attribute-deleted", G_CALLBACK (remove_attr), self); + gtk_widget_show (dlg); + g_object_unref (attr); +} + +static void +remove_template (DiaUmlFormalParameterDialog *dlg, + DiaUmlFormalParameter *param, + DiaUmlClassEditor *self) +{ + dia_uml_class_remove_formal_parameter (self->klass, param); +} + +static void +add_template (DiaUmlClassEditor *self) +{ + DiaUmlFormalParameter *param; + GtkWidget *edit; + GtkWidget *parent; + + param = dia_uml_formal_parameter_new (); + dia_uml_class_insert_formal_parameter (self->klass, param, -1); + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + edit = dia_uml_formal_parameter_dialog_new (GTK_WINDOW (parent), param); + g_signal_connect (edit, "template-deleted", G_CALLBACK (remove_template), self); + + gtk_widget_show (edit); +} + +static void +edit_template (DiaUmlClassEditor *self, + GtkListBoxRow *row) +{ + GtkWidget *dlg; + GtkWidget *parent; + DiaUmlFormalParameter *param; + + if (!DIA_IS_LIST_ROW (row)) + return; + + parent = gtk_widget_get_toplevel (GTK_WIDGET (self)); + param = DIA_UML_FORMAL_PARAMETER (dia_list_row_get_data (DIA_LIST_ROW (row))); + dlg = dia_uml_formal_parameter_dialog_new (GTK_WINDOW (parent), param); + g_signal_connect (dlg, "template-deleted", G_CALLBACK (remove_template), self); + gtk_widget_show (dlg); + g_object_unref (param); +} + +static void +dia_uml_class_editor_finalize (GObject *object) +{ + DiaUmlClassEditor *self = DIA_UML_CLASS_EDITOR (object); + + g_object_unref (self->klass); +} + +static void +dia_uml_class_editor_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlClassEditor *self = DIA_UML_CLASS_EDITOR (object); + + switch (property_id) { + case UML_CEDIT_PROP_CLASS: + self->klass = g_value_dup_object (value); + g_object_bind_property (G_OBJECT (self->klass), "name", + G_OBJECT (self->name), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "stereotype", + G_OBJECT (self->stereotype), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "comment", + G_OBJECT (self->comment), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "abstract", + G_OBJECT (self->abstract), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "comments", + G_OBJECT (self->comments), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "comment-wrap-point", + G_OBJECT (self->comments_wrap_point), "value", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "documentation-tag", + G_OBJECT (self->doc_tag), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "attributes-visible", + G_OBJECT (self->attr_visible), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "attributes-suppress", + G_OBJECT (self->attr_suppress), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "operations-visible", + G_OBJECT (self->op_visible), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "operations-suppress", + G_OBJECT (self->op_suppress), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "operations-wrap", + G_OBJECT (self->op_wrap), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "operations-wrap-point", + G_OBJECT (self->op_wrap_point), "value", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->klass), "is-template", + G_OBJECT (self->is_template), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + build_lists (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_class_editor_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlClassEditor *self = DIA_UML_CLASS_EDITOR (object); + switch (property_id) { + case UML_CEDIT_PROP_CLASS: + g_value_set_object (value, self->klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_class_editor_class_init (DiaUmlClassEditorClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->set_property = dia_uml_class_editor_set_property; + object_class->get_property = dia_uml_class_editor_get_property; + object_class->finalize = dia_uml_class_editor_finalize; + + uml_cedit_properties[UML_CEDIT_PROP_CLASS] = + g_param_spec_object ("class", + "Class", + "Controlled class", + DIA_UML_TYPE_CLASS, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + UML_CEDIT_N_PROPS, + uml_cedit_properties); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-uml-class-editor.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, name); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, stereotype); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, comment); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, abstract); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, comments); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, comments_wrap_point); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, doc_tag); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, attr_visible); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, attr_suppress); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, op_visible); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, op_suppress); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, op_wrap); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, op_wrap_point); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, is_template); + + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, attributes); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, operations); + gtk_widget_class_bind_template_child (widget_class, DiaUmlClassEditor, templates); + + gtk_widget_class_bind_template_callback (widget_class, add_attribute); + gtk_widget_class_bind_template_callback (widget_class, edit_attribute); + gtk_widget_class_bind_template_callback (widget_class, add_operation); + gtk_widget_class_bind_template_callback (widget_class, edit_operation); + gtk_widget_class_bind_template_callback (widget_class, add_template); + gtk_widget_class_bind_template_callback (widget_class, edit_template); + + g_object_unref (template_file); +} + +static void +dia_uml_class_editor_init (DiaUmlClassEditor *self) +{ + GtkWidget *box; + GtkWidget *label; + + gtk_widget_init_template (GTK_WIDGET (self)); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 16, + "margin", 16, + NULL); + gtk_widget_show (box); + + label = gtk_label_new ("No attributes"); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (box), label); + + gtk_list_box_set_placeholder (GTK_LIST_BOX (self->attributes), box); + gtk_list_box_set_header_func (GTK_LIST_BOX (self->attributes), list_box_separators, NULL, NULL); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 16, + "margin", 16, + NULL); + gtk_widget_show (box); + + label = gtk_label_new ("No operations"); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (box), label); + + gtk_list_box_set_placeholder (GTK_LIST_BOX (self->operations), box); + gtk_list_box_set_header_func (GTK_LIST_BOX (self->operations), list_box_separators, NULL, NULL); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 16, + "margin", 16, + NULL); + gtk_widget_show (box); + + label = gtk_label_new ("No templates"); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (box), label); + + gtk_list_box_set_placeholder (GTK_LIST_BOX (self->templates), box); + gtk_list_box_set_header_func (GTK_LIST_BOX (self->templates), list_box_separators, NULL, NULL); +} + +GtkWidget * +dia_uml_class_editor_new (DiaUmlClass *klass) +{ + return g_object_new (DIA_UML_TYPE_CLASS_EDITOR, + "class", klass, + NULL); +} + +DiaUmlClass * +dia_uml_class_editor_get_class (DiaUmlClassEditor *self) +{ + return self->klass; +} \ No newline at end of file diff --git a/objects/UML/editor/dia-uml-class-editor.h b/objects/UML/editor/dia-uml-class-editor.h new file mode 100644 index 0000000000000000000000000000000000000000..0bb55201a38f6daff007996e70ec590270bac641 --- /dev/null +++ b/objects/UML/editor/dia-uml-class-editor.h @@ -0,0 +1,18 @@ +#include +#include "uml.h" +#include "dia-uml-class.h" + +#ifndef UML_CLASS_EDITOR_H +#define UML_CLASS_EDITOR_H + +G_BEGIN_DECLS + +#define DIA_UML_TYPE_CLASS_EDITOR (dia_uml_class_editor_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlClassEditor, dia_uml_class_editor, DIA_UML, CLASS_EDITOR, GtkScrolledWindow) + +GtkWidget *dia_uml_class_editor_new (DiaUmlClass *klass); +DiaUmlClass *dia_uml_class_editor_get_class (DiaUmlClassEditor *self); + +G_END_DECLS + +#endif \ No newline at end of file diff --git a/objects/UML/editor/dia-uml-formal-parameter-dialog.c b/objects/UML/editor/dia-uml-formal-parameter-dialog.c new file mode 100644 index 0000000000000000000000000000000000000000..09cd41198cf38924aa6ddec63f8c49811727ff42 --- /dev/null +++ b/objects/UML/editor/dia-uml-formal-parameter-dialog.c @@ -0,0 +1,140 @@ +#include + +#include "dia-uml-formal-parameter-dialog.h" +#include "dia_dirs.h" +#include "uml.h" + +G_DEFINE_TYPE (DiaUmlFormalParameterDialog, dia_uml_formal_parameter_dialog, GTK_TYPE_DIALOG) + +enum { + PROP_FORMAL_PARAMETER = 1, + N_PROPS +}; +static GParamSpec* properties[N_PROPS]; + +enum { + TEMPLATE_DELETED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +dia_uml_formal_parameter_dialog_finalize (GObject *object) +{ + DiaUmlFormalParameterDialog *self = DIA_UML_FORMAL_PARAMETER_DIALOG (object); + + g_object_unref (self->parameter); +} + +static void +dia_uml_formal_parameter_dialog_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlFormalParameterDialog *self = DIA_UML_FORMAL_PARAMETER_DIALOG (object); + + switch (property_id) { + case PROP_FORMAL_PARAMETER: + self->parameter = g_value_dup_object (value); + g_object_bind_property (G_OBJECT (self->parameter), "name", + G_OBJECT (self->name), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->parameter), "type", + G_OBJECT (self->type), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_formal_parameter_dialog_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlFormalParameterDialog *self = DIA_UML_FORMAL_PARAMETER_DIALOG (object); + switch (property_id) { + case PROP_FORMAL_PARAMETER: + g_value_set_object (value, self->parameter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +remove_template (DiaUmlFormalParameterDialog *self) +{ + g_signal_emit (G_OBJECT (self), + signals[TEMPLATE_DELETED], 0, + self->parameter); + gtk_widget_destroy (GTK_WIDGET (self)); +} + +static void +dia_uml_formal_parameter_dialog_class_init (DiaUmlFormalParameterDialogClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = dia_uml_formal_parameter_dialog_finalize; + object_class->set_property = dia_uml_formal_parameter_dialog_set_property; + object_class->get_property = dia_uml_formal_parameter_dialog_get_property; + + properties[PROP_FORMAL_PARAMETER] = + g_param_spec_object ("formal-parameter", + "Formal parameter", + "Formal parameter this editor controls", + DIA_UML_TYPE_FORMAL_PARAMETER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + N_PROPS, + properties); + + signals[TEMPLATE_DELETED] = g_signal_new ("template-deleted", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_UML_TYPE_FORMAL_PARAMETER); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-uml-formal-parameter-dialog.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaUmlFormalParameterDialog, name); + gtk_widget_class_bind_template_child (widget_class, DiaUmlFormalParameterDialog, type); + gtk_widget_class_bind_template_callback (widget_class, remove_template); + + g_object_unref (template_file); +} + +static void +dia_uml_formal_parameter_dialog_init (DiaUmlFormalParameterDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GtkWidget * +dia_uml_formal_parameter_dialog_new (GtkWindow *parent, + DiaUmlFormalParameter *param) +{ + return g_object_new (DIA_UML_TYPE_FORMAL_PARAMETER_DIALOG, + "formal-parameter", param, + "transient-for", parent, + "modal", TRUE, + NULL); +} diff --git a/objects/UML/editor/dia-uml-formal-parameter-dialog.h b/objects/UML/editor/dia-uml-formal-parameter-dialog.h new file mode 100644 index 0000000000000000000000000000000000000000..88a1c9a618ca5cc0508ac525a821ad3b3dad1e0d --- /dev/null +++ b/objects/UML/editor/dia-uml-formal-parameter-dialog.h @@ -0,0 +1,18 @@ +#include +#include "uml.h" +#include "dia-uml-formal-parameter.h" + +#define DIA_UML_TYPE_FORMAL_PARAMETER_DIALOG (dia_uml_formal_parameter_dialog_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlFormalParameterDialog, dia_uml_formal_parameter_dialog, DIA_UML, FORMAL_PARAMETER_DIALOG, GtkDialog) + +struct _DiaUmlFormalParameterDialog { + GtkDialog parent; + + GtkWidget *name; + GtkWidget *type; + + DiaUmlFormalParameter *parameter; +}; + +GtkWidget *dia_uml_formal_parameter_dialog_new (GtkWindow *parent, + DiaUmlFormalParameter *param); diff --git a/objects/UML/editor/dia-uml-operation-dialog.c b/objects/UML/editor/dia-uml-operation-dialog.c new file mode 100644 index 0000000000000000000000000000000000000000..3a8886f9579a103edf4650c02fb7e8de6baa46a7 --- /dev/null +++ b/objects/UML/editor/dia-uml-operation-dialog.c @@ -0,0 +1,285 @@ +#include "dia-uml-operation-dialog.h" +#include "dia-uml-operation-parameter-row.h" +#include "list/dia-list-store.h" +#include "dia_dirs.h" + +G_DEFINE_TYPE (DiaUmlOperationDialog, dia_uml_operation_dialog, GTK_TYPE_DIALOG) + +enum { + UML_OP_DLG_PROP_OPERATION = 1, + UML_OP_DLG_N_PROPS +}; +static GParamSpec* uml_op_dlg_properties[UML_OP_DLG_N_PROPS]; + +enum { + UML_OP_DLG_OPERATION_DELETED, + UML_OP_DLG_LAST_SIGNAL +}; +static guint uml_op_dlg_signals[UML_OP_DLG_LAST_SIGNAL] = { 0 }; + +static void +dia_uml_operation_dialog_finalize (GObject *object) +{ + DiaUmlOperationDialog *self = DIA_UML_OPERATION_DIALOG (object); + + g_object_unref (self->operation); +} + +static gboolean +visibility_to (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + const gchar *name = g_value_get_string (from_value); + + if (g_strcmp0 (name, "private") == 0) { + g_value_set_int (to_value, UML_PRIVATE); + } else if (g_strcmp0 (name, "protected") == 0) { + g_value_set_int (to_value, UML_PROTECTED); + } else if (g_strcmp0 (name, "implementation") == 0) { + g_value_set_int (to_value, UML_IMPLEMENTATION); + } else { + g_value_set_int (to_value, UML_PUBLIC); + } + + return TRUE; +} + +static gboolean +visibility_from (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + int mode = g_value_get_int (from_value); + + if (mode == UML_PRIVATE) { + g_value_set_static_string (to_value, "private"); + } else if (mode == UML_PROTECTED) { + g_value_set_static_string (to_value, "protected"); + } else if (mode == UML_IMPLEMENTATION) { + g_value_set_static_string (to_value, "implementation"); + } else { + g_value_set_static_string (to_value, "public"); + } + + return TRUE; +} + +static gboolean +inheritance_to (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + const gchar *name = g_value_get_string (from_value); + + if (g_strcmp0 (name, "abstract") == 0) { + g_value_set_int (to_value, UML_ABSTRACT); + } else if (g_strcmp0 (name, "poly") == 0) { + g_value_set_int (to_value, UML_POLYMORPHIC); + } else { + g_value_set_int (to_value, UML_LEAF); + } + + return TRUE; +} + +static gboolean +inheritance_from (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + int mode = g_value_get_int (from_value); + + if (mode == UML_ABSTRACT) { + g_value_set_static_string (to_value, "abstract"); + } else if (mode == UML_POLYMORPHIC) { + g_value_set_static_string (to_value, "poly"); + } else { + g_value_set_static_string (to_value, "leaf"); + } + + return TRUE;} + +static void +dia_uml_operation_dialog_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperationDialog *self = DIA_UML_OPERATION_DIALOG (object); + GListModel *paras; + + switch (property_id) { + case UML_OP_DLG_PROP_OPERATION: + self->operation = g_value_dup_object (value); + g_object_bind_property (G_OBJECT (self->operation), "name", + G_OBJECT (self->name), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->operation), "type", + G_OBJECT (self->type), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->operation), "stereotype", + G_OBJECT (self->stereotype), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->operation), "comment", + G_OBJECT (self->comment), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + + g_object_bind_property_full (G_OBJECT (self->operation), "visibility", + G_OBJECT (self->visibility), "active-id", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE, + visibility_from, + visibility_to, + NULL, NULL); + + g_object_bind_property_full (G_OBJECT (self->operation), "inheritance-type", + G_OBJECT (self->inheritance), "active-id", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE, + inheritance_from, + inheritance_to, + NULL, NULL); + + g_object_bind_property (G_OBJECT (self->operation), "query", + G_OBJECT (self->query), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->operation), "class-scope", + G_OBJECT (self->scope), "active", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + + paras = dia_uml_operation_get_parameters (self->operation); + g_message ("Got %i", g_list_model_get_n_items (paras)); + gtk_list_box_bind_model (GTK_LIST_BOX (self->list), paras, + (GtkListBoxCreateWidgetFunc) dia_uml_operation_parameter_row_new, + paras, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_operation_dialog_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperationDialog *self = DIA_UML_OPERATION_DIALOG (object); + switch (property_id) { + case UML_OP_DLG_PROP_OPERATION: + g_value_set_object (value, self->operation); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dlg_add_parameter (DiaUmlOperationDialog *self) +{ + DiaUmlParameter *para = dia_uml_parameter_new (); + + dia_uml_operation_insert_parameter (self->operation, para, -1); +} + +static void +remove_operation (DiaUmlOperationDialog *self) +{ + g_signal_emit (G_OBJECT (self), + uml_op_dlg_signals[UML_OP_DLG_OPERATION_DELETED], 0, + self->operation); + gtk_widget_destroy (GTK_WIDGET (self)); +} + +static void +dia_uml_operation_dialog_class_init (DiaUmlOperationDialogClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = dia_uml_operation_dialog_finalize; + object_class->set_property = dia_uml_operation_dialog_set_property; + object_class->get_property = dia_uml_operation_dialog_get_property; + + uml_op_dlg_properties[UML_OP_DLG_PROP_OPERATION] = + g_param_spec_object ("operation", + "Operation", + "Operation this editor controls", + DIA_UML_TYPE_OPERATION, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + UML_OP_DLG_N_PROPS, + uml_op_dlg_properties); + + uml_op_dlg_signals[UML_OP_DLG_OPERATION_DELETED] = g_signal_new ("operation-deleted", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 1, + DIA_UML_TYPE_OPERATION); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-uml-operation-dialog.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, name); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, type); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, stereotype); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, visibility); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, inheritance); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, scope); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, query); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, comment); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationDialog, list); + gtk_widget_class_bind_template_callback (widget_class, dlg_add_parameter); + gtk_widget_class_bind_template_callback (widget_class, remove_operation); + + g_object_unref (template_file); +} + +static void +dia_uml_operation_dialog_init (DiaUmlOperationDialog *self) +{ + GtkWidget *box; + GtkWidget *widget; + + gtk_widget_init_template (GTK_WIDGET (self)); + + box = g_object_new (GTK_TYPE_BOX, + "orientation", GTK_ORIENTATION_VERTICAL, + "spacing", 16, + "margin", 16, + NULL); + gtk_widget_show (box); + + widget = gtk_label_new ("No parameters"); + gtk_widget_show (widget); + gtk_container_add (GTK_CONTAINER (box), widget); + + gtk_list_box_set_placeholder (GTK_LIST_BOX (self->list), box); + gtk_list_box_set_header_func (GTK_LIST_BOX (self->list), list_box_separators, NULL, NULL); +} + +GtkWidget * +dia_uml_operation_dialog_new (GtkWindow *parent, + DiaUmlOperation *op) +{ + return g_object_new (DIA_UML_TYPE_OPERATION_DIALOG, + "operation", op, + "transient-for", parent, + "modal", TRUE, + NULL); +} diff --git a/objects/UML/editor/dia-uml-operation-dialog.h b/objects/UML/editor/dia-uml-operation-dialog.h new file mode 100644 index 0000000000000000000000000000000000000000..2ba11e107f6cb8bd6626d9709e5666e7455a9ec0 --- /dev/null +++ b/objects/UML/editor/dia-uml-operation-dialog.h @@ -0,0 +1,25 @@ +#include +#include "uml.h" +#include "dia-uml-operation.h" + +#define DIA_UML_TYPE_OPERATION_DIALOG (dia_uml_operation_dialog_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlOperationDialog, dia_uml_operation_dialog, DIA_UML, OPERATION_DIALOG, GtkDialog) + +struct _DiaUmlOperationDialog { + GtkDialog parent; + + GtkWidget *name; + GtkWidget *type; + GtkWidget *stereotype; + GtkWidget *visibility; + GtkWidget *inheritance; + GtkWidget *scope; + GtkWidget *query; + GtkTextBuffer *comment; + GtkWidget *list; + + DiaUmlOperation *operation; +}; + +GtkWidget *dia_uml_operation_dialog_new (GtkWindow *parent, + DiaUmlOperation *op); diff --git a/objects/UML/editor/dia-uml-operation-parameter-row.c b/objects/UML/editor/dia-uml-operation-parameter-row.c new file mode 100644 index 0000000000000000000000000000000000000000..500f064f5eb25b11f8752057adac3bae733c960a --- /dev/null +++ b/objects/UML/editor/dia-uml-operation-parameter-row.c @@ -0,0 +1,249 @@ +#include "dia-uml-parameter.h" +#include "dia-uml-operation-parameter-row.h" +#include "list/dia-list-store.h" +#include "dia_dirs.h" + +struct _DiaUmlOperationParameterRow { + GtkListBoxRow parent; + + GtkWidget *title; + GtkWidget *name; + GtkWidget *type; + GtkWidget *value; + GtkWidget *direction; + GtkTextBuffer *comment; + + DiaUmlParameter *parameter; + DiaListStore *model; +}; + +G_DEFINE_TYPE (DiaUmlOperationParameterRow, dia_uml_operation_parameter_row, GTK_TYPE_LIST_BOX_ROW) + +enum { + UML_OP_PROW_PROP_PARAMETER = 1, + UML_OP_PROW_PROP_MODEL, + UML_OP_PROW_N_PROPS +}; +static GParamSpec* uml_op_prow_properties[UML_OP_PROW_N_PROPS]; + +static void +dia_uml_operation_parameter_row_finalize (GObject *object) +{ + DiaUmlOperationParameterRow *self = DIA_UML_OPERATION_PARAMETER_ROW (object); + + g_clear_object (&self->parameter); + g_clear_object (&self->model); +} + +static gboolean +direction_to (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + const gchar *name = g_value_get_string (from_value); + + if (g_strcmp0 (name, "in") == 0) { + g_value_set_int (to_value, UML_IN); + } else if (g_strcmp0 (name, "out") == 0) { + g_value_set_int (to_value, UML_OUT); + } else if (g_strcmp0 (name, "inout") == 0) { + g_value_set_int (to_value, UML_INOUT); + } else { + g_value_set_int (to_value, UML_UNDEF_KIND); + } + + return TRUE; +} + +static gboolean +direction_from (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + int mode = g_value_get_int (from_value); + + if (mode == UML_IN) { + g_value_set_static_string (to_value, "in"); + } else if (mode == UML_OUT) { + g_value_set_static_string (to_value, "out"); + } else if (mode == UML_INOUT) { + g_value_set_static_string (to_value, "inout"); + } else { + g_value_set_static_string (to_value, "undefined"); + } + + return TRUE; +} + +static void +display_op (DiaListData *op, + DiaUmlOperationParameterRow *row) +{ + gtk_label_set_label (GTK_LABEL (row->title), + dia_list_data_format (op)); +} + +static void +dia_uml_operation_parameter_row_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperationParameterRow *self = DIA_UML_OPERATION_PARAMETER_ROW (object); + switch (property_id) { + case UML_OP_PROW_PROP_PARAMETER: + self->parameter = g_value_dup_object (value); + g_object_bind_property (G_OBJECT (self->parameter), "name", + G_OBJECT (self->name), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->parameter), "type", + G_OBJECT (self->type), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (self->parameter), "value", + G_OBJECT (self->value), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + + g_object_bind_property_full (G_OBJECT (self->parameter), "kind", + G_OBJECT (self->direction), "active-id", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE, + direction_from, + direction_to, + NULL, NULL); + + g_object_bind_property (G_OBJECT (self->parameter), "comment", + G_OBJECT (self->comment), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_signal_connect (G_OBJECT (self->parameter), "changed", + G_CALLBACK (display_op), self); + display_op (DIA_LIST_DATA (self->parameter), self); + break; + case UML_OP_PROW_PROP_MODEL: + self->model = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +dia_uml_operation_parameter_row_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + DiaUmlOperationParameterRow *self = DIA_UML_OPERATION_PARAMETER_ROW (object); + switch (property_id) { + case UML_OP_PROW_PROP_PARAMETER: + g_value_set_object (value, self->parameter); + break; + case UML_OP_PROW_PROP_MODEL: + g_value_set_object (value, self->model); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +move_up (DiaUmlOperationParameterRow *self) +{ + int index; + + index = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (self)); + + g_object_ref (self->parameter); + dia_list_store_remove (self->model, DIA_LIST_DATA (self->parameter)); + dia_list_store_insert (self->model, DIA_LIST_DATA (self->parameter), index - 1); + g_object_unref (self->parameter); +} + +static void +move_down (DiaUmlOperationParameterRow *self) +{ + int index; + + index = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (self)); + + g_object_ref (self->parameter); + dia_list_store_remove (self->model, DIA_LIST_DATA (self->parameter)); + dia_list_store_insert (self->model, DIA_LIST_DATA (self->parameter), index + 1); + g_object_unref (self->parameter); +} + +static void +remove_param (DiaUmlOperationParameterRow *self) +{ + dia_list_store_remove (self->model, DIA_LIST_DATA (self->parameter)); +} + +static void +dia_uml_operation_parameter_row_class_init (DiaUmlOperationParameterRowClass *klass) +{ + GFile *template_file; + GBytes *template; + GError *err = NULL; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = dia_uml_operation_parameter_row_finalize; + object_class->set_property = dia_uml_operation_parameter_row_set_property; + object_class->get_property = dia_uml_operation_parameter_row_get_property; + + uml_op_prow_properties[UML_OP_PROW_PROP_PARAMETER] = + g_param_spec_object ("parameter", + "Parameter", + "Parameter this editor controls", + DIA_UML_TYPE_PARAMETER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + uml_op_prow_properties[UML_OP_PROW_PROP_MODEL] = + g_param_spec_object ("model", + "Model", + "Model this for is for", + DIA_TYPE_LIST_STORE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (object_class, + UML_OP_PROW_N_PROPS, + uml_op_prow_properties); + + /* TODO: Use GResource */ + template_file = g_file_new_for_path (build_ui_filename ("ui/dia-uml-operation-parameter-row.ui")); + template = g_file_load_bytes (template_file, NULL, NULL, &err); + + if (err) + g_critical ("Failed to load template: %s", err->message); + + gtk_widget_class_set_template (widget_class, template); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, title); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, name); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, type); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, value); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, direction); + gtk_widget_class_bind_template_child (widget_class, DiaUmlOperationParameterRow, comment); + gtk_widget_class_bind_template_callback (widget_class, move_up); + gtk_widget_class_bind_template_callback (widget_class, move_down); + gtk_widget_class_bind_template_callback (widget_class, remove_param); + + g_object_unref (template_file); +} + +static void +dia_uml_operation_parameter_row_init (DiaUmlOperationParameterRow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GtkWidget * +dia_uml_operation_parameter_row_new (DiaUmlParameter *op, + DiaListStore *model) +{ + return g_object_new (DIA_UML_TYPE_OPERATION_PARAMETER_ROW, + "parameter", op, + "model", model, + NULL); +} diff --git a/objects/UML/editor/dia-uml-operation-parameter-row.h b/objects/UML/editor/dia-uml-operation-parameter-row.h new file mode 100644 index 0000000000000000000000000000000000000000..42d5ffb0d6bc7625679b6591f7a127f6bc78f512 --- /dev/null +++ b/objects/UML/editor/dia-uml-operation-parameter-row.h @@ -0,0 +1,14 @@ +#include +#include "uml.h" +#include "list/dia-list-store.h" + +G_BEGIN_DECLS + +#define DIA_UML_TYPE_OPERATION_PARAMETER_ROW (dia_uml_operation_parameter_row_get_type ()) +G_DECLARE_FINAL_TYPE (DiaUmlOperationParameterRow, dia_uml_operation_parameter_row, DIA_UML, OPERATION_PARAMETER_ROW, GtkListBoxRow) + +GtkWidget *dia_uml_operation_parameter_row_new (DiaUmlParameter *parameter, + DiaListStore *model); +DiaUmlParameter *dia_uml_operation_parameter_row_get_parameter (DiaUmlOperationParameterRow *self); + +G_END_DECLS diff --git a/objects/UML/fork.c b/objects/UML/fork.c index 8669b3396e739de968b577ada148cf8ea8d559c7..2838fe2fcb0ba8068df77d4d5f36740a3d12db75 100644 --- a/objects/UML/fork.c +++ b/objects/UML/fork.c @@ -47,7 +47,7 @@ typedef struct _Fork Fork; struct _Fork { Element element; - Color fill_color; + GdkRGBA fill_color; ConnectionPoint connections[NUM_CONNECTIONS]; }; diff --git a/objects/UML/generalization.c b/objects/UML/generalization.c index 21c762c64e6b456b0eaf8e7e296b6e87d86e3f98..06a978ca87ab4fc5dfd665c6e7e90a69785808fb 100644 --- a/objects/UML/generalization.c +++ b/objects/UML/generalization.c @@ -48,10 +48,10 @@ struct _Generalization { DiaFont *font; real font_height; - Color text_color; + GdkRGBA text_color; real line_width; - Color line_color; + GdkRGBA line_color; char *name; char *stereotype; /* excluding << and >> */ diff --git a/objects/UML/implements.c b/objects/UML/implements.c index 4475f0e19bcdccd4834d64edac8d04703e085d53..9b01272dcec4f7575959b41b871352b9874a952c 100644 --- a/objects/UML/implements.c +++ b/objects/UML/implements.c @@ -48,10 +48,10 @@ struct _Implements { DiaFont *font; real font_height; - Color text_color; + GdkRGBA text_color; real line_width; - Color line_color; + GdkRGBA line_color; gchar *text; Point text_pos; diff --git a/objects/UML/large_package.c b/objects/UML/large_package.c index c7206b0d6389bfa2bcdbeaeb8eda34a51a7d21ff..0568e1b832b231bfaeeac99754e45e1f7100590b 100644 --- a/objects/UML/large_package.c +++ b/objects/UML/large_package.c @@ -54,9 +54,9 @@ struct _LargePackage { real line_width; - Color text_color; - Color line_color; - Color fill_color; + GdkRGBA text_color; + GdkRGBA line_color; + GdkRGBA fill_color; real font_height; diff --git a/objects/UML/lifeline.c b/objects/UML/lifeline.c index c110a2bb19d9803666de0182d0520e6c2d8054f2..1fe1eb7590609109c7bf8db51de01ec03ea86f79 100644 --- a/objects/UML/lifeline.c +++ b/objects/UML/lifeline.c @@ -59,8 +59,8 @@ struct _Lifeline { int draw_focuscontrol; int draw_cross; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; ConnPointLine *northwest,*southwest,*northeast,*southeast; diff --git a/objects/UML/message.c b/objects/UML/message.c index 1e2f9a75c0c06f8e918ef35942f2e7190606b803..e3ae0158cff3a1067ac3506eea57d62cf4eab36f 100644 --- a/objects/UML/message.c +++ b/objects/UML/message.c @@ -61,8 +61,8 @@ struct _Message { Point text_pos; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/node.c b/objects/UML/node.c index 10a0c11ab77d6f1ee2e24501cbf1d04b68447caf..43e24abecc9067cec080424dd8455d67aa80e0e0 100644 --- a/objects/UML/node.c +++ b/objects/UML/node.c @@ -49,8 +49,8 @@ struct _Node ConnectionPoint connections[NUM_CONNECTIONS]; Text *name; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; }; diff --git a/objects/UML/note.c b/objects/UML/note.c index fa39f2c9a904786c0ff4d03eb4e636b9c5d56111..f8c54516085f1bb9b13b9f4ca95786fee054d4d7 100644 --- a/objects/UML/note.c +++ b/objects/UML/note.c @@ -45,8 +45,8 @@ struct _Note { Text *text; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; #define NOTE_BORDERWIDTH 0.1 diff --git a/objects/UML/object.c b/objects/UML/object.c index 2ea38305a8d797a91416dcec25f07a035e128f22..8d82a80daa978d527d6e11bb907d6aade154cdf9 100644 --- a/objects/UML/object.c +++ b/objects/UML/object.c @@ -54,8 +54,8 @@ struct _Objet { TextAttributes text_attrs; /* for both text objects */ real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; Point ex_pos, st_pos; int is_active; diff --git a/objects/UML/realizes.c b/objects/UML/realizes.c index fcb2ede17ff80ea3fa791e3bcc40bacf2946c8ae..c081f020cf495a9fdae8bd35d02a3e8a4e4f8d9f 100644 --- a/objects/UML/realizes.c +++ b/objects/UML/realizes.c @@ -45,8 +45,8 @@ struct _Realizes { Alignment text_align; real text_width; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; DiaFont *font; real font_height; diff --git a/objects/UML/small_package.c b/objects/UML/small_package.c index 16d36294beb260eb7926aac972e4906a45ee74e8..bec999d2d56b34b9d9a84485309dd2030b19e232 100644 --- a/objects/UML/small_package.c +++ b/objects/UML/small_package.c @@ -50,8 +50,8 @@ struct _SmallPackage { char *st_stereotype; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; /* The old border width, kept for compatibility with dia files created with diff --git a/objects/UML/state.c b/objects/UML/state.c index e1de050aacbdedf0daae290ac6b57cf9378768b0..83a7fc0a2686de74511a109af46defa1c4181dce 100644 --- a/objects/UML/state.c +++ b/objects/UML/state.c @@ -61,8 +61,8 @@ struct _State { Text *text; int state_type; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real line_width; diff --git a/objects/UML/state_term.c b/objects/UML/state_term.c index fb851d385c41b367081c5d9f656fcb0d71bc8042..9cd881d066372485c6fd8b7166a68c1cc47f9cfa 100644 --- a/objects/UML/state_term.c +++ b/objects/UML/state_term.c @@ -47,8 +47,8 @@ struct _State { int is_final; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/UML/transition.c b/objects/UML/transition.c index 9ca169c6fe014166122ddba128ce7e108ad93584..e0dc7c131871cc04b43e07dcec787aa13a54896c 100644 --- a/objects/UML/transition.c +++ b/objects/UML/transition.c @@ -38,8 +38,8 @@ typedef struct _Transition Transition; struct _Transition { OrthConn orth; - Color text_color; - Color line_color; + GdkRGBA text_color; + GdkRGBA line_color; Handle trigger_text_handle; Point trigger_text_pos; diff --git a/objects/UML/uml.c b/objects/UML/uml.c index ccf98ac8195c84928641a7cb58edeb020145554d..2d7ce2dc3239322db14421b80467cf32dae55b91 100644 --- a/objects/UML/uml.c +++ b/objects/UML/uml.c @@ -30,6 +30,8 @@ #include "plug-ins.h" #include "properties.h" +#include "dia-uml-operation.h" + extern DiaObjectType umlclass_type; extern DiaObjectType umlclass_template_type; extern DiaObjectType note_type; diff --git a/objects/UML/uml.h b/objects/UML/uml.h index 0d30b0c2d4a3b57c542c6ebc9ff7a2989c7e1692..e07f4eaf46f40fb0b060aa2c947fad108914ba2f 100644 --- a/objects/UML/uml.h +++ b/objects/UML/uml.h @@ -22,14 +22,12 @@ #define UML_H #include +#include #include "intl.h" #include "connectionpoint.h" #include "dia_xml.h" -typedef struct _UMLAttribute UMLAttribute; -typedef struct _UMLOperation UMLOperation; -typedef struct _UMLParameter UMLParameter; -typedef struct _UMLFormalParameter UMLFormalParameter; +/* TODO: enums as GEnum for _spec_enum ext */ /** the visibility (allowed acces) of (to) various UML sub elements */ typedef enum _UMLVisibility { @@ -39,120 +37,15 @@ typedef enum _UMLVisibility { UML_IMPLEMENTATION /**< ?What's this? Means implementation decision */ } UMLVisibility; -/** In some languages there are different kinds of class inheritances */ -typedef enum _UMLInheritanceType { - UML_ABSTRACT, /**< Pure virtual method: an object of this class cannot be instanciated */ - UML_POLYMORPHIC, /**< Virtual method : could be reimplemented in derivated classes */ - UML_LEAF /**< Final method: can't be redefined in subclasses */ -} UMLInheritanceType; - -/** describes the data flow between caller and callee */ -typedef enum _UMLParameterKind { - UML_UNDEF_KIND, /**< not defined */ - UML_IN, /**< by value */ - UML_OUT, /**< by ref, can be passed in uninitialized */ - UML_INOUT /**< by ref */ -} UMLParameterKind; - -typedef gchar * UMLStereotype; - -/** \brief A list of UMLAttribute is contained in UMLClass - * Some would call them member variables ;) - */ -struct _UMLAttribute { - gint internal_id; /**< Arbitrary integer to recognize attributes after - * the user has shuffled them in the dialog. */ - gchar *name; /**< the member variables name */ - gchar *type; /**< the return value */ - gchar *value; /**< default parameter : Can be NULL => No default value */ - gchar *comment; /**< comment */ - UMLVisibility visibility; /**< attributes visibility */ - int abstract; /**< not sure if this applicable */ - int class_scope; /**< in C++ : static member */ - - ConnectionPoint* left_connection; /**< left */ - ConnectionPoint* right_connection; /**< right */ -}; - -/** \brief A list of UMLOperation is contained in UMLClass - * Some would call them member functions ;) - */ -struct _UMLOperation { - gint internal_id; /**< Arbitrary integer to recognize operations after - * the user has shuffled them in the dialog. */ - gchar *name; /**< the function name */ - gchar *type; /**< Return type, NULL => No return type */ - gchar *comment; /**< comment */ - UMLStereotype stereotype; /**< just some string */ - UMLVisibility visibility; /**< allowed access */ - UMLInheritanceType inheritance_type; - int query; /**< Do not modify the object, in C++ this is a const function */ - int class_scope; - GList *parameters; /**< List of UMLParameter */ - - ConnectionPoint* left_connection; /**< left */ - ConnectionPoint* right_connection; /**< right */ - - gboolean needs_wrapping; /** Whether this operation needs wrapping */ - gint wrap_indent; /** The amount of indentation in chars */ - GList *wrappos; /** Absolute wrapping positions */ - real ascent; /** The ascent amount used for line distance in wrapping */ -}; - - -/** \brief A list of UMLParameter is contained in UMLOperation - * Some would call them functions parameters ;) - */ -struct _UMLParameter { - gchar *name; /**< name*/ - gchar *type; /**< return value */ - gchar *value; /**< Initialization, can be NULL => No default value */ - gchar *comment; /**< comment */ - UMLParameterKind kind; /**< Not currently used */ -}; - -/** \brief A list of UMLFormalParameter is contained in UMLOperation - * Some would call them template parameters ;) - */ -struct _UMLFormalParameter { - gchar *name; /**< name */ - gchar *type; /**< Can be NULL => Type parameter */ -}; - /* Characters used to start/end stereotypes: */ /** start stereotype symbol(like \xab) for local locale */ #define UML_STEREOTYPE_START _("<<") /** end stereotype symbol(like \xbb) for local locale */ #define UML_STEREOTYPE_END _(">>") -/** calculated the 'formated' representation */ -extern gchar *uml_get_attribute_string (UMLAttribute *attribute); -/** calculated the 'formated' representation */ -extern gchar *uml_get_operation_string(UMLOperation *operation); -/** calculated the 'formated' representation */ -extern gchar *uml_get_parameter_string(UMLParameter *param); -/** calculated the 'formated' representation */ -extern gchar *uml_get_formalparameter_string(UMLFormalParameter *parameter); -extern void uml_attribute_copy_into(UMLAttribute *srcattr, UMLAttribute *destattr); -extern UMLAttribute *uml_attribute_copy(UMLAttribute *attr); -extern void uml_operation_copy_into(UMLOperation *srcop, UMLOperation *destop); -extern UMLOperation *uml_operation_copy(UMLOperation *op); -extern UMLFormalParameter *uml_formalparameter_copy(UMLFormalParameter *param); -extern void uml_attribute_destroy(UMLAttribute *attribute); -extern void uml_operation_destroy(UMLOperation *op); -extern void uml_parameter_destroy(UMLParameter *param); -extern void uml_formalparameter_destroy(UMLFormalParameter *param); -extern UMLAttribute *uml_attribute_new(void); -extern UMLOperation *uml_operation_new(void); -extern UMLParameter *uml_parameter_new(void); -extern UMLFormalParameter *uml_formalparameter_new(void); - -extern void uml_attribute_ensure_connection_points (UMLAttribute *attr, DiaObject* obj); -extern void uml_operation_ensure_connection_points (UMLOperation *oper, DiaObject* obj); - -extern void uml_attribute_write(AttributeNode attr_node, UMLAttribute *attr, DiaContext *ctx); -extern void uml_operation_write(AttributeNode attr_node, UMLOperation *op, DiaContext *ctx); -extern void uml_formalparameter_write(AttributeNode attr_node, UMLFormalParameter *param, DiaContext *ctx); +void list_box_separators (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data); #endif /* UML_H */ diff --git a/objects/UML/umlattribute.c b/objects/UML/umlattribute.c deleted file mode 100644 index 67c61d962401373f1008e5d051a37a2ddc302663..0000000000000000000000000000000000000000 --- a/objects/UML/umlattribute.c +++ /dev/null @@ -1,250 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * umlattribute.c : refactored from uml.c, class.c to final use StdProps - * PROP_TYPE_DARRAY, a list where each element is a set - * of properies described by the same StdPropDesc - * Copyright (C) 2005 Hans Breuer - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "uml.h" -#include "properties.h" - -extern PropEnumData _uml_visibilities[]; - -static PropDescription umlattribute_props[] = { - { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Name"), NULL, NULL }, - { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Type"), NULL, NULL }, - { "value", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Value"), NULL, NULL }, - { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Comment"), NULL, NULL }, - { "visibility", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Visibility"), NULL, _uml_visibilities }, - /* Kept for backward compatibility, not sure what it is meant to be --hb */ - { "abstract", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Abstract"), NULL, NULL }, - { "class_scope", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Scope"), NULL, N_("Class scope (C++ static class variable)") }, - - PROP_DESC_END -}; - -static PropOffset umlattribute_offsets[] = { - { "name", PROP_TYPE_STRING, offsetof(UMLAttribute, name) }, - { "type", PROP_TYPE_STRING, offsetof(UMLAttribute, type) }, - { "value", PROP_TYPE_STRING, offsetof(UMLAttribute, value) }, - { "comment", PROP_TYPE_MULTISTRING, offsetof(UMLAttribute, comment) }, - { "visibility", PROP_TYPE_ENUM, offsetof(UMLAttribute, visibility) }, - { "abstract", PROP_TYPE_BOOL, offsetof(UMLAttribute, abstract) }, - { "class_scope", PROP_TYPE_BOOL, offsetof(UMLAttribute, class_scope) }, - { NULL, 0, 0 }, -}; - - -PropDescDArrayExtra umlattribute_extra = { - { umlattribute_props, umlattribute_offsets, "umlattribute" }, - (NewRecordFunc)uml_attribute_new, - (FreeRecordFunc)uml_attribute_destroy -}; - - -UMLAttribute * -uml_attribute_new(void) -{ - UMLAttribute *attr; - static gint next_id = 1; - - attr = g_new0(UMLAttribute, 1); - attr->internal_id = next_id++; - attr->name = g_strdup(""); - attr->type = g_strdup(""); - attr->value = NULL; - attr->comment = g_strdup(""); - attr->visibility = UML_PUBLIC; - attr->abstract = FALSE; - attr->class_scope = FALSE; -#if 0 /* setup elsewhere */ - attr->left_connection = g_new0(ConnectionPoint, 1); - attr->right_connection = g_new0(ConnectionPoint, 1); -#endif - return attr; -} - -/** Copy the data of an attribute into another, but not the connections. - * Frees up any strings in the attribute being copied into. */ -void -uml_attribute_copy_into(UMLAttribute *attr, UMLAttribute *newattr) -{ - newattr->internal_id = attr->internal_id; - if (newattr->name != NULL) { - g_free(newattr->name); - } - newattr->name = g_strdup(attr->name); - if (newattr->type != NULL) { - g_free(newattr->type); - } - newattr->type = g_strdup(attr->type); - - if (newattr->value != NULL) { - g_free(newattr->value); - } - if (attr->value != NULL) { - newattr->value = g_strdup(attr->value); - } else { - newattr->value = NULL; - } - - if (newattr->comment != NULL) { - g_free(newattr->comment); - } - if (attr->comment != NULL) - newattr->comment = g_strdup (attr->comment); - else - newattr->comment = NULL; - - newattr->visibility = attr->visibility; - newattr->abstract = attr->abstract; - newattr->class_scope = attr->class_scope; -} - -/** Copy an attribute's content. - */ -UMLAttribute * -uml_attribute_copy(UMLAttribute *attr) -{ - UMLAttribute *newattr; - - newattr = g_new0(UMLAttribute, 1); - - uml_attribute_copy_into(attr, newattr); - - return newattr; -} - -void -uml_attribute_destroy(UMLAttribute *attr) -{ - g_free(attr->name); - g_free(attr->type); - if (attr->value != NULL) - g_free(attr->value); - if (attr->comment != NULL) - g_free(attr->comment); -#if 0 /* free'd elsewhere */ - g_free(attr->left_connection); - g_free(attr->right_connection); -#endif - g_free(attr); -} - -void -uml_attribute_write(AttributeNode attr_node, UMLAttribute *attr, DiaContext *ctx) -{ - DataNode composite; - - composite = data_add_composite(attr_node, "umlattribute", ctx); - - data_add_string(composite_add_attribute(composite, "name"), - attr->name, ctx); - data_add_string(composite_add_attribute(composite, "type"), - attr->type, ctx); - data_add_string(composite_add_attribute(composite, "value"), - attr->value, ctx); - data_add_string(composite_add_attribute(composite, "comment"), - attr->comment, ctx); - data_add_enum(composite_add_attribute(composite, "visibility"), - attr->visibility, ctx); - data_add_boolean(composite_add_attribute(composite, "abstract"), - attr->abstract, ctx); - data_add_boolean(composite_add_attribute(composite, "class_scope"), - attr->class_scope, ctx); -} - -/* Warning, the following *must* be strictly ASCII characters (or fix the - following code for UTF-8 cleanliness */ - -char visible_char[] = { '+', '-', '#', ' ' }; - -char * -uml_get_attribute_string (UMLAttribute *attribute) -{ - int len; - char *str; - - len = 1 + (attribute->name ? strlen (attribute->name) : 0) - + (attribute->type ? strlen (attribute->type) : 0); - if (attribute->name && attribute->name[0] && attribute->type && attribute->type[0]) { - len += 2; - } - if (attribute->value != NULL && attribute->value[0] != '\0') { - len += 3 + strlen (attribute->value); - } - - str = g_malloc (sizeof (char) * (len + 1)); - - str[0] = visible_char[(int) attribute->visibility]; - str[1] = 0; - - strcat (str, attribute->name ? attribute->name : ""); - if (attribute->name && attribute->name[0] && attribute->type && attribute->type[0]) { - strcat (str, ": "); - } - strcat (str, attribute->type ? attribute->type : ""); - if (attribute->value != NULL && attribute->value[0] != '\0') { - strcat (str, " = "); - strcat (str, attribute->value); - } - - g_assert (strlen (str) == len); - - return str; -} - -/*! - * The ownership of these connection points is quite complicated. Instead of being part of - * the UMLAttribute as one may expect at first, they are somewhat in between the DiaObject - * (see: DiaObject::connections and the concrete user, here UMLClass) and the UMLAttribute. - * - * But with taking undo state mangement into account it gets even worse. Deleted (to be - * restored connection points) live inside the UMLClassChange until they get reverted back - * to the object *or* get free'd by umlclass_change_free() - * - * Since the implementation of attributes/operations being settable via StdProps there are - * more places to keep this stuff consitent. So here comes a tolerant helper. - * - * NOTE: Same function as uml_operation_ensure_connection_points(), - * with C++ it would be a template function ;) - */ -void -uml_attribute_ensure_connection_points (UMLAttribute* attr, DiaObject* obj) -{ - if (!attr->left_connection) - attr->left_connection = g_new0(ConnectionPoint,1); - attr->left_connection->object = obj; - if (!attr->right_connection) - attr->right_connection = g_new0(ConnectionPoint,1); - attr->right_connection->object = obj; -} diff --git a/objects/UML/umlformalparameter.c b/objects/UML/umlformalparameter.c deleted file mode 100644 index 10224f9619c8c1f753cde5f41a4a50da2acb7d86..0000000000000000000000000000000000000000 --- a/objects/UML/umlformalparameter.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * umlformalparameter.c : refactored from uml.c, class.c to final use StdProps - * PROP_TYPE_DARRAY, a list where each element is a set - * of properies described by the same StdPropDesc - * Copyright (C) 2005 Hans Breuer - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "uml.h" -#include "properties.h" - -static PropDescription umlformalparameter_props[] = { - { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Name"), NULL, NULL }, - { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Type"), NULL, NULL }, - - PROP_DESC_END -}; - -static PropOffset umlformalparameter_offsets[] = { - { "name", PROP_TYPE_STRING, offsetof(UMLFormalParameter, name) }, - { "type", PROP_TYPE_STRING, offsetof(UMLFormalParameter, type) }, - { NULL, 0, 0 }, -}; - -PropDescDArrayExtra umlformalparameter_extra = { - { umlformalparameter_props, umlformalparameter_offsets, "umlformalparameter" }, - (NewRecordFunc)uml_formalparameter_new, - (FreeRecordFunc)uml_formalparameter_destroy -}; - -UMLFormalParameter * -uml_formalparameter_new(void) -{ - UMLFormalParameter *param; - - param = g_new0(UMLFormalParameter, 1); - param->name = g_strdup(""); - param->type = NULL; - - return param; -} - -UMLFormalParameter * -uml_formalparameter_copy(UMLFormalParameter *param) -{ - UMLFormalParameter *newparam; - - newparam = g_new0(UMLFormalParameter, 1); - - newparam->name = g_strdup(param->name); - if (param->type != NULL) { - newparam->type = g_strdup(param->type); - } else { - newparam->type = NULL; - } - - return newparam; -} - -void -uml_formalparameter_destroy(UMLFormalParameter *param) -{ - g_free(param->name); - if (param->type != NULL) - g_free(param->type); - g_free(param); -} - -void -uml_formalparameter_write(AttributeNode attr_node, UMLFormalParameter *param, - DiaContext *ctx) -{ - DataNode composite; - - composite = data_add_composite(attr_node, "umlformalparameter", ctx); - - data_add_string(composite_add_attribute(composite, "name"), - param->name, ctx); - data_add_string(composite_add_attribute(composite, "type"), - param->type, ctx); -} - -char * -uml_get_formalparameter_string (UMLFormalParameter *parameter) -{ - int len; - char *str; - - /* Calculate length: */ - len = parameter->name ? strlen (parameter->name) : 0; - - if (parameter->type != NULL) { - len += 1 + strlen (parameter->type); - } - - /* Generate string: */ - str = g_malloc (sizeof (char) * (len + 1)); - strcpy (str, parameter->name ? parameter->name : ""); - if (parameter->type != NULL) { - strcat (str, ":"); - strcat (str, parameter->type); - } - - g_assert (strlen (str) == len); - - return str; -} - diff --git a/objects/UML/umloperation.c b/objects/UML/umloperation.c deleted file mode 100644 index bf7924cca2179a6b2bc413143d2573baaf3e4d4f..0000000000000000000000000000000000000000 --- a/objects/UML/umloperation.c +++ /dev/null @@ -1,455 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * umloperation.c : refactored from uml.c, class.c to final use StdProps - * PROP_TYPE_DARRAY, a list where each element is a set - * of properies described by the same StdPropDesc - * Copyright (C) 2005 Hans Breuer - * - * 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. - */ - -/* - -classType = dia.get_object_type ("UML - Class") -operType = dia.get_object_type ("UML - Operation") -paramType = dia.get_object_type ("UML - Parameter") -for c in theClasses : - klass, h1, h2 = classType.create (0,0) # p.x, p.y - for f in theFunctions : - oper, _h1, _h2 = operType.create (0,0) - oper.properties["name"] = f.name - oper.properties["type"] = f.type - - for p in f.parameters : - param, _h1, _h2 = paramType.create(0,0) - param.properties["name"] = p.name - param.properties["type"] = p.type - - oper.insert(param, -1) - klass.insert(oper, -1) - layer.add_object(klass) - - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include "uml.h" -#include "properties.h" - -extern PropEnumData _uml_visibilities[]; -extern PropEnumData _uml_inheritances[]; - -static PropDescription umloperation_props[] = { - { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Name"), NULL, NULL }, - { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Type"), NULL, NULL }, - { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Comment"), NULL, NULL }, - { "stereotype", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Stereotype"), NULL, NULL }, - /* visibility: public, protected, private (other languages?) */ - { "visibility", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Visibility"), NULL, _uml_visibilities }, - { "inheritance_type", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Inheritance"), NULL, _uml_inheritances }, - { "query", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Query"), NULL, N_("C++ const method") }, - { "class_scope", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Scope"), NULL, N_("Class scope (C++ static method)") }, - { "parameters", PROP_TYPE_DARRAY, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Parameters"), NULL, NULL }, - - PROP_DESC_END -}; - -static PropOffset umloperation_offsets[] = { - { "name", PROP_TYPE_STRING, offsetof(UMLOperation, name) }, - { "type", PROP_TYPE_STRING, offsetof(UMLOperation, type) }, - { "comment", PROP_TYPE_MULTISTRING, offsetof(UMLOperation, comment) }, - { "stereotype", PROP_TYPE_STRING, offsetof(UMLOperation, stereotype) }, - { "visibility", PROP_TYPE_ENUM, offsetof(UMLOperation, visibility) }, - { "inheritance_type", PROP_TYPE_ENUM, offsetof(UMLOperation, inheritance_type) }, - { "query", PROP_TYPE_BOOL, offsetof(UMLOperation, query) }, - { "class_scope", PROP_TYPE_BOOL, offsetof(UMLOperation, class_scope) }, - { "parameters", PROP_TYPE_DARRAY, offsetof(UMLOperation, parameters) }, - { NULL, 0, 0 }, -}; - -PropDescDArrayExtra umloperation_extra = { - { umloperation_props, umloperation_offsets, "umloperation" }, - (NewRecordFunc)uml_operation_new, - (FreeRecordFunc)uml_operation_destroy -}; - -UMLOperation * -uml_operation_new(void) -{ - UMLOperation *op; - static gint next_id = 1; - - op = g_new0(UMLOperation, 1); - op->internal_id = next_id++; - op->name = g_strdup(""); - op->comment = g_strdup(""); - op->visibility = UML_PUBLIC; - op->inheritance_type = UML_LEAF; - -#if 0 /* setup elsewhere */ - op->left_connection = g_new0(ConnectionPoint, 1); - op->right_connection = g_new0(ConnectionPoint, 1); -#endif - return op; -} - -void -uml_operation_copy_into(UMLOperation *srcop, UMLOperation *destop) -{ - UMLParameter *param; - UMLParameter *newparam; - GList *list; - - destop->internal_id = srcop->internal_id; - - if (destop->name != NULL) { - g_free(destop->name); - } - destop->name = g_strdup(srcop->name); - - if (destop->type != NULL) { - g_free(destop->type); - } - if (srcop->type != NULL) { - destop->type = g_strdup(srcop->type); - } else { - destop->type = NULL; - } - - if (destop->stereotype != NULL) { - g_free(destop->stereotype); - } - if(srcop->stereotype != NULL) { - destop->stereotype = g_strdup(srcop->stereotype); - } else { - destop->stereotype = NULL; - } - - if (destop->comment != NULL) { - g_free(destop->comment); - } - if (srcop->comment != NULL) { - destop->comment = g_strdup(srcop->comment); - } else { - destop->comment = NULL; - } - - destop->visibility = srcop->visibility; - destop->class_scope = srcop->class_scope; - destop->inheritance_type = srcop->inheritance_type; - destop->query = srcop->query; - - list = destop->parameters; - while (list != NULL) { - param = (UMLParameter *)list->data; - uml_parameter_destroy(param); - list = g_list_next(list); - } - destop->parameters = NULL; - list = srcop->parameters; - while (list != NULL) { - param = (UMLParameter *)list->data; - - newparam = g_new0(UMLParameter, 1); - newparam->name = g_strdup(param->name); - newparam->type = g_strdup(param->type); - newparam->comment = g_strdup(param->comment); - - if (param->value != NULL) - newparam->value = g_strdup(param->value); - else - newparam->value = NULL; - newparam->kind = param->kind; - - destop->parameters = g_list_append(destop->parameters, newparam); - - list = g_list_next(list); - } -} - -UMLOperation * -uml_operation_copy(UMLOperation *op) -{ - UMLOperation *newop; - - newop = g_new0(UMLOperation, 1); - - uml_operation_copy_into(op, newop); -#if 0 /* setup elsewhere */ - newop->left_connection = g_new0(ConnectionPoint,1); - *newop->left_connection = *op->left_connection; - newop->left_connection->object = NULL; /* must be setup later */ - - newop->right_connection = g_new0(ConnectionPoint,1); - *newop->right_connection = *op->right_connection; - newop->right_connection->object = NULL; /* must be setup later */ -#endif - return newop; -} - -void -uml_operation_destroy(UMLOperation *op) -{ - GList *list; - UMLParameter *param; - - g_free(op->name); - if (op->type != NULL) - g_free(op->type); - if (op->stereotype != NULL) - g_free(op->stereotype); - - g_free(op->comment); - - list = op->parameters; - while (list != NULL) { - param = (UMLParameter *)list->data; - uml_parameter_destroy(param); - list = g_list_next(list); - } - if (op->wrappos) { - g_list_free(op->wrappos); - } - -#if 0 /* freed elsewhere */ - /* These are merely temporary reminders, don't need to unconnect */ - g_free(op->left_connection); - g_free(op->right_connection); -#endif - g_free(op); -} - -void -uml_operation_write(AttributeNode attr_node, UMLOperation *op, DiaContext *ctx) -{ - GList *list; - UMLParameter *param; - DataNode composite; - DataNode composite2; - AttributeNode attr_node2; - - composite = data_add_composite(attr_node, "umloperation", ctx); - - data_add_string(composite_add_attribute(composite, "name"), - op->name, ctx); - data_add_string(composite_add_attribute(composite, "stereotype"), - op->stereotype, ctx); - data_add_string(composite_add_attribute(composite, "type"), - op->type, ctx); - data_add_enum(composite_add_attribute(composite, "visibility"), - op->visibility, ctx); - data_add_string(composite_add_attribute(composite, "comment"), - op->comment, ctx); - /* Backward compatibility */ - data_add_boolean(composite_add_attribute(composite, "abstract"), - op->inheritance_type == UML_ABSTRACT, ctx); - data_add_enum(composite_add_attribute(composite, "inheritance_type"), - op->inheritance_type, ctx); - data_add_boolean(composite_add_attribute(composite, "query"), - op->query, ctx); - data_add_boolean(composite_add_attribute(composite, "class_scope"), - op->class_scope, ctx); - - attr_node2 = composite_add_attribute(composite, "parameters"); - - list = op->parameters; - while (list != NULL) { - param = (UMLParameter *) list->data; - - composite2 = data_add_composite(attr_node2, "umlparameter", ctx); - - data_add_string(composite_add_attribute(composite2, "name"), - param->name, ctx); - data_add_string(composite_add_attribute(composite2, "type"), - param->type, ctx); - data_add_string(composite_add_attribute(composite2, "value"), - param->value, ctx); - data_add_string(composite_add_attribute(composite2, "comment"), - param->comment, ctx); - data_add_enum(composite_add_attribute(composite2, "kind"), - param->kind, ctx); - list = g_list_next(list); - } -} - -extern char visible_char[]; - -char * -uml_get_operation_string (UMLOperation *operation) -{ - int len; - char *str; - GList *list; - UMLParameter *param; - - /* Calculate length: */ - len = 1 + (operation->name ? strlen (operation->name) : 0) + 1; - if(operation->stereotype != NULL && operation->stereotype[0] != '\0') { - len += 5 + strlen (operation->stereotype); - } - - list = operation->parameters; - while (list != NULL) { - param = (UMLParameter *) list->data; - list = g_list_next (list); - - switch(param->kind) - { - case UML_UNDEF_KIND: - break; - case UML_IN: - len += 3; - break; - case UML_OUT: - len += 4; - break; - case UML_INOUT: - len += 6; - break; - } - len += (param->name ? strlen (param->name) : 0); - if (param->type != NULL) { - len += strlen (param->type); - if (param->type[0] && (param->name != NULL && param->name[0])) { - len += 1; - } - } - if (param->value != NULL && param->value[0] != '\0') { - len += 1 + strlen (param->value); - } - - if (list != NULL) { - len += 1; /* ',' */ - } - } - - len += 1; /* ')' */ - if (operation->type != NULL && operation->type[0]) { - len += 2 + strlen (operation->type); - } - if(operation->query != 0) { - len += 6; - } - - /* generate string: */ - str = g_malloc (sizeof (char) * (len + 1)); - - str[0] = visible_char[(int) operation->visibility]; - str[1] = 0; - - if(operation->stereotype != NULL && operation->stereotype[0] != '\0') { - strcat(str, UML_STEREOTYPE_START); - strcat(str, operation->stereotype); - strcat(str, UML_STEREOTYPE_END); - strcat(str, " "); - } - - strcat (str, operation->name ? operation->name : ""); - strcat (str, "("); - - list = operation->parameters; - while (list != NULL) { - param = (UMLParameter *) list->data; - list = g_list_next (list); - - switch(param->kind) - { - case UML_UNDEF_KIND: - break; - case UML_IN: - strcat (str, "in "); - break; - case UML_OUT: - strcat (str, "out "); - break; - case UML_INOUT: - strcat (str, "inout "); - break; - } - strcat (str, param->name ? param->name : ""); - - if (param->type != NULL) { - if (param->type[0] && (param->name != NULL && param->name[0])) { - strcat (str, ":"); - } - strcat (str, param->type); - } - - if (param->value != NULL && param->value[0] != '\0') { - strcat (str, "="); - strcat (str, param->value); - } - - if (list != NULL) { - strcat (str, ","); - } - } - strcat (str, ")"); - - if (operation->type != NULL && - operation->type[0]) { - strcat (str, ": "); - strcat (str, operation->type); - } - - if (operation->query != 0) { - strcat(str, " const"); - } - - g_assert (strlen (str) == len); - - return str; -} - -/*! - * The ownership of these connection points is quite complicated. Instead of being part of - * the UMLOperation as one may expect at first, they are somewhat in between the DiaObject - * (see: DiaObject::connections and the concrete user, here UMLClass) and the UMLOperation. - * - * But with taking undo state mangement into account it gets even worse. Deleted (to be - * restored connection points) live inside the UMLClassChange until they get reverted back - * to the object *or* get free'd by umlclass_change_free() - * - * Since the implementation of attributes/operations being settable via StdProps there are - * more places to keep this stuff consitent. So here comes a tolerant helper. - * - * NOTE: Same function as uml_attribute_ensure_connection_points(), - * with C++ it would be a template function ;) - */ -void -uml_operation_ensure_connection_points (UMLOperation* op, DiaObject* obj) -{ - if (!op->left_connection) - op->left_connection = g_new0(ConnectionPoint,1); - op->left_connection->object = obj; - if (!op->right_connection) - op->right_connection = g_new0(ConnectionPoint,1); - op->right_connection->object = obj; -} diff --git a/objects/UML/umlparameter.c b/objects/UML/umlparameter.c deleted file mode 100644 index 0fb35221bc2870372c350c9577a863736ab5cd6f..0000000000000000000000000000000000000000 --- a/objects/UML/umlparameter.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * umlparameter.c : refactored from uml.c, class.c to final use StdProps - * PROP_TYPE_DARRAY, a list where each element is a set - * of properies described by the same StdPropDesc - * Copyright (C) 2005 Hans Breuer - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "uml.h" -#include "properties.h" - -static PropEnumData _uml_parameter_kinds[] = { - { N_("Undefined"), UML_UNDEF_KIND} , - { N_("In"), UML_IN }, - { N_("Out"), UML_OUT }, - { N_("In & Out"), UML_INOUT }, - { NULL, 0 } -}; - -static PropDescription umlparameter_props[] = { - { "name", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Name"), NULL, NULL }, - { "type", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Type"), NULL, NULL }, - { "value", PROP_TYPE_STRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Value"), NULL, NULL }, - { "comment", PROP_TYPE_MULTISTRING, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Comment"), NULL, NULL }, - { "kind", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL, - N_("Kind"), NULL, _uml_parameter_kinds }, - - PROP_DESC_END -}; - -static PropOffset umlparameter_offsets[] = { - { "name", PROP_TYPE_STRING, offsetof(UMLParameter, name) }, - { "type", PROP_TYPE_STRING, offsetof(UMLParameter, type) }, - { "value", PROP_TYPE_STRING, offsetof(UMLParameter, value) }, - { "comment", PROP_TYPE_MULTISTRING, offsetof(UMLParameter, comment) }, - { "kind", PROP_TYPE_ENUM, offsetof(UMLParameter, kind) }, - { NULL, 0, 0 }, -}; - -PropDescDArrayExtra umlparameter_extra = { - { umlparameter_props, umlparameter_offsets, "umlparameter" }, - (NewRecordFunc)uml_parameter_new, - (FreeRecordFunc)uml_parameter_destroy -}; - -UMLParameter * -uml_parameter_new(void) -{ - UMLParameter *param; - - param = g_new0(UMLParameter, 1); - param->name = g_strdup(""); - param->type = g_strdup(""); - param->comment = g_strdup(""); - param->value = NULL; - param->kind = UML_UNDEF_KIND; - - return param; -} - -void -uml_parameter_destroy(UMLParameter *param) -{ - g_free(param->name); - g_free(param->type); - if (param->value != NULL) - g_free(param->value); - g_free(param->comment); - - g_free(param); -} - -char * -uml_get_parameter_string (UMLParameter *param) -{ - int len; - char *str; - - /* Calculate length: */ - len = strlen (param->name) + 1 + strlen (param->type); - - if (param->value != NULL) { - len += 1 + strlen (param->value) ; - } - - switch(param->kind) - { - case UML_UNDEF_KIND: - break; - case UML_IN: - len += 3; - break; - case UML_OUT: - len += 4; - break; - case UML_INOUT: - len += 6; - break; - } - - /* Generate string: */ - str = g_malloc (sizeof (char) * (len + 1)); - - strcpy(str, ""); - - switch(param->kind) - { - case UML_UNDEF_KIND: - break; - case UML_IN: - strcat (str, "in "); - break; - case UML_OUT: - strcat (str, "out "); - break; - case UML_INOUT: - strcat (str, "inout "); - break; - } - - - strcat (str, param->name); - strcat (str, ":"); - strcat (str, param->type); - if (param->value != NULL) { - strcat (str, "="); - strcat (str, param->value); - } - - g_assert (strlen (str) == len); - - return str; -} - diff --git a/objects/UML/usecase.c b/objects/UML/usecase.c index c52e8efd4df483e37609a05374b447ccadaf45f3..62a798a94ab389ba36ad21252cea050462e40f48 100644 --- a/objects/UML/usecase.c +++ b/objects/UML/usecase.c @@ -50,8 +50,8 @@ struct _Usecase { int collaboration; real line_width; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; }; diff --git a/objects/chronogram/chronoline.c b/objects/chronogram/chronoline.c index b160bcc089604b41b480a143e510c7d7f11abbf9..1abaf324d826c6383ea841b132418dfebcbf6d1d 100644 --- a/objects/chronogram/chronoline.c +++ b/objects/chronogram/chronoline.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "chronogram.h" @@ -54,11 +53,11 @@ typedef struct _Chronoline { Element element; real main_lwidth; - Color color; + GdkRGBA color; real start_time; real end_time; real data_lwidth; - Color data_color; + GdkRGBA data_color; char *events; char *name; real rise_time; @@ -66,7 +65,7 @@ typedef struct _Chronoline { gboolean multibit; DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; /* computed values : */ ConnPointLine *snap; /* not saved ; num_connections derived from @@ -76,7 +75,7 @@ typedef struct _Chronoline { int checksum; real labelwidth; real y_down,y_up; - Color gray, datagray; + GdkRGBA gray, datagray; } Chronoline; @@ -470,7 +469,7 @@ chronoline_draw(Chronoline *chronoline, DiaRenderer *renderer) &chronoline->font_color); } -inline static void grayify(Color *col,Color *src) +inline static void grayify(GdkRGBA *col,GdkRGBA *src) { col->red = .5 * (src->red + color_white.red); col->green = .5 * (src->green + color_white.green); diff --git a/objects/chronogram/chronoref.c b/objects/chronogram/chronoref.c index a82e532dcfc6a9362e6d1e8c25669c85e91213ce..f99917fcf35627c5f1ea461a156ee31aaf6a9293 100644 --- a/objects/chronogram/chronoref.c +++ b/objects/chronogram/chronoref.c @@ -39,7 +39,6 @@ #include "attributes.h" #include "text.h" #include "connpoint_line.h" -#include "color.h" #include "properties.h" #include "chronogram.h" @@ -53,7 +52,7 @@ typedef struct _Chronoref { real main_lwidth; real light_lwidth; - Color color; + GdkRGBA color; real start_time; real end_time; real time_step; @@ -61,7 +60,7 @@ typedef struct _Chronoref { DiaFont *font; real font_size; - Color font_color; + GdkRGBA font_color; ConnPointLine *scale; /* not saved ; num_connections derived from start_time, end_time, time_step. */ diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c index d22a195dfebed224775ba0c868b63798f308e80e..88bb5a48bbd6cf136e3fc74b316b6c93aa7e5d33 100644 --- a/objects/custom/custom_object.c +++ b/objects/custom/custom_object.c @@ -101,8 +101,8 @@ struct _Custom { ConnectionPoint *connections; /*! width calculate from line_width */ real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -131,7 +131,7 @@ static void custom_draw_displaylist(GList *display_list, Custom *custom, static void custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer, GArray *arr, GArray *barr, real* cur_line, real* cur_dash, LineCaps* cur_caps, LineJoin* cur_join, - LineStyle* cur_style, Color* fg, Color* bg); + LineStyle* cur_style, GdkRGBA* fg, GdkRGBA* bg); static void custom_update_data(Custom *custom, AnchorShape h, AnchorShape v); static void custom_reposition_text(Custom *custom, GraphicElementText *text); static DiaObject *custom_create(Point *startpoint, @@ -820,7 +820,7 @@ custom_move(Custom *custom, Point *to) } static void -get_colour(Custom *custom, Color *colour, gint32 c, real opacity) +get_colour(Custom *custom, GdkRGBA *colour, gint32 c, real opacity) { switch (c) { case DIA_SVG_COLOUR_NONE: @@ -889,7 +889,7 @@ custom_draw_displaylist(GList *display_list, Custom *custom, DiaRenderer *render GList *tmp; for (tmp = display_list; tmp; tmp = tmp->next) { GraphicElement *el = tmp->data; - Color fg, bg; + GdkRGBA fg, bg; /* * Because we do not know if any of these values are reused in the loop, @@ -905,7 +905,7 @@ static void custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer, GArray *arr, GArray *barr, real* cur_line, real* cur_dash, LineCaps* cur_caps, LineJoin* cur_join, LineStyle* cur_style, - Color* fg, Color* bg) + GdkRGBA* fg, GdkRGBA* bg) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point p1, p2; diff --git a/objects/custom/shape_info.c b/objects/custom/shape_info.c index c73c6ada370bdad6c1817e892490f37888f51879..f672978d852eb5351c9cad2faf19e3ea9da9019e 100644 --- a/objects/custom/shape_info.c +++ b/objects/custom/shape_info.c @@ -39,7 +39,7 @@ #include "intl.h" #include "prefs.h" #include "boundingbox.h" - +#include "attributes.h" #include "units.h" #define FONT_HEIGHT_DEFAULT 1 diff --git a/objects/custom_lines/line_info.h b/objects/custom_lines/line_info.h index 48c0b2d5b08902977fbfe7986a23eb80ec4d2d1e..fbd9bf3aa236e9e08bbfef2d82d33e641d5db8e1 100644 --- a/objects/custom_lines/line_info.h +++ b/objects/custom_lines/line_info.h @@ -49,7 +49,7 @@ typedef struct _LineInfo { gchar *name; gchar *icon_filename; CustomLineType type; - Color line_color; + GdkRGBA line_color; LineStyle line_style; real dashlength; real line_width; diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c index f9948f1e0c10cda1c84066273970444c864de045..ddad5113183cd67c307390cba89ef7046e7e304c 100644 --- a/objects/flowchart/box.c +++ b/objects/flowchart/box.c @@ -58,8 +58,8 @@ struct _Box { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -592,11 +592,11 @@ box_save(Box *box, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), box->border_width, ctx); - if (!color_equals(&box->border_color, &color_black)) + if (!gdk_rgba_equal(&box->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &box->border_color, ctx); - if (!color_equals(&box->inner_color, &color_white)) + if (!gdk_rgba_equal(&box->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &box->inner_color, ctx); diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c index 9018150d42d15ef6f08ed4e39be9e49da37ed484..2140a38f7176c36b0fc75c2777b300fc48564abe 100644 --- a/objects/flowchart/diamond.c +++ b/objects/flowchart/diamond.c @@ -59,8 +59,8 @@ struct _Diamond { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -563,11 +563,11 @@ diamond_save(Diamond *diamond, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), diamond->border_width, ctx); - if (!color_equals(&diamond->border_color, &color_black)) + if (!gdk_rgba_equal(&diamond->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &diamond->border_color, ctx); - if (!color_equals(&diamond->inner_color, &color_white)) + if (!gdk_rgba_equal(&diamond->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &diamond->inner_color, ctx); diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c index e34515938cd971369f2a1443b4c35d6a77132830..8e31c69188c8be87a6ba48d0dec0ff360260b927 100644 --- a/objects/flowchart/ellipse.c +++ b/objects/flowchart/ellipse.c @@ -59,8 +59,8 @@ struct _Ellipse { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -535,11 +535,11 @@ ellipse_save(Ellipse *ellipse, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), ellipse->border_width, ctx); - if (!color_equals(&ellipse->border_color, &color_black)) + if (!gdk_rgba_equal(&ellipse->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &ellipse->border_color, ctx); - if (!color_equals(&ellipse->inner_color, &color_white)) + if (!gdk_rgba_equal(&ellipse->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &ellipse->inner_color, ctx); diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c index 1da7356c6eae80fed7de40562f245c669698290e..276e6dfc63f5b236349e67e3e46125d69970d08d 100644 --- a/objects/flowchart/parallelogram.c +++ b/objects/flowchart/parallelogram.c @@ -59,8 +59,8 @@ struct _Pgram { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; real dashlength; @@ -619,11 +619,11 @@ pgram_save(Pgram *pgram, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), pgram->border_width, ctx); - if (!color_equals(&pgram->border_color, &color_black)) + if (!gdk_rgba_equal(&pgram->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &pgram->border_color, ctx); - if (!color_equals(&pgram->inner_color, &color_white)) + if (!gdk_rgba_equal(&pgram->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &pgram->inner_color, ctx); diff --git a/objects/makefile.msc b/objects/makefile.msc index 286d846667f8fe48f4b40cf7e5e455bafc70b3ee..a814188f92dbaa9b83cfcef3fa60290132131737 100644 --- a/objects/makefile.msc +++ b/objects/makefile.msc @@ -47,8 +47,7 @@ DEFINES = \ -DGTK_DISABLE_DEPRECATED \ PKG_LINK = $(GLIB_LIBS) $(INTL_LIBS) \ - $(PRJ_TOP)\lib\libdia.lib \ - $(CAIRO_LIBS) + $(PRJ_TOP)\lib\libdia.lib # # Object definitions for the various plugins diff --git a/objects/network/basestation.c b/objects/network/basestation.c index 91d662c7f73ae684e5f283ad42d70ee4790354ac..919cf4f8eedb2a7644612c0e4fd493b968bd901a 100644 --- a/objects/network/basestation.c +++ b/objects/network/basestation.c @@ -45,8 +45,8 @@ struct _Basestation { ConnectionPoint connections[NUM_CONNECTIONS]; - Color line_colour; - Color fill_colour; + GdkRGBA line_colour; + GdkRGBA fill_colour; Text *text; diff --git a/objects/network/bus.c b/objects/network/bus.c index 1734a31a5dde358285018a522cc587779c5198c2..0a202e8ec4357a74d37d6d34deaac95d4c095b85 100644 --- a/objects/network/bus.c +++ b/objects/network/bus.c @@ -47,7 +47,7 @@ typedef struct _Bus { Handle **handles; Point *parallel_points; Point real_ends[2]; - Color line_color; + GdkRGBA line_color; } Bus; enum change_type { diff --git a/objects/network/radiocell.c b/objects/network/radiocell.c index 393350382a9bbb70ea4de0be76f0013c6ba28f5a..51a7e6b8773088673bb42bf77f53292ded0b2453 100644 --- a/objects/network/radiocell.c +++ b/objects/network/radiocell.c @@ -45,12 +45,12 @@ struct _RadioCell { PolyShape poly; /* always 1st! */ real radius; /* pseudo-radius */ Point center; /* point in the center */ - Color line_colour; + GdkRGBA line_colour; LineStyle line_style; real dashlength; real line_width; gboolean show_background; - Color fill_colour; + GdkRGBA fill_colour; Text *text; }; diff --git a/objects/network/wanlink.c b/objects/network/wanlink.c index b503b6c3bd1305d8738734ff678db6cb540f7cee..391abe7e1ab1c13acba1f4d9de410b45f15a063b 100644 --- a/objects/network/wanlink.c +++ b/objects/network/wanlink.c @@ -44,8 +44,8 @@ typedef struct _WanLink { Connection connection; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; real width; Point poly[WANLINK_POLY_LEN]; diff --git a/objects/standard/arc.c b/objects/standard/arc.c index 425a1d6e31d4378268ed76685f21037a9156885f..0a48ffcfa6281bbca466603ef95f854deb3321e7 100644 --- a/objects/standard/arc.c +++ b/objects/standard/arc.c @@ -56,7 +56,7 @@ struct _Arc { Handle middle_handle; /*!< _Handle on the middle of the cicumference portion */ Handle center_handle; /*!< Handle on he center of the full circle */ - Color arc_color; /*!< Color of the Arc */ + GdkRGBA arc_color; /*!< Color of the Arc */ real curve_distance; /*!< distance between middle_handle and chord */ real line_width; /*!< line width for the Arc */ LineStyle line_style; /*!< line style for the Arc */ @@ -653,7 +653,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer) if (renderer->is_interactive && dia_object_is_selected(&arc->connection.object)) { /* draw the central angle */ - Color line_color = { 0.0, 0.0, 0.6, 1.0 }; + GdkRGBA line_color = { 0.0, 0.0, 0.6, 1.0 }; renderer_ops->set_linewidth(renderer, 0); renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1); @@ -942,7 +942,7 @@ arc_save(Arc *arc, ObjectNode obj_node, DiaContext *ctx) { connection_save(&arc->connection, obj_node, ctx); - if (!color_equals(&arc->arc_color, &color_black)) + if (!gdk_rgba_equal(&arc->arc_color, &color_black)) data_add_color(new_attribute(obj_node, "arc_color"), &arc->arc_color, ctx); diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c index 005d5031dd2493d7c18ec25cd940da20592a76d8..1599fe3c17dedaf85367c2e4c3496fbb10cec21f 100644 --- a/objects/standard/bezier.c +++ b/objects/standard/bezier.c @@ -50,7 +50,7 @@ typedef struct _Bezierline Bezierline; struct _Bezierline { BezierConn bez; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -606,7 +606,7 @@ bezierline_save(Bezierline *bezierline, ObjectNode obj_node, } bezierconn_save(&bezierline->bez, obj_node, ctx); - if (!color_equals(&bezierline->line_color, &color_black)) + if (!gdk_rgba_equal(&bezierline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &bezierline->line_color, ctx); diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c index 52d1b1ac6cd42afe61b2d7e4ac088399ec99cf2f..8f87d6cd438864a74ccacc12010ec12b4a1b6cef 100644 --- a/objects/standard/beziergon.c +++ b/objects/standard/beziergon.c @@ -49,10 +49,10 @@ typedef struct _Beziergon { BezierShape bezier; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; real dashlength; real line_width; @@ -231,7 +231,7 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer) renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); if (beziergon->show_background) { - Color fill = beziergon->inner_color; + GdkRGBA fill = beziergon->inner_color; if (beziergon->pattern) { dia_pattern_get_fallback_color (beziergon->pattern, &fill); if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN)) @@ -381,7 +381,7 @@ beziergon_save(Beziergon *beziergon, ObjectNode obj_node, { beziershape_save(&beziergon->bezier, obj_node, ctx); - if (!color_equals(&beziergon->line_color, &color_black)) + if (!gdk_rgba_equal(&beziergon->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &beziergon->line_color, ctx); @@ -389,7 +389,7 @@ beziergon_save(Beziergon *beziergon, ObjectNode obj_node, data_add_real(new_attribute(obj_node, PROP_STDNAME_LINE_WIDTH), beziergon->line_width, ctx); - if (!color_equals(&beziergon->inner_color, &color_white)) + if (!gdk_rgba_equal(&beziergon->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &beziergon->inner_color, ctx); diff --git a/objects/standard/box.c b/objects/standard/box.c index 2992b6a9970d3805fd3d814b9c1a81b6ea4cb584..520284d912d200fb4f318255ceb93f0b04d30a56 100644 --- a/objects/standard/box.c +++ b/objects/standard/box.c @@ -61,8 +61,8 @@ struct _Box { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; LineStyle line_style; LineJoin line_join; @@ -360,7 +360,7 @@ box_draw(Box *box, DiaRenderer *renderer) renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); if (box->show_background) { - Color fill = box->inner_color; + GdkRGBA fill = box->inner_color; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); if (box->pattern) { dia_pattern_get_fallback_color (box->pattern, &fill); @@ -554,11 +554,11 @@ box_save(Box *box, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), box->border_width, ctx); - if (!color_equals(&box->border_color, &color_black)) + if (!gdk_rgba_equal(&box->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &box->border_color, ctx); - if (!color_equals(&box->inner_color, &color_white)) + if (!gdk_rgba_equal(&box->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &box->inner_color, ctx); diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c index 7496463310425d89fb9d3f1ffae85b5bc7cc4135..79c89d90209f3a9cba68561435cf58073536d4d6 100644 --- a/objects/standard/ellipse.c +++ b/objects/standard/ellipse.c @@ -60,14 +60,14 @@ struct _Ellipse { Handle center_handle; real border_width; - Color border_color; - Color inner_color; + GdkRGBA border_color; + GdkRGBA inner_color; gboolean show_background; AspectType aspect; LineStyle line_style; real dashlength; DiaPattern *pattern; - real angle; /*!< between [-45-45] to simplify connection point handling */ + real angle; /*!< between [-45�-45�] to simplify connection point handling */ }; static struct _EllipseProperties { @@ -351,7 +351,7 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer) renderer_ops->set_linewidth(renderer, ellipse->border_width); renderer_ops->set_linestyle(renderer, ellipse->line_style, ellipse->dashlength); if (ellipse->show_background) { - Color fill = ellipse->inner_color; + GdkRGBA fill = ellipse->inner_color; renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID); if (ellipse->pattern) { dia_pattern_get_fallback_color (ellipse->pattern, &fill); @@ -569,11 +569,11 @@ ellipse_save(Ellipse *ellipse, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), ellipse->border_width, ctx); - if (!color_equals(&ellipse->border_color, &color_black)) + if (!gdk_rgba_equal(&ellipse->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &ellipse->border_color, ctx); - if (!color_equals(&ellipse->inner_color, &color_white)) + if (!gdk_rgba_equal(&ellipse->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &ellipse->inner_color, ctx); diff --git a/objects/standard/image.c b/objects/standard/image.c index a2d556f7b4a35d04bc01185d4263cad719b1129c..8cd83351eec434b1003ea532805f436357c477f7 100644 --- a/objects/standard/image.c +++ b/objects/standard/image.c @@ -59,7 +59,7 @@ struct _Image { ConnectionPoint connections[NUM_CONNECTIONS]; real border_width; - Color border_color; + GdkRGBA border_color; LineStyle line_style; real dashlength; @@ -699,7 +699,7 @@ image_save(Image *image, ObjectNode obj_node, DiaContext *ctx) data_add_real(new_attribute(obj_node, "border_width"), image->border_width, ctx); - if (!color_equals(&image->border_color, &color_black)) + if (!gdk_rgba_equal(&image->border_color, &color_black)) data_add_color(new_attribute(obj_node, "border_color"), &image->border_color, ctx); diff --git a/objects/standard/line.c b/objects/standard/line.c index 53c576242b18450e7183d2f31160f66f55a3da90..4b52f3a7a12bd45650f6a38ef5493a15d95be4f2 100644 --- a/objects/standard/line.c +++ b/objects/standard/line.c @@ -57,7 +57,7 @@ typedef struct _Line { ConnPointLine *cpl; - Color line_color; + GdkRGBA line_color; real line_width; LineStyle line_style; LineCaps line_caps; @@ -646,7 +646,7 @@ line_save(Line *line, ObjectNode obj_node, DiaContext *ctx) connpointline_save(line->cpl, obj_node, "numcp", ctx); - if (!color_equals(&line->line_color, &color_black)) + if (!gdk_rgba_equal(&line->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &line->line_color, ctx); diff --git a/objects/standard/outline.c b/objects/standard/outline.c index 1cb5541a15fb7b53f094367f4923ffd2aea9fc3d..d9f606c95fb5a3ef946c6299defb5288a8297a16 100644 --- a/objects/standard/outline.c +++ b/objects/standard/outline.c @@ -37,12 +37,8 @@ #include "tool-icons.h" -#ifdef HAVE_CAIRO #include - -#ifdef CAIRO_HAS_SVG_SURFACE #include -#endif #define NUM_HANDLES 2 @@ -60,8 +56,8 @@ typedef struct _Outline { DiaFont *font; real font_height; - Color line_color; - Color fill_color; + GdkRGBA line_color; + GdkRGBA fill_color; gboolean show_background; real line_width; @@ -277,12 +273,7 @@ outline_update_data (Outline *outline) cairo_path_destroy (outline->path); outline->path = NULL; /* surface will not be used to render anything, it is just to create the cairo context */ -#ifdef CAIRO_HAS_SVG_SURFACE surface = cairo_svg_surface_create_for_stream (write_nul, NULL, 100, 100); -#else - /* if only I could remember why I have choosen the svg surface in the first place */ - surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100); -#endif cr = cairo_create (surface); cairo_surface_destroy (surface); /* in fact: unref() */ style = dia_font_get_style (outline->font); @@ -554,5 +545,3 @@ outline_select (Outline *outline, Point *clicked_point, { outline_update_handles (outline); } - -#endif /* HAVE_CAIRO */ diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c index 103ce79bef146cdbd9021e3aa3736f4eb84e2321..634d7475323aeb7b02151da2ac3eddb2ce4eea51 100644 --- a/objects/standard/polygon.c +++ b/objects/standard/polygon.c @@ -54,10 +54,10 @@ Fix crashes:) typedef struct _Polygon { PolyShape poly; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; - Color inner_color; + GdkRGBA inner_color; gboolean show_background; real dashlength; real line_width; @@ -222,7 +222,7 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer) PolyShape *poly = &polygon->poly; Point *points; int n; - Color fill; + GdkRGBA fill; points = &poly->points[0]; n = poly->numpoints; @@ -352,7 +352,7 @@ polygon_save(Polygon *polygon, ObjectNode obj_node, { polyshape_save(&polygon->poly, obj_node, ctx); - if (!color_equals(&polygon->line_color, &color_black)) + if (!gdk_rgba_equal(&polygon->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &polygon->line_color, ctx); @@ -360,7 +360,7 @@ polygon_save(Polygon *polygon, ObjectNode obj_node, data_add_real(new_attribute(obj_node, PROP_STDNAME_LINE_WIDTH), polygon->line_width, ctx); - if (!color_equals(&polygon->inner_color, &color_white)) + if (!gdk_rgba_equal(&polygon->inner_color, &color_white)) data_add_color(new_attribute(obj_node, "inner_color"), &polygon->inner_color, ctx); diff --git a/objects/standard/polyline.c b/objects/standard/polyline.c index 80468ca7c510b965904e55fa44dd424c779d0d67..e4150a5d3c72b0c79db449b2ac7ef89bde679729 100644 --- a/objects/standard/polyline.c +++ b/objects/standard/polyline.c @@ -45,7 +45,7 @@ typedef struct _Polyline { PolyConn poly; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -468,7 +468,7 @@ polyline_save(Polyline *polyline, ObjectNode obj_node, { polyconn_save(&polyline->poly, obj_node, ctx); - if (!color_equals(&polyline->line_color, &color_black)) + if (!gdk_rgba_equal(&polyline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &polyline->line_color, ctx); diff --git a/objects/standard/standard.c b/objects/standard/standard.c index ea75b974d9ce651ecd846944727fb7516bdfd1b7..f21dfea8ebe7d1c6070e69fa2b6ec9ff654bf097 100644 --- a/objects/standard/standard.c +++ b/objects/standard/standard.c @@ -68,9 +68,7 @@ dia_plugin_init(PluginInfo *info) object_register_type(_bezierline_type); object_register_type(_textobj_type); object_register_type(_image_type); -#ifdef HAVE_CAIRO object_register_type(_outline_type); -#endif object_register_type(_polygon_type); object_register_type(_beziergon_type); diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c index 37eb0f20e8a8a46a499b4af7f695f117c0cc32d5..3552a92d6a79d896fb8887d485c243c2781806b5 100644 --- a/objects/standard/textobj.c +++ b/objects/standard/textobj.c @@ -62,7 +62,7 @@ struct _Textobj { /*! vertical alignment of the whole text block */ Valign vert_align; /*! bounding box filling */ - Color fill_color; + GdkRGBA fill_color; /*! background to be filled or transparent */ gboolean show_background; /*! margin used for background drawing and connection point placement */ @@ -409,7 +409,7 @@ textobj_create(Point *startpoint, { Textobj *textobj; DiaObject *obj; - Color col; + GdkRGBA col; DiaFont *font = NULL; real font_height; @@ -566,7 +566,7 @@ _textobj_convert_to_path_callback (DiaObject *obj, Point *clicked, gpointer data if (path) { ObjectChange *change; - Color bg = textobj->fill_color; + GdkRGBA bg = textobj->fill_color; /* FIXME: otherwise object_substitue() will tint the text with bg */ textobj->fill_color = text->color; diff --git a/objects/standard/zigzagline.c b/objects/standard/zigzagline.c index ccfffd7695f50f137bb0ecf088cf44762eff39c2..99f207b39315a3eebf229df450f71a7c47fe5ae7 100644 --- a/objects/standard/zigzagline.c +++ b/objects/standard/zigzagline.c @@ -47,7 +47,7 @@ typedef struct _Zigzagline { OrthConn orth; - Color line_color; + GdkRGBA line_color; LineStyle line_style; LineJoin line_join; LineCaps line_caps; @@ -480,7 +480,7 @@ zigzagline_save(Zigzagline *zigzagline, ObjectNode obj_node, { orthconn_save(&zigzagline->orth, obj_node, ctx); - if (!color_equals(&zigzagline->line_color, &color_black)) + if (!gdk_rgba_equal(&zigzagline->line_color, &color_black)) data_add_color(new_attribute(obj_node, "line_color"), &zigzagline->line_color, ctx); diff --git a/plug-ins/Makefile.am b/plug-ins/Makefile.am index 707fae8b61f0b74350ceb43abca6d75f7c67cc32..5b68ecbfa1a15cb3f4e4b70723c58796b7e4c0c7 100644 --- a/plug-ins/Makefile.am +++ b/plug-ins/Makefile.am @@ -1,6 +1,6 @@ # Remember to also add subdirs in configure.in SUBDIRS = cgm cairo pstricks hpgl wpg svg shape dxf python xfig \ - wmf libart metapost xslt pixbuf pgf vdx postscript \ + wmf metapost xslt pixbuf pgf vdx postscript \ drs stress layout pdf EXTRA_DIST = \ diff --git a/plug-ins/cairo/Makefile.am b/plug-ins/cairo/Makefile.am index cffc0eee630ee8911415a876129bfc54db900081..c33f6480257168df3ef64a9dce1d3b8961a893a0 100644 --- a/plug-ins/cairo/Makefile.am +++ b/plug-ins/cairo/Makefile.am @@ -1,14 +1,5 @@ -if WITH_CAIRO plugin_sources = \ - diacairo.c \ - diacairo.h \ - diacairo-interactive.c \ - diacairo-renderer.c \ - diacairo-print.c \ - diacairo-print.h -else -plugin_sources = -endif + diacairo.c pkglib_LTLIBRARIES = libcairo_filter.la diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c index c06eecf75337d8e2a5125c05d35b8ccee8430f20..62539b25d69869850d5d225133ef8a692c9e9999 100644 --- a/plug-ins/cairo/diacairo.c +++ b/plug-ins/cairo/diacairo.c @@ -32,18 +32,13 @@ #include /* some backend headers, win32 missing in official Cairo */ -#ifdef CAIRO_HAS_PNG_SURFACE_FEATURE -#include -#endif +#include #ifdef CAIRO_HAS_PS_SURFACE #include #endif #ifdef CAIRO_HAS_PDF_SURFACE #include #endif -#ifdef CAIRO_HAS_SVG_SURFACE -#include -#endif #ifdef CAIRO_HAS_WIN32_SURFACE #include /* avoid namespace collisions */ @@ -53,9 +48,7 @@ #include #endif -#ifdef HAVE_PANGOCAIRO_H #include -#endif #include "intl.h" #include "geometry.h" @@ -64,307 +57,15 @@ #include "filter.h" #include "plug-ins.h" -#include "diacairo.h" -#include "diacairo-print.h" - -typedef enum OutputKind -{ - OUTPUT_PS = 1, - OUTPUT_PNG, - OUTPUT_PNGA, - OUTPUT_PDF, - OUTPUT_WMF, - OUTPUT_EMF, - OUTPUT_CLIPBOARD, - OUTPUT_SVG, - OUTPUT_CAIRO_SCRIPT -} OutputKind; - -#if defined CAIRO_HAS_WIN32_SURFACE && CAIRO_VERSION > 10510 -#define DIA_CAIRO_CAN_EMF 1 -#pragma message ("DiaCairo can EMF;)") -#endif - -/* dia export funtion */ -static gboolean -export_data(DiagramData *data, DiaContext *ctx, - const gchar *filename, const gchar *diafilename, - void* user_data) -{ - DiaCairoRenderer *renderer; - FILE *file; - real width, height; - OutputKind kind = (OutputKind)user_data; - /* the passed in filename is in GLib's filename encoding. On Linux everything - * should be fine in passing it to the C-runtime (or cairo). On win32 GLib's - * filename encdong is always utf-8, so another conversion is needed. - */ - gchar *filename_crt = (gchar *)filename; -#if DIA_CAIRO_CAN_EMF - HDC hFileDC = NULL; -#endif - - if (kind != OUTPUT_CLIPBOARD) { - file = g_fopen(filename, "wb"); /* "wb" for binary! */ - - if (file == NULL) { - dia_context_add_message_with_errno(ctx, errno, _("Can't open output file %s."), - dia_context_get_filename(ctx)); - return FALSE; - } - fclose (file); -#ifdef G_OS_WIN32 - filename_crt = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); - if (!filename_crt) { - dia_context_add_message(ctx, _("Can't convert output filename '%s' to locale encoding.\n" - "Please choose a different name to save with Cairo.\n"), - dia_context_get_filename(ctx)); - return FALSE; - } -#endif - } /* != CLIPBOARD */ - renderer = g_object_new (DIA_TYPE_CAIRO_RENDERER, NULL); - renderer->dia = data; /* FIXME: not sure if this a good idea */ - renderer->scale = 1.0; - - switch (kind) { -#ifdef CAIRO_HAS_PS_SURFACE - case OUTPUT_PS : - width = data->paper.width * (72.0 / 2.54) + 0.5; - height = data->paper.height * (72.0 / 2.54) + 0.5; - renderer->scale = data->paper.scaling * (72.0 / 2.54); - DIAG_NOTE(g_message ("PS Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_ps_surface_create (filename_crt, - width, height); /* in points? */ - /* maybe we should increase the resolution here as well */ - break; -#endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS - case OUTPUT_PNGA : - renderer->with_alpha = TRUE; - /* fall through */ - case OUTPUT_PNG : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("PNG Surface %dx%d\n", (int)width, (int)height)); - /* use case screwed by API shakeup. We need to special case */ - renderer->surface = cairo_image_surface_create( - CAIRO_FORMAT_ARGB32, - (int)width, (int)height); - /* an extra refernce to make it survive end_render():cairo_surface_destroy() */ - cairo_surface_reference(renderer->surface); - break; -#endif -#ifdef CAIRO_HAS_PDF_SURFACE - case OUTPUT_PDF : -#define DPI 300.0 /* 600.0? */ - /* I just don't get how the scaling is supposed to work, dpi versus page size ? */ - renderer->scale = data->paper.scaling * (72.0 / 2.54); - /* Dia's paper.width already contains the scale, cairo needs it without - * Similar for margins, Dia's without, but cairo wants them. The full - * extents don't matter here, because we do cairo_pdf_set_size() for every page. - */ - width = (data->paper.lmargin + data->paper.width * data->paper.scaling + data->paper.rmargin) - * (72.0 / 2.54) + 0.5; - height = (data->paper.tmargin + data->paper.height * data->paper.scaling + data->paper.bmargin) - * (72.0 / 2.54) + 0.5; - DIAG_NOTE(g_message ("PDF Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_pdf_surface_create (filename_crt, - width, height); - cairo_surface_set_fallback_resolution (renderer->surface, DPI, DPI); -#undef DPI - break; -#endif -#ifdef CAIRO_HAS_SVG_SURFACE - case OUTPUT_SVG : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("SVG Surface %dx%d\n", (int)width, (int)height)); - /* use case screwed by API shakeup. We need to special case */ - renderer->surface = cairo_svg_surface_create( - filename_crt, - (int)width, (int)height); - break; -#endif -#ifdef CAIRO_HAS_SCRIPT_SURFACE - case OUTPUT_CAIRO_SCRIPT : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = (data->extents.right - data->extents.left) * renderer->scale + 0.5; - height = (data->extents.bottom - data->extents.top) * renderer->scale + 0.5; - DIAG_NOTE(g_message ("CairoScript Surface %dx%d\n", (int)width, (int)height)); - { - cairo_device_t *csdev = cairo_script_create (filename_crt); - cairo_script_set_mode (csdev, CAIRO_SCRIPT_MODE_ASCII); - renderer->surface = cairo_script_surface_create(csdev, CAIRO_CONTENT_COLOR_ALPHA, - width, height); - cairo_device_destroy (csdev); - } - break; -#endif - /* finally cairo can render to MetaFiles */ -#if DIA_CAIRO_CAN_EMF - case OUTPUT_EMF : - case OUTPUT_WMF : /* different only on close/'play' */ - case OUTPUT_CLIPBOARD : - /* NOT: renderer->with_alpha = TRUE; */ - { - /* see wmf/wmf.cpp */ - /* CreateEnhMetaFile() takes 0.01 mm, but the resulting clipboard - * image is much too big, e.g. when pasting to PowerPoint. So instead - * of 1000 use sth smaller to scale? But that would need new scaling - * for line thickness as well ... - * Also there is something wrong with clipping if running on a dual screen - * sometimes parts of the diagram are clipped away. Not sure if this is - * hitting some internal width limits, maintianing the viewport ratio, - * but not the diagram boundaries. - */ - RECT bbox = { 0, 0, - (int)((data->extents.right - data->extents.left) * data->paper.scaling * 1000.0), - (int)((data->extents.bottom - data->extents.top) * data->paper.scaling * 1000.0) }; - RECT clip; - /* CreateEnhMetaFile() takes resolution 0.01 mm, */ - hFileDC = CreateEnhMetaFile (NULL, NULL, &bbox, "DiaCairo\0Diagram\0"); - -#if 0 - /* On Windows 7/64 with two wide screen monitors, the clipping of the resulting - * metafile is too small. Scaling the bbox or via SetWorldTransform() does not help. - * Maybe we need to explitily set the clipping for cairo? - */ - GetClipBox (hFileDC, &clip); /* this is the display resolution */ - if (clip.right / (real)bbox.right > clip.bottom / (real)bbox.bottom) - clip.right = clip.bottom * bbox.right / bbox.bottom; - else - clip.bottom = clip.bottom * bbox.right / bbox.bottom; - - IntersectClipRect(hFileDC, clip.left, clip.top, clip.right, clip.bottom); -#endif - renderer->surface = cairo_win32_printing_surface_create (hFileDC); - - renderer->scale = 1000.0/25.4 * data->paper.scaling; - if (LOBYTE (g_win32_get_windows_version()) > 0x05 || - LOWORD (g_win32_get_windows_version()) > 0x0105) - renderer->scale *= 0.72; /* Works w/o for XP, but not on Vista/Win7 */ - } - break; -#endif - default : - /* quite arbitrary, but consistent with ../pixbuf ;-) */ - renderer->scale = 20.0 * data->paper.scaling; - width = ceil((data->extents.right - data->extents.left) * renderer->scale) + 1; - height = ceil((data->extents.bottom - data->extents.top) * renderer->scale) + 1; - DIAG_NOTE(g_message ("Image Surface %dx%d\n", (int)width, (int)height)); - renderer->surface = cairo_image_surface_create (CAIRO_FORMAT_A8, (int)width, (int)height); - } - - /* use extents */ - DIAG_NOTE(g_message("export_data extents %f,%f -> %f,%f", - data->extents.left, data->extents.top, data->extents.right, data->extents.bottom)); - - if (OUTPUT_PDF == kind) - data_render_paginated(data, DIA_RENDERER(renderer), NULL); - else - data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL); - -#if defined CAIRO_HAS_PNG_FUNCTIONS - if (OUTPUT_PNGA == kind || OUTPUT_PNG == kind) - { - cairo_surface_write_to_png(renderer->surface, filename_crt); - cairo_surface_destroy(renderer->surface); - } -#endif -#if DIA_CAIRO_CAN_EMF - if (OUTPUT_EMF == kind) { - FILE* f = g_fopen(filename, "wb"); - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - UINT nSize = GetEnhMetaFileBits (hEmf, 0, NULL); - BYTE* pData = g_new(BYTE, nSize); - nSize = GetEnhMetaFileBits (hEmf, nSize, pData); - if (f) { - fwrite(pData,1,nSize,f); - fclose(f); - } else { - dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); - } - DeleteEnhMetaFile (hEmf); - g_free (pData); - } else if (OUTPUT_WMF == kind) { - FILE* f = g_fopen(filename, "wb"); - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - HDC hdc = GetDC(NULL); - UINT nSize = GetWinMetaFileBits (hEmf, 0, NULL, MM_ANISOTROPIC, hdc); - BYTE* pData = g_new(BYTE, nSize); - nSize = GetWinMetaFileBits (hEmf, nSize, pData, MM_ANISOTROPIC, hdc); - if (f) { - /* FIXME: write the placeable header */ - fwrite(pData,1,nSize,f); - fclose(f); - } else { - dia_context_add_message(ctx, _("Can't write %d bytes to %s"), nSize, filename); - } - ReleaseDC(NULL, hdc); - DeleteEnhMetaFile (hEmf); - g_free (pData); - } else if (OUTPUT_CLIPBOARD == kind) { - HENHMETAFILE hEmf = CloseEnhMetaFile(hFileDC); - if ( OpenClipboard(NULL) - && EmptyClipboard() - && SetClipboardData (CF_ENHMETAFILE, hEmf) - && CloseClipboard ()) { - hEmf = NULL; /* data now owned by clipboard */ - } else { - dia_context_add_message(ctx, _("Clipboard copy failed")); - DeleteEnhMetaFile (hEmf); - } - } -#endif - g_object_unref(renderer); - if (filename != filename_crt) - g_free (filename_crt); - return TRUE; -} - -G_GNUC_UNUSED /* keep implmentation for reference, see bug 599401 */ -static gboolean -export_print_data (DiagramData *data, DiaContext *ctx, - const gchar *filename_utf8, const gchar *diafilename, - void* user_data) -{ - OutputKind kind = (OutputKind)user_data; - GtkPrintOperation *op = create_print_operation (data, filename_utf8); - GtkPrintOperationResult res; - GError *error = NULL; - -# ifdef CAIRO_HAS_PDF_SURFACE - /* as of this writing the only format Gtk+ supports here is PDF */ - g_assert (OUTPUT_PDF == kind); -# endif - - if (!data) { - dia_context_add_message(ctx, _("Nothing to print")); - return FALSE; - } - - gtk_print_operation_set_export_filename (op, filename_utf8 ? filename_utf8 : "output.pdf"); - res = gtk_print_operation_run (op, GTK_PRINT_OPERATION_ACTION_EXPORT, NULL, &error); - if (GTK_PRINT_OPERATION_RESULT_ERROR == res) { - dia_context_add_message(ctx, "%s", error->message); - g_error_free (error); - return FALSE; - } - return TRUE; -} +#include "renderer/diacairo.h" +#include "renderer/diacairo-print.h" #ifdef CAIRO_HAS_PS_SURFACE static const gchar *ps_extensions[] = { "ps", NULL }; static DiaExportFilter ps_export_filter = { N_("Cairo PostScript"), ps_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PS, "cairo-ps" /* unique name */ }; @@ -376,30 +77,28 @@ static DiaExportFilter pdf_export_filter = { N_("Cairo Portable Document Format"), pdf_extensions, /* not using export_print_data() due to bug 599401 */ - export_data, + cairo_export_data, (void*)OUTPUT_PDF, "cairo-pdf" }; #endif -#ifdef CAIRO_HAS_SVG_SURFACE static const gchar *svg_extensions[] = { "svg", NULL }; static DiaExportFilter svg_export_filter = { N_("Cairo Scalable Vector Graphics"), svg_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_SVG, "cairo-svg", FILTER_DONT_GUESS /* don't use this if not asked explicit */ }; -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE static const gchar *cs_extensions[] = { "cs", NULL }; static DiaExportFilter cs_export_filter = { N_("CairoScript"), cs_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_CAIRO_SCRIPT, "cairo-script", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -410,7 +109,7 @@ static const gchar *png_extensions[] = { "png", NULL }; static DiaExportFilter png_export_filter = { N_("Cairo PNG"), png_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PNG, "cairo-png" }; @@ -418,7 +117,7 @@ static DiaExportFilter png_export_filter = { static DiaExportFilter pnga_export_filter = { N_("Cairo PNG (with alpha)"), png_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_PNGA, "cairo-alpha-png" }; @@ -428,7 +127,7 @@ static const gchar *emf_extensions[] = { "emf", NULL }; static DiaExportFilter emf_export_filter = { N_("Cairo EMF"), emf_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_EMF, "cairo-emf", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -438,7 +137,7 @@ static const gchar *wmf_extensions[] = { "wmf", NULL }; static DiaExportFilter wmf_export_filter = { N_("Cairo WMF"), wmf_extensions, - export_data, + cairo_export_data, (void*)OUTPUT_WMF, "cairo-wmf", FILTER_DONT_GUESS /* don't use this if not asked explicit */ @@ -456,7 +155,7 @@ cairo_clipboard_callback (DiagramData *data, g_return_val_if_fail (data != NULL, NULL); /* filename is not necessary */ - export_data (data, ctx, filename, filename, user_data); + cairo_export_data (data, ctx, filename, filename, user_data); dia_context_release (ctx); return NULL; @@ -496,16 +195,12 @@ _plugin_unload (PluginInfo *info) #ifdef CAIRO_HAS_PDF_SURFACE filter_unregister_export(&pdf_export_filter); #endif -#ifdef CAIRO_HAS_SVG_SURFACE filter_unregister_export(&svg_export_filter); -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE filter_unregister_export(&cs_export_filter); #endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS filter_unregister_export(&png_export_filter); filter_unregister_export(&pnga_export_filter); -#endif #if DIA_CAIRO_CAN_EMF filter_unregister_export(&emf_export_filter); filter_unregister_export(&wmf_export_filter); @@ -528,7 +223,7 @@ dia_plugin_init(PluginInfo *info) return DIA_PLUGIN_INIT_ERROR; /* FIXME: need to think about of proper way of registration, see also app/display.c */ - png_export_filter.renderer_type = dia_cairo_interactive_renderer_get_type (); + png_export_filter.renderer_type = g_type_from_name ("DiaCairoInteractiveRenderer"); #ifdef CAIRO_HAS_PS_SURFACE filter_register_export(&ps_export_filter); @@ -536,16 +231,12 @@ dia_plugin_init(PluginInfo *info) #ifdef CAIRO_HAS_PDF_SURFACE filter_register_export(&pdf_export_filter); #endif -#ifdef CAIRO_HAS_SVG_SURFACE filter_register_export(&svg_export_filter); -#endif #ifdef CAIRO_HAS_SCRIPT_SURFACE filter_register_export(&cs_export_filter); #endif -#if defined CAIRO_HAS_PNG_SURFACE || defined CAIRO_HAS_PNG_FUNCTIONS filter_register_export(&png_export_filter); filter_register_export(&pnga_export_filter); -#endif #if DIA_CAIRO_CAN_EMF filter_register_export(&emf_export_filter); filter_register_export(&wmf_export_filter); diff --git a/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c index a18554f5d03d08d941659986665aa75e705b4426..a0e5df2e6b31299e878b8cdc90cf0074e8e098e6 100644 --- a/plug-ins/cgm/cgm.c +++ b/plug-ins/cgm/cgm.c @@ -97,7 +97,7 @@ write_uint32(FILE *fp, guint32 n) } static void -write_colour(FILE *fp, Color *c) +write_colour(FILE *fp, GdkRGBA *c) { putc((int)(c->red * 255), fp); putc((int)(c->green * 255), fp); @@ -203,7 +203,7 @@ typedef struct _LineAttrCGM int join; int style; real width; - Color color; + GdkRGBA color; } LineAttrCGM; @@ -212,14 +212,14 @@ typedef struct _FillEdgeAttrCGM { int fill_style; /* Fill style */ - Color fill_color; /* Fill color */ + GdkRGBA fill_color; /* Fill color */ int edgevis; /* Edge visibility */ int cap; /* Edge cap */ int join; /* Edge join */ int style; /* Edge style */ real width; /* Edge width */ - Color color; /* Edge color */ + GdkRGBA color; /* Edge color */ } FillEdgeAttrCGM; @@ -229,7 +229,7 @@ typedef struct _TextAttrCGM { int font_num; real font_height; - Color color; + GdkRGBA color; } TextAttrCGM; @@ -336,7 +336,7 @@ swap_y( CgmRenderer *renderer, real y) static void -write_line_attributes( CgmRenderer *renderer, Color *color ) +write_line_attributes( CgmRenderer *renderer, GdkRGBA *color ) { LineAttrCGM *lnew, *lold; @@ -395,8 +395,8 @@ LineAttrCGM *lnew, *lold; */ static void -write_filledge_attributes( CgmRenderer *renderer, Color *fill_color, - Color *edge_color ) +write_filledge_attributes( CgmRenderer *renderer, GdkRGBA *fill_color, + GdkRGBA *edge_color ) { FillEdgeAttrCGM *fnew, *fold; @@ -500,7 +500,7 @@ FillEdgeAttrCGM *fnew, *fold; static void -write_text_attributes( CgmRenderer *renderer, Color *text_color) +write_text_attributes( CgmRenderer *renderer, GdkRGBA *text_color) { TextAttrCGM *tnew, *told; @@ -687,7 +687,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -703,7 +703,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { CgmRenderer *renderer = CGM_RENDERER(self); int i; @@ -720,7 +720,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); int i; @@ -737,7 +737,7 @@ draw_polygon (DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -805,7 +805,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -818,7 +818,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -830,7 +830,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); real ynew; @@ -900,7 +900,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -916,8 +916,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { CgmRenderer *renderer = CGM_RENDERER(self); @@ -940,7 +940,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { CgmRenderer *renderer = CGM_RENDERER(self); double x = pos->x, y = swap_y(renderer, pos->y); diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c index 00bdf148737ef773ecc777915829ded0a7831ea7..32b8506fc65a26f9f8d53e4b60443b62824cd7ee 100644 --- a/plug-ins/drs/dia-render-script-import.c +++ b/plug-ins/drs/dia-render-script-import.c @@ -24,7 +24,6 @@ #include #include "geometry.h" -#include "color.h" #include "diagramdata.h" #include "group.h" #include "intl.h" @@ -126,18 +125,18 @@ _parse_bezpoints (xmlNodePtr node, const char *attrib) } return arr; } -static Color * +static GdkRGBA * _parse_color (xmlNodePtr node, const char *attrib) { xmlChar *str = xmlGetProp(node, (const xmlChar *)attrib); - Color *val = NULL; + GdkRGBA *val = NULL; if (str) { int r, g, b, a = 255; int n = sscanf ((gchar *)str, "#%02x%02x%02x%02x", &r, &g, &b, &a); if (n > 2) { - val = g_new (Color, 1); + val = g_new (GdkRGBA, 1); val->red = r / 255.0; val->green = g / 255.0; val->blue = b / 255.0; @@ -282,8 +281,8 @@ _render_object (xmlNodePtr render, DiaContext *ctx) ops->set_font (ir, font, _parse_real (node, "height")); dia_font_unref (font); } else { - Color *stroke = _parse_color (node, "stroke"); - Color *fill = _parse_color (node, "fill"); + GdkRGBA *stroke = _parse_color (node, "stroke"); + GdkRGBA *fill = _parse_color (node, "fill"); if (xmlStrcmp (node->name, (const xmlChar *)"line") == 0) { Point p1 = _parse_point (node, "start"); diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c index a381c8816eec9d299e4c90dec970fb691cba5cab..8f0aeea5562c42fd48a0e976dd517ef37dab5b50 100644 --- a/plug-ins/drs/dia-render-script-renderer.c +++ b/plug-ins/drs/dia-render-script-renderer.c @@ -177,7 +177,7 @@ is_capable_to (DiaRenderer *self, RenderCapability cap) } static void -_node_set_color (xmlNodePtr node, const char *name, const Color *color) +_node_set_color (xmlNodePtr node, const char *name, const GdkRGBA *color) { gchar *value; @@ -405,7 +405,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -419,7 +419,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -432,7 +432,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -451,7 +451,7 @@ draw_polygon (DiaRenderer *self, static void _rounded_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke, real *rounding) + GdkRGBA *fill, GdkRGBA *stroke, real *rounding) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -475,7 +475,7 @@ _rounded_rect(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _rounded_rect(self, lefttop, rightbottom, fill, stroke, NULL); } @@ -483,7 +483,7 @@ draw_rect(DiaRenderer *self, static void draw_rounded_rect(DiaRenderer *self, Point *lefttop, Point *rightbottom, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { _rounded_rect(self, lefttop, rightbottom, fill, stroke, &rounding); } @@ -493,7 +493,7 @@ _arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color, + GdkRGBA *color, gboolean fill) { DrsRenderer *renderer = DRS_RENDERER (self); @@ -515,7 +515,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, FALSE); } @@ -524,7 +524,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { _arc (self, center, width, height, angle1, angle2, color, TRUE); } @@ -533,7 +533,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -553,8 +553,8 @@ static void _bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -571,7 +571,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { _bezier (self, points, numpoints, NULL, color); } @@ -579,11 +579,11 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (!fill && stroke) { /* maybe this is too clever: close path by existance of fill attribute */ - Color transparent = { 0, }; + GdkRGBA transparent = { 0, }; _bezier (self, points, numpoints, &transparent, stroke); } else { _bezier (self, points, numpoints, fill, stroke); @@ -593,7 +593,7 @@ draw_beziergon (DiaRenderer *self, static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius ) + GdkRGBA *color, real radius ) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; @@ -608,7 +608,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c index b80636fce4bb29f658f901e3c917c47777c7640b..58e46d83d936d18d9cf59a3634972c856b739a95 100644 --- a/plug-ins/dxf/dxf-export.c +++ b/plug-ins/dxf/dxf-export.c @@ -66,7 +66,7 @@ typedef struct _LineAttrdxf int join; char *style; real width; - Color color; + GdkRGBA color; } LineAttrdxf; @@ -75,14 +75,14 @@ typedef struct _FillEdgeAttrdxf { int fill_style; /* Fill style */ - Color fill_color; /* Fill color */ + GdkRGBA fill_color; /* Fill color */ int edgevis; /* Edge visibility */ int cap; /* Edge cap */ int join; /* Edge join */ char *style; /* Edge style */ real width; /* Edge width */ - Color color; /* Edge color */ + GdkRGBA color; /* Edge color */ } FillEdgeAttrdxf; @@ -92,7 +92,7 @@ typedef struct _TextAttrdxf { int font_num; real font_height; - Color color; + GdkRGBA color; } TextAttrdxf; @@ -238,7 +238,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) } static int -dxf_color (const Color *color) +dxf_color (const GdkRGBA *color) { /* Fixed colors * 0 - black ? @@ -259,7 +259,7 @@ dxf_color (const Color *color) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -282,7 +282,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { DxfRenderer *renderer = DXF_RENDERER(self); int i; @@ -310,9 +310,9 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; DxfRenderer *renderer = DXF_RENDERER(self); /* We could emulate all polygons with multiple SOLID but it might not be * worth the effort. Following the easy part of polygons with 3 or 4 points. @@ -348,7 +348,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -382,7 +382,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { /* emulate by SOLID? */ } @@ -391,11 +391,11 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; - Color *color = fill ? fill : stroke; /* emulate fill by SOLID? */ + GdkRGBA *color = fill ? fill : stroke; /* emulate fill by SOLID? */ /* draw a circle instead of an ellipse, if it's one */ if(width == height){ @@ -426,7 +426,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { DxfRenderer *renderer = DXF_RENDERER(self); gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; diff --git a/plug-ins/dxf/dxf-import.c b/plug-ins/dxf/dxf-import.c index 77f82b6b9afc297882766ca0f252f6f5ce867982..9120ea00c3c7d500193366e46ffba087d6f8a67f 100644 --- a/plug-ins/dxf/dxf-import.c +++ b/plug-ins/dxf/dxf-import.c @@ -113,7 +113,7 @@ _dxf_color_get_by_layer (const Layer *layer) return 0; } static void -_color_init_from_rgb (Color *color, RGB_t rgb) +_color_init_from_rgb (GdkRGBA *color, RGB_t rgb) { color->red = rgb.r / 255.0; color->green = rgb.g / 255.0; @@ -176,7 +176,7 @@ read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) Handle *h1, *h2; DiaObject *line_obj; - Color line_colour; + GdkRGBA line_colour; RGB_t color = { 0, }; GPtrArray *props; @@ -257,7 +257,7 @@ read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *polygon_obj; MultipointCreateData *pcd; - Color fill_colour; + GdkRGBA fill_colour; GPtrArray *props; @@ -389,7 +389,7 @@ read_entity_polyline_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *polyline_obj; MultipointCreateData *pcd; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; @@ -594,7 +594,7 @@ read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *ellipse_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; @@ -671,7 +671,7 @@ read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *arc_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; real line_width = DEFAULT_LINE_WIDTH; @@ -761,7 +761,7 @@ read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) DiaObject *ellipse_obj; RGB_t color = { 0, }; - Color line_colour; + GdkRGBA line_colour; GPtrArray *props; real line_width = DEFAULT_LINE_WIDTH; @@ -844,7 +844,7 @@ read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) Handle *h1, *h2; DiaObject *text_obj; - Color text_colour; + GdkRGBA text_colour; TextProperty *tprop; GPtrArray *props; diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c index 208d76def8dd3a61fcb8dc7c2dd5df8f58159150..09962a8d8d12098f466ea81f84c3bc0bcbe8487c 100644 --- a/plug-ins/hpgl/hpgl.c +++ b/plug-ins/hpgl/hpgl.c @@ -75,7 +75,7 @@ struct _HpglRenderer * The number of pens is limited. This is used to select one. */ struct { - Color color; + GdkRGBA color; float width; int has_it; } pen[HPGL_MAX_PENS]; @@ -100,7 +100,7 @@ struct _HpglRendererClass /* hpgl helpers */ static void -hpgl_select_pen(HpglRenderer* renderer, Color* color, real width) +hpgl_select_pen(HpglRenderer* renderer, GdkRGBA* color, real width) { int nPen = 0; int i; @@ -297,7 +297,7 @@ set_font(DiaRenderer *object, DiaFont *font, real height) static void draw_line(DiaRenderer *object, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { HpglRenderer *renderer = HPGL_RENDERER (object); @@ -313,7 +313,7 @@ draw_line(DiaRenderer *object, static void draw_polyline(DiaRenderer *object, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { HpglRenderer *renderer = HPGL_RENDERER (object); int i; @@ -341,9 +341,9 @@ draw_polyline(DiaRenderer *object, static void draw_polygon(DiaRenderer *object, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *color = fill ? fill : stroke; + GdkRGBA *color = fill ? fill : stroke; DIAG_NOTE(g_message("draw_polygon n:%d %f,%f ...", num_points, points->x, points->y)); g_return_if_fail (color != NULL); @@ -355,9 +355,9 @@ draw_polygon(DiaRenderer *object, static void draw_rect(DiaRenderer *object, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { - Color *colour = fill ? fill : stroke; + GdkRGBA *colour = fill ? fill : stroke; HpglRenderer *renderer = HPGL_RENDERER (object); g_return_if_fail (colour != NULL); @@ -377,7 +377,7 @@ draw_arc(DiaRenderer *object, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); Point start; @@ -410,7 +410,7 @@ fill_arc(DiaRenderer *object, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); @@ -436,7 +436,7 @@ static void draw_ellipse_by_arc (DiaRenderer *renderer, Point *center, real width, real height, - Color *colour) + GdkRGBA *colour) { real a, b, e, d, alpha, c, x, y; real g, gamma, r; @@ -484,10 +484,10 @@ static void draw_ellipse(DiaRenderer *object, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { HpglRenderer *renderer = HPGL_RENDERER (object); - Color *colour = fill ? fill : stroke; + GdkRGBA *colour = fill ? fill : stroke; DIAG_NOTE(g_message("draw_ellipse %fx%f center @ %f,%f", width, height, center->x, center->y)); @@ -511,7 +511,7 @@ static void draw_string(DiaRenderer *object, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { HpglRenderer *renderer = HPGL_RENDERER (object); real width, height; diff --git a/plug-ins/libart/Makefile.am b/plug-ins/libart/Makefile.am deleted file mode 100644 index 8a5b05c238f018c37f4b21ab48839feda5c1185e..0000000000000000000000000000000000000000 --- a/plug-ins/libart/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ - -plugin_sources = \ - dialibart.c \ - dialibartrenderer.c \ - dialibartrenderer.h \ - render_libart.h \ - render_libart.c \ - export_png.c - -pkglib_LTLIBRARIES = libart_filter.la - -EXTRA_DIST = - -libart_filter_la_SOURCES = $(plugin_sources) - -libart_filter_la_LDFLAGS = -export-dynamic -module -avoid-version $(NO_UNDEFINED) - -libart_filter_la_LIBADD = $(LIBART_LIBS) $(LIBPNG_LIBS) $(top_builddir)/lib/libdia.la - -AM_CPPFLAGS = -I$(srcdir)/../../lib $(GTK_CFLAGS) $(DEBUG_FLAGS) $(LIBART_CFLAGS) $(LIBPNG_CFLAGS) diff --git a/plug-ins/libart/dialibart.c b/plug-ins/libart/dialibart.c deleted file mode 100644 index 4eafa3405f9bf6bacdb312b15930728105a2f4ca..0000000000000000000000000000000000000000 --- a/plug-ins/libart/dialibart.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * dialibart.c -- libart based export plugin for dia - * moved out of the core 2008, Hans Breuer, - * - * 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 - -#include "intl.h" -#include "filter.h" -#include "plug-ins.h" - -#include "dialibartrenderer.h" - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) -extern DiaExportFilter png_export_filter; -#endif - -static gboolean -_plugin_can_unload (PluginInfo *info) -{ - /* Can't unlaod as long as we are giving away our types, e.g. dia_libart_renderer_get_type () */ - return FALSE; -} - -static void -_plugin_unload (PluginInfo *info) -{ -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - filter_unregister_export(&png_export_filter); -#endif -} - -/* --- dia plug-in interface --- */ - -DIA_PLUGIN_CHECK_INIT - -PluginInitResult -dia_plugin_init(PluginInfo *info) -{ - if (!dia_plugin_info_init(info, "Libart", - _("Libart-based rendering"), - _plugin_can_unload, - _plugin_unload)) - return DIA_PLUGIN_INIT_ERROR; - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - /* FIXME: need to think about of proper way of registartion, see also app/display.c */ - png_export_filter.renderer_type = dia_libart_renderer_get_type (); - /* PNG with libart rendering */ - filter_register_export(&png_export_filter); -#endif - - return DIA_PLUGIN_INIT_OK; -} diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c deleted file mode 100644 index b4c93484ab313a322755f5c19ce5c615f37c9435..0000000000000000000000000000000000000000 --- a/plug-ins/libart/dialibartrenderer.c +++ /dev/null @@ -1,1417 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#include /* strlen */ - -#include "dialibartrenderer.h" - -#include "color.h" -#include "font.h" -#include "intl.h" -#include "dia_image.h" -#include "object.h" -#include "textline.h" - -#ifdef HAVE_LIBART - -#ifdef HAVE_FREETYPE -#include -#undef PANGO_DISABLE_DEPRECATED /* pango_ft2_get_context */ -#include -#elif defined G_OS_WIN32 -/* ugly namespace clashes */ -#define Rectangle Win32Rectangle -#include -#undef Rectangle -#else -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static inline guint32 -color_to_rgba(DiaLibartRenderer *renderer, Color *col) -{ - int rgba; - - if (renderer->highlight_color != NULL) { - rgba = (guint)(0xFF*renderer->highlight_color->alpha); - rgba |= (guint)(0xFF*renderer->highlight_color->red) << 24; - rgba |= (guint)(0xFF*renderer->highlight_color->green) << 16; - rgba |= (guint)(0xFF*renderer->highlight_color->blue) << 8; - } else { - rgba = (guint)(0xFF*col->alpha); - rgba |= (guint)(0xFF*col->red) << 24; - rgba |= (guint)(0xFF*col->green) << 16; - rgba |= (guint)(0xFF*col->blue) << 8; - } - - return rgba; -} - -static int -get_width_pixels (DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - return renderer->pixel_width; -} - -static int -get_height_pixels (DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - return renderer->pixel_height; -} - -static void -begin_render(DiaRenderer *self, const Rectangle *update) -{ -#ifdef HAVE_FREETYPE - /* pango_ft2_get_context API docs : - * ... Use of this function is discouraged, ... - * - * I've tried using the proper font_map stuff, but it kills font size:( - */ - dia_font_push_context(pango_ft2_get_context(75, 75)); -# define FONT_SCALE (1.0) -#elif defined G_OS_WIN32 - dia_font_push_context(gdk_pango_context_get()); - /* I shall never claim again to have understood Dias/Pangos font size - * relations ;). This was (1.0/22.0) but nowadays 1.0 seems to be - * fine with Pango/win32, too. --hb - */ -# define FONT_SCALE (1.0) -#else - dia_font_push_context (gdk_pango_context_get ()); -# define FONT_SCALE (0.8) -#endif -} - -static void -end_render(DiaRenderer *self) -{ - dia_font_pop_context(); -} - -static gboolean -is_capable_to (DiaRenderer *renderer, RenderCapability cap) -{ - if (RENDER_HOLES == cap) - return TRUE; - else if (RENDER_ALPHA == cap) - return TRUE; - return FALSE; -} - -static void -set_linewidth(DiaRenderer *self, real linewidth) -{ /* 0 == hairline **/ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* 6 pixels wide -> 3 pixels beyond normal obj */ - real border = dia_untransform_length(renderer->transform, 6); - linewidth += border; - } - renderer->line_width = - dia_transform_length(renderer->transform, linewidth); - if (renderer->line_width<=0.5) - renderer->line_width = 0.5; /* Minimum 0.5 pixel. */ -} - -static void -set_linecaps(DiaRenderer *self, LineCaps mode) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* Can't tell that this does anything:( -LC */ - renderer->cap_style = ART_PATH_STROKE_CAP_ROUND; - } else { - switch(mode) { - case LINECAPS_DEFAULT: - case LINECAPS_BUTT: - renderer->cap_style = ART_PATH_STROKE_CAP_BUTT; - break; - case LINECAPS_ROUND: - renderer->cap_style = ART_PATH_STROKE_CAP_ROUND; - break; - case LINECAPS_PROJECTING: - renderer->cap_style = ART_PATH_STROKE_CAP_SQUARE; - break; - } - } -} - -static void -set_linejoin(DiaRenderer *self, LineJoin mode) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - if (renderer->highlight_color != NULL) { - /* Can't tell that this does anything:( -LC */ - renderer->join_style = ART_PATH_STROKE_JOIN_ROUND; - } else { - switch(mode) { - case LINEJOIN_DEFAULT: - case LINEJOIN_MITER: - renderer->join_style = ART_PATH_STROKE_JOIN_MITER; - break; - case LINEJOIN_ROUND: - renderer->join_style = ART_PATH_STROKE_JOIN_ROUND; - break; - case LINEJOIN_BEVEL: - renderer->join_style = ART_PATH_STROKE_JOIN_BEVEL; - break; - } - } -} - -static void -set_linestyle(DiaRenderer *self, LineStyle mode, real length) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - static double dash[10]; - double hole_width; - real dash_length; - real dot_length; - real ddisp_len; - - ddisp_len = - dia_transform_length(renderer->transform, length); - - dash_length = ddisp_len; - dot_length = ddisp_len*0.1; - - if (dash_length<1.0) - dash_length = 1.0; - if (dash_length>255.0) - dash_length = 255.0; - if (dot_length<1.0) - dot_length = 1.0; - if (dot_length>255.0) - dot_length = 255.0; - - switch(mode) { - case LINESTYLE_DEFAULT: - case LINESTYLE_SOLID: - renderer->dash_enabled = 0; - break; - case LINESTYLE_DASHED: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 2; - renderer->dash.dash = dash; - dash[0] = dash_length; - dash[1] = dash_length; - break; - case LINESTYLE_DASH_DOT: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 4; - renderer->dash.dash = dash; - hole_width = (dash_length - dot_length) / 2.0; - if (hole_width<1.0) - hole_width = 1.0; - dash[0] = dash_length; - dash[1] = hole_width; - dash[2] = dot_length; - dash[3] = hole_width; - break; - case LINESTYLE_DASH_DOT_DOT: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 6; - renderer->dash.dash = dash; - hole_width = (dash_length - 2*dot_length) / 3; - if (hole_width<1.0) - hole_width = 1.0; - dash[0] = dash_length; - dash[1] = hole_width; - dash[2] = dot_length; - dash[3] = hole_width; - dash[4] = dot_length; - dash[5] = hole_width; - break; - case LINESTYLE_DOTTED: - renderer->dash_enabled = 1; - renderer->dash.offset = 0.0; - renderer->dash.n_dash = 2; - renderer->dash.dash = dash; - dash[0] = dot_length; - dash[1] = dot_length; - break; - } -} - -static void -set_fillstyle(DiaRenderer *self, FillStyle mode) -{ - switch(mode) { - case FILLSTYLE_SOLID: - break; - default: - g_warning ("%s: Unsupported fill mode specified!", - G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (self))); - } -} - -static void -set_font(DiaRenderer *self, DiaFont *font, real height) -{ - self->font_height = height * FONT_SCALE; - - dia_font_ref(font); - if (self->font) - dia_font_unref(self->font); - self->font = font; -} - -static void -draw_line(DiaRenderer *self, - Point *start, Point *end, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, 3); - - dia_transform_coords_double(renderer->transform, start->x, start->y, &x, &y); - vpath[0].code = ART_MOVETO; - vpath[0].x = x; - vpath[0].y = y; - - dia_transform_coords_double(renderer->transform, end->x, end->y, &x, &y); - vpath[1].code = ART_LINETO; - vpath[1].x = x; - vpath[1].y = y; - - vpath[2].code = ART_END; - vpath[2].x = 0; - vpath[2].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_polyline(DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+1); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - vpath[i].code = ART_END; - vpath[i].x = 0; - vpath[i].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -stroke_polygon (DiaRenderer *self, - Point *points, int num_points, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+2); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - dia_transform_coords_double(renderer->transform, - points[0].x, points[0].y, - &x, &y); - vpath[i].code = ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - vpath[i+1].code = ART_END; - vpath[i+1].x = 0; - vpath[i+1].y = 0; - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -fill_polygon (DiaRenderer *self, - Point *points, int num_points, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtSVP *svp, *temp; - guint32 rgba; - double x,y; - int i; - ArtSvpWriter *swr; - - rgba = color_to_rgba(renderer, color); - - vpath = art_new (ArtVpath, num_points+2); - - for (i=0;itransform, - points[i].x, points[i].y, - &x, &y); - vpath[i].code = (i==0)?ART_MOVETO:ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - } - dia_transform_coords_double(renderer->transform, - points[0].x, points[0].y, - &x, &y); - vpath[i].code = ART_LINETO; - vpath[i].x = x; - vpath[i].y = y; - vpath[i+1].code = ART_END; - vpath[i+1].x = 0; - vpath[i+1].y = 0; - - temp = art_svp_from_vpath (vpath); - - art_free( vpath ); - - /** We always use odd-even wind rule */ - swr = art_svp_writer_rewind_new(ART_WIND_RULE_ODDEVEN); - - art_svp_intersector(temp, swr); - svp = art_svp_writer_rewind_reap(swr); - art_svp_free(temp); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_polygon(DiaRenderer *self, - Point *points, int num_points, - Color *fill, Color *stroke) -{ - /* XXX: simple port, not optimized */ - if (fill) - fill_polygon (self, points, num_points, fill); - if (stroke) - stroke_polygon (self, points, num_points, stroke); -} - -static void -draw_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtSVP *svp; - guint32 rgba; - real dangle; - real circ; - double x,y; - int num_points; - double theta, dtheta; - int i; - - width = dia_transform_length(renderer->transform, width); - height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - center->x, center->y, &x, &y); - - if ((width<0.0) || (height<0.0)) - return; - - if (angle2 < angle1) { - /* swap to counter-clockwise to keep the original algorithm */ - real tmp = angle1; - angle1 = angle2; - angle2 = tmp; - } - dangle = angle2-angle1; - - /* Over-approximate the circumference */ - if (width>height) - circ = M_PI*width; - else - circ = M_PI*height; - - circ *= dangle/360.0; - -#define LEN_PER_SEGMENT 3.0 - - num_points = circ/LEN_PER_SEGMENT; - if (num_points<5) /* Don't be too coarse */ - num_points = 5; - - rgba = color_to_rgba(renderer, line_color); - - vpath = art_new (ArtVpath, num_points+1); - - theta = M_PI*angle1/180.0; - dtheta = (M_PI*dangle/180.0)/(num_points-1); - for (i=0;idash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -fill_arc(DiaRenderer *self, - Point *center, - real width, real height, - real angle1, real angle2, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtSVP *svp; - guint32 rgba; - real dangle; - real circ; - double x,y; - int num_points; - double theta, dtheta; - int i; - - width = dia_transform_length(renderer->transform, width); - height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - center->x, center->y, &x, &y); - - if ((width<0.0) || (height<0.0)) - return; - - if (angle2 < angle1) { - /* swap to counter-clockwise to keep the original algorithm */ - real tmp = angle1; - angle1 = angle2; - angle2 = tmp; - } - dangle = angle2-angle1; - - /* Over-approximate the circumference */ - if (width>height) - circ = M_PI*width; - else - circ = M_PI*height; - - circ *= dangle/360.0; - -#define LEN_PER_SEGMENT 3.0 - - num_points = circ/LEN_PER_SEGMENT; - if (num_points<5) /* Don't be too coarse */ - num_points = 5; - - rgba = color_to_rgba(renderer, color); - - vpath = art_new (ArtVpath, num_points+2+1); - - vpath[0].code = ART_MOVETO; - vpath[0].x = x; - vpath[0].y = y; - theta = M_PI*angle1/180.0; - dtheta = (M_PI*dangle/180.0)/(num_points-1); - for (i=0;ipixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_ellipse(DiaRenderer *self, - Point *center, - real width, real height, - Color *fill, Color *stroke) -{ - if (fill) - fill_arc(self, center, width, height, 0.0, 360.0, fill); - if (stroke) - draw_arc(self, center, width, height, 0.0, 360.0, stroke); -} - -static void -draw_bezier(DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *line_color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath, *vpath_dashed; - ArtBpath *bpath; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - - rgba = color_to_rgba(renderer, line_color); - - bpath = art_new (ArtBpath, numpoints+1); - - for (i=0;itransform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_MOVETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_LINE_TO: - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_LINETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_CURVE_TO: - bpath[i].code = ART_CURVETO; - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].x1 = x; - bpath[i].y1 = y; - dia_transform_coords_double(renderer->transform, - points[i].p2.x, points[i].p2.y, - &x, &y); - bpath[i].x2 = x; - bpath[i].y2 = y; - dia_transform_coords_double(renderer->transform, - points[i].p3.x, points[i].p3.y, - &x, &y); - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - } - } - bpath[i].code = ART_END; - bpath[i].x1 = 0; - bpath[i].y1 = 0; - - vpath = art_bez_path_to_vec(bpath, 0.25); - art_free(bpath); - - if (renderer->dash_enabled) { - vpath_dashed = art_vpath_dash(vpath, &renderer->dash); - art_free( vpath ); - vpath = vpath_dashed; - } - - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, - renderer->cap_style, - renderer->line_width, - 4, - 0.25); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_beziergon (DiaRenderer *self, - BezPoint *points, - int numpoints, - Color *fill, - Color *stroke) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - ArtVpath *vpath; - ArtBpath *bpath; - ArtSVP *svp; - guint32 rgba; - double x,y; - int i; - gboolean stroke_needed; - - /* Only do the extra stroke if the colors are different or stroke is no hairline */ - stroke_needed = ((!fill && stroke) || /* stroke alone */ - (fill && stroke && memcmp (fill, stroke, sizeof(Color)) != 0) || /* different colors */ - (renderer->line_width > 0) /* significant line width */); - - /* we could handle it but would not draw anything */ - g_return_if_fail (fill != NULL || stroke != NULL); - - bpath = art_new (ArtBpath, numpoints+1); - - for (i=0;itransform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_MOVETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_LINE_TO: - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].code = ART_LINETO; - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - case BEZ_CURVE_TO: - bpath[i].code = ART_CURVETO; - dia_transform_coords_double(renderer->transform, - points[i].p1.x, points[i].p1.y, - &x, &y); - bpath[i].x1 = x; - bpath[i].y1 = y; - dia_transform_coords_double(renderer->transform, - points[i].p2.x, points[i].p2.y, - &x, &y); - bpath[i].x2 = x; - bpath[i].y2 = y; - dia_transform_coords_double(renderer->transform, - points[i].p3.x, points[i].p3.y, - &x, &y); - bpath[i].x3 = x; - bpath[i].y3 = y; - break; - } - } - bpath[i].code = ART_END; - bpath[i].x1 = 0; - bpath[i].y1 = 0; - - vpath = art_bez_path_to_vec(bpath, 0.25); - art_free(bpath); - - if (fill) { - rgba = color_to_rgba(renderer, fill); - svp = art_svp_from_vpath (vpath); - { - /** We always use odd-even wind rule */ - ArtSvpWriter *swr = art_svp_writer_rewind_new(ART_WIND_RULE_ODDEVEN); - ArtSVP *svp_rw; - - art_svp_intersector(svp, swr); - svp_rw = art_svp_writer_rewind_reap(swr); - art_svp_free(svp); - svp = svp_rw; - } - art_rgb_svp_alpha (svp, - 0, 0, renderer->pixel_width, renderer->pixel_height, - rgba, renderer->rgb_buffer, renderer->pixel_width*3, NULL); - art_svp_free( svp ); - } - if (stroke && stroke_needed) { - rgba = color_to_rgba(renderer, stroke); - svp = art_svp_vpath_stroke (vpath, - renderer->join_style, renderer->cap_style, - renderer->line_width, 4, 0.25); - art_rgb_svp_alpha (svp, 0, 0, renderer->pixel_width, renderer->pixel_height, - rgba, renderer->rgb_buffer, renderer->pixel_width*3, NULL); - art_svp_free( svp ); - } - - art_free( vpath ); -} - - -/* Draw a highlighted version of a string. - */ -static void -draw_highlighted_string(DiaLibartRenderer *renderer, - PangoLayout *layout, - real x, real y, - guint32 rgba) -{ - ArtVpath *vpath; - ArtSVP *svp; - int width, height; - double top, bottom, left, right; - - pango_layout_get_pixel_size(layout, &width, &height); - dia_transform_coords_double(renderer->transform, - x, y, &left, &top); - left -= 3; - right = left+width+6; - bottom = top+height; - - if ((left>right) || (top>bottom)) - return; - - vpath = art_new (ArtVpath, 6); - - vpath[0].code = ART_MOVETO; - vpath[0].x = left; - vpath[0].y = top; - vpath[1].code = ART_LINETO; - vpath[1].x = right; - vpath[1].y = top; - vpath[2].code = ART_LINETO; - vpath[2].x = right; - vpath[2].y = bottom; - vpath[3].code = ART_LINETO; - vpath[3].x = left; - vpath[3].y = bottom; - vpath[4].code = ART_LINETO; - vpath[4].x = left; - vpath[4].y = top; - vpath[5].code = ART_END; - vpath[5].x = 0; - vpath[5].y = 0; - - svp = art_svp_from_vpath (vpath); - - art_free( vpath ); - - art_rgb_svp_alpha (svp, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - rgba, - renderer->rgb_buffer, renderer->pixel_width*3, - NULL); - - art_svp_free( svp ); -} - -static void -draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - /* Not working with Pango */ - guint8 *bitmap = NULL; - double x,y; - Point start_pos; - PangoLayout* layout; - int width, height; - int i, j; - double affine[6], tmpaffine[6]; - guint32 rgba; - int rowstride; - gchar *text = text_line_get_string(text_line); - real scale = dia_transform_length(renderer->transform, 1.0); - - point_copy(&start_pos,pos); - - rgba = color_to_rgba(renderer, color); - - /* Something's screwed up with the zooming for fonts. - It's like it zooms double. Yet removing some of the zooms - don't seem to work, either. - */ - /* - old_zoom = ddisp->zoom_factor; - ddisp->zoom_factor = ddisp->zoom_factor; - */ - - start_pos.x -= text_line_get_alignment_adjustment (text_line, alignment); - start_pos.y -= text_line_get_ascent(text_line); - - dia_transform_coords_double(renderer->transform, - start_pos.x, start_pos.y, &x, &y); - - layout = dia_font_build_layout(text, text_line->font, - dia_transform_length(renderer->transform, - text_line_get_height(text_line)) / 20.0); - - text_line_adjust_layout_line(text_line, pango_layout_get_line(layout, 0), - scale/20.0); - - if (renderer->highlight_color != NULL) { - draw_highlighted_string(renderer, layout, start_pos.x, start_pos.y, rgba); - g_object_unref(G_OBJECT(layout)); - return; - } - - /* - ddisp->zoom_factor = old_zoom; - */ - pango_layout_get_pixel_size(layout, &width, &height); - /* Pango doesn't have a 'render to raw bits' function, so we have - * to render based on what other engines are available. - */ -#define DEPTH 4 -#ifdef HAVE_FREETYPE - /* Freetype version */ - { - FT_Bitmap ftbitmap; - guint8 *graybitmap; - - rowstride = 32*((width+31)/31); - - graybitmap = (guint8*)g_new0(guint8, height*rowstride); - - ftbitmap.rows = height; - ftbitmap.width = width; - ftbitmap.pitch = rowstride; - ftbitmap.buffer = graybitmap; - ftbitmap.num_grays = 256; - ftbitmap.pixel_mode = ft_pixel_mode_grays; - ftbitmap.palette_mode = 0; - ftbitmap.palette = 0; - pango_ft2_render_layout(&ftbitmap, layout, 0, 0); - bitmap = (guint8*)g_new0(guint8, height*rowstride*DEPTH); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - bitmap[DEPTH*(i*rowstride+j)] = color->red*255; - bitmap[DEPTH*(i*rowstride+j)+1] = color->green*255; - bitmap[DEPTH*(i*rowstride+j)+2] = color->blue*255; - bitmap[DEPTH*(i*rowstride+j)+3] = graybitmap[i*rowstride+j]; - } - } - g_free(graybitmap); - } -#else - /* gdk does not like 0x0 sized (it does not make much sense with the others as well, - * but they don't complain ;) */ - if (width * height > 0) - { - GdkPixmap *pixmap = gdk_pixmap_new (NULL, width, height, 24); - GdkGC *gc = gdk_gc_new (pixmap); - GdkImage *image; - GdkColor black, white; - - color_convert(&color_black, &black); - color_convert(&color_white, &white); - - rowstride = 32*((width+31)/31); -#if 1 /* with 8 bit pixmap we would probably need to set the whole gray palette */ - gdk_gc_set_colormap (gc, gdk_colormap_get_system ()); - gdk_gc_set_foreground (gc, &black); - gdk_gc_set_background (gc, &white); - gdk_draw_rectangle (GDK_DRAWABLE (pixmap), gc, TRUE, 0, 0, width, height); -#endif - gdk_gc_set_foreground (gc, &white); - gdk_gc_set_background (gc, &black); - gdk_draw_layout (GDK_DRAWABLE (pixmap), gc, 0, 0, layout); - image = gdk_drawable_get_image (GDK_DRAWABLE (pixmap), 0, 0, width, height); - g_object_unref (G_OBJECT (gc)); - g_object_unref (G_OBJECT (pixmap)); - bitmap = (guint8*)g_new0(guint8, height*rowstride*DEPTH); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - bitmap[DEPTH*(i*rowstride+j)] = color->red*255; - bitmap[DEPTH*(i*rowstride+j)+1] = color->green*255; - bitmap[DEPTH*(i*rowstride+j)+2] = color->blue*255; - bitmap[DEPTH*(i*rowstride+j)+3] = gdk_image_get_pixel (image, j, i) & 0xFF; - } - } - g_object_unref (G_OBJECT (image)); - } -#endif - - /* abuse_layout_object(layout,text); */ - - g_object_unref(G_OBJECT(layout)); - - art_affine_identity(affine); - art_affine_translate(tmpaffine, x, y); - art_affine_multiply(affine, affine, tmpaffine); - - if (bitmap != NULL) - art_rgb_rgba_affine (renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width * 3, - bitmap, - width, - height, - rowstride*DEPTH, - affine, - ART_FILTER_NEAREST, NULL); - - g_free(bitmap); -#undef DEPTH -} - -static void -draw_string (DiaRenderer *self, - const gchar *text, - Point *pos, Alignment alignment, - Color *color) -{ - TextLine *text_line = text_line_new(text, self->font, self->font_height); - draw_text_line(self, text_line, pos, alignment, color); - text_line_destroy(text_line); -} - - -/* Get the width of the given text in cm */ -static real -get_text_width(DiaRenderer *object, - const gchar *text, int length) -{ - real result; - TextLine *text_line; - - if (length != g_utf8_strlen(text, -1)) { - char *othertx; - int ulen; - - ulen = g_utf8_offset_to_pointer(text, length)-text; - if (!g_utf8_validate(text, ulen, NULL)) { - g_warning ("Text at char %d not valid\n", length); - } - othertx = g_strndup(text, ulen); - text_line = text_line_new(othertx, object->font, object->font_height); - } else { - text_line = text_line_new(text, object->font, object->font_height); - } - result = text_line_get_width(text_line); - text_line_destroy(text_line); - return result; -} - - -static void -draw_image(DiaRenderer *self, - Point *point, - real width, real height, - DiaImage *image) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - /* Todo: Handle some kind of clipping! */ - - if (renderer->highlight_color != NULL) { - Point lr; - DiaRendererClass *self_class = DIA_RENDERER_GET_CLASS (self); - - lr = *point; - lr.x += width; - lr.y += height; - self_class->draw_rect(self, point, &lr, renderer->highlight_color, NULL); - } else { - double real_width, real_height; - double x,y; - int src_width, src_height; - double affine[6]; - int rowstride; - real_width = dia_transform_length(renderer->transform, width); - real_height = dia_transform_length(renderer->transform, height); - dia_transform_coords_double(renderer->transform, - point->x, point->y, &x, &y); - - src_width = dia_image_width(image); - src_height = dia_image_height(image); - rowstride = dia_image_rowstride(image); - - affine[0] = real_width/(double)src_width; - affine[1] = 0; - affine[2] = 0; - affine[3] = real_height/(double)src_height; - affine[4] = x; - affine[5] = y; - - if (dia_image_rgba_data(image)) { - /* If there is an alpha channel, we can use it directly. */ - const guint8 *img_data = dia_image_rgba_data(image); - art_rgb_rgba_affine(renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width*3, - img_data, src_width, src_height, - rowstride, - affine, ART_FILTER_NEAREST, NULL); - /* Note that dia_image_rgba_data doesn't copy */ - } else { - guint8 *img_data = dia_image_rgb_data(image); - - if (!img_data) { - dia_context_add_message(renderer->ctx, _("Not enough memory for image drawing.")); - return; - } - art_rgb_affine(renderer->rgb_buffer, - 0, 0, - renderer->pixel_width, - renderer->pixel_height, - renderer->pixel_width*3, - img_data, src_width, src_height, - rowstride, - affine, ART_FILTER_NEAREST, NULL); - - g_free(img_data); - } - } -} - -static void -renderer_init (DiaLibartRenderer *renderer, gpointer g_class) -{ - DiaRenderer *dia_renderer = DIA_RENDERER(renderer); - - renderer->rgb_buffer = NULL; - - renderer->line_width = 1.0; - renderer->cap_style = ART_PATH_STROKE_CAP_BUTT; - renderer->join_style = ART_PATH_STROKE_JOIN_MITER; - - renderer->dash_enabled = 0; - - renderer->highlight_color = NULL; - - renderer->parent_instance.font = NULL; - - /* lib/text.c does not use the interfaces */ - dia_renderer->is_interactive = TRUE; -} - -static void dia_libart_renderer_class_init (DiaLibartRendererClass *klass); -static gpointer parent_class = NULL; - -static void -renderer_finalize (GObject *object) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - if (renderer->rgb_buffer != NULL) - g_free(renderer->rgb_buffer); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -GType -dia_libart_renderer_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) - { - static const GTypeInfo object_info = - { - sizeof (DiaLibartRendererClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) dia_libart_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (DiaLibartRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc)renderer_init /* init */ - }; - - static const GInterfaceInfo irenderer_iface_info = - { - (GInterfaceInitFunc) dia_libart_renderer_iface_init, - NULL, /* iface_finalize */ - NULL /* iface_data */ - }; - - object_type = g_type_register_static (DIA_TYPE_RENDERER, - "DiaLibartRenderer", - &object_info, 0); - - /* register the interactive renderer interface */ - g_type_add_interface_static (object_type, - DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, - &irenderer_iface_info); - } - - return object_type; -} - -enum { - PROP_0, - PROP_TRANSFORM -}; - -static void -dia_libart_interactive_renderer_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - switch (prop_id) { - case PROP_TRANSFORM: - renderer->transform = g_value_get_pointer(value); - break; - default: - break; - } -} - -static void -dia_libart_interactive_renderer_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (object); - - switch (prop_id) { - case PROP_TRANSFORM: - g_value_set_pointer (value, renderer->transform); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dia_libart_renderer_class_init (DiaLibartRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - DiaRendererClass *renderer_class = DIA_RENDERER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = renderer_finalize; - - gobject_class->set_property = dia_libart_interactive_renderer_set_property; - gobject_class->get_property = dia_libart_interactive_renderer_get_property; - - g_object_class_install_property (gobject_class, - PROP_TRANSFORM, - g_param_spec_pointer ("transform", - _("Renderer transformation"), - _("Transform pointer"), - G_PARAM_READWRITE)); - - /* Here we set the functions that we define for this renderer. */ - renderer_class->get_width_pixels = get_width_pixels; - renderer_class->get_height_pixels = get_height_pixels; - - renderer_class->begin_render = begin_render; - renderer_class->end_render = end_render; - - renderer_class->set_linewidth = set_linewidth; - renderer_class->set_linecaps = set_linecaps; - renderer_class->set_linejoin = set_linejoin; - renderer_class->set_linestyle = set_linestyle; - renderer_class->set_fillstyle = set_fillstyle; - renderer_class->set_font = set_font; - - renderer_class->draw_line = draw_line; - renderer_class->draw_polyline = draw_polyline; - - renderer_class->draw_polygon = draw_polygon; - - renderer_class->draw_arc = draw_arc; - renderer_class->fill_arc = fill_arc; - - renderer_class->draw_ellipse = draw_ellipse; - - renderer_class->draw_bezier = draw_bezier; - renderer_class->draw_beziergon = draw_beziergon; - - renderer_class->draw_string = draw_string; - renderer_class->draw_text_line = draw_text_line; - - renderer_class->draw_image = draw_image; - - /* Interactive functions */ - renderer_class->get_text_width = get_text_width; - /* other */ - renderer_class->is_capable_to = is_capable_to; -} - -#endif - diff --git a/plug-ins/libart/dialibartrenderer.h b/plug-ins/libart/dialibartrenderer.h deleted file mode 100644 index b796acfa6d522544c33819d9abdf9e50ef7bf31e..0000000000000000000000000000000000000000 --- a/plug-ins/libart/dialibartrenderer.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef DIA_LIBART_RENDERER_H -#define DIA_LIBART_RENDERER_H - -#include "diatypes.h" -#include "geometry.h" -#include "diarenderer.h" -#include "diatransform.h" - -#ifdef HAVE_LIBART -#include -#include -#include -#include -#endif - -G_BEGIN_DECLS - -typedef struct _DiaLibartRenderer DiaLibartRenderer; -typedef struct _DiaLibartRendererClass DiaLibartRendererClass; - -#define DIA_TYPE_LIBART_RENDERER (dia_libart_renderer_get_type ()) -#define DIA_LIBART_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_LIBART_RENDERER, DiaLibartRenderer)) -#define DIA_LIBART_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_LIBART_RENDERER, DiaLibartRendererClass)) -#define DIA_IS_LIBART_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DIA_TYPE_LIBART_RENDERER)) -#define DIA_LIBART_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DIA_TYPE_LIBART_RENDERER, DiaLibartRendererClass)) - -GType dia_libart_renderer_get_type (void) G_GNUC_CONST; - -struct _DiaLibartRenderer -{ - DiaRenderer parent_instance; - - /*< private >*/ - DiaTransform *transform; /* Our link to the display settings */ -#ifdef HAVE_LIBART - int pixel_width, pixel_height; - guint8 *rgb_buffer; - int clip_rect_empty; - IntRectangle clip_rect; - - /* line attributes: */ - double line_width; - ArtPathStrokeCapType cap_style; - ArtPathStrokeJoinType join_style; - - int dash_enabled; - ArtVpathDash dash; - Color *highlight_color; -#endif - DiaContext *ctx; -}; - -struct _DiaLibartRendererClass -{ - DiaRendererClass parent_class; -}; - -void dia_libart_renderer_iface_init (DiaInteractiveRendererInterface* iface); - -G_END_DECLS - -#endif /* DIA_LIBART_RENDERER_H */ diff --git a/plug-ins/libart/export_png.c b/plug-ins/libart/export_png.c deleted file mode 100644 index 5d553923d1a9b832a435f346b513bdb59aa299ef..0000000000000000000000000000000000000000 --- a/plug-ins/libart/export_png.c +++ /dev/null @@ -1,391 +0,0 @@ -/* Dia -- a diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * export_png.c: export a diagram to a PNG file. - * Copyright (C) 2000 James Henstridge - * - * 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 - -#if defined(HAVE_LIBPNG) && defined(HAVE_LIBART) - -#include -#include -#include -#include -#include - -#include -#include - -#include "intl.h" -#include "filter.h" -#include "render_libart.h" -#include "dialibartrenderer.h" -#include "message.h" -#include "dialogs.h" - -/* ugly, but better tahn crashin on non-interactive use */ -#include "../../app/app_procs.h" - -/* parses a string of the form "[0-9]*x[0-9]*" and transforms it into - two long values width and height. */ -static void -parse_size(gchar *size, long *width, long *height) -{ - if (size) { - gchar** array = g_strsplit(size, "x", 3); - *width = (array[0])? strtol(array[0], NULL, 10): 0; - *height = (array[1])? strtol(array[1], NULL, 10): 0; - g_strfreev(array); - } - else { - *width = 0; - *height = 0; - } -} - - -/* the dots per centimetre to render this diagram at */ -/* this matches the setting `100%' setting in dia. */ -#define DPCM 20 - -/* the height of the band to use when rendering. Smaller bands mean - * rendering is slower, but less memory is used. Setting this to G_MAXINT - * should get the renderer to use one pass. */ -#define BAND_HEIGHT 50 - -struct png_callback_data { - DiagramData *data; - gchar *filename; - gchar *size; /* for command line option --size */ -}; - -/* Static data. When the dialog is not reentrant, you could have all data - be static. I don't like it that way, though:) I only hold static that - which pertains to the dialog itself (including the aspect ratio, as that - is used to connect the two entries). */ -static GtkWidget *export_png_dialog; -static GtkSpinButton *export_png_width_entry, *export_png_height_entry; -static GtkWidget *export_png_okay_button, *export_png_cancel_button; -static real export_png_aspect_ratio; - -/* The heart of the png exporter. - Deals with a bit of dialog handling and all the rendering and writing. - The dialog is not used when dia is non-interactive (export mode) -*/ -static void -export_png_ok(GtkButton *button, gpointer userdata) -{ - struct png_callback_data *cbdata = (struct png_callback_data *)userdata; - DiagramData *data = cbdata->data; - DiaRenderer *renderer; - DiaLibartRenderer *la_renderer; - Rectangle *ext = &data->extents; - Rectangle visible; - guint32 width, height, band, row, i; - real band_height; - guint32 imagewidth = 0, imageheight = 0; - long req_width, req_height; - real imagezoom; - - FILE *fp; - png_structp png; - png_infop info; - png_color_8 sig_bit; - png_bytep *row_ptr; - - width = (guint32) ((ext->right - ext->left) * DPCM * data->paper.scaling + 0.5); - height = (guint32) ((ext->bottom - ext->top) * DPCM * data->paper.scaling + 0.5); - - if (button != NULL) { - /* We don't want multiple clicks:) */ - gtk_widget_hide(export_png_dialog); - - imagewidth = gtk_spin_button_get_value_as_int(export_png_width_entry); - imageheight = gtk_spin_button_get_value_as_int(export_png_height_entry); - } else { - if (cbdata && cbdata->size) { - float ratio = (float) width/(float) height; - - parse_size(cbdata->size, &req_width, &req_height); - if (req_width && !req_height) { - imagewidth = req_width; - imageheight = req_width / ratio; - } else if (req_height && !req_width) { - imagewidth = req_height * ratio; - imageheight = req_height; - } else if (req_width && req_height) { - imagewidth = req_width; - imageheight = req_height; - } - } else { - imagewidth = width; - imageheight = height; - } - } - - /* Subtract one to ensure all pixels are inside bitmap (see bug #413275 */ - imagezoom = ((real)(imageheight - 1)/height) * DPCM * data->paper.scaling; - - /* we render in bands to try to keep memory consumption down ... */ - band = MIN(imageheight, BAND_HEIGHT); - band_height = (real)band / imagezoom; - - visible = *ext; - visible.bottom = MIN(visible.bottom, - visible.top + band_height); - - renderer = new_libart_renderer(dia_transform_new (&visible, &imagezoom), 0); - la_renderer = DIA_LIBART_RENDERER (renderer); - dia_renderer_set_size(renderer, NULL, imagewidth, band); - - fp = g_fopen(cbdata->filename, "wb"); - if (fp == NULL) { - message_error(_("Can't open output file %s: %s\n"), cbdata->filename, strerror(errno)); - goto error; - } - - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - if (!png) { - fclose(fp); - message_error(_("Could not create PNG write structure")); - goto error; - } - - /* allocate/initialise the image information data */ - info = png_create_info_struct(png); - if (!info) { - fclose(fp); - png_destroy_write_struct(&png, (png_infopp)NULL); - message_error(_("Could not create PNG header info structure")); - goto error; - } - - /* set error handling ... */ - if (setjmp(png_jmpbuf(png))) { - fclose(fp); - png_destroy_write_struct(&png, &info); - message_error(_("Error occurred while writing PNG")); - goto error; - } - /* the compiler said these may be clobbered by setjmp, so we set it again - * here. */ - if (button != NULL) { - imagewidth = gtk_spin_button_get_value_as_int(export_png_width_entry); - imageheight = gtk_spin_button_get_value_as_int(export_png_height_entry); - } else { - if (cbdata && cbdata->size) { - float ratio = (float) width/(float) height; - - parse_size(cbdata->size, &req_width, &req_height); - if (req_width && !req_height) { - imagewidth = req_width; - imageheight = req_width / ratio; - } else if (req_height && !req_width) { - imagewidth = req_height * ratio; - imageheight = req_height; - } else if (req_width && req_height) { - imagewidth = req_width; - imageheight = req_height; - } - } else { - imagewidth = width; - imageheight = height; - } - } - band = MIN(imageheight, BAND_HEIGHT); - - png_init_io(png, fp); - - /* header fields */ - png_set_IHDR(png, info, imagewidth, imageheight, 8, - PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - sig_bit.red = 8; - sig_bit.green = 8; - sig_bit.blue = 8; - png_set_sBIT(png, info, &sig_bit); - - png_set_pHYs(png, info, - imagewidth/width*DPCM*100, - imageheight/height*DPCM*100, - PNG_RESOLUTION_METER); - - png_write_info(png, info); - png_set_shift(png, &sig_bit); - png_set_packing(png); - - row_ptr = g_new(png_bytep, band); - - for (row = 0; row < imageheight; row += band) { - /* render band */ - for (i = 0; i < imagewidth*band; i++) { - la_renderer->rgb_buffer[3*i] = 0xff * data->bg_color.red; - la_renderer->rgb_buffer[3*i+1] = 0xff * data->bg_color.green; - la_renderer->rgb_buffer[3*i+2] = 0xff * data->bg_color.blue; - } - data_render(data, renderer, &visible, NULL,NULL); - /* write rows to png file */ - for (i = 0; i < band; i++) - row_ptr[i] = la_renderer->rgb_buffer + 3 * i * imagewidth; - png_write_rows(png, row_ptr, MIN(band, imageheight - row)); - - visible.top += band_height; - visible.bottom += band_height; - } - g_free(row_ptr); - png_write_end(png, info); - png_destroy_write_struct(&png, &info); - fclose(fp); - - error: - g_object_unref(renderer); - if (button != NULL) { - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_okay_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_cancel_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - } - g_free(cbdata->filename); - g_free(cbdata); - return; -} - -/* Stuff to do when cancelling: - disconnect signals (since the dialog persists) - hide dialog - free callback data -*/ -static void -export_png_cancel(GtkButton *button, gpointer userdata) -{ - struct png_callback_data *cbdata = (struct png_callback_data *)userdata; - - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_okay_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - g_signal_handlers_disconnect_matched (G_OBJECT(export_png_cancel_button), - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, userdata); - - gtk_widget_hide(export_png_dialog); - g_free(cbdata->filename); - g_free(cbdata); -} - -/* Adjust the aspect ratio */ -static void -export_png_ratio(GtkAdjustment *limits, gpointer userdata) -{ - /* This variable makes sure that we don't have a loopback effect. */ - static gboolean in_progress; - if (in_progress) return; - in_progress = TRUE; - if (userdata == export_png_height_entry) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(userdata), - (int)((real)gtk_spin_button_get_value_as_int(export_png_width_entry))/export_png_aspect_ratio); - } else { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(userdata), - (int)((real)gtk_spin_button_get_value_as_int(export_png_height_entry))*export_png_aspect_ratio); - } - in_progress = FALSE; -} - -static gboolean -export_png(DiagramData *data, DiaContext *ctx, - const gchar *filename, const gchar *diafilename, - void* user_data) -{ - /* Create the callback data. Can't be stack allocated, as the function - returns before the callback is called. Must be freed by the - final callbacks. */ - struct png_callback_data *cbdata = - (struct png_callback_data *) g_new0(struct png_callback_data, 1); - Rectangle *ext = &data->extents; - guint32 width, height; - - /* Note that this dialog, while not modal, is no reentrant, as it creates - a single dialog and uses that every time. Trying to do two exports at - the same time will lead to confusion. - */ - - if (export_png_dialog == NULL && user_data == NULL && app_is_interactive()) { - /* Create a dialog */ - export_png_dialog = dialog_make(_("PNG Export Options"), - _("Export"), NULL, - &export_png_okay_button, - &export_png_cancel_button); - /* Add two integer entries */ - export_png_width_entry = - dialog_add_spinbutton(export_png_dialog, _("Image width:"), - 0.0, 10000.0, 0); - export_png_height_entry = - dialog_add_spinbutton(export_png_dialog, _("Image height:"), - 0.0, 10000.0, 0); - - /* Make sure that the aspect ratio stays the same */ - g_signal_connect(G_OBJECT(gtk_spin_button_get_adjustment(export_png_width_entry)), - "value_changed", - G_CALLBACK(export_png_ratio), (gpointer)export_png_height_entry); - g_signal_connect(G_OBJECT(gtk_spin_button_get_adjustment(export_png_height_entry)), - "value_changed", - G_CALLBACK(export_png_ratio), (gpointer)export_png_width_entry); - - } - - /* Store pertinent data in callback data structure */ - cbdata->data = data; - cbdata->filename = g_strdup(filename); - - if (user_data == NULL && app_is_interactive()) { - /* Find the default size */ - width = (guint32) ((ext->right - ext->left) * DPCM * data->paper.scaling); - height = (guint32) ((ext->bottom - ext->top) * DPCM * data->paper.scaling); - - /* Store aspect ratio */ - export_png_aspect_ratio = ((real)width)/height; - - /* Set the default size */ - gtk_spin_button_set_value(export_png_width_entry, (float)width); - /* This is set from the aspect ratio */ - /* gtk_spin_button_set_value(export_png_height_entry, (float)height);*/ - - /* Set OK and Cancel buttons to call the relevant callbacks with cbdata */ - g_signal_connect(G_OBJECT(export_png_okay_button), "clicked", - G_CALLBACK(export_png_ok), (gpointer)cbdata); - g_signal_connect(G_OBJECT(export_png_cancel_button), "clicked", - G_CALLBACK(export_png_cancel), (gpointer)cbdata); - - /* Show the whole thing */ - gtk_widget_show_all(export_png_dialog); - } else { - cbdata->size = (gchar *) user_data; - export_png_ok(NULL, cbdata); - } - return TRUE; -} - -static const gchar *extensions[] = { "png", NULL }; -DiaExportFilter png_export_filter = { - N_("PNG (antialiased)"), - extensions, - export_png, - NULL, - "png-libart" -}; - -#endif diff --git a/plug-ins/libart/render_libart.c b/plug-ins/libart/render_libart.c deleted file mode 100644 index e2555ad671e7338579165f3d4aef004a506422ee..0000000000000000000000000000000000000000 --- a/plug-ins/libart/render_libart.c +++ /dev/null @@ -1,510 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 -#include /* strlen */ -#include - -#include "render_libart.h" - -#ifdef HAVE_LIBART - -#include "object.h" -#include "dialibartrenderer.h" -#include -#include "font.h" -#include "color.h" - -/** Used for highlighting mainpoint connections. */ -static Color cp_main_color = { 1.0, 0.8, 0.0, 1.0 }; -/** Used for highlighting normal connections. */ -static Color cp_color = { 1.0, 0.0, 0.0, 1.0 }; - -static Color text_edit_color = {1.0, 1.0, 0.0, 1.0 }; - - -static void clip_region_clear(DiaRenderer *self); -static void clip_region_add_rect(DiaRenderer *self, - Rectangle *rect); - -static void draw_pixel_line(DiaRenderer *self, - int x1, int y1, - int x2, int y2, - Color *color); -static void draw_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color); -static void fill_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color); -static void set_size(DiaRenderer *self, gpointer window, - int width, int height); -static void copy_to_window (DiaRenderer *self, gpointer window, - int x, int y, int width, int height); -static void draw_object_highlighted (DiaRenderer *renderer, - DiaObject *object, - DiaHighlightType type); - - -void -dia_libart_renderer_iface_init (DiaInteractiveRendererInterface* iface) -{ - iface->clip_region_clear = clip_region_clear; - iface->clip_region_add_rect = clip_region_add_rect; - iface->draw_pixel_line = draw_pixel_line; - iface->draw_pixel_rect = draw_pixel_rect; - iface->fill_pixel_rect = fill_pixel_rect; - iface->copy_to_window = copy_to_window; - iface->set_size = set_size; - iface->draw_object_highlighted = draw_object_highlighted; -} - - -DiaRenderer * -new_libart_renderer(DiaTransform *trans, int interactive) -{ - DiaLibartRenderer *renderer; - - renderer = g_object_new(DIA_TYPE_LIBART_RENDERER, NULL); - renderer->transform = trans; - renderer->parent_instance.is_interactive = interactive; - - return DIA_RENDERER (renderer); -} - -static void -set_size(DiaRenderer *self, gpointer window, - int width, int height) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int i; - - if ( (renderer->pixel_width==width) && - (renderer->pixel_height==height) ) - return; - - if (renderer->rgb_buffer != NULL) { - g_free(renderer->rgb_buffer); - } - - renderer->rgb_buffer = g_new (guint8, width * height * 3); - for (i=0;irgb_buffer[i] = 0xff; - renderer->pixel_width = width; - renderer->pixel_height = height; -} - -static void -copy_to_window (DiaRenderer *self, gpointer window, - int x, int y, int width, int height) -{ - GdkGC *copy_gc; - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int w; - - copy_gc = gdk_gc_new(GDK_WINDOW(window)); - - w = renderer->pixel_width; - - gdk_draw_rgb_image(window, - copy_gc, - x,y, - width, height, - GDK_RGB_DITHER_NONE, - renderer->rgb_buffer+x*3+y*3*w, - w*3); - g_object_unref(copy_gc); -} - -static void -clip_region_clear(DiaRenderer *self) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - - renderer->clip_rect_empty = 1; - renderer->clip_rect.top = 0; - renderer->clip_rect.bottom = 0; - renderer->clip_rect.left = 0; - renderer->clip_rect.right = 0; -} - -static void -clip_region_add_rect(DiaRenderer *self, - Rectangle *rect) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int x1,y1; - int x2,y2; - IntRectangle r; - - dia_transform_coords(renderer->transform, rect->left, rect->top, &x1, &y1); - dia_transform_coords(renderer->transform, rect->right, rect->bottom, &x2, &y2); - - if (x1 < 0) - x1 = 0; - if (y1 < 0) - y1 = 0; - if (x2 >= renderer->pixel_width) - x2 = renderer->pixel_width - 1; - if (y2 >= renderer->pixel_height) - y2 = renderer->pixel_height - 1; - - r.top = y1; - r.bottom = y2; - r.left = x1; - r.right = x2; - - if (renderer->clip_rect_empty) { - renderer->clip_rect = r; - renderer->clip_rect_empty = 0; - } else { - int_rectangle_union(&renderer->clip_rect, &r); - } -} - - -/* BIG FAT WARNING: - * This code is used to draw pixel based stuff in the RGB buffer. - * This code is *NOT* as efficient as it could be! - */ - -/* All lines and rectangles specifies the coordinates inclusive. - * This means that a line from x1 to x2 renders both points. - * If a length is specified the line x to (inclusive) x+width is rendered. - * - * The boundaries of the clipping rectangle *are* rendered. - * so min=5 and max=10 means point 5 and 10 might be rendered to. - */ - -/* If the start-end interval is totaly outside the min-max, - then the returned clipped values can have len<0! */ -#define CLIP_1D_LEN(min, max, start, len) \ - if ((start) < (min)) { \ - (len) -= (min) - (start); \ - (start) = (min); \ - } \ - if ((start)+(len) > (max)) { \ - (len) = (max) - (start); \ - } - -/* Does no clipping! */ -static void -draw_hline(DiaRenderer *self, - int x, int y, int length, - guint8 r, guint8 g, guint8 b) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int stride; - guint8 *ptr; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - if (length>=0) - art_rgb_fill_run(ptr, r, g, b, length+1); -} - -/* Does no clipping! */ -static void -draw_vline(DiaRenderer *self, - int x, int y, int height, - guint8 r, guint8 g, guint8 b) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - int stride; - guint8 *ptr; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - height+=y; - while (y<=height) { - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - ptr += stride - 3; - y++; - } -} - -static void -draw_pixel_line(DiaRenderer *self, - int x1, int y1, - int x2, int y2, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - guint8 *ptr; - int start, len; - int stride; - int i; - int x, y; - int dx, dy, adx, ady; - int incx, incy; - int incx_ptr, incy_ptr; - int frac_pos; - IntRectangle *clip_rect; - - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - if (y1==y2) { /* Horizontal line */ - start = x1; - len = x2-x1; - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, start, len); - - /* top line */ - if ( (y1>=renderer->clip_rect.top) && - (y1<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y1, len, r, g, b); - } - return; - } - - if (x1==x2) { /* Vertical line */ - start = y1; - len = y2-y1; - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, start, len); - - /* left line */ - if ( (x1>=renderer->clip_rect.left) && - (x1<=renderer->clip_rect.right) ) { - draw_vline(self, x1, start, len, r, g, b); - } - return; - } - - /* Ugh, kill me slowly for writing this line-drawer. - * It is actually a standard bresenham, but not very optimized. - * It is also not very well tested. - */ - - stride = renderer->pixel_width*3; - clip_rect = &renderer->clip_rect; - - dx = x2-x1; - dy = y2-y1; - adx = (dx>=0)?dx:-dx; - ady = (dy>=0)?dy:-dy; - - x = x1; y = y1; - ptr = renderer->rgb_buffer + x*3 + y*stride; - - if (adx>=ady) { /* x-major */ - if (dx>0) { - incx = 1; - incx_ptr = 3; - } else { - incx = -1; - incx_ptr = -3; - } - if (dy>0) { - incy = 1; - incy_ptr = stride; - } else { - incy = -1; - incy_ptr = -stride; - } - frac_pos = adx; - - for (i=0;i<=adx;i++) { - /* Amazing... He does the clipping in the inner loop! - It must be horribly inefficient! */ - if ( (x>=clip_rect->left) && - (x<=clip_rect->right) && - (y>=clip_rect->top) && - (y<=clip_rect->bottom) ) { - ptr[0] = r; - ptr[1] = g; - ptr[2] = b; - } - x += incx; - ptr += incx_ptr; - frac_pos += ady*2; - if ((frac_pos > 2*adx) || ((dy>0)&&(frac_pos == 2*adx))) { - y += incy; - ptr += incy_ptr; - frac_pos -= 2*adx; - } - } - } else { /* y-major */ - if (dx>0) { - incx = 1; - incx_ptr = 3; - } else { - incx = -1; - incx_ptr = -3; - } - if (dy>0) { - incy = 1; - incy_ptr = stride; - } else { - incy = -1; - incy_ptr = -stride; - } - frac_pos = ady; - - for (i=0;i<=ady;i++) { - /* Amazing... He does the clipping in the inner loop! - It must be horribly inefficient! */ - if ( (x>=clip_rect->left) && - (x<=clip_rect->right) && - (y>=clip_rect->top) && - (y<=clip_rect->bottom) ) { - ptr[0] = r; - ptr[1] = g; - ptr[2] = b; - } - y += incy; - ptr += incy_ptr; - frac_pos += adx*2; - if ((frac_pos > 2*ady) || ((dx>0)&&(frac_pos == 2*ady))) { - x += incx; - ptr += incx_ptr; - frac_pos -= 2*ady; - } - } - } -} - -static void -draw_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - int start, len; - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - /* clip in x */ - start = x; - len = width; - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, start, len); - - /* top line */ - if ( (y>=renderer->clip_rect.top) && - (y<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y, len, r, g, b); - } - - /* bottom line */ - if ( (y+height>=renderer->clip_rect.top) && - (y+height<=renderer->clip_rect.bottom) ) { - draw_hline(self, start, y+height, len, r, g, b); - } - - /* clip in y */ - start = y; - len = height; - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, start, len); - - /* left line */ - if ( (x>=renderer->clip_rect.left) && - (xclip_rect.right) ) { - draw_vline(self, x, start, len, r, g, b); - } - - /* right line */ - if ( (x+width>=renderer->clip_rect.left) && - (x+widthclip_rect.right) ) { - draw_vline(self, x+width, start, len, r, g, b); - } -} - -static void -fill_pixel_rect(DiaRenderer *self, - int x, int y, - int width, int height, - Color *color) -{ - DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self); - guint8 r,g,b; - guint8 *ptr; - int i; - int stride; - - - CLIP_1D_LEN(renderer->clip_rect.left, renderer->clip_rect.right, x, width); - if (width < 0) - return; - - CLIP_1D_LEN(renderer->clip_rect.top, renderer->clip_rect.bottom, y, height); - if (height < 0) - return; - - r = color->red*0xff; - g = color->green*0xff; - b = color->blue*0xff; - - stride = renderer->pixel_width*3; - ptr = renderer->rgb_buffer + x*3 + y*stride; - for (i=0;i<=height;i++) { - art_rgb_fill_run(ptr, r, g, b, width+1); - ptr += stride; - } -} - - -static void -draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type) -{ - DiaLibartRenderer *libart_rend = DIA_LIBART_RENDERER(renderer); - Color *color = NULL; - switch (type) { - case DIA_HIGHLIGHT_CONNECTIONPOINT: - color = &cp_color; - break; - case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN: - color = &cp_main_color; - break; - case DIA_HIGHLIGHT_TEXT_EDIT: - color = &text_edit_color; - break; - case DIA_HIGHLIGHT_NONE: - color = NULL; - break; - } - if( color ) { - libart_rend->highlight_color = color; - object->ops->draw(object, renderer); - libart_rend->highlight_color = NULL; - } - - object->ops->draw(object, renderer); -} - -#else - -DiaRenderer * -new_libart_renderer(DiaTransform *transform, int interactive) -{ - return NULL; -} - -#endif - diff --git a/plug-ins/libart/render_libart.h b/plug-ins/libart/render_libart.h deleted file mode 100644 index ae5fffe80ba02c90822238fa41de4f8b948af9b8..0000000000000000000000000000000000000000 --- a/plug-ins/libart/render_libart.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Dia -- an diagram creation/manipulation program - * Copyright (C) 1998 Alexander Larsson - * - * 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 RENDER_LIBART_H -#define RENDER_LIBART_H - -#include "diarenderer.h" -#include "diatransform.h" - -DiaRenderer *new_libart_renderer(DiaTransform *trans, int interactive); - -#endif /* RENDER_GDK_H */ diff --git a/plug-ins/makefile.msc b/plug-ins/makefile.msc index 4fefedb2110e3826d4bff69f8f01da6bff8c223a..125222270895487079b0475aff93f1e87b800724 100644 --- a/plug-ins/makefile.msc +++ b/plug-ins/makefile.msc @@ -1,7 +1,7 @@ !IFNDEF PACKAGE # dummy sissi -PLUGINS = cairo cgm dxf hpgl libart metapost pgf pixbuf \ +PLUGINS = cairo cgm dxf hpgl metapost pgf pixbuf \ postscript pstricks shape svg vdx wmf wpg xfig xslt \ drs stress layout pdf @@ -60,8 +60,8 @@ OBJECTS = \ !ENDIF !IFDEF OBJ_cairo -DEPCFLAGS = $(CAIRO_CFLAGS) -DHAVE_PANGOCAIRO_H -PKG_LINK = $(PKG_LINK) $(CAIRO_LIBS) $(PANGOCAIRO_LIBS) gdi32.lib +DEPCFLAGS = $(CAIRO_CFLAGS) +PKG_LINK = $(PKG_LINK) $(CAIRO_LIBS) gdi32.lib OBJECTS = \ diacairo.obj \ diacairo-interactive.obj \ @@ -93,16 +93,6 @@ OBJECTS = \ layout.obj !ENDIF -!IFDEF OBJ_libart -DEPCFLAGS = -DHAVE_LIBART -DHAVE_LIBPNG $(LIBART_CFLAGS) $(PNG_CFLAGS) -PKG_LINK = $(PKG_LINK) $(LIBART_LIBS) $(PNG_LIBS) ..\..\app\dia-app.lib -OBJECTS = \ - dialibart.obj \ - export_png.obj \ - render_libart.obj \ - dialibartrenderer.obj -!ENDIF - !IFDEF OBJ_metapost OBJECTS = \ metapost.obj \ diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c index 63a0b787708c74d1ae35fef618b0974189bfcedc..880504a318774bcddd098f6cc038ed6dc9d5ecaf 100644 --- a/plug-ins/metapost/render_metapost.c +++ b/plug-ins/metapost/render_metapost.c @@ -164,7 +164,7 @@ end_draw_op(MetapostRenderer *renderer) fprintf(renderer->file, "\n withpen pencircle scaled %sx", g_ascii_formatd(d1_buf, sizeof(d1_buf), "%5.4f", (gdouble) renderer->line_width) ); - if (!color_equals(&renderer->color, &color_black)) + if (!gdk_rgba_equal(&renderer->color, &color_black)) fprintf(renderer->file, "\n withcolor (%s, %s, %s)", g_ascii_formatd(d1_buf, sizeof(d1_buf), "%5.4f", (gdouble) renderer->color.red), g_ascii_formatd(d2_buf, sizeof(d2_buf), "%5.4f", (gdouble) renderer->color.green), @@ -175,7 +175,7 @@ end_draw_op(MetapostRenderer *renderer) } static void -set_line_color(MetapostRenderer *renderer,Color *color) +set_line_color(MetapostRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -437,7 +437,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -456,7 +456,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); int i; @@ -481,7 +481,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); int i; @@ -526,7 +526,7 @@ metapost_arc(MetapostRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color, int filled) + GdkRGBA *color, int filled) { double radius1,radius2; double angle3; @@ -571,7 +571,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); @@ -583,7 +583,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); @@ -594,7 +594,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar d1_buf[DTOSTR_BUF_SIZE]; @@ -638,7 +638,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gint i; @@ -685,8 +685,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gint i; @@ -755,7 +755,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { MetapostRenderer *renderer = METAPOST_RENDERER (self); gchar height_buf[DTOSTR_BUF_SIZE]; @@ -795,7 +795,7 @@ draw_string(DiaRenderer *self, mp_dtostr(px_buf, pos->x), mp_dtostr(py_buf, pos->y) ); - if (!color_equals(&renderer->color, &color_black)) + if (!gdk_rgba_equal(&renderer->color, &color_black)) fprintf(renderer->file, "\n withcolor (%s, %s, %s)", g_ascii_formatd(red_buf, sizeof(red_buf), "%5.4f", (gdouble) renderer->color.red), g_ascii_formatd(green_buf, sizeof(green_buf), "%5.4f", (gdouble) renderer->color.green), @@ -1014,7 +1014,7 @@ export_metapost(DiagramData *data, DiaContext *ctx, gchar d3_buf[DTOSTR_BUF_SIZE]; gchar d4_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/metapost/render_metapost.h b/plug-ins/metapost/render_metapost.h index 7758d8fc6bdc6c8de2839aa792b61abf93c7380b..b716f57de7d8245644150db030cf047f343375cb 100644 --- a/plug-ins/metapost/render_metapost.h +++ b/plug-ins/metapost/render_metapost.h @@ -53,7 +53,7 @@ struct _MetapostRenderer LineCaps saved_line_cap; LineJoin saved_line_join; - Color color; + GdkRGBA color; real line_width; real dash_length; diff --git a/plug-ins/pdf/pdf-import.cpp b/plug-ins/pdf/pdf-import.cpp index 8e784d1b4b7f426a918f6b1c9119727e3a643e25..46e36dcac2bdc4e502b330371351a55e71ddcfe1 100644 --- a/plug-ins/pdf/pdf-import.cpp +++ b/plug-ins/pdf/pdf-import.cpp @@ -231,7 +231,7 @@ public : void updateFillColorStop(GfxState * state, double offset) { GfxRGB color; - Color fill = this->fill_color; + GdkRGBA fill = this->fill_color; state->getFillRGB(&color); fill.red = colToDbl(color.r); @@ -434,13 +434,13 @@ private : DiagramData *dia; - Color stroke_color; + GdkRGBA stroke_color; real line_width; LineStyle line_style; real dash_length; LineJoin line_join; LineCaps line_caps; - Color fill_color; + GdkRGBA fill_color; Alignment alignment; @@ -699,7 +699,7 @@ DiaOutputDev::eoFill (GfxState *state) void DiaOutputDev::drawString(GfxState *state, GooString *s) { - Color text_color = this->fill_color; + GdkRGBA text_color = this->fill_color; int len = s->getLength(); DiaObject *obj; gchar *utf8 = NULL; diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c index 1617d716b8b55bde29aab7bec854443272e959e2..5f40a7acaeebe309235dd4c3b73ebe5a21963ad8 100644 --- a/plug-ins/pgf/render_pgf.c +++ b/plug-ins/pgf/render_pgf.c @@ -88,86 +88,86 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color); + GdkRGBA *line_color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color); + GdkRGBA *line_color); static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius); + GdkRGBA *color, real radius); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius); + GdkRGBA *fill, GdkRGBA *stroke, real radius); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image(DiaRenderer *self, Point *point, real width, real height, DiaImage *image); static void draw_line_with_arrows(DiaRenderer *renderer, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); static void draw_arc_with_arrows(DiaRenderer *renderer, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows(DiaRenderer *renderer, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_rounded_polyline_with_arrows(DiaRenderer *renderer, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); static void draw_bezier_with_arrows(DiaRenderer *renderer, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); /*store the higher level arrow functions for arrows not (yet) implemented in this PGF macro*/ void (*orig_draw_line_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_arc_with_arrows) (DiaRenderer *renderer, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_polyline_with_arrows) (DiaRenderer *renderer, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); void (*orig_draw_rounded_polyline_with_arrows) (DiaRenderer *renderer, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius); void (*orig_draw_bezier_with_arrows) (DiaRenderer *renderer, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); @@ -294,7 +294,7 @@ pgf_renderer_class_init (PgfRendererClass *klass) static void -set_line_color(PgfRenderer *renderer,Color *color) +set_line_color(PgfRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -310,7 +310,7 @@ set_line_color(PgfRenderer *renderer,Color *color) } static void -set_fill_color(PgfRenderer *renderer,Color *color) +set_fill_color(PgfRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -475,7 +475,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { PgfRenderer *renderer = PGF_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -495,7 +495,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { PgfRenderer *renderer = PGF_RENDERER(self); int i; @@ -521,7 +521,7 @@ draw_polyline(DiaRenderer *self, from each segment of the polyline*/ static void draw_rounded_polyline (DiaRenderer *self, Point *points, int num_points, - Color *color, real radius) + GdkRGBA *color, real radius) { gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -536,7 +536,7 @@ static void draw_rounded_polyline (DiaRenderer *self, static void pgf_polygon(PgfRenderer *renderer, Point *points, gint num_points, - Color *line_color, gboolean filled) + GdkRGBA *line_color, gboolean filled) { gint i; gchar px_buf[DTOSTR_BUF_SIZE]; @@ -562,7 +562,7 @@ pgf_polygon(PgfRenderer *renderer, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -576,7 +576,7 @@ draw_polygon(DiaRenderer *self, static void pgf_rect(PgfRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar ulx_buf[DTOSTR_BUF_SIZE]; gchar uly_buf[DTOSTR_BUF_SIZE]; @@ -602,7 +602,7 @@ pgf_rect(PgfRenderer *renderer, static void stroke_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, real radius) + GdkRGBA *color, real radius) { gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -617,7 +617,7 @@ stroke_rounded_rect(DiaRenderer *self, static void fill_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *color, real radius) + GdkRGBA *color, real radius) { PgfRenderer *renderer = PGF_RENDERER(self); gchar rad_buf[DTOSTR_BUF_SIZE]; @@ -631,7 +631,7 @@ fill_rounded_rect(DiaRenderer *self, static void draw_rounded_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { if (fill) fill_rounded_rect (self, ul_corner, lr_corner, fill, radius); @@ -644,7 +644,7 @@ pgf_arc(PgfRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color,int filled) + GdkRGBA *color,int filled) { double radius1,radius2; int ang1,ang2; @@ -701,7 +701,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -713,7 +713,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -724,7 +724,7 @@ static void pgf_ellipse(PgfRenderer *renderer, Point *center, real width, real height, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; @@ -751,7 +751,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -765,7 +765,7 @@ static void pgf_bezier (PgfRenderer *renderer, BezPoint *points, gint numpoints, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, gboolean closed) { gint i; @@ -824,7 +824,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -837,8 +837,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PgfRenderer *renderer = PGF_RENDERER(self); @@ -891,7 +891,7 @@ set_arrows(PgfRenderer *renderer, Arrow *start_arrow, Arrow *end_arrow) static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, - real line_width, Color *line_color, + real line_width, GdkRGBA *line_color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -929,7 +929,7 @@ draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, static void draw_arc_with_arrows(DiaRenderer *self, Point *start, Point *end, Point *midpoint, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -965,7 +965,7 @@ draw_arc_with_arrows(DiaRenderer *self, Point *start, Point *end, Point *midpoin static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -1001,7 +1001,7 @@ draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, static void draw_rounded_polyline_with_arrows(DiaRenderer *self, - Point *points, int num_points, real line_width, Color *color, + Point *points, int num_points, real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow, real radius) { int nat_arr; @@ -1039,7 +1039,7 @@ draw_rounded_polyline_with_arrows(DiaRenderer *self, static void draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int num_points, - real line_width, Color *color, + real line_width, GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { int nat_arr; @@ -1128,7 +1128,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { PgfRenderer *renderer = PGF_RENDERER(self); gchar *escaped = tex_escape_string(text, renderer->ctx); @@ -1184,7 +1184,7 @@ export_pgf(DiagramData *data, DiaContext *ctx, gchar scale1_buf[DTOSTR_BUF_SIZE]; gchar scale2_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c index 9eb26ed0c908083350c76f2447ee7c9281b7e591..dcb7e8abf0b9b5fc078ee1cfaea1e5b82fe24a4c 100644 --- a/plug-ins/pixbuf/pixbuf.c +++ b/plug-ins/pixbuf/pixbuf.c @@ -27,7 +27,7 @@ #include "intl.h" #include "geometry.h" -#include "diagdkrenderer.h" +#include "renderer/diacairo.h" #include "filter.h" #include "plug-ins.h" #include "properties.h" @@ -38,13 +38,14 @@ export_data(DiagramData *data, DiaContext *ctx, const gchar *filename, const gchar *diafilename, void* user_data) { - DiaGdkRenderer *renderer; - GdkColor color; + DiaCairoRenderer *renderer; + GdkRGBA color; int width, height; GdkPixbuf* pixbuf = NULL; GError* error = NULL; Rectangle rect; real zoom = 1.0; + cairo_t *cctx; const char* format = (const char*)user_data; rect.left = data->extents.left; @@ -59,23 +60,22 @@ export_data(DiagramData *data, DiaContext *ctx, width = ceil((rect.right - rect.left) * zoom) + 1; height = ceil((rect.bottom - rect.top) * zoom) + 1; - renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL); - renderer->transform = dia_transform_new (&rect, &zoom); - renderer->pixmap = gdk_pixmap_new(NULL, width, height, gdk_visual_get_system()->depth); - renderer->gc = gdk_gc_new(renderer->pixmap); + renderer = g_object_new (dia_cairo_renderer_get_type(), NULL); + renderer->scale = zoom; + renderer->surface = cairo_surface_reference (cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height)); + + cctx = cairo_create (renderer->surface); /* draw background */ - color_convert (&data->bg_color, &color); - gdk_gc_set_foreground(renderer->gc, &color); - gdk_draw_rectangle(renderer->pixmap, renderer->gc, 1, - 0, 0, width, height); + gdk_cairo_set_source_rgba (cctx, &data->bg_color); + cairo_rectangle (cctx, 0, 0, width, height); + cairo_fill (cctx); - data_render(data, DIA_RENDERER (renderer), NULL, NULL, NULL); + data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL); - pixbuf = gdk_pixbuf_get_from_drawable (NULL, renderer->pixmap, - gdk_colormap_get_system (), - 0, 0, 0, 0, - width, height); + pixbuf = gdk_pixbuf_get_from_surface (renderer->surface, 0, 0, + width, height); if (pixbuf) { gdk_pixbuf_save (pixbuf, filename, format, &error, NULL); @@ -201,11 +201,6 @@ dia_plugin_init(PluginInfo *info) GSList* formats = gdk_pixbuf_get_formats (); GSList* sl; - /* if we get this far we still may be running non-interactive. To avoid complains - * from color_convert() we are initializing ourselves ;) - */ - color_init (); - /* * Instead of hard-coding capabilities, ask GdkPixbuf what's installed */ diff --git a/plug-ins/postscript/diapsft2renderer.c b/plug-ins/postscript/diapsft2renderer.c index 9399ee9bd8e5e2da50368c80515bfd384a277773..791b916e2b49861d2b809e6c26e6617d7a2f789b 100644 --- a/plug-ins/postscript/diapsft2renderer.c +++ b/plug-ins/postscript/diapsft2renderer.c @@ -79,7 +79,7 @@ static void dia_ps_ft2_renderer_class_init (DiaPsFt2RendererClass *klass); static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color); + Point *pos, Alignment alignment, GdkRGBA *color); static gpointer parent_class = NULL; @@ -336,7 +336,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); TextLine *text_line = text_line_new(text, renderer->current_font, @@ -348,7 +348,7 @@ draw_string(DiaRenderer *self, static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *color) + Point *pos, Alignment alignment, GdkRGBA *color) { DiaPsFt2Renderer *renderer = DIA_PS_FT2_RENDERER(self); PangoLayout *layout; diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c index e442f247ba08ff0648951e621036f6131b9fb4a9..07b38d0075b3c709fa0799f1ab32699d83d5a479 100644 --- a/plug-ins/postscript/diapsrenderer.c +++ b/plug-ins/postscript/diapsrenderer.c @@ -51,13 +51,13 @@ static gboolean renderer_is_epsi(DiaPsRenderer *renderer) { void lazy_setcolor(DiaPsRenderer *renderer, - Color *color) + GdkRGBA *color) { gchar r_buf[DTOSTR_BUF_SIZE]; gchar g_buf[DTOSTR_BUF_SIZE]; gchar b_buf[DTOSTR_BUF_SIZE]; - if (!color_equals(color, &(renderer->lcolor))) { + if (!gdk_rgba_equal(color, &(renderer->lcolor))) { renderer->lcolor = *color; fprintf(renderer->file, "%s %s %s srgb\n", psrenderer_dtostr(r_buf, (gdouble) color->red), @@ -293,7 +293,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -313,7 +313,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); int i; @@ -339,7 +339,7 @@ static void psrenderer_polygon(DiaPsRenderer *renderer, Point *points, gint num_points, - Color *line_color, + GdkRGBA *line_color, gboolean filled) { gint i; @@ -367,7 +367,7 @@ psrenderer_polygon(DiaPsRenderer *renderer, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); /* XXX: not optimized to fill and stroke at once */ @@ -382,7 +382,7 @@ psrenderer_arc(DiaPsRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color, + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -423,7 +423,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_arc(renderer, center, width, height, angle1, angle2, color, FALSE); @@ -434,7 +434,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_arc(renderer, center, width, height, angle1, angle2, color, TRUE); @@ -444,7 +444,7 @@ static void psrenderer_ellipse(DiaPsRenderer *renderer, Point *center, real width, real height, - Color *color, + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -466,7 +466,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); if (fill) @@ -479,7 +479,7 @@ static void psrenderer_bezier(DiaPsRenderer *renderer, BezPoint *points, gint numpoints, - Color *color, + GdkRGBA *color, gboolean filled) { gint i; @@ -530,7 +530,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); psrenderer_bezier(renderer, points, numpoints, color, FALSE); @@ -540,8 +540,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); if (fill) @@ -616,7 +616,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { DiaPsRenderer *renderer = DIA_PS_RENDERER(self); Point pos_adj; diff --git a/plug-ins/postscript/diapsrenderer.h b/plug-ins/postscript/diapsrenderer.h index 267330f81f90d6eecfd98ee8d9651c5efb83ba61..eae3cf33a19cc002fb8e3e779527b353517f9d16 100644 --- a/plug-ins/postscript/diapsrenderer.h +++ b/plug-ins/postscript/diapsrenderer.h @@ -2,7 +2,6 @@ #define DIA_PS_RENDERER_H #include -#include "color.h" #include "diarenderer.h" @@ -38,7 +37,7 @@ struct _DiaPsRenderer guint pstype; guint pagenum; - Color lcolor; + GdkRGBA lcolor; gchar *title; gchar *paper; @@ -59,7 +58,7 @@ struct _DiaPsRendererClass void (*end_prolog) (DiaPsRenderer *renderer); }; -void lazy_setcolor(DiaPsRenderer *renderer, Color *color); +void lazy_setcolor(DiaPsRenderer *renderer, GdkRGBA *color); G_END_DECLS diff --git a/plug-ins/postscript/paginate_psprint.c b/plug-ins/postscript/paginate_psprint.c index f36db52620199d3d9f79e21ea45757e83eb1f7bf..38e725794dce52290284344bc07511294a0f6bd1 100644 --- a/plug-ins/postscript/paginate_psprint.c +++ b/plug-ins/postscript/paginate_psprint.c @@ -275,37 +275,39 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_widget_show(frame); - table = gtk_table_new(2, 2, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_widget_show(table); - - iscmd = gtk_radio_button_new_with_label(NULL, _("Printer")); - gtk_table_attach(GTK_TABLE(table), iscmd, 0,1, 0,1, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); + table = gtk_grid_new (); + gtk_container_set_border_width (GTK_CONTAINER (table), 5); + gtk_grid_set_row_spacing (GTK_GRID (table), 5); + gtk_grid_set_column_spacing (GTK_GRID (table), 5); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + iscmd = gtk_radio_button_new_with_label (NULL, _("Printer")); + gtk_widget_set_vexpand (iscmd, TRUE); + gtk_grid_attach (GTK_GRID (table), iscmd, 0, 0, 1, 1); gtk_widget_show(iscmd); - cmd = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), cmd, 1,2, 0,1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(cmd); + cmd = gtk_entry_new (); + gtk_widget_set_vexpand (cmd, TRUE); + gtk_widget_set_hexpand (cmd, TRUE); + gtk_grid_attach (GTK_GRID (table), cmd, 1, 0, 1, 1); + gtk_widget_show (cmd); g_signal_connect(G_OBJECT(iscmd), "toggled", G_CALLBACK(change_entry_state), cmd); isofile = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(iscmd)), _("File")); - gtk_table_attach(GTK_TABLE(table), isofile, 0,1, 1,2, - GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(isofile); - - ofile = gtk_entry_new(); - gtk_widget_set_sensitive(ofile, FALSE); - gtk_table_attach(GTK_TABLE(table), ofile, 1,2, 1,2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); - gtk_widget_show(ofile); + gtk_widget_set_vexpand (isofile, TRUE); + gtk_grid_attach(GTK_GRID (table), isofile, 0, 1, 1, 1); + gtk_widget_show (isofile); + + ofile = gtk_entry_new (); + gtk_widget_set_sensitive (ofile, FALSE); + gtk_widget_set_vexpand (ofile, TRUE); + gtk_widget_set_hexpand (ofile, TRUE); + gtk_grid_attach (GTK_GRID (table), ofile, 1, 1, 1, 1); + gtk_widget_show (ofile); g_signal_connect(G_OBJECT(isofile), "toggled", G_CALLBACK(change_entry_state), ofile); @@ -314,11 +316,7 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) button = gtk_button_new_with_label(_("OK")); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(ok_pressed), &cont); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_grab_default(button); gtk_widget_show(button); @@ -326,11 +324,7 @@ diagram_print_ps(DiagramData *dia, const gchar* original_filename) button = gtk_button_new_with_label(_("Cancel")); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL); -#if GTK_CHECK_VERSION(2,18,0) gtk_widget_set_can_default (GTK_WIDGET (button), TRUE); -#else - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); -#endif gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c index 44b0ffdbefb599d42f4726d4c7063a2c71266dd5..65ce1eae59a0a5f751ddddb098ccaf4c89da23f6 100644 --- a/plug-ins/pstricks/render_pstricks.c +++ b/plug-ins/pstricks/render_pstricks.c @@ -74,40 +74,40 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color); + GdkRGBA *line_color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color); + GdkRGBA *line_color); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color); + GdkRGBA *color); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color); + GdkRGBA *color); static void draw_beziergon(DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color); + GdkRGBA *color); static void draw_image(DiaRenderer *self, Point *point, real width, real height, @@ -216,7 +216,7 @@ pstricks_renderer_class_init (PstricksRendererClass *klass) static void -set_line_color(PstricksRenderer *renderer,Color *color) +set_line_color(PstricksRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -230,7 +230,7 @@ set_line_color(PstricksRenderer *renderer,Color *color) } static void -set_fill_color(PstricksRenderer *renderer,Color *color) +set_fill_color(PstricksRenderer *renderer,GdkRGBA *color) { gchar red_buf[DTOSTR_BUF_SIZE]; gchar green_buf[DTOSTR_BUF_SIZE]; @@ -390,7 +390,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_color) + GdkRGBA *line_color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gchar sx_buf[DTOSTR_BUF_SIZE]; @@ -410,7 +410,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_color) + GdkRGBA *line_color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); int i; @@ -434,7 +434,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gint i; @@ -477,7 +477,7 @@ pstricks_arc(PstricksRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *color,int filled) + GdkRGBA *color,int filled) { double radius1,radius2; gchar cx_buf[DTOSTR_BUF_SIZE]; @@ -525,7 +525,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -537,7 +537,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -548,7 +548,7 @@ static void pstricks_ellipse(PstricksRenderer *renderer, Point *center, real width, real height, - Color *color, gboolean filled) + GdkRGBA *color, gboolean filled) { gchar cx_buf[DTOSTR_BUF_SIZE]; gchar cy_buf[DTOSTR_BUF_SIZE]; @@ -569,7 +569,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -583,8 +583,8 @@ static void pstricks_bezier(PstricksRenderer *renderer, BezPoint *points, gint numpoints, - Color *fill, - Color *stroke, + GdkRGBA *fill, + GdkRGBA *stroke, gboolean closed) { gint i; @@ -647,7 +647,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, /* numpoints = 4+3*n, n=>0 */ - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -659,8 +659,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); @@ -718,7 +718,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { PstricksRenderer *renderer = PSTRICKS_RENDERER(self); gchar *escaped = NULL; @@ -862,7 +862,7 @@ export_pstricks(DiagramData *data, DiaContext *ctx, gchar scale1_buf[DTOSTR_BUF_SIZE]; gchar scale2_buf[DTOSTR_BUF_SIZE]; - Color initial_color; + GdkRGBA initial_color; file = g_fopen(filename, "wb"); diff --git a/plug-ins/python/Makefile.am b/plug-ins/python/Makefile.am index b9f2a620cfdf180a439b7c6a72b397f15b4efb50..f210c3caca432de97db5acf7a24fbe47c1be91bb 100644 --- a/plug-ins/python/Makefile.am +++ b/plug-ins/python/Makefile.am @@ -4,7 +4,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/lib \ $(DEBUG_FLAGS) \ $(GTK_CFLAGS) \ - $(LIBART_CFLAGS) \ $(PYTHON_INCLUDES) \ $(XML_CFLAGS) $(UNICODE_CFLAGS) diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c index 01b774d69d56835b3f5b48f115383abf45783327..bd4bf817ec507022fe1fc197e9e2f24bcd9527cb 100644 --- a/plug-ins/python/diamodule.c +++ b/plug-ins/python/diamodule.c @@ -221,15 +221,15 @@ PyDia_RegisteredSheets(PyObject *self, PyObject *args) static PyObject * PyDia_ActiveDisplay(PyObject *self, PyObject *args) { - DDisplay *disp; + DiaDisplay *disp; - if (!PyArg_ParseTuple(args, ":dia.active_display")) - return NULL; - disp = ddisplay_active(); - if (disp) - return PyDiaDisplay_New(disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":dia.active_display")) + return NULL; + disp = dia_display_active(); + if (disp) + return PyDiaDisplay_New(disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * @@ -672,9 +672,6 @@ initdia(void) Py_FatalError("can't initialize module dia"); else { /* should all be no-ops when used embedded */ -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init (); -#endif libdia_init (DIA_MESSAGE_STDERR); } } diff --git a/plug-ins/python/pydia-color.c b/plug-ins/python/pydia-color.c index dcf27439d5b2287438e77d61d796b5f26259866a..8c37cfff0b946dc7d96364f39f73d956bcfaef19 100644 --- a/plug-ins/python/pydia-color.c +++ b/plug-ins/python/pydia-color.c @@ -27,7 +27,7 @@ /* * New */ -PyObject* PyDiaColor_New (Color* color) +PyObject* PyDiaColor_New (GdkRGBA* color) { PyDiaColor *self; @@ -55,7 +55,7 @@ static int PyDiaColor_Compare(PyDiaColor *self, PyDiaColor *other) { - return memcmp(&(self->color), &(other->color), sizeof(Color)); + return memcmp(&(self->color), &(other->color), sizeof(GdkRGBA)); } /* diff --git a/plug-ins/python/pydia-color.h b/plug-ins/python/pydia-color.h index 0f8aa6210fe2d8fb0e0addf8493fa61ea20ad793..bbb33d2bfea86db8176b690d7c7c1bfa2102431d 100644 --- a/plug-ins/python/pydia-color.h +++ b/plug-ins/python/pydia-color.h @@ -2,15 +2,14 @@ #define PYDIA_COLOR_H #include -#include "color.h" typedef struct { PyObject_HEAD - Color color; + GdkRGBA color; } PyDiaColor; extern PyTypeObject PyDiaColor_Type; -PyObject* PyDiaColor_New (Color* color); +PyObject* PyDiaColor_New (GdkRGBA* color); #endif diff --git a/plug-ins/python/pydia-diagram.c b/plug-ins/python/pydia-diagram.c index 447e6a1ea1da8d9b1f84d9155ecfe4cc14f63166..9e88a994e9070d8be7af1f978943e3e0130b3ce4 100644 --- a/plug-ins/python/pydia-diagram.c +++ b/plug-ins/python/pydia-diagram.c @@ -332,12 +332,13 @@ PyDiaDiagram_Save(PyDiaDiagram *self, PyObject *args) static PyObject * PyDiaDiagram_Display(PyDiaDiagram *self, PyObject *args) { - DDisplay *disp; + DiaDisplay *disp; - if (!PyArg_ParseTuple(args, ":Diagram.display")) - return NULL; - disp = new_display(self->dia); - return PyDiaDisplay_New(disp); + if (!PyArg_ParseTuple(args, ":Diagram.display")) + return NULL; + + disp = dia_display_new (self->dia); + return PyDiaDisplay_New(disp); } /* @@ -573,7 +574,7 @@ PyDiaDiagram_GetAttr(PyDiaDiagram *self, gchar *attr) ret = PyTuple_New(g_slist_length(self->dia->displays)); for (i = 0, tmp = self->dia->displays; tmp; i++, tmp = tmp->next) - PyTuple_SetItem(ret, i, PyDiaDisplay_New((DDisplay *)tmp->data)); + PyTuple_SetItem(ret, i, PyDiaDisplay_New((DiaDisplay *)tmp->data)); return ret; } diff --git a/plug-ins/python/pydia-display.c b/plug-ins/python/pydia-display.c index 1e8b063cee07b1ba6bc89aa46642d228c029cbd3..503e1baff71171f58667358c98ff56a6dfe68817 100644 --- a/plug-ins/python/pydia-display.c +++ b/plug-ins/python/pydia-display.c @@ -26,7 +26,7 @@ #include /* PyMemberDef */ PyObject * -PyDiaDisplay_New(DDisplay *disp) +PyDiaDisplay_New(DiaDisplay *disp) { PyDiaDisplay *self; @@ -68,132 +68,132 @@ PyDiaDisplay_Str(PyDiaDisplay *self) static PyObject * PyDiaDisplay_AddUpdateAll(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.add_update_all")) - return NULL; - ddisplay_add_update_all(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.add_update_all")) + return NULL; + dia_display_add_update_all(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_Flush(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.flush")) - return NULL; - ddisplay_flush(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.flush")) + return NULL; + dia_display_flush(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_SetOrigion(PyDiaDisplay *self, PyObject *args) { - double x, y; + double x, y; - if (!PyArg_ParseTuple(args, "dd:Display.set_origion", &x, &y)) - return NULL; - ddisplay_set_origo(self->disp, x, y); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, "dd:Display.set_origion", &x, &y)) + return NULL; + dia_display_set_origo(self->disp, x, y); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_Zoom(PyDiaDisplay *self, PyObject *args) { - Point p; - double zoom; - - if (!PyArg_ParseTuple(args, "(dd)d:Display.zoom", &p.x, &p.y, &zoom)) - return NULL; - ddisplay_zoom(self->disp, &p, zoom); - Py_INCREF(Py_None); - return Py_None; + Point p; + double zoom; + + if (!PyArg_ParseTuple(args, "(dd)d:Display.zoom", &p.x, &p.y, &zoom)) + return NULL; + dia_display_zoom(self->disp, &p, zoom); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_ResizeCanvas(PyDiaDisplay *self, PyObject *args) { - int width, height; + int width, height; - if (!PyArg_ParseTuple(args, "ii:Display.resize_canvas", &width,&height)) - return NULL; - ddisplay_resize_canvas(self->disp, width, height); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, "ii:Display.resize_canvas", &width,&height)) + return NULL; + dia_display_resize_canvas(self->disp, width, height); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_Close(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.close")) - return NULL; - ddisplay_close(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.close")) + return NULL; + dia_display_close(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_SetTitle(PyDiaDisplay *self, PyObject *args) { - gchar *title; + gchar *title; - if (!PyArg_ParseTuple(args, "s:Display.set_title", &title)) - return NULL; - ddisplay_set_title(self->disp, title); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, "s:Display.set_title", &title)) + return NULL; + dia_display_set_title(self->disp, title); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_Scroll(PyDiaDisplay *self, PyObject *args) { - Point delta; + Point delta; - if (!PyArg_ParseTuple(args, "dd:Display.scroll", &delta.x, &delta.y)) - return NULL; - ddisplay_scroll(self->disp, &delta); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, "dd:Display.scroll", &delta.x, &delta.y)) + return NULL; + dia_display_scroll(self->disp, &delta); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_ScrollUp(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.scroll_up")) - return NULL; - ddisplay_scroll_up(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.scroll_up")) + return NULL; + dia_display_scroll_up(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_ScrollDown(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.scroll_down")) - return NULL; - ddisplay_scroll_down(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.scroll_down")) + return NULL; + dia_display_scroll_down(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_ScrollLeft(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.scroll_left")) - return NULL; - ddisplay_scroll_left(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.scroll_left")) + return NULL; + dia_display_scroll_left(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyObject * PyDiaDisplay_ScrollRight(PyDiaDisplay *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":Display.scroll_right")) - return NULL; - ddisplay_scroll_right(self->disp); - Py_INCREF(Py_None); - return Py_None; + if (!PyArg_ParseTuple(args, ":Display.scroll_right")) + return NULL; + dia_display_scroll_right(self->disp); + Py_INCREF(Py_None); + return Py_None; } static PyMethodDef PyDiaDisplay_Methods[] = { diff --git a/plug-ins/python/pydia-display.h b/plug-ins/python/pydia-display.h index 807fa3d4989bf7c89a6ad8b957ef26f52b872040..4d9781b89abda67339adf7982410742cd6002306 100644 --- a/plug-ins/python/pydia-display.h +++ b/plug-ins/python/pydia-display.h @@ -26,12 +26,12 @@ typedef struct { PyObject_HEAD - DDisplay *disp; + DiaDisplay *disp; } PyDiaDisplay; extern PyTypeObject PyDiaDisplay_Type; -PyObject *PyDiaDisplay_New(DDisplay *disp); +PyObject *PyDiaDisplay_New(DiaDisplay *disp); #endif diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c index 7e04b733c8b46d16f553198eee8d1ffd429d180e..78a8ec06e0ae692edc06eea0730b6c1a40d40ded 100644 --- a/plug-ins/python/pydia-render.c +++ b/plug-ins/python/pydia-render.c @@ -539,7 +539,7 @@ draw_object (DiaRenderer *renderer, DiaObject *object, DiaMatrix *matrix) static void draw_line(DiaRenderer *renderer, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -582,7 +582,7 @@ draw_line(DiaRenderer *renderer, static void draw_polyline(DiaRenderer *renderer, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -621,7 +621,7 @@ draw_polyline(DiaRenderer *renderer, static void draw_polygon(DiaRenderer *renderer, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -660,7 +660,7 @@ draw_polygon(DiaRenderer *renderer, static void draw_rect(DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -702,7 +702,7 @@ draw_rect(DiaRenderer *renderer, static void draw_rounded_rect(DiaRenderer *renderer, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -747,7 +747,7 @@ draw_arc(DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -793,7 +793,7 @@ fill_arc(DiaRenderer *renderer, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -838,7 +838,7 @@ static void draw_ellipse(DiaRenderer *renderer, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -883,7 +883,7 @@ static void draw_bezier(DiaRenderer *renderer, BezPoint *points, int num_points, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -916,7 +916,7 @@ static void fill_bezier(DiaRenderer *renderer, BezPoint *points, /* Last point must be same as first point */ int num_points, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -952,8 +952,8 @@ static void draw_beziergon (DiaRenderer *renderer, BezPoint *points, int num_points, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); @@ -1007,7 +1007,7 @@ static void draw_string(DiaRenderer *renderer, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer); diff --git a/plug-ins/python/pydia-sheet.c b/plug-ins/python/pydia-sheet.c index 91f3414a2384ff1afdcdcd143ef6a65b009aae6a..ef877ecc8537bd4082ee31a4e926620d767b6f15 100644 --- a/plug-ins/python/pydia-sheet.c +++ b/plug-ins/python/pydia-sheet.c @@ -25,7 +25,7 @@ #include /* PyMemberDef */ PyObject * -PyDiaSheet_New(Sheet *sheet) +PyDiaSheet_New(DiaSheet *sheet) { PyDiaSheet *self; diff --git a/plug-ins/python/pydia-sheet.h b/plug-ins/python/pydia-sheet.h index 84addc762d8605310b17a08e004724e75d2923b0..5b811605cc617395f0cfacd5bea6c09a293d3a8c 100644 --- a/plug-ins/python/pydia-sheet.h +++ b/plug-ins/python/pydia-sheet.h @@ -6,7 +6,7 @@ typedef struct { PyObject_HEAD - Sheet *sheet; + DiaSheet *sheet; } PyDiaSheet; extern PyTypeObject PyDiaSheet_Type; diff --git a/plug-ins/python/pydia-text.h b/plug-ins/python/pydia-text.h index 29e0141977cd207a913812871a098fb984c8866c..f54e3c50f15cb4b1a8b95e70c2926bd914a396e9 100644 --- a/plug-ins/python/pydia-text.h +++ b/plug-ins/python/pydia-text.h @@ -2,7 +2,6 @@ #define PYDIA_TEXT_H #include -#include "color.h" typedef struct { PyObject_HEAD diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c index e99ae053e48a3d0c177d4154ded38fc990afad7e..bdbb0ca88d5fc9f4a64fd156e1023592aa1be596 100644 --- a/plug-ins/shape/shape-export.c +++ b/plug-ins/shape/shape-export.c @@ -99,27 +99,27 @@ static void end_render(DiaRenderer *self); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour); + GdkRGBA *line_colour); static void draw_object(DiaRenderer *self, DiaObject *object, DiaMatrix *matrix); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour); + GdkRGBA *line_colour); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding); + GdkRGBA *fill, GdkRGBA *stroke, real rounding); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); /* helper functions */ static void add_connection_point(ShapeRenderer *renderer, @@ -372,7 +372,7 @@ add_connection_point (ShapeRenderer *renderer, static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { Point center; ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -398,7 +398,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -439,7 +439,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; @@ -526,7 +526,7 @@ add_rectangle_connection_points (ShapeRenderer *renderer, static void draw_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -545,7 +545,7 @@ draw_rect (DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real rounding) + GdkRGBA *fill, GdkRGBA *stroke, real rounding) { ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -590,7 +590,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { ShapeRenderer *renderer = SHAPE_RENDERER(self); @@ -626,11 +626,7 @@ export_shape(DiagramData *data, DiaContext *ctx, point = g_strndup(filename, i); png_filename = g_strdup_printf("%s.png",point); g_free(point); - /* we are especially requesting the libart/png cause it is the only one with the size-hack */ - exportfilter = filter_export_get_by_name ("png-libart"); - /* ... but the code below does not use the size-hack anymore ... */ - if (!exportfilter) - exportfilter = filter_guess_export_filter(png_filename); + exportfilter = filter_guess_export_filter(png_filename); if (!exportfilter) { dia_context_add_message(ctx, _("Can't export PNG icon without export plugin!")); diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c index 1af057a652deec483d7e6a5fdc034bad73f2557c..f73303179cb8fbcc7a4020efe0922b96487f4c4e 100644 --- a/plug-ins/svg/render_svg.c +++ b/plug-ins/svg/render_svg.c @@ -109,9 +109,9 @@ static void draw_object (DiaRenderer *renderer, static void draw_string (DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour); + GdkRGBA *colour); static void draw_text_line (DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour); + Point *pos, Alignment alignment, GdkRGBA *colour); static void draw_text (DiaRenderer *self, Text *text); static void draw_rotated_text (DiaRenderer *self, Text *text, Point *center, real angle); static void draw_rotated_image (DiaRenderer *self, Point *point, @@ -396,7 +396,7 @@ node_set_text_style (xmlNodePtr node, const DiaFont *font, real font_height, Alignment alignment, - Color *colour) + GdkRGBA *colour) { real saved_width; gchar d_buf[G_ASCII_DTOSTR_BUF_SIZE]; @@ -477,7 +477,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; @@ -500,7 +500,7 @@ draw_string(DiaRenderer *self, */ static void draw_text_line(DiaRenderer *self, TextLine *text_line, - Point *pos, Alignment alignment, Color *colour) + Point *pos, Alignment alignment, GdkRGBA *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; diff --git a/plug-ins/svg/svg-import.c b/plug-ins/svg/svg-import.c index 0d1ac0eebacc704be76f473e644c6ffd9e13a5b6..63cedcbdb89da10f798c14aa7191dc3144c666ae 100644 --- a/plug-ins/svg/svg-import.c +++ b/plug-ins/svg/svg-import.c @@ -62,10 +62,10 @@ static gboolean import_svg (xmlDocPtr doc, DiagramData *dia, DiaContext *ctx, vo static GPtrArray *make_element_props(real xpos, real ypos, real width, real height); /* TODO: use existing implementation in dia source */ -static Color +static GdkRGBA get_colour(gint32 c, real opacity) { - Color colour; + GdkRGBA colour; colour.red = ((c & 0xff0000) >> 16) / 255.0; colour.green = ((c & 0x00ff00) >> 8) / 255.0; colour.blue = (c & 0x0000ff) / 255.0; @@ -1317,7 +1317,7 @@ read_gradient (xmlNodePtr node, DiaSvgStyle *parent_gs, GHashTable *pattern_ht, while (child) { if (xmlStrcmp(child->name, (const xmlChar *)"stop")==0) { DiaSvgStyle gs; - Color color; + GdkRGBA color; real offset = 0.0; dia_svg_style_init (&gs, &gradient_gs); diff --git a/plug-ins/vdx/vdx-common.c b/plug-ins/vdx/vdx-common.c index 5a6f52efaa8535444bed1519b2c50a3639aebed0..8f8fad592d8221fc84c149f074b642e88a7e4a56 100644 --- a/plug-ins/vdx/vdx-common.c +++ b/plug-ins/vdx/vdx-common.c @@ -21,7 +21,6 @@ #include #include -#include "color.h" #include diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c index c173ed8ea86d1ebb53767c718b3419f6c775e32d..2f80bc5ac7835e1758d43117acf869009aac7a08 100644 --- a/plug-ins/vdx/vdx-export.c +++ b/plug-ins/vdx/vdx-export.c @@ -104,7 +104,7 @@ static gboolean export_vdx(DiagramData *data, DiaContext *ctx, void* user_data); static int -vdxCheckColor(VDXRenderer *renderer, Color *color); +vdxCheckColor(VDXRenderer *renderer, GdkRGBA *color); static gpointer parent_class = NULL; @@ -159,7 +159,7 @@ static void begin_render(DiaRenderer *self, const Rectangle *update) { VDXRenderer *renderer = VDX_RENDERER(self); - Color c; + GdkRGBA c; renderer->depth = 0; @@ -174,7 +174,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) /* Specific to VDX */ - renderer->Colors = g_array_new(FALSE, TRUE, sizeof (Color)); + renderer->Colors = g_array_new(FALSE, TRUE, sizeof (GdkRGBA)); renderer->Fonts = g_array_new(FALSE, TRUE, sizeof (char *)); /* Visio does not like */ renderer->shapeid = 1; @@ -314,15 +314,15 @@ set_font(DiaRenderer *self, DiaFont *font, real height) */ static int -vdxCheckColor(VDXRenderer *renderer, Color *color) +vdxCheckColor(VDXRenderer *renderer, GdkRGBA *color) { int i; - Color cmp_color; + GdkRGBA cmp_color; for (i = 0; i < renderer->Colors->len; i++) { - cmp_color = g_array_index(renderer->Colors, Color, i); - if (color_equals(color, &cmp_color)) return i; + cmp_color = g_array_index(renderer->Colors, GdkRGBA, i); + if (gdk_rgba_equal(color, &cmp_color)) return i; } /* Grow table */ g_array_append_val(renderer->Colors, *color); @@ -361,7 +361,7 @@ vdxCheckFont(VDXRenderer *renderer) * @todo join, caps, dashlength */ static void -create_Line(VDXRenderer *renderer, Color *color, struct vdx_Line *Line, +create_Line(VDXRenderer *renderer, GdkRGBA *color, struct vdx_Line *Line, Arrow *start_arrow, Arrow *end_arrow) { /* A Line (colour etc) */ @@ -406,7 +406,7 @@ create_Line(VDXRenderer *renderer, Color *color, struct vdx_Line *Line, */ static void -create_Fill(VDXRenderer *renderer, Color *color, struct vdx_Fill *Fill) +create_Fill(VDXRenderer *renderer, GdkRGBA *color, struct vdx_Fill *Fill) { /* A Fill (colour etc) */ memset(Fill, 0, sizeof(*Fill)); @@ -425,7 +425,7 @@ create_Fill(VDXRenderer *renderer, Color *color, struct vdx_Fill *Fill) */ static void -draw_line(DiaRenderer *self, Point *start, Point *end, Color *color) +draw_line(DiaRenderer *self, Point *start, Point *end, GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a, b; @@ -526,7 +526,7 @@ draw_line(DiaRenderer *self, Point *start, Point *end, Color *color) */ static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a, b; @@ -632,7 +632,7 @@ static void draw_polyline(DiaRenderer *self, Point *points, int num_points, static void _polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { VDXRenderer *renderer = VDX_RENDERER(self); @@ -759,7 +759,7 @@ _polygon (DiaRenderer *self, static void draw_polygon (DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { _polygon (self, points, num_points, fill, stroke, 0.0); } @@ -767,7 +767,7 @@ draw_polygon (DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, + GdkRGBA *fill, GdkRGBA *stroke, real radius) { Point points[4]; /* close path done by _polygon() */ @@ -795,7 +795,7 @@ static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -932,7 +932,7 @@ fill_arc (DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1083,7 +1083,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1184,7 +1184,7 @@ draw_ellipse (DiaRenderer *self, static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { VDXRenderer *renderer = VDX_RENDERER(self); Point a; @@ -1410,7 +1410,7 @@ static void draw_image(DiaRenderer *self, */ const char * -vdx_string_color(const Color c) +vdx_string_color(const GdkRGBA c) { static char buf[8]; sprintf(buf, "#%.2X%.2X%.2X", @@ -1474,7 +1474,7 @@ static void write_header(DiagramData *data, VDXRenderer *renderer) { FILE *file = renderer->file; - Color c; + GdkRGBA c; const char *f; unsigned int i; struct vdx_StyleSheet StyleSheet; @@ -1485,7 +1485,7 @@ write_header(DiagramData *data, VDXRenderer *renderer) struct vdx_Char Char; struct vdx_Para Para; struct vdx_Tabs Tabs; - static Color color_black = { 0.0, 0.0, 0.0, 1.0 }; + static GdkRGBA color_black = { 0.0, 0.0, 0.0, 1.0 }; g_debug("write_header"); @@ -1520,7 +1520,7 @@ write_header(DiagramData *data, VDXRenderer *renderer) fprintf(file, " \n"); for (i = 0; i < renderer->Colors->len; i++) { - c = g_array_index(renderer->Colors, Color, i); + c = g_array_index(renderer->Colors, GdkRGBA, i); fprintf(file, " \n", i, vdx_string_color(c)); } diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c index 9b5d1d59e0f84f62422cc62cec5531b803a667a2..cc7ff36b8f8e5d05f9996b71a5ad21cb6cabae26 100644 --- a/plug-ins/vdx/vdx-import.c +++ b/plug-ins/vdx/vdx-import.c @@ -193,11 +193,11 @@ static PropDescription vdx_text_descs[] = { * @param ctx the context for error/warning messages * @return A Dia Color object */ -Color +GdkRGBA vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx) { int colorvalues; - Color c = {0, 0, 0, 0}; + GdkRGBA c = {0, 0, 0, 0}; if (s[0] == '#') { sscanf(s, "#%xd", &colorvalues); @@ -214,7 +214,7 @@ vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx) /* Look in colour table */ unsigned int i = atoi(s); if (theDoc->Colors && i < theDoc->Colors->len) - return g_array_index(theDoc->Colors, Color, i); + return g_array_index(theDoc->Colors, GdkRGBA, i); } /* Colour 0 is always black, so don't warn (OmniGraffle) */ if (*s != '0') @@ -234,11 +234,11 @@ static void vdx_get_colors(xmlNodePtr cur, VDXDocument* theDoc, DiaContext *ctx) { xmlNodePtr ColorEntry; - theDoc->Colors = g_array_new(FALSE, TRUE, sizeof (Color)); + theDoc->Colors = g_array_new(FALSE, TRUE, sizeof (GdkRGBA)); for (ColorEntry = cur->xmlChildrenNode; ColorEntry; ColorEntry = ColorEntry->next) { - Color color; + GdkRGBA color; struct vdx_ColorEntry temp_ColorEntry; if (xmlIsBlankNode(ColorEntry)) { continue; } @@ -251,7 +251,7 @@ vdx_get_colors(xmlNodePtr cur, VDXDocument* theDoc, DiaContext *ctx) theDoc->Colors = g_array_set_size(theDoc->Colors, temp_ColorEntry.IX+1); } - g_array_index(theDoc->Colors, Color, temp_ColorEntry.IX) = color; + g_array_index(theDoc->Colors, GdkRGBA, temp_ColorEntry.IX) = color; g_array_append_val(theDoc->Colors, color); } } @@ -613,7 +613,7 @@ vdx_simple_properties(DiaObject *obj, if (Line) { - Color color; + GdkRGBA color; prop_list_add_line_width (props,Line->LineWeight * vdx_Line_Scale); @@ -654,7 +654,7 @@ vdx_simple_properties(DiaObject *obj, if (Fill && Fill->FillPattern) { - Color color; + GdkRGBA color; /* Dia can't do fill patterns, so we have to choose either the foreground or background colour. diff --git a/plug-ins/vdx/vdx.h b/plug-ins/vdx/vdx.h index ca223c1c605a9076082f784fe07e8bc8508b8f86..7eefc1a0dabfa0e6e1c17fccc142d31a57b9b45a 100644 --- a/plug-ins/vdx/vdx.h +++ b/plug-ins/vdx/vdx.h @@ -24,6 +24,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include + #ifndef VISIO_H #define VISIO_H @@ -77,11 +79,11 @@ static const ArrowType vdx_Arrows[] = { ARROW_NONE, #define VDX_NAMEU_LEN 30 #define DEG_TO_RAD M_PI/180.0 /* Degrees to radians */ -Color +GdkRGBA vdx_parse_color(const char *s, const VDXDocument *theDoc, DiaContext *ctx); const char * -vdx_string_color(const Color c); +vdx_string_color(const GdkRGBA c); void * vdx_read_object(xmlNodePtr cur, VDXDocument *theDoc, void *p, DiaContext *ctx); diff --git a/plug-ins/vdx/visio-types.h b/plug-ins/vdx/visio-types.h index 4d9111f0bb288773ac51407bbb93c1a9384f6b5e..47caeda7008521f41764a57576a3ffca644a4e34 100644 --- a/plug-ins/vdx/visio-types.h +++ b/plug-ins/vdx/visio-types.h @@ -22,6 +22,7 @@ /* Generated Wed Jan 24 17:00:55 2007 */ /* From: All.vdx animation_tests.vdx Arrows-2.vdx Arrow & Text samples.vdx BasicShapes.vdx basic_tests.vdx Beispiel 1.vdx Beispiel 2.vdx Beispiel 3.vdx cable loom EL axis.vdx Circle1.vdx Circle2.vdx circle with angles.vdx curve_tests.vdx Drawing2.vdx Electrical system SatMax.vdx Embedded-Pics-1.vdx emf_dump_test2.orig.vdx emf_dump_test2.vdx Entreprise_etat_desire.vdx IMU-DD Ver2.vdx ISAD_page1.vdx ISAD_page2.vdx Line1.vdx Line2.vdx Line3.vdx Line4.vdx Line5.vdx Line6.vdx LombardiWireframe.vdx London-Citibank-Network-detail-02-15-2006.vdx London-Citibank-Network Detail-11-07-2005.vdx London-Citibank-racks-11-04-2005.vdx London-colo-move.vdx London-Colo-Network-detail-11-01-2005.vdx London-Colo-Racks-11-03-2005.vdx Network DiagramV2.vdx pattern_tests.vdx Processflow.vdx Rectangle1.vdx Rectangle2.vdx Rectangle3.vdx Rectangle4.vdx render-test.vdx sample1.vdx Sample2.vdx samp_vdx.vdx Satmax RF path.vdx seq_test.vdx Servo block diagram V2.vdx Servo block diagram V3.vdx Servo block diagram.vdx Sigma-function.vdx SmithWireframe.vdx states.vdx Text1.vdx Text2.vdx Text3.vdx text_tests.vdx Tracking Array - Level.vdx Tracking Array - Phase.vdx Wayzata-WAN-Detail.vdx Wayzata-WAN-Overview.vdx WDS Cabling.vdx */ +#include struct vdx_any { @@ -75,7 +76,7 @@ struct vdx_Char struct vdx_any any; unsigned int AsianFont; /* F=Inh */ gboolean Case; /* F=0,Inh =0 */ - Color Color; /* F=0,0,0,19))",0,1,16))",1,14,15,2,4,GUARD(IF(Sheet.5!User.active,0,19)),HSL(0,0 */ + GdkRGBA Color; /* F=0,0,0,19))",0,1,16))",1,14,15,2,4,GUARD(IF(Sheet.5!User.active,0,19)),HSL(0,0 */ float ColorTrans; /* F=0%,Inh,No Formula */ unsigned int ComplexScriptFont; /* F=Inh */ float ComplexScriptSize; /* F=Inh Unit=DT */ @@ -335,9 +336,9 @@ struct vdx_Field struct vdx_Fill { struct vdx_any any; - Color FillBkgnd; /* F=0,1,14,15,18,2,8,HSL(0,0,128),HSL(0,0,181),HSL(0,0,210),HSL(0,0,240),HSL(0,0, */ + GdkRGBA FillBkgnd; /* F=0,1,14,15,18,2,8,HSL(0,0,128),HSL(0,0,181),HSL(0,0,210),HSL(0,0,240),HSL(0,0, */ float FillBkgndTrans; /* F=0%,Inh,No Formula */ - Color FillForegnd; /* F=0,0,0,20)",0,1,17)",0,10,19))",1,10,11,12,13,14,15,17,18,19,2,20,21,23,3,4,5, */ + GdkRGBA FillForegnd; /* F=0,0,0,20)",0,1,17)",0,10,19))",1,10,11,12,13,14,15,17,18,19,2,20,21,23,3,4,5, */ float FillForegndTrans; /* F=0%,Inh,No Formula */ unsigned int FillPattern; /* F=0,1,31,GUARD(0),GUARD(1),Guard(0),Inh */ float ShapeShdwObliqueAngle; /* F=Inh */ @@ -347,7 +348,7 @@ struct vdx_Fill gboolean ShapeShdwType; /* F=Inh =0,1 */ unsigned int ShdwBkgnd; /* F=1,GUARD(0),Inh */ float ShdwBkgndTrans; /* F=0%,Inh,No Formula */ - Color ShdwForegnd; /* F=0,15,8,GUARD(0),HSL(0,0,205),HSL(0,0,206),HSL(0,0,208),HSL(0,0,210),HSL(0,0,2 */ + GdkRGBA ShdwForegnd; /* F=0,15,8,GUARD(0),HSL(0,0,205),HSL(0,0,206),HSL(0,0,208),HSL(0,0,210),HSL(0,0,2 */ float ShdwForegndTrans; /* F=0%,Inh,No Formula */ unsigned int ShdwPattern; /* F=0,0),1,0)',GUARD(0),Guard(0),Inh */ }; @@ -561,7 +562,7 @@ struct vdx_Line unsigned int EndArrow; /* F=0,3,41,4)))',4,GUARD(0),Inh =0,1,10,11,12,13,14,15,16,4,5,9 */ unsigned int EndArrowSize; /* F=1,2,IF(User.UMLError,0,2),Inh =0,1,2,3,4 */ gboolean LineCap; /* F=0,1,Inh =0,1 */ - Color LineColor; /* F=0,1,14,15,2,3,4,GUARD(Sheet.5!FillForegnd),HSL(0,0,0),HSL(0,0,240),HSL(0,0,60 */ + GdkRGBA LineColor; /* F=0,1,14,15,2,3,4,GUARD(Sheet.5!FillForegnd),HSL(0,0,0),HSL(0,0,240),HSL(0,0,60 */ float LineColorTrans; /* F=0%,Inh,No Formula */ unsigned int LinePattern; /* F=0,1,1,0,1)',2,23,3,4,3,1)))',9,GUARD(1),Inh,Sheet.8!LinePattern */ float LineWeight; /* F=0.0033333333333333DT,0.01DT,0.03DT,0.12PT,0.24PT,0.254MM,0.5MM,0PT,GUARD(0.24 Unit=IN,MM,PT */ diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp index 9b7866a1988dcc65a2affbb394bfd784f934bd8b..4a29ac0a32d1be1ad3c3c5c06fb720333b7e1d32 100644 --- a/plug-ins/wmf/wmf.cpp +++ b/plug-ins/wmf/wmf.cpp @@ -158,7 +158,7 @@ G_END_DECLS * helper functions */ static W32::HPEN -UsePen(WmfRenderer* renderer, Color* colour) +UsePen(WmfRenderer* renderer, GdkRGBA* colour) { W32::HPEN hOldPen; if (colour) { @@ -601,7 +601,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -621,7 +621,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -651,7 +651,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -695,7 +695,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); @@ -732,7 +732,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -771,7 +771,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -816,7 +816,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WmfRenderer *renderer = WMF_RENDERER (self); W32::HPEN hPen; @@ -853,7 +853,7 @@ static void _bezier (DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour, + GdkRGBA *colour, gboolean fill, gboolean closed) { @@ -913,7 +913,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { #ifndef DIRECT_WMF _bezier(self, points, numpoints, colour, FALSE, FALSE); @@ -977,8 +977,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { if (fill) _bezier(self, points, numpoints, fill, TRUE, TRUE); @@ -991,7 +991,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { WmfRenderer *renderer = WMF_RENDERER (self); int len; @@ -1165,7 +1165,7 @@ draw_image(DiaRenderer *self, static void draw_rounded_rect (DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke, real radius) + GdkRGBA *fill, GdkRGBA *stroke, real radius) { WmfRenderer *renderer = WMF_RENDERER (self); diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c index 2e5b4ec3ba61ec7746ecca1fec14a820e71e057d..0424f5a9ff83194a9db0d92c4b98a7d7884bddea 100644 --- a/plug-ins/wpg/wpg-import.c +++ b/plug-ins/wpg/wpg-import.c @@ -54,9 +54,9 @@ struct _WpgImportRenderer { WPGLineAttr LineAttr; WPGColorRGB* pPal; - Color stroke; - Color fill; - Color text_color; + GdkRGBA stroke; + GdkRGBA fill; + GdkRGBA text_color; Alignment text_align; }; diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c index 47ef0b5b2255f65a00d611fb8001026b1d124e65..c9175286ee8e1f242f26360e072eb95d87994ef4 100644 --- a/plug-ins/wpg/wpg.c +++ b/plug-ins/wpg/wpg.c @@ -161,7 +161,7 @@ fwrite_le(void* buf, size_t size, size_t count, FILE* f) * helper functions */ static guint8 -LookupColor(WpgRenderer *renderer, Color* colour) +LookupColor(WpgRenderer *renderer, GdkRGBA* colour) { /* find nearest color in the renderers color map */ /* the following hack does only work with a correctly @@ -211,7 +211,7 @@ WriteRecHead(WpgRenderer *renderer, WPG_Type Type, guint32 Size) } static void -WriteLineAttr(WpgRenderer *renderer, Color* colour) +WriteLineAttr(WpgRenderer *renderer, GdkRGBA* colour) { g_assert(4 == sizeof(WPGLineAttr)); @@ -222,7 +222,7 @@ WriteLineAttr(WpgRenderer *renderer, Color* colour) } static void -WriteFillAttr(WpgRenderer *renderer, Color* colour, gboolean bFill) +WriteFillAttr(WpgRenderer *renderer, GdkRGBA* colour, gboolean bFill) { g_assert(2 == sizeof(WPGFillAttr)); @@ -270,7 +270,7 @@ begin_render(DiaRenderer *self, const Rectangle *update) gint16 i; guint8* pPal; - Color color = { 1.0, 1.0, 1.0, 1.0 }; + GdkRGBA color = { 1.0, 1.0, 1.0, 1.0 }; DIAG_NOTE(g_message("begin_render")); @@ -450,7 +450,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *line_colour) + GdkRGBA *line_colour) { WpgRenderer *renderer = WPG_RENDERER (self); gint16 pData[4]; @@ -473,7 +473,7 @@ draw_line(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *line_colour) + GdkRGBA *line_colour) { WpgRenderer *renderer = WPG_RENDERER (self); int i; @@ -508,7 +508,7 @@ draw_polyline(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); gint16* pData; @@ -553,7 +553,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); gint16* pData; @@ -592,7 +592,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -632,7 +632,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -672,7 +672,7 @@ static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { WpgRenderer *renderer = WPG_RENDERER (self); WPGEllipse ell; @@ -706,7 +706,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); WPGPoint* pts; @@ -769,8 +769,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { DIAG_NOTE(g_message("draw_beziezgon %d points", numpoints)); @@ -797,7 +797,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour) + GdkRGBA *colour) { WpgRenderer *renderer = WPG_RENDERER (self); gint16 len; diff --git a/plug-ins/xfig/xfig-common.c b/plug-ins/xfig/xfig-common.c index 9ba855a8b6555bbbe58a07e65c5ba182406ad545..1ca479b308684a18ee9e9d20ff96865f798bd643 100644 --- a/plug-ins/xfig/xfig-common.c +++ b/plug-ins/xfig/xfig-common.c @@ -16,11 +16,9 @@ #include #include -#include "color.h" - #include "xfig.h" -Color fig_default_colors[FIG_MAX_DEFAULT_COLORS] = +GdkRGBA fig_default_colors[FIG_MAX_DEFAULT_COLORS] = { { 0x00, 0x00, 0x00, 0xff }, { 0x00, 0x00, 0xff, 0xff }, { 0x00, 0xff, 0x00, 0xff }, { 0x00, 0xff, 0xff, 0xff }, { 0xff, 0x00, 0x00, 0xff }, { 0xff, 0x00, 0xff, 0xff }, { 0xff, 0xff, 0x00, 0xff }, { 0xff, 0xff, 0xff, 0xff }, { 0x00, 0x00, 0x8f, 0xff }, { 0x00, 0x00, 0xb0, 0xff }, { 0x00, 0x00, 0xd1, 0xff }, { 0x87, 0xcf, 0xff, 0xff }, diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c index 4ea32ba2a738c384d896b80644bcf5f234a1a6c1..d85d30caa09a3fbf03ce046c30e5919594a61505 100644 --- a/plug-ins/xfig/xfig-export.c +++ b/plug-ins/xfig/xfig-export.c @@ -91,7 +91,7 @@ struct _XfigRenderer real fontheight; gboolean color_pass; - Color user_colors[512]; + GdkRGBA user_colors[512]; int max_user_color; gchar *warnings[MAX_WARNING]; @@ -113,70 +113,70 @@ static void set_fillstyle(DiaRenderer *self, FillStyle mode); static void set_font(DiaRenderer *self, DiaFont *font, real height); static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color); + GdkRGBA *color); static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color); + GdkRGBA *color); static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow); static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour); + GdkRGBA *colour); static void draw_arc_with_arrows(DiaRenderer *self, Point *startpoint, Point *endpoint, Point *midpoint, real line_width, - Color *colour, + GdkRGBA *colour, Arrow *start_arrow, Arrow *end_arrow); static void fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *colour); + GdkRGBA *colour); static void draw_ellipse(DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke); + GdkRGBA *fill, GdkRGBA *stroke); static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *colour); + GdkRGBA *colour); static void draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int numpoints, real line_width, - Color *colour, + GdkRGBA *colour, Arrow *start_arrow, Arrow *end_arrow); static void draw_beziergon(DiaRenderer *self, BezPoint *points, /* Last point must be same as first point */ int numpoints, - Color *fill, - Color *stroke); + GdkRGBA *fill, + GdkRGBA *stroke); static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *colour); + GdkRGBA *colour); static void draw_image(DiaRenderer *self, Point *point, real width, real height, @@ -312,15 +312,15 @@ figLineWidth(XfigRenderer *renderer) The color pseudo object even must be placed first in the xfig file. */ static void -figCheckColor(XfigRenderer *renderer, Color *color) +figCheckColor(XfigRenderer *renderer, GdkRGBA *color) { int i; for (i = 0; i < FIG_MAX_DEFAULT_COLORS; i++) { - if (color_equals(color, &fig_default_colors[i])) return; + if (gdk_rgba_equal(color, &fig_default_colors[i])) return; } for (i = 0; i < renderer->max_user_color; i++) { - if (color_equals(color, &renderer->user_colors[i])) return; + if (gdk_rgba_equal(color, &renderer->user_colors[i])) return; } if (renderer->max_user_color == FIG_MAX_USER_COLORS) { figWarn(renderer, WARNING_OUT_OF_COLORS); @@ -334,16 +334,16 @@ figCheckColor(XfigRenderer *renderer, Color *color) } static int -figColor(XfigRenderer *renderer, Color *color) +figColor(XfigRenderer *renderer, GdkRGBA *color) { int i; for (i = 0; i < FIG_MAX_DEFAULT_COLORS; i++) { - if (color_equals(color, &fig_default_colors[i])) + if (gdk_rgba_equal(color, &fig_default_colors[i])) return i; } for (i = 0; i < renderer->max_user_color; i++) { - if (color_equals(color, &renderer->user_colors[i])) + if (gdk_rgba_equal(color, &renderer->user_colors[i])) return i + FIG_MAX_DEFAULT_COLORS; } return 0; @@ -564,7 +564,7 @@ set_font(DiaRenderer *self, DiaFont *font, real height) static void draw_line(DiaRenderer *self, Point *start, Point *end, - Color *color) + GdkRGBA *color) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -588,7 +588,7 @@ static void draw_line_with_arrows(DiaRenderer *self, Point *start, Point *end, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -622,7 +622,7 @@ draw_line_with_arrows(DiaRenderer *self, static void draw_polyline(DiaRenderer *self, Point *points, int num_points, - Color *color) + GdkRGBA *color) { int i; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -651,7 +651,7 @@ static void draw_polyline_with_arrows(DiaRenderer *self, Point *points, int num_points, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -689,7 +689,7 @@ draw_polyline_with_arrows(DiaRenderer *self, static void draw_polygon(DiaRenderer *self, Point *points, int num_points, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { int i; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -723,7 +723,7 @@ draw_polygon(DiaRenderer *self, static void draw_rect(DiaRenderer *self, Point *ul_corner, Point *lr_corner, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -756,7 +756,7 @@ draw_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { Point first, second, last; int direction = angle2 > angle1 ? 1 : 0; /* Dia not always gives counterclockwise */ @@ -822,7 +822,7 @@ draw_arc_with_arrows(DiaRenderer *self, Point *endpoint, Point *midpoint, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -875,7 +875,7 @@ fill_arc(DiaRenderer *self, Point *center, real width, real height, real angle1, real angle2, - Color *color) + GdkRGBA *color) { Point first, second, last; XfigRenderer *renderer = XFIG_RENDERER(self); @@ -923,7 +923,7 @@ static void draw_ellipse (DiaRenderer *self, Point *center, real width, real height, - Color *fill, Color *stroke) + GdkRGBA *fill, GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); gchar d_buf[DTOSTR_BUF_SIZE]; @@ -952,7 +952,7 @@ static void draw_bezier(DiaRenderer *self, BezPoint *points, int numpoints, - Color *color) + GdkRGBA *color) { XfigRenderer *renderer = XFIG_RENDERER(self); @@ -969,7 +969,7 @@ draw_bezier_with_arrows(DiaRenderer *self, BezPoint *points, int numpoints, real line_width, - Color *color, + GdkRGBA *color, Arrow *start_arrow, Arrow *end_arrow) { @@ -987,8 +987,8 @@ static void draw_beziergon (DiaRenderer *self, BezPoint *points, int numpoints, - Color *fill, - Color *stroke) + GdkRGBA *fill, + GdkRGBA *stroke) { XfigRenderer *renderer = XFIG_RENDERER(self); @@ -1007,7 +1007,7 @@ static void draw_string(DiaRenderer *self, const char *text, Point *pos, Alignment alignment, - Color *color) + GdkRGBA *color) { guchar *figtext = NULL; XfigRenderer *renderer = XFIG_RENDERER(self); diff --git a/plug-ins/xfig/xfig-import.c b/plug-ins/xfig/xfig-import.c index 2798167fec9d0b6ced07afeb5407375f56238325..77446e2f964e4ca78bd6f5b3890b98c09fdcccb5 100644 --- a/plug-ins/xfig/xfig-import.c +++ b/plug-ins/xfig/xfig-import.c @@ -49,13 +49,13 @@ #include "properties.h" #include "propinternals.h" #include "group.h" - +#include "attributes.h" #include "create.h" #include "xfig.h" #define BUFLEN 512 -static Color fig_colors[FIG_MAX_USER_COLORS]; +static GdkRGBA fig_colors[FIG_MAX_USER_COLORS]; /** Eats the rest of the line. */ @@ -95,7 +95,7 @@ skip_comments(FILE *file) { return FALSE; } -static Color +static GdkRGBA fig_color(int color_index, DiaContext *ctx) { if (color_index <= -1) @@ -112,10 +112,10 @@ fig_color(int color_index, DiaContext *ctx) } } -static Color +static GdkRGBA fig_area_fill_color(int area_fill, int color_index, DiaContext *ctx) { - Color col; + GdkRGBA col; col = fig_color(color_index, ctx); if (area_fill == -1) return col; if (area_fill >= 0 && area_fill <= 20) { @@ -1056,7 +1056,7 @@ fig_read_object(FILE *file, DiaContext *ctx) case 0: { /* Color pseudo-object. */ int colornumber; int colorvalues; - Color color; + GdkRGBA color; if (fscanf(file, " %d #%xd", &colornumber, &colorvalues) != 2) { dia_context_add_message_with_errno(ctx, errno, _("Couldn't read color\n")); diff --git a/plug-ins/xfig/xfig.h b/plug-ins/xfig/xfig.h index 9fb96226e1deb86837e8996e764fb9a534e8500d..5b6a0bd2f5c2e1ce008ec23e8feda06f1d805320 100644 --- a/plug-ins/xfig/xfig.h +++ b/plug-ins/xfig/xfig.h @@ -1,7 +1,9 @@ +#include + #ifndef XFIG_H #define XFIG_H -extern Color fig_default_colors[]; +extern GdkRGBA fig_default_colors[]; extern char *fig_fonts[]; int num_fig_fonts (void); diff --git a/plug-ins/xslt/xsltdialog.c b/plug-ins/xslt/xsltdialog.c index 3b03f30512014e0f637a13d8dea6098e68d0daa4..d55bea34bb43bd046e0457f1e966ea83116c0779 100644 --- a/plug-ins/xslt/xsltdialog.c +++ b/plug-ins/xslt/xsltdialog.c @@ -26,7 +26,6 @@ * Opens a dialog for export options */ -#undef GTK_DISABLE_DEPRECATED /* GTK_OPTION_MENU, ... */ #include "xslt.h" #include @@ -40,19 +39,18 @@ from_deactivate(fromxsl_t *xsls); static void from_activate(GtkWidget *widget, fromxsl_t *xsls) { - toxsl_t *to_f = xsls->xsls; + toxsl_t *to_f; + + while(xsls != NULL && xsls->name != gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget))) { + xsls = xsls->next; + } + + to_f = xsls->xsls; from_deactivate(xsl_from); xsl_from = xsls; xsl_to = to_f; - - gtk_menu_item_activate(GTK_MENU_ITEM(to_f->item)); - while(to_f != NULL) - { - gtk_widget_set_sensitive(to_f->item, 1); - to_f = to_f->next; - } } static void @@ -71,6 +69,9 @@ from_deactivate(fromxsl_t *xsls) static void to_update(GtkWidget *widget, toxsl_t *lng) { + while(lng != NULL && lng->name != gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget))) { + lng = lng->next; + } /* printf("To: %s\n", lng->name); */ xsl_to = lng; } @@ -86,7 +87,7 @@ void xslt_dialog_create(void) { GtkWidget *box, *vbox; - GtkWidget *omenu, *menu, *menuitem; + GtkWidget *omenu; GSList *group; GtkWidget *label; @@ -98,8 +99,8 @@ xslt_dialog_create(void) { dialog = gtk_dialog_new_with_buttons( _("Export through XSLT"), NULL, 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Okay"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_OK); @@ -107,30 +108,25 @@ xslt_dialog_create(void) { box = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_set_border_width (GTK_CONTAINER (box), 10); label = gtk_label_new(_("From:")); - omenu = gtk_option_menu_new (); - menu = gtk_menu_new (); + omenu = gtk_combo_box_text_new (); group = NULL; - + + g_signal_connect (G_OBJECT (omenu), "changed", + G_CALLBACK (from_activate), cur_f); + while(cur_f != NULL) { - menuitem = gtk_radio_menu_item_new_with_label (group, cur_f->name); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (from_activate), cur_f); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (omenu), cur_f->name, cur_f->name); cur_f = cur_f->next; } - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - gtk_widget_show(menu); gtk_widget_show(omenu); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); @@ -142,35 +138,29 @@ xslt_dialog_create(void) { cur_f = froms; - vbox = gtk_vbox_new(FALSE, 5); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_set_border_width (GTK_CONTAINER (box), 10); label = gtk_label_new(_("To:")); - omenu = gtk_option_menu_new (); - menu = gtk_menu_new (); + omenu = gtk_combo_box_text_new (); group = NULL; + + g_signal_connect (G_OBJECT (omenu), "changed", + G_CALLBACK (to_update), cur_to ); while(cur_f != NULL) { cur_to = cur_f->xsls; while(cur_to != NULL) { - menuitem = gtk_radio_menu_item_new_with_label (group, cur_to->name); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (to_update), cur_to ); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - gtk_menu_append (GTK_MENU (menu), menuitem); - gtk_widget_show (menuitem); - cur_to->item = menuitem; + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (omenu), cur_to->name, cur_to->name); cur_to = cur_to->next; } cur_f = cur_f->next; } - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - gtk_widget_show(menu); gtk_widget_show(omenu); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); diff --git a/po/POTFILES.in b/po/POTFILES.in index c578224b348c825d6c03433e47249337f5d9509a..0ad9e6e8b290121681904c95fc95064ddb6e00a8 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -2,10 +2,9 @@ # Please keep this file sorted alphabetically. app/app_procs.c app/autosave.c -app/color_area.c app/commands.c app/confirm.c -app/create_object.c +app/tools/create_object.c app/defaults.c app/diagram.c app/diagram_tree_model.c @@ -19,10 +18,9 @@ app/filedlg.c app/find-and-replace.c app/interface.c app/layer_dialog.c -app/linewidth_area.c app/load_save.c app/menus.c -app/modify_tool.c +app/tools/modify_tool.c app/pagesetup.c app/plugin-manager.c app/preferences.c @@ -40,16 +38,10 @@ lib/arrows.c lib/attributes.c lib/bezier_conn.c lib/create.c -lib/diaarrowchooser.c -lib/diaarrowselector.c -lib/diacolorselector.c lib/dia_dirs.c -lib/diadynamicmenu.c lib/diafontselector.c lib/diagramdata.c lib/dia_image.c -lib/dialinechooser.c -lib/dialinestyleselector.c lib/dialogs.c lib/diaoptionmenu.c lib/diapatternselector.c @@ -78,6 +70,9 @@ lib/sheet.c lib/standard-path.c lib/text.c lib/widgets.c +lib/renderer/diacairo-interactive.c +lib/renderer/diacairo-renderer.c +lib/renderer/diacairo.c objects/AADL/aadlbox.c objects/AADL/aadl.c objects/chronogram/chronogram.c @@ -162,12 +157,10 @@ objects/standard/zigzagline.c objects/UML/activity.c objects/UML/actor.c objects/UML/association.c -objects/UML/class_attributes_dialog.c objects/UML/class.c objects/UML/class_dialog.c objects/UML/classicon.c objects/UML/class_operations_dialog.c -objects/UML/class_templates_dialog.c objects/UML/component.c objects/UML/component_feature.c objects/UML/constraint.c @@ -185,15 +178,9 @@ objects/UML/small_package.c objects/UML/state.c objects/UML/state_term.c objects/UML/transition.c -objects/UML/umlattribute.c objects/UML/uml.c -objects/UML/umlformalparameter.c -objects/UML/umloperation.c -objects/UML/umlparameter.c objects/UML/usecase.c plug-ins/cairo/diacairo.c -plug-ins/cairo/diacairo-interactive.c -plug-ins/cairo/diacairo-renderer.c plug-ins/cgm/cgm.c plug-ins/drs/dia-render-script.c plug-ins/drs/dia-render-script-import.c @@ -205,10 +192,6 @@ plug-ins/dxf/dxf-export.c plug-ins/dxf/dxf-import.c plug-ins/hpgl/hpgl.c plug-ins/layout/layout.cpp -plug-ins/libart/dialibart.c -plug-ins/libart/dialibartrenderer.c -plug-ins/libart/export_png.c -plug-ins/libart/render_libart.c plug-ins/metapost/metapost.c plug-ins/metapost/render_metapost.c plug-ins/pdf/pdf.c diff --git a/tests/exports/Makefile.am b/tests/exports/Makefile.am index ce40614680087dac3efad56a59414c711d4b262d..c805fe085e7a30691c909da5e5bbc098e7255513 100644 --- a/tests/exports/Makefile.am +++ b/tests/exports/Makefile.am @@ -1,4 +1,4 @@ -EXPORT_PLUGINS=cgm dxf eps eps-builtin eps-pango fig mp plt hpgl png png-libart pixbuf-png jpg shape svg tex wpg +EXPORT_PLUGINS=cgm dxf eps eps-builtin eps-pango fig mp plt hpgl png pixbuf-png jpg shape svg tex wpg tests: mkdir /tmp/dia-tests; \ diff --git a/tests/test-objects.c b/tests/test-objects.c index 6388786af5d53847f11bd084201414949cf25035..4a21b9d3c55d031754ca1313af1a9a62307e35a8 100644 --- a/tests/test-objects.c +++ b/tests/test-objects.c @@ -1069,9 +1069,6 @@ main (int argc, char** argv) SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX); #endif -#if !GLIB_CHECK_VERSION(2,36,0) - g_type_init (); -#endif /* not using gtk_test_init() means we can only test non-gtk facilities of objects */ g_test_init (&argc, &argv, NULL);