OSDN Git Service

Fix issue #784: Error on try to show differences between two different gif
[winmerge-jp/winmerge-jp.git] / Src / MainFrm.cpp
index badadf4..708ddb4 100644 (file)
@@ -64,7 +64,7 @@
 #include "utils/hqbitmap.h"
 #include "UniFile.h"
 #include "TFile.h"
-
+#include "Shell.h"
 #include "WindowsManagerDialog.h"
 
 using std::vector;
@@ -242,12 +242,20 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
        ON_COMMAND_RANGE(ID_MRU_FIRST, ID_MRU_LAST, OnMRUs)
        ON_UPDATE_COMMAND_UI(ID_MRU_FIRST, OnUpdateNoMRUs)
        ON_UPDATE_COMMAND_UI(ID_NO_MRU, OnUpdateNoMRUs)
+       ON_COMMAND(ID_FIRSTFILE, OnFirstFile)
+       ON_UPDATE_COMMAND_UI(ID_FIRSTFILE, OnUpdateFirstFile)
+       ON_COMMAND(ID_PREVFILE, OnPrevFile)
+       ON_UPDATE_COMMAND_UI(ID_PREVFILE, OnUpdatePrevFile)
+       ON_COMMAND(ID_NEXTFILE, OnNextFile)
+       ON_UPDATE_COMMAND_UI(ID_NEXTFILE, OnUpdateNextFile)
+       ON_COMMAND(ID_LASTFILE, OnLastFile)
+       ON_UPDATE_COMMAND_UI(ID_LASTFILE, OnUpdateLastFile)
        ON_COMMAND(ID_ACCEL_QUIT, &CMainFrame::OnAccelQuit)
-       //}}AFX_MSG_MAP
        ON_MESSAGE(WMU_CHILDFRAMEADDED, &CMainFrame::OnChildFrameAdded)
        ON_MESSAGE(WMU_CHILDFRAMEREMOVED, &CMainFrame::OnChildFrameRemoved)
        ON_MESSAGE(WMU_CHILDFRAMEACTIVATE, &CMainFrame::OnChildFrameActivate)
        ON_MESSAGE(WMU_CHILDFRAMEACTIVATED, &CMainFrame::OnChildFrameActivated)
+       //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
 /**
@@ -637,7 +645,7 @@ void CMainFrame::OnFileOpen()
 static void
 FileLocationGuessEncodings(FileLocation & fileloc, int iGuessEncoding)
 {
-       fileloc.encoding = GuessCodepageEncoding(fileloc.filepath, iGuessEncoding);
+       fileloc.encoding = codepage_detect::Guess(fileloc.filepath, iGuessEncoding);
 }
 
 bool CMainFrame::ShowAutoMergeDoc(CDirDoc * pDirDoc,
@@ -645,9 +653,20 @@ bool CMainFrame::ShowAutoMergeDoc(CDirDoc * pDirDoc,
        const DWORD dwFlags[], const String strDesc[], const String& sReportFile /*= _T("")*/,
        const PackingInfo * infoUnpacker /*= nullptr*/)
 {
+       ASSERT(pDirDoc != nullptr);
+
        if (sReportFile.empty() && pDirDoc->CompareFilesIfFilesAreLarge(nFiles, ifileloc))
                return false;
 
+       String unpackedFileExtension;
+       if (infoUnpacker && GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED))
+       {
+               std::vector<String> filepaths(nFiles);
+               std::transform(ifileloc, ifileloc + nFiles, filepaths.begin(),
+                       [](auto& file) { return file.filepath; });
+               String filteredFilenames = strutils::join(filepaths.begin(), filepaths.end(), _T("|"));
+               unpackedFileExtension = FileTransform::GetUnpackedFileExtension(filteredFilenames, infoUnpacker);
+       }
        FileFilterHelper filterImg, filterBin;
        filterImg.UseMask(true);
        filterImg.SetMask(GetOptionsMgr()->GetString(OPT_CMP_IMG_FILEPATTERNS));
