X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..615f68c6b9fb887d2cfcbc6a3c6c3716a34a914e:/samples/grid/griddemo.cpp diff --git a/samples/grid/griddemo.cpp b/samples/grid/griddemo.cpp index 636d367496..aa3b4d59c4 100644 --- a/samples/grid/griddemo.cpp +++ b/samples/grid/griddemo.cpp @@ -5,7 +5,7 @@ // Modified by: Santiago Palacios // RCS-ID: $Id$ // Copyright: (c) Michael Bedward, Julian Smart, Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -43,6 +43,85 @@ #include "../sample.xpm" #endif +// Custom renderer that renders column header cells without borders and in +// italic +class CustomColumnHeaderRenderer : public wxGridColumnHeaderRenderer +{ +public: + CustomColumnHeaderRenderer(const wxColour& colFg, const wxColour& colBg) + : m_colFg(colFg), + m_colBg(colBg) + { + } + + virtual void DrawLabel(const wxGrid& WXUNUSED(grid), + wxDC& dc, + const wxString& value, + const wxRect& rect, + int horizAlign, + int vertAlign, + int WXUNUSED(textOrientation)) const + { + dc.SetTextForeground(m_colFg); + dc.SetFont(wxITALIC_FONT->Bold()); + dc.DrawLabel(value, rect, horizAlign | vertAlign); + } + + virtual void DrawBorder(const wxGrid& WXUNUSED(grid), + wxDC& dc, + wxRect& rect) const + { + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(m_colBg)); + dc.DrawRectangle(rect); + } + +private: + const wxColour m_colFg, m_colBg; + + wxDECLARE_NO_COPY_CLASS(CustomColumnHeaderRenderer); +}; + +// And a custom attributes provider which uses custom column header renderer +// defined above +class CustomColumnHeadersProvider : public wxGridCellAttrProvider +{ +public: + // by default custom column renderer is not used, call + // UseCustomColHeaders() to enable it + CustomColumnHeadersProvider() + : m_customOddRenderer(*wxYELLOW, *wxBLUE), + m_customEvenRenderer(*wxWHITE, *wxBLACK), + m_useCustom(false) + { + } + + // enable or disable the use of custom renderer for column headers + void UseCustomColHeaders(bool use = true) { m_useCustom = use; } + +protected: + virtual const wxGridColumnHeaderRenderer& GetColumnHeaderRenderer(int col) + { + // if enabled, use custom renderers + if ( m_useCustom ) + { + // and use different ones for odd and even columns -- just to show + // that we can + return col % 2 ? m_customOddRenderer : m_customEvenRenderer; + } + + return wxGridCellAttrProvider::GetColumnHeaderRenderer(col); + } + +private: + CustomColumnHeaderRenderer m_customOddRenderer, + m_customEvenRenderer; + + bool m_useCustom; + + wxDECLARE_NO_COPY_CLASS(CustomColumnHeadersProvider); +}; + // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -78,7 +157,9 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_TOGGLECOLMOVING, GridFrame::ToggleColMoving ) EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing ) EVT_MENU( ID_TOGGLEGRIDDRAGCELL, GridFrame::ToggleGridDragCell ) - EVT_MENU( ID_TOGGLENATIVEHEADER, GridFrame::ToggleNativeHeader ) + EVT_MENU( ID_COLNATIVEHEADER, GridFrame::SetNativeColHeader ) + EVT_MENU( ID_COLDEFAULTHEADER, GridFrame::SetDefaultColHeader ) + EVT_MENU( ID_COLCUSTOMHEADER, GridFrame::SetCustomColHeader ) EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines ) EVT_MENU( ID_AUTOSIZECOLS, GridFrame::AutoSizeCols ) EVT_MENU( ID_CELLOVERFLOW, GridFrame::CellOverflow ) @@ -119,7 +200,6 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_SELECT_ROW, GridFrame::SelectRow) EVT_MENU( ID_SELECT_ALL, GridFrame::SelectAll) EVT_MENU( ID_SELECT_UNSELECT, GridFrame::OnAddToSelectToggle) - EVT_MENU( ID_SHOW_SELECTION, GridFrame::OnShowSelection) EVT_MENU( ID_SIZE_ROW, GridFrame::AutoSizeRow ) EVT_MENU( ID_SIZE_COL, GridFrame::AutoSizeCol ) @@ -170,7 +250,6 @@ GridFrame::GridFrame() viewMenu->AppendCheckItem(ID_TOGGLECOLMOVING, "Col drag-&move"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDSIZING, "&Grid drag-resize"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDDRAGCELL, "&Grid drag-cell"); - viewMenu->AppendCheckItem(ID_TOGGLENATIVEHEADER, "&Native column headers"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDLINES, "&Grid Lines"); viewMenu->AppendCheckItem(ID_SET_HIGHLIGHT_WIDTH, "&Set Cell Highlight Width..."); viewMenu->AppendCheckItem(ID_SET_RO_HIGHLIGHT_WIDTH, "&Set Cell RO Highlight Width..."); @@ -184,8 +263,8 @@ GridFrame::GridFrame() rowLabelMenu, wxT("Change alignment of row labels") ); - rowLabelMenu->Append( ID_ROWLABELHORIZALIGN, wxT("&Horizontal") ); - rowLabelMenu->Append( ID_ROWLABELVERTALIGN, wxT("&Vertical") ); + rowLabelMenu->AppendRadioItem( ID_ROWLABELHORIZALIGN, wxT("&Horizontal") ); + rowLabelMenu->AppendRadioItem( ID_ROWLABELVERTALIGN, wxT("&Vertical") ); wxMenu *colLabelMenu = new wxMenu; @@ -193,8 +272,19 @@ GridFrame::GridFrame() colLabelMenu, wxT("Change alignment of col labels") ); - colLabelMenu->Append( ID_COLLABELHORIZALIGN, wxT("&Horizontal") ); - colLabelMenu->Append( ID_COLLABELVERTALIGN, wxT("&Vertical") ); + colLabelMenu->AppendRadioItem( ID_COLLABELHORIZALIGN, wxT("&Horizontal") ); + colLabelMenu->AppendRadioItem( ID_COLLABELVERTALIGN, wxT("&Vertical") ); + + wxMenu *colHeaderMenu = new wxMenu; + + viewMenu->Append( ID_ROWLABELALIGN, wxT("Col header style"), + colHeaderMenu, + wxT("Change style of col header") ); + + colHeaderMenu->AppendRadioItem( ID_COLDEFAULTHEADER, wxT("&Default") ); + colHeaderMenu->AppendRadioItem( ID_COLNATIVEHEADER, wxT("&Native") ); + colHeaderMenu->AppendRadioItem( ID_COLCUSTOMHEADER, wxT("&Custom") ); + wxMenu *colMenu = new wxMenu; colMenu->Append( ID_SETLABELCOLOUR, wxT("Set &label colour...") ); @@ -215,8 +305,6 @@ GridFrame::GridFrame() selectMenu->Append( ID_SELECT_UNSELECT, wxT("Add new cells to the selection"), wxT("When off, old selection is deselected before ") wxT("selecting the new cells"), wxITEM_CHECK ); - selectMenu->Append( ID_SHOW_SELECTION, - wxT("&Show current selection\tCtrl-Alt-S")); selectMenu->AppendSeparator(); selectMenu->Append( ID_SELECT_ALL, wxT("Select all")); selectMenu->Append( ID_SELECT_ROW, wxT("Select row 2")); @@ -267,6 +355,7 @@ GridFrame::GridFrame() wxPoint( 0, 0 ), wxSize( 400, 300 ) ); + #if wxUSE_LOG int gridW = 600, gridH = 300; int logW = gridW, logH = 100; @@ -286,6 +375,9 @@ GridFrame::GridFrame() // this will create a grid and, by default, an associated grid // table for strings grid->CreateGrid( 0, 0 ); + + grid->GetTable()->SetAttrProvider(new CustomColumnHeadersProvider()); + grid->AppendRows(100); grid->AppendCols(100); @@ -347,20 +439,33 @@ GridFrame::GridFrame() grid->SetCellValue(5, 8, wxT("Bg from row attr\nText col from cell attr")); grid->SetCellValue(5, 5, wxT("Bg from row attr Text col from col attr and this text is so long that it covers over many many empty cells but is broken by one that isn't")); + // Some numeric columns with different formatting. grid->SetColFormatFloat(6); - grid->SetCellValue(0, 6, wxString::Format(wxT("%g"), 3.1415)); - grid->SetCellValue(1, 6, wxString::Format(wxT("%g"), 1415.0)); - grid->SetCellValue(2, 6, wxString::Format(wxT("%g"), 12345.67890)); + grid->SetCellValue(0, 6, "Default\nfloat format"); + grid->SetCellValue(1, 6, wxString::Format(wxT("%g"), 3.1415)); + grid->SetCellValue(2, 6, wxString::Format(wxT("%g"), 1415.0)); + grid->SetCellValue(3, 6, wxString::Format(wxT("%g"), 12345.67890)); grid->SetColFormatFloat(7, 6, 2); - grid->SetCellValue(0, 7, wxString::Format(wxT("%g"), 3.1415)); - grid->SetCellValue(1, 7, wxString::Format(wxT("%g"), 1415.0)); - grid->SetCellValue(2, 7, wxString::Format(wxT("%g"), 12345.67890)); - - grid->SetColFormatNumber(8); - grid->SetCellValue(0, 8, "17"); - grid->SetCellValue(1, 8, "0"); - grid->SetCellValue(2, 8, "-666"); + grid->SetCellValue(0, 7, "Width 6\nprecision 2"); + grid->SetCellValue(1, 7, wxString::Format(wxT("%g"), 3.1415)); + grid->SetCellValue(2, 7, wxString::Format(wxT("%g"), 1415.0)); + grid->SetCellValue(3, 7, wxString::Format(wxT("%g"), 12345.67890)); + + grid->SetColFormatCustom(8, + wxString::Format("%s:%i,%i,%s", wxGRID_VALUE_FLOAT, -1, 4, "g")); + grid->SetCellValue(0, 8, "Compact\nformat"); + grid->SetCellValue(1, 8, wxT("31415e-4")); + grid->SetCellValue(2, 8, wxT("1415")); + grid->SetCellValue(3, 8, wxT("123456789e-4")); + + grid->SetColFormatNumber(9); + grid->SetCellValue(0, 9, "Integer\ncolumn"); + grid->SetCellValue(1, 9, "17"); + grid->SetCellValue(2, 9, "0"); + grid->SetCellValue(3, 9, "-666"); + grid->SetCellAlignment(3, 9, wxALIGN_CENTRE, wxALIGN_TOP); + grid->SetCellValue(3, 10, "<- This numeric cell should be centred"); const wxString choices[] = { @@ -377,7 +482,7 @@ GridFrame::GridFrame() grid->SetCellAlignment(7, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); grid->SetCellValue(7, 1, wxT("Big box!")); - // create a separator-like row: it's grey and it's non-resizeable + // create a separator-like row: it's grey and it's non-resizable grid->DisableRowResize(10); grid->SetRowSize(10, 30); attr = new wxGridCellAttr; @@ -427,7 +532,6 @@ void GridFrame::SetDefaults() GetMenuBar()->Check( ID_TOGGLECOLMOVING, false ); GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, true ); GetMenuBar()->Check( ID_TOGGLEGRIDDRAGCELL, false ); - GetMenuBar()->Check( ID_TOGGLENATIVEHEADER, false ); GetMenuBar()->Check( ID_TOGGLEGRIDLINES, true ); GetMenuBar()->Check( ID_CELLOVERFLOW, true ); } @@ -497,12 +601,31 @@ void GridFrame::ToggleGridDragCell( wxCommandEvent& WXUNUSED(ev) ) GetMenuBar()->IsChecked( ID_TOGGLEGRIDDRAGCELL ) ); } -void GridFrame::ToggleNativeHeader( wxCommandEvent& WXUNUSED(ev) ) +void GridFrame::SetNativeColHeader( wxCommandEvent& WXUNUSED(ev) ) { - grid->SetUseNativeColLabels( - GetMenuBar()->IsChecked( ID_TOGGLENATIVEHEADER ) ); + CustomColumnHeadersProvider* provider = + static_cast(grid->GetTable()->GetAttrProvider()); + provider->UseCustomColHeaders(false); + grid->SetUseNativeColLabels(true); } +void GridFrame::SetCustomColHeader( wxCommandEvent& WXUNUSED(ev) ) +{ + CustomColumnHeadersProvider* provider = + static_cast(grid->GetTable()->GetAttrProvider()); + provider->UseCustomColHeaders(true); + grid->SetUseNativeColLabels(false); +} + +void GridFrame::SetDefaultColHeader( wxCommandEvent& WXUNUSED(ev) ) +{ + CustomColumnHeadersProvider* provider = + static_cast(grid->GetTable()->GetAttrProvider()); + provider->UseCustomColHeaders(false); + grid->SetUseNativeColLabels(false); +} + + void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) ) { grid->EnableGridLines( @@ -590,7 +713,7 @@ void GridFrame::SetLabelTextColour( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::SetLabelFont( wxCommandEvent& WXUNUSED(ev) ) { wxFont font = wxGetFontFromUser(this); - if ( font.Ok() ) + if ( font.IsOk() ) { grid->SetLabelFont(font); } @@ -833,7 +956,7 @@ void GridFrame::SelectRowsOrCols( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) ) { wxColour col = wxGetColourFromUser(this); - if ( col.Ok() ) + if ( col.IsOk() ) { grid->SetDefaultCellTextColour(col); grid->Refresh(); @@ -843,7 +966,7 @@ void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) ) { wxColour col = wxGetColourFromUser(this); - if ( col.Ok() ) + if ( col.IsOk() ) { // Check the new Refresh function by passing it a rectangle // which exactly fits the grid. @@ -960,82 +1083,6 @@ void GridFrame::OnColSize( wxGridSizeEvent& ev ) } -void GridFrame::OnShowSelection(wxCommandEvent& WXUNUSED(event)) -{ - // max number of elements to dump -- otherwise it can take too much time - static const size_t countMax = 100; - - bool rows = false; - - switch ( grid->GetSelectionMode() ) - { - case wxGrid::wxGridSelectCells: - { - const wxGridCellCoordsArray cells(grid->GetSelectedCells()); - size_t count = cells.size(); - wxLogMessage(wxT("%lu cells selected:"), (unsigned long)count); - if ( count > countMax ) - { - wxLogMessage(wxT("[too many selected cells, ") - wxT("showing only the first %lu]"), - (unsigned long)countMax); - count = countMax; - } - - for ( size_t n = 0; n < count; n++ ) - { - const wxGridCellCoords& c = cells[n]; - wxLogMessage(wxT(" selected cell %lu: (%d, %d)"), - (unsigned long)n, c.GetCol(), c.GetRow()); - } - } - break; - - case wxGrid::wxGridSelectRows: - rows = true; - // fall through - - case wxGrid::wxGridSelectColumns: - { - const wxChar *plural, *single; - if ( rows ) - { - plural = wxT("rows"); - single = wxT("row"); - } - else // columns - { - plural = wxT("columns"); - single = wxT("column"); - } - - const wxArrayInt sels((const wxArrayInt)(rows ? grid->GetSelectedRows() - : grid->GetSelectedCols())); - size_t count = sels.size(); - wxLogMessage(wxT("%lu %s selected:"), - (unsigned long)count, plural); - if ( count > countMax ) - { - wxLogMessage(wxT("[too many selected %s, ") - wxT("showing only the first %lu]"), - plural, (unsigned long)countMax); - count = countMax; - } - - for ( size_t n = 0; n < count; n++ ) - { - wxLogMessage(wxT(" selected %s %lu: %d"), - single, (unsigned long)n, sels[n]); - } - } - break; - - default: - wxFAIL_MSG( wxT("unknown wxGrid selection mode") ); - break; - } -} - void GridFrame::OnSelectCell( wxGridEvent& ev ) { wxString logBuf;