mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-20 10:44:37 +10:00
* Rebrand to Open-Shell * Slight installer branding improvement
This commit is contained in:
197
Src/Lib/Settings.h
Normal file
197
Src/Lib/Settings.h
Normal file
@@ -0,0 +1,197 @@
|
||||
// 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,
|
||||
};
|
||||
|
||||
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
|
||||
const wchar_t *GetDocRelativePath( void ); // 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, ... );
|
||||
Reference in New Issue
Block a user