|
|
// ARP.h
//
// Default position and size
#define ARP_DEFAULT_POS_X 35
#define ARP_DEFAULT_POS_Y 10
#define ARP_DEFAULT_WIDTH 730
#define ARP_DEFAULT_HEIGHT 530
// Class definitions
// Frame
// Thread-safe API types
#define ARP_SETINSTALLEDITEMCOUNT 0 // pData is count
#define ARP_DECREMENTINSTALLEDITEMCOUNT 1
#define ARP_INSERTINSTALLEDITEM 2 // InsertItemData struct
#define ARP_INSERTPUBLISHEDITEM 3
#define ARP_INSERTOCSETUPITEM 4
#define ARP_SETPUBLISHEDFEEDBACKEMPTY 5
#define ARP_POPULATECATEGORYCOMBO 6
#define ARP_PUBLISHEDLISTCOMPLETE 7
#define ARP_SETPUBLISHEDITEMCOUNT 8
#define ARP_DECREMENTPUBLISHEDITEMCOUNT 9
#define ARP_DONEINSERTINSTALLEDITEM 10
#define WM_ARPWORKERCOMPLETE WM_USER + 1024
Element* FindDescendentByName(Element* peRoot, LPCWSTR pszName); Element* GetNthChild(Element *peRoot, UINT index);
// Thread-safe API structures
struct InsertItemData { IInstalledApp* piia; IPublishedApp* pipa; PUBAPPINFO* ppai; COCSetupApp* pocsa;
WCHAR pszTitle[MAX_PATH]; WCHAR pszImage[MAX_PATH]; int iIconIndex; ULONGLONG ullSize; FILETIME ftLastUsed; int iTimesUsed; DWORD dwActions; bool bSupportInfo; bool bDuplicateName; };
enum SortType { SORT_NAME = 0, SORT_SIZE, SORT_TIMESUSED, SORT_LASTUSED, };
class ARPClientCombo; class Expando; class Clipper; class ClientBlock;
enum CLIENTFILTER { CLIENTFILTER_OEM, CLIENTFILTER_MS, CLIENTFILTER_NONMS, };
class ARPSelector: public Selector { public: static HRESULT Create(OUT Element** ppElement); // Generic events
virtual void OnEvent(Event* pEvent);
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register();
// Bypass Selector::OnKeyFocusMoved because Selector will change the
// selection when focus changes, but we don't want that.
virtual void OnKeyFocusMoved(Element *peFrom, Element *peTo) {Element::OnKeyFocusMoved(peFrom, peTo);}
virtual Element *GetAdjacent(Element *peFrom, int iNavDir, NavReference const *pnr, bool bKeyable); };
class ARPFrame : public HWNDElement, public Proxy { public: static HRESULT Create(OUT Element** ppElement); static HRESULT Create(NativeHWNDHost* pnhh, bool bDblBuffer, OUT Element** ppElement);
// Initialize IDs and hold parser, called after contents are filled
bool Setup(Parser* pParser, int uiStartPane);
// Thread-safe APIs (do any additional work on callers thread and then marshal)
void SetInstalledItemCount(UINT cItems); void DecrementInstalledItemCount(); void SetPublishedItemCount(UINT cItems); void DecrementPublishedItemCount(); void SortItemList(); void SortList(int iNew, int iOld); CompareCallback GetCompareFunction(); void InsertInstalledItem(IInstalledApp* piia); void InsertPublishedItem(IPublishedApp* pipa, bool bDuplicateName); void InsertOCSetupItem(COCSetupApp* pocsa); void PopulateCategoryCombobox(); SHELLAPPCATEGORYLIST* GetShellAppCategoryList() {return _psacl;} void SetShellAppCategoryList(SHELLAPPCATEGORYLIST* psacl) {_psacl = psacl;} LPCWSTR GetCurrentPublishedCategory(); void FeedbackEmptyPublishedList(); void DirtyPublishedListFlag(); void DirtyInstalledListFlag(); void RePopulateOCSetupItemList(); bool OnClose(); // return 0 to fail
// Generic events
virtual void OnEvent(Event* pEvent); //
// NTRAID#NTBUG9-314154-2001/3/12-brianau Handle Refresh
//
// Need to finish this for Whistler.
//
virtual void OnInput(InputEvent *pEvent); //
virtual void OnKeyFocusMoved(Element* peFrom, Element* peTo); void OnPublishedListComplete(); virtual void RestoreKeyFocus() { if(peLastFocused) peLastFocused->SetKeyFocus();} virtual bool CanSetFocus(); bool GetPublishedComboFilled() {return _bPublishedComboFilled;} void SetPublishedComboFilled(bool bPublishedComboFilled) {_bPublishedComboFilled = bPublishedComboFilled;} bool GetPublishedListFilled () {return _bPublishedListFilled;} void SetPublishedListFilled (bool bPublishedListFilled) {_bPublishedListFilled = bPublishedListFilled;} bool IsChangeRestricted(); virtual SetModalMode(bool ModalMode) { _bInModalMode = ModalMode;} HWND GetHostWindow() {if (_pnhh) return _pnhh->GetHWND(); return NULL;} void SelectInstalledApp(IInstalledApp* piia); void SelectClosestApp(IInstalledApp* piia); void UpdateInstalledItems(); void RunOCManager(); void ChangePane(Element *pePane); void PutFocusOnList(Selector* peList);
// If all else fails, focus goes to the Places pane
Element* FallbackFocus() { return _peOptionList->GetSelection(); }
HRESULT InitClientCombos(Expando* pexParent, CLIENTFILTER cf);
HRESULT CreateStyleParser(Parser** ppParser);
Parser* GetStyleParser() { return _pParserStyle; } HRESULT CreateElement(LPCWSTR pszResID, Element* peSubstitute, OUT Element** ppElement) { return _pParser->CreateElement(pszResID, peSubstitute, ppElement); }
virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// We allocate zero-initialized so you don't need to set things to 0.
ARPFrame() {_bInDomain = true; _curCategory = CB_ERR; } virtual ~ARPFrame(); HRESULT Initialize(NativeHWNDHost* pnhh, bool fDlbBuffer);
// Callee thread-safe invoke sink
virtual void OnInvoke(UINT nType, void* pData);
// HACK! The value of 350ms is hard-coded here and in DirectUI
void ManageAnimations(); bool IsFrameAnimationEnabled() { return _bAnimationEnabled; } int GetAnimationTime() { return IsFrameAnimationEnabled() ? 350 : 0; }
ClientBlock* FindClientBlock(LPCWSTR pwszType); HRESULT LaunchClientCommandAndWait(UINT ids, LPCTSTR pszName, LPTSTR pszCommand); void InitProgressDialog(); void SetProgressFakeMode(bool bFake) { _bFakeProgress = bFake; } void SetProgressDialogText(UINT ids, LPCTSTR pszName); void EndProgressDialog();
// Managing the OK button.
void BlockOKButton() { if (++_cBlockOK == 1) { _peOK->SetEnabled(false); } } void UnblockOKButton() { if (--_cBlockOK == 0) { _peOK->SetEnabled(true); } }
private: NativeHWNDHost* _pnhh;
// ARP parser (tree resources)
Parser* _pParser; // ARP parser for styles (multiple UI files available for different looks)
Parser* _pParserStyle; BOOL _fThemedStyle; HANDLE _arH[LASTHTHEME+1];
// ARP frame option list (navigation bar)
ARPSelector* _peOptionList;
// ARP installed item list
Selector* _peInstalledItemList; HDSA _hdsaInstalledItems; int _cMaxInstalledItems;
// ARP published item list
Selector* _pePublishedItemList; HDSA _hdsaPublishedItems; int _cMaxPublishedItems;
// ARP OC Setup item list
Selector* _peOCSetupItemList;
// ARP Current item list
Selector* _peCurrentItemList;
// ARP Sort by Combobox
Combobox* _peSortCombo;
SHELLAPPCATEGORYLIST* _psacl; // ARP Published Category Combobox
Combobox* _pePublishedCategory; Element* _pePublishedCategoryLabel; int _curCategory; Element* peFloater; Element* peLastFocused;
// ARP "customization block" element
ARPSelector* _peClientTypeList; // The outer selector
Expando* _peOEMClients; // The four "big switches"
Expando* _peMSClients; Expando* _peNonMSClients; Expando* _peCustomClients;
Element* _peOK; // How to get out
Element* _peCancel;
// ARP Panes
Element* _peChangePane; Element* _peAddNewPane; Element* _peAddRmWinPane; Element* _pePickAppPane;
// Number of items blocking the OK button from being enabled
// (If this is 0, then OK is enabled)
int _cBlockOK;
// ARP Current Sort Type
SortType CurrentSortType;
bool _bTerminalServer; bool _bPublishedListFilled; bool _bInstalledListFilled; bool _bOCSetupListFilled; bool _bPublishedComboFilled; bool _bDoubleBuffer; bool _bInModalMode; bool _bSupportInfoRestricted; bool _bOCSetupNeeded; bool _bInDomain; bool _bAnimationEnabled; bool _bPickAppInitialized; bool _bFakeProgress; UINT _uiStartPane; class ARPHelp* _pah;
IProgressDialog* _ppd; DWORD _dwProgressTotal; DWORD _dwProgressSoFar;
bool ShowSupportInfo(APPINFODATA *paid); void PrepareSupportInfo(Element* peHelp, APPINFODATA *paid); void RePopulatePublishedItemList();
// Check for policies, apply as needed.
void ApplyPolices();
public:
// ARPFrame IDs (for identifying targets of events)
static ATOM _idChange; static ATOM _idAddNew; static ATOM _idAddRmWin; static ATOM _idClose; static ATOM _idAddFromDisk; static ATOM _idAddFromMsft; static ATOM _idComponents; static ATOM _idSortCombo; static ATOM _idCategoryCombo; static ATOM _idAddFromCDPane; static ATOM _idAddFromMSPane; static ATOM _idAddFromNetworkPane; static ATOM _idAddWinComponent; static ATOM _idPickApps; static ATOM _idOptionList;
// Helper thread handles
static HANDLE htPopulateInstalledItemList; static HANDLE htPopulateAndRenderOCSetupItemList; static HANDLE htPopulateAndRenderPublishedItemList;
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register(); };
// Item
class ARPItem : public Button { public: static HRESULT Create(OUT Element** ppElement);
// Generic events
virtual void OnEvent(Event* pEvent);
// 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(); void SortBy(int iNew, int iOld);
// ARP item IDs
static ATOM _idTitle; static ATOM _idIcon; static ATOM _idSize; static ATOM _idFreq; static ATOM _idLastUsed; static ATOM _idExInfo; static ATOM _idInstalled; static ATOM _idChgRm; static ATOM _idChg; static ATOM _idRm; static ATOM _idAdd; static ATOM _idConfigure; static ATOM _idSupInfo; static ATOM _idItemAction; static ATOM _idRow[3];
IInstalledApp* _piia; IPublishedApp* _pipa; PUBAPPINFO* _ppai;
COCSetupApp* _pocsa;
ARPFrame* _paf; UINT _iTimesUsed; FILETIME _ftLastUsed; ULONGLONG _ullSize; UINT _iIdx;
ARPItem() { _piia = NULL; _pipa = NULL; _ppai = NULL; _paf = NULL; _pocsa = NULL;} virtual ~ARPItem(); HRESULT Initialize(); void ShowInstalledString(BOOL bInstalled);
};
// Help box
class ARPHelp : public HWNDElement, public Proxy { public: static HRESULT Create(OUT Element** ppElement); static HRESULT Create(NativeHWNDHost* pnhh, ARPFrame* paf, bool bDblBuffer, OUT Element** ppElement); NativeHWNDHost* GetHost() {return _pnhh;}
virtual void OnDestroy();
// Generic events
virtual void OnEvent(Event* pEvent); void ARPHelp::SetDefaultFocus();
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register(); IInstalledApp* _piia;
ARPHelp() {_paf = NULL;} virtual ~ARPHelp(); HRESULT Initialize(NativeHWNDHost* pnhh, ARPFrame* paf, bool bDblBuffer);
private: NativeHWNDHost* _pnhh; ARPFrame* _paf; HRESULT Initialize(); };
class ARPSupportItem : public Element { public: static HRESULT Create(OUT Element** ppElement);
// System events
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
// Generic events
virtual void OnEvent(Event* pEvent);
// Property definitions
static PropertyInfo* URLProp;
// Quick property accessors
const LPWSTR GetURL(Value** ppv) DUIQuickGetterInd(GetString(), URL, Specified) HRESULT SetURL(LPCWSTR v) DUIQuickSetter(CreateString(v), URL)
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register(); IInstalledApp* _piia;
ARPSupportItem() { } virtual ~ARPSupportItem() { } HRESULT Initialize();
private: Element* GetChild(UINT index); };
class CLIENTINFO { public: static CLIENTINFO* Create(HKEY hkApp, HKEY hkInfo, LPCWSTR pszKey); void Delete() { HDelete(this); }
static int __cdecl QSortCMP(const void*, const void*); bool IsSentinel() { return _pszKey == NULL; } bool IsKeepUnchanged() { return IsSentinel() && _pe; } bool IsPickFromList() { DUIAssertNoMsg(_pe || IsSentinel()); return !_pe; }
void SetFriendlyName(LPCWSTR pszName) { FindDescendentByName(_pe, L"radiotext")->SetContentString(pszName); FindDescendentByName(_pe, L"setdefault")->SetAccName(pszName); }
void SetMSName(LPCWSTR pszMSName);
LPCWSTR GetFilteredName(CLIENTFILTER cf) { LPCWSTR pszName = _pszName; if (cf == CLIENTFILTER_MS && _pvMSName && _pvMSName->GetString()) { pszName = _pvMSName->GetString(); } return pszName; }
Element* GetSetDefault() { return FindDescendentByName(_pe, L"setdefault"); }
Element* GetShowCheckbox() { return FindDescendentByName(_pe, L"show"); }
HRESULT SetShowCheckbox(bool bShow) { return GetShowCheckbox()->SetSelected(bShow); }
bool IsShowChecked() { return GetShowCheckbox()->GetSelected(); }
bool GetInstallFile(HKEY hkInfo, LPCTSTR pszValue, LPTSTR pszBuf, UINT cchBuf, bool fFile); bool GetInstallCommand(HKEY hkInfo, LPCTSTR pszValue, LPTSTR pszBuf, UINT cchBuf);
public: ~CLIENTINFO(); // to be used only by HDelete()
private: bool Initialize(HKEY hkApp, HKEY hkInfo, LPCWSTR pszKey);
public: LPWSTR _pszKey; LPWSTR _pszName; Value * _pvMSName; Element*_pe; bool _bShown; // Actual show/hide state
bool _bOEMDefault; // Is this the OEM default client?
TRIBIT _tOEMShown; // OEM desired show/hide state
};
class StringList { public: StringList() { DUIAssertNoMsg(_pdaStrings == NULL && _pszBuf == NULL); } HRESULT SetStringList(LPCTSTR pszInit); // semicolon-separated list
void Reset(); ~StringList() { Reset(); } bool IsStringInList(LPCTSTR pszFind);
private: DynamicArray<LPTSTR>* _pdaStrings; LPTSTR _pszBuf; };
class ClientPicker: public Element { typedef Element super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// overrides
virtual ~ClientPicker(); HRESULT Initialize();
// Property definitions
static PropertyInfo* ClientTypeProp; static PropertyInfo* ParentExpandedProp;
// Quick property accessors
const LPWSTR GetClientTypeString(Value** ppv) { return (*ppv = GetValue(ClientTypeProp, PI_Specified))->GetString(); } HRESULT SetClientTypeString(LPCWSTR v) DUIQuickSetter(CreateString(v), ClientType) bool GetParentExpanded() DUIQuickGetter(bool, GetBool(), ParentExpanded, Specified) HRESULT SetParentExpanded(bool v) DUIQuickSetter(CreateBool(v), ParentExpanded)
// System events
virtual void OnEvent(Event* pEvent); 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();
// Customization
CLIENTFILTER GetFilter() { return _cf; } HRESULT SetFilter(CLIENTFILTER cf, ARPFrame* paf);
HRESULT TransferToCustom();
// to be used by ClientBlock::InitializeClientPicker
DynamicArray<CLIENTINFO*>* GetClientList() { return _pdaClients; } void AddClientToOEMRow(LPCWSTR pszName, CLIENTINFO* pci); HRESULT AddKeepUnchanged(CLIENTINFO* pciKeepUnchanged); void SetNotEmpty() { _bEmpty = false; }
// to be used by SetFilterCB
bool IsEmpty() { return _bEmpty; }
// to be used by ClientBlock::TransferFromClientPicker
CLIENTINFO* GetSelectedClient();
// to be used by ARPFrame when metrics change
void CalculateWidth();
private: static void CALLBACK s_DelayShowCombo(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); void _DelayShowCombo(); void _CancelDelayShowCombo(); bool _NeedsCombo() { return GetClientList()->GetSize() > 1; } void _SyncUIActive(); void _SetStaticText(LPCWSTR pszText); void _CheckBlockOK(bool bSelected);
private: int _iSel; CLIENTFILTER _cf; bool _bFilledCombo; bool _bEmpty; bool _bUIActive; bool _bBlockedOK; // did I block the OK button?
HWND _hwndHost; DynamicArray<CLIENTINFO*>*_pdaClients; Element* _peStatic; Combobox* _peCombo; ClientBlock* _pcb; // associated client block
public: // manipulated from ClientBlock
Element* _peShowHide; };
class ClientBlock : public Element { typedef Element super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Property definitions
static PropertyInfo* ClientTypeProp; static PropertyInfo* WindowsClientProp; static PropertyInfo* OtherMSClientsProp; static PropertyInfo* KeepTextProp; static PropertyInfo* KeepMSTextProp; static PropertyInfo* PickTextProp;
// Quick property accessors
const LPWSTR GetClientTypeString(Value** ppv) DUIQuickGetterInd(GetString(), ClientType, Specified) HRESULT SetClientTypeString(LPCWSTR v) DUIQuickSetter(CreateString(v), ClientType) const LPWSTR GetWindowsClientString(Value** ppv) DUIQuickGetterInd(GetString(), WindowsClient, Specified) HRESULT SetWindowsClientString(LPCWSTR v) DUIQuickSetter(CreateString(v), WindowsClient) const LPWSTR GetOtherMSClientsString(Value** ppv) DUIQuickGetterInd(GetString(), OtherMSClients, Specified) HRESULT SetOtherMSClientsString(LPCWSTR v) DUIQuickSetter(CreateString(v), OtherMSClients) const LPWSTR GetKeepTextString(Value** ppv) DUIQuickGetterInd(GetString(), KeepText, Specified) HRESULT SetKeepTextString(LPCWSTR v) DUIQuickSetter(CreateString(v), KeepText) const LPWSTR GetKeepMSTextString(Value** ppv) DUIQuickGetterInd(GetString(), KeepMSText, Specified) HRESULT SetKeepMSTextString(LPCWSTR v) DUIQuickSetter(CreateString(v), KeepMSText) const LPWSTR GetPickTextString(Value** ppv) DUIQuickGetterInd(GetString(), PickText, Specified) HRESULT SetPickTextString(LPCWSTR v) DUIQuickSetter(CreateString(v), PickText)
// Generic events
virtual void OnEvent(Event* pEvent);
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register();
// overrides
HRESULT Initialize(); ~ClientBlock();
// post-parse initialization
HRESULT ParseCompleted(ARPFrame* paf); HRESULT AddStaticClientInfoToTop(PropertyInfo* ppi); HRESULT InitializeClientPicker(ClientPicker* pcp); HRESULT TransferFromClientPicker(ClientPicker* pcp);
// doing actual work
HRESULT Apply(ARPFrame* paf);
private: void _EnableShowCheckbox(Element* peRadio, bool fEnable);
enum CBTIER { // clients fall into one of these three tiers
CBT_NONMS, // third-party client
CBT_MS, // Microsoft client but not Windows default
CBT_WINDOWSDEFAULT, // Windows default client
}; inline bool IsThirdPartyClient(CBTIER cbt) { return cbt == CBT_NONMS; } inline bool IsMicrosoftClient(CBTIER cbt) { return cbt >= CBT_MS; } inline bool IsWindowsDefaultClient(CBTIER cbt) { return cbt == CBT_WINDOWSDEFAULT; }
CBTIER _GetClientTier(LPCTSTR pszClient); TRIBIT _GetFilterShowAdd(CLIENTINFO* pci, ClientPicker* pcp, bool* pbAdd);
HKEY _OpenClientKey(HKEY hkRoot = HKEY_LOCAL_MACHINE, DWORD dwAccess = KEY_READ); bool _GetDefaultClient(HKEY hkClient, HKEY hkRoot, LPTSTR pszBuf, LONG cchBuf); bool _IsCurrentClientNonWindowsMS(); void _RemoveEmptyOEMRow(Element* peShowHide, LPCWSTR pszName);
private: DynamicArray<CLIENTINFO*>* _pdaClients; StringList _slOtherMSClients; Selector* _peSel; };
class Expandable : public Element { typedef Element super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Everything inherits from Element; we just have a new property
// Property definitions
static PropertyInfo* ExpandedProp;
// Quick property accessors
bool GetExpanded() DUIQuickGetter(bool, GetBool(), Expanded, Specified) HRESULT SetExpanded(bool v) DUIQuickSetter(CreateBool(v), Expanded)
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register(); };
class Expando : public Expandable { typedef Expandable super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Generic events
virtual void OnEvent(Event* pEvent);
// System events
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
// Event types
static UID Click; // no parameters
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register();
HRESULT Initialize(); Clipper* GetClipper();
private: void FireClickEvent();
private: bool _fExpanding; };
class Clipper: public Expandable { typedef Expandable super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Self-layout methods
void _SelfLayoutDoLayout(int dWidth, int dHeight); SIZE _SelfLayoutUpdateDesiredSize(int dConstW, int dConstH, Surface* psrf);
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register();
HRESULT Initialize();
private: };
class AutoButton : public Button { typedef Button super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Generic events
virtual void OnEvent(Event* pEvent);
// 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();
// misc public stuff
void SyncDefAction();
private: };
class GradientLine : public Element { typedef Element super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Everything inherits from Element
// We use the foreground as the center color
// and the background as the edge color
// Rendering callbacks
void Paint(HDC hDC, const RECT* prcBounds, const RECT* prcInvalid, RECT* prcSkipBorder, RECT* prcSkipContent);
// ClassInfo accessors (static and virtual instance-based)
static IClassInfo* Class; virtual IClassInfo* GetClassInfo() { return Class; } static HRESULT Register();
private: COLORREF GetColorProperty(PropertyInfo* ppi); };
class BigElement : public Element { typedef Element super; // name for our superclass
public: static HRESULT Create(OUT Element** ppElement);
// Everything inherits from Element; we just have a new property
// Property definitions
static PropertyInfo* StringResIDProp;
// Quick property accessors
int GetStringResID() DUIQuickGetter(int, GetInt(), StringResID, Specified) HRESULT SetStringResID(int ids) DUIQuickSetter(CreateInt(ids), StringResID)
// 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(); };
class ARPParser : public Parser { public: static HRESULT Create(ARPFrame* paf, UINT uRCID, HINSTANCE hInst, PPARSEERRORCB pfnErrorCB, OUT Parser** ppParser); HRESULT Initialize(ARPFrame* paf, UINT uRCID, HINSTANCE hInst, PPARSEERRORCB pfnErrorCB);
virtual Value* GetSheet(LPCWSTR pszResID);
private: ARPFrame* _paf; HANDLE _arH[2]; };
|