]> www.fi.muni.cz Git - evince.git/blob - libdocument/ev-form-field.c
Include config.h. Bug #504721.
[evince.git] / libdocument / ev-form-field.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /* this file is part of evince, a gnome document viewer
3  *
4  *  Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
5  *  Copyright (C) 2006 Julien Rebetez
6  *
7  * Evince is free software; you can redistribute it and/or modify it
8  * 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.
11  *
12  * Evince is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
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.
20  */
21
22 #include <config.h>
23 #include "ev-form-field.h"
24
25 static void ev_form_field_init                 (EvFormField               *field);
26 static void ev_form_field_class_init           (EvFormFieldClass          *klass);
27 static void ev_form_field_text_init            (EvFormFieldText           *field_text);
28 static void ev_form_field_text_class_init      (EvFormFieldTextClass      *klass);
29 static void ev_form_field_button_init          (EvFormFieldButton         *field_button);
30 static void ev_form_field_button_class_init    (EvFormFieldButtonClass    *klass);
31 static void ev_form_field_choice_init          (EvFormFieldChoice         *field_choice);
32 static void ev_form_field_choice_class_init    (EvFormFieldChoiceClass    *klass);
33 static void ev_form_field_signature_init       (EvFormFieldSignature      *field_choice);
34 static void ev_form_field_signature_class_init (EvFormFieldSignatureClass *klass);
35
36 G_DEFINE_ABSTRACT_TYPE (EvFormField, ev_form_field, G_TYPE_OBJECT)
37 G_DEFINE_TYPE (EvFormFieldText, ev_form_field_text, EV_TYPE_FORM_FIELD)
38 G_DEFINE_TYPE (EvFormFieldButton, ev_form_field_button, EV_TYPE_FORM_FIELD)
39 G_DEFINE_TYPE (EvFormFieldChoice, ev_form_field_choice, EV_TYPE_FORM_FIELD)
40 G_DEFINE_TYPE (EvFormFieldSignature, ev_form_field_signature, EV_TYPE_FORM_FIELD)
41
42 static void
43 ev_form_field_init (EvFormField *field)
44 {
45         field->page = -1;
46         field->changed = FALSE;
47         field->is_read_only = FALSE;
48 }
49
50 static void
51 ev_form_field_class_init (EvFormFieldClass *klass)
52 {
53 }
54
55 static void
56 ev_form_field_text_finalize (GObject *object)
57 {
58         EvFormFieldText *field_text = EV_FORM_FIELD_TEXT (object);
59
60         if (field_text->text) {
61                 g_free (field_text->text);
62                 field_text->text = NULL;
63         }
64
65         (* G_OBJECT_CLASS (ev_form_field_text_parent_class)->finalize) (object);
66 }
67
68 static void
69 ev_form_field_text_init (EvFormFieldText *field_text)
70 {
71 }
72
73 static void
74 ev_form_field_text_class_init (EvFormFieldTextClass *klass)
75 {
76         GObjectClass *object_class = G_OBJECT_CLASS (klass);
77
78         object_class->finalize = ev_form_field_text_finalize;
79 }
80
81 static void
82 ev_form_field_button_init (EvFormFieldButton *field_button)
83 {
84 }
85
86 static void
87 ev_form_field_button_class_init (EvFormFieldButtonClass *klass)
88 {
89 }
90
91 static void
92 ev_form_field_choice_finalize (GObject *object)
93 {
94         EvFormFieldChoice *field_choice = EV_FORM_FIELD_CHOICE (object);
95
96         if (field_choice->selected_items) {
97                 g_list_free (field_choice->selected_items);
98                 field_choice->selected_items = NULL;
99         }
100
101         if (field_choice->text) {
102                 g_free (field_choice->text);
103                 field_choice->text = NULL;
104         }
105
106         (* G_OBJECT_CLASS (ev_form_field_choice_parent_class)->finalize) (object);
107 }
108
109 static void
110 ev_form_field_choice_init (EvFormFieldChoice *field_choice)
111 {
112 }
113
114 static void
115 ev_form_field_choice_class_init (EvFormFieldChoiceClass *klass)
116 {
117         GObjectClass *object_class = G_OBJECT_CLASS (klass);
118
119         object_class->finalize = ev_form_field_choice_finalize;
120 }
121
122 static void
123 ev_form_field_signature_init (EvFormFieldSignature *field_signature)
124 {
125 }
126
127 static void
128 ev_form_field_signature_class_init (EvFormFieldSignatureClass *klass)
129 {
130 }
131
132 EvFormField *
133 ev_form_field_text_new (gint                id,
134                         EvFormFieldTextType type)
135 {
136         EvFormField *field;
137         
138         g_return_val_if_fail (id >= 0, NULL);
139         g_return_val_if_fail (type >= EV_FORM_FIELD_TEXT_NORMAL &&
140                               type <= EV_FORM_FIELD_TEXT_FILE_SELECT, NULL);
141
142         field = EV_FORM_FIELD (g_object_new (EV_TYPE_FORM_FIELD_TEXT, NULL));
143         field->id = id;
144         EV_FORM_FIELD_TEXT (field)->type = type;
145
146         return field;
147 }
148
149 EvFormField *
150 ev_form_field_button_new (gint                  id,
151                           EvFormFieldButtonType type)
152 {
153         EvFormField *field;
154
155         g_return_val_if_fail (id >= 0, NULL);
156         g_return_val_if_fail (type >= EV_FORM_FIELD_BUTTON_PUSH &&
157                               type <= EV_FORM_FIELD_BUTTON_RADIO, NULL);
158
159         field = EV_FORM_FIELD (g_object_new (EV_TYPE_FORM_FIELD_BUTTON, NULL));
160         field->id = id;
161         EV_FORM_FIELD_BUTTON (field)->type = type;
162
163         return field;
164 }
165
166 EvFormField *
167 ev_form_field_choice_new (gint                  id,
168                           EvFormFieldChoiceType type)
169 {
170         EvFormField *field;
171
172         g_return_val_if_fail (id >= 0, NULL);
173         g_return_val_if_fail (type >= EV_FORM_FIELD_CHOICE_COMBO &&
174                               type <= EV_FORM_FIELD_CHOICE_LIST, NULL);
175         
176         field = EV_FORM_FIELD (g_object_new (EV_TYPE_FORM_FIELD_CHOICE, NULL));
177         field->id = id;
178         EV_FORM_FIELD_CHOICE (field)->type = type;
179
180         return field;
181 }
182
183 EvFormField *
184 ev_form_field_signature_new (gint id)
185 {
186         EvFormField *field;
187
188         g_return_val_if_fail (id >= 0, NULL);
189
190         field = EV_FORM_FIELD (g_object_new (EV_TYPE_FORM_FIELD_SIGNATURE, NULL));
191         field->id = id;
192
193         return field;
194 }
195
196 /* EvFormFieldMapping */
197 static void
198 ev_form_field_mapping_free_foreach (EvFormFieldMapping *mapping)
199 {
200         g_object_unref (mapping->field);
201         g_free (mapping);
202 }
203
204 void
205 ev_form_field_mapping_free (GList *field_mapping)
206 {
207         if (!field_mapping)
208                 return;
209
210         g_list_foreach (field_mapping, (GFunc)ev_form_field_mapping_free_foreach, NULL);
211         g_list_free (field_mapping);
212 }
213
214 EvFormField *
215 ev_form_field_mapping_find (GList   *field_mapping,
216                             gdouble  x,
217                             gdouble  y)
218 {
219         GList *list;
220
221         for (list = field_mapping; list; list = list->next) {
222                 EvFormFieldMapping *mapping = list->data;
223
224                 if ((x >= mapping->x1) &&
225                     (y >= mapping->y1) &&
226                     (x <= mapping->x2) &&
227                     (y <= mapping->y2)) {
228                         return mapping->field;
229                 }
230         }
231
232         return NULL;
233 }
234
235 void
236 ev_form_field_mapping_get_area (GList       *field_mapping,
237                                 EvFormField *field,
238                                 EvRectangle *area)
239 {
240         GList *list;
241
242         for (list = field_mapping; list; list = list->next) {
243                 EvFormFieldMapping *mapping = list->data;
244
245                 if (mapping->field->id == field->id) {
246                         area->x1 = mapping->x1;
247                         area->y1 = mapping->y1;
248                         area->x2 = mapping->x2;
249                         area->y2 = mapping->y2;
250
251                         break;
252                 }
253         }
254 }
255
256 EvFormField *
257 ev_form_field_mapping_find_by_id (GList *field_mapping,
258                                   gint   id)
259 {
260         GList *list;
261         
262         for (list = field_mapping; list; list = list->next) {
263                 EvFormFieldMapping *mapping = list->data;
264
265                 if (id == mapping->field->id)
266                         return mapping->field;
267         }
268         
269         return NULL;
270 }