+// helper function: returns all array elements in a single comma-separated and
+// newline-terminated string
+static wxString AllAsString(const wxArrayString& a)
+{
+ wxString s;
+ const size_t count = a.size();
+ s.reserve(20*count);
+ for ( size_t n = 0; n < count; n++ )
+ {
+ s << a[n] << (n == count - 1 ? wxT("\n") : wxT(", "));
+ }
+
+ return s;
+}
+
+// ----------------------------------------------------------------------------
+// wxAboutDialogInfo
+// ----------------------------------------------------------------------------
+
+wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
+{
+ wxString s = GetDescription();
+ if ( !s.empty() )
+ s << wxT('\n');
+
+ if ( HasDevelopers() )
+ s << wxT('\n') << _("Developed by ") << AllAsString(GetDevelopers());
+
+ if ( HasDocWriters() )
+ s << wxT('\n') << _("Documentation by ") << AllAsString(GetDocWriters());
+
+ if ( HasArtists() )
+ s << wxT('\n') << _("Graphics art by ") << AllAsString(GetArtists());
+
+ if ( HasTranslators() )
+ s << wxT('\n') << _("Translations by ") << AllAsString(GetTranslators());
+
+ return s;
+}
+
+wxIcon wxAboutDialogInfo::GetIcon() const
+{
+ wxIcon icon = m_icon;
+ if ( !icon.IsOk() && wxTheApp )
+ {
+ const wxTopLevelWindow * const
+ tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
+ if ( tlw )
+ icon = tlw->GetIcon();
+ }
+
+ return icon;
+}
+
+wxString wxAboutDialogInfo::GetCopyrightToDisplay() const
+{
+ wxString ret = m_copyright;
+
+#if wxUSE_UNICODE
+ const wxString copyrightSign = wxString::FromUTF8("\xc2\xa9");
+ ret.Replace("(c)", copyrightSign);
+ ret.Replace("(C)", copyrightSign);
+#endif // wxUSE_UNICODE
+
+ return ret;
+}
+
+void wxAboutDialogInfo::SetVersion(const wxString& version,
+ const wxString& longVersion)
+{
+ if ( version.empty() )
+ {
+ m_version.clear();
+
+ wxASSERT_MSG( longVersion.empty(),
+ "long version should be empty if version is");
+
+ m_longVersion.clear();
+ }
+ else // setting valid version
+ {
+ m_version = version;
+
+ if ( longVersion.empty() )
+ m_longVersion = _("Version ") + m_version;
+ else
+ m_longVersion = longVersion;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// wxGenericAboutDialog
+// ----------------------------------------------------------------------------
+
+bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info, wxWindow* parent)