void path::set_full_name(const generic_string& n) { // take the top component // and put it as the relative part uint32 i = n.size()>0 ? n.size()-1 : 0; while (i>0 && n[i]!=PATH_SEP) --i; _parts[0].clear(); _parts[1].clear(); for (uint32 j = i;j<n.size();j++) _parts[0].push_back(n[j]); for (uint32 j = 0;j<i;j++) _parts[1].push_back(n[j]); _checkParts(); }
void FileBrowser::addRootFolder(generic_string rootFolderPath) { // make sure there's no '\' at the end if (rootFolderPath[rootFolderPath.length() - 1] == '\\') { rootFolderPath = rootFolderPath.substr(0, rootFolderPath.length() - 1); } size_t nbFolderUpdaters = _folderUpdaters.size(); for (size_t i = 0; i < nbFolderUpdaters; ++i) { if (_folderUpdaters[i]->_rootFolder._rootPath == rootFolderPath) return; else { size_t pos = rootFolderPath.find(_folderUpdaters[i]->_rootFolder._rootPath); if (pos == 0) { //do nothing, go down to select the dir generic_string rootPath = _folderUpdaters[i]->_rootFolder._rootPath; generic_string pathSuffix = rootFolderPath.substr(rootPath.size() + 1, rootFolderPath.size() - rootPath.size()); vector<generic_string> linarPathArray = split(pathSuffix, '\\'); HTREEITEM foundItem = findInTree(rootPath, nullptr, linarPathArray); if (foundItem) _treeView.selectItem(foundItem); return; } pos = _folderUpdaters[i]->_rootFolder._rootPath.find(rootFolderPath); if (pos == 0) { ::MessageBox(_hParent, TEXT("A sub-folder of the folder you want to open exists.\rPlease remove it from the panel before you add this one."), rootFolderPath.c_str(), MB_OK); return; } } } std::vector<generic_string> patterns2Match; patterns2Match.push_back(TEXT("*.*")); TCHAR *label = ::PathFindFileName(rootFolderPath.c_str()); TCHAR rootLabel[MAX_PATH]; lstrcpy(rootLabel, label); size_t len = lstrlen(rootLabel); if (rootLabel[len - 1] == '\\') rootLabel[len - 1] = '\0'; FolderInfo directoryStructure(rootLabel, nullptr); getDirectoryStructure(rootFolderPath.c_str(), patterns2Match, directoryStructure, true, false); HTREEITEM hRootItem = createFolderItemsFromDirStruct(nullptr, directoryStructure); _treeView.expand(hRootItem); _folderUpdaters.push_back(new FolderUpdater(directoryStructure, this)); _folderUpdaters[_folderUpdaters.size() - 1]->startWatcher(); }
generic_string PathRemoveFileSpec(generic_string & path) { generic_string::size_type lastBackslash = path.find_last_of(TEXT('\\')); if (lastBackslash == generic_string::npos) { if (path.size() >= 2 && path[1] == TEXT(':')) // "C:foo.bar" becomes "C:" path.erase(2); else path.erase(); } else { if (lastBackslash == 2 && path[1] == TEXT(':') && path.size() >= 3) // "C:\foo.exe" becomes "C:\" path.erase(3); else if (lastBackslash == 0 && path.size() > 1) // "\foo.exe" becomes "\" path.erase(1); else path.erase(lastBackslash); } return path; }
bool str2Clipboard(const generic_string &str2cpy, HWND hwnd) { int len2Allocate = (str2cpy.size() + 1) * sizeof(TCHAR); HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, len2Allocate); if (hglbCopy == NULL) { return false; } if (!::OpenClipboard(hwnd)) { ::GlobalFree(hglbCopy); ::CloseClipboard(); return false; } if (!::EmptyClipboard()) { ::GlobalFree(hglbCopy); ::CloseClipboard(); return false; } // Lock the handle and copy the text to the buffer. TCHAR *pStr = (TCHAR *)::GlobalLock(hglbCopy); if (pStr == NULL) { ::GlobalUnlock(hglbCopy); ::GlobalFree(hglbCopy); ::CloseClipboard(); return false; } _tcscpy_s(pStr, len2Allocate / sizeof(TCHAR), str2cpy.c_str()); ::GlobalUnlock(hglbCopy); // Place the handle on the clipboard. unsigned int clipBoardFormat = CF_UNICODETEXT; if (::SetClipboardData(clipBoardFormat, hglbCopy) == NULL) { ::GlobalUnlock(hglbCopy); ::GlobalFree(hglbCopy); ::CloseClipboard(); return false; } if (!::CloseClipboard()) { return false; } return true; }
void FileBrowser::notified(LPNMHDR notification) { if ((notification->hwndFrom == _treeView.getHSelf())) { TCHAR textBuffer[MAX_PATH]; TVITEM tvItem; tvItem.mask = TVIF_TEXT | TVIF_PARAM; tvItem.pszText = textBuffer; tvItem.cchTextMax = MAX_PATH; switch (notification->code) { case NM_DBLCLK: { openSelectFile(); } break; case TVN_ENDLABELEDIT: { LPNMTVDISPINFO tvnotif = (LPNMTVDISPINFO)notification; if (!tvnotif->item.pszText) return; if (getNodeType(tvnotif->item.hItem) == browserNodeType_root) return; // Processing for only File case if (tvnotif->item.lParam) { // Get the old label tvItem.hItem = _treeView.getSelection(); ::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem); size_t len = lstrlen(tvItem.pszText); // Find the position of old label in File path generic_string *filePath = (generic_string *)tvnotif->item.lParam; size_t found = filePath->rfind(tvItem.pszText); // If found the old label, replace it with the modified one if (found != generic_string::npos) filePath->replace(found, len, tvnotif->item.pszText); // Check the validity of modified file path tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (::PathFileExists(filePath->c_str())) { tvItem.iImage = INDEX_LEAF; tvItem.iSelectedImage = INDEX_LEAF; } else { //TODO: remove it } TreeView_SetItem(_treeView.getHSelf(), &tvItem); } // For File, Folder and Project ::SendMessage(_treeView.getHSelf(), TVM_SETITEM, 0,(LPARAM)(&(tvnotif->item))); } break; case TVN_GETINFOTIP: { LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification; static generic_string tipStr; BrowserNodeType nType = getNodeType(lpGetInfoTip->hItem); if (nType == browserNodeType_root) { tipStr = *((generic_string *)lpGetInfoTip->lParam); } else if (nType == browserNodeType_file) { tipStr = getNodePath(lpGetInfoTip->hItem); } else return; lpGetInfoTip->pszText = (LPTSTR)tipStr.c_str(); lpGetInfoTip->cchTextMax = tipStr.size(); } break; case TVN_KEYDOWN: { LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)notification; if (ptvkd->wVKey == VK_RETURN) { HTREEITEM hItem = _treeView.getSelection(); BrowserNodeType nType = getNodeType(hItem); if (nType == browserNodeType_file) openSelectFile(); else _treeView.toggleExpandCollapse(hItem); } /* else if (ptvkd->wVKey == VK_DELETE) { HTREEITEM hItem = _treeView.getSelection(); BrowserNodeType nType = getNodeType(hItem); if (nType == browserNodeType_folder) popupMenuCmd(IDM_FILEBROWSER_DELETEFOLDER); else if (nType == browserNodeType_file) popupMenuCmd(IDM_FILEBROWSER_DELETEFILE); } else if (ptvkd->wVKey == VK_UP) { if (0x80 & GetKeyState(VK_CONTROL)) { popupMenuCmd(IDM_FILEBROWSER_MOVEUP); } } else if (ptvkd->wVKey == VK_DOWN) { if (0x80 & GetKeyState(VK_CONTROL)) { popupMenuCmd(IDM_FILEBROWSER_MOVEDOWN); } } else if (ptvkd->wVKey == VK_F2) popupMenuCmd(IDM_FILEBROWSER_RENAME); */ } break; case TVN_ITEMEXPANDED: { LPNMTREEVIEW nmtv = (LPNMTREEVIEW)notification; tvItem.hItem = nmtv->itemNew.hItem; tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (getNodeType(nmtv->itemNew.hItem) == browserNodeType_folder) { if (nmtv->action == TVE_COLLAPSE) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_CLOSE_NODE, INDEX_CLOSE_NODE); } else if (nmtv->action == TVE_EXPAND) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE); } } else if (getNodeType(nmtv->itemNew.hItem) == browserNodeType_root) { if (nmtv->action == TVE_COLLAPSE) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_CLOSE_ROOT, INDEX_CLOSE_ROOT); } else if (nmtv->action == TVE_EXPAND) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_OPEN_ROOT, INDEX_OPEN_ROOT); } } } break; case TVN_BEGINDRAG: { //printStr(TEXT("hello")); _treeView.beginDrag((LPNMTREEVIEW)notification); } break; } } }