1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1998 Alexander Larsson
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 #include "layer_dialog.h"
26 #include "interface.h"
29 #include "preferences.h"
32 #include "diagram_tree_window.h"
34 #include <gdk-pixbuf/gdk-pixbuf.h>
36 static const GtkTargetEntry create_object_targets
[] = {
37 { "application/x-dia-object", 0, 0 },
40 ToolButton tool_data
[] =
42 { (char **) arrow_xpm
,
43 N_("Modify object(s)"),
45 { MODIFY_TOOL
, NULL
, NULL
}
47 { (char **) magnify_xpm
,
50 { MAGNIFY_TOOL
, NULL
, NULL
}
52 { (char **) scroll_xpm
,
53 N_("Scroll around the diagram"),
55 { SCROLL_TOOL
, NULL
, NULL
}
60 { CREATE_OBJECT_TOOL
, "Standard - Text", NULL
}
65 { CREATE_OBJECT_TOOL
, "Standard - Box", NULL
}
70 { CREATE_OBJECT_TOOL
, "Standard - Ellipse", NULL
}
75 { CREATE_OBJECT_TOOL
, "Standard - Polygon", NULL
}
80 { CREATE_OBJECT_TOOL
, "Standard - Beziergon", NULL
}
85 { CREATE_OBJECT_TOOL
, "Standard - Line", NULL
}
90 { CREATE_OBJECT_TOOL
, "Standard - Arc", NULL
}
95 { CREATE_OBJECT_TOOL
, "Standard - ZigZagLine", NULL
}
100 { CREATE_OBJECT_TOOL
, "Standard - PolyLine", NULL
}
105 { CREATE_OBJECT_TOOL
, "Standard - BezierLine", NULL
}
110 { CREATE_OBJECT_TOOL
, "Standard - Image", NULL
}
114 #define NUM_TOOLS (sizeof (tool_data) / sizeof (ToolButton))
115 const int num_tools
= NUM_TOOLS
;
120 static GtkWidget
*toolbox_shell
= NULL
;
121 static GtkWidget
*tool_widgets
[NUM_TOOLS
];
122 /*static*/ GtkTooltips
*tool_tips
;
123 static GSList
*tool_group
= NULL
;
125 GtkWidget
*modify_tool_button
;
128 grid_toggle_snap(GtkWidget
*widget
, gpointer data
)
130 DDisplay
*ddisp
= (DDisplay
*)data
;
131 ddisplay_set_snap_to_grid(ddisp
,
132 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget
)));
135 /* The popup shell is a pointer to the display shell that posted the latest
136 * popup menu. When this is null, and a command is invoked, then the
137 * assumption is that the command was a result of a keyboard accelerator
139 GtkWidget
*popup_shell
= NULL
;
142 origin_button_press(GtkWidget
*widget
, GdkEventButton
*event
, gpointer data
)
144 DDisplay
*ddisp
= (DDisplay
*)data
;
146 display_set_active(ddisp
);
147 ddisplay_popup_menu(ddisp
, event
);
149 /* stop the signal emission so the button doesn't grab the
151 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget
), "button_press_event");
157 zoom_activate_callback(GtkWidget
*item
, gpointer user_data
) {
158 DDisplay
*ddisp
= (DDisplay
*)user_data
;
159 const gchar
*zoom_text
=
160 gtk_entry_get_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(ddisp
->zoom_status
))));
161 float zoom_amount
, magnify
;
162 gchar
*zoomamount
= g_object_get_data(G_OBJECT(item
), "zoomamount");
163 if (zoomamount
!= NULL
) {
164 zoom_text
= zoomamount
;
167 if (sscanf(zoom_text
, "%f", &zoom_amount
) == 1) {
171 magnify
= (zoom_amount
*DDISPLAY_NORMAL_ZOOM
/100.0)/ddisp
->zoom_factor
;
172 if (fabs(magnify
- 1.0) > 0.000001) {
173 visible
= &ddisp
->visible
;
174 middle
.x
= visible
->left
*0.5 + visible
->right
*0.5;
175 middle
.y
= visible
->top
*0.5 + visible
->bottom
*0.5;
176 ddisplay_zoom(ddisp
, &middle
, magnify
);
182 zoom_add_zoom_amount(GtkWidget
*menu
, gchar
*text
, DDisplay
*ddisp
) {
183 GtkWidget
*menuitem
= gtk_menu_item_new_with_label(text
);
184 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), menuitem
);
185 gtk_signal_connect(GTK_OBJECT(menuitem
),
186 "activate", (GtkSignalFunc
)zoom_activate_callback
,
188 g_object_set_data(G_OBJECT(menuitem
), "zoomamount", text
);
192 zoom_popup_menu(GtkWidget
*button
, GdkEventButton
*event
, gpointer user_data
) {
193 /* display_set_active(ddisp); */
194 /* ddisplay_popup_menu(ddisp, event); */
196 GtkMenu
*menu
= GTK_MENU(user_data
);
198 gtk_menu_popup(menu
, NULL
, NULL
, NULL
, NULL
,
199 event
->button
, event
->time
);
200 /* stop the signal emission so the button doesn't grab the
202 gtk_signal_emit_stop_by_name(GTK_OBJECT(button
), "button_press_event");
206 create_zoom_widget(DDisplay
*ddisp
) {
213 combo
= gtk_hbox_new(FALSE
, 0);
214 entry
= gtk_entry_new();
215 gtk_signal_connect (GTK_OBJECT (entry
), "activate",
216 (GtkSignalFunc
) zoom_activate_callback
,
218 gtk_box_pack_start_defaults(GTK_BOX(combo
), entry
);
219 gtk_object_set_user_data(GTK_OBJECT(combo
), entry
);
220 gtk_entry_set_width_chars(GTK_ENTRY(entry
), 8);
221 gtk_widget_show(entry
);
223 button
= gtk_button_new();
224 GTK_WIDGET_UNSET_FLAGS(button
, GTK_CAN_FOCUS
);
225 arrow
= gtk_arrow_new(GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
226 gtk_container_add(GTK_CONTAINER(button
), arrow
);
227 gtk_box_pack_start_defaults(GTK_BOX(combo
), button
);
228 gtk_object_set_user_data(GTK_OBJECT(combo
), entry
);
229 gtk_widget_show_all(button
);
231 menu
= gtk_menu_new();
232 zoom_add_zoom_amount(menu
, "400%", ddisp
);
233 zoom_add_zoom_amount(menu
, "283%", ddisp
);
234 zoom_add_zoom_amount(menu
, "200%", ddisp
);
235 zoom_add_zoom_amount(menu
, "141%", ddisp
);
236 zoom_add_zoom_amount(menu
, "100%", ddisp
);
237 zoom_add_zoom_amount(menu
, "85%", ddisp
);
238 zoom_add_zoom_amount(menu
, "70.7%", ddisp
);
239 zoom_add_zoom_amount(menu
, "50%", ddisp
);
240 zoom_add_zoom_amount(menu
, "35.4%", ddisp
);
241 zoom_add_zoom_amount(menu
, "25%", ddisp
);
243 gtk_widget_show_all(menu
);
245 gtk_signal_connect (GTK_OBJECT (button
), "button_press_event",
246 (GtkSignalFunc
) zoom_popup_menu
,
253 display_drop_callback(GtkWidget
*widget
, GdkDragContext
*context
,
254 gint x
, gint y
, guint time
)
256 if (gtk_drag_get_source_widget(context
) != NULL
) {
257 /* we only accept drops from the same instance of the application,
258 * as the drag data is a pointer in our address space */
261 gtk_drag_finish (context
, FALSE
, FALSE
, time
);
266 display_data_received_callback (GtkWidget
*widget
, GdkDragContext
*context
,
267 gint x
, gint y
, GtkSelectionData
*data
,
268 guint info
, guint time
, DDisplay
*ddisp
)
270 if (data
->format
== 8 && data
->length
== sizeof(ToolButtonData
*) &&
271 gtk_drag_get_source_widget(context
) != NULL
) {
272 ToolButtonData
*tooldata
= *(ToolButtonData
**)data
->data
;
274 /* g_message("Tool drop %s at (%d, %d)", (gchar *)tooldata->extra_data, x, y);*/
275 ddisplay_drop_object(ddisp
, x
, y
,
276 object_get_type((gchar
*)tooldata
->extra_data
),
277 tooldata
->user_data
);
279 gtk_drag_finish (context
, TRUE
, FALSE
, time
);
281 gtk_drag_finish (context
, FALSE
, FALSE
, time
);
285 create_display_shell(DDisplay
*ddisp
,
286 int width
, int height
,
287 char *title
, int use_mbar
, int top_level_window
)
289 GtkWidget
*table
, *widget
;
290 GtkWidget
*status_hbox
;
291 GtkWidget
*root_vbox
= NULL
;
292 GtkWidget
*zoom_hbox
, *zoom_label
;
293 int s_width
, s_height
;
295 s_width
= gdk_screen_width ();
296 s_height
= gdk_screen_height ();
299 if (height
> s_height
)
302 /* The adjustment datums */
303 ddisp
->hsbdata
= GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, width
, 1, (width
-1)/4, width
-1));
304 ddisp
->vsbdata
= GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height
, 1, (height
-1)/4, height
-1));
306 /* The toplevel shell */
307 if (top_level_window
) {
308 ddisp
->shell
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
309 gtk_window_set_title (GTK_WINDOW (ddisp
->shell
), title
);
310 gtk_window_set_role (GTK_WINDOW (ddisp
->shell
), "diagram_window");
312 ddisp
->shell
= gtk_event_box_new ();
314 gtk_object_set_user_data (GTK_OBJECT (ddisp
->shell
), (gpointer
) ddisp
);
316 gtk_widget_set_events (ddisp
->shell
,
317 GDK_POINTER_MOTION_MASK
|
318 GDK_POINTER_MOTION_HINT_MASK
|
319 GDK_FOCUS_CHANGE_MASK
);
320 /* GDK_ALL_EVENTS_MASK */
322 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "delete_event",
323 GTK_SIGNAL_FUNC (ddisplay_delete
),
325 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "destroy",
326 GTK_SIGNAL_FUNC (ddisplay_destroy
),
328 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "focus_out_event",
329 GTK_SIGNAL_FUNC (ddisplay_focus_out_event
),
331 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "focus_in_event",
332 GTK_SIGNAL_FUNC (ddisplay_focus_in_event
),
334 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "realize",
335 GTK_SIGNAL_FUNC (ddisplay_realize
),
337 gtk_signal_connect (GTK_OBJECT (ddisp
->shell
), "unrealize",
338 GTK_SIGNAL_FUNC (ddisplay_unrealize
),
341 gtk_signal_connect (GTK_OBJECT (ddisp->shell), "size_allocate",
342 GTK_SIGNAL_FUNC (ddisplay_size_allocate),
346 /* the table containing all widgets */
347 table
= gtk_table_new (4, 3, FALSE
);
348 gtk_table_set_col_spacing (GTK_TABLE (table
), 0, 1);
349 gtk_table_set_col_spacing (GTK_TABLE (table
), 1, 2);
350 gtk_table_set_row_spacing (GTK_TABLE (table
), 0, 1);
351 gtk_table_set_row_spacing (GTK_TABLE (table
), 1, 2);
352 gtk_container_set_border_width (GTK_CONTAINER (table
), 2);
355 root_vbox
= gtk_vbox_new (FALSE
, 1);
356 gtk_container_add (GTK_CONTAINER (ddisp
->shell
), root_vbox
);
357 gtk_box_pack_end (GTK_BOX (root_vbox
), table
, TRUE
, TRUE
, 0);
361 gtk_container_add (GTK_CONTAINER (ddisp
->shell
), table
);
365 /* scrollbars, rulers, canvas, menu popup button */
367 ddisp
->origin
= gtk_button_new();
368 GTK_WIDGET_UNSET_FLAGS(ddisp
->origin
, GTK_CAN_FOCUS
);
369 widget
= gtk_arrow_new(GTK_ARROW_RIGHT
, GTK_SHADOW_OUT
);
370 gtk_container_add(GTK_CONTAINER(ddisp
->origin
), widget
);
371 gtk_tooltips_set_tip(tool_tips
, widget
, _("Diagram menu."), NULL
);
372 gtk_widget_show(widget
);
373 gtk_signal_connect(GTK_OBJECT(ddisp
->origin
), "button_press_event",
374 GTK_SIGNAL_FUNC(origin_button_press
), ddisp
);
377 ddisp
->origin
= gtk_frame_new (NULL
);
378 gtk_frame_set_shadow_type (GTK_FRAME (ddisp
->origin
), GTK_SHADOW_OUT
);
382 ddisp
->hrule
= gtk_hruler_new ();
383 gtk_signal_connect_object (GTK_OBJECT (ddisp
->shell
), "motion_notify_event",
384 (GtkSignalFunc
) GTK_WIDGET_GET_CLASS (ddisp
->hrule
)->motion_notify_event
,
385 GTK_OBJECT (ddisp
->hrule
));
387 ddisp
->vrule
= gtk_vruler_new ();
388 gtk_signal_connect_object (GTK_OBJECT (ddisp
->shell
), "motion_notify_event",
389 (GtkSignalFunc
) GTK_WIDGET_GET_CLASS (ddisp
->vrule
)->motion_notify_event
,
390 GTK_OBJECT (ddisp
->vrule
));
392 ddisp
->hsb
= gtk_hscrollbar_new (ddisp
->hsbdata
);
393 GTK_WIDGET_UNSET_FLAGS (ddisp
->hsb
, GTK_CAN_FOCUS
);
394 ddisp
->vsb
= gtk_vscrollbar_new (ddisp
->vsbdata
);
395 GTK_WIDGET_UNSET_FLAGS (ddisp
->vsb
, GTK_CAN_FOCUS
);
398 /* set up the scrollbar observers */
399 gtk_signal_connect (GTK_OBJECT (ddisp
->hsbdata
), "value_changed",
400 (GtkSignalFunc
) ddisplay_hsb_update
,
402 gtk_signal_connect (GTK_OBJECT (ddisp
->vsbdata
), "value_changed",
403 (GtkSignalFunc
) ddisplay_vsb_update
,
406 ddisp
->canvas
= gtk_drawing_area_new ();
407 /* Dia's canvas does it' double buffering alone so switch off GTK's */
408 gtk_widget_set_double_buffered (ddisp
->canvas
, FALSE
);
409 gtk_drawing_area_size (GTK_DRAWING_AREA (ddisp
->canvas
), width
, height
);
410 gtk_widget_set_events (ddisp
->canvas
, CANVAS_EVENT_MASK
);
411 GTK_WIDGET_SET_FLAGS (ddisp
->canvas
, GTK_CAN_FOCUS
);
412 gtk_signal_connect (GTK_OBJECT (ddisp
->canvas
), "event",
413 (GtkSignalFunc
) ddisplay_canvas_events
,
416 gtk_drag_dest_set(ddisp
->canvas
, GTK_DEST_DEFAULT_ALL
,
417 create_object_targets
, 1, GDK_ACTION_COPY
);
418 gtk_signal_connect (GTK_OBJECT (ddisp
->canvas
), "drag_drop",
419 GTK_SIGNAL_FUNC(display_drop_callback
), NULL
);
420 gtk_signal_connect (GTK_OBJECT (ddisp
->canvas
), "drag_data_received",
421 GTK_SIGNAL_FUNC(display_data_received_callback
), ddisp
);
423 gtk_object_set_user_data (GTK_OBJECT (ddisp
->canvas
), (gpointer
) ddisp
);
424 /* pack all the widgets */
425 gtk_table_attach (GTK_TABLE (table
), ddisp
->origin
, 0, 1, 0, 1,
426 GTK_FILL
, GTK_FILL
, 0, 0);
427 gtk_table_attach (GTK_TABLE (table
), ddisp
->hrule
, 1, 2, 0, 1,
428 GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
429 gtk_table_attach (GTK_TABLE (table
), ddisp
->vrule
, 0, 1, 1, 2,
430 GTK_FILL
, GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
, 0, 0);
431 gtk_table_attach (GTK_TABLE (table
), ddisp
->canvas
, 1, 2, 1, 2,
432 GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
,
433 GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
, 0, 0);
434 gtk_table_attach (GTK_TABLE (table
), ddisp
->hsb
, 0, 2, 2, 3,
435 GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
, GTK_FILL
, 0, 0);
436 gtk_table_attach (GTK_TABLE (table
), ddisp
->vsb
, 2, 3, 0, 2,
437 GTK_FILL
, GTK_EXPAND
| GTK_SHRINK
| GTK_FILL
, 0, 0);
439 menus_get_image_menu (NULL
, &ddisp
->accel_group
);
440 if (top_level_window
)
441 gtk_window_add_accel_group(GTK_WINDOW(ddisp
->shell
), ddisp
->accel_group
);
445 char *display
= "<DisplayMBar>";
447 menus_get_image_menubar(&ddisp
->menu_bar
, &ddisp
->mbar_item_factory
);
448 gtk_box_pack_start (GTK_BOX (root_vbox
), ddisp
->menu_bar
, FALSE
, TRUE
, 0);
450 path
= g_string_new (display
);
451 g_string_append (path
,"/View/Show Rulers");
452 ddisp
->rulers
= menus_get_item_from_path(path
->str
, ddisp
->mbar_item_factory
);
453 g_string_append (g_string_assign(path
, display
),"/View/Show Grid");
454 ddisp
->visible_grid
= menus_get_item_from_path(path
->str
, ddisp
->mbar_item_factory
);
455 g_string_append (g_string_assign(path
, display
),"/View/Snap To Grid");
456 ddisp
->snap_to_grid
= menus_get_item_from_path(path
->str
, ddisp
->mbar_item_factory
);
457 g_string_append (g_string_assign(path
, display
),"/View/Show Connection Points");
458 ddisp
->show_cx_pts_mitem
= menus_get_item_from_path(path
->str
, ddisp
->mbar_item_factory
);
461 g_string_append (g_string_assign(path
, display
),"/View/AntiAliased");
462 ddisp
->antialiased
= menus_get_item_from_path(path
->str
, ddisp
->mbar_item_factory
);
465 menus_initialize_updatable_items (&ddisp
->updatable_menu_items
, ddisp
->mbar_item_factory
, display
);
466 g_string_free (path
,FALSE
);
470 status_hbox
= gtk_hbox_new (FALSE
, 2);
473 gtk_signal_connect(GTK_OBJECT(ddisp->origin), "button_press_event",
474 GTK_SIGNAL_FUNC(origin_button_press), ddisp);
477 /* Zoom status pseudo-optionmenu */
478 ddisp
->zoom_status
= create_zoom_widget(ddisp
);
479 zoom_hbox
= gtk_hbox_new(FALSE
, 0);
480 zoom_label
= gtk_label_new(_("Zoom"));
481 gtk_box_pack_start (GTK_BOX(zoom_hbox
), zoom_label
,
483 gtk_box_pack_start (GTK_BOX(zoom_hbox
), ddisp
->zoom_status
,
486 gtk_box_pack_start (GTK_BOX (status_hbox
), zoom_hbox
, FALSE
, FALSE
, 0);
488 /* Grid on/off button */
489 ddisp
->grid_status
= gtk_toggle_button_new();
491 g_signal_connect(G_OBJECT(ddisp
->grid_status
), "toggled",
492 grid_toggle_snap
, ddisp
);
493 gtk_tooltips_set_tip(tool_tips
, ddisp
->grid_status
,
494 _("Toggles snap-to-grid for this window."), NULL
);
495 gtk_box_pack_start (GTK_BOX (status_hbox
), ddisp
->grid_status
,
499 ddisp
->modified_status
= gtk_statusbar_new ();
501 gtk_box_pack_start (GTK_BOX (status_hbox
), ddisp
->modified_status
,
504 gtk_table_attach (GTK_TABLE (table
), status_hbox
, 0, 3, 3, 4,
505 GTK_FILL
, GTK_FILL
, 0, 0);
507 gtk_widget_show (ddisp
->hsb
);
508 gtk_widget_show (ddisp
->vsb
);
509 gtk_widget_show (ddisp
->origin
);
510 gtk_widget_show (ddisp
->hrule
);
511 gtk_widget_show (ddisp
->vrule
);
512 gtk_widget_show (ddisp
->canvas
);
513 gtk_widget_show (ddisp
->zoom_status
);
514 gtk_widget_show (zoom_hbox
);
515 gtk_widget_show (zoom_label
);
516 gtk_widget_show (ddisp
->grid_status
);
517 gtk_widget_show (ddisp
->modified_status
);
518 gtk_widget_show (status_hbox
);
519 gtk_widget_show (table
);
522 gtk_widget_show (ddisp
->menu_bar
);
523 gtk_widget_show (root_vbox
);
525 gtk_widget_show (ddisp
->shell
);
527 /* set the focus to the canvas area */
528 gtk_widget_grab_focus (ddisp
->canvas
);
532 tool_select_update (GtkWidget
*w
,
535 ToolButtonData
*tooldata
= (ToolButtonData
*) data
;
537 if (tooldata
== NULL
) {
538 g_warning(_("NULL tooldata in tool_select_update"));
542 if (tooldata
->type
!= -1) {
544 GdkModifierType mask
;
545 /* get the modifiers */
546 gdk_window_get_pointer (gtk_widget_get_parent_window(w
), &x
, &y
, &mask
);
547 tool_select (tooldata
->type
, tooldata
->extra_data
, tooldata
->user_data
,
553 tool_button_press (GtkWidget
*w
,
554 GdkEventButton
*event
,
557 ToolButtonData
*tooldata
= (ToolButtonData
*) data
;
559 if ((event
->type
== GDK_2BUTTON_PRESS
) &&
560 (event
->button
== 1)) {
561 tool_options_dialog_show (tooldata
->type
, tooldata
->extra_data
,
562 tooldata
->user_data
, w
, event
->state
&1);
570 tool_drag_data_get (GtkWidget
*widget
, GdkDragContext
*context
,
571 GtkSelectionData
*selection_data
, guint info
,
572 guint32 time
, ToolButtonData
*tooldata
)
575 gtk_selection_data_set(selection_data
, selection_data
->target
,
576 8, (guchar
*)&tooldata
, sizeof(ToolButtonData
*));
581 tool_setup_drag_source(GtkWidget
*button
, ToolButtonData
*tooldata
,
582 GdkPixmap
*pixmap
, GdkBitmap
*mask
)
584 g_return_if_fail(tooldata
->type
== CREATE_OBJECT_TOOL
);
586 gtk_drag_source_set(button
, GDK_BUTTON1_MASK
,
587 create_object_targets
, 1,
588 GDK_ACTION_DEFAULT
|GDK_ACTION_COPY
);
589 gtk_signal_connect(GTK_OBJECT(button
), "drag_data_get",
590 GTK_SIGNAL_FUNC(tool_drag_data_get
), tooldata
);
592 gtk_drag_source_set_icon(button
, gtk_widget_get_colormap(button
),
598 tool_select_callback(GtkWidget *widget, gpointer data) {
599 ToolButtonData *tooldata = (ToolButtonData *)data;
601 if (tooldata == NULL) {
602 g_warning("NULL tooldata in tool_select_callback");
606 if (tooldata->type != -1) {
607 tool_select (tooldata->type, tooldata->extra_data,
608 tooldata->user_data,widget);
614 create_tools(GtkWidget
*parent
)
617 GtkWidget
*pixmapwidget
;
624 for (i
= 0; i
< NUM_TOOLS
; i
++) {
625 tool_widgets
[i
] = button
= gtk_radio_button_new (tool_group
);
626 gtk_container_set_border_width (GTK_CONTAINER (button
), 0);
627 tool_group
= gtk_radio_button_group (GTK_RADIO_BUTTON (button
));
628 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), FALSE
);
630 gtk_wrap_box_pack(GTK_WRAP_BOX(parent
), button
,
631 TRUE
, TRUE
, FALSE
, TRUE
);
633 if (tool_data
[i
].callback_data
.type
== MODIFY_TOOL
) {
634 modify_tool_button
= GTK_WIDGET(button
);
637 if (tool_data
[i
].icon_data
==NULL
) {
640 object_get_type((char *)tool_data
[i
].callback_data
.extra_data
);
642 pixmap_data
= tool_data
[0].icon_data
;
644 pixmap_data
= type
->pixmap
;
646 pixmap_data
= tool_data
[i
].icon_data
;
649 style
= gtk_widget_get_style(button
);
650 pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
651 gtk_widget_get_colormap(button
), &mask
,
652 &style
->bg
[GTK_STATE_NORMAL
], pixmap_data
);
654 pixmapwidget
= gtk_pixmap_new(pixmap
, mask
);
656 /* GTKBUG:? padding changes */
657 gtk_misc_set_padding(GTK_MISC(pixmapwidget
), 2, 2);
659 gtk_container_add (GTK_CONTAINER (button
), pixmapwidget
);
661 gtk_signal_connect (GTK_OBJECT (button
), "clicked",
662 GTK_SIGNAL_FUNC (tool_select_update
),
663 &tool_data
[i
].callback_data
);
665 gtk_signal_connect (GTK_OBJECT (button
), "button_press_event",
666 GTK_SIGNAL_FUNC (tool_button_press
),
667 &tool_data
[i
].callback_data
);
669 if (tool_data
[i
].callback_data
.type
== CREATE_OBJECT_TOOL
)
670 tool_setup_drag_source(button
, &tool_data
[i
].callback_data
,
673 gdk_pixmap_unref(pixmap
);
674 if (mask
) gdk_bitmap_unref(mask
);
676 tool_data
[i
].callback_data
.widget
= button
;
678 gtk_tooltips_set_tip (tool_tips
, button
,
679 gettext(tool_data
[i
].tool_desc
), NULL
);
681 gtk_widget_show (pixmapwidget
);
682 gtk_widget_show (button
);
686 static GtkWidget
*sheet_option_menu
;
687 static GtkWidget
*sheet_menu
;
688 static GtkWidget
*sheet_wbox
;
692 create_sheet_page(GtkWidget
*parent
, Sheet
*sheet
)
695 SheetObject
*sheet_obj
;
698 GtkWidget
*pixmapwidget
;
701 ToolButtonData
*data
;
703 GtkWidget
*scrolled_window
;
707 scrolled_window
= gtk_scrolled_window_new(NULL
, NULL
);
708 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scrolled_window
),
709 GTK_POLICY_AUTOMATIC
,
710 GTK_POLICY_AUTOMATIC
);
712 rows
= ceil(g_slist_length(sheet
->objects
) / (double)COLUMNS
);
716 table
= gtk_hwrap_box_new(FALSE
);
717 gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(table
), COLUMNS
* 1.0 / rows
);
718 gtk_wrap_box_set_justify(GTK_WRAP_BOX(table
), GTK_JUSTIFY_TOP
);
719 gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(table
), GTK_JUSTIFY_LEFT
);
721 style
= gtk_widget_get_style(parent
);
724 list
= sheet
->objects
;
725 while (list
!= NULL
) {
726 sheet_obj
= (SheetObject
*) list
->data
;
729 if (sheet_obj
->pixmap
!= NULL
) {
730 pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
731 gtk_widget_get_colormap(parent
), &mask
,
732 &style
->bg
[GTK_STATE_NORMAL
], sheet_obj
->pixmap
);
733 } else if (sheet_obj
->pixmap_file
!= NULL
) {
734 pixmap
= gdk_pixmap_colormap_create_from_xpm(NULL
,
735 gtk_widget_get_colormap(parent
), &mask
,
736 &style
->bg
[GTK_STATE_NORMAL
], sheet_obj
->pixmap_file
);
739 type
= object_get_type(sheet_obj
->object_type
);
740 pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
741 gtk_widget_get_colormap(parent
), &mask
,
742 &style
->bg
[GTK_STATE_NORMAL
], type
->pixmap
);
745 pixmapwidget
= gtk_pixmap_new(pixmap
, mask
);
748 button
= gtk_radio_button_new (tool_group
);
749 gtk_container_set_border_width (GTK_CONTAINER (button
), 0);
750 tool_group
= gtk_radio_button_group (GTK_RADIO_BUTTON (button
));
752 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), FALSE
);
755 gtk_container_add (GTK_CONTAINER (button
), pixmapwidget
);
756 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(table
), button
,
757 FALSE
, TRUE
, FALSE
, sheet_obj
->line_break
);
759 /* This is a Memory leak, these can't be freed.
760 Doesn't matter much anyway... */
762 data
= g_new(ToolButtonData
, 1);
763 data
->type
= CREATE_OBJECT_TOOL
;
764 data
->extra_data
= sheet_obj
->object_type
;
765 data
->user_data
= sheet_obj
->user_data
;
767 gtk_signal_connect (GTK_OBJECT (button
), "clicked",
768 GTK_SIGNAL_FUNC (tool_select_update
),
771 gtk_signal_connect (GTK_OBJECT (button
), "button_press_event",
772 GTK_SIGNAL_FUNC (tool_button_press
),
775 gtk_tooltips_set_tip (tool_tips
, button
,
776 gettext(sheet_obj
->description
), NULL
);
778 list
= g_slist_next(list
);
782 gtk_widget_show(table
);
783 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window
), table
);
785 return scrolled_window
;
789 gchar
*interface_current_sheet_name
;
792 fill_sheet_wbox(GtkWidget
*menu_item
, Sheet
*sheet
)
797 GtkWidget
*first_button
= NULL
;
799 gtk_container_foreach(GTK_CONTAINER(sheet_wbox
),
800 (GtkCallback
)gtk_widget_destroy
, NULL
);
801 tool_group
= gtk_radio_button_group(GTK_RADIO_BUTTON(tool_widgets
[0]));
803 /* Remember sheet 'name' for 'Sheets and Objects' dialog */
804 interface_current_sheet_name
= sheet
->name
;
806 /* set the aspect ratio on the wbox */
807 rows
= ceil(g_slist_length(sheet
->objects
) / (double)COLUMNS
);
808 if (rows
<1) rows
= 1;
809 gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(sheet_wbox
),
810 COLUMNS
* 1.0 / rows
);
811 style
= gtk_widget_get_style(sheet_wbox
);
812 for (tmp
= sheet
->objects
; tmp
!= NULL
; tmp
= tmp
->next
) {
813 SheetObject
*sheet_obj
= tmp
->data
;
814 GdkPixmap
*pixmap
= NULL
;
815 GdkBitmap
*mask
= NULL
;
816 GtkWidget
*pixmapwidget
;
818 ToolButtonData
*data
;
820 if (sheet_obj
->pixmap
!= NULL
) {
821 pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
822 gtk_widget_get_colormap(sheet_wbox
), &mask
,
823 &style
->bg
[GTK_STATE_NORMAL
], sheet_obj
->pixmap
);
824 } else if (sheet_obj
->pixmap_file
!= NULL
) {
826 GError
* gerror
= NULL
;
828 pixbuf
= gdk_pixbuf_new_from_file(sheet_obj
->pixmap_file
, &gerror
);
829 if (pixbuf
!= NULL
) {
830 gdk_pixbuf_render_pixmap_and_mask(pixbuf
, &pixmap
, &mask
, 1.0);
831 gdk_pixbuf_unref(pixbuf
);
834 g_warning("failed to load pixbuf for file %s; cause=%s",
835 sheet_obj
->pixmap_file
,gerror
?gerror
->message
:"[NULL]");
839 type
= object_get_type(sheet_obj
->object_type
);
840 pixmap
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
841 gtk_widget_get_colormap(sheet_wbox
), &mask
,
842 &style
->bg
[GTK_STATE_NORMAL
], type
->pixmap
);
845 pixmapwidget
= gtk_pixmap_new(pixmap
, mask
);
846 gdk_pixmap_unref(pixmap
);
847 if (mask
) gdk_bitmap_unref(mask
);
849 pixmapwidget
= gtk_type_new(gtk_pixmap_get_type());
852 button
= gtk_radio_button_new (tool_group
);
853 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), FALSE
);
854 gtk_container_set_border_width (GTK_CONTAINER (button
), 0);
855 tool_group
= gtk_radio_button_group (GTK_RADIO_BUTTON (button
));
857 gtk_container_add (GTK_CONTAINER (button
), pixmapwidget
);
858 gtk_widget_show(pixmapwidget
);
860 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(sheet_wbox
), button
,
861 FALSE
, TRUE
, FALSE
, TRUE
, sheet_obj
->line_break
);
862 gtk_widget_show(button
);
864 data
= g_new(ToolButtonData
, 1);
865 data
->type
= CREATE_OBJECT_TOOL
;
866 data
->extra_data
= sheet_obj
->object_type
;
867 data
->user_data
= sheet_obj
->user_data
;
868 gtk_object_set_data_full(GTK_OBJECT(button
), "Dia::ToolButtonData",
869 data
, (GdkDestroyNotify
)g_free
);
870 if (first_button
== NULL
) first_button
= button
;
872 gtk_signal_connect (GTK_OBJECT (button
), "clicked",
873 GTK_SIGNAL_FUNC (tool_select_update
), data
);
874 gtk_signal_connect (GTK_OBJECT (button
), "button_press_event",
875 GTK_SIGNAL_FUNC (tool_button_press
), data
);
877 tool_setup_drag_source(button
, data
, pixmap
, mask
);
879 gtk_tooltips_set_tip (tool_tips
, button
,
880 gettext(sheet_obj
->description
), NULL
);
882 /* If the selection is in the old sheet, steal it */
883 if (active_tool
!= NULL
&&
884 active_tool
->type
== CREATE_OBJECT_TOOL
&&
885 first_button
!= NULL
)
886 gtk_signal_emit_by_name(GTK_OBJECT(first_button
), "toggled",
887 GTK_BUTTON(first_button
), NULL
);
891 fill_sheet_menu(void)
894 GtkWidget
*activate
= NULL
;
897 gtk_container_foreach(GTK_CONTAINER(sheet_menu
),
898 (GtkCallback
)gtk_widget_destroy
, NULL
);
899 gtk_widget_ref(sheet_menu
);
900 gtk_option_menu_remove_menu(GTK_OPTION_MENU(sheet_option_menu
));
901 gtk_container_add(GTK_CONTAINER(sheet_menu
), gtk_tearoff_menu_item_new());
902 for (tmp
= get_sheets_list(); tmp
!= NULL
; tmp
= tmp
->next
) {
903 Sheet
*sheet
= tmp
->data
;
904 GtkWidget
*menuitem
= NULL
;
906 if (sheet
->objects
== NULL
)
909 menuitem
= gtk_menu_item_new_with_label(gettext(sheet
->name
));
910 gtk_signal_connect(GTK_OBJECT(menuitem
), "activate",
911 GTK_SIGNAL_FUNC(fill_sheet_wbox
), sheet
);
912 gtk_container_add(GTK_CONTAINER(sheet_menu
), menuitem
);
914 /* off by one with gtk_option_menu_<get/set>_history should start
915 * with 0 but it counts from one, gtk- or my-error ? --hb */
917 if (prefs
.recent_sheet
== index
)
920 gtk_option_menu_set_menu(GTK_OPTION_MENU(sheet_option_menu
), sheet_menu
);
921 gtk_widget_unref(sheet_menu
);
925 gtk_option_menu_set_history(GTK_OPTION_MENU(sheet_option_menu
), prefs
.recent_sheet
);
926 /* simple gtk_option_menu_set_history() isn't enough,
927 * cause we need fill_sheet_wbox to be called */
928 gtk_menu_item_activate(GTK_MENU_ITEM(activate
));
930 gtk_widget_show_all(sheet_menu
);
934 create_sheets(GtkWidget
*parent
)
936 GtkWidget
*separator
;
940 separator
= gtk_hseparator_new ();
941 /* add a bit of padding around the separator */
942 label
= gtk_vbox_new(FALSE
, 0);
943 gtk_box_pack_start(GTK_BOX(label
), separator
, TRUE
, TRUE
, 3);
944 gtk_widget_show(label
);
946 gtk_wrap_box_pack_wrapped (GTK_WRAP_BOX(parent
), label
, TRUE
,TRUE
, FALSE
,FALSE
, TRUE
);
947 gtk_widget_show(separator
);
949 sheet_option_menu
= gtk_option_menu_new();
950 gtk_widget_set_size_request(sheet_option_menu
, 20, -1);
951 sheet_menu
= gtk_menu_new();
952 gtk_option_menu_set_menu(GTK_OPTION_MENU(sheet_option_menu
), sheet_menu
);
953 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent
), sheet_option_menu
,
954 TRUE
, TRUE
, FALSE
, FALSE
, TRUE
);
955 gtk_widget_show(sheet_option_menu
);
957 swin
= gtk_scrolled_window_new(NULL
, NULL
);
958 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin
),
959 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
960 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent
), swin
, TRUE
, TRUE
, TRUE
, TRUE
, TRUE
);
961 gtk_widget_show(swin
);
963 sheet_wbox
= gtk_hwrap_box_new(FALSE
);
964 gtk_wrap_box_set_justify(GTK_WRAP_BOX(sheet_wbox
), GTK_JUSTIFY_TOP
);
965 gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(sheet_wbox
), GTK_JUSTIFY_LEFT
);
966 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin
), sheet_wbox
);
967 gtk_widget_show(sheet_wbox
);
973 create_color_area (GtkWidget
*parent
)
976 GtkWidget
*alignment
;
978 GtkWidget
*line_area
;
979 GdkPixmap
*default_pixmap
;
980 GdkBitmap
*default_mask
;
981 GdkPixmap
*swap_pixmap
;
982 GdkBitmap
*swap_mask
;
986 gtk_widget_ensure_style(parent
);
987 style
= gtk_widget_get_style(parent
);
990 gdk_pixmap_colormap_create_from_xpm_d(NULL
,
991 gtk_widget_get_colormap(parent
), &default_mask
,
992 &style
->bg
[GTK_STATE_NORMAL
], default_xpm
);
994 gdk_pixmap_colormap_create_from_xpm_d(NULL
,
995 gtk_widget_get_colormap(parent
), &swap_mask
,
996 &style
->bg
[GTK_STATE_NORMAL
], swap_xpm
);
998 frame
= gtk_frame_new (NULL
);
999 gtk_frame_set_shadow_type (GTK_FRAME (frame
), GTK_SHADOW_OUT
);
1000 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent
), frame
, TRUE
, TRUE
, FALSE
, FALSE
, TRUE
);
1001 gtk_widget_realize (frame
);
1003 hbox
= gtk_hbox_new (FALSE
, 1);
1004 gtk_container_set_border_width (GTK_CONTAINER (hbox
), 0);
1005 gtk_container_add (GTK_CONTAINER (frame
), hbox
);
1008 alignment
= gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
1009 gtk_container_set_border_width (GTK_CONTAINER (alignment
), 3);
1011 col_area
= color_area_create (54, 42,
1012 default_pixmap
, default_mask
,
1013 swap_pixmap
, swap_mask
);
1014 gtk_container_add (GTK_CONTAINER (alignment
), col_area
);
1017 gtk_box_pack_start (GTK_BOX (hbox
), alignment
, TRUE
, TRUE
, 0);
1019 gtk_tooltips_set_tip (tool_tips
, col_area
,
1020 _("Foreground & background colors for new objects. "
1021 "The small black and white squares reset colors. "
1022 "The small arrows swap colors. Double click to "
1026 gtk_widget_show (alignment
);
1028 /* Linewidth area: */
1029 alignment
= gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
1030 gtk_container_set_border_width (GTK_CONTAINER (alignment
), 3);
1032 line_area
= linewidth_area_create ();
1033 gtk_container_add (GTK_CONTAINER (alignment
), line_area
);
1034 gtk_box_pack_start (GTK_BOX (hbox
), alignment
, TRUE
, TRUE
, 0);
1035 gtk_tooltips_set_tip(tool_tips
, 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."), NULL
);
1036 gtk_widget_show (alignment
);
1038 gtk_widget_show (col_area
);
1039 gtk_widget_show (line_area
);
1040 gtk_widget_show (hbox
);
1041 gtk_widget_show (frame
);
1045 change_start_arrow_style(Arrow arrow
, gpointer user_data
)
1047 attributes_set_default_start_arrow(arrow
);
1050 change_end_arrow_style(Arrow arrow
, gpointer user_data
)
1052 attributes_set_default_end_arrow(arrow
);
1055 change_line_style(LineStyle lstyle
, real dash_length
, gpointer user_data
)
1057 attributes_set_default_line_style(lstyle
, dash_length
);
1061 create_lineprops_area(GtkWidget
*parent
)
1065 chooser
= dia_arrow_chooser_new(TRUE
, change_start_arrow_style
, NULL
);
1066 gtk_wrap_box_pack_wrapped(GTK_WRAP_BOX(parent
), chooser
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
);
1067 gtk_tooltips_set_tip(tool_tips
, chooser
, _("Arrow style at the beginning of new lines. Click to pick an arrow, or set arrow parameters with Details..."), NULL
);
1068 gtk_widget_show(chooser
);
1070 chooser
= dia_line_chooser_new(change_line_style
, NULL
);
1071 gtk_wrap_box_pack(GTK_WRAP_BOX(parent
), chooser
, TRUE
, TRUE
, FALSE
, TRUE
);
1072 gtk_tooltips_set_tip(tool_tips
, chooser
, _("Line style for new lines. Click to pick a line style, or set line style parameters with Details..."), NULL
);
1073 gtk_widget_show(chooser
);
1075 chooser
= dia_arrow_chooser_new(FALSE
, change_end_arrow_style
, NULL
);
1076 gtk_wrap_box_pack(GTK_WRAP_BOX(parent
), chooser
, FALSE
, TRUE
, FALSE
, TRUE
);
1077 gtk_tooltips_set_tip(tool_tips
, chooser
, _("Arrow style at the end of new lines. Click to pick an arrow, or set arrow parameters with Details..."), NULL
);
1078 gtk_widget_show(chooser
);
1082 toolbox_destroy (GtkWidget
*widget
, gpointer data
)
1084 prefs
.recent_sheet
= gtk_option_menu_get_history(GTK_OPTION_MENU(sheet_option_menu
));
1090 toolbox_delete (GtkWidget
*widget
, GdkEvent
*event
, gpointer data
)
1092 if (!app_is_embedded()) {
1094 /** Stop toolbox_destroy from being called */
1095 handlerid
= g_signal_handler_find(widget
, G_SIGNAL_MATCH_FUNC
,
1096 0, 0, NULL
, toolbox_destroy
, NULL
);
1098 g_signal_handler_disconnect (GTK_OBJECT (widget
), handlerid
);
1099 prefs
.recent_sheet
= gtk_option_menu_get_history(GTK_OPTION_MENU(sheet_option_menu
));
1106 /* HB: file dnd stuff lent by The Gimp, not fully understood but working ...
1110 DIA_DND_TYPE_URI_LIST
,
1111 DIA_DND_TYPE_TEXT_PLAIN
,
1114 static GtkTargetEntry toolbox_target_table
[] =
1116 { "text/uri-list", 0, DIA_DND_TYPE_URI_LIST
},
1117 { "text/plain", 0, DIA_DND_TYPE_TEXT_PLAIN
}
1120 static guint toolbox_n_targets
= (sizeof (toolbox_target_table
) /
1121 sizeof (toolbox_target_table
[0]));
1124 dia_dnd_file_drag_data_received (GtkWidget
*widget
,
1125 GdkDragContext
*context
,
1128 GtkSelectionData
*data
,
1132 switch (context
->action
)
1134 case GDK_ACTION_DEFAULT
:
1135 case GDK_ACTION_COPY
:
1136 case GDK_ACTION_MOVE
:
1137 case GDK_ACTION_LINK
:
1138 case GDK_ACTION_ASK
:
1141 Diagram
*diagram
= NULL
;
1143 gchar
*sPath
= NULL
, *pFrom
, *pTo
;
1145 pFrom
= strstr((gchar
*) data
->data
, "file:");
1147 GError
*error
= NULL
;
1150 while (*pTo
!= 0 && *pTo
!= 0xd && *pTo
!= 0xa) pTo
++;
1151 sPath
= g_strndup(pFrom
, pTo
- pFrom
);
1153 /* format changed with Gtk+2.0, use conversion */
1154 pFrom
= g_filename_from_uri (sPath
, NULL
, &error
);
1155 diagram
= diagram_load (pFrom
, NULL
);
1159 if (diagram
!= NULL
) {
1160 diagram_update_extents(diagram
);
1161 layer_dialog_set_diagram(diagram
);
1163 ddisp
= new_display(diagram
);
1166 pFrom
= strstr(pTo
, "file:");
1168 gtk_drag_finish (context
, TRUE
, FALSE
, time
);
1179 GtkWidget
*main_vbox
;
1182 GtkAccelGroup
*accel_group
;
1185 window
= gnome_app_new ("Dia", _("Diagram Editor"));
1187 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
1188 gtk_widget_ref (window
);
1189 gtk_window_set_title (GTK_WINDOW (window
), "Dia v" VERSION
);
1191 gtk_window_set_role (GTK_WINDOW (window
), "toolbox_window");
1192 gtk_window_set_default_size(GTK_WINDOW(window
), 146, 349);
1194 gtk_signal_connect (GTK_OBJECT (window
), "delete_event",
1195 GTK_SIGNAL_FUNC (toolbox_delete
),
1198 gtk_signal_connect (GTK_OBJECT (window
), "destroy",
1199 GTK_SIGNAL_FUNC (toolbox_destroy
),
1202 main_vbox
= gtk_vbox_new (FALSE
, 1);
1203 gtk_container_set_border_width (GTK_CONTAINER (main_vbox
), 1);
1205 gnome_app_set_contents(GNOME_APP(window
), main_vbox
);
1207 gtk_container_add (GTK_CONTAINER (window
), main_vbox
);
1209 gtk_widget_show (main_vbox
);
1212 tool_tips
= gtk_tooltips_new ();
1214 /* gtk_tooltips_set_colors (tool_tips,
1216 &main_vbox->style->fg[GTK_STATE_NORMAL]);*/
1218 wrapbox
= gtk_hwrap_box_new(FALSE
);
1219 gtk_wrap_box_set_aspect_ratio(GTK_WRAP_BOX(wrapbox
), 144.0 / 318.0);
1220 gtk_wrap_box_set_justify(GTK_WRAP_BOX(wrapbox
), GTK_JUSTIFY_TOP
);
1221 gtk_wrap_box_set_line_justify(GTK_WRAP_BOX(wrapbox
), GTK_JUSTIFY_LEFT
);
1224 /* pack the rest of the stuff */
1225 gtk_box_pack_end (GTK_BOX (main_vbox
), wrapbox
, TRUE
, TRUE
, 0);
1226 gtk_container_set_border_width (GTK_CONTAINER (wrapbox
), 0);
1227 gtk_widget_show (wrapbox
);
1229 create_tools (wrapbox
);
1230 create_sheets (wrapbox
);
1231 create_color_area (wrapbox
);
1232 create_lineprops_area (wrapbox
);
1234 /* Setup toolbox area as file drop destination */
1235 gtk_drag_dest_set (wrapbox
,
1236 GTK_DEST_DEFAULT_ALL
,
1237 toolbox_target_table
, toolbox_n_targets
,
1239 gtk_signal_connect (GTK_OBJECT (wrapbox
), "drag_data_received",
1240 GTK_SIGNAL_FUNC (dia_dnd_file_drag_data_received
),
1243 /* menus -- initialised afterwards, because initing the display menus
1244 * uses the tool buttons*/
1245 menus_get_toolbox_menubar(&menubar
, &accel_group
);
1246 gtk_window_add_accel_group (GTK_WINDOW (window
), accel_group
);
1248 gnome_app_set_menus(GNOME_APP(window
), GTK_MENU_BAR(menubar
));
1250 gtk_box_pack_start (GTK_BOX (main_vbox
), menubar
, FALSE
, TRUE
, 0);
1251 gtk_widget_show (menubar
);
1254 toolbox_shell
= window
;
1260 gtk_widget_show(toolbox_shell
);
1266 gtk_widget_hide(toolbox_shell
);
1270 create_tree_window(void)
1272 GtkCheckMenuItem
*item
= GTK_CHECK_MENU_ITEM
1273 (menus_get_item_from_path("<Toolbox>/File/Diagram tree", NULL
));
1274 create_diagram_tree_window(&prefs
.dia_tree
, GTK_WIDGET(item
));
1278 interface_get_toolbox_shell(void)
1280 return toolbox_shell
;