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;
@@ -114,13 +115,25 @@ public:
bool GetColumn(int col, wxListItem& item) const; bool GetColumn(int col, wxListItem& item) const;
// Sets information about this column // Sets information about this column
bool SetColumn(int col, const wxListItem& item) ; bool SetColumn(int col, const wxListItem& item);
// Gets the column width // Gets the column width
int GetColumnWidth(int col) const; int GetColumnWidth(int col) const;
// 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)
@@ -135,48 +148,48 @@ public:
wxTextCtrl* GetEditControl() const; wxTextCtrl* GetEditControl() const;
// Gets information about the item // Gets information about the item
bool GetItem(wxListItem& info) const ; bool GetItem(wxListItem& info) const;
// Sets information about the item // Sets information about the item
bool SetItem(wxListItem& info) ; bool SetItem(wxListItem& info);
// Sets a string field at a particular column // Sets a string field at a particular column
long SetItem(long index, int col, const wxString& label, int imageId = -1); long SetItem(long index, int col, const wxString& label, int imageId = -1);
// Gets the item state // Gets the item state
int GetItemState(long item, long stateMask) const ; int GetItemState(long item, long stateMask) const;
// Sets the item state // Sets the item state
bool SetItemState(long item, long state, long stateMask) ; bool SetItemState(long item, long state, long stateMask);
// Sets the item image // Sets the item image
bool SetItemImage(long item, int image, int selImage = -1) ; bool SetItemImage(long item, int image, int selImage = -1);
bool SetItemColumnImage(long item, long column, int image); bool SetItemColumnImage(long item, long column, int image);
// Gets the item text // Gets the item text
wxString GetItemText(long item) const ; wxString GetItemText(long item) const;
// Sets the item text // Sets the item text
void SetItemText(long item, const wxString& str) ; void SetItemText(long item, const wxString& str);
// Gets the item data // Gets the item data
wxUIntPtr GetItemData(long item) const ; wxUIntPtr GetItemData(long item) const;
// Sets the item data // Sets the item data
bool SetItemPtrData(long item, wxUIntPtr data); bool SetItemPtrData(long item, wxUIntPtr data);
bool SetItemData(long item, long data) { return SetItemPtrData(item, data); } bool SetItemData(long item, long data) { return SetItemPtrData(item, data); }
// Gets the item rectangle // Gets the item rectangle
bool GetItemRect(long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const ; bool GetItemRect(long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const;
// Gets the subitem rectangle in report mode // Gets the subitem rectangle in report mode
bool GetSubItemRect(long item, long subItem, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const ; bool GetSubItemRect(long item, long subItem, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const;
// Gets the item position // Gets the item position
bool GetItemPosition(long item, wxPoint& pos) const ; bool GetItemPosition(long item, wxPoint& pos) const;
// Sets the item position // Sets the item position
bool SetItemPosition(long item, const wxPoint& pos) ; bool SetItemPosition(long item, const wxPoint& pos);
// Gets the number of items in the list control // Gets the number of items in the list control
int GetItemCount() const; int GetItemCount() const;
@@ -210,22 +223,22 @@ public:
// Gets the index of the topmost visible item when in // Gets the index of the topmost visible item when in
// list or report view // list or report view
long GetTopItem() const ; long GetTopItem() const;
// Add or remove a single window style // Add or remove a single window style
void SetSingleStyle(long style, bool add = true) ; void SetSingleStyle(long style, bool add = true);
// Set the whole window style // Set the whole window style
void SetWindowStyleFlag(long style) ; void SetWindowStyleFlag(long style);
// Searches for an item, starting from 'item'. // Searches for an item, starting from 'item'.
// item can be -1 to find the first item that matches the // item can be -1 to find the first item that matches the
// specified flags. // specified flags.
// Returns the item or -1 if unsuccessful. // Returns the item or -1 if unsuccessful.
long GetNextItem(long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE) const ; long GetNextItem(long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE) const;
// Gets one of the three image lists // Gets one of the three image lists
wxImageList *GetImageList(int which) const ; wxImageList *GetImageList(int which) const;
// Sets the image list // Sets the image list
// N.B. There's a quirk in the Win95 list view implementation. // N.B. There's a quirk in the Win95 list view implementation.
@@ -234,8 +247,8 @@ public:
// haven't specified wxLIST_MASK_IMAGE when inserting. // haven't specified wxLIST_MASK_IMAGE when inserting.
// So you have to set a NULL small-icon image list to be sure that // So you have to set a NULL small-icon image list to be sure that
// the wxLC_LIST mode works without icons. Of course, you may want icons... // the wxLC_LIST mode works without icons. Of course, you may want icons...
void SetImageList(wxImageList *imageList, int which) ; void SetImageList(wxImageList *imageList, int which);
void AssignImageList(wxImageList *imageList, int which) ; void AssignImageList(wxImageList *imageList, int which);
// are we in report mode? // are we in report mode?
bool InReportView() const { return HasFlag(wxLC_REPORT); } bool InReportView() const { return HasFlag(wxLC_REPORT); }
@@ -257,7 +270,7 @@ public:
bool DeleteItem(long item); bool DeleteItem(long item);
// Deletes all items // Deletes all items
bool DeleteAllItems() ; bool DeleteAllItems();
// Deletes a column // Deletes a column
bool DeleteColumn(int col); bool DeleteColumn(int col);
@@ -275,7 +288,7 @@ public:
bool EndEditLabel(bool cancel); bool EndEditLabel(bool cancel);
// Ensures this item is visible // Ensures this item is visible
bool EnsureVisible(long item) ; bool EnsureVisible(long item);
// Find an item whose label matches this string, starting from the item after 'start' // Find an item whose label matches this string, starting from the item after 'start'
// or the beginning if 'start' is -1. // or the beginning if 'start' is -1.

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;
} }
} }
} }