Merge branch 'msw-headerctrl' of https://github.com/MaartenBent/wxWidgets
Fix applying style of MSW wxHeaderCtrl and add tests for doing it to the widgets sample. See https://github.com/wxWidgets/wxWidgets/pull/1710
This commit is contained in:
@@ -72,10 +72,6 @@ private:
|
|||||||
// Events.
|
// Events.
|
||||||
void OnSize(wxSizeEvent& event);
|
void OnSize(wxSizeEvent& event);
|
||||||
|
|
||||||
// Style flag helper function.
|
|
||||||
long ApplyHeaderReorderFlagToStyle(long style);
|
|
||||||
|
|
||||||
|
|
||||||
// The native header control.
|
// The native header control.
|
||||||
wxMSWHeaderCtrl* m_nativeControl;
|
wxMSWHeaderCtrl* m_nativeControl;
|
||||||
friend class wxMSWHeaderCtrl;
|
friend class wxMSWHeaderCtrl;
|
||||||
|
@@ -48,6 +48,8 @@
|
|||||||
// HeaderCtrlWidgetsPage
|
// HeaderCtrlWidgetsPage
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define NUMBER_OF_COLUMNS 4
|
||||||
|
|
||||||
class HeaderCtrlWidgetsPage : public WidgetsPage
|
class HeaderCtrlWidgetsPage : public WidgetsPage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -100,7 +102,7 @@ protected:
|
|||||||
wxCheckBox *chkAllowHide;
|
wxCheckBox *chkAllowHide;
|
||||||
wxCheckBox *chkWithBitmap;
|
wxCheckBox *chkWithBitmap;
|
||||||
wxRadioBox *rbAlignments;
|
wxRadioBox *rbAlignments;
|
||||||
} m_colSettings[2];
|
} m_colSettings[NUMBER_OF_COLUMNS];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage)
|
DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage)
|
||||||
@@ -116,8 +118,7 @@ private:
|
|||||||
#define HEADER_CTRL_FAMILY GENERIC_CTRLS
|
#define HEADER_CTRL_FAMILY GENERIC_CTRLS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage,
|
IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage, "Header", HEADER_CTRL_FAMILY);
|
||||||
"Header", HEADER_CTRL_FAMILY);
|
|
||||||
|
|
||||||
static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" };
|
static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" };
|
||||||
static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT };
|
static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT };
|
||||||
@@ -127,8 +128,8 @@ static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALI
|
|||||||
|
|
||||||
void HeaderCtrlWidgetsPage::CreateContent()
|
void HeaderCtrlWidgetsPage::CreateContent()
|
||||||
{
|
{
|
||||||
// left pane
|
// top pane
|
||||||
wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
|
wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
// header style
|
// header style
|
||||||
wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style");
|
wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style");
|
||||||
@@ -136,7 +137,11 @@ void HeaderCtrlWidgetsPage::CreateContent()
|
|||||||
m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide");
|
m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide");
|
||||||
m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right");
|
m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right");
|
||||||
ResetHeaderStyle();
|
ResetHeaderStyle();
|
||||||
sizerLeft->Add(sizerHeader, wxSizerFlags().Expand());
|
|
||||||
|
sizerHeader->AddStretchSpacer();
|
||||||
|
wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset");
|
||||||
|
sizerHeader->Add(btnReset, wxSizerFlags().CenterHorizontal().Border());
|
||||||
|
sizerTop->Add(sizerHeader, wxSizerFlags().Expand());
|
||||||
|
|
||||||
// column flags
|
// column flags
|
||||||
for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ )
|
for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ )
|
||||||
@@ -150,25 +155,22 @@ void HeaderCtrlWidgetsPage::CreateContent()
|
|||||||
m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment",
|
m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment",
|
||||||
wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments,
|
wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments,
|
||||||
2, wxRA_SPECIFY_COLS);
|
2, wxRA_SPECIFY_COLS);
|
||||||
sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border(wxALL, 5));
|
sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border());
|
||||||
ResetColumnStyle(i);
|
ResetColumnStyle(i);
|
||||||
sizerLeft->Add(sizerCol, wxSizerFlags().Expand().Border(wxTOP, 15));
|
sizerTop->AddSpacer(15);
|
||||||
|
sizerTop->Add(sizerCol, wxSizerFlags().Expand());
|
||||||
}
|
}
|
||||||
|
|
||||||
sizerLeft->Add(5, 5, wxSizerFlags().Expand().Border(wxALL, 5)); // spacer
|
// bottom pane
|
||||||
wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset");
|
|
||||||
sizerLeft->Add(btnReset, wxSizerFlags().CenterHorizontal().Border(wxALL, 15));
|
|
||||||
|
|
||||||
// right pane
|
|
||||||
m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header");
|
m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header");
|
||||||
RecreateWidget();
|
RecreateWidget();
|
||||||
|
|
||||||
// the 2 panes compose the window
|
// the 2 panes compose the window
|
||||||
wxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL);
|
wxSizer* sizerAll = new wxBoxSizer(wxVERTICAL);
|
||||||
sizerTop->Add(sizerLeft, wxSizerFlags().Expand().DoubleBorder());
|
sizerAll->Add(sizerTop, wxSizerFlags().Expand().Border());
|
||||||
sizerTop->Add(m_sizerHeader, wxSizerFlags(1).Expand().DoubleBorder());
|
sizerAll->Add(m_sizerHeader, wxSizerFlags(1).Expand().Border());
|
||||||
|
|
||||||
SetSizer(sizerTop);
|
SetSizer(sizerAll);
|
||||||
|
|
||||||
// Bind event handlers
|
// Bind event handlers
|
||||||
m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
|
m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
|
||||||
@@ -185,10 +187,6 @@ void HeaderCtrlWidgetsPage::CreateContent()
|
|||||||
}
|
}
|
||||||
btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this);
|
btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this);
|
||||||
btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this);
|
btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this);
|
||||||
|
|
||||||
m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this);
|
|
||||||
m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this);
|
|
||||||
m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderCtrlWidgetsPage::RecreateWidget()
|
void HeaderCtrlWidgetsPage::RecreateWidget()
|
||||||
@@ -200,19 +198,24 @@ void HeaderCtrlWidgetsPage::RecreateWidget()
|
|||||||
m_header = new wxHeaderCtrlSimple(this, wxID_ANY,
|
m_header = new wxHeaderCtrlSimple(this, wxID_ANY,
|
||||||
wxDefaultPosition, wxDefaultSize,
|
wxDefaultPosition, wxDefaultSize,
|
||||||
flags);
|
flags);
|
||||||
wxASSERT(WXSIZEOF(m_colSettings) == 2);
|
|
||||||
wxHeaderColumnSimple col1("First", 100, GetColumnAlignmentFlag(0), GetColumnStyleFlags(0));
|
m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this);
|
||||||
if ( m_colSettings[0].chkWithBitmap->IsChecked() )
|
m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this);
|
||||||
|
m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this);
|
||||||
|
|
||||||
|
for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ )
|
||||||
{
|
{
|
||||||
col1.SetBitmap(wxArtProvider::GetIcon(wxART_ERROR, wxART_BUTTON));
|
wxHeaderColumnSimple col(wxString::Format("Column %d", i + 1),
|
||||||
|
FromDIP(100),
|
||||||
|
GetColumnAlignmentFlag(i),
|
||||||
|
GetColumnStyleFlags(i));
|
||||||
|
if ( m_colSettings[i].chkWithBitmap->IsChecked() )
|
||||||
|
{
|
||||||
|
const wxArtID icons[] = { wxART_ERROR, wxART_QUESTION, wxART_WARNING, wxART_INFORMATION };
|
||||||
|
col.SetBitmap(wxArtProvider::GetIcon(icons[i % WXSIZEOF(icons)], wxART_BUTTON));
|
||||||
|
}
|
||||||
|
m_header->AppendColumn(col);
|
||||||
}
|
}
|
||||||
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->AddStretchSpacer();
|
||||||
m_sizerHeader->Add(m_header, wxSizerFlags().Expand());
|
m_sizerHeader->Add(m_header, wxSizerFlags().Expand());
|
||||||
@@ -310,19 +313,19 @@ void HeaderCtrlWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& evt)
|
|||||||
|
|
||||||
void HeaderCtrlWidgetsPage::OnResizing(wxHeaderCtrlEvent& evt)
|
void HeaderCtrlWidgetsPage::OnResizing(wxHeaderCtrlEvent& evt)
|
||||||
{
|
{
|
||||||
wxLogMessage("Column %i resizing, width = %i", evt.GetColumn(), evt.GetWidth());
|
wxLogMessage("Column %i resizing, width = %i", evt.GetColumn() + 1, evt.GetWidth());
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderCtrlWidgetsPage::OnBeginResize(wxHeaderCtrlEvent& evt)
|
void HeaderCtrlWidgetsPage::OnBeginResize(wxHeaderCtrlEvent& evt)
|
||||||
{
|
{
|
||||||
wxLogMessage("Column %i resize began, width = %i", evt.GetColumn(), evt.GetWidth());
|
wxLogMessage("Column %i resize began, width = %i", evt.GetColumn() + 1, evt.GetWidth());
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderCtrlWidgetsPage::OnEndResize(wxHeaderCtrlEvent& evt)
|
void HeaderCtrlWidgetsPage::OnEndResize(wxHeaderCtrlEvent& evt)
|
||||||
{
|
{
|
||||||
wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn(), evt.GetWidth());
|
wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn() + 1, evt.GetWidth());
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -992,8 +992,8 @@ void WidgetsFrame::OnToggleGlobalBusyCursor(wxCommandEvent& event)
|
|||||||
|
|
||||||
void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event)
|
void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
WidgetsPage::GetAttrs().m_cursor = *(event.IsChecked() ? wxHOURGLASS_CURSOR
|
WidgetsPage::GetAttrs().m_cursor = (event.IsChecked() ? *wxHOURGLASS_CURSOR
|
||||||
: wxSTANDARD_CURSOR);
|
: wxNullCursor);
|
||||||
|
|
||||||
CurrentPage()->SetUpWidget();
|
CurrentPage()->SetUpWidget();
|
||||||
}
|
}
|
||||||
@@ -1359,10 +1359,7 @@ void WidgetsPage::SetUpWidget()
|
|||||||
(*it)->Enable(GetAttrs().m_enabled);
|
(*it)->Enable(GetAttrs().m_enabled);
|
||||||
(*it)->Show(GetAttrs().m_show);
|
(*it)->Show(GetAttrs().m_show);
|
||||||
|
|
||||||
if ( GetAttrs().m_cursor.IsOk() )
|
(*it)->SetCursor(GetAttrs().m_cursor);
|
||||||
{
|
|
||||||
(*it)->SetCursor(GetAttrs().m_cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*it)->SetWindowVariant(GetAttrs().m_variant);
|
(*it)->SetWindowVariant(GetAttrs().m_variant);
|
||||||
|
|
||||||
|
@@ -97,7 +97,7 @@ struct WidgetAttributes
|
|||||||
m_show = true;
|
m_show = true;
|
||||||
m_dir = wxLayout_LeftToRight;
|
m_dir = wxLayout_LeftToRight;
|
||||||
m_variant = wxWINDOW_VARIANT_NORMAL;
|
m_variant = wxWINDOW_VARIANT_NORMAL;
|
||||||
m_cursor = *wxSTANDARD_CURSOR;
|
m_cursor = wxNullCursor;
|
||||||
m_defaultFlags = wxBORDER_DEFAULT;
|
m_defaultFlags = wxBORDER_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1048,10 +1048,12 @@ bool wxHeaderCtrl::Create(wxWindow *parent,
|
|||||||
wxID_ANY,
|
wxID_ANY,
|
||||||
wxDefaultPosition,
|
wxDefaultPosition,
|
||||||
wxDefaultSize,
|
wxDefaultSize,
|
||||||
ApplyHeaderReorderFlagToStyle(wxNO_BORDER),
|
wxNO_BORDER,
|
||||||
wxMSWHeaderCtrlNameStr) )
|
wxMSWHeaderCtrlNameStr) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
SetWindowStyle(newStyle);
|
||||||
|
|
||||||
Bind(wxEVT_SIZE, &wxHeaderCtrl::OnSize, this);
|
Bind(wxEVT_SIZE, &wxHeaderCtrl::OnSize, this);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1136,16 +1138,18 @@ void wxHeaderCtrl::SetWindowStyleFlag(long style)
|
|||||||
|
|
||||||
// Update the native control style.
|
// Update the native control style.
|
||||||
long flags = m_nativeControl->GetWindowStyleFlag();
|
long flags = m_nativeControl->GetWindowStyleFlag();
|
||||||
flags = ApplyHeaderReorderFlagToStyle(flags);
|
|
||||||
m_nativeControl->SetWindowStyleFlag(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
long wxHeaderCtrl::ApplyHeaderReorderFlagToStyle(long style)
|
|
||||||
{
|
|
||||||
if ( HasFlag(wxHD_ALLOW_REORDER) )
|
if ( HasFlag(wxHD_ALLOW_REORDER) )
|
||||||
return style | wxHD_ALLOW_REORDER;
|
flags |= wxHD_ALLOW_REORDER;
|
||||||
|
else
|
||||||
|
flags &= ~wxHD_ALLOW_REORDER;
|
||||||
|
|
||||||
return style & ~wxHD_ALLOW_REORDER;
|
if ( HasFlag(wxHD_BITMAP_ON_RIGHT) )
|
||||||
|
flags |= wxHD_BITMAP_ON_RIGHT;
|
||||||
|
else
|
||||||
|
flags &= ~wxHD_BITMAP_ON_RIGHT;
|
||||||
|
|
||||||
|
m_nativeControl->SetWindowStyleFlag(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxHAS_GENERIC_HEADERCTRL
|
#endif // wxHAS_GENERIC_HEADERCTRL
|
||||||
|
Reference in New Issue
Block a user