/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    ilogcat.cpp

Abstract:

    Internal implementation for a logging category item.

Environment:

    WIN32 User Mode

Author:

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

--*/ 

#include "StdAfx.h"

#include "inode.h"          // base class
#include "ilogcat.h"        // log category item

#include "ilogging.h"       // logging folder
#include "faxcomp.h"        // CFaxComponent
#include "faxdataobj.h"     // dataobject
#include "faxstrt.h"        // string table

#pragma hdrstop

#define PRI_CONTEXT_MENU 10;

extern CStringTable * GlobalStringTable;

// Generated with uuidgen. Each node must have a GUID associated with it.
// This one is for the main root node.
const GUID GUID_LogCatNode = /* 208dd5bc-44e2-11d1-9076-00a0c90ab504 */
{
    0x208dd5bc,
    0x44e2,
    0x11d1,
    {0x90, 0x76, 0x00, 0xa0, 0xc9, 0x0a, 0xb5, 0x04}
};

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Constructor and destructor.
//
//


CInternalLogCat::CInternalLogCat( CInternalNode * pParent, CFaxComponentData * pCompData ) :
    CInternalNode( pParent, pCompData )
/*++

Routine Description:

    Constructor.

Arguments:

    None.

Return Value:

    None.

--*/
{
    pCategory = NULL;
}

CInternalLogCat::~CInternalLogCat()
/*++

Routine Description:

    Destructor.

Arguments:

    None.

Return Value:

    None.

--*/
{

}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Mandatory CInternalNode implementations.
//
//

const GUID * 
CInternalLogCat::GetNodeGUID()
/*++

Routine Description:

    Returns the node's associated GUID.

Arguments:

    None.

Return Value:

    A const pointer to a binary GUID.    

--*/
{
//    DebugPrint(( TEXT("Trace: CInternalLogCat::GetNodeGUID") ));
    return &GUID_LogCatNode;
}

const LPTSTR 
CInternalLogCat::GetNodeDisplayName()
/*++

Routine Description:

    Returns a const TSTR pointer to the node's display name.

Arguments:

    None.

Return Value:

    A const pointer to a TSTR.

--*/
{
//    DebugPrint(( TEXT("Trace: CInternalLogCat::GetNodeDisplayName") ));
    return (LPTSTR)pCategory->Name;
}

