// 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* _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* 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*_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* _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]; };