From 0d2781cc9a97faf0d129d0f7fec32572c3992f6f Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Sun, 14 Mar 2021 16:46:01 +0900 Subject: [PATCH] Make it possible to specify the file type in the "Select Files or Folders" window. --- Src/DirView.cpp | 9 ++---- Src/HexMergeDoc.cpp | 5 +--- Src/ImgMergeFrm.cpp | 9 ++---- Src/MainFrm.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++---------- Src/MainFrm.h | 15 ++++++++-- Src/Merge.cpp | 2 +- Src/Merge.rc | 19 +++++++++++-- Src/MergeDoc.cpp | 7 ++--- Src/MergeDoc.h | 2 ++ Src/OpenView.cpp | 59 +++++++++++++++++++++++++++----------- Src/OpenView.h | 8 ++++-- Src/resource.h | 7 +++-- 12 files changed, 159 insertions(+), 65 deletions(-) diff --git a/Src/DirView.cpp b/Src/DirView.cpp index 419f06931..d7f75c17f 100644 --- a/Src/DirView.cpp +++ b/Src/DirView.cpp @@ -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 diff --git a/Src/HexMergeDoc.cpp b/Src/HexMergeDoc.cpp index a75c1128c..56af26478 100644 --- a/Src/HexMergeDoc.cpp +++ b/Src/HexMergeDoc.cpp @@ -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) diff --git a/Src/ImgMergeFrm.cpp b/Src/ImgMergeFrm.cpp index 9d82493d0..30ad964e8 100644 --- a/Src/ImgMergeFrm.cpp +++ b/Src/ImgMergeFrm.cpp @@ -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")); } /** diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index b255d0506..badadf4ca 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -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 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 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(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); } /** diff --git a/Src/MainFrm.h b/Src/MainFrm.h index 258454b2e..345db540e 100644 --- a/Src/MainFrm.h +++ b/Src/MainFrm.h @@ -13,6 +13,7 @@ #include #include +#include #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 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(); diff --git a/Src/Merge.cpp b/Src/Merge.cpp index 85123330b..5f3fe1fb5 100644 --- a/Src/Merge.cpp +++ b/Src/Merge.cpp @@ -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)) { diff --git a/Src/Merge.rc b/Src/Merge.rc index 422852305..c6308725c 100644 --- a/Src/Merge.rc +++ b/Src/Merge.rc @@ -495,9 +495,9 @@ BEGIN BEGIN MENUITEM "&Text", ID_MERGE_COMPARE_TEXT MENUITEM "T&able", ID_MERGE_COMPARE_TABLE - MENUITEM "&XML", ID_MERGE_COMPARE_XML MENUITEM "&Binary", ID_MERGE_COMPARE_HEX MENUITEM "&Image", ID_MERGE_COMPARE_IMAGE + MENUITEM "&XML", ID_MERGE_COMPARE_XML END MENUITEM SEPARATOR POPUP "Recent F&iles Or Folders" @@ -722,9 +722,11 @@ BEGIN END POPUP "Co&mpare As" BEGIN - MENUITEM "&XML", ID_MERGE_COMPARE_XML + MENUITEM "&Text", ID_MERGE_COMPARE_TEXT + MENUITEM "T&able", ID_MERGE_COMPARE_TABLE MENUITEM "&Binary", ID_MERGE_COMPARE_HEX MENUITEM "&Image", ID_MERGE_COMPARE_IMAGE + MENUITEM "&XML", ID_MERGE_COMPARE_XML END MENUITEM SEPARATOR POPUP "&Copy" @@ -887,6 +889,17 @@ BEGIN END END +IDR_POPUP_COMPARE MENU +BEGIN + POPUP "_POPUP_" + BEGIN + MENUITEM "&Text", ID_MERGE_COMPARE_TEXT + MENUITEM "T&able", ID_MERGE_COMPARE_TABLE + MENUITEM "&Binary", ID_MERGE_COMPARE_HEX + MENUITEM "&Image", ID_MERGE_COMPARE_IMAGE + END +END + IDR_POPUP_OPEN MENU BEGIN POPUP "_POPUP_" @@ -1064,7 +1077,7 @@ BEGIN PUSHBUTTON "Se&lect...",IDC_SELECT_UNPACKER,383,209,73,14 CONTROL "Sa&ve Project...",ID_SAVE_PROJECT,"Button",BS_SPLITBUTTON | WS_TABSTOP,10,245,100,14 - DEFPUSHBUTTON "Co&mpare",IDOK,316,245,70,20 + CONTROL "Co&mpare",IDOK,"Button",BS_SPLITBUTTON | WS_TABSTOP,316,245,70,20 PUSHBUTTON "Cancel",IDCANCEL,390,245,70,20 LTEXT "Status:",IDC_OPEN_STATUS,6,272,440,12 diff --git a/Src/MergeDoc.cpp b/Src/MergeDoc.cpp index a65f79584..b24b6c411 100644 --- a/Src/MergeDoc.cpp +++ b/Src/MergeDoc.cpp @@ -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(); } diff --git a/Src/MergeDoc.h b/Src/MergeDoc.h index 698dc8f7b..cc24289db 100644 --- a/Src/MergeDoc.h +++ b/Src/MergeDoc.h @@ -310,6 +310,8 @@ public: return true; return false; } + std::optional GetEnableTableEditing() const { return m_bEnableTableEditing; } + void SetEnableTableEditing(std::optional bEnableTableEditing) { m_bEnableTableEditing = bEnableTableEditing; } // implementation methods private: diff --git a/Src/OpenView.cpp b/Src/OpenView.cpp index 8930dc5a7..04e11d285 100644 --- a/Src/OpenView.cpp +++ b/Src/OpenView.cpp @@ -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)) ON_COMMAND(IDOK, OnOK) + ON_NOTIFY(BCN_DROPDOWN, IDOK, (OnDropDown)) ON_COMMAND(IDCANCEL, OnCancel) ON_COMMAND(ID_HELP, OnHelp) ON_COMMAND(ID_EDIT_COPY, OnEditAction) @@ -87,6 +88,8 @@ BEGIN_MESSAGE_MAP(COpenView, CFormView) ON_COMMAND(ID_EDIT_CUT, OnEditAction) ON_COMMAND(ID_EDIT_UNDO, OnEditAction) ON_COMMAND(ID_EDIT_SELECT_ALL, (OnEditAction)) + 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(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(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 +void COpenView::OnDropDown(NMHDR *pNMHDR, LRESULT *pResult) +{ + DropDown(pNMHDR, pResult, id, popupid); +} + /** * @brief Allow user to select a file to open/save. */ diff --git a/Src/OpenView.h b/Src/OpenView.h index b35ffb298..24ace1735 100644 --- a/Src/OpenView.h +++ b/Src/OpenView.h @@ -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 + 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 diff --git a/Src/resource.h b/Src/resource.h index 0d4ed819e..c4a994d62 100644 --- a/Src/resource.h +++ b/Src/resource.h @@ -19,6 +19,7 @@ #define IDR_POPUP_MERGEEDITFRAME_STATUSBAR_EOL 116 #define IDR_POPUP_NEW 117 #define IDR_POPUP_OPEN 118 +#define IDR_POPUP_COMPARE 119 #define IDD_ABOUTBOX 200 #define IDD_OPEN 202 #define IDD_PROPPAGE_GENERAL 205 @@ -1067,9 +1068,9 @@ #define ID_MERGE_COMPARE 32869 #define ID_MERGE_COMPARE_TEXT 32870 #define ID_MERGE_COMPARE_TABLE 32871 -#define ID_MERGE_COMPARE_XML 32872 -#define ID_MERGE_COMPARE_HEX 32873 -#define ID_MERGE_COMPARE_IMAGE 32874 +#define ID_MERGE_COMPARE_HEX 32872 +#define ID_MERGE_COMPARE_IMAGE 32873 +#define ID_MERGE_COMPARE_XML 32874 #define ID_MERGE_COMPARE_LEFT1_LEFT2 32875 #define ID_MERGE_COMPARE_RIGHT1_RIGHT2 32876 #define ID_MERGE_COMPARE_LEFT1_RIGHT2 32877 -- 2.11.0