const LONG_PTR   
CInternalLogCat::GetCookie()
/*++

Routine Description:

    Returns the cookie for this node.

Arguments:

    None.

Return Value:

    A const long containing the cookie for the pointer,
    in this case, a NULL, since the root node has no cookie.    

--*/
{
//    DebugPrint(( TEXT("Trace: CInternalLogCat::GetCookie") ));
    DebugPrint(( TEXT("Log Category Node Cookie: 0x%p"), this ));
    return (LONG_PTR)this; // status node's cookie is the node id.
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 
// IComponent over-rides
//
//

HRESULT 
STDMETHODCALLTYPE 
CInternalLogCat::ResultGetDisplayInfo(
                                     IN CFaxComponent * pComp,  
                                     IN OUT RESULTDATAITEM __RPC_FAR *pResultDataItem)
/*++

Routine Description:

    This routine dispatches result pane GetDisplayInfo requests to the appropriate handlers
    in the mandatory implementations of the node, as well as handling special case data requests.
            
Arguments:

    pComp - a pointer to the IComponent associated with this node.
    pResultDataItem - a pointer to the RESULTDATAITEM struct which needs to be filled in.
    
Return Value:

    HRESULT indicating SUCCEEDED() or FAILED()

--*/
{
//    DebugPrint(( TEXT("Trace: CInternalLogCat::ResultGetDisplayInfo") ));

    assert(pResultDataItem != NULL);    

    if( pResultDataItem->mask & RDI_STR ) {
        if( pResultDataItem->nCol == 0 ) {
            pResultDataItem->str = GetNodeDisplayName();
        }
        if( pResultDataItem->nCol == 1) {
            pResultDataItem->str = ::GlobalStringTable->GetString( IDS_LOG_LEVEL_NONE + pCategory->Level );
        }
    }
    if( pResultDataItem->mask & RDI_IMAGE ) {
        pResultDataItem->nImage = GetNodeDisplayImage();
    }

    return S_OK;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// IExtendContextMenu event handlers - default implementations
//
//

HRESULT 
STDMETHODCALLTYPE 
CInternalLogCat::ComponentContextMenuAddMenuItems(
                                                 IN CFaxComponent * pComp,
                                                 IN CFaxDataObject * piDataObject,
                                                 IN LPCONTEXTMENUCALLBACK piCallback,
                                                 IN OUT long __RPC_FAR *pInsertionAllowed)
/*++

Routine Description:

    Adds items to the context menu.
    
Arguments:

    pComp - a pointer to the IComponent associated with this node.
    piDataObject - pointer to the dataobject associated with this node
    piCallback - a pointer to the IContextMenuCallback used to insert pages
    pInsertionAllowed - a set of flag indicating whether insertion is allowed.
    
Return Value:

    HRESULT indicating SUCCEEDED() or FAILED()

--*/
{
    CONTEXTMENUITEM menuItem;
    WORD            menuID;
    HRESULT         hr = S_OK;

    if( !( *pInsertionAllowed | CCM_INSERTIONALLOWED_TOP ) ) {
        assert( FALSE );
        return S_OK;
    }

    // build the submenu

    ZeroMemory( (void*)&menuItem, sizeof( menuItem ));

    menuItem.strName = ::GlobalStringTable->GetString( IDS_LOG_LEVEL );
    menuItem.strStatusBarText = ::GlobalStringTable->GetString( IDS_LOG_LEVEL_DESC );
    menuItem.lCommandID = PRI_CONTEXT_MENU;
    menuItem.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
    menuItem.fFlags = MF_POPUP | MF_ENABLED;
    menuItem.fSpecialFlags = CCM_SPECIAL_SUBMENU;

    hr = piCallback->AddItem( &menuItem );
    if( FAILED(hr) ) {
        return hr;
    }

    // build the submenu

    for( menuID = 0; menuID < 4; menuID++ ) {

        ZeroMemory( ( void* )&menuItem, sizeof( menuItem ) );

        menuItem.strName = ::GlobalStringTable->GetString( IDS_LOG_LEVEL_NONE + menuID );
        menuItem.strStatusBarText = ::GlobalStringTable->GetString( IDS_LOG_LEVEL_NONE_DESC + menuID );
        menuItem.lCommandID = menuID;
        menuItem.lInsertionPointID = PRI_CONTEXT_MENU;
        if( menuID == pCategory->Level ) {
            menuItem.fFlags = MF_ENABLED | MF_CHECKED;
        } else {
            menuItem.fFlags = MF_ENABLED;
        }
        menuItem.fSpecialFlags = 0;

        hr = piCallback->AddItem( &menuItem );
        if( FAILED(hr) ) {
            return hr;
        }
    }    
    return hr;
}



HRESULT 
STDMETHODCALLTYPE 
CInternalLogCat::ComponentContextMenuCommand(
                                            IN CFaxComponent * pComp,
                                            IN long lCommandID,
                                            IN CFaxDataObject * piDataObject)
/*++

Routine Description:

    Handles context menu commands.
    
Arguments:

    pComp - a pointer to the IComponent associated with this node.
    lCommandID - the command ID
    piDataObject - pointer to the dataobject associated with this node
    
Return Value:

    HRESULT indicating SUCCEEDED() or FAILED()

--*/
{
    HRESULT hr;

    if( lCommandID >= 0 || lCommandID < 4 ) {
        pCategory->Level = lCommandID;
        assert( m_pParentINode );
        hr = ((CInternalLogging *)m_pParentINode)->CommitChanges( pComp );
        if( SUCCEEDED( hr ) ) {
            pComp->m_pResultData->UpdateItem( hItemID );
        }
    }

    // if we return a failure here, the MMC will assert on us!!
    // so we return only S_OK.

    return S_OK;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Internal Event Handlers
//
//

HRESULT 
CInternalLogCat::ResultOnSelect( 
                               IN CFaxComponent* pComp, 
                               IN CFaxDataObject * lpDataObject, 
                               IN LPARAM arg, LPARAM param)
/*++

Routine Description:

    Event handler for the MMCN_SELECT message for the log category node.

Arguments:

    pCompData - a pointer to the instance of IComponentData which this root node is associated with.
    pdo - a pointer to the data object associated with this node
    arg, param - the arguements of the message

Return Value:

    HRESULT which indicates SUCCEEDED() or FAILED()

--*/
{
    DebugPrint(( TEXT("Trace: CInternalRoot::OnSelect") ));
    pComp->m_pConsoleVerb->SetDefaultVerb( MMC_VERB_NONE );

    return S_OK;
}