OSDN Git Service

Make it possible to specify the file type in the "Select Files or Folders" window.
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 14 Mar 2021 07:46:01 +0000 (16:46 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 14 Mar 2021 07:46:01 +0000 (16:46 +0900)
12 files changed:
Src/DirView.cpp
Src/HexMergeDoc.cpp
Src/ImgMergeFrm.cpp
Src/MainFrm.cpp
Src/MainFrm.h
Src/Merge.cpp
Src/Merge.rc
Src/MergeDoc.cpp
Src/MergeDoc.h
Src/OpenView.cpp
Src/OpenView.h
Src/resource.h

index 419f069..d7f75c1 100644 (file)
@@ -280,8 +280,8 @@ BEGIN_MESSAGE_MAP(CDirView, CListView)
        ON_COMMAND(ID_MERGE_COMPARE_NONHORIZONTALLY, OnMergeCompareNonHorizontally)
        ON_COMMAND(ID_MERGE_COMPARE_XML, OnMergeCompareXML)
        ON_UPDATE_COMMAND_UI(ID_MERGE_COMPARE_XML, OnUpdateMergeCompare)
-       ON_COMMAND_RANGE(ID_MERGE_COMPARE_HEX, ID_MERGE_COMPARE_IMAGE, OnMergeCompareAs)
-       ON_UPDATE_COMMAND_UI_RANGE(ID_MERGE_COMPARE_HEX, ID_MERGE_COMPARE_IMAGE, OnUpdateMergeCompare)
+       ON_COMMAND_RANGE(ID_MERGE_COMPARE_TEXT, ID_MERGE_COMPARE_IMAGE, OnMergeCompareAs)
+       ON_UPDATE_COMMAND_UI_RANGE(ID_MERGE_COMPARE_TEXT, ID_MERGE_COMPARE_IMAGE, OnUpdateMergeCompare)
        ON_COMMAND(ID_VIEW_TREEMODE, OnViewTreeMode)
        ON_UPDATE_COMMAND_UI(ID_VIEW_TREEMODE, OnUpdateViewTreeMode)
        ON_COMMAND(ID_VIEW_EXPAND_ALLSUBDIRS, OnViewExpandAllSubdirs)
@@ -1524,10 +1524,7 @@ void CDirView::OpenSelectionAs(UINT id)
                fileloc[pane].setPath(paths[pane]);
                dwFlags[pane] |= FFILEOPEN_NOMRU | (pDoc->GetReadOnly(nPane[pane]) ? FFILEOPEN_READONLY : 0);
        }
-       if (id == ID_MERGE_COMPARE_HEX)
-               GetMainFrame()->ShowHexMergeDoc(pDoc, paths.GetSize(), fileloc, dwFlags, nullptr);
-       else
-               GetMainFrame()->ShowImgMergeDoc(pDoc, paths.GetSize(), fileloc, dwFlags, nullptr);
+       GetMainFrame()->ShowMergeDoc(id, pDoc, paths.GetSize(), fileloc, dwFlags, nullptr);
 }
 
 /// User chose (context menu) delete left
index a75c112..56af264 100644 (file)
@@ -827,10 +827,7 @@ void CHexMergeDoc::OnFileRecompareAs(UINT nID)
                strDesc[nBuffer] = m_strDesc[nBuffer];
        }
        CloseNow();
