X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b8ec418aee4e38877d4cb79e2984c766dcc358..3454f80227ae2f56585a0af38cb5d89eda351c0b:/samples/widgets/static.cpp diff --git a/samples/widgets/static.cpp b/samples/widgets/static.cpp index 61109a84d0..463d40c227 100644 --- a/samples/widgets/static.cpp +++ b/samples/widgets/static.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: static.cpp // Purpose: Part of the widgets sample showing various static controls // Author: Vadim Zeitlin @@ -28,6 +28,7 @@ #ifndef WX_PRECOMP #include "wx/log.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/radiobox.h" @@ -39,9 +40,9 @@ #include "wx/sizer.h" #include "wx/statline.h" +#include "wx/generic/stattextg.h" #include "widgets.h" - #include "icons/statbox.xpm" // ---------------------------------------------------------------------------- @@ -51,9 +52,10 @@ // control ids enum { - StaticPage_Reset = 100, + StaticPage_Reset = wxID_HIGHEST, StaticPage_BoxText, - StaticPage_LabelText + StaticPage_LabelText, + StaticPage_LabelTextWithMarkup }; // alignment radiobox values @@ -73,6 +75,14 @@ enum StaticVAlign_Max }; +enum +{ + StaticEllipsize_Start, + StaticEllipsize_Middle, + StaticEllipsize_End +}; + + // ---------------------------------------------------------------------------- // StaticWidgetsPage // ---------------------------------------------------------------------------- @@ -80,8 +90,14 @@ enum class StaticWidgetsPage : public WidgetsPage { public: - StaticWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); - virtual ~StaticWidgetsPage(); + StaticWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); + virtual ~StaticWidgetsPage(){}; + + virtual wxControl *GetWidget() const { return m_statText; } + virtual void RecreateWidget() { CreateStatic(); } + + // lazy creation of the content + virtual void CreateContent(); protected: // event handlers @@ -90,6 +106,8 @@ protected: void OnButtonReset(wxCommandEvent& event); void OnButtonBoxText(wxCommandEvent& event); void OnButtonLabelText(wxCommandEvent& event); + void OnButtonLabelWithMarkupText(wxCommandEvent& event); + void OnMouseEvent(wxMouseEvent& event); // reset all parameters void Reset(); @@ -102,24 +120,33 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkVert, - *m_chkAutoResize; + *m_chkGeneric, + *m_chkAutoResize, + *m_chkEllipsize, + *m_chkMarkup, + *m_chkGreen; wxRadioBox *m_radioHAlign, - *m_radioVAlign; + *m_radioVAlign, + *m_radioEllipsize; // the controls and the sizer containing them wxStaticBoxSizer *m_sizerStatBox; - wxStaticText *m_statText; + wxStaticTextBase *m_statText, + *m_statMarkup; +#if wxUSE_STATLINE wxStaticLine *m_statLine; +#endif // wxUSE_STATLINE wxSizer *m_sizerStatic; // the text entries for command parameters wxTextCtrl *m_textBox, - *m_textLabel; + *m_textLabel, + *m_textLabelWithMarkup; private: - DECLARE_EVENT_TABLE(); - DECLARE_WIDGETS_PAGE(StaticWidgetsPage); + DECLARE_EVENT_TABLE() + DECLARE_WIDGETS_PAGE(StaticWidgetsPage) }; // ---------------------------------------------------------------------------- @@ -129,46 +156,57 @@ private: BEGIN_EVENT_TABLE(StaticWidgetsPage, WidgetsPage) EVT_BUTTON(StaticPage_Reset, StaticWidgetsPage::OnButtonReset) EVT_BUTTON(StaticPage_LabelText, StaticWidgetsPage::OnButtonLabelText) + EVT_BUTTON(StaticPage_LabelTextWithMarkup, StaticWidgetsPage::OnButtonLabelWithMarkupText) EVT_BUTTON(StaticPage_BoxText, StaticWidgetsPage::OnButtonBoxText) - EVT_CHECKBOX(-1, StaticWidgetsPage::OnCheckOrRadioBox) - EVT_RADIOBOX(-1, StaticWidgetsPage::OnCheckOrRadioBox) + EVT_CHECKBOX(wxID_ANY, StaticWidgetsPage::OnCheckOrRadioBox) + EVT_RADIOBOX(wxID_ANY, StaticWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_WIDGETS_PAGE(StaticWidgetsPage, _T("Static")); +IMPLEMENT_WIDGETS_PAGE(StaticWidgetsPage, _T("Static"), + (int)wxPlatform(GENERIC_CTRLS).If(wxOS_WINDOWS,NATIVE_CTRLS) + ); -StaticWidgetsPage::StaticWidgetsPage(wxNotebook *notebook, - wxImageList *imaglist) - : WidgetsPage(notebook) +StaticWidgetsPage::StaticWidgetsPage(WidgetsBookCtrl *book, + wxImageList *imaglist) + : WidgetsPage(book, imaglist, statbox_xpm) { - imaglist->Add(wxBitmap(statbox_xpm)); - // init everything m_chkVert = m_chkAutoResize = (wxCheckBox *)NULL; + m_chkGeneric = NULL; + m_chkGreen = NULL; m_radioHAlign = m_radioVAlign = (wxRadioBox *)NULL; +#if wxUSE_STATLINE m_statLine = (wxStaticLine *)NULL; - m_statText = (wxStaticText *)NULL; +#endif // wxUSE_STATLINE + m_statText = m_statMarkup = NULL; m_sizerStatBox = (wxStaticBoxSizer *)NULL; m_sizerStatic = (wxSizer *)NULL; + m_textBox = m_textLabel = m_textLabelWithMarkup = NULL; +} + +void StaticWidgetsPage::CreateContent() +{ wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set style")); + wxSizer *sizerLeft = new wxStaticBoxSizer(wxVERTICAL, this, "&Set style"); - wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); - - m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical line")); - m_chkAutoResize = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Fit to text")); + m_chkGeneric = CreateCheckBoxAndAddToSizer(sizerLeft, + "&Generic wxStaticText"); + m_chkMarkup = CreateCheckBoxAndAddToSizer(sizerLeft, "Support &markup"); + m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, "&Vertical line"); + m_chkAutoResize = CreateCheckBoxAndAddToSizer(sizerLeft, "&Fit to text"); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer static const wxString halign[] = @@ -185,61 +223,100 @@ StaticWidgetsPage::StaticWidgetsPage(wxNotebook *notebook, _T("bottom"), }; - m_radioHAlign = new wxRadioBox(this, -1, _T("&Horz alignment"), + m_radioHAlign = new wxRadioBox(this, wxID_ANY, _T("&Horz alignment"), wxDefaultPosition, wxDefaultSize, - WXSIZEOF(halign), halign); - m_radioVAlign = new wxRadioBox(this, -1, _T("&Vert alignment"), + WXSIZEOF(halign), halign, 3); + m_radioVAlign = new wxRadioBox(this, wxID_ANY, _T("&Vert alignment"), wxDefaultPosition, wxDefaultSize, - WXSIZEOF(valign), valign); + WXSIZEOF(valign), valign, 3); sizerLeft->Add(m_radioHAlign, 0, wxGROW | wxALL, 5); sizerLeft->Add(m_radioVAlign, 0, wxGROW | wxALL, 5); + + sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer + + m_chkEllipsize = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Ellipsize")); + + static const wxString ellipsizeMode[] = + { + _T("&start"), + _T("&middle"), + _T("&end"), + }; + + m_radioEllipsize = new wxRadioBox(this, wxID_ANY, _T("&Ellipsize mode"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(ellipsizeMode), ellipsizeMode, + 3); + + sizerLeft->Add(m_radioEllipsize, 0, wxGROW | wxALL, 5); + wxButton *btn = new wxButton(this, StaticPage_Reset, _T("&Reset")); sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane - wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Change labels")); - wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); - - wxSizer *sizerRow; + wxSizer *sizerMiddle = new wxStaticBoxSizer(wxVERTICAL, this, + "&Change labels"); + + m_textBox = new wxTextCtrl(this, wxID_ANY, wxEmptyString); + wxButton *b1 = new wxButton(this, wxID_ANY, "Change &box label"); + b1->Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(StaticWidgetsPage::OnButtonBoxText), + NULL, this); + sizerMiddle->Add(m_textBox, 0, wxEXPAND|wxALL, 5); + sizerMiddle->Add(b1, 0, wxLEFT|wxBOTTOM, 5); + + m_textLabel = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE|wxHSCROLL); + wxButton *b2 = new wxButton(this, wxID_ANY, "Change &text label"); + b2->Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(StaticWidgetsPage::OnButtonLabelText), + NULL, this); + sizerMiddle->Add(m_textLabel, 0, wxEXPAND|wxALL, 5); + sizerMiddle->Add(b2, 0, wxLEFT|wxBOTTOM, 5); + + m_textLabelWithMarkup = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE|wxHSCROLL); + + wxButton *b3 = new wxButton(this, wxID_ANY, "Change decorated text label"); + b3->Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(StaticWidgetsPage::OnButtonLabelWithMarkupText), + NULL, this); + sizerMiddle->Add(m_textLabelWithMarkup, 0, wxEXPAND|wxALL, 5); + sizerMiddle->Add(b3, 0, wxLEFT|wxBOTTOM, 5); + + m_chkGreen = CreateCheckBoxAndAddToSizer(sizerLeft, + "Decorated label on g&reen"); + sizerMiddle->Add(m_chkGreen, 0, wxALL, 5); - sizerRow = CreateSizerWithTextAndButton(StaticPage_BoxText, - _T("Change &box label"), - -1, &m_textBox); - sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); - - sizerRow = CreateSizerWithTextAndButton(StaticPage_LabelText, - _T("Change &text label"), - -1, &m_textLabel); - sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); + // final initializations + // NB: must be done _before_ calling CreateStatic() + Reset(); m_textBox->SetValue(_T("This is a box")); - m_textLabel->SetValue(_T("And this is a label\ninside the box")); + m_textLabel->SetValue(_T("And this is a\n\tlabel inside the box with a &mnemonic.\n") + _T("Only this text is affected by the ellipsize settings.")); + m_textLabelWithMarkup->SetValue(_T("Another label, this time decorated ") + _T("with markup; here you need entities ") + _T("for the symbols: < > & ' " ") + _T(" but you can still place &mnemonics...")); // right pane wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); - sizerRight->SetMinSize(250, 0); + sizerRight->SetMinSize(150, 0); m_sizerStatic = sizerRight; CreateStatic(); // the 3 panes panes compose the window sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10); - sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10); + sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10); sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10); - // final initializations - Reset(); - - SetAutoLayout(TRUE); SetSizer(sizerTop); - - sizerTop->Fit(this); -} - -StaticWidgetsPage::~StaticWidgetsPage() -{ } // ---------------------------------------------------------------------------- @@ -248,8 +325,11 @@ StaticWidgetsPage::~StaticWidgetsPage() void StaticWidgetsPage::Reset() { - m_chkVert->SetValue(FALSE); - m_chkAutoResize->SetValue(TRUE); + m_chkGeneric->SetValue(false); + m_chkVert->SetValue(false); + m_chkAutoResize->SetValue(true); + m_chkEllipsize->SetValue(true); + m_chkMarkup->SetValue(true); m_radioHAlign->SetSelection(StaticHAlign_Left); m_radioVAlign->SetSelection(StaticVAlign_Top); @@ -261,19 +341,29 @@ void StaticWidgetsPage::CreateStatic() if ( m_sizerStatBox ) { - m_sizerStatic->Remove(m_sizerStatBox); - // delete m_sizerStatBox; -- deleted by Remove() + m_sizerStatic->Remove(m_sizerStatBox); delete m_statText; + delete m_statMarkup; +#if wxUSE_STATLINE delete m_statLine; +#endif // wxUSE_STATLINE } int flagsBox = 0, - flagsText = 0; + flagsText = ms_defaultFlags, + flagsDummyText = ms_defaultFlags; if ( !m_chkAutoResize->GetValue() ) { flagsText |= wxST_NO_AUTORESIZE; + flagsDummyText |= wxST_NO_AUTORESIZE; + } + + if ( m_chkMarkup->GetValue() ) + { + flagsText |= wxST_MARKUP; + flagsDummyText |= wxST_MARKUP; } int align = 0; @@ -315,30 +405,85 @@ void StaticWidgetsPage::CreateStatic() break; } + if ( m_chkEllipsize->GetValue() ) + { + switch ( m_radioEllipsize->GetSelection() ) + { + default: + wxFAIL_MSG(_T("unexpected radiobox selection")); + // fall through + + case StaticEllipsize_Start: + flagsDummyText |= wxST_ELLIPSIZE_START; + break; + + case StaticEllipsize_Middle: + flagsDummyText |= wxST_ELLIPSIZE_MIDDLE; + break; + + case StaticEllipsize_End: + flagsDummyText |= wxST_ELLIPSIZE_END; + break; + } + } + + flagsDummyText |= align; flagsText |= align; flagsBox |= align; - wxStaticBox *box = new wxStaticBox(this, -1, m_textBox->GetValue(), - wxDefaultPosition, wxDefaultSize, - flagsBox); - m_sizerStatBox = new wxStaticBoxSizer(box, isVert ? wxHORIZONTAL - : wxVERTICAL); + wxStaticBox *staticBox = new wxStaticBox(this, wxID_ANY, + m_textBox->GetValue(), + wxDefaultPosition, wxDefaultSize, + flagsBox); + m_sizerStatBox = new wxStaticBoxSizer(staticBox, isVert ? wxHORIZONTAL + : wxVERTICAL); - m_statText = new wxStaticText(this, -1, m_textLabel->GetValue(), - wxDefaultPosition, wxDefaultSize, - flagsText); - - m_statLine = new wxStaticLine(this, -1, + if ( m_chkGeneric->GetValue() ) + { + m_statText = new wxGenericStaticText(this, wxID_ANY, + m_textLabel->GetValue(), + wxDefaultPosition, wxDefaultSize, + flagsDummyText); + m_statMarkup = new wxGenericStaticText(this, wxID_ANY, + m_textLabelWithMarkup->GetValue(), + wxDefaultPosition, wxDefaultSize, + flagsText); + } + else // use native versions + { + m_statText = new wxStaticText(this, wxID_ANY, + m_textLabel->GetValue(), + wxDefaultPosition, wxDefaultSize, + flagsDummyText); + m_statMarkup = new wxStaticText(this, wxID_ANY, + m_textLabelWithMarkup->GetValue(), + wxDefaultPosition, wxDefaultSize, + flagsText); + } + if ( m_chkGreen->GetValue() ) + m_statMarkup->SetBackgroundColour(*wxGREEN); +#if wxUSE_STATLINE + m_statLine = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, isVert ? wxLI_VERTICAL : wxLI_HORIZONTAL); +#endif // wxUSE_STATLINE m_sizerStatBox->Add(m_statText, 1, wxGROW | wxALL, 5); +#if wxUSE_STATLINE m_sizerStatBox->Add(m_statLine, 0, wxGROW | wxALL, 5); - m_sizerStatBox->Add(0, 0, 1); +#endif // wxUSE_STATLINE + m_sizerStatBox->Add(m_statMarkup, 1, wxGROW | wxALL, 5); m_sizerStatic->Add(m_sizerStatBox, 1, wxGROW); m_sizerStatic->Layout(); + + m_statText->Connect(wxEVT_LEFT_UP, + wxMouseEventHandler(StaticWidgetsPage::OnMouseEvent), + NULL, this); + staticBox->Connect(wxEVT_LEFT_UP, + wxMouseEventHandler(StaticWidgetsPage::OnMouseEvent), + NULL, this); } // ---------------------------------------------------------------------------- @@ -354,16 +499,50 @@ void StaticWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event)) void StaticWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) { + if (event.GetEventObject() == static_cast(m_chkEllipsize)) + { + m_radioEllipsize->Enable(event.IsChecked()); + } + CreateStatic(); } -void StaticWidgetsPage::OnButtonBoxText(wxCommandEvent& event) +void StaticWidgetsPage::OnButtonBoxText(wxCommandEvent& WXUNUSED(event)) { m_sizerStatBox->GetStaticBox()->SetLabel(m_textBox->GetValue()); } -void StaticWidgetsPage::OnButtonLabelText(wxCommandEvent& event) +void StaticWidgetsPage::OnButtonLabelText(wxCommandEvent& WXUNUSED(event)) { m_statText->SetLabel(m_textLabel->GetValue()); + + // test GetLabel() and GetLabelText(); the first should return the + // label as it is written in the relative text control; the second should + // return the label as it's shown in the wxStaticText + wxLogMessage(wxT("The original label should be '%s'"), + m_statText->GetLabel()); + wxLogMessage(wxT("The label text is '%s'"), + m_statText->GetLabelText()); +} + +void StaticWidgetsPage::OnButtonLabelWithMarkupText(wxCommandEvent& WXUNUSED(event)) +{ + m_statMarkup->SetLabel(m_textLabelWithMarkup->GetValue()); + + // test GetLabel() and GetLabelText(); the first should return the + // label as it is written in the relative text control; the second should + // return the label as it's shown in the wxStaticText + wxLogMessage(wxT("The original label should be '%s'"), + m_statMarkup->GetLabel()); + wxLogMessage(wxT("The label text is '%s'"), + m_statMarkup->GetLabelText()); +} + +void StaticWidgetsPage::OnMouseEvent(wxMouseEvent& event) +{ + if ( event.GetEventObject() == m_statText ) + wxLogMessage("Clicked on static text"); + else + wxLogMessage("Clicked on static box"); }