1 /* ev-annotation-properties-dialog.c
2  *  this file is part of atril, a mate document viewer
3  *
4  * Copyright (C) 2010 Carlos Garcia Campos  <carlosgc@gnome.org>
5  *
6  * Atril is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Atril is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20 
21 #include <config.h>
22 
23 #include <glib/gi18n.h>
24 
25 #include "ev-annotation-properties-dialog.h"
26 
27 enum {
28 	PROP_0,
29 	PROP_ANNOT_TYPE
30 };
31 
32 struct _EvAnnotationPropertiesDialog {
33 	GtkDialog        base_instance;
34 
35 	EvAnnotationType annot_type;
36 	EvAnnotation    *annot;
37 
38 	GtkWidget       *grid;
39 
40 	GtkWidget       *author;
41 	GtkWidget       *color;
42 	GtkWidget       *opacity;
43 	GtkWidget       *popup_state;
44 
45 	/* Text Annotations */
46 	GtkWidget       *icon;
47 };
48 
49 struct _EvAnnotationPropertiesDialogClass {
50 	GtkDialogClass base_class;
51 };
52 
G_DEFINE_TYPE(EvAnnotationPropertiesDialog,ev_annotation_properties_dialog,GTK_TYPE_DIALOG)53 G_DEFINE_TYPE (EvAnnotationPropertiesDialog, ev_annotation_properties_dialog, GTK_TYPE_DIALOG)
54 
55 static void
56 ev_annotation_properties_dialog_dispose (GObject *object)
57 {
58 	EvAnnotationPropertiesDialog *dialog = EV_ANNOTATION_PROPERTIES_DIALOG (object);
59 
60 	if (dialog->annot) {
61 		g_object_unref (dialog->annot);
62 		dialog->annot = NULL;
63 	}
64 
65 	G_OBJECT_CLASS (ev_annotation_properties_dialog_parent_class)->dispose (object);
66 }
67 
68 static void
ev_annotation_properties_dialog_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)69 ev_annotation_properties_dialog_set_property (GObject      *object,
70 					      guint         prop_id,
71 					      const GValue *value,
72 					      GParamSpec   *pspec)
73 {
74 	EvAnnotationPropertiesDialog *dialog = EV_ANNOTATION_PROPERTIES_DIALOG (object);
75 
76 	switch (prop_id) {
77 	case PROP_ANNOT_TYPE:
78 		dialog->annot_type = g_value_get_enum (value);
79 		break;
80 	default:
81 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
82 	}
83 }
84 
85 static void
ev_annotation_properties_dialog_constructed(GObject * object)86 ev_annotation_properties_dialog_constructed (GObject *object)
87 {
88 	EvAnnotationPropertiesDialog *dialog = EV_ANNOTATION_PROPERTIES_DIALOG (object);
89 	GtkWidget *grid = dialog->grid;
90 	GtkWidget *label;
91 
92 	gtk_window_set_titlebar (GTK_WINDOW (dialog), NULL);
93 
94 	switch (dialog->annot_type) {
95 	case EV_ANNOTATION_TYPE_TEXT:
96 		label = gtk_label_new (_("Icon:"));
97 		gtk_label_set_xalign (GTK_LABEL (label), 0.0);
98 		gtk_grid_attach (GTK_GRID (grid), label, 0, 5, 1, 1);
99 		gtk_widget_show (label);
100 
101 		dialog->icon = gtk_combo_box_text_new ();
102 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Note"));
103 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Comment"));
104 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Key"));
105 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Help"));
106 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("New Paragraph"));
107 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Paragraph"));
108 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Insert"));
109 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Cross"));
110 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Circle"));
111 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dialog->icon), _("Unknown"));
112 		gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->icon), 0);
113 		gtk_grid_attach (GTK_GRID (grid), dialog->icon, 1, 5, 1, 1);
114 		gtk_widget_set_hexpand (dialog->icon, TRUE);
115 		gtk_widget_show (dialog->icon);
116 
117 		break;
118 	case EV_ANNOTATION_TYPE_ATTACHMENT:
119 		/* TODO */
120 	default:
121 		break;
122 	}
123 }
124 
125 static void
ev_annotation_properties_dialog_init(EvAnnotationPropertiesDialog * annot_dialog)126 ev_annotation_properties_dialog_init (EvAnnotationPropertiesDialog *annot_dialog)
127 {
128 	GtkDialog *dialog = GTK_DIALOG (annot_dialog);
129 	GtkWidget *content_area;
130 	GtkWidget *label;
131 	GtkWidget *grid;
132 	GtkWidget *hbox;
133 	gchar     *markup;
134 	const GdkRGBA yellow = { 1., 1., 0., 1. };
135 
136 	gtk_window_set_title (GTK_WINDOW (annot_dialog), _("Annotation Properties"));
137 	gtk_window_set_destroy_with_parent (GTK_WINDOW (annot_dialog), TRUE);
138 	gtk_container_set_border_width (GTK_CONTAINER (annot_dialog), 5);
139 	gtk_dialog_add_buttons (dialog,
140 				"gtk-close", GTK_RESPONSE_CLOSE,
141 				"gtk-apply", GTK_RESPONSE_APPLY,
142 				NULL);
143 	gtk_dialog_set_default_response (dialog, GTK_RESPONSE_APPLY);
144 
145 	content_area = gtk_dialog_get_content_area (dialog);
146 	gtk_box_set_spacing (GTK_BOX (content_area), 2);
147 
148 	grid = gtk_grid_new ();
149 	annot_dialog->grid = grid;
150 	gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
151 	gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
152 	gtk_container_set_border_width (GTK_CONTAINER (grid), 12);
153 	gtk_box_pack_start (GTK_BOX (content_area), grid, FALSE, FALSE, 0);
154 	gtk_widget_show (grid);
155 
156 	label = gtk_label_new (_("Author:"));
157 	gtk_label_set_xalign (GTK_LABEL (label), 0.0);
158 	gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
159 	gtk_widget_show (label);
160 
161 	annot_dialog->author = gtk_entry_new ();
162 	gtk_entry_set_text (GTK_ENTRY (annot_dialog->author), g_get_real_name ());
163 	gtk_grid_attach (GTK_GRID (grid), annot_dialog->author, 1, 0, 1, 1);
164 	gtk_widget_set_hexpand (annot_dialog->author, TRUE);
165 	gtk_widget_show (annot_dialog->author);
166 
167 	label = gtk_label_new (_("Color:"));
168 	gtk_label_set_xalign (GTK_LABEL (label), 0.0);
169 	gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
170 	gtk_widget_show (label);
171 
172 	annot_dialog->color = gtk_color_button_new_with_rgba (&yellow);
173 	gtk_grid_attach (GTK_GRID (grid), annot_dialog->color, 1, 1, 1, 1);
174 	gtk_widget_set_hexpand (annot_dialog->color, TRUE);
175 	gtk_widget_show (annot_dialog->color);
176 
177 	label = gtk_label_new (_("Style:"));
178 	gtk_label_set_xalign (GTK_LABEL (label), 0.0);
179 	gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
180 	gtk_widget_show (label);
181 
182 	annot_dialog->opacity = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 5);
183 	gtk_range_set_value (GTK_RANGE (annot_dialog->opacity), 100);
184 	gtk_grid_attach (GTK_GRID (grid), annot_dialog->opacity, 1, 2, 1, 1);
185 	gtk_widget_set_hexpand (annot_dialog->opacity, TRUE);
186 	gtk_widget_show (annot_dialog->opacity);
187 
188 	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
189 
190 	label = gtk_label_new (NULL);
191 	markup = g_strdup_printf ("<small>%s</small>", _("Transparent"));
192 	gtk_label_set_markup (GTK_LABEL (label), markup);
193 	g_free (markup);
194 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
195 	gtk_widget_show (label);
196 
197 	label = gtk_label_new (NULL);
198 	markup = g_strdup_printf ("<small>%s</small>", _("Opaque"));
199 	gtk_label_set_markup (GTK_LABEL (label), markup);
200 	g_free (markup);
201 	gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
202 	gtk_widget_show (label);
203 
204 	gtk_grid_attach (GTK_GRID (grid), hbox, 1, 3, 1, 1);
205 	gtk_widget_set_hexpand (hbox, TRUE);
206 	gtk_widget_show (hbox);
207 
208 	label = gtk_label_new (_("Initial window state:"));
209 	gtk_label_set_xalign (GTK_LABEL (label), 0.0);
210 	gtk_grid_attach (GTK_GRID (grid), label, 0, 4, 1, 1);
211 	gtk_widget_show (label);
212 
213 	annot_dialog->popup_state = gtk_combo_box_text_new ();
214 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (annot_dialog->popup_state), _("Open"));
215 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (annot_dialog->popup_state), _("Close"));
216 	gtk_combo_box_set_active (GTK_COMBO_BOX (annot_dialog->popup_state), 1);
217 	gtk_grid_attach (GTK_GRID (grid), annot_dialog->popup_state, 1, 4, 1, 1);
218 	gtk_widget_set_hexpand (annot_dialog->popup_state, TRUE);
219 	gtk_widget_show (annot_dialog->popup_state);
220 }
221 
222 static void
ev_annotation_properties_dialog_class_init(EvAnnotationPropertiesDialogClass * klass)223 ev_annotation_properties_dialog_class_init (EvAnnotationPropertiesDialogClass *klass)
224 {
225 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
226 
227 	object_class->dispose = ev_annotation_properties_dialog_dispose;
228 	object_class->constructed = ev_annotation_properties_dialog_constructed;
229 	object_class->set_property = ev_annotation_properties_dialog_set_property;
230 
231 	g_object_class_install_property (object_class,
232 					 PROP_ANNOT_TYPE,
233 					 g_param_spec_enum ("annot-type",
234 							    "AnnotType",
235 							    "The type of annotation",
236 							    EV_TYPE_ANNOTATION_TYPE,
237 							    EV_ANNOTATION_TYPE_TEXT,
238 							    G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
239 }
240 
241 GtkWidget *
ev_annotation_properties_dialog_new(EvAnnotationType annot_type)242 ev_annotation_properties_dialog_new (EvAnnotationType annot_type)
243 {
244 	return GTK_WIDGET (g_object_new (EV_TYPE_ANNOTATION_PROPERTIES_DIALOG,
245 					 "annot-type", annot_type,
246 					 NULL));
247 }
248 
249 GtkWidget *
ev_annotation_properties_dialog_new_with_annotation(EvAnnotation * annot)250 ev_annotation_properties_dialog_new_with_annotation (EvAnnotation *annot)
251 {
252 	EvAnnotationPropertiesDialog *dialog;
253 	const gchar                  *label;
254 	gdouble                       opacity;
255 	gboolean                      is_open;
256 	GdkRGBA                       rgba;
257 
258 	dialog = (EvAnnotationPropertiesDialog *)ev_annotation_properties_dialog_new (ev_annotation_get_annotation_type (annot));
259 	dialog->annot = g_object_ref (annot);
260 
261 	label = ev_annotation_markup_get_label (EV_ANNOTATION_MARKUP (annot));
262 	if (label)
263 		gtk_entry_set_text (GTK_ENTRY (dialog->author), label);
264 
265 	ev_annotation_get_rgba (annot, &rgba);
266 	gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog->color), &rgba);
267 
268 	opacity = ev_annotation_markup_get_opacity (EV_ANNOTATION_MARKUP (annot));
269 	gtk_range_set_value (GTK_RANGE (dialog->opacity), opacity * 100);
270 
271 	is_open = ev_annotation_markup_get_popup_is_open (EV_ANNOTATION_MARKUP (annot));
272 	gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->popup_state),
273 				  is_open ? 0 : 1);
274 
275 	if (EV_IS_ANNOTATION_TEXT (annot)) {
276 		EvAnnotationText *annot_text = EV_ANNOTATION_TEXT (annot);
277 
278 		gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->icon),
279 					  ev_annotation_text_get_icon (annot_text));
280 	}
281 
282 	return GTK_WIDGET (dialog);
283 }
284 
285 const gchar *
ev_annotation_properties_dialog_get_author(EvAnnotationPropertiesDialog * dialog)286 ev_annotation_properties_dialog_get_author (EvAnnotationPropertiesDialog *dialog)
287 {
288 	return gtk_entry_get_text (GTK_ENTRY (dialog->author));
289 }
290 
291 void
ev_annotation_properties_dialog_get_rgba(EvAnnotationPropertiesDialog * dialog,GdkRGBA * rgba)292 ev_annotation_properties_dialog_get_rgba (EvAnnotationPropertiesDialog *dialog,
293 					  GdkRGBA                      *rgba)
294 {
295 	gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog->color), rgba);
296 }
297 
298 gdouble
ev_annotation_properties_dialog_get_opacity(EvAnnotationPropertiesDialog * dialog)299 ev_annotation_properties_dialog_get_opacity (EvAnnotationPropertiesDialog *dialog)
300 {
301 	return gtk_range_get_value (GTK_RANGE (dialog->opacity)) / 100;
302 }
303 
304 gboolean
ev_annotation_properties_dialog_get_popup_is_open(EvAnnotationPropertiesDialog * dialog)305 ev_annotation_properties_dialog_get_popup_is_open (EvAnnotationPropertiesDialog *dialog)
306 {
307 	return gtk_combo_box_get_active (GTK_COMBO_BOX (dialog->popup_state)) == 0;
308 }
309 
310 EvAnnotationTextIcon
ev_annotation_properties_dialog_get_text_icon(EvAnnotationPropertiesDialog * dialog)311 ev_annotation_properties_dialog_get_text_icon (EvAnnotationPropertiesDialog *dialog)
312 {
313 	return gtk_combo_box_get_active (GTK_COMBO_BOX (dialog->icon));
314 }
315