-       if (nID == ID_MERGE_COMPARE_TEXT)
-               GetMainFrame()->ShowMergeDoc(pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
-       else
-               GetMainFrame()->ShowImgMergeDoc(pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
+       GetMainFrame()->ShowMergeDoc(nID, pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
 }
 
 void CHexMergeDoc::OnUpdateFileRecompareAs(CCmdUI* pCmdUI)
index 9d82493..30ad964 100644 (file)
@@ -922,12 +922,7 @@ void CImgMergeFrame::OnFileRecompareAs(UINT nId)
                strDesc[nBuffer] = m_strDesc[nBuffer];
        }
        CloseNow();
-       if (nId == ID_MERGE_COMPARE_TEXT)
-               GetMainFrame()->ShowMergeDoc(pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
-       else if (nId == ID_MERGE_COMPARE_HEX)
-               GetMainFrame()->ShowHexMergeDoc(pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
-       else
-               GetMainFrame()->ShowImgMergeDoc(pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
+       GetMainFrame()->ShowMergeDoc(nId, pDirDoc, nBuffers, fileloc, dwFlags, strDesc);
 }
 
 void CImgMergeFrame::OnUpdateFileRecompareAs(CCmdUI* pCmdUI)
@@ -2063,7 +2058,7 @@ void CImgMergeFrame::OnImgCompareExtractedText()
                        SysFreeString(bstr);
                }
        }
-       GetMainFrame()->ShowMergeDoc(m_pDirDoc, m_filePaths.GetSize(), text, desc, _T(".yaml"));
+       GetMainFrame()->ShowTextMergeDoc(m_pDirDoc, m_filePaths.GetSize(), text, desc, _T(".yaml"));
 }
 
 /**
index b255d05..badadf4 100644 (file)
@@ -660,7 +660,32 @@ bool CMainFrame::ShowAutoMergeDoc(CDirDoc * pDirDoc,
                else if (filterBin.includeFile(ifileloc[pane].filepath) && CHexMergeView::IsLoadable())
                        return ShowHexMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
        }
-       return ShowMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
+       return ShowTextOrTableMergeDoc({}, pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
+}
+
+bool CMainFrame::ShowMergeDoc(UINT nID, CDirDoc* pDirDoc,
+       int nFiles, const FileLocation ifileloc[],
+       const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
+       const PackingInfo* infoUnpacker /*= nullptr*/)
+{
+       switch (nID)
+       {
+       case ID_MERGE_COMPARE_TEXT:
+               return GetMainFrame()->ShowTextMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags,
+                       strDesc, sReportFile, infoUnpacker);
+       case ID_MERGE_COMPARE_TABLE:
+               return GetMainFrame()->ShowTableMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags,
+                       strDesc, sReportFile, infoUnpacker);
+       case ID_MERGE_COMPARE_HEX:
+               return GetMainFrame()->ShowHexMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags,
+                       strDesc, sReportFile, infoUnpacker);
+       case ID_MERGE_COMPARE_IMAGE:
+               return GetMainFrame()->ShowImgMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags,
+                       strDesc, sReportFile, infoUnpacker);
+       default:
+               return GetMainFrame()->ShowAutoMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags,
+                       strDesc, sReportFile, infoUnpacker);
+       }
 }
 
 std::array<bool, 3> GetROFromFlags(int nFiles, const DWORD dwFlags[])
@@ -695,7 +720,7 @@ int GetActivePaneFromFlags(int nFiles, const DWORD dwFlags[])
  * @param [in] infoUnpacker Plugin info.
  * @return success/failure
  */
-bool CMainFrame::ShowMergeDoc(CDirDoc * pDirDoc,
+bool CMainFrame::ShowTextOrTableMergeDoc(std::optional<bool> table, CDirDoc * pDirDoc,
        int nFiles, const FileLocation ifileloc[],
        const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
        const PackingInfo * infoUnpacker /*= nullptr*/)
@@ -730,6 +755,8 @@ bool CMainFrame::ShowMergeDoc(CDirDoc * pDirDoc,
                }
        }
 
+       pMergeDoc->SetEnableTableEditing(table);
+
        // Note that OpenDocs() takes care of closing compare window when needed.
        bool bResult = pMergeDoc->OpenDocs(nFiles, fileloc, GetROFromFlags(nFiles, dwFlags).data(), strDesc);
        if (bResult)
@@ -768,6 +795,22 @@ bool CMainFrame::ShowMergeDoc(CDirDoc * pDirDoc,
        return true;
 }
 
