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