/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    inode.h

Abstract:

    This header contains the abstract base node class for
    the snapin.

Environment:

    WIN32 User Mode

Author:

    Darwin Ouyang (t-darouy) 30-Sept-1997

--*/

#ifndef __INODE_H_
#define __INODE_H_

#include "resource.h"

class CFaxDataObject;       // forward declaration
class CFaxComponentData;
class CFaxComponent;

// the CInternalNode class provides a framework in which the various
// types of subcontainers in the snapin will implement various methods.
//
// all the subcontainers in the scope and result panes inherit from this class
//
// the global Notify method in CFaxComponent and CFaxComponentData and others
// will delegate to the implementations specified by the children of this class.
// using the cookie as an identifier. (currently a cast to pointer, but can be changed 
// to a lookup table when/if a long < pointer type (64-bit world).
//
// this class will supply a default implementation of some of the methods via virtual functions

class CInternalNode
{
public:
    // constructor
    CInternalNode( CInternalNode * pParent, CFaxComponentData * pCompData )
    {
        m_pParentINode = pParent;
        m_pCompData = pCompData;
    }
    ~CInternalNode() 
    {
    }

    // *********************************************8
    // These methods call those defined below.
    //
    // This moves common code together in the inode class
    // and makes the descendents simpler, since they only
    // implement the methods they need to override the
    // default implementations for.

    // IComponentData

    virtual HRESULT STDMETHODCALLTYPE ScopeNotify(
                                                 /* [in] */ CFaxComponentData * pCompData,
                                                 /* [in] */ CFaxDataObject * lpDataObject,
                                                 /* [in] */ MMC_NOTIFY_TYPE event,
                                                 /* [in] */ LPARAM arg,
                                                 /* [in] */ LPARAM param);

    virtual HRESULT STDMETHODCALLTYPE ScopeGetDisplayInfo(
                                                         /* [in] */ CFaxComponentData * pCompData,
                                                         /* [out][in] */ SCOPEDATAITEM __RPC_FAR *pScopeDataItem);


    virtual HRESULT STDMETHODCALLTYPE ScopeQueryDataObject(
                                                          /* [in] */ CFaxComponentData * pCompData,
                                                          /* [in] */ MMC_COOKIE cookie,
                                                          /* [in] */ DATA_OBJECT_TYPES type,
                                                          /* [out] */ LPDATAOBJECT __RPC_FAR *ppDataObject);

    // IComponent

    virtual HRESULT STDMETHODCALLTYPE ResultNotify(
                                                  /* [in] */ CFaxComponent * pComp,  
                                                  /* [in] */ CFaxDataObject * lpDataObject,
                                                  /* [in] */ MMC_NOTIFY_TYPE event,
                                                  /* [in] */ LPARAM arg,
                                                  /* [in] */ LPARAM param);

    virtual HRESULT STDMETHODCALLTYPE ResultGetDisplayInfo(
                                                          /* [in] */ CFaxComponent * pComp,  
                                                          /* [out][in] */ RESULTDATAITEM __RPC_FAR *pResultDataItem);

    virtual HRESULT STDMETHODCALLTYPE ResultGetResultViewType(
                                                             /* [in] */ CFaxComponent * pComp,  
                                                             /* [in] */ MMC_COOKIE cookie,
                                                             /* [out] */ LPOLESTR __RPC_FAR *ppViewType,
                                                             /* [out] */ long __RPC_FAR *pViewOptions);

    virtual HRESULT STDMETHODCALLTYPE ResultQueryDataObject(
                                                           /* [in] */ CFaxComponent * pComp,  
                                                           /* [in] */ MMC_COOKIE cookie,
                                                           /* [in] */ DATA_OBJECT_TYPES type,
                                                           /* [out] */ LPDATAOBJECT __RPC_FAR *ppDataObject);

    // ***********************************************************
    // ExtendPropertySheet event handlers - default implementations
    // we need seperate versions for IComponentData and IComponent
    // in your code if you want differing behavior 
    // in the scope and results panes.
    //
    // You can simply delegate one implementation to the other
    // if you want the same behavior in both panes

    // IExtendPropertySheet for IComponentData
    virtual HRESULT STDMETHODCALLTYPE ComponentDataPropertySheetCreatePropertyPages(
                                                                      /* [in] */ CFaxComponentData * pCompData,
                                                                      /* [in] */ LPPROPERTYSHEETCALLBACK lpProvider,
                                                                      /* [in] */ LONG_PTR handle,
                                                                      /* [in] */ CFaxDataObject * lpIDataObject);

    virtual HRESULT STDMETHODCALLTYPE ComponentDataPropertySheetQueryPagesFor(
                                                                /* [in] */ CFaxComponentData * pCompData,
                                                                /* [in] */ CFaxDataObject * lpDataObject);

    // IExtendPropertySheet for IComponent
    virtual HRESULT STDMETHODCALLTYPE ComponentPropertySheetCreatePropertyPages(
                                                                      /* [in] */ CFaxComponent * pComp,
                                                                      /* [in] */ LPPROPERTYSHEETCALLBACK lpProvider,
                                                                      /* [in] */ LONG_PTR handle,
                                                                      /* [in] */ CFaxDataObject * lpIDataObject);

