added wxGrid::UseNativeColHeader() (column reordering doesn't work yet); more wxGrid clean up: refactor Init/InitVars/Create

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57259 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-11 19:21:20 +00:00
parent f458d4dd6b
commit ad805b9e0d
3 changed files with 429 additions and 248 deletions

View File

@@ -77,6 +77,7 @@ class WXDLLIMPEXP_FWD_ADV wxGridWindow;
class WXDLLIMPEXP_FWD_ADV wxGridTypeRegistry; class WXDLLIMPEXP_FWD_ADV wxGridTypeRegistry;
class WXDLLIMPEXP_FWD_ADV wxGridSelection; class WXDLLIMPEXP_FWD_ADV wxGridSelection;
class WXDLLIMPEXP_FWD_CORE wxHeaderCtrl;
class WXDLLIMPEXP_FWD_CORE wxCheckBox; class WXDLLIMPEXP_FWD_CORE wxCheckBox;
class WXDLLIMPEXP_FWD_CORE wxComboBox; class WXDLLIMPEXP_FWD_CORE wxComboBox;
class WXDLLIMPEXP_FWD_CORE wxTextCtrl; class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
@@ -1128,14 +1129,19 @@ public:
// ------------------------ // ------------------------
// ctor and Create() create the grid window, as with the other controls // ctor and Create() create the grid window, as with the other controls
wxGrid(); wxGrid() { Init(); }
wxGrid(wxWindow *parent, wxGrid(wxWindow *parent,
wxWindowID id, wxWindowID id,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
long style = wxWANTS_CHARS, long style = wxWANTS_CHARS,
const wxString& name = wxGridNameStr); const wxString& name = wxGridNameStr)
{
Init();
Create(parent, id, pos, size, style, name);
}
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
wxWindowID id, wxWindowID id,
@@ -1379,7 +1385,13 @@ public:
int GetCellHighlightPenWidth() const { return m_cellHighlightPenWidth; } int GetCellHighlightPenWidth() const { return m_cellHighlightPenWidth; }
int GetCellHighlightROPenWidth() const { return m_cellHighlightROPenWidth; } int GetCellHighlightROPenWidth() const { return m_cellHighlightROPenWidth; }
// this one will use wxHeaderCtrl for the column labels
void UseNativeColHeader(bool native = true);
// this one will still draw them manually but using the native renderer
// instead of using the same appearance as for the row labels
void SetUseNativeColLabels( bool native = true ); void SetUseNativeColLabels( bool native = true );
void SetRowLabelSize( int width ); void SetRowLabelSize( int width );
void SetColLabelSize( int height ); void SetColLabelSize( int height );
void HideRowLabels() { SetRowLabelSize( 0 ); } void HideRowLabels() { SetRowLabelSize( 0 ); }
@@ -1701,7 +1713,7 @@ public:
// Accessors for component windows // Accessors for component windows
wxWindow* GetGridWindow() const { return (wxWindow*)m_gridWin; } wxWindow* GetGridWindow() const { return (wxWindow*)m_gridWin; }
wxWindow* GetGridRowLabelWindow() const { return (wxWindow*)m_rowLabelWin; } wxWindow* GetGridRowLabelWindow() const { return (wxWindow*)m_rowLabelWin; }
wxWindow* GetGridColLabelWindow() const { return (wxWindow*)m_colLabelWin; } wxWindow* GetGridColLabelWindow() const { return m_colWindow; }
wxWindow* GetGridCornerLabelWindow() const { return (wxWindow*)m_cornerLabelWin; } wxWindow* GetGridCornerLabelWindow() const { return (wxWindow*)m_cornerLabelWin; }
// Allow adjustment of scroll increment. The default is (15, 15). // Allow adjustment of scroll increment. The default is (15, 15).
@@ -1730,11 +1742,9 @@ public:
int x, int y, int w = wxDefaultCoord, int h = wxDefaultCoord, int x, int y, int w = wxDefaultCoord, int h = wxDefaultCoord,
long style = wxWANTS_CHARS, long style = wxWANTS_CHARS,
const wxString& name = wxPanelNameStr ) const wxString& name = wxPanelNameStr )
: wxScrolledWindow( parent, wxID_ANY, wxPoint(x,y), wxSize(w,h),
(style|wxWANTS_CHARS), name )
{ {
InitVars(); Init();
Create(); Create(parent, wxID_ANY, wxPoint(x, y), wxSize(w, h), style, name);
} }
void SetCellValue( const wxString& val, int row, int col ) void SetCellValue( const wxString& val, int row, int col )
@@ -1896,9 +1906,30 @@ protected:
bool m_created; bool m_created;
wxGridWindow *m_gridWin; wxGridWindow *m_gridWin;
wxGridRowLabelWindow *m_rowLabelWin;
wxGridColLabelWindow *m_colLabelWin;
wxGridCornerLabelWindow *m_cornerLabelWin; wxGridCornerLabelWindow *m_cornerLabelWin;
wxGridRowLabelWindow *m_rowLabelWin;
// the real type of the column window depends on m_useNativeHeader value:
// if it is true, its dynamic type is wxHeaderCtrl, otherwise it is
// wxGridColLabelWindow, use accessors below when the real type matters
wxWindow *m_colWindow;
wxHeaderCtrl *GetColHeader() const
{
wxASSERT_MSG( m_useNativeHeader, "no column header window" );
// static_cast<> doesn't work without the full class declaration in
// view and we prefer to avoid adding more compile-time dependencies
// even at the cost of using reinterpret_cast<>
return reinterpret_cast<wxHeaderCtrl *>(m_colWindow);
}
wxGridColLabelWindow *GetColLabelWindow() const
{
wxASSERT_MSG( !m_useNativeHeader, "no column label window" );
return reinterpret_cast<wxGridColLabelWindow *>(m_colWindow);
}
wxGridTableBase *m_table; wxGridTableBase *m_table;
bool m_ownTable; bool m_ownTable;
@@ -1946,7 +1977,8 @@ protected:
wxArrayInt m_colWidths; wxArrayInt m_colWidths;
wxArrayInt m_colRights; wxArrayInt m_colRights;
bool m_nativeColumnLabels; bool m_useNativeHeader,
m_nativeColumnLabels;
// get the col/row coords // get the col/row coords
int GetColWidth(int col) const; int GetColWidth(int col) const;
@@ -2119,9 +2151,9 @@ protected:
int m_scrollLineX; // X scroll increment int m_scrollLineX; // X scroll increment
int m_scrollLineY; // Y scroll increment int m_scrollLineY; // Y scroll increment
void Init(); // common part of all ctors
void Create(); void Create();
void Init(); void CreateColumnWindow();
void InitVars();
void CalcDimensions(); void CalcDimensions();
void CalcWindowSizes(); void CalcWindowSizes();
bool Redimension( wxGridTableMessage& ); bool Redimension( wxGridTableMessage& );
@@ -2180,6 +2212,8 @@ protected:
friend class wxGridRowLabelWindow; friend class wxGridRowLabelWindow;
friend class wxGridWindow; friend class wxGridWindow;
friend class wxGridHeaderCtrl;
private: private:
// implement wxScrolledWindow method to return m_gridWin size // implement wxScrolledWindow method to return m_gridWin size
virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size); virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size);
@@ -2227,8 +2261,12 @@ private:
void ProcessColLabelMouseEvent(wxMouseEvent& event); void ProcessColLabelMouseEvent(wxMouseEvent& event);
void ProcessCornerLabelMouseEvent(wxMouseEvent& event); void ProcessCornerLabelMouseEvent(wxMouseEvent& event);
void DoStartResizeCol(int col);
void DoUpdateResizeCol(int x);
void DoUpdateResizeColWidth(int w);
void DoEndDragResizeRow(); void DoEndDragResizeRow();
void DoEndDragResizeCol(); void DoEndDragResizeCol(wxMouseEvent *event = NULL);
void DoEndDragMoveCol(); void DoEndDragMoveCol();

