int CCListBox::SetColumnIndexesAndSizes(LIST_COLUMNORDER* p) { int nColumns = this->GetColumnCount(); int i; int* pOrder = NULL; if(p == 0) return -1; // Set up the order array - this will be filled in during the sizing loop // and later put into action. pOrder = new int[nColumns]; if(pOrder == 0) return -1; for(i=0;i<nColumns;i++) { ListView_SetColumnWidth(m_hWnd, i, p[i].nSize); pOrder[i] = p[i].nIndex; } ListView_SetColumnOrderArray(m_hWnd, nColumns, pOrder); delete [] pOrder; return nColumns; }
void LoadColumnSizes(HWND hwndResults, const char *szProto) { HDITEM hdi; int columnOrder[NUM_COLUMNID]; int columnCount; char szSetting[32]; int i; FindAddDlgData *dat; bool colOrdersValid; defaultColumnSizes[COLUMNID_PROTO] = GetSystemMetrics(SM_CXSMICON) + 4; dat = (FindAddDlgData*)GetWindowLongPtr(GetParent(hwndResults), GWLP_USERDATA); columnCount = NUM_COLUMNID; colOrdersValid = true; for (i=0; i < NUM_COLUMNID; i++) { LVCOLUMN lvc; if (i < columnCount) { int bNeedsFree = FALSE; lvc.mask = LVCF_TEXT | LVCF_WIDTH; if (szColumnNames[i] != NULL) lvc.pszText = TranslateTS(szColumnNames[i]); else if (i == COLUMNID_HANDLE) { if (szProto) { bNeedsFree = TRUE; lvc.pszText = mir_a2t((char*)CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0)); } else lvc.pszText = _T("ID"); } else lvc.mask &= ~LVCF_TEXT; mir_snprintf(szSetting, SIZEOF(szSetting), "ColWidth%d", i); lvc.cx = db_get_w(NULL, "FindAdd", szSetting, defaultColumnSizes[i]); ListView_InsertColumn(hwndResults, i, (LPARAM)&lvc); if (bNeedsFree) mir_free(lvc.pszText); } mir_snprintf(szSetting, SIZEOF(szSetting), "ColOrder%d", i); columnOrder[i] = db_get_b(NULL, "FindAdd", szSetting, -1); if (columnOrder[i] == -1 || columnOrder[i] >= NUM_COLUMNID) colOrdersValid = false; } if (colOrdersValid) ListView_SetColumnOrderArray(hwndResults, columnCount, columnOrder); dat->iLastColumnSortIndex = db_get_b(NULL, "FindAdd", "SortColumn", COLUMNID_NICK); if (dat->iLastColumnSortIndex >= columnCount) dat->iLastColumnSortIndex = COLUMNID_NICK; dat->bSortAscending = db_get_b(NULL, "FindAdd", "SortAscending", TRUE); hdi.mask = HDI_FORMAT; hdi.fmt = HDF_LEFT | HDF_STRING | (dat->bSortAscending ? HDF_SORTDOWN : HDF_SORTUP); Header_SetItem(ListView_GetHeader(hwndResults), dat->iLastColumnSortIndex, &hdi); }
BOOL InitListViewColumns(HWND hWndListView) { LVCOLUMN lvc; int iCol, col_num = ARRAY_SIZE(col_names); int order[] = { 1, 0, 2, 3, 4, 5, 6, 7, 8}; int lv_width = GetSystemMetrics(SM_CXSCREEN) - 240*WIDTH_COEFFICIENT; int col_width[] = {40, 20, cxChar_2*6, cxChar_2*10, cxChar_2*17, cxChar_2*17 , cxChar_2*6, cxChar_2*6, cxChar_2*15}; SendMessage(hWndListView, WM_SETFONT, (WPARAM)char_font_2, 0); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; // Add the columns. for (iCol = 0; iCol < col_num; iCol++) { if (7==iCol) lvc.fmt = LVCFMT_RIGHT; else lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = iCol; lvc.pszText = col_names[iCol]; if ( iCol == 0 || iCol == 1) { lvc.fmt = LVCFMT_RIGHT; // Left-aligned column. } if ( iCol != (col_num-1)) { lvc.cx = col_width[iCol]; lv_width -= lvc.cx; } else { lvc.cx = lv_width-25; } // Insert the columns into the list view. if (ListView_InsertColumn(hWndListView, iCol, &lvc) == -1) { MessageBox (NULL, TEXT ("ListView_InsertColumn"), szAppName, MB_ICONERROR) ; return FALSE; } } ListView_SetColumnOrderArray(hWndListView, ARRAY_SIZE(order), order); return TRUE; }
GenericListControl::GenericListControl(HWND hwnd, const GenericListViewDef& def) : handle(hwnd), columns(def.columns),columnCount(def.columnCount),valid(false), inResizeColumns(false),updating(false) { DWORD style = GetWindowLong(handle,GWL_STYLE) | LVS_REPORT; SetWindowLong(handle, GWL_STYLE, style); SetWindowLongPtr(handle,GWLP_USERDATA,(LONG_PTR)this); oldProc = (WNDPROC) SetWindowLongPtr(handle,GWLP_WNDPROC,(LONG_PTR)wndProc); auto exStyle = LVS_EX_FULLROWSELECT; if (def.checkbox) exStyle |= LVS_EX_CHECKBOXES; SendMessage(handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, exStyle); LVCOLUMN lvc; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.iSubItem = 0; RECT rect; GetClientRect(handle,&rect); int totalListSize = rect.right-rect.left; for (int i = 0; i < columnCount; i++) { lvc.cx = columns[i].size * totalListSize; lvc.pszText = columns[i].name; if (columns[i].flags & GLVC_CENTERED) lvc.fmt = LVCFMT_CENTER; else lvc.fmt = LVCFMT_LEFT; ListView_InsertColumn(handle, i, &lvc); } if (def.columnOrder != NULL) ListView_SetColumnOrderArray(handle,columnCount,def.columnOrder); SetSendInvalidRows(false); valid = true; }
BOOLEAN PhLoadListViewColumnSettings( _In_ HWND ListViewHandle, _In_ PPH_STRING Settings ) { #define ORDER_LIMIT 50 PH_STRINGREF remainingPart; ULONG columnIndex; ULONG orderArray[ORDER_LIMIT]; // HACK, but reasonable limit ULONG maxOrder; ULONG scale; if (Settings->Length == 0) return FALSE; remainingPart = Settings->sr; columnIndex = 0; memset(orderArray, 0, sizeof(orderArray)); maxOrder = 0; if (remainingPart.Length != 0 && remainingPart.Buffer[0] == '@') { PH_STRINGREF scalePart; ULONG64 integer; PhSkipStringRef(&remainingPart, sizeof(WCHAR)); PhSplitStringRefAtChar(&remainingPart, '|', &scalePart, &remainingPart); if (scalePart.Length == 0 || !PhStringToInteger64(&scalePart, 10, &integer)) return FALSE; scale = (ULONG)integer; } else { scale = PhGlobalDpi; } while (remainingPart.Length != 0) { PH_STRINGREF columnPart; PH_STRINGREF orderPart; PH_STRINGREF widthPart; ULONG64 integer; ULONG order; ULONG width; LVCOLUMN lvColumn; PhSplitStringRefAtChar(&remainingPart, '|', &columnPart, &remainingPart); if (columnPart.Length == 0) return FALSE; PhSplitStringRefAtChar(&columnPart, ',', &orderPart, &widthPart); if (orderPart.Length == 0 || widthPart.Length == 0) return FALSE; // Order if (!PhStringToInteger64(&orderPart, 10, &integer)) return FALSE; order = (ULONG)integer; if (order < ORDER_LIMIT) { orderArray[order] = columnIndex; if (maxOrder < order + 1) maxOrder = order + 1; } // Width if (!PhStringToInteger64(&widthPart, 10, &integer)) return FALSE; width = (ULONG)integer; if (scale != PhGlobalDpi && scale != 0) width = PhMultiplyDivide(width, PhGlobalDpi, scale); lvColumn.mask = LVCF_WIDTH; lvColumn.cx = width; ListView_SetColumn(ListViewHandle, columnIndex, &lvColumn); columnIndex++; } ListView_SetColumnOrderArray(ListViewHandle, maxOrder, orderArray); return TRUE; }
void SearchResults::rebuild() { EnterCriticalSection(&lock); static char colNames[colCount][32] = { "Name", "Date", "Size", "Game name", "Lineup", "Length", "Mode" }; int colPos[colCount]; getColPos(colPos); int colOrder[colCount]; int numOrder = 0; for (int i = 0; i < colCount; i++) if (colPos[cfg.colOrder[i]] >= 0) colOrder[numOrder++] = colPos[cfg.colOrder[i]]; Dictionary<uint32> selected; for (int sel = ListView_GetNextItem(hWnd, -1, LVNI_SELECTED); sel >= 0; sel = ListView_GetNextItem(hWnd, sel, LVNI_SELECTED)) selected.set(items[sel].path, 1); int scrollPosX = GetScrollPos(hWnd, SB_HORZ); int scrollPosY = GetScrollPos(hWnd, SB_VERT); if (items.length() > 0) { RECT rc; ListView_GetItemRect(hWnd, 0, &rc, LVIR_BOUNDS); scrollPosY *= rc.bottom - rc.top; } setRedraw(false); clear(); clearColumns(); for (int i = 0; i < colCount; i++) if (colPos[i] >= 0) insertColumn(colPos[i], colNames[i]); if (colPos[colName] >= 0) setColumnUTF8(colPos[colName], true); ListView_SetColumnOrderArray(hWnd, numOrder, colOrder); int colSort = (cfg.colSort[0] & 0x80000000 ? ~cfg.colSort[0] : cfg.colSort[0]); if (colSort >= 0 && colSort < colCount && colPos[colSort] >= 0 && items.length() > 0) { HBITMAP image = NULL; if (cfg.colSort[0] & 0x80000000) image = getApp()->getImageLibrary()->getBitmap("SortUp"); else image = getApp()->getImageLibrary()->getBitmap("SortDown"); if (image) { HWND hHeader = ListView_GetHeader(hWnd); HDITEM hdi; memset(&hdi, 0, sizeof hdi); hdi.mask = HDI_FORMAT; Header_GetItem(hHeader, colSort, &hdi); hdi.mask |= HDI_BITMAP; hdi.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT; hdi.hbm = image; Header_SetItem(hHeader, colSort, &hdi); } } items.sort(compItems); for (int i = 0; i < items.length(); i++) addItem(i, false); for (int i = 0; i < items.length(); i++) if (selected.has(items[i].path)) ListView_SetItemState(hWnd, i, LVIS_SELECTED, LVIS_SELECTED); for (int i = 0; i < colCount; i++) if (colPos[i] >= 0) setColumnWidth(colPos[i], cfg.colWidth[i]); setRedraw(true); ListView_Scroll(hWnd, scrollPosX, scrollPosY); LeaveCriticalSection(&lock); }
BOOLEAN PhLoadListViewColumnSettings( _In_ HWND ListViewHandle, _In_ PPH_STRING Settings ) { #define ORDER_LIMIT 50 PH_STRINGREF remainingPart; ULONG columnIndex; ULONG orderArray[ORDER_LIMIT]; // HACK, but reasonable limit ULONG maxOrder; if (Settings->Length == 0) return FALSE; remainingPart = Settings->sr; columnIndex = 0; memset(orderArray, 0, sizeof(orderArray)); maxOrder = 0; while (remainingPart.Length != 0) { PH_STRINGREF columnPart; PH_STRINGREF orderPart; PH_STRINGREF widthPart; ULONG64 integer; ULONG order; LVCOLUMN lvColumn; PhSplitStringRefAtChar(&remainingPart, '|', &columnPart, &remainingPart); if (columnPart.Length == 0) return FALSE; PhSplitStringRefAtChar(&columnPart, ',', &orderPart, &widthPart); if (orderPart.Length == 0 || widthPart.Length == 0) return FALSE; // Order if (!PhStringToInteger64(&orderPart, 10, &integer)) return FALSE; order = (ULONG)integer; if (order < ORDER_LIMIT) { orderArray[order] = columnIndex; if (maxOrder < order + 1) maxOrder = order + 1; } // Width if (!PhStringToInteger64(&widthPart, 10, &integer)) return FALSE; lvColumn.mask = LVCF_WIDTH; lvColumn.cx = (ULONG)integer; ListView_SetColumn(ListViewHandle, columnIndex, &lvColumn); columnIndex++; } ListView_SetColumnOrderArray(ListViewHandle, maxOrder, orderArray); return TRUE; }
void Picker_HandleDrawItem(HWND hWnd, LPDRAWITEMSTRUCT lpDrawItemStruct) { struct PickerInfo *pPickerInfo; HDC hDC = lpDrawItemStruct->hDC; RECT rcItem = lpDrawItemStruct->rcItem; UINT uiFlags = ILD_TRANSPARENT; HIMAGELIST hImageList; int nItem = lpDrawItemStruct->itemID; COLORREF clrTextSave = 0; COLORREF clrBkSave = 0; COLORREF clrImage = GetSysColor(COLOR_WINDOW); static TCHAR szBuff[MAX_PATH]; BOOL bFocus = (GetFocus() == hWnd); LPCTSTR pszText; UINT nStateImageMask = 0; BOOL bSelected = 0; LV_COLUMN lvc; LV_ITEM lvi; RECT rcAllLabels; RECT rcLabel; RECT rcIcon; int offset = 0; SIZE size; int i = 0, j = 0; int nColumn = 0; int nColumnMax = 0; int *order; BOOL bDrawAsChild = 0; int indent_space = 0; BOOL bColorChild = FALSE; BOOL bParentFound = FALSE; int nParent = 0; HBITMAP hBackground = GetBackgroundBitmap(); MYBITMAPINFO *pbmDesc = GetBackgroundInfo(); BOOL res = 0; pPickerInfo = GetPickerInfo(hWnd); order = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*order)); if (!order) return; nColumnMax = Picker_GetNumColumns(hWnd); if (GetUseOldControl()) { pPickerInfo->pCallbacks->pfnGetColumnOrder(order); } else { /* Get the Column Order and save it */ res = ListView_GetColumnOrderArray(hWnd, nColumnMax, order); /* Disallow moving column 0 */ if (order[0] != 0) { for (i = 0; i < nColumnMax; i++) { if (order[i] == 0) { order[i] = order[0]; order[0] = 0; } } res = ListView_SetColumnOrderArray(hWnd, nColumnMax, order); } } /* Labels are offset by a certain amount */ /* This offset is related to the width of a space character */ GetTextExtentPoint32(hDC, TEXT(" "), 1, &size); offset = size.cx; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM; lvi.iItem = nItem; lvi.iSubItem = order[0]; lvi.pszText = szBuff; lvi.cchTextMax = sizeof(szBuff) / sizeof(szBuff[0]); lvi.stateMask = 0xFFFF; /* get all state flags */ res = ListView_GetItem(hWnd, &lvi); bSelected = ((lvi.state & LVIS_DROPHILITED) || ( (lvi.state & LVIS_SELECTED) && ((bFocus) || (GetWindowLong(hWnd, GWL_STYLE) & LVS_SHOWSELALWAYS)))); /* figure out if we indent and draw grayed */ if (pPickerInfo->pCallbacks->pfnFindItemParent) nParent = pPickerInfo->pCallbacks->pfnFindItemParent(hWnd, lvi.lParam); else nParent = -1; bDrawAsChild = (pPickerInfo->pCallbacks->pfnGetViewMode() == VIEW_GROUPED && (nParent >= 0)); /* only indent if parent is also in this view */ if ((nParent >= 0) && bDrawAsChild) { for (i = 0; i < ListView_GetItemCount(hWnd); i++) { lvi.mask = LVIF_PARAM; lvi.iItem = i; res = ListView_GetItem(hWnd, &lvi); if (lvi.lParam == nParent) { bParentFound = TRUE; break; } } } if (pPickerInfo->pCallbacks->pfnGetOffsetChildren && pPickerInfo->pCallbacks->pfnGetOffsetChildren()) { if (!bParentFound && bDrawAsChild) { /*Reset it, as no Parent is there*/ bDrawAsChild = FALSE; bColorChild = TRUE; } else { nParent = -1; bParentFound = FALSE; } } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcAllLabels, LVIR_BOUNDS); res = ListView_GetItemRect_Modified(hWnd, nItem, &rcLabel, LVIR_LABEL); rcAllLabels.left = rcLabel.left; if (hBackground != NULL) { RECT rcClient; HRGN rgnBitmap; RECT rcTmpBmp = rcItem; RECT rcFirstItem; HPALETTE hPAL; HDC htempDC; HBITMAP oldBitmap; htempDC = CreateCompatibleDC(hDC); oldBitmap = (HBITMAP)SelectObject(htempDC, hBackground); GetClientRect(hWnd, &rcClient); rcTmpBmp.right = rcClient.right; /* We also need to check whether it is the last item The update region has to be extended to the bottom if it is */ if (nItem == ListView_GetItemCount(hWnd) - 1) rcTmpBmp.bottom = rcClient.bottom; rgnBitmap = CreateRectRgnIndirect(&rcTmpBmp); SelectClipRgn(hDC, rgnBitmap); DeleteBitmap(rgnBitmap); hPAL = GetBackgroundPalette(); if (hPAL == NULL) hPAL = CreateHalftonePalette(hDC); if (GetDeviceCaps(htempDC, RASTERCAPS) & RC_PALETTE && hPAL != NULL) { SelectPalette(htempDC, hPAL, FALSE); RealizePalette(htempDC); } res = ListView_GetItemRect_Modified(hWnd, 0, &rcFirstItem, LVIR_BOUNDS); for (i = rcFirstItem.left; i < rcClient.right; i += pbmDesc->bmWidth) for (j = rcFirstItem.top; j < rcClient.bottom; j += pbmDesc->bmHeight) BitBlt(hDC, i, j, pbmDesc->bmWidth, pbmDesc->bmHeight, htempDC, 0, 0, SRCCOPY); SelectObject(htempDC, oldBitmap); DeleteDC(htempDC); if (GetBackgroundPalette() == NULL) { DeletePalette(hPAL); hPAL = NULL; } } indent_space = 0; if (bDrawAsChild) { RECT rect; res = ListView_GetItemRect_Modified(hWnd, nItem, &rect, LVIR_ICON); /* indent width of icon + the space between the icon and text * so left of clone icon starts at text of parent */ indent_space = rect.right - rect.left + offset; } rcAllLabels.left += indent_space; if (bSelected) { HBRUSH hBrush; HBRUSH hOldBrush; if (bFocus) { clrTextSave = SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_HIGHLIGHT)); hBrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); } else { clrTextSave = SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT)); clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); } hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); FillRect(hDC, &rcAllLabels, hBrush); SelectObject(hDC, hOldBrush); DeleteBrush(hBrush); } else { if (hBackground == NULL) { HBRUSH hBrush; hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); FillRect(hDC, &rcAllLabels, hBrush); DeleteBrush(hBrush); } if (pPickerInfo->pCallbacks->pfnGetOffsetChildren && pPickerInfo->pCallbacks->pfnGetOffsetChildren()) { if (bDrawAsChild || bColorChild) clrTextSave = SetTextColor(hDC, GetListCloneColor()); else clrTextSave = SetTextColor(hDC, GetListFontColor()); } else { if (bDrawAsChild) clrTextSave = SetTextColor(hDC, GetListCloneColor()); else clrTextSave = SetTextColor(hDC, GetListFontColor()); } clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_WINDOW)); } if (lvi.state & LVIS_CUT) { clrImage = GetSysColor(COLOR_WINDOW); uiFlags |= ILD_BLEND50; } else if (bSelected) { if (bFocus) clrImage = GetSysColor(COLOR_HIGHLIGHT); else clrImage = GetSysColor(COLOR_BTNFACE); uiFlags |= ILD_BLEND50; } nStateImageMask = lvi.state & LVIS_STATEIMAGEMASK; if (nStateImageMask) { int nImage = (nStateImageMask >> 12) - 1; hImageList = ListView_GetImageList(hWnd, LVSIL_STATE); if (hImageList) ImageList_Draw(hImageList, nImage, hDC, rcItem.left, rcItem.top, ILD_TRANSPARENT); } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcIcon, LVIR_ICON); rcIcon.left += indent_space; res = ListView_GetItemRect_Modified(hWnd, nItem, &rcItem, LVIR_LABEL); hImageList = ListView_GetImageList(hWnd, LVSIL_SMALL); if (hImageList) { UINT nOvlImageMask = lvi.state & LVIS_OVERLAYMASK; if (rcIcon.left + 16 + indent_space < rcItem.right) { ImageList_DrawEx(hImageList, lvi.iImage, hDC, rcIcon.left, rcIcon.top, 16, 16, GetSysColor(COLOR_WINDOW), clrImage, uiFlags | nOvlImageMask); } } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcItem, LVIR_LABEL); pszText = MakeShortString(hDC, szBuff, rcItem.right - rcItem.left, 2*offset + indent_space); rcLabel = rcItem; rcLabel.left += offset + indent_space; rcLabel.right -= offset; DrawText(hDC, pszText, -1, &rcLabel, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); for (nColumn = 1; nColumn < nColumnMax; nColumn++) { int nRetLen; UINT nJustify; LV_ITEM lvItem; lvc.mask = LVCF_FMT | LVCF_WIDTH; res = ListView_GetColumn(hWnd, order[nColumn], &lvc); lvItem.mask = LVIF_TEXT; lvItem.iItem = nItem; lvItem.iSubItem = order[nColumn]; lvItem.pszText = szBuff; lvItem.cchTextMax = sizeof(szBuff) / sizeof(szBuff[0]); if (ListView_GetItem(hWnd, &lvItem) == FALSE) continue; rcItem.left = rcItem.right; rcItem.right += lvc.cx; nRetLen = _tcslen(szBuff); if (nRetLen == 0) continue; pszText = MakeShortString(hDC, szBuff, rcItem.right - rcItem.left, 2 * offset); nJustify = DT_LEFT; if (pszText == szBuff) { switch (lvc.fmt & LVCFMT_JUSTIFYMASK) { case LVCFMT_RIGHT: nJustify = DT_RIGHT; break; case LVCFMT_CENTER: nJustify = DT_CENTER; break; default: break; } } rcLabel = rcItem; rcLabel.left += offset; rcLabel.right -= offset; DrawText(hDC, pszText, -1, &rcLabel, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); } if (lvi.state & LVIS_FOCUSED && bFocus) DrawFocusRect(hDC, &rcAllLabels); SetTextColor(hDC, clrTextSave); SetBkColor(hDC, clrBkSave); free(order); res++; }