/** * @param pTool ToolWrapper instance to be orphaned to ToolOwner. * @param OwnerID Unique Identifier for the owning object - use "this". */ void ToolOwner::RunTool(ToolWrapperPtr& pTool, ToolOwnerID OwnerID) { _ToolWrapper _wrapper = {0}; _wrapper.OwnerID = OwnerID; _wrapper.pWrapper = pTool; _wrapper.pRunner = new ToolRunner( pTool.get() ); bool bThreaded = _wrapper.pRunner->GetThreadedExecution(); if( bThreaded ) { CSSCritLock lock(&m_crRunningTools); m_RunningTools.push_back(_wrapper); // Add this tool to our list to mind. } if(pTool->SaveAll()) { g_Context.m_frame->SaveAll(); } else if(pTool->SaveProjectGroup()) { DocumentList list; g_Context.m_frame->GetOpenWorkspaceDocuments(list); for (DocumentList::iterator i = list.begin(); i != list.end(); ++i) { CChildFrame* frame = (*i)->GetFrame(); if (frame != NULL && frame->GetModified()) { frame->Save(true); // save and notify change } } } else if (pTool->SaveOne()) { CChildFrame* pChild = pTool->GetActiveChild(); if (pChild && pChild->GetModified()) { pChild->Save(true); // save and notify change } } if (!_wrapper.pRunner->Execute() && bThreaded) { // Signal this tool wrapper as done with. MarkToolForDeletion(_wrapper.pRunner); } else if( !bThreaded ) { delete _wrapper.pRunner; _wrapper.pWrapper.reset(); } ///@todo //pT->UpdateRunningTools(); }