//----------------------------------------------------------------------------- // ExcludePathsDlg_SetCheckState_r // // Propogate the check state to all children //----------------------------------------------------------------------------- void ExcludePathsDlg_SetCheckState_r( HWND hWndTree, HTREEITEM hTree, int depth, int checkState ) { if ( !hTree ) { return; } TreeView_SetCheckState( hWndTree, hTree, ( checkState == 1 ) ); TVITEM tvi = { 0 }; tvi.mask = TVIF_HANDLE | TVIF_CHILDREN; tvi.hItem = hTree; if ( TreeView_GetItem( hWndTree, &tvi ) ) { if ( tvi.cChildren ) { HTREEITEM hChild = TreeView_GetChild( hWndTree, hTree ); if ( hChild ) { ExcludePathsDlg_SetCheckState_r( hWndTree, hChild, depth+1, checkState ); } } } else { return; } if ( !depth ) { // only iterate siblings of the parent's child return; } HTREEITEM hSibling = hTree; while ( 1 ) { hSibling = TreeView_GetNextSibling( hWndTree, hSibling ); if ( !hSibling ) { return; } TreeView_SetCheckState( hWndTree, hSibling, ( checkState == 1 ) ); tvi.hItem = hSibling; if ( TreeView_GetItem( hWndTree, &tvi ) ) { if ( tvi.cChildren ) { HTREEITEM hChild = TreeView_GetChild( hWndTree, hSibling ); if ( hChild ) { ExcludePathsDlg_SetCheckState_r( hWndTree, hChild, depth+1, checkState ); } } } } }
LRESULT FilterOnWmUncheckItem( IN HWND hWnd, IN UINT uMsg, IN WPARAM wp, IN LPARAM lp ) { HWND hWndTree; TVITEMEX Item = {0}; HTREEITEM hItem; ULONG NewState; ULONG OldState; hWndTree = GetDlgItem(hWnd, IDC_TREE_FILTER); // // Get the current state of treeview item // hItem = (HTREEITEM)wp; Item.mask = TVIF_STATE; Item.stateMask = TVIS_STATEIMAGEMASK ; Item.hItem = hItem; TreeView_GetItem(hWndTree, &Item); OldState = Item.state; // // Clear check state and get new state // TreeView_SetCheckState(hWndTree, hItem, FALSE); Item.mask = TVIF_STATE; Item.stateMask = TVIS_STATEIMAGEMASK ; Item.hItem = hItem; TreeView_GetItem(hWndTree, &Item); NewState = Item.state; // // N.B. This message can only be triggered to child item, NULL lParam // FilterOnItemChanged(hWnd, hWndTree, hItem, NewState, OldState, 0); // // Always clear check state of its parent // TreeView_SetCheckState(hWndTree, TreeView_GetParent(hWndTree, hItem), FALSE); return 0L; }
static HTREEITEM AddLine(HWND hTree,TopButtonInt *b, HTREEITEM hItem, HIMAGELIST il) { TVINSERTSTRUCT tvis = { 0 }; tvis.hInsertAfter = hItem; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_STATE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; int index; TCHAR* tmp; if (b->dwFlags & TTBBF_ISSEPARATOR) { tvis.item.pszText = _T("------------------"); index = -1; } else { if (b->hIconHandleUp) { HICON hIcon = IcoLib_GetIconByHandle(b->hIconHandleUp); index = ImageList_AddIcon(il, hIcon); IcoLib_ReleaseIcon(hIcon); } else index = ImageList_AddIcon(il, b->hIconUp); tmp = mir_a2t( b->pszName ); tvis.item.pszText = TranslateTS(tmp); } tvis.item.iImage = tvis.item.iSelectedImage = index; tvis.item.lParam = (LPARAM)b; HTREEITEM hti = TreeView_InsertItem(hTree, &tvis); if (!(b->dwFlags & TTBBF_ISSEPARATOR)) mir_free(tmp); TreeView_SetCheckState(hTree, hti, b->isVisible()); return hti; }
BOOLEAN FilterListOnDelete( IN HWND hWnd, IN UINT uMsg, IN WPARAM wp, IN LPARAM lp ) { int Index; int Count; HTREEITEM hTreeItem; HWND hWndTree; HWND hWndParent; Index = ListViewGetFirstSelected(hWnd); if (Index != -1) { ListViewGetParam(hWnd, Index, (LPARAM *)&hTreeItem); if (hTreeItem != NULL) { ListView_DeleteItem(hWnd, Index); hWndParent = GetParent(hWnd); hWndTree = GetDlgItem(hWndParent, IDC_TREE_FILTER); TreeView_EnsureVisible(hWndTree, hTreeItem); if (BspIsVistaAbove()) { TreeView_SetCheckState(hWndTree, hTreeItem, FALSE); } else { PostMessage(hWndParent, WM_TVN_UNCHECKITEM, (WPARAM)hTreeItem, 0); } Count = ListView_GetItemCount(hWnd); // // If the last item is deleted, start from 0 // if (Count > Index) { ListViewSelectSingle(hWnd, Index); } else { ListViewSelectSingle(hWnd, 0); } return TRUE; } } return FALSE; }
void OptionsDialogType::UserAction(HTREEITEM hItem) { HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST); if (TreeView_GetCheckState(hLstView, hItem)) { if (!BrowseForSmileyPacks(GetSelProto(hItem))) { TreeView_SetCheckState(hLstView, hItem, TRUE) } } else {
bool SetCheck(_Ty Key, bool bSel) { HTREEITEM hItem = KeyToHandle(Key); if (NULL != hItem) { TreeView_SetCheckState(m_hWnd, hItem, bSel ? TRUE : FALSE); return true; } return false; }
void g_populate_tree ( HWND wnd_tree, cui::fcl::group_list & list, const cui::fcl::group_list_filtered & filtered, HTREEITEM ti_parent = TVI_ROOT) { t_size i, count = filtered.get_count(); for (i=0; i<count; i++) { pfc::string8 name; filtered[i]->get_name(name); HTREEITEM item = treeview::insert_item(wnd_tree, name, m_nodes.get_count() , ti_parent); m_nodes.add_item(t_node(item, filtered[i])); TreeView_SetCheckState(wnd_tree, item, TRUE); cui::fcl::group_list_filtered filtered2(list, filtered[i]->get_guid()); list.remove_by_guid(filtered[i]->get_guid()); g_populate_tree(wnd_tree, list, filtered2, item); } }
static LRESULT CALLBACK ToolBar_OptDlgProc(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) { static HIMAGELIST himlButtonIcons=NULL; static BOOL dragging=FALSE; static HANDLE hDragItem=NULL; switch (msg) { case WM_DESTROY: ImageList_Destroy(himlButtonIcons); break; case WM_INITDIALOG: { HWND hTree=GetDlgItem(hwndDlg,IDC_BTNORDER); TranslateDialogDefault(hwndDlg); SetWindowLong(hTree,GWL_STYLE,GetWindowLong(hTree,GWL_STYLE)|TVS_NOHSCROLL); { himlButtonIcons=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,2,2); TreeView_SetImageList(hTree,himlButtonIcons,TVSIL_NORMAL); } TreeView_DeleteAllItems(hTree); tblock; qsort(tbdat.listOfButtons->items,tbdat.listOfButtons->realCount,sizeof(MTB_BUTTONINFO *),sttSortButtons); { int i=0; for (i=0; i<tbdat.listOfButtons->realCount; i++) { TVINSERTSTRUCT tvis={0}; HTREEITEM hti; MTB_BUTTONINFO * mtbi = (MTB_BUTTONINFO*) tbdat.listOfButtons->items[i]; TCHAR * szTempName=mir_a2t(mtbi->szButtonName); HICON hIcon = (HICON)CallService(MS_SKIN2_GETICONBYHANDLE, 0, (LPARAM)mtbi->hPrimaryIconHandle); int index = ImageList_AddIcon(himlButtonIcons, hIcon); CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); tvis.hParent=NULL; tvis.hInsertAfter=TVI_LAST; tvis.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_STATE; tvis.item.lParam=(LPARAM)(mtbi); tvis.item.pszText=TranslateTS(szTempName); tvis.item.iImage=tvis.item.iSelectedImage=index; hti=TreeView_InsertItem(hTree,&tvis); TreeView_SetCheckState(hTree, hti, mtbi->bVisible ); mir_free(szTempName); } } tbunlock; SendDlgItemMessage(hwndDlg,IDC_SPIN_W,UDM_SETRANGE,0,MAKELONG(50,10)); SendDlgItemMessage(hwndDlg,IDC_SPIN_W,UDM_SETPOS,0,MAKELONG(ModernGetSettingByte(NULL, "ModernToolBar", "option_Bar0_BtnWidth", SETTINGS_BARBTNWIDTH_DEFAULT),0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_H,UDM_SETRANGE,0,MAKELONG(50,10)); SendDlgItemMessage(hwndDlg,IDC_SPIN_H,UDM_SETPOS,0,MAKELONG(ModernGetSettingByte(NULL, "ModernToolBar", "option_Bar0_BtnHeight", SETTINGS_BARBTNHEIGHT_DEFAULT),0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_S,UDM_SETRANGE,0,MAKELONG(20,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_S,UDM_SETPOS,0,MAKELONG(ModernGetSettingByte(NULL, "ModernToolBar", "option_Bar0_BtnSpace", SETTINGS_BARBTNSPACE_DEFAULT),0)); CheckDlgButton(hwndDlg, IDC_CHECK_AUTOSIZE, ModernGetSettingByte(NULL, "ModernToolBar", "option_Bar0_Autosize", SETTINGS_BARAUTOSIZE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_MULTILINE, ModernGetSettingByte(NULL,"ModernToolBar", "option_Bar0_Multiline", SETTINGS_BARMULTILINE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_TBSHOW, ModernGetSettingByte(NULL,"CLUI","ShowButtonBar",SETTINGS_SHOWBUTTONBAR_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); { int i; BOOL en=IsDlgButtonChecked(hwndDlg,IDC_TBSHOW); for (i=0; i<SIZEOF(ControlIDS); i++) EnableWindow(GetDlgItem(hwndDlg,ControlIDS[i]), en); } return TRUE; } case WM_NOTIFY: { switch(((LPNMHDR)lParam)->idFrom) { case 0: { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { int order=100; HWND hTree=GetDlgItem(hwndDlg,IDC_BTNORDER); int count=TreeView_GetCount(hTree); HTREEITEM hItem; sttDeleteOrderSettings(); hItem=TreeView_GetRoot(hTree); do { TVITEM tvi={0}; MTB_BUTTONINFO *mtbi; tvi.mask=TBIF_LPARAM|TVIF_HANDLE; tvi.hItem=hItem; TreeView_GetItem(hTree, &tvi); mtbi=(MTB_BUTTONINFO *)tvi.lParam; if (mtbi) { char szTempSetting[200]; mir_snprintf(szTempSetting, SIZEOF(szTempSetting), "order_%s", mtbi->szButtonID); ModernWriteSettingDword(NULL, "ModernToolBar", szTempSetting, order); order+=10; mir_snprintf(szTempSetting, SIZEOF(szTempSetting), "visible_%s", mtbi->szButtonID); ModernWriteSettingByte(NULL, "ModernToolBar", szTempSetting, TreeView_GetCheckState(hTree,hItem)); } hItem=TreeView_GetNextSibling(hTree,hItem); } while (hItem!=NULL); ModernWriteSettingByte(NULL,"CLUI","ShowButtonBar",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_TBSHOW)); ModernWriteSettingByte(NULL,"ModernToolBar","option_Bar0_BtnWidth", (BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_W,UDM_GETPOS,0,0)); ModernWriteSettingByte(NULL,"ModernToolBar","option_Bar0_BtnHeight",(BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_H,UDM_GETPOS,0,0)); ModernWriteSettingByte(NULL,"ModernToolBar","option_Bar0_BtnSpace", (BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_S,UDM_GETPOS,0,0)); ModernWriteSettingByte(NULL, "ModernToolBar", "option_Bar0_Autosize", (BYTE)IsDlgButtonChecked(hwndDlg,IDC_CHECK_AUTOSIZE)); ModernWriteSettingByte(NULL,"ModernToolBar", "option_Bar0_Multiline", (BYTE)IsDlgButtonChecked(hwndDlg,IDC_CHECK_MULTILINE)); sttReloadButtons(); return TRUE; } } break; } case IDC_BTNORDER: { switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAGA: case TVN_BEGINDRAGW: SetCapture(hwndDlg); dragging=TRUE; hDragItem=((LPNMTREEVIEWA)lParam)->itemNew.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg,IDC_BTNORDER),hDragItem); break; case NM_CLICK: { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(GetMessagePos()); hti.pt.y=(short)HIWORD(GetMessagePos()); ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt); if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti)) if(hti.flags&TVHT_ONITEMSTATEICON) SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); }; } break; } } break; } case WM_MOUSEMOVE: { if(!dragging) break; { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(lParam); hti.pt.y=(short)HIWORD(lParam); ClientToScreen(hwndDlg,&hti.pt); ScreenToClient(GetDlgItem(hwndDlg,IDC_BTNORDER),&hti.pt); TreeView_HitTest(GetDlgItem(hwndDlg,IDC_BTNORDER),&hti); if(hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { HTREEITEM it=hti.hItem; hti.pt.y-=TreeView_GetItemHeight(GetDlgItem(hwndDlg,IDC_BTNORDER))/2; TreeView_HitTest(GetDlgItem(hwndDlg,IDC_BTNORDER),&hti); if (!(hti.flags&TVHT_ABOVE)) TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_BTNORDER),hti.hItem,1); else TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_BTNORDER),it,0); } else { if(hti.flags&TVHT_ABOVE) SendDlgItemMessage(hwndDlg,IDC_BTNORDER,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),0); if(hti.flags&TVHT_BELOW) SendDlgItemMessage(hwndDlg,IDC_BTNORDER,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),0); TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_BTNORDER),NULL,0); } } } break; case WM_LBUTTONUP: { if(!dragging) break; TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_BTNORDER),NULL,0); dragging=0; ReleaseCapture(); { TVHITTESTINFO hti; TVITEM tvi; hti.pt.x=(short)LOWORD(lParam); hti.pt.y=(short)HIWORD(lParam); ClientToScreen(hwndDlg,&hti.pt); ScreenToClient(GetDlgItem(hwndDlg,IDC_BTNORDER),&hti.pt); hti.pt.y-=TreeView_GetItemHeight(GetDlgItem(hwndDlg,IDC_BTNORDER))/2; TreeView_HitTest(GetDlgItem(hwndDlg,IDC_BTNORDER),&hti); if(hDragItem==hti.hItem) break; if (hti.flags&TVHT_ABOVE) hti.hItem=TVI_FIRST; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=(HTREEITEM)hDragItem; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_BTNORDER),&tvi); if(hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)||(hti.hItem==TVI_FIRST)) { TVINSERTSTRUCT tvis; TCHAR name[128]; tvis.item.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_STATE; tvis.item.stateMask=0xFFFFFFFF; tvis.item.pszText=name; tvis.item.cchTextMax=sizeof(name); tvis.item.hItem=(HTREEITEM)hDragItem; //tvis.item.iImage=tvis.item.iSelectedImage=((MTB_BUTTONINFO *)tvi.lParam)->bVisible; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_BTNORDER),&tvis.item); TreeView_DeleteItem(GetDlgItem(hwndDlg,IDC_BTNORDER),hDragItem); tvis.hParent=NULL; tvis.hInsertAfter=hti.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg,IDC_BTNORDER),TreeView_InsertItem(GetDlgItem(hwndDlg,IDC_BTNORDER),&tvis)); SendMessage((GetParent(hwndDlg)), PSM_CHANGED, (WPARAM)hwndDlg, 0); } } } break; case WM_COMMAND: if (LOWORD(wParam)==IDC_TBSHOW) { { int i; BOOL en=IsDlgButtonChecked(hwndDlg,IDC_TBSHOW); for (i=0; i<SIZEOF(ControlIDS); i++) EnableWindow(GetDlgItem(hwndDlg,ControlIDS[i]), en); } SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); } else if ( (LOWORD(wParam)==IDC_TEXT_W || LOWORD(wParam)==IDC_TEXT_H || LOWORD(wParam)==IDC_TEXT_S ) && HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; // dont make apply enabled during buddy set crap SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); break; } return FALSE; }
INT_PTR CALLBACK DlgProcOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hTree = GetDlgItem(hwndDlg, IDC_FILTER); switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); bInitializing = true; fill_filter(); SetWindowLongPtr(hTree, GWL_STYLE, GetWindowLongPtr(hTree, GWL_STYLE) | TVS_NOHSCROLL); HIMAGELIST himlButtonIcons = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); TreeView_SetImageList(hTree, himlButtonIcons, TVSIL_NORMAL); TreeView_DeleteAllItems(hTree); for (int i = 2; i < nII; i++) { // we don`t need it IGNORE_ALL and IGNORE_MESSAGE TVINSERTSTRUCT tvis = { 0 }; int index = ImageList_AddIcon(himlButtonIcons, LoadSkinnedIcon(ii[i].icon)); tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; tvis.item.lParam = (LPARAM)(ii[i].type); tvis.item.pszText = TranslateTS(ii[i].name); tvis.item.iImage = tvis.item.iSelectedImage = index; HTREEITEM hti = TreeView_InsertItem(hTree, &tvis); TreeView_SetCheckState(hTree, hti, checkState(ii[i].type)); } CheckDlgButton(hwndDlg, IDC_IGNORE_IGNOREALL, bUseMirandaSettings ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER), !bUseMirandaSettings); bInitializing = false; } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_IGNORE_IGNOREALL: EnableWindow(GetDlgItem(hwndDlg, IDC_FILTER), BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_IGNORE_IGNOREALL)); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { DWORD flags = 0; TVITEM tvi; tvi.mask = TVIF_HANDLE | TBIF_LPARAM; HWND hTree = GetDlgItem(hwndDlg, IDC_FILTER); tvi.hItem = TreeView_GetRoot(hTree); //check ignore all while (tvi.hItem) { TreeView_GetItem(hTree, &tvi); if (TreeView_GetCheckState(hTree, tvi.hItem)) flags |= 1 << (tvi.lParam - 1); tvi.hItem = TreeView_GetNextSibling(hTree, tvi.hItem); } db_set_dw(NULL, MODULENAME, "Filter", flags); bUseMirandaSettings = IsDlgButtonChecked(hwndDlg, IDC_IGNORE_IGNOREALL) ? 1 : 0; db_set_b(NULL, MODULENAME, "UseMirandaSettings", bUseMirandaSettings); fill_filter(); } } case IDC_FILTER: if (((LPNMHDR)lParam)->code == NM_CLICK) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } } return FALSE; }
LRESULT FilterOnItemChanged( IN HWND hWnd, IN HWND hWndTree, IN HTREEITEM hItem, IN ULONG NewState, IN ULONG OldState, IN LPARAM Param ) { HTREEITEM Parent; ULONG Checked, Unchecked; PDIALOG_OBJECT Object; PFILTER_CONTEXT Context; WCHAR Buffer[MAX_PATH]; WCHAR Format[MAX_PATH]; PFILTER_NODE Node; PBTR_FILTER Filter; TVITEM Item = {0}; Object = (PDIALOG_OBJECT)SdkGetObject(hWnd); Context = SdkGetContext(Object, FILTER_CONTEXT); Checked = INDEXTOSTATEIMAGEMASK(CHECKED); Unchecked = INDEXTOSTATEIMAGEMASK(UNCHECKED); Parent = TreeView_GetParent(hWndTree, hItem); if (IS_CHECKED(NewState) && IS_UNCHECKED(OldState)) { if (Parent != NULL) { Item.mask = TVIF_PARAM; Item.hItem = Parent; TreeView_GetItem(hWndTree, &Item); Node = (PFILTER_NODE)Item.lParam; Filter = Node->Filter; Node->NumberOfSelected += 1; Context->NumberOfSelected += 1; if (Node->NumberOfSelected == Filter->ProbesCount) { TreeView_SetCheckState(hWndTree, Parent, TRUE); } // // Get tree item text and insert into list control // Item.mask = TVIF_TEXT; Item.hItem = hItem; Item.pszText = Buffer; Item.cchTextMax = MAX_PATH; TreeView_GetItem(hWndTree, &Item); FilterInsertListItem(hWnd, hWndTree, Node, hItem, Buffer, TRUE); LoadString(SdkInstance, IDS_FILTER_SELECT, Format, MAX_PATH); StringCchPrintf(Buffer, MAX_PATH, Format, Context->NumberOfSelected); SetWindowText(GetDlgItem(hWnd, IDC_STATIC), Buffer); } else { Node = (PFILTER_NODE)Param; Filter = Node->Filter; if (Node->NumberOfSelected != Filter->ProbesCount) { FilterCheckChildren(hWnd, Context, Node, hWndTree, hItem, TRUE); } } } if (IS_UNCHECKED(NewState) && IS_CHECKED(OldState)) { if (Parent != NULL) { Item.mask = TVIF_PARAM; Item.hItem = Parent; TreeView_GetItem(hWndTree, &Item); Node = (PFILTER_NODE)Item.lParam; Node->NumberOfSelected -= 1; Context->NumberOfSelected -= 1; // // N.B. Parent node is checked only if all children are checked // so whenever a child is unchecked, we need uncheck its parent node. // TreeView_SetCheckState(hWndTree, Parent, FALSE); // // Delete item in list control // FilterInsertListItem(hWnd, hWndTree, Node, hItem, NULL, FALSE); LoadString(SdkInstance, IDS_FILTER_SELECT, Format, MAX_PATH); StringCchPrintf(Buffer, MAX_PATH, Format, Context->NumberOfSelected); SetWindowText(GetDlgItem(hWnd, IDC_STATIC), Buffer); } else { Node = (PFILTER_NODE)Param; Filter = Node->Filter; // // N.B. This can happen only if initially all children are checked, // user then uncheck the parent node, if the user unchecked a child // node, the NumberOfSelected would be (Filter->ProbesCount - 1) // if (Node->NumberOfSelected == Filter->ProbesCount) { FilterCheckChildren(hWnd, Context, Node, hWndTree, hItem, FALSE); } } } TreeView_SelectItem(hWndTree, hItem); return 0; }
ULONG FilterInsertProbe( IN PDIALOG_OBJECT Object, IN HWND hWndTree, IN HTREEITEM hTreeItem, IN PFILTER_NODE Node ) { ULONG i; HWND hWndList; WCHAR ApiName[MAX_PATH]; WCHAR Buffer[MAX_PATH]; TVINSERTSTRUCT Item = {0}; LVITEM ListItem = {0}; HTREEITEM hInserted; PBTR_FILTER Filter; PFILTER_CONTEXT Context; BOOLEAN SetBit; Context = SdkGetContext(Object, FILTER_CONTEXT); hWndList = GetDlgItem(Object->hWnd, IDC_LIST_FILTER); Filter = Node->Filter; hInserted = hTreeItem; for (i = 0; i < Filter->ProbesCount; i++) { Item.hParent = hTreeItem; Item.hInsertAfter = hInserted; Item.item.mask = TVIF_TEXT | TVIF_PARAM; // // Build item name as "DllName!ApiName" format // BspUnDecorateSymbolName(Filter->Probes[i].ApiName, ApiName, MAX_PATH, UNDNAME_COMPLETE); //StringCchCopy(ApiName, MAX_PATH, Filter->Probes[i].ApiName); if (Filter->Probes[i].DllName) { StringCchPrintf(Buffer, MAX_PATH, L"%s!%s", _wcslwr(Filter->Probes[i].DllName), ApiName); } else { StringCchPrintf(Buffer, MAX_PATH, L"*!%s", ApiName); } SetBit = BtrTestBit(&Filter->BitMap, i); Item.item.lParam = (LPARAM)SetBit; Item.item.pszText = Buffer; // // Test whether it's an activated probe // hInserted = TreeView_InsertItem(hWndTree, &Item); if (SetBit) { if (BspIsVistaAbove()) { TreeView_SetCheckState(hWndTree, hInserted, TRUE); } else { PostMessage(GetParent(hWndTree), WM_TVN_CHECKITEM, (WPARAM)hInserted, 0); } } } return 0; }
/** * Unchecks the tree item */ void CTreeItem::uncheck() { TreeView_SetCheckState(tree->getHandle(), handle, FALSE); }
/** * Checks this tree item */ void CTreeItem::check() { TreeView_SetCheckState(tree->getHandle(), handle, TRUE); }
//----------------------------------------------------------------------------- // ExcludePathsDlg_SetCheckStateLinked_r // // Propogate the check state to all "mod path" children that match the specified name. // A NULL name matches all. //----------------------------------------------------------------------------- void ExcludePathsDlg_SetCheckStateLinked_r( HWND hWndTree, HTREEITEM hTree, int depth, int checkState, const char *pName ) { if ( !hTree ) { return; } char szNodeName[MAX_PATH]; TVITEM tvi = { 0 }; tvi.mask = TVIF_HANDLE | TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM; tvi.hItem = hTree; tvi.pszText = szNodeName; tvi.cchTextMax = sizeof( szNodeName ); if ( TreeView_GetItem( hWndTree, &tvi ) ) { bool bIsModPath = HIWORD( tvi.lParam ) != 0; if ( bIsModPath && ( !pName || !V_stricmp( szNodeName, pName ) ) ) { TreeView_SetCheckState( hWndTree, hTree, ( checkState == 1 ) ); } if ( tvi.cChildren ) { HTREEITEM hChild = TreeView_GetChild( hWndTree, hTree ); if ( hChild ) { ExcludePathsDlg_SetCheckStateLinked_r( hWndTree, hChild, depth+1, checkState, pName ); } } } else { return; } if ( !depth ) { // only iterate siblings of the parent's child return; } HTREEITEM hSibling = hTree; while ( 1 ) { hSibling = TreeView_GetNextSibling( hWndTree, hSibling ); if ( !hSibling ) { return; } tvi.hItem = hSibling; if ( TreeView_GetItem( hWndTree, &tvi ) ) { bool bIsModPath = HIWORD( tvi.lParam ) != 0; if ( bIsModPath && ( !pName || !V_stricmp( szNodeName, pName ) ) ) { TreeView_SetCheckState( hWndTree, hSibling, ( checkState == 1 ) ); } if ( tvi.cChildren ) { HTREEITEM hChild = TreeView_GetChild( hWndTree, hSibling ); if ( hChild ) { ExcludePathsDlg_SetCheckStateLinked_r( hWndTree, hChild, depth+1, checkState, pName ); } } } } }
INT_PTR CALLBACK DlgProcToolBar(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HTREEITEM hti; switch (uMsg) { case WM_INITDIALOG: hToolBarTree = GetDlgItem(hwndDlg, IDC_TOOLBARTREE); { LONG_PTR style = GetWindowLongPtr(hToolBarTree, GWL_STYLE); style ^= TVS_CHECKBOXES; SetWindowLongPtr(hToolBarTree, GWL_STYLE, style); style |= TVS_CHECKBOXES; style |= TVS_NOHSCROLL; SetWindowLongPtr(hToolBarTree, GWL_STYLE, style); } { mir_cslock lck(ToolBarCS); BuildMenuObjectsTree(hToolBarTree); } Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, FALSE); SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETPOS, 0, MAKELONG(PluginConfig.g_iButtonsBarGap, 0)); TranslateDialogDefault(hwndDlg); bOptionsInit = FALSE; break; case WM_LBUTTONUP: if (drag) { TreeView_SetInsertMark(hToolBarTree, NULL, 0); drag = 0; ReleaseCapture(); TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(hToolBarTree, &hti.pt); hti.pt.y -= TreeView_GetItemHeight(hToolBarTree) / 2; TreeView_HitTest(hToolBarTree, &hti); if (hDragItem == hti.hItem) break; if (hti.flags & TVHT_ABOVE) hti.hItem = TVI_FIRST; TVITEM tvi; tvi.mask = TVIF_HANDLE | TVIF_PARAM; tvi.hItem = (HTREEITEM)hDragItem; TreeView_GetItem(hToolBarTree, &tvi); if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT) || (hti.hItem == TVI_FIRST)) { TVINSERTSTRUCT tvis; TCHAR strbuf[128]; tvis.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; tvis.item.stateMask = 0xFFFFFFFF; tvis.item.pszText = strbuf; tvis.item.cchTextMax = sizeof(strbuf); tvis.item.hItem = (HTREEITEM)hDragItem; TreeView_GetItem(hToolBarTree, &tvis.item); TreeView_DeleteItem(hToolBarTree, hDragItem); tvis.hParent = NULL; tvis.hInsertAfter = hti.hItem; TreeView_SelectItem(hToolBarTree, TreeView_InsertItem(hToolBarTree, &tvis)); SendMessage((GetParent(hwndDlg)), PSM_CHANGED, 0, 0); } } break; case WM_MOUSEMOVE: if (drag) { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(hToolBarTree, &hti.pt); TreeView_HitTest(hToolBarTree, &hti); if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT)) { HTREEITEM it = hti.hItem; hti.pt.y -= TreeView_GetItemHeight(hToolBarTree) / 2; TreeView_HitTest(hToolBarTree, &hti); if (!(hti.flags & TVHT_ABOVE)) TreeView_SetInsertMark(hToolBarTree, hti.hItem, 1); else TreeView_SetInsertMark(hToolBarTree, it, 0); } else { if (hti.flags & TVHT_ABOVE) SendMessage(hToolBarTree, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); if (hti.flags & TVHT_BELOW) SendMessage(hToolBarTree, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); TreeView_SetInsertMark(hToolBarTree, NULL, 0); } } break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED && GetFocus() == (HWND)lParam && (HWND)lParam != hToolBarTree) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); if ((HIWORD(wParam) == EN_CHANGE) && ((HWND)lParam == GetFocus())) if (!bOptionsInit) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); switch (LOWORD(wParam)) { case IDC_BBRESET: CallService(MS_DB_MODULE_DELETE, NULL, LPARAM("TabSRMM_Toolbar")); CB_HardReInit(); BuildMenuObjectsTree(hToolBarTree); break; case IDC_SEPARATOR: hti = TreeView_GetSelection(hToolBarTree); if (!hti) hti = TVI_FIRST; CustomButtonData *cbd = new CustomButtonData(); cbd->bSeparator = cbd->bHidden = cbd->bIMButton = cbd->bLSided = true; cbd->dwButtonOrigID = ++dwSepCount; cbd->pszModuleName = "Tabsrmm_sep"; cbd->iButtonWidth = 22; cbd->opFlags = BBSF_NTBDESTRUCT; LButtonsList.insert(cbd); TVINSERTSTRUCT tvis; tvis.hParent = NULL; tvis.hInsertAfter = hti; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvis.item.pszText = TranslateT("<Separator>"); tvis.item.iImage = tvis.item.iSelectedImage = -1; tvis.item.lParam = (LPARAM)cbd; hti = TreeView_InsertItem(hToolBarTree, &tvis); TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_RESET: CB_ReInitCustomButtons(); dwSepCount = M.GetDword("TabSRMM_Toolbar", "SeparatorsCount", 0); return 1; case PSN_APPLY: hti = TreeView_GetSelection(hToolBarTree); if (hti) { TVITEM tvi; tvi.mask = TVIF_HANDLE | TVIF_PARAM; tvi.hItem = hti; TreeView_GetItem(hToolBarTree, &tvi); if (tvi.lParam) { CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; if (cbd) { cbd->bIMButton = IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) != 0; cbd->bChatButton = IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) != 0; cbd->bCanBeHidden = IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) != 0; } } } SaveTree(hToolBarTree); CB_ReInitCustomButtons(); PluginConfig.g_iButtonsBarGap = (BYTE)SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_GETPOS, 0, 0); if (PluginConfig.g_iButtonsBarGap != M.GetByte("ButtonsBarGap", 1)) M.BroadcastMessageAsync(WM_SIZE, 0, 0); db_set_b(0, SRMSGMOD_T, "ButtonsBarGap", PluginConfig.g_iButtonsBarGap); BuildMenuObjectsTree((HWND)hToolBarTree); Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, FALSE); return 1; } break; case IDC_TOOLBARTREE: switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAGA: case TVN_BEGINDRAGW: SetCapture(hwndDlg); drag = 1; hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; TreeView_SelectItem(hToolBarTree, hDragItem); break; case TVN_SELCHANGINGA: case TVN_SELCHANGINGW: hti = TreeView_GetSelection(hToolBarTree); if (hti != NULL) { TCHAR strbuf[128]; TVITEM tvi; tvi.hItem = hti; tvi.pszText = strbuf; tvi.cchTextMax = sizeof(strbuf); tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(hToolBarTree, &tvi); if (tvi.lParam == 0 || !TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(tvi.pszText, MIDDLE_SEPARATOR)) break; CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; if (cbd) { cbd->opFlags = (IsDlgButtonChecked(hwndDlg, IDC_IMCHECK)) ? BBSF_IMBUTTON : 0; cbd->opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK)) ? BBSF_CHATBUTTON : 0; cbd->opFlags |= (IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN)) ? BBSF_CANBEHIDDEN : 0; cbd->bIMButton = (IsDlgButtonChecked(hwndDlg, IDC_IMCHECK) ? TRUE : FALSE); cbd->bChatButton = (IsDlgButtonChecked(hwndDlg, IDC_CHATCHECK) ? TRUE : FALSE); cbd->bCanBeHidden = (IsDlgButtonChecked(hwndDlg, IDC_CANBEHIDDEN) ? TRUE : FALSE); } } break; case TVN_SELCHANGEDW: case TVN_SELCHANGEDA: hti = TreeView_GetSelection(hToolBarTree); if (hti != NULL) { TCHAR strbuf[128]; TVITEM tvi; tvi.pszText = strbuf; tvi.cchTextMax = sizeof(strbuf); tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_PARAM; tvi.hItem = hti; TreeView_GetItem(hToolBarTree, &tvi); if (!TreeView_GetCheckState(hToolBarTree, tvi.hItem) || !_tcscmp(tvi.pszText, MIDDLE_SEPARATOR)) { Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, FALSE); break; } if (tvi.lParam == 0) break; CustomButtonData *cbd = (CustomButtonData*)tvi.lParam; if (cbd) { Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, TRUE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, TRUE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, TRUE); CheckDlgButton(hwndDlg, IDC_IMCHECK, (cbd->bIMButton) ? 1 : 0); CheckDlgButton(hwndDlg, IDC_CHATCHECK, (cbd->bChatButton) ? 1 : 0); CheckDlgButton(hwndDlg, IDC_CANBEHIDDEN, (cbd->bCanBeHidden) ? 1 : 0); } } break; case NM_CLICK: TVHITTESTINFO hti = { 0 }; GetCursorPos(&hti.pt); ScreenToClient(hToolBarTree, &hti.pt); if (TreeView_HitTest(hToolBarTree, &hti)) { if (hti.flags&TVHT_ONITEMSTATEICON) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); if (TreeView_GetCheckState(hToolBarTree, hti.hItem)) { Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, FALSE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, FALSE); CheckDlgButton(hwndDlg, IDC_IMCHECK, 1); } else { Utils::enableDlgControl(hwndDlg, IDC_IMCHECK, TRUE); Utils::enableDlgControl(hwndDlg, IDC_CHATCHECK, TRUE); Utils::enableDlgControl(hwndDlg, IDC_CANBEHIDDEN, TRUE); } TreeView_SelectItem(hToolBarTree, hti.hItem); } } } } break; case WM_DESTROY: HIMAGELIST hIml = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TOOLBARTREE), TVSIL_NORMAL); ImageList_Destroy(hIml); hIml = TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_TOOLBARTREE), TVSIL_STATE); ImageList_Destroy(hIml); break; } return FALSE; }
static int BuildMenuObjectsTree(HWND hToolBarTree) { HTREEITEM hti; int iImage = 0; TVINSERTSTRUCT tvis; tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_IMAGE; TreeView_DeleteAllItems(hToolBarTree); himgl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); ImageList_AddIcon(himgl, LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); ImageList_Destroy(TreeView_GetImageList(hToolBarTree, TVSIL_NORMAL)); TreeView_SetImageList(hToolBarTree, himgl, TVSIL_NORMAL); if ((RButtonsList.getCount() + LButtonsList.getCount()) == 0) return FALSE; mir_cslock lck(ToolBarCS); for (int i = 0; i < LButtonsList.getCount(); i++) { CustomButtonData *cbd = LButtonsList[i]; tvis.item.lParam = (LPARAM)cbd; if (cbd->bSeparator) { tvis.item.pszText = TranslateT("<Separator>"); tvis.item.iImage = tvis.item.iSelectedImage = 0; } else { tvis.item.pszText = TranslateTS(cbd->ptszTooltip); iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->hIcon)); tvis.item.iImage = tvis.item.iSelectedImage = iImage; } cbd->opFlags = 0; hti = TreeView_InsertItem(hToolBarTree, &tvis); TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); } tvis.item.lParam = 0; tvis.item.mask |= TVIF_STATE; tvis.item.pszText = MIDDLE_SEPARATOR; tvis.item.stateMask = TVIS_BOLD; tvis.item.state = TVIS_BOLD; tvis.item.iImage = tvis.item.iSelectedImage = -1; hti = TreeView_InsertItem(hToolBarTree, &tvis); TreeView_SetCheckState(hToolBarTree, hti, 1); for (int i = RButtonsList.getCount()-1; i >= 0; i--) { CustomButtonData *cbd = RButtonsList[i]; tvis.item.lParam = (LPARAM)cbd; if (cbd->bSeparator) { tvis.item.pszText = TranslateT("<Separator>"); tvis.item.iImage = tvis.item.iSelectedImage = -1; } else { tvis.item.pszText = TranslateTS(cbd->ptszTooltip); iImage = ImageList_AddIcon(himgl, Skin_GetIconByHandle(cbd->hIcon)); tvis.item.iImage = tvis.item.iSelectedImage = iImage; } tvis.item.state = 0; cbd->opFlags = 0; hti = TreeView_InsertItem(hToolBarTree, &tvis); TreeView_SetCheckState(hToolBarTree, hti, (cbd->bIMButton || cbd->bChatButton)); } return 1; }