]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/aboutdlg.cpp
gtk version check should be runtime, not compile time
[wxWidgets.git] / src / gtk / aboutdlg.cpp
index e801284c9207fee9537e73f9e57fbeca6e90ea9b..d8058f0336f5bbc8ae1fb6a9164188930aee0fa9 100644 (file)
@@ -22,6 +22,7 @@
 #if wxUSE_ABOUTDLG && defined(__WXGTK26__)
 
 #ifndef WX_PRECOMP
+    #include "wx/utils.h"       // for wxLaunchDefaultBrowser()
 #endif //WX_PRECOMP
 
 #include "wx/aboutdlg.h"
 
 #include "wx/gtk/private.h"
 
+// ----------------------------------------------------------------------------
+// GtkStr: temporary GTK string
+// ----------------------------------------------------------------------------
+
+class GtkStr : public wxGtkString
+{
+public:
+    GtkStr(const wxString& s)
+        : wxGtkString(wx_const_cast(char *, wxGTK_CONV_SYS(s).release()))
+    {
+    }
+};
+
 // ----------------------------------------------------------------------------
 // GtkArray: temporary array of GTK strings
 // ----------------------------------------------------------------------------
@@ -68,20 +82,34 @@ private:
 // implementation
 // ============================================================================
 
+extern "C" void
+wxGtkAboutDialogOnClose(GtkAboutDialog *about)
+{
+    gtk_widget_destroy(GTK_WIDGET(about));
+}
+
+extern "C" void
+wxGtkAboutDialogOnLink(GtkAboutDialog * WXUNUSED(about),
+                       const gchar *link,
+                       gpointer WXUNUSED(data))
+{
+    wxLaunchDefaultBrowser(wxGTK_CONV_BACK_SYS(link));
+}
+
 void wxAboutBox(const wxAboutDialogInfo& info)
 {
     if ( !gtk_check_version(2,6,0) )
     {
         GtkAboutDialog * const dlg = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
-        gtk_about_dialog_set_name(dlg, info.GetName());
+        gtk_about_dialog_set_name(dlg, GtkStr(info.GetName()));
         if ( info.HasVersion() )
-            gtk_about_dialog_set_version(dlg, info.GetVersion());
+            gtk_about_dialog_set_version(dlg, GtkStr(info.GetVersion()));
         if ( info.HasCopyright() )
-            gtk_about_dialog_set_copyright(dlg, info.GetCopyright());
+            gtk_about_dialog_set_copyright(dlg, GtkStr(info.GetCopyright()));
         if ( info.HasDescription() )
-            gtk_about_dialog_set_comments(dlg, info.GetDescription());
+            gtk_about_dialog_set_comments(dlg, GtkStr(info.GetDescription()));
         if ( info.HasLicence() )
-            gtk_about_dialog_set_license(dlg, info.GetLicence());
+            gtk_about_dialog_set_license(dlg, GtkStr(info.GetLicence()));
 
         wxIcon icon = info.GetIcon();
         if ( icon.Ok() )
@@ -89,8 +117,17 @@ void wxAboutBox(const wxAboutDialogInfo& info)
 
         if ( info.HasWebSite() )
         {
-            gtk_about_dialog_set_website(dlg, info.GetWebSiteURL());
-            gtk_about_dialog_set_website_label(dlg, info.GetWebSiteDescription());
+            // NB: must be called before gtk_about_dialog_set_website() as
+            //     otherwise it has no effect (although GTK+ docs don't mention
+            //     this...)
+            gtk_about_dialog_set_url_hook(wxGtkAboutDialogOnLink, NULL, NULL);
+
+            gtk_about_dialog_set_website(dlg, GtkStr(info.GetWebSiteURL()));
+            gtk_about_dialog_set_website_label
+            (
+                dlg,
+                GtkStr(info.GetWebSiteDescription())
+            );
         }
 
         if ( info.HasDevelopers() )
@@ -99,8 +136,37 @@ void wxAboutBox(const wxAboutDialogInfo& info)
             gtk_about_dialog_set_documenters(dlg, GtkArray(info.GetDocWriters()));
         if ( info.HasArtists() )
             gtk_about_dialog_set_artists(dlg, GtkArray(info.GetArtists()));
+
+        wxString transCredits;
         if ( info.HasTranslators() )
-            gtk_about_dialog_set_translator_credits(dlg, _("translator-credits"));
+        {
+            const wxArrayString& translators = info.GetTranslators();
+            const size_t count = translators.size();
+            for ( size_t n = 0; n < count; n++ )
+            {
+                transCredits << translators[n] << _T('\n');
+            }
+        }
+        else // no translators explicitely specified
+        {
+            // maybe we have translator credits in the message catalog?
+            wxString translator = _("translator-credits");
+
+            // gtk_about_dialog_set_translator_credits() is smart enough to
+            // detect if "translator-credits" is untranslated and hide the
+            // translators tab in that case, however it will still show the
+            // "credits" button, (at least GTK 2.10.6) even if there are no
+            // credits informations at all, so we still need to do the check
+            // ourselves
+            if ( translator != wxT("translator-credits") ) // untranslated!
+                transCredits = translator;
+        }
+
+        if ( !transCredits.empty() )
+            gtk_about_dialog_set_translator_credits(dlg, GtkStr(transCredits));
+
+        g_signal_connect(dlg, "response",
+                            G_CALLBACK(wxGtkAboutDialogOnClose), NULL);
 
         gtk_widget_show(GTK_WIDGET(dlg));
         return;