#include "wx/defs.h"
-#if !defined(wxUSE_NEW_GRID) || !(wxUSE_NEW_GRID)
-#include "gridg.h"
-#else
-
#ifndef __WXGRID_H__
#define __WXGRID_H__
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "grid.h"
#endif
-#include "wx/hash.h"
+#include "wx/hashmap.h"
#include "wx/panel.h"
#include "wx/scrolwin.h"
#include "wx/string.h"
#include "wx/combobox.h"
#include "wx/dynarray.h"
#include "wx/timer.h"
+#include "wx/clntdata.h"
// ----------------------------------------------------------------------------
// constants
class WXDLLEXPORT wxTextCtrl;
class WXDLLEXPORT wxSpinCtrl;
+WX_DECLARE_EXPORTED_HASH_MAP( long, long, wxIntegerHash, wxIntegerEqual,
+ wxLongToLongHashMap );
+
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
// class is not documented and is not public at all
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellWorker
+class WXDLLEXPORT wxGridCellWorker : public wxClientDataContainer
{
public:
wxGridCellWorker() { m_nRef = 1; }
wxControl* GetControl() { return m_control; }
void SetControl(wxControl* control) { m_control = control; }
+ wxGridCellAttr* GetCellAttr() { return m_attr; }
+ void SetCellAttr(wxGridCellAttr* attr) { m_attr = attr; }
+
// Creates the actual edit control
virtual void Create(wxWindow* parent,
wxWindowID id,
// create a new object which is the copy of this one
virtual wxGridCellEditor *Clone() const = 0;
+ // DJC MAPTEK
+ // added GetValue so we can get the value which is in the control
+ virtual wxString GetValue() const = 0;
+
protected:
// the dtor is private because only DecRef() can delete us
virtual ~wxGridCellEditor();
// the control we show on screen
wxControl* m_control;
+ // a temporary pointer to the attribute being edited
+ wxGridCellAttr* m_attr;
+
// if we change the colours/font of the control from the default ones, we
// must restore the default later and we save them here between calls to
// Show(TRUE) and Show(FALSE)
// suppress the stupid gcc warning about the class having private dtor and
// no friends
friend class wxGridCellEditorDummyFriend;
+
+ DECLARE_NO_COPY_CLASS(wxGridCellEditor)
};
+#if wxUSE_TEXTCTRL
+
// the editor for string/text data
class WXDLLEXPORT wxGridCellTextEditor : public wxGridCellEditor
{
virtual wxGridCellEditor *Clone() const
{ return new wxGridCellTextEditor; }
+ // DJC MAPTEK
+ // added GetValue so we can get the value which is in the control
+ virtual wxString GetValue() const;
protected:
wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
virtual wxGridCellEditor *Clone() const
{ return new wxGridCellNumberEditor(m_min, m_max); }
+ // DJC MAPTEK
+ // added GetValue so we can get the value which is in the control
+ virtual wxString GetValue() const;
protected:
wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; }
virtual void StartingKey(wxKeyEvent& event);
virtual wxGridCellEditor *Clone() const
- { return new wxGridCellFloatEditor; }
+ { return new wxGridCellFloatEditor(m_width, m_precision); }
// parameters string format is "width,precision"
virtual void SetParameters(const wxString& params);
double m_valueOld;
};
+#endif // wxUSE_TEXTCTRL
+
+#if wxUSE_CHECKBOX
+
// the editor for boolean data
class WXDLLEXPORT wxGridCellBoolEditor : public wxGridCellEditor
{
virtual wxGridCellEditor *Clone() const
{ return new wxGridCellBoolEditor; }
+ // DJC MAPTEK
+ // added GetValue so we can get the value which is in the control
+ virtual wxString GetValue() const;
protected:
wxCheckBox *CBox() const { return (wxCheckBox *)m_control; }
bool m_startValue;
};
+#endif // wxUSE_CHECKBOX
+
+#if wxUSE_COMBOBOX
+
// the editor for string data allowing to choose from the list of strings
class WXDLLEXPORT wxGridCellChoiceEditor : public wxGridCellEditor
{
virtual void SetParameters(const wxString& params);
virtual wxGridCellEditor *Clone() const;
+ // DJC MAPTEK
+ // added GetValue so we can get the value which is in the control
+ virtual wxString GetValue() const;
protected:
wxComboBox *Combo() const { return (wxComboBox *)m_control; }
-private:
+// DJC - (MAPTEK) you at least need access to m_choices if you
+// wish to override this class
+protected:
wxString m_startValue;
wxArrayString m_choices;
bool m_allowOthers;
};
+#endif // wxUSE_COMBOBOX
+
// ----------------------------------------------------------------------------
// wxGridCellAttr: this class can be used to alter the cells appearance in
// the grid by changing their colour/font/... from default. An object of this
// class may be returned by wxGridTable::GetAttr().
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellAttr
+class WXDLLEXPORT wxGridCellAttr : public wxClientDataContainer
{
public:
enum wxAttrKind
};
// ctors
- wxGridCellAttr()
+ wxGridCellAttr(wxGridCellAttr *attrDefault = NULL)
{
- Init();
+ Init(attrDefault);
+
// MB: args used to be 0,0 here but wxALIGN_LEFT is 0
SetAlignment(-1, -1);
}
m_hAlign = hAlign;
m_vAlign = vAlign;
}
+ void SetSize(int num_rows, int num_cols);
+ void SetOverflow(bool allow = TRUE)
+ { m_overflow = allow ? Overflow : SingleCell; }
void SetReadOnly(bool isReadOnly = TRUE)
{ m_isReadOnly = isReadOnly ? ReadOnly : ReadWrite; }
bool HasRenderer() const { return m_renderer != NULL; }
bool HasEditor() const { return m_editor != NULL; }
bool HasReadWriteMode() const { return m_isReadOnly != Unset; }
+ bool HasOverflowMode() const { return m_overflow != UnsetOverflow; }
const wxColour& GetTextColour() const;
const wxColour& GetBackgroundColour() const;
const wxFont& GetFont() const;
void GetAlignment(int *hAlign, int *vAlign) const;
+ void GetSize(int *num_rows, int *num_cols) const;
+ bool GetOverflow() const
+ { return m_overflow != SingleCell; }
wxGridCellRenderer *GetRenderer(wxGrid* grid, int row, int col) const;
wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const;
Unset = -1,
ReadWrite,
ReadOnly
- };
+ };
- // the common part of all ctors
- void Init()
+ enum wxAttrOverflowMode
{
- m_nRef = 1;
-
- m_isReadOnly = Unset;
-
- m_renderer = NULL;
- m_editor = NULL;
+ UnsetOverflow = -1,
+ Overflow,
+ SingleCell
+ };
- m_attrkind = wxGridCellAttr::Cell;
- }
+ // the common part of all ctors
+ void Init(wxGridCellAttr *attrDefault = NULL);
// the dtor is private because only DecRef() can delete us
~wxGridCellAttr()
wxFont m_font;
int m_hAlign,
m_vAlign;
+ int m_sizeRows,
+ m_sizeCols;
+
+ wxAttrOverflowMode m_overflow;
wxGridCellRenderer* m_renderer;
wxGridCellEditor* m_editor;
wxAttrKind m_attrkind;
// use Clone() instead
- DECLARE_NO_COPY_CLASS(wxGridCellAttr);
+ DECLARE_NO_COPY_CLASS(wxGridCellAttr)
// suppress the stupid gcc warning about the class having private dtor and
// no friends
// the default implementation is reasonably efficient for the generic case,
// but you might still wish to implement your own for some specific situations
// if you have performance problems with the stock one
-class WXDLLEXPORT wxGridCellAttrProvider
+class WXDLLEXPORT wxGridCellAttrProvider : public wxClientDataContainer
{
public:
wxGridCellAttrProvider();
void InitData();
wxGridCellAttrProviderData *m_data;
+
+ DECLARE_NO_COPY_CLASS(wxGridCellAttrProvider)
};
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
-class WXDLLEXPORT wxGridTableBase : public wxObject
+class WXDLLEXPORT wxGridTableBase : public wxObject, public wxClientDataContainer
{
public:
wxGridTableBase();
wxGridCellAttrProvider *m_attrProvider;
DECLARE_ABSTRACT_CLASS( wxGridTableBase );
+ DECLARE_NO_COPY_CLASS(wxGridTableBase)
};
int m_id;
int m_comInt1;
int m_comInt2;
+
+ DECLARE_NO_COPY_CLASS(wxGridTableMessage)
};
public:
wxGridStringTable();
wxGridStringTable( int numRows, int numCols );
- ~wxGridStringTable();
+ virtual ~wxGridStringTable();
// these are pure virtual in wxGridTableBase
//
long style = wxWANTS_CHARS,
const wxString& name = wxPanelNameStr );
- ~wxGrid();
+ virtual ~wxGrid();
enum wxGridSelectionModes {wxGridSelectCells,
wxGridSelectRows,
wxGrid::wxGridSelectCells );
void SetSelectionMode(wxGrid::wxGridSelectionModes selmode);
+ wxGrid::wxGridSelectionModes GetSelectionMode() const;
// ------ grid dimensions
//
//
void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&,
int horizontalAlignment = wxALIGN_LEFT,
- int verticalAlignment = wxALIGN_TOP );
-
+ int verticalAlignment = wxALIGN_TOP,
+ int textOrientation = wxHORIZONTAL );
+
void DrawTextRectangle( wxDC& dc, const wxArrayString& lines, const wxRect&,
int horizontalAlignment = wxALIGN_LEFT,
- int verticalAlignment = wxALIGN_TOP );
+ int verticalAlignment = wxALIGN_TOP,
+ int textOrientation = wxHORIZONTAL );
// Split a string containing newline chararcters into an array of
int GetBatchCount() { return m_batchCount; }
+ virtual void Refresh(bool eraseb = TRUE,
+ const wxRect* rect = (const wxRect *) NULL);
+
// Use this, rather than wxWindow::Refresh(), to force an
// immediate repainting of the grid. Has no effect if you are
// already inside a BeginBatch / EndBatch block.
// ------ edit control functions
//
- bool IsEditable() { return m_editable; }
+ bool IsEditable() const { return m_editable; }
void EnableEditing( bool edit );
void EnableCellEditControl( bool enable = TRUE );
wxFont GetLabelFont() { return m_labelFont; }
void GetRowLabelAlignment( int *horiz, int *vert );
void GetColLabelAlignment( int *horiz, int *vert );
+ int GetColLabelTextOrientation();
wxString GetRowLabelValue( int row );
wxString GetColLabelValue( int col );
wxColour GetGridLineColour() { return m_gridLineColour; }
void SetLabelFont( const wxFont& );
void SetRowLabelAlignment( int horiz, int vert );
void SetColLabelAlignment( int horiz, int vert );
+ void SetColLabelTextOrientation( int textOrientation );
void SetRowLabelValue( int row, const wxString& );
void SetColLabelValue( int col, const wxString& );
void SetGridLineColour( const wxColour& );
void DisableDragGridSize() { EnableDragGridSize(FALSE); }
bool CanDragGridSize() { return m_canDragGridSize; }
- // this sets the specified attribute for all cells in this row/col
+ // this sets the specified attribute for this cell or in this row/col
+ void SetAttr(int row, int col, wxGridCellAttr *attr);
void SetRowAttr(int row, wxGridCellAttr *attr);
void SetColAttr(int col, wxGridCellAttr *attr);
wxFont GetCellFont( int row, int col );
void GetDefaultCellAlignment( int *horiz, int *vert );
void GetCellAlignment( int row, int col, int *horiz, int *vert );
+ bool GetDefaultCellOverflow();
+ bool GetCellOverflow( int row, int col );
+ void GetCellSize( int row, int col, int *num_rows, int *num_cols );
void SetDefaultRowSize( int height, bool resizeExistingRows = FALSE );
void SetRowSize( int row, int height );
// and also set the grid size to just fit its contents
void AutoSize();
+ // autosize row height depending on label text
+ void AutoSizeRowLabelSize( int row );
+
+ // autosize column width depending on label text
+ void AutoSizeColLabelSize( int col );
+
// column won't be resized to be lesser width - this must be called during
// the grid creation because it won't resize the column if it's already
// narrower than the minimal width
void SetColMinimalWidth( int col, int width );
void SetRowMinimalHeight( int row, int width );
+ /* These members can be used to query and modify the minimal
+ * acceptable size of grid rows and columns. Call this function in
+ * your code which creates the grid if you want to display cells
+ * with a size smaller than the default acceptable minimum size.
+ * Like the members SetColMinimalWidth and SetRowMinimalWidth,
+ * the existing rows or columns will not be checked/resized.
+ */
+ void SetColMinimalAcceptableWidth( int width );
+ void SetRowMinimalAcceptableHeight( int width );
+ int GetColMinimalAcceptableWidth() const;
+ int GetRowMinimalAcceptableHeight() const;
+
void SetDefaultCellBackgroundColour( const wxColour& );
void SetCellBackgroundColour( int row, int col, const wxColour& );
void SetDefaultCellTextColour( const wxColour& );
void SetCellFont( int row, int col, const wxFont& );
void SetDefaultCellAlignment( int horiz, int vert );
void SetCellAlignment( int row, int col, int horiz, int vert );
+ void SetDefaultCellOverflow( bool allow );
+ void SetCellOverflow( int row, int col, bool allow );
+ void SetCellSize( int row, int col, int num_rows, int num_cols );
// takes ownership of the pointer
void SetDefaultRenderer(wxGridCellRenderer *renderer);
// make the cell editable/readonly
void SetReadOnly(int row, int col, bool isReadOnly = TRUE);
- // ------ selections of blocks of cells
+ // ------ select blocks of cells
//
void SelectRow( int row, bool addToSelected = FALSE );
void SelectCol( int col, bool addToSelected = FALSE );
bool IsSelection();
- // ------ deselection
+ // ------ deselect blocks or cells
//
void DeselectRow( int row );
void DeselectCol( int col );
void ClearSelection();
- bool IsInSelection( int row, int col );
+ bool IsInSelection( int row, int col ) const;
- bool IsInSelection( const wxGridCellCoords& coords )
+ bool IsInSelection( const wxGridCellCoords& coords ) const
{ return IsInSelection( coords.GetRow(), coords.GetCol() ); }
+ wxGridCellCoordsArray GetSelectedCells() const;
+ wxGridCellCoordsArray GetSelectionBlockTopLeft() const;
+ wxGridCellCoordsArray GetSelectionBlockBottomRight() const;
+ wxArrayInt GetSelectedRows() const;
+ wxArrayInt GetSelectedCols() const;
// This function returns the rectangle that encloses the block of cells
// limited by TopLeft and BottomRight cell in device coords and clipped
void RegisterDataType(const wxString& typeName,
wxGridCellRenderer* renderer,
wxGridCellEditor* editor);
- wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
+ // DJC MAPTEK
+ virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const
{ return GetDefaultEditorForCell(c.GetRow(), c.GetCol()); }
- wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const;
- wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const;
- wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const;
+ virtual wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const;
+ virtual wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const;
+ virtual wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const;
// grid may occupy more space than needed for its rows/columns, this
// function allows to set how big this extra space is
{
m_extraWidth = extraWidth;
m_extraHeight = extraHeight;
+
+ CalcDimensions();
}
// Accessors for component windows
void InitRowHeights();
int m_defaultRowHeight;
+ int m_minAcceptableRowHeight;
wxArrayInt m_rowHeights;
wxArrayInt m_rowBottoms;
void InitColWidths();
int m_defaultColWidth;
+ int m_minAcceptableColWidth;
wxArrayInt m_colWidths;
wxArrayInt m_colRights;
int m_rowLabelVertAlign;
int m_colLabelHorizAlign;
int m_colLabelVertAlign;
+ int m_colLabelTextOrientation;
bool m_defaultRowLabelValues;
bool m_defaultColLabelValues;
// if a column has a minimal width, it will be the value for it in this
// hash table
- wxHashTableLong m_colMinWidths,
- m_rowMinHeights;
+ wxLongToLongHashMap m_colMinWidths,
+ m_rowMinHeights;
// get the minimal width of the given column/row
int GetColMinimalWidth(int col) const;
bool Redimension( wxGridTableMessage& );
- bool SendEvent( const wxEventType, int row, int col, wxMouseEvent& );
- bool SendEvent( const wxEventType, int row, int col );
- bool SendEvent( const wxEventType type)
+ int SendEvent( const wxEventType, int row, int col, wxMouseEvent& );
+ int SendEvent( const wxEventType, int row, int col );
+ int SendEvent( const wxEventType type)
{
return SendEvent(type,
m_currentCellCoords.GetRow(),
bool GetModelValues();
bool SetModelValues();
- friend class wxGridSelection;
+ friend class WXDLLEXPORT wxGridSelection;
DECLARE_DYNAMIC_CLASS( wxGrid )
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGrid)
};
+
// ----------------------------------------------------------------------------
// Grid event class and event types
// ----------------------------------------------------------------------------
DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent)
};
+
+class WXDLLEXPORT wxGridEditorCreatedEvent : public wxCommandEvent {
+public:
+ wxGridEditorCreatedEvent()
+ : wxCommandEvent()
+ {
+ m_row = 0;
+ m_col = 0;
+ m_ctrl = NULL;
+ }
+
+ wxGridEditorCreatedEvent(int id, wxEventType type, wxObject* obj,
+ int row, int col, wxControl* ctrl);
+
+ int GetRow() { return m_row; }
+ int GetCol() { return m_col; }
+ wxControl* GetControl() { return m_ctrl; }
+ void SetRow(int row) { m_row = row; }
+ void SetCol(int col) { m_col = col; }
+ void SetControl(wxControl* ctrl) { m_ctrl = ctrl; }
+
+private:
+ int m_row;
+ int m_col;
+ wxControl* m_ctrl;
+
+ DECLARE_DYNAMIC_CLASS(wxGridEditorCreatedEvent)
+ DECLARE_NO_COPY_CLASS(wxGridEditorCreatedEvent)
+};
+
+
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_CLICK, 1580)
DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_CLICK, 1581)
DECLARE_EVENT_TYPE(wxEVT_GRID_SELECT_CELL, 1592)
DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_SHOWN, 1593)
DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_HIDDEN, 1594)
+ DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_CREATED, 1595)
END_DECLARE_EVENT_TYPES()
typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&);
+typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreatedEvent&);
#define EVT_GRID_CELL_LEFT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ),
#define EVT_GRID_CELL_RIGHT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ),
#define EVT_GRID_SELECT_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ),
#define EVT_GRID_EDITOR_SHOWN(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_SHOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ),
#define EVT_GRID_EDITOR_HIDDEN(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_HIDDEN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ),
+#define EVT_GRID_EDITOR_CREATED(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_CREATED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEditorCreatedEventFunction) &fn, NULL ),
#if 0 // TODO: implement these ? others ?
#endif
-#endif // #ifndef __WXGRID_H__
+#endif // ifndef wxUSE_GRID
-#endif // ifndef wxUSE_NEW_GRID