From 23be4e61d6876ca2d192fe565af7df52269d8b78 Mon Sep 17 00:00:00 2001 From: henrypp Date: Thu, 1 Aug 2019 14:52:51 +0600 Subject: [PATCH] listview menus cosmetics --- src/main.cpp | 488 ++++++++++++++++++++++++------------------------ src/resource.rc | 17 +- 2 files changed, 250 insertions(+), 255 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2160989c..dafbf1d3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1022,38 +1022,6 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } #endif // _APP_NO_DARKTHEME - case WM_CONTEXTMENU: - { - const UINT ctrl_id = GetDlgCtrlID ((HWND)wparam); - - if (ctrl_id != IDC_APPS_LV) - break; - - const HMENU hmenu = CreateMenu (); - const HMENU hsubmenu = CreateMenu (); - - AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu, L" "); - - AppendMenu (hsubmenu, MF_BYCOMMAND, IDM_CHECK, app.LocaleString (IDS_CHECK, nullptr)); - AppendMenu (hsubmenu, MF_BYCOMMAND, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK, nullptr)); - - if (!SendDlgItemMessage (hwnd, ctrl_id, LVM_GETSELECTEDCOUNT, 0, 0)) - { - EnableMenuItem (hsubmenu, IDM_CHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_UNCHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - } - - POINT pt = {0}; - GetCursorPos (&pt); - - TrackPopupMenuEx (hsubmenu, TPM_RIGHTBUTTON | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, nullptr); - - DestroyMenu (hsubmenu); - DestroyMenu (hmenu); - - break; - } - case WM_NOTIFY: { LPNMHDR nmlp = (LPNMHDR)lparam; @@ -1074,6 +1042,37 @@ INT_PTR CALLBACK EditorProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) return result; } + case NM_RCLICK: + { + LPNMITEMACTIVATE lpnmlv = (LPNMITEMACTIVATE)lparam; + + if (lpnmlv->iItem == -1) + break; + + const UINT listview_id = (UINT)lpnmlv->hdr.idFrom; + + if (listview_id != IDC_APPS_LV) + break; + + const HMENU hmenu = CreateMenu (); + const HMENU hsubmenu = CreateMenu (); + + AppendMenu (hmenu, MF_POPUP, (UINT_PTR)hsubmenu, L" "); + + AppendMenu (hsubmenu, MF_BYCOMMAND, IDM_CHECK, app.LocaleString (IDS_CHECK, nullptr)); + AppendMenu (hsubmenu, MF_BYCOMMAND, IDM_UNCHECK, app.LocaleString (IDS_UNCHECK, nullptr)); + + POINT pt = {0}; + GetCursorPos (&pt); + + TrackPopupMenuEx (hsubmenu, TPM_RIGHTBUTTON | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, nullptr); + + DestroyMenu (hsubmenu); + DestroyMenu (hmenu); + + break; + } + case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lparam; @@ -2952,6 +2951,7 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) const HMENU hmenu = GetMenu (hwnd); app.LocaleMenu (hmenu, IDS_FILE, 0, true, nullptr); + app.LocaleMenu (hmenu, IDS_ADD_FILE, IDM_ADD_FILE, false, L"..."); app.LocaleMenu (hmenu, IDS_SETTINGS, IDM_SETTINGS, false, L"...\tF2"); app.LocaleMenu (GetSubMenu (hmenu, 0), IDS_EXPORT, 2, true, nullptr); app.LocaleMenu (GetSubMenu (hmenu, 0), IDS_IMPORT, 3, true, nullptr); @@ -3529,6 +3529,200 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) break; } + + case NM_RCLICK: + { + LPNMITEMACTIVATE lpnmlv = (LPNMITEMACTIVATE)lparam; + + if (lpnmlv->iItem == -1) + break; + + const UINT listview_id = (UINT)lpnmlv->hdr.idFrom; + + UINT menu_id; + + if (listview_id == IDC_APPS_PROFILE || listview_id == IDC_APPS_SERVICE || listview_id == IDC_APPS_UWP) + menu_id = IDM_APPS; + + else if (listview_id == IDC_RULES_BLOCKLIST || listview_id == IDC_RULES_SYSTEM || listview_id == IDC_RULES_CUSTOM) + menu_id = IDM_RULES; + + else if (listview_id == IDC_NETWORK) + menu_id = IDM_NETWORK; + + else + break; + + const UINT lv_subitem = std::clamp (lpnmlv->iSubItem, 0, (INT)_r_listview_getcolumncount (hwnd, listview_id) - 1); + const size_t hash_item = _r_listview_getitemlparam (hwnd, listview_id, lpnmlv->iItem); + + const HMENU hmenu = LoadMenu (nullptr, MAKEINTRESOURCE (menu_id)); + const HMENU hsubmenu = GetSubMenu (hmenu, 0); + + // localize + app.LocaleMenu (hsubmenu, IDS_DISABLENOTIFICATIONS, IDM_DISABLENOTIFICATIONS, false, nullptr); + app.LocaleMenu (hsubmenu, IDS_DISABLETIMER, IDM_DISABLETIMER, false, nullptr); + app.LocaleMenu (hsubmenu, IDS_EXPLORE, IDM_EXPLORE, false, L"\tCtrl+E"); + app.LocaleMenu (hsubmenu, IDS_COPY, IDM_COPY, false, L"\tCtrl+C"); + app.LocaleMenu (hsubmenu, IDS_COPY, IDM_COPY2, false, _r_fmt (L" \"%s\"\tCtrl+Shift+C", _r_listview_getcolumntext (hwnd, listview_id, lv_subitem).GetString ())); + app.LocaleMenu (hsubmenu, IDS_DELETE, IDM_DELETE, false, L"\tDel"); + app.LocaleMenu (hsubmenu, IDS_CHECK, IDM_CHECK, false, nullptr); + app.LocaleMenu (hsubmenu, IDS_UNCHECK, IDM_UNCHECK, false, nullptr); + app.LocaleMenu (hsubmenu, IDS_NETWORK_CLOSE, IDM_NETWORK_CLOSE, false, nullptr); + + app.LocaleMenu (hsubmenu, menu_id == IDM_RULES ? IDS_ADD : IDS_OPENRULESEDITOR, IDM_OPENRULESEDITOR, false, L"..."); + + if (menu_id == IDM_NETWORK) + app.LocaleMenu (hsubmenu, IDS_SHOWINLIST, IDM_PROPERTIES, false, L"\tEnter"); + else if (menu_id == IDM_RULES) + app.LocaleMenu (hsubmenu, IDS_EDIT2, IDM_PROPERTIES, false, L"...\tEnter"); + else + app.LocaleMenu (hsubmenu, IDS_PROPERTIES, IDM_PROPERTIES, false, L"\tEnter"); + + if (menu_id == IDM_APPS) + { + SetMenuDefaultItem (hsubmenu, IDM_EXPLORE, FALSE); + + const bool is_filtersinstalled = _wfp_isfiltersinstalled (); + const time_t current_time = _r_unixtime_now (); + +#define RULES_ID 0 +#define TIMER_ID 1 + + const HMENU hsubmenu_rules = GetSubMenu (hsubmenu, RULES_ID); + const HMENU hsubmenu_timer = GetSubMenu (hsubmenu, TIMER_ID); + + // set icons + { + static const INT icon_size = GetSystemMetrics (SM_CXSMICON); + + static const HBITMAP hbmp_rules = _app_bitmapfrompng (app.GetHINSTANCE (), MAKEINTRESOURCE (IDP_RULES), icon_size); + static const HBITMAP hbmp_timer = _app_bitmapfrompng (app.GetHINSTANCE (), MAKEINTRESOURCE (IDP_TIMER), icon_size); + + MENUITEMINFO mii = {0}; + + mii.cbSize = sizeof (mii); + mii.fMask = MIIM_BITMAP; + + mii.hbmpItem = hbmp_rules; + SetMenuItemInfo (hsubmenu, RULES_ID, TRUE, &mii); + + mii.hbmpItem = hbmp_timer; + SetMenuItemInfo (hsubmenu, TIMER_ID, TRUE, &mii); + } + + // localize + app.LocaleMenu (hsubmenu, IDS_TRAY_RULES, RULES_ID, true, nullptr); + app.LocaleMenu (hsubmenu, IDS_TIMER, TIMER_ID, true, nullptr); + + // show configuration + PITEM_APP ptr_app = nullptr; + PR_OBJECT ptr_app_object = _app_getappitem (hash_item); + + if (ptr_app_object) + { + ptr_app = (PITEM_APP)ptr_app_object->pdata; + + if (ptr_app) + CheckMenuItem (hsubmenu, IDM_DISABLENOTIFICATIONS, MF_BYCOMMAND | (ptr_app->is_silent ? MF_CHECKED : MF_UNCHECKED)); + } + + // show rules + _app_generate_rulesmenu (hsubmenu_rules, hash_item); + + // show timers + { + bool is_checked = false; + + for (size_t i = 0; i < timers.size (); i++) + { + MENUITEMINFO mii = {0}; + + WCHAR buffer[128] = {0}; + StringCchCopy (buffer, _countof (buffer), _r_fmt_interval (timers.at (i) + 1, 1)); + + mii.cbSize = sizeof (mii); + mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STATE | MIIM_STRING; + mii.fType = MFT_STRING; + mii.dwTypeData = buffer; + mii.fState = MF_ENABLED; + mii.wID = IDX_TIMER + UINT (i); + + InsertMenuItem (hsubmenu_timer, mii.wID, FALSE, &mii); + + if (ptr_app) + { + if (!is_checked && ptr_app->timer > current_time && ptr_app->timer <= (current_time + timers.at (i))) + { + CheckMenuRadioItem (hsubmenu_timer, IDX_TIMER, IDX_TIMER + UINT (timers.size ()), mii.wID, MF_BYCOMMAND); + is_checked = true; + } + } + } + + if (!is_checked) + CheckMenuRadioItem (hsubmenu_timer, IDM_DISABLETIMER, IDM_DISABLETIMER, IDM_DISABLETIMER, MF_BYCOMMAND); + } + + _r_obj_dereference (ptr_app_object, &_app_dereferenceapp); + + if (listview_id != IDC_APPS_PROFILE) + EnableMenuItem (hsubmenu, IDM_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + } + else if (menu_id == IDM_RULES) + { + SetMenuDefaultItem (hsubmenu, IDM_PROPERTIES, FALSE); + + if (listview_id == IDC_RULES_CUSTOM) + { + PR_OBJECT ptr_rule_object = _app_getruleitem (hash_item); + + if (!ptr_rule_object) + break; + + PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; + + if (ptr_rule && ptr_rule->is_readonly) + EnableMenuItem (hsubmenu, IDM_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + + _r_obj_dereference (ptr_rule_object, &_app_dereferencerule); + } + else + { + DeleteMenu (hsubmenu, IDM_OPENRULESEDITOR, MF_BYCOMMAND); + DeleteMenu (hsubmenu, IDM_DELETE, MF_BYCOMMAND); + DeleteMenu (hsubmenu, 5, MF_BYPOSITION); + } + } + else if (menu_id == IDM_NETWORK) + { + SetMenuDefaultItem (hsubmenu, IDM_PROPERTIES, FALSE); + + PR_OBJECT ptr_network_object = _r_obj_reference (network_map[hash_item]); + + if (ptr_network_object) + { + PITEM_NETWORK ptr_network = (PITEM_NETWORK)ptr_network_object->pdata; + + if (ptr_network) + { + if (ptr_network->af != AF_INET || ptr_network->state != MIB_TCP_STATE_ESTAB) + EnableMenuItem (hsubmenu, IDM_NETWORK_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + } + + _r_obj_dereference (ptr_network_object, &_app_dereferencenetwork); + } + } + + POINT pt = {0}; + GetCursorPos (&pt); + + TrackPopupMenuEx (hsubmenu, TPM_RIGHTBUTTON | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, nullptr); + + DestroyMenu (hmenu); + + break; + } } break; @@ -3546,218 +3740,6 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) break; } - case WM_CONTEXTMENU: - { - const UINT listview_id = GetDlgCtrlID ((HWND)wparam); - const UINT selected_count = (UINT)SendDlgItemMessage (hwnd, listview_id, LVM_GETSELECTEDCOUNT, 0, 0); - - UINT menu_id; - - if (listview_id == IDC_APPS_PROFILE || listview_id == IDC_APPS_SERVICE || listview_id == IDC_APPS_UWP) - menu_id = IDM_APPS; - - else if (listview_id == IDC_RULES_BLOCKLIST || listview_id == IDC_RULES_SYSTEM || listview_id == IDC_RULES_CUSTOM) - menu_id = IDM_RULES; - - else if (listview_id == IDC_NETWORK) - menu_id = IDM_NETWORK; - - else - break; - - const size_t item = (size_t)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, (WPARAM)-1, LVNI_SELECTED); // get first item - const size_t hash_item = (size_t)_r_listview_getitemlparam (hwnd, listview_id, item); - - const HMENU hmenu = LoadMenu (nullptr, MAKEINTRESOURCE (menu_id)); - const HMENU hsubmenu = GetSubMenu (hmenu, 0); - - // localize - app.LocaleMenu (hsubmenu, IDS_ADD_FILE, IDM_ADD_FILE, false, L"..."); - app.LocaleMenu (hsubmenu, IDS_DISABLENOTIFICATIONS, IDM_DISABLENOTIFICATIONS, false, nullptr); - app.LocaleMenu (hsubmenu, IDS_DISABLETIMER, IDM_DISABLETIMER, false, nullptr); - app.LocaleMenu (hsubmenu, IDS_EXPLORE, IDM_EXPLORE, false, L"\tCtrl+E"); - app.LocaleMenu (hsubmenu, IDS_COPY, IDM_COPY, false, L"\tCtrl+C"); - app.LocaleMenu (hsubmenu, IDS_DELETE, IDM_DELETE, false, L"\tDel"); - app.LocaleMenu (hsubmenu, IDS_CHECK, IDM_CHECK, false, nullptr); - app.LocaleMenu (hsubmenu, IDS_UNCHECK, IDM_UNCHECK, false, nullptr); - app.LocaleMenu (hsubmenu, IDS_NETWORK_CLOSE, IDM_NETWORK_CLOSE, false, nullptr); - - app.LocaleMenu (hsubmenu, menu_id == IDM_RULES ? IDS_ADD : IDS_OPENRULESEDITOR, IDM_OPENRULESEDITOR, false, L"..."); - app.LocaleMenu (hsubmenu, menu_id == IDM_NETWORK ? IDS_SHOWINLIST : IDS_PROPERTIES, IDM_PROPERTIES, false, L"\tEnter"); - - if (!selected_count) - { - EnableMenuItem (hsubmenu, IDM_EXPLORE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_COPY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_CHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_UNCHECK, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_NETWORK_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_PROPERTIES, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - } - - if (menu_id == IDM_APPS) - { - SetMenuDefaultItem (hsubmenu, IDM_EXPLORE, FALSE); - - const bool is_filtersinstalled = _wfp_isfiltersinstalled (); - const time_t current_time = _r_unixtime_now (); - -#define SETTINGS_ID 2 -#define TIMER_ID 3 - - const HMENU hsubmenu_settings = GetSubMenu (hsubmenu, SETTINGS_ID); - const HMENU hsubmenu_timer = GetSubMenu (hsubmenu, TIMER_ID); - - // set icons - { - static const INT icon_size = GetSystemMetrics (SM_CXSMICON); - - static const HBITMAP hbmp_rules = _app_bitmapfrompng (app.GetHINSTANCE (), MAKEINTRESOURCE (IDP_RULES), icon_size); - static const HBITMAP hbmp_timer = _app_bitmapfrompng (app.GetHINSTANCE (), MAKEINTRESOURCE (IDP_TIMER), icon_size); - - MENUITEMINFO mii = {0}; - - mii.cbSize = sizeof (mii); - mii.fMask = MIIM_BITMAP; - - mii.hbmpItem = hbmp_rules; - SetMenuItemInfo (hsubmenu, SETTINGS_ID, TRUE, &mii); - - mii.hbmpItem = hbmp_timer; - SetMenuItemInfo (hsubmenu, TIMER_ID, TRUE, &mii); - } - - // localize - app.LocaleMenu (hsubmenu, IDS_TRAY_RULES, SETTINGS_ID, true, nullptr); - app.LocaleMenu (hsubmenu, IDS_TIMER, TIMER_ID, true, nullptr); - - // show configuration - if (selected_count) - { - PITEM_APP ptr_app = nullptr; - PR_OBJECT ptr_app_object = _app_getappitem (hash_item); - - if (ptr_app_object) - ptr_app = (PITEM_APP)ptr_app_object->pdata; - - // show rules - if (ptr_app) - { - CheckMenuItem (hsubmenu, IDM_DISABLENOTIFICATIONS, MF_BYCOMMAND | (ptr_app->is_silent ? MF_CHECKED : MF_UNCHECKED)); - - _app_generate_rulesmenu (hsubmenu_settings, hash_item); - } - - // show timers - { - bool is_checked = false; - - for (size_t i = 0; i < timers.size (); i++) - { - MENUITEMINFO mii = {0}; - - WCHAR buffer[128] = {0}; - StringCchCopy (buffer, _countof (buffer), _r_fmt_interval (timers.at (i) + 1, 1)); - - mii.cbSize = sizeof (mii); - mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STATE | MIIM_STRING; - mii.fType = MFT_STRING; - mii.dwTypeData = buffer; - mii.fState = MF_ENABLED; - mii.wID = IDX_TIMER + UINT (i); - - if (!is_filtersinstalled) - mii.fState = MF_DISABLED | MF_GRAYED; - - InsertMenuItem (hsubmenu_timer, mii.wID, FALSE, &mii); - - if (ptr_app) - { - if (!is_checked && ptr_app->timer > current_time && ptr_app->timer <= (current_time + timers.at (i))) - { - CheckMenuRadioItem (hsubmenu_timer, IDX_TIMER, IDX_TIMER + UINT (timers.size ()), mii.wID, MF_BYCOMMAND); - is_checked = true; - } - } - } - - if (!is_checked) - CheckMenuRadioItem (hsubmenu_timer, IDM_DISABLETIMER, IDM_DISABLETIMER, IDM_DISABLETIMER, MF_BYCOMMAND); - } - - _r_obj_dereference (ptr_app_object, &_app_dereferenceapp); - } - else - { - EnableMenuItem (hsubmenu, SETTINGS_ID, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, TIMER_ID, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); - } - - if (listview_id != IDC_APPS_PROFILE) - { - EnableMenuItem (hsubmenu, IDM_ADD_FILE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - EnableMenuItem (hsubmenu, IDM_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - } - } - else if (menu_id == IDM_RULES) - { - SetMenuDefaultItem (hsubmenu, IDM_PROPERTIES, FALSE); - - if (listview_id == IDC_RULES_CUSTOM) - { - PR_OBJECT ptr_rule_object = _app_getruleitem (hash_item); - - if (!ptr_rule_object) - break; - - PITEM_RULE ptr_rule = (PITEM_RULE)ptr_rule_object->pdata; - - if (ptr_rule && ptr_rule->is_readonly) - EnableMenuItem (hsubmenu, IDM_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - - _r_obj_dereference (ptr_rule_object, &_app_dereferencerule); - } - else - { - DeleteMenu (hsubmenu, IDM_OPENRULESEDITOR, MF_BYCOMMAND); - DeleteMenu (hsubmenu, IDM_DELETE, MF_BYCOMMAND); - DeleteMenu (hsubmenu, 0, MF_BYPOSITION); - } - } - else if (menu_id == IDM_NETWORK) - { - SetMenuDefaultItem (hsubmenu, IDM_PROPERTIES, FALSE); - - PR_OBJECT ptr_network_object = _r_obj_reference (network_map[hash_item]); - - if (ptr_network_object) - { - PITEM_NETWORK ptr_network = (PITEM_NETWORK)ptr_network_object->pdata; - - if (ptr_network) - { - if (ptr_network->af != AF_INET || ptr_network->state != MIB_TCP_STATE_ESTAB) - EnableMenuItem (hsubmenu, IDM_NETWORK_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - } - - _r_obj_dereference (ptr_network_object, &_app_dereferencenetwork); - } - - if (!selected_count) - EnableMenuItem (hsubmenu, IDM_OPENRULESEDITOR, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); - } - - POINT pt = {0}; - GetCursorPos (&pt); - - TrackPopupMenuEx (hsubmenu, TPM_RIGHTBUTTON | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, nullptr); - - DestroyMenu (hmenu); - - break; - } - case WM_TRAYICON: { switch (LOWORD (lparam)) @@ -4988,20 +4970,30 @@ INT_PTR CALLBACK DlgProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } case IDM_COPY: + case IDM_COPY2: { const UINT listview_id = _app_gettab_id (hwnd); size_t item = LAST_VALUE; - const size_t column_count = _r_listview_getcolumncount (hwnd, listview_id); + const size_t lv_column_count = _r_listview_getcolumncount (hwnd, listview_id); + const size_t lv_column_current = _r_listview_getcolumncurrent (hwnd, listview_id); + const rstring divider = _r_fmt (L"%c ", DIVIDER_COPY); rstring buffer; while ((item = (size_t)SendDlgItemMessage (hwnd, listview_id, LVM_GETNEXTITEM, item, LVNI_SELECTED)) != LAST_VALUE) { - for (size_t column_id = 0; column_id < column_count; column_id++) - buffer.Append (_r_listview_getitemtext (hwnd, listview_id, item, column_id)).Append (L" "); + if (LOWORD (wparam) == IDM_COPY) + { + for (size_t column_id = 0; column_id < lv_column_count; column_id++) + buffer.Append (_r_listview_getitemtext (hwnd, listview_id, item, column_id)).Append (divider); + } + else + { + buffer.Append (_r_listview_getitemtext (hwnd, listview_id, item, lv_column_current)).Append (divider); + } - buffer.Trim (L" ").Append (L"\r\n"); + buffer.Trim (divider).Append (L"\r\n"); } buffer.Trim (L"\r\n"); diff --git a/src/resource.rc b/src/resource.rc index d60e239a..e1605adc 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -15,6 +15,7 @@ IDA_MAIN ACCELERATORS BEGIN "A", IDM_SELECT_ALL, CONTROL, VIRTKEY "C", IDM_COPY, CONTROL, VIRTKEY + "C", IDM_COPY2, CONTROL, SHIFT, VIRTKEY "E", IDM_EXPLORE, CONTROL, VIRTKEY "F", IDM_FIND, CONTROL, VIRTKEY "S", IDM_EXPORT, CONTROL, VIRTKEY @@ -43,6 +44,7 @@ IDM_MAIN MENU BEGIN POPUP " " BEGIN + MENUITEM " ", IDM_ADD_FILE MENUITEM " ", IDM_SETTINGS MENUITEM SEPARATOR MENUITEM " ", IDM_IMPORT @@ -170,8 +172,6 @@ IDM_APPS MENU BEGIN POPUP "" BEGIN - MENUITEM " ", IDM_ADD_FILE - MENUITEM SEPARATOR POPUP " " BEGIN MENUITEM " ", IDM_DISABLENOTIFICATIONS @@ -186,10 +186,11 @@ BEGIN MENUITEM " ", IDM_UNCHECK MENUITEM SEPARATOR MENUITEM " ", IDM_EXPLORE - MENUITEM " ", IDM_COPY MENUITEM " ", IDM_DELETE - MENUITEM SEPARATOR MENUITEM " ", IDM_PROPERTIES + MENUITEM SEPARATOR + MENUITEM " ", IDM_COPY + MENUITEM " ", IDM_COPY2 END END @@ -198,14 +199,15 @@ BEGIN POPUP "" BEGIN MENUITEM " ", IDM_OPENRULESEDITOR + MENUITEM " ", IDM_PROPERTIES MENUITEM SEPARATOR MENUITEM " ", IDM_CHECK MENUITEM " ", IDM_UNCHECK MENUITEM SEPARATOR - MENUITEM " ", IDM_COPY MENUITEM " ", IDM_DELETE MENUITEM SEPARATOR - MENUITEM " ", IDM_PROPERTIES + MENUITEM " ", IDM_COPY + MENUITEM " ", IDM_COPY2 END END @@ -215,11 +217,12 @@ BEGIN BEGIN MENUITEM " ", IDM_PROPERTIES MENUITEM " ", IDM_NETWORK_CLOSE - MENUITEM SEPARATOR MENUITEM " ", IDM_OPENRULESEDITOR MENUITEM SEPARATOR MENUITEM " ", IDM_EXPLORE + MENUITEM SEPARATOR MENUITEM " ", IDM_COPY + MENUITEM " ", IDM_COPY2 END END