]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/aboutdlgg.cpp
miscellaneous small enhancements
[wxWidgets.git] / src / generic / aboutdlgg.cpp
... / ...
CommitLineData
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 #include "wx/statbmp.h"
31 #include "wx/stattext.h"
32 #include "wx/button.h"
33#endif //WX_PRECOMP
34
35#include "wx/aboutdlg.h"
36#include "wx/generic/aboutdlgg.h"
37
38#include "wx/hyperlink.h"
39#include "wx/collpane.h"
40
41// ============================================================================
42// implementation
43// ============================================================================
44
45// helper function: returns all array elements in a single comma-separated and
46// newline-terminated string
47static wxString AllAsString(const wxArrayString& a)
48{
49 wxString s;
50 const size_t count = a.size();
51 s.reserve(20*count);
52 for ( size_t n = 0; n < count; n++ )
53 {
54 s << a[n] << (n == count - 1 ? _T("\n") : _T(", "));
55 }
56
57 return s;
58}
59
60// ----------------------------------------------------------------------------
61// wxAboutDialogInfo
62// ----------------------------------------------------------------------------
63
64wxString wxAboutDialogInfo::GetDescriptionAndCredits() const
65{
66 wxString s = GetDescription();
67 if ( !s.empty() )
68 s << _T('\n');
69
70 if ( HasDevelopers() )
71 s << _T('\n') << _("Developed by ") << AllAsString(GetDevelopers());
72
73 if ( HasDocWriters() )
74 s << _T('\n') << _("Documentation by ") << AllAsString(GetDocWriters());
75
76 if ( HasArtists() )
77 s << _T('\n') << _("Graphics art by ") << AllAsString(GetArtists());
78
79 if ( HasTranslators() )
80 s << _T('\n') << _("Translations by ") << AllAsString(GetTranslators());
81
82 return s;
83}
84
85wxIcon wxAboutDialogInfo::GetIcon() const
86{
87 wxIcon icon = m_icon;
88 if ( !icon.Ok() && wxTheApp )
89 {
90 const wxTopLevelWindow * const
91 tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
92 if ( tlw )
93 icon = tlw->GetIcon();
94 }
95
96 return icon;
97}
98
99wxString wxAboutDialogInfo::GetCopyrightToDisplay() const
100{
101 wxString ret = m_copyright;
102
103 const wxString copyrightSign = wxString::FromUTF8("\xc2\xa9");
104 ret.Replace("(c)", copyrightSign);
105 ret.Replace("(C)", copyrightSign);
106
107 return ret;
108}
109
110// ----------------------------------------------------------------------------
111// wxGenericAboutDialog
112// ----------------------------------------------------------------------------
113
114bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info)
115{
116 // this is a modal dialog thus we'll use GetParentForModalDialog:
117 if ( !wxDialog::Create(GetParentForModalDialog(), wxID_ANY, _("About ") + info.GetName(),
118 wxDefaultPosition, wxDefaultSize, wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE) )
119 return false;
120
121 m_sizerText = new wxBoxSizer(wxVERTICAL);
122 wxString nameAndVersion = info.GetName();
123 if ( info.HasVersion() )
124 nameAndVersion << _T(' ') << info.GetVersion();
125 wxStaticText *label = new wxStaticText(this, wxID_ANY, nameAndVersion);
126 wxFont fontBig(*wxNORMAL_FONT);
127 fontBig.SetPointSize(fontBig.GetPointSize() + 2);
128 fontBig.SetWeight(wxFONTWEIGHT_BOLD);
129 label->SetFont(fontBig);
130
131 m_sizerText->Add(label, wxSizerFlags().Centre().Border());
132 m_sizerText->AddSpacer(5);
133
134 AddText(info.GetCopyrightToDisplay());
135 AddText(info.GetDescription());
136
137 if ( info.HasWebSite() )
138 {
139#if wxUSE_HYPERLINKCTRL
140 AddControl(new wxHyperlinkCtrl(this, wxID_ANY,
141 info.GetWebSiteDescription(),
142 info.GetWebSiteURL()));
143#else
144 AddText(info.GetWebSiteURL());
145#endif // wxUSE_HYPERLINKCTRL/!wxUSE_HYPERLINKCTRL
146 }
147
148#if wxUSE_COLLPANE
149 if ( info.HasLicence() )
150 AddCollapsiblePane(_("License"), info.GetLicence());
151
152 if ( info.HasDevelopers() )
153 AddCollapsiblePane(_("Developers"),
154 AllAsString(info.GetDevelopers()));
155
156 if ( info.HasDocWriters() )
157 AddCollapsiblePane(_("Documentation writers"),
158 AllAsString(info.GetDocWriters()));
159
160 if ( info.HasArtists() )
161 AddCollapsiblePane(_("Artists"),
162 AllAsString(info.GetArtists()));
163
164 if ( info.HasTranslators() )
165 AddCollapsiblePane(_("Translators"),
166 AllAsString(info.GetTranslators()));
167#endif // wxUSE_COLLPANE
168
169 DoAddCustomControls();
170
171
172 wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL);
173#if wxUSE_STATBMP
174 wxIcon icon = info.GetIcon();
175 if ( icon.Ok() )
176 {
177 sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon),
178 wxSizerFlags().Border(wxRIGHT));
179 }
180#endif // wxUSE_STATBMP
181 sizerIconAndText->Add(m_sizerText, wxSizerFlags(1).Expand());
182
183 wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
184 sizerTop->Add(sizerIconAndText, wxSizerFlags(1).Expand().Border());
185
186 wxSizer *sizerBtns = CreateButtonSizer(wxOK);
187 if ( sizerBtns )
188 {
189 sizerTop->Add(sizerBtns, wxSizerFlags().Expand().Border());
190 }
191
192 SetSizerAndFit(sizerTop);
193
194 CentreOnScreen();
195
196 return true;
197}
198
199void wxGenericAboutDialog::AddControl(wxWindow *win, const wxSizerFlags& flags)
200{
201 wxCHECK_RET( m_sizerText, _T("can only be called after Create()") );
202 wxASSERT_MSG( win, _T("can't add NULL window to about dialog") );
203
204 m_sizerText->Add(win, flags);
205}
206
207void wxGenericAboutDialog::AddControl(wxWindow *win)
208{
209 AddControl(win, wxSizerFlags().Border(wxDOWN).Centre());
210}
211
212void wxGenericAboutDialog::AddText(const wxString& text)
213{
214 if ( !text.empty() )
215 AddControl(new wxStaticText(this, wxID_ANY, text));
216}
217
218void wxGenericAboutDialog::AddCollapsiblePane(const wxString& title,
219 const wxString& text)
220{
221 wxCollapsiblePane *pane = new wxCollapsiblePane(this, wxID_ANY, title);
222 wxStaticText *txt = new wxStaticText(pane->GetPane(), wxID_ANY, text,
223 wxDefaultPosition, wxDefaultSize,
224 wxALIGN_CENTRE);
225
226 // don't make the text unreasonably wide
227 static const int maxWidth = wxGetDisplaySize().x/3;
228 txt->Wrap(maxWidth);
229
230 // NB: all the wxCollapsiblePanes must be added with a null proportion value
231 m_sizerText->Add(pane, wxSizerFlags(0).Expand().Border(wxBOTTOM));
232}
233
234// ----------------------------------------------------------------------------
235// public functions
236// ----------------------------------------------------------------------------
237
238void wxGenericAboutBox(const wxAboutDialogInfo& info)
239{
240 wxGenericAboutDialog dlg(info);
241 dlg.ShowModal();
242}
243
244// currently wxAboutBox is implemented natively only under these platforms, for
245// the others we provide a generic fallback here
246#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK26__)
247
248void wxAboutBox(const wxAboutDialogInfo& info)
249{
250 wxGenericAboutBox(info);
251}
252
253#endif // platforms without native about dialog
254
255
256#endif // wxUSE_ABOUTDLG