Changes necessary to make In Place Edit work and look a lot nicer for

MSW and GTK, and hopefully make it easy to make the same tweaks for
other ports.  There are still some very minor anomalies (changing
colors of the grid doesn't change the IPE control, etc.) but it is
definitely useable now.

The IPE control now gets the fore/background color of the cell.

Changed how the current cell highlight is drawn so mulitple clicks in
a single cell don't leave the highlight in an inconsistent state for
GTK.

Changed a dangerous static variable to a member variable.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3182 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 1999-07-28 21:59:08 +00:00
parent 0655ad290a
commit 0c551f1c23
2 changed files with 107 additions and 65 deletions

View File

@ -186,7 +186,7 @@ public:
void UpdateDimensions();
void SetCurrentRect (int Row, int Column, int canvasW = -1, int canvasH = -1);
void HighlightCell (wxDC *dc);
void HighlightCell(wxDC *dc, bool doHighlight);
void DrawCellText();
void SetGridClippingRegion(wxDC *dc);
@ -247,6 +247,7 @@ protected:
bool m_editable;
bool m_editInPlace;
bool m_inOnTextInPlace;
bool m_inScroll;
int m_totalRows;
int m_totalCols;
@ -283,6 +284,7 @@ protected:
wxBrush m_labelBackgroundBrush;
wxFont m_labelTextFont;
wxPen m_divisionPen;
wxPen m_highlightPen;
wxBitmap* m_doubleBufferingBitmap;
// Position of Edit control

View File

@ -39,13 +39,39 @@
#include "wx/generic/gridg.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 __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
@ -100,6 +126,7 @@ wxGenericGrid::wxGenericGrid()
m_editInPlace = FALSE;
m_inOnTextInPlace = FALSE;
m_inScroll = FALSE;
#if defined(__WIN95__)
m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
@ -113,6 +140,7 @@ wxGenericGrid::wxGenericGrid()
m_dragStartPosition = 0;
m_dragLastPosition = 0;
m_divisionPen = wxNullPen;
m_highlightPen = wxNullPen;
m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT;
m_topOfSheet = wxGRID_DEFAULT_SHEET_TOP;
m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT;
@ -167,6 +195,7 @@ bool wxGenericGrid::Create(wxWindow *parent,
m_editable = TRUE;
m_editInPlace = FALSE;
m_inOnTextInPlace = FALSE;
m_inScroll = FALSE;
#if defined(__WIN95__)
m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
#elif defined(__WXGTK__)
@ -179,6 +208,7 @@ bool wxGenericGrid::Create(wxWindow *parent,
m_dragStartPosition = 0;
m_dragLastPosition = 0;
m_divisionPen = * wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID);
m_highlightPen = * wxBLACK_PEN;
m_doubleBufferingBitmap = (wxBitmap *) NULL;
if (!m_horizontalSashCursor.Ok())
@ -249,8 +279,8 @@ bool wxGenericGrid::Create(wxWindow *parent,
// 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-2, m_currentRect.y-2 ),
wxSize( m_currentRect.width+4, m_currentRect.height+4 ),
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 )
@ -546,8 +576,8 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
/* Hilight present cell */
SetCurrentRect(m_wCursorRow, m_wCursorColumn);
if (m_currentRectVisible && !(m_editable && m_editInPlace))
HighlightCell(& dc);
if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
HighlightCell(& dc, TRUE);
dc.DestroyClippingRegion();
dc.SetOptimization(TRUE);
@ -1426,9 +1456,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
SetGridClippingRegion(dc);
// Remove the highlight from the old cell
if ( m_currentRectVisible && !(m_editable && m_editInPlace) )
if ( m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
{
HighlightCell(dc);
HighlightCell(dc, FALSE);
}
@ -1452,42 +1482,44 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
if ( m_currentRect.x <= 0 )
{
x = 0;
width = m_currentRect.width + 2;
width = m_currentRect.width + wxIPE_ADJUST;
}
else
{
x = m_currentRect.x - 2;
width = m_currentRect.width + 4;
x = m_currentRect.x - wxIPE_ADJUST;
width = m_currentRect.width + wxIPE_ADJUST*2;
}
if ( m_currentRect.y <= 0 )
{
y = 0;
height = m_currentRect.height + 2;
height = m_currentRect.height + wxIPE_ADJUST;
}
else
{
y = m_currentRect.y - 2;
height = m_currentRect.height + 4;
y = m_currentRect.y - wxIPE_ADJUST;
height = m_currentRect.height + wxIPE_ADJUST*2;
}
m_inPlaceTextItem->SetSize( x, y, width, height );
if ( cell )
{
if ( cell->GetTextValue().IsNull() )
{
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->SetFont( cell->GetFont() );
}
else {
m_inPlaceTextItem->SetValue( cell->GetTextValue() );
}
}
}
}
m_inPlaceTextItem->Show(TRUE);
m_inPlaceTextItem->SetFocus();
if (wxIPE_HIGHLIGHT)
HighlightCell(dc, TRUE);
}
else
{
@ -1498,9 +1530,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
//
// 3) It *is* needed for Motif - michael
//
#ifdef __WXMOTIF__
if ( !(m_editable && m_editInPlace) )
HighlightCell(dc);
#if defined(__WXMOTIF__)
if ((wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
HighlightCell(dc, TRUE);
#endif
}
@ -1557,9 +1589,13 @@ void wxGenericGrid::OnChangeSelectionLabel()
}
}
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,
@ -1570,7 +1606,7 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
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,
@ -1582,7 +1618,7 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
m_currentRect.x + 1,
m_currentRect.y + 1);
dc->SetLogicalFunction(wxCOPY);
dc->SetPen(savePen);
}
void wxGenericGrid::DrawCellText()
@ -2094,23 +2130,25 @@ void wxGenericGrid::SetEditInPlace(bool edit)
{
if ( m_currentRectVisible && m_editable )
{
m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
m_currentRect.width+4, m_currentRect.height+4 );
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 )
{
if ( cell->GetTextValue().IsNull() )
{
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->SetFont( cell->GetFont() );
}
else {
m_inPlaceTextItem->SetValue( cell->GetTextValue() );
}
}
}
}
m_inPlaceTextItem->Show( TRUE );
m_inPlaceTextItem->SetFocus();
@ -2524,8 +2562,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetGridClippingRegion(& dc);
if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc);
if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
HighlightCell(& dc, FALSE);
m_wCursorRow = row;
m_wCursorColumn = col;
@ -2535,8 +2573,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetCurrentRect(row, col, cw, ch);
if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc);
if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
HighlightCell(& dc, TRUE);
dc.DestroyClippingRegion();
dc.EndDrawing();
@ -2603,15 +2641,17 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() );
}
wxClientDC dc(grid);
if (!m_editInPlace) {
wxClientDC dc(grid);
dc.BeginDrawing();
grid->SetGridClippingRegion(& dc);
grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc);
dc.DestroyClippingRegion();
dc.EndDrawing();
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->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn());
wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid,
@ -2679,14 +2719,12 @@ void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) )
void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
{
static bool inScroll = FALSE;
if ( inScroll )
if ( m_inScroll )
return;
if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
inScroll = TRUE;
m_inScroll = TRUE;
wxGenericGrid *win = this;
bool change = FALSE;
@ -2715,13 +2753,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
if ( m_editInPlace && m_currentRectVisible )
{
m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
m_currentRect.width+4, m_currentRect.height+4 );
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();
}
inScroll = FALSE;
m_inScroll = FALSE;
}