OSDN Git Service

Add "Generate Report" menu item
authorsdottaka <sdottaka@sourceforge.net>
Wed, 24 Sep 2014 09:56:14 +0000 (18:56 +0900)
committersdottaka <sdottaka@sourceforge.net>
Wed, 24 Sep 2014 09:56:14 +0000 (18:56 +0900)
src/CImgMergeWindow.hpp
src/WinIMerge.cpp
src/WinIMerge.rc
src/WinIMergeLib.h
src/resource.h

index 37a86dc..8a18c48 100644 (file)
@@ -1113,6 +1113,13 @@ public:
                return true;\r
        }\r
 \r
+       bool SaveDiffImageAs(int pane, const wchar_t *filename)\r
+       {\r
+               if (pane < 0 || pane >= m_nImages)\r
+                       return false;\r
+               return !!m_imgDiff[pane].saveU(filename);\r
+       }\r
+\r
        HWND GetPaneHWND(int pane) const\r
        {\r
                if (pane < 0 || pane >= m_nImages)\r
index 0af6a08..100a26a 100644 (file)
 \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
@@ -197,6 +201,66 @@ void OnChildPaneEvent(const IImgMergeWindow::Event& evt)
        }\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
@@ -273,6 +337,26 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
                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
index 4be8503..2bf8bbf 100644 (file)
@@ -80,6 +80,7 @@ BEGIN
         MENUITEM "&Open Images\tCtrl+O",        ID_FILE_OPEN\r
         MENUITEM "Open &3 Images\tCtrl+3",      ID_FILE_OPEN3\r
         MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE\r
+        MENUITEM "&Generate Report",            ID_FILE_GENERATE_REPORT\r
         MENUITEM "E&xit",                       ID_FILE_EXIT\r
     END\r
     POPUP "&Edit"\r
index 9936c17..aee6c5f 100644 (file)
@@ -48,6 +48,7 @@ struct IImgMergeWindow
        virtual bool SaveImages() = 0;\r
        virtual bool SaveImage(int pane) = 0;\r
        virtual bool SaveImageAs(int pane, const wchar_t *filename) = 0;\r
+       virtual bool SaveDiffImageAs(int pane, const wchar_t *filename) = 0;\r
        virtual const wchar_t *GetFileName(int pane) = 0;\r
        virtual int  GetPaneCount() const = 0;\r
        virtual RECT GetPaneWindowRect(int pane) const = 0;\r
index 03c451a..a34b05e 100644 (file)
@@ -5,8 +5,9 @@
 #define IDD_WINIMERGE_DIALOG            102\r
 #define ID_FILE_OPEN                    105\r
 #define ID_FILE_OPEN3                   106\r
-#define ID_FILE_EXIT                    107\r
-#define IDI_WINIMERGE                   108\r
+#define ID_FILE_GENERATE_REPORT         107\r
+#define ID_FILE_EXIT                    108\r
+#define IDI_WINIMERGE                   109\r
 #define IDC_WINIMERGE                   110\r
 #define IDR_MAINFRAME                   128\r
 #define IDR_POPUPMENU                   130\r