Add wxSharedClientDataContainer class storing ref-counted client data and use it instead of plain wxClientDataContainer in wxGridCellAttr, wxGridCellEditor and wxGridCellRenderer classes. This allows to keep the same client data associated with many grid cells without having to make many copies of it.
497 lines
15 KiB
C++
497 lines
15 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/generic/grideditors.h
|
|
// Purpose: wxGridCellEditorEvtHandler and wxGrid editors
|
|
// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn)
|
|
// Modified by: Santiago Palacios
|
|
// Created: 1/08/1999
|
|
// Copyright: (c) Michael Bedward
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_GENERIC_GRID_EDITORS_H_
|
|
#define _WX_GENERIC_GRID_EDITORS_H_
|
|
|
|
#include "wx/defs.h"
|
|
|
|
#if wxUSE_GRID
|
|
|
|
#include "wx/scopedptr.h"
|
|
|
|
class wxGridCellEditorEvtHandler : public wxEvtHandler
|
|
{
|
|
public:
|
|
wxGridCellEditorEvtHandler(wxGrid* grid, wxGridCellEditor* editor)
|
|
: m_grid(grid),
|
|
m_editor(editor),
|
|
m_inSetFocus(false)
|
|
{
|
|
}
|
|
|
|
void DismissEditor();
|
|
|
|
void OnKillFocus(wxFocusEvent& event);
|
|
void OnKeyDown(wxKeyEvent& event);
|
|
void OnChar(wxKeyEvent& event);
|
|
|
|
void SetInSetFocus(bool inSetFocus) { m_inSetFocus = inSetFocus; }
|
|
|
|
private:
|
|
wxGrid *m_grid;
|
|
wxGridCellEditor *m_editor;
|
|
|
|
// Work around the fact that a focus kill event can be sent to
|
|
// a combobox within a set focus event.
|
|
bool m_inSetFocus;
|
|
|
|
wxDECLARE_EVENT_TABLE();
|
|
wxDECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler);
|
|
wxDECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler);
|
|
};
|
|
|
|
|
|
#if wxUSE_TEXTCTRL
|
|
|
|
// the editor for string/text data
|
|
class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor
|
|
{
|
|
public:
|
|
explicit wxGridCellTextEditor(size_t maxChars = 0)
|
|
: wxGridCellEditor(),
|
|
m_maxChars(maxChars)
|
|
{
|
|
}
|
|
|
|
wxGridCellTextEditor(const wxGridCellTextEditor& other);
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
virtual void SetSize(const wxRect& rect) wxOVERRIDE;
|
|
|
|
virtual bool IsAcceptedKey(wxKeyEvent& event) wxOVERRIDE;
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
|
|
virtual void HandleReturn(wxKeyEvent& event) wxOVERRIDE;
|
|
|
|
// parameters string format is "max_width"
|
|
virtual void SetParameters(const wxString& params) wxOVERRIDE;
|
|
#if wxUSE_VALIDATORS
|
|
virtual void SetValidator(const wxValidator& validator);
|
|
#endif
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellTextEditor(*this); }
|
|
|
|
// added GetValue so we can get the value which is in the control
|
|
virtual wxString GetValue() const wxOVERRIDE;
|
|
|
|
protected:
|
|
wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
|
|
|
|
// parts of our virtual functions reused by the derived classes
|
|
void DoCreate(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler,
|
|
long style = 0);
|
|
void DoBeginEdit(const wxString& startValue);
|
|
void DoReset(const wxString& startValue);
|
|
|
|
private:
|
|
size_t m_maxChars; // max number of chars allowed
|
|
#if wxUSE_VALIDATORS
|
|
wxScopedPtr<wxValidator> m_validator;
|
|
#endif
|
|
wxString m_value;
|
|
};
|
|
|
|
// the editor for numeric (long) data
|
|
class WXDLLIMPEXP_ADV wxGridCellNumberEditor : public wxGridCellTextEditor
|
|
{
|
|
public:
|
|
// allows to specify the range - if min == max == -1, no range checking is
|
|
// done
|
|
wxGridCellNumberEditor(int min = -1, int max = -1)
|
|
: wxGridCellTextEditor(),
|
|
m_min(min),
|
|
m_max(max)
|
|
{
|
|
}
|
|
|
|
wxGridCellNumberEditor(const wxGridCellNumberEditor& other)
|
|
: wxGridCellTextEditor(other),
|
|
m_min(other.m_min),
|
|
m_max(other.m_max),
|
|
m_value(other.m_value)
|
|
{
|
|
}
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual void SetSize(const wxRect& rect) wxOVERRIDE;
|
|
|
|
virtual bool IsAcceptedKey(wxKeyEvent& event) wxOVERRIDE;
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
|
|
|
|
// parameters string format is "min,max"
|
|
virtual void SetParameters(const wxString& params) wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellNumberEditor(*this); }
|
|
|
|
// added GetValue so we can get the value which is in the control
|
|
virtual wxString GetValue() const wxOVERRIDE;
|
|
|
|
protected:
|
|
#if wxUSE_SPINCTRL
|
|
wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; }
|
|
#endif
|
|
|
|
// if HasRange(), we use wxSpinCtrl - otherwise wxTextCtrl
|
|
bool HasRange() const
|
|
{
|
|
#if wxUSE_SPINCTRL
|
|
return m_min != m_max;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
// string representation of our value
|
|
wxString GetString() const
|
|
{ return wxString::Format(wxT("%ld"), m_value); }
|
|
|
|
private:
|
|
int m_min,
|
|
m_max;
|
|
|
|
long m_value;
|
|
};
|
|
|
|
|
|
enum wxGridCellFloatFormat
|
|
{
|
|
// Decimal floating point (%f)
|
|
wxGRID_FLOAT_FORMAT_FIXED = 0x0010,
|
|
|
|
// Scientific notation (mantise/exponent) using e character (%e)
|
|
wxGRID_FLOAT_FORMAT_SCIENTIFIC = 0x0020,
|
|
|
|
// Use the shorter of %e or %f (%g)
|
|
wxGRID_FLOAT_FORMAT_COMPACT = 0x0040,
|
|
|
|
// To use in combination with one of the above formats (%F/%E/%G)
|
|
wxGRID_FLOAT_FORMAT_UPPER = 0x0080,
|
|
|
|
// Format used by default.
|
|
wxGRID_FLOAT_FORMAT_DEFAULT = wxGRID_FLOAT_FORMAT_FIXED,
|
|
|
|
// A mask to extract format from the combination of flags.
|
|
wxGRID_FLOAT_FORMAT_MASK = wxGRID_FLOAT_FORMAT_FIXED |
|
|
wxGRID_FLOAT_FORMAT_SCIENTIFIC |
|
|
wxGRID_FLOAT_FORMAT_COMPACT |
|
|
wxGRID_FLOAT_FORMAT_UPPER
|
|
};
|
|
|
|
// the editor for floating point numbers (double) data
|
|
class WXDLLIMPEXP_ADV wxGridCellFloatEditor : public wxGridCellTextEditor
|
|
{
|
|
public:
|
|
wxGridCellFloatEditor(int width = -1,
|
|
int precision = -1,
|
|
int format = wxGRID_FLOAT_FORMAT_DEFAULT)
|
|
: wxGridCellTextEditor(),
|
|
m_width(width),
|
|
m_precision(precision),
|
|
m_style(format)
|
|
{
|
|
}
|
|
|
|
wxGridCellFloatEditor(const wxGridCellFloatEditor& other)
|
|
: wxGridCellTextEditor(other),
|
|
m_width(other.m_width),
|
|
m_precision(other.m_precision),
|
|
m_value(other.m_value),
|
|
m_style(other.m_style),
|
|
m_format(other.m_format)
|
|
{
|
|
}
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual bool IsAcceptedKey(wxKeyEvent& event) wxOVERRIDE;
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellFloatEditor(*this); }
|
|
|
|
// parameters string format is "width[,precision[,format]]"
|
|
// format to choose between f|e|g|E|G (f is used by default)
|
|
virtual void SetParameters(const wxString& params) wxOVERRIDE;
|
|
|
|
protected:
|
|
// string representation of our value
|
|
wxString GetString();
|
|
|
|
private:
|
|
int m_width,
|
|
m_precision;
|
|
double m_value;
|
|
|
|
int m_style;
|
|
wxString m_format;
|
|
};
|
|
|
|
#endif // wxUSE_TEXTCTRL
|
|
|
|
#if wxUSE_CHECKBOX
|
|
|
|
// the editor for boolean data
|
|
class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor
|
|
{
|
|
public:
|
|
wxGridCellBoolEditor()
|
|
: wxGridCellEditor()
|
|
{
|
|
}
|
|
|
|
wxGridCellBoolEditor(const wxGridCellBoolEditor& other)
|
|
: wxGridCellEditor(other),
|
|
m_value(other.m_value)
|
|
{
|
|
}
|
|
|
|
virtual wxGridActivationResult
|
|
TryActivate(int row, int col, wxGrid* grid,
|
|
const wxGridActivationSource& actSource) wxOVERRIDE;
|
|
virtual void DoActivate(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual void SetSize(const wxRect& rect) wxOVERRIDE;
|
|
virtual void Show(bool show, wxGridCellAttr *attr = NULL) wxOVERRIDE;
|
|
|
|
virtual bool IsAcceptedKey(wxKeyEvent& event) wxOVERRIDE;
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
virtual void StartingClick() wxOVERRIDE;
|
|
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellBoolEditor(*this); }
|
|
|
|
// added GetValue so we can get the value which is in the control, see
|
|
// also UseStringValues()
|
|
virtual wxString GetValue() const wxOVERRIDE;
|
|
|
|
// set the string values returned by GetValue() for the true and false
|
|
// states, respectively
|
|
static void UseStringValues(const wxString& valueTrue = wxT("1"),
|
|
const wxString& valueFalse = wxEmptyString);
|
|
|
|
// return true if the given string is equal to the string representation of
|
|
// true value which we currently use
|
|
static bool IsTrueValue(const wxString& value);
|
|
|
|
protected:
|
|
wxCheckBox *CBox() const { return (wxCheckBox *)m_control; }
|
|
|
|
private:
|
|
// These functions modify or use m_value.
|
|
void SetValueFromGrid(int row, int col, wxGrid* grid);
|
|
void SetGridFromValue(int row, int col, wxGrid* grid) const;
|
|
|
|
wxString GetStringValue() const { return GetStringValue(m_value); }
|
|
|
|
static
|
|
wxString GetStringValue(bool value) { return ms_stringValues[value]; }
|
|
|
|
bool m_value;
|
|
|
|
static wxString ms_stringValues[2];
|
|
};
|
|
|
|
#endif // wxUSE_CHECKBOX
|
|
|
|
#if wxUSE_COMBOBOX
|
|
|
|
// the editor for string data allowing to choose from the list of strings
|
|
class WXDLLIMPEXP_ADV wxGridCellChoiceEditor : public wxGridCellEditor
|
|
{
|
|
public:
|
|
// if !allowOthers, user can't type a string not in choices array
|
|
wxGridCellChoiceEditor(size_t count = 0,
|
|
const wxString choices[] = NULL,
|
|
bool allowOthers = false);
|
|
wxGridCellChoiceEditor(const wxArrayString& choices,
|
|
bool allowOthers = false)
|
|
: wxGridCellEditor(),
|
|
m_choices(choices),
|
|
m_allowOthers(allowOthers)
|
|
{
|
|
}
|
|
|
|
wxGridCellChoiceEditor(const wxGridCellChoiceEditor& other)
|
|
: wxGridCellEditor(other),
|
|
m_value(other.m_value),
|
|
m_choices(other.m_choices),
|
|
m_allowOthers(other.m_allowOthers)
|
|
{
|
|
}
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual void SetSize(const wxRect& rect) wxOVERRIDE;
|
|
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
|
|
// parameters string format is "item1[,item2[...,itemN]]"
|
|
virtual void SetParameters(const wxString& params) wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellChoiceEditor(*this); }
|
|
|
|
// added GetValue so we can get the value which is in the control
|
|
virtual wxString GetValue() const wxOVERRIDE;
|
|
|
|
protected:
|
|
wxComboBox *Combo() const { return (wxComboBox *)m_control; }
|
|
|
|
void OnComboCloseUp(wxCommandEvent& evt);
|
|
|
|
wxString m_value;
|
|
wxArrayString m_choices;
|
|
bool m_allowOthers;
|
|
};
|
|
|
|
#endif // wxUSE_COMBOBOX
|
|
|
|
#if wxUSE_COMBOBOX
|
|
|
|
class WXDLLIMPEXP_ADV wxGridCellEnumEditor : public wxGridCellChoiceEditor
|
|
{
|
|
public:
|
|
wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
|
|
|
|
wxGridCellEnumEditor(const wxGridCellEnumEditor& other)
|
|
: wxGridCellChoiceEditor(other),
|
|
m_index(other.m_index)
|
|
{
|
|
}
|
|
|
|
virtual ~wxGridCellEnumEditor() {}
|
|
|
|
virtual wxGridCellEditor* Clone() const wxOVERRIDE
|
|
{ return new wxGridCellEnumEditor(*this); }
|
|
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
private:
|
|
long m_index;
|
|
};
|
|
|
|
#endif // wxUSE_COMBOBOX
|
|
|
|
class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor
|
|
{
|
|
public:
|
|
wxGridCellAutoWrapStringEditor()
|
|
: wxGridCellTextEditor()
|
|
{
|
|
}
|
|
|
|
wxGridCellAutoWrapStringEditor(const wxGridCellAutoWrapStringEditor& other)
|
|
: wxGridCellTextEditor(other)
|
|
{
|
|
}
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellAutoWrapStringEditor(*this); }
|
|
};
|
|
|
|
#if wxUSE_DATEPICKCTRL
|
|
|
|
class WXDLLIMPEXP_ADV wxGridCellDateEditor : public wxGridCellEditor
|
|
{
|
|
public:
|
|
explicit wxGridCellDateEditor(const wxString& format = wxString());
|
|
|
|
wxGridCellDateEditor(const wxGridCellDateEditor& other)
|
|
: wxGridCellEditor(other),
|
|
m_value(other.m_value),
|
|
m_format(other.m_format)
|
|
{
|
|
}
|
|
|
|
virtual void SetParameters(const wxString& params) wxOVERRIDE;
|
|
|
|
virtual void Create(wxWindow* parent,
|
|
wxWindowID id,
|
|
wxEvtHandler* evtHandler) wxOVERRIDE;
|
|
|
|
virtual void SetSize(const wxRect& rect) wxOVERRIDE;
|
|
|
|
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
virtual bool EndEdit(int row, int col, const wxGrid* grid,
|
|
const wxString& oldval, wxString *newval) wxOVERRIDE;
|
|
virtual void ApplyEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
|
|
|
|
virtual void Reset() wxOVERRIDE;
|
|
|
|
virtual wxGridCellEditor *Clone() const wxOVERRIDE
|
|
{ return new wxGridCellDateEditor(*this); }
|
|
|
|
virtual wxString GetValue() const wxOVERRIDE;
|
|
|
|
protected:
|
|
wxDatePickerCtrl* DatePicker() const;
|
|
|
|
private:
|
|
wxDateTime m_value;
|
|
wxString m_format;
|
|
};
|
|
|
|
#endif // wxUSE_DATEPICKCTRL
|
|
|
|
#endif // wxUSE_GRID
|
|
|
|
#endif // _WX_GENERIC_GRID_EDITORS_H_
|