+bool CMainFrame::ShowTextMergeDoc(CDirDoc* pDirDoc,
+       int nFiles, const FileLocation ifileloc[],
+       const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
+       const PackingInfo* infoUnpacker /*= nullptr*/)
+{
+       return ShowTextOrTableMergeDoc(false, pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
+}
+
+bool CMainFrame::ShowTableMergeDoc(CDirDoc* pDirDoc,
+       int nFiles, const FileLocation ifileloc[],
+       const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
+       const PackingInfo* infoUnpacker /*= nullptr*/)
+{
+       return ShowTextOrTableMergeDoc(true, pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
+}
+
 bool CMainFrame::ShowHexMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
        const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
        const PackingInfo * infoUnpacker /*= nullptr*/)
@@ -802,7 +845,7 @@ bool CMainFrame::ShowImgMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocati
        pDirDoc->AddMergeDoc(pImgMergeFrame);
                
        if (!pImgMergeFrame->OpenDocs(nFiles, fileloc, GetROFromFlags(nFiles, dwFlags).data(), strDesc, this))
-               return ShowMergeDoc(pDirDoc, nFiles, fileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
+               return ShowTextMergeDoc(pDirDoc, nFiles, fileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
 
        for (int pane = 0; pane < nFiles; pane++)
        {
@@ -818,7 +861,7 @@ bool CMainFrame::ShowImgMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocati
        return true;
 }
 
-bool CMainFrame::ShowMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String text[],
+bool CMainFrame::ShowTextMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String text[],
                const String strDesc[], const String& strFileExt)
 {
        FileLocation fileloc[3];
@@ -838,7 +881,7 @@ bool CMainFrame::ShowMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String text[
                }
                fileloc[nBuffer].setPath(workFile);
        }
-       return ShowMergeDoc(pDirDoc2, nBuffers, fileloc, dwFlags, strDesc);
+       return ShowTextMergeDoc(pDirDoc2, nBuffers, fileloc, dwFlags, strDesc);
 }
 
 /**
@@ -1093,6 +1136,17 @@ bool CMainFrame::DoFileOpen(const PathContext * pFiles /*= nullptr*/,
        return true;
 }
 
+bool CMainFrame::DoFileOpen(UINT nID, const PathContext* pFiles /*= nullptr*/,
+       const DWORD dwFlags[] /*= nullptr*/, const String strDesc[] /*= nullptr*/)
+{
+       CDirDoc* pDirDoc = static_cast<CDirDoc*>(theApp.m_pDirTemplate->CreateNewDocument());
+       FileLocation fileloc[3];
+       for (int pane = 0; pane < pFiles->GetSize(); pane++)
+               fileloc[pane].setPath((*pFiles)[pane]);
+       return ShowMergeDoc(nID, pDirDoc, pFiles->GetSize(), fileloc,
+               dwFlags, strDesc);
+}
+
 void CMainFrame::UpdateFont(FRAMETYPE frame)
 {
        if (frame == FRAME_FOLDER)
@@ -1622,16 +1676,14 @@ void CMainFrame::FileNew(int nPanes, FRAMETYPE frameType, bool table)
                fileloc[1].encoding.SetCodepage(ucr::getDefaultCodepage());
                fileloc[2].encoding.SetCodepage(ucr::getDefaultCodepage());
        }
-       if (frameType == FRAME_FILE)
+       UINT nID = ID_MERGE_COMPARE_TEXT;
+       switch (frameType)
        {
-               ShowMergeDoc(pDirDoc, nPanes, fileloc, dwFlags, strDesc);
-               if (table)
-                       PostMessage(WM_COMMAND, ID_MERGE_COMPARE_TABLE);
+       case FRAME_FILE: nID = !table ? ID_MERGE_COMPARE_TEXT : ID_MERGE_COMPARE_TABLE; break;
+       case FRAME_HEXFILE: nID = ID_MERGE_COMPARE_HEX; break;
+       case FRAME_IMGFILE: nID = ID_MERGE_COMPARE_IMAGE; break;
        }
