BOOL GetBookmarkFileName(HWND hwndHexView, LPCTSTR szFileName, TCHAR *szBookPath) { TCHAR szBase[MAX_PATH] = {0}; TCHAR szAppData[MAX_PATH]; TCHAR *pszName; UINT64 bookid; if(szFileName == 0) { szFileName = szBase; if(!HexView_GetFileName(hwndHexView, szBase, MAX_PATH)) return FALSE; } // has this file got a bookmark id already?? if(LoadFileData(szFileName, TEXT("HexEdit.bookmark"), &bookid, sizeof(UINT64)) != sizeof(UINT64)) { //BY_HANDLE_FILE_INFORMATION bhfi; //HANDLE hFile = CreateFile(szBase, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); //if(hFile == INVALID_HANDLE_VALUE) // return FALSE; // generate one from the base NTFS fileid //GetFileInformationByHandle(hFile, &bhfi); //CloseHandle(hFile); bookid = GetTickCount();//(UINT64)bhfi.nFileIndexLow | ((UINT64)bhfi.nFileIndexHigh << 32); // only save if the file exists if(GetFileAttributes(szFileName) != INVALID_FILE_ATTRIBUTES) { SaveFileData(szFileName, TEXT("HexEdit.bookmark"), &bookid, sizeof(UINT64)); } } if((pszName = _tcsrchr(szFileName, '\\')) == 0) return FALSE; // get location of application data // // get/create the following directory: // // {ApplicationData}\Local\Catch22\Bookmarks // GetProgramDataPath(szAppData, MAX_PATH); lstrcat(szAppData, TEXT("\\Bookmarks")); SHCreateDirectory(NULL, szAppData); // // Formulate the bookmark filename // wsprintf(szBookPath, TEXT("%s\\%s-%08x-bookmark.xml"), szAppData, pszName+1, bookid); //lstrcat(szBookPath, pszName+1); //lstrcat(szBookPath, TEXT(".bookmark")); return TRUE; }
BOOL UpdateHighlights(BOOL fAlways) { HWND hwndGridView; if ((hwndGridView = GetDlgItem(GetBookmarkWnd(), IDC_HIGHLIGHT_GRIDVIEW)) == 0) return FALSE; SendMessage(hwndGridView, WM_SETREDRAW, FALSE, 0); if(fAlways) { WIN32_FIND_DATA win32fd; HANDLE hFind; TCHAR szBookPath[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; GetProgramDataPath(szBookPath, MAX_PATH); lstrcat(szBookPath, TEXT("\\Bookmarks\\*")); // enumerate all files in the bookmarks directory if((hFind = FindFirstFile(szBookPath, &win32fd)) != 0) { do { if((win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { GetProgramDataPath(szBookPath, MAX_PATH); wsprintf(szFilePath, TEXT("%s\\Bookmarks\\%s"), szBookPath, win32fd.cFileName); UpdateHighlight(0, szFilePath, TRUE); } } while(FindNextFile(hFind, &win32fd)); FindClose(hFind); } } //else { int i; HWND hwndHexView; // add bookmarks for all open files for(i = 0; (hwndHexView = EnumHexView(g_hwndMain, i)) != 0; i++) { TCHAR szFilePath[MAX_PATH]; HexView_GetFileName(hwndHexView, szFilePath, MAX_PATH); UpdateHighlight(szFilePath, 0, FALSE); } } SendMessage(hwndGridView, WM_SETREDRAW, TRUE, 0); return TRUE; }
// // Add hexview's filename + bookmarks to the gridview // void AddHexViewHighlights(HGRIDITEM hRoot, HWND hwndHexView, HWND hwndGridView, COLORREF col) { GVITEM gvitem = { 0 }; HGRIDITEM hItem; TCHAR szFileName[MAX_PATH]; HexView_GetFileName(hwndHexView, szFileName, MAX_PATH); MkRootGVITEM(&gvitem, szFileName, TRUE, 0); hItem = GridView_InsertChild(hwndGridView, hRoot, &gvitem); FillHexViewHighlights(hItem, hwndHexView, hwndGridView, col); }
BOOL HexSetCurFile(HWND hwndMain, int iItem, BOOL fSetFocus) { TCITEM tci = { TCIF_PARAM }; HWND hwndHV, hwndOld; TCHAR szFilePath[MAX_PATH]; TCHAR *name; RECT rect; // get specied item if(!TabCtrl_GetItem(g_hwndTabView, iItem, &tci)) return FALSE; TabCtrl_SetCurSel(g_hwndTabView, iItem); hwndHV = (HWND)tci.lParam; hwndOld = g_hwndHexView; GetWindowRect(hwndOld, &rect); MapWindowPoints(0, hwndMain, (POINT *)&rect, 2); MoveWindow(hwndHV, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,0); g_hwndHexView = hwndHV; ForceClientResize(hwndMain); if(fSetFocus) SetFocus(hwndHV); HexView_GetFileName(hwndHV, szFilePath, MAX_PATH); name = _tcsrchr(szFilePath, '\\'); name = name ? name+1 : TEXT("Untitled"); SetWindowFileName(hwndMain, name, HexView_CanUndo(hwndHV), HexView_IsReadOnly(hwndHV)); if(hwndOld != hwndHV) ShowWindow(hwndOld, SW_HIDE); UpdateStatusBarText(g_hwndStatusBar, hwndHV); UpdateTypeView(); return TRUE; }
BOOL SaveHighlights(HWND hwndHexView) { TCHAR szBookPath[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; BOOKMARK bm; HBOOKMARK hbm; HCONFIG config, filedata, bookmarks; if (!GetBookmarkFileName(hwndHexView, NULL, szBookPath)) return FALSE; config = CreateConfig(); filedata = CreateConfigSection(config, TEXT("hexFileData")); HexView_GetFileName(hwndHexView, szFilePath, MAX_PATH); // only save if the file exists if(GetFileAttributes(szFilePath) != INVALID_FILE_ATTRIBUTES) { SetConfigStr(filedata, TEXT("filePath"), szFilePath); } bookmarks = CreateConfigSection(filedata, TEXT("bookmarks")); for(hbm = 0; (hbm = HexView_EnumBookmark(hwndHexView, hbm, &bm)) != 0; ) { if((bm.flags & HVBF_NOPERSIST) == 0) { HCONFIG bookmark = CreateConfigSection(bookmarks, TEXT("bookmark")); SetConfigStr(bookmark, TEXT("name"), bm.pszTitle); SetConfigStr(bookmark, TEXT("desc"), bm.pszText); SetConfigI64(bookmark, TEXT("offset"), bm.offset); SetConfigI64(bookmark, TEXT("length"), bm.length); SetConfigH32(bookmark, TEXT("fgcol"), bm.col); SetConfigH32(bookmark, TEXT("bgcol"), bm.backcol); } } SaveConfig(szBookPath, config); return TRUE; }
// // yes IDYES/IDNO/IDCANCEL // UINT HexFileCloseNotify(HWND hwndMain, HWND hwndHV) { if(HexView_CanUndo(hwndHV)) { TCHAR buf[MAX_PATH+100]; TCHAR name[MAX_PATH]; if(HexView_GetFileName(hwndHV, name, MAX_PATH)) wsprintf(buf, TEXT("Do you want to save changes to\r\n%s?"), name); else wsprintf(buf, TEXT("Do you want to save changes to Untitled?")); return MessageBox(hwndMain, buf, g_szAppName, MB_YESNOCANCEL | MB_ICONQUESTION); } else { return IDNO; } }
BOOL HexCloseFile(MAINWND *mainWnd, int iItem) { TCITEM tci = { TCIF_PARAM }; HWND hwndHV; TCHAR szFilePath[MAX_PATH]; if(!TabCtrl_GetItem(mainWnd->hwndTabView, iItem, &tci)) return FALSE; hwndHV = (HWND)tci.lParam; // is this the last tab left? if(TabCtrl_GetItemCount(mainWnd->hwndTabView) == 1) { HexView_Clear((HWND)tci.lParam); tci.mask = TCIF_TEXT; tci.pszText = TEXT("(Untitled)"); TabCtrl_SetItem(mainWnd->hwndTabView, 0, &tci); tci.lParam = 0; } else { // remove the tab TabCtrl_DeleteItem(mainWnd->hwndTabView, iItem); } // set focus to a new tab iItem = TabCtrl_GetCurSel(mainWnd->hwndTabView); HexSetCurFile(mainWnd->hwndMain, iItem, TRUE); // lastly destroy the unwanted hexview SaveHighlights(hwndHV); HexView_GetFileName(hwndHV, szFilePath, MAX_PATH); if(hwndHV == (HWND)tci.lParam) DestroyWindow(hwndHV); UpdateHighlight(szFilePath, 0, TRUE); return TRUE; }
void UpdateMainTabs(HWND hwndTabView) { int i; TCITEM tci = { TCIF_PARAM, 0, 0, NULL, 0, 0, 0 }; for(i = 0; TabCtrl_GetItem(hwndTabView, i, &tci); i++) { HWND hwndHV = (HWND)tci.lParam; TCHAR szPath[MAX_PATH]; if(HexView_GetFileName(hwndHV, szPath, MAX_PATH)) { TCITEM tci2 = {0}; tci.mask = TCIF_PARAM | TCIF_TEXT | TCIF_STATE; tci.dwState = TCIS_FILENAME; tci.lParam = (LPARAM)hwndHV; tci.pszText = (WCHAR *)szPath;//g_szFileTitle; TabCtrl_SetItem(hwndTabView, i, &tci); } } }
HWND HexIsOpen(HWND hwndMain, LPCTSTR szFileName, int *idx) { int i; HWND hwndHV; // is the file already open?! for(i = 0; (hwndHV = EnumHexView(hwndMain, i)) != 0; i++) { TCHAR szPath[MAX_PATH]; if(HexView_GetFileName(hwndHV, szPath, MAX_PATH)) { if(lstrcmpi(szPath, szFileName) == 0) { if(idx) *idx = i; return hwndHV; } } } return NULL; }
// // Open the specified file // BOOL HexOpenFile(HWND hwndMain, LPCTSTR szFileName, DWORD fHexViewFlags) { HWND hwndHV; TCITEM tci = { TCIF_PARAM, 0, 0, NULL, 0, 0, 0 }; BOOL fReuseTab = FALSE; int i; // is the file already open?! if(HexIsOpen(hwndMain, szFileName, &i)) { return HexSetCurFile(hwndMain, i, TRUE); } // shall we use the (untitled) document or create a new window? if(TabCtrl_GetItemCount(g_hwndTabView) == 1 && TabCtrl_GetItem(g_hwndTabView, 0, &tci)) { hwndHV = (HWND)tci.lParam; // is file (new) and unmodified? if(HexView_GetFileName(hwndHV, 0,0) == 0 && HexView_CanUndo(hwndHV) == FALSE && HexView_CanRedo(hwndHV) == FALSE) { fReuseTab = TRUE; } } if(fReuseTab == FALSE) hwndHV = CreateHexViewCtrl(hwndMain); // if(HexView_OpenFile(hwndHV, szFileName, fHexViewFlags)) { DWORD e = GetLastError(); LoadHighlights(hwndHV); UpdateCurFileName(hwndMain, hwndHV, szFileName, FALSE); if(fReuseTab == FALSE) { tci.mask = TCIF_PARAM | TCIF_TEXT | TCIF_STATE; tci.dwState = TCIS_FILENAME; tci.lParam = (LPARAM)hwndHV; tci.pszText = (WCHAR *)szFileName;//g_szFileTitle; // insert at the end TabCtrl_InsertItem(g_hwndTabView, TabCtrl_GetItemCount(g_hwndTabView), &tci); } UpdateMainTabs(g_hwndTabView); HexSetCurFile(hwndMain, TabCtrl_GetItemCount(g_hwndTabView)-1, TRUE); if(e == ERROR_SHARING_VIOLATION) { HexInfoBox(TEXT("%s\r\nhas been opened as read-only."), g_szFileName); //MessageBox(hwndMain, TEXT("Another "), TEXT("HexEdit"), MB_ICONINFORMATION); } UpdateHighlight(szFileName, 0, TRUE); UpdateTypeView(); return TRUE; } else { DWORD dwError = GetLastError(); DestroyWindow(hwndHV); FmtErrorMsg(hwndMain, MB_OK|MB_ICONWARNING, dwError, TEXT("Error opening \'%s\'\r\n\r\n"), szFileName); return FALSE; } }