    virtual HRESULT STDMETHODCALLTYPE ComponentPropertySheetQueryPagesFor(
                                                                /* [in] */ CFaxComponent * pComp,
                                                                /* [in] */ CFaxDataObject * lpDataObject);

    // ***********************************************************
    // ExtendContextMenu event handlers - default implementations
    // we need seperate versions for IComponentData and IComponent
    // in your code if you want differing behavior 
    // in the scope and results panes.
    //
    // You can simply delegate one implementation to the other
    // if you want the same behavior in both panes

    // IExtendContextMenu for IComponentData
    virtual HRESULT STDMETHODCALLTYPE ComponentDataContextMenuAddMenuItems(
                                                             /* [in] */ CFaxComponentData * pCompData,
                                                             /* [in] */ CFaxDataObject * piDataObject,
                                                             /* [in] */ LPCONTEXTMENUCALLBACK piCallback,
                                                             /* [out][in] */ long __RPC_FAR *pInsertionAllowed);

    virtual HRESULT STDMETHODCALLTYPE ComponentDataContextMenuCommand(
                                                        /* [in] */ CFaxComponentData * pCompData,
                                                        /* [in] */ long lCommandID,
                                                        /* [in] */ CFaxDataObject * piDataObject);

    // IExtendContextMenu for IComponent
    virtual HRESULT STDMETHODCALLTYPE ComponentContextMenuAddMenuItems(
                                                             /* [in] */ CFaxComponent * pComp,
                                                             /* [in] */ CFaxDataObject * piDataObject,
                                                             /* [in] */ LPCONTEXTMENUCALLBACK piCallback,
                                                             /* [out][in] */ long __RPC_FAR *pInsertionAllowed);

    virtual HRESULT STDMETHODCALLTYPE ComponentContextMenuCommand(
                                                        /* [in] */ CFaxComponent * pComp,
                                                        /* [in] */ long lCommandID,
                                                        /* [in] */ CFaxDataObject * piDataObject);

    // ***********************************************************
    // IDataObject event handlers - default implementations
    // do nothing
    virtual HRESULT DataObjectRegisterFormats();
    virtual HRESULT DataObjectGetDataHere( FORMATETC __RPC_FAR *pFormatEtc, IStream * pstm );

    // *******************************************
    // member functions
    //
    // these are implemented by the descendents of CInternalNode and define
    // the behavior of the node.

    // returns the GUID of this node type - MUST BE IMPLEMENTED

    virtual const GUID *    GetNodeGUID() = 0;    

    // returns the display name - MUST BE IMPLEMENTED

    virtual const LPTSTR    GetNodeDisplayName() = 0;
    virtual const LPTSTR    GetNodeDescription();
    
    // returns the cookie of the node - MUST BE IMPLEMENTED
    
    virtual const LONG_PTR  GetCookie() = 0;

    // gets the right this pointer - MUST BE IMPLEMENTED
    virtual CInternalNode * GetThis() = 0;

    // returns the image indices - not required yet, but will be in the future

    virtual const int       GetNodeDisplayImage() { return IDI_NODEICON; }
    virtual const int       GetNodeDisplayOpenImage() { return IDI_NODEICON; }

    // sets the parent pointer

    virtual void                SetParentNode( CInternalNode * toSet) { m_pParentINode = toSet; }
    
    // gets the parent pointer

    virtual CInternalNode *     GetParentNode() { return m_pParentINode; }

    // *****************************************************
    // scope pane event handlers
    // override these as necessary to handle console events

    virtual HRESULT         ScopeOnExpand(CFaxComponentData * pCompData, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ScopeOnDelete(CFaxComponentData * pCompData, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ScopeOnRename(CFaxComponentData * pCompData, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ScopeOnPropertyChange(CFaxComponentData * pCompData, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);

    // *****************************************************
    // result pane event handlers
    // override these as necessary to handle console events

    virtual HRESULT         ResultOnActivate(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnAddImages(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnButtonClick(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnClick(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnDoubleClick(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnDelete(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnExpand(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnMinimized(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnPropertyChange(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnQueryPaste(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnRemoveChildren(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnRename(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);    
    virtual HRESULT         ResultOnSelect(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnShow(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);
    virtual HRESULT         ResultOnViewChange(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM arg, LPARAM param);

    // *****************************************************
    // Controlbar event handlers
    // override these as necessary to handle control bar events

    // for IComponent (Result pane nodes)
    virtual HRESULT         ControlBarOnBtnClick(CFaxComponent* pComp, CFaxDataObject * lpDataObject, LPARAM param );    
    virtual HRESULT         ControlBarOnSelect(CFaxComponent* pComp,  LPARAM arg, CFaxDataObject * lpDataObject );
    // for IComponentData (Scope pane nodes)
    virtual HRESULT         ControlBarOnBtnClick2(CFaxComponentData* pCompData, CFaxDataObject * lpDataObject, LPARAM param );    
    virtual HRESULT         ControlBarOnSelect2(CFaxComponentData* pCompData,  LPARAM arg, CFaxDataObject * lpDataObject );

public:
    
    CInternalNode *         m_pParentINode;     // my parent    
    CFaxComponentData *     m_pCompData;        // owning IComponentData

};

#endif