-       else if (frameType == FRAME_HEXFILE)
-               ShowHexMergeDoc(pDirDoc, nPanes, fileloc, dwFlags, strDesc);
-       else if (frameType == FRAME_IMGFILE)
-               ShowImgMergeDoc(pDirDoc, nPanes, fileloc, dwFlags, strDesc);
+       ShowMergeDoc(nID, pDirDoc, nPanes, fileloc, dwFlags, strDesc);
 }
 
 /**
@@ -2367,7 +2419,7 @@ bool CMainFrame::DoOpenConflict(const String& conflictFile, const String strDesc
        return conflictCompared;
 }
 
-bool CMainFrame::DoSelfCompare(const String& file, const String strDesc[] /*= nullptr*/)
+bool CMainFrame::DoSelfCompare(UINT nID, const String& file, const String strDesc[] /*= nullptr*/)
 {
        String ext = paths::FindExtension(file);
        TempFilePtr wTemp(new TempFile());
@@ -2381,7 +2433,7 @@ bool CMainFrame::DoSelfCompare(const String& file, const String strDesc[] /*= nu
                (strDesc && !strDesc[1].empty()) ? strDesc[1] : _("") };
        DWORD dwFlags[2] = {FFILEOPEN_READONLY | FFILEOPEN_NOMRU, FFILEOPEN_NOMRU};
        PathContext tmpPathContext(copiedFile, file);
-       return DoFileOpen(&tmpPathContext, dwFlags, strDesc2);
+       return DoFileOpen(nID, &tmpPathContext, dwFlags, strDesc2);
 }
 
 /**
index 258454b..345db54 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <vector>
 #include <memory>
+#include <optional>
 #include "MDITabBar.h"
 #include "PathContext.h"
 #include "OptionsDef.h"
@@ -90,12 +91,20 @@ public:
        void FileNew(int nPanes, FRAMETYPE frameType, bool table);
        bool DoFileOpen(const PathContext *pFiles = nullptr,
                const DWORD dwFlags[] = nullptr, const String strDesc[] = nullptr, const String& sReportFile = _T(""), bool bRecurse = false, CDirDoc *pDirDoc = nullptr, String prediffer = _T(""), const PackingInfo * infoUnpacker = nullptr);
+       bool DoFileOpen(UINT nID, const PathContext *pFiles = nullptr,
+               const DWORD dwFlags[] = nullptr, const String strDesc[] = nullptr);
        bool ShowAutoMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
                const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
-       bool ShowMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
+       bool ShowMergeDoc(UINT nID, CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
                const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
-       bool ShowMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String text[],
+       bool ShowTextOrTableMergeDoc(std::optional<bool> table, CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
+               const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
+       bool ShowTextMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
+               const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
+       bool ShowTextMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String text[],
                const String strDesc[], const String& strFileExt);
+       bool ShowTableMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
+               const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
        bool ShowHexMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
                const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
        bool ShowImgMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
@@ -108,7 +117,7 @@ public:
        void StartFlashing();
        bool AskCloseConfirmation();
        bool DoOpenConflict(const String& conflictFile, const String strDesc[] = nullptr, bool checked = false);
-       bool DoSelfCompare(const String& file, const String strDesc[] = nullptr);
+       bool DoSelfCompare(UINT nID, const String& file, const String strDesc[] = nullptr);
        FRAMETYPE GetFrameType(const CFrameWnd * pFrame) const;
        void UpdateDocTitle();
        void ReloadMenu();
index 8512333..5f3fe1f 100644 (file)
@@ -686,7 +686,7 @@ bool CMergeApp::ParseArgsAndDoOpen(MergeCmdLineInfo& cmdInfo, CMainFrame* pMainF
                        {
                                strDesc[0] = cmdInfo.m_sLeftDesc;
                                strDesc[1] = cmdInfo.m_sRightDesc;
-                               bCompared = pMainFrame->DoSelfCompare(sFilepath, strDesc);
+                               bCompared = pMainFrame->DoSelfCompare(IDOK, sFilepath, strDesc);
                        }
                        else if (IsProjectFile(sFilepath))
                        {
index 4228523..c630872 100644 (file)
@@ -495,9 +495,9 @@ BEGIN
         BEGIN\r
             MENUITEM "&Text",                       ID_MERGE_COMPARE_TEXT\r
             MENUITEM "T&able",                      ID_MERGE_COMPARE_TABLE\r
-            MENUITEM "&XML",                        ID_MERGE_COMPARE_XML\r
             MENUITEM "&Binary",                     ID_MERGE_COMPARE_HEX\r
             MENUITEM "&Image",                      ID_MERGE_COMPARE_IMAGE\r
+            MENUITEM "&XML",                        ID_MERGE_COMPARE_XML\r
         END\r
         MENUITEM SEPARATOR\r
         POPUP "Recent F&iles Or Folders"\r
@@ -722,9 +722,11 @@ BEGIN
         END\r
         POPUP "Co&mpare As"\r
         BEGIN\r
-            MENUITEM "&XML",                        ID_MERGE_COMPARE_XML\r
+            MENUITEM "&Text",                       ID_MERGE_COMPARE_TEXT\r
+            MENUITEM "T&able",                      ID_MERGE_COMPARE_TABLE\r
             MENUITEM "&Binary",                     ID_MERGE_COMPARE_HEX\r
             MENUITEM "&Image",                      ID_MERGE_COMPARE_IMAGE\r
+            MENUITEM "&XML",                        ID_MERGE_COMPARE_XML\r
         END\r
         MENUITEM SEPARATOR\r
         POPUP "&Copy"\r
@@ -887,6 +889,17 @@ BEGIN
     END\r
 END\r
 \r
+IDR_POPUP_COMPARE MENU\r
+BEGIN\r
+    POPUP "_POPUP_"\r
+    BEGIN\r
+        MENUITEM "&Text",                       ID_MERGE_COMPARE_TEXT\r
+        MENUITEM "T&able",                      ID_MERGE_COMPARE_TABLE\r
+        MENUITEM "&Binary",                     ID_MERGE_COMPARE_HEX\r
+        MENUITEM "&Image",                      ID_MERGE_COMPARE_IMAGE\r
+    END\r
+END\r
+\r
 IDR_POPUP_OPEN MENU\r
 BEGIN\r
     POPUP "_POPUP_"\r
@@ -1064,7 +1077,7 @@ BEGIN
     PUSHBUTTON      "Se&lect...",IDC_SELECT_UNPACKER,383,209,73,14\r
 \r
     CONTROL         "Sa&ve Project...",ID_SAVE_PROJECT,"Button",BS_SPLITBUTTON | WS_TABSTOP,10,245,100,14\r
-    DEFPUSHBUTTON   "Co&mpare",IDOK,316,245,70,20\r
+    CONTROL         "Co&mpare",IDOK,"Button",BS_SPLITBUTTON | WS_TABSTOP,316,245,70,20\r
     PUSHBUTTON      "Cancel",IDCANCEL,390,245,70,20\r
     LTEXT           "Status:",IDC_OPEN_STATUS,6,272,440,12\r
 \r
index a65f795..b24b6c4 100644 (file)
@@ -2866,7 +2866,7 @@ void CMergeDoc::SetTableProperties()
  * @param bRO [in] Is left/middle/right file read-only
  * @return Success/Failure/Binary (failure) per typedef enum OpenDocsResult_TYPE
  * @todo Options are still read from CMainFrame, this will change
- * @sa CMainFrame::ShowMergeDoc()
+ * @sa CMainFrame::ShowTextMergeDoc()
  */
 bool CMergeDoc::OpenDocs(int nFiles, const FileLocation ifileloc[],
                const bool bRO[], const String strDesc[])
@@ -3521,10 +3521,7 @@ void CMergeDoc::OnFileRecompareAs(UINT nID)
        }
        if (m_pEncodingErrorBar!=nullptr && m_pEncodingErrorBar->IsWindowVisible())
                m_pView[0][0]->GetParentFrame()->ShowControlBar(m_pEncodingErrorBar.get(), FALSE, FALSE);
-       if (nID == ID_MERGE_COMPARE_HEX)
-               GetMainFrame()->ShowHexMergeDoc(m_pDirDoc, m_nBuffers, fileloc, dwFlags, m_strDesc);
-       else
-               GetMainFrame()->ShowImgMergeDoc(m_pDirDoc, m_nBuffers, fileloc, dwFlags, m_strDesc);
+       GetMainFrame()->ShowMergeDoc(nID, m_pDirDoc, m_nBuffers, fileloc, dwFlags, m_strDesc);
        GetParentFrame()->ShowWindow(SW_RESTORE);
        GetParentFrame()->DestroyWindow();
 }
