From 4e86ffbe1b08b2294553ce83d49c595ea92222ec Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Dec 2014 21:51:57 +0000 Subject: [PATCH] Use helper functions for {app,prep}ending wxDataViewCtrl columns. Make the code more maintainable by using helper functions instead of duplicating the same logic a dozen times for each of appending and prepending. This is just a refactoring, no changes in behaviour. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/datavcmn.cpp | 284 +++++++++++++++++++++++----------------- 1 file changed, 163 insertions(+), 121 deletions(-) diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index f3e334dbe4..194d3e6d09 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -1122,269 +1122,311 @@ wxDataViewItem wxDataViewCtrlBase::GetSelection() const return selections[0]; } +namespace +{ + +// Helper to account for inconsistent signature of wxDataViewProgressRenderer +// ctor: it takes an extra "label" argument as first parameter, unlike all the +// other renderers. +template +struct RendererFactory +{ + static Renderer* + New(wxDataViewCellMode mode, int align) + { + return new Renderer(Renderer::GetDefaultType(), mode, align); + } +}; + +template <> +struct RendererFactory +{ + static wxDataViewProgressRenderer* + New(wxDataViewCellMode mode, int align) + { + return new wxDataViewProgressRenderer( + wxString(), + wxDataViewProgressRenderer::GetDefaultType(), + mode, + align + ); + } +}; + +template +wxDataViewColumn* +CreateColumnWithRenderer(const LabelType& label, + unsigned model_column, + wxDataViewCellMode mode, + int width, + wxAlignment align, + int flags) +{ + return new wxDataViewColumn( + label, + RendererFactory::New(mode, align), + model_column, + width, + align, + flags + ); +} + +// Common implementation of all {Append,Prepend}XXXColumn() below. +template +wxDataViewColumn* +AppendColumnWithRenderer(wxDataViewCtrlBase* dvc, + const LabelType& label, + unsigned model_column, + wxDataViewCellMode mode, + int width, + wxAlignment align, + int flags) +{ + wxDataViewColumn* const + col = CreateColumnWithRenderer( + label, model_column, mode, width, align, flags + ); + + dvc->AppendColumn(col); + return col; +} + +template +wxDataViewColumn* +PrependColumnWithRenderer(wxDataViewCtrlBase* dvc, + const LabelType& label, + unsigned model_column, + wxDataViewCellMode mode, + int width, + wxAlignment align, + int flags) +{ + wxDataViewColumn* const + col = CreateColumnWithRenderer( + label, model_column, mode, width, align, flags + ); + + dvc->PrependColumn(col); + return col; +} + +} // anonymous namespace + wxDataViewColumn * wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewTextRenderer( wxT("string"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendIconTextColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewToggleRenderer( wxT("bool"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewDateRenderer( wxT("datetime"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewTextRenderer( wxT("string"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendIconTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewToggleRenderer( wxT("bool"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewDateRenderer( wxT("datetime"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, align ), - model_column, width, align, flags ); - AppendColumn( ret ); - return ret; + return AppendColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependTextColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewTextRenderer( wxT("string"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependIconTextColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependToggleColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewToggleRenderer( wxT("bool"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependProgressColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependDateColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewDateRenderer( wxT("datetime"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependBitmapColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewTextRenderer( wxT("string"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependIconTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewIconTextRenderer( wxT("wxDataViewIconText"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependToggleColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewToggleRenderer( wxT("bool"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependProgressColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependDateColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewDateRenderer( wxT("datetime"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } wxDataViewColumn * wxDataViewCtrlBase::PrependBitmapColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { - wxDataViewColumn *ret = new wxDataViewColumn( label, - new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, align ), - model_column, width, align, flags ); - PrependColumn( ret ); - return ret; + return PrependColumnWithRenderer( + this, label, model_column, mode, width, align, flags + ); } bool