/////////////////////////////////////////////////////////////////////////////
// Name: griddemo.cpp
-// Purpose: Grid control wxWindows sample
+// Purpose: Grid control wxWidgets sample
// Author: Michael Bedward
-// Modified by:
+// Modified by: Santiago Palacios
// RCS-ID: $Id$
-// Copyright: (c) Michael Bedward, Julian Smart
+// Copyright: (c) Michael Bedward, Julian Smart, Vadim Zeitlin
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
- #pragma implementation
- #pragma interface
-#endif
-
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#include "wx/colordlg.h"
#include "wx/fontdlg.h"
+#include "wx/numdlg.h"
#include "wx/grid.h"
#include "wx/generic/gridctrl.h"
bool GridApp::OnInit()
{
GridFrame *frame = new GridFrame;
- frame->Show( TRUE );
+ frame->Show(true);
- return TRUE;
+ return true;
}
// ----------------------------------------------------------------------------
EVT_MENU( ID_TOGGLEEDIT, GridFrame::ToggleEditing )
EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing )
EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing )
+ EVT_MENU( ID_TOGGLECOLMOVING, GridFrame::ToggleColMoving )
EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing )
+ EVT_MENU( ID_TOGGLEGRIDDRAGCELL, GridFrame::ToggleGridDragCell )
EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines )
EVT_MENU( ID_AUTOSIZECOLS, GridFrame::AutoSizeCols )
EVT_MENU( ID_CELLOVERFLOW, GridFrame::CellOverflow )
EVT_MENU( ID_SET_CELL_FG_COLOUR, GridFrame::SetCellFgColour )
EVT_MENU( ID_SET_CELL_BG_COLOUR, GridFrame::SetCellBgColour )
- EVT_MENU( ID_ABOUT, GridFrame::About )
+ EVT_MENU( wxID_ABOUT, GridFrame::About )
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_TABULAR_GRID, GridFrame::OnTabularGrid)
EVT_MENU( ID_DESELECT_CELL, GridFrame::DeselectCell)
EVT_MENU( ID_DESELECT_COL, GridFrame::DeselectCol)
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 )
+ EVT_MENU( ID_SIZE_ROW_LABEL, GridFrame::AutoSizeRowLabel )
+ EVT_MENU( ID_SIZE_COL_LABEL, GridFrame::AutoSizeColLabel )
+ EVT_MENU( ID_SIZE_LABELS_COL, GridFrame::AutoSizeLabelsCol )
+ EVT_MENU( ID_SIZE_LABELS_ROW, GridFrame::AutoSizeLabelsRow )
+ EVT_MENU( ID_SIZE_GRID, GridFrame::AutoSizeTable )
EVT_MENU( ID_SET_HIGHLIGHT_WIDTH, GridFrame::OnSetHighlightWidth)
EVT_MENU( ID_SET_RO_HIGHLIGHT_WIDTH, GridFrame::OnSetROHighlightWidth)
EVT_GRID_SELECT_CELL( GridFrame::OnSelectCell )
EVT_GRID_RANGE_SELECT( GridFrame::OnRangeSelected )
EVT_GRID_CELL_CHANGE( GridFrame::OnCellValueChanged )
+ EVT_GRID_CELL_BEGIN_DRAG( GridFrame::OnCellBeginDrag )
EVT_GRID_EDITOR_SHOWN( GridFrame::OnEditorShown )
EVT_GRID_EDITOR_HIDDEN( GridFrame::OnEditorHidden )
GridFrame::GridFrame()
- : wxFrame( (wxFrame *)NULL, -1, _T("wxWindows grid class demo"),
+ : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxWidgets grid class demo"),
wxDefaultPosition,
wxDefaultSize )
{
- int gridW = 600, gridH = 300;
- int logW = gridW, logH = 100;
-
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_SMALL_GRID, _T("&Small Grid test\tCtrl-S"));
+ fileMenu->Append( ID_TABULAR_GRID, _T("&Tabular Grid test\tCtrl-T"));
fileMenu->AppendSeparator();
fileMenu->Append( wxID_EXIT, _T("E&xit\tAlt-X") );
wxMenu *viewMenu = new wxMenu;
- viewMenu->Append( ID_TOGGLEROWLABELS, _T("&Row labels"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLECOLLABELS, _T("&Col labels"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLEEDIT, _T("&Editable"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLEROWSIZING, _T("Ro&w drag-resize"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLECOLSIZING, _T("C&ol drag-resize"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLEGRIDSIZING, _T("&Grid drag-resize"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_TOGGLEGRIDLINES, _T("&Grid Lines"), _T(""), wxITEM_CHECK );
- 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_TOGGLEROWLABELS, _T("&Row labels"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLECOLLABELS, _T("&Col labels"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLEEDIT, _T("&Editable"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLEROWSIZING, _T("Ro&w drag-resize"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLECOLSIZING, _T("C&ol drag-resize"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLECOLMOVING, _T("Col drag-&move"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLEGRIDSIZING, _T("&Grid drag-resize"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLEGRIDDRAGCELL, _T("&Grid drag-cell"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_TOGGLEGRIDLINES, _T("&Grid Lines"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_SET_HIGHLIGHT_WIDTH, _T("&Set Cell Highlight Width...") );
+ viewMenu->Append( ID_SET_RO_HIGHLIGHT_WIDTH, _T("&Set Cell RO Highlight Width...") );
viewMenu->Append( ID_AUTOSIZECOLS, _T("&Auto-size cols") );
- viewMenu->Append( ID_CELLOVERFLOW, _T("&Overflow cells"), _T(""), wxITEM_CHECK );
- viewMenu->Append( ID_RESIZECELL, _T("&Resize cell (7,1)"), _T(""), wxITEM_CHECK );
+ viewMenu->Append( ID_CELLOVERFLOW, _T("&Overflow cells"), wxEmptyString, wxITEM_CHECK );
+ viewMenu->Append( ID_RESIZECELL, _T("&Resize cell (7,1)"), wxEmptyString, wxITEM_CHECK );
wxMenu *rowLabelMenu = 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->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->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"));
selectionMenu->Append( ID_SELROWS, _T("Select &Rows") );
selectionMenu->Append( ID_SELCOLS, _T("Select C&ols") );
+ 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") );
wxMenu *helpMenu = new wxMenu;
- helpMenu->Append( ID_ABOUT, _T("&About wxGrid demo") );
+ helpMenu->Append( wxID_ABOUT, _T("&About wxGrid demo") );
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( fileMenu, _T("&File") );
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") );
SetMenuBar( menuBar );
- m_addToSel = FALSE;
+ m_addToSel = false;
grid = new wxGrid( this,
- -1,
+ wxID_ANY,
wxPoint( 0, 0 ),
wxSize( 400, 300 ) );
+#if wxUSE_LOG
+ int gridW = 600, gridH = 300;
+ int logW = gridW, logH = 100;
+
logWin = new wxTextCtrl( this,
- -1,
+ wxID_ANY,
wxEmptyString,
wxPoint( 0, gridH + 20 ),
wxSize( logW, logH ),
wxTE_MULTILINE );
logger = new wxLogTextCtrl( logWin );
- m_logOld = logger->SetActiveTarget( logger );
- logger->SetTimestamp( NULL );
+ m_logOld = wxLog::SetActiveTarget( logger );
+ wxLog::DisableTimestamp();
+#endif // wxUSE_LOG
// this will create a grid and, by default, an associated grid
// table for strings
grid->SetCellAlignment(4, 4, wxALIGN_CENTRE, wxALIGN_CENTRE);
grid->SetCellRenderer(4, 4, new MyGridCellRenderer);
- grid->SetCellValue(3, 0, _T("0"));
grid->SetCellRenderer(3, 0, new wxGridCellBoolRenderer);
grid->SetCellEditor(3, 0, new wxGridCellBoolEditor);
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->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->SetColFormatFloat(7, 6, 2);
- grid->SetCellValue(0, 7, _T("3.1415"));
- grid->SetCellValue(1, 7, _T("1415"));
- grid->SetCellValue(2, 7, _T("12345.67890"));
+ 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");
const wxString choices[] =
{
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->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!"));
+ // this does exactly nothing except testing that SetAttr() handles NULL
+ // attributes and does reference counting correctly
+ grid->SetAttr(11, 11, NULL);
+ grid->SetAttr(11, 11, new wxGridCellAttr);
+ grid->SetAttr(11, 11, NULL);
+
wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
topSizer->Add( grid,
1,
wxEXPAND );
+#if wxUSE_LOG
topSizer->Add( logWin,
0,
wxEXPAND );
+#endif // wxUSE_LOG
- SetAutoLayout( TRUE );
- SetSizer( topSizer );
-
- topSizer->Fit( this );
- topSizer->SetSizeHints( this );
+ SetSizerAndFit( topSizer );
Centre();
SetDefaults();
GridFrame::~GridFrame()
{
+#if wxUSE_LOG
delete wxLog::SetActiveTarget(m_logOld);
+#endif // wxUSE_LOG
}
void GridFrame::SetDefaults()
{
- GetMenuBar()->Check( ID_TOGGLEROWLABELS, TRUE );
- GetMenuBar()->Check( ID_TOGGLECOLLABELS, TRUE );
- GetMenuBar()->Check( ID_TOGGLEEDIT, TRUE );
- 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 );
+ GetMenuBar()->Check( ID_TOGGLEROWLABELS, true );
+ GetMenuBar()->Check( ID_TOGGLECOLLABELS, true );
+ GetMenuBar()->Check( ID_TOGGLEEDIT, true );
+ GetMenuBar()->Check( ID_TOGGLEROWSIZING, true );
+ GetMenuBar()->Check( ID_TOGGLECOLSIZING, true );
+ GetMenuBar()->Check( ID_TOGGLECOLMOVING, false );
+ GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, true );
+ GetMenuBar()->Check( ID_TOGGLEGRIDDRAGCELL, false );
+ GetMenuBar()->Check( ID_TOGGLEGRIDLINES, true );
+ GetMenuBar()->Check( ID_CELLOVERFLOW, true );
}
GetMenuBar()->IsChecked( ID_TOGGLECOLSIZING ) );
}
+void GridFrame::ToggleColMoving( wxCommandEvent& WXUNUSED(ev) )
+{
+ grid->EnableDragColMove(
+ GetMenuBar()->IsChecked( ID_TOGGLECOLMOVING ) );
+}
+
void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) )
{
grid->EnableDragGridSize(
GetMenuBar()->IsChecked( ID_TOGGLEGRIDSIZING ) );
}
+void GridFrame::ToggleGridDragCell( wxCommandEvent& WXUNUSED(ev) )
+{
+ grid->EnableDragCell(
+ GetMenuBar()->IsChecked( ID_TOGGLEGRIDDRAGCELL ) );
+}
void GridFrame::ToggleGridLines( wxCommandEvent& WXUNUSED(ev) )
{
break;
}
- grid->SetRowLabelAlignment( horiz, -1 );
+ grid->SetRowLabelAlignment( horiz, vert );
}
void GridFrame::SetRowLabelVertAlignment( wxCommandEvent& WXUNUSED(ev) )
break;
}
- grid->SetRowLabelAlignment( -1, vert );
+ grid->SetRowLabelAlignment( horiz, vert );
}
break;
}
- grid->SetColLabelAlignment( horiz, -1 );
+ grid->SetColLabelAlignment( horiz, vert );
}
break;
}
- grid->SetColLabelAlignment( -1, vert );
+ grid->SetColLabelAlignment( horiz, vert );
}
{
if ( grid->IsSelection() )
{
- grid->BeginBatch();
+ wxGridUpdateLocker locker(grid);
for ( int n = 0; n < grid->GetNumberRows(); )
+ {
if ( grid->IsInSelection( n , 0 ) )
grid->DeleteRows( n, 1 );
- else
- n++;
- grid->EndBatch();
+ else
+ n++;
+ }
+ }
+}
+
+
+void GridFrame::AutoSizeRow(wxCommandEvent& WXUNUSED(event))
+{
+ wxGridUpdateLocker locker(grid);
+ const wxArrayInt sels = grid->GetSelectedRows();
+ for ( size_t n = 0, count = sels.size(); n < count; n++ )
+ {
+ grid->AutoSizeRow( sels[n], false );
}
}
+void GridFrame::AutoSizeCol(wxCommandEvent& WXUNUSED(event))
+{
+ wxGridUpdateLocker locker(grid);
+ const wxArrayInt sels = grid->GetSelectedCols();
+ for ( size_t n = 0, count = sels.size(); n < count; n++ )
+ {
+ grid->AutoSizeColumn( sels[n], false );
+ }
+}
+
+void GridFrame::AutoSizeRowLabel(wxCommandEvent& WXUNUSED(event))
+{
+ wxGridUpdateLocker locker(grid);
+ const wxArrayInt sels = grid->GetSelectedRows();
+ for ( size_t n = 0, count = sels.size(); n < count; n++ )
+ {
+ grid->AutoSizeRowLabelSize( sels[n] );
+ }
+}
+
+void GridFrame::AutoSizeColLabel(wxCommandEvent& WXUNUSED(event))
+{
+ wxGridUpdateLocker locker(grid);
+ const wxArrayInt sels = grid->GetSelectedCols();
+ for ( size_t n = 0, count = sels.size(); n < count; n++ )
+ {
+ grid->AutoSizeColLabelSize( sels[n] );
+ }
+}
+
+void GridFrame::AutoSizeLabelsCol(wxCommandEvent& WXUNUSED(event))
+{
+ grid->SetColLabelSize( wxGRID_AUTOSIZE );
+}
+
+void GridFrame::AutoSizeLabelsRow(wxCommandEvent& WXUNUSED(event))
+{
+ grid->SetRowLabelSize( wxGRID_AUTOSIZE );
+}
+
+void GridFrame::AutoSizeTable(wxCommandEvent& WXUNUSED(event))
+{
+ grid->AutoSize();
+}
+
void GridFrame::DeleteSelectedCols( wxCommandEvent& WXUNUSED(ev) )
{
if ( grid->IsSelection() )
{
- grid->BeginBatch();
+ wxGridUpdateLocker locker(grid);
for ( int n = 0; n < grid->GetNumberCols(); )
+ {
if ( grid->IsInSelection( 0 , n ) )
grid->DeleteCols( n, 1 );
- else
- n++;
- grid->EndBatch();
+ else
+ n++;
+ }
}
}
{
// Check the new Refresh function by passing it a rectangle
// which exactly fits the grid.
- wxRect r(wxPoint(0, 0), grid->GetSize());
+ wxPoint pt(0, 0);
+ wxRect r(pt, grid->GetSize());
grid->SetDefaultCellBackgroundColour(col);
- grid->Refresh(TRUE, &r);
+ grid->Refresh(true, &r);
}
}
void GridFrame::OnLabelLeftClick( wxGridEvent& ev )
{
- logBuf = _T("");
+ wxString logBuf;
if ( ev.GetRow() != -1 )
{
logBuf << _T("Left click on row label ") << ev.GetRow();
logBuf << _T("Left click on corner label");
}
- if ( ev.ShiftDown() ) logBuf << _T(" (shift down)");
- if ( ev.ControlDown() ) logBuf << _T(" (control down)");
+ 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
void GridFrame::OnCellLeftClick( wxGridEvent& ev )
{
- logBuf = _T("");
- logBuf << _T("Left click at row ") << ev.GetRow()
- << _T(" col ") << ev.GetCol();
- wxLogMessage( wxT("%s"), logBuf.c_str() );
+ wxLogMessage(_T("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.)
void GridFrame::OnRowSize( wxGridSizeEvent& ev )
{
- logBuf = _T("");
- logBuf << _T("Resized row ") << ev.GetRowOrCol();
- wxLogMessage( wxT("%s"), logBuf.c_str() );
+ wxLogMessage(_T("Resized row %d"), ev.GetRowOrCol());
ev.Skip();
}
void GridFrame::OnColSize( wxGridSizeEvent& ev )
{
- logBuf = _T("");
- logBuf << _T("Resized col ") << ev.GetRowOrCol();
- wxLogMessage( wxT("%s"), logBuf.c_str() );
+ wxLogMessage(_T("Resized col %d"), ev.GetRowOrCol());
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 )
{
- logBuf = _T("");
+ wxString logBuf;
if ( ev.Selecting() )
logBuf << _T("Selected ");
else
<< _T(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F')
<< _T(", AltDown: ")<< (ev.AltDown() ? 'T':'F')
<< _T(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << _T(" )");
+
+ //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() );
+
wxLogMessage( wxT("%s"), logBuf.c_str() );
// you must call Skip() if you want the default processing
void GridFrame::OnRangeSelected( wxGridRangeSelectEvent& ev )
{
- logBuf = _T("");
+ wxString logBuf;
if ( ev.Selecting() )
logBuf << _T("Selected ");
else
void GridFrame::OnCellValueChanged( wxGridEvent& ev )
{
- logBuf = _T("");
- logBuf << _T("Value changed for cell at")
- << _T(" row ") << ev.GetRow()
- << _T(" col ") << ev.GetCol();
+ int row = ev.GetRow(),
+ col = ev.GetCol();
- wxLogMessage( wxT("%s"), logBuf.c_str() );
+ wxLogMessage(_T("Value changed for cell at row %d, col %d: now \"%s\""),
+ row, col, grid->GetCellValue(row, col).c_str());
+
+ ev.Skip();
+}
+
+void GridFrame::OnCellBeginDrag( wxGridEvent& ev )
+{
+ wxLogMessage(_T("Got request to drag cell at row %d, col %d"),
+ ev.GetRow(), ev.GetCol());
ev.Skip();
}
void GridFrame::About( wxCommandEvent& WXUNUSED(ev) )
{
(void)wxMessageBox( _T("\n\nwxGrid demo \n\n")
- _T("Michael Bedward \n")
- _T("mbedward@ozemail.com.au \n\n"),
+ _T("Michael Bedward, Julian Smart, Vadim Zeitlin"),
_T("About"),
wxOK );
}
void GridFrame::OnQuit( wxCommandEvent& WXUNUSED(ev) )
{
- Close( TRUE );
+ Close( true );
}
void GridFrame::OnBugsTable(wxCommandEvent& )
{
BugsGridFrame *frame = new BugsGridFrame;
- frame->Show(TRUE);
+ frame->Show(true);
}
void GridFrame::OnSmallGrid(wxCommandEvent& )
{
- wxFrame* frame = new wxFrame(NULL, -1, _T("A Small Grid"),
+ wxFrame* frame = new wxFrame(NULL, wxID_ANY, _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),
+ wxPanel* panel = new wxPanel(frame, wxID_ANY);
+ wxGrid* grid = new wxGrid(panel, wxID_ANY, wxPoint(10,10), wxSize(400,400),
wxWANTS_CHARS | wxSIMPLE_BORDER);
grid->CreateGrid(3,3);
- frame->Show(TRUE);
+ frame->Show(true);
+}
+
+// ----------------------------------------------------------------------------
+// MyGridCellAttrProvider
+// ----------------------------------------------------------------------------
+
+MyGridCellAttrProvider::MyGridCellAttrProvider()
+{
+ m_attrForOddRows = new wxGridCellAttr;
+ m_attrForOddRows->SetBackgroundColour(*wxLIGHT_GREY);
+}
+
+MyGridCellAttrProvider::~MyGridCellAttrProvider()
+{
+ m_attrForOddRows->DecRef();
+}
+
+wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col,
+ wxGridCellAttr::wxAttrKind kind /* = wxGridCellAttr::Any */) const
+{
+ wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row, col, kind);
+
+ if ( row % 2 )
+ {
+ if ( !attr )
+ {
+ attr = m_attrForOddRows;
+ attr->IncRef();
+ }
+ else
+ {
+ if ( !attr->HasBackgroundColour() )
+ {
+ wxGridCellAttr *attrNew = attr->Clone();
+ attr->DecRef();
+ attr = attrNew;
+ attr->SetBackgroundColour(*wxLIGHT_GREY);
+ }
+ }
+ }
+
+ return attr;
+}
+
+// ----------------------------------------------------------------------------
+
+void GridFrame::OnTabularGrid(wxCommandEvent& )
+{
+ wxFrame* frame = new wxFrame(NULL, wxID_ANY, _T("A small tabular Grid"),
+ wxDefaultPosition, wxSize(640, 480));
+ wxGrid* grid = new wxGrid(frame, wxID_ANY, wxPoint(10,10), wxSize(40,40),
+ wxWANTS_CHARS | wxBORDER_SUNKEN);
+ grid->SetRowLabelSize( 0 );
+ grid->DisableDragRowSize();
+ grid->SetUseNativeColLabels();
+ grid->CreateGrid(10,10);
+ grid->SetSelectionMode( wxGrid::wxGridSelectRows );
+
+ frame->Show(true);
}
void GridFrame::OnVTable(wxCommandEvent& )
if ( s_sizeGrid != -1 )
{
BigGridFrame* win = new BigGridFrame(s_sizeGrid);
- win->Show(TRUE);
+ win->Show(true);
}
}
dc.DrawEllipse(rect);
}
-// ----------------------------------------------------------------------------
-// MyGridCellAttrProvider
-// ----------------------------------------------------------------------------
-
-MyGridCellAttrProvider::MyGridCellAttrProvider()
-{
- m_attrForOddRows = new wxGridCellAttr;
- m_attrForOddRows->SetBackgroundColour(*wxLIGHT_GREY);
-}
-
-MyGridCellAttrProvider::~MyGridCellAttrProvider()
-{
- m_attrForOddRows->DecRef();
-}
-
-wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col,
- wxGridCellAttr::wxAttrKind kind /* = wxGridCellAttr::Any */) const
-{
- wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row, col, kind);
-
- if ( row % 2 )
- {
- if ( !attr )
- {
- attr = m_attrForOddRows;
- attr->IncRef();
- }
- else
- {
- if ( !attr->HasBackgroundColour() )
- {
- wxGridCellAttr *attrNew = attr->Clone();
- attr->DecRef();
- attr = attrNew;
- attr->SetBackgroundColour(*wxLIGHT_GREY);
- }
- }
- }
-
- return attr;
-}
-
// ============================================================================
// BigGridFrame and BigGridTable: Sample of a non-standard table
// ============================================================================
BigGridFrame::BigGridFrame(long sizeGrid)
- : wxFrame(NULL, -1, _T("Plugin Virtual Table"),
+ : wxFrame(NULL, wxID_ANY, _T("Plugin Virtual Table"),
wxDefaultPosition, wxSize(500, 450))
{
- m_grid = new wxGrid(this, -1, wxDefaultPosition, wxDefaultSize);
+ m_grid = new wxGrid(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
m_table = new BigGridTable(sizeGrid);
// VZ: I don't understand why this slows down the display that much,
// must profile it...
//m_table->SetAttrProvider(new MyGridCellAttrProvider);
- m_grid->SetTable(m_table, TRUE);
+ m_grid->SetTable(m_table, true);
#if defined __WXMOTIF__
// MB: the grid isn't getting a sensible default size under wxMotif
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, _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 },
};
static const wxChar *headers[Col_Max] =
return Col_Max;
}
-bool BugsGridTable::IsEmptyCell( int row, int col )
+bool BugsGridTable::IsEmptyCell( int WXUNUSED(row), int WXUNUSED(col) )
{
- return FALSE;
+ return false;
}
wxString BugsGridTable::GetValue( int row, int col )
switch ( col )
{
case Col_Id:
+ return wxString::Format(_T("%d"), gd.id);
+
case Col_Priority:
+ return wxString::Format(_T("%d"), gd.prio);
+
case Col_Opened:
- wxFAIL_MSG(_T("unexpected column"));
- break;
+ return gd.opened ? _T("1") : _T("0");
case Col_Severity:
return severities[gd.severity];
}
}
-bool BugsGridTable::CanGetValueAs( int WXUNUSED(row), int col, const wxString& typeName )
+bool
+BugsGridTable::CanGetValueAs(int WXUNUSED(row),
+ int col,
+ const wxString& typeName)
{
if ( typeName == wxGRID_VALUE_STRING )
{
- return TRUE;
+ return true;
}
else if ( typeName == wxGRID_VALUE_BOOL )
{
}
else
{
- return FALSE;
+ return false;
}
}
{
wxFAIL_MSG(_T("unexpected column"));
- return FALSE;
+ return false;
}
}
return headers[col];
}
-BugsGridTable::BugsGridTable()
-{
-}
-
// ----------------------------------------------------------------------------
// BugsGridFrame
// ----------------------------------------------------------------------------
BugsGridFrame::BugsGridFrame()
- : wxFrame(NULL, -1, _T("Bugs table"),
- wxDefaultPosition, wxSize(500, 300))
+ : wxFrame(NULL, wxID_ANY, _T("Bugs table"))
{
- wxGrid *grid = new wxGrid(this, -1, wxDefaultPosition);
+ wxGrid *grid = new wxGrid(this, wxID_ANY, wxDefaultPosition);
wxGridTableBase *table = new BugsGridTable();
table->SetAttrProvider(new MyGridCellAttrProvider);
- grid->SetTable(table, TRUE);
+ grid->SetTable(table, true);
wxGridCellAttr *attrRO = new wxGridCellAttr,
*attrRangeEditor = new wxGridCellAttr,
grid->SetColAttr(Col_Priority, attrRangeEditor);
grid->SetColAttr(Col_Severity, attrCombo);
- grid->SetMargins(0, 0);
-
grid->Fit();
SetClientSize(grid->GetSize());
}