add a file merging feature to the GUI menu
[geda-gerbv/spe.git] / src / interface.c
blobd001ba2df1363a3b337a7aa7e29ca8bfbd68b628
1 /*
2 * gEDA - GNU Electronic Design Automation
3 * This file is a part of gerbv.
5 * Copyright (C) 2000-2003 Stefan Petersen (spe@stacken.kth.se)
7 * $Id$
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.s
14 * This program is distributed in the hope that it toowill be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
24 /** \file interface.c
25 \brief GUI building functions for Gerbv
26 \ingroup gerbv
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <unistd.h>
36 #include <string.h>
37 #include <stdio.h>
38 #include <math.h>
40 #include <gdk/gdkkeysyms.h>
41 #include <gtk/gtk.h>
43 #include "gerbv.h"
44 #include "main.h"
45 #include "callbacks.h"
46 #include "interface.h"
47 #include "render.h"
49 #include "draw-gdk.h"
50 #include "draw.h"
52 #include "gerbv_icon.h"
53 #include "icons.h"
54 extern gerbv_render_info_t screenRenderInfo;
56 #define WIN_TITLE "Gerbv -- gEDA's Gerber Viewer"
57 #define _(String) (String)
59 #define dprintf if(DEBUG) printf
61 /* ---------------------------------------------- */
62 void
63 rename_main_window(char const* filename, GtkWidget *main_win)
65 GString *win_title=g_string_new(NULL);
66 static GtkWidget *win=NULL;
68 if( main_win != NULL )
69 win = main_win;
71 g_assert(win != NULL);
73 g_string_printf (win_title,"%s version %s: %s", WIN_TITLE, VERSION, filename);
74 gtk_window_set_title(GTK_WINDOW(win), win_title->str);
75 g_string_free(win_title,TRUE);
78 /* ---------------------------------------------- */
79 void
80 set_window_icon (GtkWidget * this_window)
82 GdkPixmap *pixmap;
83 GdkBitmap *mask;
85 pixmap = gdk_pixmap_create_from_xpm_d (this_window->window, &mask,
86 &this_window->style->bg[GTK_STATE_NORMAL], gerbv_icon_xpm);
87 gdk_window_set_icon (this_window->window, NULL, pixmap, mask);
89 return;
92 /* ---------------------------------------------- */
93 void
94 interface_load_accels (void)
96 gchar *accel_map_filename = g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH, NULL);
97 if (accel_map_filename) {
98 gtk_accel_map_load (accel_map_filename);
99 g_free (accel_map_filename);
103 /* ---------------------------------------------- */
104 void
105 interface_save_accels (void)
107 gchar *accel_map_filename = g_build_filename (g_get_home_dir(), GERBV_ACCELS_RELPATH, NULL);
108 if (accel_map_filename) {
109 gtk_accel_map_save (accel_map_filename);
110 g_free (accel_map_filename);
114 /* ---------------------------------------------- */
115 void
116 interface_create_gui (int req_width, int req_height)
118 GtkStockItem stock;
120 GtkWidget *mainWindow;
121 GtkWidget *vbox1;
122 GtkWidget *menubar1;
124 GtkWidget *menuitem_file;
125 GtkWidget *menuitem_file_menu;
126 GtkWidget *new;
127 GtkWidget *open_project;
128 GtkWidget *image33;
129 GtkWidget *open_layer;
130 GtkWidget *revert;
131 GtkWidget *save;
132 GtkWidget *save_as;
133 GtkWidget *save_layer;
134 GtkWidget *save_as_layer;
135 GtkWidget *separatormenuitem1;
136 GtkWidget *menuitem_file_export;
137 GtkWidget *menuitem_file_export_menu;
138 GtkWidget *png;
139 GtkWidget *pdf;
140 GtkWidget *svg;
141 GtkWidget *postscript;
142 GtkWidget *rs274x,*drill,*rs274xm,*drillm;
144 GtkWidget *separator1;
145 #if GTK_CHECK_VERSION(2,10,0)
146 GtkWidget *print;
147 GtkWidget *separator2;
148 #endif
149 GtkWidget *quit;
151 GtkWidget *menuitem_edit;
152 GtkWidget *menuitem_edit_menu;
153 GtkWidget *properties_selected;
154 GtkWidget *delete_selected;
155 GtkWidget *menuitem_view;
156 GtkWidget *menuitem_view_menu;
157 GtkWidget *view_fullscreen;
158 GtkWidget *show_toolbar;
159 GtkWidget *show_sidepane;
160 GtkWidget *separator3;
161 GtkWidget *toggle_layer_visibility_item1;
162 GtkWidget *toggle_layer_visibility_item2;
163 GtkWidget *toggle_layer_visibility_item3;
164 GtkWidget *toggle_layer_visibility_item4;
165 GtkWidget *toggle_layer_visibility_item5;
166 GtkWidget *toggle_layer_visibility_item6;
167 GtkWidget *toggle_layer_visibility_item7;
168 GtkWidget *toggle_layer_visibility_item8;
169 GtkWidget *toggle_layer_visibility_item9;
170 GtkWidget *toggle_layer_visibility_item10;
171 GtkWidget *separator4;
172 GtkWidget *zoom_in;
173 GtkWidget *zoom_out;
174 GtkWidget *fit_to_window;
175 GtkWidget *separator5;
176 GtkWidget *backgroundColor;
177 GtkWidget *menuitem_view_render, *menuitem_view_render_menu;
178 GSList *menu_view_render_group;
179 GtkWidget *render_fast, *render_fast_xor, *render_normal, *render_hq;
180 GtkWidget *menuitem_view_unit, *menuitem_view_unit_menu;
181 GSList *menu_view_unit_group;
182 GtkWidget *unit_mil, *unit_mm, *unit_in;
183 GtkWidget *menuitem_layer;
184 GtkWidget *menuitem_layer_menu;
185 GtkWidget *layer_visibility;
186 GtkWidget *layer_invert;
187 GtkWidget *layer_color;
188 GtkWidget *layer_reload;
189 GtkWidget *layer_orientation;
190 GtkWidget *layer_format;
191 GtkWidget *layer_up;
192 GtkWidget *layer_down;
193 GtkWidget *layer_remove;
194 GtkWidget *menuitem_analyze;
195 GtkWidget *menuitem_analyze_menu;
196 GtkWidget *analyze_active_gerbers;
197 GtkWidget *analyze_active_drill;
198 GtkWidget *analyze_benchmark;
199 /*GtkWidget *control_gerber_options;*/
200 GtkWidget *menuitem_tools;
201 GtkWidget *menuitem_tools_menu;
202 GtkWidget *toggletoolbutton_pointer;
203 GtkWidget *pointer_tool;
204 GdkPixbuf *pointerpixbuf;
205 GtkWidget *pointerimage;
206 GtkWidget *pan_tool;
207 GtkWidget *zoom_tool;
208 GtkWidget *measure_tool;
209 GtkWidget *menuitem_help;
210 GtkWidget *layer_visibility_menu;
211 GtkWidget *layer_visibility_main_menu;
212 GtkWidget *menuitem_help_menu;
213 /*GtkWidget *online_manual;*/
214 GtkWidget *about;
215 GtkWidget *bugs_menuitem;
216 GtkWidget *image34;
217 GtkWidget *toolbar_hbox;
218 GtkWidget *handlebox;
219 GtkWidget *button_toolbar;
220 GtkIconSize tmp_toolbar_icon_size;
221 GtkWidget *toolbutton_new;
222 GtkWidget *toolbutton_open;
223 GtkWidget *toolbutton_revert;
224 GtkWidget *toolbutton_save;
225 GtkWidget *separatortoolitem1;
226 #if GTK_CHECK_VERSION(2,10,0)
227 GtkWidget *toolbutton_print;
228 GtkWidget *separatortoolitem2;
229 #endif
230 GtkWidget *toolbutton_zoom_in;
231 GtkWidget *toolbutton_zoom_out;
232 GtkWidget *toolbutton_zoom_fit;
233 /* Implement these tool buttons later when we have icons */
234 /* GtkWidget *separatortoolitem3; */
235 /* GtkWidget *toolbutton_analyze; */
236 /* GtkWidget *toolbutton_validate;*/
237 /* GtkWidget *toolbutton_control; */
238 GtkWidget *separatortoolitem4;
239 GtkWidget *toggletoolbutton_pan;
240 GtkWidget *toggletoolbutton_zoom;
241 GtkWidget *toggletoolbutton_measure;
242 GtkWidget *hpaned1;
243 GtkWidget *sidepane_vbox;
244 GtkWidget *sidepane_notebook;
245 GtkWidget *vbox10;
246 GtkWidget *hbox4;
247 GtkWidget *label1;
248 GtkWidget *render_combobox;
249 GtkWidget *scrolledwindow1;
250 GtkWidget *hbox1;
251 GtkWidget *button4;
252 GtkWidget *image8;
253 GtkWidget *button5;
254 GtkWidget *image9;
255 GtkWidget *button6;
256 GtkWidget *image10;
257 GtkWidget *button7;
258 GtkWidget *image11;
259 GtkWidget *Layer_label;
260 GtkWidget *vbox11;
261 GtkWidget *messages_scrolledwindow;
262 GtkWidget *message_textview;
263 GtkWidget *clear_messages_button;
264 GtkWidget *Message_label;
265 GtkWidget *vbox2;
266 GtkWidget *main_view_table;
267 GtkWidget *hRuler;
268 GtkWidget *vRuler;
269 GtkWidget *hbox5;
270 GtkWidget *statusbar_label_left;
271 GtkWidget *statusUnitComboBox;
272 GtkWidget *statusbar_label_right;
273 GtkWidget *drawingarea, *hAdjustment, *vAdjustment, *hScrollbar, *vScrollbar;
275 GtkAccelGroup *accel_group;
276 GtkTooltips *tooltips;
278 /* Inline icons */
279 GdkPixbuf *zoompixbuf;
280 GtkWidget *zoomimage;
281 GdkPixbuf *measurepixbuf;
282 GtkWidget *measureimage;
283 GdkPixbuf *movepixbuf;
284 GtkWidget *moveimage;
286 GtkWidget *tempImage;
288 pointerpixbuf = gdk_pixbuf_new_from_inline(-1, pointer, FALSE, NULL);
289 movepixbuf = gdk_pixbuf_new_from_inline(-1, move, FALSE, NULL);
290 zoompixbuf = gdk_pixbuf_new_from_inline(-1, lzoom, FALSE, NULL);
291 measurepixbuf = gdk_pixbuf_new_from_inline(-1, ruler, FALSE, NULL);
293 tooltips = gtk_tooltips_new();
294 accel_group = gtk_accel_group_new ();
296 mainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
297 gtk_window_set_title (GTK_WINDOW (mainWindow), _(WIN_TITLE));
299 vbox1 = gtk_vbox_new (FALSE, 0);
300 gtk_container_add (GTK_CONTAINER (mainWindow), vbox1);
302 menubar1 = gtk_menu_bar_new ();
303 gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
305 /* --- File menu --- */
306 menuitem_file = gtk_menu_item_new_with_mnemonic (_("_File"));
307 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_file);
309 /* File menu items dealing with a gerbv project. */
310 menuitem_file_menu = gtk_menu_new ();
311 gtk_menu_set_accel_group (GTK_MENU(menuitem_file_menu), accel_group);
312 gtk_menu_set_accel_path (GTK_MENU(menuitem_file_menu), ACCEL_FILE);
313 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file), menuitem_file_menu);
315 new = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, NULL);
316 SET_ACCELS_FROM_STOCK (GTK_STOCK_NEW, ACCEL_FILE_NEW);
317 gtk_tooltips_set_tip (tooltips, new, "Close all layers and start a new project", NULL);
318 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), new);
320 open_project = gtk_image_menu_item_new_with_mnemonic (_("_Open project..."));
321 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), open_project);
322 gtk_tooltips_set_tip (tooltips, open_project, "Open an existing Gerbv project", NULL);
323 image33 = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
324 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open_project), image33);
326 save = gtk_image_menu_item_new_with_mnemonic (_("Save project"));
327 gtk_tooltips_set_tip (tooltips, save, "Save the current project", NULL);
328 tempImage = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU);
329 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save), tempImage);
330 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save);
332 save_as = gtk_image_menu_item_new_with_mnemonic (_("Save project as..."));
333 gtk_tooltips_set_tip (tooltips, save_as, "Save the current project to a new file", NULL);
334 tempImage = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU);
335 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (save_as), tempImage);
336 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_as);
338 revert = gtk_image_menu_item_new_from_stock (GTK_STOCK_REVERT_TO_SAVED, NULL);
339 SET_ACCELS_FROM_STOCK (GTK_STOCK_REVERT_TO_SAVED, ACCEL_FILE_REVERT);
340 gtk_tooltips_set_tip (tooltips, revert, "Reload all layers", NULL);
341 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), revert);
343 /* File menu items dealing individual layers. */
344 separator1 = gtk_separator_menu_item_new ();
345 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator1);
346 gtk_widget_set_sensitive (separator1, FALSE);
348 open_layer = gtk_menu_item_new_with_mnemonic (_("Open _layer(s)..."));
349 gtk_accel_map_add_entry (ACCEL_FILE_OPEN_LAYER_PATH, ACCEL_FILE_OPEN_LAYER_KEY, ACCEL_FILE_OPEN_LAYER_MOD);
350 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), open_layer);
351 gtk_tooltips_set_tip (tooltips, open_layer, "Open Gerber, drill, or pick and place file(s)", NULL);
353 save_layer = gtk_menu_item_new_with_mnemonic (_("_Save active layer"));
354 gtk_tooltips_set_tip (tooltips, save_layer, "Save the active layer", NULL);
355 gtk_accel_map_add_entry (ACCEL_FILE_SAVE_LAYER_PATH, ACCEL_FILE_SAVE_LAYER_KEY, ACCEL_FILE_SAVE_LAYER_MOD);
356 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_layer);
358 save_as_layer = gtk_menu_item_new_with_mnemonic (_("Save active layer _as..."));
359 gtk_tooltips_set_tip (tooltips, save_as_layer, "Save the active layer to a new file", NULL);
360 gtk_accel_map_add_entry (ACCEL_FILE_SAVE_LAYER_AS_PATH, ACCEL_FILE_SAVE_LAYER_AS_KEY, ACCEL_FILE_SAVE_LAYER_AS_MOD);
361 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), save_as_layer);
363 /* File menu items dealing with exporting different types of files. */
364 separatormenuitem1 = gtk_separator_menu_item_new ();
365 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separatormenuitem1);
366 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
368 menuitem_file_export = gtk_menu_item_new_with_mnemonic (_("_Export"));
369 gtk_tooltips_set_tip (tooltips, menuitem_file_export, "Export all visible layers to a new format", NULL);
370 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), menuitem_file_export);
372 menuitem_file_export_menu = gtk_menu_new ();
373 gtk_menu_set_accel_group (GTK_MENU(menuitem_file_export_menu), accel_group);
374 gtk_menu_set_accel_path (GTK_MENU(menuitem_file_export_menu), ACCEL_FILE_EXPORT);
375 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_file_export), menuitem_file_export_menu);
377 png = gtk_menu_item_new_with_mnemonic (_("P_NG..."));
378 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), png);
379 gtk_tooltips_set_tip (tooltips, png, _("Export project to a PNG file..."), NULL);
381 pdf = gtk_menu_item_new_with_mnemonic (_("P_DF..."));
382 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), pdf);
383 gtk_tooltips_set_tip (tooltips, pdf, _("Export project to a PDF file..."), NULL);
385 svg = gtk_menu_item_new_with_mnemonic (_("_SVG..."));
386 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), svg);
387 gtk_tooltips_set_tip (tooltips, svg, _("Export project to a SVG file"), NULL);
389 postscript = gtk_menu_item_new_with_mnemonic (_("_PostScript..."));
390 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), postscript);
391 gtk_tooltips_set_tip (tooltips, postscript, _("Export project to a PostScript file"), NULL);
393 rs274x = gtk_menu_item_new_with_mnemonic (_("RS-274X (_Gerber)..."));
394 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), rs274x);
395 gtk_tooltips_set_tip (tooltips, rs274x, _("Export layer to a RS-274X (Gerber) file"), NULL);
397 drill = gtk_menu_item_new_with_mnemonic (_("_Excellon drill..."));
398 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), drill);
399 gtk_tooltips_set_tip (tooltips, drill, _("Export layer to an Excellon drill file"), NULL);
401 rs274xm = gtk_menu_item_new_with_mnemonic (_("RS-274X Merge (Gerber)..."));
402 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), rs274xm);
403 gtk_tooltips_set_tip (tooltips, rs274xm, _("Export (merge visible gerber layers) to a RS-274X (Gerber) file"), NULL);
405 drillm = gtk_menu_item_new_with_mnemonic (_("Excellon drill Merge..."));
406 gtk_container_add (GTK_CONTAINER (menuitem_file_export_menu), drillm);
407 gtk_tooltips_set_tip (tooltips, drillm, _("Export (merge visible drill layers) to an Excellon drill file"), NULL);
409 /* File menu items dealing with printing and quitting. */
410 separator1 = gtk_separator_menu_item_new ();
411 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator1);
412 gtk_widget_set_sensitive (separator1, FALSE);
414 #if GTK_CHECK_VERSION(2,10,0)
415 if (gtk_stock_lookup(GTK_STOCK_PRINT, &stock)) {
416 gchar new[] = "_Print...";
417 stock.label = new;
418 gtk_stock_add(&stock, 1);
421 print = gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT, NULL);
422 SET_ACCELS_FROM_STOCK (GTK_STOCK_PRINT, ACCEL_FILE_PRINT);
423 gtk_tooltips_set_tip (tooltips, print, "Print the visible layers", NULL);
424 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), print);
426 separator2 = gtk_separator_menu_item_new ();
427 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), separator2);
428 gtk_widget_set_sensitive (separator2, FALSE);
429 #endif
430 quit = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
431 SET_ACCELS_FROM_STOCK (GTK_STOCK_QUIT, ACCEL_FILE_QUIT);
432 gtk_tooltips_set_tip (tooltips, quit, "Quit Gerbv", NULL);
433 gtk_container_add (GTK_CONTAINER (menuitem_file_menu), quit);
435 /* --- Next menu item (Edit) --- */
436 menuitem_edit = gtk_menu_item_new_with_mnemonic (_("_Edit"));
437 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_edit);
439 menuitem_edit_menu = gtk_menu_new ();
440 gtk_menu_set_accel_group (GTK_MENU(menuitem_edit_menu), accel_group);
441 gtk_menu_set_accel_path (GTK_MENU(menuitem_edit_menu), ACCEL_EDIT);
442 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_edit), menuitem_edit_menu);
444 properties_selected = gtk_image_menu_item_new_with_mnemonic (_("Display _properties of selected object(s)"));
445 SET_ACCELS_FROM_STOCK (GTK_STOCK_PROPERTIES, ACCEL_EDIT_PROPERTIES);
446 gtk_tooltips_set_tip (tooltips, properties_selected, "Examine the properties of the selected object", NULL);
447 tempImage = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU);
448 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (properties_selected), tempImage);
449 gtk_container_add (GTK_CONTAINER (menuitem_edit_menu), properties_selected);
451 delete_selected = gtk_image_menu_item_new_with_mnemonic (_("_Delete selected object(s)"));
452 SET_ACCELS_FROM_STOCK (GTK_STOCK_REMOVE, ACCEL_EDIT_DELETE);
453 gtk_tooltips_set_tip (tooltips, delete_selected, "Delete selected objects", NULL);
454 tempImage = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU);
455 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (delete_selected), tempImage);
456 gtk_container_add (GTK_CONTAINER (menuitem_edit_menu), delete_selected);
458 /* Include these after they are coded.
459 tempMenuItem = gtk_image_menu_item_new_with_label ("Edit object properties");
460 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
461 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Edit the properties of the selected object", NULL);
462 g_signal_connect ((gpointer) tempMenuItem, "activate",
463 G_CALLBACK (callbacks_edit_object_properties_clicked), NULL);
465 tempMenuItem = gtk_image_menu_item_new_with_label ("Move object(s)");
466 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
467 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Move the selected object(s)",NULL);
468 g_signal_connect ((gpointer) tempMenuItem, "activate",
469 G_CALLBACK (callbacks_move_objects_clicked), NULL);
471 tempMenuItem = gtk_image_menu_item_new_with_label ("Reduce area");
472 gtk_menu_shell_append ((GtkMenuShell *)screen.win.drawWindowPopupMenu, tempMenuItem);
473 gtk_tooltips_set_tip (tooltips, tempMenuItem, "Reduce the area of the object (e.g. to prevent component floating)",NULL);
474 g_signal_connect ((gpointer) tempMenuItem, "activate",
475 G_CALLBACK (callbacks_reduce_object_area_clicked), NULL);
478 /* Use the "Edit" menu as right click popup menu for the drawing area */
479 screen.win.drawWindowPopupMenu = menuitem_edit_menu;
481 /* --- Next menu item (View) --- */
482 menuitem_view = gtk_menu_item_new_with_mnemonic (_("_View"));
483 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_view);
485 menuitem_view_menu = gtk_menu_new ();
486 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_menu), accel_group);
487 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_menu), ACCEL_VIEW);
488 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view), menuitem_view_menu);
490 view_fullscreen = gtk_check_menu_item_new_with_mnemonic (_("Fullscr_een"));
491 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_fullscreen), FALSE);
492 gtk_tooltips_set_tip (tooltips, view_fullscreen, "Toggle between fullscreen and normal view", NULL);
493 SET_ACCELS (ACCEL_VIEW_FULLSCREEN);
494 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), view_fullscreen);
496 show_toolbar = gtk_check_menu_item_new_with_mnemonic (_("Show _Toolbar"));
497 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_toolbar), TRUE);
498 gtk_tooltips_set_tip (tooltips, show_toolbar, "Toggle visibility of the toolbar", NULL);
499 SET_ACCELS (ACCEL_VIEW_TOOLBAR);
500 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), show_toolbar);
502 show_sidepane = gtk_check_menu_item_new_with_mnemonic (_("Show _Sidepane"));
503 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (show_sidepane), TRUE);
504 gtk_tooltips_set_tip (tooltips, show_sidepane, "Toggle visibility of the sidepane", NULL);
505 SET_ACCELS (ACCEL_VIEW_SIDEPANE);
506 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), show_sidepane);
508 separator3 = gtk_separator_menu_item_new ();
509 gtk_widget_set_sensitive (separator3, FALSE);
510 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator3);
512 layer_visibility_main_menu = gtk_menu_item_new_with_mnemonic (_("Toggle layer _visibility"));
513 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), layer_visibility_main_menu);
515 layer_visibility_menu = gtk_menu_new ();
516 gtk_menu_set_accel_group (GTK_MENU(layer_visibility_menu), accel_group);
517 gtk_menu_set_accel_path (GTK_MENU(layer_visibility_menu), ACCEL_VIEW_VIS);
518 gtk_menu_item_set_submenu (GTK_MENU_ITEM (layer_visibility_main_menu), layer_visibility_menu);
520 toggle_layer_visibility_item1 = gtk_menu_item_new_with_label ("Toggle visibility of layer 1");
521 SET_ACCELS (ACCEL_VIEW_VIS_LAYER1);
522 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item1);
524 toggle_layer_visibility_item2 = gtk_menu_item_new_with_label ("Toggle visibility of layer 2");
525 SET_ACCELS (ACCEL_VIEW_VIS_LAYER2);
526 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item2);
528 toggle_layer_visibility_item3 = gtk_menu_item_new_with_label ("Toggle visibility of layer 3");
529 SET_ACCELS (ACCEL_VIEW_VIS_LAYER3);
530 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item3);
532 toggle_layer_visibility_item4 = gtk_menu_item_new_with_label ("Toggle visibility of layer 4");
533 SET_ACCELS (ACCEL_VIEW_VIS_LAYER4);
534 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item4);
536 toggle_layer_visibility_item5 = gtk_menu_item_new_with_label ("Toggle visibility of layer 5");
537 SET_ACCELS (ACCEL_VIEW_VIS_LAYER5);
538 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item5);
540 toggle_layer_visibility_item6 = gtk_menu_item_new_with_label ("Toggle visibility of layer 6");
541 SET_ACCELS (ACCEL_VIEW_VIS_LAYER6);
542 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item6);
544 toggle_layer_visibility_item7 = gtk_menu_item_new_with_label ("Toggle visibility of layer 7");
545 SET_ACCELS (ACCEL_VIEW_VIS_LAYER7);
546 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item7);
548 toggle_layer_visibility_item8 = gtk_menu_item_new_with_label ("Toggle visibility of layer 8");
549 SET_ACCELS (ACCEL_VIEW_VIS_LAYER8);
550 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item8);
552 toggle_layer_visibility_item9 = gtk_menu_item_new_with_label ("Toggle visibility of layer 9");
553 SET_ACCELS (ACCEL_VIEW_VIS_LAYER9);
554 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item9);
556 toggle_layer_visibility_item10 = gtk_menu_item_new_with_label ("Toggle visibility of layer 10");
557 SET_ACCELS (ACCEL_VIEW_VIS_LAYER10);
558 gtk_container_add (GTK_CONTAINER (layer_visibility_menu), toggle_layer_visibility_item10);
560 separator4 = gtk_separator_menu_item_new ();
561 gtk_widget_set_sensitive (separator4, FALSE);
562 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator4);
564 zoom_in = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_IN, NULL);
565 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_IN, ACCEL_VIEW_ZOOM_IN);
566 gtk_tooltips_set_tip (tooltips, zoom_in, "Zoom in", NULL);
567 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), zoom_in);
569 zoom_out = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_OUT, NULL);
570 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_OUT, ACCEL_VIEW_ZOOM_OUT);
571 gtk_tooltips_set_tip (tooltips, zoom_out, "Zoom out", NULL);
572 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), zoom_out);
574 fit_to_window = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_FIT, NULL);
575 gtk_tooltips_set_tip (tooltips, fit_to_window, "Zoom to fit all visible layers in the window", NULL);
576 SET_ACCELS_FROM_STOCK (GTK_STOCK_ZOOM_FIT, ACCEL_VIEW_ZOOM_FIT);
577 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), fit_to_window);
579 separator5 = gtk_separator_menu_item_new ();
580 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), separator5);
581 gtk_widget_set_sensitive (separator5, FALSE);
583 backgroundColor = gtk_menu_item_new_with_mnemonic ("Change background color");
584 gtk_tooltips_set_tip (tooltips, backgroundColor, "Change the background color", NULL);
585 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), backgroundColor);
587 { // rendering submenu
588 menuitem_view_render = gtk_menu_item_new_with_mnemonic (_("_Rendering"));
589 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), menuitem_view_render);
591 menuitem_view_render_menu = gtk_menu_new ();
592 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_render_menu), accel_group);
593 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_render_menu), ACCEL_VIEW_RENDER);
594 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_render), menuitem_view_render_menu);
596 menu_view_render_group = NULL;
598 render_fast = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("_Fast"));
599 menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast));
600 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_fast);
602 render_fast_xor = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("Fast (_XOR)"));
603 menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_fast_xor));
604 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_fast_xor);
606 render_normal = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("_Normal"));
607 menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_normal));
608 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_normal);
610 render_hq = gtk_radio_menu_item_new_with_mnemonic (menu_view_render_group, _("High _Quality"));
611 menu_view_render_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (render_hq));
612 gtk_container_add (GTK_CONTAINER (menuitem_view_render_menu), render_hq);
614 screen.win.menu_view_render_group = malloc(4*sizeof(GtkWidget *));
615 if(screen.win.menu_view_render_group == NULL)
616 GERB_FATAL_ERROR("malloc for rendering type synchronization failed.\n");
618 screen.win.menu_view_render_group[GERBV_RENDER_TYPE_GDK] = GTK_CHECK_MENU_ITEM(render_fast);
619 screen.win.menu_view_render_group[GERBV_RENDER_TYPE_GDK_XOR] = GTK_CHECK_MENU_ITEM(render_fast_xor);
620 screen.win.menu_view_render_group[GERBV_RENDER_TYPE_CAIRO_NORMAL] = GTK_CHECK_MENU_ITEM(render_normal);
621 screen.win.menu_view_render_group[GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY] = GTK_CHECK_MENU_ITEM(render_hq);
624 { // units submenu
625 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (render_fast), TRUE);
627 menuitem_view_unit = gtk_menu_item_new_with_mnemonic (_("U_nits"));
628 gtk_container_add (GTK_CONTAINER (menuitem_view_menu), menuitem_view_unit);
630 menuitem_view_unit_menu = gtk_menu_new ();
631 gtk_menu_set_accel_group (GTK_MENU(menuitem_view_unit_menu), accel_group);
632 gtk_menu_set_accel_path (GTK_MENU(menuitem_view_unit_menu), ACCEL_VIEW_UNITS);
633 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_view_unit), menuitem_view_unit_menu);
635 menu_view_unit_group = NULL;
637 unit_mil = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("mi_l"));
638 menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mil));
639 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_mil);
641 unit_mm = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("_mm"));
642 menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_mm));
643 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_mm);
645 unit_in = gtk_radio_menu_item_new_with_mnemonic (menu_view_unit_group, _("_in"));
646 menu_view_unit_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (unit_in));
647 gtk_container_add (GTK_CONTAINER (menuitem_view_unit_menu), unit_in);
649 screen.win.menu_view_unit_group = malloc(3*sizeof(GtkWidget *));
650 if(screen.win.menu_view_unit_group == NULL)
651 GERB_FATAL_ERROR("malloc for display unit synchronization failed.\n");
653 screen.win.menu_view_unit_group[GERBV_MILS] = GTK_CHECK_MENU_ITEM(unit_mil);
654 screen.win.menu_view_unit_group[GERBV_MMS] = GTK_CHECK_MENU_ITEM(unit_mm);
655 screen.win.menu_view_unit_group[GERBV_INS] = GTK_CHECK_MENU_ITEM(unit_in);
658 /* --- Next menu item (Current Layer) --- */
659 menuitem_layer = gtk_menu_item_new_with_mnemonic (_("Current _Layer"));
660 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_layer);
662 menuitem_layer_menu = gtk_menu_new ();
663 gtk_menu_set_accel_group (GTK_MENU (menuitem_layer_menu), accel_group);
664 gtk_menu_set_accel_path (GTK_MENU (menuitem_layer_menu), ACCEL_LAYER);
665 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_layer), menuitem_layer_menu);
667 layer_visibility = gtk_menu_item_new_with_mnemonic ("Toggle _visibility");
668 gtk_tooltips_set_tip (tooltips, layer_visibility, "Toggles the visibility of the layer currently selected in the sidepane", NULL);
669 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_visibility);
671 layer_invert = gtk_menu_item_new_with_mnemonic ("_Invert color");
672 gtk_tooltips_set_tip (tooltips, layer_invert, "Invert the display polarity of the layer currently selected in the sidepane", NULL);
673 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_invert);
675 layer_color = gtk_menu_item_new_with_mnemonic (_("_Change color"));
676 SET_ACCELS (ACCEL_LAYER_COLOR);
677 gtk_tooltips_set_tip (tooltips, layer_color, "Change the display color of the layer currently selected in the sidepane", NULL);
678 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_color);
680 layer_reload = gtk_menu_item_new_with_mnemonic (_("_Reload layer"));
681 gtk_tooltips_set_tip (tooltips, layer_reload, "Reload the layer from disk", NULL);
682 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_reload);
684 layer_orientation = gtk_menu_item_new_with_mnemonic (_("Modify _orientation"));
685 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_orientation);
686 gtk_tooltips_set_tip (tooltips, layer_orientation, "Translate, scale, rotate, or mirror the layer currently selected in the sidepane", NULL);
688 layer_format = gtk_menu_item_new_with_mnemonic (_("Edit file _format"));
689 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_format);
690 gtk_tooltips_set_tip (tooltips, layer_format, "View and edit the numerical format used to parse this layer currently selected in the sidepane", NULL);
692 layer_up = gtk_image_menu_item_new_with_mnemonic (_("Move u_p"));
693 gtk_tooltips_set_tip (tooltips, layer_up, "Move the layer currently selected in the sidepane one step up", NULL);
694 tempImage = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU);
695 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_up), tempImage);
696 SET_ACCELS (ACCEL_LAYER_UP);
697 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_up);
699 layer_down = gtk_image_menu_item_new_with_mnemonic (_("Move dow_n"));
700 gtk_tooltips_set_tip (tooltips, layer_down, "Move the layer currently selected in the sidepane one step down", NULL);
701 tempImage = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU);
702 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_down), tempImage);
703 SET_ACCELS (ACCEL_LAYER_DOWN);
704 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_down);
706 layer_remove = gtk_image_menu_item_new_with_mnemonic (_("_Delete"));
707 gtk_container_add (GTK_CONTAINER (menuitem_layer_menu), layer_remove);
708 gtk_tooltips_set_tip (tooltips, layer_remove, "Remove the layer currently selected in the sidepane", NULL);
709 tempImage = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU);
710 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (layer_remove), tempImage);
712 /* The callbacks need this reference to grey the layer menu out, if there are none loaded. */
713 screen.win.curLayerMenuItem = menuitem_layer;
715 /* Use the "Current Layer" menu as right click popup menu for layer tree */
716 screen.win.layerTreePopupMenu = menuitem_layer_menu;
718 /* --- Next menu item (Analyze) --- */
719 menuitem_analyze = gtk_menu_item_new_with_mnemonic (_("_Analyze"));
720 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_analyze);
722 menuitem_analyze_menu = gtk_menu_new ();
723 gtk_menu_set_accel_group (GTK_MENU(menuitem_analyze_menu), accel_group);
724 gtk_menu_set_accel_path (GTK_MENU(menuitem_analyze_menu), ACCEL_ANAL);
725 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_analyze), menuitem_analyze_menu);
727 analyze_active_gerbers = gtk_menu_item_new_with_mnemonic (_("Analyze visible _Gerber layers"));
728 gtk_tooltips_set_tip (tooltips, analyze_active_gerbers,
729 "Examine a detailed anaylsis of the contents of all visible Gerber layers", NULL);
730 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_active_gerbers);
732 analyze_active_drill = gtk_menu_item_new_with_mnemonic (_("Analyze visible _drill layers"));
733 gtk_tooltips_set_tip (tooltips, analyze_active_drill,
734 "Examine a detailed anaylsis of the contents of all visible drill layers", NULL);
735 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_active_drill);
737 analyze_benchmark = gtk_menu_item_new_with_mnemonic (_("_Benchmark (1 min)"));
738 gtk_tooltips_set_tip (tooltips, analyze_benchmark,
739 "Benchmark different rendering methods. Will make the application unresponsive for 1 minute!", NULL);
740 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), analyze_benchmark);
743 /* Wait and add in for 2.1??
744 control_gerber_options = gtk_menu_item_new_with_mnemonic (_("Control Gerber options..."));
745 gtk_tooltips_set_tip (tooltips, control_gerber_options, "Set which Gerber features should be displayed", NULL);
746 gtk_container_add (GTK_CONTAINER (menuitem_analyze_menu), control_gerber_options);
748 menuitem_tools = gtk_menu_item_new_with_mnemonic (_("_Tools"));
749 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_tools);
751 menuitem_tools_menu = gtk_menu_new ();
752 gtk_menu_set_accel_group (GTK_MENU(menuitem_tools_menu), accel_group);
753 gtk_menu_set_accel_path (GTK_MENU(menuitem_tools_menu), ACCEL_TOOLS);
754 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_tools), menuitem_tools_menu);
755 pointer_tool = gtk_image_menu_item_new_with_mnemonic (_("_Pointer Tool"));
757 GtkWidget *tempImage = gtk_image_new_from_pixbuf (pointerpixbuf);
758 gtk_image_menu_item_set_image ((GtkImageMenuItem *)pointer_tool, tempImage);
760 SET_ACCELS (ACCEL_TOOLS_POINTER);
761 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), pointer_tool);
762 gtk_tooltips_set_tip (tooltips, pointer_tool, "Select objects on the screen", NULL);
763 pan_tool = gtk_image_menu_item_new_with_mnemonic ("Pa_n Tool");
765 tempImage = gtk_image_new_from_pixbuf (movepixbuf);
766 gtk_image_menu_item_set_image ((GtkImageMenuItem *)pan_tool, tempImage);
768 SET_ACCELS (ACCEL_TOOLS_PAN);
769 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), pan_tool);
770 gtk_tooltips_set_tip (tooltips, pan_tool, "Pan by left clicking and dragging", NULL);
772 zoom_tool = gtk_image_menu_item_new_with_mnemonic (_("_Zoom Tool"));
774 tempImage = gtk_image_new_from_pixbuf (zoompixbuf);
775 gtk_image_menu_item_set_image ((GtkImageMenuItem *)zoom_tool, tempImage);
777 SET_ACCELS (ACCEL_TOOLS_ZOOM);
778 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), zoom_tool);
779 gtk_tooltips_set_tip (tooltips, zoom_tool, "Zoom by left clicking or dragging", NULL);
781 measure_tool = gtk_image_menu_item_new_with_mnemonic (_("_Measure Tool"));
783 tempImage = gtk_image_new_from_pixbuf (measurepixbuf);
784 gtk_image_menu_item_set_image ((GtkImageMenuItem *)measure_tool, tempImage);
786 SET_ACCELS (ACCEL_TOOLS_MEASURE);
787 gtk_container_add (GTK_CONTAINER (menuitem_tools_menu), measure_tool);
788 gtk_tooltips_set_tip (tooltips, measure_tool, "Measure distances on the screen", NULL);
790 menuitem_help = gtk_menu_item_new_with_mnemonic (_("_Help"));
791 gtk_container_add (GTK_CONTAINER (menubar1), menuitem_help);
793 menuitem_help_menu = gtk_menu_new ();
794 gtk_menu_set_accel_group (GTK_MENU(menuitem_help_menu), accel_group);
795 gtk_menu_set_accel_path (GTK_MENU(menuitem_help_menu), ACCEL_HELP);
796 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_help), menuitem_help_menu);
798 /* Not ready for 2.0
799 online_manual = gtk_menu_item_new_with_mnemonic (_("_Online Manual..."));
800 gtk_container_add (GTK_CONTAINER (menuitem_help_menu), online_manual);
801 gtk_tooltips_set_tip (tooltips, online_manual, "View the online help documentation", NULL);
804 about = gtk_image_menu_item_new_with_mnemonic (_("_About Gerbv..."));
805 gtk_container_add (GTK_CONTAINER (menuitem_help_menu), about);
806 gtk_tooltips_set_tip (tooltips, about, "View information about gerbv", NULL);
807 image34 = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU);
808 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about), image34);
810 bugs_menuitem = gtk_menu_item_new_with_mnemonic (_("Known _bugs in this version..."));
811 gtk_container_add (GTK_CONTAINER (menuitem_help_menu), bugs_menuitem);
812 gtk_tooltips_set_tip (tooltips, bugs_menuitem, "View list of known gerbv bugs", NULL);
814 /* Create toolbar (button bar) beneath main menu */
815 toolbar_hbox = gtk_hbox_new (FALSE, 0);
816 gtk_box_pack_start (GTK_BOX (vbox1), toolbar_hbox, FALSE, FALSE, 0);
818 handlebox = gtk_handle_box_new ();
820 gtk_box_pack_start (GTK_BOX (toolbar_hbox), handlebox, TRUE, TRUE, 0);
822 button_toolbar = gtk_toolbar_new ();
823 gtk_widget_set_size_request (button_toolbar, 500, -1);
824 gtk_container_add (GTK_CONTAINER (handlebox), button_toolbar);
825 gtk_toolbar_set_style (GTK_TOOLBAR (button_toolbar), GTK_TOOLBAR_ICONS);
826 tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (button_toolbar));
828 toolbutton_new = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
829 gtk_tooltips_set_tip (tooltips, toolbutton_new, "Close all layers and start a new project", NULL);
830 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_new);
832 toolbutton_open = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
833 gtk_tooltips_set_tip (tooltips, toolbutton_open, "Open a previously saved gerbv project", NULL);
834 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_open);
836 toolbutton_revert = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
837 gtk_tooltips_set_tip (tooltips, toolbutton_revert, "Reload all layers in project", NULL);
838 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_revert);
840 toolbutton_save = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_SAVE);
841 gtk_tooltips_set_tip (tooltips, toolbutton_save, "Save the current project", NULL);
842 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_save);
844 separatortoolitem1 = (GtkWidget*) gtk_separator_tool_item_new ();
845 gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem1);
846 #if GTK_CHECK_VERSION(2,10,0)
847 toolbutton_print = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_PRINT);
848 gtk_tooltips_set_tip (tooltips, toolbutton_print, "Print the visible layers", NULL);
849 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_print);
851 separatortoolitem2 = (GtkWidget*) gtk_separator_tool_item_new ();
852 gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem2);
853 #endif
854 toolbutton_zoom_in = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
855 gtk_tooltips_set_tip (tooltips, toolbutton_zoom_in, "Zoom in", NULL);
856 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_in);
858 toolbutton_zoom_out = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
859 gtk_tooltips_set_tip (tooltips, toolbutton_zoom_out, "Zoom out", NULL);
860 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_out);
862 toolbutton_zoom_fit = (GtkWidget*) gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT);
863 gtk_tooltips_set_tip (tooltips, toolbutton_zoom_fit, "Zoom to fit all visible layers in the window", NULL);
864 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_zoom_fit);
866 /* Turn these on later when we have icons for these buttons */
868 separatortoolitem3 = (GtkWidget*) gtk_separator_tool_item_new ();
869 gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem3);
871 toolbutton_analyze = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
872 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_analyze);
874 toolbutton_validate = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
875 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_validate);
877 toolbutton_control = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply");
878 gtk_container_add (GTK_CONTAINER (button_toolbar), toolbutton_control);
881 separatortoolitem4 = (GtkWidget*) gtk_separator_tool_item_new ();
882 gtk_container_add (GTK_CONTAINER (button_toolbar), separatortoolitem4);
883 toggletoolbutton_pointer = (GtkWidget*) gtk_toggle_tool_button_new();
884 pointerimage = gtk_image_new_from_pixbuf(pointerpixbuf);
885 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pointer),
886 pointerimage);
887 gtk_tooltips_set_tip (tooltips, toggletoolbutton_pointer, "Select objects on the screen", NULL);
888 gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_pointer);
889 toggletoolbutton_pan = (GtkWidget*) gtk_toggle_tool_button_new();
890 moveimage = gtk_image_new_from_pixbuf(movepixbuf);
891 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_pan),
892 moveimage);
893 gtk_tooltips_set_tip (tooltips, toggletoolbutton_pan, "Pan by left clicking and dragging", NULL);
894 gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_pan);
897 toggletoolbutton_zoom = (GtkWidget*) gtk_toggle_tool_button_new();
898 zoomimage = gtk_image_new_from_pixbuf(zoompixbuf);
899 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_zoom),
900 zoomimage);
901 gtk_tooltips_set_tip (tooltips, toggletoolbutton_zoom, "Zoom by left clicking or dragging", NULL);
902 gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_zoom);
904 toggletoolbutton_measure = (GtkWidget*) gtk_toggle_tool_button_new();
905 measureimage = gtk_image_new_from_pixbuf(measurepixbuf);
906 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(toggletoolbutton_measure),
907 measureimage);
908 gtk_tooltips_set_tip (tooltips, toggletoolbutton_measure, "Measure distances on the screen", NULL);
909 gtk_container_add (GTK_CONTAINER (button_toolbar), toggletoolbutton_measure);
911 hpaned1 = gtk_hpaned_new ();
912 gtk_box_pack_start (GTK_BOX (vbox1), hpaned1, TRUE, TRUE, 0);
913 gtk_paned_set_position (GTK_PANED (hpaned1), 225);
915 sidepane_vbox = gtk_vbox_new (FALSE, 0);
916 gtk_widget_set_size_request (sidepane_vbox, 150, -1);
918 gtk_paned_pack1 (GTK_PANED (hpaned1), sidepane_vbox, TRUE, FALSE);
919 gtk_container_set_border_width (GTK_CONTAINER (sidepane_vbox), 5);
921 sidepane_notebook = gtk_notebook_new ();
922 gtk_widget_set_size_request (sidepane_notebook, 100, -1);
923 gtk_box_pack_start (GTK_BOX (sidepane_vbox), sidepane_notebook, TRUE, TRUE, 0);
925 vbox10 = gtk_vbox_new (FALSE, 3);
926 gtk_container_add (GTK_CONTAINER (sidepane_notebook), vbox10);
927 gtk_widget_set_size_request (vbox10, 82, -1);
928 gtk_container_set_border_width (GTK_CONTAINER (vbox10), 4);
930 hbox4 = gtk_hbox_new (FALSE, 0);
931 gtk_box_pack_start (GTK_BOX (vbox10), hbox4, FALSE, FALSE, 0);
933 label1 = gtk_label_new (_("Rendering: "));
934 gtk_box_pack_start (GTK_BOX (hbox4), label1, FALSE, FALSE, 0);
936 render_combobox = gtk_combo_box_new_text ();
937 gtk_box_pack_start (GTK_BOX (hbox4), render_combobox, TRUE, TRUE, 0);
939 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Fast"));
940 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Fast, with XOR"));
941 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("Normal"));
942 gtk_combo_box_append_text (GTK_COMBO_BOX (render_combobox), _("High quality"));
943 if (screenRenderInfo.renderType < GERBV_RENDER_TYPE_MAX)
944 gtk_combo_box_set_active (GTK_COMBO_BOX (render_combobox), screenRenderInfo.renderType);
946 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
947 gtk_box_pack_start (GTK_BOX (vbox10), scrolledwindow1, TRUE, TRUE, 0);
948 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow1), 2);
949 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1),
950 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
951 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1),
952 GTK_SHADOW_IN);
954 hbox1 = gtk_hbox_new (TRUE, 0);
955 gtk_box_pack_start (GTK_BOX (vbox10), hbox1, FALSE, FALSE, 0);
957 button4 = gtk_button_new ();
958 gtk_box_pack_start (GTK_BOX (hbox1), button4, FALSE, TRUE, 0);
960 image8 = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON);
961 gtk_container_add (GTK_CONTAINER (button4), image8);
963 button5 = gtk_button_new ();
964 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, TRUE, 0);
966 image9 = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON);
967 gtk_container_add (GTK_CONTAINER (button5), image9);
969 button6 = gtk_button_new ();
970 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, TRUE, 0);
972 image10 = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_BUTTON);
973 gtk_container_add (GTK_CONTAINER (button6), image10);
975 button7 = gtk_button_new ();
976 gtk_box_pack_start (GTK_BOX (hbox1), button7, FALSE, TRUE, 0);
978 image11 = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON);
979 gtk_container_add (GTK_CONTAINER (button7), image11);
981 Layer_label = gtk_label_new (_("Layers"));
982 gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook),
983 gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook), 0),
984 Layer_label);
986 vbox11 = gtk_vbox_new (FALSE, 2);
987 gtk_container_add (GTK_CONTAINER (sidepane_notebook), vbox11);
988 gtk_container_set_border_width (GTK_CONTAINER (vbox11), 3);
990 messages_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
991 gtk_box_pack_start (GTK_BOX (vbox11), messages_scrolledwindow, TRUE, TRUE, 0);
992 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (messages_scrolledwindow),
993 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
995 message_textview = gtk_text_view_new ();
996 gtk_container_add (GTK_CONTAINER (messages_scrolledwindow), message_textview);
997 gtk_text_view_set_editable (GTK_TEXT_VIEW (message_textview), FALSE);
998 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (message_textview), GTK_WRAP_WORD);
999 gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (message_textview), FALSE);
1001 clear_messages_button = gtk_button_new_from_stock (GTK_STOCK_CLEAR);
1002 gtk_box_pack_start (GTK_BOX (vbox11), clear_messages_button, FALSE, FALSE, 0);
1004 Message_label = gtk_label_new (_("Messages"));
1005 gtk_notebook_set_tab_label (GTK_NOTEBOOK (sidepane_notebook),
1006 gtk_notebook_get_nth_page (GTK_NOTEBOOK (sidepane_notebook), 1),
1007 Message_label);
1009 vbox2 = gtk_vbox_new (FALSE, 4);
1010 gtk_paned_pack2 (GTK_PANED (hpaned1), vbox2, TRUE, FALSE);
1011 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 4);
1013 main_view_table = gtk_table_new (3, 3, FALSE);
1014 gtk_box_pack_start (GTK_BOX (vbox2), main_view_table, TRUE, TRUE, 0);
1016 hRuler = gtk_hruler_new ();
1017 gtk_table_attach (GTK_TABLE (main_view_table), hRuler, 1, 2, 0, 1,
1018 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1019 (GtkAttachOptions) (GTK_FILL), 0, 0);
1020 gtk_ruler_set_range (GTK_RULER (hRuler), 0, 100, 8.56051, 1000);
1022 vRuler = gtk_vruler_new ();
1023 gtk_table_attach (GTK_TABLE (main_view_table), vRuler, 0, 1, 1, 2,
1024 (GtkAttachOptions) (GTK_FILL),
1025 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1026 gtk_ruler_set_range (GTK_RULER (vRuler), 0, 100, 8.37341, 1000);
1028 drawingarea = gtk_drawing_area_new();
1029 gtk_table_attach (GTK_TABLE (main_view_table), drawingarea, 1, 2, 1, 2,
1030 (GtkAttachOptions) (GTK_FILL),
1031 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1033 hAdjustment = (GtkWidget *) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1034 vAdjustment = (GtkWidget *) gtk_adjustment_new (0.0, -1000.0, 1000.0, 1000.0, 1000.0, 500.0);
1036 hScrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (hAdjustment));
1037 gtk_table_attach (GTK_TABLE (main_view_table), hScrollbar, 1, 2, 2, 3,
1038 (GtkAttachOptions) (GTK_FILL),
1039 (GtkAttachOptions) (GTK_FILL), 0, 0);
1041 vScrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (vAdjustment));
1042 gtk_table_attach (GTK_TABLE (main_view_table), vScrollbar, 2, 3, 1, 2,
1043 (GtkAttachOptions) (GTK_FILL),
1044 (GtkAttachOptions) (GTK_FILL), 0, 0);
1046 hbox5 = gtk_hbox_new (FALSE, 10);
1047 gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1049 statusbar_label_left = gtk_label_new ("( 0.0, 0.0 )");
1050 gtk_box_pack_start (GTK_BOX (hbox5), statusbar_label_left, FALSE, FALSE, 0);
1051 gtk_widget_set_size_request (statusbar_label_left, 130, -1);
1052 gtk_label_set_justify ((GtkLabel *) statusbar_label_left, GTK_JUSTIFY_RIGHT);
1054 statusUnitComboBox = gtk_combo_box_new_text ();
1055 gtk_box_pack_start (GTK_BOX (hbox5), statusUnitComboBox, FALSE, FALSE, 0);
1056 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("mil"));
1057 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("mm"));
1058 gtk_combo_box_append_text (GTK_COMBO_BOX (statusUnitComboBox), _("in"));
1060 statusbar_label_right = gtk_label_new (_(""));
1061 gtk_box_pack_start (GTK_BOX (hbox5), statusbar_label_right, TRUE, TRUE, 0);
1062 gtk_label_set_ellipsize ((GtkLabel *)statusbar_label_right, PANGO_ELLIPSIZE_END);
1063 gtk_misc_set_alignment (GTK_MISC (statusbar_label_right), 0, 0.5);
1068 * Connect signals to widgets
1071 /* --- File menu --- */
1072 g_signal_connect ((gpointer) new, "activate",
1073 G_CALLBACK (callbacks_new_activate),
1074 NULL);
1075 g_signal_connect ((gpointer) open_project, "activate",
1076 G_CALLBACK (callbacks_open_project_activate),
1077 NULL);
1078 g_signal_connect ((gpointer) open_layer, "activate",
1079 G_CALLBACK (callbacks_open_layer_activate),
1080 NULL);
1081 g_signal_connect ((gpointer) revert, "activate",
1082 G_CALLBACK (callbacks_revert_activate),
1083 NULL);
1084 g_signal_connect ((gpointer) save_layer, "activate",
1085 G_CALLBACK (callbacks_save_layer_activate),
1086 NULL);
1087 g_signal_connect ((gpointer) save_as_layer, "activate",
1088 G_CALLBACK (callbacks_generic_save_activate),
1089 (gpointer) CALLBACKS_SAVE_LAYER_AS);
1090 g_signal_connect ((gpointer) save, "activate",
1091 G_CALLBACK (callbacks_save_project_activate),
1092 NULL);
1093 g_signal_connect ((gpointer) save_as, "activate",
1094 G_CALLBACK (callbacks_generic_save_activate),
1095 (gpointer) CALLBACKS_SAVE_PROJECT_AS);
1096 g_signal_connect ((gpointer) png, "activate",
1097 G_CALLBACK (callbacks_generic_save_activate),
1098 (gpointer) CALLBACKS_SAVE_FILE_PNG);
1100 g_signal_connect ((gpointer) pdf, "activate",
1101 G_CALLBACK (callbacks_generic_save_activate),
1102 (gpointer) CALLBACKS_SAVE_FILE_PDF);
1103 g_signal_connect ((gpointer) svg, "activate",
1104 G_CALLBACK (callbacks_generic_save_activate),
1105 (gpointer) CALLBACKS_SAVE_FILE_SVG);
1106 g_signal_connect ((gpointer) postscript, "activate",
1107 G_CALLBACK (callbacks_generic_save_activate),
1108 (gpointer) CALLBACKS_SAVE_FILE_PS);
1109 g_signal_connect ((gpointer) rs274x, "activate",
1110 G_CALLBACK (callbacks_generic_save_activate),
1111 (gpointer) CALLBACKS_SAVE_FILE_RS274X);
1112 g_signal_connect ((gpointer) drill, "activate",
1113 G_CALLBACK (callbacks_generic_save_activate),
1114 (gpointer) CALLBACKS_SAVE_FILE_DRILL);
1115 g_signal_connect ((gpointer) rs274xm, "activate",
1116 G_CALLBACK (callbacks_generic_save_activate),
1117 (gpointer) CALLBACKS_SAVE_FILE_RS274XM);
1118 g_signal_connect ((gpointer) drillm, "activate",
1119 G_CALLBACK (callbacks_generic_save_activate),
1120 (gpointer) CALLBACKS_SAVE_FILE_DRILLM);
1122 #if GTK_CHECK_VERSION(2,10,0)
1123 g_signal_connect ((gpointer) print, "activate",
1124 G_CALLBACK (callbacks_print_activate),
1125 NULL);
1126 #endif
1127 g_signal_connect ((gpointer) quit, "activate",
1128 G_CALLBACK (callbacks_quit_activate),
1129 NULL);
1131 /* --- Edit menu --- */
1132 g_signal_connect ((gpointer) delete_selected, "activate",
1133 G_CALLBACK (callbacks_delete_objects_clicked),
1134 NULL);
1135 g_signal_connect ((gpointer) properties_selected, "activate",
1136 G_CALLBACK (callbacks_display_object_properties_clicked),
1137 NULL);
1139 /* --- View menu --- */
1140 g_signal_connect ((gpointer) view_fullscreen, "activate",
1141 G_CALLBACK (callbacks_fullscreen_toggled),
1142 GINT_TO_POINTER(0));
1143 g_signal_connect ((gpointer) show_toolbar, "toggled",
1144 G_CALLBACK (callbacks_show_toolbar_toggled),
1145 toolbar_hbox);
1146 g_signal_connect ((gpointer) show_sidepane, "toggled",
1147 G_CALLBACK (callbacks_show_sidepane_toggled),
1148 sidepane_vbox);
1149 g_signal_connect ((gpointer) toggle_layer_visibility_item1, "activate",
1150 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1151 GINT_TO_POINTER(0));
1152 g_signal_connect ((gpointer) toggle_layer_visibility_item2, "activate",
1153 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1154 GINT_TO_POINTER(1));
1155 g_signal_connect ((gpointer) toggle_layer_visibility_item3, "activate",
1156 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1157 GINT_TO_POINTER(2));
1158 g_signal_connect ((gpointer) toggle_layer_visibility_item4, "activate",
1159 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1160 GINT_TO_POINTER(3));
1161 g_signal_connect ((gpointer) toggle_layer_visibility_item5, "activate",
1162 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1163 GINT_TO_POINTER(4));
1164 g_signal_connect ((gpointer) toggle_layer_visibility_item6, "activate",
1165 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1166 GINT_TO_POINTER(5));
1167 g_signal_connect ((gpointer) toggle_layer_visibility_item7, "activate",
1168 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1169 GINT_TO_POINTER(6));
1170 g_signal_connect ((gpointer) toggle_layer_visibility_item8, "activate",
1171 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1172 GINT_TO_POINTER(7));
1173 g_signal_connect ((gpointer) toggle_layer_visibility_item9, "activate",
1174 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1175 GINT_TO_POINTER(8));
1176 g_signal_connect ((gpointer) toggle_layer_visibility_item10, "activate",
1177 G_CALLBACK (callbacks_toggle_layer_visibility_activate),
1178 GINT_TO_POINTER(9));
1179 g_signal_connect ((gpointer) zoom_in, "activate",
1180 G_CALLBACK (callbacks_zoom_in_activate),
1181 NULL);
1182 g_signal_connect ((gpointer) zoom_out, "activate",
1183 G_CALLBACK (callbacks_zoom_out_activate),
1184 NULL);
1185 g_signal_connect ((gpointer) fit_to_window, "activate",
1186 G_CALLBACK (callbacks_fit_to_window_activate),
1187 NULL);
1188 g_signal_connect ((gpointer) backgroundColor, "activate",
1189 G_CALLBACK (callbacks_change_background_color_clicked),
1190 NULL);
1191 g_signal_connect ((gpointer) unit_mil, "activate",
1192 G_CALLBACK (callbacks_viewmenu_units_changed),
1193 GINT_TO_POINTER(GERBV_MILS));
1194 g_signal_connect ((gpointer) unit_mm, "activate",
1195 G_CALLBACK (callbacks_viewmenu_units_changed),
1196 GINT_TO_POINTER(GERBV_MMS));
1197 g_signal_connect ((gpointer) unit_in, "activate",
1198 G_CALLBACK (callbacks_viewmenu_units_changed),
1199 GINT_TO_POINTER(GERBV_INS));
1201 /* --- Current Layer menu --- */
1202 g_signal_connect ((gpointer) layer_visibility, "activate", G_CALLBACK (callbacks_toggle_layer_visibility_activate), GINT_TO_POINTER(-1));
1203 g_signal_connect ((gpointer) layer_invert, "activate", G_CALLBACK (callbacks_invert_layer_clicked), NULL);
1204 g_signal_connect ((gpointer) layer_color, "activate", G_CALLBACK (callbacks_change_layer_color_clicked), NULL);
1205 g_signal_connect ((gpointer) layer_reload, "activate", G_CALLBACK (callbacks_reload_layer_clicked), NULL);
1206 g_signal_connect ((gpointer) layer_orientation, "activate", G_CALLBACK (callbacks_change_layer_orientation_clicked), NULL);
1207 g_signal_connect ((gpointer) layer_format, "activate", G_CALLBACK (callbacks_change_layer_format_clicked), NULL);
1208 g_signal_connect ((gpointer) layer_remove, "activate", G_CALLBACK (callbacks_remove_layer_button_clicked), NULL);
1209 g_signal_connect ((gpointer) layer_up, "activate", G_CALLBACK (callbacks_move_layer_up_menu_activate), NULL);
1210 g_signal_connect ((gpointer) layer_down, "activate", G_CALLBACK (callbacks_move_layer_down_menu_activate), NULL);
1212 /* --- Analyze menu --- */
1213 g_signal_connect ((gpointer) analyze_active_gerbers, "activate",
1214 G_CALLBACK (callbacks_analyze_active_gerbers_activate),
1215 NULL);
1216 g_signal_connect ((gpointer) analyze_active_drill, "activate",
1217 G_CALLBACK (callbacks_analyze_active_drill_activate),
1218 NULL);
1219 g_signal_connect ((gpointer) analyze_benchmark, "activate",
1220 G_CALLBACK (callbacks_benchmark_clicked),
1221 NULL);
1224 /* Wait for 2.1
1225 g_signal_connect ((gpointer) control_gerber_options, "activate",
1226 G_CALLBACK (callbacks_control_gerber_options_activate),
1227 NULL);
1230 /* --- Tools menu --- */
1231 g_signal_connect ((gpointer) pointer_tool, "activate",
1232 G_CALLBACK (callbacks_change_tool), (gpointer) 0);
1233 g_signal_connect ((gpointer) pan_tool, "activate",
1234 G_CALLBACK (callbacks_change_tool), (gpointer) 1);
1235 g_signal_connect ((gpointer) zoom_tool, "activate",
1236 G_CALLBACK (callbacks_change_tool), (gpointer) 2);
1237 g_signal_connect ((gpointer) measure_tool, "activate",
1238 G_CALLBACK (callbacks_change_tool), (gpointer) 3);
1240 /* --- Help menu --- */
1242 g_signal_connect ((gpointer) online_manual, "activate",
1243 G_CALLBACK (callbacks_online_manual_activate),
1244 NULL);
1246 g_signal_connect ((gpointer) about, "activate",
1247 G_CALLBACK (callbacks_about_activate),
1248 NULL);
1250 g_signal_connect ((gpointer) bugs_menuitem, "activate",
1251 G_CALLBACK (callbacks_bugs_activate),
1252 NULL);
1254 /* End of Glade generated code */
1255 g_signal_connect ((gpointer) toolbutton_new, "clicked",
1256 G_CALLBACK (callbacks_new_activate),
1257 NULL);
1258 g_signal_connect ((gpointer) toolbutton_save, "clicked",
1259 G_CALLBACK (callbacks_save_project_activate),
1260 NULL);
1261 g_signal_connect ((gpointer) toolbutton_open, "clicked",
1262 G_CALLBACK (callbacks_open_project_activate),
1263 NULL);
1264 g_signal_connect ((gpointer) toolbutton_revert, "clicked",
1265 G_CALLBACK (callbacks_revert_activate),
1266 NULL);
1267 g_signal_connect ((gpointer) clear_messages_button, "clicked",
1268 G_CALLBACK (callbacks_clear_messages_button_clicked),
1269 NULL);
1270 #if GTK_CHECK_VERSION(2,10,0)
1271 g_signal_connect ((gpointer) toolbutton_print, "clicked",
1272 G_CALLBACK (callbacks_print_activate),
1273 NULL);
1274 #endif
1275 g_signal_connect ((gpointer) toolbutton_zoom_in, "clicked",
1276 G_CALLBACK (callbacks_zoom_in_activate),
1277 NULL);
1278 g_signal_connect ((gpointer) toolbutton_zoom_out, "clicked",
1279 G_CALLBACK (callbacks_zoom_out_activate),
1280 NULL);
1281 g_signal_connect ((gpointer) toolbutton_zoom_fit, "clicked",
1282 G_CALLBACK (callbacks_fit_to_window_activate),
1283 NULL);
1284 g_signal_connect ((gpointer) toggletoolbutton_pointer, "clicked",
1285 G_CALLBACK (callbacks_change_tool), (gpointer) 0);
1286 g_signal_connect ((gpointer) toggletoolbutton_pan, "clicked",
1287 G_CALLBACK (callbacks_change_tool), (gpointer) 1);
1288 g_signal_connect ((gpointer) toggletoolbutton_zoom, "clicked",
1289 G_CALLBACK (callbacks_change_tool), (gpointer) 2);
1290 g_signal_connect ((gpointer) toggletoolbutton_measure, "clicked",
1291 G_CALLBACK (callbacks_change_tool), (gpointer) 3);
1293 g_signal_connect ((gpointer) statusUnitComboBox, "changed",
1294 G_CALLBACK (callbacks_statusbar_unit_combo_box_changed),
1295 NULL);
1297 g_signal_connect ((gpointer) button4, "clicked",
1298 G_CALLBACK (callbacks_add_layer_button_clicked), NULL);
1299 g_signal_connect ((gpointer) button7, "clicked",
1300 G_CALLBACK (callbacks_remove_layer_button_clicked), NULL);
1301 g_signal_connect ((gpointer) button5, "clicked",
1302 G_CALLBACK (callbacks_move_layer_down_button_clicked), NULL);
1303 g_signal_connect ((gpointer) button6, "clicked",
1304 G_CALLBACK (callbacks_move_layer_up_button_clicked), NULL);
1306 g_signal_connect ((gpointer) hAdjustment, "value-changed",
1307 G_CALLBACK (callbacks_hadjustment_value_changed), NULL);
1308 g_signal_connect ((gpointer) vAdjustment, "value-changed",
1309 G_CALLBACK (callbacks_vadjustment_value_changed), NULL);
1310 g_signal_connect ((gpointer) hScrollbar, "button-press-event",
1311 G_CALLBACK (callbacks_scrollbar_button_pressed), NULL);
1312 g_signal_connect ((gpointer) hScrollbar, "button-release-event",
1313 G_CALLBACK (callbacks_scrollbar_button_released), NULL);
1314 g_signal_connect ((gpointer) vScrollbar, "button-press-event",
1315 G_CALLBACK (callbacks_scrollbar_button_pressed), NULL);
1316 g_signal_connect ((gpointer) vScrollbar, "button-release-event",
1317 G_CALLBACK (callbacks_scrollbar_button_released), NULL);
1320 if (screen.unit == GERBV_MILS)
1321 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 0);
1322 else if (screen.unit == GERBV_MMS)
1323 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 1);
1324 else
1325 gtk_combo_box_set_active (GTK_COMBO_BOX (statusUnitComboBox), 2);
1327 gint width, height;
1329 gtk_window_add_accel_group (GTK_WINDOW (mainWindow), accel_group);
1331 GtkListStore *list_store;
1333 list_store = gtk_list_store_new (4, G_TYPE_BOOLEAN,
1334 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
1336 GtkWidget *tree;
1338 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
1339 GtkCellRenderer *renderer;
1340 GtkTreeViewColumn *column;
1342 renderer = gtk_cell_renderer_toggle_new ();
1343 column = gtk_tree_view_column_new_with_attributes ("Visible",
1344 renderer,
1345 "active", 0,
1346 NULL);
1347 gtk_tree_view_column_set_min_width ((GtkTreeViewColumn *)column,25);
1348 gtk_signal_connect(GTK_OBJECT(renderer), "toggled",
1349 GTK_SIGNAL_FUNC(callbacks_layer_tree_visibility_button_toggled), NULL);
1350 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1352 renderer = gtk_cell_renderer_pixbuf_new ();
1353 column = gtk_tree_view_column_new_with_attributes ("Color",
1354 renderer,
1355 "pixbuf", 1, NULL);
1356 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1358 renderer = gtk_cell_renderer_text_new ();
1359 g_object_set (G_OBJECT (renderer), "foreground", "red", "xalign", 0.5,
1360 "family", "Times", "size-points", 12.0, NULL);
1361 column = gtk_tree_view_column_new_with_attributes ("Modified",
1362 renderer,
1363 "text", 3,
1364 NULL);
1365 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1366 gtk_tree_view_column_set_min_width ((GtkTreeViewColumn *)column,20);
1368 renderer = gtk_cell_renderer_text_new ();
1369 column = gtk_tree_view_column_new_with_attributes ("Name",
1370 renderer,
1371 "markup", 2,
1372 NULL);
1373 gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
1375 gtk_tree_view_set_headers_visible ((GtkTreeView *)tree, FALSE);
1376 gtk_signal_connect(GTK_OBJECT(tree), "key-press-event",
1377 GTK_SIGNAL_FUNC(callbacks_layer_tree_key_press), NULL);
1378 gtk_signal_connect(GTK_OBJECT(tree), "button-press-event",
1379 GTK_SIGNAL_FUNC(callbacks_layer_tree_button_press), NULL);
1380 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree);
1382 GtkTreeSelection *selection;
1383 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
1384 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
1385 gtk_tree_view_set_enable_search (GTK_TREE_VIEW (tree), FALSE);
1386 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (tree), TRUE);
1388 g_signal_connect (G_OBJECT(list_store), "row-inserted",
1389 G_CALLBACK (callbacks_layer_tree_row_inserted), NULL);
1390 /* steal the focus to the tree to make sure none of the buttons are focused */
1391 gtk_widget_grab_focus (tree);
1393 * Connect all events on drawing area
1395 gtk_signal_connect(GTK_OBJECT(drawingarea), "expose_event",
1396 GTK_SIGNAL_FUNC(callbacks_drawingarea_expose_event), NULL);
1397 gtk_signal_connect(GTK_OBJECT(drawingarea),"configure_event",
1398 GTK_SIGNAL_FUNC(callbacks_drawingarea_configure_event), NULL);
1399 gtk_signal_connect(GTK_OBJECT(drawingarea), "motion_notify_event",
1400 GTK_SIGNAL_FUNC(callbacks_drawingarea_motion_notify_event), NULL);
1401 gtk_signal_connect(GTK_OBJECT(drawingarea), "button_press_event",
1402 GTK_SIGNAL_FUNC(callbacks_drawingarea_button_press_event), NULL);
1403 gtk_signal_connect(GTK_OBJECT(drawingarea), "button_release_event",
1404 GTK_SIGNAL_FUNC(callbacks_drawingarea_button_release_event), NULL);
1405 gtk_signal_connect_after(GTK_OBJECT(mainWindow), "key_press_event",
1406 GTK_SIGNAL_FUNC(callbacks_window_key_press_event), NULL);
1407 gtk_signal_connect_after(GTK_OBJECT(mainWindow), "key_release_event",
1408 GTK_SIGNAL_FUNC(callbacks_window_key_release_event), NULL);
1409 gtk_signal_connect_after(GTK_OBJECT(mainWindow), "scroll_event",
1410 GTK_SIGNAL_FUNC(callbacks_window_scroll_event), NULL);
1411 gtk_signal_connect_after(GTK_OBJECT(mainWindow), "delete_event",
1412 GTK_SIGNAL_FUNC(callbacks_quit_activate), NULL);
1414 gtk_widget_set_events(drawingarea, GDK_EXPOSURE_MASK
1415 | GDK_LEAVE_NOTIFY_MASK
1416 | GDK_ENTER_NOTIFY_MASK
1417 | GDK_BUTTON_PRESS_MASK
1418 | GDK_BUTTON_RELEASE_MASK
1419 | GDK_KEY_PRESS_MASK
1420 | GDK_KEY_RELEASE_MASK
1421 | GDK_POINTER_MOTION_MASK
1422 | GDK_POINTER_MOTION_HINT_MASK
1423 | GDK_SCROLL_MASK
1427 * Set gtk error log handler
1429 g_log_set_handler (NULL,
1430 G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION | G_LOG_LEVEL_MASK,
1431 callbacks_handle_log_messages, NULL);
1434 * Setup some GTK+ defaults.
1435 * These should really be somewhere else.
1437 GdkColor zoom_outline_color = {0, 50000, 50000, 50000};
1438 GdkColor dist_measure_color = {0, 60000, 30000, 65000};
1439 GdkColor selection_color = {0, 65000, 65000, 65000};
1441 screen.zoom_outline_color = zoom_outline_color;
1442 screen.dist_measure_color = dist_measure_color;
1443 screen.selection_color = selection_color;
1445 screen.drawing_area = drawingarea;
1446 screen.win.hAdjustment = hAdjustment;
1447 screen.win.vAdjustment = vAdjustment;
1448 screen.win.hRuler = hRuler;
1449 screen.win.vRuler = vRuler;
1450 screen.win.sidepane_notebook = sidepane_notebook;
1451 screen.win.sidepaneRenderComboBox = GTK_COMBO_BOX(render_combobox);
1452 screen.win.toolButtonPointer = toggletoolbutton_pointer;
1453 screen.win.toolButtonPan = toggletoolbutton_pan;
1454 screen.win.toolButtonZoom = toggletoolbutton_zoom;
1455 screen.win.toolButtonMeasure = toggletoolbutton_measure;
1457 /* make sure tooltips show on gtk <2.12 systems */
1458 gtk_tooltips_enable (tooltips);
1460 * Good defaults according to Ales. Gives aspect ratio of 1.3333...
1462 if ((req_width != -1) && (req_height != -1)) {
1463 width = req_width;
1464 height = req_height;
1466 else {
1467 GdkScreen *screen;
1468 int nmonitors;
1470 screen = gdk_screen_get_default();
1471 nmonitors = gdk_screen_get_n_monitors(screen);
1473 width = gdk_screen_get_width(screen) * 3/4 / nmonitors;
1474 height = gdk_screen_get_height(screen) * 3/4 / nmonitors;
1477 gtk_window_set_default_size((GtkWindow *)mainWindow, width, height);
1479 GtkSettings* gtksettings = gtk_settings_get_default ();
1480 g_object_set (G_OBJECT(gtksettings), "gtk-can-change-accels", TRUE, NULL);
1481 interface_load_accels ();
1482 gtk_widget_show_all (mainWindow);
1483 screen.win.topLevelWindow = mainWindow;
1484 screen.win.messageTextView = message_textview;
1485 screen.win.statusMessageLeft = statusbar_label_left;
1486 screen.win.statusMessageRight = statusbar_label_right;
1487 screen.win.statusUnitComboBox = statusUnitComboBox;
1488 screen.win.layerTree = tree;
1489 screen.win.treeIsUpdating = FALSE;
1491 screen.selectionInfo.selectedNodeArray = g_array_new (FALSE,
1492 FALSE, sizeof(gerbv_selection_item_t));
1493 callbacks_change_tool (NULL, (gpointer) 0);
1494 rename_main_window("",mainWindow);
1496 set_window_icon (mainWindow);
1497 callbacks_update_layer_tree ();
1499 /* connect this signals as late as possible to avoid triggering them before
1500 the gui is drawn */
1501 g_signal_connect ((gpointer) render_fast, "activate",
1502 G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1503 GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK));
1504 g_signal_connect ((gpointer) render_fast_xor, "activate",
1505 G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1506 GINT_TO_POINTER(GERBV_RENDER_TYPE_GDK_XOR));
1507 g_signal_connect ((gpointer) render_normal, "activate",
1508 G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1509 GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_NORMAL));
1510 g_signal_connect ((gpointer) render_hq, "activate",
1511 G_CALLBACK (callbacks_viewmenu_rendertype_changed),
1512 GINT_TO_POINTER(GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY));
1513 g_signal_connect ((gpointer) render_combobox, "changed",
1514 G_CALLBACK (callbacks_sidepane_render_type_combo_box_changed),
1515 NULL);
1516 gtk_main();
1517 interface_save_accels ();
1520 /* ---------------------------------------------------- */
1521 void
1522 interface_set_render_type (int t)
1524 if (t >= GERBV_RENDER_TYPE_MAX)
1525 return;
1527 screenRenderInfo.renderType = t;
1529 /* make sure the interface is already up before calling
1530 * gtk_combo_box_set_active()
1532 if (!screen.win.sidepaneRenderComboBox)
1533 return;
1535 gtk_combo_box_set_active (GTK_COMBO_BOX (screen.win.sidepaneRenderComboBox), t);
1536 gtk_check_menu_item_set_active (screen.win.menu_view_render_group[t], TRUE);
1539 /* ---------------------------------------------------- */
1541 * This dialog box shows a message and two buttons:
1542 * "OK" and "Cancel". It returns gboolean 1 if the
1543 * user clicked "OK", and gboolean 0 if the user
1544 * clicked "Cancel".
1548 gboolean
1549 interface_get_alert_dialog_response (gchar *primaryText, gchar *secondaryText,
1550 gboolean show_checkbox, gboolean *ask_to_show_again )
1551 /* This fcn returns TRUE if the user presses the OK button,
1552 otherwise it returns FALSE. */
1554 /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1555 /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1556 GtkWidget *dialog1;
1557 GtkWidget *dialog_vbox1;
1558 GtkWidget *hbox1;
1559 GtkWidget *image1;
1560 GtkWidget *label1;
1561 GtkWidget *checkbox=NULL;
1562 GtkWidget *dialog_action_area1;
1563 GtkWidget *cancelbutton1;
1564 GtkWidget *okbutton1;
1565 gboolean returnVal = FALSE;
1567 dialog1 = gtk_dialog_new ();
1568 gtk_container_set_border_width (GTK_CONTAINER (dialog1), 6);
1569 gtk_window_set_resizable (GTK_WINDOW (dialog1), FALSE);
1570 gtk_window_set_type_hint (GTK_WINDOW (dialog1), GDK_WINDOW_TYPE_HINT_DIALOG);
1571 gtk_dialog_set_has_separator (GTK_DIALOG (dialog1), FALSE);
1573 dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
1575 hbox1 = gtk_hbox_new (FALSE, 12);
1576 gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox1, TRUE, TRUE, 0);
1577 gtk_container_set_border_width (GTK_CONTAINER (hbox1), 6);
1579 image1 = gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
1580 gtk_box_pack_start (GTK_BOX (hbox1), image1, TRUE, TRUE, 0);
1581 gtk_misc_set_alignment (GTK_MISC (image1), 0.5, 0);
1583 gchar *labelMessage = g_strconcat ("<span weight=\"bold\" size=\"larger\">",primaryText,
1584 "</span>\n<span/>\n",secondaryText,NULL);
1585 label1 = gtk_label_new (labelMessage);
1586 g_free (labelMessage);
1587 GtkWidget *vbox9 = gtk_vbox_new (FALSE, 0);
1588 gtk_box_pack_start (GTK_BOX (vbox9), label1, FALSE, FALSE, 0);
1589 gtk_box_pack_start (GTK_BOX (hbox1), vbox9, FALSE, FALSE, 0);
1590 gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
1591 gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1593 // even with no checkbox, this extra hbox gives the recommended 24 px space between the
1594 // label and the buttons
1595 GtkWidget *hbox2 = gtk_hbox_new (FALSE, 12);
1596 if (show_checkbox) {
1597 GtkWidget *label3 = gtk_label_new (" ");
1599 checkbox = gtk_check_button_new_with_label("Do not show this dialog again.");
1600 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox), FALSE);
1601 gtk_box_pack_start (GTK_BOX (hbox2), label3, FALSE, FALSE, 0);
1602 gtk_box_pack_start (GTK_BOX (hbox2), checkbox, FALSE, FALSE, 0);
1604 gtk_box_pack_start (GTK_BOX (vbox9), hbox2, FALSE, FALSE, 12);
1606 dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
1607 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
1609 cancelbutton1 = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
1610 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancelbutton1, GTK_RESPONSE_CANCEL);
1611 GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
1612 gtk_widget_grab_default (cancelbutton1);
1613 gtk_widget_grab_focus (cancelbutton1);
1615 okbutton1 = gtk_button_new_from_stock (GTK_STOCK_OK);
1616 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1, GTK_RESPONSE_OK);
1617 GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
1619 gtk_widget_show_all (dialog1);
1621 if (gtk_dialog_run ((GtkDialog*)dialog1) == GTK_RESPONSE_OK) {
1622 /* check to see if user clicked on "do not show again" box */
1623 if ((show_checkbox == TRUE) &&
1624 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox)) == TRUE) &&
1625 (ask_to_show_again != NULL) ) {
1626 /* The user clicked the "do not show again box". Set corresponding
1627 * flag to FALSE. */
1628 *ask_to_show_again = FALSE;
1630 returnVal = TRUE;
1632 gtk_widget_destroy (dialog1);
1634 return returnVal;
1639 /* ---------------------------------------------------- */
1641 * This dialog box shows a textmessage and one button:
1642 * "OK". It does not return anything.
1645 void
1646 interface_show_alert_dialog (gchar *primaryText, gchar *secondaryText,
1647 gboolean show_checkbox, gboolean *ask_to_show_again )
1648 /* This fcn tells the user something, and only displays "OK" */
1650 /* Set show_checkbox = TRUE to show "do not show this again" checkbox. */
1651 /* Point ask_to_show_again to the variable to set to not show the checkbox. */
1652 GtkWidget *dialog1;
1653 GtkWidget *dialog_vbox1;
1654 GtkWidget *hbox1;
1655 GtkWidget *image1;
1656 GtkWidget *label1;
1657 GtkWidget *checkbox=NULL;
1658 GtkWidget *dialog_action_area1;
1659 GtkWidget *okbutton1;
1661 dialog1 = gtk_dialog_new ();
1662 gtk_container_set_border_width (GTK_CONTAINER (dialog1), 6);
1663 gtk_window_set_resizable (GTK_WINDOW (dialog1), FALSE);
1664 gtk_window_set_type_hint (GTK_WINDOW (dialog1), GDK_WINDOW_TYPE_HINT_DIALOG);
1665 gtk_dialog_set_has_separator (GTK_DIALOG (dialog1), FALSE);
1667 dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
1669 hbox1 = gtk_hbox_new (FALSE, 12);
1670 gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox1, TRUE, TRUE, 0);
1671 gtk_container_set_border_width (GTK_CONTAINER (hbox1), 6);
1673 image1 = gtk_image_new_from_icon_name (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
1674 gtk_box_pack_start (GTK_BOX (hbox1), image1, TRUE, TRUE, 0);
1675 gtk_misc_set_alignment (GTK_MISC (image1), 0.5, 0);
1677 gchar *labelMessage = g_strconcat ("<span weight=\"bold\" size=\"larger\">",primaryText,
1678 "</span>\n<span/>\n",secondaryText,NULL);
1679 label1 = gtk_label_new (labelMessage);
1680 g_free (labelMessage);
1682 GtkWidget *vbox9 = gtk_vbox_new (FALSE, 0);
1683 gtk_box_pack_start (GTK_BOX (vbox9), label1, FALSE, FALSE, 0);
1684 gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
1685 gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1686 gtk_box_pack_start (GTK_BOX (hbox1), vbox9, FALSE, FALSE, 0);
1688 GtkWidget *hbox2 = gtk_hbox_new (FALSE, 12);
1689 if (show_checkbox) {
1690 GtkWidget *label3 = gtk_label_new (" ");
1692 checkbox = gtk_check_button_new_with_label("Do not show this dialog again.");
1693 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbox), FALSE);
1694 gtk_box_pack_start (GTK_BOX (hbox2), label3, FALSE, FALSE, 0);
1695 gtk_box_pack_start (GTK_BOX (hbox2), checkbox, FALSE, FALSE, 0);
1697 gtk_box_pack_start (GTK_BOX (vbox9), hbox2, FALSE, FALSE, 12);
1699 dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
1700 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
1702 okbutton1 = gtk_button_new_from_stock (GTK_STOCK_OK);
1703 gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1, GTK_RESPONSE_OK);
1704 GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
1706 gtk_widget_show_all (dialog1);
1708 /* check to see if user clicked on "do not show again" box */
1709 if ((show_checkbox == TRUE) &&
1710 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox)) == TRUE) &&
1711 (ask_to_show_again != NULL) ) {
1712 /* The user clicked the "do not show again box". Set corresponding
1713 * flag to FALSE. */
1714 *ask_to_show_again = FALSE;
1717 gtk_dialog_run (GTK_DIALOG(dialog1));
1718 gtk_widget_destroy (dialog1);
1720 return;
1723 void
1724 interface_show_modify_orientation_dialog (gerbv_user_transformation_t *transform,
1725 gerbv_unit_t screenUnit) {
1726 GtkWidget *dialog;
1727 GtkWidget *check1,*check2,*tempWidget,*tempWidget2,*tableWidget;
1728 GtkWidget *spin1,*spin2,*spin3,*spin4,*spin5;
1729 GtkAdjustment *adj;
1730 gerbv_user_transformation_t startTransform = *transform;
1732 dialog = gtk_dialog_new_with_buttons ("Modify layer orientation",
1733 GTK_WINDOW (screen.win.topLevelWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
1734 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE, GTK_STOCK_OK, GTK_RESPONSE_OK,
1735 GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
1736 NULL);
1738 gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
1739 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
1740 gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
1741 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
1743 tableWidget = gtk_table_new (16,3,FALSE);
1744 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tableWidget, FALSE, FALSE, 0);
1746 tempWidget = gtk_label_new (NULL);
1747 gtk_label_set_markup (GTK_LABEL (tempWidget), "<span weight=\"bold\">Translation</span>");
1748 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1749 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,0,1,GTK_EXPAND|GTK_FILL,0,0,5);
1751 tempWidget = gtk_label_new (" ");
1752 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,1,1,2,0,0,0,0);
1753 gdouble translateX, translateY;
1755 if (screenUnit == GERBV_MILS) {
1756 tempWidget = gtk_label_new ("X (mils):");
1757 tempWidget2 = gtk_label_new ("Y (mils):");
1758 translateX = transform->translateX * 1000;
1759 translateY = transform->translateY * 1000;
1761 else if (screen.unit == GERBV_MMS) {
1762 tempWidget = gtk_label_new ("X (mms):");
1763 tempWidget2 = gtk_label_new ("Y (mms):");
1764 translateX = transform->translateX * 25.4;
1765 translateY = transform->translateY * 25.4;
1767 else {
1768 tempWidget = gtk_label_new ("X (inches):");
1769 tempWidget2 = gtk_label_new ("Y (inches):");
1770 translateX = transform->translateX;
1771 translateY = transform->translateY;
1774 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1775 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,1,2,GTK_EXPAND|GTK_FILL,0,0,0);
1776 gtk_misc_set_alignment (GTK_MISC (tempWidget2), 0.0, 0.5);
1777 gtk_table_attach ((GtkTable *) tableWidget, tempWidget2,1,2,2,3,GTK_EXPAND|GTK_FILL,0,0,0);
1778 adj = (GtkAdjustment *) gtk_adjustment_new (translateX, -1000000, 1000000, 1, 10, 0.0);
1779 spin1 = (GtkWidget *) gtk_spin_button_new (adj, 0.1, 4);
1780 gtk_table_attach ((GtkTable *) tableWidget, spin1,2,3,1,2,GTK_FILL,0,0,0);
1781 adj = (GtkAdjustment *) gtk_adjustment_new (translateY, -1000000, 1000000, 1, 10, 0.0);
1782 spin2 = (GtkWidget *) gtk_spin_button_new (adj, 0.1, 4);
1783 gtk_table_attach ((GtkTable *) tableWidget, spin2,2,3,2,3,GTK_FILL,0,0,0);
1785 gtk_table_set_row_spacing ((GtkTable *) tableWidget, 3, 8);
1786 tempWidget = gtk_label_new (NULL);
1787 gtk_label_set_markup (GTK_LABEL (tempWidget), "<span weight=\"bold\">Scale</span>");
1788 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1789 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,4,5,GTK_EXPAND|GTK_FILL,0,0,5);
1791 tempWidget = gtk_label_new ("X direction:");
1792 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1793 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,5,6,GTK_EXPAND|GTK_FILL,0,0,0);
1794 tempWidget = gtk_label_new ("Y direction:");
1795 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1796 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,6,7,GTK_EXPAND|GTK_FILL,0,0,0);
1797 adj = (GtkAdjustment *) gtk_adjustment_new (transform->scaleX, -1000000, 1000000, 1, 10, 0.0);
1798 spin3 = (GtkWidget *) gtk_spin_button_new (adj, 1, 3);
1799 gtk_table_attach ((GtkTable *) tableWidget, spin3,2,3,5,6,GTK_FILL,0,0,0);
1800 adj = (GtkAdjustment *) gtk_adjustment_new (transform->scaleY, -1000000, 1000000, 1, 10, 0.0);
1801 spin4 = (GtkWidget *) gtk_spin_button_new (adj, 1, 3);
1802 gtk_table_attach ((GtkTable *) tableWidget, spin4,2,3,6,7,GTK_FILL,0,0,0);
1804 gtk_table_set_row_spacing ((GtkTable *) tableWidget, 7, 8);
1806 tempWidget = gtk_label_new (NULL);
1807 gtk_label_set_markup (GTK_LABEL (tempWidget), "<span weight=\"bold\">Rotation</span>");
1808 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1809 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,8,9,GTK_EXPAND|GTK_FILL,0,0,5);
1811 tempWidget = gtk_label_new ("Rotation (degrees): ");
1812 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1813 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,9,10,GTK_EXPAND|GTK_FILL,0,0,0);
1814 spin5 = gtk_combo_box_new_text();
1815 gtk_combo_box_append_text ((GtkComboBox *)spin5, "None");
1816 gtk_combo_box_append_text ((GtkComboBox *)spin5, "90 deg CCW");
1817 gtk_combo_box_append_text ((GtkComboBox *)spin5, "180 deg CCW");
1818 gtk_combo_box_append_text ((GtkComboBox *)spin5, "270 deg CCW");
1819 gdouble degreeRotation = transform->rotation/M_PI*180;
1820 if ((degreeRotation < 135)&&(degreeRotation >= 45))
1821 gtk_combo_box_set_active ((GtkComboBox *)spin5, 1);
1822 else if ((degreeRotation < 225)&&(degreeRotation >= 135))
1823 gtk_combo_box_set_active ((GtkComboBox *)spin5, 2);
1824 else if ((degreeRotation < 315)&&(degreeRotation >= 225))
1825 gtk_combo_box_set_active ((GtkComboBox *)spin5, 3);
1826 else
1827 gtk_combo_box_set_active ((GtkComboBox *)spin5, 0);
1829 adj = (GtkAdjustment *) gtk_adjustment_new (transform->rotation/M_PI*180, -1000000, 1000000,
1830 1, 10, 0.0);
1831 spin5 = (GtkWidget *) gtk_spin_button_new (adj, 0, 3);
1833 gtk_table_attach ((GtkTable *) tableWidget, spin5,2,3,9,10,GTK_FILL,0,0,0);
1836 gtk_table_set_row_spacing ((GtkTable *) tableWidget, 10, 8);
1837 tempWidget = gtk_label_new (NULL);
1838 gtk_label_set_markup (GTK_LABEL (tempWidget), "<span weight=\"bold\">Mirroring</span>");
1839 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1840 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,0,2,11,12,GTK_EXPAND|GTK_FILL,0,0,5);
1842 tempWidget = gtk_label_new ("About X axis:");
1843 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1844 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,12,13,GTK_EXPAND|GTK_FILL,0,0,0);
1845 check1 = (GtkWidget *) gtk_check_button_new ();
1846 gtk_toggle_button_set_active ((GtkToggleButton *) check1, transform->mirrorAroundX);
1847 gtk_table_attach ((GtkTable *) tableWidget, check1,2,3,12,13,0,0,0,2);
1849 tempWidget = gtk_label_new ("About Y axis:");
1850 gtk_misc_set_alignment (GTK_MISC (tempWidget), 0.0, 0.5);
1851 gtk_table_attach ((GtkTable *) tableWidget, tempWidget,1,2,13,14,GTK_EXPAND|GTK_FILL,0,0,0);
1852 check2 = (GtkWidget *) gtk_check_button_new ();
1853 gtk_toggle_button_set_active ((GtkToggleButton *) check2, transform->mirrorAroundY);
1854 gtk_table_attach ((GtkTable *) tableWidget, check2,2,3,13,14,0,0,0,2);
1856 gtk_table_set_row_spacing ((GtkTable *) tableWidget, 14, 8);
1857 gtk_widget_show_all (dialog);
1858 gint result = GTK_RESPONSE_APPLY;
1860 // each time the user selects "apply", update the screen and re-enter the dialog loop
1861 while (result == GTK_RESPONSE_APPLY) {
1862 result = gtk_dialog_run (GTK_DIALOG(dialog));
1863 if (result != GTK_RESPONSE_NONE) {
1864 /* extract all the parameters */
1865 if (screenUnit == GERBV_MILS) {
1866 transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1)/
1867 1000;
1868 transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2)/
1869 1000;
1871 else if (screen.unit == GERBV_MMS) {
1872 transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1)/
1873 25.4;
1874 transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2)/
1875 25.4;
1877 else {
1878 transform->translateX = gtk_spin_button_get_value ((GtkSpinButton *) spin1);
1879 transform->translateY = gtk_spin_button_get_value ((GtkSpinButton *) spin2);
1881 transform->scaleX = gtk_spin_button_get_value ((GtkSpinButton *)spin3);
1882 transform->scaleY = gtk_spin_button_get_value ((GtkSpinButton *)spin4);
1883 gint rotationIndex = gtk_combo_box_get_active ((GtkComboBox *)spin5);
1884 if (rotationIndex == 0)
1885 transform->rotation = 0;
1886 else if (rotationIndex == 1)
1887 transform->rotation = 90.0/180*M_PI;
1888 else if (rotationIndex == 2)
1889 transform->rotation = 180.0/180*M_PI;
1890 else if (rotationIndex == 3)
1891 transform->rotation = 270.0/180*M_PI;
1892 transform->mirrorAroundX = gtk_toggle_button_get_active ((GtkToggleButton *) check1);
1893 transform->mirrorAroundY = gtk_toggle_button_get_active ((GtkToggleButton *) check2);
1895 render_refresh_rendered_image_on_screen ();
1896 callbacks_update_layer_tree ();
1899 if (result == GTK_RESPONSE_NONE) {
1900 // revert back to the start values if the user cancelled
1901 *transform = startTransform;
1903 gtk_widget_destroy (dialog);
1905 return;