From: Robert Roebling Date: Sat, 20 Oct 2007 20:09:10 +0000 (+0000) Subject: Added wxDataViewCustomRenderer::RenderText() for renderer simple text in platform... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/52e750fc75020aa412fc85623d2b3cf91f9b0b33 Added wxDataViewCustomRenderer::RenderText() for renderer simple text in platform dependent way, added wxDataViewSpinRenderer git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49272 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/dataviewrenderer.tex b/docs/latex/wx/dataviewrenderer.tex index 8745505177..46a5b4f0d2 100644 --- a/docs/latex/wx/dataviewrenderer.tex +++ b/docs/latex/wx/dataviewrenderer.tex @@ -12,6 +12,7 @@ a number of ready-to-use renderers provided: \helpref{wxDataViewProgressRenderer}{wxdataviewprogressrenderer}, \helpref{wxDataViewBitmapRenderer}{wxdataviewbitmaprenderer}, \helpref{wxDataViewDateRenderer}{wxdataviewdaterenderer}. +\helpref{wxDataViewSpinRenderer}{wxdataviewspinrenderer}. Additionally, the user can write own renderers by deriving from \helpref{wxDataViewCustomRenderer}{wxdataviewcustomrenderer}. @@ -467,6 +468,15 @@ Override this to render the cell. Before this is called, \helpref{SetValue}{wxdataviewrenderersetvalue} was called so that this instance knows what to render. +\membersection{wxDataViewCustomRenderer::RenderText}\label{wxdataviewcustomrendererrender} + +\func{bool}{RenderText}{\param{const wxString\& }{text}, \param{int }{xoffset}, \param{wxRect }{cell}, \param{wxDC* }{dc}, \param{int }{state}} + +This method should be called from within \helpref{Render}{wxdataviewcustomrendererrender} +whenever you need to render simple text. This will ensure that the +correct colour, font and vertical alignment will be chosen so the +text will look the same as text drawn by native renderers. + \membersection{wxDataViewCustomRenderer::RightClick}\label{wxdataviewcustomrendererrightclick} \func{virtual bool}{RightClick}{\param{wxPoint }{cursor}, \param{wxRect }{cell}, \param{wxDataViewModel* }{model}, \param{unsigned int }{col}, \param{unsigned int }{row}} @@ -480,4 +490,29 @@ Overrride this to react to a right click. Overrride this to start a drag operation. +\section{\class{wxDataViewSpinRenderer}}\label{wxdataviewspinrenderer} + +This is a specialized renderer for rendering integer values. It +supports modifying the values in-place by using a wxSpinCtrl. +The renderer only support variants of type {\it long}. + +\wxheading{Derived from} + +\helpref{wxDataViewCustomRenderer}{wxdataviewcustomrenderer} + +\wxheading{Include files} + + + +\wxheading{Data structures} + +\latexignore{\rtfignore{\wxheading{Members}}} + + +\membersection{wxDataViewSpinRenderer::wxDataViewSpinRenderer}\label{wxdataviewspinrendererwxdataviewspinrenderer} + +\func{}{wxDataViewSpinRenderer}{\param{int }{min}, \param{int }{max}, \param{wxDataViewCellMode }{mode = wxDATAVIEW\_CELL\_EDITABLE}, \param{int }{alignment = wxDVR\_DEFAULT\_ALIGNMENT}} + +Constructor. {\it min} and {\it max} indicate the minimum und +maximum values of for the wxSpinCtrl. diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 7eeaee8533..32c4d2726d 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -713,6 +713,29 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); #include "wx/generic/dataview.h" #endif +// ------------------------------------- +// wxDataViewSpinRenderer +// ------------------------------------- + +class wxDataViewSpinRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewSpinRenderer( int min, int max, + wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE, + int alignment = wxDVR_DEFAULT_ALIGNMENT ); + virtual bool HasEditorCtrl() { return true; } + virtual wxControl* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ); + virtual bool GetValueFromEditorCtrl( wxControl* editor, wxVariant &value ); + virtual bool Render( wxRect rect, wxDC *dc, int state ); + virtual wxSize GetSize() const; + virtual bool SetValue( const wxVariant &value ); + virtual bool GetValue( wxVariant &value ) const; + +private: + long m_data; + long m_min,m_max; +}; + //----------------------------------------------------------------------------- // wxDataViewTreeStore //----------------------------------------------------------------------------- diff --git a/include/wx/generic/dataview.h b/include/wx/generic/dataview.h index 3eac1231fe..3674ee73c1 100644 --- a/include/wx/generic/dataview.h +++ b/include/wx/generic/dataview.h @@ -99,6 +99,8 @@ public: wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align = wxDVR_DEFAULT_ALIGNMENT ); + void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ); + protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer) }; diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index a079cba9c5..0c29d98468 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -122,6 +122,9 @@ public: virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; + + void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize() const = 0; virtual bool Activate( wxRect cell, diff --git a/include/wx/mac/carbon/dataview.h b/include/wx/mac/carbon/dataview.h index b6b22b356f..ac0ca36952 100644 --- a/include/wx/mac/carbon/dataview.h +++ b/include/wx/mac/carbon/dataview.h @@ -118,6 +118,8 @@ public: virtual ~wxDataViewCustomRenderer(void); + void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ); + // // methods handling render space // diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 5bf1a59021..b9e16750ed 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -19,6 +19,10 @@ #include "wx/dataview.h" +#include "wx/spinctrl.h" +#include "wx/dc.h" +#include "wx/settings.h" + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/icon.h" @@ -971,6 +975,58 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED) + +// ------------------------------------- +// wxDataViewSpinRenderer +// ------------------------------------- + +wxDataViewSpinRenderer::wxDataViewSpinRenderer( int min, int max, wxDataViewCellMode mode, int alignment ) : + wxDataViewCustomRenderer( "long", mode, alignment ) +{ + m_min = min; + m_max = max; +} + +wxControl* wxDataViewSpinRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) +{ + long l = value; + return new wxSpinCtrl( parent, wxID_ANY, wxEmptyString, + labelRect.GetTopLeft(), labelRect.GetSize(), wxSP_ARROW_KEYS, m_min, m_max, l ); +} + +bool wxDataViewSpinRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value ) +{ + wxSpinCtrl *sc = (wxSpinCtrl*) editor; + long l = sc->GetValue(); + value = l; + return true; +} + +bool wxDataViewSpinRenderer::Render( wxRect rect, wxDC *dc, int state ) +{ + wxString str; + str.Printf( "%d", (int) m_data ); + RenderText( str, 0, rect, dc, state ); + return true; +} + +wxSize wxDataViewSpinRenderer::GetSize() const +{ + return wxSize(80,16); +} + +bool wxDataViewSpinRenderer::SetValue( const wxVariant &value ) +{ + m_data = value.GetLong(); + return true; +} + +bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const +{ + value = m_data; + return true; +} + //----------------------------------------------------------------------------- // wxDataViewTreeStore //----------------------------------------------------------------------------- diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 325e8807da..b2f85c972e 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -635,6 +635,16 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { } +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)); +} + // --------------------------------------------------------- // wxDataViewTextRenderer // --------------------------------------------------------- @@ -681,15 +691,7 @@ bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVarian bool wxDataViewTextRenderer::Render( 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( m_text, cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); - // dc->DrawText( m_text, cell.x, cell.y ); - + RenderText( m_text, 0, cell, dc, state ); return true; } @@ -950,12 +952,10 @@ bool wxDataViewDateRenderer::GetValue( wxVariant &value ) const return true; } -bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int state ) { - dc->SetFont( GetOwner()->GetOwner()->GetFont() ); wxString tmp = m_date.FormatDate(); - dc->DrawText( tmp, cell.x, cell.y ); - + RenderText( tmp, 0, cell, dc, state ); return true; } @@ -1019,24 +1019,15 @@ bool wxDataViewIconTextRenderer::GetValue( wxVariant &value ) const bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state ) { - wxDataViewCtrl *view = GetOwner()->GetOwner(); - - dc->SetFont( view->GetFont() ); - - wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? - wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : - view->GetForegroundColour(); - - dc->SetTextForeground(col); - + int xoffset = 0; const wxIcon &icon = m_value.GetIcon(); if (icon.IsOk()) { dc->DrawIcon( icon, cell.x, cell.y + ((cell.height - icon.GetHeight()) / 2)); - cell.x += icon.GetWidth()+4; + xoffset = icon.GetWidth()+4; } - - dc->DrawText( m_value.GetText(), cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); + + RenderText( m_value.GetText(), xoffset, cell, dc, state ); return true; } diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index cd82fc102c..06e9749535 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -28,7 +28,7 @@ #include "wx/icon.h" #include "wx/list.h" #include "wx/listimpl.cpp" - +#include "wx/settings.h" #include "wx/gtk/private.h" #include "wx/gtk/win_gtk.h" @@ -1673,6 +1673,16 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, Init(mode, align); } +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)); +} + bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align) { GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new(); @@ -1874,8 +1884,7 @@ bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int state ) { dc->SetFont( GetOwner()->GetOwner()->GetFont() ); wxString tmp = m_date.FormatDate(); - dc->DrawText( tmp, cell.x, cell.y ); - + RenderText( tmp, 0, cell, dc, state ); return true; } @@ -1936,23 +1945,30 @@ bool wxDataViewIconTextRenderer::GetValue( wxVariant &value ) const bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state ) { - dc->SetFont( GetOwner()->GetOwner()->GetFont() ); - const wxIcon &icon = m_value.GetIcon(); + int offset = 0; if (icon.IsOk()) { - dc->DrawIcon( icon, cell.x, cell.y ); // TODO centre - cell.x += icon.GetWidth()+4; + int yoffset = wxMax( 0, (cell.height - icon.GetHeight()) / 2 ); + dc->DrawIcon( icon, cell.x, cell.y + yoffset ); + offset = icon.GetWidth() + 4; } - dc->DrawText( m_value.GetText(), cell.x, cell.y ); + RenderText( m_value.GetText(), offset, cell, dc, state ); return true; } wxSize wxDataViewIconTextRenderer::GetSize() const { - return wxSize(80,16); // TODO + wxSize size; + if (m_value.GetIcon().IsOk()) + size.x = 4 + m_value.GetIcon().GetWidth(); + wxCoord x,y,d; + GetView()->GetTextExtent( m_value.GetText(), &x, &y, &d ); + size.x += x; + size.y = y+d; + return size; } wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) diff --git a/src/mac/carbon/dataview.cpp b/src/mac/carbon/dataview.cpp index 4e71562398..dacaf01b96 100644 --- a/src/mac/carbon/dataview.cpp +++ b/src/mac/carbon/dataview.cpp @@ -379,6 +379,16 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) delete this->m_DCPtr; } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */ +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)); +} + wxDC* wxDataViewCustomRenderer::GetDC(void) { if (this->m_DCPtr == NULL)