1 /* font-manager-license-pane.c
2  *
3  * Copyright (C) 2009 - 2021 Jerry Casiano
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program 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
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.
17  *
18  * If not, see <http://www.gnu.org/licenses/gpl-3.0.txt>.
19 */
20 
21 #include "font-manager-license-pane.h"
22 
23 /**
24  * SECTION: font-manager-license-pane
25  * @short_description: Font licensing details
26  * @title: License Pane
27  * @include: font-manager-license-pane.h
28  *
29  * Widget which displays embedded or detected font licensing data.
30  */
31 
32 struct _FontManagerLicensePane
33 {
34     GtkEventBox   parent_instance;
35 
36     gint        _fsType;
37     GtkWidget   *fsType;
38     GtkWidget   *license_data;
39     GtkWidget   *license_url;
40     GtkWidget   *placeholder;
41 
42 };
43 
44 G_DEFINE_TYPE(FontManagerLicensePane, font_manager_license_pane, GTK_TYPE_EVENT_BOX)
45 
46 enum
47 {
48     PROP_RESERVED,
49     PROP_FSTYPE,
50     PROP_LICENSE_DATA,
51     PROP_LICENSE_URL,
52     N_PROPERTIES
53 };
54 
55 static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
56 
57 static void
font_manager_license_pane_get_property(GObject * gobject,guint property_id,GValue * value,GParamSpec * pspec)58 font_manager_license_pane_get_property (GObject *gobject,
59                                         guint property_id,
60                                         GValue *value,
61                                         GParamSpec *pspec)
62 {
63     g_return_if_fail(gobject != NULL);
64     FontManagerLicensePane *self = FONT_MANAGER_LICENSE_PANE(gobject);
65     g_autofree gchar *data = NULL;
66     switch (property_id) {
67         case PROP_FSTYPE:
68             g_value_set_enum(value, self->_fsType);
69             break;
70         case PROP_LICENSE_DATA:
71             data = font_manager_license_pane_get_license_data(self);
72             g_value_set_string(value, data);
73             break;
74         case PROP_LICENSE_URL:
75             data = font_manager_license_pane_get_license_url(self);
76             g_value_set_string(value, data);
77             break;
78         default:
79             G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
80     }
81     return;
82 }
83 
84 static void
font_manager_license_pane_set_property(GObject * gobject,guint property_id,const GValue * value,GParamSpec * pspec)85 font_manager_license_pane_set_property (GObject *gobject,
86                                         guint property_id,
87                                         const GValue *value,
88                                         GParamSpec *pspec)
89 {
90     g_return_if_fail(gobject != NULL);
91     FontManagerLicensePane *self = FONT_MANAGER_LICENSE_PANE(gobject);
92     switch (property_id) {
93         case PROP_FSTYPE:
94             font_manager_license_pane_set_fsType(self, g_value_get_int(value));
95             break;
96         case PROP_LICENSE_DATA:
97             font_manager_license_pane_set_license_data(self, g_value_get_string(value));
98             break;
99         case PROP_LICENSE_URL:
100             font_manager_license_pane_set_license_url(self, g_value_get_string(value));
101             break;
102         default:
103             G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
104     }
105     return;
106 }
107 
108 static void
font_manager_license_pane_class_init(FontManagerLicensePaneClass * klass)109 font_manager_license_pane_class_init (FontManagerLicensePaneClass *klass)
110 {
111     GObjectClass *object_class = G_OBJECT_CLASS(klass);
112 
113     object_class->get_property = font_manager_license_pane_get_property;
114     object_class->set_property = font_manager_license_pane_set_property;
115 
116     /**
117      * FontManagerLicensePane:fstype:
118      *
119      * Font embedding information
120      */
121     obj_properties[PROP_FSTYPE] = g_param_spec_int("fstype",
122                                                     NULL,
123                                                     "Font embedding information",
124                                                     G_MININT, G_MAXINT, 0,
125                                                     G_PARAM_STATIC_STRINGS |
126                                                     G_PARAM_READWRITE |
127                                                     G_PARAM_EXPLICIT_NOTIFY);
128 
129     /**
130      * FontManagerLicensePane:license-data:
131      *
132      * Embedded or detected license text
133      */
134     obj_properties[PROP_LICENSE_DATA] = g_param_spec_string("license-data",
135                                                             NULL,
136                                                             "Embedded or detected license text",
137                                                             NULL,
138                                                             G_PARAM_STATIC_STRINGS |
139                                                             G_PARAM_READWRITE |
140                                                             G_PARAM_EXPLICIT_NOTIFY);
141 
142     /**
143      * FontManagerLicensePane:license-url:
144      *
145      * Embedded or detected license url
146      */
147     obj_properties[PROP_LICENSE_URL] = g_param_spec_string("license-url",
148                                                             NULL,
149                                                             "Embedded or detected license url",
150                                                             NULL,
151                                                             G_PARAM_STATIC_STRINGS |
152                                                             G_PARAM_READWRITE |
153                                                             G_PARAM_EXPLICIT_NOTIFY);
154 
155     g_object_class_install_properties(object_class, N_PROPERTIES, obj_properties);
156     return;
157 }
158 
159 static gboolean
on_event(GtkWidget * widget,GdkEvent * event,G_GNUC_UNUSED gpointer user_data)160 on_event (GtkWidget *widget, GdkEvent *event, G_GNUC_UNUSED gpointer user_data)
161 {
162     g_return_val_if_fail(widget != NULL, GDK_EVENT_PROPAGATE);
163     g_return_val_if_fail(event != NULL, GDK_EVENT_PROPAGATE);
164     if (event->type == GDK_SCROLL)
165         return GDK_EVENT_PROPAGATE;
166     GdkWindow *text_window = gtk_text_view_get_window(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT);
167     gdk_window_set_cursor(text_window, NULL);
168     return GDK_EVENT_STOP;
169 }
170 
171 static void
font_manager_license_pane_init(FontManagerLicensePane * self)172 font_manager_license_pane_init (FontManagerLicensePane *self)
173 {
174     g_return_if_fail(self != NULL);
175     GtkStyleContext *ctx = gtk_widget_get_style_context(GTK_WIDGET(self));
176     gtk_style_context_add_class(ctx, GTK_STYLE_CLASS_VIEW);
177     gtk_widget_set_name(GTK_WIDGET(self), "FontManagerLicensePane");
178     self->fsType = gtk_label_new(NULL);
179     PangoAttrList *attrs = pango_attr_list_new();
180     PangoAttribute *attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
181     pango_attr_list_insert(attrs, attr);
182     gtk_label_set_attributes(GTK_LABEL(self->fsType), attrs);
183     g_clear_pointer(&attrs, pango_attr_list_unref);
184     gtk_widget_set_opacity(self->fsType, 0.55);
185     const gchar *msg = _("File does not contain license information.");
186     self->placeholder = font_manager_place_holder_new(NULL, NULL, msg, "dialog-question-symbolic");
187     font_manager_widget_set_expand(self->placeholder, TRUE);
188     font_manager_widget_set_margin(self->placeholder, FONT_MANAGER_DEFAULT_MARGIN * 4);
189     gtk_widget_set_halign(self->placeholder, GTK_ALIGN_CENTER);
190     gtk_widget_set_valign(self->placeholder, GTK_ALIGN_START);
191     self->license_data = gtk_text_view_new();
192     gtk_drag_dest_unset(self->license_data);
193     g_signal_connect(self->license_data, "event", G_CALLBACK(on_event), NULL);
194     self->license_url = gtk_link_button_new("");
195     GtkWidget *overlay = gtk_overlay_new();
196     gtk_overlay_add_overlay(GTK_OVERLAY(overlay), self->placeholder);
197     gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(self->license_data), GTK_WRAP_WORD_CHAR);
198     gtk_text_view_set_editable(GTK_TEXT_VIEW(self->license_data), FALSE);
199     font_manager_widget_set_margin(self->fsType, FONT_MANAGER_DEFAULT_MARGIN * 2);
200     font_manager_widget_set_margin(self->license_url, FONT_MANAGER_DEFAULT_MARGIN * 1.25);
201     GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
202     gtk_container_add(GTK_CONTAINER(scroll), self->license_data);
203     font_manager_widget_set_expand(scroll, TRUE);
204     font_manager_widget_set_margin(self->license_data, FONT_MANAGER_DEFAULT_MARGIN * 2);
205     GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2);
206     gtk_box_pack_start(GTK_BOX(box), self->fsType, FALSE, FALSE, 0);
207     gtk_container_add(GTK_CONTAINER(overlay), scroll);
208     gtk_box_pack_start(GTK_BOX(box), overlay, TRUE, TRUE, 0);
209     gtk_box_pack_end(GTK_BOX(box), self->license_url, FALSE, FALSE, 0);
210     gtk_container_add(GTK_CONTAINER(self), box);
211     gtk_widget_show(scroll);
212     gtk_widget_show(self->fsType);
213     gtk_widget_show(self->license_data);
214     gtk_widget_show(self->license_url);
215     gtk_widget_show(self->placeholder);
216     gtk_widget_show(overlay);
217     gtk_widget_show(box);
218     return;
219 }
220 
221 /**
222  * font_manager_license_pane_get_fsType:
223  * @self:       #FontManagerLicensePane
224  *
225  * Returns: #FontManagerfsType
226  */
227 gint
font_manager_license_pane_get_fsType(FontManagerLicensePane * self)228 font_manager_license_pane_get_fsType (FontManagerLicensePane *self)
229 {
230     g_return_val_if_fail(self != NULL, 0);
231     return self->_fsType;
232 }
233 
234 /**
235  * font_manager_license_pane_get_license_data:
236  * @self:       #FontManagerLicensePane
237  *
238  * Returns: (transfer none) (nullable):
239  * A newly allocated string that must be freed with #g_free or %NULL
240  */
241 gchar *
font_manager_license_pane_get_license_data(FontManagerLicensePane * self)242 font_manager_license_pane_get_license_data (FontManagerLicensePane *self)
243 {
244     g_return_val_if_fail(self != NULL, NULL);
245     GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->license_data));
246     GtkTextIter start, end;
247     gtk_text_buffer_get_bounds(buffer, &start, &end);
248     return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
249 }
250 
251 /**
252  * font_manager_license_pane_get_license_url:
253  * @self:       #FontManagerLicensePane
254  *
255  * Returns: (transfer none) (nullable):
256  * A newly allocated string that must be freed with #g_free or %NULL
257  */
258 gchar *
font_manager_license_pane_get_license_url(FontManagerLicensePane * self)259 font_manager_license_pane_get_license_url (FontManagerLicensePane *self)
260 {
261     g_return_val_if_fail(self != NULL, NULL);
262     return g_strdup(gtk_link_button_get_uri(GTK_LINK_BUTTON(self->license_url)));
263 }
264 
265 /**
266  * font_manager_license_pane_set_fsType:
267  * @self:           #FontManagerLicensePane
268  * @fstype:         #FontManagerfsType
269  */
270 void
font_manager_license_pane_set_fsType(FontManagerLicensePane * self,gint fstype)271 font_manager_license_pane_set_fsType (FontManagerLicensePane *self, gint fstype)
272 {
273     g_return_if_fail(self != NULL);
274     self->_fsType = fstype;
275     gtk_label_set_label(GTK_LABEL(self->fsType), font_manager_fsType_to_string(fstype));
276     return;
277 }
278 
279 /**
280  * font_manager_license_pane_set_license_data:
281  * @self:                       #FontManagerLicensePane
282  * @license_data: (nullable):   License data embedded in font file or %NULL
283  */
284 void
font_manager_license_pane_set_license_data(FontManagerLicensePane * self,const gchar * license_data)285 font_manager_license_pane_set_license_data (FontManagerLicensePane *self, const gchar *license_data)
286 {
287     g_return_if_fail(self != NULL);
288     GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->license_data));
289     gtk_text_buffer_set_text(buffer, license_data ? license_data : "", -1);
290     gtk_widget_set_visible(self->placeholder, license_data == NULL);
291     return;
292 }
293 
294 /**
295  * font_manager_license_pane_set_license_url:
296  * @self:               #FontManagerLicensePane
297  * @url: (nullable):    URL to latest version of license or %NULL
298  */
299 void
font_manager_license_pane_set_license_url(FontManagerLicensePane * self,const gchar * url)300 font_manager_license_pane_set_license_url (FontManagerLicensePane *self, const gchar *url)
301 {
302     g_return_if_fail(self != NULL);
303     gtk_button_set_label(GTK_BUTTON(self->license_url), url);
304     gtk_link_button_set_uri(GTK_LINK_BUTTON(self->license_url), url ? url : "");
305     gtk_widget_set_visible(self->license_url, url != NULL);
306     return;
307 }
308 
309 /**
310  * font_manager_license_pane_new:
311  *
312  * Returns: (transfer full): A newly created #FontManagerLicensePane.
313  * Free the returned object using #g_object_unref().
314  */
315 GtkWidget *
font_manager_license_pane_new(void)316 font_manager_license_pane_new (void)
317 {
318     return g_object_new(FONT_MANAGER_TYPE_LICENSE_PANE, NULL);
319 }
320 
321