in-place editing code from Michael Bedward integrated (with my docs)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2874 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-06-23 11:26:19 +00:00
parent da175b2ce4
commit c0b042fce9
4 changed files with 480 additions and 302 deletions

View File

@@ -15,7 +15,9 @@ wxGrid is a class for displaying and editing tabular information.
\wxheading{Window styles}
There are no specific window styles for this class.
There are no specific window styles for this class, but you may use different
SetXXX() functions to change the controls behaviour (for example, to enable
in-place editing).
See also \helpref{window styles overview}{windowstyles}.
@@ -257,6 +259,12 @@ Returns the row position of the currently selected cell.
Returns TRUE if the grid cells can be edited.
\membersection{wxGrid::GetEditInPlace}\label{wxgridgeteditinplace}
\constfunc{bool}{GetEditInPlace}{\void}
Returns TRUE if editing in-place is enabled.
\membersection{wxGrid::GetHorizScrollBar}\label{wxgridgethorizscrollbar}
\constfunc{wxScrollBar *}{GetHorizScrollBar}{\void}
@@ -528,6 +536,14 @@ If {\it editable} is TRUE (the default), the grid cells will be editable by mean
text edit control. If FALSE, the text edit control will be hidden and the user will not
be able to edit the cell contents.
\membersection{wxGrid::SetEditInPlace}\label{wxgridseteditinplace}
\func{void}{SetEditInPlace}{\param{bool}{ edit = TRUE}}
Enables (if {\it edit} is TRUE, default value) or disables in-place editing.
When it is enabled, the cells contents can be changed by typing text directly
in the cell.
\membersection{wxGrid::SetGridCursor}\label{wxgridsetgridcursor}
\func{void}{SetGridCursor}{\param{int }{row}, \param{int}{ col}}

View File

