PowerToys/src/modules/powerrename/PowerRenameUIHost/PowerRenameUIHost.h
Stefan Markovic 5cfbd72fa8
[PowerRename] Fluent UX (#13678)
* PowerRename new UI

* Add scrollviewer

* Don't deploy PowerRenameUI_new

* Visual updates

* Visual updates

* Updates

* Update Resources.resw

* Added docs button

* Update MainWindow.xaml

* Wire Docs button

* RegEx -> regular expressions

* Update Show only renamed list on search/replace text changed

* Update Show only renamed list on search/replace text changed - proper fix
Set searchTerm to NULL when cleared - fix Show only renamed files on clear searchTerm

* Files/folders input error handling

* Fix renaming with keeping UI window opened

After renaming folder, all of it's children need path update.
Without path update, further renaming of children items would
fail.

* Update only children, not all items with greater depth

* Fix dictionary false positives

* Remove .NET dep

* Rename PowerRenameUI_new to PowerRenameUILib
Rename executable PowerRenameUIHost to PowerRename

Co-authored-by: Laute <Niels.Laute@philips.com>
2021-10-25 14:40:19 +01:00

154 lines
5.4 KiB
C++

#pragma once
#include "pch.h"
#include "resource.h"
#include "XamlBridge.h"
#include <PowerRenameEnum.h>
#include <PowerRenameItem.h>
#include <PowerRenameManager.h>
#include <PowerRenameInterfaces.h>
#include <PowerRenameMRU.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.system.h>
#pragma push_macro("GetCurrentTime")
#undef GetCurrentTime
#include <winrt/windows.ui.xaml.hosting.h>
#pragma pop_macro("GetCurrentTime")
#include <windows.ui.xaml.hosting.desktopwindowxamlsource.h>
#include <winrt/windows.ui.xaml.controls.h>
#include <winrt/windows.ui.xaml.controls.primitives.h>
#include <winrt/Windows.ui.xaml.media.h>
#include <winrt/Windows.ui.xaml.data.h>
#include <winrt/Windows.UI.Core.h>
#include <winrt/PowerRenameUILib.h>
using namespace winrt;
using namespace Windows::UI;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Composition;
using namespace Windows::UI::Xaml::Hosting;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI::Xaml::Controls;
class AppWindow : public DesktopWindowT<AppWindow>
{
public:
// Proxy class to Advise() PRManager, as AppWindow can't implement IPowerRenameManagerEvents
class UIHostPowerRenameManagerEvents : public IPowerRenameManagerEvents
{
public:
UIHostPowerRenameManagerEvents(AppWindow* app) :
m_refCount{ 1 }, m_app{ app }
{
}
IFACEMETHODIMP_(ULONG)
AddRef()
{
return InterlockedIncrement(&m_refCount);
}
IFACEMETHODIMP_(ULONG)
Release()
{
long refCount = InterlockedDecrement(&m_refCount);
if (refCount == 0)
{
delete this;
}
return refCount;
}
IFACEMETHODIMP QueryInterface(_In_ REFIID riid, _Outptr_ void** ppv)
{
static const QITAB qit[] = {
QITABENT(UIHostPowerRenameManagerEvents, IPowerRenameManagerEvents),
{ 0 }
};
return QISearch(this, qit, riid, ppv);
}
HRESULT OnItemAdded(_In_ IPowerRenameItem* renameItem) override { return m_app->OnItemAdded(renameItem); }
HRESULT OnUpdate(_In_ IPowerRenameItem* renameItem) override { return m_app->OnUpdate(renameItem); }
HRESULT OnRename(_In_ IPowerRenameItem* renameItem) override { return m_app->OnRename(renameItem); }
HRESULT OnError(_In_ IPowerRenameItem* renameItem) override { return m_app->OnError(renameItem); }
HRESULT OnRegExStarted(_In_ DWORD threadId) override { return m_app->OnRegExStarted(threadId); }
HRESULT OnRegExCanceled(_In_ DWORD threadId) override { return m_app->OnRegExCanceled(threadId); }
HRESULT OnRegExCompleted(_In_ DWORD threadId) override { return m_app->OnRegExCompleted(threadId); }
HRESULT OnRenameStarted() override { return m_app->OnRenameStarted(); }
HRESULT OnRenameCompleted(bool closeUIWindowAfterRenaming) override { return m_app->OnRenameCompleted(closeUIWindowAfterRenaming); }
private:
long m_refCount;
AppWindow* m_app;
};
static int Show(HINSTANCE hInstance, std::vector<std::wstring> files);
LRESULT MessageHandler(UINT message, WPARAM wParam, LPARAM lParam) noexcept;
private:
enum class UpdateFlagCommand
{
Set = 0,
Reset
};
AppWindow(HINSTANCE hInstance, std::vector<std::wstring> files) noexcept;
void CreateAndShowWindow();
bool OnCreate(HWND, LPCREATESTRUCT) noexcept;
void OnCommand(HWND, int id, HWND hwndControl, UINT codeNotify) noexcept;
void OnDestroy(HWND hwnd) noexcept;
void OnResize(HWND, UINT state, int cx, int cy) noexcept;
HRESULT CreateShellItemArrayFromPaths(std::vector<std::wstring> files, IShellItemArray** shellItemArray);
void PopulateExplorerItems();
HRESULT InitAutoComplete();
HRESULT EnumerateShellItems(_In_ IEnumShellItems* enumShellItems);
void SearchReplaceChanged(bool forceRenaming = false);
void ValidateFlags(PowerRenameFlags flag);
void UpdateFlag(PowerRenameFlags flag, UpdateFlagCommand command);
void SetHandlers();
void ToggleItem(int32_t id, bool checked);
void ToggleAll();
void SwitchView();
void Rename(bool closeWindow);
HRESULT ReadSettings();
HRESULT WriteSettings();
HRESULT OpenSettingsApp();
void SetCheckboxesFromFlags(DWORD flags);
void UpdateCounts();
HRESULT OnItemAdded(_In_ IPowerRenameItem* renameItem);
HRESULT OnUpdate(_In_ IPowerRenameItem* renameItem);
HRESULT OnRename(_In_ IPowerRenameItem* renameItem);
HRESULT OnError(_In_ IPowerRenameItem* renameItem);
HRESULT OnRegExStarted(_In_ DWORD threadId);
HRESULT OnRegExCanceled(_In_ DWORD threadId);
HRESULT OnRegExCompleted(_In_ DWORD threadId);
HRESULT OnRenameStarted();
HRESULT OnRenameCompleted(bool closeUIWindowAfterRenaming);
wil::unique_haccel m_accelerators;
const HINSTANCE m_instance;
HWND m_xamlIsland{};
HWND m_window{};
winrt::PowerRenameUILib::MainWindow m_mainUserControl{ nullptr };
bool m_disableCountUpdate = false;
CComPtr<IPowerRenameManager> m_prManager;
CComPtr<IUnknown> m_dataSource;
CComPtr<IPowerRenameEnum> m_prEnum;
UIHostPowerRenameManagerEvents m_managerEvents;
DWORD m_cookie = 0;
CComPtr<IPowerRenameMRU> m_searchMRU;
CComPtr<IPowerRenameMRU> m_replaceMRU;
UINT m_selectedCount = 0;
UINT m_renamingCount = 0;
bool m_flagValidationInProgress = false;
};