View File

@@ -1381,9 +1381,36 @@ public:
There is no equivalent method for drawing row columns as there is not There is no equivalent method for drawing row columns as there is not
native look for that. This option is useful when using wxGrid for native look for that. This option is useful when using wxGrid for
displaying tables and not as a spread-sheet. displaying tables and not as a spread-sheet.
@see UseNativeHeader()
*/ */
void SetUseNativeColLabels(bool native = true); void SetUseNativeColLabels(bool native = true);
/**
Enable the use of native header window for column labels.
If this function is called with @true argument, a wxHeaderCtrl is used
instead to display the column labels instead of drawing them in wxGrid
code itself. This has the advantage of making the grid look and feel
perfectly the same as native applications (using SetUseNativeColLabels()
the grid can be made to look more natively but it still doesn't feel
natively, notably the column resizing and dragging still works slightly
differently as it is implemented in wxWidgets itself) but results in
different behaviour for column and row headers, for which there is no
equivalent function, and, most importantly, is unsuitable for grids
with huge numbers of columns as wxHeaderCtrl doesn't support virtual
mode. Because of this, by default the grid does not use the native
header control but you should call this function to enable it if you
are using the grid to display tabular data and don't have thousands of
columns in it.
Also note that currently @c wxEVT_GRID_LABEL_LEFT_DCLICK and @c
wxEVT_GRID_LABEL_RIGHT_DCLICK events are not generated for the column
labels if the native columns header is used (but this limitation could
possibly be lifted in the future).
*/
void UseNativeColHeader(bool native = true);
//@} //@}

File diff suppressed because it is too large Load Diff