PPH_STRING PhCmSaveSettingsEx( _In_ HWND TreeNewHandle, _In_opt_ PPH_CM_MANAGER Manager, _In_ ULONG Flags, _Out_opt_ PPH_STRING *SortSettings ) { PH_STRING_BUILDER stringBuilder; ULONG i = 0; ULONG count = 0; ULONG total; ULONG increment; PH_TREENEW_COLUMN column; total = TreeNew_GetColumnCount(TreeNewHandle); if (TreeNew_GetFixedColumn(TreeNewHandle)) increment = 1; // the first normal column should have a display index that starts with 1, for compatibility else increment = 0; PhInitializeStringBuilder(&stringBuilder, 100); while (count < total) { if (TreeNew_GetColumn(TreeNewHandle, i, &column)) { if (!(Flags & PH_CM_COLUMN_WIDTHS_ONLY)) { if (column.Visible) { if (!Manager || i < Manager->MinId) { PhAppendFormatStringBuilder( &stringBuilder, L"%u,%u,%u|", i, column.Fixed ? 0 : column.DisplayIndex + increment, column.Width ); } else { PPH_CM_COLUMN cmColumn; cmColumn = column.Context; PhAppendFormatStringBuilder( &stringBuilder, L"+%s+%u,%u,%u|", cmColumn->Plugin->Name.Buffer, cmColumn->SubId, column.DisplayIndex + increment, column.Width ); } } } else { if (!Manager || i < Manager->MinId) { PhAppendFormatStringBuilder( &stringBuilder, L"%u,,%u|", i, column.Width ); } else { PPH_CM_COLUMN cmColumn; cmColumn = column.Context; PhAppendFormatStringBuilder( &stringBuilder, L"+%s+%u,,%u|", cmColumn->Plugin->Name.Buffer, cmColumn->SubId, column.Width ); } } count++; } i++; } if (stringBuilder.String->Length != 0) PhRemoveEndStringBuilder(&stringBuilder, 1); if (SortSettings) { ULONG sortColumn; PH_SORT_ORDER sortOrder; if (TreeNew_GetSort(TreeNewHandle, &sortColumn, &sortOrder)) { if (sortOrder != NoSortOrder) { if (!Manager || sortColumn < Manager->MinId) { *SortSettings = PhFormatString(L"%u,%u", sortColumn, sortOrder); } else { PH_TREENEW_COLUMN column; PPH_CM_COLUMN cmColumn; if (TreeNew_GetColumn(TreeNewHandle, sortColumn, &column)) { cmColumn = column.Context; *SortSettings = PhFormatString(L"+%s+%u,%u", cmColumn->Plugin->Name.Buffer, cmColumn->SubId, sortOrder); } else { *SortSettings = PhReferenceEmptyString(); } } } else { *SortSettings = PhCreateString(L"0,0"); } } else { *SortSettings = PhReferenceEmptyString(); } } return PhFinalStringBuilderString(&stringBuilder); }
VOID PhpEnsureValidSortColumnTreeNew( __inout HWND TreeNewHandle, __in ULONG DefaultSortColumn, __in PH_SORT_ORDER DefaultSortOrder ) { ULONG sortColumn; PH_SORT_ORDER sortOrder; // Make sure the column we're sorting by is actually visible, and if not, don't sort anymore. TreeNew_GetSort(TreeNewHandle, &sortColumn, &sortOrder); if (sortOrder != NoSortOrder) { PH_TREENEW_COLUMN column; TreeNew_GetColumn(TreeNewHandle, sortColumn, &column); if (!column.Visible) { if (DefaultSortOrder != NoSortOrder) { // Make sure the default sort column is visible. TreeNew_GetColumn(TreeNewHandle, DefaultSortColumn, &column); if (!column.Visible) { ULONG maxId; ULONG id; BOOLEAN found; // Use the first visible column. maxId = TreeNew_GetMaxId(TreeNewHandle); id = 0; found = FALSE; while (id <= maxId) { if (TreeNew_GetColumn(TreeNewHandle, id, &column)) { if (column.Visible) { DefaultSortColumn = id; found = TRUE; break; } } id++; } if (!found) { DefaultSortColumn = 0; DefaultSortOrder = NoSortOrder; } } } TreeNew_SetSort(TreeNewHandle, DefaultSortColumn, DefaultSortOrder); } } }