mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-11 17:37:22 +10:00
198 lines
6.6 KiB
C++
198 lines
6.6 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
|
|
|
|
#pragma once
|
|
|
|
class ISettingsPanel
|
|
{
|
|
public:
|
|
virtual HWND Create( HWND parent )=0;
|
|
virtual HWND Activate( struct CSetting *pGroup, const RECT &rect, bool bReset )=0;
|
|
virtual bool Validate( HWND parent )=0;
|
|
};
|
|
|
|
struct CSetting
|
|
{
|
|
enum Type
|
|
{
|
|
TYPE_GROUP=-2,
|
|
TYPE_RADIO=-1,
|
|
TYPE_BOOL=1,
|
|
TYPE_INT,
|
|
TYPE_HOTKEY,
|
|
TYPE_HOTKEY_ANY,
|
|
TYPE_COLOR, // requires the high 8 bits of the flags to contain an index into the color palette
|
|
|
|
// string types
|
|
TYPE_STRING,
|
|
TYPE_ICON,
|
|
TYPE_BITMAP,
|
|
TYPE_BITMAP_JPG,
|
|
TYPE_SOUND,
|
|
TYPE_FONT,
|
|
TYPE_MULTISTRING,
|
|
TYPE_DIRECTORY,
|
|
};
|
|
|
|
enum
|
|
{
|
|
// initial settings
|
|
FLAG_WARM= 0x00001,
|
|
FLAG_COLD= 0x00002,
|
|
FLAG_BASIC= 0x00004,
|
|
FLAG_HIDDEN= 0x00008,
|
|
FLAG_SHARED= 0x00010,
|
|
FLAG_NORESET= 0x00020,
|
|
FLAG_NODEFAULT= 0x00040,
|
|
FLAG_NOSAVE= 0x00080,
|
|
FLAG_CALLBACK= 0x00100,
|
|
|
|
FLAG_MENU_CLASSIC1= 0x00200,
|
|
FLAG_MENU_CLASSIC2= 0x00400,
|
|
FLAG_MENU_CLASSIC_BOTH=FLAG_MENU_CLASSIC1|FLAG_MENU_CLASSIC2,
|
|
FLAG_MENU_WIN7= 0x00800,
|
|
FLAG_MENU_MASK=FLAG_MENU_CLASSIC1|FLAG_MENU_CLASSIC2|FLAG_MENU_WIN7,
|
|
|
|
// for run-time use only
|
|
FLAG_DEFAULT= 0x01000,
|
|
FLAG_FORCED_DEFAULT= 0x02000,
|
|
FLAG_LOCKED_REG= 0x04000, // locked by HKLM registry setting
|
|
FLAG_LOCKED_GP= 0x08000, // locked by a group policy
|
|
FLAG_LOCKED_MASK=FLAG_LOCKED_REG|FLAG_LOCKED_GP,
|
|
FLAG_WARNING= 0x10000, // show a warning icon
|
|
// top 8 bits need to stay unused. that's where we store the color index
|
|
};
|
|
|
|
const wchar_t *name;
|
|
Type type;
|
|
int nameID, tipID; // resource strings
|
|
CComVariant defValue; // default value
|
|
unsigned int flags;
|
|
const wchar_t *depend;
|
|
const wchar_t *nest;
|
|
ISettingsPanel *pPanel; // custom panel for editing this group of settings
|
|
|
|
CSetting *pLinkTo; // if this is not NULL, then the value is stored in the linked setting (the default value, radio settings, etc. must match between the two)
|
|
|
|
// runtime use only
|
|
CComVariant value; // current value
|
|
CComVariant tempValue; // the value is stored here when editing begins and restored if the editing is canceled
|
|
unsigned int tempFlags;
|
|
|
|
bool IsEnabled( void ) const;
|
|
bool IsDefault( void ) const { return ((pLinkTo?pLinkTo->flags:flags)&FLAG_DEFAULT)!=0; }
|
|
bool IsForcedDefault( void ) const { return ((pLinkTo?pLinkTo->flags:flags)&FLAG_FORCED_DEFAULT)!=0; }
|
|
bool IsLocked( void ) const { return ((pLinkTo?pLinkTo->flags:flags)&FLAG_LOCKED_MASK)!=0; }
|
|
bool IsLockedReg( void ) const { return ((pLinkTo?pLinkTo->flags:flags)&FLAG_LOCKED_REG)!=0; }
|
|
bool ShouldLoad( bool bShared ) const;
|
|
bool MatchFilter( const wchar_t *filter ) const;
|
|
const CComVariant &GetValue( void ) const { return pLinkTo?pLinkTo->value:value; }
|
|
|
|
void LoadValue( CRegKey ®Settings, CRegKey ®SettingsUser, CRegKey ®Policy, CRegKey ®PolicyUser );
|
|
|
|
private:
|
|
bool ReadValue( CRegKey ®Key, const wchar_t *valName );
|
|
};
|
|
|
|
// Images in the tree image list
|
|
enum {
|
|
SETTING_STATE_NONE=1,
|
|
SETTING_STATE_SETTING=2,
|
|
SETTING_STATE_CHECKBOX=4,
|
|
SETTING_STATE_RADIO=8,
|
|
|
|
// additional flags
|
|
SETTING_STATE_DISABLED=1,
|
|
SETTING_STATE_CHECKED=2,
|
|
|
|
SETTING_IMAGE_COLOR=13, // 10 blank images to use for custom colors
|
|
};
|
|
|
|
enum TSettingsComponent
|
|
{
|
|
COMPONENT_EXPLORER,
|
|
COMPONENT_MENU,
|
|
COMPONENT_IE,
|
|
COMPONENT_UPDATE,
|
|
COMPONENT_SHARED,
|
|
};
|
|
|
|
class ICustomSettings
|
|
{
|
|
public:
|
|
virtual int AppendBackupMenu( HMENU menu, int id ) = 0;
|
|
virtual void ExecuteBackupMenu( int id ) = 0;
|
|
};
|
|
|
|
void InitSettings( CSetting *pSettings, TSettingsComponent component, ICustomSettings *pCustom );
|
|
void LoadSettings( void );
|
|
void SaveSettings( void );
|
|
void UpdateDefaultSettings( void );
|
|
void EditSettings( const wchar_t *title, bool bModal, int tab );
|
|
void CloseSettings( void );
|
|
void SetSettingsDirty( void );
|
|
void SelectSettingsTab( int tab, bool bAdvanced, const CSetting *pSelect );
|
|
void UpdateSettings( void ); // implemented by the user
|
|
void UpgradeSettings( bool bShared ); // implemented by the user (called when converting 3.0 settings to 4.0)
|
|
void ClosingSettings( HWND hWnd, int flags, int command ); // implemented by the user
|
|
void SettingChangedCallback( const CSetting *pSetting ); // implemented by the user
|
|
bool IsSettingsMessage( MSG *msg );
|
|
bool ImportSettingsXml( const wchar_t *fname );
|
|
bool ExportSettingsXml( const wchar_t *fname );
|
|
const CSetting *GetAllSettings( void );
|
|
void SetSettingsStyle( int style, int mask );
|
|
void GetSettingsStyle( int &style, int &mask );
|
|
|
|
// Finds a setting by name
|
|
CSetting *FindSetting( const wchar_t *name );
|
|
// Updates the setting with a new default value and locked flag
|
|
void UpdateSetting( const wchar_t *name, const CComVariant &defValue, bool bLockedGP );
|
|
// Updates the setting with a new tooltip and a warning flag
|
|
void UpdateSettingText( const wchar_t *name, int nameID, int tipID, bool bWarning );
|
|
|
|
void HideSetting( const wchar_t *name, bool bHide );
|
|
void HideSettingGroup( const wchar_t *name, bool bHide );
|
|
void UpdateGroupText( const wchar_t *name, int nameID );
|
|
|
|
bool GetSettingBool( const wchar_t *name );
|
|
int GetSettingInt( const wchar_t *name );
|
|
CString GetSettingString( const wchar_t *name );
|
|
bool IsSettingLocked( const wchar_t *name );
|
|
bool IsSettingForcedDefault( const wchar_t *name );
|
|
|
|
// In some cases the default can change dynamically, so the setting may be out of date. Use bDef to detect if the default value should be used
|
|
int GetSettingInt( const wchar_t *name, bool &bDef );
|
|
bool GetSettingBool( const wchar_t *name, bool &bDef );
|
|
|
|
struct CSettingsLockRead
|
|
{
|
|
CSettingsLockRead( void );
|
|
~CSettingsLockRead( void );
|
|
};
|
|
|
|
struct CSettingsLockWrite
|
|
{
|
|
CSettingsLockWrite( void );
|
|
~CSettingsLockWrite( void );
|
|
};
|
|
|
|
bool HasHelp( void );
|
|
void ShowHelp( void );
|
|
|
|
#ifndef _WIN64
|
|
bool SaveAdmx( TSettingsComponent component, const char *admxFile, const char *admlFile, const char *docFile );
|
|
#endif
|
|
|
|
// Opens the registry keys for the settings of the given component
|
|
// Returns true if the user settings were read from the old HKCU location. That means the settings may need to be upgraded
|
|
bool OpenSettingsKeys( TSettingsComponent component, CRegKey ®Settings, CRegKey ®SettingsUser, CRegKey ®Policy, CRegKey ®PolicyUser );
|
|
|
|
// Get a value from a manually loaded setting
|
|
bool GetSettingBool( const CSetting &setting );
|
|
CString GetSettingString( const CSetting &setting );
|
|
|
|
// the format for the location is key_name|value_name|file_name
|
|
void VLogToFile( const wchar_t *location, const wchar_t *message, va_list args );
|
|
void LogToFile( const wchar_t *location, const wchar_t *message, ... );
|