/ src / modules / NewPlus / NewShellExtensionContextMenu / shell_context_menu.cpp
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