2009-11-10 12:40:58 -05:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: wx/dvrenderers.h
|
|
|
|
// Purpose: Declare all wxDataViewCtrl classes
|
|
|
|
// Author: Robert Roebling, Vadim Zeitlin
|
|
|
|
// Created: 2009-11-08 (extracted from wx/dataview.h)
|
|
|
|
// Copyright: (c) 2006 Robert Roebling
|
|
|
|
// (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
|
|
// Licence: wxWindows licence
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#ifndef _WX_DVRENDERERS_H_
|
|
|
|
#define _WX_DVRENDERERS_H_
|
|
|
|
|
|
|
|
/*
|
|
|
|
Note about the structure of various headers: they're organized in a more
|
|
|
|
complicated way than usual because of the various dependencies which are
|
|
|
|
different for different ports. In any case the only public header, i.e. the
|
|
|
|
one which can be included directly is wx/dataview.h. It, in turn, includes
|
|
|
|
this one to define all the renderer classes.
|
|
|
|
|
|
|
|
We define the base wxDataViewRendererBase class first and then include a
|
|
|
|
port-dependent wx/xxx/dvrenderer.h which defines wxDataViewRenderer itself.
|
|
|
|
After this we can define wxDataViewRendererCustomBase (and maybe in the
|
|
|
|
future base classes for other renderers if the need arises, i.e. if there
|
|
|
|
is any non-trivial code or API which it makes sense to keep in common code)
|
|
|
|
and include wx/xxx/dvrenderers.h (notice the plural) which defines all the
|
|
|
|
rest of the renderer classes.
|
|
|
|
*/
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_FWD_CORE wxDataViewCustomRenderer;
|
2009-11-10 12:40:58 -05:00
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewIconText: helper class used by wxDataViewIconTextRenderer
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewIconText : public wxObject
|
2009-11-10 12:40:58 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxDataViewIconText( const wxString &text = wxEmptyString,
|
2022-01-22 19:52:45 -05:00
|
|
|
const wxBitmapBundle& bitmap = wxBitmapBundle() )
|
2009-11-10 12:40:58 -05:00
|
|
|
: m_text(text),
|
2022-01-22 19:52:45 -05:00
|
|
|
m_bitmap(bitmap)
|
2009-11-10 12:40:58 -05:00
|
|
|
{ }
|
|
|
|
|
|
|
|
void SetText( const wxString &text ) { m_text = text; }
|
|
|
|
wxString GetText() const { return m_text; }
|
2022-01-22 19:52:45 -05:00
|
|
|
|
|
|
|
void SetBitmapBundle(const wxBitmapBundle& bitmap) { m_bitmap = bitmap; }
|
|
|
|
const wxBitmapBundle& GetBitmapBundle() const { return m_bitmap; }
|
|
|
|
|
|
|
|
// These methods exist for compatibility, prefer using the methods above.
|
|
|
|
void SetIcon( const wxIcon &icon ) { m_bitmap = wxBitmapBundle(icon); }
|
|
|
|
wxIcon GetIcon() const { return m_bitmap.GetIcon(wxDefaultSize); }
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2011-08-22 11:31:33 -04:00
|
|
|
bool IsSameAs(const wxDataViewIconText& other) const
|
|
|
|
{
|
2022-01-22 19:52:45 -05:00
|
|
|
return m_text == other.m_text && m_bitmap.IsSameAs(other.m_bitmap);
|
2011-08-22 11:31:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool operator==(const wxDataViewIconText& other) const
|
|
|
|
{
|
|
|
|
return IsSameAs(other);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator!=(const wxDataViewIconText& other) const
|
|
|
|
{
|
|
|
|
return !IsSameAs(other);
|
|
|
|
}
|
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
private:
|
|
|
|
wxString m_text;
|
2022-01-22 19:52:45 -05:00
|
|
|
wxBitmapBundle m_bitmap;
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2015-04-23 07:49:01 -04:00
|
|
|
wxDECLARE_DYNAMIC_CLASS(wxDataViewIconText);
|
2009-11-10 12:40:58 -05:00
|
|
|
};
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
DECLARE_VARIANT_OBJECT_EXPORTED(wxDataViewIconText, WXDLLIMPEXP_CORE)
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2017-10-02 16:28:28 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewCheckIconText: value class used by wxDataViewCheckIconTextRenderer
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewCheckIconText : public wxDataViewIconText
|
2017-10-02 16:28:28 -04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxDataViewCheckIconText(const wxString& text = wxString(),
|
2022-01-22 19:52:45 -05:00
|
|
|
const wxBitmapBundle& icon = wxBitmapBundle(),
|
2017-10-02 16:28:28 -04:00
|
|
|
wxCheckBoxState checkedState = wxCHK_UNDETERMINED)
|
|
|
|
: wxDataViewIconText(text, icon),
|
|
|
|
m_checkedState(checkedState)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
wxCheckBoxState GetCheckedState() const { return m_checkedState; }
|
|
|
|
void SetCheckedState(wxCheckBoxState state) { m_checkedState = state; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
wxCheckBoxState m_checkedState;
|
|
|
|
|
|
|
|
wxDECLARE_DYNAMIC_CLASS(wxDataViewCheckIconText);
|
|
|
|
};
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
DECLARE_VARIANT_OBJECT_EXPORTED(wxDataViewCheckIconText, WXDLLIMPEXP_CORE)
|
2017-10-02 16:28:28 -04:00
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewRendererBase
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
enum wxDataViewCellMode
|
|
|
|
{
|
|
|
|
wxDATAVIEW_CELL_INERT,
|
|
|
|
wxDATAVIEW_CELL_ACTIVATABLE,
|
|
|
|
wxDATAVIEW_CELL_EDITABLE
|
|
|
|
};
|
|
|
|
|
|
|
|
enum wxDataViewCellRenderState
|
|
|
|
{
|
|
|
|
wxDATAVIEW_CELL_SELECTED = 1,
|
|
|
|
wxDATAVIEW_CELL_PRELIT = 2,
|
|
|
|
wxDATAVIEW_CELL_INSENSITIVE = 4,
|
|
|
|
wxDATAVIEW_CELL_FOCUSED = 8
|
|
|
|
};
|
|
|
|
|
2016-11-21 12:07:32 -05:00
|
|
|
// helper for fine-tuning rendering of values depending on row's state
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewValueAdjuster
|
2016-11-21 12:07:32 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~wxDataViewValueAdjuster() {}
|
|
|
|
|
|
|
|
// changes the value to have appearance suitable for highlighted rows
|
|
|
|
virtual wxVariant MakeHighlighted(const wxVariant& value) const { return value; }
|
|
|
|
};
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewRendererBase: public wxObject
|
2009-11-10 12:40:58 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxDataViewRendererBase( const wxString &varianttype,
|
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
|
|
|
|
int alignment = wxDVR_DEFAULT_ALIGNMENT );
|
|
|
|
virtual ~wxDataViewRendererBase();
|
|
|
|
|
|
|
|
virtual bool Validate( wxVariant& WXUNUSED(value) )
|
|
|
|
{ return true; }
|
|
|
|
|
|
|
|
void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; }
|
|
|
|
wxDataViewColumn* GetOwner() const { return m_owner; }
|
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
// renderer value and attributes: SetValue() and SetAttr() are called
|
|
|
|
// before a cell is rendered using this renderer
|
|
|
|
virtual bool SetValue(const wxVariant& value) = 0;
|
|
|
|
virtual bool GetValue(wxVariant& value) const = 0;
|
2016-10-24 15:52:22 -04:00
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const = 0;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
2009-11-10 12:40:58 -05:00
|
|
|
|
|
|
|
wxString GetVariantType() const { return m_variantType; }
|
|
|
|
|
2022-05-08 13:32:46 -04:00
|
|
|
// Check if the given variant type is compatible with the type expected by
|
|
|
|
// this renderer: by default, just compare it with GetVariantType(), but
|
|
|
|
// can be overridden to accept other types that can be converted to the
|
|
|
|
// type needed by the renderer.
|
|
|
|
virtual bool IsCompatibleVariantType(const wxString& variantType) const
|
|
|
|
{
|
|
|
|
return variantType == GetVariantType();
|
|
|
|
}
|
|
|
|
|
2015-08-28 17:58:10 -04:00
|
|
|
// Prepare for rendering the value of the corresponding item in the given
|
|
|
|
// column taken from the provided non-null model.
|
|
|
|
//
|
|
|
|
// Notice that the column must be the same as GetOwner()->GetModelColumn(),
|
|
|
|
// it is only passed to this method because the existing code already has
|
|
|
|
// it and should probably be removed in the future.
|
|
|
|
//
|
2015-08-28 19:03:42 -04:00
|
|
|
// Return true if this cell is non-empty or false otherwise (and also if
|
2022-05-08 13:32:46 -04:00
|
|
|
// the model returned a value of the wrong type, i.e. such that our
|
|
|
|
// IsCompatibleVariantType() returned false for it, in which case a debug
|
|
|
|
// error is also logged).
|
2015-08-28 19:03:42 -04:00
|
|
|
bool PrepareForItem(const wxDataViewModel *model,
|
|
|
|
const wxDataViewItem& item,
|
|
|
|
unsigned column);
|
2010-10-30 11:57:55 -04:00
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
// renderer properties:
|
2009-11-10 12:40:58 -05:00
|
|
|
virtual void SetMode( wxDataViewCellMode mode ) = 0;
|
|
|
|
virtual wxDataViewCellMode GetMode() const = 0;
|
|
|
|
|
|
|
|
// NOTE: Set/GetAlignment do not take/return a wxAlignment enum but
|
|
|
|
// rather an "int"; that's because for rendering cells it's allowed
|
|
|
|
// to combine alignment flags (e.g. wxALIGN_LEFT|wxALIGN_BOTTOM)
|
|
|
|
virtual void SetAlignment( int align ) = 0;
|
|
|
|
virtual int GetAlignment() const = 0;
|
|
|
|
|
|
|
|
// enable or disable (if called with wxELLIPSIZE_NONE) replacing parts of
|
|
|
|
// the item text (hence this only makes sense for renderers showing
|
|
|
|
// text...) with ellipsis in order to make it fit the column width
|
|
|
|
virtual void EnableEllipsize(wxEllipsizeMode mode = wxELLIPSIZE_MIDDLE) = 0;
|
|
|
|
void DisableEllipsize() { EnableEllipsize(wxELLIPSIZE_NONE); }
|
|
|
|
|
|
|
|
virtual wxEllipsizeMode GetEllipsizeMode() const = 0;
|
|
|
|
|
|
|
|
// in-place editing
|
|
|
|
virtual bool HasEditorCtrl() const
|
|
|
|
{ return false; }
|
2011-04-22 14:25:32 -04:00
|
|
|
virtual wxWindow* CreateEditorCtrl(wxWindow * WXUNUSED(parent),
|
|
|
|
wxRect WXUNUSED(labelRect),
|
|
|
|
const wxVariant& WXUNUSED(value))
|
2009-11-10 12:40:58 -05:00
|
|
|
{ return NULL; }
|
2011-04-22 14:25:32 -04:00
|
|
|
virtual bool GetValueFromEditorCtrl(wxWindow * WXUNUSED(editor),
|
2009-11-10 12:40:58 -05:00
|
|
|
wxVariant& WXUNUSED(value))
|
|
|
|
{ return false; }
|
|
|
|
|
|
|
|
virtual bool StartEditing( const wxDataViewItem &item, wxRect labelRect );
|
|
|
|
virtual void CancelEditing();
|
|
|
|
virtual bool FinishEditing();
|
|
|
|
|
2016-02-28 12:02:26 -05:00
|
|
|
wxWindow *GetEditorCtrl() const { return m_editorCtrl; }
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2011-01-19 03:09:51 -05:00
|
|
|
virtual bool IsCustomRenderer() const { return false; }
|
|
|
|
|
|
|
|
|
2013-12-02 11:30:25 -05:00
|
|
|
// Implementation only from now on.
|
2010-05-05 08:45:09 -04:00
|
|
|
|
2013-09-17 11:25:47 -04:00
|
|
|
// Return the alignment of this renderer if it's specified (i.e. has value
|
|
|
|
// different from the default wxDVR_DEFAULT_ALIGNMENT) or the alignment of
|
|
|
|
// the column it is used for otherwise.
|
|
|
|
//
|
|
|
|
// Unlike GetAlignment(), this always returns a valid combination of
|
|
|
|
// wxALIGN_XXX flags (although possibly wxALIGN_NOT) and never returns
|
|
|
|
// wxDVR_DEFAULT_ALIGNMENT.
|
|
|
|
int GetEffectiveAlignment() const;
|
|
|
|
|
2016-10-21 11:50:34 -04:00
|
|
|
// Like GetEffectiveAlignment(), but returns wxDVR_DEFAULT_ALIGNMENT if
|
|
|
|
// the owner isn't set and GetAlignment() is default.
|
|
|
|
int GetEffectiveAlignmentIfKnown() const;
|
|
|
|
|
2015-11-25 19:18:22 -05:00
|
|
|
// Send wxEVT_DATAVIEW_ITEM_EDITING_STARTED event.
|
|
|
|
void NotifyEditingStarted(const wxDataViewItem& item);
|
|
|
|
|
2016-11-21 12:07:32 -05:00
|
|
|
// Sets the transformer for fine-tuning rendering of values depending on row's state
|
|
|
|
void SetValueAdjuster(wxDataViewValueAdjuster *transformer)
|
|
|
|
{ delete m_valueAdjuster; m_valueAdjuster = transformer; }
|
|
|
|
|
2013-12-02 11:30:25 -05:00
|
|
|
protected:
|
2015-08-28 19:03:42 -04:00
|
|
|
// These methods are called from PrepareForItem() and should do whatever is
|
|
|
|
// needed for the current platform to ensure that the item is rendered
|
|
|
|
// using the given attributes and enabled/disabled state.
|
|
|
|
virtual void SetAttr(const wxDataViewItemAttr& attr) = 0;
|
|
|
|
virtual void SetEnabled(bool enabled) = 0;
|
|
|
|
|
2016-11-21 12:07:32 -05:00
|
|
|
// Return whether the currently rendered item is on a highlighted row
|
|
|
|
// (typically selection with dark background). For internal use only.
|
|
|
|
virtual bool IsHighlighted() const = 0;
|
|
|
|
|
2015-08-28 19:03:42 -04:00
|
|
|
// Helper of PrepareForItem() also used in StartEditing(): returns the
|
|
|
|
// value checking that its type matches our GetVariantType().
|
2015-08-28 17:58:10 -04:00
|
|
|
wxVariant CheckedGetValue(const wxDataViewModel* model,
|
|
|
|
const wxDataViewItem& item,
|
|
|
|
unsigned column) const;
|
|
|
|
|
2018-02-04 19:05:16 -05:00
|
|
|
// Validates the given value (if it is non-null) and sends (in any case)
|
|
|
|
// ITEM_EDITING_DONE event and, finally, updates the model with the value
|
|
|
|
// (f it is valid, of course) if the event wasn't vetoed.
|
|
|
|
bool DoHandleEditingDone(wxVariant* value);
|
|
|
|
|
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
wxString m_variantType;
|
|
|
|
wxDataViewColumn *m_owner;
|
2011-04-22 14:25:32 -04:00
|
|
|
wxWeakRef<wxWindow> m_editorCtrl;
|
2015-11-29 22:03:18 -05:00
|
|
|
wxDataViewItem m_item; // Item being currently edited, if valid.
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2016-11-21 12:07:32 -05:00
|
|
|
wxDataViewValueAdjuster *m_valueAdjuster;
|
|
|
|
|
2011-08-22 11:31:36 -04:00
|
|
|
// internal utility, may be used anywhere the window associated with the
|
|
|
|
// renderer is required
|
|
|
|
wxDataViewCtrl* GetView() const;
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2018-02-04 16:20:22 -05:00
|
|
|
private:
|
|
|
|
// Called from {Called,Finish}Editing() and dtor to cleanup m_editorCtrl
|
|
|
|
void DestroyEditControl();
|
|
|
|
|
2015-04-23 07:49:01 -04:00
|
|
|
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase);
|
2009-11-10 12:40:58 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
// include the real wxDataViewRenderer declaration for the native ports
|
|
|
|
#ifdef wxHAS_GENERIC_DATAVIEWCTRL
|
|
|
|
// in the generic implementation there is no real wxDataViewRenderer, all
|
|
|
|
// renderers are custom so it's the same as wxDataViewCustomRenderer and
|
|
|
|
// wxDataViewCustomRendererBase derives from wxDataViewRendererBase directly
|
|
|
|
//
|
|
|
|
// this is a rather ugly hack but unfortunately it just doesn't seem to be
|
|
|
|
// possible to have the same class hierarchy in all ports and avoid
|
|
|
|
// duplicating the entire wxDataViewCustomRendererBase in the generic
|
|
|
|
// wxDataViewRenderer class (well, we could use a mix-in but this would
|
|
|
|
// make classes hierarchy non linear and arguably even more complex)
|
|
|
|
#define wxDataViewCustomRendererRealBase wxDataViewRendererBase
|
|
|
|
#else
|
|
|
|
#if defined(__WXGTK20__)
|
|
|
|
#include "wx/gtk/dvrenderer.h"
|
|
|
|
#elif defined(__WXMAC__)
|
|
|
|
#include "wx/osx/dvrenderer.h"
|
2014-08-23 21:50:11 -04:00
|
|
|
#elif defined(__WXQT__)
|
|
|
|
#include "wx/qt/dvrenderer.h"
|
2009-11-10 12:40:58 -05:00
|
|
|
#else
|
|
|
|
#error "unknown native wxDataViewCtrl implementation"
|
|
|
|
#endif
|
|
|
|
#define wxDataViewCustomRendererRealBase wxDataViewRenderer
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewCustomRendererBase
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewCustomRendererBase
|
2009-11-10 12:40:58 -05:00
|
|
|
: public wxDataViewCustomRendererRealBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Constructor must specify the usual renderer parameters which we simply
|
|
|
|
// pass to the base class
|
2019-10-22 06:34:29 -04:00
|
|
|
wxDataViewCustomRendererBase(const wxString& varianttype = wxASCII_STR("string"),
|
2009-11-10 12:40:58 -05:00
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
|
|
|
|
int align = wxDVR_DEFAULT_ALIGNMENT)
|
|
|
|
: wxDataViewCustomRendererRealBase(varianttype, mode, align)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
// Render the item using the current value (returned by GetValue()).
|
|
|
|
virtual bool Render(wxRect cell, wxDC *dc, int state) = 0;
|
|
|
|
|
|
|
|
// Return the size of the item appropriate to its current value.
|
|
|
|
virtual wxSize GetSize() const = 0;
|
|
|
|
|
2011-10-19 12:20:17 -04:00
|
|
|
// Define virtual function which are called when a key is pressed on the
|
|
|
|
// item, clicked or the user starts to drag it: by default they all simply
|
|
|
|
// return false indicating that the events are not handled
|
|
|
|
|
|
|
|
virtual bool ActivateCell(const wxRect& cell,
|
|
|
|
wxDataViewModel *model,
|
|
|
|
const wxDataViewItem & item,
|
|
|
|
unsigned int col,
|
2011-10-21 12:34:32 -04:00
|
|
|
const wxMouseEvent* mouseEvent);
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2011-10-19 12:20:17 -04:00
|
|
|
// Deprecated, use (and override) ActivateCell() instead
|
|
|
|
wxDEPRECATED_BUT_USED_INTERNALLY_INLINE(
|
|
|
|
virtual bool Activate(wxRect WXUNUSED(cell),
|
|
|
|
wxDataViewModel *WXUNUSED(model),
|
|
|
|
const wxDataViewItem & WXUNUSED(item),
|
|
|
|
unsigned int WXUNUSED(col)),
|
|
|
|
return false; )
|
|
|
|
|
|
|
|
// Deprecated, use (and override) ActivateCell() instead
|
|
|
|
wxDEPRECATED_BUT_USED_INTERNALLY_INLINE(
|
|
|
|
virtual bool LeftClick(wxPoint WXUNUSED(cursor),
|
|
|
|
wxRect WXUNUSED(cell),
|
|
|
|
wxDataViewModel *WXUNUSED(model),
|
|
|
|
const wxDataViewItem & WXUNUSED(item),
|
|
|
|
unsigned int WXUNUSED(col)),
|
|
|
|
return false; )
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2011-03-01 07:16:49 -05:00
|
|
|
virtual bool StartDrag(const wxPoint& WXUNUSED(cursor),
|
|
|
|
const wxRect& WXUNUSED(cell),
|
2009-11-10 12:40:58 -05:00
|
|
|
wxDataViewModel *WXUNUSED(model),
|
|
|
|
const wxDataViewItem & WXUNUSED(item),
|
|
|
|
unsigned int WXUNUSED(col) )
|
|
|
|
{ return false; }
|
|
|
|
|
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
// Helper which can be used by Render() implementation in the derived
|
|
|
|
// classes: it will draw the text in the same manner as the standard
|
|
|
|
// renderers do.
|
|
|
|
virtual void RenderText(const wxString& text,
|
|
|
|
int xoffset,
|
|
|
|
wxRect cell,
|
|
|
|
wxDC *dc,
|
|
|
|
int state);
|
|
|
|
|
|
|
|
|
|
|
|
// Override the base class virtual method to simply store the attribute so
|
|
|
|
// that it can be accessed using GetAttr() from Render() if needed.
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual void SetAttr(const wxDataViewItemAttr& attr) wxOVERRIDE { m_attr = attr; }
|
2009-11-10 12:41:11 -05:00
|
|
|
const wxDataViewItemAttr& GetAttr() const { return m_attr; }
|
|
|
|
|
2010-12-19 10:02:56 -05:00
|
|
|
// Store the enabled state of the item so that it can be accessed from
|
|
|
|
// Render() via GetEnabled() if needed.
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual void SetEnabled(bool enabled) wxOVERRIDE;
|
2010-12-19 10:02:56 -05:00
|
|
|
bool GetEnabled() const { return m_enabled; }
|
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
|
|
|
|
// Implementation only from now on
|
|
|
|
|
|
|
|
// Retrieve the DC to use for drawing. This is implemented in derived
|
|
|
|
// platform-specific classes.
|
|
|
|
virtual wxDC *GetDC() = 0;
|
|
|
|
|
2011-12-19 07:54:38 -05:00
|
|
|
// To draw background use the background colour in wxDataViewItemAttr
|
|
|
|
virtual void RenderBackground(wxDC* dc, const wxRect& rect);
|
|
|
|
|
2009-11-10 12:41:11 -05:00
|
|
|
// Prepare DC to use attributes and call Render().
|
|
|
|
void WXCallRender(wxRect rect, wxDC *dc, int state);
|
|
|
|
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual bool IsCustomRenderer() const wxOVERRIDE { return true; }
|
2011-01-19 03:09:51 -05:00
|
|
|
|
2010-10-30 11:57:49 -04:00
|
|
|
protected:
|
|
|
|
// helper for GetSize() implementations, respects attributes
|
|
|
|
wxSize GetTextExtent(const wxString& str) const;
|
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
private:
|
2009-11-10 12:41:11 -05:00
|
|
|
wxDataViewItemAttr m_attr;
|
2010-12-19 10:02:56 -05:00
|
|
|
bool m_enabled;
|
2009-11-10 12:41:11 -05:00
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase);
|
|
|
|
};
|
|
|
|
|
|
|
|
// include the declaration of all the other renderers to get the real
|
|
|
|
// wxDataViewCustomRenderer from which we need to inherit below
|
|
|
|
#ifdef wxHAS_GENERIC_DATAVIEWCTRL
|
|
|
|
// because of the different renderer classes hierarchy in the generic
|
|
|
|
// version, as explained above, we can include the header defining
|
|
|
|
// wxDataViewRenderer only here and not before wxDataViewCustomRendererBase
|
|
|
|
// declaration as for the native ports
|
|
|
|
#include "wx/generic/dvrenderer.h"
|
|
|
|
#include "wx/generic/dvrenderers.h"
|
|
|
|
#elif defined(__WXGTK20__)
|
|
|
|
#include "wx/gtk/dvrenderers.h"
|
|
|
|
#elif defined(__WXMAC__)
|
|
|
|
#include "wx/osx/dvrenderers.h"
|
2014-08-23 21:50:11 -04:00
|
|
|
#elif defined(__WXQT__)
|
|
|
|
#include "wx/qt/dvrenderers.h"
|
2009-11-10 12:40:58 -05:00
|
|
|
#else
|
|
|
|
#error "unknown native wxDataViewCtrl implementation"
|
|
|
|
#endif
|
|
|
|
|
2015-10-11 11:07:15 -04:00
|
|
|
#if wxUSE_SPINCTRL
|
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewSpinRenderer
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewSpinRenderer: public wxDataViewCustomRenderer
|
2009-11-10 12:40:58 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxDataViewSpinRenderer( int min, int max,
|
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
|
|
|
|
int alignment = wxDVR_DEFAULT_ALIGNMENT );
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual bool HasEditorCtrl() const wxOVERRIDE { return true; }
|
|
|
|
virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool Render( wxRect rect, wxDC *dc, int state ) wxOVERRIDE;
|
|
|
|
virtual wxSize GetSize() const wxOVERRIDE;
|
|
|
|
virtual bool SetValue( const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValue( wxVariant &value ) const wxOVERRIDE;
|
2016-10-24 15:52:22 -04:00
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const wxOVERRIDE;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
2009-11-10 12:40:58 -05:00
|
|
|
|
|
|
|
private:
|
|
|
|
long m_data;
|
|
|
|
long m_min,m_max;
|
|
|
|
};
|
|
|
|
|
2015-10-11 11:07:15 -04:00
|
|
|
#endif // wxUSE_SPINCTRL
|
|
|
|
|
2016-01-22 09:40:58 -05:00
|
|
|
#if defined(wxHAS_GENERIC_DATAVIEWCTRL)
|
2009-11-10 12:40:58 -05:00
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewChoiceRenderer
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewChoiceRenderer: public wxDataViewCustomRenderer
|
2009-11-10 12:40:58 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxDataViewChoiceRenderer( const wxArrayString &choices,
|
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
|
|
|
|
int alignment = wxDVR_DEFAULT_ALIGNMENT );
|
2016-09-25 16:21:28 -04:00
|
|
|
virtual bool HasEditorCtrl() const wxOVERRIDE { return true; }
|
|
|
|
virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool Render( wxRect rect, wxDC *dc, int state ) wxOVERRIDE;
|
|
|
|
virtual wxSize GetSize() const wxOVERRIDE;
|
|
|
|
virtual bool SetValue( const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValue( wxVariant &value ) const wxOVERRIDE;
|
2016-10-24 15:52:22 -04:00
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const wxOVERRIDE;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
2009-11-10 12:40:58 -05:00
|
|
|
|
2010-05-16 11:26:57 -04:00
|
|
|
wxString GetChoice(size_t index) const { return m_choices[index]; }
|
|
|
|
const wxArrayString& GetChoices() const { return m_choices; }
|
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
private:
|
|
|
|
wxArrayString m_choices;
|
|
|
|
wxString m_data;
|
|
|
|
};
|
|
|
|
|
2010-05-16 11:52:35 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
2010-05-21 16:13:49 -04:00
|
|
|
// wxDataViewChoiceByIndexRenderer
|
2010-05-16 11:52:35 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewChoiceByIndexRenderer: public wxDataViewChoiceRenderer
|
2010-05-16 11:52:35 -04:00
|
|
|
{
|
|
|
|
public:
|
2010-05-21 16:13:49 -04:00
|
|
|
wxDataViewChoiceByIndexRenderer( const wxArrayString &choices,
|
2010-05-16 11:52:35 -04:00
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
|
2010-05-21 16:13:49 -04:00
|
|
|
int alignment = wxDVR_DEFAULT_ALIGNMENT );
|
2010-09-30 07:44:45 -04:00
|
|
|
|
2016-09-25 16:21:28 -04:00
|
|
|
virtual wxWindow* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValueFromEditorCtrl( wxWindow* editor, wxVariant &value ) wxOVERRIDE;
|
2010-09-30 07:44:45 -04:00
|
|
|
|
2016-09-25 16:21:28 -04:00
|
|
|
virtual bool SetValue( const wxVariant &value ) wxOVERRIDE;
|
|
|
|
virtual bool GetValue( wxVariant &value ) const wxOVERRIDE;
|
2016-10-24 15:52:22 -04:00
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const wxOVERRIDE;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
2010-05-16 11:52:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-01-22 09:40:58 -05:00
|
|
|
#endif // generic version
|
2010-05-21 16:13:49 -04:00
|
|
|
|
2011-10-19 12:20:06 -04:00
|
|
|
#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXGTK__)
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewDateRenderer
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#if wxUSE_DATEPICKCTRL
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewDateRenderer: public wxDataViewCustomRenderer
|
2011-10-19 12:20:06 -04:00
|
|
|
{
|
|
|
|
public:
|
2015-08-20 12:51:11 -04:00
|
|
|
static wxString GetDefaultType() { return wxS("datetime"); }
|
|
|
|
|
|
|
|
wxDataViewDateRenderer(const wxString &varianttype = GetDefaultType(),
|
2011-10-19 12:20:06 -04:00
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
|
|
|
|
int align = wxDVR_DEFAULT_ALIGNMENT);
|
|
|
|
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual bool HasEditorCtrl() const wxOVERRIDE { return true; }
|
|
|
|
virtual wxWindow *CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant &value) wxOVERRIDE;
|
|
|
|
virtual bool GetValueFromEditorCtrl(wxWindow* editor, wxVariant &value) wxOVERRIDE;
|
|
|
|
virtual bool SetValue(const wxVariant &value) wxOVERRIDE;
|
|
|
|
virtual bool GetValue(wxVariant& value) const wxOVERRIDE;
|
2016-10-24 15:52:22 -04:00
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const wxOVERRIDE;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
2015-09-06 20:20:42 -04:00
|
|
|
virtual bool Render( wxRect cell, wxDC *dc, int state ) wxOVERRIDE;
|
|
|
|
virtual wxSize GetSize() const wxOVERRIDE;
|
2011-10-19 12:20:06 -04:00
|
|
|
|
|
|
|
private:
|
2021-08-14 14:08:43 -04:00
|
|
|
wxString FormatDate() const;
|
|
|
|
|
2011-10-19 12:20:06 -04:00
|
|
|
wxDateTime m_date;
|
|
|
|
};
|
|
|
|
#else // !wxUSE_DATEPICKCTRL
|
|
|
|
typedef wxDataViewTextRenderer wxDataViewDateRenderer;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // generic or GTK+ versions
|
|
|
|
|
2017-10-02 16:28:28 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDataViewCheckIconTextRenderer: 3-state checkbox + text + optional icon
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2019-12-15 10:44:42 -05:00
|
|
|
#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || !defined(__WXOSX__)
|
2019-10-20 20:04:35 -04:00
|
|
|
|
2018-08-27 10:34:34 -04:00
|
|
|
class WXDLLIMPEXP_CORE wxDataViewCheckIconTextRenderer
|
2017-10-02 16:28:28 -04:00
|
|
|
: public wxDataViewCustomRenderer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
static wxString GetDefaultType() { return wxS("wxDataViewCheckIconText"); }
|
|
|
|
|
|
|
|
explicit wxDataViewCheckIconTextRenderer
|
|
|
|
(
|
|
|
|
wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE,
|
|
|
|
int align = wxDVR_DEFAULT_ALIGNMENT
|
|
|
|
);
|
|
|
|
|
|
|
|
// This renderer can always display the 3rd ("indeterminate") checkbox
|
|
|
|
// state if the model contains cells with wxCHK_UNDETERMINED value, but it
|
|
|
|
// doesn't allow the user to set it by default. Call this method to allow
|
|
|
|
// this to happen.
|
|
|
|
void Allow3rdStateForUser(bool allow = true);
|
|
|
|
|
|
|
|
virtual bool SetValue(const wxVariant& value) wxOVERRIDE;
|
|
|
|
virtual bool GetValue(wxVariant& value) const wxOVERRIDE;
|
|
|
|
|
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
virtual wxString GetAccessibleDescription() const wxOVERRIDE;
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
|
|
|
|
|
|
|
virtual wxSize GetSize() const wxOVERRIDE;
|
|
|
|
virtual bool Render(wxRect cell, wxDC* dc, int state) wxOVERRIDE;
|
|
|
|
virtual bool ActivateCell(const wxRect& cell,
|
|
|
|
wxDataViewModel *model,
|
|
|
|
const wxDataViewItem & item,
|
|
|
|
unsigned int col,
|
|
|
|
const wxMouseEvent *mouseEvent) wxOVERRIDE;
|
|
|
|
|
|
|
|
private:
|
|
|
|
wxSize GetCheckSize() const;
|
|
|
|
|
|
|
|
// Just some arbitrary constants defining margins, in pixels.
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
MARGIN_CHECK_ICON = 3,
|
|
|
|
MARGIN_ICON_TEXT = 4
|
|
|
|
};
|
|
|
|
|
|
|
|
wxDataViewCheckIconText m_value;
|
|
|
|
|
|
|
|
bool m_allow3rdStateForUser;
|
|
|
|
|
|
|
|
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCheckIconTextRenderer);
|
|
|
|
};
|
|
|
|
|
2019-12-15 10:44:42 -05:00
|
|
|
#endif // ! native __WXOSX__
|
2017-10-02 16:28:28 -04:00
|
|
|
|
2009-11-10 12:40:58 -05:00
|
|
|
// this class is obsolete, its functionality was merged in
|
|
|
|
// wxDataViewTextRenderer itself now, don't use it any more
|
|
|
|
#define wxDataViewTextRendererAttr wxDataViewTextRenderer
|
|
|
|
|
|
|
|
#endif // _WX_DVRENDERERS_H_
|
|
|
|
|