KiCad PCB EDA Suite
dialog_about.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2010 Rafael Sokolowski <Rafael.Sokolowski@web.de>
5  * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 
26 #include <config.h>
27 
28 // kicad_curl.h must be included before wx headers, to avoid
29 // conflicts for some defines, at least on Windows
30 #ifdef BUILD_GITHUB_PLUGIN
31 #include <curl/curlver.h>
32 #include <kicad_curl/kicad_curl.h>
33 #endif
34 
35 #include <boost/version.hpp>
36 #include <wx/clipbrd.h>
37 #include <wx/msgdlg.h>
38 
39 /* Pixel information of icons in XPM format.
40  * All KiCad icons are linked into shared library 'libbitmaps.a'.
41  * Icons:
42  * preference_xpm[]; // Icon for 'Developers' tab
43  * editor_xpm[]; // Icon for 'Doc Writers' tab
44  * palette_xpm[]; // Icon for 'Artists' tab
45  * language_xpm[]; // Icon for 'Translators' tab
46  * right_xpm[]; // Right arrow icon for list items
47  * info_xpm[]; // Bulb for description tab
48  * tools_xpm[]; // Sheet of paper icon for license info tab
49  */
50 #include <bitmaps.h>
51 #include <build_version.h>
52 
53 #include "dialog_about.h"
54 
55 
56 /*
57  * Class dialog_about methods
58  */
59 
60 dialog_about::dialog_about(wxWindow *aParent, AboutAppInfo& appInfo)
61  : dialog_about_base(aParent), info(appInfo)
62 {
63  picInformation = KiBitmap( info_xpm );
64  picDevelopers = KiBitmap( preference_xpm );
65  picDocWriters = KiBitmap( editor_xpm );
66  picArtists = KiBitmap( palette_xpm );
67  picTranslators = KiBitmap( language_xpm );
68  picLicense = KiBitmap( tools_xpm );
69  picPackagers = KiBitmap( zip_xpm );
70 
71  m_bitmapApp->SetBitmap( info.GetIcon() );
72 
73  m_staticTextAppTitle->SetLabel( info.GetAppName() );
75  m_staticTextBuildVersion->SetLabel( "Version: " + info.GetBuildVersion() );
77 
80 
81  GetSizer()->SetSizeHints( this );
82  m_auiNotebook->Update();
83  SetFocus();
84  Centre();
85 
86  Connect( wxID_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
87  wxCommandEventHandler( dialog_about::OnCopyVersionInfo ) );
88 }
89 
90 
92 {
93 }
94 
95 
97 {
98  // three columns with vertical and horizontal extra space of two pixels
99  wxFlexGridSizer* fgSizer1 = new wxFlexGridSizer( 3, 2, 2 );
100  fgSizer1->SetFlexibleDirection( wxHORIZONTAL );
101  fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
102 
103  return fgSizer1;
104 }
105 
106 
108 {
109  for( size_t i=0; i<m_auiNotebook->GetPageCount(); ++i )
110  m_auiNotebook->DeletePage( i );
111 }
112 
113 
115 {
117  info.GetDescription() );
118 
121 
124  info.GetTranslators() );
126  info.GetPackagers() );
127 
129 }
130 
131 void dialog_about::CreateNotebookPage( wxAuiNotebook* aParent, const wxString& aCaption,
132  const wxBitmap& aIcon, const Contributors& aContributors )
133 {
134  wxBoxSizer* bSizer = new wxBoxSizer( wxHORIZONTAL );
135 
136  wxScrolledWindow* m_scrolledWindow1 = new wxScrolledWindow( aParent, wxID_ANY,
137  wxDefaultPosition,
138  wxDefaultSize,
139  wxHSCROLL|wxVSCROLL );
140  m_scrolledWindow1->SetScrollRate( 5, 5 );
141 
142  /* Panel for additional space at the left,
143  * but can also be used to show an additional bitmap.
144  */
145  wxPanel* panel1 = new wxPanel( m_scrolledWindow1 );
146 
147  wxFlexGridSizer* fgSizer1 = CreateFlexGridSizer();
148 
149  for( size_t i=0; i<aContributors.GetCount(); ++i )
150  {
151  Contributor* contributor = &aContributors.Item( i );
152 
153  // Icon at first column
154  wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, contributor->GetIcon() );
155  fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
156 
157  // Name of contributor at second column
158  if ( contributor->GetName() != wxEmptyString )
159  {
160  wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY,
161  contributor->GetName(),
162  wxDefaultPosition, wxDefaultSize, 0 );
163  m_staticText1->Wrap( -1 );
164  fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
165  }
166  else
167  {
168  fgSizer1->AddSpacer( 5 );
169  }
170 
171  // Email address of contributor at third column
172  if ( contributor->GetEMail() != wxEmptyString )
173  {
174  wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1,
175  contributor->GetEMail() );
176  fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
177  }
178  else
179  {
180  fgSizer1->AddSpacer( 5 );
181  }
182  }
183 
184  bSizer->Add( panel1, 1, wxEXPAND|wxALL, 10 );
185  bSizer->Add( fgSizer1, 7, wxEXPAND|wxALL, 10 ); // adjust width of panel with first int value
186  m_scrolledWindow1->SetSizer( bSizer );
187  m_scrolledWindow1->Layout();
188  bSizer->Fit( m_scrolledWindow1 );
189  aParent->AddPage( m_scrolledWindow1, aCaption, false, aIcon );
190 }
191 
192 
193 void dialog_about::CreateNotebookPageByCategory(wxAuiNotebook* aParent, const wxString& aCaption,
194  const wxBitmap& aIcon,
195  const Contributors& aContributors)
196 {
197  wxBoxSizer* bSizer = new wxBoxSizer( wxHORIZONTAL );
198 
199  wxScrolledWindow* m_scrolledWindow1 = new wxScrolledWindow( aParent, wxID_ANY,
200  wxDefaultPosition,
201  wxDefaultSize,
202  wxHSCROLL|wxVSCROLL );
203  m_scrolledWindow1->SetScrollRate( 5, 5 );
204 
205  /* Panel for additional space at the left,
206  * but can also be used to show an additional bitmap.
207  */
208  wxPanel* panel1 = new wxPanel( m_scrolledWindow1 );
209 
210  wxFlexGridSizer* fgSizer1 = CreateFlexGridSizer();
211 
212  for( size_t i=0; i < aContributors.GetCount(); ++i )
213  {
214  Contributor* contributor = &aContributors.Item( i );
215 
216  wxBitmap* icon = contributor->GetIcon();
217  wxString category = contributor->GetCategory();
218 
219  /* to construct the next row we expect to have
220  * a category and a contributor that was not considered up to now
221  */
222  if( ( category != wxEmptyString ) && !( contributor->IsChecked() ) )
223  {
224  // Icon at first column
225  wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, icon );
226  fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
227 
228  // Category name at second column
229  wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY,
230  contributor->GetCategory() + wxT( ":" ),
231  wxDefaultPosition, wxDefaultSize, 0 );
232  m_staticText1->SetFont( wxFont( -1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false,
233  wxEmptyString ) ); // bold font
234  m_staticText1->Wrap( -1 );
235  fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
236 
237  // Nothing at third column
238  fgSizer1->AddSpacer( 5 );
239 
240  // Now, all contributors of the same category will follow
241  for( size_t j=0; j < aContributors.GetCount(); ++j )
242  {
243  Contributor* sub_contributor = &aContributors.Item( j );
244 
245  if ( sub_contributor->GetCategory() == category )
246  {
247  // First column is empty
248  fgSizer1->AddSpacer(5);
249 
250  // Name of contributor at second column
251  wxStaticText* m_staticText2 = new wxStaticText( m_scrolledWindow1, wxID_ANY,
252  wxT(" • ") + sub_contributor->GetName(),
253  wxDefaultPosition,
254  wxDefaultSize, 0 );
255  m_staticText1->Wrap( -1 );
256  fgSizer1->Add( m_staticText2, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
257 
258  // Email address of contributor at third column
259  if( sub_contributor->GetEMail() != wxEmptyString )
260  {
261  wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1,
262  sub_contributor->GetEMail() );
263  fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
264  }
265  else
266  {
267  fgSizer1->AddSpacer( 5 );
268  }
269 
270  /* this contributor was added to the GUI,
271  * thus can be ignored next time
272  */
273  sub_contributor->SetChecked( true );
274  }
275  }
276  }
277  else
278  {
279  continue;
280  }
281  }
282 
283  /* Now, lets list the remaining contributors that have not been considered
284  * because they were not assigned to any category.
285  */
286  for ( size_t k=0; k < aContributors.GetCount(); ++k )
287  {
288  Contributor* contributor = &aContributors.Item( k );
289 
290  if ( contributor->IsChecked() )
291  continue;
292 
293  // Icon at first column
294  wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, contributor->GetIcon() );
295  fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
296 
297  // Name of contributor at second column
298  if( contributor->GetName() != wxEmptyString )
299  {
300  wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY,
301  contributor->GetName(),
302  wxDefaultPosition, wxDefaultSize, 0 );
303  m_staticText1->Wrap( -1 );
304  fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
305  }
306  else
307  {
308  fgSizer1->AddSpacer( 5 );
309  }
310 
311  // Email address of contributor at third column
312  if ( contributor->GetEMail() != wxEmptyString )
313  {
314  wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1,
315  contributor->GetEMail() );
316  fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
317  }
318  else
319  {
320  fgSizer1->AddSpacer( 5 );
321  }
322  }
323 
324  bSizer->Add( panel1, 1, wxEXPAND|wxALL, 10 );
325  bSizer->Add( fgSizer1, 7, wxEXPAND|wxALL, 10 ); // adjust width of panel with first int value
326  m_scrolledWindow1->SetSizer( bSizer );
327  m_scrolledWindow1->Layout();
328  bSizer->Fit( m_scrolledWindow1 );
329  aParent->AddPage( m_scrolledWindow1, aCaption, false, aIcon );
330 }
331 
332 
333 void dialog_about::CreateNotebookHtmlPage( wxAuiNotebook* aParent, const wxString& aCaption,
334  const wxBitmap& aIcon, const wxString& html )
335 {
336  wxPanel* panel = new wxPanel( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
337  wxTAB_TRAVERSAL );
338 
339  wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
340 
341  wxString htmlPage = wxEmptyString, htmlContent = html;
342 
343  // to have a unique look background color for HTML pages is set to the default as it is
344  // used for all the other widgets
345  wxString htmlColor = ( this->GetBackgroundColour() ).GetAsString( wxC2S_HTML_SYNTAX );
346 
347  // beginning of HTML structure
348  htmlPage.Append( wxT( "<html><body bgcolor='" ) + htmlColor + wxT( "'>" ) );
349 
350  htmlPage.Append( htmlContent );
351 
352  // end of HTML structure indicated by closing tags
353  htmlPage.Append( wxT( "</body></html>" ) );
354 
355  // the HTML page is going to be created with previously created HTML content
356  wxHtmlWindow* htmlWindow = new wxHtmlWindow( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
357  wxHW_SCROLLBAR_AUTO|wxHW_NO_SELECTION );
358 
359  // HTML font set to font properties as they are used for widgets to have an unique look
360  // under different platforms with HTML
361  wxFont font = this->GetFont();
362  htmlWindow->SetStandardFonts( font.GetPointSize(), font.GetFaceName(), font.GetFaceName() );
363  htmlWindow->SetPage( htmlPage );
364 
365  // the HTML window shall not be used to open external links, thus this task is delegated
366  // to users default browser
367  htmlWindow->Connect( wxEVT_COMMAND_HTML_LINK_CLICKED,
368  wxHtmlLinkEventHandler( dialog_about::OnHtmlLinkClicked ), NULL, this );
369 
370  // no additional space around the HTML window as it is also the case by the other notebook pages
371  bSizer->Add( htmlWindow, 1, wxALL|wxEXPAND, 0 );
372  panel->SetSizer( bSizer );
373  panel->Layout();
374  bSizer->Fit( panel );
375  aParent->AddPage( panel, aCaption, false, aIcon );
376 }
377 
378 
379 wxHyperlinkCtrl* dialog_about::CreateHyperlink(wxScrolledWindow* aParent, const wxString& email)
380 {
381  wxHyperlinkCtrl* hyperlink = new wxHyperlinkCtrl(
382  aParent, wxID_ANY,
383  wxT( "<" ) + email + wxT( ">" ), /* the label */
384  wxT( "mailto:" ) + email
385  + wxT( "?subject=KiCad - " )
387  + wxT( " , " ) + info.GetLibVersion()
388  ); /* the url */
389 
390  return hyperlink;
391 }
392 
393 
394 wxStaticBitmap* dialog_about::CreateStaticBitmap(wxScrolledWindow* aParent, wxBitmap* aIcon)
395 {
396  wxStaticBitmap* bitmap = new wxStaticBitmap( aParent, wxID_ANY, wxNullBitmap,
397  wxDefaultPosition, wxDefaultSize, 0 );
398 
399  if( aIcon )
400  {
401  bitmap->SetBitmap( *aIcon );
402  }
403  else
404  {
405  bitmap->SetBitmap( KiBitmap( right_xpm ) );
406  }
407 
408  return bitmap;
409 }
410 
411 
415 
416 void dialog_about::OnClose( wxCloseEvent &event )
417 {
418  Destroy();
419 }
420 
421 
422 void dialog_about::OnOkClick( wxCommandEvent &event )
423 {
424  Destroy();
425 }
426 
427 
428 void dialog_about::OnHtmlLinkClicked( wxHtmlLinkEvent& event )
429 {
430  ::wxLaunchDefaultBrowser( event.GetLinkInfo().GetHref() );
431 }
432 
433 void dialog_about::OnCopyVersionInfo( wxCommandEvent& event )
434 {
435  if( !wxTheClipboard->Open() )
436  {
437  wxMessageBox( _( "Could not open clipboard to write version information." ),
438  _( "Clipboard Error" ), wxOK | wxICON_EXCLAMATION, this );
439  return;
440  }
441 
442  wxPlatformInfo platform;
443 
444  // DO NOT translate information in the msg_version string
445  wxString msg_version;
446  msg_version << "Application: " << info.GetAppName() << "\n";
447  msg_version << "Version: " << info.GetBuildVersion() << "\n";
448  msg_version << "Libraries: " << wxGetLibraryVersionInfo().GetVersionString() << "\n";
449 #ifdef BUILD_GITHUB_PLUGIN
450  msg_version << " " << KICAD_CURL::GetVersion() << "\n";
451 #endif
452  msg_version << "Platform: " << wxGetOsDescription() << ", "
453  << platform.GetArchName() << ", "
454  << platform.GetEndiannessName() << ", "
455  << platform.GetPortIdName() << "\n";
456 
457  msg_version << "- Build Info -\n";
458  msg_version << "wxWidgets: " << wxVERSION_NUM_DOT_STRING << " (";
459  msg_version << __WX_BO_UNICODE __WX_BO_STL __WX_BO_WXWIN_COMPAT_2_8 ")\n";
460 
461  msg_version << "Boost: " << ( BOOST_VERSION / 100000 ) << wxT( "." )
462  << ( BOOST_VERSION / 100 % 1000 ) << wxT( "." )
463  << ( BOOST_VERSION % 100 ) << wxT( "\n" );
464 
465 #ifdef BUILD_GITHUB_PLUGIN
466  msg_version << "Curl: " << LIBCURL_VERSION << "\n";
467 #endif
468 
469  msg_version << "KiCad - Compiler: ";
470 #if defined(__clang__)
471  msg_version << "Clang " << __clang_major__ << "." << __clang_minor__ << "." << __clang_patchlevel__;
472 #elif defined(__GNUG__)
473  msg_version << "GCC " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__;
474 #elif defined(_MSC_VER)
475  msg_version << "Visual C++ " << _MSC_VER;
476 #elif defined(__INTEL_COMPILER)
477  msg_version << "Intel C++ " << __INTEL_COMPILER;
478 #else
479  msg_version << "Other Compiler ";
480 #endif
481 
482 #if defined(__GXX_ABI_VERSION)
483  msg_version << " with C++ ABI " << __GXX_ABI_VERSION << "\n";
484 #else
485  msg_version << " without C++ ABI\n";
486 #endif
487 
488  msg_version << " Settings: ";
489 
490  #define ON "ON\n"
491  #define OFF "OFF\n"
492 
493  msg_version << "USE_WX_GRAPHICS_CONTEXT=";
494 #ifdef USE_WX_GRAPHICS_CONTEXT
495  msg_version << ON;
496 #else
497  msg_version << OFF;
498 #endif
499 
500  msg_version << " USE_WX_OVERLAY=";
501 #ifdef USE_WX_OVERLAY
502  msg_version << ON;
503 #else
504  msg_version << OFF;
505 #endif
506 
507  msg_version << " KICAD_SCRIPTING=";
508 #ifdef KICAD_SCRIPTING
509  msg_version << ON;
510 #else
511  msg_version << OFF;
512 #endif
513 
514  msg_version << " KICAD_SCRIPTING_MODULES=";
515 #ifdef KICAD_SCRIPTING_MODULES
516  msg_version << ON;
517 #else
518  msg_version << OFF;
519 #endif
520 
521  msg_version << " KICAD_SCRIPTING_WXPYTHON=";
522 #ifdef KICAD_SCRIPTING_WXPYTHON
523  msg_version << ON;
524 #else
525  msg_version << OFF;
526 #endif
527 
528  msg_version << " KICAD_SCRIPTING_ACTION_MENU=";
529 #ifdef KICAD_SCRIPTING_ACTION_MENU
530  msg_version << ON;
531 #else
532  msg_version << OFF;
533 #endif
534 
535  msg_version << " BUILD_GITHUB_PLUGIN=";
536 #ifdef BUILD_GITHUB_PLUGIN
537  msg_version << ON;
538 #else
539  msg_version << OFF;
540 #endif
541 
542  msg_version << " KICAD_USE_OCE=";
543 #ifdef KICAD_USE_OCE
544  msg_version << ON;
545 #else
546  msg_version << OFF;
547 #endif
548 
549  wxTheClipboard->SetData( new wxTextDataObject( msg_version ) );
550  wxTheClipboard->Close();
551  copyVersionInfo->SetLabel( _( "Copied..." ) );
552 }
wxButton * copyVersionInfo
wxString & GetName()
Definition: aboutinfo.h:159
dialog_about(wxWindow *dlg, AboutAppInfo &appInfo)
wxStaticText * m_staticTextBuildVersion
wxBitmap picDocWriters
Definition: dialog_about.h:47
virtual void OnOkClick(wxCommandEvent &event)
bool IsChecked()
Definition: aboutinfo.h:164
wxBitmap * GetIcon()
Definition: aboutinfo.h:162
wxAuiNotebook * m_auiNotebook
virtual void OnClose(wxCloseEvent &event)
Event handlers.
wxBitmap picPackagers
Definition: dialog_about.h:50
wxBitmap picDevelopers
Definition: dialog_about.h:46
#define OFF
wxHyperlinkCtrl * CreateHyperlink(wxScrolledWindow *aParent, const wxString &email)
wxString & GetDescription()
Definition: aboutinfo.h:85
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Function KiBitmap constructs a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:36
void CreateNotebooks()
wxString & GetCategory()
Definition: aboutinfo.h:161
Contributors GetDevelopers()
Definition: aboutinfo.h:78
wxString & GetLicense()
Definition: aboutinfo.h:88
wxStaticText * m_staticTextLibVersion
wxIcon & GetIcon()
Definition: aboutinfo.h:114
void DeleteNotebooks()
wxBitmap picTranslators
Definition: dialog_about.h:49
wxStaticBitmap * m_bitmapApp
void CreateNotebookPage(wxAuiNotebook *aParent, const wxString &aCaption, const wxBitmap &aIcon, const Contributors &aContributors)
A contributor, a person which was involved in the development of the application or which has contrib...
Definition: aboutinfo.h:147
wxString GetCopyright()
Definition: aboutinfo.h:91
void CreateNotebookHtmlPage(wxAuiNotebook *aParent, const wxString &aCaption, const wxBitmap &aIcon, const wxString &aHtmlMessage)
Contributors GetTranslators()
Definition: aboutinfo.h:81
wxString & GetBuildVersion()
Definition: aboutinfo.h:108
wxFlexGridSizer * CreateFlexGridSizer()
wxStaticText * m_staticTextAppTitle
Contributors GetPackagers()
Definition: aboutinfo.h:82
wxStaticText * m_staticTextCopyright
static const char * GetVersion()
Function GetVersion wrapper for curl_version().
Definition: kicad_curl.h:93
An object of this class is meant to be used to store application specific information like who has co...
Definition: aboutinfo.h:42
Class dialog_about_base.
wxString & GetLibVersion()
Definition: aboutinfo.h:111
void SetChecked(bool status)
Definition: aboutinfo.h:163
Contributors GetDocWriters()
Definition: aboutinfo.h:79
Contributors GetArtists()
Definition: aboutinfo.h:80
wxString & GetAppName()
Definition: aboutinfo.h:105
virtual void OnCopyVersionInfo(wxCommandEvent &event)
#define ON
void CreateNotebookPageByCategory(wxAuiNotebook *aParent, const wxString &aCaption, const wxBitmap &aIcon, const Contributors &aContributors)
wxBitmap picArtists
Definition: dialog_about.h:48
AboutAppInfo info
Definition: dialog_about.h:53
wxStaticBitmap * CreateStaticBitmap(wxScrolledWindow *aParent, wxBitmap *icon)
virtual void OnHtmlLinkClicked(wxHtmlLinkEvent &event)
wxBitmap picLicense
Definition: dialog_about.h:51
wxBitmap picInformation
Definition: dialog_about.h:45
wxString & GetEMail()
Definition: aboutinfo.h:160