// styles because it's prettier (and also because wxGTK does it like this)
if ( InReportView() && wxApp::GetComCtl32Version() >= 470 )
{
- ::SendMessage(GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE,
- 0, LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES);
+ ::SendMessage
+ (
+ 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 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
// visible area of the list control (list or report view)
// or the total number of items in the list control (icon
findInfo.flags = LVFI_STRING;
if ( partial )
findInfo.flags |= LVFI_PARTIAL;
- findInfo.psz = str;
+ findInfo.psz = str.wx_str();
// ListView_FindItem() excludes the first item from search and to look
// through all the items you need to start from -1 which is unnatural and
{
if ( msg->message == WM_KEYDOWN )
{
- if ( msg->wParam == VK_RETURN )
+ // Only eat VK_RETURN if not being used by the application in
+ // conjunction with modifiers
+ if ( msg->wParam == VK_RETURN && !wxIsAnyModifierDown() )
{
- // We need VK_RETURN to generate wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
- // but only if none of the modifiers is down. We'll let normal
- // accelerators handle those.
- if ( !wxIsCtrlDown() && !wxIsCtrlDown() &&
- !((HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN))
+ // we need VK_RETURN to generate wxEVT_COMMAND_LIST_ITEM_ACTIVATED
return false;
}
}
-
return wxControl::MSWShouldPreProcessMessage(msg);
}
-bool wxListCtrl::MSWCommand(WXUINT cmd, WXWORD id)
+bool wxListCtrl::MSWCommand(WXUINT cmd, WXWORD id_)
{
+ const int id = (signed short)id_;
if (cmd == EN_UPDATE)
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, id);
return rc;
}
-static bool HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont)
+static
+bool HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont, int colCount)
{
NMCUSTOMDRAW& nmcd = pLVCD->nmcd;
// get the rectangle to paint
RECT rc;
ListView_GetSubItemRect(hwndList, item, col, LVIR_BOUNDS, &rc);
- if ( !col )
+ if ( !col && colCount > 1 )
{
// broken ListView_GetSubItemRect() returns the entire item rect for
// 0th subitem while we really need just the part for this column
for ( int col = 0; col < colCount; col++ )
{
pLVCD->iSubItem = col;
- HandleSubItemPrepaint(pLVCD, hfont);
+ HandleSubItemPrepaint(pLVCD, hfont, colCount);
}
HandleItemPostpaint(nmcd);
dc.SetPen(pen);
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();
- 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 ;
dc.DrawLine(x-1, firstItemRect.GetY() - gap,
x-1, itemRect.GetBottom());
}
+
+ delete indexArray;
}
}
}
void wxListCtrl::RefreshItem(long item)
{
- // strangely enough, ListView_Update() results in much more flicker here
- // than a dumb Refresh() -- why?
-#if 0
- if ( !ListView_Update(GetHwnd(), item) )
- {
- wxLogLastError(_T("ListView_Update"));
- }
-#else // 1
- wxRect rect;
- GetItemRect(item, rect);
- RefreshRect(rect);
-#endif // 0/1
+ RefreshItems(item, item);
}
void wxListCtrl::RefreshItems(long itemFrom, long itemTo)
{
- wxRect rect1, rect2;
- GetItemRect(itemFrom, rect1);
- GetItemRect(itemTo, rect2);
-
- wxRect rect = rect1;
- rect.height = rect2.GetBottom() - rect1.GetTop();
-
- RefreshRect(rect);
+ ListView_RedrawItems(GetHwnd(), itemFrom, itemTo);
}
// ----------------------------------------------------------------------------