X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/41f02b9acc01217e918fa422298840df7cf6de25..615f68c6b9fb887d2cfcbc6a3c6c3716a34a914e:/samples/grid/griddemo.cpp diff --git a/samples/grid/griddemo.cpp b/samples/grid/griddemo.cpp index 5472db618d..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 ) @@ -139,7 +219,7 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_GRID_SELECT_CELL( GridFrame::OnSelectCell ) EVT_GRID_RANGE_SELECT( GridFrame::OnRangeSelected ) EVT_GRID_CELL_CHANGING( GridFrame::OnCellValueChanging ) - EVT_GRID_CELL_CHANGE( GridFrame::OnCellValueChanged ) + EVT_GRID_CELL_CHANGED( GridFrame::OnCellValueChanged ) EVT_GRID_CELL_BEGIN_DRAG( GridFrame::OnCellBeginDrag ) EVT_GRID_EDITOR_SHOWN( GridFrame::OnEditorShown ) @@ -148,18 +228,18 @@ END_EVENT_TABLE() GridFrame::GridFrame() - : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxWidgets grid class demo"), + : wxFrame( (wxFrame *)NULL, wxID_ANY, wxT("wxWidgets grid class demo"), wxDefaultPosition, wxDefaultSize ) { SetIcon(wxICON(sample)); wxMenu *fileMenu = new wxMenu; - fileMenu->Append( ID_VTABLE, _T("&Virtual table test\tCtrl-V")); - fileMenu->Append( ID_BUGS_TABLE, _T("&Bugs table test\tCtrl-B")); - fileMenu->Append( ID_TABULAR_TABLE, _T("&Tabular table test\tCtrl-T")); + fileMenu->Append( ID_VTABLE, wxT("&Virtual table test\tCtrl-V")); + fileMenu->Append( ID_BUGS_TABLE, wxT("&Bugs table test\tCtrl-B")); + fileMenu->Append( ID_TABULAR_TABLE, wxT("&Tabular table test\tCtrl-T")); fileMenu->AppendSeparator(); - fileMenu->Append( wxID_EXIT, _T("E&xit\tAlt-X") ); + fileMenu->Append( wxID_EXIT, wxT("E&xit\tAlt-X") ); wxMenu *viewMenu = new wxMenu; viewMenu->AppendCheckItem(ID_TOGGLEROWLABELS, "&Row labels"); @@ -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..."); @@ -180,83 +259,92 @@ GridFrame::GridFrame() wxMenu *rowLabelMenu = new wxMenu; - viewMenu->Append( ID_ROWLABELALIGN, _T("R&ow label alignment"), + viewMenu->Append( ID_ROWLABELALIGN, wxT("R&ow label alignment"), rowLabelMenu, - _T("Change alignment of row labels") ); + wxT("Change alignment of row labels") ); - rowLabelMenu->Append( ID_ROWLABELHORIZALIGN, _T("&Horizontal") ); - rowLabelMenu->Append( ID_ROWLABELVERTALIGN, _T("&Vertical") ); + rowLabelMenu->AppendRadioItem( ID_ROWLABELHORIZALIGN, wxT("&Horizontal") ); + rowLabelMenu->AppendRadioItem( ID_ROWLABELVERTALIGN, wxT("&Vertical") ); wxMenu *colLabelMenu = new wxMenu; - viewMenu->Append( ID_COLLABELALIGN, _T("Col l&abel alignment"), + viewMenu->Append( ID_COLLABELALIGN, wxT("Col l&abel alignment"), colLabelMenu, - _T("Change alignment of col labels") ); + wxT("Change alignment of col labels") ); + + 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") ); - colLabelMenu->Append( ID_COLLABELHORIZALIGN, _T("&Horizontal") ); - colLabelMenu->Append( ID_COLLABELVERTALIGN, _T("&Vertical") ); wxMenu *colMenu = new wxMenu; - colMenu->Append( ID_SETLABELCOLOUR, _T("Set &label colour...") ); - colMenu->Append( ID_SETLABELTEXTCOLOUR, _T("Set label &text colour...") ); - colMenu->Append( ID_SETLABEL_FONT, _T("Set label fo&nt...") ); - colMenu->Append( ID_GRIDLINECOLOUR, _T("&Grid line colour...") ); - colMenu->Append( ID_SET_CELL_FG_COLOUR, _T("Set cell &foreground colour...") ); - colMenu->Append( ID_SET_CELL_BG_COLOUR, _T("Set cell &background colour...") ); + colMenu->Append( ID_SETLABELCOLOUR, wxT("Set &label colour...") ); + colMenu->Append( ID_SETLABELTEXTCOLOUR, wxT("Set label &text colour...") ); + colMenu->Append( ID_SETLABEL_FONT, wxT("Set label fo&nt...") ); + colMenu->Append( ID_GRIDLINECOLOUR, wxT("&Grid line colour...") ); + colMenu->Append( ID_SET_CELL_FG_COLOUR, wxT("Set cell &foreground colour...") ); + colMenu->Append( ID_SET_CELL_BG_COLOUR, wxT("Set cell &background colour...") ); wxMenu *editMenu = new wxMenu; - editMenu->Append( ID_INSERTROW, _T("Insert &row") ); - editMenu->Append( ID_INSERTCOL, _T("Insert &column") ); - editMenu->Append( ID_DELETEROW, _T("Delete selected ro&ws") ); - editMenu->Append( ID_DELETECOL, _T("Delete selected co&ls") ); - editMenu->Append( ID_CLEARGRID, _T("Cl&ear grid cell contents") ); + editMenu->Append( ID_INSERTROW, wxT("Insert &row") ); + editMenu->Append( ID_INSERTCOL, wxT("Insert &column") ); + editMenu->Append( ID_DELETEROW, wxT("Delete selected ro&ws") ); + editMenu->Append( ID_DELETECOL, wxT("Delete selected co&ls") ); + editMenu->Append( ID_CLEARGRID, wxT("Cl&ear grid cell contents") ); wxMenu *selectMenu = new wxMenu; - selectMenu->Append( ID_SELECT_UNSELECT, _T("Add new cells to the selection"), - _T("When off, old selection is deselected before ") - _T("selecting the new cells"), wxITEM_CHECK ); - selectMenu->Append( ID_SHOW_SELECTION, - _T("&Show current selection\tCtrl-Alt-S")); + 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->AppendSeparator(); - selectMenu->Append( ID_SELECT_ALL, _T("Select all")); - selectMenu->Append( ID_SELECT_ROW, _T("Select row 2")); - selectMenu->Append( ID_SELECT_COL, _T("Select col 2")); - selectMenu->Append( ID_SELECT_CELL, _T("Select cell (3, 1)")); + selectMenu->Append( ID_SELECT_ALL, wxT("Select all")); + selectMenu->Append( ID_SELECT_ROW, wxT("Select row 2")); + selectMenu->Append( ID_SELECT_COL, wxT("Select col 2")); + selectMenu->Append( ID_SELECT_CELL, wxT("Select cell (3, 1)")); selectMenu->AppendSeparator(); - selectMenu->Append( ID_DESELECT_ALL, _T("Deselect all")); - selectMenu->Append( ID_DESELECT_ROW, _T("Deselect row 2")); - selectMenu->Append( ID_DESELECT_COL, _T("Deselect col 2")); - selectMenu->Append( ID_DESELECT_CELL, _T("Deselect cell (3, 1)")); + selectMenu->Append( ID_DESELECT_ALL, wxT("Deselect all")); + selectMenu->Append( ID_DESELECT_ROW, wxT("Deselect row 2")); + selectMenu->Append( ID_DESELECT_COL, wxT("Deselect col 2")); + selectMenu->Append( ID_DESELECT_CELL, wxT("Deselect cell (3, 1)")); wxMenu *selectionMenu = new wxMenu; - selectMenu->Append( ID_CHANGESEL, _T("Change &selection mode"), + selectMenu->Append( ID_CHANGESEL, wxT("Change &selection mode"), selectionMenu, - _T("Change selection mode") ); + wxT("Change selection mode") ); - selectionMenu->Append( ID_SELCELLS, _T("Select &cells") ); - selectionMenu->Append( ID_SELROWS, _T("Select &rows") ); - selectionMenu->Append( ID_SELCOLS, _T("Select col&umns") ); - selectionMenu->Append( ID_SELROWSORCOLS, _T("Select rows &or columns") ); + selectionMenu->Append( ID_SELCELLS, wxT("Select &cells") ); + selectionMenu->Append( ID_SELROWS, wxT("Select &rows") ); + selectionMenu->Append( ID_SELCOLS, wxT("Select col&umns") ); + selectionMenu->Append( ID_SELROWSORCOLS, wxT("Select rows &or columns") ); wxMenu *autosizeMenu = new wxMenu; - autosizeMenu->Append( ID_SIZE_ROW, _T("Selected &row data") ); - autosizeMenu->Append( ID_SIZE_COL, _T("Selected &column data") ); - autosizeMenu->Append( ID_SIZE_ROW_LABEL, _T("Selected row la&bel") ); - autosizeMenu->Append( ID_SIZE_COL_LABEL, _T("Selected column &label") ); - autosizeMenu->Append( ID_SIZE_LABELS_COL, _T("Column la&bels") ); - autosizeMenu->Append( ID_SIZE_LABELS_ROW, _T("Row label&s") ); - autosizeMenu->Append( ID_SIZE_GRID, _T("Entire &grid") ); + autosizeMenu->Append( ID_SIZE_ROW, wxT("Selected &row data") ); + autosizeMenu->Append( ID_SIZE_COL, wxT("Selected &column data") ); + autosizeMenu->Append( ID_SIZE_ROW_LABEL, wxT("Selected row la&bel") ); + autosizeMenu->Append( ID_SIZE_COL_LABEL, wxT("Selected column &label") ); + autosizeMenu->Append( ID_SIZE_LABELS_COL, wxT("Column la&bels") ); + autosizeMenu->Append( ID_SIZE_LABELS_ROW, wxT("Row label&s") ); + autosizeMenu->Append( ID_SIZE_GRID, wxT("Entire &grid") ); wxMenu *helpMenu = new wxMenu; - helpMenu->Append( wxID_ABOUT, _T("&About wxGrid demo") ); + helpMenu->Append( wxID_ABOUT, wxT("&About wxGrid demo") ); wxMenuBar *menuBar = new wxMenuBar; - menuBar->Append( fileMenu, _T("&File") ); - menuBar->Append( viewMenu, _T("&Grid") ); - menuBar->Append( colMenu, _T("&Colours") ); - menuBar->Append( editMenu, _T("&Edit") ); - menuBar->Append( selectMenu, _T("&Select") ); - menuBar->Append( autosizeMenu, _T("&Autosize") ); - menuBar->Append( helpMenu, _T("&Help") ); + menuBar->Append( fileMenu, wxT("&File") ); + menuBar->Append( viewMenu, wxT("&Grid") ); + menuBar->Append( colMenu, wxT("&Colours") ); + menuBar->Append( editMenu, wxT("&Edit") ); + menuBar->Append( selectMenu, wxT("&Select") ); + menuBar->Append( autosizeMenu, wxT("&Autosize") ); + menuBar->Append( helpMenu, wxT("&Help") ); SetMenuBar( menuBar ); @@ -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); @@ -294,37 +386,37 @@ GridFrame::GridFrame() grid->AppendRows(ir); grid->SetRowSize( 0, 60 ); - grid->SetCellValue( 0, 0, _T("Ctrl+Home\nwill go to\nthis cell") ); + grid->SetCellValue( 0, 0, wxT("Ctrl+Home\nwill go to\nthis cell") ); - grid->SetCellValue( 0, 1, _T("A long piece of text to demonstrate wrapping.") ); + grid->SetCellValue( 0, 1, wxT("A long piece of text to demonstrate wrapping.") ); grid->SetCellRenderer(0 , 1, new wxGridCellAutoWrapStringRenderer); grid->SetCellEditor( 0, 1 , new wxGridCellAutoWrapStringEditor); - grid->SetCellValue( 0, 2, _T("Blah") ); - grid->SetCellValue( 0, 3, _T("Read only") ); + grid->SetCellValue( 0, 2, wxT("Blah") ); + grid->SetCellValue( 0, 3, wxT("Read only") ); grid->SetReadOnly( 0, 3 ); - grid->SetCellValue( 0, 4, _T("Can veto edit this cell") ); + grid->SetCellValue( 0, 4, wxT("Can veto edit this cell") ); - grid->SetCellValue( 0, 5, _T("Press\nCtrl+arrow\nto skip over\ncells") ); + grid->SetCellValue( 0, 5, wxT("Press\nCtrl+arrow\nto skip over\ncells") ); grid->SetRowSize( 99, 60 ); - grid->SetCellValue( 99, 99, _T("Ctrl+End\nwill go to\nthis cell") ); - grid->SetCellValue( 1, 0, _T("This default cell will overflow into neighboring cells, but not if you turn overflow off.")); + grid->SetCellValue( 99, 99, wxT("Ctrl+End\nwill go to\nthis cell") ); + grid->SetCellValue( 1, 0, wxT("This default cell will overflow into neighboring cells, but not if you turn overflow off.")); grid->SetCellTextColour(1, 2, *wxRED); grid->SetCellBackgroundColour(1, 2, *wxGREEN); - grid->SetCellValue( 1, 4, _T("I'm in the middle")); + grid->SetCellValue( 1, 4, wxT("I'm in the middle")); - grid->SetCellValue(2, 2, _T("red")); + grid->SetCellValue(2, 2, wxT("red")); grid->SetCellTextColour(2, 2, *wxRED); - grid->SetCellValue(3, 3, _T("green on grey")); + grid->SetCellValue(3, 3, wxT("green on grey")); grid->SetCellTextColour(3, 3, *wxGREEN); grid->SetCellBackgroundColour(3, 3, *wxLIGHT_GREY); - grid->SetCellValue(4, 4, _T("a weird looking cell")); + grid->SetCellValue(4, 4, wxT("a weird looking cell")); grid->SetCellAlignment(4, 4, wxALIGN_CENTRE, wxALIGN_CENTRE); grid->SetCellRenderer(4, 4, new MyGridCellRenderer); @@ -339,34 +431,47 @@ GridFrame::GridFrame() attr->SetBackgroundColour(*wxRED); grid->SetRowAttr(5, attr); - grid->SetCellValue(2, 4, _T("a wider column")); + grid->SetCellValue(2, 4, wxT("a wider column")); grid->SetColSize(4, 120); grid->SetColMinimalWidth(4, 120); grid->SetCellTextColour(5, 8, *wxGREEN); - grid->SetCellValue(5, 8, _T("Bg from row attr\nText col from cell attr")); - grid->SetCellValue(5, 5, _T("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")); + 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[] = { - _T("Please select a choice"), - _T("This takes two cells"), - _T("Another choice"), + wxT("Please select a choice"), + wxT("This takes two cells"), + wxT("Another choice"), }; grid->SetCellEditor(4, 0, new wxGridCellChoiceEditor(WXSIZEOF(choices), choices)); grid->SetCellSize(4, 0, 1, 2); @@ -375,7 +480,15 @@ GridFrame::GridFrame() grid->SetCellSize(7, 1, 3, 4); grid->SetCellAlignment(7, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); - grid->SetCellValue(7, 1, _T("Big box!")); + grid->SetCellValue(7, 1, wxT("Big box!")); + + // create a separator-like row: it's grey and it's non-resizable + grid->DisableRowResize(10); + grid->SetRowSize(10, 30); + attr = new wxGridCellAttr; + attr->SetBackgroundColour(*wxLIGHT_GREY); + grid->SetRowAttr(10, attr); + grid->SetCellValue(10, 0, "You can't resize this row interactively -- try it"); // this does exactly nothing except testing that SetAttr() handles NULL // attributes and does reference counting correctly @@ -419,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 ); } @@ -489,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( @@ -503,10 +634,10 @@ void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::OnSetHighlightWidth( wxCommandEvent& WXUNUSED(ev) ) { - wxString choices[] = { _T("0"), _T("1"), _T("2"), _T("3"), _T("4"), _T("5"), _T("6"), _T("7"), _T("8"), _T("9"), _T("10")}; + wxString choices[] = { wxT("0"), wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6"), wxT("7"), wxT("8"), wxT("9"), wxT("10")}; - wxSingleChoiceDialog dlg(this, _T("Choose the thickness of the highlight pen:"), - _T("Pen Width"), 11, choices); + wxSingleChoiceDialog dlg(this, wxT("Choose the thickness of the highlight pen:"), + wxT("Pen Width"), 11, choices); int current = grid->GetCellHighlightPenWidth(); dlg.SetSelection(current); @@ -517,10 +648,10 @@ void GridFrame::OnSetHighlightWidth( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::OnSetROHighlightWidth( wxCommandEvent& WXUNUSED(ev) ) { - wxString choices[] = { _T("0"), _T("1"), _T("2"), _T("3"), _T("4"), _T("5"), _T("6"), _T("7"), _T("8"), _T("9"), _T("10")}; + wxString choices[] = { wxT("0"), wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6"), wxT("7"), wxT("8"), wxT("9"), wxT("10")}; - wxSingleChoiceDialog dlg(this, _T("Choose the thickness of the highlight pen:"), - _T("Pen Width"), 11, choices); + wxSingleChoiceDialog dlg(this, wxT("Choose the thickness of the highlight pen:"), + wxT("Pen Width"), 11, choices); int current = grid->GetCellHighlightROPenWidth(); dlg.SetSelection(current); @@ -582,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); } @@ -825,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(); @@ -835,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. @@ -896,21 +1027,21 @@ void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) wxString logBuf; if ( ev.GetRow() != -1 ) { - logBuf << _T("Left click on row label ") << ev.GetRow(); + logBuf << wxT("Left click on row label ") << ev.GetRow(); } else if ( ev.GetCol() != -1 ) { - logBuf << _T("Left click on col label ") << ev.GetCol(); + logBuf << wxT("Left click on col label ") << ev.GetCol(); } else { - logBuf << _T("Left click on corner label"); + logBuf << wxT("Left click on corner label"); } if ( ev.ShiftDown() ) - logBuf << _T(" (shift down)"); + logBuf << wxT(" (shift down)"); if ( ev.ControlDown() ) - logBuf << _T(" (control down)"); + logBuf << wxT(" (control down)"); wxLogMessage( wxT("%s"), logBuf.c_str() ); // you must call event skip if you want default grid processing @@ -921,7 +1052,7 @@ void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) void GridFrame::OnCellLeftClick( wxGridEvent& ev ) { - wxLogMessage(_T("Left click at row %d, col %d"), ev.GetRow(), ev.GetCol()); + wxLogMessage(wxT("Left click at row %d, col %d"), ev.GetRow(), ev.GetCol()); // you must call event skip if you want default grid processing // (cell highlighting etc.) @@ -932,7 +1063,10 @@ void GridFrame::OnCellLeftClick( wxGridEvent& ev ) void GridFrame::OnRowSize( wxGridSizeEvent& ev ) { - wxLogMessage(_T("Resized row %d"), ev.GetRowOrCol()); + const int row = ev.GetRowOrCol(); + + wxLogMessage("Resized row %d, new height = %d", + row, grid->GetRowSize(row)); ev.Skip(); } @@ -940,105 +1074,32 @@ void GridFrame::OnRowSize( wxGridSizeEvent& ev ) void GridFrame::OnColSize( wxGridSizeEvent& ev ) { - wxLogMessage(_T("Resized col %d"), ev.GetRowOrCol()); + const int col = ev.GetRowOrCol(); + + wxLogMessage("Resized column %d, new width = %d", + col, grid->GetColSize(col)); ev.Skip(); } -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(_T("%lu cells selected:"), (unsigned long)count); - if ( count > countMax ) - { - wxLogMessage(_T("[too many selected cells, ") - _T("showing only the first %lu]"), - (unsigned long)countMax); - count = countMax; - } - - for ( size_t n = 0; n < count; n++ ) - { - const wxGridCellCoords& c = cells[n]; - wxLogMessage(_T(" 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 = _T("rows"); - single = _T("row"); - } - else // columns - { - plural = _T("columns"); - single = _T("column"); - } - - const wxArrayInt sels((const wxArrayInt)(rows ? grid->GetSelectedRows() - : grid->GetSelectedCols())); - size_t count = sels.size(); - wxLogMessage(_T("%lu %s selected:"), - (unsigned long)count, plural); - if ( count > countMax ) - { - wxLogMessage(_T("[too many selected %s, ") - _T("showing only the first %lu]"), - plural, (unsigned long)countMax); - count = countMax; - } - - for ( size_t n = 0; n < count; n++ ) - { - wxLogMessage(_T(" selected %s %lu: %d"), - single, (unsigned long)n, sels[n]); - } - } - break; - - default: - wxFAIL_MSG( _T("unknown wxGrid selection mode") ); - break; - } -} - void GridFrame::OnSelectCell( wxGridEvent& ev ) { wxString logBuf; if ( ev.Selecting() ) - logBuf << _T("Selected "); + logBuf << wxT("Selected "); else - logBuf << _T("Deselected "); - logBuf << _T("cell at row ") << ev.GetRow() - << _T(" col ") << ev.GetCol() - << _T(" ( ControlDown: ")<< (ev.ControlDown() ? 'T':'F') - << _T(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F') - << _T(", AltDown: ")<< (ev.AltDown() ? 'T':'F') - << _T(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << _T(" )"); + logBuf << wxT("Deselected "); + logBuf << wxT("cell at row ") << ev.GetRow() + << wxT(" col ") << ev.GetCol() + << wxT(" ( ControlDown: ")<< (ev.ControlDown() ? 'T':'F') + << wxT(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F') + << wxT(", AltDown: ")<< (ev.AltDown() ? 'T':'F') + << wxT(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << wxT(" )"); //Indicate whether this column was moved if ( ((wxGrid *)ev.GetEventObject())->GetColPos( ev.GetCol() ) != ev.GetCol() ) - logBuf << _T(" *** Column moved, current position: ") << ((wxGrid *)ev.GetEventObject())->GetColPos( ev.GetCol() ); + logBuf << wxT(" *** Column moved, current position: ") << ((wxGrid *)ev.GetEventObject())->GetColPos( ev.GetCol() ); wxLogMessage( wxT("%s"), logBuf.c_str() ); @@ -1051,17 +1112,17 @@ void GridFrame::OnRangeSelected( wxGridRangeSelectEvent& ev ) { wxString logBuf; if ( ev.Selecting() ) - logBuf << _T("Selected "); + logBuf << wxT("Selected "); else - logBuf << _T("Deselected "); - logBuf << _T("cells from row ") << ev.GetTopRow() - << _T(" col ") << ev.GetLeftCol() - << _T(" to row ") << ev.GetBottomRow() - << _T(" col ") << ev.GetRightCol() - << _T(" ( ControlDown: ")<< (ev.ControlDown() ? 'T':'F') - << _T(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F') - << _T(", AltDown: ")<< (ev.AltDown() ? 'T':'F') - << _T(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << _T(" )"); + logBuf << wxT("Deselected "); + logBuf << wxT("cells from row ") << ev.GetTopRow() + << wxT(" col ") << ev.GetLeftCol() + << wxT(" to row ") << ev.GetBottomRow() + << wxT(" col ") << ev.GetRightCol() + << wxT(" ( ControlDown: ")<< (ev.ControlDown() ? 'T':'F') + << wxT(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F') + << wxT(", AltDown: ")<< (ev.AltDown() ? 'T':'F') + << wxT(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << wxT(" )"); wxLogMessage( wxT("%s"), logBuf.c_str() ); ev.Skip(); @@ -1103,7 +1164,7 @@ void GridFrame::OnCellValueChanged( wxGridEvent& ev ) void GridFrame::OnCellBeginDrag( wxGridEvent& ev ) { - wxLogMessage(_T("Got request to drag cell at row %d, col %d"), + wxLogMessage(wxT("Got request to drag cell at row %d, col %d"), ev.GetRow(), ev.GetCol()); ev.Skip(); @@ -1114,8 +1175,8 @@ void GridFrame::OnEditorShown( wxGridEvent& ev ) if ( (ev.GetCol() == 4) && (ev.GetRow() == 0) && - (wxMessageBox(_T("Are you sure you wish to edit this cell"), - _T("Checking"),wxYES_NO) == wxNO ) ) { + (wxMessageBox(wxT("Are you sure you wish to edit this cell"), + wxT("Checking"),wxYES_NO) == wxNO ) ) { ev.Veto(); return; @@ -1131,8 +1192,8 @@ void GridFrame::OnEditorHidden( wxGridEvent& ev ) if ( (ev.GetCol() == 4) && (ev.GetRow() == 0) && - (wxMessageBox(_T("Are you sure you wish to finish editing this cell"), - _T("Checking"),wxYES_NO) == wxNO ) ) { + (wxMessageBox(wxT("Are you sure you wish to finish editing this cell"), + wxT("Checking"),wxYES_NO) == wxNO ) ) { ev.Veto(); return; @@ -1152,6 +1213,13 @@ void GridFrame::About( wxCommandEvent& WXUNUSED(ev) ) aboutInfo.AddDeveloper(wxT("Julian Smart")); aboutInfo.AddDeveloper(wxT("Vadim Zeitlin")); + // this is just to force the generic version of the about + // dialog under wxMSW so that it's easy to test if the grid + // repaints correctly when it has lost focus and a dialog + // (different from the Windows standard message box -- it doesn't + // work with it for some reason) is moved over it. + aboutInfo.SetWebSite(wxT("http://www.wxwidgets.org")); + wxAboutBox(aboutInfo); } @@ -1213,9 +1281,9 @@ void GridFrame::OnVTable(wxCommandEvent& ) { static long s_sizeGrid = 10000; - s_sizeGrid = wxGetNumberFromUser(_T("Size of the table to create"), - _T("Size: "), - _T("wxGridDemo question"), + s_sizeGrid = wxGetNumberFromUser(wxT("Size of the table to create"), + wxT("Size: "), + wxT("wxGridDemo question"), s_sizeGrid, 0, 32000, this); @@ -1252,7 +1320,7 @@ void MyGridCellRenderer::Draw(wxGrid& grid, // ============================================================================ BigGridFrame::BigGridFrame(long sizeGrid) - : wxFrame(NULL, wxID_ANY, _T("Plugin Virtual Table"), + : wxFrame(NULL, wxID_ANY, wxT("Plugin Virtual Table"), wxDefaultPosition, wxSize(500, 450)) { m_grid = new wxGrid(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); @@ -1303,11 +1371,11 @@ enum Severity static const wxString severities[] = { - _T("wishlist"), - _T("minor"), - _T("normal"), - _T("major"), - _T("critical"), + wxT("wishlist"), + wxT("minor"), + wxT("normal"), + wxT("major"), + wxT("critical"), }; static struct BugsGridData @@ -1320,20 +1388,20 @@ static struct BugsGridData bool opened; } gs_dataBugsGrid [] = { - { 18, _T("foo doesn't work"), Sev_Major, 1, _T("wxMSW"), true }, - { 27, _T("bar crashes"), Sev_Critical, 1, _T("all"), false }, - { 45, _T("printing is slow"), Sev_Minor, 3, _T("wxMSW"), true }, - { 68, _T("Rectangle() fails"), Sev_Normal, 1, _T("wxMSW"), false }, + { 18, wxT("foo doesn't work"), Sev_Major, 1, wxT("wxMSW"), true }, + { 27, wxT("bar crashes"), Sev_Critical, 1, wxT("all"), false }, + { 45, wxT("printing is slow"), Sev_Minor, 3, wxT("wxMSW"), true }, + { 68, wxT("Rectangle() fails"), Sev_Normal, 1, wxT("wxMSW"), false }, }; static const wxChar *headers[Col_Max] = { - _T("Id"), - _T("Summary"), - _T("Severity"), - _T("Priority"), - _T("Platform"), - _T("Opened?"), + wxT("Id"), + wxT("Summary"), + wxT("Severity"), + wxT("Priority"), + wxT("Platform"), + wxT("Opened?"), }; // ---------------------------------------------------------------------------- @@ -1352,16 +1420,16 @@ wxString BugsGridTable::GetTypeName(int WXUNUSED(row), int col) // fall thorugh (TODO should be a list) case Col_Summary: - return wxString::Format(_T("%s:80"), wxGRID_VALUE_STRING); + return wxString::Format(wxT("%s:80"), wxGRID_VALUE_STRING); case Col_Platform: - return wxString::Format(_T("%s:all,MSW,GTK,other"), wxGRID_VALUE_CHOICE); + return wxString::Format(wxT("%s:all,MSW,GTK,other"), wxGRID_VALUE_CHOICE); case Col_Opened: return wxGRID_VALUE_BOOL; } - wxFAIL_MSG(_T("unknown column")); + wxFAIL_MSG(wxT("unknown column")); return wxEmptyString; } @@ -1388,13 +1456,13 @@ wxString BugsGridTable::GetValue( int row, int col ) switch ( col ) { case Col_Id: - return wxString::Format(_T("%d"), gd.id); + return wxString::Format(wxT("%d"), gd.id); case Col_Priority: - return wxString::Format(_T("%d"), gd.prio); + return wxString::Format(wxT("%d"), gd.prio); case Col_Opened: - return gd.opened ? _T("1") : _T("0"); + return gd.opened ? wxT("1") : wxT("0"); case Col_Severity: return severities[gd.severity]; @@ -1418,7 +1486,7 @@ void BugsGridTable::SetValue( int row, int col, const wxString& value ) case Col_Id: case Col_Priority: case Col_Opened: - wxFAIL_MSG(_T("unexpected column")); + wxFAIL_MSG(wxT("unexpected column")); break; case Col_Severity: @@ -1435,7 +1503,7 @@ void BugsGridTable::SetValue( int row, int col, const wxString& value ) if ( n == WXSIZEOF(severities) ) { - wxLogWarning(_T("Invalid severity value '%s'."), + wxLogWarning(wxT("Invalid severity value '%s'."), value.c_str()); gd.severity = Sev_Normal; } @@ -1496,7 +1564,7 @@ long BugsGridTable::GetValueAsLong( int row, int col ) return gd.severity; default: - wxFAIL_MSG(_T("unexpected column")); + wxFAIL_MSG(wxT("unexpected column")); return -1; } } @@ -1509,7 +1577,7 @@ bool BugsGridTable::GetValueAsBool( int row, int col ) } else { - wxFAIL_MSG(_T("unexpected column")); + wxFAIL_MSG(wxT("unexpected column")); return false; } @@ -1526,7 +1594,7 @@ void BugsGridTable::SetValueAsLong( int row, int col, long value ) break; default: - wxFAIL_MSG(_T("unexpected column")); + wxFAIL_MSG(wxT("unexpected column")); } } @@ -1538,7 +1606,7 @@ void BugsGridTable::SetValueAsBool( int row, int col, bool value ) } else { - wxFAIL_MSG(_T("unexpected column")); + wxFAIL_MSG(wxT("unexpected column")); } } @@ -1552,7 +1620,7 @@ wxString BugsGridTable::GetColLabelValue( int col ) // ---------------------------------------------------------------------------- BugsGridFrame::BugsGridFrame() - : wxFrame(NULL, wxID_ANY, _T("Bugs table")) + : wxFrame(NULL, wxID_ANY, wxT("Bugs table")) { wxGrid *grid = new wxGrid(this, wxID_ANY); wxGridTableBase *table = new BugsGridTable(); @@ -1877,7 +1945,7 @@ private: // fla for EVT_IDLE handler bool m_shouldUpdateOrder; - DECLARE_NO_COPY_CLASS(TabularGridFrame) + wxDECLARE_NO_COPY_CLASS(TabularGridFrame); DECLARE_EVENT_TABLE() };