X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1618dca721f74bbbcbca4ab05ea9a136b551e93a..d8e41d423d1eceea65f0c8f8bfa2c242028feb5a:/samples/newgrid/griddemo.cpp?ds=sidebyside diff --git a/samples/newgrid/griddemo.cpp b/samples/newgrid/griddemo.cpp index 0b31be5e19..c8d754d620 100644 --- a/samples/newgrid/griddemo.cpp +++ b/samples/newgrid/griddemo.cpp @@ -68,6 +68,9 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_TOGGLEROWLABELS, GridFrame::ToggleRowLabels ) EVT_MENU( ID_TOGGLECOLLABELS, GridFrame::ToggleColLabels ) EVT_MENU( ID_TOGGLEEDIT, GridFrame::ToggleEditing ) + EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing ) + EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing ) + EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing ) EVT_MENU( ID_SETLABELCOLOUR, GridFrame::SetLabelColour ) EVT_MENU( ID_SETLABELTEXTCOLOUR, GridFrame::SetLabelTextColour ) EVT_MENU( ID_ROWLABELHORIZALIGN, GridFrame::SetRowLabelHorizAlignment ) @@ -87,6 +90,7 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) EVT_MENU( ID_ABOUT, GridFrame::About ) EVT_MENU( wxID_EXIT, GridFrame::OnQuit ) EVT_MENU( ID_VTABLE, GridFrame::OnVTable) + EVT_MENU( ID_BUGS_TABLE, GridFrame::OnBugsTable) EVT_GRID_LABEL_LEFT_CLICK( GridFrame::OnLabelLeftClick ) EVT_GRID_CELL_LEFT_CLICK( GridFrame::OnCellLeftClick ) @@ -110,7 +114,8 @@ GridFrame::GridFrame() int logW = gridW, logH = 100; wxMenu *fileMenu = new wxMenu; - fileMenu->Append( ID_VTABLE, "&Virtual table test"); + fileMenu->Append( ID_VTABLE, "&Virtual table test\tCtrl-V"); + fileMenu->Append( ID_BUGS_TABLE, "&Bugs table test\tCtrl-B"); fileMenu->AppendSeparator(); fileMenu->Append( wxID_EXIT, "E&xit\tAlt-X" ); @@ -118,6 +123,9 @@ GridFrame::GridFrame() 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 ); wxMenu *rowLabelMenu = new wxMenu; @@ -176,12 +184,11 @@ GridFrame::GridFrame() wxTE_MULTILINE ); logger = new wxLogTextCtrl( logWin ); - logger->SetActiveTarget( logger ); + m_logOld = logger->SetActiveTarget( logger ); logger->SetTimestamp( NULL ); // this will create a grid and, by default, an associated grid - // table for string data - // + // table for strings grid->CreateGrid( 100, 100 ); grid->SetRowSize( 0, 60 ); @@ -220,8 +227,19 @@ GridFrame::GridFrame() attr->SetBackgroundColour(*wxBLUE); grid->SetRowAttr(5, attr); - // VZ: cell borders don't look nice otherwise :-) (for now...) - grid->SetDefaultCellBackgroundColour(wxColour(200, 200, 180)); + grid->SetCellValue(2, 4, "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->SetColFormatFloat(6, 6, 2); + grid->SetCellValue(0, 6, "3.1415"); + grid->SetCellValue(1, 6, "1415"); + grid->SetCellValue(2, 6, "12345.67890"); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); topSizer->Add( grid, @@ -245,6 +263,7 @@ GridFrame::GridFrame() GridFrame::~GridFrame() { + delete wxLog::SetActiveTarget(m_logOld); } @@ -253,6 +272,9 @@ 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 ); } @@ -289,6 +311,26 @@ void GridFrame::ToggleEditing( wxCommandEvent& WXUNUSED(ev) ) } +void GridFrame::ToggleRowSizing( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->EnableDragRowSize( + GetMenuBar()->IsChecked( ID_TOGGLEROWSIZING ) ); +} + + +void GridFrame::ToggleColSizing( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->EnableDragColSize( + GetMenuBar()->IsChecked( ID_TOGGLECOLSIZING ) ); +} + +void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) ) +{ + grid->EnableDragGridSize( + GetMenuBar()->IsChecked( ID_TOGGLEGRIDSIZING ) ); +} + + void GridFrame::SetLabelColour( wxCommandEvent& WXUNUSED(ev) ) { wxColourDialog dlg( NULL ); @@ -610,15 +652,34 @@ void GridFrame::OnQuit( wxCommandEvent& WXUNUSED(ev) ) Close( TRUE ); } +void GridFrame::OnBugsTable(wxCommandEvent& ) +{ + BugsGridFrame *frame = new BugsGridFrame; + frame->Show(TRUE); +} + void GridFrame::OnVTable(wxCommandEvent& ) { static long s_sizeGrid = 10000; +#ifdef __WXMOTIF__ + // MB: wxGetNumberFromUser doesn't work properly for wxMotif + wxString s; + s << s_sizeGrid; + s = wxGetTextFromUser( "Size of the table to create", + "Size:", + s ); + + s.ToLong( &s_sizeGrid ); + +#else s_sizeGrid = wxGetNumberFromUser("Size of the table to create", "Size: ", "wxGridDemo question", s_sizeGrid, 0, 32000, this); +#endif + if ( s_sizeGrid != -1 ) { BigGridFrame* win = new BigGridFrame(s_sizeGrid); @@ -647,16 +708,376 @@ void MyGridCellRenderer::Draw(wxGrid& grid, dc.DrawEllipse(rect); } - // ---------------------------------------------------------------------------- -// BigGridFrame and BigGridTable: Sample of a non-standard table +// MyGridCellAttrProvider // ---------------------------------------------------------------------------- +MyGridCellAttrProvider::MyGridCellAttrProvider() +{ + m_attrForOddRows = new wxGridCellAttr; + m_attrForOddRows->SetBackgroundColour(*wxLIGHT_GREY); +} + +MyGridCellAttrProvider::~MyGridCellAttrProvider() +{ + m_attrForOddRows->DecRef(); +} + +wxGridCellAttr *MyGridCellAttrProvider::GetAttr(int row, int col) const +{ + wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row, col); + + 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, "Plugin Virtual Table", wxDefaultPosition, wxSize(500, 450)) { m_grid = new wxGrid(this, -1, 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); + +#if defined __WXMOTIF__ + // MB: the grid isn't getting a sensible default size under wxMotif + int cw, ch; + GetClientSize( &cw, &ch ); + m_grid->SetSize( cw, ch ); +#endif +} + +// ============================================================================ +// BugsGridFrame: a "realistic" table +// ============================================================================ + +// ---------------------------------------------------------------------------- +// bugs table data +// ---------------------------------------------------------------------------- + +enum Columns +{ + Col_Id, + Col_Summary, + Col_Severity, + Col_Priority, + Col_Platform, + Col_Opened, + Col_Max +}; + +enum Severity +{ + Sev_Wish, + Sev_Minor, + Sev_Normal, + Sev_Major, + Sev_Critical, + Sev_Max +}; + +static const wxChar* severities[] = +{ + _T("wishlist"), + _T("minor"), + _T("normal"), + _T("major"), + _T("critical"), +}; + +static struct BugsGridData +{ + int id; + wxChar summary[80]; + Severity severity; + int prio; + wxChar platform[12]; + 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 }, +}; + +static const wxChar *headers[Col_Max] = +{ + _T("Id"), + _T("Summary"), + _T("Severity"), + _T("Priority"), + _T("Platform"), + _T("Opened?"), +}; + +// ---------------------------------------------------------------------------- +// BugsGridTable +// ---------------------------------------------------------------------------- + +wxString BugsGridTable::GetTypeName(int WXUNUSED(row), int col) +{ + switch ( col ) + { + case Col_Id: + case Col_Priority: + return wxGRID_VALUE_NUMBER;; + + case Col_Severity: + // fall thorugh (TODO should be a list) + + case Col_Summary: + return wxString::Format(_T("%s:80"), wxGRID_VALUE_STRING); + + case Col_Platform: + return wxString::Format(_T("%s:all,MSW,GTK,other"), wxGRID_VALUE_CHOICE); + + case Col_Opened: + return wxGRID_VALUE_BOOL; + } + + wxFAIL_MSG(_T("unknown column")); + + return wxEmptyString; +} + +long BugsGridTable::GetNumberRows() +{ + return WXSIZEOF(gs_dataBugsGrid); +} + +long BugsGridTable::GetNumberCols() +{ + return Col_Max; +} + +bool BugsGridTable::IsEmptyCell( int row, int col ) +{ + return FALSE; +} + +wxString BugsGridTable::GetValue( int row, int col ) +{ + const BugsGridData& gd = gs_dataBugsGrid[row]; + + switch ( col ) + { + case Col_Id: + case Col_Priority: + case Col_Opened: + wxFAIL_MSG(_T("unexpected column")); + break; + + case Col_Severity: + return severities[gd.severity]; + + case Col_Summary: + return gd.summary; + + case Col_Platform: + return gd.platform; + } + + return wxEmptyString; +} + +void BugsGridTable::SetValue( int row, int col, const wxString& value ) +{ + BugsGridData& gd = gs_dataBugsGrid[row]; + + switch ( col ) + { + case Col_Id: + case Col_Priority: + case Col_Opened: + wxFAIL_MSG(_T("unexpected column")); + break; + + case Col_Severity: + { + size_t n; + for ( n = 0; n < WXSIZEOF(severities); n++ ) + { + if ( severities[n] == value ) + { + gd.severity = (Severity)n; + break; + } + } + + if ( n == WXSIZEOF(severities) ) + { + wxLogWarning(_T("Invalid severity value '%s'."), + value.c_str()); + gd.severity = Sev_Normal; + } + } + break; + + case Col_Summary: + wxStrncpy(gd.summary, value, WXSIZEOF(gd.summary)); + break; + + case Col_Platform: + wxStrncpy(gd.platform, value, WXSIZEOF(gd.platform)); + break; + } +} + +bool BugsGridTable::CanGetValueAs( int WXUNUSED(row), int col, const wxString& typeName ) +{ + if ( typeName == wxGRID_VALUE_STRING ) + { + return TRUE; + } + else if ( typeName == wxGRID_VALUE_BOOL ) + { + return col == Col_Opened; + } + else if ( typeName == wxGRID_VALUE_NUMBER ) + { + return col == Col_Id || col == Col_Priority || col == Col_Severity; + } + else + { + return FALSE; + } +} + +bool BugsGridTable::CanSetValueAs( int row, int col, const wxString& typeName ) +{ + return CanGetValueAs(row, col, typeName); +} + +long BugsGridTable::GetValueAsLong( int row, int col ) +{ + const BugsGridData& gd = gs_dataBugsGrid[row]; + + switch ( col ) + { + case Col_Id: + return gd.id; + + case Col_Priority: + return gd.prio; + + case Col_Severity: + return gd.severity; + + default: + wxFAIL_MSG(_T("unexpected column")); + return -1; + } +} + +bool BugsGridTable::GetValueAsBool( int row, int col ) +{ + if ( col == Col_Opened ) + { + return gs_dataBugsGrid[row].opened; + } + else + { + wxFAIL_MSG(_T("unexpected column")); + + return FALSE; + } +} + +void BugsGridTable::SetValueAsLong( int row, int col, long value ) +{ + BugsGridData& gd = gs_dataBugsGrid[row]; + + switch ( col ) + { + case Col_Priority: + gd.prio = value; + break; + + default: + wxFAIL_MSG(_T("unexpected column")); + } +} + +void BugsGridTable::SetValueAsBool( int row, int col, bool value ) +{ + if ( col == Col_Opened ) + { + gs_dataBugsGrid[row].opened = value; + } + else + { + wxFAIL_MSG(_T("unexpected column")); + } +} + +wxString BugsGridTable::GetColLabelValue( int col ) +{ + return headers[col]; +} + +BugsGridTable::BugsGridTable() +{ +} + +// ---------------------------------------------------------------------------- +// BugsGridFrame +// ---------------------------------------------------------------------------- + +BugsGridFrame::BugsGridFrame() + : wxFrame(NULL, -1, "Bugs table", + wxDefaultPosition, wxSize(500, 300)) +{ + wxGrid *grid = new wxGrid(this, -1, wxDefaultPosition); + wxGridTableBase *table = new BugsGridTable(); + table->SetAttrProvider(new MyGridCellAttrProvider); + grid->SetTable(table, TRUE); + + wxGridCellAttr *attrRO = new wxGridCellAttr, + *attrRangeEditor = new wxGridCellAttr, + *attrCombo = new wxGridCellAttr; + + attrRO->SetReadOnly(); + attrRangeEditor->SetEditor(new wxGridCellNumberEditor(1, 5)); + attrCombo->SetEditor(new wxGridCellChoiceEditor(WXSIZEOF(severities), + severities)); + + grid->SetColAttr(Col_Id, attrRO); + grid->SetColAttr(Col_Priority, attrRangeEditor); + grid->SetColAttr(Col_Severity, attrCombo); + + grid->SetMargins(0, 0); + + grid->Fit(); + wxSize size = grid->GetSize(); + size.x += 10; + size.y += 10; + SetClientSize(size); }