added native Mac implementation of wxAboutBox(); also moved aboutdlg.* files from...
[wxWidgets.git] / src / generic / aboutdlgg.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/aboutdlgg.cpp
3 // Purpose: implements wxGenericAboutBox() function
4 // Author: Vadim Zeitlin
5 // Created: 2006-10-08
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // for compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_ABOUTDLG
27
28 #ifndef WX_PRECOMP
29 #include "wx/sizer.h"
30
31 #include "wx/statbmp.h"
32 #include "wx/stattext.h"
33 #endif //WX_PRECOMP
34
35 #include "wx/aboutdlg.h"
36 #include "wx/generic/aboutdlgg.h"
37
38 #include "wx/hyperlink.h"
39
40 // ============================================================================
41 // implementation
42 // ============================================================================
43
44 // ----------------------------------------------------------------------------
45 // wxAboutDialogInfo
46 // ----------------------------------------------------------------------------
47
48 // helper function: returns all array elements in a single comma-separated and
49 // newline-terminated string
50 static wxString AllAsString(const wxArrayString& a)
51 {
52 wxString s;
53 const size_t count = a.size();
54 for ( size_t n = 0; n < count; n++ )
55 {
56 s << a[n] << (n == count - 1 ? _T("\n") : _T(", "));
57 }
58
59 return s;
60 }
61
62 wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
63 {
64 wxString s = GetDescription();
65 if ( !s.empty() )
66 s << _T('\n');
67
68 if ( HasDevelopers() )
69 s << _T('\n') << _("Developed by ") << AllAsString(GetDevelopers());
70
71 if ( HasDocWriters() )
72 s << _T('\n') << ("Documentation by ") << AllAsString(GetDocWriters());
73
74 if ( HasArtists() )
75 s << _T('\n') << ("Graphics art by ") << AllAsString(GetArtists());
76
77 if ( HasTranslators() )
78 s << _T('\n') << ("Translations by ") << AllAsString(GetTranslators());
79
80 return s;
81 }
82
83 // ----------------------------------------------------------------------------
84 // wxAboutDialog
85 // ----------------------------------------------------------------------------
86
87 bool wxAboutDialog::Create(const wxAboutDialogInfo& info)
88 {
89 // TODO: should we use main frame as parent by default here?
90 if ( !wxDialog::Create(NULL, wxID_ANY, _("About ") + info.GetName()) )
91 return false;
92
93 m_sizerText = new wxBoxSizer(wxVERTICAL);
94 wxString nameAndVersion = info.GetName();
95 if ( info.HasVersion() )
96 nameAndVersion << _T(' ') << info.GetVersion();
97 wxStaticText *label = new wxStaticText(this, wxID_ANY, nameAndVersion);
98 wxFont fontBig(*wxNORMAL_FONT);
99 fontBig.SetPointSize(fontBig.GetPointSize() + 2);
100 fontBig.SetWeight(wxFONTWEIGHT_BOLD);
101 label->SetFont(fontBig);
102
103 m_sizerText->Add(label, wxSizerFlags().Centre().Border());
104 m_sizerText->AddSpacer(5);
105
106 AddText(info.GetCopyright());
107 AddText(info.GetDescription());
108
109 if ( info.HasWebSite() )
110 {
111 #if wxUSE_HYPERLINKCTRL
112 AddControl(new wxHyperlinkCtrl(this, wxID_ANY,
113 info.GetWebSiteDescription(),
114 info.GetWebSiteURL()));
115 #else
116 AddText(info.GetWebSiteURL());
117 #endif // wxUSE_HYPERLINKCTRL/!wxUSE_HYPERLINKCTRL
118 }
119
120 // TODO: add licence
121
122 // TODO: add credits (developers, artists, doc writers, translators)
123
124
125 wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL);
126 #if wxUSE_STATBMP
127 wxIcon icon = info.GetIcon();
128 if ( !icon.Ok() && wxTheApp )
129 {
130 const wxTopLevelWindow * const
131 tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
132 if ( tlw )
133 icon = tlw->GetIcon();
134 }
135
136 if ( icon.Ok() )
137 {
138 sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon),
139 wxSizerFlags().Border(wxRIGHT));
140 }
141 #endif // wxUSE_STATBMP
142 sizerIconAndText->Add(m_sizerText, wxSizerFlags(1).Expand());
143
144 wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
145 sizerTop->Add(sizerIconAndText, wxSizerFlags(1).Expand().Border());
146 sizerTop->Add(new wxButton(this, wxID_OK), wxSizerFlags().Right().Border());
147 SetSizerAndFit(sizerTop);
148
149 CentreOnScreen();
150 return true;
151 }
152
153 void wxAboutDialog::AddControl(wxWindow *win)
154 {
155 wxCHECK_RET( m_sizerText, _T("can only be called after Create()") );
156 wxASSERT_MSG( win, _T("can't add NULL window to about dialog") );
157
158 m_sizerText->Add(win, wxSizerFlags().Border(wxDOWN).Centre());
159 }
160
161 void wxAboutDialog::AddText(const wxString& text)
162 {
163 if ( !text.empty() )
164 AddControl(new wxStaticText(this, wxID_ANY, text));
165 }
166
167 // ----------------------------------------------------------------------------
168 // public functions
169 // ----------------------------------------------------------------------------
170
171 void wxGenericAboutBox(const wxAboutDialogInfo& info)
172 {
173 wxAboutDialog dlg(info);
174 dlg.ShowModal();
175 }
176
177 // currently wxAboutBox is implemented natively only under these platforms, for
178 // the others we provide a generic fallback here
179 #if !defined(__WXMSW__) && !defined(__WXMAC__)
180
181 void wxAboutBox(const wxAboutDialogInfo& info)
182 {
183 wxGenericAboutBox(info);
184 }
185
186 #endif // platforms without native about dialog
187
188
189 #endif // wxUSE_ABOUTDLG