Extend wxHeaderCtrl demonstration in widgets sample

Added ability to show header columns with various style flags.
This commit is contained in:
Artur Wieczorek
2019-01-19 22:06:17 +01:00
parent 4fce66a483
commit 7a6200631a

View File

@@ -27,8 +27,10 @@
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/artprov.h"
#include "wx/button.h"
#include "wx/checkbox.h"
#include "wx/radiobox.h"
#include "wx/sizer.h"
#include "wx/statbox.h"
#include "wx/stattext.h"
@@ -62,22 +64,38 @@ public:
protected:
// event handlers
void OnStyleCheckBox(wxCommandEvent& evt);
void OnStyleCheckOrRadioBox(wxCommandEvent& evt);
void OnResetButton(wxCommandEvent& evt);
void OnUpdateUIResetButton(wxUpdateUIEvent& evt);
// reset the header styles
void Reset();
// compose style flags based on selected styles
long GetStyleFlags() const;
// reset the header style
void ResetHeaderStyle();
// compose header style flags based on selections
long GetHeaderStyleFlags() const;
// reset column style
void ResetColumnStyle(int col);
// compose columnm style flags based on selections
int GetColumnStyleFlags(int col) const;
// get columnm alignment flags based on selection
wxAlignment GetColumnAlignmentFlag(int col) const;
// the control itself and the sizer it is in
wxHeaderCtrlSimple *m_header;
wxSizer *m_sizerHeader;
// the check boxes for styles
// the check boxes for header styles
wxCheckBox *m_chkAllowReorder;
wxCheckBox *m_chkAllowHide;
wxCheckBox *m_chkBitmapOnRight;
// The check boxes for column styles
struct
{
wxCheckBox *chkAllowResize;
wxCheckBox *chkAllowReorder;
wxCheckBox *chkAllowSort;
wxCheckBox *chkAllowHide;
wxCheckBox *chkWithBitmap;
wxRadioBox *rbAlignments;
} m_colSettings[2];
private:
DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage)
@@ -96,24 +114,48 @@ private:
IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage,
"Header", HEADER_CTRL_FAMILY);
static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" };
static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT };
#define COL_WITH_BITMAP_DEFAULT false
#define COL_ALIGNMENT_FLAG_DEFAULT wxALIGN_NOT
#define COL_ALIGNMENT_INDEX_DEFAULT 0
void HeaderCtrlWidgetsPage::CreateContent()
{
// left pane
wxStaticBox* box = new wxStaticBox(this, wxID_ANY, "&Set style");
wxSizer* sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
m_chkAllowReorder = CreateCheckBoxAndAddToSizer(sizerLeft, "Allow &reorder");
m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerLeft, "Alow &hide");
m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerLeft, "&Bitmap on right");
// header style
wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style");
m_chkAllowReorder = CreateCheckBoxAndAddToSizer(sizerHeader, "Allow &reorder");
m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide");
m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right");
ResetHeaderStyle();
sizerLeft->Add(sizerHeader, wxSizerFlags().Expand());
// column flags
for ( int i = 0; i < WXSIZEOF(m_colSettings); i++ )
{
wxSizer* sizerCol = new wxStaticBoxSizer(wxVERTICAL, this, wxString::Format("Column %i style", i+1));
m_colSettings[i].chkAllowResize = CreateCheckBoxAndAddToSizer(sizerCol, "Allow resize");
m_colSettings[i].chkAllowReorder = CreateCheckBoxAndAddToSizer(sizerCol, "Allow reorder");
m_colSettings[i].chkAllowSort = CreateCheckBoxAndAddToSizer(sizerCol, "Allow sort");
m_colSettings[i].chkAllowHide = CreateCheckBoxAndAddToSizer(sizerCol, "Hidden");
m_colSettings[i].chkWithBitmap = CreateCheckBoxAndAddToSizer(sizerCol, "With bitmap");
m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment",
wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments,
2, wxRA_SPECIFY_COLS);
sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border(wxALL, 5));
ResetColumnStyle(i);
sizerLeft->Add(sizerCol, wxSizerFlags().Expand().Border(wxTOP, 15));
}
sizerLeft->Add(5, 5, wxSizerFlags().Expand().Border(wxALL, 5)); // spacer
wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset");
sizerLeft->Add(btnReset, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
// right pane
m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header");
Reset();
RecreateWidget();
// the 2 panes compose the window
@@ -124,9 +166,18 @@ void HeaderCtrlWidgetsPage::CreateContent()
SetSizer(sizerTop);
// Bind event handlers
m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckBox, this);
m_chkAllowHide->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckBox, this);
m_chkBitmapOnRight->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckBox, this);
m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_chkAllowHide->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_chkBitmapOnRight->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
for ( int i = 0; i < WXSIZEOF(m_colSettings); i++ )
{
m_colSettings[i].chkAllowResize->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_colSettings[i].chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_colSettings[i].chkAllowSort->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_colSettings[i].chkAllowHide->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_colSettings[i].chkWithBitmap->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
m_colSettings[i].rbAlignments->Bind(wxEVT_RADIOBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
}
btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this);
btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this);
}
@@ -135,13 +186,24 @@ void HeaderCtrlWidgetsPage::RecreateWidget()
{
m_sizerHeader->Clear(true /* delete windows */);
long flags = GetAttrs().m_defaultFlags | GetStyleFlags();
long flags = GetAttrs().m_defaultFlags | GetHeaderStyleFlags();
m_header = new wxHeaderCtrlSimple(this, wxID_ANY,
wxDefaultPosition, wxDefaultSize,
flags);
m_header->AppendColumn(wxHeaderColumnSimple("First", 100));
m_header->AppendColumn(wxHeaderColumnSimple("Second", 200));
wxASSERT(WXSIZEOF(m_colSettings) == 2);
wxHeaderColumnSimple col1("First", 100, GetColumnAlignmentFlag(0), GetColumnStyleFlags(0));
if ( m_colSettings[0].chkWithBitmap->IsChecked() )
{
col1.SetBitmap(wxArtProvider::GetIcon(wxART_ERROR, wxART_BUTTON));
}
m_header->AppendColumn(col1);
wxHeaderColumnSimple col2("Second", 200, GetColumnAlignmentFlag(1), GetColumnStyleFlags(1));
if ( m_colSettings[1].chkWithBitmap->IsChecked() )
{
col2.SetBitmap(wxArtProvider::GetIcon(wxART_QUESTION, wxART_BUTTON));
}
m_header->AppendColumn(col2);
m_sizerHeader->AddStretchSpacer();
m_sizerHeader->Add(m_header, wxSizerFlags().Expand());
@@ -149,14 +211,14 @@ void HeaderCtrlWidgetsPage::RecreateWidget()
m_sizerHeader->Layout();
}
void HeaderCtrlWidgetsPage::Reset()
void HeaderCtrlWidgetsPage::ResetHeaderStyle()
{
m_chkAllowReorder->SetValue((wxHD_DEFAULT_STYLE & wxHD_ALLOW_REORDER) != 0);
m_chkAllowHide->SetValue((wxHD_DEFAULT_STYLE & wxHD_ALLOW_HIDE) != 0);
m_chkBitmapOnRight->SetValue((wxHD_DEFAULT_STYLE & wxHD_BITMAP_ON_RIGHT) != 0);
}
long HeaderCtrlWidgetsPage::GetStyleFlags() const
long HeaderCtrlWidgetsPage::GetHeaderStyleFlags() const
{
long flags = 0;
@@ -170,24 +232,71 @@ long HeaderCtrlWidgetsPage::GetStyleFlags() const
return flags;
}
void HeaderCtrlWidgetsPage::ResetColumnStyle(int col)
{
wxASSERT(col < WXSIZEOF(m_colSettings));
m_colSettings[col].chkAllowResize->SetValue((wxCOL_DEFAULT_FLAGS & wxCOL_RESIZABLE) != 0);
m_colSettings[col].chkAllowReorder->SetValue((wxCOL_DEFAULT_FLAGS & wxCOL_REORDERABLE) != 0);
m_colSettings[col].chkAllowSort->SetValue((wxCOL_DEFAULT_FLAGS & wxCOL_SORTABLE) != 0);
m_colSettings[col].chkAllowHide->SetValue((wxCOL_DEFAULT_FLAGS & wxCOL_HIDDEN) != 0);
m_colSettings[col].chkWithBitmap->SetValue(COL_WITH_BITMAP_DEFAULT);
m_colSettings[col].rbAlignments->SetSelection(COL_ALIGNMENT_INDEX_DEFAULT);
}
int HeaderCtrlWidgetsPage::GetColumnStyleFlags(int col) const
{
wxASSERT(col < WXSIZEOF(m_colSettings));
int flags = 0;
if ( m_colSettings[col].chkAllowResize->IsChecked() )
flags |= wxCOL_RESIZABLE;
if ( m_colSettings[col].chkAllowReorder->IsChecked() )
flags |= wxCOL_REORDERABLE;
if ( m_colSettings[col].chkAllowSort->IsChecked() )
flags |= wxCOL_SORTABLE;
if ( m_colSettings[col].chkAllowHide->IsChecked() )
flags |= wxCOL_HIDDEN;
return flags;
}
wxAlignment HeaderCtrlWidgetsPage::GetColumnAlignmentFlag(int col) const
{
wxASSERT(col < WXSIZEOF(m_colSettings));
wxASSERT(WXSIZEOF(gs_colAlignments) == WXSIZEOF(gs_colAlignFlags));
int sel = m_colSettings[col].rbAlignments->GetSelection();
return sel == wxNOT_FOUND ? COL_ALIGNMENT_FLAG_DEFAULT : gs_colAlignFlags[sel];
}
// ----------------------------------------------------------------------------
// event handlers
// ----------------------------------------------------------------------------
void HeaderCtrlWidgetsPage::OnStyleCheckBox(wxCommandEvent& WXUNUSED(evt))
void HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox(wxCommandEvent& WXUNUSED(evt))
{
RecreateWidget();
}
void HeaderCtrlWidgetsPage::OnResetButton(wxCommandEvent& WXUNUSED(evt))
{
Reset();
ResetHeaderStyle();
for ( int i = 0; i < WXSIZEOF(m_colSettings); i++ )
{
ResetColumnStyle(i);
}
RecreateWidget();
}
void HeaderCtrlWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& evt)
{
evt.Enable(GetStyleFlags() != wxHD_DEFAULT_STYLE);
bool enable = GetHeaderStyleFlags() != wxHD_DEFAULT_STYLE;
for ( int i = 0; !enable && i < WXSIZEOF(m_colSettings); i++ )
{
enable = enable || GetColumnStyleFlags(i) != wxCOL_DEFAULT_FLAGS
|| m_colSettings[i].chkWithBitmap->IsChecked() != COL_WITH_BITMAP_DEFAULT
|| m_colSettings[i].rbAlignments->GetSelection() != COL_ALIGNMENT_INDEX_DEFAULT;
}
evt.Enable(enable);
}
#endif // wxUSE_HEADERCTRL