void Explorerplusplus::OnTreeViewCopy(BOOL bCopy) { IDataObject *pClipboardDataObject = NULL; HTREEITEM hItem; TVITEM tvItem; HRESULT hr; hItem = TreeView_GetSelection(m_hTreeView); if(hItem != NULL) { LPITEMIDLIST pidl = m_pMyTreeView->BuildPath(hItem); std::list<std::wstring> FileNameList; TCHAR szFullFileName[MAX_PATH]; GetDisplayName(pidl,szFullFileName,SIZEOF_ARRAY(szFullFileName),SHGDN_FORPARSING); std::wstring stringFileName(szFullFileName); FileNameList.push_back(stringFileName); if(bCopy) { hr = CopyFiles(FileNameList,&pClipboardDataObject); } else { hr = CutFiles(FileNameList,&pClipboardDataObject); if(SUCCEEDED(hr)) { m_hCutTreeViewItem = hItem; m_iCutTabInternal = m_iObjectIndex; tvItem.mask = TVIF_HANDLE|TVIF_STATE; tvItem.hItem = hItem; tvItem.state = TVIS_CUT; tvItem.stateMask = TVIS_CUT; TreeView_SetItem(m_hTreeView,&tvItem); } } if(SUCCEEDED(hr)) { m_pClipboardDataObject = pClipboardDataObject; } CoTaskMemFree(pidl); } }
void CThreadDebugger::NewScriptHook(JSContext* cx, const char* filename, unsigned lineno, JSScript* script, JSFunction* UNUSED(fun), void* UNUSED(callerdata)) { uint scriptExtent = JS_GetScriptLineExtent (cx, script); std::string stringFileName(filename); if (stringFileName == "") return; for (uint line = lineno; line < scriptExtent + lineno; ++line) { // If we already have a mapping for this line, we check if the current scipt is more deeply nested. // If it isn't more deeply nested, we don't overwrite the previous mapping // The most deeply nested script is always the one that must be used! uint firstLine = 0; uint lastLine = 0; jsbytecode* oldPC = NULL; if (CheckIfMappingPresent(stringFileName, line)) { firstLine = m->m_LineToPCMap[stringFileName][line].firstLineInFunction; lastLine = m->m_LineToPCMap[stringFileName][line].lastLineInFunction; // If an entry nested equally is present too, we must overwrite it. // The same script(function) can trigger a NewScriptHook multiple times without DestroyScriptHooks between these // calls. In this case the old script becomes invalid. if (lineno < firstLine || scriptExtent + lineno > lastLine) continue; else oldPC = m->m_LineToPCMap[stringFileName][line].pBytecode; } jsbytecode* pc = JS_LineNumberToPC (cx, script, line); m->m_LineToPCMap[stringFileName][line].pBytecode = pc; m->m_LineToPCMap[stringFileName][line].pScript = script; m->m_LineToPCMap[stringFileName][line].firstLineInFunction = lineno; m->m_LineToPCMap[stringFileName][line].lastLineInFunction = lineno + scriptExtent; // If we are replacing a script, the associated traps become invalid if (lineno == firstLine && scriptExtent + lineno == lastLine) { ReturnActiveBreakPoints(oldPC); SetAllNewTraps(); } } }