private { import std.path; import std.file; import std.utf; import basewindow; import resource; import config; import entry_interface; import entry; import shgetfileinfo; import vector; } class TabSettingDialog : Dialog { private: tab_setting* setting; public: this(tab_setting* _setting) { super(IDD_TABSETTING); setting = _setting; } extern(Windows) uint WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CHECK_OVERRIDESETTING: if (HIWORD(wParam) == BN_CLICKED) { OnOverrideSettingClicked(hWnd, cast(HWND)lParam); } break; case IDC_EDIT_TRANSPARENCY: if (HIWORD(wParam) == EN_UPDATE) { OnEditTransparentChanged(hWnd, cast(HWND)lParam); } break; default: return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } break; case WM_HSCROLL: int transparency = SendMessage(cast(HWND)lParam, 0x0400, 0, 0); SetDlgItemInt(hWnd, IDC_EDIT_TRANSPARENCY, transparency, FALSE); break; default: return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } return TRUE; } BOOL OnOverrideSettingClicked(HWND hDlg, HWND hCheck) { HRESULT state = SendMessage(hCheck, BM_GETCHECK, 0, 0); if (state == BST_CHECKED) { for (uint i = IDC_STATIC_TABACTION; i <= IDC_STATIC_ZORDER; i++) { EnableWindow(GetDlgItem(hDlg, i), TRUE); } } else { for (uint i = IDC_STATIC_TABACTION; i <= IDC_STATIC_ZORDER; i++) { EnableWindow(GetDlgItem(hDlg, i), FALSE); } } return TRUE; } BOOL OnEditTransparentChanged(HWND hDlg, HWND hEdit) { HRESULT transparency = GetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, NULL, TRUE); if (transparency < 0) { transparency = 0; SetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, 0, FALSE); } if (transparency > 255) { transparency = 255; SetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, 255, FALSE); } SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENCY), 0x0405, TRUE, transparency); return TRUE; } void OnInitDialog(HWND hDlg) { SetDlgItemText(hDlg, IDC_EDIT_TABNAME, toUTF16z(setting.name)); foreach (char[] group_file; listdir(Config.GetInstance.GetGroupFullPath)) { SendMessage(GetDlgItem(hDlg, IDC_COMBO_GROUP), CB_ADDSTRING, 0, cast(LPARAM)toUTF16z(group_file)); } SetDlgItemText(hDlg, IDC_COMBO_GROUP, toUTF16z(setting.group_name)); SendMessage(GetDlgItem(hDlg, IDC_CHECK_OVERRIDESETTING), BM_SETCHECK, setting.override_action ? BST_CHECKED : BST_UNCHECKED, 0); if (setting.override_action) { for (uint i = IDC_STATIC_TABACTION; i <= IDC_STATIC_ZORDER; i++) { EnableWindow(GetDlgItem(hDlg, i), TRUE); } } char[] skin_path = Config.GetInstance.GetSkinFullPath(); foreach (char[] skin_name; listdir(skin_path)) { if (exists(skin_path ~ "\\" ~ skin_name ~ "\\skin.ini")) { SendMessage(GetDlgItem(hDlg, IDC_COMBO_SKINNAME), CB_ADDSTRING, 0, cast(LPARAM)toUTF16z(skin_name)); } } SetDlgItemText(hDlg, IDC_COMBO_SKINNAME, toUTF16z(setting.action.skin_name)); SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENCY), 0x0406, TRUE, MAKELONG(0, 255)); SetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, setting.action.transparency, FALSE); SetDlgItemInt(hDlg, IDC_EDIT_OPENWAIT, setting.action.open_wait, FALSE); SetDlgItemInt(hDlg, IDC_EDIT_CLOSEWAIT, setting.action.close_wait, FALSE); SendMessage(GetDlgItem(hDlg, IDC_CHECK_ANIMATION), BM_SETCHECK, (setting.action.animation ? BST_CHECKED : BST_UNCHECKED), 0); SendMessage(GetDlgItem(hDlg, IDC_CHECK_LOCK), BM_SETCHECK, (setting.action.lock ? BST_CHECKED : BST_UNCHECKED), 0); CheckRadioButton(hDlg, IDC_RADIO_ZORDER_NOCHANGE, IDC_RADIO_ZORDER_ALWAYSONTOP, IDC_RADIO_ZORDER_NOCHANGE + setting.action.z_order); } void OnOK(HWND hDlg) { wchar[] buffer = new wchar[MAX_PATH]; int len; HRESULT check_state; len = GetDlgItemText(hDlg, IDC_EDIT_TABNAME, buffer.ptr, MAX_PATH); setting.name = toUTF8(buffer[0..len]); len = GetDlgItemText(hDlg, IDC_COMBO_GROUP, buffer.ptr, MAX_PATH); setting.group_name = toUTF8(buffer[0..len]); check_state = SendMessage(GetDlgItem(hDlg, IDC_CHECK_OVERRIDESETTING), BM_GETCHECK, 0, 0); setting.override_action = (check_state == BST_CHECKED ? true : false); if (setting.override_action) { len = GetDlgItemText(hDlg, IDC_COMBO_SKINNAME, buffer.ptr, MAX_PATH); setting.action.skin_name = toUTF8(buffer[0..len]); setting.action.transparency = GetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, NULL, FALSE); setting.action.open_wait = GetDlgItemInt(hDlg, IDC_EDIT_OPENWAIT, NULL, FALSE); setting.action.close_wait = GetDlgItemInt(hDlg, IDC_EDIT_CLOSEWAIT, NULL, FALSE); setting.action.animation = (IsDlgButtonChecked(hDlg, IDC_CHECK_ANIMATION) == BST_CHECKED ? true : false); setting.action.lock = (IsDlgButtonChecked(hDlg, IDC_CHECK_LOCK) == BST_CHECKED ? true : false); for (int i = 0; i < 3; i++) { if (IsDlgButtonChecked(hDlg, IDC_RADIO_ZORDER_NOCHANGE + i) == BST_CHECKED) { setting.action.z_order = i; break; } } } else { setting.action = Config.GetInstance.common; } EndDialog(hDlg, IDOK); } } /* class CreateTabDialog : Dialog { private: tab_setting* setting; public: this(tab_setting* setting) { super(IDD_CREATETAB); this.setting = setting; } extern(Windows) uint WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_OVERRIDE: if (HIWORD(wParam) == BN_CLICKED) { HWND hItem = cast(HWND)lParam; HRESULT state = SendMessage(hItem, BM_GETCHECK, 0, 0); if (state == BST_CHECKED) { EnableWindow(GetDlgItem(hWnd, IDB_TABSETTING), TRUE); } else { EnableWindow(GetDlgItem(hWnd, IDB_TABSETTING), FALSE); } } break; case IDB_TABSETTING: if (HIWORD(wParam) == BN_CLICKED) { TabActionDialog dlg = new TabActionDialog(&(setting.action)); dlg.CreateModal(hWnd); } break; default: return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } break; default: return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } return TRUE; } void OnInitDialog(HWND hDlg) { foreach (char[] item; listdir(Config.GetInstance().GetGroupFullPath)) { SendMessage(GetDlgItem(hDlg, IDC_GROUP), CB_ADDSTRING, 0, cast(LPARAM) toUTF16z(item)); } } void OnOK(HWND hDlg) { // wchar[] name = new wchar[128]; int len = GetDlgItemText(hDlg, IDE_TABNAME, name.ptr, 128); if (len != 0) { setting.name = toUTF8(name[0..len]); } else { MessageBox(hDlg, toUTF16z("Name is empty."), toUTF16z("Error"), MB_OK); return; // assert(0); } // len = GetDlgItemText(hDlg, IDC_GROUP, name.ptr, 128); if (len != 0) { setting.group_name = toUTF8(name[0..len]); } else { MessageBox(hDlg, toUTF16z("Group is empty."), toUTF16z("Error"), MB_OK); return; // assert(0); } // int checked = SendMessage(GetDlgItem(hDlg, IDC_OVERRIDE), BM_GETCHECK, 0, 0); if (checked == BST_CHECKED) { setting.override_action = true; } else { setting.override_action = false; } // EndDialog(hDlg, IDOK); } } class TabActionDialog : Dialog { private: tab_action* action; public: this(tab_action* _action) { action = _action; super(IDD_TABACTION); } extern(Windows) uint WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HSCROLL) { int transparency = SendMessage(cast(HWND)lParam, 0x0400, 0, 0); SetDlgItemInt(hWnd, IDC_EDIT_TRANSPARENCY, transparency, FALSE); return TRUE; } return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } void OnInitDialog(HWND hDlg) { // コントロールの設定 SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENCY), 0x0406, TRUE, MAKELONG(0, 255)); // 既存の設定値 char[] skin_path = Config.GetInstance().GetSkinFullPath(); foreach (char[] item; std.file.listdir(skin_path)) { if (exists(skin_path ~ "\\" ~ item ~ "\\skin.ini")) SendMessage(GetDlgItem(hDlg, IDC_COMBO_SKINNAME), CB_ADDSTRING, 0, cast(LPARAM) toUTF16z(item)); } SetDlgItemText(hDlg, IDC_COMBO_SKINNAME, toUTF16z(action.skin_name)); SetDlgItemInt(hDlg, IDC_EDIT_CLOSEWAIT, action.close_wait, FALSE); SetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, action.transparency, FALSE); SendMessage(GetDlgItem(hDlg, IDC_CHECK_ANIMATION), BM_SETCHECK, cast(WPARAM)(action.animation ? BST_CHECKED : BST_UNCHECKED), 0); SendMessage(GetDlgItem(hDlg, IDC_CHECK_LOCK), BM_SETCHECK, cast(WPARAM)(action.lock ? BST_CHECKED : BST_UNCHECKED), 0); SendMessage(GetDlgItem(hDlg, IDC_SLIDER_TRANSPARENCY), 0x405, TRUE, action.transparency); CheckRadioButton(hDlg, IDC_RADIO_ALWAYSONTOP, IDC_RADIO_NOCHANGE, IDC_RADIO_NOCHANGE - action.z_order); } void OnOK(HWND hDlg) { wchar[] skin_name = new wchar[128]; int len = GetDlgItemText(hDlg, IDC_COMBO_SKINNAME, skin_name.ptr, 128); action.skin_name = toUTF8(skin_name[0..len]); action.close_wait = GetDlgItemInt(hDlg, IDC_EDIT_CLOSEWAIT, NULL, FALSE); action.transparency = GetDlgItemInt(hDlg, IDC_EDIT_TRANSPARENCY, NULL, FALSE); int flag; flag = SendMessage(GetDlgItem(hDlg, IDC_CHECK_ANIMATION), BM_GETCHECK, 0, 0); if (flag == BST_CHECKED) { action.animation = true; } else { action.animation = false; } flag = SendMessage(GetDlgItem(hDlg, IDC_CHECK_LOCK), BM_GETCHECK, 0, 0); if (flag == BST_CHECKED) { action.lock = true; } else { action.lock = false; } for (int i = 0; i < 3; i++) { flag = SendMessage(GetDlgItem(hDlg, IDC_RADIO_ALWAYSONTOP + i), BM_GETCHECK, 0, 0); if (flag == BST_CHECKED) { action.z_order = 2 - i; break; } } // EndDialog(hDlg, IDOK); } } */ struct ENTRY_PROTOTYPE { bool removed; uint type; char[] name; char[] execfile, execpath, execparams; char[] iconfile; int iconindex; } alias Vector!(ENTRY_PROTOTYPE*) ENTRY_PROTOTYPE_LIST; class TabEntriesDialog : Dialog { private: Entry* entry; ENTRY_PROTOTYPE_LIST entry_list; public: this (Entry* _entry) { entry = _entry; super(IDD_TABENTRIES); entry_list = new ENTRY_PROTOTYPE_LIST; for (int i = 0; i < entry.GetChildren().size(); i++) { ENTRY_PROTOTYPE* ept = new ENTRY_PROTOTYPE; ept.type = entry.GetChildren()[i].Type; ept.name = entry.GetChildren()[i].Name; ept.execfile = entry.GetChildren()[i].ExecFile; ept.execpath = entry.GetChildren()[i].ExecPath; ept.execparams = entry.GetChildren()[i].ExecParams; ept.iconfile = entry.GetChildren()[i].IconFile; ept.iconindex = entry.GetChildren()[i].IconIndex; entry_list.add(ept); } } extern(Windows) uint WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_COMMAND) { switch (LOWORD(wParam)) { case IDC_LIST_ENTRY: if (HIWORD(wParam) == LBN_SELCHANGE) { OnCommandListBoxSelChange(hWnd, cast(HWND)lParam); } break; case IDC_EDIT_NAME: case IDC_EDIT_EXECFILE: case IDC_EDIT_EXECPATH: case IDC_EDIT_EXECPARAMS: case IDC_EDIT_ICONFILE: case IDC_EDIT_ICONINDEX: if (HIWORD(wParam) == EN_UPDATE) { OnEditChanged(hWnd, cast(HWND)lParam, LOWORD(wParam)); } break; case IDC_BUTTON_EXECFILE: OnButtonExecFile(hWnd); break; case IDC_BUTTON_EXECPATH: OnButtonExecPath(hWnd); break; case IDC_BUTTON_ICONFILE: OnButtonIconFile(hWnd); break; case IDC_BUTTON_DRAWICON: OnButtonDrawIcon(hWnd); break; case IDC_BUTTON_ADDNEWENTRY: OnButtonAddNewEntry(hWnd); break; case IDC_BUTTON_DELETEENTRY: OnButtonDeleteEntry(hWnd); break; case IDC_RADIO_GROUP: case IDC_RADIO_ITEM: if (HIWORD(wParam) == BN_CLICKED) { OnEntryTypeClicked(hWnd, cast(HWND)lParam, LOWORD(wParam)); } break; default: } } return Dialog.WindowProc(hWnd, uMsg, wParam, lParam); } void OnEditNameChange(HWND hDlg, HWND hEditWnd) { HWND hListWnd = GetDlgItem(hDlg, IDC_LIST_ENTRY); wchar[] buffer = new wchar[128]; int lbindex = SendMessage(hListWnd, LB_GETCURSEL, 0, 0); if (lbindex != LB_ERR) { int index = SendMessage(hListWnd, LB_GETITEMDATA, lbindex, 0); int len = GetDlgItemText(hDlg, IDC_EDIT_NAME, buffer.ptr, 128); entry_list[index].name = toUTF8(buffer[0..len]); } } void OnEditChanged(HWND hDlg, HWND hEditWnd, uint ControlID) { HWND hListWnd = GetDlgItem(hDlg, IDC_LIST_ENTRY); wchar[] buffer = new wchar[128]; int lbindex = SendMessage(hListWnd, LB_GETCURSEL, 0, 0); if (lbindex != LB_ERR) { int index = SendMessage(hListWnd, LB_GETITEMDATA, lbindex, 0); int len = GetDlgItemText(hDlg, ControlID, buffer.ptr, 128); switch (ControlID) { case IDC_EDIT_NAME: entry_list[index].name = toUTF8(buffer[0..len]); break; case IDC_EDIT_EXECFILE: entry_list[index].execfile = toUTF8(buffer[0..len]); break; case IDC_EDIT_EXECPATH: entry_list[index].execpath = toUTF8(buffer[0..len]); break; case IDC_EDIT_EXECPARAMS: entry_list[index].execparams = toUTF8(buffer[0..len]); break; case IDC_EDIT_ICONFILE: entry_list[index].iconfile = toUTF8(buffer[0..len]); break; case IDC_EDIT_ICONINDEX: entry_list[index].iconindex = GetDlgItemInt(hDlg, IDC_EDIT_ICONINDEX, NULL, TRUE); break; default: } } } void OnButtonExecFile(HWND hDlg) { wchar[] filename = new wchar[MAX_PATH]; int len = GetDlgItemText(hDlg, IDC_EDIT_EXECFILE, filename, MAX_PATH); OPENFILENAME ofn; ofn.lStructSize = OPENFILENAME.sizeof; ofn.hwndOwner = hDlg; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = "All Files(*.*)\0*.*\0Executable(*.exe)\0*.exe\0Dynamic Link Library(*.dll)\0*.dll\0Icon(*.ico)\0*.ico\0\0"; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = filename; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = toUTF16z(getDirName(toUTF8(filename[0..len]))); ofn.lpstrTitle = toUTF16z("Select a File"); ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = toUTF16z("exe"); ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName(&ofn) != 0) { SetDlgItemText(hDlg, IDC_EDIT_EXECFILE, filename); len = GetDlgItemText(hDlg, IDC_EDIT_EXECFILE, filename.ptr, MAX_PATH); char[] entry_name = getBaseName(toUTF8(filename[0..len])); entry_name = entry_name[0..length-(getExt(entry_name).length+1)]; SetDlgItemText(hDlg, IDC_EDIT_NAME, toUTF16z(entry_name)); OnButtonDrawIcon(hDlg); } } void OnButtonExecPath(HWND hDlg) { MessageBox(null, toUTF16z("Must write shlobj.h for D..."), toUTF16z("Not Implemented"), MB_OK); } void OnButtonIconFile(HWND hDlg) { wchar[] filename = new wchar[MAX_PATH]; int len = GetDlgItemText(hDlg, IDC_EDIT_ICONFILE, filename, MAX_PATH); OPENFILENAME ofn; ofn.lStructSize = OPENFILENAME.sizeof; ofn.hwndOwner = hDlg; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = "All Files(*.*)\0*.*\0Executable(*.exe)\0*.exe\0Dynamic Link Library(*.dll)\0*.dll\0Icon(*.ico)\0*.ico\0\0"; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = filename; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = toUTF16z(getDirName(toUTF8(filename[0..len]))); ofn.lpstrTitle = toUTF16z("Select a File"); ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = toUTF16z("exe"); ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName(&ofn) != 0) { SetDlgItemText(hDlg, IDC_EDIT_ICONFILE, filename); OnButtonDrawIcon(hDlg); } } void OnInitDialog(HWND hDlg) { HWND list_control = GetDlgItem(hDlg, IDC_LIST_ENTRY); for (int i = 0; i < entry.GetChildren().size(); i++) { int index = SendMessage(list_control, LB_ADDSTRING, 0, cast(LPARAM) toUTF16z(entry.GetChildren()[i].Name)); SendMessage(list_control, LB_SETITEMDATA, index, cast(LPARAM)i); } } void OnButtonDrawIcon(HWND hDlg) { HWND icon_ctrl = GetDlgItem(hDlg, IDC_STATIC_ICON); HDC hdc = GetWindowDC(icon_ctrl); HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255)); RECT rect; GetClientRect(icon_ctrl, &rect); FillRect(hdc, &rect, hBrush); DeleteObject(hBrush); InvalidateRect(icon_ctrl, NULL, TRUE); char[] icon_file; wchar[] buffer = new wchar[MAX_PATH]; int len = GetDlgItemText(hDlg, IDC_EDIT_ICONFILE, buffer.ptr, MAX_PATH); HICON hIcon, hSmallIcon; int idx = GetDlgItemInt(hDlg, IDC_EDIT_ICONINDEX, NULL, TRUE); if (idx > -1) { if (len == 0) { len = GetDlgItemText(hDlg, IDC_EDIT_EXECFILE, buffer.ptr, MAX_PATH); } icon_file = toUTF8(buffer[0..len]); ExtractIconEx(toUTF16z(icon_file), idx, &hIcon, &hSmallIcon, 1); } else { if (len == 0) { len = GetDlgItemText(hDlg, IDC_EDIT_EXECFILE, buffer.ptr, MAX_PATH); } icon_file = toUTF8(buffer[0..len]); hIcon = GetFileIconHandle(icon_file, FALSE); } if (hIcon) { DrawIcon(hdc, 0, 0, hIcon); DestroyIcon(hIcon); if (hSmallIcon) DestroyIcon(hIcon); } ReleaseDC(icon_ctrl, hdc); } BOOL OnCommandListBoxSelChange(HWND hDlg, HWND hListBoxCtrl) { int lbindex = SendMessage(GetDlgItem(hDlg, IDC_LIST_ENTRY), LB_GETCURSEL, 0, 0); if (lbindex != LB_ERR) { int index = SendMessage(GetDlgItem(hDlg, IDC_LIST_ENTRY), LB_GETITEMDATA, lbindex, 0); SetDlgItemText(hDlg, IDC_EDIT_NAME, toUTF16z(entry_list[index].name)); SetDlgItemText(hDlg, IDC_EDIT_EXECFILE, toUTF16z(entry_list[index].execfile)); SetDlgItemText(hDlg, IDC_EDIT_EXECPATH, toUTF16z(entry_list[index].execpath)); SetDlgItemText(hDlg, IDC_EDIT_EXECPARAMS, toUTF16z(entry_list[index].execparams)); SetDlgItemText(hDlg, IDC_EDIT_ICONFILE, toUTF16z(entry_list[index].iconfile)); SetDlgItemInt( hDlg, IDC_EDIT_ICONINDEX, entry_list[index].iconindex, TRUE); if (entry_list[index].type == ENTRY_TYPE.ENTRY_TYPE_GROUP) { CheckRadioButton(hDlg, IDC_RADIO_GROUP, IDC_RADIO_ITEM, IDC_RADIO_GROUP); } else { CheckRadioButton(hDlg, IDC_RADIO_GROUP, IDC_RADIO_ITEM, IDC_RADIO_ITEM); } OnButtonDrawIcon(hDlg); } return TRUE; } void OnButtonDeleteEntry(HWND hDlg) { HWND hListWnd = GetDlgItem(hDlg, IDC_LIST_ENTRY); wchar[] buffer = new wchar[128]; int lbindex = SendMessage(hListWnd, LB_GETCURSEL, 0, 0); if (lbindex != LB_ERR) { int index = SendMessage(hListWnd, LB_GETITEMDATA, lbindex, 0); entry_list[index].removed = true; SendMessage(hListWnd, LB_DELETESTRING, lbindex, 0); } } void OnButtonAddNewEntry(HWND hDlg) { ENTRY_PROTOTYPE* ept = new ENTRY_PROTOTYPE; ept.type = ENTRY_TYPE.ENTRY_TYPE_ITEM; ept.name = "New Entry"; ept.iconindex = -1; entry_list.add(ept); int index = SendMessage(GetDlgItem(hDlg, IDC_LIST_ENTRY), LB_ADDSTRING, 0, cast(LPARAM)toUTF16z(ept.name)); SendMessage(GetDlgItem(hDlg, IDC_LIST_ENTRY), LB_SETITEMDATA, index, cast(LPARAM)(entry_list.size() - 1)); } void OnEntryTypeClicked(HWND hDlg, HWND hControlWnd, uint ControlID) { HWND hListWnd = GetDlgItem(hDlg, IDC_LIST_ENTRY); wchar[] buffer = new wchar[128]; int lbindex = SendMessage(hListWnd, LB_GETCURSEL, 0, 0); if (lbindex != LB_ERR) { int index = SendMessage(hListWnd, LB_GETITEMDATA, lbindex, 0); entry_list[index].type = ControlID - IDC_RADIO_GROUP; } } void OnOK(HWND hDlg) { // Check for (int i = 0; i < entry_list.size(); i++) { if (entry_list[i].name.length == 0 || entry_list[i].execfile.length == 0) { MessageBox(hDlg, toUTF16z("Must set Name or ExecFile"), toUTF16z("Error"), MB_OK); return; } } // Regist entry.GetChildren().clear(); for (int i = 0; i < entry_list.size(); i++) { if (!entry_list[i].removed) { Entry leaf; if (entry_list[i].type == ENTRY_TYPE.ENTRY_TYPE_GROUP) { leaf = new Group; } else { leaf = new Item; } leaf.Name = entry_list[i].name; leaf.ExecFile = entry_list[i].execfile; leaf.ExecPath = entry_list[i].execpath; leaf.ExecParams = entry_list[i].execparams; leaf.IconFile = entry_list[i].iconfile; leaf.IconIndex = entry_list[i].iconindex; entry.Add(leaf); } } EndDialog(hDlg, IDOK); } }