]> git.saurik.com Git - wxWidgets.git/commitdiff
added GTK+ 2.6 implementation of wxAboutBox
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 8 Oct 2006 13:08:51 +0000 (13:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 8 Oct 2006 13:08:51 +0000 (13:08 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41700 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

build/bakefiles/files.bkl
include/wx/aboutdlg.h
src/generic/aboutdlgg.cpp
src/gtk/aboutdlg.cpp [new file with mode: 0644]

index 354b40d7f9db16b3427a74c890c056b5a0d670f7..3dec836a35bcd461c0261b92aa0ccc47fceaf866 100644 (file)
@@ -2745,6 +2745,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 </set>
 
 <set var="ADVANCED_GTK_SRC" hints="files">
+    src/gtk/aboutdlg.cpp
     src/gtk/taskbar.cpp
     src/gtk/dataview.cpp
     src/gtk/eggtrayicon.c
index a0342ccde76cb04eea109cc7f46dcbecc0f29b7d..3de6e10af896d2ff9f720ca99438b46f6c9f2fd6 100644 (file)
@@ -60,7 +60,7 @@ public:
     // icon to be shown in the dialog, defaults to the main frame icon
     void SetIcon(const wxIcon& icon) { m_icon = icon; }
     bool HasIcon() const { return m_icon.Ok(); }
-    wxIcon GetIcon() const { return m_icon; }
+    wxIcon GetIcon() const;
 
     // web site for the program and its description (defaults to URL itself if
     // empty)
index 4616aac0e5d12035385056bb5a63d9342136feb5..25a324e74ba952d5bce0260bf76f1f05e970779e 100644 (file)
@@ -80,6 +80,20 @@ wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
     return s;
 }
 
+wxIcon wxAboutDialogInfo::GetIcon() const
+{
+    wxIcon icon = m_icon;
+    if ( !icon.Ok() && wxTheApp )
+    {
+        const wxTopLevelWindow * const
+            tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
+        if ( tlw )
+            icon = tlw->GetIcon();
+    }
+
+    return icon;
+}
+
 // ----------------------------------------------------------------------------
 // wxAboutDialog
 // ----------------------------------------------------------------------------
@@ -125,14 +139,6 @@ bool wxAboutDialog::Create(const wxAboutDialogInfo& info)
     wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL);
 #if wxUSE_STATBMP
     wxIcon icon = info.GetIcon();
-    if ( !icon.Ok() && wxTheApp )
-    {
-        const wxTopLevelWindow * const
-            tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
-        if ( tlw )
-            icon = tlw->GetIcon();
-    }
-
     if ( icon.Ok() )
     {
         sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon),
@@ -176,7 +182,7 @@ void wxGenericAboutBox(const wxAboutDialogInfo& info)
 
 // currently wxAboutBox is implemented natively only under these platforms, for
 // the others we provide a generic fallback here
-#if !defined(__WXMSW__) && !defined(__WXMAC__)
+#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK26__)
 
 void wxAboutBox(const wxAboutDialogInfo& info)
 {
diff --git a/src/gtk/aboutdlg.cpp b/src/gtk/aboutdlg.cpp
new file mode 100644 (file)
index 0000000..e801284
--- /dev/null
@@ -0,0 +1,113 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/gtk/aboutdlg.cpp
+// Purpose:     native GTK+ wxAboutBox() implementation
+// Author:      Vadim Zeitlin
+// Created:     2006-10-08
+// RCS-ID:      $Id$
+// Copyright:   (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_ABOUTDLG && defined(__WXGTK26__)
+
+#ifndef WX_PRECOMP
+#endif //WX_PRECOMP
+
+#include "wx/aboutdlg.h"
+#include "wx/generic/aboutdlgg.h"
+
+#include "wx/gtk/private.h"
+
+// ----------------------------------------------------------------------------
+// GtkArray: temporary array of GTK strings
+// ----------------------------------------------------------------------------
+
+class GtkArray
+{
+public:
+    GtkArray(const wxArrayString& a)
+    {
+        m_count = a.size();
+        m_strings = new const gchar *[m_count + 1];
+        for ( size_t n = 0; n < m_count; n++ )
+            m_strings[n] = wxGTK_CONV_SYS(a[n]).release();
+
+        // array must be NULL-terminated
+        m_strings[m_count] = NULL;
+    }
+
+    operator const gchar **() const { return m_strings; }
+
+    ~GtkArray()
+    {
+        for ( size_t n = 0; n < m_count; n++ )
+            free(wx_const_cast(gchar *, m_strings[n]));
+
+        delete [] m_strings;
+    }
+
+private:
+    const gchar **m_strings;
+    size_t m_count;
+
+    DECLARE_NO_COPY_CLASS(GtkArray)
+};
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+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());
+        if ( info.HasVersion() )
+            gtk_about_dialog_set_version(dlg, info.GetVersion());
+        if ( info.HasCopyright() )
+            gtk_about_dialog_set_copyright(dlg, info.GetCopyright());
+        if ( info.HasDescription() )
+            gtk_about_dialog_set_comments(dlg, info.GetDescription());
+        if ( info.HasLicence() )
+            gtk_about_dialog_set_license(dlg, info.GetLicence());
+
+        wxIcon icon = info.GetIcon();
+        if ( icon.Ok() )
+            gtk_about_dialog_set_logo(dlg, info.GetIcon().GetPixbuf());
+
+        if ( info.HasWebSite() )
+        {
+            gtk_about_dialog_set_website(dlg, info.GetWebSiteURL());
+            gtk_about_dialog_set_website_label(dlg, info.GetWebSiteDescription());
+        }
+
+        if ( info.HasDevelopers() )
+            gtk_about_dialog_set_authors(dlg, GtkArray(info.GetDevelopers()));
+        if ( info.HasDocWriters() )
+            gtk_about_dialog_set_documenters(dlg, GtkArray(info.GetDocWriters()));
+        if ( info.HasArtists() )
+            gtk_about_dialog_set_artists(dlg, GtkArray(info.GetArtists()));
+        if ( info.HasTranslators() )
+            gtk_about_dialog_set_translator_credits(dlg, _("translator-credits"));
+
+        gtk_widget_show(GTK_WIDGET(dlg));
+        return;
+    }
+
+    // native about dialog not available, fall back to the generic one
+    wxGenericAboutBox(info);
+}
+
+#endif // wxUSE_ABOUTDLG && GTK+ 2.6+