shell_context_menu.cpp
1 #include "pch.h" 2 3 #include "shell_context_menu.h" 4 #include "shell_context_sub_menu.h" 5 #include "shell_context_sub_menu_item.h" 6 #include "template_folder.h" 7 #include "new_utilities.h" 8 #include "settings.h" 9 #include "trace.h" 10 #include "Generated Files/resource.h" 11 12 using namespace Microsoft::WRL; 13 using namespace newplus; 14 15 #pragma region IExplorerCommand 16 IFACEMETHODIMP shell_context_menu::GetTitle(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* returned_title) 17 { 18 static const std::wstring localized_context_menu_item = 19 GET_RESOURCE_STRING_FALLBACK(IDS_CONTEXT_MENU_ITEM_NEW, L"New+"); 20 21 return SHStrDup(localized_context_menu_item.c_str(), returned_title); 22 } 23 24 IFACEMETHODIMP shell_context_menu::GetIcon(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* returned_icon) 25 { 26 *returned_icon = nullptr; 27 28 static const auto icon_resource_filepath = utilities::get_new_icon_resource_filepath(module_instance_handle, ThemeHelpers::GetAppTheme()); 29 30 return SHStrDup(icon_resource_filepath.c_str(), returned_icon); 31 } 32 33 IFACEMETHODIMP shell_context_menu::GetToolTip(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* returned_tool_tip) 34 { 35 *returned_tool_tip = nullptr; 36 return E_NOTIMPL; 37 } 38 39 IFACEMETHODIMP shell_context_menu::GetCanonicalName(_Out_ GUID* returned_id) 40 { 41 *returned_id = __uuidof(this); 42 return S_OK; 43 } 44 45 IFACEMETHODIMP shell_context_menu::GetState(_In_opt_ IShellItemArray*, _In_ BOOL, _Out_ EXPCMDSTATE* returned_state) 46 { 47 if (!NewSettingsInstance().GetEnabled()) 48 { 49 *returned_state = ECS_HIDDEN; 50 } 51 else 52 { 53 *returned_state = ECS_ENABLED; 54 } 55 56 return S_OK; 57 } 58 59 IFACEMETHODIMP shell_context_menu::Invoke(_In_opt_ IShellItemArray*, _In_opt_ IBindCtx*) noexcept 60 { 61 return E_NOTIMPL; 62 } 63 64 IFACEMETHODIMP shell_context_menu::GetFlags(_Out_ EXPCMDFLAGS* returned_menu_item_flags) 65 { 66 *returned_menu_item_flags = ECF_HASSUBCOMMANDS; 67 return S_OK; 68 } 69 70 IFACEMETHODIMP shell_context_menu::EnumSubCommands(_COM_Outptr_ IEnumExplorerCommand** returned_enum_commands) 71 { 72 try 73 { 74 auto e = Make<shell_context_sub_menu>(site_of_folder); 75 return e->QueryInterface(IID_PPV_ARGS(returned_enum_commands)); 76 } 77 catch (const std::exception& ex) 78 { 79 Logger::error("New+ create submenu error: {}", ex.what()); 80 return E_FAIL; 81 } 82 catch (...) 83 { 84 Logger::error("New+ create submenu error"); 85 return E_FAIL; 86 } 87 } 88 #pragma endregion 89 90 #pragma region IObjectWithSite 91 IFACEMETHODIMP shell_context_menu::SetSite(_In_ IUnknown* site) noexcept 92 { 93 this->site_of_folder = site; 94 return S_OK; 95 } 96 IFACEMETHODIMP shell_context_menu::GetSite(_In_ REFIID interface_type, _COM_Outptr_ void** returned_site) noexcept 97 { 98 return this->site_of_folder.CopyTo(interface_type, returned_site); 99 } 100 #pragma endregion