\r
#include <Windows.h>\r
#include <CommCtrl.h>\r
+#include <Shlwapi.h>\r
#include <string>\r
#include <algorithm>\r
+#include <iostream>\r
+#include <fstream>\r
#include "resource.h"\r
#include "WinIMergeLib.h"\r
\r
#pragma comment(lib, "comctl32.lib")\r
+#pragma comment(lib, "shlwapi.lib")\r
\r
HINSTANCE m_hInstance;\r
HINSTANCE hInstDLL;\r
}\r
}\r
\r
+bool GenerateHTMLReport(const wchar_t *filename)\r
+{\r
+ wchar_t imgdir[MAX_PATH], imgdir_full[MAX_PATH], imgfilepath[3][MAX_PATH], difffilename[3][MAX_PATH];\r
+ char imgfilepath_utf8[3][MAX_PATH], difffilename_utf8[3][MAX_PATH];\r
+ wcscpy_s(imgdir_full, filename);\r
+ PathRemoveExtensionW(imgdir_full);\r
+ PathAddExtensionW(imgdir_full, L".files");\r
+ wcscpy_s(imgdir, PathFindFileName(imgdir_full));\r
+ CreateDirectoryW(imgdir_full, NULL);\r
+ for (int i = 0; i < m_pImgMergeWindow->GetPaneCount(); ++i)\r
+ {\r
+ wcscpy_s(imgfilepath[i], m_pImgMergeWindow->GetFileName(i));\r
+ WideCharToMultiByte(CP_UTF8, 0, imgfilepath[i], -1, imgfilepath_utf8[i], sizeof(imgfilepath_utf8[i]), NULL, NULL);\r
+ wsprintfW(difffilename[i], L"%s/%d.png", imgdir, i + 1);\r
+ WideCharToMultiByte(CP_UTF8, 0, difffilename[i], -1, difffilename_utf8[i], sizeof(difffilename_utf8[i]), NULL, NULL);\r
+ wchar_t tmp[MAX_PATH];\r
+ wsprintfW(tmp, L"%s\\%d.png", imgdir_full, i + 1);\r
+ m_pImgMergeWindow->SaveDiffImageAs(i, tmp);\r
+ }\r
+ std::ofstream fout;\r
+ try\r
+ {\r
+ fout.open(filename, std::ios::out | std::ios::trunc);\r
+ fout << \r
+ "<!DOCTYPE html>" << std::endl <<\r
+ "<html>" << std::endl <<\r
+ "<head>" << std::endl <<\r
+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" << std::endl <<\r
+ "<title>WinMerge Image Compare Report</title>" << std::endl <<\r
+ "<style type=\"text/css\">" << std::endl <<\r
+ "table { table-layout: fixed; width: 100%; height: 100%; border-collapse: collapse; }" << std::endl <<\r
+ "th,td { border: solid 1px black; }" << std::endl <<\r
+ ".title { color: white; background-color: blue; vertical-align: top; }" << std::endl <<\r
+ ".img { height: 100%; overflow: scroll; text-align: center; }" << std::endl <<\r
+ "</style>" << std::endl <<\r
+ "</head>" << std::endl <<\r
+ "<body>" << std::endl <<\r
+ "<table>" << std::endl <<\r
+ "<tr>" << std::endl;\r
+ for (int i = 0; i < m_pImgMergeWindow->GetPaneCount(); ++i)\r
+ fout << "<th class=\"title\">" << imgfilepath_utf8[i] << "</th>" << std::endl;\r
+ fout << \r
+ "</tr>" << std::endl <<\r
+ "<tr>" << std::endl;\r
+ for (int i = 0; i < m_pImgMergeWindow->GetPaneCount(); ++i)\r
+ fout << "<td><div class=\"img\"><img src=\"" << difffilename_utf8[i] << \r
+ "\" alt=\"" << difffilename_utf8[i] << "\"></div></td>" << std::endl;\r
+ fout <<\r
+ "</tr>" << std::endl <<\r
+ "</table>" << std::endl <<\r
+ "</body>" << std::endl <<\r
+ "</html>" << std::endl;\r
+ return true;\r
+ }\r
+ catch (...)\r
+ {\r
+ return false;\r
+ }\r
+}\r
+\r
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
switch (message) \r
case ID_FILE_SAVE:\r
m_pImgMergeWindow->SaveImages();\r
break;\r
+ case ID_FILE_GENERATE_REPORT:\r
+ {\r
+ wchar_t szFileName[MAX_PATH] = {0}, szFile[MAX_PATH] = {0};\r
+ OPENFILENAMEW ofn = {0};\r
+ ofn.lStructSize = sizeof(OPENFILENAME);\r
+ ofn.hwndOwner = hWnd;\r
+ ofn.lpstrFilter = L"HTML file(*.html)\0*.html\0\0";\r
+ ofn.lpstrFile = szFileName;\r
+ ofn.lpstrFileTitle = szFile;\r
+ ofn.nMaxFile = MAX_PATH;\r
+ ofn.nMaxFileTitle = sizeof(szFile);\r
+ ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;\r
+ ofn.lpstrTitle = L"Generate HTML Report File";\r
+ ofn.lpstrDefExt = L"html";\r
+ if (GetSaveFileNameW(&ofn) != 0)\r
+ {\r
+ GenerateHTMLReport(ofn.lpstrFile);\r
+ }\r
+ break;\r
+ }\r
case ID_FILE_EXIT:\r
DestroyWindow(hWnd);\r
break;\r