OSDN Git Service

ImgMergeFrm.*: Implement "Reload" menu item
authorsdottaka <sdottaka@sourceforge.net>
Fri, 26 Sep 2014 04:37:00 +0000 (13:37 +0900)
committersdottaka <sdottaka@sourceforge.net>
Fri, 26 Sep 2014 04:37:00 +0000 (13:37 +0900)
--HG--
branch : stable

Src/ImgMergeFrm.cpp
Src/ImgMergeFrm.h
Src/MainFrm.cpp

index 1509cc5..531ddca 100644 (file)
@@ -81,6 +81,7 @@ BEGIN_MESSAGE_MAP(CImgMergeFrame, CMDIChildWnd)
        ON_UPDATE_COMMAND_UI(ID_FILE_MIDDLE_READONLY, OnUpdateMiddleReadOnly)
        ON_COMMAND(ID_FILE_RIGHT_READONLY, OnRightReadOnly)
        ON_UPDATE_COMMAND_UI(ID_FILE_RIGHT_READONLY, OnUpdateRightReadOnly)
+       ON_COMMAND(ID_RESCAN, OnFileReload)
        ON_COMMAND(ID_MERGE_COMPARE_HEX, OnFileRecompareAsBinary)
        ON_COMMAND(ID_WINDOW_CHANGE_PANE, OnWindowChangePane)
        ON_MESSAGE_VOID(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
@@ -210,7 +211,6 @@ bool CImgMergeFrame::OpenImages(const PathContext& paths, const bool bRO[], int
        return true;
 }
 
-
 bool CImgMergeFrame::IsModified() const
 {
        for (int pane = 0; pane < m_pImgMergeWindow->GetPaneCount(); ++pane)
@@ -244,6 +244,36 @@ void CImgMergeFrame::SetDirDoc(CDirDoc * pDirDoc)
        m_pDirDoc = pDirDoc;
 }
 
+bool CImgMergeFrame::IsFileChangedOnDisk(int pane) const
+{
+       DiffFileInfo dfi;
+       dfi.Update(m_filePaths[pane]);
+       int tolerance = 0;
+       if (GetOptionsMgr()->GetBool(OPT_IGNORE_SMALL_FILETIME))
+               tolerance = SmallTimeDiff; // From MainFrm.h
+       Poco::Int64 timeDiff = dfi.mtime - m_fileInfo[pane].mtime;
+       if (timeDiff < 0) timeDiff = -timeDiff;
+       if ((timeDiff > tolerance * Poco::Timestamp::resolution()) || (dfi.size != m_fileInfo[pane].size))
+               return true;
+       return false;
+}
+
+void CImgMergeFrame::CheckFileChanged(void)
+{
+       for (int pane = 0; pane < m_pImgMergeWindow->GetPaneCount(); ++pane)
+       {
+               if (IsFileChangedOnDisk(pane))
+               {
+                       String msg = LangFormatString1(IDS_FILECHANGED_RESCAN, m_filePaths[pane].c_str());
+                       if (AfxMessageBox(msg.c_str(), MB_YESNO | MB_ICONWARNING) == IDYES)
+                       {
+                               OnFileReload();
+                       }
+                       break;
+               }
+       }
+}
+
 BOOL CImgMergeFrame::PreCreateWindow(CREATESTRUCT& cs)
 {
        CMDIChildWnd::PreCreateWindow(cs);
@@ -311,6 +341,9 @@ BOOL CImgMergeFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
        else
                bResult = m_pImgMergeWindow->OpenImages(ucr::toUTF16(m_filePaths[0]).c_str(), ucr::toUTF16(m_filePaths[1]).c_str(), ucr::toUTF16(m_filePaths[2]).c_str());
 
+       for (int pane = 0; pane < m_filePaths.GetSize(); ++pane)
+               m_fileInfo[pane].Update(m_filePaths[pane]);
+
        // Merge frame has a header bar at top
        if (!m_wndFilePathBar.Create(this))
        {
@@ -436,6 +469,13 @@ void CImgMergeFrame::SavePosition()
        theApp.WriteProfileInt(_T("Settings"), _T("ActivePane"), m_pImgMergeWindow->GetActivePane());
 }
 
+void CImgMergeFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
+{
+       CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
+       if (bActivate)
+               GetMainFrame()->PostMessage(WM_USER + 1);
+}
+
 void CImgMergeFrame::OnClose() 
 {
        // Allow user to cancel closing
@@ -583,6 +623,18 @@ void CImgMergeFrame::OnFileSaveAsRight()
        DoFileSaveAs(m_pImgMergeWindow->GetPaneCount() - 1);
 }
 
+/**
+ * @brief Reloads the opened files
+ */
+void CImgMergeFrame::OnFileReload()
+{
+       if (!PromptAndSaveIfNeeded(true))
+               return;
+       m_pImgMergeWindow->ReloadImages();
+       for (int pane = 0; pane < m_filePaths.GetSize(); ++pane)
+               m_fileInfo[pane].Update(m_filePaths[pane]);
+}
+
 void CImgMergeFrame::OnFileClose() 
 {
        OnClose();
index 6576507..b29881e 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "EditorFilepathBar.h"
 #include "PathContext.h"
+#include "DiffFileInfo.h"
 #include "../Externals/winimerge/src/WinIMergeLib.h"
 
 class CDirDoc;
@@ -66,6 +67,8 @@ public:
        bool GenerateReport(LPCTSTR szFileName);
        void DoAutoMerge(int dstPane);
        bool IsModified() const;
+       bool IsFileChangedOnDisk(int pane) const;
+       void CheckFileChanged(void);
 
 // Attributes
 protected:
@@ -110,11 +113,13 @@ private:
        PathContext m_filePaths;
        String m_strDesc[3];
        BUFFERTYPE m_nBufferType[3];
+       DiffFileInfo m_fileInfo[3];
        bool m_bRO[3];
        bool m_bAutoMerged;
        CDirDoc *m_pDirDoc;
 
        //{{AFX_MSG(CImgMergeFrame)
+       afx_msg void OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd);
        afx_msg void OnClose();
        afx_msg void OnFileSave();
        afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
@@ -132,6 +137,7 @@ private:
        afx_msg void OnUpdateMiddleReadOnly(CCmdUI* pCmdUI);
        afx_msg void OnRightReadOnly();
        afx_msg void OnUpdateRightReadOnly(CCmdUI* pCmdUI);
+       afx_msg void OnFileReload();
        afx_msg void OnFileClose();
        afx_msg void OnFileRecompareAsBinary();
        afx_msg void OnWindowChangePane();
index df3dbcc..13829ea 100644 (file)
@@ -2283,11 +2283,19 @@ LRESULT CMainFrame::OnCopyData(WPARAM wParam, LPARAM lParam)
 LRESULT CMainFrame::OnUser1(WPARAM wParam, LPARAM lParam)
 {
        CFrameWnd * pFrame = GetActiveFrame();
-       if (pFrame && pFrame->IsKindOf(RUNTIME_CLASS(CChildFrame)))
+       if (pFrame)
        {
-               CMergeDoc * pMergeDoc = (CMergeDoc *) pFrame->GetActiveDocument();
-               if (pMergeDoc)
-                       pMergeDoc->CheckFileChanged();
+               if (pFrame->IsKindOf(RUNTIME_CLASS(CChildFrame)))
+               {
+                       CMergeDoc * pMergeDoc = (CMergeDoc *) pFrame->GetActiveDocument();
+                       if (pMergeDoc)
+                               pMergeDoc->CheckFileChanged();
+               }
+               else if (pFrame->IsKindOf(RUNTIME_CLASS(CImgMergeFrame)))
+               {
+                       CImgMergeFrame *pImgMergeFrame = static_cast<CImgMergeFrame *>(pFrame);
+                       pImgMergeFrame->CheckFileChanged();
+               }
        }
        return 0;
 }
@@ -2477,11 +2485,21 @@ void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
 #endif
 
        CFrameWnd * pFrame = GetActiveFrame();
-       if (pFrame && pFrame->IsKindOf(RUNTIME_CLASS(CChildFrame)))
+       if (pFrame)
        {
-               CMergeDoc * pMergeDoc = (CMergeDoc *) pFrame->GetActiveDocument();
-               if (pMergeDoc)
+               switch (GetFrameType(pFrame))
+               {
+               case FRAME_FILE:
+               {
+                       CMergeDoc * pMergeDoc = (CMergeDoc *) pFrame->GetActiveDocument();
+                       if (pMergeDoc)
+                               PostMessage(WM_USER+1);
+                       break;
+               }
+               case FRAME_IMGFILE:
                        PostMessage(WM_USER+1);
+                       break;
+               }
        }
 }