This simplifies the code by removing the need for a special event, and also means the combox popup handler is no longer needed to reset the inSetFocus flag for the closing handler.
		
			
				
	
	
		
			426 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			426 lines
		
	
	
		
			13 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);
 | 
						|
 | 
						|
    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;
 | 
						|
 | 
						|
    // 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;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellTextEditor);
 | 
						|
};
 | 
						|
 | 
						|
// 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);
 | 
						|
 | 
						|
    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(m_min, m_max); }
 | 
						|
 | 
						|
    // 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;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellNumberEditor);
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
    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(m_width, m_precision); }
 | 
						|
 | 
						|
    // 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;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellFloatEditor);
 | 
						|
};
 | 
						|
 | 
						|
#endif // wxUSE_TEXTCTRL
 | 
						|
 | 
						|
#if wxUSE_CHECKBOX
 | 
						|
 | 
						|
// the editor for boolean data
 | 
						|
class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGridCellBoolEditor() { }
 | 
						|
 | 
						|
    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; }
 | 
						|
 | 
						|
    // 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];
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellBoolEditor);
 | 
						|
};
 | 
						|
 | 
						|
#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);
 | 
						|
 | 
						|
    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;
 | 
						|
 | 
						|
    // 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;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellChoiceEditor);
 | 
						|
};
 | 
						|
 | 
						|
#endif // wxUSE_COMBOBOX
 | 
						|
 | 
						|
#if wxUSE_COMBOBOX
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxGridCellEnumEditor : public wxGridCellChoiceEditor
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
 | 
						|
    virtual ~wxGridCellEnumEditor() {}
 | 
						|
 | 
						|
    virtual wxGridCellEditor*  Clone() const 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;
 | 
						|
 | 
						|
private:
 | 
						|
    long m_index;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellEnumEditor);
 | 
						|
};
 | 
						|
 | 
						|
#endif // wxUSE_COMBOBOX
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { }
 | 
						|
    virtual void Create(wxWindow* parent,
 | 
						|
                        wxWindowID id,
 | 
						|
                        wxEvtHandler* evtHandler) wxOVERRIDE;
 | 
						|
 | 
						|
    virtual wxGridCellEditor *Clone() const wxOVERRIDE
 | 
						|
        { return new wxGridCellAutoWrapStringEditor; }
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellAutoWrapStringEditor);
 | 
						|
};
 | 
						|
 | 
						|
#if wxUSE_DATEPICKCTRL
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxGridCellDateEditor : public wxGridCellEditor
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxGridCellDateEditor() { }
 | 
						|
 | 
						|
    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;
 | 
						|
 | 
						|
    virtual wxString GetValue() const wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    wxDatePickerCtrl* DatePicker() const;
 | 
						|
 | 
						|
private:
 | 
						|
    wxDateTime m_value;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxGridCellDateEditor);
 | 
						|
};
 | 
						|
 | 
						|
#endif // wxUSE_DATEPICKCTRL
 | 
						|
 | 
						|
#endif // wxUSE_GRID
 | 
						|
 | 
						|
#endif // _WX_GENERIC_GRID_EDITORS_H_
 |