]> Pileus Git - ~andy/gtk/blob - gtk/gtkpagesetup.c
8406a28e8845b9c5a9a95cf0e29825647ca73d94
[~andy/gtk] / gtk / gtkpagesetup.c
1 /* GTK - The GIMP Toolkit
2  * gtkpagesetup.c: Page Setup
3  * Copyright (C) 2006, Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #include "config.h"
22
23 #include "gtkpagesetup.h"
24 #include "gtkalias.h"
25
26 #define MM_PER_INCH 25.4
27 #define POINTS_PER_INCH 72
28
29 typedef struct _GtkPageSetupClass GtkPageSetupClass;
30
31 #define GTK_IS_PAGE_SETUP_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PAGE_SETUP))
32 #define GTK_PAGE_SETUP_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PAGE_SETUP, GtkPageSetupClass))
33 #define GTK_PAGE_SETUP_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PAGE_SETUP, GtkPageSetupClass))
34
35 struct _GtkPageSetup
36 {
37   GObject parent_instance;
38
39   GtkPageOrientation orientation;
40   GtkPaperSize *paper_size;
41   /* These are stored in mm */
42   double top_margin, bottom_margin, left_margin, right_margin;
43 };
44
45 struct _GtkPageSetupClass
46 {
47   GObjectClass parent_class;
48 };
49
50 G_DEFINE_TYPE (GtkPageSetup, gtk_page_setup, G_TYPE_OBJECT)
51
52 static double
53 to_mm (double len, GtkUnit unit)
54 {
55   switch (unit)
56     {
57     case GTK_UNIT_MM:
58       return len;
59     case GTK_UNIT_INCH:
60       return len * MM_PER_INCH;
61     default:
62     case GTK_UNIT_PIXEL:
63       g_warning ("Unsupported unit");
64       /* Fall through */
65     case GTK_UNIT_POINTS:
66       return len * (MM_PER_INCH / POINTS_PER_INCH);
67       break;
68     }
69 }
70
71 static double
72 from_mm (double len, GtkUnit unit)
73 {
74   switch (unit)
75     {
76     case GTK_UNIT_MM:
77       return len;
78     case GTK_UNIT_INCH:
79       return len / MM_PER_INCH;
80     default:
81     case GTK_UNIT_PIXEL:
82       g_warning ("Unsupported unit");
83       /* Fall through */
84     case GTK_UNIT_POINTS:
85       return len / (MM_PER_INCH / POINTS_PER_INCH);
86       break;
87     }
88 }
89
90 static void
91 gtk_page_setup_finalize (GObject *object)
92 {
93   GtkPageSetup *setup = GTK_PAGE_SETUP (object);
94   
95   gtk_paper_size_free (setup->paper_size);
96   
97   G_OBJECT_CLASS (gtk_page_setup_parent_class)->finalize (object);
98 }
99
100 static void
101 gtk_page_setup_init (GtkPageSetup *setup)
102 {
103   setup->paper_size = gtk_paper_size_new (NULL);
104   setup->orientation = GTK_PAGE_ORIENTATION_PORTRAIT;
105   setup->top_margin = gtk_paper_size_get_default_top_margin (setup->paper_size, GTK_UNIT_MM);
106   setup->bottom_margin = gtk_paper_size_get_default_bottom_margin (setup->paper_size, GTK_UNIT_MM);
107   setup->left_margin = gtk_paper_size_get_default_left_margin (setup->paper_size, GTK_UNIT_MM);
108   setup->right_margin = gtk_paper_size_get_default_right_margin (setup->paper_size, GTK_UNIT_MM);
109 }
110
111 static void
112 gtk_page_setup_class_init (GtkPageSetupClass *class)
113 {
114   GObjectClass *gobject_class = (GObjectClass *)class;
115
116   gobject_class->finalize = gtk_page_setup_finalize;
117 }
118   
119 GtkPageSetup *
120 gtk_page_setup_new (void)
121 {
122   return g_object_new (GTK_TYPE_PAGE_SETUP, NULL);
123 }
124
125 GtkPageSetup *
126 gtk_page_setup_copy (GtkPageSetup *other)
127 {
128   GtkPageSetup *copy;
129
130   copy = gtk_page_setup_new ();
131   copy->orientation = other->orientation;
132   copy->paper_size = gtk_paper_size_copy (other->paper_size);
133   copy->top_margin = other->top_margin;
134   copy->bottom_margin = other->bottom_margin;
135   copy->left_margin = other->left_margin;
136   copy->right_margin = other->right_margin;
137
138   return copy;
139 }
140
141 GtkPageOrientation
142 gtk_page_setup_get_orientation (GtkPageSetup *setup)
143 {
144   return setup->orientation;
145 }
146
147 void
148 gtk_page_setup_set_orientation (GtkPageSetup *setup,
149                                 GtkPageOrientation orientation)
150 {
151   setup->orientation = orientation;
152 }
153
154 GtkPaperSize *
155 gtk_page_setup_get_paper_size (GtkPageSetup *setup)
156 {
157   return setup->paper_size;
158 }
159
160 void
161 gtk_page_setup_set_paper_size (GtkPageSetup *setup,
162                                GtkPaperSize *size)
163 {
164   setup->paper_size = gtk_paper_size_copy (size);
165 }
166
167 void
168 gtk_page_setup_set_paper_size_and_default_margins (GtkPageSetup *setup,
169                                                    GtkPaperSize *size)
170 {
171   setup->paper_size = gtk_paper_size_copy (size);
172   setup->top_margin = gtk_paper_size_get_default_top_margin (setup->paper_size, GTK_UNIT_MM);
173   setup->bottom_margin = gtk_paper_size_get_default_bottom_margin (setup->paper_size, GTK_UNIT_MM);
174   setup->left_margin = gtk_paper_size_get_default_left_margin (setup->paper_size, GTK_UNIT_MM);
175   setup->right_margin = gtk_paper_size_get_default_right_margin (setup->paper_size, GTK_UNIT_MM);
176 }
177
178 double
179 gtk_page_setup_get_top_margin (GtkPageSetup *setup,
180                                GtkUnit       unit)
181 {
182   return from_mm (setup->top_margin, unit);
183 }
184
185 void
186 gtk_page_setup_set_top_margin (GtkPageSetup *setup,
187                                double        margin,
188                                GtkUnit       unit)
189 {
190   setup->top_margin = to_mm (margin, unit);
191 }
192
193 double
194 gtk_page_setup_get_bottom_margin (GtkPageSetup *setup,
195                                   GtkUnit       unit)
196 {
197   return from_mm (setup->bottom_margin, unit);
198 }
199
200 void
201 gtk_page_setup_set_bottom_margin (GtkPageSetup *setup,
202                                   double        margin,
203                                   GtkUnit       unit)
204 {
205   setup->bottom_margin = to_mm (margin, unit);
206 }
207
208 double
209 gtk_page_setup_get_left_margin (GtkPageSetup    *setup,
210                                 GtkUnit          unit)
211 {
212   return from_mm (setup->left_margin, unit);
213 }
214
215 void
216 gtk_page_setup_set_left_margin (GtkPageSetup    *setup,
217                                 double           margin,
218                                 GtkUnit          unit)
219 {
220   setup->left_margin = to_mm (margin, unit);
221 }
222
223 double
224 gtk_page_setup_get_right_margin (GtkPageSetup    *setup,
225                                  GtkUnit          unit)
226 {
227   return from_mm (setup->right_margin, unit);
228 }
229
230 void
231 gtk_page_setup_set_right_margin (GtkPageSetup    *setup,
232                                  double           margin,
233                                  GtkUnit          unit)
234 {
235   setup->right_margin = to_mm (margin, unit);
236 }
237
238 /* These take orientation, but not margins into consideration */
239 double
240 gtk_page_setup_get_paper_width (GtkPageSetup *setup,
241                                 GtkUnit       unit)
242 {
243   if (setup->orientation == GTK_PAGE_ORIENTATION_PORTRAIT ||
244       setup->orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT)
245     return gtk_paper_size_get_width (setup->paper_size, unit);
246   else
247     return gtk_paper_size_get_height (setup->paper_size, unit);
248 }
249
250 double
251 gtk_page_setup_get_paper_height (GtkPageSetup  *setup,
252                                  GtkUnit        unit)
253 {
254   if (setup->orientation == GTK_PAGE_ORIENTATION_PORTRAIT ||
255       setup->orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT)
256     return gtk_paper_size_get_height (setup->paper_size, unit);
257   else
258     return gtk_paper_size_get_width (setup->paper_size, unit);
259 }
260
261 /* These take orientation, and margins into consideration */
262 double
263 gtk_page_setup_get_page_width (GtkPageSetup    *setup,
264                                GtkUnit          unit)
265 {
266   double width;
267   
268   width = gtk_page_setup_get_paper_width (setup, GTK_UNIT_MM);
269   width -= setup->left_margin + setup->right_margin;
270   
271   return from_mm (width, unit);
272 }
273
274 double
275 gtk_page_setup_get_page_height (GtkPageSetup    *setup,
276                                 GtkUnit          unit)
277 {
278   double height;
279   
280   height = gtk_page_setup_get_paper_height (setup, GTK_UNIT_MM);
281   height -= setup->top_margin + setup->bottom_margin;
282   
283   return from_mm (height, unit);
284 }
285
286
287 #define __GTK_PAGE_SETUP_C__
288 #include "gtkaliasdef.c"