X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/903f689bf7c3c379cba45881373aa9bdd15d6e70..c19a8a9a7187281b757808e651358198352b8f11:/src/generic/gridg.cpp diff --git a/src/generic/gridg.cpp b/src/generic/gridg.cpp index b9965c1293..8fae3103b2 100644 --- a/src/generic/gridg.cpp +++ b/src/generic/gridg.cpp @@ -33,9 +33,9 @@ // Set to zero to use no double-buffering #ifdef __WXMSW__ -#define USE_DOUBLE_BUFFERING 1 +#define wxUSE_DOUBLE_BUFFERING 1 #else -#define USE_DOUBLE_BUFFERING 0 +#define wxUSE_DOUBLE_BUFFERING 0 #endif #define wxGRID_DRAG_NONE 0 @@ -43,31 +43,47 @@ #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) - EVT_PAINT(wxGenericGrid::OnPaint) - EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground) - EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent) + EVT_SIZE(wxGenericGrid::OnSize) + EVT_PAINT(wxGenericGrid::OnPaint) + EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground) + EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent) 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; - m_hScrollBar = NULL; - m_vScrollBar = NULL; + m_hScrollBar = (wxScrollBar *) NULL; + m_vScrollBar = (wxScrollBar *) NULL; m_cellTextColour = *wxBLACK; m_cellBackgroundColour = *wxWHITE; m_labelTextColour = *wxBLACK; // m_labelBackgroundColour = *wxLIGHT_GREY; m_labelBackgroundColour = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - m_labelBackgroundBrush = NULL; - m_labelTextFont = NULL; - m_cellTextFont = NULL; - m_textItem = NULL; + m_labelBackgroundBrush = (wxBrush *) NULL; + m_labelTextFont = (wxFont *) NULL; + m_cellTextFont = (wxFont *) NULL; + m_textItem = (wxTextCtrl *) NULL; m_currentRectVisible = FALSE; m_editable = TRUE; #if defined(__WIN95__) @@ -79,14 +95,14 @@ wxGenericGrid::wxGenericGrid(void) m_dragRowOrCol = 0; m_dragStartPosition = 0; m_dragLastPosition = 0; - m_divisionPen = NULL; + m_divisionPen = (wxPen *) NULL; m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT; m_topOfSheet = wxGRID_DEFAULT_SHEET_TOP; m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT; m_totalGridWidth = 0; m_totalGridHeight = 0; - m_colWidths = NULL; - m_rowHeights = NULL; + m_colWidths = (short *) NULL; + m_rowHeights = (short *) NULL; m_verticalLabelWidth = wxGRID_DEFAULT_VERTICAL_LABEL_WIDTH; m_horizontalLabelHeight = wxGRID_DEFAULT_HORIZONAL_LABEL_HEIGHT; m_verticalLabelAlignment = wxCENTRE; @@ -102,32 +118,32 @@ wxGenericGrid::wxGenericGrid(void) m_editCreated = FALSE; m_totalRows = 0; m_totalCols = 0; - m_gridCells = NULL; - m_rowLabelCells = NULL; - m_colLabelCells = NULL; - m_textItem = NULL; - m_horizontalSashCursor = NULL; - m_verticalSashCursor = NULL; + m_gridCells = (wxGridCell ***) NULL; + m_rowLabelCells = (wxGridCell **) NULL; + m_colLabelCells = (wxGridCell **) NULL; + m_textItem = (wxTextCtrl *) NULL; + m_horizontalSashCursor = (wxCursor *) NULL; + m_verticalSashCursor = (wxCursor *) NULL; } bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { m_batchCount = 0; - m_editingPanel = NULL; - m_hScrollBar = NULL; - m_vScrollBar = NULL; - m_horizontalSashCursor = NULL; - m_verticalSashCursor = NULL; + m_editingPanel = (wxPanel *) NULL; + m_hScrollBar = (wxScrollBar *) NULL; + m_vScrollBar = (wxScrollBar *) NULL; + m_horizontalSashCursor = (wxCursor *) NULL; + m_verticalSashCursor = (wxCursor *) NULL; m_cellTextColour = *wxBLACK; m_cellBackgroundColour = *wxWHITE; m_labelTextColour = *wxBLACK; // m_labelBackgroundColour = *wxLIGHT_GREY; m_labelBackgroundColour = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - m_labelBackgroundBrush = NULL; + m_labelBackgroundBrush = (wxBrush *) NULL; m_labelTextFont = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxBOLD); m_cellTextFont = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxNORMAL); - m_textItem = NULL; + m_textItem = (wxTextCtrl *) NULL; m_currentRectVisible = FALSE; m_editable = TRUE; #if defined(__WIN95__) @@ -140,14 +156,14 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_dragStartPosition = 0; m_dragLastPosition = 0; m_divisionPen = wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID); - m_doubleBufferingBitmap = NULL; + m_doubleBufferingBitmap = (wxBitmap *) NULL; if (!m_horizontalSashCursor) { m_horizontalSashCursor = new wxCursor(wxCURSOR_SIZEWE); m_verticalSashCursor = new wxCursor(wxCURSOR_SIZENS); } - + SetLabelBackgroundColour(m_labelBackgroundColour); m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT; @@ -155,8 +171,8 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT; m_totalGridWidth = 0; m_totalGridHeight = 0; - m_colWidths = NULL; - m_rowHeights = NULL; + m_colWidths = (short *) NULL; + m_rowHeights = (short *) NULL; m_verticalLabelWidth = wxGRID_DEFAULT_VERTICAL_LABEL_WIDTH; m_horizontalLabelHeight = wxGRID_DEFAULT_HORIZONAL_LABEL_HEIGHT; @@ -180,10 +196,10 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_totalRows = 0; m_totalCols = 0; - m_gridCells = NULL; - m_rowLabelCells = NULL; - m_colLabelCells = NULL; - m_textItem = NULL; + m_gridCells = (wxGridCell ***) NULL; + m_rowLabelCells = (wxGridCell **) NULL; + m_colLabelCells = (wxGridCell **) NULL; + m_textItem = (wxTextCtrl *) NULL; wxPanel::Create(parent, id, pos, size, style, name); @@ -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; @@ -227,33 +243,33 @@ void wxGenericGrid::ClearGrid(void) delete[] m_gridCells[i]; } delete[] m_gridCells; - m_gridCells = NULL; + m_gridCells = (wxGridCell ***) NULL; } if (m_colWidths) delete[] m_colWidths; - m_colWidths = NULL; + m_colWidths = (short *) NULL; if (m_rowHeights) delete[] m_rowHeights; - m_rowHeights = NULL; + m_rowHeights = (short *) NULL; if (m_rowLabelCells) { for (i = 0; i < m_totalRows; i++) delete m_rowLabelCells[i]; delete[] m_rowLabelCells; - m_rowLabelCells = NULL; + m_rowLabelCells = (wxGridCell **) NULL; } if (m_colLabelCells) { for (i = 0; i < m_totalCols; i++) delete m_colLabelCells[i]; delete[] m_colLabelCells; - m_colLabelCells = NULL; + m_colLabelCells = (wxGridCell **) NULL; } if (m_doubleBufferingBitmap) { delete m_doubleBufferingBitmap; - m_doubleBufferingBitmap = NULL; + m_doubleBufferingBitmap = (wxBitmap *) NULL; } } @@ -283,11 +299,14 @@ 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 - m_gridCells[i][j] = NULL; + m_gridCells[i][j] = (wxGridCell *) NULL; m_rowLabelCells = new wxGridCell *[nRows]; for (i = 0; i < nRows; i++) @@ -306,23 +325,36 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor int objectSizeX = m_totalCols; int pageSizeX = 1; int viewLengthX = m_totalCols; + +/* m_hScrollBar->SetViewLength(viewLengthX); m_hScrollBar->SetObjectLength(objectSizeX); m_hScrollBar->SetPageSize(pageSizeX); +*/ + m_hScrollBar->SetScrollbar(m_hScrollBar->GetThumbPosition(), pageSizeX, objectSizeX, viewLengthX); int objectSizeY = m_totalRows; int pageSizeY = 1; int viewLengthY = m_totalRows; +/* m_vScrollBar->SetViewLength(viewLengthY); m_vScrollBar->SetObjectLength(objectSizeY); m_vScrollBar->SetPageSize(pageSizeY); +*/ + + m_vScrollBar->SetScrollbar(m_vScrollBar->GetThumbPosition(), pageSizeY, objectSizeY, viewLengthY); 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; } @@ -331,7 +363,7 @@ void wxGenericGrid::UpdateDimensions(void) { int canvasWidth, canvasHeight; GetSize(&canvasWidth, &canvasHeight); - + if (m_editCreated && m_editable) { int controlW, controlH; @@ -357,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++) { @@ -373,15 +405,18 @@ void wxGenericGrid::UpdateDimensions(void) wxGridCell *wxGenericGrid::GetCell(int row, int col) { if (!m_gridCells) - return NULL; + return (wxGridCell *) NULL; if ((row >= m_totalRows) || (col >= m_totalCols)) - return NULL; - + 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 @@ -410,7 +445,7 @@ void wxGenericGrid::OnPaint(wxPaintEvent& WXUNUSED(event)) int w, h; GetClientSize(&w, &h); - bool useDoubleBuffering = (bool) USE_DOUBLE_BUFFERING; + bool useDoubleBuffering = (bool) wxUSE_DOUBLE_BUFFERING; if (useDoubleBuffering) { // Reuse the old bitmap if possible @@ -428,7 +463,7 @@ void wxGenericGrid::OnPaint(wxPaintEvent& WXUNUSED(event)) // then don't complain, just don't double-buffer if (m_doubleBufferingBitmap) delete m_doubleBufferingBitmap; - m_doubleBufferingBitmap = NULL; + m_doubleBufferingBitmap = (wxBitmap *) NULL; useDoubleBuffering = FALSE; } } @@ -545,7 +580,7 @@ void wxGenericGrid::DrawGridLines(wxDC *dc) { int cw, ch; GetClientSize(&cw, &ch); - + int i; if (m_divisionPen) @@ -707,9 +742,9 @@ void wxGenericGrid::DrawColumnLabels(wxDC *dc) if (m_horizontalLabelHeight == 0) return; - + int i; - wxRectangle rect; + wxRect rect; // Draw letters for columns rect.y = m_topOfSheet + 1; @@ -718,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++) { @@ -735,12 +770,12 @@ void wxGenericGrid::DrawColumnLabels(wxDC *dc) } } -void wxGenericGrid::DrawColumnLabel(wxDC *dc, wxRectangle *rect, int col) +void wxGenericGrid::DrawColumnLabel(wxDC *dc, wxRect *rect, int col) { wxGridCell *cell = GetLabelCell(wxHORIZONTAL, col); if (cell) { - wxRectangle rect2; + wxRect rect2; rect2 = *rect; rect2.x += 3; rect2.y += 2; @@ -762,8 +797,8 @@ void wxGenericGrid::DrawRowLabels(wxDC *dc) return; int i; - wxRectangle rect; - + wxRect rect; + // Draw numbers for rows rect.x = m_leftOfSheet; rect.width = m_verticalLabelWidth; @@ -782,18 +817,18 @@ void wxGenericGrid::DrawRowLabels(wxDC *dc) rect.y = 1 + heightCount; rect.height = m_rowHeights[i]; DrawRowLabel(dc, &rect, i); - + heightCount += m_rowHeights[i]; } } } -void wxGenericGrid::DrawRowLabel(wxDC *dc, wxRectangle *rect, int row) +void wxGenericGrid::DrawRowLabel(wxDC *dc, wxRect *rect, int row) { wxGridCell *cell = GetLabelCell(wxVERTICAL, row); if (cell) { - wxRectangle rect2; + wxRect rect2; rect2 = *rect; rect2.x += 3; rect2.y += 2; @@ -812,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++) { @@ -834,15 +869,15 @@ void wxGenericGrid::DrawCells(wxDC *dc) dc->SetPen(*wxBLACK_PEN); } -void wxGenericGrid::DrawCellBackground(wxDC *dc, wxRectangle *rect, int row, int col) +void wxGenericGrid::DrawCellBackground(wxDC *dc, wxRect *rect, int row, int col) { wxGridCell *cell = GetCell(row, col); if (cell) { dc->SetBrush(*cell->GetBackgroundBrush()); dc->SetPen(*wxTRANSPARENT_PEN); - -#ifdef 0 // In wxWin 2.0 the dc code is exact. RR. + +#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); #else @@ -856,13 +891,13 @@ void wxGenericGrid::DrawCellBackground(wxDC *dc, wxRectangle *rect, int row, int } } -void wxGenericGrid::DrawCellValue(wxDC *dc, wxRectangle *rect, int row, int col) +void wxGenericGrid::DrawCellValue(wxDC *dc, wxRect *rect, int row, int col) { wxGridCell *cell = GetCell(row, col); if (cell) { wxBitmap *bitmap = cell->GetCellBitmap(); - wxRectangle rect2; + wxRect rect2; rect2 = *rect; rect2.x += 3; rect2.y += 2; @@ -889,16 +924,7 @@ void wxGenericGrid::AdjustScrollbars(void) { int cw, ch; GetClientSize(&cw, &ch); - - // To calculate the number of steps for each scrollbar, - // we need to see how much will fit onto the canvas - // at the present size. So: - // 1) Find the *last* row r1 such that when it's at the top of the - // window, all the remaining rows are visible. - // 2) There should therefore be r1 - 1 steps in the scrollbar. - // Similarly with columns. - - // IGNORE THE ABOVE, it's crap. + // 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 @@ -915,20 +941,16 @@ void wxGenericGrid::AdjustScrollbars(void) vertScrollBarWidth = 0; if (m_hScrollBar && !m_hScrollBar->IsShown()) horizScrollBarHeight = 0; - + int noHorizSteps = 0; int noVertSteps = 0; - - if (m_totalGridWidth <= cw) + + if (m_totalGridWidth + vertScrollBarWidth <= cw) noHorizSteps = 0; else { noHorizSteps = 0; int widthCount = 0; -/* - if (GetLabelSize(wxVERTICAL) > 0) - noHorizSteps ++; -*/ int i; int nx = 0; @@ -943,19 +965,15 @@ void wxGenericGrid::AdjustScrollbars(void) nx ++; } - + noHorizSteps += nx; } - if (m_totalGridHeight <= ch) + if (m_totalGridHeight + horizScrollBarHeight <= ch) noVertSteps = 0; else { noVertSteps = 0; int heightCount = 0; -/* - if (GetLabelSize(wxHORIZONTAL) > 0) - noVertSteps ++; -*/ int i; int ny = 0; @@ -969,11 +987,11 @@ void wxGenericGrid::AdjustScrollbars(void) else ny ++; } - + noVertSteps += ny; } - - if (m_totalGridWidth <= cw) + + if (m_totalGridWidth + vertScrollBarWidth <= cw) { if ( m_hScrollBar ) m_hScrollBar->Show(FALSE); @@ -981,20 +999,20 @@ void wxGenericGrid::AdjustScrollbars(void) } else { - if ( m_hScrollBar ) - m_hScrollBar->Show(TRUE); + if ( m_hScrollBar ) + m_hScrollBar->Show(TRUE); } - if (m_totalGridHeight <= ch) + if (m_totalGridHeight + horizScrollBarHeight <= ch) { - if ( m_vScrollBar ) - m_vScrollBar->Show(FALSE); - SetScrollPosY(0); + if ( m_vScrollBar ) + m_vScrollBar->Show(FALSE); + SetScrollPosY(0); } else { - if ( m_vScrollBar ) - m_vScrollBar->Show(TRUE); + if ( m_vScrollBar ) + m_vScrollBar->Show(TRUE); } UpdateDimensions(); // Necessary in case m_scrollPosX/Y changed @@ -1009,27 +1027,17 @@ void wxGenericGrid::AdjustScrollbars(void) if (m_hScrollBar) { int nCols = GetCols(); -/* - m_hScrollBar->SetPageSize(wxMax(noHorizSteps, 1)); - m_hScrollBar->SetViewLength(wxMax(noHorizSteps, 1)); - m_hScrollBar->SetObjectLength(nCols); -*/ - m_hScrollBar->SetScrollbar(m_hScrollBar->GetPosition(), wxMax(noHorizSteps, 1), nCols, wxMax(noHorizSteps, 1)); + m_hScrollBar->SetScrollbar(m_hScrollBar->GetThumbPosition(), wxMax(noHorizSteps, 1), (noHorizSteps == 0) ? 1 : nCols, wxMax(noHorizSteps, 1)); m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth -2, cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth); } - + if (m_vScrollBar) { int nRows = GetRows(); -/* - m_vScrollBar->SetPageSize(wxMax(noVertSteps, 1)); - m_vScrollBar->SetViewLength(wxMax(noVertSteps, 1)); - m_vScrollBar->SetObjectLength(nRows); -*/ - m_vScrollBar->SetScrollbar(m_vScrollBar->GetPosition(), wxMax(noVertSteps, 1), nRows, wxMax(noVertSteps, 1)); + m_vScrollBar->SetScrollbar(m_vScrollBar->GetThumbPosition(), wxMax(noVertSteps, 1), (noVertSteps == 0) ? 1 : nRows, wxMax(noVertSteps, 1)); m_vScrollBar->SetSize(cw - m_scrollWidth, m_topOfSheet, m_scrollWidth, ch - m_topOfSheet - horizScrollBarHeight); } @@ -1041,7 +1049,7 @@ void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) ) return; AdjustScrollbars(); - + int cw, ch; GetClientSize(&cw, &ch); @@ -1064,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++) @@ -1076,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++) @@ -1097,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)) { @@ -1195,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(); } @@ -1237,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; @@ -1341,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); } } } @@ -1355,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); @@ -1376,15 +1406,18 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) SetGridClippingRegion(dc); - // Why isn't this needed for Windows?? - // Probably because of the SetValue?? - // Arrrrrgh. This isn't needed anywhere, of course. RR. + // 1) Why isn't this needed for Windows?? + // Probably because of the SetValue?? JS. + // 2) Arrrrrgh. This isn't needed anywhere, + // of course. One hour of debugging... 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) @@ -1422,10 +1455,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()) { @@ -1436,26 +1469,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); @@ -1465,11 +1498,11 @@ void wxGenericGrid::DrawCellText(void) { if (!m_currentRectVisible) return; - + wxGridCell *cell = GetCell(GetCursorRow(), GetCursorColumn()); if (!cell) return; - + static char szEdit[300]; wxClientDC dc(this); @@ -1482,7 +1515,7 @@ void wxGenericGrid::DrawCellText(void) strcpy(szEdit, m_textItem->GetValue()); - wxRectangle rect; + wxRect rect; rect = m_currentRect; rect.x += 3; rect.y += 2; @@ -1491,9 +1524,9 @@ void wxGenericGrid::DrawCellText(void) DrawTextRect(& dc, " ", &rect, wxLEFT); DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment()); - + dc.DestroyClippingRegion(); - + dc.SetBackgroundMode(wxSOLID); dc.EndDrawing(); @@ -1522,16 +1555,16 @@ void wxGenericGrid::SetCurrentRect(int Row, int Column, int canvasW, int canvasH else m_currentRectVisible = TRUE; } -static bool wxRectIntersection(wxRectangle *rect1, wxRectangle *rect2, wxRectangle *rect3) +static bool wxRectIntersection(wxRect *rect1, wxRect *rect2, wxRect *rect3) { int x2_1 = rect1->x + rect1->width; int y2_1 = rect1->y + rect1->height; 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)) @@ -1549,7 +1582,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 @@ -1558,31 +1591,31 @@ 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; } -void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *rect, int flag) +void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRect *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; + + wxRect clipRect; + wxRect 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) @@ -1600,12 +1633,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) @@ -1631,7 +1664,7 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *re } } dc->DrawText(text, (long)x, (long)y ); - + dc->DestroyClippingRegion(); // Restore old clipping @@ -1641,25 +1674,25 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRectangle *re dc->EndDrawing(); } -void wxGenericGrid::DrawBitmapRect(wxDC *dc, wxBitmap *bitmap, wxRectangle *rect, int flag) +void wxGenericGrid::DrawBitmapRect(wxDC *dc, wxBitmap *bitmap, wxRect *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; + + wxRect clipRect; + wxRect 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) @@ -1677,13 +1710,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) @@ -1710,10 +1743,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 @@ -1754,7 +1787,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); @@ -1786,7 +1819,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(); @@ -1847,14 +1880,14 @@ wxGridCell *wxGenericGrid::GetLabelCell(int orientation, int pos) if (m_colLabelCells && pos < m_totalCols) return m_colLabelCells[pos]; else - return NULL; + return (wxGridCell *) NULL; } else { if (m_rowLabelCells && pos < m_totalRows) return m_rowLabelCells[pos]; else - return NULL; + return (wxGridCell *) NULL; } } @@ -1942,7 +1975,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); @@ -2085,14 +2118,14 @@ wxBitmap *wxGenericGrid::GetCellBitmap(int row, int col) return cell->GetCellBitmap(); } else - return NULL; + return (wxBitmap *) NULL; } bool wxGenericGrid::InsertCols(int pos, int n, bool updateLabels) { if (pos > m_totalCols) return FALSE; - + if (!m_gridCells) return CreateGrid(1, n); else @@ -2109,7 +2142,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; } @@ -2139,8 +2172,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; @@ -2151,13 +2188,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 @@ -2170,7 +2207,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]; @@ -2202,8 +2239,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; @@ -2228,7 +2269,7 @@ bool wxGenericGrid::DeleteRows(int pos, int n, bool updateLabels) return FALSE; int i; - + wxGridCell ***rows = new wxGridCell **[m_totalRows - n]; // Cells @@ -2262,8 +2303,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; @@ -2289,7 +2333,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; } @@ -2315,8 +2359,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; @@ -2326,21 +2373,26 @@ 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; - SetCurrentRect(row, col); + + int cw, ch; + GetClientSize(&cw, &ch); + + SetCurrentRect(row, col, cw, ch); + if (m_currentRectVisible) HighlightCell(& dc); @@ -2351,12 +2403,12 @@ void wxGenericGrid::SetGridCursor(int row, int col) /* * Grid cell */ - + wxGridCell::wxGridCell(wxGenericGrid *window) { - cellBitmap = NULL; - font = NULL; - backgroundBrush = NULL; + cellBitmap = (wxBitmap *) NULL; + font = (wxFont *) NULL; + backgroundBrush = (wxBrush *) NULL; if (window) textColour = window->GetCellTextColour(); else @@ -2365,14 +2417,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 @@ -2405,9 +2457,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(); } } @@ -2423,7 +2478,7 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) wxGenericGrid *win = this; bool change = FALSE; - + if (ev.GetEventObject() == win->GetHorizScrollBar()) { change = (ev.GetPosition() != m_scrollPosX); @@ -2436,6 +2491,7 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) } win->UpdateDimensions(); + win->SetCurrentRect(win->GetCursorRow(), win->GetCursorColumn()); // Because rows and columns can be arbitrary sizes, @@ -2445,5 +2501,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& WXUNUSED(ev)) +{ + OnChangeLabels(); +} + +void wxGenericGrid::_OnChangeSelectionLabel(wxGridEvent& WXUNUSED(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); +} + +