Parent Directory | Revision Log
Russian translation
1 | /* |
2 | * Copyright (C) 2009 Till Harbaum <till@harbaum.org>. |
3 | * |
4 | * This file is part of GPXView. |
5 | * |
6 | * GPXView is free software: you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation, either version 3 of the License, or |
9 | * (at your option) any later version. |
10 | * |
11 | * GPXView is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU General Public License |
17 | * along with GPXView. If not, see <http://www.gnu.org/licenses/>. |
18 | */ |
19 | |
20 | #include "gpxview.h" |
21 | |
22 | #ifndef FREMANTLE |
23 | #define LINK_COLOR "blue" |
24 | #else |
25 | #define LINK_COLOR "lightblue" |
26 | #define CUSTOM_NOTEBOOK |
27 | #endif |
28 | |
29 | #ifdef ENABLE_BROWSER_INTERFACE |
30 | static gboolean on_link_clicked(GtkWidget *widget, GdkEventButton *event, |
31 | gpointer user_data) { |
32 | |
33 | const char *str = |
34 | gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget)))); |
35 | browser_url((appdata_t*)user_data, (char*)str); |
36 | return TRUE; |
37 | } |
38 | #endif |
39 | |
40 | static GtkWidget *link_new(appdata_t *appdata, const char *url) { |
41 | #ifdef ENABLE_BROWSER_INTERFACE |
42 | if(appdata) { |
43 | GtkWidget *label = gtk_label_new(""); |
44 | char *str = g_strdup_printf("<span color=\"" LINK_COLOR |
45 | "\"><u>%s</u></span>", url); |
46 | gtk_label_set_markup(GTK_LABEL(label), str); |
47 | g_free(str); |
48 | |
49 | GtkWidget *eventbox = gtk_event_box_new(); |
50 | gtk_container_add(GTK_CONTAINER(eventbox), label); |
51 | |
52 | g_signal_connect(eventbox, "button-press-event", |
53 | G_CALLBACK(on_link_clicked), appdata); |
54 | return eventbox; |
55 | } |
56 | #endif |
57 | GtkWidget *label = gtk_label_new(""); |
58 | char *str = g_strdup_printf("<span color=\"" LINK_COLOR "\">%s</span>", url); |
59 | gtk_label_set_markup(GTK_LABEL(label), str); |
60 | g_free(str); |
61 | return label; |
62 | } |
63 | |
64 | #ifdef ENABLE_BROWSER_INTERFACE |
65 | void on_paypal_button_clicked(GtkButton *button, appdata_t *appdata) { |
66 | // gtk_dialog_response(GTK_DIALOG(context->dialog), GTK_RESPONSE_ACCEPT); |
67 | browser_url(appdata, |
68 | "https://www.paypal.com/cgi-bin/webscr" |
69 | "?cmd=_s-xclick&hosted_button_id=7400558"); |
70 | } |
71 | #endif |
72 | |
73 | static GtkWidget *notebook_new(void) { |
74 | #ifdef CUSTOM_NOTEBOOK |
75 | GtkWidget *vbox = gtk_vbox_new(FALSE, 0); |
76 | |
77 | GtkWidget *notebook = gtk_notebook_new(); |
78 | |
79 | /* solution for fremantle: we use a row of ordinary buttons instead */ |
80 | /* of regular tabs */ |
81 | |
82 | /* hide the regular tabs */ |
83 | gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); |
84 | |
85 | gtk_box_pack_start_defaults(GTK_BOX(vbox), notebook); |
86 | |
87 | /* store a reference to the notebook in the vbox */ |
88 | g_object_set_data(G_OBJECT(vbox), "notebook", (gpointer)notebook); |
89 | |
90 | /* create a hbox for the buttons */ |
91 | GtkWidget *hbox = gtk_hbox_new(TRUE, 0); |
92 | gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
93 | g_object_set_data(G_OBJECT(vbox), "hbox", (gpointer)hbox); |
94 | |
95 | return vbox; |
96 | #else |
97 | return gtk_notebook_new(); |
98 | #endif |
99 | } |
100 | |
101 | #ifdef CUSTOM_NOTEBOOK |
102 | static void on_notebook_button_clicked(GtkWidget *button, gpointer data) { |
103 | GtkNotebook *nb = |
104 | GTK_NOTEBOOK(g_object_get_data(G_OBJECT(data), "notebook")); |
105 | |
106 | gint page = (gint)g_object_get_data(G_OBJECT(button), "page"); |
107 | gtk_notebook_set_current_page(nb, page); |
108 | } |
109 | #endif |
110 | |
111 | static void notebook_append_page(GtkWidget *notebook, |
112 | GtkWidget *page, char *label) { |
113 | #ifdef CUSTOM_NOTEBOOK |
114 | GtkNotebook *nb = |
115 | GTK_NOTEBOOK(g_object_get_data(G_OBJECT(notebook), "notebook")); |
116 | |
117 | gint page_num = gtk_notebook_append_page(nb, page, gtk_label_new(label)); |
118 | GtkWidget *button = NULL; |
119 | |
120 | /* select button for page 0 by default */ |
121 | if(!page_num) { |
122 | button = gtk_radio_button_new_with_label(NULL, label); |
123 | gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); |
124 | g_object_set_data(G_OBJECT(notebook), "group_master", (gpointer)button); |
125 | } else { |
126 | GtkWidget *master = g_object_get_data(G_OBJECT(notebook), "group_master"); |
127 | button = gtk_radio_button_new_with_label_from_widget( |
128 | GTK_RADIO_BUTTON(master), label); |
129 | } |
130 | |
131 | gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE); |
132 | g_object_set_data(G_OBJECT(button), "page", (gpointer)page_num); |
133 | |
134 | gtk_signal_connect(GTK_OBJECT(button), "clicked", |
135 | GTK_SIGNAL_FUNC(on_notebook_button_clicked), notebook); |
136 | |
137 | #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5) |
138 | hildon_gtk_widget_set_theme_size(button, |
139 | (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
140 | #endif |
141 | |
142 | gtk_box_pack_start_defaults( |
143 | GTK_BOX(g_object_get_data(G_OBJECT(notebook), "hbox")), |
144 | button); |
145 | |
146 | #else |
147 | gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, gtk_label_new(label)); |
148 | #endif |
149 | } |
150 | |
151 | GtkWidget *label_big(char *str) { |
152 | GtkWidget *label = gtk_label_new(""); |
153 | char *markup = |
154 | g_markup_printf_escaped("<span size='x-large'>%s</span>", str); |
155 | gtk_label_set_markup(GTK_LABEL(label), markup); |
156 | g_free(markup); |
157 | return label; |
158 | } |
159 | |
160 | GtkWidget *label_xbig(char *str) { |
161 | GtkWidget *label = gtk_label_new(""); |
162 | char *markup = |
163 | g_markup_printf_escaped("<span size='xx-large'>%s</span>", str); |
164 | gtk_label_set_markup(GTK_LABEL(label), markup); |
165 | g_free(markup); |
166 | return label; |
167 | } |
168 | |
169 | static void |
170 | on_label_realize(GtkWidget *widget, gpointer user_data) { |
171 | /* get parent size (which is a container) */ |
172 | gtk_widget_set_size_request(widget, widget->parent->allocation.width, -1); |
173 | } |
174 | |
175 | GtkWidget *label_wrap(char *str) { |
176 | GtkWidget *label = gtk_label_new(str); |
177 | gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD); |
178 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
179 | |
180 | g_signal_connect(G_OBJECT(label), "realize", |
181 | G_CALLBACK(on_label_realize), NULL); |
182 | |
183 | return label; |
184 | } |
185 | |
186 | GtkWidget *license_page_new(void) { |
187 | char *name = g_strdup(ICONPATH "COPYING"); |
188 | |
189 | GtkWidget *label = label_wrap(""); |
190 | |
191 | /* load license into buffer */ |
192 | FILE *file = fopen(name, "r"); |
193 | g_free(name); |
194 | |
195 | if(!file) { |
196 | /* loading from installation path failed, try to load */ |
197 | /* from local directory (for debugging) */ |
198 | name = g_strdup("./data/COPYING"); |
199 | file = fopen(name, "r"); |
200 | g_free(name); |
201 | } |
202 | |
203 | if(file) { |
204 | fseek(file, 0l, SEEK_END); |
205 | int flen = ftell(file); |
206 | fseek(file, 0l, SEEK_SET); |
207 | |
208 | char *buffer = g_malloc(flen+1); |
209 | fread(buffer, 1, flen, file); |
210 | fclose(file); |
211 | |
212 | buffer[flen]=0; |
213 | |
214 | gtk_label_set_text(GTK_LABEL(label), buffer); |
215 | |
216 | g_free(buffer); |
217 | } else |
218 | gtk_label_set_text(GTK_LABEL(label), _("Load error")); |
219 | |
220 | #ifndef USE_PANNABLE_AREA |
221 | GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); |
222 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), |
223 | GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); |
224 | gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), |
225 | label); |
226 | gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(scrolled_window), |
227 | GTK_SHADOW_IN); |
228 | return scrolled_window; |
229 | #else |
230 | GtkWidget *pannable_area = hildon_pannable_area_new(); |
231 | hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable_area), |
232 | label); |
233 | return pannable_area; |
234 | #endif |
235 | } |
236 | |
237 | GtkWidget *copyright_page_new(appdata_t *appdata) { |
238 | GtkWidget *vbox = gtk_vbox_new(FALSE, 0); |
239 | |
240 | /* ------------------------ */ |
241 | GtkWidget *ivbox = gtk_vbox_new(FALSE, 0); |
242 | |
243 | GtkWidget *hbox = gtk_hbox_new(FALSE, 0); |
244 | GtkWidget *ihbox = gtk_hbox_new(FALSE, 20); |
245 | gtk_box_pack_start(GTK_BOX(ihbox), icon_get_widget(ICON_MISC, 5), |
246 | FALSE, FALSE, 0); |
247 | gtk_box_pack_start(GTK_BOX(ihbox), label_xbig("GPXView"), |
248 | FALSE, FALSE, 0); |
249 | |
250 | gtk_box_pack_start(GTK_BOX(hbox), ihbox, TRUE, FALSE, 0); |
251 | gtk_box_pack_start_defaults(GTK_BOX(ivbox), hbox); |
252 | |
253 | gtk_box_pack_start_defaults(GTK_BOX(ivbox), |
254 | label_big(_("Geocaching with Maemo"))); |
255 | |
256 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
257 | |
258 | /* ------------------------ */ |
259 | ivbox = gtk_vbox_new(FALSE, 0); |
260 | |
261 | gtk_box_pack_start(GTK_BOX(ivbox), |
262 | gtk_label_new("Version " VERSION), FALSE, FALSE, 0); |
263 | gtk_box_pack_start(GTK_BOX(ivbox), |
264 | gtk_label_new(__DATE__ " " __TIME__), FALSE, FALSE, 0); |
265 | |
266 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
267 | |
268 | /* ------------------------ */ |
269 | ivbox = gtk_vbox_new(FALSE, 0); |
270 | |
271 | gtk_box_pack_start(GTK_BOX(ivbox), |
272 | gtk_label_new(_("Copyright 2008-2009")), FALSE, FALSE, 0); |
273 | |
274 | gtk_box_pack_start(GTK_BOX(ivbox), |
275 | link_new(appdata, "http://www.harbaum.org/till/maemo#gpxview"), |
276 | FALSE, FALSE, 0); |
277 | |
278 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
279 | |
280 | return vbox; |
281 | } |
282 | |
283 | /* a label that is left aligned */ |
284 | GtkWidget *left_label(char *str) { |
285 | GtkWidget *widget = gtk_label_new(str); |
286 | gtk_misc_set_alignment(GTK_MISC(widget), 0.0f, 0.5f); |
287 | return widget; |
288 | } |
289 | |
290 | static void author_add(GtkWidget *box, char *str) { |
291 | gtk_box_pack_start(GTK_BOX(box), left_label(str), FALSE, FALSE, 0); |
292 | } |
293 | |
294 | GtkWidget *authors_page_new(void) { |
295 | GtkWidget *ivbox, *vbox = gtk_vbox_new(FALSE, 16); |
296 | |
297 | /* -------------------------------------------- */ |
298 | ivbox = gtk_vbox_new(FALSE, 0); |
299 | author_add(ivbox, _("Main developer:")); |
300 | author_add(ivbox, "Till Harbaum <till@harbaum.org>"); |
301 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
302 | |
303 | /* -------------------------------------------- */ |
304 | ivbox = gtk_vbox_new(FALSE, 0); |
305 | author_add(ivbox, _("Original map widget by:")); |
306 | author_add(ivbox, "John Stowers <john.stowers@gmail.com>"); |
307 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
308 | |
309 | /* -------------------------------------------- */ |
310 | ivbox = gtk_vbox_new(FALSE, 0); |
311 | author_add(ivbox, _("GCVote service provided by:")); |
312 | author_add(ivbox, "Guido Wegener <guido.wegener@gmx.de>"); |
313 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
314 | |
315 | /* -------------------------------------------- */ |
316 | ivbox = gtk_vbox_new(FALSE, 0); |
317 | author_add(ivbox, _("Additional translations by:")); |
318 | author_add(ivbox, "Marko Vertainen <marko.vertainen@iki.fi>"); |
319 | author_add(ivbox, "Sergei Ivanov <isn@vu.spb.ru>"); |
320 | author_add(ivbox, "Vitaly Petrov <vit.petrov@vu.spb.ru>"); |
321 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
322 | |
323 | /* -------------------------------------------- */ |
324 | ivbox = gtk_vbox_new(FALSE, 0); |
325 | author_add(ivbox, _("Testers:")); |
326 | author_add(ivbox, "Uwe Koch <asys3@yahoo.com>"); |
327 | author_add(ivbox, "Tanja Harbaum <tanja@harbaum.org>"); |
328 | gtk_box_pack_start(GTK_BOX(vbox), ivbox, TRUE, FALSE, 0); |
329 | |
330 | #ifndef USE_PANNABLE_AREA |
331 | GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); |
332 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), |
333 | GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); |
334 | gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), |
335 | vbox); |
336 | gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(scrolled_window), |
337 | GTK_SHADOW_IN); |
338 | return scrolled_window; |
339 | #else |
340 | GtkWidget *pannable_area = hildon_pannable_area_new(); |
341 | hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable_area), |
342 | vbox); |
343 | return pannable_area; |
344 | #endif |
345 | } |
346 | |
347 | GtkWidget *donate_page_new(appdata_t *appdata) { |
348 | GtkWidget *vbox = gtk_vbox_new(FALSE, 0); |
349 | |
350 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
351 | label_wrap(_("If you like GPXView and want to support its future development " |
352 | "please consider donating to the developer. You can either " |
353 | "donate via paypal to"))); |
354 | |
355 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
356 | link_new(NULL, "till@harbaum.org")); |
357 | |
358 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
359 | label_wrap(_("or you can just click the button below which will open " |
360 | "the appropriate web page in your browser."))); |
361 | |
362 | GtkWidget *ihbox = gtk_hbox_new(FALSE, 0); |
363 | GtkWidget *button = gtk_button_new(); |
364 | gtk_button_set_image(GTK_BUTTON(button), |
365 | icon_get_widget(ICON_MISC, 3)); |
366 | gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
367 | g_signal_connect(button, "clicked", |
368 | G_CALLBACK(on_paypal_button_clicked), appdata); |
369 | gtk_box_pack_start(GTK_BOX(ihbox), button, TRUE, FALSE, 0); |
370 | gtk_box_pack_start_defaults(GTK_BOX(vbox), ihbox); |
371 | |
372 | return vbox; |
373 | } |
374 | |
375 | GtkWidget *bugs_page_new(appdata_t *appdata) { |
376 | GtkWidget *vbox = gtk_vbox_new(FALSE, 0); |
377 | |
378 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
379 | label_wrap(_("Please report bugs or feature requests via the GPXView " |
380 | "bug tracker. This bug tracker can directly be reached via " |
381 | "the following link:"))); |
382 | |
383 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
384 | link_new(appdata, "https://garage.maemo.org/tracker/?group_id=973")); |
385 | |
386 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
387 | label_wrap(_("You might also be interested in joining the mailing lists " |
388 | "or the forum:"))); |
389 | |
390 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
391 | link_new(appdata, "http://garage.maemo.org/projects/gpxview/")); |
392 | |
393 | gtk_box_pack_start_defaults(GTK_BOX(vbox), |
394 | label_wrap(_("Thank you for contributing!"))); |
395 | |
396 | return vbox; |
397 | } |
398 | |
399 | void about_box(appdata_t *appdata) { |
400 | GtkWidget *dialog = gtk_dialog_new_with_buttons(_("About GPXView"), |
401 | GTK_WINDOW(appdata->window), GTK_DIALOG_MODAL, |
402 | GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
403 | |
404 | #ifdef USE_MAEMO |
405 | gtk_window_set_default_size(GTK_WINDOW(dialog), 640, 480); |
406 | #else |
407 | gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 200); |
408 | #endif |
409 | |
410 | GtkWidget *notebook = notebook_new(); |
411 | |
412 | notebook_append_page(notebook, copyright_page_new(appdata), _("Copyright")); |
413 | notebook_append_page(notebook, license_page_new(), _("License")); |
414 | notebook_append_page(notebook, authors_page_new(), _("Authors")); |
415 | notebook_append_page(notebook, donate_page_new(appdata), _("Donate")); |
416 | notebook_append_page(notebook, bugs_page_new(appdata), _("Bugs")); |
417 | |
418 | gtk_box_pack_start_defaults(GTK_BOX((GTK_DIALOG(dialog))->vbox), |
419 | notebook); |
420 | |
421 | gtk_widget_show_all(dialog); |
422 | |
423 | gtk_dialog_run(GTK_DIALOG(dialog)); |
424 | gtk_widget_destroy(dialog); |
425 | } |