bool HasColour() const { return m_colour.Ok(); }
const wxColour& GetColour() const { return m_colour; }
+ bool HasFont() const { return m_bold || m_italic; }
bool GetBold() const { return m_bold; }
bool GetItalic() const { return m_italic; }
#endif
+// this class is obsolete, its functionality was merged in
+// wxDataViewTextRenderer itself now, don't use it any more
+#define wxDataViewTextRendererAttr wxDataViewTextRenderer
+
//-----------------------------------------------------------------------------
// wxDataViewListStore
//-----------------------------------------------------------------------------
int align = wxDVR_DEFAULT_ALIGNMENT );
virtual ~wxDataViewRenderer();
+ // these methods are used to draw the cell contents, Render() doesn't care
+ // about the attributes while RenderWithAttr() does -- override it if you
+ // want to take the attributes defined for this cell into account, otherwise
+ // overriding Render() is enough
virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0;
+
+ // NB: RenderWithAttr() also has more standard parameter order and types
+ virtual bool
+ RenderWithAttr(wxDC& dc,
+ const wxRect& rect,
+ const wxDataViewItemAttr * WXUNUSED(attr), // NULL if none
+ int state)
+ {
+ return Render(rect, &dc, state);
+ }
+
virtual wxSize GetSize() const = 0;
virtual void SetAlignment( int align );
// Create DC on request
virtual wxDC *GetDC();
- void SetHasAttr( bool set ) { m_hasAttr = set; }
- void SetAttr( const wxDataViewItemAttr &attr ) { m_attr = attr; }
- bool GetWantsAttr() const { return m_wantsAttr; }
-
// implementation
int CalculateAlignment() const;
int m_align;
wxDataViewCellMode m_mode;
-protected:
- bool m_wantsAttr;
- bool m_hasAttr;
- wxDataViewItemAttr m_attr;
-
protected:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer)
};
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
int align = wxDVR_DEFAULT_ALIGNMENT );
+ // Draw the text using the provided attributes
+ void RenderText(wxDC& dc,
+ const wxRect& rect,
+ const wxString& text,
+ const wxDataViewItemAttr *attr, // may be NULL if none
+ int state,
+ int xoffset = 0);
+
+ // Overload using standard attributes
void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state );
protected:
bool SetValue( const wxVariant &value );
bool GetValue( wxVariant &value ) const;
- bool Render( wxRect cell, wxDC *dc, int state );
+ virtual bool RenderWithAttr(wxDC& dc,
+ const wxRect& rect,
+ const wxDataViewItemAttr *attr,
+ int state);
+ virtual bool Render( wxRect cell, wxDC *dc, int state )
+ {
+ return RenderWithAttr(*dc, cell, NULL, state);
+ }
+
wxSize GetSize() const;
// in-place editing
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
};
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer
-{
-public:
- wxDataViewTextRendererAttr( const wxString &varianttype = wxT("string"),
- wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
- int align = wxDVR_DEFAULT_ALIGNMENT );
-
- bool Render( wxRect cell, wxDC *dc, int state );
-
-protected:
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr)
-};
-
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
// implementation
GtkCellRenderer* GetGtkHandle() { return m_renderer; }
void GtkInitHandlers();
- virtual bool GtkHasAttributes() { return false; }
void GtkUpdateAlignment();
protected:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
};
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer
-{
-public:
- wxDataViewTextRendererAttr( const wxString &varianttype = wxT("string"),
- wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
- int align = wxDVR_DEFAULT_ALIGNMENT );
-
- // implementation
- bool GtkHasAttributes() { return true; }
-
-protected:
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr)
-};
-
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
};
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer
-{
-public:
-//
-// constructors / destructor
-//
- wxDataViewTextRendererAttr(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
-
-private:
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr)
-};
-
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
One instance of a renderer class is owned by a wxDataViewColumn.
There is a number of ready-to-use renderers provided:
- wxDataViewTextRenderer,
- - wxDataViewTextRendererAttr,
- wxDataViewIconTextRenderer,
- wxDataViewToggleRenderer,
- wxDataViewProgressRenderer,
-/**
- @class wxDataViewTextRendererAttr
-
- The same as wxDataViewTextRenderer but with support for font attributes.
- Font attributes are currently only supported under GTK+ and MSW.
-
- @see wxDataViewModel::GetAttr and wxDataViewItemAttr.
-
- @library{wxadv}
- @category{dvc}
-*/
-class wxDataViewTextRendererAttr : public wxDataViewTextRenderer
-{
-public:
- /**
- The ctor.
- */
- wxDataViewTextRendererAttr(const wxString& varianttype = "string",
- wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
- int align = wxDVR_DEFAULT_ALIGNMENT);
-};
-
-
-
/**
@class wxDataViewCustomRenderer
m_ctrl[1]->AppendIconTextColumn("icon", 1, wxDATAVIEW_CELL_INERT);
#endif
m_ctrl[1]->AppendColumn(
- new wxDataViewColumn("attributes", new wxDataViewTextRendererAttr, 2 ));
+ new wxDataViewColumn("attributes", new wxDataViewTextRenderer, 2 ));
}
break;
m_dc = NULL;
m_align = align;
m_mode = mode;
- m_wantsAttr = false;
- m_hasAttr = false;
}
wxDataViewRenderer::~wxDataViewRenderer()
void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset,
wxRect cell, wxDC *dc, int state )
{
- wxDataViewCtrl *view = GetOwner()->GetOwner();
- wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ?
- wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) :
- view->GetForegroundColour();
- dc->SetTextForeground(col);
- dc->DrawText( text,
- cell.x + xoffset,
- cell.y + ((cell.height - dc->GetCharHeight()) / 2));
+ wxColour col = state & wxDATAVIEW_CELL_SELECTED
+ ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)
+ : GetOwner()->GetOwner()->GetForegroundColour();
+
+ wxDataViewItemAttr attr;
+ attr.SetColour(col);
+ RenderText(*dc, cell, text, &attr, state, xoffset);
+}
+
+void
+wxDataViewCustomRenderer::RenderText(wxDC& dc,
+ const wxRect& rect,
+ const wxString& text,
+ const wxDataViewItemAttr *attr,
+ int WXUNUSED(state),
+ int xoffset)
+{
+ wxDCTextColourChanger changeFg(dc);
+ if ( attr && attr->HasColour() )
+ changeFg.Set(attr->GetColour());
+
+ wxDCFontChanger changeFont(dc);
+ if ( attr && attr->HasFont() )
+ {
+ wxFont font(dc.GetFont());
+ if ( attr->GetBold() )
+ font.MakeBold();
+ if ( attr->GetItalic() )
+ font.MakeItalic();
+
+ changeFont.Set(font);
+ }
+
+ dc.DrawText(text,
+ rect.x + xoffset,
+ rect.y + ((rect.height - dc.GetCharHeight()) / 2));
}
// ---------------------------------------------------------
return true;
}
-bool wxDataViewTextRenderer::Render( wxRect cell, wxDC *dc, int state )
+bool
+wxDataViewTextRenderer::RenderWithAttr(wxDC& dc,
+ const wxRect& rect,
+ const wxDataViewItemAttr *attr,
+ int state)
{
- RenderText( m_text, 0, cell, dc, state );
+ RenderText(dc, rect, m_text, attr, state);
return true;
}
return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE);
}
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-IMPLEMENT_CLASS(wxDataViewTextRendererAttr, wxDataViewTextRenderer)
-
-wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype,
- wxDataViewCellMode mode, int align ) :
- wxDataViewTextRenderer( varianttype, mode, align )
-{
- m_wantsAttr = true;
-}
-
-bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) )
-{
- wxFont font;
- wxColour colour;
-
- if (m_hasAttr)
- {
- if (m_attr.HasColour())
- {
- colour = dc->GetTextForeground();
- dc->SetTextForeground( m_attr.GetColour() );
- }
-
- if (m_attr.GetBold() || m_attr.GetItalic())
- {
- font = dc->GetFont();
- wxFont myfont = font;
- if (m_attr.GetBold())
- myfont.SetWeight( wxFONTWEIGHT_BOLD );
- if (m_attr.GetItalic())
- myfont.SetStyle( wxFONTSTYLE_ITALIC );
- dc->SetFont( myfont );
- }
- }
-
- dc->DrawText( m_text, cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
-
- // restore dc
- if (m_hasAttr)
- {
- if (m_attr.HasColour())
- dc->SetTextForeground( colour );
-
- if (m_attr.GetBold() || m_attr.GetItalic())
- dc->SetFont( font );
- }
-
- return true;
-}
-
-
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
model->GetValue( value, item, column->GetModelColumn());
cell->SetValue( value );
- if (cell->GetWantsAttr())
- {
- wxDataViewItemAttr attr;
- bool ret = model->GetAttr( item, column->GetModelColumn(), attr );
- if (ret)
- cell->SetAttr( attr );
- cell->SetHasAttr( ret );
- }
-
wxSize size = cell->GetSize();
size.x = wxMin( 2*PADDING_RIGHTLEFT + size.x, width );
size.y = height;
item_rect.width = size.x - 2 * PADDING_RIGHTLEFT;
// dc.SetClippingRegion( item_rect );
- cell->Render( item_rect, &dc, 0 );
+ wxDataViewItemAttr attr;
+ const bool
+ hasAttr = model->GetAttr(item, column->GetModelColumn(), attr);
+ cell->RenderWithAttr(dc, item_rect, hasAttr ? &attr : NULL, 0);
// dc.DestroyClippingRegion();
x += width;
model->GetValue( value, dataitem, col->GetModelColumn());
cell->SetValue( value );
- if (cell->GetWantsAttr())
- {
- wxDataViewItemAttr attr;
- bool ret = model->GetAttr( dataitem, col->GetModelColumn(), attr );
- if (ret)
- cell->SetAttr( attr );
- cell->SetHasAttr( ret );
- }
-
// update cell_rect
cell_rect.y = GetLineStart( item );
cell_rect.height = GetLineHeight( item );
// violating only the left & right coords - however the user can
// make its own renderer and thus we cannot be sure of that.
dc.SetClippingRegion( item_rect );
- cell->Render( item_rect, &dc, state );
+
+ wxDataViewItemAttr attr;
+ const bool
+ hasAttr = model->GetAttr(dataitem, col->GetModelColumn(), attr);
+ cell->RenderWithAttr(dc, item_rect, hasAttr ? &attr : NULL, state);
+
dc.DestroyClippingRegion();
}
g_value_unset( &gvalue );
}
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-
-IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
-
-wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype,
- wxDataViewCellMode mode, int align ) :
- wxDataViewTextRenderer( varianttype, mode, align )
-{
-}
-
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
cell->SetValue( value );
- if (cell->GtkHasAttributes())
+ wxDataViewItemAttr attr;
+ if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr ))
{
- wxDataViewItemAttr attr;
- bool colour_set = false;
- bool style_set = false;
- bool weight_set = false;
-
- if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr ))
+ if (attr.HasColour())
{
- // this must be a GtkCellRendererText
- wxColour colour = attr.GetColour();
- if (colour.IsOk())
- {
- const GdkColor * const gcol = colour.GetColor();
-
- GValue gvalue = { 0, };
- g_value_init( &gvalue, GDK_TYPE_COLOR );
- g_value_set_boxed( &gvalue, gcol );
- g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
- g_value_unset( &gvalue );
+ const GdkColor * const gcol = attr.GetColour().GetColor();
- colour_set = true;
- }
-
- if (attr.GetItalic())
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, PANGO_TYPE_STYLE );
- g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
- g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
- g_value_unset( &gvalue );
-
- style_set = true;
- }
-
- if (attr.GetBold())
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
- g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
- g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
- g_value_unset( &gvalue );
-
- weight_set = true;
- }
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, GDK_TYPE_COLOR );
+ g_value_set_boxed( &gvalue, gcol );
+ g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
+ g_value_unset( &gvalue );
}
-
- if (!style_set)
+ else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
+ g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
g_value_unset( &gvalue );
}
- if (!weight_set)
+ if (attr.GetItalic())
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_STYLE );
+ g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
+ g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
+ g_value_unset( &gvalue );
+ }
+ else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
+ g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
g_value_unset( &gvalue );
}
- if (!colour_set)
+
+ if (attr.GetBold())
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
+ g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
+ g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
+ g_value_unset( &gvalue );
+ }
+ else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
+ g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
g_value_unset( &gvalue );
}
}
m_DCPtr = newDCPtr;
}
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
- :wxDataViewTextRenderer(varianttype,mode,align)
-{
-}
-
-IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
-
//-----------------------------------------------------------------------------
// wxDataViewCtrl
//-----------------------------------------------------------------------------