static HWND cfgui_create_config_node_window(HWND hwnd, khui_config_node node) { khui_config_node_reg reg; khm_int32 rv; HWND hw_new; khui_config_node parent; if (KHM_SUCCEEDED(khui_cfg_get_parent(node, &parent))) { HWND hwp; hwp = khui_cfg_get_hwnd(parent); if (hwp == NULL) cfgui_create_config_node_window(hwnd, parent); khui_cfg_release(parent); } rv = khui_cfg_get_reg(node, ®); #ifdef DEBUG assert(KHM_SUCCEEDED(rv)); #endif hw_new = CreateDialogParam(reg.h_module, reg.dlg_template, hwnd, reg.dlg_proc, (LPARAM) node); #ifdef DEBUG assert(hw_new); #endif khui_cfg_set_hwnd(node, hw_new); return hw_new; }
static void show_tab_panel(HWND hwnd, khui_config_node node, HWND hw_tab, int idx, BOOL show) { TCITEM tci; HWND hw; HWND hw_target; HWND hw_firstctl; RECT r; RECT rref; khui_config_node_reg reg; ZeroMemory(&tci, sizeof(tci)); tci.mask = TCIF_PARAM; TabCtrl_GetItem(hw_tab, idx, &tci); #ifdef DEBUG assert(tci.lParam); #endif khui_cfg_get_reg((khui_config_node) tci.lParam, ®); if (reg.flags & KHUI_CNFLAG_PLURAL) hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, node); else hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); #ifdef DEBUG assert(hw); #endif if (!show) { ShowWindow(hw, SW_HIDE); return; } hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); #ifdef DEBUG assert(hw_target); #endif GetWindowRect(hwnd, &rref); GetWindowRect(hw_target, &r); OffsetRect(&r, -rref.left, -rref.top); SetWindowPos(hw, hw_tab, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW); hw_firstctl = GetNextDlgTabItem(hw, NULL, FALSE); if (hw_firstctl) { SetFocus(hw_firstctl); } }
static void apply_all(HWND hwnd, HWND hw_tab, khui_config_node noderef) { TCITEM tci; HWND hw; khui_config_node_reg reg; int idx; int count; BOOL cont = TRUE; count = TabCtrl_GetItemCount(hw_tab); for (idx = 0; idx < count && cont; idx++) { ZeroMemory(&tci, sizeof(tci)); tci.mask = TCIF_PARAM; TabCtrl_GetItem(hw_tab, idx, &tci); #ifdef DEBUG assert(tci.lParam); #endif khui_cfg_get_reg((khui_config_node) tci.lParam, ®); if (reg.flags & KHUI_CNFLAG_PLURAL) hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, noderef); else hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); #ifdef DEBUG assert(hw); #endif SendMessage(hw, KHUI_WM_CFG_NOTIFY, MAKEWPARAM(0, WMCFG_APPLY), (LPARAM) &cont); } }
static void cfgui_add_node(cfgui_wnd_data * d, HWND hwtv, khui_config_node node, khui_config_node parent, BOOL sorted) { khui_config_node_reg reg; khui_config_node c; wchar_t wbuf[256]; const wchar_t * short_desc; TVINSERTSTRUCT s; HTREEITEM hItem; if (node) { khui_cfg_get_reg(node, ®); short_desc = reg.short_desc; } else { short_desc = wbuf; LoadString(khm_hInstance, IDS_CFG_ROOT_NAME, wbuf, ARRAYLENGTH(wbuf)); reg.flags = 0; } ZeroMemory(&s, sizeof(s)); s.hParent = (node)? (HTREEITEM) khui_cfg_get_param(parent): TVI_ROOT; s.hInsertAfter = (sorted)? TVI_SORT: TVI_FIRST; s.itemex.mask = TVIF_CHILDREN | TVIF_PARAM | TVIF_TEXT | TVIF_STATE; { khui_config_node n; if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, &n))) { s.itemex.cChildren = 1; s.itemex.state = TVIS_EXPANDED; s.itemex.stateMask = TVIS_EXPANDED; khui_cfg_release(n); } else { s.itemex.cChildren = 0; s.itemex.state = 0; s.itemex.stateMask = TVIS_EXPANDED; } s.itemex.state |= INDEXTOSTATEIMAGEMASK(d->idx_default); s.itemex.stateMask |= TVIS_STATEIMAGEMASK; } s.itemex.lParam = (LPARAM) node; khui_cfg_hold(node); s.itemex.pszText = (LPWSTR) short_desc; hItem = TreeView_InsertItem(hwtv, &s); khui_cfg_set_param(node, (LPARAM) hItem); if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, &c))) { do { cfgui_add_node(d, hwtv, c, node, !!(reg.flags & KHUI_CNFLAG_SORT_CHILDREN)); } while (KHM_SUCCEEDED(khui_cfg_get_next_release(&c))); } }
static void cfgui_activate_node(HWND hwnd, khui_config_node node) { cfgui_wnd_data * d; HTREEITEM hItem; HWND hw_new; HWND hwtv; d = cfgui_get_wnd_data(hwnd); if (d == NULL) return; hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); hItem = (HTREEITEM) khui_cfg_get_param(node); #ifdef DEBUG assert(hItem); assert(hwtv); #endif if (node == NULL) { hw_new = d->hw_generic_pane; } else { hw_new = khui_cfg_get_hwnd(node); if (hw_new == NULL) { hw_new = cfgui_create_config_node_window(hwnd, node); } } if (hw_new == d->hw_current) return; /* nothing to do */ { RECT r_pane; if (d->hw_current) ShowWindow(d->hw_current, SW_HIDE); GetWindowRect(GetDlgItem(hwnd, IDC_CFG_PANE), &r_pane); MapWindowPoints(HWND_DESKTOP, hwnd, (POINT *) &r_pane, sizeof(r_pane) / sizeof(POINT)); SetWindowPos(hw_new, hwtv, r_pane.left, r_pane.top, r_pane.right - r_pane.left, r_pane.bottom - r_pane.top, SWP_NOOWNERZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE); } if (node == NULL) { wchar_t wbuf[256]; LoadString(khm_hInstance, IDS_CFG_ROOT_TITLE, wbuf, ARRAYLENGTH(wbuf)); SetDlgItemText(hwnd, IDC_CFG_TITLE, wbuf); } else { khm_int32 rv; khui_config_node_reg reg; rv = khui_cfg_get_reg(node, ®); assert(KHM_SUCCEEDED(rv)); SetDlgItemText(hwnd, IDC_CFG_TITLE, reg.long_desc); } d->hw_current = hw_new; d->current = node; TreeView_SelectItem(hwtv, hItem); }
/* Makes sure that each top level configuration node has a corresponding menu item in the 'Options' menu.*/ static void refresh_config_menu_items(void) { khui_menu_def * omenu; khm_boolean refresh_menu = FALSE; khui_config_node cfg_r = NULL; omenu = khui_find_menu(KHUI_MENU_OPTIONS); if (omenu == NULL) { #ifdef DEBUG assert(FALSE); #endif return; } khui_action_lock(); for (khui_cfg_get_first_child(NULL, &cfg_r); cfg_r != NULL; khui_cfg_get_next_release(&cfg_r)) { khm_int32 flags; khui_action * paction; wchar_t cname[KHUI_MAXCCH_NAME]; khm_size cb; flags = khui_cfg_get_flags(cfg_r); if (flags & KHUI_CNFLAG_SYSTEM) continue; cb = sizeof(cname); if (KHM_FAILED(khui_cfg_get_name(cfg_r, cname, &cb))) { #ifdef DEBUG assert(FALSE); #endif continue; } paction = khui_find_named_action(cname); if (!paction) { khm_handle sub; khui_config_node_reg reg; wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; khm_int32 action; khui_cfg_get_reg(cfg_r, ®); kmq_create_hwnd_subscription(khm_hwnd_main, &sub); StringCbCopy(wshort, sizeof(wshort), reg.short_desc); StringCbCat(wshort, sizeof(wshort), L" ..."); action = khui_action_create(cname, wshort, reg.long_desc, (void *) CFGACTION_MAGIC, KHUI_ACTIONTYPE_TRIGGER, sub); if (action == 0) { #ifdef DEBUG assert(FALSE); #endif continue; } khui_menu_insert_action(omenu, (khm_size) -1, action, 0); refresh_menu = TRUE; } } khui_action_unlock(); if (refresh_menu) { khui_refresh_actions(); } }
static void add_subpanels(HWND hwnd, khui_config_node ctx_node, khui_config_node ref_node) { HWND hw_tab; HWND hw_target; khui_config_node sub; khui_config_node_reg reg; khui_config_init_data idata; int idx; hw_tab = GetDlgItem(hwnd, IDC_CFG_TAB); hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); #ifdef DEBUG assert(hw_tab); assert(hw_target); #endif if (KHM_FAILED(khui_cfg_get_first_subpanel(ref_node, &sub))) { #ifdef DEBUG assert(FALSE); #endif return; } idx = 0; while(sub) { HWND hwnd_panel; TCITEM tci; int iid; khui_cfg_get_reg(sub, ®); if ((ctx_node == ref_node && (reg.flags & KHUI_CNFLAG_PLURAL)) || (ctx_node != ref_node && !(reg.flags & KHUI_CNFLAG_PLURAL))) goto _next_node; idata.ctx_node = ctx_node; idata.this_node = sub; idata.ref_node = ref_node; hwnd_panel = CreateDialogParam(reg.h_module, reg.dlg_template, hwnd, reg.dlg_proc, (LPARAM) &idata); #ifdef DEBUG assert(hwnd_panel); #endif ShowWindow(hwnd_panel, SW_HIDE); ZeroMemory(&tci, sizeof(tci)); tci.mask = TCIF_PARAM | TCIF_TEXT; tci.lParam = (LPARAM) sub; tci.pszText = (LPWSTR) reg.short_desc; iid = TabCtrl_InsertItem(hw_tab, 0, &tci); idx++; if (reg.flags & KHUI_CNFLAG_PLURAL) { khui_cfg_set_param_inst(sub, ctx_node, iid); khui_cfg_set_hwnd_inst(sub, ctx_node, hwnd_panel); } else { khui_cfg_set_param(sub, iid); khui_cfg_set_hwnd(sub, hwnd_panel); } _next_node: khui_cfg_get_next_release(&sub); } TabCtrl_SetCurSel(hw_tab, 0); }