#define WXGRID_DEFAULT_COL_WIDTH 80
#define WXGRID_DEFAULT_COL_LABEL_HEIGHT 32
#define WXGRID_DEFAULT_ROW_LABEL_WIDTH 82
-#define WXGRID_LABEL_EDGE_ZONE 5
+#define WXGRID_LABEL_EDGE_ZONE 2
#define WXGRID_MIN_ROW_HEIGHT 15
#define WXGRID_MIN_COL_WIDTH 15
#define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16
#define wxGRID_VALUE_BOOL _T("bool")
#define wxGRID_VALUE_NUMBER _T("long")
#define wxGRID_VALUE_FLOAT _T("double")
+#define wxGRID_VALUE_CHOICE _T("choice")
#define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING
#define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER
class WXDLLEXPORT wxGridTableBase;
class WXDLLEXPORT wxGridWindow;
class WXDLLEXPORT wxGridTypeRegistry;
+class WXDLLEXPORT wxGridSelection;
class WXDLLEXPORT wxCheckBox;
class WXDLLEXPORT wxComboBox;
#define wxSafeDecRef(p) if ( p ) (p)->DecRef()
// ----------------------------------------------------------------------------
-// wxGridCellRenderer: this class is responsible for actually drawing the cell
-// in the grid. You may pass it to the wxGridCellAttr (below) to change the
-// format of one given cell or to wxGrid::SetDefaultRenderer() to change the
-// view of all cells. This is an ABC, you will normally use one of the
-// predefined derived classes or derive your own class from it.
+// wxGridCellWorker: common base class for wxGridCellRenderer and
+// wxGridCellEditor
+//
+// NB: this is more an implementation convenience than a design issue, so this
+// class is not documented and is not public at all
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellRenderer
+class WXDLLEXPORT wxGridCellWorker
{
public:
- wxGridCellRenderer() { m_nRef = 1; }
+ wxGridCellWorker() { m_nRef = 1; }
// this class is ref counted: it is created with ref count of 1, so
// calling DecRef() once will delete it. Calling IncRef() allows to lock
void IncRef() { m_nRef++; }
void DecRef() { if ( !--m_nRef ) delete this; }
+ // interpret renderer parameters: arbitrary string whose interpretatin is
+ // left to the derived classes
+ virtual void SetParameters(const wxString& params);
+
+protected:
+ // virtual dtor for any base class - private because only DecRef() can
+ // delete us
+ virtual ~wxGridCellWorker();
+
+private:
+ size_t m_nRef;
+
+ // suppress the stupid gcc warning about the class having private dtor and
+ // no friends
+ friend class wxGridCellWorkerDummyFriend;
+};
+
+// ----------------------------------------------------------------------------
+// wxGridCellRenderer: this class is responsible for actually drawing the cell
+// in the grid. You may pass it to the wxGridCellAttr (below) to change the
+// format of one given cell or to wxGrid::SetDefaultRenderer() to change the
+// view of all cells. This is an ABC, you will normally use one of the
+// predefined derived classes or derive your own class from it.
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxGridCellRenderer : public wxGridCellWorker
+{
+public:
// draw the given cell on the provided DC inside the given rectangle
// using the style specified by the attribute and the default or selected
// state corresponding to the isSelected value.
wxDC& dc,
int row, int col) = 0;
- // interpret renderer parameters: arbitrary string whose interpretatin is
- // left to the derived classes
- virtual void SetParameters(const wxString& params);
-
// create a new object which is the copy of this one
virtual wxGridCellRenderer *Clone() const = 0;
-
-protected:
- // virtual dtor for any base class - private because only DecRef() can
- // delete us
- virtual ~wxGridCellRenderer();
-
-private:
- size_t m_nRef;
-
- // suppress the stupid gcc warning about the class having private dtor and
- // no friends
- friend class wxGridCellRendererDummyFriend;
};
// the default renderer for the cells containing string data
// even for the entire grid.
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellEditor
+class WXDLLEXPORT wxGridCellEditor : public wxGridCellWorker
{
public:
wxGridCellEditor();
- // this class is ref counted: it is created with ref count of 1, so
- // calling DecRef() once will delete it. Calling IncRef() allows to lock
- // it until the matching DecRef() is called
- void IncRef() { m_nRef++; }
- void DecRef() { if ( !--m_nRef ) delete this; }
-
bool IsCreated() { return m_control != NULL; }
// Creates the actual edit control
// Final cleanup
virtual void Destroy();
+ // create a new object which is the copy of this one
+ virtual wxGridCellEditor *Clone() const = 0;
+
protected:
// the dtor is private because only DecRef() can delete us
virtual ~wxGridCellEditor();
- // the ref count - when it goes to 0, we die
- size_t m_nRef;
-
// the control we show on screen
wxControl* m_control;
virtual void StartingKey(wxKeyEvent& event);
virtual void HandleReturn(wxKeyEvent& event);
+ // parameters string format is "max_width"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellTextEditor; }
+
protected:
wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
void DoReset(const wxString& startValue);
private:
+ size_t m_maxChars; // max number of chars allowed
wxString m_startValue;
};
virtual void Reset();
virtual void StartingKey(wxKeyEvent& event);
+ // parameters string format is "min,max"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellNumberEditor(m_min, m_max); }
+
protected:
wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; }
virtual void Reset();
virtual void StartingKey(wxKeyEvent& event);
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellFloatEditor; }
+
protected:
// string representation of m_valueOld
wxString GetString() const
virtual void Reset();
virtual void StartingClick();
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellBoolEditor; }
+
protected:
wxCheckBox *CBox() const { return (wxCheckBox *)m_control; }
{
public:
// if !allowOthers, user can't type a string not in choices array
- wxGridCellChoiceEditor(size_t count, const wxChar* choices[],
+ wxGridCellChoiceEditor(size_t count = 0,
+ const wxChar* choices[] = NULL,
bool allowOthers = FALSE);
virtual void Create(wxWindow* parent,
virtual void Reset();
+ // parameters string format is "item1[,item2[...,itemN]]"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const;
+
protected:
wxComboBox *Combo() const { return (wxComboBox *)m_control; }
// You must override these functions in a derived table class
//
- virtual long GetNumberRows() = 0;
- virtual long GetNumberCols() = 0;
+ virtual int GetNumberRows() = 0;
+ virtual int GetNumberCols() = 0;
virtual bool IsEmptyCell( int row, int col ) = 0;
virtual wxString GetValue( int row, int col ) = 0;
virtual void SetValue( int row, int col, const wxString& value ) = 0;
// these are pure virtual in wxGridTableBase
//
- long GetNumberRows();
- long GetNumberCols();
+ int GetNumberRows();
+ int GetNumberCols();
wxString GetValue( int row, int col );
void SetValue( int row, int col, const wxString& s );
bool IsEmptyCell( int row, int col );
// default copy ctor is ok
- long GetRow() const { return m_row; }
- void SetRow( long n ) { m_row = n; }
- long GetCol() const { return m_col; }
- void SetCol( long n ) { m_col = n; }
- void Set( long row, long col ) { m_row = row; m_col = col; }
+ int GetRow() const { return m_row; }
+ void SetRow( int n ) { m_row = n; }
+ int GetCol() const { return m_col; }
+ void SetCol( int n ) { m_col = n; }
+ void Set( int row, int col ) { m_row = row; m_col = col; }
wxGridCellCoords& operator=( const wxGridCellCoords& other )
{
}
private:
- long m_row;
- long m_col;
+ int m_row;
+ int m_col;
};
~wxGrid();
- bool CreateGrid( int numRows, int numCols );
+ enum wxGridSelectionModes {wxGridSelectCells,
+ wxGridSelectRows,
+ wxGridSelectColumns};
+
+ bool CreateGrid( int numRows, int numCols,
+ wxGrid::wxGridSelectionModes selmode =
+ wxGrid::wxGridSelectCells );
+ void SetSelectionMode(wxGrid::wxGridSelectionModes selmode);
// ------ grid dimensions
//
void DoEndDragResizeCol();
wxGridTableBase * GetTable() const { return m_table; }
- bool SetTable( wxGridTableBase *table, bool takeOwnership=FALSE );
+ bool SetTable( wxGridTableBase *table, bool takeOwnership=FALSE,
+ wxGrid::wxGridSelectionModes selmode =
+ wxGrid::wxGridSelectCells );
void ClearGrid();
bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
void SetGridCursor( int row, int col )
{ SetCurrentCell( wxGridCellCoords(row, col) ); }
- bool MoveCursorUp();
- bool MoveCursorDown();
- bool MoveCursorLeft();
- bool MoveCursorRight();
+ bool MoveCursorUp( bool expandSelection );
+ bool MoveCursorDown( bool expandSelection );
+ bool MoveCursorLeft( bool expandSelection );
+ bool MoveCursorRight( bool expandSelection );
bool MovePageDown();
bool MovePageUp();
- bool MoveCursorUpBlock();
- bool MoveCursorDownBlock();
- bool MoveCursorLeftBlock();
- bool MoveCursorRightBlock();
+ bool MoveCursorUpBlock( bool expandSelection );
+ bool MoveCursorDownBlock( bool expandSelection );
+ bool MoveCursorLeftBlock( bool expandSelection );
+ bool MoveCursorRightBlock( bool expandSelection );
// ------ label and gridline formatting
void SelectAll();
- bool IsSelection()
- { return ( m_selectedTopLeft != wxGridNoCellCoords &&
- m_selectedBottomRight != wxGridNoCellCoords );
- }
+ bool IsSelection();
void ClearSelection();
- bool IsInSelection( int row, int col )
- { return ( IsSelection() &&
- row >= m_selectedTopLeft.GetRow() &&
- col >= m_selectedTopLeft.GetCol() &&
- row <= m_selectedBottomRight.GetRow() &&
- col <= m_selectedBottomRight.GetCol() );
- }
+ bool IsInSelection( int row, int col );
bool IsInSelection( const wxGridCellCoords& coords )
{ return IsInSelection( coords.GetRow(), coords.GetCol() ); }
- void GetSelection( int* topRow, int* leftCol, int* bottomRow, int* rightCol )
- {
- // these will all be -1 if there is no selected block
- //
- *topRow = m_selectedTopLeft.GetRow();
- *leftCol = m_selectedTopLeft.GetCol();
- *bottomRow = m_selectedBottomRight.GetRow();
- *rightCol = m_selectedBottomRight.GetCol();
- }
-
// This function returns the rectangle that encloses the block of cells
// limited by TopLeft and BottomRight cell in device coords and clipped
//
wxRect SelectionToDeviceRect()
{
- return BlockToDeviceRect( m_selectedTopLeft,
- m_selectedBottomRight );
+ return BlockToDeviceRect( m_selectingTopLeft,
+ m_selectingBottomRight );
}
// Access or update the selection fore/back colours
int GetScrollPosX() { return 0; }
int GetScrollPosY() { return 0; }
- void SetScrollX( int x ) { }
- void SetScrollY( int y ) { }
+ void SetScrollX( int WXUNUSED(x) ) { }
+ void SetScrollY( int WXUNUSED(y) ) { }
void SetColumnWidth( int col, int width )
{ SetColSize( col, width ); }
void SetEditable( bool edit = TRUE ) { EnableEditing( edit ); }
bool GetEditInPlace() { return IsCellEditControlEnabled(); }
- void SetEditInPlace(bool edit = TRUE) { }
+ void SetEditInPlace(bool WXUNUSED(edit) = TRUE) { }
void SetCellAlignment( int align, int row, int col)
{ SetCellAlignment(row, col, align, wxCENTER); }
void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col))
{ }
void SetDividerPen(const wxPen& WXUNUSED(pen)) { }
- wxPen& GetDividerPen() const { return wxNullPen; }
+ wxPen& GetDividerPen() const;
void OnActivate(bool WXUNUSED(active)) {}
// ******** End of compatibility functions **********
virtual wxSize DoGetBestSize() const;
bool m_created;
- bool m_displayed;
wxGridWindow *m_gridWin;
wxGridRowLabelWindow *m_rowLabelWin;
wxGridCellCoords m_currentCellCoords;
- wxGridCellCoords m_selectedTopLeft;
- wxGridCellCoords m_selectedBottomRight;
+ wxGridCellCoords m_selectingTopLeft;
+ wxGridCellCoords m_selectingBottomRight;
+ wxGridCellCoords m_selectingKeyboard;
+ wxGridSelection *m_selection;
wxColour m_selectionBackground;
wxColour m_selectionForeground;
bool GetModelValues();
bool SetModelValues();
+ friend class wxGridSelection;
DECLARE_DYNAMIC_CLASS( wxGrid )
DECLARE_EVENT_TABLE()
public:
wxGridEvent()
: wxNotifyEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1),
- m_control(0), m_meta(0), m_shift(0), m_alt(0)
+ m_selecting(0), m_control(0), m_meta(0), m_shift(0), m_alt(0)
{
}
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, bool sel = TRUE,
bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
virtual int GetRow() { return m_row; }
virtual int GetCol() { return m_col; }
wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
+ bool Selecting() { return m_selecting; }
bool ControlDown() { return m_control; }
bool MetaDown() { return m_meta; }
bool ShiftDown() { return m_shift; }
int m_col;
int m_x;
int m_y;
+ bool m_selecting;
bool m_control;
bool m_meta;
bool m_shift;
{
m_topLeft = wxGridNoCellCoords;
m_bottomRight = wxGridNoCellCoords;
+ m_selecting = FALSE;
m_control = FALSE;
m_meta = FALSE;
m_shift = FALSE;
wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj,
const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight,
+ bool sel = TRUE,
bool control=FALSE, bool shift=FALSE,
bool alt=FALSE, bool meta=FALSE);
int GetBottomRow() { return m_bottomRight.GetRow(); }
int GetLeftCol() { return m_topLeft.GetCol(); }
int GetRightCol() { return m_bottomRight.GetCol(); }
+ bool Selecting() { return m_selecting; }
bool ControlDown() { return m_control; }
bool MetaDown() { return m_meta; }
bool ShiftDown() { return m_shift; }
protected:
wxGridCellCoords m_topLeft;
wxGridCellCoords m_bottomRight;
+ bool m_selecting;
bool m_control;
bool m_meta;
bool m_shift;
#endif // #ifndef __WXGRID_H__
#endif // ifndef wxUSE_NEW_GRID
-