mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-11 17:37:22 +10:00
192 lines
5.8 KiB
C++
192 lines
5.8 KiB
C++
// Classic Shell (c) 2009-2017, Ivo Beltchev
|
|
// Open-Shell (c) 2017-2018, The Open-Shell Team
|
|
// Confidential information of Ivo Beltchev. Not for disclosure or distribution without prior written consent from the author
|
|
|
|
// ExplorerBHO.h : Declaration of the CExplorerBHO
|
|
|
|
#pragma once
|
|
#include "resource.h" // main symbols
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include "ClassicExplorer_i.h"
|
|
#include "ComHelper.h"
|
|
#include <shdispid.h>
|
|
|
|
|
|
// CExplorerBHO
|
|
|
|
class ATL_NO_VTABLE CExplorerBHO :
|
|
public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CComCoClass<CExplorerBHO, &CLSID_ExplorerBHO>,
|
|
public IObjectWithSiteImpl<CExplorerBHO>,
|
|
public IDispatchImpl<IExplorerBHO, &IID_IExplorerBHO, &LIBID_ClassicExplorerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
|
|
public IDispEventImpl<1,CExplorerBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1>,
|
|
public IDispEventImpl<2,CExplorerBHO,&DIID_DShellFolderViewEvents,&LIBID_Shell32,1,0>
|
|
{
|
|
public:
|
|
typedef IDispEventImpl<1,CExplorerBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1> DispEvent1;
|
|
typedef IDispEventImpl<2,CExplorerBHO,&DIID_DShellFolderViewEvents,&LIBID_Shell32,1,0> DispEvent2;
|
|
CExplorerBHO()
|
|
{
|
|
m_bResetStatus=true;
|
|
m_bForceRefresh=false;
|
|
m_bRemapBands=false;
|
|
m_bNoBreadcrumbs=false;
|
|
m_TreeItemHeight=0;
|
|
m_CurIcon=NULL;
|
|
m_CurPath[0]=0;
|
|
m_Rebar=NULL;
|
|
m_TopWindow=NULL;
|
|
m_Breadcrumbs=NULL;
|
|
m_Progress=NULL;
|
|
m_Status=m_Status8=NULL;
|
|
m_DUIView=NULL;
|
|
m_Hook=m_HookKbd=NULL;
|
|
m_Balloon=NULL;
|
|
m_UpButtonIndex=0;
|
|
m_UpHotkey=0;
|
|
m_IconNormal=m_IconHot=m_IconPressed=m_IconDisabled=NULL;
|
|
m_NavigateMsg=0;
|
|
m_AltD=0;
|
|
m_FileSizeWidth=0;
|
|
m_ZoneWidth=0;
|
|
}
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBHO)
|
|
|
|
BEGIN_SINK_MAP( CExplorerBHO )
|
|
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
|
|
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
|
|
SINK_ENTRY_EX(2, DIID_DShellFolderViewEvents, DISPID_SELECTIONCHANGED, OnSelChanged)
|
|
END_SINK_MAP()
|
|
|
|
BEGIN_COM_MAP(CExplorerBHO)
|
|
COM_INTERFACE_ENTRY(IExplorerBHO)
|
|
COM_INTERFACE_ENTRY(IObjectWithSite)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
END_COM_MAP()
|
|
|
|
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
}
|
|
|
|
// Navigation pane styles
|
|
enum
|
|
{
|
|
STYLE_CLASSIC=0, // use classic XP style
|
|
STYLE_SIMPLE=1, // use simple XP style
|
|
STYLE_VISTA=2, // no change
|
|
};
|
|
|
|
enum
|
|
{
|
|
SHOW_INFOTIP=1,
|
|
SHOW_FREE_SPACE=2,
|
|
SHOW_ZONE=4,
|
|
};
|
|
|
|
enum
|
|
{
|
|
PART_TEXT,
|
|
PART_SIZE,
|
|
PART_ZONE,
|
|
};
|
|
public:
|
|
// IObjectWithSite
|
|
STDMETHOD(SetSite)(IUnknown *pUnkSite);
|
|
|
|
// DWebBrowserEvents2
|
|
STDMETHOD(OnDocumentComplete)( IDispatch *pDisp, VARIANT *URL );
|
|
STDMETHOD(OnQuit)( void );
|
|
|
|
// DShellFolderViewEvents
|
|
STDMETHOD(OnSelChanged)( void );
|
|
|
|
private:
|
|
// Super-class the toolbar, so it has a different class name. A program called Folder Menu 3 looks for specific controls in Explorer,
|
|
// and our extra toolbar throws it off
|
|
class CToolbar: public CWindowImpl<CToolbar>
|
|
{
|
|
public:
|
|
DECLARE_WND_SUPERCLASS(L"OpenShell.UpButton",TOOLBARCLASSNAME);
|
|
|
|
BEGIN_MSG_MAP( CToolbar )
|
|
END_MSG_MAP()
|
|
};
|
|
|
|
CComPtr<IShellBrowser> m_pBrowser;
|
|
CComPtr<IWebBrowser2> m_pWebBrowser;
|
|
CComPtr<IDispatch> m_pWebDoc;
|
|
CComPtr<IInternetZoneManager> m_pZoneManager;
|
|
CComPtr<IInternetSecurityManager> m_pSecurityManager;
|
|
std::map<unsigned int,HICON> m_ZoneIconCache;
|
|
bool m_bResetStatus;
|
|
bool m_bForceRefresh;
|
|
bool m_bNoBreadcrumbs;
|
|
bool m_bRemapBands;
|
|
int m_TreeItemHeight;
|
|
int m_UpButtonIndex;
|
|
int m_UpHotkey;
|
|
CToolbar m_Toolbar;
|
|
HWND m_TopWindow;
|
|
HWND m_Rebar;
|
|
HWND m_Balloon;
|
|
HICON m_IconNormal, m_IconHot, m_IconPressed, m_IconDisabled;
|
|
HICON m_CurIcon;
|
|
CAbsolutePidl m_CurPidl;
|
|
wchar_t m_CurPath[1024]; // the current path
|
|
CWindow m_ComboBox;
|
|
CAbsolutePidl m_NavigatePidl;
|
|
UINT m_NavigateMsg; // private message that is posted to the progress bar to navigate to m_NavigatePidl
|
|
HHOOK m_Hook;
|
|
HHOOK m_HookKbd;
|
|
HWND m_Breadcrumbs;
|
|
HWND m_Progress;
|
|
HWND m_Status, m_Status8;
|
|
HWND m_DUIView;
|
|
int m_FileSizeWidth;
|
|
int m_ZoneWidth;
|
|
char m_AltD;
|
|
|
|
struct ComboItem
|
|
{
|
|
PIDLIST_ABSOLUTE pidl;
|
|
int indent;
|
|
CString name;
|
|
CString sortName;
|
|
|
|
bool operator<( const ComboItem &item ) { return _wcsicmp(sortName,item.sortName)<0; }
|
|
};
|
|
std::vector<ComboItem> m_ComboItems;
|
|
void ClearComboItems( void );
|
|
bool GetStatusText( wchar_t *buf, int size, const wchar_t *oldText, bool bShowTip, bool bShowSpace );
|
|
void GetFileSize( wchar_t *buf, int size );
|
|
|
|
static int s_AutoNavDelay;
|
|
|
|
static LRESULT CALLBACK HookExplorer( int code, WPARAM wParam, LPARAM lParam );
|
|
static LRESULT CALLBACK HookKeyboard( int code, WPARAM wParam, LPARAM lParam );
|
|
static LRESULT CALLBACK SubclassTreeParentProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassTreeProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassStatusProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassStatusProc8( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassDUIViewProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassRebarProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassBreadcrumbProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK SubclassProgressProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
};
|
|
|
|
OBJECT_ENTRY_AUTO(__uuidof(ExplorerBHO), CExplorerBHO)
|
|
|
|
bool ShowTreeProperties( HWND hwndTree );
|