text: // qryprop.h  - Query node property pages header file
  
  #ifndef _QRYPROP_H_
  #define _QRYPROP_H_
  
  #include "scopenode.h"
  #include "atlwin.h"
  #include "atldlgs.h"
  #include "atlctrls.h"
  #include "rootprop.h"
  
  #include <list>
  
  class CQueryEditObj
  {
  public:
      CQueryEditObj(CQueryNode* pQueryNode) 
      {
          ASSERT(pQueryNode != NULL);
         
  		m_spQueryNode = pQueryNode;
  
          if( pQueryNode )
          {
              m_vObjInfo    = pQueryNode->Objects();
  		    m_vMenus      = pQueryNode->Menus();
          }
  
          m_iPageMax = -1;
          m_cRef     = 0;
      }
      
  	HRESULT LoadStrings(IStringTable* pStringTable)
      {    
          menucmd_vector::iterator itMenuCmd;
          for (itMenuCmd = Menus().begin(); itMenuCmd != Menus().end(); ++itMenuCmd)
          {
              HRESULT hr = (*itMenuCmd)->LoadName(pStringTable);
              RETURN_ON_FAILURE(hr);
          }
  
          return S_OK;
      }
  
      void  PageActive(HWND hwndPage);  
      BOOL  ApplyChanges(HWND hwndPage);
  
  	menucmd_vector& Menus() { return m_vMenus; }
  
      ULONG AddRef() { return ++m_cRef; }
      ULONG Release() 
      {
          ASSERT(m_cRef > 0);
  
          if (--m_cRef != 0) 
              return m_cRef; 
         
          delete this; 
          return 0;
      }
  
  
  public:
      CComPtr<CQueryNode> m_spQueryNode;
      QueryObjVector      m_vObjInfo;
  	menucmd_vector	    m_vMenus;   // Query Nodes now have menus
  
  private:
      int m_iPageMax;
      int m_cRef;
  };
  
  class CQueryGeneralPage : public CPropertyPageImpl<CQueryGeneralPage>
  {
  
  public:
      typedef CPropertyPageImpl<CQueryGeneralPage> BC;
  
      // Constructor/destructor
      CQueryGeneralPage(CQueryEditObj* pEditObj);
      virtual ~CQueryGeneralPage();
  
      enum { IDD = IDD_QUERY_GENERAL_PAGE };
  
  protected:
      BEGIN_MSG_MAP( CQueryGeneralPage )
          MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
          MESSAGE_HANDLER(WM_CLOSE, OnClose)
  
          COMMAND_HANDLER(IDC_COMMENTS,   EN_CHANGE,  OnChange)
          COMMAND_HANDLER(IDC_QUERYSCOPE, BN_CLICKED, OnScopeChange)
          COMMAND_HANDLER(IDC_LOCALSCOPE, BN_CLICKED, OnScopeChange)
          CHAIN_MSG_MAP(BC)
      END_MSG_MAP()
  
      // message handlers
      LRESULT OnInitDialog( UINT mMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
      LRESULT OnClose( UINT mMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
      LRESULT OnChange( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnScopeChange( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
  
      // overrrides
      BOOL OnSetActive();
      BOOL OnApply();
  
  private:
      CQueryEditObj& m_EditObject;
  };
  
  
  class CQueryMenuPage : public CPropertyPageImpl<CQueryMenuPage>
  {
  public:
      typedef CPropertyPageImpl<CQueryMenuPage> BC;
  
      CQueryMenuPage(CQueryEditObj* pEditObj);
      virtual ~CQueryMenuPage();
  
      enum { IDD = IDD_QUERY_MENU_PAGE };
  
  protected:
      BEGIN_MSG_MAP( CQueryMenuPage )
          MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
          NOTIFY_HANDLER(IDC_MENULIST, LVN_ITEMCHANGED, OnMenuChanged)
          COMMAND_HANDLER(IDC_DEFAULTMENU, BN_CLICKED, OnDefaultChanged)
          COMMAND_HANDLER(IDC_OBJECTLIST, CBN_SELENDOK, OnObjectSelect)
          COMMAND_HANDLER(IDC_MOVEUP, BN_CLICKED, OnMoveUpDown)
          COMMAND_HANDLER(IDC_MOVEDOWN, BN_CLICKED, OnMoveUpDown);
  		COMMAND_HANDLER(IDC_PROPERTYMENU, BN_CLICKED, OnPropertyMenuChanged)
          CHAIN_MSG_MAP(BC)
      END_MSG_MAP()
  
      // handlers
      LRESULT OnInitDialog( UINT mMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
      LRESULT OnMenuChanged(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
      LRESULT OnObjectSelect( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnMoveUpDown( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnDefaultChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
      LRESULT OnPropertyMenuChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
  
      // overrrides       
      BOOL OnSetActive();
      BOOL OnApply();
  
      void DisplayMenus();
      void DisplayMenuItem(int iIndex, CMenuCmd* pMenuCmd, BOOL bEnabled);
      void SaveMenuSet();
  
  private:
      CQueryEditObj&  m_EditObject;
      CComboBox       m_ObjectCB;
      CListViewEx     m_MenuLV;
      CQueryObjInfo*  m_pObjSel;
      BOOL            m_bLoading;
      BOOL            m_DefaultID;
  };
  
  
  class CQueryViewPage : public CPropertyPageImpl<CQueryViewPage>
  {
  public:
      typedef CPropertyPageImpl<CQueryViewPage> BC;
  
      CQueryViewPage(CQueryEditObj* pEditObj);
      virtual ~CQueryViewPage();
  
      enum { IDD = IDD_QUERY_VIEW_PAGE };
  
  
  protected:
      BEGIN_MSG_MAP( CQueryViewPage )
          NOTIFY_HANDLER(IDC_COLUMNLIST, LVN_ITEMCHANGED, OnColumnChanged)
          NOTIFY_HANDLER(IDC_COLUMNLIST, LVN_COLUMNCLICK, OnColumnClick)
          COMMAND_HANDLER(IDC_OBJECTLIST, CBN_SELENDOK, OnObjectSelect )
          MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
          CHAIN_MSG_MAP(BC)
      END_MSG_MAP()
  
      // handlers
      LRESULT OnInitDialog( UINT mMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
      LRESULT OnObjectSelect( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnColumnChanged(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
      LRESULT OnColumnClick(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
  
      // overrrides       
      BOOL OnSetActive();
      BOOL OnApply();
  
      void DisplayColumns();
      void SaveColumnSet();
  
  private:
      CQueryEditObj&  m_EditObject;
      CQueryObjInfo*  m_pObjSel;
      CComboBox       m_ObjectCB;
      CListViewEx     m_ColumnLV;
      BOOL            m_bLoading;
  };
  
  class CQueryNodeMenuPage : public CPropertyPageImpl<CQueryNodeMenuPage>
  {
  public:
      typedef CPropertyPageImpl<CQueryNodeMenuPage> BC;
  
      CQueryNodeMenuPage(CQueryEditObj* pEditObj);
      virtual ~CQueryNodeMenuPage();
  
      enum { IDD = IDD_QUERY_NODE_MENU_PAGE };
  
  protected:
      BEGIN_MSG_MAP( CQueryNodeMenuPage )
          MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
          NOTIFY_HANDLER(IDC_MENULIST, LVN_ITEMCHANGED, OnMenuListChanged)
          NOTIFY_HANDLER(IDC_MENULIST, NM_DBLCLK, OnMenuListDblClk)
          
          COMMAND_HANDLER(IDC_ADDMENU, BN_CLICKED, OnAddMenu)
          COMMAND_HANDLER(IDC_REMOVEMENU, BN_CLICKED, OnRemoveMenu)
          COMMAND_HANDLER(IDC_EDITMENU, BN_CLICKED, OnEditMenu)
          COMMAND_HANDLER(IDC_MOVEUP, BN_CLICKED, OnMoveUpDown)
          COMMAND_HANDLER(IDC_MOVEDOWN, BN_CLICKED, OnMoveUpDown);
  
      
          CHAIN_MSG_MAP(BC)
      END_MSG_MAP()
  
      // handlers
      LRESULT OnInitDialog( UINT mMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
      
      LRESULT OnAddMenu( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnRemoveMenu( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      LRESULT OnEditMenu( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
  	LRESULT OnMoveUpDown( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled );
      
  	LRESULT OnMenuListChanged(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
      LRESULT OnMenuListDblClk(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled);
      
  
      // overrrides       
      BOOL OnSetActive();
      BOOL OnApply();
      void OnFinalMessage(HWND) { delete this; }
  
      // implementation
      void DisplayMenus();
  
  private:
      CListViewCtrl  m_MenuLV;    
      CQueryEditObj& m_EditObject;
  };
  
  
  #endif // _QRYPROP_H_
  
  