339 lines
13 KiB
C++
339 lines
13 KiB
C++
/***************************************************************
|
|
* Name: dialog_about.cpp
|
|
* Purpose: Code for Application Frame
|
|
* Author: Rafael Sokolowski (rafael.sokolowski@web.de)
|
|
* Created: 2010-08-06
|
|
* Copyright: Rafael Sokolowski ()
|
|
* License:
|
|
**************************************************************/
|
|
#include "dialog_about.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
/// Class dialog_about methods
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
dialog_about::dialog_about(wxWindow *parent, AboutAppInfo& appInfo)
|
|
: dialog_about_base(parent), info(appInfo)
|
|
{
|
|
picInformation = wxBitmap(info_xpm);
|
|
picDevelopers = wxBitmap(preference_xpm);
|
|
picDocWriters = wxBitmap(editor_xpm);
|
|
picArtists = wxBitmap(palette_xpm);
|
|
picTranslators = wxBitmap(language_xpm);
|
|
picLicense = wxBitmap(tools_xpm);
|
|
|
|
m_bitmapApp->SetBitmap( info.GetIcon() );
|
|
|
|
m_staticTextAppTitle->SetLabel( info.GetAppName() );
|
|
m_staticTextCopyright->SetLabel( info.GetCopyright() );
|
|
m_staticTextBuildVersion->SetLabel( info.GetBuildVersion() );
|
|
m_staticTextLibVersion->SetLabel( info.GetLibVersion() );
|
|
|
|
/* Affects m_titlepanel the parent of some wxStaticText.
|
|
* Changing the text afterwards makes it under Windows necessary to call 'Layout()'
|
|
* so that the new text gets properly layout.
|
|
*/
|
|
/* m_staticTextCopyright->GetParent()->Layout();
|
|
m_staticTextBuildVersion->GetParent()->Layout();
|
|
m_staticTextLibVersion->GetParent()->Layout();
|
|
*/
|
|
DeleteNotebooks();
|
|
CreateNotebooks();
|
|
GetSizer()->SetSizeHints(this);
|
|
m_auiNotebook->Update();
|
|
SetFocus();
|
|
Centre();
|
|
}
|
|
|
|
dialog_about::~dialog_about()
|
|
{
|
|
}
|
|
|
|
wxFlexGridSizer* dialog_about::CreateFlexGridSizer()
|
|
{
|
|
// three colums with vertical and horizontal extra space of two pixels
|
|
wxFlexGridSizer* fgSizer1 = new wxFlexGridSizer( 3, 2, 2 );
|
|
fgSizer1->SetFlexibleDirection( wxHORIZONTAL );
|
|
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
|
|
|
return fgSizer1;
|
|
}
|
|
|
|
void dialog_about::DeleteNotebooks()
|
|
{
|
|
for( size_t i=0; i<m_auiNotebook->GetPageCount(); ++i )
|
|
m_auiNotebook->DeletePage(i);
|
|
}
|
|
|
|
void dialog_about::CreateNotebooks()
|
|
{
|
|
CreateNotebookHtmlPage( m_auiNotebook, _("Information"), picInformation, info.GetDescription() );
|
|
|
|
CreateNotebookPage( m_auiNotebook, _("Developers") , picDevelopers, info.GetDevelopers() );
|
|
CreateNotebookPage( m_auiNotebook, _("Doc Writers"), picDocWriters, info.GetDocWriters() );
|
|
|
|
CreateNotebookPageByCategory( m_auiNotebook, _("Artists") , picArtists, info.GetArtists() );
|
|
CreateNotebookPageByCategory( m_auiNotebook, _("Translators"), picTranslators, info.GetTranslators() );
|
|
|
|
CreateNotebookHtmlPage( m_auiNotebook, _("License"), picLicense, info.GetLicense() );
|
|
}
|
|
|
|
void dialog_about::CreateNotebookPage(wxAuiNotebook* parent, const wxString& caption, const wxBitmap& icon, const Contributors& contributors)
|
|
{
|
|
wxBoxSizer* bSizer = new wxBoxSizer( wxHORIZONTAL );
|
|
|
|
wxScrolledWindow* m_scrolledWindow1 = new wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
|
|
m_scrolledWindow1->SetScrollRate( 5, 5 );
|
|
|
|
/* Panel for additional space at the left,
|
|
* but can also be used to show an additional bitmap.
|
|
*/
|
|
wxPanel* panel1 = new wxPanel(m_scrolledWindow1);
|
|
|
|
wxFlexGridSizer* fgSizer1 = CreateFlexGridSizer();
|
|
|
|
for ( size_t i=0; i<contributors.GetCount(); ++i)
|
|
{
|
|
Contributor* contributor = &contributors.Item(i);
|
|
|
|
// Icon at first column
|
|
wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, contributor->GetIcon() );
|
|
fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
|
|
|
|
// Name of contributor at second column
|
|
if ( contributor->GetName() != wxEmptyString )
|
|
{
|
|
wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY, contributor->GetName(), wxDefaultPosition, wxDefaultSize, 0 );
|
|
m_staticText1->Wrap( -1 );
|
|
fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
}
|
|
else {
|
|
fgSizer1->AddSpacer(5);
|
|
}
|
|
|
|
// Email address of contributor at third column
|
|
if ( contributor->GetEMail() != wxEmptyString )
|
|
{
|
|
wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1, contributor->GetEMail() );
|
|
fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
}
|
|
else {
|
|
fgSizer1->AddSpacer(5);
|
|
}
|
|
}
|
|
|
|
bSizer->Add( panel1, 1, wxEXPAND|wxALL, 10 );
|
|
bSizer->Add( fgSizer1, 7, wxEXPAND|wxALL, 10 ); // adjust width of panel with first int value
|
|
m_scrolledWindow1->SetSizer( bSizer );
|
|
m_scrolledWindow1->Layout();
|
|
bSizer->Fit( m_scrolledWindow1 );
|
|
|
|
parent->AddPage( m_scrolledWindow1, caption, false, icon );
|
|
}
|
|
|
|
void dialog_about::CreateNotebookPageByCategory(wxAuiNotebook* parent, const wxString& caption, const wxBitmap& icon, const Contributors& contributors)
|
|
{
|
|
wxBoxSizer* bSizer = new wxBoxSizer( wxHORIZONTAL );
|
|
|
|
wxScrolledWindow* m_scrolledWindow1 = new wxScrolledWindow( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
|
|
m_scrolledWindow1->SetScrollRate( 5, 5 );
|
|
|
|
/* Panel for additional space at the left,
|
|
* but can also be used to show an additional bitmap.
|
|
*/
|
|
wxPanel* panel1 = new wxPanel(m_scrolledWindow1);
|
|
|
|
wxFlexGridSizer* fgSizer1 = CreateFlexGridSizer();
|
|
|
|
for ( size_t i=0; i<contributors.GetCount(); ++i)
|
|
{
|
|
Contributor* contributor = &contributors.Item(i);
|
|
|
|
wxBitmap* icon = contributor->GetIcon();
|
|
wxString category = contributor->GetCategory();
|
|
|
|
/* to construct the next row we expect to have
|
|
* a category and a contributor that was not considered up to now
|
|
*/
|
|
if ( ( category != wxEmptyString ) && !( contributor->IsChecked() ) )
|
|
{
|
|
// Icon at first column
|
|
wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, icon );
|
|
fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
|
|
|
|
// Category name at second column
|
|
wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY, contributor->GetCategory() + wxT(":"), wxDefaultPosition, wxDefaultSize, 0 );
|
|
m_staticText1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); // bold font
|
|
m_staticText1->Wrap( -1 );
|
|
fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
|
|
// Nothing at third column
|
|
fgSizer1->AddSpacer(5);
|
|
|
|
// Now, all contributors of the same category will follow
|
|
for ( size_t j=0; j<contributors.GetCount(); ++j )
|
|
{
|
|
Contributor* contributor = &contributors.Item(j);
|
|
|
|
if ( contributor->GetCategory() == category )
|
|
{
|
|
// First column is empty
|
|
fgSizer1->AddSpacer(5);
|
|
|
|
// Name of contributor at second column
|
|
wxStaticText* m_staticText2 = new wxStaticText( m_scrolledWindow1, wxID_ANY, wxT(" • ") + contributor->GetName(), wxDefaultPosition, wxDefaultSize, 0 );
|
|
m_staticText1->Wrap( -1 );
|
|
fgSizer1->Add( m_staticText2, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
|
|
// Email address of contributor at third column
|
|
if ( contributor->GetEMail() != wxEmptyString )
|
|
{
|
|
wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1, contributor->GetEMail() );
|
|
fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
}
|
|
else {
|
|
fgSizer1->AddSpacer(5);
|
|
}
|
|
|
|
/* this contributor was added to the gui,
|
|
* thus can be ignored next time
|
|
*/
|
|
contributor->SetChecked( true );
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
/* Now, lets list the remaining contributors that have not been considered
|
|
* because they were not assigned to any category.
|
|
*/
|
|
for ( size_t k=0; k<contributors.GetCount(); ++k )
|
|
{
|
|
Contributor* contributor = &contributors.Item(k);
|
|
|
|
if ( contributor->IsChecked() )
|
|
continue;
|
|
|
|
// Icon at first column
|
|
wxStaticBitmap* m_bitmap1 = CreateStaticBitmap( m_scrolledWindow1, contributor->GetIcon() );
|
|
fgSizer1->Add( m_bitmap1, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 );
|
|
|
|
// Name of contributor at second column
|
|
if ( contributor->GetName() != wxEmptyString )
|
|
{
|
|
wxStaticText* m_staticText1 = new wxStaticText( m_scrolledWindow1, wxID_ANY, contributor->GetName(), wxDefaultPosition, wxDefaultSize, 0 );
|
|
m_staticText1->Wrap( -1 );
|
|
fgSizer1->Add( m_staticText1, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
}
|
|
else {
|
|
fgSizer1->AddSpacer(5);
|
|
}
|
|
|
|
// Email address of contributor at third column
|
|
if ( contributor->GetEMail() != wxEmptyString )
|
|
{
|
|
wxHyperlinkCtrl* hyperlink = CreateHyperlink( m_scrolledWindow1, contributor->GetEMail() );
|
|
fgSizer1->Add( hyperlink, 0, wxALIGN_LEFT|wxBOTTOM, 2 );
|
|
}
|
|
else {
|
|
fgSizer1->AddSpacer(5);
|
|
}
|
|
}
|
|
|
|
bSizer->Add( panel1, 1, wxEXPAND|wxALL, 10 );
|
|
bSizer->Add( fgSizer1, 7, wxEXPAND|wxALL, 10 ); // adjust width of panel with first int value
|
|
m_scrolledWindow1->SetSizer( bSizer );
|
|
m_scrolledWindow1->Layout();
|
|
bSizer->Fit( m_scrolledWindow1 );
|
|
|
|
parent->AddPage( m_scrolledWindow1, caption, false, icon );
|
|
}
|
|
|
|
void dialog_about::CreateNotebookHtmlPage(wxAuiNotebook* parent, const wxString& caption, const wxBitmap& icon, const wxString& html)
|
|
{
|
|
wxPanel* panel = new wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
|
|
|
wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
|
|
|
|
wxString htmlPage = wxEmptyString, htmlContent = html;
|
|
|
|
// to have a unique look background color for HTML pages is set to the default as it is used for all the other widgets
|
|
wxString htmlColor = ( this->GetBackgroundColour() ).GetAsString( wxC2S_HTML_SYNTAX );
|
|
|
|
// beginning of html structure
|
|
htmlPage.Append( wxT("<html><body bgcolor='") + htmlColor + wxT("'>") );
|
|
|
|
htmlPage.Append( htmlContent );
|
|
|
|
// end of html structure indicated by closing tags
|
|
htmlPage.Append( wxT("</body></html>") );
|
|
|
|
// the html page is going to be created with previously created html content
|
|
wxHtmlWindow* htmlWindow = new wxHtmlWindow( panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO|wxHW_NO_SELECTION );
|
|
|
|
// HTML font set to font properties as they are used for widgets to have an unique look under different platforms with HTML
|
|
wxFont font = this->GetFont();
|
|
htmlWindow->SetStandardFonts( font.GetPointSize(), font.GetFaceName(), font.GetFaceName() );
|
|
htmlWindow->SetPage( htmlPage );
|
|
|
|
// the HTML window shall not be used to open external links, thus this task is delegated to users default browser
|
|
htmlWindow->Connect( wxEVT_COMMAND_HTML_LINK_CLICKED, wxHtmlLinkEventHandler( dialog_about::OnHtmlLinkClicked ), NULL, this );
|
|
|
|
// no additional space around the html window as it is also the case by the other notebook pages
|
|
bSizer->Add( htmlWindow, 1, wxALL|wxEXPAND, 0 );
|
|
panel->SetSizer( bSizer );
|
|
panel->Layout();
|
|
bSizer->Fit( panel );
|
|
|
|
parent->AddPage( panel, caption, false, icon );
|
|
}
|
|
|
|
wxHyperlinkCtrl* dialog_about::CreateHyperlink(wxScrolledWindow* parent, const wxString& email)
|
|
{
|
|
wxHyperlinkCtrl* hyperlink = new wxHyperlinkCtrl(
|
|
parent, wxID_ANY,
|
|
wxT("<") + email + wxT(">"), /* the label */
|
|
wxT("mailto:") + email
|
|
+ wxT("?subject=KiCad - ")
|
|
+ info.GetBuildVersion()
|
|
+ wxT( " , ") + info.GetLibVersion()
|
|
); /* the url */
|
|
|
|
return hyperlink;
|
|
}
|
|
|
|
wxStaticBitmap* dialog_about::CreateStaticBitmap(wxScrolledWindow* parent, wxBitmap* icon)
|
|
{
|
|
wxStaticBitmap* bitmap = new wxStaticBitmap( parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
|
|
if ( icon )
|
|
{
|
|
bitmap->SetBitmap( *icon );
|
|
}
|
|
else {
|
|
bitmap->SetBitmap( right_xpm );
|
|
}
|
|
return bitmap;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
/// Event handlers
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void dialog_about::OnClose(wxCloseEvent &event)
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
void dialog_about::OnOkClick(wxCommandEvent &event)
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
void dialog_about::OnHtmlLinkClicked( wxHtmlLinkEvent& event )
|
|
{
|
|
::wxLaunchDefaultBrowser( event.GetLinkInfo().GetHref() );
|
|
}
|