From 0fb731b8bf830e2b495b2038200ab1d2444d748d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 7 Jan 2012 15:09:51 +0000 Subject: [PATCH] Add support for wxLIST_AUTOSIZE_USEHEADER to InsertColumn(). Use the fixed default width in InsertColumn() by default for compatibility but allow more useful behaviour in it by supporting wxLIST_AUTOSIZE_USEHEADER as well. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70284 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/listbase.h | 2 +- interface/wx/listctrl.h | 40 ++++++++++++++++++++++++++++++++++---- src/common/listctrlcmn.cpp | 4 +++- src/msw/listctrl.cpp | 25 ++++++++++++++++++------ 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/include/wx/listbase.h b/include/wx/listbase.h index fe247e8299..87700aa4c2 100644 --- a/include/wx/listbase.h +++ b/include/wx/listbase.h @@ -424,7 +424,7 @@ public: long InsertColumn(long col, const wxString& heading, int format = wxLIST_FORMAT_LEFT, - int width = -1); + int width = wxLIST_AUTOSIZE); // Delete the given or all columns. virtual bool DeleteColumn(int col) = 0; diff --git a/interface/wx/listctrl.h b/interface/wx/listctrl.h index 3103be6b2f..28db0e46d0 100644 --- a/interface/wx/listctrl.h +++ b/interface/wx/listctrl.h @@ -661,16 +661,48 @@ public: bool InReportView() const; /** - For report view mode (only), inserts a column. For more details, see SetItem(). + For report view mode (only), inserts a column. + + For more details, see SetItem(). Also see InsertColumn(long, const + wxString&, int, int) overload for a usually more convenient + alternative to this method and the description of how the item width + is interpreted by this method. */ - long InsertColumn(long col, wxListItem& info); + long InsertColumn(long col, const wxListItem& info); /** - For report view mode (only), inserts a column. For more details, see SetItem(). + For report view mode (only), inserts a column. + + Insert a new column in the list control in report view mode at the + given position specifying its most common attributes. + + Notice that to set the image for the column you need to use + Insert(long, const wxListItem&) overload and specify ::wxLIST_MASK_IMAGE + in the item mask. + + @param col + The index where the column should be inserted. Valid indices are + from 0 up to GetColumnCount() inclusive and the latter can be used + to append the new column after the last existing one. + @param heading + The string specifying the column heading. + @param format + The flags specifying the control heading text alignment. + @param width + If positive, the width of the column in pixels. Otherwise it can be + @c wxLIST_AUTOSIZE to choose the default size for the column or @c + wxLIST_AUTOSIZE_USEHEADER to fit the column width to @a heading or + to extend to fill all the remaining space for the last column. + Notice that in case of @c wxLIST_AUTOSIZE fixed width is used as + there are no items in this column to use for determining its best + size yet. If you want to fit the column to its contents, use + SetColumnWidth() after adding the items with values in this column. + @return + The index of the inserted column or -1 if adding it failed. */ long InsertColumn(long col, const wxString& heading, int format = wxLIST_FORMAT_LEFT, - int width = -1); + int width = wxLIST_AUTOSIZE); /** Inserts an item, returning the index of the new item if successful, -1 otherwise. diff --git a/src/common/listctrlcmn.cpp b/src/common/listctrlcmn.cpp index b19ed6e38c..5edcf420f1 100644 --- a/src/common/listctrlcmn.cpp +++ b/src/common/listctrlcmn.cpp @@ -153,7 +153,9 @@ wxListCtrlBase::InsertColumn(long col, wxListItem item; item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT; item.m_text = heading; - if ( width > -1 ) + if ( width >= 0 + || width == wxLIST_AUTOSIZE + || width == wxLIST_AUTOSIZE_USEHEADER ) { item.m_mask |= wxLIST_MASK_WIDTH; item.m_width = width; diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 0d8ee0e785..8d0bead333 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -1735,7 +1735,14 @@ long wxListCtrl::DoInsertColumn(long col, const wxListItem& item) LV_COLUMN lvCol; wxConvertToMSWListCol(GetHwnd(), col, item, lvCol); - if ( !(lvCol.mask & LVCF_WIDTH) ) + // LVSCW_AUTOSIZE_USEHEADER is not supported when inserting new column, + // we'll deal with it below instead. Plain LVSCW_AUTOSIZE is not supported + // neither but it doesn't need any special handling as we use fixed value + // for it here, both because we can't do anything else (there are no items + // with values in this column to compute the size from yet) and for + // compatibility as wxLIST_AUTOSIZE == -1 and -1 as InsertColumn() width + // parameter used to mean "arbitrary fixed width". + if ( !(lvCol.mask & LVCF_WIDTH) || lvCol.cx < 0 ) { // always give some width to the new column: this one is compatible // with the generic version @@ -1744,14 +1751,20 @@ long wxListCtrl::DoInsertColumn(long col, const wxListItem& item) } long n = ListView_InsertColumn(GetHwnd(), col, &lvCol); - if ( n != -1 ) - { - m_colCount++; - } - else // failed to insert? + if ( n == -1 ) { wxLogDebug(wxT("Failed to insert the column '%s' into listview!"), lvCol.pszText); + return -1; + } + + m_colCount++; + + // Now adjust the new column size. + if ( (item.GetMask() & wxLIST_MASK_WIDTH) && + (item.GetWidth() == wxLIST_AUTOSIZE_USEHEADER) ) + { + SetColumnWidth(n, wxLIST_AUTOSIZE_USEHEADER); } return n;