+// 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 ? _T("\n") : _T(", "));
+ }
+
+ return s;
+}
+
+// ----------------------------------------------------------------------------
+// wxAboutDialogInfo
+// ----------------------------------------------------------------------------
+
+wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
+{
+ wxString s = GetDescription();
+ if ( !s.empty() )
+ s << _T('\n');
+
+ if ( HasDevelopers() )
+ s << _T('\n') << _("Developed by ") << AllAsString(GetDevelopers());
+
+ if ( HasDocWriters() )
+ s << _T('\n') << _("Documentation by ") << AllAsString(GetDocWriters());
+
+ if ( HasArtists() )
+ s << _T('\n') << _("Graphics art by ") << AllAsString(GetArtists());
+
+ if ( HasTranslators() )
+ s << _T('\n') << _("Translations by ") << AllAsString(GetTranslators());
+
+ 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;
+}
+
+wxString wxAboutDialogInfo::GetCopyrightToDisplay() const
+{
+ wxString ret = m_copyright;
+
+ const wxString copyrightSign = wxString::FromUTF8("\xc2\xa9");
+ ret.Replace("(c)", copyrightSign);
+ ret.Replace("(C)", copyrightSign);
+
+ return ret;
+}
+
+// ----------------------------------------------------------------------------
+// wxGenericAboutDialog
+// ----------------------------------------------------------------------------
+
+bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info)