288 lines
9.8 KiB
C
288 lines
9.8 KiB
C
|
// logon.h
|
||
|
//
|
||
|
|
||
|
#if !defined(LOGON__Logon_h__INCLUDED)
|
||
|
#define LOGON__Logon_h__INCLUDED
|
||
|
#pragma once
|
||
|
|
||
|
//#define ANIMATE_FLAG
|
||
|
|
||
|
// Forward declarations
|
||
|
class LogonAccount;
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
enum EFadeDirection;
|
||
|
#endif
|
||
|
|
||
|
#define MAX_FLAG_FRAMES 1
|
||
|
#define FLAG_ANIMATION_COUNT 1
|
||
|
|
||
|
class LogonFrame: public HWNDElement, public IElementListener
|
||
|
{
|
||
|
public:
|
||
|
static HRESULT Create(OUT Element** ppElement); // Required for ClassInfo (always fails)
|
||
|
static HRESULT Create(HWND hParent, BOOL fDblBuffer, UINT nCreate, OUT Element** ppElement);
|
||
|
|
||
|
// Generic events
|
||
|
virtual void OnEvent(Event* pEvent);
|
||
|
|
||
|
// System events
|
||
|
virtual void OnInput(InputEvent* pEvent);
|
||
|
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
|
||
|
|
||
|
virtual Element* GetAdjacent(Element* peFrom, int iNavDir, NavReference const* pnr, bool bKeyable);
|
||
|
|
||
|
// Frame Callbacks
|
||
|
HRESULT OnLogUserOn(LogonAccount* pla);
|
||
|
HRESULT OnPower();
|
||
|
HRESULT OnUndock();
|
||
|
HRESULT OnTreeReady(Parser* pParser);
|
||
|
|
||
|
// Listener impl
|
||
|
virtual void OnListenerAttach(Element* peFrom) { peFrom; }
|
||
|
virtual void OnListenerDetach(Element* peFrom) { peFrom; }
|
||
|
virtual bool OnListenedPropertyChanging(Element* peFrom, PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew) { peFrom; ppi; iIndex; pvOld; pvNew; return true; }
|
||
|
virtual void OnListenedPropertyChanged(Element* peFrom, PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
|
||
|
virtual void OnListenedInput(Element* peFrom, InputEvent* pInput) { peFrom; pInput; }
|
||
|
virtual void OnListenedEvent(Element* peFrom, Event* pEvent) { peFrom; pEvent; }
|
||
|
|
||
|
// Operations
|
||
|
static int PointToPixel(int nPoint) { return MulDiv(nPoint, _nDPI, 72); }
|
||
|
HINSTANCE GetHInstance() { return _pParser->GetHInstance(); }
|
||
|
void HideAccountPanel() { _peRightPanel->SetLayoutPos(LP_None); _peLeftPanel->RemoveLocalValue(WidthProp);}
|
||
|
void ShowAccountPanel() { _peRightPanel->SetLayoutPos(BLP_Left); _peLeftPanel->SetWidth(380);}
|
||
|
void HideLogoArea() { _peLogoArea->SetLayoutPos(LP_None); }
|
||
|
void ShowLogoArea() { _peLogoArea->SetLayoutPos(BLP_Client); }
|
||
|
void HideWelcomeArea() { _peMsgArea->SetLayoutPos(LP_None); }
|
||
|
void ShowWelcomeArea() { _peMsgArea->SetLayoutPos(BLP_Client); }
|
||
|
void HidePowerButton() { _pbPower->SetVisible(false); }
|
||
|
void ShowPowerButton() { _pbPower->SetVisible(true); }
|
||
|
void SetPowerButtonLabel(LPCWSTR psz) { Element* pe = _pbPower->FindDescendent(StrToID(L"label")); if (pe) pe->SetContentString(psz); }
|
||
|
void InsertUndockButton() { _pbUndock->SetLayoutPos(BLP_Top); }
|
||
|
void RemoveUndockButton() { _pbUndock->SetLayoutPos(LP_None); }
|
||
|
void HideUndockButton() { _pbUndock->SetVisible(false); }
|
||
|
void ShowUndockButton() { _pbUndock->SetVisible(true); }
|
||
|
void SetUndockButtonLabel(LPCWSTR psz) { Element* pe = _pbUndock->FindDescendent(StrToID(L"label")); if (pe) pe->SetContentString(psz); }
|
||
|
void SetStatus(LPCWSTR psz) { if (psz){ _peHelp->SetContentString(psz);}}
|
||
|
void SetTitle(UINT uRCID);
|
||
|
void SetTitle(LPCWSTR pszTitle);
|
||
|
void SetButtonLabels();
|
||
|
HRESULT AddAccount(LPCWSTR pszPicture, BOOL fPicRes, LPCWSTR pszName, LPCWSTR pszUsername, LPCWSTR pszHint, BOOL fPwdNeeded, BOOL fLoggedOn, OUT LogonAccount **ppla);
|
||
|
NativeHWNDHost* GetNativeHost() {return _pnhh;}
|
||
|
void SetNativeHost(NativeHWNDHost *pnhh) {_pnhh = pnhh;}
|
||
|
void UpdateUserStatus(BOOL fRefreshAll = false);
|
||
|
LogonAccount* FindNamedUser(LPCWSTR pszUsername);
|
||
|
void SelectUser(LPCWSTR pszUsername);
|
||
|
void ResetUserList();
|
||
|
void Resize(BOOL fWorkArea);
|
||
|
void SetAnimations(BOOL fAnimations);
|
||
|
|
||
|
void ResetTheme();
|
||
|
|
||
|
BOOL UserListAvailable() {return _fListAvailable;}
|
||
|
void SetUserListAvailable(BOOL fListAvailable) {_fListAvailable = fListAvailable;}
|
||
|
// ClassInfo accessors (static and virtual instance-based)
|
||
|
static IClassInfo* Class;
|
||
|
virtual IClassInfo* GetClassInfo() { return Class; }
|
||
|
static HRESULT Register();
|
||
|
|
||
|
// state management
|
||
|
void SetState(UINT uNewState) {_nAppState = uNewState;}
|
||
|
UINT GetState() {return _nAppState;}
|
||
|
BOOL IsPreStatusLock() {return _fPreStatusLock;}
|
||
|
|
||
|
void EnterPreStatusMode(BOOL fLock);
|
||
|
void EnterLogonMode(BOOL fUnLock);
|
||
|
void EnterPostStatusMode();
|
||
|
void EnterHideMode();
|
||
|
void EnterDoneMode();
|
||
|
LRESULT InteractiveLogonRequest(LPCWSTR pszUsername, LPCWSTR pszPassword);
|
||
|
void NextFlagAnimate(DWORD dwFrame);
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
// Animations / Effects
|
||
|
HRESULT FxStartup();
|
||
|
#endif
|
||
|
|
||
|
LogonFrame() { }
|
||
|
virtual ~LogonFrame();
|
||
|
HRESULT Initialize(HWND hParent, BOOL fDblBuffer, UINT nCreate);
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
// Animations / Effects
|
||
|
HRESULT FxFadeAccounts(EFadeDirection dir, float flCommonDelay = 0.0f);
|
||
|
HRESULT FxLogUserOn(LogonAccount * pla);
|
||
|
static void CALLBACK OnLoginCenterStage(GMA_ACTIONINFO * pmai);
|
||
|
#endif
|
||
|
|
||
|
// References to key descendents
|
||
|
Selector* _peAccountList;
|
||
|
ScrollViewer* _peViewer;
|
||
|
Element* _peRightPanel;
|
||
|
Element* _peLeftPanel;
|
||
|
Button* _pbPower;
|
||
|
Button* _pbUndock;
|
||
|
Element* _peHelp;
|
||
|
Element* _peOptions;
|
||
|
Element* _peMsgArea;
|
||
|
Element* _peLogoArea;
|
||
|
|
||
|
private:
|
||
|
LogonAccount* InternalFindNamedUser(LPCWSTR pszUsername);
|
||
|
|
||
|
static int _nDPI;
|
||
|
Parser* _pParser;
|
||
|
|
||
|
BOOL _fListAvailable;
|
||
|
BOOL _fPreStatusLock;
|
||
|
HWND _hwndNotification;
|
||
|
UINT _nStatusID;
|
||
|
UINT _nAppState;
|
||
|
NativeHWNDHost *_pnhh;
|
||
|
Value* _pvHotList;
|
||
|
Value* _pvList;
|
||
|
HDC _hdcAnimation;
|
||
|
HBITMAP _hbmpFlags;
|
||
|
DWORD _dwFlagFrame;
|
||
|
UINT _nColorDepth;
|
||
|
};
|
||
|
|
||
|
|
||
|
class LogonAccountList: public Selector
|
||
|
{
|
||
|
public:
|
||
|
static HRESULT Create(OUT Element** ppElement); // Required for ClassInfo
|
||
|
|
||
|
// System events
|
||
|
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
|
||
|
|
||
|
// ClassInfo accessors (static and virtual instance-based)
|
||
|
static IClassInfo* Class;
|
||
|
virtual IClassInfo* GetClassInfo() { return Class; }
|
||
|
static HRESULT Register();
|
||
|
|
||
|
LogonAccountList() { }
|
||
|
virtual ~LogonAccountList() { }
|
||
|
HRESULT Initialize() { return Selector::Initialize(); }
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
// Animations / Effects
|
||
|
HRESULT FxMouseWithin(EFadeDirection dir);
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
|
||
|
// LogonState property enum
|
||
|
#define LS_Pending 0
|
||
|
#define LS_Granted 1
|
||
|
#define LS_Denied 2
|
||
|
|
||
|
#define LAS_Initialized 0
|
||
|
#define LAS_PreStatus 1
|
||
|
#define LAS_Logon 2
|
||
|
#define LAS_PostStatus 3
|
||
|
#define LAS_Hide 4
|
||
|
#define LAS_Done 5
|
||
|
|
||
|
#define LASS_Email 0
|
||
|
#define LASS_LoggedOn 1
|
||
|
|
||
|
class LogonAccount: public Button
|
||
|
{
|
||
|
public:
|
||
|
static HRESULT Create(OUT Element** ppElement); // Required for ClassInfo
|
||
|
|
||
|
// Generic events
|
||
|
virtual void OnEvent(Event* pEvent);
|
||
|
|
||
|
// System events
|
||
|
virtual void OnInput(InputEvent* pEvent);
|
||
|
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
|
||
|
|
||
|
// Account Callbacks
|
||
|
void OnAuthenticatedUser();
|
||
|
BOOL OnAuthenticateUser(LPCWSTR pszInPassword = NULL);
|
||
|
void OnHintSelect();
|
||
|
void OnStatusSelect(UINT nLine);
|
||
|
HRESULT OnTreeReady(LPCWSTR pszPicture, BOOL fPicRes, LPCWSTR pszName, LPCWSTR pszUsername, LPCWSTR pszHint, BOOL fPwdNeeded, BOOL fLoggedOn, HINSTANCE hInst);
|
||
|
|
||
|
// Operations
|
||
|
static void InitPasswordPanel(Element* pePwdPanel, Edit* pePwdEdit, Button* pbPwdInfo, Element* peKbdIcon) { _pePwdPanel = pePwdPanel; _pePwdEdit = pePwdEdit; _pbPwdInfo = pbPwdInfo; _peKbdIcon = peKbdIcon;}
|
||
|
HRESULT InsertPasswordPanel();
|
||
|
HRESULT RemovePasswordPanel();
|
||
|
void InsertStatus(UINT nLine) { _pbStatus[nLine]->SetLayoutPos(BLP_Top); }
|
||
|
void RemoveStatus(UINT nLine) { _pbStatus[nLine]->SetLayoutPos(LP_None); }
|
||
|
void HideStatus(UINT nLine) { _pbStatus[nLine]->SetVisible(false); }
|
||
|
void ShowStatus(UINT nLine) { _pbStatus[nLine]->SetVisible(true); }
|
||
|
void SetStatus(UINT nLine, LPCWSTR psz);
|
||
|
void DisableStatus(UINT nLine) { _pbStatus[nLine]->SetEnabled(false); }
|
||
|
void ShowPasswordIncorrectMessage();
|
||
|
void UpdateNotifications(BOOL fUpdateEverything);
|
||
|
void AppRunningTip();
|
||
|
void UnreadMailTip();
|
||
|
BOOL IsPasswordBlank();
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
void ShowEdit();
|
||
|
void HideEdit();
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// Cached atoms for quicker identification
|
||
|
static ATOM idPwdGo;
|
||
|
static ATOM idPwdInfo;
|
||
|
|
||
|
// Property definitions
|
||
|
static PropertyInfo* LogonStateProp;
|
||
|
|
||
|
// Quick property accessors
|
||
|
int GetLogonState() DUIQuickGetter(int, GetInt(), LogonState, Specified)
|
||
|
HRESULT SetLogonState(int v) DUIQuickSetter(CreateInt(v), LogonState)
|
||
|
void SetRunningApps(DWORD dwRunningApps) {_dwRunningApps = dwRunningApps;}
|
||
|
void SetUnreadMail(DWORD dwUnreadMail) {_dwUnreadMail = dwUnreadMail;}
|
||
|
LPCWSTR GetUsername() {return _pvUsername->GetString();}
|
||
|
static LogonAccount* GetCandidate() { return _peCandidate; }
|
||
|
static void ClearCandidate() { _peCandidate = NULL; }
|
||
|
static void SetKeyboardIcon(HICON hIcon);
|
||
|
// ClassInfo accessors (static and virtual instance-based)
|
||
|
static IClassInfo* Class;
|
||
|
virtual IClassInfo* GetClassInfo() { return Class; }
|
||
|
static HRESULT Register();
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
// Animations / Effects
|
||
|
HRESULT FxLogUserOn();
|
||
|
#endif
|
||
|
|
||
|
LogonAccount() { }
|
||
|
virtual ~LogonAccount();
|
||
|
HRESULT Initialize();
|
||
|
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
// Animations / Effects
|
||
|
HRESULT FxMouseWithin(EFadeDirection dir);
|
||
|
#endif
|
||
|
|
||
|
// References to key descendents
|
||
|
Button* _pbStatus[2];
|
||
|
|
||
|
static Element* _pePwdPanel;
|
||
|
static Edit* _pePwdEdit;
|
||
|
static Button* _pbPwdInfo;
|
||
|
static Element* _peKbdIcon;
|
||
|
static LogonAccount* _peCandidate;
|
||
|
|
||
|
Value* _pvUsername;
|
||
|
Value* _pvHint;
|
||
|
BOOL _fPwdNeeded;
|
||
|
BOOL _fLoggedOn;
|
||
|
BOOL _fHasPwdPanel;
|
||
|
DWORD _dwUnreadMail;
|
||
|
DWORD _dwRunningApps;
|
||
|
|
||
|
};
|
||
|
|
||
|
void CALLBACK LogonParseError(LPCWSTR pszError, LPCWSTR pszToken, int dLine);
|
||
|
|
||
|
#endif // LOGON__Logon_h__INCLUDED
|
||
|
|