mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-06-14 03:16:38 +10:00
714c98130a
Put common build settings into separate props file. This way it will be much easier to do changes that should affect all projects in the future.
247 lines
7.4 KiB
C++
247 lines
7.4 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
|
|
|
|
// ExplorerBand.h : Declaration of the CExplorerBand
|
|
|
|
#pragma once
|
|
#include "resource.h"
|
|
#include "ClassicExplorer_h.h"
|
|
#include "SettingsParser.h"
|
|
#include <vector>
|
|
|
|
class CBandWindow: public CWindowImpl<CBandWindow>
|
|
{
|
|
public:
|
|
|
|
enum
|
|
{
|
|
ID_LAST=-1,
|
|
ID_SEPARATOR=0,
|
|
|
|
// standard toolbar commands
|
|
ID_SETTINGS=1,
|
|
ID_GOUP,
|
|
ID_CUT,
|
|
ID_COPY,
|
|
ID_PASTE,
|
|
ID_PASTE_SHORTCUT,
|
|
ID_DELETE,
|
|
ID_PROPERTIES,
|
|
ID_EMAIL,
|
|
|
|
ID_MOVETO,
|
|
ID_COPYTO,
|
|
ID_UNDO,
|
|
ID_REDO,
|
|
ID_SELECTALL,
|
|
ID_DESELECT,
|
|
ID_INVERT,
|
|
ID_GOBACK,
|
|
ID_GOFORWARD,
|
|
ID_REFRESH,
|
|
ID_STOP,
|
|
ID_RENAME,
|
|
ID_NEWFOLDER,
|
|
ID_ZIPFOLDER,
|
|
ID_NAVPANE,
|
|
ID_DETAILSPANE,
|
|
ID_PREVIEWPANE,
|
|
ID_MAP_DRIVE,
|
|
ID_DISCONNECT,
|
|
ID_CUSTOMIZEFOLDER,
|
|
ID_FOLDEROPTIONS,
|
|
ID_VIEW_TILES,
|
|
ID_VIEW_DETAILS,
|
|
ID_VIEW_LIST,
|
|
ID_VIEW_CONTENT,
|
|
ID_VIEW_ICONS1,
|
|
ID_VIEW_ICONS2,
|
|
ID_VIEW_ICONS3,
|
|
ID_VIEW_ICONS4,
|
|
ID_SHOW_EXTENSIONS,
|
|
ID_HIDDEN_FILES,
|
|
ID_SYSTEM_FILES,
|
|
|
|
ID_CUSTOM=100,
|
|
};
|
|
|
|
DECLARE_WND_CLASS(L"OpenShell.CBandWindow")
|
|
|
|
enum {
|
|
BWM_UPDATEBUTTONS=WM_USER,
|
|
BWM_UPDATETOOLBAR,
|
|
};
|
|
|
|
BEGIN_MSG_MAP( CBandWindow )
|
|
MESSAGE_HANDLER( WM_CREATE, OnCreate )
|
|
MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
|
|
MESSAGE_HANDLER( WM_CLEAR, OnUpdateUI )
|
|
MESSAGE_HANDLER( WM_COMMAND, OnCommand )
|
|
MESSAGE_HANDLER( BWM_UPDATEBUTTONS, OnUpdateButtons )
|
|
MESSAGE_HANDLER( BWM_UPDATETOOLBAR, OnUpdateToolbar )
|
|
NOTIFY_CODE_HANDLER( NM_RCLICK, OnRClick )
|
|
NOTIFY_CODE_HANDLER( TBN_GETINFOTIP, OnGetInfoTip )
|
|
NOTIFY_CODE_HANDLER( TBN_DROPDOWN, OnDropDown )
|
|
NOTIFY_CODE_HANDLER( RBN_CHEVRONPUSHED, OnChevron )
|
|
END_MSG_MAP()
|
|
|
|
CBandWindow( void ) { m_ImgEnabled=m_ImgDisabled=NULL; m_MenuIconSize=0; }
|
|
|
|
HWND GetToolbar( void ) { return m_Toolbar.m_hWnd; }
|
|
void SetBrowsers( IShellBrowser *pBrowser, IWebBrowser2 *pWebBrowser );
|
|
void Clear( void );
|
|
void UpdateToolbar( void );
|
|
void EnableButton( int cmd, bool bEnable );
|
|
void CheckButton( int cmd, bool bCheck );
|
|
bool HasPanes( void ) const;
|
|
bool HasFolderSettings( void ) const;
|
|
|
|
protected:
|
|
// Handler prototypes:
|
|
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
|
|
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
|
|
LRESULT OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnUpdateUI( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnUpdateButtons( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnUpdateToolbar( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
|
|
LRESULT OnRClick( int idCtrl, LPNMHDR pnmh, BOOL& bHandled );
|
|
LRESULT OnGetInfoTip( int idCtrl, LPNMHDR pnmh, BOOL& bHandled );
|
|
LRESULT OnDropDown( int idCtrl, LPNMHDR pnmh, BOOL& bHandled );
|
|
LRESULT OnChevron( int idCtrl, LPNMHDR pnmh, BOOL& bHandled );
|
|
|
|
private:
|
|
CWindow m_Toolbar;
|
|
CWindow m_TreeParent;
|
|
CComPtr<IShellBrowser> m_pBrowser;
|
|
CComPtr<IWebBrowser2> m_pWebBrowser;
|
|
CComPtr<IPropertyBag> m_pBrowserBag;
|
|
HIMAGELIST m_ImgEnabled;
|
|
HIMAGELIST m_ImgDisabled;
|
|
int m_MenuIconSize;
|
|
|
|
struct StdToolbarItem
|
|
{
|
|
int id;
|
|
const wchar_t *command;
|
|
const wchar_t *link;
|
|
const wchar_t *label; // text on the button
|
|
const wchar_t *tip; // default tooltip
|
|
const wchar_t *iconPath;
|
|
const wchar_t *iconPathD;
|
|
CString regName; // name of the registry value to check for enabled/checked state
|
|
CString labelString, tipString; // additional storage for the strings
|
|
const StdToolbarItem *submenu;
|
|
mutable HBITMAP menuIcon;
|
|
mutable HBITMAP menuIconD;
|
|
mutable CString menuText;
|
|
mutable bool bIconLoaded; // the menu icon is loaded
|
|
bool bDisabled;
|
|
bool bChecked;
|
|
};
|
|
|
|
std::vector<StdToolbarItem> m_Items;
|
|
std::vector<TBBUTTON> m_Buttons;
|
|
CSettingsParser m_Parser;
|
|
|
|
void ParseToolbar( void );
|
|
void ParseToolbarItem( const wchar_t *name, StdToolbarItem &item );
|
|
void SendShellTabCommand( int command );
|
|
HMENU CreateDropMenu( const StdToolbarItem *pItem );
|
|
HMENU CreateDropMenuRec( const StdToolbarItem *pItem, std::vector<HMODULE> &modules, HMODULE hShell32 );
|
|
void SendEmail( void );
|
|
void SendToZip( void );
|
|
void NewFolder( void );
|
|
void ExecuteCommandFile( const wchar_t *pText );
|
|
void ExecuteCustomCommand( const wchar_t *pCommand );
|
|
void ViewByProperty( IFolderView2 *pView, const wchar_t *pProperty, bool bGroup );
|
|
void UpdateBag( void );
|
|
void UpdateFolderSettings( void );
|
|
|
|
static LRESULT CALLBACK ToolbarSubclassProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static HRESULT __stdcall BagWriteHook( IPropertyBag *pThis, LPCOLESTR pszPropName, VARIANT *pVar );
|
|
};
|
|
|
|
|
|
// CExplorerBand
|
|
|
|
class ATL_NO_VTABLE CExplorerBand :
|
|
public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CComCoClass<CExplorerBand,&CLSID_ExplorerBand>,
|
|
public IObjectWithSiteImpl<CExplorerBand>,
|
|
public IDeskBand,
|
|
public IDispEventImpl<1,CExplorerBand,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1>
|
|
{
|
|
public:
|
|
CExplorerBand( void );
|
|
|
|
DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_EXPLORERBAND, CExplorerBand)
|
|
|
|
BEGIN_SINK_MAP( CExplorerBand )
|
|
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete)
|
|
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, OnCommandStateChange)
|
|
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
|
|
END_SINK_MAP()
|
|
|
|
BEGIN_COM_MAP(CExplorerBand)
|
|
COM_INTERFACE_ENTRY( IOleWindow )
|
|
COM_INTERFACE_ENTRY( IObjectWithSite )
|
|
COM_INTERFACE_ENTRY_IID( IID_IDockingWindow, IDockingWindow )
|
|
COM_INTERFACE_ENTRY_IID( IID_IDeskBand, IDeskBand )
|
|
END_COM_MAP()
|
|
|
|
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
}
|
|
|
|
public:
|
|
|
|
// IDeskBand
|
|
STDMETHOD(GetBandInfo)( DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi );
|
|
|
|
// IObjectWithSite
|
|
STDMETHOD(SetSite)( IUnknown* pUnkSite );
|
|
|
|
// IOleWindow
|
|
STDMETHOD(GetWindow)( HWND* phwnd );
|
|
STDMETHOD(ContextSensitiveHelp)( BOOL fEnterMode );
|
|
|
|
// IDockingWindow
|
|
STDMETHOD(CloseDW)( unsigned long dwReserved );
|
|
STDMETHOD(ResizeBorderDW)( const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved );
|
|
STDMETHOD(ShowDW)( BOOL fShow );
|
|
|
|
// DWebBrowserEvents2
|
|
STDMETHOD(OnNavigateComplete)( IDispatch *pDisp, VARIANT *URL );
|
|
STDMETHOD(OnCommandStateChange)( long Command, VARIANT_BOOL Enable );
|
|
STDMETHOD(OnQuit)( void );
|
|
|
|
protected:
|
|
bool m_bSubclassRebar; // the rebar needs subclassing
|
|
bool m_bSubclassedRebar; // the rebar is subclassed
|
|
bool m_bBandNewLine; // our band is on a new line (has RBBS_BREAK style)
|
|
bool m_bHandleSetInfo; // mess with the RB_SETBANDINFO message
|
|
CBandWindow m_BandWindow;
|
|
CComPtr<IWebBrowser2> m_pWebBrowser;
|
|
HWND m_TopWindow;
|
|
|
|
static LRESULT CALLBACK RebarSubclassProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
static LRESULT CALLBACK ParentSubclassProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData );
|
|
|
|
friend class CBandWindow;
|
|
};
|
|
|
|
OBJECT_ENTRY_AUTO(__uuidof(ExplorerBand), CExplorerBand)
|