wxGRID_ROW
};
+// Flags used with wxGrid::Render() to select parts of the grid to draw.
+enum wxGridRenderStyle
+{
+ wxGRID_DRAW_ROWS_HEADER = 0x001,
+ wxGRID_DRAW_COLS_HEADER = 0x002,
+ wxGRID_DRAW_CELL_LINES = 0x004,
+ wxGRID_DRAW_BOX_RECT = 0x008,
+ wxGRID_DRAW_SELECTION = 0x010,
+ wxGRID_DRAW_DEFAULT = wxGRID_DRAW_ROWS_HEADER |
+ wxGRID_DRAW_COLS_HEADER |
+ wxGRID_DRAW_CELL_LINES |
+ wxGRID_DRAW_BOX_RECT
+};
+
// ----------------------------------------------------------------------------
// forward declarations
// ----------------------------------------------------------------------------
public:
wxGridCellWorker() { }
- // interpret renderer parameters: arbitrary string whose interpretatin is
+ // interpret renderer parameters: arbitrary string whose interpretation is
// left to the derived classes
virtual void SetParameters(const wxString& params);
public:
wxGridCellEditor();
- bool IsCreated() { return m_control != NULL; }
- wxControl* GetControl() { return m_control; }
+ bool IsCreated() const { return m_control != NULL; }
+ wxControl* GetControl() const { return m_control; }
void SetControl(wxControl* control) { m_control = control; }
- wxGridCellAttr* GetCellAttr() { return m_attr; }
+ wxGridCellAttr* GetCellAttr() const { return m_attr; }
void SetCellAttr(wxGridCellAttr* attr) { m_attr = attr; }
// Creates the actual edit control
// Draws the part of the cell not occupied by the control: the base class
// version just fills it with background colour from the attribute
- virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
+ virtual void PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr);
// The methods called by wxGrid when a cell is edited: first BeginEdit() is
virtual void DrawBorder(const wxGrid& grid,
wxDC& dc,
wxRect& rect) const = 0;
+
+ // make the dtor of a class with virtual functions virtual to avoid g++
+ // warnings, even though this class is not supposed to be used
+ // polymorphically
+ virtual ~wxGridCornerHeaderRenderer() { }
};
{
Init(attrDefault);
- // MB: args used to be 0,0 here but wxALIGN_LEFT is 0
- SetAlignment(-1, -1);
+ SetAlignment(wxALIGN_INVALID, wxALIGN_INVALID);
}
// VZ: considering the number of members wxGridCellAttr has now, this ctor
void SetKind(wxAttrKind kind) { m_attrkind = kind; }
// accessors
- bool HasTextColour() const { return m_colText.Ok(); }
- bool HasBackgroundColour() const { return m_colBack.Ok(); }
- bool HasFont() const { return m_font.Ok(); }
- bool HasAlignment() const { return (m_hAlign != -1 || m_vAlign != -1); }
+ bool HasTextColour() const { return m_colText.IsOk(); }
+ bool HasBackgroundColour() const { return m_colBack.IsOk(); }
+ bool HasFont() const { return m_font.IsOk(); }
+ bool HasAlignment() const
+ {
+ return m_hAlign != wxALIGN_INVALID || m_vAlign != wxALIGN_INVALID;
+ }
bool HasRenderer() const { return m_renderer != NULL; }
bool HasEditor() const { return m_editor != NULL; }
bool HasReadWriteMode() const { return m_isReadOnly != Unset; }
const wxColour& GetBackgroundColour() const;
const wxFont& GetFont() const;
void GetAlignment(int *hAlign, int *vAlign) const;
+
+ // unlike GetAlignment() which always overwrites its output arguments with
+ // the alignment values to use, falling back on default alignment if this
+ // attribute doesn't have any, this function will preserve the values of
+ // parameters on entry if the corresponding alignment is not set in this
+ // attribute meaning that they can be initialized to default alignment (and
+ // also that they must be initialized, unlike with GetAlignment())
+ void GetNonDefaultAlignment(int *hAlign, int *vAlign) const;
+
void GetSize(int *num_rows, int *num_cols) const;
bool GetOverflow() const
{ return m_overflow != SingleCell; }
// get renderers for the given row/column header label and the corner
// window: unlike cell renderers, these objects are not reference counted
// and are never NULL so they are returned by reference
- virtual const wxGridColumnHeaderRenderer&
- GetColumnHeaderRenderer(int WXUNUSED(col))
- {
- return m_defaultHeaderRenderers.colRenderer;
- }
-
- virtual const wxGridRowHeaderRenderer&
- GetRowHeaderRenderer(int WXUNUSED(row))
- {
- return m_defaultHeaderRenderers.rowRenderer;
- }
-
- virtual const wxGridCornerHeaderRenderer& GetCornerRenderer()
- {
- return m_defaultHeaderRenderers.cornerRenderer;
- }
+ virtual const wxGridColumnHeaderRenderer& GetColumnHeaderRenderer(int col);
+ virtual const wxGridRowHeaderRenderer& GetRowHeaderRenderer(int row);
+ virtual const wxGridCornerHeaderRenderer& GetCornerRenderer();
private:
void InitData();
wxGridCellAttrProviderData *m_data;
- // this struct simply combines together the default header renderers
- struct
- {
- wxGridColumnHeaderRendererDefault colRenderer;
- wxGridRowHeaderRendererDefault rowRenderer;
- wxGridCornerHeaderRendererDefault cornerRenderer;
- } m_defaultHeaderRenderers;
-
wxDECLARE_NO_COPY_CLASS(wxGridCellAttrProvider);
};
// these are pure virtual in wxGridTableBase
//
- virtual int GetNumberRows() { return m_data.size(); }
+ virtual int GetNumberRows() { return static_cast<int>(m_data.size()); }
virtual int GetNumberCols() { return m_numCols; }
virtual wxString GetValue( int row, int col );
virtual void SetValue( int row, int col, const wxString& s );
wxGridSelectRowsOrColumns = wxGridSelectRows | wxGridSelectColumns
};
+ // Different behaviour of the TAB key when the end (or the beginning, for
+ // Shift-TAB) of the current row is reached:
+ enum TabBehaviour
+ {
+ Tab_Stop, // Do nothing, this is default.
+ Tab_Wrap, // Move to the next (or previous) row.
+ Tab_Leave // Move to the next (or previous) control.
+ };
+
// creation and destruction
// ------------------------
int verticalAlignment = wxALIGN_TOP,
int textOrientation = wxHORIZONTAL ) const;
+ // ------ grid render function for printing
+ //
+ void Render( wxDC& dc,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ const wxGridCellCoords& topLeft = wxGridCellCoords(-1, -1),
+ const wxGridCellCoords& bottomRight = wxGridCellCoords(-1, -1),
+ int style = wxGRID_DRAW_DEFAULT );
// Split a string containing newline characters into an array of
// strings and return the number of lines
bool MoveCursorLeftBlock( bool expandSelection );
bool MoveCursorRightBlock( bool expandSelection );
+ void SetTabBehaviour(TabBehaviour behaviour) { m_tabBehaviour = behaviour; }
+
// ------ label and gridline formatting
//
void SetRowAttr(int row, wxGridCellAttr *attr);
void SetColAttr(int col, wxGridCellAttr *attr);
+ // the grid can cache attributes for the recently used cells (currently it
+ // only caches one attribute for the most recently used one) and might
+ // notice that its value in the attribute provider has changed -- if this
+ // happens, call this function to force it
+ void RefreshAttr(int row, int col);
+
// returns the attribute we may modify in place: a new one if this cell
// doesn't have any yet or the existing one if it does
//
void GetCellAlignment( int row, int col, int *horiz, int *vert ) const;
bool GetDefaultCellOverflow() const;
bool GetCellOverflow( int row, int col ) const;
- void GetCellSize( int row, int col, int *num_rows, int *num_cols ) const;
+
+ // this function returns 1 in num_rows and num_cols for normal cells,
+ // positive numbers for a cell spanning multiple columns/rows (as set with
+ // SetCellSize()) and _negative_ numbers corresponding to the offset of the
+ // top left cell of the span from this one for the other cells covered by
+ // this cell
+ //
+ // the return value is CellSpan_None, CellSpan_Main or CellSpan_Inside for
+ // each of these cases respectively
+ enum CellSpan
+ {
+ CellSpan_Inside = -1,
+ CellSpan_None = 0,
+ CellSpan_Main
+ };
+
+ CellSpan GetCellSize( int row, int col, int *num_rows, int *num_cols ) const;
+
wxSize GetCellSize(const wxGridCellCoords& coords)
{
wxSize s;
// ------ row and col sizes
void SetDefaultRowSize( int height, bool resizeExistingRows = false );
void SetRowSize( int row, int height );
- void HideRow(int row) { SetRowSize(row, 0); }
- void ShowRow(int row) { SetRowSize(row, -1); }
+ void HideRow(int row) { DoSetRowSize(row, 0); }
+ void ShowRow(int row) { DoSetRowSize(row, -1); }
void SetDefaultColSize( int width, bool resizeExistingCols = false );
void SetColSize( int col, int width );
- void HideCol(int col) { SetColSize(col, 0); }
- void ShowCol(int col) { SetColSize(col, -1); }
+ void HideCol(int col) { DoSetColSize(col, 0); }
+ void ShowCol(int col) { DoSetColSize(col, -1); }
// the row and column sizes can be also set all at once using
// wxGridSizesInfo which holds all of them at once
}
// Allow adjustment of scroll increment. The default is (15, 15).
- void SetScrollLineX(int x) { m_scrollLineX = x; }
- void SetScrollLineY(int y) { m_scrollLineY = y; }
- int GetScrollLineX() const { return m_scrollLineX; }
- int GetScrollLineY() const { return m_scrollLineY; }
+ void SetScrollLineX(int x) { m_xScrollPixelsPerLine = x; }
+ void SetScrollLineY(int y) { m_yScrollPixelsPerLine = y; }
+ int GetScrollLineX() const { return m_xScrollPixelsPerLine; }
+ int GetScrollLineY() const { return m_yScrollPixelsPerLine; }
// ------- drag and drop
#if wxUSE_DRAG_AND_DROP
// unset any existing sorting column
void UnsetSortingColumn() { SetSortingColumn(wxNOT_FOUND); }
-#ifdef WXWIN_COMPATIBILITY_2_8
+#if WXWIN_COMPATIBILITY_2_8
// ------ For compatibility with previous wxGrid only...
//
// ************************************************
void SetLabelAlignment( int orientation, int align )
{
if ( orientation == wxHORIZONTAL )
- SetColLabelAlignment( align, -1 );
+ SetColLabelAlignment( align, wxALIGN_INVALID );
else
- SetRowLabelAlignment( align, -1 );
+ SetRowLabelAlignment( align, wxALIGN_INVALID );
}
int GetLabelAlignment( int orientation, int WXUNUSED(align) ) const
bool m_editable; // applies to whole grid
bool m_cellEditCtrlEnabled; // is in-place edit currently shown?
- int m_scrollLineX; // X scroll increment
- int m_scrollLineY; // Y scroll increment
+ TabBehaviour m_tabBehaviour; // determines how the TAB key behaves
void Init(); // common part of all ctors
void Create();
int SendEvent(const wxEventType evtType, const wxString& s = wxString())
{ return SendEvent(evtType, m_currentCellCoords, s); }
- // send wxEVT_GRID_{ROW,COL}_SIZE
- void SendGridSizeEvent(wxEventType type,
+ // send wxEVT_GRID_{ROW,COL}_SIZE or wxEVT_GRID_COL_AUTO_SIZE, return true
+ // if the event was processed, false otherwise
+ bool SendGridSizeEvent(wxEventType type,
int row, int col,
const wxMouseEvent& mouseEv);
void OnKeyUp( wxKeyEvent& );
void OnChar( wxKeyEvent& );
void OnEraseBackground( wxEraseEvent& );
+ void OnHideEditor( wxCommandEvent& );
bool SetCurrentCell( const wxGridCellCoords& coords );
// redraw the grid lines, should be called after changing their attributes
void RedrawGridLines();
+ // draw all grid lines in the given cell region (unlike the public
+ // DrawAllGridLines() which just draws all of them)
+ void DrawRangeGridLines(wxDC& dc, const wxRegion& reg,
+ const wxGridCellCoords& topLeft,
+ const wxGridCellCoords& bottomRight);
+
+ // draw all lines from top to bottom row and left to right column in the
+ // rectangle determined by (top, left)-(bottom, right) -- but notice that
+ // the caller must have set up the clipping correctly, this rectangle is
+ // only used here for optimization
+ void DoDrawGridLines(wxDC& dc,
+ int top, int left,
+ int bottom, int right,
+ int topRow, int leftCol,
+ int bottomRight, int rightCol);
+
// common part of Clip{Horz,Vert}GridLines
void DoClipGridLines(bool& var, bool clip);
// --------------------------------
// process mouse drag event in WXGRID_CURSOR_SELECT_CELL mode
- void DoGridCellDrag(wxMouseEvent& event,
+ bool DoGridCellDrag(wxMouseEvent& event,
const wxGridCellCoords& coords,
bool isFirstDrag);
void DoEndDragResizeCol(const wxMouseEvent& event);
void DoEndMoveCol(int pos);
+ // process a TAB keypress
+ void DoGridProcessTab(wxKeyboardState& kbdState);
// common implementations of methods defined for both rows and columns
void DeselectLine(int line, const wxGridOperations& oper);
void DoDisableLineResize(int line, wxGridFixedIndicesSet *& setFixed);
bool DoCanResizeLine(int line, const wxGridFixedIndicesSet *setFixed) const;
+ // Helper of Render(): get grid size, origin offset and fill cell arrays
+ void GetRenderSizes( const wxGridCellCoords& topLeft,
+ const wxGridCellCoords& bottomRight,
+ wxPoint& pointOffSet, wxSize& sizeGrid,
+ wxGridCellCoordsArray& renderCells,
+ wxArrayInt& arrayCols, wxArrayInt& arrayRows );
+
+ // Helper of Render(): set the scale to draw the cells at the right size.
+ void SetRenderScale( wxDC& dc, const wxPoint& pos, const wxSize& size,
+ const wxSize& sizeGrid );
+
+ // Helper of Render(): get render start position from passed parameter
+ wxPoint GetRenderPosition( wxDC& dc, const wxPoint& position );
+
+ // Helper of Render(): draws a box around the rendered area
+ void DoRenderBox( wxDC& dc, const int& style,
+ const wxPoint& pointOffSet,
+ const wxSize& sizeCellArea,
+ const wxGridCellCoords& topLeft,
+ const wxGridCellCoords& bottomRight );
+
+ // Implementation of public Set{Row,Col}Size() and {Hide,Show}{Row,Col}().
+ // They interpret their height or width parameter slightly different from
+ // the public methods where -1 in it means "auto fit to the label" for the
+ // compatibility reasons. Here it means "show a previously hidden row or
+ // column" while 0 means "hide it" just as in the public methods. And any
+ // positive values are handled naturally, i.e. they just specify the size.
+ void DoSetRowSize( int row, int height );
+ void DoSetColSize( int col, int width );
// these sets contain the indices of fixed, i.e. non-resizable
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_DCLICK, wxGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_ROW_SIZE, wxGridSizeEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SIZE, wxGridSizeEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_AUTO_SIZE, wxGridSizeEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGING, wxGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGED, wxGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, wxGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, wxGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SORT, wxGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_GRID_TABBING, wxGridEvent );
typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
#define EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_DCLICK, id, fn)
#define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn)
#define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn)
+#define EVT_GRID_CMD_COL_AUTO_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_AUTO_SIZE, id, fn)
#define EVT_GRID_CMD_COL_MOVE(id, fn) wx__DECLARE_GRIDEVT(COL_MOVE, id, fn)
#define EVT_GRID_CMD_COL_SORT(id, fn) wx__DECLARE_GRIDEVT(COL_SORT, id, fn)
#define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn)
#define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn)
#define EVT_GRID_CMD_EDITOR_CREATED(id, fn) wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn)
#define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn) wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn)
+#define EVT_GRID_CMD_TABBING(id, fn) wx__DECLARE_GRIDEVT(TABBING, id, fn)
// same as above but for any id (exists mainly for backwards compatibility but
// then it's also true that you rarely have multiple grid in the same window)
#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_DCLICK(wxID_ANY, fn)
#define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn)
#define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn)
+#define EVT_GRID_COL_AUTO_SIZE(fn) EVT_GRID_CMD_COL_AUTO_SIZE(wxID_ANY, fn)
#define EVT_GRID_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(wxID_ANY, fn)
#define EVT_GRID_COL_SORT(fn) EVT_GRID_CMD_COL_SORT(wxID_ANY, fn)
#define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn)
#define EVT_GRID_EDITOR_HIDDEN(fn) EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn)
#define EVT_GRID_EDITOR_CREATED(fn) EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn)
#define EVT_GRID_CELL_BEGIN_DRAG(fn) EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn)
+#define EVT_GRID_TABBING(fn) EVT_GRID_CMD_TABBING(wxID_ANY, fn)
// we used to have a single wxEVT_GRID_CELL_CHANGE event but it was split into
// wxEVT_GRID_CELL_CHANGING and CHANGED ones in wx 2.9.0, however the CHANGED
extern const int wxEVT_GRID_CHANGE_LABELS;
extern const int wxEVT_GRID_CHANGE_SEL_LABEL;
-#define EVT_GRID_CREATE_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
-#define EVT_GRID_CHANGE_LABELS(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
-#define EVT_GRID_CHANGE_SEL_LABEL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
+#define EVT_GRID_CREATE_CELL(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
+#define EVT_GRID_CHANGE_LABELS(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
+#define EVT_GRID_CHANGE_SEL_LABEL(fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ),
#endif