/*--------------------------------------------------------------------------* * * Microsoft Windows * Copyright (C) Microsoft Corporation, 1992 - 1999 * * File: tasknode.cpp * * Contents: Implementation file for console taskpad CMTNode- and * CNode-derived classes. * * History: 29-Oct-98 jeffro Created * *--------------------------------------------------------------------------*/ #include "stdafx.h" #include "tasks.h" #include "util.h" #include "conview.h" #include "rsltitem.h" //############################################################################ //############################################################################ // // Implementation of class CConsoleTaskCallbackImpl // //############################################################################ //############################################################################ /*+-------------------------------------------------------------------------* * CConsoleTaskCallbackImpl::CConsoleTaskCallbackImpl * * PURPOSE: * * PARAMETERS: * * RETURNS: * /*+-------------------------------------------------------------------------*/ CConsoleTaskCallbackImpl::CConsoleTaskCallbackImpl() : m_clsid (GUID_NULL), m_fTaskpad (false), m_fInitialized (false), m_pViewData (NULL) { } /*+-------------------------------------------------------------------------* * * CConsoleTaskCallbackImpl::ScInitialize * * PURPOSE: This is the initialization function called for taskpad * view extensions. * * PARAMETERS: * CConsoleTaskpad * pConsoleTaskpad : * CScopeTree * pScopeTree : * CNode * pNodeTarget : * * RETURNS: * void * *+-------------------------------------------------------------------------*/ SC CConsoleTaskCallbackImpl::ScInitialize( CConsoleTaskpad* pConsoleTaskpad, CScopeTree* pScopeTree, CNode* pNodeTarget) { DECLARE_SC (sc, _T("CConsoleTaskCallbackImpl::ScInitialize")); /* * validate input */ sc = ScCheckPointers (pConsoleTaskpad, pScopeTree, pNodeTarget); if (sc) return (sc); sc = ScCheckPointers (pNodeTarget->GetViewData(), E_UNEXPECTED); if (sc) return (sc); m_pConsoleTaskpad = pConsoleTaskpad; m_pScopeTree = pScopeTree; m_pNodeTarget = pNodeTarget; m_pViewData = pNodeTarget->GetViewData(); m_fInitialized = true; m_fTaskpad = true; return (sc); } /*+-------------------------------------------------------------------------* * CConsoleTaskCallbackImpl::ScInitialize * * This is the initialization function called for ordinary view extensions. *--------------------------------------------------------------------------*/ SC CConsoleTaskCallbackImpl::ScInitialize (const CLSID& clsid) { DECLARE_SC (sc, _T("CConsoleTaskCallbackImpl::ScInitialize")); m_clsid = clsid; return (sc); } /*+-------------------------------------------------------------------------* * CConsoleTaskCallbackImpl::IsEditable * * Returns S_OK if "Edit" and "Delete" menu items should be displayed * on the context menu for the node while this view extension is active. * * Returns S_FALSE if "Edit" and "Delete" should not be displayed. *--------------------------------------------------------------------------*/ STDMETHODIMP CConsoleTaskCallbackImpl::IsEditable() { if (IsTaskpad()) return (S_OK); return (S_FALSE); } /*+-------------------------------------------------------------------------* * CConsoleTaskCallbackImpl::OnModifyTaskpad * * PURPOSE: * * PARAMETERS: +- * * RETURNS: * HRESULT /*+-------------------------------------------------------------------------*/ STDMETHODIMP CConsoleTaskCallbackImpl::OnModifyTaskpad() { DECLARE_SC (sc, _T("CConsoleTaskCallbackImpl::OnModifyTaskpad")); /* * this should only be called for taskpad view extensions */ if (!IsTaskpad()) return ((sc = E_UNEXPECTED).ToHr()); CNode *pNodeTarget = GetConsoleTaskpad()->HasTarget() ? GetTargetNode() : NULL; bool fCookieValid = false; // determine whether the taskpad node is selected. If not, fCookieValid = false. LPARAM lResultItemCookie = -1; bool bScope; CNode* pNode = NULL; CConsoleView* pConsoleView = GetViewData()->GetConsoleView(); if (pConsoleView != NULL) { HNODE hNode; sc = pConsoleView->ScGetFocusedItem (hNode, lResultItemCookie, bScope); if (sc) return (sc.ToHr()); pNode = CNode::FromHandle (hNode); } if (pNode == NULL) fCookieValid = false; int iResp = CTaskpadPropertySheet(pNodeTarget, *GetConsoleTaskpad(), FALSE, NULL, fCookieValid, GetViewData(), CTaskpadPropertySheet::eReason_PROPERTIES).DoModal(); if(iResp == IDOK) { GetViewData()->m_spTaskCallback = NULL; GetScopeTree()->UpdateAllViews(VIEW_RESELECT, 0); } return (sc.ToHr()); } /*+-------------------------------------------------------------------------* * * CConsoleTaskCallbackImpl::GetTaskpadID * * PURPOSE: Returns the GUID ID of the underlying taskpad. * * PARAMETERS: * GUID * pGuid : * * RETURNS: * STDMETHODIMP * *+-------------------------------------------------------------------------*/ STDMETHODIMP CConsoleTaskCallbackImpl::GetTaskpadID(GUID *pGuid) { DECLARE_SC (sc, _T("CConsoleTaskCallbackImpl::GetTaskpadID")); sc = ScCheckPointers (pGuid); if (sc) return (sc.ToHr()); if (IsTaskpad()) { /* * TODO: initialize m_clsid in ScInitialize for taskpads */ CConsoleTaskpad* pTaskpad = GetConsoleTaskpad(); sc = ScCheckPointers (pTaskpad, E_UNEXPECTED); if (sc) return (sc.ToHr()); *pGuid = pTaskpad->GetID(); } else { *pGuid = m_clsid; } return (sc.ToHr()); } /*+-------------------------------------------------------------------------* * * CConsoleTaskCallbackImpl::OnDeleteTaskpad * * PURPOSE: Deletes a taskpad. * * RETURNS: * STDMETHODIMP * *+-------------------------------------------------------------------------*/ STDMETHODIMP CConsoleTaskCallbackImpl::OnDeleteTaskpad() { DECLARE_SC (sc, _T("CConsoleTaskCallbackImpl::OnDeleteTaskpad")); /* * this should only be called for taskpad view extensions */ if (!IsTaskpad()) return ((sc = E_UNEXPECTED).ToHr()); CScopeTree* pScopeTree = GetScopeTree(); sc = ScCheckPointers (pScopeTree, E_UNEXPECTED); if (sc) return (sc.ToHr()); CConsoleTaskpadList* pTaskpadList = pScopeTree->GetConsoleTaskpadList(); sc = ScCheckPointers (pTaskpadList, E_UNEXPECTED); if (sc) return (sc.ToHr()); CConsoleTaskpad* pTaskpad = GetConsoleTaskpad(); sc = ScCheckPointers (pTaskpad, E_UNEXPECTED); if (sc) return (sc.ToHr()); CConsoleTaskpadList::iterator iter; for(iter = pTaskpadList->begin(); iter != pTaskpadList->end(); iter++) { if(iter->MatchesID(pTaskpad->GetID())) { pTaskpadList->erase(iter); pScopeTree->UpdateAllViews(VIEW_RESELECT, 0); return (sc.ToHr()); } } return ((sc = E_UNEXPECTED).ToHr()); // not found. } /*+-------------------------------------------------------------------------* * * CConsoleTaskCallbackImpl::OnNewTask * * PURPOSE: * * RETURNS: * HRESULT : S_OK if tasks were added, S_FALSE if no tasks were added. * *+-------------------------------------------------------------------------*/ HRESULT CConsoleTaskCallbackImpl::OnNewTask() { HRESULT hr = S_OK; CNode *pNodeTarget = GetConsoleTaskpad()->HasTarget() ? GetTargetNode() : NULL; // fake up a taskpad frame. CTaskpadFrame taskpadFrame(pNodeTarget, GetConsoleTaskpad(), GetViewData(), false, 0); CTaskWizard taskWizard; bool fRestartTaskpad = true; bool bAddedTasks = false; while(fRestartTaskpad) { if (taskWizard.Show(GetViewData()->GetMainFrame(), &taskpadFrame, true, &fRestartTaskpad)==S_OK) { bAddedTasks = true; CConsoleTaskpad::TaskIter itTask; CConsoleTaskpad * pTaskpad = GetConsoleTaskpad(); itTask = pTaskpad->BeginTask(); pTaskpad->InsertTask (itTask, taskWizard.ConsoleTask()); } else break; } return bAddedTasks? S_OK : S_FALSE; }