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_
 | |
| 
 |