@@ -655,9 +674,10 @@ bool CMainFrame::ShowAutoMergeDoc(CDirDoc * pDirDoc,
        filterBin.SetMask(GetOptionsMgr()->GetString(OPT_CMP_BIN_FILEPATTERNS));
        for (int pane = 0; pane < nFiles; ++pane)
        {
-               if (filterImg.includeFile(ifileloc[pane].filepath) && CImgMergeFrame::IsLoadable())
+               String filepath = ifileloc[pane].filepath + unpackedFileExtension;
+               if (filterImg.includeFile(filepath) && CImgMergeFrame::IsLoadable())
                        return ShowImgMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
-               else if (filterBin.includeFile(ifileloc[pane].filepath) && CHexMergeView::IsLoadable())
+               else if (filterBin.includeFile(filepath) && CHexMergeView::IsLoadable())
                        return ShowHexMergeDoc(pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
        }
        return ShowTextOrTableMergeDoc({}, pDirDoc, nFiles, ifileloc, dwFlags, strDesc, sReportFile, infoUnpacker);
@@ -821,6 +841,8 @@ bool CMainFrame::ShowHexMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocati
        if (pHexMergeDoc == nullptr)
                return false;
 
+       pHexMergeDoc->SetUnpacker(infoUnpacker);
+
        if (!pHexMergeDoc->OpenDocs(nFiles, fileloc, GetROFromFlags(nFiles, dwFlags).data(), strDesc))
                return false;
 
@@ -840,7 +862,7 @@ bool CMainFrame::ShowImgMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocati
        if (!CImgMergeFrame::menu.m_hMenu)
                CImgMergeFrame::menu.m_hMenu = NewImgMergeViewMenu();
        pImgMergeFrame->SetSharedMenu(CImgMergeFrame::menu.m_hMenu);
-
+       pImgMergeFrame->SetUnpacker(infoUnpacker);
        pImgMergeFrame->SetDirDoc(pDirDoc);
        pDirDoc->AddMergeDoc(pImgMergeFrame);
                
@@ -890,7 +912,7 @@ bool CMainFrame::ShowTextMergeDoc(CDirDoc* pDirDoc, int nBuffers, const String t
 void CMainFrame::OnHelpGnulicense() 
 {
        const String spath = paths::ConcatPath(env::GetProgPath(), LicenseFile);
-       theApp.OpenFileOrUrl(spath.c_str(), LicenceUrl);
+       shell::OpenFileOrUrl(spath.c_str(), LicenceUrl);
 }
 
 /**
@@ -1631,7 +1653,7 @@ void CMainFrame::OnSaveConfigData()
        if (configLog.WriteLogFile(sError))
        {
                String sFileName = configLog.GetFileName();
-               theApp.OpenFileToExternalEditor(sFileName);
+               CMergeApp::OpenFileToExternalEditor(sFileName);
        }
        else
        {
@@ -1960,15 +1982,8 @@ LRESULT CMainFrame::OnCopyData(WPARAM wParam, LPARAM lParam)
 
 LRESULT CMainFrame::OnUser1(WPARAM wParam, LPARAM lParam)
 {
-       CFrameWnd * pFrame = GetActiveFrame();
-       if (pFrame != nullptr)
-       {
-               IMergeDoc *pMergeDoc = dynamic_cast<IMergeDoc *>(pFrame->GetActiveDocument());
-               if (pMergeDoc == nullptr)
-                       pMergeDoc = dynamic_cast<IMergeDoc *>(pFrame);
-               if (pMergeDoc != nullptr)
-                       pMergeDoc->CheckFileChanged();
-       }
+       if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
+               pMergeDoc->CheckFileChanged();
        return 0;
 }
 
@@ -2089,15 +2104,8 @@ void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
        CMDIFrameWnd::OnActivateApp(bActive, hTask);
 #endif
 
-       CFrameWnd * pFrame = GetActiveFrame();
-       if (pFrame != nullptr)
-       {
-               IMergeDoc *pMergeDoc = dynamic_cast<IMergeDoc *>(pFrame->GetActiveDocument());
-               if (pMergeDoc == nullptr)
-                       pMergeDoc = dynamic_cast<IMergeDoc *>(pFrame);
-               if (pMergeDoc != nullptr)
-                       PostMessage(WM_USER+1);
-       }
+       if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
+               PostMessage(WM_USER+1);
 }
 
 BOOL CMainFrame::CreateToolbar()
@@ -2126,7 +2134,7 @@ BOOL CMainFrame::CreateToolbar()
        LoadToolbarImages();
 
        UINT nID, nStyle;
-       for (auto cmd : { ID_OPTIONS, ID_FILE_NEW, ID_FILE_OPEN })
+       for (auto cmd : { ID_OPTIONS, ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVE })
        {
                int iImage;
                int index = m_wndToolBar.GetToolBarCtrl().CommandToIndex(cmd);
@@ -2316,7 +2324,7 @@ bool CMainFrame::AskCloseConfirmation()
 void CMainFrame::OnHelpReleasenotes()
 {
        const String sPath = paths::ConcatPath(env::GetProgPath(), RelNotes);
-       ShellExecute(nullptr, _T("open"), sPath.c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+       shell::Open(sPath.c_str());
 }
 
 /**
@@ -2325,7 +2333,7 @@ void CMainFrame::OnHelpReleasenotes()
  */
 void CMainFrame::OnHelpTranslations()
 {
-       ShellExecute(nullptr, _T("open"), TranslationsUrl, nullptr, nullptr, SW_SHOWNORMAL);
+       shell::Open(TranslationsUrl);
 }
 
 /**
@@ -2441,7 +2449,7 @@ bool CMainFrame::DoSelfCompare(UINT nID, const String& file, const String strDes
  * @param [in] pFrame Pointer to frame to check.
  * @return FRAMETYPE of the given frame.
 */
-CMainFrame::FRAMETYPE CMainFrame::GetFrameType(const CFrameWnd * pFrame) const
+CMainFrame::FRAMETYPE CMainFrame::GetFrameType(const CFrameWnd * pFrame)
 {
        bool bMergeFrame = !!pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame));
        bool bHexMergeFrame = !!pFrame->IsKindOf(RUNTIME_CLASS(CHexMergeFrame));
@@ -2483,6 +2491,9 @@ void CMainFrame::OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult)
        case ID_FILE_OPEN:
                id = IDR_POPUP_OPEN;
                break;
+       case ID_FILE_SAVE:
+               id = IDR_POPUP_SAVE;
+               break;
        default:
                id = IDR_POPUP_DIFF_OPTIONS;
                break;
@@ -2625,6 +2636,94 @@ void CMainFrame::OnUpdatePluginName(CCmdUI* pCmdUI)
        pCmdUI->SetText(_T(""));
 }
 
