Don't apply alignment to native controls in SetAlignment() method, where it may not be known yet due to column-to-renderer inheritance if wxDVR_DEFAULT_ALIGNMENT is used (the default). Move such code to GtkUpdateAlignment() (which was made virtual) in all renderers. This fixes unintended right-aligning of columns with GTK+ 2 when default alignment was used.
		
			
				
	
	
		
			291 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/gtk/dvrenderers.h
 | 
						|
// Purpose:     All GTK wxDataViewCtrl renderer classes
 | 
						|
// Author:      Robert Roebling, Vadim Zeitlin
 | 
						|
// Created:     2009-11-07 (extracted from wx/gtk/dataview.h)
 | 
						|
// Copyright:   (c) 2006 Robert Roebling
 | 
						|
//              (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_GTK_DVRENDERERS_H_
 | 
						|
#define _WX_GTK_DVRENDERERS_H_
 | 
						|
 | 
						|
#ifdef __WXGTK3__
 | 
						|
    typedef struct _cairo_rectangle_int cairo_rectangle_int_t;
 | 
						|
    typedef cairo_rectangle_int_t GdkRectangle;
 | 
						|
#else
 | 
						|
    typedef struct _GdkRectangle GdkRectangle;
 | 
						|
#endif
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewTextRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("string"); }
 | 
						|
 | 
						|
    wxDataViewTextRenderer( const wxString &varianttype = GetDefaultType(),
 | 
						|
                            wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                            int align = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
 | 
						|
#if wxUSE_MARKUP
 | 
						|
    void EnableMarkup(bool enable = true);
 | 
						|
#endif // wxUSE_MARKUP
 | 
						|
 | 
						|
    virtual bool SetValue( const wxVariant &value ) wxOVERRIDE
 | 
						|
    {
 | 
						|
        return SetTextValue(value);
 | 
						|
    }
 | 
						|
 | 
						|
    virtual bool GetValue( wxVariant &value ) const wxOVERRIDE
 | 
						|
    {
 | 
						|
        wxString str;
 | 
						|
        if ( !GetTextValue(str) )
 | 
						|
            return false;
 | 
						|
 | 
						|
        value = str;
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual void GtkUpdateAlignment() wxOVERRIDE;
 | 
						|
 | 
						|
    virtual GtkCellRendererText *GtkGetTextRenderer() const wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    virtual void SetAttr(const wxDataViewItemAttr& attr) wxOVERRIDE;
 | 
						|
 | 
						|
    // implementation of Set/GetValue()
 | 
						|
    bool SetTextValue(const wxString& str);
 | 
						|
    bool GetTextValue(wxString& str) const;
 | 
						|
 | 
						|
    // Return the name of the GtkCellRendererText property to use: "text" or
 | 
						|
    // "markup".
 | 
						|
    const char* GetTextPropertyName() const;
 | 
						|
 | 
						|
#if wxUSE_MARKUP
 | 
						|
    // True if we should interpret markup in our text.
 | 
						|
    bool m_useMarkup;
 | 
						|
#endif // wxUSE_MARKUP
 | 
						|
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewBitmapRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("wxBitmap"); }
 | 
						|
 | 
						|
    wxDataViewBitmapRenderer( const wxString &varianttype = GetDefaultType(),
 | 
						|
                              wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                              int align = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
 | 
						|
    bool SetValue( const wxVariant &value ) wxOVERRIDE;
 | 
						|
    bool GetValue( wxVariant &value ) const wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewToggleRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("bool"); }
 | 
						|
 | 
						|
    wxDataViewToggleRenderer( const wxString &varianttype = GetDefaultType(),
 | 
						|
                              wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                              int align = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
 | 
						|
    bool SetValue( const wxVariant &value ) wxOVERRIDE;
 | 
						|
    bool GetValue( wxVariant &value ) const wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewCustomRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewCustomRendererBase
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("string"); }
 | 
						|
 | 
						|
    wxDataViewCustomRenderer( const wxString &varianttype = GetDefaultType(),
 | 
						|
                              wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                              int align = wxDVR_DEFAULT_ALIGNMENT,
 | 
						|
                              bool no_init = false );
 | 
						|
    virtual ~wxDataViewCustomRenderer();
 | 
						|
 | 
						|
 | 
						|
    // Create DC on request
 | 
						|
    virtual wxDC *GetDC() wxOVERRIDE;
 | 
						|
 | 
						|
    // override the base class function to use GTK text cell renderer
 | 
						|
    virtual void RenderText(const wxString& text,
 | 
						|
                            int xoffset,
 | 
						|
                            wxRect cell,
 | 
						|
                            wxDC *dc,
 | 
						|
                            int state) wxOVERRIDE;
 | 
						|
 | 
						|
    struct GTKRenderParams;
 | 
						|
 | 
						|
    // store GTK render call parameters for possible later use
 | 
						|
    void GTKSetRenderParams(GTKRenderParams* renderParams)
 | 
						|
    {
 | 
						|
        m_renderParams = renderParams;
 | 
						|
    }
 | 
						|
 | 
						|
    virtual GtkCellRendererText *GtkGetTextRenderer() const wxOVERRIDE;
 | 
						|
    virtual GtkWidget* GtkGetEditorWidget() const wxOVERRIDE;
 | 
						|
 | 
						|
    virtual void GtkUpdateAlignment() wxOVERRIDE;
 | 
						|
 | 
						|
private:
 | 
						|
    bool Init(wxDataViewCellMode mode, int align);
 | 
						|
 | 
						|
    // Called from GtkGetTextRenderer() to really create the renderer if
 | 
						|
    // necessary.
 | 
						|
    void GtkInitTextRenderer();
 | 
						|
 | 
						|
    wxDC        *m_dc;
 | 
						|
 | 
						|
    GtkCellRendererText      *m_text_renderer;
 | 
						|
 | 
						|
    // parameters of the original render() call stored so that we could pass
 | 
						|
    // them forward to m_text_renderer if our RenderText() is called
 | 
						|
    GTKRenderParams* m_renderParams;
 | 
						|
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewProgressRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewCustomRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("long"); }
 | 
						|
 | 
						|
    wxDataViewProgressRenderer( const wxString &label = wxEmptyString,
 | 
						|
                                const wxString &varianttype = GetDefaultType(),
 | 
						|
                                wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                                int align = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
    virtual ~wxDataViewProgressRenderer();
 | 
						|
 | 
						|
    bool SetValue( const wxVariant &value ) wxOVERRIDE;
 | 
						|
    bool GetValue( wxVariant &value ) const wxOVERRIDE;
 | 
						|
 | 
						|
    virtual bool Render( wxRect cell, wxDC *dc, int state ) wxOVERRIDE;
 | 
						|
    virtual wxSize GetSize() const wxOVERRIDE;
 | 
						|
 | 
						|
private:
 | 
						|
    void GTKSetLabel();
 | 
						|
 | 
						|
    wxString    m_label;
 | 
						|
    int         m_value;
 | 
						|
 | 
						|
#if !wxUSE_UNICODE
 | 
						|
    // Flag used to indicate that we need to set the label because we were
 | 
						|
    // unable to do it in the ctor (see comments there).
 | 
						|
    bool m_needsToSetLabel;
 | 
						|
#endif // !wxUSE_UNICODE
 | 
						|
 | 
						|
protected:
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// ---------------------------------------------------------
 | 
						|
// wxDataViewIconTextRenderer
 | 
						|
// ---------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewTextRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    static wxString GetDefaultType() { return wxS("wxDataViewIconText"); }
 | 
						|
 | 
						|
    wxDataViewIconTextRenderer( const wxString &varianttype = GetDefaultType(),
 | 
						|
                                wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
 | 
						|
                                int align = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
    virtual ~wxDataViewIconTextRenderer();
 | 
						|
 | 
						|
    bool SetValue( const wxVariant &value ) wxOVERRIDE;
 | 
						|
    bool GetValue( wxVariant &value ) const wxOVERRIDE;
 | 
						|
 | 
						|
    virtual void GtkPackIntoColumn(GtkTreeViewColumn *column) wxOVERRIDE;
 | 
						|
 | 
						|
protected:
 | 
						|
    virtual void GtkOnCellChanged(const wxVariant& value,
 | 
						|
                                  const wxDataViewItem& item,
 | 
						|
                                  unsigned col) wxOVERRIDE;
 | 
						|
 | 
						|
private:
 | 
						|
    wxDataViewIconText   m_value;
 | 
						|
 | 
						|
    // we use the base class m_renderer for the text and this one for the icon
 | 
						|
    GtkCellRenderer *m_rendererIcon;
 | 
						|
 | 
						|
    wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer);
 | 
						|
};
 | 
						|
 | 
						|