index 698dc8f..cc24289 100644 (file)
@@ -310,6 +310,8 @@ public:
                                return true;
                return false;
        }
+       std::optional<bool> GetEnableTableEditing() const { return m_bEnableTableEditing; }
+       void SetEnableTableEditing(std::optional<bool> bEnableTableEditing) { m_bEnableTableEditing = bEnableTableEditing; }
 
 // implementation methods
 private:
index 8930dc5..04e11d2 100644 (file)
@@ -78,8 +78,9 @@ BEGIN_MESSAGE_MAP(COpenView, CFormView)
        ON_COMMAND(ID_LOAD_PROJECT, OnLoadProject)
        ON_COMMAND(ID_SAVE_PROJECT, OnSaveProject)
        ON_COMMAND(ID_FILE_SAVE, OnSaveProject)
-       ON_NOTIFY(BCN_DROPDOWN, ID_SAVE_PROJECT, OnDropDownSaveProject)
+       ON_NOTIFY(BCN_DROPDOWN, ID_SAVE_PROJECT, (OnDropDown<ID_SAVE_PROJECT, IDR_POPUP_PROJECT>))
        ON_COMMAND(IDOK, OnOK)
+       ON_NOTIFY(BCN_DROPDOWN, IDOK, (OnDropDown<IDOK, IDR_POPUP_COMPARE>))
        ON_COMMAND(IDCANCEL, OnCancel)
        ON_COMMAND(ID_HELP, OnHelp)
        ON_COMMAND(ID_EDIT_COPY, OnEditAction<WM_COPY>)