+/**
+ * @brief Move to next file
+ */
+void CMainFrame::OnNextFile()
+{
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       pDirDoc->MoveToNextFile(pMergeDoc);
+}
+
+/**
+ * @brief Called when Move to next file is updated
+ */
+void CMainFrame::OnUpdateNextFile(CCmdUI* pCmdUI)
+{
+       bool enabled = false;
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       enabled = !pDirDoc->IsLastFile();
+       pCmdUI->Enable(enabled);
+}
+
+/**
+ * @brief Move to previous file
+ */
+void CMainFrame::OnPrevFile()
+{
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       pDirDoc->MoveToPrevFile(pMergeDoc);
+}
+
+/**
+ * @brief Called when Move to previous file is updated
+ */
+void CMainFrame::OnUpdatePrevFile(CCmdUI* pCmdUI)
+{
+       bool enabled = false;
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       enabled = !pDirDoc->IsFirstFile();
+       pCmdUI->Enable(enabled);
+}
+
+/**
+ * @brief Move to first file
+ */
+void CMainFrame::OnFirstFile()
+{
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       pDirDoc->MoveToFirstFile(pMergeDoc);
+}
+
+/**
+ * @brief Called when Move to first file is updated
+ */
+void CMainFrame::OnUpdateFirstFile(CCmdUI* pCmdUI)
+{
+       bool enabled = false;
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       enabled = !pDirDoc->IsFirstFile();
+       pCmdUI->Enable(enabled);
+}
+
+/**
+ * @brief Move to last file
+ */
+void CMainFrame::OnLastFile()
+{
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       pDirDoc->MoveToLastFile(pMergeDoc);
+}
+
+/**
+ * @brief Called when Move to last file item is updated
+ */
+void CMainFrame::OnUpdateLastFile(CCmdUI* pCmdUI)
+{
+       bool enabled = false;
+       if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+               if (CDirDoc* pDirDoc = pMergeDoc->GetDirDoc())
+                       enabled = !pDirDoc->IsLastFile();
+       pCmdUI->Enable(enabled);
+}
+
 void CMainFrame::ReloadMenu()
 {
        // set the menu of the main frame window
@@ -2698,6 +2797,17 @@ void CMainFrame::ReloadMenu()
        }
 }
 
+IMergeDoc* CMainFrame::GetActiveIMergeDoc()
+{
+       CFrameWnd* pFrame = GetActiveFrame();
+       if (!pFrame)
+               return nullptr;
+       IMergeDoc* pMergeDoc = dynamic_cast<IMergeDoc*>(pFrame->GetActiveDocument());
+       if (!pMergeDoc)
+               pMergeDoc = dynamic_cast<IMergeDoc *>(pFrame);
+       return pMergeDoc;
+}
+
 void CMainFrame::UpdateDocTitle()
 {
        CDocManager* pDocManager = AfxGetApp()->m_pDocManager;