2 * about.c - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2005-2009 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2006-2009 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
7 * This program is free software; you can redistribute it and/or modify
8 * it 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.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 * About dialog and credits.
33 #include "geanywraplabel.h"
36 static GtkWidget
*gb_window
= NULL
;
40 #define HEADER "<span size=\"larger\" weight=\"bold\">Geany %s</span>"
41 #define INFO "<span size=\"larger\" weight=\"bold\">%s</span>"
42 #define CODENAME "<span weight=\"bold\">\"" GEANY_CODENAME "\"</span>"
43 #define BUILDDATE "<span size=\"smaller\">%s</span>"
44 #define COPYRIGHT "Copyright (c) 2005-2009\nEnrico Tröger\nNick Treleaven\nFrank Lanitz\nAll rights reserved."
46 const gchar
*translators
[][2] = {
47 { "be_BY", "Yura Semashko <yurand2@gmail.com>" },
48 { "bg", "Dilyan Rusev <dilyanrusev@gmail.com>" },
49 { "ca_ES", "Toni Garcia-Navarro <topi@elpiset.net>" },
50 { "cs_CZ", "Petr Messner <messa@messa.cz>\nAnna Talianova <anickat1@gmail.com>" },
51 { "de_DE", "Frank Lanitz <frank@frank.uvena.de>\nDominic Hopf <dmaphy@googlemail.com>" },
52 { "el", "Stavros Temertzidis <bullgr@gmail.com>" },
53 { "en_GB", "Jeff Bailes <thepizzaking@gmail.com>" },
54 { "es", "Damián Viano <debian@damianv.com.ar>\nNacho Cabanes <ncabanes@gmail.com>" },
55 { "fi", "Harri Koskinen <harri@fastmonkey.org>\nJari Rahkonen <jari.rahkonen@pp1.inet.fi>" },
56 { "fr", "Jean-Philippe Moal <skateinmars@skateinmars.net>" },
57 { "gl", "José Manuel Castroagudín Silva <chavescesures@gmail.com>"},
58 { "hu", "Gabor Kmetyko <kg_kilo@freemail.hu>" },
59 { "it", "Max Baldinelli <m.baldinelli@agora.it>,\nDario Santomarco <dariello@yahoo.it>" },
60 { "ja", "Tarot Osuji <tarot@sdf.lonestar.org>\nChikahiro Masami <cmasa.z321@gmail.com>" },
61 { "ko", "Park Jang-heon <dotkabi@gmail.com>" },
62 { "lb", "Laurent Hoeltgen <hoeltgman@gmail.com>" },
63 { "nl", "Kurt De Bree <kdebree@telenet.be>" },
64 { "pl_PL", "Jarosław Foksa <jfoksa@gmail.com>" },
65 { "pt_BR", "Alexandra Moreire <alexandream@gmail.com>\nAdrovane Marques Kade <adrovane@gmail.com>" },
66 { "ro", "Alex Eftimie <alex@rosedu.org>" },
67 { "ru_RU", "brahmann_ <brahmann@pisem.net>,\nNikita E. Shalaev <nshalaev@eu.spb.ru>" },
68 { "sl", "Jože Klepec <joze.klepec@siol.net>"},
69 { "sv", "Tony Mattsson <superxorn@gmail.com>" },
70 { "tr", "Gürkan Gür <seqizz@gmail.com>"},
71 { "uk", "Boris Dibrov <dibrov.bor@gmail.com>" },
72 { "vi_VN", "Clytie Siddall <clytie@riverland.net.au>" },
73 { "zh_CN", "Dormouse Young <mouselinux@163.com>,\nXhacker Liu <liu.dongyuan@gmail.com>" },
74 { "zh_TW", "KoViCH <kovich.ian@gmail.com>" }
76 static const gint translators_len
= G_N_ELEMENTS(translators
);
78 const gchar
*prev_translators
[][2] = {
79 { "pl_PL", "Jacek Wolszczak <shutdownrunner@o2.pl>" },
81 static const gint prev_translators_len
= G_N_ELEMENTS(prev_translators
);
83 static const gchar
*contributors
=
84 "Alexander Rodin, Alexey Antipov, Andrew Rowland, Anh Phạm, blackdog, Bo Lorentsen, Bob Doan, Bronisław Białek, Catalin Marinas, "
85 "Chris Macksey, Christoph Berg, Colomban Wendling, Conrad Steenberg, Daniel Richard G., Dave Moore, Dirk Weber, "
86 "Elias Pschernig, Eric Forgeot, Eugene Arshinov, Felipe Pena, François Cami, "
87 "Giuseppe Torelli, Guillaume de Rorthais, Guillaume Hoffmann, Herbert Voss, Jason Oster, Jean-François Wauthy, Jeff Pohlmeyer, "
88 "Jesse Mayes, John Gabriele, Jon Strait, Josef Whiter, Kevin Ellwood, Kristoffer A. Tjernås, Lex Trotman, Marko Peric, Matti Mårds, Moritz Barsnick, "
89 "Peter Strand, Philipp Gildein, Pierre Joye, Rob van der Linde, Robert McGinley, Roland Baudin, Ross McKay, S Jagannathan, Saleem Abdulrasool, "
90 "Sebastian Kraft, Shiv, Slava Semushin, Stefan Oltmanns, Tamim, Thomas Martitz, Tomás Vírseda, "
91 "Tyler Mulligan, Walery Studennikov, Yura Siamashka";
94 static void header_eventbox_style_set(GtkWidget
*widget
);
95 static void header_label_style_set(GtkWidget
*widget
);
96 static void homepage_clicked(GtkButton
*button
, gpointer data
);
99 #define ROW(text, row, col, x_align, y_padding, col_span) \
100 label = gtk_label_new((text)); \
101 gtk_table_attach(GTK_TABLE(table), label, (col), (col) + (col_span) + 1, (row), (row) + 1, \
102 (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, (y_padding)); \
103 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); \
104 gtk_misc_set_alignment(GTK_MISC(label), (x_align), 0);
107 static GtkWidget
*create_dialog(void)
110 GtkWidget
*header_image
;
111 GtkWidget
*header_label
;
112 GtkWidget
*label_info
;
113 GtkWidget
*codename_label
;
114 GtkWidget
*builddate_label
;
115 GtkWidget
*url_button
;
116 GtkWidget
*cop_label
;
118 GtkWidget
*license_textview
;
121 GtkWidget
*credits_scrollwin
;
123 GtkWidget
*license_scrollwin
;
126 GtkWidget
*header_hbox
;
127 GtkWidget
*header_eventbox
;
130 gchar
*license_text
= NULL
;
135 dialog
= gtk_dialog_new();
137 /* configure dialog */
138 gtk_window_set_transient_for(GTK_WINDOW(dialog
), GTK_WINDOW(main_widgets
.window
));
139 gtk_window_set_position(GTK_WINDOW(dialog
), GTK_WIN_POS_CENTER_ON_PARENT
);
140 gtk_window_set_title(GTK_WINDOW(dialog
), _("About Geany"));
141 gtk_widget_set_name(dialog
, "GeanyDialog");
142 button
= gtk_dialog_add_button(GTK_DIALOG(dialog
), GTK_STOCK_CLOSE
, GTK_RESPONSE_CLOSE
);
143 gtk_dialog_set_default_response(GTK_DIALOG(dialog
), GTK_RESPONSE_CLOSE
);
144 gtk_dialog_set_has_separator(GTK_DIALOG(dialog
), FALSE
);
145 g_signal_connect(dialog
, "key-press-event", G_CALLBACK(gb_on_key_pressed
), NULL
);
148 header_eventbox
= gtk_event_box_new();
149 gtk_widget_show(header_eventbox
);
150 header_hbox
= gtk_hbox_new(FALSE
, 12);
151 gtk_container_set_border_width(GTK_CONTAINER(header_hbox
), 4);
152 gtk_widget_show(header_hbox
);
153 gtk_container_add(GTK_CONTAINER(header_eventbox
), header_hbox
);
154 header_image
= gtk_image_new();
155 gtk_box_pack_start(GTK_BOX(header_hbox
), header_image
, FALSE
, FALSE
, 0);
156 header_label
= gtk_label_new(NULL
);
157 gtk_label_set_use_markup(GTK_LABEL(header_label
), TRUE
);
158 /* print the subversion revision generated by ./configure if it is available */
159 g_snprintf(buffer
, sizeof(buffer
), HEADER
, main_get_version_string());
160 gtk_label_set_markup(GTK_LABEL(header_label
), buffer
);
161 gtk_widget_show(header_label
);
162 gtk_box_pack_start(GTK_BOX(header_hbox
), header_label
, FALSE
, FALSE
, 0);
163 header_eventbox_style_set(header_eventbox
);
164 header_label_style_set(header_label
);
165 g_signal_connect_after(header_eventbox
, "style-set", G_CALLBACK(header_eventbox_style_set
), NULL
);
166 g_signal_connect_after(header_label
, "style-set", G_CALLBACK(header_label_style_set
), NULL
);
167 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog
)->vbox
), header_eventbox
, FALSE
, FALSE
, 0);
170 icon
= ui_new_pixbuf_from_inline(GEANY_IMAGE_LOGO
);
171 gtk_image_set_from_pixbuf(GTK_IMAGE(header_image
), icon
);
172 gtk_window_set_icon(GTK_WINDOW(dialog
), icon
);
173 g_object_unref(icon
); /* free our reference */
175 /* create notebook */
176 notebook
= gtk_notebook_new();
177 gtk_widget_show(notebook
);
178 gtk_container_set_border_width(GTK_CONTAINER(notebook
), 2);
179 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog
)->vbox
), notebook
, TRUE
, TRUE
, 0);
181 /* create "Info" tab */
182 info_box
= gtk_vbox_new(FALSE
, 0);
183 gtk_container_set_border_width(GTK_CONTAINER(info_box
), 6);
184 gtk_widget_show(info_box
);
186 label_info
= gtk_label_new(NULL
);
187 gtk_label_set_justify(GTK_LABEL(label_info
), GTK_JUSTIFY_CENTER
);
188 gtk_label_set_selectable(GTK_LABEL(label_info
), TRUE
);
189 gtk_label_set_use_markup(GTK_LABEL(label_info
), TRUE
);
190 g_snprintf(buffer
, sizeof(buffer
), INFO
, _("A fast and lightweight IDE"));
191 gtk_label_set_markup(GTK_LABEL(label_info
), buffer
);
192 gtk_misc_set_padding(GTK_MISC(label_info
), 2, 11);
193 gtk_widget_show(label_info
);
194 gtk_box_pack_start(GTK_BOX(info_box
), label_info
, FALSE
, FALSE
, 0);
197 codename_label
= gtk_label_new(NULL
);
198 gtk_label_set_justify(GTK_LABEL(codename_label
), GTK_JUSTIFY_CENTER
);
199 gtk_label_set_selectable(GTK_LABEL(codename_label
), TRUE
);
200 gtk_label_set_use_markup(GTK_LABEL(codename_label
), TRUE
);
201 gtk_label_set_markup(GTK_LABEL(codename_label
), CODENAME
);
202 gtk_misc_set_padding(GTK_MISC(codename_label
), 2, 8);
203 gtk_widget_show(codename_label
);
204 gtk_box_pack_start(GTK_BOX(info_box
), codename_label
, FALSE
, FALSE
, 0);
206 /* build date label */
207 builddate_label
= gtk_label_new(NULL
);
208 gtk_label_set_justify(GTK_LABEL(builddate_label
), GTK_JUSTIFY_CENTER
);
209 gtk_label_set_selectable(GTK_LABEL(builddate_label
), TRUE
);
210 gtk_label_set_use_markup(GTK_LABEL(builddate_label
), TRUE
);
211 g_snprintf(buffer2
, sizeof(buffer2
), _("(built on or after %s)"), __DATE__
);
212 g_snprintf(buffer
, sizeof(buffer
), BUILDDATE
, buffer2
);
213 gtk_label_set_markup(GTK_LABEL(builddate_label
), buffer
);
214 gtk_misc_set_padding(GTK_MISC(builddate_label
), 2, 2);
215 gtk_widget_show(builddate_label
);
216 gtk_box_pack_start(GTK_BOX(info_box
), builddate_label
, FALSE
, FALSE
, 0);
218 box
= gtk_hbutton_box_new();
219 url_button
= gtk_button_new();
220 gtk_button_set_relief(GTK_BUTTON(url_button
), GTK_RELIEF_NONE
);
221 g_signal_connect(url_button
, "clicked", G_CALLBACK(homepage_clicked
), GEANY_HOMEPAGE
);
222 label
= gtk_label_new(NULL
);
223 gtk_label_set_text(GTK_LABEL(label
), GEANY_HOMEPAGE
);
224 gtk_widget_show(label
);
225 gtk_container_add(GTK_CONTAINER(url_button
), label
);
226 gtk_widget_show(url_button
);
227 gtk_box_pack_start(GTK_BOX(box
), url_button
, FALSE
, FALSE
, 0);
228 gtk_widget_show(box
);
229 gtk_box_pack_start(GTK_BOX(info_box
), box
, FALSE
, FALSE
, 10);
231 /* copyright label */
232 cop_label
= gtk_label_new(NULL
);
233 gtk_label_set_justify(GTK_LABEL(cop_label
), GTK_JUSTIFY_CENTER
);
234 gtk_label_set_selectable(GTK_LABEL(cop_label
), FALSE
);
235 gtk_label_set_use_markup(GTK_LABEL(cop_label
), TRUE
);
236 gtk_label_set_markup(GTK_LABEL(cop_label
), COPYRIGHT
);
237 gtk_misc_set_padding(GTK_MISC(cop_label
), 2, 10);
238 gtk_widget_show(cop_label
);
239 gtk_box_pack_start(GTK_BOX(info_box
), cop_label
, FALSE
, FALSE
, 0);
240 /*gtk_container_add(GTK_CONTAINER(info_box), cop_label); */
242 label
= gtk_label_new(_("Info"));
243 gtk_widget_show(label
);
244 gtk_widget_show_all(info_box
);
245 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), info_box
, label
);
247 /* create "Credits" tab */
248 credits_scrollwin
= gtk_scrolled_window_new(NULL
, NULL
);
249 gtk_container_set_border_width(GTK_CONTAINER(credits_scrollwin
), 10);
250 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(credits_scrollwin
),
251 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
253 table
= gtk_table_new(18 + translators_len
+ prev_translators_len
, 3, FALSE
);
254 gtk_table_set_col_spacings(GTK_TABLE(table
), 10);
257 g_snprintf(buffer
, sizeof(buffer
),
258 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Developers"));
259 label
= gtk_label_new(buffer
);
260 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
261 (GtkAttachOptions
) (GTK_FILL
),
262 (GtkAttachOptions
) (0), 0, 5);
263 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
264 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0);
267 g_snprintf(buffer
, sizeof(buffer
), "Enrico Tröger - %s", _("maintainer"));
268 ROW(buffer
, row
, 0, 0, 0, 1);
270 ROW("<enrico.troeger@uvena.de>", row
, 0, 0, 0, 1);
272 ROW("", row
, 0, 0, 0, 0);
275 g_snprintf(buffer
, sizeof(buffer
), "Nick Treleaven - %s", _("developer"));
276 ROW(buffer
, row
, 0, 0, 0, 1);
278 ROW("<nick.treleaven@btinternet.com>", row
, 0, 0, 0, 1);
280 ROW("", row
, 0, 0, 0, 0);
283 g_snprintf(buffer
, sizeof(buffer
), "Frank Lanitz - %s", _("translation maintainer"));
284 ROW(buffer
, 7, 0, 0, 0, 1);
286 ROW("<frank@frank.uvena.de>", row
, 0, 0, 0, 1);
288 ROW("", row
, 0, 0, 0, 0);
291 g_snprintf(buffer
, sizeof(buffer
),
292 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Translators"));
293 label
= gtk_label_new(buffer
);
294 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
295 (GtkAttachOptions
) (GTK_FILL
),
296 (GtkAttachOptions
) (0), 0, 5);
297 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
298 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
301 for (i
= 0; i
< translators_len
; i
++)
303 ROW(translators
[i
][0], row
, 0, 1, 4, 0);
304 ROW(translators
[i
][1], row
, 1, 0, 4, 0);
308 ROW("", row
, 0, 0, 0, 0);
311 g_snprintf(buffer
, sizeof(buffer
),
312 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Previous Translators"));
313 label
= gtk_label_new(buffer
);
314 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
315 (GtkAttachOptions
) (GTK_FILL
),
316 (GtkAttachOptions
) (0), 0, 5);
317 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
318 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
321 for (i
= 0; i
< prev_translators_len
; i
++)
323 ROW(prev_translators
[i
][0], row
, 0, 1, 4, 0);
324 ROW(prev_translators
[i
][1], row
, 1, 0, 4, 0);
329 ROW("", row
, 0, 0, 0, 0);
332 g_snprintf(buffer
, sizeof(buffer
),
333 "<span size=\"larger\" weight=\"bold\">%s</span>", _("Contributors"));
334 label
= gtk_label_new(buffer
);
335 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
336 (GtkAttachOptions
) (GTK_FILL
),
337 (GtkAttachOptions
) (0), 0, 5);
338 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
339 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
342 g_snprintf(buffer
, sizeof(buffer
),
343 _("Some of the many contributors (for a more detailed list, see the file %s):"),
350 label
= geany_wrap_label_new(buffer
);
351 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
352 (GtkAttachOptions
) (GTK_FILL
),
353 (GtkAttachOptions
) (0), 0, 5);
354 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
355 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
358 label
= geany_wrap_label_new(contributors
);
359 gtk_table_attach(GTK_TABLE(table
), label
, 0, 2, row
, row
+ 1,
360 (GtkAttachOptions
) (GTK_FILL
| GTK_EXPAND
),
361 (GtkAttachOptions
) (0), 0, 5);
362 gtk_label_set_use_markup(GTK_LABEL(label
), TRUE
);
363 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
366 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(credits_scrollwin
), table
);
367 gtk_viewport_set_shadow_type(GTK_VIEWPORT(gtk_widget_get_parent(table
)), GTK_SHADOW_NONE
);
368 gtk_widget_show_all(table
);
369 label
= gtk_label_new(_("Credits"));
370 gtk_widget_show(label
);
371 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), credits_scrollwin
, label
);
373 /* create "License" tab */
374 license_scrollwin
= gtk_scrolled_window_new(NULL
, NULL
);
375 gtk_container_set_border_width(GTK_CONTAINER(license_scrollwin
), 6);
376 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(license_scrollwin
),
377 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
378 license_textview
= gtk_text_view_new();
379 gtk_text_view_set_editable(GTK_TEXT_VIEW(license_textview
), FALSE
);
380 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(license_textview
), FALSE
);
381 gtk_widget_show(license_textview
);
382 gtk_container_add(GTK_CONTAINER(license_scrollwin
), license_textview
);
383 label
= gtk_label_new(_("License"));
384 gtk_widget_show(label
);
386 g_snprintf(buffer
, sizeof(buffer
), "%s" G_DIR_SEPARATOR_S
"GPL-2", app
->datadir
);
388 g_file_get_contents(buffer
, &license_text
, NULL
, NULL
);
389 if (license_text
== NULL
)
391 license_text
= g_strdup(
392 _("License text could not be found, please visit http://www.gnu.org/licenses/gpl-2.0.txt to view it online."));
394 tb
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(license_textview
));
395 gtk_text_buffer_set_text(tb
, license_text
, strlen(license_text
));
397 g_free(license_text
);
399 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), license_scrollwin
, label
);
401 gtk_widget_show_all(dialog
);
406 void about_dialog_show(void)
410 dialog
= create_dialog();
412 gtk_dialog_run(GTK_DIALOG(dialog
));
413 gtk_widget_destroy(dialog
);
417 static void header_eventbox_style_set(GtkWidget
*widget
)
419 static gint recursive
= 0;
426 style
= gtk_widget_get_style(widget
);
427 gtk_widget_modify_bg(widget
, GTK_STATE_NORMAL
, &style
->bg
[GTK_STATE_SELECTED
]);
432 static void header_label_style_set(GtkWidget
*widget
)
434 static gint recursive
= 0;
441 style
= gtk_widget_get_style(widget
);
442 gtk_widget_modify_fg(widget
, GTK_STATE_NORMAL
, &style
->fg
[GTK_STATE_SELECTED
]);
447 static void homepage_clicked(GtkButton
*button
, gpointer data
)
449 utils_open_browser(data
);