// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // MultiViewCtl.h : Declaration of the CMultiViewCtrl OLE control class. ///////////////////////////////////////////////////////////////////////////// // CMultiViewCtrl : See MultiViewCtl.cpp for implementation. #define ID_DISPLAYNOINSTANCES WM_USER + 53 #define ID_INSTENUMDONE WM_USER + 54 #define ID_GETASYNCINSTENUMSINK WM_USER + 55 #define ID_ASYNCENUM_DONE WM_USER + 56 #define ID_ASYNCENUM_CANCEL WM_USER + 57 #define ID_ENUM_DOMODAL WM_USER + 58 #define ID_ASYNCQUERY_DONE WM_USER + 59 #define ID_ASYNCQUERY_CANCEL WM_USER + 60 #define ID_QUERYDONE WM_USER + 61 #define ID_GETASYNCQUERYSINK WM_USER + 62 #define ID_QUERY_DOMODAL WM_USER + 63 #define ID_ASYNCQUERY_DISPLAY WM_USER + 64 #define ID_SYNC_ENUM_DOMODAL WM_USER + 65 #define ID_SYNC_ENUM WM_USER + 66 #define ID_SYNC_ENUM_DONE WM_USER + 67 #define INITSERVICES WM_USER + 68 #define CREATE_DIALOG_WITH_DELAY WM_USER + 69 #define END_THE_THREAD WM_USER + 70 #define INITIALIZE_NAMESPACE WM_USER + 300 class CProgressDlg; struct Pair { CString csInst1; CString csInst2; CString csParent; }; #define PROPFILTER_SYSTEM 1 #define PROPFILTER_INHERITED 2 #define PROPFILTER_LOCAL 4 class CMultiViewCtrl; class CAsyncEnumSinkThread; class CAsyncEnumDialog; class CAsyncQueryDialog; class CAsyncQuerySink; class CAsyncInstEnumSink; class CSyncEnumDlg; class CMultiViewGrid : public CGrid { public: void CheckForSelectionChange(); void SyncSelectionIndex() {m_iSelectedRow = GetSelectedRow(); } BOOL IsNoInstanceRow(int iRow); protected: CMultiViewGrid() {SyncSelectionIndex(); } void SetParent (CMultiViewCtrl *pParent) {m_pParent = pParent;} void OnCellDoubleClicked(int iRow, int iCol); void SetRowEditFlag(int nRow, BOOL bEdit = FALSE); void OnCellClicked(int iRow, int iCol); void OnSetToNoSelection(); void OnRowHandleClicked(int iRow); void OnRowHandleDoubleClicked(int iRow); void OnHeaderItemClick(int iColumn); void OnRequestUIActive(); int CompareRows(int iRow1, int iRow2, int iSortOrder); BOOL CMultiViewGrid::OnRowKeyDown (int iRow, UINT nChar, UINT nRepCnt, UINT nFlags); CMultiViewCtrl *m_pParent; CWordArray m_cwaColWidth; friend class CMultiViewCtrl; private: int m_iSelectedRow; }; class CMVContext : public IUnknown { protected: long m_lRef; int m_nContextType; CString m_csClass; CString m_csQuery; CString m_csQueryType; CString m_csLabel; CStringArray m_csaInstances; BOOL m_bContextDrawn; CString m_csNamespace; public: CMVContext() : m_nContextType(Unitialized), m_lRef(0), m_bContextDrawn(FALSE){} CMVContext(CMVContext &rhs); CMVContext &operator=(const CMVContext &rhs); BOOL IsContextEqual(CMVContext &cmvcContext); ~CMVContext() {m_lRef = 0; m_bContextDrawn = FALSE; m_nContextType = Unitialized; m_csClass.Empty(); m_csQuery.Empty(); m_csQueryType.Empty(); m_csLabel.Empty(); m_csaInstances.RemoveAll(); m_csNamespace.Empty();} enum ContextType {Class, Query, Instances, Unitialized}; int &GetType() {return m_nContextType;} CString &GetClass() {return m_csClass;} CString &GetQuery() {return m_csQuery;} CString &GetQueryType() {return m_csQueryType;} CString &GetLabel() {return m_csLabel;} CStringArray &GetInstances() {return m_csaInstances;} CString &GetNamespace() {return m_csNamespace;} BOOL &IsDrawn() {return m_bContextDrawn;} // // IUnknown members // STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); }; class CAsyncQuerySink : public IWbemObjectSink { protected: long m_lRef; CMultiViewCtrl *m_pMultiViewCtrl; long m_lAsyncRequestHandle; UINT m_uSinkTimer; public: CAsyncQuerySink(CMultiViewCtrl *pMultiViewCtrl = NULL) : m_lRef(0), m_lAsyncRequestHandle(0), m_uSinkTimer(0), m_pMultiViewCtrl(pMultiViewCtrl) {} ~CAsyncQuerySink(); void ShutDownSink(); HRESULT STDMETHODCALLTYPE SetStatus( /* [in] */ long lFlags, /* [in] */ long lParam, /* [in] */ BSTR strParam, /* [in] */ IWbemClassObject __RPC_FAR *pObjParam) {return S_OK; } // // IUnknown members // STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); /* IDispatch methods */ STDMETHOD(GetTypeInfoCount)(UINT* pctinfo) {return E_NOTIMPL;} STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;} STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {return E_NOTIMPL;} STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {return E_NOTIMPL;} STDMETHOD_(SCODE, Indicate)(long lObjectCount, IWbemClassObject FAR* FAR* pObjArray); friend class CMultiViewCtrl; friend class CAsyncQuerySinkThread; }; class CAsyncInstEnumSink : public IWbemObjectSink { protected: long m_lRef; CMultiViewCtrl *m_pMultiViewCtrl; long m_lAsyncRequestHandle; UINT m_uSinkTimer; public: CAsyncInstEnumSink(CMultiViewCtrl *pMultiViewCtrl = NULL) : m_lRef(0), m_lAsyncRequestHandle(0), m_uSinkTimer(0), m_pMultiViewCtrl(pMultiViewCtrl) {} ~CAsyncInstEnumSink(); HRESULT STDMETHODCALLTYPE SetStatus( /* [in] */ long lFlags, /* [in] */ long lParam, /* [in] */ BSTR strParam, /* [in] */ IWbemClassObject __RPC_FAR *pObjParam) {return S_OK; } void ShutDownSink(); // // IUnknown members // STDMETHODIMP QueryInterface(REFIID, LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); /* IDispatch methods */ STDMETHOD(GetTypeInfoCount)(UINT* pctinfo) {return E_NOTIMPL;} STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;} STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {return E_NOTIMPL;} STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {return E_NOTIMPL;} STDMETHOD_(SCODE, Indicate)(long lObjectCount, IWbemClassObject FAR* FAR* pObjArray); friend class CMultiViewCtrl; friend class CAsyncEnumSinkThread; }; class CMultiViewCtrl : public COleControl { DECLARE_DYNCREATE(CMultiViewCtrl) // Constructor public: CMultiViewCtrl(); enum { NONE, CLASS, INSTANCES, ZERO_CLASS_INST}; // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMultiViewCtrl) public: virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid); virtual void DoPropExchange(CPropExchange* pPX); virtual void OnResetState(); virtual BOOL PreTranslateMessage(MSG* pMsg); //}}AFX_VIRTUAL // Implementation protected: afx_msg void OnContextMenu(CWnd*, CPoint point); ~CMultiViewCtrl(); CString m_csNameSpace; CString m_csClass; CStringArray m_csaProps; CMapStringToPtr m_cmstpPropFlavors; int m_nClassOrInstances; // 0 = none, 1 = class, 2 = instances; void InitializeDisplay (CString *pcsClass, CPtrArray *pcpaInstances, CStringArray *pcsaProps, CString *pcsMessage = NULL, CMapStringToPtr *pcmstpPropFlavors = NULL); BOOL IsColVisible(long lFilter, long lFlavor); void SetAllColVisibility( CStringArray *pcsaProps, CMapStringToPtr *pcmstpPropFlavors); void AddToDisplay(CPtrArray *pcpaInstances); void InitializeDisplayMessage(CString *pcsMessage); void OnRequestUIActive(); IWbemClassObject *CommonParent(CStringArray *pcsaPaths); IWbemClassObject *LowestCommonParent(CStringArray *pcsaPaths); IWbemClassObject *ParentFromDerivations(CStringArray **pcsaDerivation, int iIndex); BOOL ClassInClasses(CStringArray *pcsaClasses, CString *pcsParent); IWbemClassObject *GetClassFromAnyNamespace(CString &csClass); CString GetIWbemClassPath (IWbemServices *pProv, IWbemClassObject *pimcoObject); int ObjectInGrid(CString *pcsPathIn); CMultiViewGrid m_cgGrid; IWbemServices *m_pServices; SCODE m_sc; BOOL m_bUserCancel; BOOL m_bInOnDraw; BOOL m_bInitServices; CPoint m_cpRightUp; int m_iContextRow; IWbemServices *InitServices(CString *pcsNameSpace); IWbemServices *GetIWbemServices(CString &rcsNamespace); CSyncEnumDlg *m_pcsedDialog; CAsyncEnumDialog *m_pcaedDialog; CAsyncQueryDialog *m_pcaqdDialog; int m_nInstances; BOOL m_pAsyncEnumCancelled; BOOL m_pAsyncEnumRunning; BOOL m_pAsyncQueryCancelled; BOOL m_pAsyncQueryRunning; SCODE GetInstancesAsync (IWbemServices * pIWbemServices, CString *pcsClass); SCODE SemiSyncClassInstancesIncrementalAddToDisplay (IWbemServices * pIWbemServices, IWbemClassObject *pimcoClass, CString *pcsClass, CPtrArray &cpaInstances, int &cInst, BOOL &bCancel); SCODE SemiSyncQueryInstancesIncrementalAddToDisplay (IWbemServices * pIWbemServices, IEnumWbemClassObject *pimecoInstanceEnum, CPtrArray &cpaInstances,int &cInst, BOOL &bCancel); SCODE SemiSyncQueryInstancesNonincrementalAddToDisplay (CPtrArray *& pcpaInstances, IEnumWbemClassObject *pemcoObjects, BOOL &bCancel); SCODE GetQueryInstancesAsync ( IWbemServices * pIWbemServices, CString *pcsQueryType, CString *pcsQuery); CString m_csSyncEnumClass; BOOL m_bSelectionNotChanging; CProgressDlg *m_pProgressDlg; void SetProgressDlgMessage(CString &csMessage); void CreateProgressDlgWindow(); BOOL CheckCancelButtonProgressDlgWindow(); void DestroyProgressDlgWindow(); void PumpMessagesProgressDlgWindow(); void ViewClassInstancesSync(LPCTSTR lpszClassName); void ViewClassInstancesAsync(LPCTSTR lpszClassName); void QueryViewInstancesSync (LPCTSTR szTitle, LPCTSTR szQueryType, LPCTSTR szQuery, LPCTSTR szClass); void QueryViewInstancesAsync (LPCTSTR szTitle, LPCTSTR szQueryType, LPCTSTR szQuery, LPCTSTR szClass); void QueryViewInstancesSyncWithoutClass (LPCTSTR szTitle, LPCTSTR szQueryType, LPCTSTR szQuery); void QueryViewInstancesSyncWithClass (LPCTSTR szTitle, LPCTSTR szQueryType, LPCTSTR szQuery, LPCTSTR szClass); CMVContext *m_pcmvcCurrentContext; SCODE ViewInstancesInternal(LPCTSTR szTitle, CStringArray &rcsaPathArray); HICON LoadIcon(CString pcsFile); CAsyncInstEnumSink *m_pInstEnumObjectSink; CAsyncQuerySink *m_pAsyncQuerySink; IWbemServices *m_pServicesForAsyncSink; CString m_csClassForAsyncSink; CString m_csQueryTypeForAsyncSink; CString m_csQueryForAsyncSink; CPtrArray m_cpaInstancesForQuery; CString m_csNamespaceToInit; DECLARE_OLECREATE_EX(CMultiViewCtrl) // Class factory and guid DECLARE_OLETYPELIB(CMultiViewCtrl) // GetTypeInfo DECLARE_PROPPAGEIDS(CMultiViewCtrl) // Property page IDs DECLARE_OLECTLTYPE(CMultiViewCtrl) // Type name and misc status // Message maps //{{AFX_MSG(CMultiViewCtrl) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnDestroy(); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); afx_msg void OnMenuitemgotosingle(); afx_msg void OnUpdateMenuitemgotosingle(CCmdUI* pCmdUI); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg void OnKillFocus(CWnd* pNewWnd); //}}AFX_MSG afx_msg LRESULT DisplayNoInstances(WPARAM, LPARAM); afx_msg LRESULT InstEnumDone(WPARAM, LPARAM); afx_msg LRESULT QueryDone(WPARAM, LPARAM); afx_msg LRESULT GetEnumSink(WPARAM, LPARAM); afx_msg LRESULT GetQuerySink(WPARAM, LPARAM); afx_msg LRESULT EnumDoModalDialog(WPARAM, LPARAM); afx_msg LRESULT SyncEnumDoModalDialog(WPARAM, LPARAM); afx_msg LRESULT SyncEnum(WPARAM, LPARAM); afx_msg LRESULT QueryDoModalDialog(WPARAM, LPARAM); afx_msg LRESULT AsyncEnumCancelled(WPARAM, LPARAM); afx_msg LRESULT AsyncQueryCancelled(WPARAM, LPARAM); afx_msg LRESULT DisplayAsyncQueryInstances(WPARAM, LPARAM); afx_msg LRESULT InitServices(WPARAM, LPARAM); afx_msg LRESULT OpenNamespace(WPARAM, LPARAM); DECLARE_MESSAGE_MAP() // Dispatch maps //{{AFX_DISPATCH(CMultiViewCtrl) afx_msg BSTR GetNameSpace(); afx_msg void SetNameSpace(LPCTSTR lpszNewValue); afx_msg long GetPropertyFilter(); afx_msg void SetPropertyFilter(long nNewValue); afx_msg void ViewClassInstances(LPCTSTR lpszClassName); afx_msg void ForceRedraw(); afx_msg long CreateInstance(); afx_msg long DeleteInstance(); afx_msg long GetContext(long FAR* pCtxHandle); afx_msg long RestoreContext(long lCtxtHandle); afx_msg long AddContextRef(long lCtxtHandle); afx_msg long ReleaseContext(long lCtxtHandle); afx_msg long GetEditMode(); afx_msg BSTR GetObjectPath(long lPosition); afx_msg BSTR GetObjectTitle(long lPosition); afx_msg long GetTitle(BSTR FAR* pbstrTitle, LPDISPATCH FAR* lpPictDisp); afx_msg BSTR GetViewTitle(long lPosition); afx_msg long NextViewTitle(long lPosition, BSTR FAR* pbstrTitle); afx_msg void ExternInstanceCreated(LPCTSTR szObjectPath); afx_msg void ExternInstanceDeleted(LPCTSTR szObjectPath); afx_msg void NotifyWillShow(); afx_msg long PrevViewTitle(long lPosition, BSTR FAR* pbstrTitle); afx_msg long QueryCanCreateInstance(); afx_msg long QueryCanDeleteInstance(); afx_msg long QueryNeedsSave(); afx_msg long QueryObjectSelected(); afx_msg long RefreshView(); afx_msg long SaveData(); afx_msg long SelectView(long lPosition); afx_msg void SetEditMode(long bCanEdit); afx_msg long StartObjectEnumeration(long lWhere); afx_msg long StartViewEnumeration(long lWhere); afx_msg long ViewInstances(LPCTSTR szTitle, const VARIANT FAR& varPathArray); afx_msg void QueryViewInstances(LPCTSTR szTitle, LPCTSTR szQueryType, LPCTSTR szQuery, LPCTSTR szClass); afx_msg long NextObject(long lPosition); afx_msg long PrevObject(long lPosition); afx_msg long SelectObjectByPath(LPCTSTR szObjectPath); afx_msg long SelectObjectByPosition(long lPosition); //}}AFX_DISPATCH DECLARE_DISPATCH_MAP() afx_msg void AboutBox(); // Event maps //{{AFX_EVENT(CMultiViewCtrl) void FireNotifyViewModified() {FireEvent(eventidNotifyViewModified,EVENT_PARAM(VTS_NONE));} void FireNotifySelectionChanged() {FireEvent(eventidNotifySelectionChanged,EVENT_PARAM(VTS_NONE));} void FireNotifySaveRequired() {FireEvent(eventidNotifySaveRequired,EVENT_PARAM(VTS_NONE));} void FireNotifyViewObjectSelected(LPCTSTR szObjectPath) {FireEvent(eventidNotifyViewObjectSelected,EVENT_PARAM(VTS_BSTR), szObjectPath);} void FireGetIWbemServices(LPCTSTR lpctstrNamespace, VARIANT FAR* pvarUpdatePointer, VARIANT FAR* pvarServices, VARIANT FAR* pvarSC, VARIANT FAR* pvarUserCancel) {FireEvent(eventidGetIWbemServices,EVENT_PARAM(VTS_BSTR VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT), lpctstrNamespace, pvarUpdatePointer, pvarServices, pvarSC, pvarUserCancel);} void FireNotifyContextChanged(long bPushContext) {FireEvent(eventidNotifyContextChanged,EVENT_PARAM(VTS_I4), bPushContext);} void FireRequestUIActive() {FireEvent(eventidRequestUIActive,EVENT_PARAM(VTS_NONE));} //}}AFX_EVENT DECLARE_EVENT_MAP() friend class CMultiViewGrid; friend class CAsyncInstEnumSink; friend class CAsyncEnumSinkThread; friend class CAsyncEnumDialog; friend class CAsyncQuerySink; friend class CAsyncQuerySinkThread; friend class CAsyncQueryDialog; friend class CSyncEnumDlg; // Dispatch and event IDs public: enum { //{{AFX_DISP_ID(CMultiViewCtrl) dispidViewClassInstances = 3L, dispidForceRedraw = 4L, dispidCreateInstance = 5L, dispidDeleteInstance = 6L, dispidGetContext = 7L, dispidRestoreContext = 8L, dispidAddContextRef = 9L, dispidReleaseContext = 10L, dispidGetEditMode = 11L, dispidGetObjectPath = 12L, dispidGetObjectTitle = 13L, dispidGetTitle = 14L, dispidGetViewTitle = 15L, dispidNextViewTitle = 16L, dispidExternInstanceCreated = 17L, dispidExternInstanceDeleted = 18L, dispidNotifyWillShow = 19L, dispidPrevViewTitle = 20L, dispidQueryCanCreateInstance = 21L, dispidQueryCanDeleteInstance = 22L, dispidQueryNeedsSave = 23L, dispidQueryObjectSelected = 24L, dispidRefreshView = 25L, dispidSaveData = 26L, dispidSelectView = 27L, dispidSetEditMode = 28L, dispidStartObjectEnumeration = 29L, dispidStartViewEnumeration = 30L, dispidViewInstances = 31L, dispidQueryViewInstances = 32L, dispidNextObject = 33L, dispidPrevObject = 34L, dispidSelectObjectByPath = 35L, dispidSelectObjectByPosition = 36L, eventidNotifyViewModified = 1L, eventidNotifySelectionChanged = 2L, eventidNotifySaveRequired = 3L, eventidNotifyViewObjectSelected = 4L, eventidGetIWbemServices = 5L, eventidNotifyContextChanged = 6L, eventidRequestUIActive = 7L, //}}AFX_DISP_ID }; private: BOOL m_bCanEdit; // TRUE = Studio mode, FALSE = Browser mode long m_lPropFilterFlags; BOOL m_bPropFilterFlagsChanged; };