@@ -2,7 +2,8 @@
// Name: gridg.h
// Purpose: wxGenericGrid
// Author: Julian Smart
// Modified by:
// Modified by: Michael Bedward 20 April 1999
// Added edit in place facility
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c)
@@ -45,35 +46,32 @@
class WXDLLEXPORT wxGridEvent;
class WXDLLEXPORT wxGridCell;
class WXDLLEXPORT wxGenericGrid : public wxPanel
{
DECLARE_DYNAMIC_CLASS(wxGenericGrid)
public:
wxGenericGrid(void);
inline wxGenericGrid(wxWindow *parent, int x, int y, int width, int height, long style = 0, char *name = "grid")
public:
wxGenericGrid();
wxGenericGrid(wxWindow *parent, int x, int y, int width, int height, long style = 0, char *name = "grid")
{
Create(parent, -1, wxPoint(x, y), wxSize(width, height), style, name);
}
inline wxGenericGrid(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style = 0, const wxString& name = "grid")
wxGenericGrid(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style = 0, const wxString& name = "grid")
{
Create(parent, id, pos, size, style, name);
}
~wxGenericGrid(void);
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnMouseEvent(wxMouseEvent& event);
void OnSize(wxSizeEvent& event);
~wxGenericGrid();
bool Create(wxWindow *parent, wxWindowID, const wxPoint& pos, const wxSize& size, long style = 0, const wxString& name = "grid");
bool CreateGrid(int nRows, int nCols, wxString **cellValues = (wxString **) NULL, short *widths = (short *) NULL,
short defaultWidth = wxGRID_DEFAULT_CELL_WIDTH, short defaultHeight = wxGRID_DEFAULT_CELL_HEIGHT);
void PaintGrid(wxDC& dc);
void ClearGrid(void);
void ClearGrid();
virtual wxGridCell *GetCell(int row, int col) const;
inline wxGridCell ***GetCells(void) const { return m_gridCells; }
wxGridCell ***GetCells() const { return m_gridCells; }
bool InsertCols(int pos = 0, int n = 1, bool updateLabels = TRUE);
bool InsertRows(int pos = 0, int n = 1, bool updateLabels = TRUE);
bool AppendCols(int n = 1, bool updateLabels = TRUE);
@@ -87,16 +85,16 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void SetCellAlignment(int flag, int row, int col);
void SetCellAlignment(int flag);
int GetCellAlignment(int row, int col) const;
int GetCellAlignment(void) const;
int GetCellAlignment() const;
void SetCellTextColour(const wxColour& val, int row, int col);
void SetCellTextColour(const wxColour& col);
wxColour& GetCellTextColour(int row, int col) const;
inline wxColour& GetCellTextColour(void) const { return (wxColour&) m_cellTextColour; }
wxColour& GetCellTextColour() const { return (wxColour&) m_cellTextColour; }
void SetCellBackgroundColour(const wxColour& col);
void SetCellBackgroundColour(const wxColour& colour, int row, int col);
inline wxColour& GetCellBackgroundColour(void) const { return (wxColour&) m_cellBackgroundColour; }
wxColour& GetCellBackgroundColour() const { return (wxColour&) m_cellBackgroundColour; }
wxColour& GetCellBackgroundColour(int row, int col) const;
inline wxFont& GetCellTextFont(void) const { return (wxFont&) m_cellTextFont; }
wxFont& GetCellTextFont() const { return (wxFont&) m_cellTextFont; }
wxFont& GetCellTextFont(int row, int col) const;
void SetCellTextFont(const wxFont& fnt);
void SetCellTextFont(const wxFont& fnt, int row, int col);
@@ -119,30 +117,34 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
wxString& GetLabelValue(int orientation, int pos) const;
void SetLabelTextColour(const wxColour& colour);
void SetLabelBackgroundColour(const wxColour& colour);
inline wxColour& GetLabelTextColour(void) const { return (wxColour&) m_labelTextColour; }
inline wxColour& GetLabelBackgroundColour(void) { return (wxColour&) m_labelBackgroundColour; }
inline wxFont& GetLabelTextFont(void) { return (wxFont&) m_labelTextFont; }
inline void SetLabelTextFont(const wxFont& fnt) { m_labelTextFont = fnt; }
wxColour& GetLabelTextColour() const { return (wxColour&) m_labelTextColour; }
wxColour& GetLabelBackgroundColour() { return (wxColour&) m_labelBackgroundColour; }
wxFont& GetLabelTextFont() { return (wxFont&) m_labelTextFont; }
void SetLabelTextFont(const wxFont& fnt) { m_labelTextFont = fnt; }
// Miscellaneous accessors
inline int GetCursorRow(void) const { return m_wCursorRow; }
inline int GetCursorColumn(void) const { return m_wCursorColumn; }
int GetCursorRow() const { return m_wCursorRow; }
int GetCursorColumn() const { return m_wCursorColumn; }
void SetGridCursor(int row, int col);
inline int GetRows(void) const { return m_totalRows; }
inline int GetCols(void) const { return m_totalCols; }
inline int GetScrollPosX(void) const { return m_scrollPosX; }
inline int GetScrollPosY(void) const { return m_scrollPosY; }
inline void SetScrollPosX(int pos) { m_scrollPosX = pos; }
inline void SetScrollPosY(int pos) { m_scrollPosY = pos; }
inline wxTextCtrl *GetTextItem(void) const { return m_textItem; }
inline wxScrollBar *GetHorizScrollBar(void) const { return m_hScrollBar; }
inline wxScrollBar *GetVertScrollBar(void) const { return m_vScrollBar; }
inline bool GetEditable(void) const { return m_editable; }
int GetRows() const { return m_totalRows; }
int GetCols() const { return m_totalCols; }
int GetScrollPosX() const { return m_scrollPosX; }
int GetScrollPosY() const { return m_scrollPosY; }
void SetScrollPosX(int pos) { m_scrollPosX = pos; }
void SetScrollPosY(int pos) { m_scrollPosY = pos; }
wxTextCtrl *GetTextItem() const { return m_textItem; }
wxScrollBar *GetHorizScrollBar() const { return m_hScrollBar; }
wxScrollBar *GetVertScrollBar() const { return m_vScrollBar; }
bool GetEditable() const { return m_editable; }
void SetEditable(bool edit);
inline wxRect& GetCurrentRect(void) const { return (wxRect&) m_currentRect; }
inline bool CurrentCellVisible(void) const { return m_currentRectVisible; }
inline void SetDividerPen(const wxPen& pen) { m_divisionPen = pen; }
inline wxPen& GetDividerPen(void) const { return (wxPen&) m_divisionPen; }
bool GetEditInPlace() const { return m_editInPlace; }
void SetEditInPlace(bool edit = TRUE);
wxRect& GetCurrentRect() const { return (wxRect&) m_currentRect; }
bool CurrentCellVisible() const { return m_currentRectVisible; }
void SetDividerPen(const wxPen& pen) { m_divisionPen = pen; }
wxPen& GetDividerPen() const { return (wxPen&) m_divisionPen; }
// High-level event handling
// Override e.g. to check value of current cell; but call
@@ -153,17 +155,17 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void _OnSelectCell(wxGridEvent& event);
// Override to create your own class of grid cell
virtual wxGridCell *OnCreateCell(void);
virtual wxGridCell *OnCreateCell();
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();
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();
void _OnChangeSelectionLabel(wxGridEvent& event);
// Override for event processing
@@ -183,18 +185,18 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void OnActivate(bool active);
// Miscellaneous
void AdjustScrollbars(void);
void UpdateDimensions(void);
void AdjustScrollbars();
void UpdateDimensions();
/* INTERNAL
*/
void SetCurrentRect (int Row, int Column, int canvasW = -1, int canvasH = -1);
void HighlightCell (wxDC *dc);
void DrawCellText(void);
void DrawCellText();
void SetGridClippingRegion(wxDC *dc);
virtual bool CellHitTest(int x, int y, int *row, int *col);
virtual bool LabelSashHitTest(int x, int y, int *orientation, int *rowOrCol, int *startPos);
virtual bool LabelHitTest(int x, int y, int *row, int *col);
// Painting
virtual void DrawLabelAreas(wxDC *dc);
virtual void DrawEditableArea(wxDC *dc);
@@ -213,16 +215,25 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void RefreshCell(int row, int col, bool setText = FALSE);
// Don't refresh within the outer pair of these.
inline void BeginBatch(void) { m_batchCount ++; }
inline void EndBatch(void) { m_batchCount --; }
inline int GetBatchCount(void) { return m_batchCount; }
void BeginBatch() { m_batchCount ++; }
void EndBatch() { m_batchCount --; }
int GetBatchCount() { return m_batchCount; }
// implementation from now on
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnMouseEvent(wxMouseEvent& event);
void OnSize(wxSizeEvent& event);
void OnText(wxCommandEvent& ev);
void OnTextInPlace(wxCommandEvent& ev);
void OnGridScroll(wxScrollEvent& ev);
protected:
wxPanel* m_editingPanel; // Contains the text control
wxTextCtrl* m_textItem;
wxTextCtrl* m_inPlaceTextItem;
wxScrollBar* m_hScrollBar;
wxScrollBar* m_vScrollBar;
int m_wCursorRow;
@@ -232,8 +243,11 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
wxGridCell*** m_gridCells;
wxGridCell** m_rowLabelCells;
wxGridCell** m_colLabelCells;
bool m_editCreated;
bool m_editable;
bool m_editInPlace;
bool m_inOnTextInPlace;
int m_totalRows;
int m_totalCols;
@@ -290,6 +304,7 @@ DECLARE_EVENT_TABLE()
#define wxGRID_TEXT_CTRL 2000
#define wxGRID_HSCROLL 2001
#define wxGRID_VSCROLL 2002
#define wxGRID_EDIT_IN_PLACE_TEXT_CTRL 2003
class WXDLLEXPORT wxGridCell : public wxObject
{
@@ -303,42 +318,45 @@ class WXDLLEXPORT wxGridCell: public wxObject
int alignment;
wxGridCell(wxGenericGrid *window = (wxGenericGrid *) NULL);
~wxGridCell(void);
~wxGridCell();
virtual wxString& GetTextValue(void) const { return (wxString&) textValue; }
virtual wxString& GetTextValue() const { return (wxString&) textValue; }
virtual void SetTextValue(const wxString& str) { textValue = str; }
inline wxFont& GetFont(void) const { return (wxFont&) font; }
inline void SetFont(const wxFont& f) { font = f; }
inline wxColour& GetTextColour(void) const { return (wxColour&) textColour; }
inline void SetTextColour(const wxColour& colour) { textColour = colour; }
inline wxColour& GetBackgroundColour(void) const { return (wxColour&) backgroundColour; }
wxFont& GetFont() const { return (wxFont&) font; }
void SetFont(const wxFont& f) { font = f; }
wxColour& GetTextColour() const { return (wxColour&) textColour; }
void SetTextColour(const wxColour& colour) { textColour = colour; }
wxColour& GetBackgroundColour() const { return (wxColour&) backgroundColour; }
void SetBackgroundColour(const wxColour& colour);
inline wxBrush& GetBackgroundBrush(void) const { return (wxBrush&) backgroundBrush; }
inline void SetBackgroundBrush(const wxBrush& brush) { backgroundBrush = brush; }
inline int GetAlignment(void) const { return alignment; }
inline void SetAlignment(int align) { alignment = align; }
inline wxBitmap *GetCellBitmap(void) const { return cellBitmap; }
inline void SetCellBitmap(wxBitmap *bitmap) { cellBitmap = bitmap; }
wxBrush& GetBackgroundBrush() const { return (wxBrush&) backgroundBrush; }
void SetBackgroundBrush(const wxBrush& brush) { backgroundBrush = brush; }
int GetAlignment() const { return alignment; }
void SetAlignment(int align) { alignment = align; }
wxBitmap *GetCellBitmap() const { return cellBitmap; }
void SetCellBitmap(wxBitmap *bitmap) { cellBitmap = bitmap; }
};
class WXDLLEXPORT wxGrid : public wxGenericGrid
{
public:
wxGrid(void):wxGenericGrid() {}
wxGrid() : wxGenericGrid() { }
wxGrid(wxWindow *parent, int x=-1, int y=-1, int width=-1, int height=-1,
long style=0, char *name = "gridWindow"):
wxGenericGrid(parent, x, y, width, height, style, name)
long style=0, char *name = "gridWindow")
: wxGenericGrid(parent, x, y, width, height, style, name)
{
}
};
class WXDLLEXPORT wxGridEvent : public wxCommandEvent {
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,
@@ -349,7 +367,7 @@ public:
SetEventObject(obj);
}
//private:
int m_row;
int m_col;
int m_x;
@@ -382,5 +400,5 @@ typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
#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
#endif // __GRIDH_G__

