X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0b190b0f6ae1de468733c1c8f8aad877a7d44792..0222a60b3491fa0835b4b0d41430c745e9b90615:/samples/newgrid/griddemo.cpp diff --git a/samples/newgrid/griddemo.cpp b/samples/newgrid/griddemo.cpp index 23ff16424d..a13e12f181 100644 --- a/samples/newgrid/griddemo.cpp +++ b/samples/newgrid/griddemo.cpp @@ -29,12 +29,14 @@ #endif #ifndef WX_PRECOMP -#include "wx/wx.h" + #include "wx/wx.h" #endif #include "wx/colordlg.h" +#include "wx/fontdlg.h" #include "wx/grid.h" +#include "wx/generic/gridctrl.h" #include "griddemo.h" @@ -71,8 +73,13 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing ) EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing ) EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing ) + EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines ) + EVT_MENU( ID_AUTOSIZECOLS, GridFrame::AutoSizeCols ) + EVT_MENU( ID_CELLOVERFLOW, GridFrame::CellOverflow ) + EVT_MENU( ID_RESIZECELL, GridFrame::ResizeCell ) EVT_MENU( ID_SETLABELCOLOUR, GridFrame::SetLabelColour ) EVT_MENU( ID_SETLABELTEXTCOLOUR, GridFrame::SetLabelTextColour ) + EVT_MENU( ID_SETLABEL_FONT, GridFrame::SetLabelFont ) EVT_MENU( ID_ROWLABELHORIZALIGN, GridFrame::SetRowLabelHorizAlignment ) EVT_MENU( ID_ROWLABELVERTALIGN, GridFrame::SetRowLabelVertAlignment ) EVT_MENU( ID_COLLABELHORIZALIGN, GridFrame::SetColLabelHorizAlignment ) @@ -83,6 +90,9 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_DELETEROW, GridFrame::DeleteSelectedRows ) EVT_MENU( ID_DELETECOL, GridFrame::DeleteSelectedCols ) EVT_MENU( ID_CLEARGRID, GridFrame::ClearGrid ) + EVT_MENU( ID_SELCELLS, GridFrame::SelectCells ) + EVT_MENU( ID_SELROWS, GridFrame::SelectRows ) + EVT_MENU( ID_SELCOLS, GridFrame::SelectCols ) EVT_MENU( ID_SET_CELL_FG_COLOUR, GridFrame::SetCellFgColour ) EVT_MENU( ID_SET_CELL_BG_COLOUR, GridFrame::SetCellBgColour ) @@ -91,6 +101,20 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( wxID_EXIT, GridFrame::OnQuit ) EVT_MENU( ID_VTABLE, GridFrame::OnVTable) EVT_MENU( ID_BUGS_TABLE, GridFrame::OnBugsTable) + EVT_MENU( ID_SMALL_GRID, GridFrame::OnSmallGrid) + + EVT_MENU( ID_DESELECT_CELL, GridFrame::DeselectCell) + EVT_MENU( ID_DESELECT_COL, GridFrame::DeselectCol) + EVT_MENU( ID_DESELECT_ROW, GridFrame::DeselectRow) + EVT_MENU( ID_DESELECT_ALL, GridFrame::DeselectAll) + EVT_MENU( ID_SELECT_CELL, GridFrame::SelectCell) + EVT_MENU( ID_SELECT_COL, GridFrame::SelectCol) + EVT_MENU( ID_SELECT_ROW, GridFrame::SelectRow) + EVT_MENU( ID_SELECT_ALL, GridFrame::SelectAll) + EVT_MENU( ID_SELECT_UNSELECT, GridFrame::OnAddToSelectToggle) + + EVT_MENU( ID_SET_HIGHLIGHT_WIDTH, GridFrame::OnSetHighlightWidth) + EVT_MENU( ID_SET_RO_HIGHLIGHT_WIDTH, GridFrame::OnSetROHighlightWidth) EVT_GRID_LABEL_LEFT_CLICK( GridFrame::OnLabelLeftClick ) EVT_GRID_CELL_LEFT_CLICK( GridFrame::OnCellLeftClick ) @@ -106,7 +130,7 @@ END_EVENT_TABLE() GridFrame::GridFrame() - : wxFrame( (wxFrame *)NULL, -1, "wxWindows grid class demo", + : wxFrame( (wxFrame *)NULL, -1, _T("wxWindows grid class demo"), wxDefaultPosition, wxDefaultSize ) { @@ -114,63 +138,96 @@ GridFrame::GridFrame() int logW = gridW, logH = 100; wxMenu *fileMenu = new wxMenu; - fileMenu->Append( ID_VTABLE, "&Virtual table test\tCtrl-V"); - fileMenu->Append( ID_BUGS_TABLE, "&Bugs table test\tCtrl-B"); + fileMenu->Append( ID_VTABLE, _T("&Virtual table test\tCtrl-V")); + fileMenu->Append( ID_BUGS_TABLE, _T("&Bugs table test\tCtrl-B")); + fileMenu->Append( ID_SMALL_GRID, _T("&Small Grid test\tCtrl-S")); fileMenu->AppendSeparator(); - fileMenu->Append( wxID_EXIT, "E&xit\tAlt-X" ); + fileMenu->Append( wxID_EXIT, _T("E&xit\tAlt-X") ); wxMenu *viewMenu = new wxMenu; - viewMenu->Append( ID_TOGGLEROWLABELS, "&Row labels", "", TRUE ); - viewMenu->Append( ID_TOGGLECOLLABELS, "&Col labels", "", TRUE ); - viewMenu->Append( ID_TOGGLEEDIT, "&Editable", "", TRUE ); - viewMenu->Append( ID_TOGGLEROWSIZING, "Ro&w drag-resize", "", TRUE ); - viewMenu->Append( ID_TOGGLECOLSIZING, "C&ol drag-resize", "", TRUE ); - viewMenu->Append( ID_TOGGLEGRIDSIZING, "&Grid drag-resize", "", TRUE ); + viewMenu->Append( ID_TOGGLEROWLABELS, _T("&Row labels"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLECOLLABELS, _T("&Col labels"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLEEDIT, _T("&Editable"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLEROWSIZING, _T("Ro&w drag-resize"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLECOLSIZING, _T("C&ol drag-resize"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLEGRIDSIZING, _T("&Grid drag-resize"), _T(""), TRUE ); + viewMenu->Append( ID_TOGGLEGRIDLINES, _T("&Grid Lines"), _T(""), TRUE ); + viewMenu->Append( ID_SET_HIGHLIGHT_WIDTH, _T("&Set Cell Highlight Width..."), _T("") ); + viewMenu->Append( ID_SET_RO_HIGHLIGHT_WIDTH, _T("&Set Cell RO Highlight Width..."), _T("") ); + viewMenu->Append( ID_AUTOSIZECOLS, _T("&Auto-size cols") ); + viewMenu->Append( ID_CELLOVERFLOW, _T("&Overflow cells"), _T(""), TRUE ); + viewMenu->Append( ID_RESIZECELL, _T("&Resize cell (7,1)"), _T(""), TRUE ); wxMenu *rowLabelMenu = new wxMenu; - viewMenu->Append( ID_ROWLABELALIGN, "R&ow label alignment", + viewMenu->Append( ID_ROWLABELALIGN, _T("R&ow label alignment"), rowLabelMenu, - "Change alignment of row labels" ); + _T("Change alignment of row labels") ); - rowLabelMenu->Append( ID_ROWLABELHORIZALIGN, "&Horizontal" ); - rowLabelMenu->Append( ID_ROWLABELVERTALIGN, "&Vertical" ); + rowLabelMenu->Append( ID_ROWLABELHORIZALIGN, _T("&Horizontal") ); + rowLabelMenu->Append( ID_ROWLABELVERTALIGN, _T("&Vertical") ); wxMenu *colLabelMenu = new wxMenu; - viewMenu->Append( ID_COLLABELALIGN, "Col l&abel alignment", + viewMenu->Append( ID_COLLABELALIGN, _T("Col l&abel alignment"), colLabelMenu, - "Change alignment of col labels" ); + _T("Change alignment of col labels") ); - colLabelMenu->Append( ID_COLLABELHORIZALIGN, "&Horizontal" ); - colLabelMenu->Append( ID_COLLABELVERTALIGN, "&Vertical" ); + colLabelMenu->Append( ID_COLLABELHORIZALIGN, _T("&Horizontal") ); + colLabelMenu->Append( ID_COLLABELVERTALIGN, _T("&Vertical") ); wxMenu *colMenu = new wxMenu; - colMenu->Append( ID_SETLABELCOLOUR, "Set &label colour" ); - colMenu->Append( ID_SETLABELTEXTCOLOUR, "Set label &text colour" ); - colMenu->Append( ID_GRIDLINECOLOUR, "&Grid line colour" ); - colMenu->Append( ID_SET_CELL_FG_COLOUR, "Set cell &foreground colour" ); - colMenu->Append( ID_SET_CELL_BG_COLOUR, "Set cell &background colour" ); + 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...") ); wxMenu *editMenu = new wxMenu; - editMenu->Append( ID_INSERTROW, "Insert &row" ); - editMenu->Append( ID_INSERTCOL, "Insert &column" ); - editMenu->Append( ID_DELETEROW, "Delete selected ro&ws" ); - editMenu->Append( ID_DELETECOL, "Delete selected co&ls" ); - editMenu->Append( ID_CLEARGRID, "Cl&ear grid cell contents" ); + 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") ); + + 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"), TRUE ); + 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_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)")); + wxMenu *selectionMenu = new wxMenu; + selectMenu->Append( ID_CHANGESEL, _T("Change &selection mode"), + selectionMenu, + _T("Change selection mode") ); + + selectionMenu->Append( ID_SELCELLS, _T("Select &Cells") ); + selectionMenu->Append( ID_SELROWS, _T("Select &Rows") ); + selectionMenu->Append( ID_SELCOLS, _T("Select C&ols") ); + wxMenu *helpMenu = new wxMenu; - helpMenu->Append( ID_ABOUT, "&About wxGrid demo" ); + helpMenu->Append( ID_ABOUT, _T("&About wxGrid demo") ); wxMenuBar *menuBar = new wxMenuBar; - menuBar->Append( fileMenu, "&File" ); - menuBar->Append( viewMenu, "&View" ); - menuBar->Append( colMenu, "&Colours" ); - menuBar->Append( editMenu, "&Edit" ); - menuBar->Append( helpMenu, "&Help" ); + menuBar->Append( fileMenu, _T("&File") ); + menuBar->Append( viewMenu, _T("&View") ); + menuBar->Append( colMenu, _T("&Colours") ); + menuBar->Append( editMenu, _T("&Edit") ); + menuBar->Append( selectMenu, _T("&Select") ); + menuBar->Append( helpMenu, _T("&Help") ); SetMenuBar( menuBar ); + m_addToSel = FALSE; + grid = new wxGrid( this, -1, wxPoint( 0, 0 ), @@ -189,33 +246,50 @@ GridFrame::GridFrame() // this will create a grid and, by default, an associated grid // table for strings - grid->CreateGrid( 100, 100 ); + grid->CreateGrid( 0, 0 ); + grid->AppendRows(100); + grid->AppendCols(100); + + int ir = grid->GetNumberRows(); + grid->DeleteRows(0, ir); + grid->AppendRows(ir); grid->SetRowSize( 0, 60 ); - grid->SetCellValue( 0, 0, "Ctrl+Home\nwill go to\nthis cell" ); + grid->SetCellValue( 0, 0, _T("Ctrl+Home\nwill go to\nthis cell") ); + + grid->SetCellValue( 0, 1, _T("A long piece of text to demonstrate wrapping.") ); + grid->SetCellRenderer(0 , 1, new wxGridCellAutoWrapStringRenderer); + grid->SetCellEditor( 0, 1 , new wxGridCellAutoWrapStringEditor); - grid->SetCellValue( 0, 1, "Blah" ); - grid->SetCellValue( 0, 2, "Blah" ); - grid->SetCellValue( 0, 3, "Read only" ); + grid->SetCellValue( 0, 2, _T("Blah") ); + grid->SetCellValue( 0, 3, _T("Read only") ); grid->SetReadOnly( 0, 3 ); - grid->SetCellValue( 0, 5, "Press\nCtrl+arrow\nto skip over\ncells" ); + grid->SetCellValue( 0, 4, _T("Can veto edit this cell") ); + + grid->SetCellValue( 0, 5, _T("Press\nCtrl+arrow\nto skip over\ncells") ); grid->SetRowSize( 99, 60 ); - grid->SetCellValue( 99, 99, "Ctrl+End\nwill go to\nthis cell" ); + 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->SetCellTextColour(1, 2, *wxRED); + grid->SetCellBackgroundColour(1, 2, *wxGREEN); - grid->SetCellValue(2, 2, "red"); + grid->SetCellValue( 1, 4, _T("I'm in the middle")); + + grid->SetCellValue(2, 2, _T("red")); grid->SetCellTextColour(2, 2, *wxRED); - grid->SetCellValue(3, 3, "green on grey"); + grid->SetCellValue(3, 3, _T("green on grey")); grid->SetCellTextColour(3, 3, *wxGREEN); grid->SetCellBackgroundColour(3, 3, *wxLIGHT_GREY); - grid->SetCellValue(4, 4, "a weird looking cell"); - grid->SetCellAlignment(4, 4, wxCENTRE, wxCENTRE); + grid->SetCellValue(4, 4, _T("a weird looking cell")); + grid->SetCellAlignment(4, 4, wxALIGN_CENTRE, wxALIGN_CENTRE); grid->SetCellRenderer(4, 4, new MyGridCellRenderer); - grid->SetCellValue(3, 0, "1"); + grid->SetCellValue(3, 0, _T("0")); grid->SetCellRenderer(3, 0, new wxGridCellBoolRenderer); grid->SetCellEditor(3, 0, new wxGridCellBoolEditor); @@ -224,22 +298,41 @@ GridFrame::GridFrame() attr->SetTextColour(*wxBLUE); grid->SetColAttr(5, attr); attr = new wxGridCellAttr; - attr->SetBackgroundColour(*wxBLUE); + attr->SetBackgroundColour(*wxRED); grid->SetRowAttr(5, attr); - grid->SetCellValue(2, 4, "a wider column"); + grid->SetCellValue(2, 4, _T("a wider column")); grid->SetColSize(4, 120); grid->SetColMinimalWidth(4, 120); - grid->SetColFormatFloat(5); - grid->SetCellValue(0, 5, "3.1415"); - grid->SetCellValue(1, 5, "1415"); - grid->SetCellValue(2, 5, "12345.67890"); + 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->SetColFormatFloat(6); + grid->SetCellValue(0, 6, _T("3.1415")); + grid->SetCellValue(1, 6, _T("1415")); + grid->SetCellValue(2, 6, _T("12345.67890")); - grid->SetColFormatFloat(6, 6, 2); - grid->SetCellValue(0, 6, "3.1415"); - grid->SetCellValue(1, 6, "1415"); - grid->SetCellValue(2, 6, "12345.67890"); + grid->SetColFormatFloat(7, 6, 2); + grid->SetCellValue(0, 7, _T("3.1415")); + grid->SetCellValue(1, 7, _T("1415")); + grid->SetCellValue(2, 7, _T("12345.67890")); + + const wxString choices[] = + { + _T("Please select a choice"), + _T("This takes two cells"), + _T("Another choice"), + }; + grid->SetCellEditor(4, 0, new wxGridCellChoiceEditor(WXSIZEOF(choices), choices)); + grid->SetCellSize(4, 0, 1, 2); + grid->SetCellValue(4, 0, choices[0]); + grid->SetCellOverflow(4, 0, FALSE); + + grid->SetCellSize(7, 1, 3, 4); + grid->SetCellAlignment(7, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); + grid->SetCellValue(7, 1, _T("Big box!")); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); topSizer->Add( grid, @@ -275,6 +368,8 @@ void GridFrame::SetDefaults() GetMenuBar()->Check( ID_TOGGLEROWSIZING, TRUE ); GetMenuBar()->Check( ID_TOGGLECOLSIZING, TRUE ); GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, TRUE ); + GetMenuBar()->Check( ID_TOGGLEGRIDLINES, TRUE ); + GetMenuBar()->Check( ID_CELLOVERFLOW, TRUE ); } @@ -331,6 +426,63 @@ void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) ) } +void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->EnableGridLines( + GetMenuBar()->IsChecked( ID_TOGGLEGRIDLINES ) ); +} + +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")}; + + wxSingleChoiceDialog dlg(this, _T("Choose the thickness of the highlight pen:"), + _T("Pen Width"), 11, choices); + + int current = grid->GetCellHighlightPenWidth(); + dlg.SetSelection(current); + if (dlg.ShowModal() == wxID_OK) { + grid->SetCellHighlightPenWidth(dlg.GetSelection()); + } +} + +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")}; + + wxSingleChoiceDialog dlg(this, _T("Choose the thickness of the highlight pen:"), + _T("Pen Width"), 11, choices); + + int current = grid->GetCellHighlightROPenWidth(); + dlg.SetSelection(current); + if (dlg.ShowModal() == wxID_OK) { + grid->SetCellHighlightROPenWidth(dlg.GetSelection()); + } +} + + + +void GridFrame::AutoSizeCols( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->AutoSizeColumns(); + grid->Refresh(); +} + +void GridFrame::CellOverflow( wxCommandEvent& ev ) +{ + grid->SetDefaultCellOverflow(ev.IsChecked()); + grid->Refresh(); +} + +void GridFrame::ResizeCell( wxCommandEvent& ev ) +{ + if (ev.IsChecked()) + grid->SetCellSize( 7, 1, 5, 5 ); + else + grid->SetCellSize( 7, 1, 1, 5 ); + grid->Refresh(); +} + void GridFrame::SetLabelColour( wxCommandEvent& WXUNUSED(ev) ) { wxColourDialog dlg( NULL ); @@ -358,6 +510,14 @@ void GridFrame::SetLabelTextColour( wxCommandEvent& WXUNUSED(ev) ) } } +void GridFrame::SetLabelFont( wxCommandEvent& WXUNUSED(ev) ) +{ + wxFont font = wxGetFontFromUser(this); + if ( font.Ok() ) + { + grid->SetLabelFont(font); + } +} void GridFrame::SetRowLabelHorizAlignment( wxCommandEvent& WXUNUSED(ev) ) { @@ -366,16 +526,16 @@ void GridFrame::SetRowLabelHorizAlignment( wxCommandEvent& WXUNUSED(ev) ) switch ( horiz ) { - case wxLEFT: - horiz = wxCENTRE; + case wxALIGN_LEFT: + horiz = wxALIGN_CENTRE; break; - case wxCENTRE: - horiz = wxRIGHT; + case wxALIGN_CENTRE: + horiz = wxALIGN_RIGHT; break; - case wxRIGHT: - horiz = wxLEFT; + case wxALIGN_RIGHT: + horiz = wxALIGN_LEFT; break; } @@ -389,16 +549,16 @@ void GridFrame::SetRowLabelVertAlignment( wxCommandEvent& WXUNUSED(ev) ) switch ( vert ) { - case wxTOP: - vert = wxCENTRE; + case wxALIGN_TOP: + vert = wxALIGN_CENTRE; break; - case wxCENTRE: - vert = wxBOTTOM; + case wxALIGN_CENTRE: + vert = wxALIGN_BOTTOM; break; - case wxBOTTOM: - vert = wxTOP; + case wxALIGN_BOTTOM: + vert = wxALIGN_TOP; break; } @@ -413,16 +573,16 @@ void GridFrame::SetColLabelHorizAlignment( wxCommandEvent& WXUNUSED(ev) ) switch ( horiz ) { - case wxLEFT: - horiz = wxCENTRE; + case wxALIGN_LEFT: + horiz = wxALIGN_CENTRE; break; - case wxCENTRE: - horiz = wxRIGHT; + case wxALIGN_CENTRE: + horiz = wxALIGN_RIGHT; break; - case wxRIGHT: - horiz = wxLEFT; + case wxALIGN_RIGHT: + horiz = wxALIGN_LEFT; break; } @@ -437,16 +597,16 @@ void GridFrame::SetColLabelVertAlignment( wxCommandEvent& WXUNUSED(ev) ) switch ( vert ) { - case wxTOP: - vert = wxCENTRE; + case wxALIGN_TOP: + vert = wxALIGN_CENTRE; break; - case wxCENTRE: - vert = wxBOTTOM; + case wxALIGN_CENTRE: + vert = wxALIGN_BOTTOM; break; - case wxBOTTOM: - vert = wxTOP; + case wxALIGN_BOTTOM: + vert = wxALIGN_TOP; break; } @@ -484,9 +644,13 @@ void GridFrame::DeleteSelectedRows( wxCommandEvent& WXUNUSED(ev) ) { if ( grid->IsSelection() ) { - int topRow, bottomRow, leftCol, rightCol; - grid->GetSelection( &topRow, &leftCol, &bottomRow, &rightCol ); - grid->DeleteRows( topRow, bottomRow - topRow + 1 ); + grid->BeginBatch(); + for ( int n = 0; n < grid->GetNumberRows(); ) + if ( grid->IsInSelection( n , 0 ) ) + grid->DeleteRows( n, 1 ); + else + n++; + grid->EndBatch(); } } @@ -495,9 +659,13 @@ void GridFrame::DeleteSelectedCols( wxCommandEvent& WXUNUSED(ev) ) { if ( grid->IsSelection() ) { - int topRow, bottomRow, leftCol, rightCol; - grid->GetSelection( &topRow, &leftCol, &bottomRow, &rightCol ); - grid->DeleteCols( leftCol, rightCol - leftCol + 1 ); + grid->BeginBatch(); + for ( int n = 0; n < grid->GetNumberCols(); ) + if ( grid->IsInSelection( 0 , n ) ) + grid->DeleteCols( n, 1 ); + else + n++; + grid->EndBatch(); } } @@ -507,6 +675,21 @@ void GridFrame::ClearGrid( wxCommandEvent& WXUNUSED(ev) ) grid->ClearGrid(); } +void GridFrame::SelectCells( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->SetSelectionMode( wxGrid::wxGridSelectCells ); +} + +void GridFrame::SelectRows( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->SetSelectionMode( wxGrid::wxGridSelectRows ); +} + +void GridFrame::SelectCols( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->SetSelectionMode( wxGrid::wxGridSelectColumns ); +} + void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) ) { wxColour col = wxGetColourFromUser(this); @@ -522,29 +705,78 @@ void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) ) wxColour col = wxGetColourFromUser(this); if ( col.Ok() ) { + // Check the new Refresh function by passing it a rectangle + // which exactly fits the grid. + wxRect r(wxPoint(0, 0), grid->GetSize()); grid->SetDefaultCellBackgroundColour(col); - grid->Refresh(); + grid->Refresh(TRUE, &r); } } +void GridFrame::DeselectCell(wxCommandEvent& WXUNUSED(event)) +{ + grid->DeselectCell(3, 1); +} + +void GridFrame::DeselectCol(wxCommandEvent& WXUNUSED(event)) +{ + grid->DeselectCol(2); +} + +void GridFrame::DeselectRow(wxCommandEvent& WXUNUSED(event)) +{ + grid->DeselectRow(2); +} + +void GridFrame::DeselectAll(wxCommandEvent& WXUNUSED(event)) +{ + grid->ClearSelection(); +} + +void GridFrame::SelectCell(wxCommandEvent& WXUNUSED(event)) +{ + grid->SelectBlock(3, 1, 3, 1, m_addToSel); +} + +void GridFrame::SelectCol(wxCommandEvent& WXUNUSED(event)) +{ + grid->SelectCol(2, m_addToSel); +} + +void GridFrame::SelectRow(wxCommandEvent& WXUNUSED(event)) +{ + grid->SelectRow(2, m_addToSel); +} + +void GridFrame::SelectAll(wxCommandEvent& WXUNUSED(event)) +{ + grid->SelectAll(); +} + +void GridFrame::OnAddToSelectToggle(wxCommandEvent& event) +{ + m_addToSel = event.IsChecked(); +} + void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) { - logBuf = ""; + logBuf = _T(""); if ( ev.GetRow() != -1 ) { - logBuf << "Left click on row label " << ev.GetRow(); + logBuf << _T("Left click on row label ") << ev.GetRow(); } else if ( ev.GetCol() != -1 ) { - logBuf << "Left click on col label " << ev.GetCol(); + logBuf << _T("Left click on col label ") << ev.GetCol(); } else { - logBuf << "Left click on corner label"; + logBuf << _T("Left click on corner label"); } - if ( ev.ShiftDown() ) logBuf << " (shift down)"; - wxLogMessage( "%s", logBuf.c_str() ); + if ( ev.ShiftDown() ) logBuf << _T(" (shift down)"); + if ( ev.ControlDown() ) logBuf << _T(" (control down)"); + wxLogMessage( wxT("%s"), logBuf.c_str() ); // you must call event skip if you want default grid processing // @@ -554,10 +786,10 @@ void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) void GridFrame::OnCellLeftClick( wxGridEvent& ev ) { - logBuf = ""; - logBuf << "Left click at row " << ev.GetRow() - << " col " << ev.GetCol(); - wxLogMessage( "%s", logBuf.c_str() ); + logBuf = _T(""); + logBuf << _T("Left click at row ") << ev.GetRow() + << _T(" col ") << ev.GetCol(); + wxLogMessage( wxT("%s"), logBuf.c_str() ); // you must call event skip if you want default grid processing // (cell highlighting etc.) @@ -568,9 +800,9 @@ void GridFrame::OnCellLeftClick( wxGridEvent& ev ) void GridFrame::OnRowSize( wxGridSizeEvent& ev ) { - logBuf = ""; - logBuf << "Resized row " << ev.GetRowOrCol(); - wxLogMessage( "%s", logBuf.c_str() ); + logBuf = _T(""); + logBuf << _T("Resized row ") << ev.GetRowOrCol(); + wxLogMessage( wxT("%s"), logBuf.c_str() ); ev.Skip(); } @@ -578,9 +810,9 @@ void GridFrame::OnRowSize( wxGridSizeEvent& ev ) void GridFrame::OnColSize( wxGridSizeEvent& ev ) { - logBuf = ""; - logBuf << "Resized col " << ev.GetRowOrCol(); - wxLogMessage( "%s", logBuf.c_str() ); + logBuf = _T(""); + logBuf << _T("Resized col ") << ev.GetRowOrCol(); + wxLogMessage( wxT("%s"), logBuf.c_str() ); ev.Skip(); } @@ -588,10 +820,18 @@ void GridFrame::OnColSize( wxGridSizeEvent& ev ) void GridFrame::OnSelectCell( wxGridEvent& ev ) { - logBuf = ""; - logBuf << "Selected cell at row " << ev.GetRow() - << " col " << ev.GetCol(); - wxLogMessage( "%s", logBuf.c_str() ); + logBuf = _T(""); + if ( ev.Selecting() ) + logBuf << _T("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(" )"); + wxLogMessage( wxT("%s"), logBuf.c_str() ); // you must call Skip() if you want the default processing // to occur in wxGrid @@ -600,49 +840,76 @@ void GridFrame::OnSelectCell( wxGridEvent& ev ) void GridFrame::OnRangeSelected( wxGridRangeSelectEvent& ev ) { - logBuf = ""; - logBuf << "Selected cells from row " << ev.GetTopRow() - << " col " << ev.GetLeftCol() - << " to row " << ev.GetBottomRow() - << " col " << ev.GetRightCol(); - - wxLogMessage( "%s", logBuf.c_str() ); + logBuf = _T(""); + if ( ev.Selecting() ) + logBuf << _T("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(" )"); + wxLogMessage( wxT("%s"), logBuf.c_str() ); ev.Skip(); } void GridFrame::OnCellValueChanged( wxGridEvent& ev ) { - logBuf = ""; - logBuf << "Value changed for cell at" - << " row " << ev.GetRow() - << " col " << ev.GetCol(); + logBuf = _T(""); + logBuf << _T("Value changed for cell at") + << _T(" row ") << ev.GetRow() + << _T(" col ") << ev.GetCol(); - wxLogMessage( "%s", logBuf.c_str() ); + wxLogMessage( wxT("%s"), logBuf.c_str() ); ev.Skip(); } void GridFrame::OnEditorShown( wxGridEvent& ev ) { - wxLogMessage( "Cell editor shown." ); + + if ( (ev.GetCol() == 4) && + (ev.GetRow() == 0) && + (wxMessageBox(_T("Are you sure you wish to edit this cell"), + _T("Checking"),wxYES_NO) == wxNO ) ) { + + ev.Veto(); + return; + } + + wxLogMessage( wxT("Cell editor shown.") ); ev.Skip(); } void GridFrame::OnEditorHidden( wxGridEvent& ev ) { - wxLogMessage( "Cell editor hidden." ); + + if ( (ev.GetCol() == 4) && + (ev.GetRow() == 0) && + (wxMessageBox(_T("Are you sure you wish to finish editing this cell"), + _T("Checking"),wxYES_NO) == wxNO ) ) { + + ev.Veto(); + return; + } + + wxLogMessage( wxT("Cell editor hidden.") ); ev.Skip(); } void GridFrame::About( wxCommandEvent& WXUNUSED(ev) ) { - (void)wxMessageBox( "\n\nwxGrid demo \n\n" - "Michael Bedward \n" - "mbedward@ozemail.com.au \n\n", - "About", + (void)wxMessageBox( _T("\n\nwxGrid demo \n\n") + _T("Michael Bedward \n") + _T("mbedward@ozemail.com.au \n\n"), + _T("About"), wxOK ); } @@ -658,6 +925,17 @@ void GridFrame::OnBugsTable(wxCommandEvent& ) frame->Show(TRUE); } +void GridFrame::OnSmallGrid(wxCommandEvent& ) +{ + wxFrame* frame = new wxFrame(NULL, -1, _T("A Small Grid"), + wxDefaultPosition, wxSize(640, 480)); + wxPanel* panel = new wxPanel(frame, -1); + wxGrid* grid = new wxGrid(panel, -1, wxPoint(10,10), wxSize(400,400), + wxWANTS_CHARS | wxSIMPLE_BORDER); + grid->CreateGrid(3,3); + frame->Show(TRUE); +} + void GridFrame::OnVTable(wxCommandEvent& ) { static long s_sizeGrid = 10000; @@ -666,20 +944,20 @@ void GridFrame::OnVTable(wxCommandEvent& ) // MB: wxGetNumberFromUser doesn't work properly for wxMotif wxString s; s << s_sizeGrid; - s = wxGetTextFromUser( "Size of the table to create", - "Size:", + s = wxGetTextFromUser( _T("Size of the table to create"), + _T("Size:"), s ); - + s.ToLong( &s_sizeGrid ); - + #else - s_sizeGrid = wxGetNumberFromUser("Size of the table to create", - "Size: ", - "wxGridDemo question", + s_sizeGrid = wxGetNumberFromUser(_T("Size of the table to create"), + _T("Size: "), + _T("wxGridDemo question"), s_sizeGrid, 0, 32000, this); #endif - + if ( s_sizeGrid != -1 ) { BigGridFrame* win = new BigGridFrame(s_sizeGrid); @@ -723,9 +1001,10 @@ MyGridCellAttrProvider::~MyGridCellAttrProvider() m_attrForOddRows->DecRef(); } -wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col) const +wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind /* = wxGridCellAttr::Any */) const { - wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row, col); + wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row, col, kind); if ( row % 2 ) { @@ -754,7 +1033,7 @@ wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col) const // ============================================================================ BigGridFrame::BigGridFrame(long sizeGrid) - : wxFrame(NULL, -1, "Plugin Virtual Table", + : wxFrame(NULL, -1, _T("Plugin Virtual Table"), wxDefaultPosition, wxSize(500, 450)) { m_grid = new wxGrid(this, -1, wxDefaultPosition, wxDefaultSize); @@ -803,7 +1082,7 @@ enum Severity Sev_Max }; -static const wxChar* severities[] = +static const wxString severities[] = { _T("wishlist"), _T("minor"), @@ -815,28 +1094,12 @@ static const wxChar* severities[] = static struct BugsGridData { int id; - - // Borland can't deal with global wxStrings and will generate a - // compile time error with the initializing the gs_dataGridBugs - // array (below) - // -#ifndef __BORLANDC__ - wxString summary; -#else - wxChar *summary; -#endif - + wxChar summary[80]; Severity severity; int prio; - -#ifndef __BORLANDC__ - wxString platform; -#else - wxChar *platform; -#endif - + wxChar platform[12]; bool opened; -} gs_dataBugsGrid [] = +} gs_dataBugsGrid [] = { { 18, _T("foo doesn't work"), Sev_Major, 1, _T("wxMSW"), TRUE }, { 27, _T("bar crashes"), Sev_Critical, 1, _T("all"), FALSE }, @@ -870,8 +1133,10 @@ 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); + case Col_Platform: - return wxGRID_VALUE_STRING; + return wxString::Format(_T("%s:all,MSW,GTK,other"), wxGRID_VALUE_CHOICE); case Col_Opened: return wxGRID_VALUE_BOOL; @@ -882,12 +1147,12 @@ wxString BugsGridTable::GetTypeName(int WXUNUSED(row), int col) return wxEmptyString; } -long BugsGridTable::GetNumberRows() +int BugsGridTable::GetNumberRows() { return WXSIZEOF(gs_dataBugsGrid); } -long BugsGridTable::GetNumberCols() +int BugsGridTable::GetNumberCols() { return Col_Max; } @@ -956,27 +1221,11 @@ void BugsGridTable::SetValue( int row, int col, const wxString& value ) break; case Col_Summary: -#ifndef __BORLANDC__ - gd.summary = value; -#else - // this generates a warning message if you are using the - // memory tracing code but it should be ok :MB - // - delete gd.summary; - gd.summary = copystring( value.c_str() ); -#endif + wxStrncpy(gd.summary, value, WXSIZEOF(gd.summary)); break; case Col_Platform: -#ifndef __BORLANDC__ - gd.platform = value; -#else - // this generates a warning message if you are using the - // memory tracing code but it should be ok :MB - // - delete gd.platform; - gd.platform = copystring( value.c_str() ); -#endif + wxStrncpy(gd.platform, value, WXSIZEOF(gd.platform)); break; } } @@ -1082,7 +1331,7 @@ BugsGridTable::BugsGridTable() // ---------------------------------------------------------------------------- BugsGridFrame::BugsGridFrame() - : wxFrame(NULL, -1, "Bugs table", + : wxFrame(NULL, -1, _T("Bugs table"), wxDefaultPosition, wxSize(500, 300)) { wxGrid *grid = new wxGrid(this, -1, wxDefaultPosition); @@ -1106,8 +1355,7 @@ BugsGridFrame::BugsGridFrame() grid->SetMargins(0, 0); grid->Fit(); - wxSize size = grid->GetSize(); - size.x += 10; - size.y += 10; - SetClientSize(size); + SetClientSize(grid->GetSize()); } + +