X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/16e93305f2bae16652b6750dffe3bcf05c20d839..b58a1455e15477cac9d335b5f7a2c3fc3111b342:/src/generic/gridg.cpp diff --git a/src/generic/gridg.cpp b/src/generic/gridg.cpp index 8fae3103b2..4c33a1a32a 100644 --- a/src/generic/gridg.cpp +++ b/src/generic/gridg.cpp @@ -2,42 +2,85 @@ // Name: gridg.cpp // Purpose: wxGenericGrid // Author: Julian Smart -// Modified by: +// Modified by: Michael Bedward +// Added edit in place facility, 20 Apr 1999 +// Added cursor key control, 29 Jun 1999 +// Gerhard Gruber +// Added keyboard navigation, client data, other fixes // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "gridg.h" -#pragma interface + #pragma implementation "gridg.h" + #pragma interface #endif // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_GRID + #ifndef WX_PRECOMP -#include "wx/wx.h" + #include "wx/utils.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" + #include "wx/textctrl.h" + #include "wx/settings.h" #endif #include #include "wx/string.h" + #include "wx/generic/gridg.h" -#include "wx/settings.h" -// Set to zero to use no double-buffering + +// Values used to adjust the size of the in-place-edit control, and other +// goodies. Per-platform tweaks should be done here. #ifdef __WXMSW__ -#define wxUSE_DOUBLE_BUFFERING 1 -#else -#define wxUSE_DOUBLE_BUFFERING 0 +#define wxIPE_ADJUST -2 +#define wxIPE_STYLE wxNO_BORDER +#define wxIPE_HIGHLIGHT 1 +#define wxUSE_DOUBLE_BUFFERING 1 +#endif + +#ifdef __WXPM__ +#define wxIPE_ADJUST -1 +#define wxIPE_STYLE wxNO_BORDER +#define wxIPE_HIGHLIGHT 1 +#define wxUSE_DOUBLE_BUFFERING 1 +#endif + +#ifdef __WXGTK__ +#define wxIPE_ADJUST -1 +#define wxIPE_STYLE wxNO_BORDER +#define wxIPE_HIGHLIGHT 0 +#define wxUSE_DOUBLE_BUFFERING 1 #endif +#ifdef __WXMOTIF__ +#define wxIPE_ADJUST 2 +#define wxIPE_STYLE wxNO_BORDER +#define wxIPE_HIGHLIGHT 0 +#define wxUSE_DOUBLE_BUFFERING 0 +#endif + +#ifndef wxIPE_ADJUST +#define wxIPE_ADJUST 2 +#define wxIPE_STYLE wxNO_BORDER +#define wxIPE_HIGHLIGHT 0 +#define wxUSE_DOUBLE_BUFFERING 0 +#endif + + + #define wxGRID_DRAG_NONE 0 #define wxGRID_DRAG_LEFT_RIGHT 1 #define wxGRID_DRAG_UP_DOWN 2 @@ -51,6 +94,9 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground) EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent) EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText) + EVT_TEXT(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlace) + EVT_TEXT_ENTER(wxGRID_TEXT_CTRL, wxGenericGrid::OnTextEnter) + EVT_TEXT_ENTER(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlaceEnter) EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll) EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll) @@ -68,10 +114,10 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) END_EVENT_TABLE() - - -wxGenericGrid::wxGenericGrid(void) +wxGenericGrid::wxGenericGrid() { + m_viewWidth = 0; + m_viewHeight = 0; m_batchCount = 0; m_hScrollBar = (wxScrollBar *) NULL; m_vScrollBar = (wxScrollBar *) NULL; @@ -79,15 +125,22 @@ wxGenericGrid::wxGenericGrid(void) m_cellBackgroundColour = *wxWHITE; m_labelTextColour = *wxBLACK; // m_labelBackgroundColour = *wxLIGHT_GREY; - m_labelBackgroundColour = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); - m_labelBackgroundBrush = (wxBrush *) NULL; - m_labelTextFont = (wxFont *) NULL; - m_cellTextFont = (wxFont *) NULL; + m_labelBackgroundColour = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); + m_labelBackgroundBrush = wxNullBrush; + m_labelTextFont = wxNullFont; + m_cellTextFont = wxNullFont; m_textItem = (wxTextCtrl *) NULL; m_currentRectVisible = FALSE; m_editable = TRUE; + + m_editInPlace = FALSE; + m_inOnTextInPlace = FALSE; + m_inScroll = FALSE; + #if defined(__WIN95__) - m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); + m_scrollWidth = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); +#elif defined(__WXGTK__) + m_scrollWidth = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); #else m_scrollWidth = 16; #endif @@ -95,7 +148,8 @@ wxGenericGrid::wxGenericGrid(void) m_dragRowOrCol = 0; m_dragStartPosition = 0; m_dragLastPosition = 0; - m_divisionPen = (wxPen *) NULL; + m_divisionPen = wxNullPen; + m_highlightPen = wxNullPen; m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT; m_topOfSheet = wxGRID_DEFAULT_SHEET_TOP; m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT; @@ -122,32 +176,39 @@ wxGenericGrid::wxGenericGrid(void) 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) +bool wxGenericGrid::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { + m_viewWidth = 0; + m_viewHeight = 0; m_batchCount = 0; 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 = (wxBrush *) NULL; - m_labelTextFont = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxBOLD); - m_cellTextFont = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxNORMAL); + m_labelBackgroundColour = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); + m_labelBackgroundBrush = wxNullBrush; + m_labelTextFont = * wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxBOLD); + m_cellTextFont = * wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxNORMAL); m_textItem = (wxTextCtrl *) NULL; m_currentRectVisible = FALSE; m_editable = TRUE; + m_editInPlace = FALSE; + m_inOnTextInPlace = FALSE; + m_inScroll = FALSE; #if defined(__WIN95__) - m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); + m_scrollWidth = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); +#elif defined(__WXGTK__) + m_scrollWidth = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); #else m_scrollWidth = 16; #endif @@ -155,13 +216,14 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_dragRowOrCol = 0; m_dragStartPosition = 0; m_dragLastPosition = 0; - m_divisionPen = wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID); + m_divisionPen = * wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID); + m_highlightPen = * wxBLACK_PEN; m_doubleBufferingBitmap = (wxBitmap *) NULL; - if (!m_horizontalSashCursor) + if (!m_horizontalSashCursor.Ok()) { - m_horizontalSashCursor = new wxCursor(wxCURSOR_SIZEWE); - m_verticalSashCursor = new wxCursor(wxCURSOR_SIZENS); + m_horizontalSashCursor = wxCursor(wxCURSOR_SIZEWE); + m_verticalSashCursor = wxCursor(wxCURSOR_SIZENS); } SetLabelBackgroundColour(m_labelBackgroundColour); @@ -206,8 +268,9 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_editingPanel = new wxPanel(this); m_textItem = new wxTextCtrl(m_editingPanel, wxGRID_TEXT_CTRL, "", - wxPoint(m_editControlPosition.x, m_editControlPosition.y), wxSize(m_editControlPosition.width, -1), - 0); + wxPoint(m_editControlPosition.x, m_editControlPosition.y), + wxSize(m_editControlPosition.width, -1), + wxTE_PROCESS_ENTER); m_textItem->Show(TRUE); m_textItem->SetFocus(); int controlW, controlH; @@ -222,15 +285,25 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_hScrollBar = new wxScrollBar(this, wxGRID_HSCROLL, wxPoint(0, 0), wxSize(20, 100), wxHORIZONTAL); m_vScrollBar = new wxScrollBar(this, wxGRID_VSCROLL, wxPoint(0, 0), wxSize(100, 20), wxVERTICAL); +// SetSize(pos.x, pos.y, size.x, size.y); + + m_inPlaceTextItem = new wxTextCtrl( (wxPanel*)this, wxGRID_EDIT_IN_PLACE_TEXT_CTRL, "", + wxPoint( m_currentRect.x-wxIPE_ADJUST, m_currentRect.y-wxIPE_ADJUST ), + wxSize( m_currentRect.width+wxIPE_ADJUST*2, m_currentRect.height+wxIPE_ADJUST*2 ), + wxNO_BORDER | wxTE_PROCESS_ENTER ); + m_inPlaceTextItem->Show(m_editInPlace); + if ( m_editInPlace ) + m_inPlaceTextItem->SetFocus(); + return TRUE; } -wxGenericGrid::~wxGenericGrid(void) +wxGenericGrid::~wxGenericGrid() { ClearGrid(); } -void wxGenericGrid::ClearGrid(void) +void wxGenericGrid::ClearGrid() { int i,j; if (m_gridCells) @@ -359,7 +432,7 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor } // Need to determine various dimensions -void wxGenericGrid::UpdateDimensions(void) +void wxGenericGrid::UpdateDimensions() { int canvasWidth, canvasHeight; GetSize(&canvasWidth, &canvasHeight); @@ -402,7 +475,7 @@ void wxGenericGrid::UpdateDimensions(void) } } -wxGridCell *wxGenericGrid::GetCell(int row, int col) +wxGridCell *wxGenericGrid::GetCell(int row, int col) const { if (!m_gridCells) return (wxGridCell *) NULL; @@ -414,7 +487,7 @@ wxGridCell *wxGenericGrid::GetCell(int row, int col) if (!cell) { // m_gridCells[row][col] = OnCreateCell(); - wxGridEvent g_evt(GetId(), wxEVT_GRID_CREATE_CELL, this, row, col); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CREATE_CELL, (wxGenericGrid*) this, row, col); GetEventHandler()->ProcessEvent(g_evt); m_gridCells[row][col] = g_evt.m_cell; return m_gridCells[row][col]; @@ -512,8 +585,8 @@ void wxGenericGrid::PaintGrid(wxDC& dc) /* Hilight present cell */ SetCurrentRect(m_wCursorRow, m_wCursorColumn); - if (m_currentRectVisible) - HighlightCell(& dc); + if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace))) + HighlightCell(& dc, TRUE); dc.DestroyClippingRegion(); dc.SetOptimization(TRUE); @@ -556,7 +629,7 @@ void wxGenericGrid::DrawLabelAreas(wxDC *dc) // dc->DrawRectangle(m_rightOfSheet, m_topOfSheet, cw - m_rightOfSheet, ch - m_topOfSheet); // Paint the label areas - dc->SetBrush(*m_labelBackgroundBrush); + dc->SetBrush(m_labelBackgroundBrush); // dc->DrawRectangle(m_leftOfSheet, m_topOfSheet, m_rightOfSheet - m_leftOfSheet + 1, m_horizontalLabelHeight + 1); dc->DrawRectangle(m_leftOfSheet, m_topOfSheet, cw-m_leftOfSheet, m_horizontalLabelHeight + 1); // dc->DrawRectangle(m_leftOfSheet, m_topOfSheet, m_verticalLabelWidth + 1, m_bottomOfSheet - m_topOfSheet + 1); @@ -583,9 +656,9 @@ void wxGenericGrid::DrawGridLines(wxDC *dc) int i; - if (m_divisionPen) + if (m_divisionPen.Ok()) { - dc->SetPen(*m_divisionPen); + dc->SetPen(m_divisionPen); int heightCount = m_topOfSheet + m_horizontalLabelHeight; @@ -653,9 +726,9 @@ void wxGenericGrid::DrawGridLines(wxDC *dc) } - if (m_divisionPen) + if (m_divisionPen.Ok()) { - dc->SetPen(*m_divisionPen); + dc->SetPen(m_divisionPen); // Draw vertical grey lines for cells int widthCount = m_leftOfSheet + m_verticalLabelWidth; @@ -782,9 +855,9 @@ void wxGenericGrid::DrawColumnLabel(wxDC *dc, wxRect *rect, int col) rect2.width -= 5; rect2.height -= 4; dc->SetTextForeground(GetLabelTextColour()); - dc->SetFont(*GetLabelTextFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL)); + dc->SetFont(GetLabelTextFont()); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL)); } } @@ -835,9 +908,9 @@ void wxGenericGrid::DrawRowLabel(wxDC *dc, wxRect *rect, int row) rect2.width -= 5; rect2.height -= 4; dc->SetTextForeground(GetLabelTextColour()); - dc->SetFont(*GetLabelTextFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL)); + dc->SetFont(GetLabelTextFont()); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL)); } } @@ -874,7 +947,7 @@ void wxGenericGrid::DrawCellBackground(wxDC *dc, wxRect *rect, int row, int col) wxGridCell *cell = GetCell(row, col); if (cell) { - dc->SetBrush(*cell->GetBackgroundBrush()); + dc->SetBrush(cell->GetBackgroundBrush()); dc->SetPen(*wxTRANSPARENT_PEN); #if 0 // In wxWin 2.0 the dc code is exact. RR. @@ -912,15 +985,15 @@ void wxGenericGrid::DrawCellValue(wxDC *dc, wxRect *rect, int row, int col) { dc->SetBackgroundMode(wxTRANSPARENT); dc->SetTextForeground(cell->GetTextColour()); - dc->SetFont(*cell->GetFont()); + dc->SetFont(cell->GetFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment()); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment()); } } } -void wxGenericGrid::AdjustScrollbars(void) +void wxGenericGrid::AdjustScrollbars() { int cw, ch; GetClientSize(&cw, &ch); @@ -945,56 +1018,53 @@ void wxGenericGrid::AdjustScrollbars(void) int noHorizSteps = 0; int noVertSteps = 0; - if (m_totalGridWidth + vertScrollBarWidth <= cw) - noHorizSteps = 0; - else + if (m_totalGridWidth + vertScrollBarWidth > cw) { - noHorizSteps = 0; int widthCount = 0; int i; - int nx = 0; + int nx = 0; for (i = m_scrollPosX ; i < m_totalCols; i++) { widthCount += m_colWidths[i]; - // A partial bit doesn't count, we still have to scroll to see the - // rest of it + // A partial bit doesn't count, we still have to scroll to see the + // rest of it if (widthCount + m_leftOfSheet + m_verticalLabelWidth > (cw-vertScrollBarWidth)) break; - else - nx ++; - + else + nx ++; } noHorizSteps += nx; } - if (m_totalGridHeight + horizScrollBarHeight <= ch) - noVertSteps = 0; - else + m_viewWidth = noHorizSteps; + + if (m_totalGridHeight + horizScrollBarHeight > ch) { - noVertSteps = 0; int heightCount = 0; int i; - int ny = 0; + int ny = 0; for (i = m_scrollPosY ; i < m_totalRows; i++) { heightCount += m_rowHeights[i]; - // A partial bit doesn't count, we still have to scroll to see the - // rest of it + // A partial bit doesn't count, we still have to scroll to see the + // rest of it if (heightCount + m_topOfSheet + m_horizontalLabelHeight > (ch-horizScrollBarHeight)) break; - else - ny ++; + else + ny ++; } noVertSteps += ny; } + m_viewHeight = noVertSteps; + if (m_totalGridWidth + vertScrollBarWidth <= cw) { - if ( m_hScrollBar ) - m_hScrollBar->Show(FALSE); + if ( m_hScrollBar ) + m_hScrollBar->Show(FALSE); SetScrollPosX(0); } else @@ -1024,16 +1094,21 @@ void wxGenericGrid::AdjustScrollbars(void) if (m_hScrollBar && !m_hScrollBar->IsShown()) horizScrollBarHeight = 0; - if (m_hScrollBar) + if (m_hScrollBar && m_hScrollBar->IsShown()) { int nCols = GetCols(); 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, +/* + m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth -2, // why -2 ? Robert. cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth); +*/ + m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth, + cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth); + } - if (m_vScrollBar) + if (m_vScrollBar && m_vScrollBar->IsShown()) { int nRows = GetRows(); @@ -1046,7 +1121,7 @@ void wxGenericGrid::AdjustScrollbars(void) void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) ) { if (!m_vScrollBar || !m_hScrollBar) - return; + return; AdjustScrollbars(); @@ -1057,7 +1132,7 @@ void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) ) { m_editingPanel->SetSize(0, 0, cw, m_editControlPosition.height + m_editControlPosition.y + 2); GetTextItem()->SetSize(m_editControlPosition.x, m_editControlPosition.y, - cw - m_editControlPosition.x, m_editControlPosition.height); + cw - 2*m_editControlPosition.x, m_editControlPosition.height); } } @@ -1239,13 +1314,13 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) if (orientation == wxHORIZONTAL) { m_dragStatus = wxGRID_DRAG_LEFT_RIGHT; - SetCursor(*m_horizontalSashCursor); + SetCursor(m_horizontalSashCursor); m_dragLastPosition = (int)ev.GetX(); } else { m_dragStatus = wxGRID_DRAG_UP_DOWN; - SetCursor(*m_verticalSashCursor); + SetCursor(m_verticalSashCursor); m_dragLastPosition = (int)ev.GetY(); } wxClientDC dc(this); @@ -1272,7 +1347,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) dc.EndDrawing(); m_dragLastPosition = (int)ev.GetX(); - SetCursor(*m_horizontalSashCursor); + SetCursor(m_horizontalSashCursor); break; } case wxGRID_DRAG_UP_DOWN: @@ -1286,7 +1361,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) dc.EndDrawing(); m_dragLastPosition = (int)ev.GetY(); - SetCursor(*m_verticalSashCursor); + SetCursor(m_verticalSashCursor); break; } } @@ -1297,9 +1372,9 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) if (LabelSashHitTest((int)ev.GetX(), (int)ev.GetY(), &orientation, &rowOrCol, &startPos)) { if (orientation == wxHORIZONTAL) - SetCursor(*m_horizontalSashCursor); + SetCursor(m_horizontalSashCursor); else - SetCursor(*m_verticalSashCursor); + SetCursor(m_verticalSashCursor); } else SetCursor(*wxSTANDARD_CURSOR); @@ -1328,7 +1403,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) SetCursor(*wxSTANDARD_CURSOR); int cw, ch; GetClientSize(&cw, &ch); - wxSizeEvent evt; + wxSizeEvent evt; OnSize(evt); break; } @@ -1390,42 +1465,107 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) SetGridClippingRegion(dc); // Remove the highlight from the old cell - if (m_currentRectVisible) - HighlightCell(dc); + if ( m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace))) + { + HighlightCell(dc, FALSE); + } + // Highlight the new cell and copy its content to the edit control SetCurrentRect(m_wCursorRow, m_wCursorColumn); wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn); if (cell) { - if ( cell->GetTextValue().IsNull() ) - m_textItem->SetValue(""); - else - m_textItem->SetValue(cell->GetTextValue()); + if ( cell->GetTextValue().IsNull() ) + m_textItem->SetValue(""); + else + m_textItem->SetValue(cell->GetTextValue()); } SetGridClippingRegion(dc); - // 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); + + if ( m_editable && m_editInPlace ) + { + int x, y, width, height; + if ( m_currentRect.x <= 0 ) + { + x = 0; + width = m_currentRect.width + wxIPE_ADJUST; + } + else + { + x = m_currentRect.x - wxIPE_ADJUST; + width = m_currentRect.width + wxIPE_ADJUST*2; + } + + if ( m_currentRect.y <= 0 ) + { + y = 0; + height = m_currentRect.height + wxIPE_ADJUST; + } + else + { + y = m_currentRect.y - wxIPE_ADJUST; + height = m_currentRect.height + wxIPE_ADJUST*2; + } + + m_inPlaceTextItem->SetSize( x, y, width, height ); + + if ( cell ) { + m_inPlaceTextItem->SetFont( cell->GetFont() ); + m_inPlaceTextItem->SetBackgroundColour(cell->GetBackgroundColour()); + m_inPlaceTextItem->SetForegroundColour(cell->GetTextColour()); + + if ( cell->GetTextValue().IsNull() ) { + m_inPlaceTextItem->SetValue( "" ); + } + else { + m_inPlaceTextItem->SetValue( cell->GetTextValue() ); + } + } + + m_inPlaceTextItem->Show(TRUE); + m_inPlaceTextItem->SetFocus(); +#if defined(__VISAGECPP__) + { + int highlight = wxIPE_HIGHLIGHT; + if (highlight != 0) + HighlightCell(dc, TRUE); + } +#else + if (wxIPE_HIGHLIGHT != 0) + HighlightCell(dc, TRUE); +#endif + } + else + { + // 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. + // + // 3) It *is* needed for Motif - michael + // +#if defined(__WXMOTIF__) + if ((wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace))) + HighlightCell(dc, TRUE); #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) +wxGridCell *wxGenericGrid::OnCreateCell() { return new wxGridCell(this); } -void wxGenericGrid::OnChangeLabels(void) +void wxGenericGrid::OnChangeLabels() { char buf[100]; int i; @@ -1451,7 +1591,7 @@ void wxGenericGrid::OnChangeLabels(void) } } -void wxGenericGrid::OnChangeSelectionLabel(void) +void wxGenericGrid::OnChangeSelectionLabel() { if (!GetEditable()) return; @@ -1466,35 +1606,39 @@ void wxGenericGrid::OnChangeSelectionLabel(void) } } -void wxGenericGrid::HighlightCell(wxDC *dc) +void wxGenericGrid::HighlightCell(wxDC *dc, bool doHighlight) { - dc->SetLogicalFunction(wxINVERT); + wxPen savePen = dc->GetPen(); + if (doHighlight) + dc->SetPen(m_highlightPen); + else + dc->SetPen(*wxThePenList->FindOrCreatePen(m_cellBackgroundColour, 1, wxSOLID)); // Top dc->DrawLine( m_currentRect.x + 1, m_currentRect.y + 1, m_currentRect.x + m_currentRect.width - 1, - m_currentRect.y + 1); + m_currentRect.y + 1); // Right dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + 1, m_currentRect.x + m_currentRect.width - 1, - m_currentRect.y +m_currentRect.height - 1 ); + m_currentRect.y + m_currentRect.height - 1 ); // Bottom dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + m_currentRect.height - 1, m_currentRect.x + 1, - m_currentRect.y + m_currentRect.height - 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, - m_currentRect.y + 1); + m_currentRect.x + 1, + m_currentRect.y + 1); - dc->SetLogicalFunction(wxCOPY); + dc->SetPen(savePen); } -void wxGenericGrid::DrawCellText(void) +void wxGenericGrid::DrawCellText() { if (!m_currentRectVisible) return; @@ -1503,17 +1647,15 @@ void wxGenericGrid::DrawCellText(void) if (!cell) return; - static char szEdit[300]; - wxClientDC dc(this); dc.BeginDrawing(); SetGridClippingRegion(& dc); dc.SetBackgroundMode(wxTRANSPARENT); - dc.SetBrush(*cell->GetBackgroundBrush()); + dc.SetBrush(cell->GetBackgroundBrush()); - strcpy(szEdit, m_textItem->GetValue()); + wxString editValue = m_textItem->GetValue(); wxRect rect; rect = m_currentRect; @@ -1522,8 +1664,9 @@ void wxGenericGrid::DrawCellText(void) rect.width -= 5; rect.height -= 4; + // FIXME: what's this string of spaces supposed to represent? DrawTextRect(& dc, " ", &rect, wxLEFT); - DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment()); + DrawTextRect(& dc, editValue, &rect, cell->GetAlignment()); dc.DestroyClippingRegion(); @@ -1645,21 +1788,21 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRect *rect, i { case wxRIGHT: { - x = (rect->x + rect->width - textWidth - 1.0); - y = (rect->y + (rect->height - textHeight)/2.0); + x = (rect->x + rect->width - textWidth - (float)1.0); + y = (rect->y + (rect->height - textHeight)/(float)2.0); break; } case wxCENTRE: { - x = (rect->x + (rect->width - textWidth)/2.0); - y = (rect->y + (rect->height - textHeight)/2.0); + x = (rect->x + (rect->width - textWidth)/(float)2.0); + y = (rect->y + (rect->height - textHeight)/(float)2.0); break; } case wxLEFT: default: { - x = (rect->x + 1.0); - y = (rect->y + (rect->height - textHeight)/2.0); + x = (rect->x + (float)1.0); + y = (rect->y + (rect->height - textHeight)/(float)2.0); break; } } @@ -1816,7 +1959,7 @@ void wxGenericGrid::RefreshCell(int row, int col, bool setText) } } -wxString& wxGenericGrid::GetCellValue(int row, int col) +wxString& wxGenericGrid::GetCellValue(int row, int col) const { static wxString emptyString(""); @@ -1833,7 +1976,7 @@ void wxGenericGrid::SetColumnWidth(int col, int width) m_colWidths[col] = width; } -int wxGenericGrid::GetColumnWidth(int col) +int wxGenericGrid::GetColumnWidth(int col) const { if (col <= m_totalCols) return m_colWidths[col]; @@ -1847,7 +1990,7 @@ void wxGenericGrid::SetRowHeight(int row, int height) m_rowHeights[row] = height; } -int wxGenericGrid::GetRowHeight(int row) +int wxGenericGrid::GetRowHeight(int row) const { if (row <= m_totalRows) return m_rowHeights[row]; @@ -1865,7 +2008,7 @@ void wxGenericGrid::SetLabelSize(int orientation, int sz) SetCurrentRect(GetCursorRow(), GetCursorColumn()); } -int wxGenericGrid::GetLabelSize(int orientation) +int wxGenericGrid::GetLabelSize(int orientation) const { if (orientation == wxHORIZONTAL) return m_horizontalLabelHeight; @@ -1873,7 +2016,7 @@ int wxGenericGrid::GetLabelSize(int orientation) return m_verticalLabelWidth; } -wxGridCell *wxGenericGrid::GetLabelCell(int orientation, int pos) +wxGridCell *wxGenericGrid::GetLabelCell(int orientation, int pos) const { if (orientation == wxHORIZONTAL) { @@ -1898,7 +2041,7 @@ void wxGenericGrid::SetLabelValue(int orientation, const wxString& val, int pos) cell->SetTextValue(val); } -wxString& wxGenericGrid::GetLabelValue(int orientation, int pos) +wxString& wxGenericGrid::GetLabelValue(int orientation, int pos) const { static wxString emptyString = ""; wxGridCell *cell = GetLabelCell(orientation, pos); @@ -1918,7 +2061,7 @@ void wxGenericGrid::SetLabelAlignment(int orientation, int align) SetCurrentRect(GetCursorRow(), GetCursorColumn()); } -int wxGenericGrid::GetLabelAlignment(int orientation) +int wxGenericGrid::GetLabelAlignment(int orientation) const { if (orientation == wxHORIZONTAL) return m_horizontalLabelAlignment; @@ -1935,7 +2078,7 @@ void wxGenericGrid::SetLabelTextColour(const wxColour& colour) void wxGenericGrid::SetLabelBackgroundColour(const wxColour& colour) { m_labelBackgroundColour = colour; - m_labelBackgroundBrush = wxTheBrushList->FindOrCreateBrush(m_labelBackgroundColour, wxSOLID); + m_labelBackgroundBrush = * wxTheBrushList->FindOrCreateBrush(m_labelBackgroundColour, wxSOLID); } void wxGenericGrid::SetEditable(bool edit) @@ -1954,6 +2097,12 @@ void wxGenericGrid::SetEditable(bool edit) m_textItem->Show(TRUE); m_textItem->SetFocus(); } + + if (m_inPlaceTextItem) + { + m_inPlaceTextItem->Show(TRUE); + m_inPlaceTextItem->SetFocus(); + } } else { @@ -1963,6 +2112,11 @@ void wxGenericGrid::SetEditable(bool edit) m_textItem->Show(FALSE); m_editingPanel->Show(FALSE); } + + if ( m_inPlaceTextItem ) + { + m_inPlaceTextItem->Show(FALSE); + } } UpdateDimensions(); SetCurrentRect(GetCursorRow(), GetCursorColumn()); @@ -1982,6 +2136,49 @@ void wxGenericGrid::SetEditable(bool edit) */ } + +void wxGenericGrid::SetEditInPlace(bool edit) +{ + if ( m_editInPlace != edit ) + { + m_editInPlace = edit; + + if ( m_editInPlace ) // switched on + { + if ( m_currentRectVisible && m_editable ) + { + m_inPlaceTextItem->SetSize( m_currentRect.x-wxIPE_ADJUST, + m_currentRect.y-wxIPE_ADJUST, + m_currentRect.width+wxIPE_ADJUST*2, + m_currentRect.height+wxIPE_ADJUST*2 ); + + wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn); + + if ( cell ) { + m_inPlaceTextItem->SetFont( cell->GetFont() ); + m_inPlaceTextItem->SetBackgroundColour(cell->GetBackgroundColour()); + m_inPlaceTextItem->SetForegroundColour(cell->GetTextColour()); + + if ( cell->GetTextValue().IsNull() ) { + m_inPlaceTextItem->SetValue( "" ); + } + else { + m_inPlaceTextItem->SetValue( cell->GetTextValue() ); + } + } + + m_inPlaceTextItem->Show( TRUE ); + m_inPlaceTextItem->SetFocus(); + } + } + else // switched off + { + m_inPlaceTextItem->Show( FALSE ); + } + } +} + + void wxGenericGrid::SetCellAlignment(int flag, int row, int col) { wxGridCell *cell = GetCell(row, col); @@ -1989,7 +2186,7 @@ void wxGenericGrid::SetCellAlignment(int flag, int row, int col) cell->SetAlignment(flag); } -int wxGenericGrid::GetCellAlignment(int row, int col) +int wxGenericGrid::GetCellAlignment(int row, int col) const { wxGridCell *cell = GetCell(row, col); if (cell) @@ -2008,7 +2205,7 @@ void wxGenericGrid::SetCellAlignment(int flag) GetCell(i, j)->SetAlignment(flag); } -int wxGenericGrid::GetCellAlignment(void) +int wxGenericGrid::GetCellAlignment(void) const { return m_cellAlignment; } @@ -2033,13 +2230,13 @@ void wxGenericGrid::SetCellBackgroundColour(const wxColour& val, int row, int co } } -wxColour& wxGenericGrid::GetCellBackgroundColour(int row, int col) +wxColour& wxGenericGrid::GetCellBackgroundColour(int row, int col) const { wxGridCell *cell = GetCell(row, col); if (cell) return cell->GetBackgroundColour(); else - return m_cellBackgroundColour; + return (wxColour&) m_cellBackgroundColour; } void wxGenericGrid::SetCellTextColour(const wxColour& val, int row, int col) @@ -2052,7 +2249,7 @@ void wxGenericGrid::SetCellTextColour(const wxColour& val, int row, int col) } } -void wxGenericGrid::SetCellTextFont(wxFont *fnt, int row, int col) +void wxGenericGrid::SetCellTextFont(const wxFont& fnt, int row, int col) { wxGridCell *cell = GetCell(row, col); if (cell) @@ -2062,22 +2259,22 @@ void wxGenericGrid::SetCellTextFont(wxFont *fnt, int row, int col) } } -wxFont *wxGenericGrid::GetCellTextFont(int row, int col) +wxFont& wxGenericGrid::GetCellTextFont(int row, int col) const { wxGridCell *cell = GetCell(row, col); if (cell) - return cell->GetFont(); + return (wxFont&) cell->GetFont(); else - return m_cellTextFont; + return (wxFont&) m_cellTextFont; } -wxColour& wxGenericGrid::GetCellTextColour(int row, int col) +wxColour& wxGenericGrid::GetCellTextColour(int row, int col) const { wxGridCell *cell = GetCell(row, col); if (cell) - return cell->GetTextColour(); + return (wxColour&) cell->GetTextColour(); else - return m_cellTextColour; + return (wxColour&) m_cellTextColour; } void wxGenericGrid::SetCellTextColour(const wxColour& val) @@ -2090,7 +2287,7 @@ void wxGenericGrid::SetCellTextColour(const wxColour& val) GetCell(i, j)->SetTextColour(val); } -void wxGenericGrid::SetCellTextFont(wxFont *fnt) +void wxGenericGrid::SetCellTextFont(const wxFont& fnt) { m_cellTextFont = fnt; int i,j; @@ -2110,7 +2307,7 @@ void wxGenericGrid::SetCellBitmap(wxBitmap *bitmap, int row, int col) } } -wxBitmap *wxGenericGrid::GetCellBitmap(int row, int col) +wxBitmap *wxGenericGrid::GetCellBitmap(int row, int col) const { wxGridCell *cell = GetCell(row, col); if (cell) @@ -2382,8 +2579,8 @@ void wxGenericGrid::SetGridCursor(int row, int col) SetGridClippingRegion(& dc); - if (m_currentRectVisible) - HighlightCell(& dc); + if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace))) + HighlightCell(& dc, FALSE); m_wCursorRow = row; m_wCursorColumn = col; @@ -2393,22 +2590,22 @@ void wxGenericGrid::SetGridCursor(int row, int col) SetCurrentRect(row, col, cw, ch); - if (m_currentRectVisible) - HighlightCell(& dc); + if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace))) + HighlightCell(& dc, TRUE); dc.DestroyClippingRegion(); dc.EndDrawing(); } -/* - * Grid cell - */ +// ---------------------------------------------------------------------------- +// Grid cell +// ---------------------------------------------------------------------------- wxGridCell::wxGridCell(wxGenericGrid *window) { cellBitmap = (wxBitmap *) NULL; - font = (wxFont *) NULL; - backgroundBrush = (wxBrush *) NULL; + font = wxNullFont; + backgroundBrush = wxNullBrush; if (window) textColour = window->GetCellTextColour(); else @@ -2421,7 +2618,7 @@ wxGridCell::wxGridCell(wxGenericGrid *window) if (window) font = window->GetCellTextFont(); else - font = wxTheFontList->FindOrCreateFont(12, wxSWISS, wxNORMAL, wxNORMAL); + font = * wxTheFontList->FindOrCreateFont(12, wxSWISS, wxNORMAL, wxNORMAL); SetBackgroundColour(backgroundColour); @@ -2429,52 +2626,122 @@ wxGridCell::wxGridCell(wxGenericGrid *window) alignment = window->GetCellAlignment(); else alignment = wxLEFT; + + cellData = (void *)NULL; } -wxGridCell::~wxGridCell(void) +wxGridCell::~wxGridCell() { } void wxGridCell::SetBackgroundColour(const wxColour& colour) { backgroundColour = colour; - backgroundBrush = wxTheBrushList->FindOrCreateBrush(backgroundColour, wxSOLID); + backgroundBrush = * wxTheBrushList->FindOrCreateBrush(backgroundColour, wxSOLID); } void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) ) { - wxGenericGrid *grid = this; - wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); - if (cell && grid->CurrentCellVisible()) - { - cell->SetTextValue(grid->GetTextItem()->GetValue()); - wxClientDC dc(grid); + // michael - added this conditional to prevent change to + // grid cell text when edit control is hidden but still has + // focus + // + if ( m_editable ) + { + wxGenericGrid *grid = this; + wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); + if (cell && grid->CurrentCellVisible()) + { + cell->SetTextValue(grid->GetTextItem()->GetValue()); + if ( m_editInPlace && !m_inOnTextInPlace ) + { + m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() ); + } - dc.BeginDrawing(); - grid->SetGridClippingRegion(& dc); - grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); - grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); - grid->HighlightCell(& dc); - dc.DestroyClippingRegion(); - dc.EndDrawing(); + if (!m_editInPlace) { + wxClientDC dc(grid); - //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn()); - wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid, - grid->GetCursorRow(), grid->GetCursorColumn()); - GetEventHandler()->ProcessEvent(g_evt); + dc.BeginDrawing(); + grid->SetGridClippingRegion(& dc); + grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); + grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); + grid->HighlightCell(& dc, TRUE); + dc.DestroyClippingRegion(); + dc.EndDrawing(); + } -// grid->DrawCellText(); - } + //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(); + } + } +} + +void wxGenericGrid::OnTextEnter(wxCommandEvent& WXUNUSED(ev) ) +{ + // move the cursor down the current row (if possible) + // when the enter key has been pressed + // + if ( m_editable ) + { + if ( GetCursorRow() < GetRows()-1 ) + { + wxClientDC dc( this ); + dc.BeginDrawing(); + OnSelectCellImplementation(& dc, + GetCursorRow()+1, + GetCursorColumn() ); + dc.EndDrawing(); + } + } +} + +void wxGenericGrid::OnTextInPlace(wxCommandEvent& ev ) +{ + if ( m_editable ) + { + wxGenericGrid *grid = this; + wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); + if (cell && grid->CurrentCellVisible()) + { + m_inOnTextInPlace = TRUE; + grid->GetTextItem()->SetValue( m_inPlaceTextItem->GetValue() ); + OnText( ev ); + m_inOnTextInPlace = FALSE; + } + } +} + +void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) ) +{ + // move the cursor down the current row (if possible) + // when the enter key has been pressed + // + if ( m_editable ) + { + if ( GetCursorRow() < GetRows()-1 ) + { + wxClientDC dc( this ); + dc.BeginDrawing(); + OnSelectCellImplementation(& dc, + GetCursorRow()+1, + GetCursorColumn() ); + dc.EndDrawing(); + } + } } void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) { - static bool inScroll = FALSE; + if ( m_inScroll ) + return; - if ( inScroll ) - return; + if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE); - inScroll = TRUE; + m_inScroll = TRUE; wxGenericGrid *win = this; bool change = FALSE; @@ -2500,7 +2767,18 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) AdjustScrollbars(); if (change) win->Refresh(FALSE); - inScroll = FALSE; + + if ( m_editInPlace && m_currentRectVisible ) + { + m_inPlaceTextItem->SetSize( m_currentRect.x-wxIPE_ADJUST, + m_currentRect.y-wxIPE_ADJUST, + m_currentRect.width+wxIPE_ADJUST*2, + m_currentRect.height+wxIPE_ADJUST*2 ); + m_inPlaceTextItem->Show( TRUE ); + m_inPlaceTextItem->SetFocus(); + } + + m_inScroll = FALSE; } @@ -2554,4 +2832,26 @@ void wxGenericGrid::_OnLabelRightClick(wxGridEvent& ev) OnLabelRightClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); } +void *wxGenericGrid::SetCellData(void *data, int row, int col) +{ + void *rc = NULL; + + wxGridCell *cell = GetCell(row, col); + if ( cell ) + rc = cell->SetCellData(data); + + return rc; +} + +void *wxGenericGrid::GetCellData(int row, int col) +{ + void *rc = NULL; + + wxGridCell *cell = GetCell(row, col); + if ( cell ) + rc = cell->GetCellData(); + + return rc; +} +#endif // wxUSE_GRID