View File

@@ -34,6 +34,7 @@ class MyApp: public wxApp
bool OnInit(void);
};
// Define a new frame type
class MyFrame: public wxFrame
{ public:
@@ -41,6 +42,7 @@ class MyFrame: public wxFrame
MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
void ToggleEditable(wxCommandEvent& event);
void ToggleEditInPlace(wxCommandEvent& event);
void ToggleRowLabel(wxCommandEvent& event);
void ToggleColLabel(wxCommandEvent& event);
void ToggleDividers(wxCommandEvent& event);
@@ -66,6 +68,7 @@ wxBitmap *cellBitmap2 = (wxBitmap *) NULL;
// ID for the menu quit command
#define GRID_QUIT 1
#define GRID_TOGGLE_EDITABLE 2
#define GRID_TOGGLE_EDITINPLACE 22
#define GRID_LEFT_CELL 3
#define GRID_CENTRE_CELL 4
#define GRID_RIGHT_CELL 5
@@ -105,6 +108,7 @@ bool MyApp::OnInit(void)
wxMenu *settings_menu = new wxMenu;
settings_menu->Append(GRID_TOGGLE_EDITABLE, "&Toggle editable");
settings_menu->Append(GRID_TOGGLE_EDITINPLACE, "&Toggle edit in place");
settings_menu->Append(GRID_TOGGLE_ROW_LABEL, "Toggle ro&w label");
settings_menu->Append(GRID_TOGGLE_COL_LABEL, "Toggle co&l label");
settings_menu->Append(GRID_TOGGLE_DIVIDERS, "Toggle &dividers");
@@ -164,6 +168,7 @@ MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, cons
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(GRID_TOGGLE_EDITABLE, MyFrame::ToggleEditable)
EVT_MENU(GRID_TOGGLE_EDITINPLACE, MyFrame::ToggleEditInPlace)
EVT_MENU(GRID_TOGGLE_ROW_LABEL, MyFrame::ToggleRowLabel)
EVT_MENU(GRID_TOGGLE_COL_LABEL, MyFrame::ToggleColLabel)
EVT_MENU(GRID_TOGGLE_DIVIDERS, MyFrame::ToggleDividers)
@@ -185,6 +190,12 @@ void MyFrame::ToggleEditable(wxCommandEvent& WXUNUSED(event))
grid->Refresh();
}
void MyFrame::ToggleEditInPlace(wxCommandEvent& WXUNUSED(event))
{
grid->SetEditInPlace(!grid->GetEditInPlace());
grid->Refresh();
}
void MyFrame::ToggleRowLabel(wxCommandEvent& WXUNUSED(event))
{
if (grid->GetLabelSize(wxVERTICAL) > 0)

View File

@@ -2,7 +2,8 @@
// Name: gridg.cpp
// Purpose: wxGenericGrid
// Author: Julian Smart
// Modified by:
// Modified by: Michael Bedward 20 Apr 1999
// Added edit in place facility
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
@@ -54,6 +55,7 @@ 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_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll)
EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll)
@@ -71,8 +73,6 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
END_EVENT_TABLE()
wxGenericGrid::wxGenericGrid(void)
{
m_batchCount = 0;
@@ -89,6 +89,10 @@ wxGenericGrid::wxGenericGrid(void)
m_textItem = (wxTextCtrl *) NULL;
m_currentRectVisible = FALSE;
m_editable = TRUE;
m_editInPlace = TRUE;
m_inOnTextInPlace = FALSE;
#if defined(__WIN95__)
m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
#elif defined(__WXGTK__)
@@ -209,7 +213,8 @@ 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),
wxPoint(m_editControlPosition.x, m_editControlPosition.y),
wxSize(m_editControlPosition.width, -1),
0);
m_textItem->Show(TRUE);
m_textItem->SetFocus();
@@ -227,6 +232,13 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
// 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 ),
wxNO_BORDER );
m_inPlaceTextItem->Show(TRUE);
m_inPlaceTextItem->SetFocus();
return TRUE;
}
@@ -517,7 +529,7 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
/* Hilight present cell */
SetCurrentRect(m_wCursorRow, m_wCursorColumn);
if (m_currentRectVisible)
if (m_currentRectVisible && !(m_editable && m_editInPlace))
HighlightCell(& dc);
dc.DestroyClippingRegion();
@@ -1400,8 +1412,11 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
SetGridClippingRegion(dc);
// Remove the highlight from the old cell
if (m_currentRectVisible)
if ( m_currentRectVisible && !(m_editable && m_editInPlace) )
{
HighlightCell(dc);
}
// Highlight the new cell and copy its content to the edit control
SetCurrentRect(m_wCursorRow, m_wCursorColumn);
@@ -1416,18 +1431,46 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
SetGridClippingRegion(dc);
if ( m_editable && m_editInPlace )
{
m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
m_currentRect.width+4, m_currentRect.height+4 );
if ( cell )
{
if ( cell->GetTextValue().IsNull() )
{
m_inPlaceTextItem->SetValue( "" );
}
else
{
m_inPlaceTextItem->SetFont( cell->GetFont() );
m_inPlaceTextItem->SetValue( cell->GetTextValue() );
}
}
m_inPlaceTextItem->Show(TRUE);
m_inPlaceTextItem->SetFocus();
}
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.
// Put back for Motif only on advice of Michael Bedward
//
// 3) It *is* needed for Motif - michael
//
#ifdef __WXMOTIF__
if ( !(m_editable && m_editInPlace) )
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);
}
@@ -1515,8 +1558,6 @@ void wxGenericGrid::DrawCellText(void)
if (!cell)
return;
static wxChar szEdit[300];
wxClientDC dc(this);
dc.BeginDrawing();
@@ -1525,7 +1566,7 @@ void wxGenericGrid::DrawCellText(void)
dc.SetBackgroundMode(wxTRANSPARENT);
dc.SetBrush(cell->GetBackgroundBrush());
wxStrcpy(szEdit, m_textItem->GetValue());
wxString editValue = m_textItem->GetValue();
wxRect rect;
rect = m_currentRect;
@@ -1534,8 +1575,9 @@ void wxGenericGrid::DrawCellText(void)
rect.width -= 5;
rect.height -= 4;
DrawTextRect(& dc, _T(" "), &rect, wxLEFT);
DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment());
// FIXME: what's this string of spaces supposed to represent?
DrawTextRect(& dc, " ", &rect, wxLEFT);
DrawTextRect(& dc, editValue, &rect, cell->GetAlignment());
dc.DestroyClippingRegion();
@@ -1966,6 +2008,12 @@ void wxGenericGrid::SetEditable(bool edit)
m_textItem->Show(TRUE);
m_textItem->SetFocus();
}
if (m_inPlaceTextItem)
{
m_inPlaceTextItem->Show(TRUE);
m_inPlaceTextItem->SetFocus();
}
}
else
{
@@ -1975,6 +2023,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());
@@ -1994,6 +2047,47 @@ 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-2, m_currentRect.y-2,
m_currentRect.width+4, m_currentRect.height+4 );
wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn);
if ( cell )
{
if ( cell->GetTextValue().IsNull() )
{
m_inPlaceTextItem->SetValue( "" );
}
else
{
m_inPlaceTextItem->SetFont( cell->GetFont() );
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);
@@ -2394,7 +2488,7 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetGridClippingRegion(& dc);
if (m_currentRectVisible)
if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc);
m_wCursorRow = row;
@@ -2405,7 +2499,7 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetCurrentRect(row, col, cw, ch);
if (m_currentRectVisible)
if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc);
dc.DestroyClippingRegion();
@@ -2454,19 +2548,30 @@ void wxGridCell::SetBackgroundColour(const wxColour& colour)
}
void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
{
// 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() );
}
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());
grid->HighlightCell(& dc);
if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc);
dc.DestroyClippingRegion();
dc.EndDrawing();
@@ -2478,6 +2583,23 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
// grid->DrawCellText();
}
}
}
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::OnGridScroll(wxScrollEvent& ev)
{
@@ -2486,6 +2608,8 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
if ( inScroll )
return;
if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
inScroll = TRUE;
wxGenericGrid *win = this;
@@ -2512,6 +2636,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
AdjustScrollbars();
if (change) win->Refresh(FALSE);
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->Show( TRUE );
m_inPlaceTextItem->SetFocus();
}
inScroll = FALSE;
}