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} \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}. 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. 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} \membersection{wxGrid::GetHorizScrollBar}\label{wxgridgethorizscrollbar}
\constfunc{wxScrollBar *}{GetHorizScrollBar}{\void} \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 text edit control. If FALSE, the text edit control will be hidden and the user will not
be able to edit the cell contents. 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} \membersection{wxGrid::SetGridCursor}\label{wxgridsetgridcursor}
\func{void}{SetGridCursor}{\param{int }{row}, \param{int}{ col}} \func{void}{SetGridCursor}{\param{int }{row}, \param{int}{ col}}

View File

@@ -2,7 +2,8 @@
// Name: gridg.h // Name: gridg.h
// Purpose: wxGenericGrid // Purpose: wxGenericGrid
// Author: Julian Smart // Author: Julian Smart
// Modified by: // Modified by: Michael Bedward 20 April 1999
// Added edit in place facility
// Created: 01/02/97 // Created: 01/02/97
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) // Copyright: (c)
@@ -34,46 +35,43 @@
#define wxGRID_DEFAULT_HORIZONAL_LABEL_HEIGHT 20 #define wxGRID_DEFAULT_HORIZONAL_LABEL_HEIGHT 20
#ifndef wxLEFT #ifndef wxLEFT
#define wxLEFT 0x0400 #define wxLEFT 0x0400
#endif #endif
#ifndef wxRIGHT #ifndef wxRIGHT
#define wxRIGHT 0x0800 #define wxRIGHT 0x0800
#endif #endif
#define WXGENERIC_GRID_VERSION 0.5 #define WXGENERIC_GRID_VERSION 0.5
class WXDLLEXPORT wxGridEvent; class WXDLLEXPORT wxGridEvent;
class WXDLLEXPORT wxGridCell; class WXDLLEXPORT wxGridCell;
class WXDLLEXPORT wxGenericGrid: public wxPanel
class WXDLLEXPORT wxGenericGrid : public wxPanel
{ {
DECLARE_DYNAMIC_CLASS(wxGenericGrid) 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); 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); Create(parent, id, pos, size, style, name);
} }
~wxGenericGrid(void); ~wxGenericGrid();
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnMouseEvent(wxMouseEvent& event);
void OnSize(wxSizeEvent& event);
bool Create(wxWindow *parent, wxWindowID, const wxPoint& pos, const wxSize& size, long style = 0, const wxString& name = "grid"); 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, 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); short defaultWidth = wxGRID_DEFAULT_CELL_WIDTH, short defaultHeight = wxGRID_DEFAULT_CELL_HEIGHT);
void PaintGrid(wxDC& dc); void PaintGrid(wxDC& dc);
void ClearGrid(void); void ClearGrid();
virtual wxGridCell *GetCell(int row, int col) const; 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 InsertCols(int pos = 0, int n = 1, bool updateLabels = TRUE);
bool InsertRows(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); 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 row, int col);
void SetCellAlignment(int flag); void SetCellAlignment(int flag);
int GetCellAlignment(int row, int col) const; 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& val, int row, int col);
void SetCellTextColour(const wxColour& col); void SetCellTextColour(const wxColour& col);
wxColour& GetCellTextColour(int row, int col) const; 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& col);
void SetCellBackgroundColour(const wxColour& colour, int row, int 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; 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; wxFont& GetCellTextFont(int row, int col) const;
void SetCellTextFont(const wxFont& fnt); void SetCellTextFont(const wxFont& fnt);
void SetCellTextFont(const wxFont& fnt, int row, int col); 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; wxString& GetLabelValue(int orientation, int pos) const;
void SetLabelTextColour(const wxColour& colour); void SetLabelTextColour(const wxColour& colour);
void SetLabelBackgroundColour(const wxColour& colour); void SetLabelBackgroundColour(const wxColour& colour);
inline wxColour& GetLabelTextColour(void) const { return (wxColour&) m_labelTextColour; } wxColour& GetLabelTextColour() const { return (wxColour&) m_labelTextColour; }
inline wxColour& GetLabelBackgroundColour(void) { return (wxColour&) m_labelBackgroundColour; } wxColour& GetLabelBackgroundColour() { return (wxColour&) m_labelBackgroundColour; }
inline wxFont& GetLabelTextFont(void) { return (wxFont&) m_labelTextFont; } wxFont& GetLabelTextFont() { return (wxFont&) m_labelTextFont; }
inline void SetLabelTextFont(const wxFont& fnt) { m_labelTextFont = fnt; } void SetLabelTextFont(const wxFont& fnt) { m_labelTextFont = fnt; }
// Miscellaneous accessors // Miscellaneous accessors
inline int GetCursorRow(void) const { return m_wCursorRow; } int GetCursorRow() const { return m_wCursorRow; }
inline int GetCursorColumn(void) const { return m_wCursorColumn; } int GetCursorColumn() const { return m_wCursorColumn; }
void SetGridCursor(int row, int col); void SetGridCursor(int row, int col);
inline int GetRows(void) const { return m_totalRows; } int GetRows() const { return m_totalRows; }
inline int GetCols(void) const { return m_totalCols; } int GetCols() const { return m_totalCols; }
inline int GetScrollPosX(void) const { return m_scrollPosX; } int GetScrollPosX() const { return m_scrollPosX; }
inline int GetScrollPosY(void) const { return m_scrollPosY; } int GetScrollPosY() const { return m_scrollPosY; }
inline void SetScrollPosX(int pos) { m_scrollPosX = pos; } void SetScrollPosX(int pos) { m_scrollPosX = pos; }
inline void SetScrollPosY(int pos) { m_scrollPosY = pos; } void SetScrollPosY(int pos) { m_scrollPosY = pos; }
inline wxTextCtrl *GetTextItem(void) const { return m_textItem; } wxTextCtrl *GetTextItem() const { return m_textItem; }
inline wxScrollBar *GetHorizScrollBar(void) const { return m_hScrollBar; } wxScrollBar *GetHorizScrollBar() const { return m_hScrollBar; }
inline wxScrollBar *GetVertScrollBar(void) const { return m_vScrollBar; } wxScrollBar *GetVertScrollBar() const { return m_vScrollBar; }
inline bool GetEditable(void) const { return m_editable; } bool GetEditable() const { return m_editable; }
void SetEditable(bool edit); void SetEditable(bool edit);
inline wxRect& GetCurrentRect(void) const { return (wxRect&) m_currentRect; }
inline bool CurrentCellVisible(void) const { return m_currentRectVisible; } bool GetEditInPlace() const { return m_editInPlace; }
inline void SetDividerPen(const wxPen& pen) { m_divisionPen = pen; } void SetEditInPlace(bool edit = TRUE);
inline wxPen& GetDividerPen(void) const { return (wxPen&) m_divisionPen; }
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 // High-level event handling
// Override e.g. to check value of current cell; but call // Override e.g. to check value of current cell; but call
@@ -153,17 +155,17 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void _OnSelectCell(wxGridEvent& event); void _OnSelectCell(wxGridEvent& event);
// Override to create your own class of grid cell // Override to create your own class of grid cell
virtual wxGridCell *OnCreateCell(void); virtual wxGridCell *OnCreateCell();
void _OnCreateCell(wxGridEvent& event); void _OnCreateCell(wxGridEvent& event);
// Override to change labels e.g. creation of grid, inserting/deleting a row/col. // Override to change labels e.g. creation of grid, inserting/deleting a row/col.
// By default, auto-labels the grid. // By default, auto-labels the grid.
virtual void OnChangeLabels(void); virtual void OnChangeLabels();
void _OnChangeLabels(wxGridEvent& event); void _OnChangeLabels(wxGridEvent& event);
// Override to change the label of the edit field when selecting a cell // Override to change the label of the edit field when selecting a cell
// By default, sets it to e.g. A12 // By default, sets it to e.g. A12
virtual void OnChangeSelectionLabel(void); virtual void OnChangeSelectionLabel();
void _OnChangeSelectionLabel(wxGridEvent& event); void _OnChangeSelectionLabel(wxGridEvent& event);
// Override for event processing // Override for event processing
@@ -183,18 +185,18 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
void OnActivate(bool active); void OnActivate(bool active);
// Miscellaneous // Miscellaneous
void AdjustScrollbars(void); void AdjustScrollbars();
void UpdateDimensions(void); void UpdateDimensions();
/* INTERNAL
*/
void SetCurrentRect (int Row, int Column, int canvasW = -1, int canvasH = -1); void SetCurrentRect (int Row, int Column, int canvasW = -1, int canvasH = -1);
void HighlightCell (wxDC *dc); void HighlightCell (wxDC *dc);
void DrawCellText(void); void DrawCellText();
void SetGridClippingRegion(wxDC *dc); void SetGridClippingRegion(wxDC *dc);
virtual bool CellHitTest(int x, int y, int *row, int *col); 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 LabelSashHitTest(int x, int y, int *orientation, int *rowOrCol, int *startPos);
virtual bool LabelHitTest(int x, int y, int *row, int *col); virtual bool LabelHitTest(int x, int y, int *row, int *col);
// Painting // Painting
virtual void DrawLabelAreas(wxDC *dc); virtual void DrawLabelAreas(wxDC *dc);
virtual void DrawEditableArea(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); void RefreshCell(int row, int col, bool setText = FALSE);
// Don't refresh within the outer pair of these. // Don't refresh within the outer pair of these.
inline void BeginBatch(void) { m_batchCount ++; } void BeginBatch() { m_batchCount ++; }
inline void EndBatch(void) { m_batchCount --; } void EndBatch() { m_batchCount --; }
inline int GetBatchCount(void) { return 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 OnText(wxCommandEvent& ev);
void OnTextInPlace(wxCommandEvent& ev);
void OnGridScroll(wxScrollEvent& ev); void OnGridScroll(wxScrollEvent& ev);
protected: protected:
wxPanel* m_editingPanel; // Contains the text control wxPanel* m_editingPanel; // Contains the text control
wxTextCtrl* m_textItem; wxTextCtrl* m_textItem;
wxTextCtrl* m_inPlaceTextItem;
wxScrollBar* m_hScrollBar; wxScrollBar* m_hScrollBar;
wxScrollBar* m_vScrollBar; wxScrollBar* m_vScrollBar;
int m_wCursorRow; int m_wCursorRow;
@@ -232,8 +243,11 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
wxGridCell*** m_gridCells; wxGridCell*** m_gridCells;
wxGridCell** m_rowLabelCells; wxGridCell** m_rowLabelCells;
wxGridCell** m_colLabelCells; wxGridCell** m_colLabelCells;
bool m_editCreated; bool m_editCreated;
bool m_editable; bool m_editable;
bool m_editInPlace;
bool m_inOnTextInPlace;
int m_totalRows; int m_totalRows;
int m_totalCols; int m_totalCols;
@@ -284,16 +298,17 @@ class WXDLLEXPORT wxGenericGrid: public wxPanel
// To avoid multiple refreshes, use Begin/EndBatch // To avoid multiple refreshes, use Begin/EndBatch
int m_batchCount; int m_batchCount;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
#define wxGRID_TEXT_CTRL 2000 #define wxGRID_TEXT_CTRL 2000
#define wxGRID_HSCROLL 2001 #define wxGRID_HSCROLL 2001
#define wxGRID_VSCROLL 2002 #define wxGRID_VSCROLL 2002
#define wxGRID_EDIT_IN_PLACE_TEXT_CTRL 2003
class WXDLLEXPORT wxGridCell: public wxObject class WXDLLEXPORT wxGridCell : public wxObject
{ {
public: public:
wxString textValue; wxString textValue;
wxFont font; wxFont font;
wxColour textColour; wxColour textColour;
@@ -303,42 +318,45 @@ class WXDLLEXPORT wxGridCell: public wxObject
int alignment; int alignment;
wxGridCell(wxGenericGrid *window = (wxGenericGrid *) NULL); 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; } virtual void SetTextValue(const wxString& str) { textValue = str; }
inline wxFont& GetFont(void) const { return (wxFont&) font; } wxFont& GetFont() const { return (wxFont&) font; }
inline void SetFont(const wxFont& f) { font = f; } void SetFont(const wxFont& f) { font = f; }
inline wxColour& GetTextColour(void) const { return (wxColour&) textColour; } wxColour& GetTextColour() const { return (wxColour&) textColour; }
inline void SetTextColour(const wxColour& colour) { textColour = colour; } void SetTextColour(const wxColour& colour) { textColour = colour; }
inline wxColour& GetBackgroundColour(void) const { return (wxColour&) backgroundColour; } wxColour& GetBackgroundColour() const { return (wxColour&) backgroundColour; }
void SetBackgroundColour(const wxColour& colour); void SetBackgroundColour(const wxColour& colour);
inline wxBrush& GetBackgroundBrush(void) const { return (wxBrush&) backgroundBrush; } wxBrush& GetBackgroundBrush() const { return (wxBrush&) backgroundBrush; }
inline void SetBackgroundBrush(const wxBrush& brush) { backgroundBrush = brush; } void SetBackgroundBrush(const wxBrush& brush) { backgroundBrush = brush; }
inline int GetAlignment(void) const { return alignment; } int GetAlignment() const { return alignment; }
inline void SetAlignment(int align) { alignment = align; } void SetAlignment(int align) { alignment = align; }
inline wxBitmap *GetCellBitmap(void) const { return cellBitmap; } wxBitmap *GetCellBitmap() const { return cellBitmap; }
inline void SetCellBitmap(wxBitmap *bitmap) { cellBitmap = bitmap; } void SetCellBitmap(wxBitmap *bitmap) { cellBitmap = bitmap; }
}; };
class WXDLLEXPORT wxGrid: public wxGenericGrid class WXDLLEXPORT wxGrid : public wxGenericGrid
{ {
public: public:
wxGrid(void):wxGenericGrid() {} wxGrid() : wxGenericGrid() { }
wxGrid(wxWindow *parent, int x=-1, int y=-1, int width=-1, int height=-1, wxGrid(wxWindow *parent, int x=-1, int y=-1, int width=-1, int height=-1,
long style=0, char *name = "gridWindow"): long style=0, char *name = "gridWindow")
wxGenericGrid(parent, x, y, width, height, style, name) : wxGenericGrid(parent, x, y, width, height, style, name)
{ {
} }
}; };
class WXDLLEXPORT wxGridEvent : public wxCommandEvent { class WXDLLEXPORT wxGridEvent : public wxCommandEvent
{
DECLARE_DYNAMIC_CLASS(wxGridEvent) DECLARE_DYNAMIC_CLASS(wxGridEvent)
public: public:
wxGridEvent() wxGridEvent()
: wxCommandEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1), : wxCommandEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1),
m_control(0), m_shift(0), m_cell(0) m_control(0), m_shift(0), m_cell(0)
{} {
}
wxGridEvent(int id, wxEventType type, wxObject* obj, wxGridEvent(int id, wxEventType type, wxObject* obj,
int row=-1, int col=-1, int x=-1, int y=-1, int row=-1, int col=-1, int x=-1, int y=-1,
@@ -349,7 +367,7 @@ public:
SetEventObject(obj); SetEventObject(obj);
} }
//private:
int m_row; int m_row;
int m_col; int m_col;
int m_x; 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_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 }, #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); bool OnInit(void);
}; };
// Define a new frame type // Define a new frame type
class MyFrame: public wxFrame class MyFrame: public wxFrame
{ public: { public:
@@ -41,6 +42,7 @@ class MyFrame: public wxFrame
MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size); MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
void ToggleEditable(wxCommandEvent& event); void ToggleEditable(wxCommandEvent& event);
void ToggleEditInPlace(wxCommandEvent& event);
void ToggleRowLabel(wxCommandEvent& event); void ToggleRowLabel(wxCommandEvent& event);
void ToggleColLabel(wxCommandEvent& event); void ToggleColLabel(wxCommandEvent& event);
void ToggleDividers(wxCommandEvent& event); void ToggleDividers(wxCommandEvent& event);
@@ -66,6 +68,7 @@ wxBitmap *cellBitmap2 = (wxBitmap *) NULL;
// ID for the menu quit command // ID for the menu quit command
#define GRID_QUIT 1 #define GRID_QUIT 1
#define GRID_TOGGLE_EDITABLE 2 #define GRID_TOGGLE_EDITABLE 2
#define GRID_TOGGLE_EDITINPLACE 22
#define GRID_LEFT_CELL 3 #define GRID_LEFT_CELL 3
#define GRID_CENTRE_CELL 4 #define GRID_CENTRE_CELL 4
#define GRID_RIGHT_CELL 5 #define GRID_RIGHT_CELL 5
@@ -105,6 +108,7 @@ bool MyApp::OnInit(void)
wxMenu *settings_menu = new wxMenu; wxMenu *settings_menu = new wxMenu;
settings_menu->Append(GRID_TOGGLE_EDITABLE, "&Toggle editable"); 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_ROW_LABEL, "Toggle ro&w label");
settings_menu->Append(GRID_TOGGLE_COL_LABEL, "Toggle co&l label"); settings_menu->Append(GRID_TOGGLE_COL_LABEL, "Toggle co&l label");
settings_menu->Append(GRID_TOGGLE_DIVIDERS, "Toggle &dividers"); 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) BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(GRID_TOGGLE_EDITABLE, MyFrame::ToggleEditable) 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_ROW_LABEL, MyFrame::ToggleRowLabel)
EVT_MENU(GRID_TOGGLE_COL_LABEL, MyFrame::ToggleColLabel) EVT_MENU(GRID_TOGGLE_COL_LABEL, MyFrame::ToggleColLabel)
EVT_MENU(GRID_TOGGLE_DIVIDERS, MyFrame::ToggleDividers) EVT_MENU(GRID_TOGGLE_DIVIDERS, MyFrame::ToggleDividers)
@@ -185,6 +190,12 @@ void MyFrame::ToggleEditable(wxCommandEvent& WXUNUSED(event))
grid->Refresh(); grid->Refresh();
} }
void MyFrame::ToggleEditInPlace(wxCommandEvent& WXUNUSED(event))
{
grid->SetEditInPlace(!grid->GetEditInPlace());
grid->Refresh();
}
void MyFrame::ToggleRowLabel(wxCommandEvent& WXUNUSED(event)) void MyFrame::ToggleRowLabel(wxCommandEvent& WXUNUSED(event))
{ {
if (grid->GetLabelSize(wxVERTICAL) > 0) if (grid->GetLabelSize(wxVERTICAL) > 0)

View File

@@ -2,7 +2,8 @@
// Name: gridg.cpp // Name: gridg.cpp
// Purpose: wxGenericGrid // Purpose: wxGenericGrid
// Author: Julian Smart // Author: Julian Smart
// Modified by: // Modified by: Michael Bedward 20 Apr 1999
// Added edit in place facility
// Created: 04/01/98 // Created: 04/01/98
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem // Copyright: (c) Julian Smart and Markus Holzem
@@ -18,7 +19,7 @@
#include "wx/wxprec.h" #include "wx/wxprec.h"
#ifdef __BORLANDC__ #ifdef __BORLANDC__
#pragma hdrstop #pragma hdrstop
#endif #endif
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
@@ -36,9 +37,9 @@
// Set to zero to use no double-buffering // Set to zero to use no double-buffering
#ifdef __WXMSW__ #ifdef __WXMSW__
#define wxUSE_DOUBLE_BUFFERING 1 #define wxUSE_DOUBLE_BUFFERING 1
#else #else
#define wxUSE_DOUBLE_BUFFERING 0 #define wxUSE_DOUBLE_BUFFERING 0
#endif #endif
#define wxGRID_DRAG_NONE 0 #define wxGRID_DRAG_NONE 0
@@ -54,6 +55,7 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground) EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground)
EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent) EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent)
EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText) 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_HSCROLL, wxGenericGrid::OnGridScroll)
EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll) EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll)
@@ -71,8 +73,6 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
END_EVENT_TABLE() END_EVENT_TABLE()
wxGenericGrid::wxGenericGrid(void) wxGenericGrid::wxGenericGrid(void)
{ {
m_batchCount = 0; m_batchCount = 0;
@@ -89,6 +89,10 @@ wxGenericGrid::wxGenericGrid(void)
m_textItem = (wxTextCtrl *) NULL; m_textItem = (wxTextCtrl *) NULL;
m_currentRectVisible = FALSE; m_currentRectVisible = FALSE;
m_editable = TRUE; m_editable = TRUE;
m_editInPlace = TRUE;
m_inOnTextInPlace = FALSE;
#if defined(__WIN95__) #if defined(__WIN95__)
m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
#elif defined(__WXGTK__) #elif defined(__WXGTK__)
@@ -209,7 +213,8 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
m_editingPanel = new wxPanel(this); m_editingPanel = new wxPanel(this);
m_textItem = new wxTextCtrl(m_editingPanel, wxGRID_TEXT_CTRL, "", 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); 0);
m_textItem->Show(TRUE); m_textItem->Show(TRUE);
m_textItem->SetFocus(); 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); // 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; return TRUE;
} }
@@ -517,7 +529,7 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
/* Hilight present cell */ /* Hilight present cell */
SetCurrentRect(m_wCursorRow, m_wCursorColumn); SetCurrentRect(m_wCursorRow, m_wCursorColumn);
if (m_currentRectVisible) if (m_currentRectVisible && !(m_editable && m_editInPlace))
HighlightCell(& dc); HighlightCell(& dc);
dc.DestroyClippingRegion(); dc.DestroyClippingRegion();
@@ -1400,8 +1412,11 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
SetGridClippingRegion(dc); SetGridClippingRegion(dc);
// Remove the highlight from the old cell // Remove the highlight from the old cell
if (m_currentRectVisible) if ( m_currentRectVisible && !(m_editable && m_editInPlace) )
{
HighlightCell(dc); HighlightCell(dc);
}
// Highlight the new cell and copy its content to the edit control // Highlight the new cell and copy its content to the edit control
SetCurrentRect(m_wCursorRow, m_wCursorColumn); SetCurrentRect(m_wCursorRow, m_wCursorColumn);
@@ -1416,18 +1431,46 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
SetGridClippingRegion(dc); 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?? // 1) Why isn't this needed for Windows??
// Probably because of the SetValue?? JS. // Probably because of the SetValue?? JS.
// 2) Arrrrrgh. This isn't needed anywhere, // 2) Arrrrrgh. This isn't needed anywhere,
// of course. One hour of debugging... RR. // 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__ #ifdef __WXMOTIF__
if ( !(m_editable && m_editInPlace) )
HighlightCell(dc); HighlightCell(dc);
#endif #endif
}
dc->DestroyClippingRegion(); dc->DestroyClippingRegion();
//OnSelectCell(row, col); OnSelectCell(row, col);
wxGridEvent g_evt2(GetId(), wxEVT_GRID_SELECT_CELL, this, row, col); wxGridEvent g_evt2(GetId(), wxEVT_GRID_SELECT_CELL, this, row, col);
GetEventHandler()->ProcessEvent(g_evt2); GetEventHandler()->ProcessEvent(g_evt2);
} }
@@ -1515,8 +1558,6 @@ void wxGenericGrid::DrawCellText(void)
if (!cell) if (!cell)
return; return;
static wxChar szEdit[300];
wxClientDC dc(this); wxClientDC dc(this);
dc.BeginDrawing(); dc.BeginDrawing();
@@ -1525,7 +1566,7 @@ void wxGenericGrid::DrawCellText(void)
dc.SetBackgroundMode(wxTRANSPARENT); dc.SetBackgroundMode(wxTRANSPARENT);
dc.SetBrush(cell->GetBackgroundBrush()); dc.SetBrush(cell->GetBackgroundBrush());
wxStrcpy(szEdit, m_textItem->GetValue()); wxString editValue = m_textItem->GetValue();
wxRect rect; wxRect rect;
rect = m_currentRect; rect = m_currentRect;
@@ -1534,8 +1575,9 @@ void wxGenericGrid::DrawCellText(void)
rect.width -= 5; rect.width -= 5;
rect.height -= 4; rect.height -= 4;
DrawTextRect(& dc, _T(" "), &rect, wxLEFT); // FIXME: what's this string of spaces supposed to represent?
DrawTextRect(& dc, szEdit, &rect, cell->GetAlignment()); DrawTextRect(& dc, " ", &rect, wxLEFT);
DrawTextRect(& dc, editValue, &rect, cell->GetAlignment());
dc.DestroyClippingRegion(); dc.DestroyClippingRegion();
@@ -1966,6 +2008,12 @@ void wxGenericGrid::SetEditable(bool edit)
m_textItem->Show(TRUE); m_textItem->Show(TRUE);
m_textItem->SetFocus(); m_textItem->SetFocus();
} }
if (m_inPlaceTextItem)
{
m_inPlaceTextItem->Show(TRUE);
m_inPlaceTextItem->SetFocus();
}
} }
else else
{ {
@@ -1975,6 +2023,11 @@ void wxGenericGrid::SetEditable(bool edit)
m_textItem->Show(FALSE); m_textItem->Show(FALSE);
m_editingPanel->Show(FALSE); m_editingPanel->Show(FALSE);
} }
if ( m_inPlaceTextItem )
{
m_inPlaceTextItem->Show(FALSE);
}
} }
UpdateDimensions(); UpdateDimensions();
SetCurrentRect(GetCursorRow(), GetCursorColumn()); 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) void wxGenericGrid::SetCellAlignment(int flag, int row, int col)
{ {
wxGridCell *cell = GetCell(row, col); wxGridCell *cell = GetCell(row, col);
@@ -2394,7 +2488,7 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetGridClippingRegion(& dc); SetGridClippingRegion(& dc);
if (m_currentRectVisible) if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc); HighlightCell(& dc);
m_wCursorRow = row; m_wCursorRow = row;
@@ -2405,7 +2499,7 @@ void wxGenericGrid::SetGridCursor(int row, int col)
SetCurrentRect(row, col, cw, ch); SetCurrentRect(row, col, cw, ch);
if (m_currentRectVisible) if (m_currentRectVisible && !(m_editable && m_editInPlace) )
HighlightCell(& dc); HighlightCell(& dc);
dc.DestroyClippingRegion(); dc.DestroyClippingRegion();
@@ -2455,18 +2549,29 @@ void wxGridCell::SetBackgroundColour(const wxColour& colour)
void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) ) 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; wxGenericGrid *grid = this;
wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn());
if (cell && grid->CurrentCellVisible()) if (cell && grid->CurrentCellVisible())
{ {
cell->SetTextValue(grid->GetTextItem()->GetValue()); cell->SetTextValue(grid->GetTextItem()->GetValue());
if ( m_editInPlace && !m_inOnTextInPlace )
{
m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() );
}
wxClientDC dc(grid); wxClientDC dc(grid);
dc.BeginDrawing(); dc.BeginDrawing();
grid->SetGridClippingRegion(& dc); grid->SetGridClippingRegion(& dc);
grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
grid->DrawCellValue(& 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.DestroyClippingRegion();
dc.EndDrawing(); dc.EndDrawing();
@@ -2475,7 +2580,24 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
grid->GetCursorRow(), grid->GetCursorColumn()); grid->GetCursorRow(), grid->GetCursorColumn());
GetEventHandler()->ProcessEvent(g_evt); GetEventHandler()->ProcessEvent(g_evt);
// grid->DrawCellText(); // 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;
}
} }
} }
@@ -2486,6 +2608,8 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
if ( inScroll ) if ( inScroll )
return; return;
if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
inScroll = TRUE; inScroll = TRUE;
wxGenericGrid *win = this; wxGenericGrid *win = this;
@@ -2512,6 +2636,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
AdjustScrollbars(); AdjustScrollbars();
if (change) win->Refresh(FALSE); 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; inScroll = FALSE;
} }