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; }
BOOL HexSetCurFileHwnd(HWND hwndMain, HWND hwndHexView) { int i; HWND hwndHV; for(i = 0; (hwndHV = EnumHexView(hwndMain, i)) != 0; i++) { if(hwndHV == hwndHexView) { HexSetCurFile(hwndMain, i, FALSE); return TRUE; } } return FALSE; }
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; }
BOOL UpdateHighlights2(HWND hwndHexView, HWND hwndGridView) { HGRIDITEM hGridItem; hGridItem = GVI_ROOT;//GridView_InsertChild(hwndGridView, GVI_ROOT, &gvitem); SendMessage(hwndGridView, WM_SETREDRAW, FALSE, 0); GridView_DeleteAll(hwndGridView); if(hwndHexView == 0) { // just add bookmarks for specified hexview FillHexViewHighlights(GVI_ROOT, hwndHexView, hwndGridView, 0); } else if(hwndHexView != (HWND)-1) { int i; // add bookmarks for all open files for(i = 0; (hwndHexView = EnumHexView(g_hwndMain, i)) != 0; i++) { AddHexViewHighlights(GVI_ROOT, hwndHexView, hwndGridView, 0); } } else { WIN32_FIND_DATA win32fd; HANDLE hFind; TCHAR szBookPath[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; HCONFIG hConf ; 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) { HWND hwndHV; int i; HCONFIG hBookmarks, bookmark; HGRIDITEM hItem; GetProgramDataPath(szBookPath, MAX_PATH); wsprintf(szFilePath, TEXT("%s\\Bookmarks\\%s"), szBookPath, win32fd.cFileName); hConf = OpenConfig(szFilePath); GetConfigStr(hConf, TEXT("hexFileData\\filePath"), szFilePath, MAX_PATH, 0); if((hwndHV = HexIsOpen(g_hwndMain, szFilePath, 0)) != 0) { AddHexViewHighlights(GVI_ROOT, hwndHV, hwndGridView, 0); } else { hItem = CreateBookmarkFileRoot(GVI_ROOT, szFilePath, hwndGridView, FALSE); //EnumHighlights(szBookPath, addgv, hwndGridView); hBookmarks = OpenConfigSection(hConf, TEXT("hexFileData\\bookmarks")); for(i = 0; bookmark = EnumConfigSection(hBookmarks, TEXT("bookmark"), i); i++) { TCHAR name[100], desc[100]; BOOKMARK bm = { 0, 0, 0, 0, 0, name, 100, desc, 100 }; GetConfigBookmark(bookmark, &bm); FillGridView2(hwndGridView, hItem, NULL, &bm, 0); //callback(&bm, param); } } CloseConfig(hConf); } } while(FindNextFile(hFind, &win32fd)); FindClose(hFind); } } /* for(hbm = 0; (hbm = HexView_EnumBookmark(hwndHexView, hbm, &bm)) != 0; ) { TCHAR szOffset[32]; TCHAR szTitle[32]; _stprintf(szTitle, TEXT("%s"), bm.pszTitle); _stprintf(szOffset, TEXT("%08I64X (%d bytes)"), bm.offset, bm.length); FillGridView2(hwndGridView, hGridItem, hbm, szTitle, szOffset, bm.pszText); }*/ SendMessage(hwndGridView, WM_SETREDRAW, TRUE, 0); GridView_Update(hwndGridView); //ForceClientResize(hwndGridView); //InvalidateRect(hwndGridView, 0, 0); return TRUE; }
// // Main Window message handler // LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { NMHDR *hdr; POINT pt; RECT rect; HMENU hMenu; HWND hwndHV = GetActiveHexView(hwnd);//g_hwndHexView; int i; TCITEM tci; MAINWND *mainWnd = (MAINWND *)GetWindowLongPtr(hwnd, 0); switch(msg) { case WM_NCCREATE: if((mainWnd = malloc(sizeof(MAINWND))) == 0) return FALSE; SetWindowLongPtr(hwnd, 0, (LONG_PTR)mainWnd); ZeroMemory(mainWnd, sizeof(MAINWND)); return TRUE; case WM_NCDESTROY: free(mainWnd); return 0; case WM_CREATE: g_hwndMain = hwnd; SetWindowIcon(hwnd, IDI_APP); // create a child-window EDIT control //g_hwndHexView = CreateHexViewCtrl(hwnd); g_hwndTabView = CreateWindow(WC_TABVIEW, TEXT(""), WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd, 0, g_hInstance, 0); g_hwndStatusBar = CreateStatusBar(hwnd); SendMessage(g_hwndTabView, TCM_SETITEMSIZE, 0, MAKELPARAM(150, 0)); SetStatusBarParts(g_hwndStatusBar); hwndHV = g_hwndHexView; mainWnd->hwndMain = hwnd; mainWnd->hwndStatusBar = g_hwndStatusBar; mainWnd->hwndTabView = g_hwndTabView; CreateToolTip(g_hwndHexView); // g_hwndDock[0] = CreateDockWnd(&dock, hwnd, TEXT("Toolbar")); //g_hwndToolbar = InitToolbar(hwnd); //g_hwndSearchBar = CreateSearchBar(hwnd); //g_hwndTypeView = CreateTypeView(hwnd); SetFocus(hwndHV); // tell windows that we can handle drag+drop'd files DragAcceptFiles(hwnd, TRUE); UpdateRecentMenu(GetSubMenu(GetMenu(hwnd), 0)); SetTimer(hwnd, 0xdeadbeef, 1000, 0); return TRUE; case WM_TIMER: if(wParam == 0xdeadbeef) { KillTimer(hwnd, wParam); //FirstTimeOptions(hwnd); } return 0; case WM_DROPFILES: // get the screen coordinates of the drop-location if(DragQueryPoint((HDROP)wParam, &pt)) ClientToScreen(hwnd, &pt); GetWindowRect(hwndHV, &rect); // drop anywhere *except* the hexview, as that does D&D itself if(!PtInRect(&rect, pt)) { HandleDropFiles(hwnd, (HDROP)wParam); } //CreateToolTip(mainWnd->hwndTabView); return 0; case WM_ENABLE: EnableWindow(g_hwndSearch, (BOOL)wParam); EnableWindow(g_hwndGoto, (BOOL)wParam); return 0; case WM_CONTEXTMENU: if((HWND)wParam == DockWnd_GetWindow(hwnd, DWID_TYPEVIEW)) { HMENU hMenu = GetSubMenu(LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_TYPECONTEXT)), 0); UINT u; MenuCheckMark(hMenu, IDM_TYPEVIEW_HEX, g_fDisplayHex); MenuCheckMark(hMenu, IDM_TYPEVIEW_BIGENDIAN, g_fDisplayBigEndian); u = TrackPopupMenu(hMenu, TPM_RETURNCMD, (short)LOWORD(lParam), (short)HIWORD(lParam), 0, hwnd, 0); SendMessage(DockWnd_GetContents(hwnd, DWID_TYPEVIEW), WM_COMMAND, u, 0); } break; case WM_COMMAND: return HexEdit_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); case WM_NOTIFY: hdr = (NMHDR *)lParam; if(hdr->hwndFrom == hwndHV) return HexViewNotifyHandler(mainWnd, hwnd, hdr); else return HexEdit_OnNotify(mainWnd, hwnd, (UINT)wParam, (NMHDR *)lParam); case WM_CLOSE: tci.mask = TCIF_PARAM; for(i = 0; (hwndHV = EnumHexView(hwnd, i)) != NULL; ) { UINT uAnswer = HexFileCloseNotify(hwnd, hwndHV); if(uAnswer == IDCANCEL) { return 0; } else if(uAnswer == IDNO) { SaveHighlights(hwndHV); TabCtrl_DeleteItem(mainWnd->hwndTabView, i); } else { i++; } } // save settings *before* we destroy anything! DockWnd_SaveSettings(hwnd); // shut program down DestroyWindow(hwnd); return 0; case WM_DESTROY: DestroyWindow(hwndHV); // PostQuitMessage(0); return 0; case WM_SETFOCUS: SetFocus(hwndHV); return 0; case WM_SIZE: MainWndSize(mainWnd, LOWORD(lParam), HIWORD(lParam)); UpdateStatusbar(mainWnd->hwndStatusBar); return 0; case WM_INITMENUPOPUP: hMenu = (HMENU)wParam;//GetMenu(hwnd); MenuCheckMark(hMenu, IDM_VIEW_TOOLBAR, DockWnd_IsOpen(hwnd, DWID_TOOLBAR)); MenuCheckMark(hMenu, IDM_TOOLS_TYPEVIEW, DockWnd_IsOpen(hwnd, DWID_TYPEVIEW)); MenuCheckMark(hMenu, IDM_TOOLS_SEARCHBAR, DockWnd_IsOpen(hwnd, DWID_SEARCHBAR)); CheckMenuRadioItem(hMenu, IDM_VIEW_HEX, IDM_VIEW_BIN, IDM_VIEW_HEX + (HexView_GetStyle(hwndHV) & HVS_FORMAT_MASK), MF_BYCOMMAND); { int look[32] = { 0, 0, 1, 0, 2 }; CheckMenuRadioItem(hMenu, IDM_GROUP_BYTE, IDM_GROUP_DWORD, IDM_GROUP_BYTE + look[HexView_GetGrouping(hwndHV)], MF_BYCOMMAND); } { size_w selsize; UINT edmode = HexView_GetEditMode(hwndHV); BOOL cftext = IsClipboardFormatAvailable(CF_TEXT); BOOL canundo = HexView_CanUndo(hwndHV); BOOL canredo = HexView_CanRedo(hwndHV); HexView_GetSelSize(hwndHV, &selsize); //hMenu = GetSubMenu(GetMenu(hwnd), 1); EnableMenuCmdItem(hMenu, IDM_EDIT_UNDO, canundo); EnableMenuCmdItem(hMenu, IDM_EDIT_REDO, canredo); EnableMenuCmdItem(hMenu, IDM_EDIT_CUT, selsize > 0 && edmode == HVMODE_INSERT); EnableMenuCmdItem(hMenu, IDM_EDIT_COPY, selsize > 0); EnableMenuCmdItem(hMenu, IDM_EDIT_COPYAS, selsize > 0); EnableMenuCmdItem(hMenu, IDM_EDIT_PASTE, cftext && edmode != HVMODE_READONLY ); EnableMenuCmdItem(hMenu, IDM_EDIT_PASTESPECIAL, edmode != HVMODE_READONLY ); EnableMenuCmdItem(hMenu, IDM_EDIT_DELETE, selsize > 0 && edmode != HVMODE_READONLY ); EnableMenuCmdItem(hMenu, IDM_EDIT_REVERSE, selsize > 0 && edmode != HVMODE_READONLY ); EnableMenuCmdItem(hMenu, IDM_TOOLS_TRANSFORM, selsize > 0 && edmode != HVMODE_READONLY ); EnableMenuCmdItem(hMenu, IDM_FILE_REVERT, canundo || canredo); } return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); }