/////////////////////////////////////////////////////////////////////////////
// WinMerge: an interactive diff/merge utility
// Copyright (C) 1997 Dean P. Grimm
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
+// SPDX-License-Identifier: GPL-2.0-or-later
/////////////////////////////////////////////////////////////////////////////
/**
* @file MainFrm.h
#include <vector>
#include <memory>
+#include <optional>
#include "MDITabBar.h"
#include "PathContext.h"
+#include "OptionsDef.h"
+#include "OptionsMgr.h"
class BCMenu;
-class CDiffView;
class CDirView;
class COpenDoc;
class CDirDoc;
class TempFile;
struct FileLocation;
class DropHandler;
+class CMainFrame;
+class CImgMergeFrame;
typedef std::shared_ptr<TempFile> TempFilePtr;
class PackingInfo;
class CLanguageSelect;
+struct IMergeDoc;
+
+CMainFrame * GetMainFrame(); // access to the singleton main frame object
/**
* @brief Frame class containing save-routines etc
FRAME_OTHER, /**< No frame? */
};
- enum { WM_NONINTERACTIVE = 888 }; // timer value
-
CMainFrame();
// Attributes
public:
- BOOL m_bShowErrors; /**< Show folder compare error items? */
+ bool m_bShowErrors; /**< Show folder compare error items? */
LOGFONT m_lfDiff; /**< MergeView user-selected font */
LOGFONT m_lfDir; /**< DirView user-selected font */
static const TCHAR szClassName[];
+
// Operations
public:
HMENU NewDirViewMenu();
HMENU GetPrediffersSubmenu(HMENU mainMenu);
void UpdatePrediffersMenu();
- BOOL DoFileOpen(const PathContext *pFiles = NULL,
- const DWORD dwFlags[] = NULL, bool bRecurse = false, CDirDoc *pDirDoc = NULL, String prediffer = _T(""), const PackingInfo * infoUnpacker = NULL);
- int ShowAutoMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
- const DWORD dwFlags[], const PackingInfo * infoUnpacker = NULL);
- int ShowMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
- const DWORD dwFlags[], const PackingInfo * infoUnpacker = NULL);
- void ShowHexMergeDoc(CDirDoc * pDirDoc,
- const PathContext &paths, const bool bRO[]);
- int ShowImgMergeDoc(CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
- const DWORD dwFlags[], const PackingInfo * infoUnpacker = NULL);
+ 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(UINT nID, CDirDoc * pDirDoc, int nFiles, const FileLocation fileloc[],
+ const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
+ 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[],
+ const DWORD dwFlags[], const String strDesc[], const String& sReportFile = _T(""), const PackingInfo * infoUnpacker = nullptr);
void UpdateResources();
- CString SetStatus(LPCTSTR status);
void ClearStatusbarItemCount();
void ApplyDiffOptions();
- void ApplyViewWhitespace();
- void SetEOLMixed(BOOL bAllow);
void SelectFilter();
void StartFlashing();
bool AskCloseConfirmation();
- BOOL DoOpenConflict(const String& conflictFile, bool checked = false);
- FRAMETYPE GetFrameType(const CFrameWnd * pFrame) const;
- void UpdateDocTitle();
- void ReloadMenu();
+ bool DoOpenConflict(const String& conflictFile, const String strDesc[] = nullptr, bool checked = false);
+ bool DoSelfCompare(UINT nID, const String& file, const String strDesc[] = nullptr);
+ static FRAMETYPE GetFrameType(const CFrameWnd * pFrame);
+ static void UpdateDocTitle();
+ static void ReloadMenu();
+ DropHandler *GetDropHandler() const { return m_pDropHandler; }
+ const CTypedPtrArray<CPtrArray, CMDIChildWnd*>* GetChildArray() const { return &m_arrChild; }
+ IMergeDoc* GetActiveIMergeDoc();
// Overrides
virtual void GetMessageString(UINT nID, CString& rMessage) const;
// Public implementation data
public:
- BOOL m_bFirstTime; /**< If first time frame activated, get pos from reg */
- BOOL m_bFlashing; /**< Window is flashing. */
-
- /** @brief Possible toolbar image sizes. */
- enum TOOLBAR_SIZE
- {
- TOOLBAR_SIZE_16x16,
- TOOLBAR_SIZE_32x32,
- };
+ bool m_bFirstTime; /**< If first time frame activated, get pos from reg */
// Implementation data
protected:
-
-
// control bar embedded members
CStatusBar m_wndStatusBar;
CReBar m_wndReBar;
CToolBar m_wndToolBar;
CMDITabBar m_wndTabBar;
+ CTypedPtrArray<CPtrArray, CMDIChildWnd*> m_arrChild;
+
+ // Tweak MDI client window behavior
+ class CMDIClient : public CWnd
+ {
+ static UINT_PTR const m_nRedrawTimer = 1612;
+ virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
+ {
+ switch (message)
+ {
+ case WM_MDICREATE:
+ case WM_MDIACTIVATE:
+ {
+ // To reduce flicker in maximized state, disable drawing while messing with MDI child frames
+ BOOL bMaximized;
+ HWND hwndActive = reinterpret_cast<HWND>(SendMessage(WM_MDIGETACTIVE, 0, reinterpret_cast<LPARAM>(&bMaximized)));
+ if ((bMaximized || (message == WM_MDICREATE && !hwndActive)) &&
+ SetTimer(m_nRedrawTimer, USER_TIMER_MINIMUM, nullptr))
+ {
+ SetRedraw(FALSE);
+ }
+ break;
+ }
+ case WM_TIMER:
+ if (wParam == m_nRedrawTimer)
+ {
+ KillTimer(m_nRedrawTimer);
+ SetRedraw(TRUE);
+ RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE);
+ }
+ break;
+ }
+ return CWnd::WindowProc(message, wParam, lParam);
+ }
+ } m_wndMDIClient;
/** @brief Toolbar image table indexes. */
enum TOOLBAR_IMAGES
static const MENUITEM_ICON m_MenuIcons[];
std::unique_ptr<BCMenu> m_pMenus[MENU_COUNT]; /**< Menus for different views */
+ std::unique_ptr<BCMenu> m_pImageMenu;
std::vector<TempFilePtr> m_tempFiles; /**< List of possibly needed temp files. */
DropHandler *m_pDropHandler;
// Generated message map functions
protected:
- virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//{{AFX_MSG(CMainFrame)
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
afx_msg LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) ;
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
- afx_msg void OnOptionsShowDifferent();
- afx_msg void OnOptionsShowIdentical();
- afx_msg void OnOptionsShowUniqueLeft();
- afx_msg void OnOptionsShowUniqueRight();
- afx_msg void OnOptionsShowBinaries();
- afx_msg void OnOptionsShowSkipped();
- afx_msg void OnUpdateOptionsShowdifferent(CCmdUI* pCmdUI);
- afx_msg void OnUpdateOptionsShowidentical(CCmdUI* pCmdUI);
- afx_msg void OnUpdateOptionsShowuniqueleft(CCmdUI* pCmdUI);
- afx_msg void OnUpdateOptionsShowuniqueright(CCmdUI* pCmdUI);
- afx_msg void OnUpdateOptionsShowBinaries(CCmdUI* pCmdUI);
- afx_msg void OnUpdateOptionsShowSkipped(CCmdUI* pCmdUI);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnFileOpen();
afx_msg void OnHelpGnulicense();
afx_msg void OnOptions();
afx_msg void OnViewSelectfont();
- afx_msg void OnUpdateViewSelectfont(CCmdUI* pCmdUI);
afx_msg void OnViewUsedefaultfont();
- afx_msg void OnUpdateViewUsedefaultfont(CCmdUI* pCmdUI);
afx_msg void OnHelpContents();
- afx_msg void OnUpdateHelpContents(CCmdUI* pCmdUI);
afx_msg void OnClose();
- afx_msg void OnViewWhitespace();
- afx_msg void OnUpdateViewWhitespace(CCmdUI* pCmdUI);
afx_msg void OnToolsGeneratePatch();
afx_msg void OnDropFiles(const std::vector<String>& files);
- afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnUpdatePluginUnpackMode(CCmdUI* pCmdUI);
afx_msg void OnPluginUnpackMode(UINT nID);
afx_msg void OnUpdatePluginPrediffMode(CCmdUI* pCmdUI);
afx_msg void OnUpdateReloadPlugins(CCmdUI* pCmdUI);
afx_msg void OnReloadPlugins();
afx_msg void OnSaveConfigData();
+ template <int nFiles, FRAMETYPE frameType, bool table = false>
afx_msg void OnFileNew();
- afx_msg void OnFileNew3();
afx_msg void OnToolsFilters();
- afx_msg void OnHelpMerge7zmismatch();
- afx_msg void OnUpdateHelpMerge7zmismatch(CCmdUI* pCmdUI);
afx_msg void OnViewStatusBar();
- afx_msg void OnViewToolbar();
afx_msg void OnUpdateViewTabBar(CCmdUI* pCmdUI);
afx_msg void OnViewTabBar();
afx_msg void OnUpdateResizePanes(CCmdUI* pCmdUI);
afx_msg void OnResizePanes();
- afx_msg void OnFileOpenproject();
+ afx_msg void OnFileOpenProject();
afx_msg LRESULT OnCopyData(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnUser1(WPARAM wParam, LPARAM lParam);
- afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnWindowCloseAll();
afx_msg void OnUpdateWindowCloseAll(CCmdUI* pCmdUI);
afx_msg void OnSaveProject();
- afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
#if _MFC_VER > 0x0600
afx_msg void OnActivateApp(BOOL bActive, DWORD dwThreadID);
#else
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
#endif
- afx_msg void OnToolbarNone();
- afx_msg void OnUpdateToolbarNone(CCmdUI* pCmdUI);
- afx_msg void OnToolbarSmall();
- afx_msg void OnUpdateToolbarSmall(CCmdUI* pCmdUI);
- afx_msg void OnToolbarBig();
- afx_msg void OnUpdateToolbarBig(CCmdUI* pCmdUI);
+ afx_msg void OnToolbarSize(UINT id);
+ afx_msg void OnUpdateToolbarSize(CCmdUI* pCmdUI);
afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnHelpReleasenotes();
afx_msg void OnHelpTranslations();
afx_msg void OnFileOpenConflict();
afx_msg void OnPluginsList();
afx_msg void OnUpdatePluginName(CCmdUI* pCmdUI);
- afx_msg void OnDiffOptionsDropDown(NMHDR* pNMHDR, LRESULT* pResult);
- afx_msg void OnUpdateDiffOptions(CCmdUI* pCmdUI);
+ afx_msg void OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDiffWhitespace(UINT nID);
afx_msg void OnUpdateDiffWhitespace(CCmdUI* pCmdUI);
- afx_msg void OnDiffCaseSensitive();
- afx_msg void OnUpdateDiffCaseSensitive(CCmdUI* pCmdUI);
+ afx_msg void OnDiffIgnoreCase();
+ afx_msg void OnUpdateDiffIgnoreCase(CCmdUI* pCmdUI);
afx_msg void OnDiffIgnoreEOL();
afx_msg void OnUpdateDiffIgnoreEOL(CCmdUI* pCmdUI);
+ afx_msg void OnDiffIgnoreCP();
+ afx_msg void OnUpdateDiffIgnoreCP(CCmdUI* pCmdUI);
+ afx_msg void OnIncludeSubfolders();
+ afx_msg void OnUpdateIncludeSubfolders(CCmdUI* pCmdUI);
afx_msg void OnCompareMethod(UINT nID);
afx_msg void OnUpdateCompareMethod(CCmdUI* pCmdUI);
afx_msg void OnMRUs(UINT nID);
afx_msg void OnUpdateNoMRUs(CCmdUI* pCmdUI);
+ afx_msg void OnFirstFile();
+ afx_msg void OnUpdateFirstFile(CCmdUI* pCmdUI);
+ afx_msg void OnPrevFile();
+ afx_msg void OnUpdatePrevFile(CCmdUI* pCmdUI);
+ afx_msg void OnNextFile();
+ afx_msg void OnUpdateNextFile(CCmdUI* pCmdUI);
+ afx_msg void OnLastFile();
+ afx_msg void OnUpdateLastFile(CCmdUI* pCmdUI);
+ afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnDestroy();
+ afx_msg void OnAccelQuit();
+ afx_msg LRESULT OnChildFrameAdded(WPARAM wParam, LPARAM lParam);
+ afx_msg LRESULT OnChildFrameRemoved(WPARAM wParam, LPARAM lParam);
+ afx_msg LRESULT OnChildFrameActivate(WPARAM wParam, LPARAM lParam);
+ afx_msg LRESULT OnChildFrameActivated(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void addToMru(LPCTSTR szItem, LPCTSTR szRegSubKey, UINT nMaxItems = 20);
- void FileNew(int nPanes);
- const OpenDocList &GetAllOpenDocs();
- const MergeDocList &GetAllMergeDocs();
- const DirDocList &GetAllDirDocs();
- const HexMergeDocList &GetAllHexMergeDocs();
- void RedisplayAllDirDocs();
- CMergeDoc * GetMergeDocToShow(int nFiles, CDirDoc * pDirDoc);
- CHexMergeDoc * GetHexMergeDocToShow(int nDirs, CDirDoc * pDirDoc);
- CDirDoc * GetDirDocToShow(int nDirs, BOOL * pNew);
+ OpenDocList &GetAllOpenDocs();
+ MergeDocList &GetAllMergeDocs();
+ DirDocList &GetAllDirDocs();
+ HexMergeDocList &GetAllHexMergeDocs();
+ std::list<CImgMergeFrame *> GetAllImgMergeFrames();
void UpdateFont(FRAMETYPE frame);
BOOL CreateToolbar();
- BOOL CreateComboBoxOnToolbar();
CMergeEditView * GetActiveMergeEditView();
void LoadToolbarImages();
HMENU NewMenu( int view, int ID );
};
-
-CMainFrame * GetMainFrame(); // access to the singleton main frame object
-
-/////////////////////////////////////////////////////////////////////////////
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Developer Studio will insert additional declarations immediately before the previous line.