@@ -87,6 +88,8 @@ BEGIN_MESSAGE_MAP(COpenView, CFormView)
        ON_COMMAND(ID_EDIT_CUT, OnEditAction<WM_CUT>)
        ON_COMMAND(ID_EDIT_UNDO, OnEditAction<WM_UNDO>)
        ON_COMMAND(ID_EDIT_SELECT_ALL, (OnEditAction<EM_SETSEL, 0, -1>))
+       ON_COMMAND_RANGE(ID_MERGE_COMPARE_TEXT, ID_MERGE_COMPARE_IMAGE, OnCompare)
+       ON_UPDATE_COMMAND_UI_RANGE(ID_MERGE_COMPARE_TEXT, ID_MERGE_COMPARE_IMAGE, OnUpdateCompare)
        ON_MESSAGE(WM_USER + 1, OnUpdateStatus)
        ON_WM_PAINT()
        ON_WM_LBUTTONUP()
@@ -158,6 +161,7 @@ void COpenView::OnInitialUpdate()
                // fallback for XP 
                SendDlgItemMessage(IDC_OPTIONS, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
                SendDlgItemMessage(ID_SAVE_PROJECT, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
+               SendDlgItemMessage(IDOK, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
        }
 
        m_sizeOrig = GetTotalSize();
@@ -534,12 +538,7 @@ void COpenView::OnSwapButton()
        OnSwapButton(id1, id2);
 }
 
-/** 
- * @brief Called when dialog is closed with "OK".
- *
- * Checks that paths are valid and sets filters.
- */
-void COpenView::OnOK() 
+void COpenView::OnCompare(UINT nID)
 {
        int pathsType; // enum from paths::PATH_EXISTENCE in paths.h
        const String filterPrefix = _("[F] ");
@@ -548,7 +547,7 @@ void COpenView::OnOK()
        TrimPaths();
 
        int nFiles = 0;
-       for (auto& strPath: m_strPath)
+       for (auto& strPath : m_strPath)
        {
                if (nFiles >= 1 && strPath.empty())
                        break;
@@ -566,7 +565,7 @@ void COpenView::OnOK()
                if (strutils::compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0)
                        LoadProjectFile(m_strPath[0]);
                else
-                       GetMainFrame()->DoSelfCompare(m_strPath[0], nullptr);
+                       GetMainFrame()->DoSelfCompare(nID, m_strPath[0], nullptr);
                return;
        }
 
@@ -643,10 +642,32 @@ void COpenView::OnOK()
                GetParentFrame()->PostMessage(WM_CLOSE);
 
        PathContext tmpPathContext(pDoc->m_files);
-       PackingInfo tmpPackingInfo(pDoc->m_infoHandler);
-       GetMainFrame()->DoFileOpen(
-               &tmpPathContext, std::array<DWORD, 3>(pDoc->m_dwFlags).data(), 
-               nullptr, _T(""), pDoc->m_bRecurse, nullptr, _T(""), &tmpPackingInfo);
+       if (nID == IDOK)
+       {
+               PackingInfo tmpPackingInfo(pDoc->m_infoHandler);
+               GetMainFrame()->DoFileOpen(
+                       &tmpPathContext, std::array<DWORD, 3>(pDoc->m_dwFlags).data(),
+                       nullptr, _T(""), pDoc->m_bRecurse, nullptr, _T(""), &tmpPackingInfo);
+       }
+       else
+       {
+               GetMainFrame()->DoFileOpen(nID, &m_files, pDoc->m_dwFlags.data());
+       }
+}
+
+void COpenView::OnUpdateCompare(CCmdUI *pCmdUI)
+{
+       pCmdUI->Enable(GetDlgItem(IDC_UNPACKER_EDIT)->IsWindowEnabled());
+}
+
+/** 
+ * @brief Called when dialog is closed with "OK".
+ *
+ * Checks that paths are valid and sets filters.
+ */
+void COpenView::OnOK() 
+{
+       OnCompare(IDOK);
 }
 
 /** 
@@ -757,12 +778,12 @@ void COpenView::OnSaveProject()
        LangMessageBox(IDS_PROJFILE_SAVE_SUCCESS, MB_ICONINFORMATION);
 }
 
-void COpenView::OnDropDownSaveProject(NMHDR *pNMHDR, LRESULT *pResult)
+void COpenView::DropDown(NMHDR* pNMHDR, LRESULT* pResult, UINT nID, UINT nPopupID)
 {
        CRect rcButton, rcView;
-       GetDlgItem(ID_SAVE_PROJECT)->GetWindowRect(&rcButton);
+       GetDlgItem(nID)->GetWindowRect(&rcButton);
        BCMenu menu;
-       VERIFY(menu.LoadMenu(IDR_POPUP_PROJECT));
+       VERIFY(menu.LoadMenu(nPopupID));
        theApp.TranslateMenu(menu.m_hMenu);
        CMenu* pPopup = menu.GetSubMenu(0);
        if (pPopup != nullptr)
@@ -773,6 +794,12 @@ void COpenView::OnDropDownSaveProject(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = 0;
 }
 
+template<UINT id, UINT popupid>
+void COpenView::OnDropDown(NMHDR *pNMHDR, LRESULT *pResult)
+{
+       DropDown(pNMHDR, pResult, id, popupid);
+}
+
 /** 
  * @brief Allow user to select a file to open/save.
  */
index b35ffb2..24ace17 100644 (file)
@@ -102,6 +102,7 @@ protected:
        void LoadComboboxStates();
        void SaveComboboxStates();
        String AskProjectFileName(bool bOpen);
+       void DropDown(NMHDR *pNMHDR, LRESULT *pResult, UINT nID, UINT nPopupID);
 
 // Generated message map functions
 protected:
@@ -109,9 +110,13 @@ protected:
        afx_msg void OnPathButton(UINT nID);
        afx_msg void OnOK();
        afx_msg void OnCancel();
+       afx_msg void OnCompare(UINT nID);
+       afx_msg void OnUpdateCompare(CCmdUI *pCmdUI);
        afx_msg void OnLoadProject();
        afx_msg void OnSaveProject();
-       afx_msg void OnDropDownSaveProject(NMHDR *pNMHDR, LRESULT *pResult);
+       template<UINT id, UINT popupid>
+       afx_msg void OnDropDown(NMHDR *pNMHDR, LRESULT *pResult);
+       afx_msg void OnDropDownOptions(NMHDR *pNMHDR, LRESULT *pResult);
        afx_msg void OnSelchangePathCombo(UINT nID);
        afx_msg void OnSetfocusPathCombo(UINT id, NMHDR *pNMHDR, LRESULT *pResult);
        afx_msg void OnDragBeginPathCombo(UINT id, NMHDR *pNMHDR, LRESULT *pResult);
@@ -123,7 +128,6 @@ protected:
        afx_msg void OnSelectUnpacker();
        afx_msg void OnSelectFilter();
        afx_msg void OnOptions();
-       afx_msg void OnDropDownOptions(NMHDR *pNMHDR, LRESULT *pResult);
        afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
        afx_msg void OnEditAction(int msg, WPARAM wParam, LPARAM LPARAM);
        template <int MSG, int WPARAM = 0, int LPARAM = 0>
index 0d4ed81..c4a994d 100644 (file)
@@ -19,6 +19,7 @@
 #define IDR_POPUP_MERGEEDITFRAME_STATUSBAR_EOL 116\r
 #define IDR_POPUP_NEW                   117\r
 #define IDR_POPUP_OPEN                  118\r
+#define IDR_POPUP_COMPARE               119\r
 #define IDD_ABOUTBOX                    200\r
 #define IDD_OPEN                        202\r
 #define IDD_PROPPAGE_GENERAL            205\r
 #define ID_MERGE_COMPARE                32869\r
 #define ID_MERGE_COMPARE_TEXT           32870\r
 #define ID_MERGE_COMPARE_TABLE          32871\r
-#define ID_MERGE_COMPARE_XML            32872\r
-#define ID_MERGE_COMPARE_HEX            32873\r
-#define ID_MERGE_COMPARE_IMAGE          32874\r
+#define ID_MERGE_COMPARE_HEX            32872\r
+#define ID_MERGE_COMPARE_IMAGE          32873\r
+#define ID_MERGE_COMPARE_XML            32874\r
 #define ID_MERGE_COMPARE_LEFT1_LEFT2    32875\r
 #define ID_MERGE_COMPARE_RIGHT1_RIGHT2  32876\r
 #define ID_MERGE_COMPARE_LEFT1_RIGHT2   32877\r