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*/
24 #include "diapagelayout.h"
25 #include "diaunitspinner.h"
29 #include "pixmaps/portrait.xpm"
30 #include "pixmaps/landscape.xpm"
39 static guint pl_signals
[LAST_SIGNAL
] = { 0 };
40 static GtkObjectClass
*parent_class
;
42 static void dia_page_layout_class_init(DiaPageLayoutClass
*class);
43 static void dia_page_layout_init(DiaPageLayout
*self
);
44 static void dia_page_layout_destroy(GtkObject
*object
);
47 dia_page_layout_get_type(void)
49 static GtkType pl_type
= 0;
52 GtkTypeInfo pl_info
= {
54 sizeof(DiaPageLayout
),
55 sizeof(DiaPageLayoutClass
),
56 (GtkClassInitFunc
) dia_page_layout_class_init
,
57 (GtkObjectInitFunc
) dia_page_layout_init
,
61 pl_type
= gtk_type_unique(gtk_table_get_type(), &pl_info
);
67 dia_page_layout_class_init(DiaPageLayoutClass
*class)
69 GtkObjectClass
*object_class
;
71 object_class
= (GtkObjectClass
*) class;
72 parent_class
= gtk_type_class(gtk_table_get_type());
75 gtk_signal_new("changed",
78 GTK_SIGNAL_OFFSET(DiaPageLayoutClass
, changed
),
79 gtk_signal_default_marshaller
,
81 gtk_object_class_add_signals(object_class
, pl_signals
, LAST_SIGNAL
);
83 object_class
->destroy
= dia_page_layout_destroy
;
86 static void darea_size_allocate(DiaPageLayout
*self
, GtkAllocation
*alloc
);
87 static gint
darea_expose_event(DiaPageLayout
*self
, GdkEventExpose
*ev
);
88 static void paper_size_change(GtkMenuItem
*item
, DiaPageLayout
*self
);
89 static void orient_changed(DiaPageLayout
*self
);
90 static void margin_changed(DiaPageLayout
*self
);
91 static void scalemode_changed(DiaPageLayout
*self
);
92 static void scale_changed(DiaPageLayout
*self
);
95 dia_page_layout_init(DiaPageLayout
*self
)
97 GtkWidget
*frame
, *box
, *table
, *menu
, *menuitem
, *wid
;
103 gtk_table_resize(GTK_TABLE(self
), 3, 2);
104 gtk_table_set_row_spacings(GTK_TABLE(self
), 5);
105 gtk_table_set_col_spacings(GTK_TABLE(self
), 5);
108 frame
= gtk_frame_new(_("Paper Size"));
109 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 0,1,
110 GTK_FILL
, GTK_FILL
, 0, 0);
111 gtk_widget_show(frame
);
113 box
= gtk_vbox_new(FALSE
, 5);
114 gtk_container_set_border_width(GTK_CONTAINER(box
), 5);
115 gtk_container_add(GTK_CONTAINER(frame
), box
);
116 gtk_widget_show(box
);
118 self
->paper_size
= gtk_option_menu_new();
119 gtk_box_pack_start(GTK_BOX(box
), self
->paper_size
, TRUE
, FALSE
, 0);
121 menu
= gtk_menu_new();
123 paper_names
= get_paper_name_list();
124 for (i
= 0; paper_names
!= NULL
;
125 i
++, paper_names
= g_list_next(paper_names
)) {
126 menuitem
= gtk_menu_item_new_with_label(paper_names
->data
);
127 gtk_object_set_user_data(GTK_OBJECT(menuitem
), GINT_TO_POINTER(i
));
128 gtk_signal_connect(GTK_OBJECT(menuitem
), "activate",
129 GTK_SIGNAL_FUNC(paper_size_change
), self
);
130 gtk_container_add(GTK_CONTAINER(menu
), menuitem
);
131 gtk_widget_show(menuitem
);
133 gtk_option_menu_set_menu(GTK_OPTION_MENU(self
->paper_size
), menu
);
134 gtk_widget_show(self
->paper_size
);
136 self
->paper_label
= gtk_label_new("");
137 gtk_box_pack_start(GTK_BOX(box
), self
->paper_label
, TRUE
, TRUE
, 0);
138 gtk_widget_show(self
->paper_label
);
141 frame
= gtk_frame_new(_("Orientation"));
142 gtk_table_attach(GTK_TABLE(self
), frame
, 1,2, 0,1,
143 GTK_FILL
|GTK_EXPAND
, GTK_FILL
, 0, 0);
144 gtk_widget_show(frame
);
146 box
= gtk_hbox_new(FALSE
, 5);
147 gtk_container_set_border_width(GTK_CONTAINER(box
), 5);
148 gtk_container_add(GTK_CONTAINER(frame
), box
);
149 gtk_widget_show(box
);
151 self
->orient_portrait
= gtk_radio_button_new(NULL
);
152 pix
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
153 gtk_widget_get_colormap(GTK_WIDGET(self
)), &mask
, NULL
,
155 wid
= gtk_pixmap_new(pix
, mask
);
156 gdk_pixmap_unref(pix
);
157 gdk_bitmap_unref(mask
);
158 gtk_container_add(GTK_CONTAINER(self
->orient_portrait
), wid
);
159 gtk_widget_show(wid
);
161 gtk_box_pack_start(GTK_BOX(box
), self
->orient_portrait
, TRUE
, TRUE
, 0);
162 gtk_widget_show(self
->orient_portrait
);
164 self
->orient_landscape
= gtk_radio_button_new(
165 gtk_radio_button_group(GTK_RADIO_BUTTON(self
->orient_portrait
)));
166 pix
= gdk_pixmap_colormap_create_from_xpm_d(NULL
,
167 gtk_widget_get_colormap(GTK_WIDGET(self
)), &mask
, NULL
,
169 wid
= gtk_pixmap_new(pix
, mask
);
170 gdk_pixmap_unref(pix
);
171 gdk_bitmap_unref(mask
);
172 gtk_container_add(GTK_CONTAINER(self
->orient_landscape
), wid
);
173 gtk_widget_show(wid
);
175 gtk_box_pack_start(GTK_BOX(box
), self
->orient_landscape
, TRUE
, TRUE
, 0);
176 gtk_widget_show(self
->orient_landscape
);
179 frame
= gtk_frame_new(_("Margins"));
180 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 1,2,
181 GTK_FILL
, GTK_FILL
, 0, 0);
182 gtk_widget_show(frame
);
184 table
= gtk_table_new(4, 2, FALSE
);
185 gtk_container_set_border_width(GTK_CONTAINER(table
), 5);
186 gtk_table_set_row_spacings(GTK_TABLE(table
), 5);
187 gtk_table_set_col_spacings(GTK_TABLE(table
), 5);
188 gtk_container_add(GTK_CONTAINER(frame
), table
);
189 gtk_widget_show(table
);
191 wid
= gtk_label_new(_("Top:"));
192 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
193 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 0,1,
194 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
195 gtk_widget_show(wid
);
197 self
->tmargin
= dia_unit_spinner_new(
198 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
199 2, DIA_UNIT_CENTIMETER
);
200 gtk_table_attach(GTK_TABLE(table
), self
->tmargin
, 1,2, 0,1,
201 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
202 gtk_widget_show(self
->tmargin
);
204 wid
= gtk_label_new(_("Bottom:"));
205 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
206 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 1,2,
207 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
208 gtk_widget_show(wid
);
210 self
->bmargin
= dia_unit_spinner_new(
211 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
212 2, DIA_UNIT_CENTIMETER
);
213 gtk_table_attach(GTK_TABLE(table
), self
->bmargin
, 1,2, 1,2,
214 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
215 gtk_widget_show(self
->bmargin
);
217 wid
= gtk_label_new(_("Left:"));
218 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
219 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 2,3,
220 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
221 gtk_widget_show(wid
);
223 self
->lmargin
= dia_unit_spinner_new(
224 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
225 2, DIA_UNIT_CENTIMETER
);
226 gtk_table_attach(GTK_TABLE(table
), self
->lmargin
, 1,2, 2,3,
227 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
228 gtk_widget_show(self
->lmargin
);
230 wid
= gtk_label_new(_("Right:"));
231 gtk_misc_set_alignment(GTK_MISC(wid
), 1.0, 0.5);
232 gtk_table_attach(GTK_TABLE(table
), wid
, 0,1, 3,4,
233 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
234 gtk_widget_show(wid
);
236 self
->rmargin
= dia_unit_spinner_new(
237 GTK_ADJUSTMENT(gtk_adjustment_new(1, 0,100, 0.1,10,10)),
238 2, DIA_UNIT_CENTIMETER
);
239 gtk_table_attach(GTK_TABLE(table
), self
->rmargin
, 1,2, 3,4,
240 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
241 gtk_widget_show(self
->rmargin
);
244 frame
= gtk_frame_new(_("Scaling"));
245 gtk_table_attach(GTK_TABLE(self
), frame
, 0,1, 2,3,
246 GTK_FILL
, GTK_FILL
, 0, 0);
247 gtk_widget_show(frame
);
249 table
= gtk_table_new(2, 4, FALSE
);
250 gtk_container_set_border_width(GTK_CONTAINER(table
), 5);
251 gtk_table_set_row_spacings(GTK_TABLE(table
), 5);
252 gtk_container_add(GTK_CONTAINER(frame
), table
);
253 gtk_widget_show(table
);
255 self
->scale
= gtk_radio_button_new_with_label(NULL
, _("Scale:"));
256 gtk_table_attach(GTK_TABLE(table
), self
->scale
, 0,1, 0,1,
257 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
258 gtk_widget_show(self
->scale
);
260 self
->scaling
= gtk_spin_button_new(
261 GTK_ADJUSTMENT(gtk_adjustment_new(100,1,10000, 1,10,10)), 1, 1);
262 gtk_table_attach(GTK_TABLE(table
), self
->scaling
, 1,4, 0,1,
263 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
264 gtk_widget_show(self
->scaling
);
266 self
->fitto
= gtk_radio_button_new_with_label(
267 GTK_RADIO_BUTTON(self
->scale
)->group
, _("Fit to:"));
268 gtk_table_attach(GTK_TABLE(table
), self
->fitto
, 0,1, 1,2,
269 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
270 gtk_widget_show(self
->fitto
);
272 self
->fitw
= gtk_spin_button_new(
273 GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 10)), 1, 0);
274 gtk_widget_set_sensitive(self
->fitw
, FALSE
);
275 gtk_table_attach(GTK_TABLE(table
), self
->fitw
, 1,2, 1,2,
276 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
277 gtk_widget_show(self
->fitw
);
279 wid
= gtk_label_new(_("by"));
280 gtk_misc_set_padding(GTK_MISC(wid
), 5, 0);
281 gtk_table_attach(GTK_TABLE(table
), wid
, 2,3, 1,2,
282 GTK_FILL
, GTK_FILL
|GTK_EXPAND
, 0, 0);
283 gtk_widget_show(wid
);
285 self
->fith
= gtk_spin_button_new(
286 GTK_ADJUSTMENT(gtk_adjustment_new(1, 1, 1000, 1, 10, 10)), 1, 0);
287 gtk_widget_set_sensitive(self
->fith
, FALSE
);
288 gtk_table_attach(GTK_TABLE(table
), self
->fith
, 3,4, 1,2,
289 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
290 gtk_widget_show(self
->fith
);
292 /* the drawing area */
293 self
->darea
= gtk_drawing_area_new();
294 gtk_table_attach(GTK_TABLE(self
), self
->darea
, 1,2, 1,3,
295 GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
296 gtk_widget_show(self
->darea
);
298 /* connect the signal handlers */
299 gtk_signal_connect_object(GTK_OBJECT(self
->orient_portrait
), "toggled",
300 GTK_SIGNAL_FUNC(orient_changed
), GTK_OBJECT(self
));
302 gtk_signal_connect_object(GTK_OBJECT(self
->tmargin
), "changed",
303 GTK_SIGNAL_FUNC(margin_changed
), GTK_OBJECT(self
));
304 gtk_signal_connect_object(GTK_OBJECT(self
->bmargin
), "changed",
305 GTK_SIGNAL_FUNC(margin_changed
), GTK_OBJECT(self
));
306 gtk_signal_connect_object(GTK_OBJECT(self
->lmargin
), "changed",
307 GTK_SIGNAL_FUNC(margin_changed
), GTK_OBJECT(self
));
308 gtk_signal_connect_object(GTK_OBJECT(self
->rmargin
), "changed",
309 GTK_SIGNAL_FUNC(margin_changed
), GTK_OBJECT(self
));
311 gtk_signal_connect_object(GTK_OBJECT(self
->fitto
), "toggled",
312 GTK_SIGNAL_FUNC(scalemode_changed
),
314 gtk_signal_connect_object(GTK_OBJECT(self
->scaling
), "changed",
315 GTK_SIGNAL_FUNC(scale_changed
), GTK_OBJECT(self
));
316 gtk_signal_connect_object(GTK_OBJECT(self
->fitw
), "changed",
317 GTK_SIGNAL_FUNC(scale_changed
), GTK_OBJECT(self
));
318 gtk_signal_connect_object(GTK_OBJECT(self
->fith
), "changed",
319 GTK_SIGNAL_FUNC(scale_changed
), GTK_OBJECT(self
));
321 gtk_signal_connect_object(GTK_OBJECT(self
->darea
), "size_allocate",
322 GTK_SIGNAL_FUNC(darea_size_allocate
),
324 gtk_signal_connect_object(GTK_OBJECT(self
->darea
), "expose_event",
325 GTK_SIGNAL_FUNC(darea_expose_event
),
328 gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->white
);
329 gdk_color_black(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->black
);
331 self
->blue
.green
= 0;
332 self
->blue
.blue
= 0x7fff;
333 gdk_color_alloc(gtk_widget_get_colormap(GTK_WIDGET(self
)), &self
->blue
);
336 self
->block_changed
= FALSE
;
340 dia_page_layout_new(void)
342 DiaPageLayout
*self
= gtk_type_new(dia_page_layout_get_type());
344 dia_page_layout_set_paper(self
, "");
345 return GTK_WIDGET(self
);
349 dia_page_layout_get_paper(DiaPageLayout
*self
)
351 return get_paper_name(self
->papernum
);
355 dia_page_layout_set_paper(DiaPageLayout
*self
, const gchar
*paper
)
359 i
= find_paper(paper
);
361 i
= get_default_paper();
362 gtk_option_menu_set_history(GTK_OPTION_MENU(self
->paper_size
), i
);
363 gtk_menu_item_activate(
364 GTK_MENU_ITEM(GTK_OPTION_MENU(self
->paper_size
)->menu_item
));
368 dia_page_layout_get_margins(DiaPageLayout
*self
,
369 gfloat
*tmargin
, gfloat
*bmargin
,
370 gfloat
*lmargin
, gfloat
*rmargin
)
373 *tmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
375 *bmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
377 *lmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
379 *rmargin
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
383 dia_page_layout_set_margins(DiaPageLayout
*self
,
384 gfloat tmargin
, gfloat bmargin
,
385 gfloat lmargin
, gfloat rmargin
)
387 self
->block_changed
= TRUE
;
388 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->tmargin
), tmargin
);
389 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->bmargin
), bmargin
);
390 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->lmargin
), lmargin
);
391 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->rmargin
), rmargin
);
392 self
->block_changed
= FALSE
;
394 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
398 dia_page_layout_get_orientation(DiaPageLayout
*self
)
400 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
)
401 return DIA_PAGE_ORIENT_PORTRAIT
;
403 return DIA_PAGE_ORIENT_LANDSCAPE
;
407 dia_page_layout_set_orientation(DiaPageLayout
*self
,
408 DiaPageOrientation orient
)
411 case DIA_PAGE_ORIENT_PORTRAIT
:
412 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->orient_portrait
),
415 case DIA_PAGE_ORIENT_LANDSCAPE
:
416 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->orient_landscape
),
423 dia_page_layout_get_fitto(DiaPageLayout
*self
)
425 return GTK_TOGGLE_BUTTON(self
->fitto
)->active
;
429 dia_page_layout_set_fitto(DiaPageLayout
*self
, gboolean fitto
)
432 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->fitto
), TRUE
);
434 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self
->scale
), TRUE
);
438 dia_page_layout_get_scaling(DiaPageLayout
*self
)
440 return GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
/ 100.0;
444 dia_page_layout_set_scaling(DiaPageLayout
*self
, gfloat scaling
)
446 GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
= scaling
* 100.0;
447 gtk_adjustment_value_changed(GTK_SPIN_BUTTON(self
->scaling
)->adjustment
);
451 dia_page_layout_get_fit_dims(DiaPageLayout
*self
, gint
*w
, gint
*h
)
454 *w
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(self
->fitw
));
456 *h
= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(self
->fith
));
460 dia_page_layout_set_fit_dims(DiaPageLayout
*self
, gint w
, gint h
)
462 gtk_spin_button_set_value(GTK_SPIN_BUTTON(self
->fitw
), w
);
463 gtk_spin_button_set_value(GTK_SPIN_BUTTON(self
->fith
), h
);
467 dia_page_layout_get_effective_area(DiaPageLayout
*self
, gfloat
*width
,
470 gfloat h
, w
, scaling
;
472 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
473 w
= get_paper_pswidth(self
->papernum
);
474 h
= get_paper_psheight(self
->papernum
);
476 h
= get_paper_pswidth(self
->papernum
);
477 w
= get_paper_psheight(self
->papernum
);
479 h
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
480 h
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
481 w
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
482 w
-= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
483 scaling
= GTK_SPIN_BUTTON(self
->scaling
)->adjustment
->value
/ 100.0;
487 if (width
) *width
= w
;
488 if (height
) *height
= h
;
492 dia_page_layout_get_paper_size(const gchar
*paper
,
493 gfloat
*width
, gfloat
*height
)
497 i
= find_paper(paper
);
499 i
= get_default_paper();
501 *width
= get_paper_pswidth(i
);
503 *height
= get_paper_psheight(i
);
507 dia_page_layout_get_default_margins(const gchar
*paper
,
508 gfloat
*tmargin
, gfloat
*bmargin
,
509 gfloat
*lmargin
, gfloat
*rmargin
)
513 i
= find_paper(paper
);
515 i
= get_default_paper();
517 *tmargin
= get_paper_tmargin(i
);
519 *bmargin
= get_paper_bmargin(i
);
521 *lmargin
= get_paper_lmargin(i
);
523 *rmargin
= get_paper_rmargin(i
);
527 size_page(DiaPageLayout
*self
, GtkAllocation
*a
)
529 self
->width
= a
->width
- 3;
530 self
->height
= a
->height
- 3;
532 /* change to correct metrics */
533 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
534 if (self
->width
* get_paper_psheight(self
->papernum
) >
535 self
->height
* get_paper_pswidth(self
->papernum
))
536 self
->width
= self
->height
* get_paper_pswidth(self
->papernum
) /
537 get_paper_psheight(self
->papernum
);
539 self
->height
= self
->width
* get_paper_psheight(self
->papernum
) /
540 get_paper_pswidth(self
->papernum
);
542 if (self
->width
* get_paper_pswidth(self
->papernum
) >
543 self
->height
* get_paper_psheight(self
->papernum
))
544 self
->width
= self
->height
* get_paper_psheight(self
->papernum
) /
545 get_paper_pswidth(self
->papernum
);
547 self
->height
= self
->width
* get_paper_pswidth(self
->papernum
) /
548 get_paper_psheight(self
->papernum
);
551 self
->x
= (a
->width
- self
->width
- 3) / 2;
552 self
->y
= (a
->height
- self
->height
- 3) / 2;
556 darea_size_allocate(DiaPageLayout
*self
, GtkAllocation
*allocation
)
558 size_page(self
, allocation
);
562 darea_expose_event(DiaPageLayout
*self
, GdkEventExpose
*event
)
564 GdkWindow
*window
= self
->darea
->window
;
572 self
->gc
= gdk_gc_new(window
);
574 gdk_window_clear_area (window
,
576 self
->darea
->allocation
.width
,
577 self
->darea
->allocation
.height
);
579 /* draw the page image */
580 gdk_gc_set_foreground(self
->gc
, &self
->black
);
581 gdk_draw_rectangle(window
, self
->gc
, TRUE
, self
->x
+3, self
->y
+3,
582 self
->width
, self
->height
);
583 gdk_gc_set_foreground(self
->gc
, &self
->white
);
584 gdk_draw_rectangle(window
, self
->gc
, TRUE
, self
->x
, self
->y
,
585 self
->width
, self
->height
);
586 gdk_gc_set_foreground(self
->gc
, &self
->black
);
587 gdk_draw_rectangle(window
, self
->gc
, FALSE
, self
->x
, self
->y
,
588 self
->width
-1, self
->height
-1);
590 gdk_gc_set_foreground(self
->gc
, &self
->blue
);
593 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
594 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
595 num
= self
->y
+ val
* self
->height
/get_paper_psheight(self
->papernum
);
596 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
598 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
599 num
= self
->y
+ self
->height
-
600 val
* self
->height
/ get_paper_psheight(self
->papernum
);
601 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
603 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
604 num
= self
->x
+ val
* self
->width
/ get_paper_pswidth(self
->papernum
);
605 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
607 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
608 num
= self
->x
+ self
->width
-
609 val
* self
->width
/ get_paper_pswidth(self
->papernum
);
610 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
612 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->tmargin
));
613 num
= self
->y
+ val
* self
->height
/get_paper_pswidth(self
->papernum
);
614 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
616 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->bmargin
));
617 num
= self
->y
+ self
->height
-
618 val
* self
->height
/ get_paper_pswidth(self
->papernum
);
619 gdk_draw_line(window
, self
->gc
, self
->x
+1, num
, self
->x
+self
->width
-2,num
);
621 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->lmargin
));
622 num
= self
->x
+ val
* self
->width
/ get_paper_psheight(self
->papernum
);
623 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
625 val
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(self
->rmargin
));
626 num
= self
->x
+ self
->width
-
627 val
* self
->width
/ get_paper_psheight(self
->papernum
);
628 gdk_draw_line(window
, self
->gc
, num
, self
->y
+1,num
,self
->y
+self
->height
-2);
635 paper_size_change(GtkMenuItem
*item
, DiaPageLayout
*self
)
639 self
->papernum
= GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(item
)));
640 size_page(self
, &self
->darea
->allocation
);
641 gtk_widget_queue_draw(self
->darea
);
643 self
->block_changed
= TRUE
;
644 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->tmargin
),
645 get_paper_tmargin(self
->papernum
));
646 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->bmargin
),
647 get_paper_bmargin(self
->papernum
));
648 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->lmargin
),
649 get_paper_lmargin(self
->papernum
));
650 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(self
->rmargin
),
651 get_paper_rmargin(self
->papernum
));
653 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
654 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
655 get_paper_psheight(self
->papernum
);
656 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
657 get_paper_psheight(self
->papernum
);
658 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
659 get_paper_pswidth(self
->papernum
);
660 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
661 get_paper_pswidth(self
->papernum
);
663 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
664 get_paper_pswidth(self
->papernum
);
665 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
666 get_paper_pswidth(self
->papernum
);
667 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
668 get_paper_psheight(self
->papernum
);
669 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
670 get_paper_psheight(self
->papernum
);
672 self
->block_changed
= FALSE
;
674 g_snprintf(buf
, sizeof(buf
), _("%0.3gcm x %0.3gcm"),
675 get_paper_pswidth(self
->papernum
),
676 get_paper_psheight(self
->papernum
));
677 gtk_label_set(GTK_LABEL(self
->paper_label
), buf
);
679 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
683 orient_changed(DiaPageLayout
*self
)
685 size_page(self
, &self
->darea
->allocation
);
686 gtk_widget_queue_draw(self
->darea
);
688 if (GTK_TOGGLE_BUTTON(self
->orient_portrait
)->active
) {
689 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
690 get_paper_psheight(self
->papernum
);
691 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
692 get_paper_psheight(self
->papernum
);
693 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
694 get_paper_pswidth(self
->papernum
);
695 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
696 get_paper_pswidth(self
->papernum
);
698 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->tmargin
))->upper
=
699 get_paper_pswidth(self
->papernum
);
700 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->bmargin
))->upper
=
701 get_paper_pswidth(self
->papernum
);
702 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->lmargin
))->upper
=
703 get_paper_psheight(self
->papernum
);
704 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(self
->rmargin
))->upper
=
705 get_paper_psheight(self
->papernum
);
708 if (!self
->block_changed
)
709 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
713 margin_changed(DiaPageLayout
*self
)
715 gtk_widget_queue_draw(self
->darea
);
716 if (!self
->block_changed
)
717 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
721 scalemode_changed(DiaPageLayout
*self
)
723 if (GTK_TOGGLE_BUTTON(self
->fitto
)->active
) {
724 gtk_widget_set_sensitive(self
->scaling
, FALSE
);
725 gtk_widget_set_sensitive(self
->fitw
, TRUE
);
726 gtk_widget_set_sensitive(self
->fith
, TRUE
);
728 gtk_widget_set_sensitive(self
->scaling
, TRUE
);
729 gtk_widget_set_sensitive(self
->fitw
, FALSE
);
730 gtk_widget_set_sensitive(self
->fith
, FALSE
);
732 if (!self
->block_changed
)
733 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
737 scale_changed(DiaPageLayout
*self
)
739 if (!self
->block_changed
)
740 gtk_signal_emit(GTK_OBJECT(self
), pl_signals
[CHANGED
]);
744 dia_page_layout_destroy(GtkObject
*object
)
746 DiaPageLayout
*self
= DIA_PAGE_LAYOUT(object
);
749 gdk_gc_unref(self
->gc
);
751 if (parent_class
->destroy
)
752 (* parent_class
->destroy
)(object
);
755 #ifdef PAGELAYOUT_TEST
758 changed_signal(DiaPageLayout
*self
)
760 g_message("changed");
763 fittopage_signal(DiaPageLayout
*self
)
765 g_message("fit to page");
769 main(int argc
, char **argv
)
773 gtk_init(&argc
, &argv
);
775 win
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
776 gtk_window_set_title(GTK_WINDOW(win
), _("Page Setup"));
777 gtk_signal_connect(GTK_OBJECT(win
), "destroy",
778 GTK_SIGNAL_FUNC(gtk_main_quit
), NULL
);
780 pl
= dia_page_layout_new();
781 gtk_container_set_border_width(GTK_CONTAINER(pl
), 5);
782 gtk_container_add(GTK_CONTAINER(win
), pl
);
785 gtk_signal_connect(GTK_OBJECT(pl
), "changed",
786 GTK_SIGNAL_FUNC(changed_signal
), NULL
);
787 gtk_signal_connect(GTK_OBJECT(pl
), "fittopage",
788 GTK_SIGNAL_FUNC(fittopage_signal
), NULL
);
790 gtk_widget_show(win
);