added functions for setting the columns order in wxListCtrl (modified patch 1828074)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49802 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-11-10 00:55:14 +00:00
parent 5041b46fed
commit 67d3fc4926
4 changed files with 169 additions and 27 deletions

View File

@@ -191,6 +191,7 @@ All (GUI):
- Added support for drop down toolbar buttons (Tim Kosse). - Added support for drop down toolbar buttons (Tim Kosse).
- Added support for labels for toolbar controls (Vince Harron). - Added support for labels for toolbar controls (Vince Harron).
- Added wxMessageDialog::SetMessage() and SetExtendedMessage(). - Added wxMessageDialog::SetMessage() and SetExtendedMessage().
- Added wxListCtrl::Set/GetColumnsOrder() (Yury Voronov)
- Added wxWindow::AlwaysShowScrollbars() (Julian Scheid) - Added wxWindow::AlwaysShowScrollbars() (Julian Scheid)
- Added wxMouseEvent::GetClickCount() (Julian Scheid) - Added wxMouseEvent::GetClickCount() (Julian Scheid)
- Added wxBG_STYLE_TRANSPARENT background style (Julian Scheid) - Added wxBG_STYLE_TRANSPARENT background style (Julian Scheid)

View File

@@ -115,6 +115,22 @@ functions that take a \helpref{wxListEvent}{wxlistevent} argument.
\twocolitem{{\bf EVT\_LIST\_CACHE\_HINT(id, func)}}{Prepare cache for a virtual list control} \twocolitem{{\bf EVT\_LIST\_CACHE\_HINT(id, func)}}{Prepare cache for a virtual list control}
\end{twocollist}% \end{twocollist}%
\wxheading{Column ordering}
In report view, the control has several columns which are identified by their
internal indices. By default, these indices correspond to their order on
screen, i.e. the column $0$ appears first (in the left-to-right or maybe
right-to-left if the current language uses this writing direction), the column
$1$ next and so on. However it is possible to reorder the columns visual order
using \helpref{SetColumnsOrder}{wxlistctrlsetcolumnsorder} method and the
user can also rearrange the columns interactively by dragging them. In this
case, the index of the column is not the same as its order and the functions
\helpref{GetColumnOrder}{wxlistctrlgetcolumnorder} and
\helpref{GetColumnIndexFromOrder}{wxlistctrlgetcolumnindexfromorder} should be
used to translate between them.
Please notice that current column reordering is implemented only in wxMSW.
\wxheading{See also} \wxheading{See also}
\helpref{wxListCtrl overview}{wxlistctrloverview}, \helpref{wxListView}{wxlistview}, \helpref{wxListBox}{wxlistbox},\rtfsp \helpref{wxListCtrl overview}{wxlistctrloverview}, \helpref{wxListView}{wxlistview}, \helpref{wxListBox}{wxlistbox},\rtfsp
@@ -321,6 +337,28 @@ Returns the number of columns.
Gets the column width (report view only). Gets the column width (report view only).
\membersection{wxListCtrl::GetColumnIndexFromOrder}\label{wxlistctrlgetcolumnindexfromorder}
\constfunc{int}{GetColumnIndexFromOrder}{\param{int }{order}}
Gets the column number by visual order index (report view only).
\membersection{wxListCtrl::GetColumnOrder}\label{wxlistctrlgetcolumnorder}
\constfunc{int}{GetColumnOrder}{\param{int }{col}}
Gets the column visual order index (valid in report view only).
\membersection{wxListCtrl::GetColumnsOrder}\label{wxlistctrlgetcolumnsorder}
\constfunc{wxArrayInt}{GetColumnsOrder}{\void}
Returns the array containing the orders of all columns. On error, an empty
array is returned.
\membersection{wxListCtrl::GetCountPerPage}\label{wxlistctrlgetcountperpage} \membersection{wxListCtrl::GetCountPerPage}\label{wxlistctrlgetcountperpage}
\constfunc{int}{GetCountPerPage}{\void} \constfunc{int}{GetCountPerPage}{\void}
@@ -836,6 +874,17 @@ will resize the column to the length of the header (Win32) or 80 pixels (other p
In small or normal icon view, {\it col} must be -1, and the column width is set for all columns. In small or normal icon view, {\it col} must be -1, and the column width is set for all columns.
\membersection{wxListCtrl::SetColumnsOrder}\label{wxlistctrlsetcolumnsorder}
\constfunc{bool}{SetColumnOrder}{\param{const wxArrayInt\& }{orders}}
Sets the order of all columns at once. The \arg{orders} array must have the
same number elements as the number of columns and contain each position exactly
once.
This function is valid in report view only.
\membersection{wxListCtrl::SetImageList}\label{wxlistctrlsetimagelist} \membersection{wxListCtrl::SetImageList}\label{wxlistctrlsetimagelist}
\func{void}{SetImageList}{\param{wxImageList*}{ imageList}, \param{int }{which}} \func{void}{SetImageList}{\param{wxImageList*}{ imageList}, \param{int }{which}}

View File

@@ -13,6 +13,7 @@
#define _WX_LISTCTRL_H_ #define _WX_LISTCTRL_H_
#include "wx/textctrl.h" #include "wx/textctrl.h"
#include "wx/dynarray.h"
class WXDLLIMPEXP_FWD_CORE wxImageList; class WXDLLIMPEXP_FWD_CORE wxImageList;
@@ -122,6 +123,18 @@ public:
// Sets the column width // Sets the column width
bool SetColumnWidth(int col, int width); bool SetColumnWidth(int col, int width);
// Gets the column order from its index or index from its order
int GetColumnOrder(int col) const;
int GetColumnIndexFromOrder(int order) const;
// Gets the column order for all columns
wxArrayInt GetColumnsOrder() const;
// Sets the column order for all columns
bool SetColumnsOrder(const wxArrayInt& orders);
// Gets the number of items that can fit vertically in the // Gets the number of items that can fit vertically in the
// visible area of the list control (list or report view) // visible area of the list control (list or report view)
// or the total number of items in the list control (icon // or the total number of items in the list control (icon

View File

@@ -342,8 +342,17 @@ bool wxListCtrl::Create(wxWindow *parent,
// styles because it's prettier (and also because wxGTK does it like this) // styles because it's prettier (and also because wxGTK does it like this)
if ( InReportView() && wxApp::GetComCtl32Version() >= 470 ) if ( InReportView() && wxApp::GetComCtl32Version() >= 470 )
{ {
::SendMessage(GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE, ::SendMessage
0, LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES); (
GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_LABELTIP |
LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES |
// normally this should be governed by a style as it's probably not
// always appropriate, but we don't have any free styles left and
// it seems better to enable it by default than disable
LVS_EX_HEADERDRAGDROP
);
} }
return true; return true;
@@ -663,6 +672,68 @@ bool wxListCtrl::SetColumnWidth(int col, int width)
return ListView_SetColumnWidth(GetHwnd(), col, width) != 0; return ListView_SetColumnWidth(GetHwnd(), col, width) != 0;
} }
// ----------------------------------------------------------------------------
// columns order
// ----------------------------------------------------------------------------
int wxListCtrl::GetColumnOrder(int col) const
{
const int numCols = GetColumnCount();
wxCHECK_MSG( col >= 0 && col < numCols, -1, _T("Col index out of bounds") );
wxArrayInt indexArray(numCols);
if ( !ListView_GetColumnOrderArray(GetHwnd(), numCols, &indexArray[0]) )
return -1;
return indexArray[col];
}
int wxListCtrl::GetColumnIndexFromOrder(int order) const
{
const int numCols = GetColumnCount();
wxASSERT_MSG( order >= 0 && order < numCols, _T("Col order out of bounds") );
wxArrayInt indexArray(numCols);
if ( !ListView_GetColumnOrderArray(GetHwnd(), numCols, &indexArray[0]) )
return -1;
for ( int col = 0; col < numCols; col++ )
{
if ( indexArray[col] == order )
return col;
}
wxFAIL_MSG( _T("no column with with given order?") );
return -1;
}
// Gets the column order for all columns
wxArrayInt wxListCtrl::GetColumnsOrder() const
{
const int numCols = GetColumnCount();
wxArrayInt orders(numCols);
if ( !ListView_GetColumnOrderArray(GetHwnd(), numCols, &orders[0]) )
orders.clear();
return orders;
}
// Sets the column order for all columns
bool wxListCtrl::SetColumnsOrder(const wxArrayInt& orders)
{
const int numCols = GetColumnCount();
wxCHECK_MSG( orders.size() == (size_t)numCols, false,
_T("wrong number of elements in column orders array") );
return ListView_SetColumnOrderArray(GetHwnd(), numCols, &orders[0]) != 0;
}
// Gets the number of items that can fit vertically in the // Gets the number of items that can fit vertically in the
// visible area of the list control (list or report view) // visible area of the list control (list or report view)
// or the total number of items in the list control (icon // or the total number of items in the list control (icon
@@ -2750,14 +2821,22 @@ void wxListCtrl::OnPaint(wxPaintEvent& event)
dc.SetPen(pen); dc.SetPen(pen);
dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetBrush(*wxTRANSPARENT_BRUSH);
int numCols = GetColumnCount();
int* indexArray = new int[numCols];
BOOL rv = ListView_GetColumnOrderArray( GetHwnd(), numCols, indexArray );
wxASSERT_MSG( rv == TRUE, _T("invalid column index array in OnPaint()") );
int x = itemRect.GetX(); int x = itemRect.GetX();
for (int col = 0; col < GetColumnCount(); col++) for (int col = 0; col < numCols; col++)
{ {
int colWidth = GetColumnWidth(col); int colWidth = GetColumnWidth(indexArray[col]);
x += colWidth ; x += colWidth ;
dc.DrawLine(x-1, firstItemRect.GetY() - gap, dc.DrawLine(x-1, firstItemRect.GetY() - gap,
x-1, itemRect.GetBottom()); x-1, itemRect.GetBottom());
} }
delete indexArray;
} }
} }
} }