Added missing include and missing underscores
[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 #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
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 wxIcon wxAboutDialogInfo::GetIcon() const
84 {
85 wxIcon icon = m_icon;
86 if ( !icon.Ok() && wxTheApp )
87 {
88 const wxTopLevelWindow * const
89 tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow);
90 if ( tlw )
91 icon = tlw->GetIcon();
92 }
93
94 return icon;
95 }
96
97 // ----------------------------------------------------------------------------
98 // wxGenericAboutDialog
99 // ----------------------------------------------------------------------------
100
101 bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info)
102 {
103 // TODO: should we use main frame as parent by default here?
104 if ( !wxDialog::Create(NULL, wxID_ANY, _("About ") + info.GetName()) )
105 return false;
106
107 m_sizerText = new wxBoxSizer(wxVERTICAL);
108 wxString nameAndVersion = info.GetName();
109 if ( info.HasVersion() )
110 nameAndVersion << _T(' ') << info.GetVersion();
111 wxStaticText *label = new wxStaticText(this, wxID_ANY, nameAndVersion);
112 wxFont fontBig(*wxNORMAL_FONT);
113 fontBig.SetPointSize(fontBig.GetPointSize() + 2);
114 fontBig.SetWeight(wxFONTWEIGHT_BOLD);
115 label->SetFont(fontBig);
116
117 m_sizerText->Add(label, wxSizerFlags().Centre().Border());
118 m_sizerText->AddSpacer(5);
119
120 AddText(info.GetCopyright());
121 AddText(info.GetDescription());
122
123 if ( info.HasWebSite() )
124 {
125 #if wxUSE_HYPERLINKCTRL
126 AddControl(new wxHyperlinkCtrl(this, wxID_ANY,
127 info.GetWebSiteDescription(),
128 info.GetWebSiteURL()));
129 #else
130 AddText(info.GetWebSiteURL());
131 #endif // wxUSE_HYPERLINKCTRL/!wxUSE_HYPERLINKCTRL
132 }
133
134 // TODO: add licence
135
136 // TODO: add credits (developers, artists, doc writers, translators)
137
138 DoAddCustomControls();
139
140
141 wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL);
142 #if wxUSE_STATBMP
143 wxIcon icon = info.GetIcon();
144 if ( icon.Ok() )
145 {
146 sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon),
147 wxSizerFlags().Border(wxRIGHT));
148 }
149 #endif // wxUSE_STATBMP
150 sizerIconAndText->Add(m_sizerText, wxSizerFlags(1).Expand());
151
152 wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
153 sizerTop->Add(sizerIconAndText, wxSizerFlags(1).Expand().Border());
154 sizerTop->Add(new wxButton(this, wxID_OK), wxSizerFlags().Right().Border());
155 SetSizerAndFit(sizerTop);
156
157 CentreOnScreen();
158 return true;
159 }
160
161 void wxGenericAboutDialog::AddControl(wxWindow *win, const wxSizerFlags& flags)
162 {
163 wxCHECK_RET( m_sizerText, _T("can only be called after Create()") );
164 wxASSERT_MSG( win, _T("can't add NULL window to about dialog") );
165
166 m_sizerText->Add(win, flags);
167 }
168
169 void wxGenericAboutDialog::AddControl(wxWindow *win)
170 {
171 AddControl(win, wxSizerFlags().Border(wxDOWN).Centre());
172 }
173
174 void wxGenericAboutDialog::AddText(const wxString& text)
175 {
176 if ( !text.empty() )
177 AddControl(new wxStaticText(this, wxID_ANY, text));
178 }
179
180 // ----------------------------------------------------------------------------
181 // public functions
182 // ----------------------------------------------------------------------------
183
184 void wxGenericAboutBox(const wxAboutDialogInfo& info)
185 {
186 wxGenericAboutDialog dlg(info);
187 dlg.ShowModal();
188 }
189
190 // currently wxAboutBox is implemented natively only under these platforms, for
191 // the others we provide a generic fallback here
192 #if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK26__)
193
194 void wxAboutBox(const wxAboutDialogInfo& info)
195 {
196 wxGenericAboutBox(info);
197 }
198
199 #endif // platforms without native about dialog
200
201
202 #endif // wxUSE_ABOUTDLG