/////////////////////////////////////////////////////////////////////////////
// Program: wxWidgets Widgets Sample
-// Name: widgets.cpp
+// Name: samples/widgets/widgets.cpp
// Purpose: Sample showing most of the simple wxWidgets widgets
// Author: Vadim Zeitlin
// Created: 27.03.01
#include "wx/statbox.h"
#include "wx/stattext.h"
#include "wx/textctrl.h"
+ #include "wx/msgdlg.h"
#endif
#include "wx/sysopt.h"
#include "wx/bookctrl.h"
#include "wx/sizer.h"
#include "wx/colordlg.h"
+#include "wx/fontdlg.h"
#include "wx/textdlg.h"
#include "widgets.h"
{
Widgets_ClearLog = 100,
Widgets_Quit,
+
+ Widgets_BookCtrl,
+
#if wxUSE_TOOLTIPS
Widgets_SetTooltip,
#endif // wxUSE_TOOLTIPS
Widgets_SetFgColour,
- Widgets_SetBgColour
+ Widgets_SetBgColour,
+ Widgets_SetFont,
+ Widgets_Enable,
+
+ Widgets_BorderNone,
+ Widgets_BorderStatic,
+ Widgets_BorderSimple,
+ Widgets_BorderRaised,
+ Widgets_BorderSunken,
+ Widgets_BorderDouble,
+ Widgets_BorderDefault,
+
+ Widgets_GoToPage,
+ Widgets_GoToPageLast = Widgets_GoToPage + 100
};
// ----------------------------------------------------------------------------
void OnButtonClearLog(wxCommandEvent& event);
#endif // USE_LOG
void OnExit(wxCommandEvent& event);
+
#if wxUSE_MENUS
+ void OnPageChanged(wxBookCtrlEvent& event);
+ void OnGoToPage(wxCommandEvent& event);
+
#if wxUSE_TOOLTIPS
void OnSetTooltip(wxCommandEvent& event);
#endif // wxUSE_TOOLTIPS
void OnSetFgCol(wxCommandEvent& event);
void OnSetBgCol(wxCommandEvent& event);
+ void OnSetFont(wxCommandEvent& event);
+ void OnEnable(wxCommandEvent& event);
+ void OnSetBorder(wxCommandEvent& event);
#endif // wxUSE_MENUS
// initialize the book: add all pages to it
#endif // USE_LOG
// the book containing the test pages
- wxBookCtrl *m_book;
+ wxBookCtrlBase *m_book;
// and the image list for it
wxImageList *m_imaglist;
#if wxUSE_MENUS
- // last chosen fg/bg colours
+ // last chosen fg/bg colours and font
wxColour m_colFg,
m_colBg;
+ wxFont m_font;
#endif // wxUSE_MENUS
// any class wishing to process wxWidgets events must use this macro
EVT_MENU(Widgets_SetTooltip, WidgetsFrame::OnSetTooltip)
#endif // wxUSE_TOOLTIPS
+#if wxUSE_MENUS
+ EVT_BOOKCTRL_PAGE_CHANGED(Widgets_BookCtrl, WidgetsFrame::OnPageChanged)
+ EVT_MENU_RANGE(Widgets_GoToPage, Widgets_GoToPageLast,
+ WidgetsFrame::OnGoToPage)
+
EVT_MENU(Widgets_SetFgColour, WidgetsFrame::OnSetFgCol)
EVT_MENU(Widgets_SetBgColour, WidgetsFrame::OnSetBgCol)
+ EVT_MENU(Widgets_SetFont, WidgetsFrame::OnSetFont)
+ EVT_MENU(Widgets_Enable, WidgetsFrame::OnEnable)
+
+ EVT_MENU_RANGE(Widgets_BorderNone, Widgets_BorderDefault,
+ WidgetsFrame::OnSetBorder)
EVT_MENU(wxID_EXIT, WidgetsFrame::OnExit)
+#endif // wxUSE_MENUS
END_EVENT_TABLE()
// ============================================================================
m_lboxLog = (wxListBox *)NULL;
m_logTarget = (wxLog *)NULL;
#endif // USE_LOG
- m_book = (wxBookCtrl *)NULL;
+ m_book = (wxBookCtrlBase *)NULL;
m_imaglist = (wxImageList *)NULL;
#if wxUSE_MENUS
#endif // wxUSE_TOOLTIPS
menuWidget->Append(Widgets_SetFgColour, _T("Set &foreground...\tCtrl-F"));
menuWidget->Append(Widgets_SetBgColour, _T("Set &background...\tCtrl-B"));
+ menuWidget->Append(Widgets_SetFont, _T("Set f&ont...\tCtrl-O"));
+ menuWidget->AppendCheckItem(Widgets_Enable, _T("&Enable/disable\tCtrl-E"));
+
+ wxMenu *menuBorders = new wxMenu;
+ menuBorders->AppendRadioItem(Widgets_BorderDefault, _T("De&fault\tCtrl-Shift-9"));
+ menuBorders->AppendRadioItem(Widgets_BorderNone, _T("&None\tCtrl-Shift-0"));
+ menuBorders->AppendRadioItem(Widgets_BorderSimple, _T("&Simple\tCtrl-Shift-1"));
+ menuBorders->AppendRadioItem(Widgets_BorderDouble, _T("&Double\tCtrl-Shift-2"));
+ menuBorders->AppendRadioItem(Widgets_BorderStatic, _T("Stati&c\tCtrl-Shift-3"));
+ menuBorders->AppendRadioItem(Widgets_BorderRaised, _T("&Raised\tCtrl-Shift-4"));
+ menuBorders->AppendRadioItem(Widgets_BorderSunken, _T("S&unken\tCtrl-Shift-5"));
+ menuWidget->AppendSubMenu(menuBorders, _T("Set &border"));
+
menuWidget->AppendSeparator();
menuWidget->Append(wxID_EXIT, _T("&Quit\tCtrl-Q"));
mbar->Append(menuWidget, _T("&Widget"));
SetMenuBar(mbar);
+
+ mbar->Check(Widgets_Enable, true);
#endif // wxUSE_MENUS
// create controls
// we have 2 panes: book with pages demonstrating the controls in the
// upper one and the log window with some buttons in the lower
- int style = wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBC_DEFAULT;
+ int style = wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBK_DEFAULT;
// Uncomment to suppress page theme (draw in solid colour)
- // style |= wxNB_NOPAGETHEME;
+ //style |= wxNB_NOPAGETHEME;
- m_book = new wxBookCtrl(m_panel, wxID_ANY, wxDefaultPosition,
- wxDefaultSize, style);
+ m_book = new wxBookCtrl(m_panel, Widgets_BookCtrl, wxDefaultPosition,
+#ifdef __WXMOTIF__
+ wxSize(500, wxDefaultCoord), // under Motif, height is a function of the width...
+#else
+ wxDefaultSize,
+#endif
+ style);
InitBook();
#ifndef __SMARTPHONE__
ArrayWidgetsPage pages;
wxArrayString labels;
+ wxMenu *menuPages = new wxMenu;
+ unsigned nPage = 0;
+
// we need to first create all pages and only then add them to the book
// as we need the image list first
- WidgetsPageInfo *info = WidgetsPage::ms_widgetPages;
- while ( info )
+ //
+ // we also construct the pages menu during this first iteration
+ for ( WidgetsPageInfo *info = WidgetsPage::ms_widgetPages;
+ info;
+ info = info->GetNext(), nPage++ )
{
WidgetsPage *page = (*info->GetCtor())(m_book, m_imaglist);
pages.Add(page);
labels.Add(info->GetLabel());
-
- info = info->GetNext();
+ menuPages->AppendRadioItem
+ (
+ Widgets_GoToPage + nPage,
+ wxString::Format(wxT("%s\tF%u"),
+ info->GetLabel().c_str(), nPage + 1)
+ );
}
+ GetMenuBar()->Append(menuPages, _T("&Page"));
+
m_book->SetImageList(m_imaglist);
// now do add them
false, // don't select
n // image id
);
-
-/*
- wxColour colour = m_book->MSWGetBgColourForChild(pages[n]);
- pages[n]->SetBackgroundColour(colour);
-*/
}
}
#if wxUSE_MENUS
+void WidgetsFrame::OnPageChanged(wxBookCtrlEvent& event)
+{
+ GetMenuBar()->Check(Widgets_GoToPage + event.GetSelection(), true);
+ event.Skip();
+}
+
+void WidgetsFrame::OnGoToPage(wxCommandEvent& event)
+{
+ m_book->SetSelection(event.GetId() - Widgets_GoToPage);
+}
+
#if wxUSE_TOOLTIPS
void WidgetsFrame::OnSetTooltip(wxCommandEvent& WXUNUSED(event))
{
static wxString s_tip = _T("This is a tooltip");
- wxString s = wxGetTextFromUser
- (
- _T("Tooltip text: "),
- _T("Widgets sample"),
- s_tip,
- this
- );
+ wxTextEntryDialog dialog
+ (
+ this,
+ _T("Tooltip text (may use \\n, leave empty to remove): "),
+ _T("Widgets sample"),
+ s_tip
+ );
- if ( s.empty() )
+ if ( dialog.ShowModal() != wxID_OK )
return;
+ s_tip = dialog.GetValue();
+ s_tip.Replace(_T("\\n"), _T("\n"));
+
WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
- page->GetWidget()->SetToolTip(s_tip = s);
+ page->GetWidget()->SetToolTip(s_tip);
wxControl *ctrl2 = page->GetWidget2();
if ( ctrl2 )
- ctrl2->SetToolTip(s);
+ ctrl2->SetToolTip(s_tip);
}
#endif // wxUSE_TOOLTIPS
void WidgetsFrame::OnSetFgCol(wxCommandEvent& WXUNUSED(event))
{
#if wxUSE_COLOURDLG
+ // allow for debugging the default colour the first time this is called
+ WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+ if (!m_colFg.Ok())
+ m_colFg = page->GetForegroundColour();
+
wxColour col = wxGetColourFromUser(this, m_colFg);
if ( !col.Ok() )
return;
m_colFg = col;
- WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
page->GetWidget()->SetForegroundColour(m_colFg);
page->GetWidget()->Refresh();
void WidgetsFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event))
{
#if wxUSE_COLOURDLG
+ WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+ if ( !m_colBg.Ok() )
+ m_colBg = page->GetBackgroundColour();
+
wxColour col = wxGetColourFromUser(this, m_colBg);
if ( !col.Ok() )
return;
m_colBg = col;
- WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
page->GetWidget()->SetBackgroundColour(m_colBg);
page->GetWidget()->Refresh();
#endif
}
+void WidgetsFrame::OnSetFont(wxCommandEvent& WXUNUSED(event))
+{
+#if wxUSE_FONTDLG
+ WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+ if (!m_font.Ok())
+ m_font = page->GetFont();
+
+ wxFont font = wxGetFontFromUser(this, m_font);
+ if ( !font.Ok() )
+ return;
+
+ m_font = font;
+
+ page->GetWidget()->SetFont(m_font);
+ page->GetWidget()->Refresh();
+
+ wxControl *ctrl2 = page->GetWidget2();
+ if ( ctrl2 )
+ {
+ ctrl2->SetFont(m_font);
+ ctrl2->Refresh();
+ }
+#else
+ wxLogMessage(_T("Font selection dialog not available in current build."));
+#endif
+}
+
+void WidgetsFrame::OnEnable(wxCommandEvent& event)
+{
+ WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+ page->GetWidget()->Enable(event.IsChecked());
+}
+
+void WidgetsFrame::OnSetBorder(wxCommandEvent& event)
+{
+ int border;
+ switch ( event.GetId() )
+ {
+ case Widgets_BorderNone: border = wxBORDER_NONE; break;
+ case Widgets_BorderStatic: border = wxBORDER_STATIC; break;
+ case Widgets_BorderSimple: border = wxBORDER_SIMPLE; break;
+ case Widgets_BorderRaised: border = wxBORDER_RAISED; break;
+ case Widgets_BorderSunken: border = wxBORDER_SUNKEN; break;
+ case Widgets_BorderDouble: border = wxBORDER_DOUBLE; break;
+
+ default:
+ wxFAIL_MSG( _T("unknown border style") );
+ // fall through
+
+ case Widgets_BorderDefault: border = wxBORDER_DEFAULT; break;
+ }
+
+ WidgetsPage::ms_defaultFlags &= ~wxBORDER_MASK;
+ WidgetsPage::ms_defaultFlags |= border;
+
+ WidgetsPage *page = wxStaticCast(m_book->GetCurrentPage(), WidgetsPage);
+ page->RecreateWidget();
+}
+
#endif // wxUSE_MENUS
// ----------------------------------------------------------------------------
// WidgetsPageInfo
// ----------------------------------------------------------------------------
-WidgetsPageInfo *WidgetsPage::ms_widgetPages = NULL;
-
WidgetsPageInfo::WidgetsPageInfo(Constructor ctor, const wxChar *label)
: m_label(label)
{
m_next = NULL;
- // dummy sorting: add and immediately sort on list according to label
-
- if(WidgetsPage::ms_widgetPages)
+ // dummy sorting: add and immediately sort in the list according to label
+ if ( WidgetsPage::ms_widgetPages )
{
WidgetsPageInfo *node_prev = WidgetsPage::ms_widgetPages;
- if(wxStrcmp(label,node_prev->GetLabel().c_str())<0)
+ if ( wxStrcmp(label, node_prev->GetLabel().c_str()) < 0 )
{
// add as first
m_next = node_prev;
do
{
node_next = node_prev->GetNext();
- if(node_next)
+ if ( node_next )
{
// add if between two
- if(wxStrcmp(label,node_next->GetLabel().c_str())<0)
+ if ( wxStrcmp(label, node_next->GetLabel().c_str()) < 0 )
{
node_prev->SetNext(this);
m_next = node_next;
m_next = node_next;
}
node_prev = node_next;
- }while(node_next);
+ }
+ while ( node_next );
}
}
else
{
// add when first
-
WidgetsPage::ms_widgetPages = this;
-
}
-
}
// ----------------------------------------------------------------------------
// WidgetsPage
// ----------------------------------------------------------------------------
-WidgetsPage::WidgetsPage(wxBookCtrl *book)
+int WidgetsPage::ms_defaultFlags = wxBORDER_DEFAULT;
+WidgetsPageInfo *WidgetsPage::ms_widgetPages = NULL;
+
+WidgetsPage::WidgetsPage(wxBookCtrlBase *book)
: wxPanel(book, wxID_ANY,
wxDefaultPosition, wxDefaultSize,
wxNO_FULL_REPAINT_ON_RESIZE |
return checkbox;
}
-