1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1998, 1999 Alexander Larsson
4 * diapagelayout.[ch] -- a page settings widget for dia.
5 * Copyright (C) 1999 James Henstridge
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 /*#define PAGELAYOUT_TEST*/
28 #include "diapagelayout.h"
33 #include "pixmaps/portrait.xpm"
34 #include "pixmaps/landscape.xpm"
36 #include "preferences.h"
44 static guint pl_signals
[LAST_SIGNAL
] = { 0 };
45 static GtkObjectClass
*parent_class
;
47 static void dia_page_layout_class_init(DiaPageLayoutClass
*class);
48 static void dia_page_layout_init(DiaPageLayout
*self
);
49 static void dia_page_layout_destroy(GtkObject
*object
);
52 dia_page_layout_get_type(void)
54 static GtkType pl_type
= 0;
57 GtkTypeInfo pl_info
= {
59 sizeof(DiaPageLayout
),
60 sizeof(DiaPageLayoutClass
),
61 (GtkClassInitFunc
) dia_page_layout_class_init
,
62 (GtkObjectInitFunc
) dia_page_layout_init
,
65 (GtkClassInitFunc
) NULL
,
67 pl_type
= gtk_type_unique(gtk_table_get_type(), &pl_info
);
73 dia_page_layout_class_init(DiaPageLayoutClass
*class)
75 GtkObjectClass
*object_class
;
77 object_class
= (GtkObjectClass
*) class;
78 parent_class
= gtk_type_class(gtk_table_get_type());
81 gtk_signal_new("changed",
83 GTK_CLASS_TYPE (object_class
),
84 GTK_SIGNAL_OFFSET(DiaPageLayoutClass
, changed
),
85 gtk_signal_default_marshaller
,
88 gtk_object_class_add_signals(object_class
, pl_signals
, LAST_SIGNAL
);
91 object_class
->destroy
= dia_page_layout_destroy
;
94 static void darea_size_allocate(DiaPageLayout
*self
, GtkAllocation
*alloc
);
95 static gint
darea_expose_event(DiaPageLayout
*self
, GdkEventExpose
*ev
);
96 static void paper_size_change(GtkMenuItem
*item
, DiaPageLayout
*self
);
97 static void orient_changed(DiaPageLayout
*self
);
98 static void margin_changed(DiaPageLayout
*self
);
99 static void scalemode_changed(DiaPageLayout
*self
);
100 static void scale_changed(DiaPageLayout
*self
);
103 dia_page_layout_init(DiaPageLayout
*self
)
105 GtkWidget
*frame
, *box
, *table
, *menu
, *menuitem
, *wid
;
111 gtk_table_resize(GTK_TABLE(self
), 3, 2);
112 gtk_table_set_row_spacings(GTK_TABLE(self
), 5);
113 gtk_table_set_col_spacings(GTK_TABLE(self
), 5);
116 frame
= gtk_frame_new(_("Paper Size"));
117 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 0,1,
118 GTK_FILL
, GTK_FILL
, 0, 0);
119 gtk_widget_show(frame
);
121 box
= gtk_vbox_new(FALSE
, 5);
122 gtk_container_set_border_width(GTK_CONTAINER(box
), 5);
123 gtk_container_add(GTK_CONTAINER(frame
), box
);
124 gtk_widget_show(box
);
126 self
->paper_size
= gtk_option_menu_new();
127 gtk_box_pack_start(GTK_BOX(box
), self
->paper_size
, TRUE
, FALSE
, 0);
129 menu
= gtk_menu_new();
131 paper_names
= get_paper_name_list();
132 for (i
= 0; paper_names
!= NULL
;
133 i
++, paper_names
= g_list_next(paper_names
)) {
134 menuitem
= gtk_menu_item_new_with_label(paper_names
->data
);
135 gtk_object_set_user_data(GTK_OBJECT(menuitem
), GINT_TO_POINTER(i
));
136 g_signal_connect(GTK_OBJECT(menuitem
), "activate",
137 G_CALLBACK(paper_size_change
), self
);
138 gtk_container_add(GTK_CONTAINER(menu
), menuitem
);
139 gtk_widget_show(menuitem
);
141 gtk_option_menu_set_menu(GTK_OPTION_MENU(self
->paper_size
), menu
);
142 gtk_widget_show(self
->paper_size
);
144 self
->paper_label
= gtk_label_new("");
145 gtk_box_pack_start(GTK_BOX(box
), self
->paper_label
, TRUE
, TRUE
, 0);
146 gtk_widget_show(self
->paper_label
);
149 frame
= gtk_frame_new(_("Orientation"));
150 gtk_table_attach(GTK_TABLE(self
), frame
, 1,2, 0,1,
151 GTK_FILL
|GTK_EXPAND
, GTK_FILL
, 0, 0);
152 gtk_widget_show(frame
);
154 box
= gtk_hbox_new(FALSE
, 5);
155 gtk_container_set_border_width(GTK_CONTAINER(box
), 5);
156 gtk_container_add(GTK_CONTAINER(frame
), box
);
157 gtk_widget_show(box
);
159 self
->orient_portrait
= gtk_radio_button_new(NULL
);
160 pix
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
161 gtk_widget_get_colormap(GTK_WIDGET(self
)), &mask
, NULL
,
163 wid
= gtk_pixmap_new(pix
, mask
);
164 gdk_pixmap_unref(pix
);
165 gdk_bitmap_unref(mask
);
166 gtk_container_add(GTK_CONTAINER(self
->orient_portrait
), wid
);
167 gtk_widget_show(wid
);
169 gtk_box_pack_start(GTK_BOX(box
), self
->orient_portrait
, TRUE
, TRUE
, 0);
170 gtk_widget_show(self
->orient_portrait
);
172 self
->orient_landscape
= gtk_radio_button_new(
173 gtk_radio_button_group(GTK_RADIO_BUTTON(self
->orient_portrait
)));
174 pix
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
175 gtk_widget_get_colormap(GTK_WIDGET(self
)), &mask
, NULL
,
177 wid
= gtk_pixmap_new(pix
, mask
);
178 gdk_pixmap_unref(pix
);
179 gdk_bitmap_unref(mask
);
180 gtk_container_add(GTK_CONTAINER(self
->orient_landscape
), wid
);
181 gtk_widget_show(wid
);
183 gtk_box_pack_start(GTK_BOX(box
), self
->orient_landscape
, TRUE
, TRUE
, 0);
184 gtk_widget_show(self
->orient_landscape
);
187 frame
= gtk_frame_new(_("Margins"));
188 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 1,2,
189 GTK_FILL
, GTK_FILL
, 0, 0);
190 gtk_widget_show(frame
);
192 table
= gtk_table_new(4, 2, FALSE
);
193 gtk_container_set_border_width(GTK_CONTAINER(table
), 5);
194 gtk_table_set_row_spacings(GTK_TABLE(table
), 5);
195 gtk_table_set_col_spacings(GTK_TABLE(table
), 5);
196 gtk_container_add(GTK_CONTAINER(frame
), table
);
197 gtk_widget_show(table
);
199 wid
= gtk_label_new(_("Top:"));
200 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
201 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 0,1,
202 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
203 gtk_widget_show(wid
);
205 self
->tmargin
= dia_unit_spinner_new(
206 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
207 2, DIA_UNIT_CENTIMETER
);
208 gtk_table_attach(GTK_TABLE(table
), self
->tmargin
, 1,2, 0,1,
209 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
210 gtk_widget_show(self
->tmargin
);
212 wid
= gtk_label_new(_("Bottom:"));
213 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
214 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 1,2,
215 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
216 gtk_widget_show(wid
);
218 self
->bmargin
= dia_unit_spinner_new(
219 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
220 2, DIA_UNIT_CENTIMETER
);
221 gtk_table_attach(GTK_TABLE(table
), self
->bmargin
, 1,2, 1,2,
222 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
223 gtk_widget_show(self
->bmargin
);
225 wid
= gtk_label_new(_("Left:"));
226 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
227 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 2,3,
228 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
229 gtk_widget_show(wid
);
231 self
->lmargin
= dia_unit_spinner_new(
232 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
233 2, DIA_UNIT_CENTIMETER
);
234 gtk_table_attach(GTK_TABLE(table
), self
->lmargin
, 1,2, 2,3,
235 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
236 gtk_widget_show(self
->lmargin
);
238 wid
= gtk_label_new(_("Right:"));
239 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
240 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 3,4,
241 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
242 gtk_widget_show(wid
);
244 self
->rmargin
= dia_unit_spinner_new(
245 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
246 2, DIA_UNIT_CENTIMETER
);
247 gtk_table_attach(GTK_TABLE(table
), self
->rmargin
, 1,2, 3,4,
248 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
249 gtk_widget_show(self
->rmargin
);
252 frame
= gtk_frame_new(_("Scaling"));
253 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 2,3,
254 GTK_FILL
, GTK_FILL
, 0, 0);
255 gtk_widget_show(frame
);
257 table
= gtk_table_new(2, 4, FALSE
);
258 gtk_container_set_border_width(GTK_CONTAINER(table
), 5);
259 gtk_table_set_row_spacings(GTK_TABLE(table
), 5);
260 gtk_container_add(GTK_CONTAINER(frame
), table
);
261 gtk_widget_show(table
);
263 self
->scale
= gtk_radio_button_new_with_label(NULL
, _("Scale:"));
264 gtk_table_attach(GTK_TABLE(table
), self
->scale
, 0,1, 0,1,
265 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
266 gtk_widget_show(self
->scale
);
268 self
->scaling
= gtk_spin_button_new(
269 GTK_ADJUSTMENT(gtk_adjustment_new(100,1,10000, 1,10,10)), 1, 1);
270 gtk_table_attach(GTK_TABLE(table
), self
->scaling
, 1,4, 0,1,
271 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
272 gtk_widget_show(self
->scaling
);
274 self
->fitto
= gtk_radio_button_new_with_label(
275 GTK_RADIO_BUTTON(self
->scale
)->group
, _("Fit to:"));
276 gtk_table_attach(GTK_TABLE(table
), self
->fitto
, 0,1, 1,2,
277 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
278 gtk_widget_show(self
->fitto
);
280 self
->fitw
= gtk_spin_button_new(
281 GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 10)), 1, 0);
282 gtk_widget_set_sensitive(self
->fitw
, FALSE
);
283 gtk_table_attach(GTK_TABLE(table
), self
->fitw
, 1,2, 1,2,
284 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
285 gtk_widget_show(self
->fitw
);
287 wid
= gtk_label_new(_("by"));
288 gtk_misc_set_padding(GTK_MISC(wid
), 5, 0);
289 gtk_table_attach(GTK_TABLE(table
), wid
, 2,3, 1,2,
290 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
291 gtk_widget_show(wid
);
293 self
->fith
= gtk_spin_button_new(
294 GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 10)), 1, 0);
295 gtk_widget_set_sensitive(self
->fith
, FALSE
);
296 gtk_table_attach(GTK_TABLE(table
), self
->fith
, 3,4, 1,2,
297 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
298 gtk_widget_show(self
->fith
);
300 /* the drawing area */
301 self
->darea
= gtk_drawing_area_new();
302 gtk_table_attach(GTK_TABLE(self
), self
->darea
, 1,2, 1,3,
303 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
304 gtk_widget_show(self
->darea
);
306 /* connect the signal handlers */
307 g_signal_connect_swapped(GTK_OBJECT(self
->orient_portrait
), "toggled",
308 G_CALLBACK(orient_changed
), GTK_OBJECT(self
));
310 g_signal_connect_swapped(GTK_OBJECT(self
->tmargin
), "changed",
311 G_CALLBACK(margin_changed
), GTK_OBJECT(self
));
312 g_signal_connect_swapped(GTK_OBJECT(self
->bmargin
), "changed",
313 G_CALLBACK(margin_changed
), GTK_OBJECT(self
));
314 g_signal_connect_swapped(GTK_OBJECT(self
->lmargin
), "changed",
315 G_CALLBACK(margin_changed
), GTK_OBJECT(self
));
316 g_signal_connect_swapped(GTK_OBJECT(self
->rmargin
), "changed",
317 G_CALLBACK(margin_changed
), GTK_OBJECT(self
));
319 g_signal_connect_swapped(GTK_OBJECT(self
->fitto
), "toggled",
320 G_CALLBACK(scalemode_changed
),
322 g_signal_connect_swapped(GTK_OBJECT(self
->scaling
), "changed",
323 G_CALLBACK(scale_changed
), GTK_OBJECT(self
));
324 g_signal_connect_swapped(GTK_OBJECT(self
->fitw
), "changed",
325 G_CALLBACK(scale_changed
), GTK_OBJECT(self
));
326 g_signal_connect_swapped(GTK_OBJECT(self
->fith
), "changed",
327 G_CALLBACK(scale_changed
), GTK_OBJECT(self
));
329 g_signal_connect_swapped(GTK_OBJECT(self
->darea
), "size_allocate",
330 G_CALLBACK(darea_size_allocate
),
332 g_signal_connect_swapped(GTK_OBJECT(self
->darea
), "expose_event",
333 G_CALLBACK(darea_expose_event
),
336 gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->white
);
337 gdk_color_black(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->black
);
339 self
->blue
.green
= 0;
340 self
->blue
.blue
= 0x7fff;
341 gdk_color_alloc(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->blue
);
344 self
->block_changed
= FALSE
;
348 dia_page_layout_new(void)
350 DiaPageLayout
*self
= gtk_type_new(dia_page_layout_get_type());
352 dia_page_layout_set_paper(self
, "");
353 return GTK_WIDGET(self
);
357 dia_page_layout_get_paper(DiaPageLayout
*self
)
359 return get_paper_name(self
->papernum
);
363 dia_page_layout_set_paper(DiaPageLayout
*self
, const gchar
*paper
)
367 i
= find_paper(paper
);
369 i
= find_paper(prefs
.new_diagram
.papertype
);
370 gtk_option_menu_set_history(GTK_OPTION_MENU(self
->paper_size
), i
);
371 gtk_menu_item_activate(
372 GTK_MENU_ITEM(GTK_OPTION_MENU(self
->paper_size
)->menu_item
));
376 dia_page_layout_get_margins(DiaPageLayout
*self
,
377 gfloat
*tmargin
, gfloat
*bmargin
,
378 gfloat
*lmargin
, gfloat
*rmargin
)
381 *tmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
383 *bmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
385 *lmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
387 *rmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
391 dia_page_layout_set_margins(DiaPageLayout
*self
,
392 gfloat tmargin
, gfloat bmargin
,
393 gfloat lmargin
, gfloat rmargin
)
395 self
->block_changed
= TRUE
;
396 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->tmargin
), tmargin
);
397 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->bmargin
), bmargin
);
398 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->lmargin
), lmargin
);
399 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->rmargin
), rmargin
);
400 self
->block_changed
= FALSE
;
402 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
406 dia_page_layout_get_orientation(DiaPageLayout
*self
)
408 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
)
409 return DIA_PAGE_ORIENT_PORTRAIT
;
411 return DIA_PAGE_ORIENT_LANDSCAPE
;
415 dia_page_layout_set_orientation(DiaPageLayout
*self
,
416 DiaPageOrientation orient
)
419 case DIA_PAGE_ORIENT_PORTRAIT
:
420 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->orient_portrait
),
423 case DIA_PAGE_ORIENT_LANDSCAPE
:
424 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->orient_landscape
),
431 dia_page_layout_get_fitto(DiaPageLayout
*self
)
433 return GTK_TOGGLE_BUTTON(self
->fitto
)->active
;
437 dia_page_layout_set_fitto(DiaPageLayout
*self
, gboolean fitto
)
440 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->fitto
), TRUE
);
442 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->scale
), TRUE
);
446 dia_page_layout_get_scaling(DiaPageLayout
*self
)
448 return GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
/ 100.0;
452 dia_page_layout_set_scaling(DiaPageLayout
*self
, gfloat scaling
)
454 GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
= scaling
* 100.0;
455 gtk_adjustment_value_changed(GTK_SPIN_BUTTON(self
->scaling
)->adjustment
);
459 dia_page_layout_get_fit_dims(DiaPageLayout
*self
, gint
*w
, gint
*h
)
462 *w
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(self
->fitw
));
464 *h
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(self
->fith
));
468 dia_page_layout_set_fit_dims(DiaPageLayout
*self
, gint w
, gint h
)
470 gtk_spin_button_set_value(GTK_SPIN_BUTTON(self
->fitw
), w
);
471 gtk_spin_button_set_value(GTK_SPIN_BUTTON(self
->fith
), h
);
475 dia_page_layout_get_effective_area(DiaPageLayout
*self
, gfloat
*width
,
478 gfloat h
, w
, scaling
;
480 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
481 w
= get_paper_pswidth(self
->papernum
);
482 h
= get_paper_psheight(self
->papernum
);
484 h
= get_paper_pswidth(self
->papernum
);
485 w
= get_paper_psheight(self
->papernum
);
487 h
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
488 h
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
489 w
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
490 w
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
491 scaling
= GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
/ 100.0;
495 if (width
) *width
= w
;
496 if (height
) *height
= h
;
500 dia_page_layout_get_paper_size(const gchar
*paper
,
501 gfloat
*width
, gfloat
*height
)
505 i
= find_paper(paper
);
507 i
= find_paper(prefs
.new_diagram
.papertype
);
509 *width
= get_paper_pswidth(i
);
511 *height
= get_paper_psheight(i
);
515 dia_page_layout_get_default_margins(const gchar
*paper
,
516 gfloat
*tmargin
, gfloat
*bmargin
,
517 gfloat
*lmargin
, gfloat
*rmargin
)
521 i
= find_paper(paper
);
523 i
= find_paper(prefs
.new_diagram
.papertype
);
525 *tmargin
= get_paper_tmargin(i
);
527 *bmargin
= get_paper_bmargin(i
);
529 *lmargin
= get_paper_lmargin(i
);
531 *rmargin
= get_paper_rmargin(i
);
535 size_page(DiaPageLayout
*self
, GtkAllocation
*a
)
537 self
->width
= a
->width
- 3;
538 self
->height
= a
->height
- 3;
540 /* change to correct metrics */
541 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
542 if (self
->width
* get_paper_psheight(self
->papernum
) >
543 self
->height
* get_paper_pswidth(self
->papernum
))
544 self
->width
= self
->height
* get_paper_pswidth(self
->papernum
) /
545 get_paper_psheight(self
->papernum
);
547 self
->height
= self
->width
* get_paper_psheight(self
->papernum
) /
548 get_paper_pswidth(self
->papernum
);
550 if (self
->width
* get_paper_pswidth(self
->papernum
) >
551 self
->height
* get_paper_psheight(self
->papernum
))
552 self
->width
= self
->height
* get_paper_psheight(self
->papernum
) /
553 get_paper_pswidth(self
->papernum
);
555 self
->height
= self
->width
* get_paper_pswidth(self
->papernum
) /
556 get_paper_psheight(self
->papernum
);
559 self
->x
= (a
->width
- self
->width
- 3) / 2;
560 self
->y
= (a
->height
- self
->height
- 3) / 2;
564 darea_size_allocate(DiaPageLayout
*self
, GtkAllocation
*allocation
)
566 size_page(self
, allocation
);
570 darea_expose_event(DiaPageLayout
*self
, GdkEventExpose
*event
)
572 GdkWindow
*window
= self
->darea
->window
;
580 self
->gc
= gdk_gc_new(window
);
582 gdk_window_clear_area (window
,
584 self
->darea
->allocation
.width
,
585 self
->darea
->allocation
.height
);
587 /* draw the page image */
588 gdk_gc_set_foreground(self
->gc
, &self
->black
);
589 gdk_draw_rectangle(window
, self
->gc
, TRUE
, self
->x
+3, self
->y
+3,
590 self
->width
, self
->height
);
591 gdk_gc_set_foreground(self
->gc
, &self
->white
);
592 gdk_draw_rectangle(window
, self
->gc
, TRUE
, self
->x
, self
->y
,
593 self
->width
, self
->height
);
594 gdk_gc_set_foreground(self
->gc
, &self
->black
);
595 gdk_draw_rectangle(window
, self
->gc
, FALSE
, self
->x
, self
->y
,
596 self
->width
-1, self
->height
-1);
598 gdk_gc_set_foreground(self
->gc
, &self
->blue
);
601 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
602 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
603 num
= self
->y
+ val
* self
->height
/get_paper_psheight(self
->papernum
);
604 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
606 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
607 num
= self
->y
+ self
->height
-
608 val
* self
->height
/ get_paper_psheight(self
->papernum
);
609 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
611 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
612 num
= self
->x
+ val
* self
->width
/ get_paper_pswidth(self
->papernum
);
613 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
615 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
616 num
= self
->x
+ self
->width
-
617 val
* self
->width
/ get_paper_pswidth(self
->papernum
);
618 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
620 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
621 num
= self
->y
+ val
* self
->height
/get_paper_pswidth(self
->papernum
);
622 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
624 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
625 num
= self
->y
+ self
->height
-
626 val
* self
->height
/ get_paper_pswidth(self
->papernum
);
627 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
629 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
630 num
= self
->x
+ val
* self
->width
/ get_paper_psheight(self
->papernum
);
631 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
633 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
634 num
= self
->x
+ self
->width
-
635 val
* self
->width
/ get_paper_psheight(self
->papernum
);
636 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
643 paper_size_change(GtkMenuItem
*item
, DiaPageLayout
*self
)
647 self
->papernum
= GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(item
)));
648 size_page(self
, &self
->darea
->allocation
);
649 gtk_widget_queue_draw(self
->darea
);
651 self
->block_changed
= TRUE
;
652 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->tmargin
),
653 get_paper_tmargin(self
->papernum
));
654 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->bmargin
),
655 get_paper_bmargin(self
->papernum
));
656 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->lmargin
),
657 get_paper_lmargin(self
->papernum
));
658 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->rmargin
),
659 get_paper_rmargin(self
->papernum
));
661 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
662 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
663 get_paper_psheight(self
->papernum
);
664 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
665 get_paper_psheight(self
->papernum
);
666 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
667 get_paper_pswidth(self
->papernum
);
668 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
669 get_paper_pswidth(self
->papernum
);
671 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
672 get_paper_pswidth(self
->papernum
);
673 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
674 get_paper_pswidth(self
->papernum
);
675 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
676 get_paper_psheight(self
->papernum
);
677 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
678 get_paper_psheight(self
->papernum
);
680 self
->block_changed
= FALSE
;
682 g_snprintf(buf
, sizeof(buf
), _("%0.3gcm x %0.3gcm"),
683 get_paper_pswidth(self
->papernum
),
684 get_paper_psheight(self
->papernum
));
685 gtk_label_set(GTK_LABEL(self
->paper_label
), buf
);
687 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
691 orient_changed(DiaPageLayout
*self
)
693 size_page(self
, &self
->darea
->allocation
);
694 gtk_widget_queue_draw(self
->darea
);
696 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
697 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
698 get_paper_psheight(self
->papernum
);
699 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
700 get_paper_psheight(self
->papernum
);
701 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
702 get_paper_pswidth(self
->papernum
);
703 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
704 get_paper_pswidth(self
->papernum
);
706 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
707 get_paper_pswidth(self
->papernum
);
708 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
709 get_paper_pswidth(self
->papernum
);
710 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
711 get_paper_psheight(self
->papernum
);
712 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
713 get_paper_psheight(self
->papernum
);
716 if (!self
->block_changed
)
717 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
721 margin_changed(DiaPageLayout
*self
)
723 gtk_widget_queue_draw(self
->darea
);
724 if (!self
->block_changed
)
725 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
729 scalemode_changed(DiaPageLayout
*self
)
731 if (GTK_TOGGLE_BUTTON(self
->fitto
)->active
) {
732 gtk_widget_set_sensitive(self
->scaling
, FALSE
);
733 gtk_widget_set_sensitive(self
->fitw
, TRUE
);
734 gtk_widget_set_sensitive(self
->fith
, TRUE
);
736 gtk_widget_set_sensitive(self
->scaling
, TRUE
);
737 gtk_widget_set_sensitive(self
->fitw
, FALSE
);
738 gtk_widget_set_sensitive(self
->fith
, FALSE
);
740 if (!self
->block_changed
)
741 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
745 scale_changed(DiaPageLayout
*self
)
747 if (!self
->block_changed
)
748 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
752 dia_page_layout_destroy(GtkObject
*object
)
754 DiaPageLayout
*self
= DIA_PAGE_LAYOUT(object
);
757 gdk_gc_unref(self
->gc
);
761 if (parent_class
->destroy
)
762 (* parent_class
->destroy
)(object
);
765 #ifdef PAGELAYOUT_TEST
768 changed_signal(DiaPageLayout
*self
)
770 g_message("changed");
773 fittopage_signal(DiaPageLayout
*self
)
775 g_message("fit to page");
779 main(int argc
, char **argv
)
783 gtk_init(&argc
, &argv
);
785 win
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
786 gtk_window_set_title(GTK_WINDOW(win
), _("Page Setup"));
787 g_signal_connect(GTK_OBJECT(win
), "destroy",
788 G_CALLBACK(gtk_main_quit
), NULL
);
790 pl
= dia_page_layout_new();
791 gtk_container_set_border_width(GTK_CONTAINER(pl
), 5);
792 gtk_container_add(GTK_CONTAINER(win
), pl
);
795 g_signal_connect(GTK_OBJECT(pl
), "changed",
796 G_CALLBACK(changed_signal
), NULL
);
797 g_signal_connect(GTK_OBJECT(pl
), "fittopage",
798 G_CALLBACK(fittopage_signal
), NULL
);
800 gtk_widget_show(win
);