From: Robin Dunn Date: Wed, 25 Nov 1998 08:17:50 +0000 (+0000) Subject: Converted the virtual-methods-callbacks into real events, leaving the X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1f481e6a253d4bb2b5237d941311ef3b0f5b214b Converted the virtual-methods-callbacks into real events, leaving the original virtuals intact so as to not break any existing code. Needed for wxPython. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1042 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/generic/gridg.h b/include/wx/generic/gridg.h index bf05ca26d3..ad5246d2cc 100644 --- a/include/wx/generic/gridg.h +++ b/include/wx/generic/gridg.h @@ -20,6 +20,7 @@ #include "wx/panel.h" #include "wx/string.h" #include "wx/scrolbar.h" +#include "wx/event.h" #define wxGRID_DEFAULT_EDIT_WIDTH 300 #define wxGRID_DEFAULT_EDIT_HEIGHT 27 @@ -40,8 +41,9 @@ #define wxRIGHT 0x0800 #endif -#define WXGENERIC_GRID_VERSION 0.4 +#define WXGENERIC_GRID_VERSION 0.5 +class WXDLLEXPORT wxGridEvent; class WXDLLEXPORT wxGridCell; class WXDLLEXPORT wxGenericGrid: public wxPanel { @@ -100,13 +102,13 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel void SetCellTextFont(wxFont *fnt, int row, int col); wxBitmap *GetCellBitmap(int row, int col); void SetCellBitmap(wxBitmap *bitmap, int row, int col); - + // Size accessors void SetColumnWidth(int col, int width); int GetColumnWidth(int col); void SetRowHeight(int row, int height); int GetRowHeight(int row); - + // Label accessors void SetLabelSize(int orientation, int sz); int GetLabelSize(int orientation); @@ -148,18 +150,22 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel virtual void OnSelectCellImplementation(wxDC *dc, int row, int col); virtual void OnSelectCell(int WXUNUSED(row), int WXUNUSED(col)) {}; + virtual void _OnSelectCell(wxGridEvent& event); // Override to create your own class of grid cell virtual wxGridCell *OnCreateCell(void); - + virtual void _OnCreateCell(wxGridEvent& event); + // Override to change labels e.g. creation of grid, inserting/deleting a row/col. // By default, auto-labels the grid. virtual void OnChangeLabels(void); + virtual void _OnChangeLabels(wxGridEvent& event); // Override to change the label of the edit field when selecting a cell // By default, sets it to e.g. A12 virtual void OnChangeSelectionLabel(void); - + virtual void _OnChangeSelectionLabel(wxGridEvent& event); + // Override for event processing virtual void OnCellChange(int WXUNUSED(row), int WXUNUSED(col)) {}; virtual void OnCellLeftClick(int WXUNUSED(row), int WXUNUSED(col), int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(control), bool WXUNUSED(shift)) {}; @@ -167,6 +173,13 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel virtual void OnLabelLeftClick(int WXUNUSED(row), int WXUNUSED(col), int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(control), bool WXUNUSED(shift)) {}; virtual void OnLabelRightClick(int WXUNUSED(row), int WXUNUSED(col), int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(control), bool WXUNUSED(shift)) {}; + virtual void _OnCellChange(wxGridEvent& event); + virtual void _OnCellLeftClick(wxGridEvent& event); + virtual void _OnCellRightClick(wxGridEvent& event); + virtual void _OnLabelLeftClick(wxGridEvent& event); + virtual void _OnLabelRightClick(wxGridEvent& event); + + // Activation: call from wxFrame::OnActivate void OnActivate(bool active); @@ -225,7 +238,7 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel int m_totalRows; int m_totalCols; - + // Row and column we're currently looking at int m_scrollPosX; int m_scrollPosY; @@ -246,7 +259,7 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel short* m_colWidths; // Dynamically allocated short* m_rowHeights; // Dynamically allocated int m_scrollWidth; // Vert. scroll width, horiz. scroll height - + // Colours wxColour m_cellTextColour; wxColour m_cellBackgroundColour; @@ -260,7 +273,7 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel // Position of Edit control wxRectangle m_editControlPosition; - + // Drag status int m_dragStatus; int m_dragRowOrCol; @@ -292,7 +305,7 @@ class WXDLLEXPORT wxGridCell: public wxObject wxGridCell(wxGenericGrid *window = (wxGenericGrid *) NULL); ~wxGridCell(void); - + virtual wxString& GetTextValue(void) { return textValue; } virtual void SetTextValue(const wxString& str) { textValue = str; } inline wxFont *GetFont(void) { return font; } @@ -320,5 +333,58 @@ class WXDLLEXPORT wxGrid: public wxGenericGrid } }; + + + +class WXDLLEXPORT wxGridEvent : public wxCommandEvent { + DECLARE_DYNAMIC_CLASS(wxGridEvent) +public: + wxGridEvent() + : wxCommandEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1), + m_control(0), m_shift(0), m_cell(0) + {} + + wxGridEvent(int id, wxEventType type, wxObject* obj, + int row=-1, int col=-1, int x=-1, int y=-1, + bool control=FALSE, bool shift=FALSE) + : wxCommandEvent(type, id), m_row(row), m_col(col), m_x(x), m_y(y), + m_control(control), m_shift(shift), m_cell(0) + { + SetEventObject(obj); + } + + + int m_row; + int m_col; + int m_x; + int m_y; + bool m_control; + bool m_shift; + wxGridCell* m_cell; +}; + +const wxEventType wxEVT_GRID_SELECT_CELL = wxEVT_FIRST + 1575; +const wxEventType wxEVT_GRID_CREATE_CELL = wxEVT_FIRST + 1576; +const wxEventType wxEVT_GRID_CHANGE_LABELS = wxEVT_FIRST + 1577; +const wxEventType wxEVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578; +const wxEventType wxEVT_GRID_CELL_CHANGE = wxEVT_FIRST + 1579; +const wxEventType wxEVT_GRID_CELL_LCLICK = wxEVT_FIRST + 1580; +const wxEventType wxEVT_GRID_CELL_RCLICK = wxEVT_FIRST + 1581; +const wxEventType wxEVT_GRID_LABEL_LCLICK = wxEVT_FIRST + 1582; +const wxEventType wxEVT_GRID_LABEL_RCLICK = wxEVT_FIRST + 1583; + + +typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); + +#define EVT_GRID_SELECT_CELL(fn) { wxEVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CREATE_CELL(fn) { wxEVT_GRID_CREATE_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CHANGE_LABELS(fn) { wxEVT_GRID_CHANGE_LABELS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CHANGE_SEL_LABEL(fn) { wxEVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CELL_CHANGE(fn) { wxEVT_GRID_CELL_CHANGE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CELL_LCLICK(fn) { wxEVT_GRID_CELL_LCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_CELL_RCLICK(fn) { wxEVT_GRID_CELL_RCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_LABEL_LCLICK(fn) { wxEVT_GRID_LABEL_LCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, +#define EVT_GRID_LABEL_RCLICK(fn) { wxEVT_GRID_LABEL_RCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL }, + #endif diff --git a/src/generic/gridg.cpp b/src/generic/gridg.cpp index 1db2cede13..3fcd53134c 100644 --- a/src/generic/gridg.cpp +++ b/src/generic/gridg.cpp @@ -43,6 +43,7 @@ #define wxGRID_DRAG_UP_DOWN 2 IMPLEMENT_DYNAMIC_CLASS(wxGenericGrid, wxPanel) +IMPLEMENT_DYNAMIC_CLASS(wxGridEvent, wxEvent) BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) EVT_SIZE(wxGenericGrid::OnSize) @@ -52,8 +53,23 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText) EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll) EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll) + + // default wxGridEvent handlers + EVT_GRID_SELECT_CELL(wxGenericGrid::_OnSelectCell) + EVT_GRID_CREATE_CELL(wxGenericGrid::_OnCreateCell) + EVT_GRID_CHANGE_LABELS(wxGenericGrid::_OnChangeLabels) + EVT_GRID_CHANGE_SEL_LABEL(wxGenericGrid::_OnChangeSelectionLabel) + EVT_GRID_CELL_CHANGE(wxGenericGrid::_OnCellChange) + EVT_GRID_CELL_LCLICK(wxGenericGrid::_OnCellLeftClick) + EVT_GRID_CELL_RCLICK(wxGenericGrid::_OnCellRightClick) + EVT_GRID_LABEL_LCLICK(wxGenericGrid::_OnLabelLeftClick) + EVT_GRID_LABEL_RCLICK(wxGenericGrid::_OnLabelRightClick) + END_EVENT_TABLE() + + + wxGenericGrid::wxGenericGrid(void) { m_batchCount = 0; @@ -147,7 +163,7 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_horizontalSashCursor = new wxCursor(wxCURSOR_SIZEWE); m_verticalSashCursor = new wxCursor(wxCURSOR_SIZENS); } - + SetLabelBackgroundColour(m_labelBackgroundColour); m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT; @@ -195,7 +211,7 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_textItem->Show(TRUE); m_textItem->SetFocus(); int controlW, controlH; - + m_textItem->GetSize(&controlW, &controlH); m_editControlPosition.height = controlH; @@ -283,7 +299,10 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor for (j = 0; j < nCols; j++) if (cellValues) { - m_gridCells[i][j] = OnCreateCell(); + //m_gridCells[i][j] = OnCreateCell(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CREATE_CELL, this, i, j); + GetEventHandler()->ProcessEvent(g_evt); + m_gridCells[i][j] = g_evt.m_cell; m_gridCells[i][j]->SetTextValue(cellValues[i][j]); } else @@ -328,9 +347,14 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor AdjustScrollbars(); - OnChangeLabels(); - OnChangeSelectionLabel(); - + //OnChangeLabels(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_LABELS, this); + GetEventHandler()->ProcessEvent(g_evt); + + //OnChangeSelectionLabel(); + wxGridEvent g_evt2(GetId(), wxEVT_GRID_CHANGE_SEL_LABEL, this); + GetEventHandler()->ProcessEvent(g_evt2); + return TRUE; } @@ -339,7 +363,7 @@ void wxGenericGrid::UpdateDimensions(void) { int canvasWidth, canvasHeight; GetSize(&canvasWidth, &canvasHeight); - + if (m_editCreated && m_editable) { int controlW, controlH; @@ -365,7 +389,7 @@ void wxGenericGrid::UpdateDimensions(void) else m_bottomOfSheet += m_rowHeights[i]; } - + m_totalGridWidth = m_leftOfSheet + m_verticalLabelWidth; for (i = 0; i < m_totalCols; i++) { @@ -385,11 +409,14 @@ wxGridCell *wxGenericGrid::GetCell(int row, int col) if ((row >= m_totalRows) || (col >= m_totalCols)) return (wxGridCell *) NULL; - + wxGridCell *cell = m_gridCells[row][col]; if (!cell) { - m_gridCells[row][col] = OnCreateCell(); + // m_gridCells[row][col] = OnCreateCell(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CREATE_CELL, this, row, col); + GetEventHandler()->ProcessEvent(g_evt); + m_gridCells[row][col] = g_evt.m_cell; return m_gridCells[row][col]; } else @@ -553,7 +580,7 @@ void wxGenericGrid::DrawGridLines(wxDC *dc) { int cw, ch; GetClientSize(&cw, &ch); - + int i; if (m_divisionPen) @@ -715,7 +742,7 @@ void wxGenericGrid::DrawColumnLabels(wxDC *dc) if (m_horizontalLabelHeight == 0) return; - + int i; wxRectangle rect; @@ -726,7 +753,7 @@ void wxGenericGrid::DrawColumnLabels(wxDC *dc) dc->SetTextBackground(m_labelBackgroundColour); dc->SetBackgroundMode(wxTRANSPARENT); // dc->SetTextForeground(m_labelTextColour); - + int widthCount = m_leftOfSheet + m_verticalLabelWidth; for (i = m_scrollPosX; i < m_totalCols; i++) { @@ -771,7 +798,7 @@ void wxGenericGrid::DrawRowLabels(wxDC *dc) int i; wxRectangle rect; - + // Draw numbers for rows rect.x = m_leftOfSheet; rect.width = m_verticalLabelWidth; @@ -790,7 +817,7 @@ void wxGenericGrid::DrawRowLabels(wxDC *dc) rect.y = 1 + heightCount; rect.height = m_rowHeights[i]; DrawRowLabel(dc, &rect, i); - + heightCount += m_rowHeights[i]; } } @@ -820,7 +847,7 @@ void wxGenericGrid::DrawCells(wxDC *dc) GetClientSize(&cw, &ch); int i,j; - + // Draw value corresponding to each cell for (i = m_scrollPosY; i < m_totalRows; i++) { @@ -849,7 +876,7 @@ void wxGenericGrid::DrawCellBackground(wxDC *dc, wxRectangle *rect, int row, int { dc->SetBrush(*cell->GetBackgroundBrush()); dc->SetPen(*wxTRANSPARENT_PEN); - + #if 0 // In wxWin 2.0 the dc code is exact. RR. #ifdef __WXMOTIF__ dc->DrawRectangle(rect->x+1, rect->y+1, rect->width-1, rect->height-1); @@ -897,7 +924,7 @@ void wxGenericGrid::AdjustScrollbars(void) { int cw, ch; GetClientSize(&cw, &ch); - + // We find the view size by seeing how many rows/cols fit on // the current view. // BUT... this means that the scrollbar should be adjusted every time @@ -914,10 +941,10 @@ void wxGenericGrid::AdjustScrollbars(void) vertScrollBarWidth = 0; if (m_hScrollBar && !m_hScrollBar->IsShown()) horizScrollBarHeight = 0; - + int noHorizSteps = 0; int noVertSteps = 0; - + if (m_totalGridWidth + vertScrollBarWidth <= cw) noHorizSteps = 0; else @@ -938,7 +965,7 @@ void wxGenericGrid::AdjustScrollbars(void) nx ++; } - + noHorizSteps += nx; } if (m_totalGridHeight + horizScrollBarHeight <= ch) @@ -960,10 +987,10 @@ void wxGenericGrid::AdjustScrollbars(void) else ny ++; } - + noVertSteps += ny; } - + if (m_totalGridWidth + vertScrollBarWidth <= cw) { if ( m_hScrollBar ) @@ -1005,7 +1032,7 @@ void wxGenericGrid::AdjustScrollbars(void) m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth -2, cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth); } - + if (m_vScrollBar) { int nRows = GetRows(); @@ -1022,7 +1049,7 @@ void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) ) return; AdjustScrollbars(); - + int cw, ch; GetClientSize(&cw, &ch); @@ -1045,7 +1072,7 @@ bool wxGenericGrid::CellHitTest(int x, int y, int *row, int *col) y -= (m_topOfSheet + m_horizontalLabelHeight); int i; - + // Now we need to do a hit test for which row we're on int currentHeight = 0; for (i = m_scrollPosY; i < m_totalRows; i++) @@ -1057,7 +1084,7 @@ bool wxGenericGrid::CellHitTest(int x, int y, int *row, int *col) } currentHeight += m_rowHeights[i]; } - + // Now we need to do a hit test for which column we're on int currentWidth = 0; for (i = m_scrollPosX; i < m_totalCols; i++) @@ -1078,7 +1105,7 @@ bool wxGenericGrid::LabelSashHitTest(int x, int y, int *orientation, int *rowOrC { int i; int tolerance = 3; - + if (x >= (m_leftOfSheet + m_verticalLabelWidth) && y >= m_topOfSheet && x <= m_rightOfSheet && y <= (m_topOfSheet + m_horizontalLabelHeight)) { @@ -1176,16 +1203,27 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) { wxClientDC dc(this); dc.BeginDrawing(); - + int row, col; if (CellHitTest((int)ev.GetX(), (int)ev.GetY(), &row, &col)) { OnSelectCellImplementation(& dc, row, col); - OnCellLeftClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + + //OnCellLeftClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_LCLICK, this, + row, col, (int)ev.GetX(), (int)ev.GetY(), + ev.ControlDown(), ev.ShiftDown()); + GetEventHandler()->ProcessEvent(g_evt); + } if (LabelHitTest((int)ev.GetX(), (int)ev.GetY(), &row, &col)) { - OnLabelLeftClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + //OnLabelLeftClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_LABEL_LCLICK, this, + row, col, (int)ev.GetX(), (int)ev.GetY(), + ev.ControlDown(), ev.ShiftDown()); + GetEventHandler()->ProcessEvent(g_evt); + } dc.EndDrawing(); } @@ -1218,7 +1256,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) else dc.DrawLine(m_leftOfSheet, (int)ev.GetY(), m_rightOfSheet, (int)ev.GetY()); dc.EndDrawing(); - + CaptureMouse(); } break; @@ -1322,11 +1360,20 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) int row, col; if (CellHitTest((int)ev.GetX(), (int)ev.GetY(), &row, &col)) { - OnCellRightClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + //OnCellRightClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_RCLICK, this, + row, col, (int)ev.GetX(), (int)ev.GetY(), + ev.ControlDown(), ev.ShiftDown()); + GetEventHandler()->ProcessEvent(g_evt); + } if (LabelHitTest((int)ev.GetX(), (int)ev.GetY(), &row, &col)) { - OnLabelRightClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + //OnLabelRightClick(row, col, (int)ev.GetX(), (int)ev.GetY(), ev.ControlDown(), ev.ShiftDown()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_LABEL_RCLICK, this, + row, col, (int)ev.GetX(), (int)ev.GetY(), + ev.ControlDown(), ev.ShiftDown()); + GetEventHandler()->ProcessEvent(g_evt); } } } @@ -1336,7 +1383,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) m_wCursorColumn = col; m_wCursorRow = row; - OnChangeSelectionLabel(); + //OnChangeSelectionLabel(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_SEL_LABEL, this); + GetEventHandler()->ProcessEvent(g_evt); SetGridClippingRegion(dc); @@ -1361,11 +1410,13 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) // Probably because of the SetValue?? // Arrrrrgh. This isn't needed anywhere, of course. RR. #ifndef __WXMSW__ -// HighlightCell(dc); +// HighlightCell(dc); #endif dc->DestroyClippingRegion(); - - OnSelectCell(row, col); + + //OnSelectCell(row, col); + wxGridEvent g_evt2(GetId(), wxEVT_GRID_SELECT_CELL, this, row, col); + GetEventHandler()->ProcessEvent(g_evt2); } wxGridCell *wxGenericGrid::OnCreateCell(void) @@ -1403,10 +1454,10 @@ void wxGenericGrid::OnChangeSelectionLabel(void) { if (!GetEditable()) return; - + wxString rowLabel(GetLabelValue(wxVERTICAL, GetCursorRow())); wxString colLabel(GetLabelValue(wxHORIZONTAL, GetCursorColumn())); - + wxString newLabel = colLabel + rowLabel; if ((newLabel.Length() > 0) && (newLabel.Length() <= 8) && GetTextItem()) { @@ -1417,26 +1468,26 @@ void wxGenericGrid::OnChangeSelectionLabel(void) void wxGenericGrid::HighlightCell(wxDC *dc) { dc->SetLogicalFunction(wxINVERT); - + // Top - dc->DrawLine( m_currentRect.x + 1, - m_currentRect.y + 1, - m_currentRect.x + m_currentRect.width - 1, + dc->DrawLine( m_currentRect.x + 1, + m_currentRect.y + 1, + m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + 1); // Right - dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, + dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + 1, - m_currentRect.x + m_currentRect.width - 1, + m_currentRect.x + m_currentRect.width - 1, m_currentRect.y +m_currentRect.height - 1 ); // Bottom - dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, + dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + m_currentRect.height - 1, - m_currentRect.x + 1, + m_currentRect.x + 1, m_currentRect.y + m_currentRect.height - 1); // Left - dc->DrawLine( m_currentRect.x + 1, - m_currentRect.y + m_currentRect.height - 1, - m_currentRect.x + 1, + dc->DrawLine( m_currentRect.x + 1, + m_currentRect.y + m_currentRect.height - 1, + m_currentRect.x + 1, m_currentRect.y + 1); dc->SetLogicalFunction(wxCOPY); @@ -1446,11 +1497,11 @@ void wxGenericGrid::DrawCellText(void) { if (!m_currentRectVisible) return; - + wxGridCell *cell = GetCell(GetCursorRow(), GetCursorColumn()); if (!cell) return; - + static char szEdit[300]; wxClientDC dc(this); @@ -1472,9 +1523,9 @@ void wxGenericGrid::DrawCellText(void) DrawTextRect(& dc, " ", &rect, wxLEFT); DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment()); - + dc.DestroyClippingRegion(); - + dc.SetBackgroundMode(wxSOLID); dc.EndDrawing(); @@ -1510,9 +1561,9 @@ static bool wxRectIntersection(wxRectangle *rect1, wxRectangle *rect2, wxRectang int x2_2 = rect2->x + rect2->width; int y2_2 = rect2->y + rect2->height; - + int x2_3, y2_3; - + // Check for intersection if ((rect1->x > x2_2) || (rect2->x > x2_1) || (rect1->y > y2_2) || (rect2->y > y2_1)) @@ -1530,7 +1581,7 @@ static bool wxRectIntersection(wxRectangle *rect1, wxRectangle *rect2, wxRectang rect3->y = rect1->y; else rect3->y = rect2->y; - + if (x2_1 > x2_2) x2_3 = x2_2; else @@ -1539,7 +1590,7 @@ static bool wxRectIntersection(wxRectangle *rect1, wxRectangle *rect2, wxRectang y2_3 = y2_2; else y2_3 = y2_1; - + rect3->width = (int)(x2_3 - rect3->x); rect3->height = (int)(y2_3 - rect3->y); return TRUE; @@ -1548,22 +1599,22 @@ static bool wxRectIntersection(wxRectangle *rect1, wxRectangle *rect2, wxRectang void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *rect, int flag) { dc->BeginDrawing(); - + // Ultimately, this functionality should be built into wxWindows, // and optimized for each platform. E.g. on Windows, use DrawText // passing a clipping rectangle, so that the wxWindows clipping region // does not have to be used to implement this. - + // If we're already clipping, we need to find the intersection // between current clipping area and text clipping area. - + wxRectangle clipRect; wxRectangle clipRect2; long clipX, clipY, clipW, clipH; dc->GetClippingBox(&clipX, &clipY, &clipW, &clipH); clipRect.x = (int)clipX; clipRect.y = (int)clipY; clipRect.width = (int)clipW; clipRect.height = (int)clipH; - + bool alreadyClipping = TRUE; if (clipRect.x == 0 && clipRect.y == 0 && clipRect.width == 0 && clipRect.height == 0) @@ -1581,12 +1632,12 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *re if (alreadyClipping) dc->DestroyClippingRegion(); - + dc->SetClippingRegion(clipRect2.x, clipRect2.y, clipRect2.width, clipRect2.height); long textWidth, textHeight; - + dc->GetTextExtent(text, &textWidth, &textHeight); - + // Do alignment float x,y; switch (flag) @@ -1612,7 +1663,7 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *re } } dc->DrawText(text, (long)x, (long)y ); - + dc->DestroyClippingRegion(); // Restore old clipping @@ -1625,22 +1676,22 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *re void wxGenericGrid::DrawBitmapRect(wxDC *dc, wxBitmap *bitmap, wxRectangle *rect, int flag) { dc->BeginDrawing(); - + // Ultimately, this functionality should be built into wxWindows, // and optimized for each platform. E.g. on Windows, use DrawText // passing a clipping rectangle, so that the wxWindows clipping region // does not have to be used to implement this. - + // If we're already clipping, we need to find the intersection // between current clipping area and text clipping area. - + wxRectangle clipRect; wxRectangle clipRect2; long clipX, clipY, clipW, clipH; dc->GetClippingBox(&clipX, &clipY, &clipW, &clipH); clipRect.x = (int)clipX; clipRect.y = (int)clipY; clipRect.width = (int)clipW; clipRect.height = (int)clipH; - + bool alreadyClipping = TRUE; if (clipRect.x == 0 && clipRect.y == 0 && clipRect.width == 0 && clipRect.height == 0) @@ -1658,13 +1709,13 @@ void wxGenericGrid::DrawBitmapRect(wxDC *dc, wxBitmap *bitmap, wxRectangle *rect if (alreadyClipping) dc->DestroyClippingRegion(); - + dc->SetClippingRegion(clipRect2.x, clipRect2.y, clipRect2.width, clipRect2.height); float bitmapWidth, bitmapHeight; - + bitmapWidth = bitmap->GetWidth(); bitmapHeight = bitmap->GetHeight(); - + // Do alignment long x,y; switch (flag) @@ -1691,10 +1742,10 @@ void wxGenericGrid::DrawBitmapRect(wxDC *dc, wxBitmap *bitmap, wxRectangle *rect } wxMemoryDC dcTemp; dcTemp.SelectObject(*bitmap); - + dc->Blit( (long)x, (long)y, (long)bitmapWidth, (long)bitmapHeight, &dcTemp, 0, 0); dcTemp.SelectObject(wxNullBitmap); - + dc->DestroyClippingRegion(); // Restore old clipping @@ -1735,7 +1786,7 @@ void wxGenericGrid::RefreshCell(int row, int col, bool setText) // Don't refresh within a pair of batch brackets if (GetBatchCount() > 0) return; - + int cw, ch; GetClientSize(&cw, &ch); @@ -1767,7 +1818,7 @@ void wxGenericGrid::RefreshCell(int row, int col, bool setText) wxString& wxGenericGrid::GetCellValue(int row, int col) { static wxString emptyString(""); - + wxGridCell *cell = GetCell(row, col); if (cell) return cell->GetTextValue(); @@ -1923,7 +1974,7 @@ void wxGenericGrid::SetEditable(bool edit) int cw, ch; int m_scrollWidth = 16; GetClientSize(&cw, &ch); - + if (m_vScrollBar) m_vScrollBar->SetSize(cw - m_scrollWidth, m_topOfSheet, m_scrollWidth, ch - m_topOfSheet - m_scrollWidth); @@ -2073,7 +2124,7 @@ bool wxGenericGrid::InsertCols(int pos, int n, bool updateLabels) { if (pos > m_totalCols) return FALSE; - + if (!m_gridCells) return CreateGrid(1, n); else @@ -2090,7 +2141,7 @@ bool wxGenericGrid::InsertCols(int pos, int n, bool updateLabels) newCols[j] = new wxGridCell(this); for (j = pos + n; j < m_totalCols + n; j++) newCols[j] = cols[j - n]; - + delete[] cols; m_gridCells[i] = newCols; } @@ -2120,8 +2171,12 @@ bool wxGenericGrid::InsertCols(int pos, int n, bool updateLabels) m_totalCols += n; - if (updateLabels) - OnChangeLabels(); + if (updateLabels) { + //OnChangeLabels(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_LABELS, this); + GetEventHandler()->ProcessEvent(g_evt); + } + UpdateDimensions(); AdjustScrollbars(); return TRUE; @@ -2132,13 +2187,13 @@ bool wxGenericGrid::InsertRows(int pos, int n, bool updateLabels) { if (pos > m_totalRows) return FALSE; - + if (!m_gridCells) return CreateGrid(n, 1); else { int i, j; - + wxGridCell ***rows = new wxGridCell **[m_totalRows + n]; // Cells @@ -2151,7 +2206,7 @@ bool wxGenericGrid::InsertRows(int pos, int n, bool updateLabels) for (j = 0; j < m_totalCols; j++) rows[i][j] = new wxGridCell(this); } - + for (i = pos + n; i < m_totalRows + n; i++) rows[i] = m_gridCells[i - n]; @@ -2183,8 +2238,12 @@ bool wxGenericGrid::InsertRows(int pos, int n, bool updateLabels) m_totalRows += n; - if (updateLabels) - OnChangeLabels(); + if (updateLabels) { + //OnChangeLabels(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_LABELS, this); + GetEventHandler()->ProcessEvent(g_evt); + } + UpdateDimensions(); AdjustScrollbars(); return TRUE; @@ -2209,7 +2268,7 @@ bool wxGenericGrid::DeleteRows(int pos, int n, bool updateLabels) return FALSE; int i; - + wxGridCell ***rows = new wxGridCell **[m_totalRows - n]; // Cells @@ -2243,8 +2302,11 @@ bool wxGenericGrid::DeleteRows(int pos, int n, bool updateLabels) m_totalRows -= n; - if (updateLabels) - OnChangeLabels(); + if (updateLabels){ + //OnChangeLabels(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_LABELS, this); + GetEventHandler()->ProcessEvent(g_evt); + } UpdateDimensions(); AdjustScrollbars(); return TRUE; @@ -2270,7 +2332,7 @@ bool wxGenericGrid::DeleteCols(int pos, int n, bool updateLabels) delete cols[j]; for (j = pos + n; j < m_totalCols; j++) newCols[j-n] = cols[j]; - + delete[] cols; m_gridCells[i] = newCols; } @@ -2296,8 +2358,11 @@ bool wxGenericGrid::DeleteCols(int pos, int n, bool updateLabels) m_totalCols -= n; - if (updateLabels) - OnChangeLabels(); + if (updateLabels) { + //OnChangeLabels(); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CHANGE_LABELS, this); + GetEventHandler()->ProcessEvent(g_evt); + } UpdateDimensions(); AdjustScrollbars(); return TRUE; @@ -2307,18 +2372,18 @@ void wxGenericGrid::SetGridCursor(int row, int col) { if (row >= m_totalRows || col >= m_totalCols) return; - + if (row == GetCursorRow() && col == GetCursorColumn()) return; - + wxClientDC dc(this); dc.BeginDrawing(); - + SetGridClippingRegion(& dc); if (m_currentRectVisible) HighlightCell(& dc); - + m_wCursorRow = row; m_wCursorColumn = col; @@ -2337,7 +2402,7 @@ void wxGenericGrid::SetGridCursor(int row, int col) /* * Grid cell */ - + wxGridCell::wxGridCell(wxGenericGrid *window) { cellBitmap = (wxBitmap *) NULL; @@ -2351,14 +2416,14 @@ wxGridCell::wxGridCell(wxGenericGrid *window) backgroundColour = window->GetCellBackgroundColour(); else backgroundColour.Set(255,255,255); - + if (window) font = window->GetCellTextFont(); else font = wxTheFontList->FindOrCreateFont(12, wxSWISS, wxNORMAL, wxNORMAL); - + SetBackgroundColour(backgroundColour); - + if (window) alignment = window->GetCellAlignment(); else @@ -2391,9 +2456,12 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) ) grid->HighlightCell(& dc); dc.DestroyClippingRegion(); dc.EndDrawing(); - - grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn()); - + + //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid, + grid->GetCursorRow(), grid->GetCursorColumn()); + GetEventHandler()->ProcessEvent(g_evt); + // grid->DrawCellText(); } } @@ -2409,7 +2477,7 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) wxGenericGrid *win = this; bool change = FALSE; - + if (ev.GetEventObject() == win->GetHorizScrollBar()) { change = (ev.GetPosition() != m_scrollPosX); @@ -2432,5 +2500,57 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) if (change) win->Refresh(FALSE); inScroll = FALSE; - + } + + +//---------------------------------------------------------------------- +// Default wxGridEvent handlers +// (just redirect to the pre-existing virtual methods) + +void wxGenericGrid::_OnSelectCell(wxGridEvent& ev) +{ + OnSelectCell(ev.m_row, ev.m_col); +} + +void wxGenericGrid::_OnCreateCell(wxGridEvent& ev) +{ + ev.m_cell = OnCreateCell(); +} + +void wxGenericGrid::_OnChangeLabels(wxGridEvent& ev) +{ + OnChangeLabels(); +} + +void wxGenericGrid::_OnChangeSelectionLabel(wxGridEvent& ev) +{ + OnChangeSelectionLabel(); +} + +void wxGenericGrid::_OnCellChange(wxGridEvent& ev) +{ + OnCellChange(ev.m_row, ev.m_col); +} + +void wxGenericGrid::_OnCellLeftClick(wxGridEvent& ev) +{ + OnCellLeftClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); +} + +void wxGenericGrid::_OnCellRightClick(wxGridEvent& ev) +{ + OnCellRightClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); +} + +void wxGenericGrid::_OnLabelLeftClick(wxGridEvent& ev) +{ + OnLabelLeftClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); +} + +void wxGenericGrid::_OnLabelRightClick(wxGridEvent& ev) +{ + OnLabelRightClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); +} + +