X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7dfb6dc4a98863237e95683d3add779c0eff75a2..eb63011d3f99e0e4f97ec6f0e2319bd4deee9b4f:/samples/grid/griddemo.cpp diff --git a/samples/grid/griddemo.cpp b/samples/grid/griddemo.cpp index 4b4b8be86b..3e2e45147b 100644 --- a/samples/grid/griddemo.cpp +++ b/samples/grid/griddemo.cpp @@ -1565,22 +1565,34 @@ public: ROW_MAX = 3 }; + TabularGridTable() { m_sortOrder = NULL; } + virtual int GetNumberRows() { return ROW_MAX; } virtual int GetNumberCols() { return COL_MAX; } virtual wxString GetValue(int row, int col) { - // notice that column parameter here always refers to the internal - // column index, independently of its position on the screen - static const char *filedata[][COL_MAX] = + if ( m_sortOrder ) + row = m_sortOrder[row]; + + switch ( col ) { - { "autoexec", "bat", "412", "Apr 17 2004" }, - { "boot", "ini", "604", "May 27 2006" }, - { "io", "sys", "40774", "May 31 1994" }, - }; - wxCOMPILE_TIME_ASSERT( WXSIZEOF(filedata) == ROW_MAX, Mismatch ); + case COL_NAME: + case COL_EXT: + return GetNameOrExt(row, col); + + case COL_SIZE: + return wxString::Format("%lu", GetSize(row)); - return filedata[row][col]; + case COL_DATE: + return GetDate(row).FormatDate(); + + case COL_MAX: + default: + wxFAIL_MSG( "unknown column" ); + } + + return wxString(); } virtual void SetValue(int, int, const wxString&) @@ -1590,8 +1602,10 @@ public: virtual wxString GetColLabelValue(int col) { + // notice that column parameter here always refers to the internal + // column index, independently of its position on the screen static const char *labels[] = { "Name", "Extension", "Size", "Date" }; - wxCOMPILE_TIME_ASSERT( WXSIZEOF(labels) == COL_MAX, Mismatch ); + wxCOMPILE_TIME_ASSERT( WXSIZEOF(labels) == COL_MAX, LabelsMismatch ); return labels[col]; } @@ -1600,6 +1614,54 @@ public: { wxFAIL_MSG( "shouldn't be called" ); } + + void Sort(int col, bool ascending) + { + // we hardcode all sorting orders for simplicity here + static int sortOrders[COL_MAX][2][ROW_MAX] = + { + // descending ascending + { { 2, 1, 0 }, { 0, 1, 2 } }, + { { 2, 1, 0 }, { 0, 1, 2 } }, + { { 2, 1, 0 }, { 0, 1, 2 } }, + { { 1, 0, 2 }, { 2, 0, 1 } }, + }; + + m_sortOrder = col == wxNOT_FOUND ? NULL : sortOrders[col][ascending]; + } + +private: + wxString GetNameOrExt(int row, int col) const + { + static const char * + names[] = { "autoexec.bat", "boot.ini", "io.sys" }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(names) == ROW_MAX, NamesMismatch ); + + const wxString s(names[row]); + return col == COL_NAME ? s.BeforeFirst('.') : s.AfterLast('.'); + } + + unsigned long GetSize(int row) const + { + static const unsigned long + sizes[] = { 412, 604, 40774 }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(sizes) == ROW_MAX, SizesMismatch ); + + return sizes[row]; + } + + wxDateTime GetDate(int row) const + { + static const char * + dates[] = { "2004-04-17", "2006-05-27", "1994-05-31" }; + wxCOMPILE_TIME_ASSERT( WXSIZEOF(dates) == ROW_MAX, DatesMismatch ); + + wxDateTime dt; + dt.ParseISODate(dates[row]); + return dt; + } + + int *m_sortOrder; }; // specialized text control for column indexes entry @@ -1641,7 +1703,9 @@ public: private: enum // control ids { - Id_Check_UseNative, + Id_Check_UseNativeHeader, + Id_Check_DrawNativeLabels, + Id_Check_ShowRowLabels, Id_Check_EnableColMove }; @@ -1649,7 +1713,26 @@ private: void OnToggleUseNativeHeader(wxCommandEvent&) { - m_grid->SetUseNativeColLabels(m_chkUseNative->IsChecked()); + m_grid->UseNativeColHeader(m_chkUseNative->IsChecked()); + } + + void OnUpdateDrawNativeLabelsUI(wxUpdateUIEvent& event) + { + // we don't draw labels at all, native or otherwise, if we use the + // native header control + event.Enable( !m_chkUseNative->GetValue() ); + } + + void OnToggleDrawNativeLabels(wxCommandEvent&) + { + m_grid->SetUseNativeColLabels(m_chkDrawNative->IsChecked()); + } + + void OnToggleShowRowLabels(wxCommandEvent&) + { + m_grid->SetRowLabelSize(m_chkShowRowLabels->IsChecked() + ? wxGRID_AUTOSIZE + : 0); } void OnToggleColMove(wxCommandEvent&) @@ -1669,9 +1752,29 @@ private: UpdateOrder(); } + void OnGridColSort(wxGridEvent& event) + { + const int col = event.GetCol(); + m_table->Sort(col, !(m_grid->IsSortingBy(col) && + m_grid->IsSortOrderAscending())); + } + void OnGridColMove(wxGridEvent& event) { - UpdateOrder(); + // can't update it yet as the order hasn't been changed, so do it a bit + // later + m_shouldUpdateOrder = true; + + event.Skip(); + } + + void OnIdle(wxIdleEvent& event) + { + if ( m_shouldUpdateOrder ) + { + m_shouldUpdateOrder = false; + UpdateOrder(); + } event.Skip(); } @@ -1687,7 +1790,10 @@ private: // controls wxGrid *m_grid; + TabularGridTable *m_table; wxCheckBox *m_chkUseNative, + *m_chkDrawNative, + *m_chkShowRowLabels, *m_chkEnableColMove; ColIndexEntry *m_txtColIndex, @@ -1695,28 +1801,51 @@ private: wxStaticText *m_statOrder; + // fla for EVT_IDLE handler + bool m_shouldUpdateOrder; + DECLARE_NO_COPY_CLASS(TabularGridFrame) DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(TabularGridFrame, wxFrame) - EVT_CHECKBOX(Id_Check_UseNative, TabularGridFrame::OnToggleUseNativeHeader) - EVT_CHECKBOX(Id_Check_EnableColMove, TabularGridFrame::OnToggleColMove) + EVT_CHECKBOX(Id_Check_UseNativeHeader, + TabularGridFrame::OnToggleUseNativeHeader) + EVT_CHECKBOX(Id_Check_DrawNativeLabels, + TabularGridFrame::OnToggleDrawNativeLabels) + EVT_CHECKBOX(Id_Check_ShowRowLabels, + TabularGridFrame::OnToggleShowRowLabels) + EVT_CHECKBOX(Id_Check_EnableColMove, + TabularGridFrame::OnToggleColMove) + + EVT_UPDATE_UI(Id_Check_DrawNativeLabels, + TabularGridFrame::OnUpdateDrawNativeLabelsUI) EVT_BUTTON(wxID_APPLY, TabularGridFrame::OnMoveColumn) + EVT_GRID_COL_SORT(TabularGridFrame::OnGridColSort) EVT_GRID_COL_MOVE(TabularGridFrame::OnGridColMove) + + EVT_IDLE(TabularGridFrame::OnIdle) END_EVENT_TABLE() TabularGridFrame::TabularGridFrame() : wxFrame(NULL, wxID_ANY, "Tabular table") { + m_shouldUpdateOrder = false; + + wxPanel * const panel = new wxPanel(this); + // create and initialize the grid with the specified data - m_grid = new wxGrid(this, wxID_ANY); - m_grid->SetTable(new TabularGridTable, true, wxGrid::wxGridSelectRows); + m_table = new TabularGridTable; + m_grid = new wxGrid(panel, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + wxBORDER_STATIC | wxWANTS_CHARS); + m_grid->SetTable(m_table, true, wxGrid::wxGridSelectRows); - m_grid->SetUseNativeColLabels(); m_grid->EnableDragColMove(); + m_grid->UseNativeColHeader(); + m_grid->HideRowLabels(); // add it and the other controls to the frame wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL); @@ -1725,12 +1854,20 @@ TabularGridFrame::TabularGridFrame() wxSizer * const sizerControls = new wxBoxSizer(wxHORIZONTAL); wxSizer * const sizerStyles = new wxBoxSizer(wxVERTICAL); - m_chkUseNative = new wxCheckBox(this, Id_Check_UseNative, + m_chkUseNative = new wxCheckBox(panel, Id_Check_UseNativeHeader, "&Use native header"); m_chkUseNative->SetValue(true); sizerStyles->Add(m_chkUseNative, wxSizerFlags().Border()); - m_chkEnableColMove = new wxCheckBox(this, Id_Check_EnableColMove, + m_chkDrawNative = new wxCheckBox(panel, Id_Check_DrawNativeLabels, + "&Draw native column labels"); + sizerStyles->Add(m_chkDrawNative, wxSizerFlags().Border()); + + m_chkShowRowLabels = new wxCheckBox(panel, Id_Check_ShowRowLabels, + "Show &row labels"); + sizerStyles->Add(m_chkShowRowLabels, wxSizerFlags().Border()); + + m_chkEnableColMove = new wxCheckBox(panel, Id_Check_EnableColMove, "Allow column re&ordering"); m_chkEnableColMove->SetValue(true); sizerStyles->Add(m_chkEnableColMove, wxSizerFlags().Border()); @@ -1742,21 +1879,21 @@ TabularGridFrame::TabularGridFrame() wxSizer * const sizerMoveCols = new wxBoxSizer(wxHORIZONTAL); const wxSizerFlags flagsHorz(wxSizerFlags().Border(wxLEFT | wxRIGHT).Centre()); - sizerMoveCols->Add(new wxStaticText(this, wxID_ANY, "&Move column"), + sizerMoveCols->Add(new wxStaticText(panel, wxID_ANY, "&Move column"), flagsHorz); - m_txtColIndex = new ColIndexEntry(this); + m_txtColIndex = new ColIndexEntry(panel); sizerMoveCols->Add(m_txtColIndex, flagsHorz); - sizerMoveCols->Add(new wxStaticText(this, wxID_ANY, "&to"), flagsHorz); - m_txtColPos = new ColIndexEntry(this); + sizerMoveCols->Add(new wxStaticText(panel, wxID_ANY, "&to"), flagsHorz); + m_txtColPos = new ColIndexEntry(panel); sizerMoveCols->Add(m_txtColPos, flagsHorz); - sizerMoveCols->Add(new wxButton(this, wxID_APPLY), flagsHorz); + sizerMoveCols->Add(new wxButton(panel, wxID_APPLY), flagsHorz); sizerColumns->Add(sizerMoveCols, wxSizerFlags().Expand().Border(wxBOTTOM)); wxSizer * const sizerShowCols = new wxBoxSizer(wxHORIZONTAL); - sizerShowCols->Add(new wxStaticText(this, wxID_ANY, "Current order:"), + sizerShowCols->Add(new wxStaticText(panel, wxID_ANY, "Current order:"), flagsHorz); - m_statOrder = new wxStaticText(this, wxID_ANY, ""); + m_statOrder = new wxStaticText(panel, wxID_ANY, ""); sizerShowCols->Add(m_statOrder, flagsHorz); sizerColumns->Add(sizerShowCols, wxSizerFlags().Expand().Border(wxTOP)); @@ -1764,8 +1901,11 @@ TabularGridFrame::TabularGridFrame() sizerTop->Add(sizerControls, wxSizerFlags().Expand().Border()); - SetSizerAndFit(sizerTop); - SetBackgroundColour(*wxWHITE); + panel->SetSizer(sizerTop); + + SetClientSize(panel->GetBestSize()); + SetSizeHints(GetSize()); + Show(); }