OSDN Git Service

Binary Compare: Fix the problem that the file cannot be saved after creating a new one
[winmerge-jp/winmerge-jp.git] / Src / HexMergeDoc.cpp
index 56af264..824a81e 100644 (file)
@@ -230,15 +230,9 @@ bool CHexMergeDoc::PromptAndSaveIfNeeded(bool bAllowCancel)
                {
                        if (dlg.m_leftSave == SaveClosingDlg::SAVECLOSING_SAVE)
                        {
-                               switch (Try(m_pView[0]->SaveFile(pathLeft.c_str())))
-                               {
-                               case 0:
-                                       bLSaveSuccess = true;
-                                       break;
-                               case IDCANCEL:
+                               bLSaveSuccess = DoFileSave(0);
+                               if (!bLSaveSuccess)
                                        result = false;
-                                       break;
-                               }
                        }
                        else
                        {
@@ -249,15 +243,9 @@ bool CHexMergeDoc::PromptAndSaveIfNeeded(bool bAllowCancel)
                {
                        if (dlg.m_middleSave == SaveClosingDlg::SAVECLOSING_SAVE)
                        {
-                               switch (Try(m_pView[1]->SaveFile(pathMiddle.c_str())))
-                               {
-                               case 0:
-                                       bMSaveSuccess = true;
-                                       break;
-                               case IDCANCEL:
+                               bMSaveSuccess = DoFileSave(1);
+                               if (!bMSaveSuccess)
                                        result = false;
-                                       break;
-                               }
                        }
                        else
                        {
@@ -268,15 +256,9 @@ bool CHexMergeDoc::PromptAndSaveIfNeeded(bool bAllowCancel)
                {
                        if (dlg.m_rightSave == SaveClosingDlg::SAVECLOSING_SAVE)
                        {
-                               switch (Try(m_pView[m_nBuffers - 1]->SaveFile(pathRight.c_str())))
-                               {
-                               case 0:
-                                       bRSaveSuccess = true;
-                                       break;
-                               case IDCANCEL:
+                               bRSaveSuccess = DoFileSave(m_nBuffers - 1);
+                               if (!bRSaveSuccess)
                                        result = false;
-                                       break;
-                               }
                        }
                        else
                        {
@@ -316,23 +298,30 @@ void CHexMergeDoc::OnFileSave()
                DoFileSave(nBuffer);
 }
 
-void CHexMergeDoc::DoFileSave(int nBuffer)
+bool CHexMergeDoc::DoFileSave(int nBuffer)
 {
+       bool result = false;
        if (m_pView[nBuffer]->GetModified())
        {
                if (m_nBufferType[nBuffer] == BUFFERTYPE::UNNAMED)
-                       DoFileSaveAs(nBuffer);
+                       result = DoFileSaveAs(nBuffer);
                else
                {
                        const String &path = m_filePaths.GetPath(nBuffer);
-                       if (Try(m_pView[nBuffer]->SaveFile(path.c_str())) == IDCANCEL)
-                               return;
+                       HRESULT hr = m_pView[nBuffer]->SaveFile(path.c_str());
+                       if (Try(hr) == IDCANCEL)
+                               return false;
+                       if (FAILED(hr))
+                               return DoFileSaveAs(nBuffer);
+                       result = true;
+                       if (result)
+                               UpdateDiffItem(m_pDirDoc);
                }
-               UpdateDiffItem(m_pDirDoc);
        }
+       return result;
 }
 
-void CHexMergeDoc::DoFileSaveAs(int nBuffer)
+bool CHexMergeDoc::DoFileSaveAs(int nBuffer, bool packing)
 {
        const String &path = m_filePaths.GetPath(nBuffer);
        String strPath;
@@ -345,8 +334,11 @@ void CHexMergeDoc::DoFileSaveAs(int nBuffer)
                title = _("Save Middle File As");
        if (SelectFile(AfxGetMainWnd()->GetSafeHwnd(), strPath, false, path.c_str(), title))
        {
-               if (Try(m_pView[nBuffer]->SaveFile(strPath.c_str())) == IDCANCEL)
-                       return;
+               HRESULT hr = m_pView[nBuffer]->SaveFile(strPath.c_str());
+               if (Try(hr) == IDCANCEL)
+                       return false;
+               if (FAILED(hr))
+                       return false;
                if (path.empty())
                {
                        // We are saving scratchpad (unnamed file)
@@ -357,7 +349,9 @@ void CHexMergeDoc::DoFileSaveAs(int nBuffer)
                m_filePaths.SetPath(nBuffer, strPath);
                UpdateDiffItem(m_pDirDoc);
                UpdateHeaderPath(nBuffer);
+               return true;
        }
+       return false;
 }
 
 /**