// -------------------------------------
 | 
						|
// wxDataViewChoiceRenderer
 | 
						|
// -------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxDataViewChoiceRenderer(const wxArrayString &choices,
 | 
						|
                             wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
 | 
						|
                             int alignment = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
    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;
 | 
						|
 | 
						|
    virtual void GtkUpdateAlignment() wxOVERRIDE;
 | 
						|
 | 
						|
    wxString GetChoice(size_t index) const { return m_choices[index]; }
 | 
						|
    const wxArrayString& GetChoices() const { return m_choices; }
 | 
						|
 | 
						|
private:
 | 
						|
    wxArrayString m_choices;
 | 
						|
    wxString      m_data;
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxDataViewChoiceByIndexRenderer
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class WXDLLIMPEXP_ADV wxDataViewChoiceByIndexRenderer: public wxDataViewChoiceRenderer
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxDataViewChoiceByIndexRenderer( const wxArrayString &choices,
 | 
						|
                              wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
 | 
						|
                              int alignment = wxDVR_DEFAULT_ALIGNMENT );
 | 
						|
 | 
						|
    virtual bool SetValue( const wxVariant &value ) wxOVERRIDE;
 | 
						|
    virtual bool GetValue( wxVariant &value ) const wxOVERRIDE;
 | 
						|
 | 
						|
private:
 | 
						|
    virtual void GtkOnTextEdited(const char *itempath, const wxString& str) wxOVERRIDE;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif // _WX_GTK_DVRENDERERS_H_
 | 
						|
 |