1 /////////////////////////////////////////////////////////////////////////////
2 // WinMerge: an interactive diff/merge utility
3 // Copyright (C) 1997 Dean P. Grimm
4 // SPDX-License-Identifier: GPL-2.0-or-later
5 /////////////////////////////////////////////////////////////////////////////
9 * @brief interface of the CImgMergeFrame class
14 #include "EditorFilepathBar.h"
15 #include "PathContext.h"
16 #include "DiffFileInfo.h"
17 #include "IMergeDoc.h"
18 #include "WinIMergeLib.h"
19 #include "LocationBar.h"
20 #include "FileLocation.h"
21 #include "MergeFrameCommon.h"
22 #include "FileTransform.h"
27 * @brief Frame class for file compare, handles panes, statusbar etc.
29 class CImgMergeFrame : public CMergeFrameCommon,public IMergeDoc
34 NORMAL = 0, /**< Normal, file loaded from disk */
35 NORMAL_NAMED, /**< Normal, description given */
36 UNNAMED, /**< Empty, created buffer */
37 UNNAMED_SAVED, /**< Empty buffer saved with filename */
40 using CMDIChildWnd::Create;
42 DECLARE_DYNCREATE(CImgMergeFrame)
49 bool OpenDocs(int nFiles, const FileLocation fileloc[], const bool bRO[], const String strDesc[], CMDIFrameWnd *pParent);
50 void MoveOnLoad(int nPane = -1, int nLineIndex = -1);
51 void ChangeFile(int pane, const String& path);
52 CDirDoc* GetDirDoc() const override { return m_pDirDoc; };
53 void SetDirDoc(CDirDoc * pDirDoc) override;
54 void UpdateResources();
55 void RefreshOptions();
56 bool CloseNow() override;
57 void DirDocClosing(CDirDoc * pDirDoc) override { m_pDirDoc = nullptr; }
58 void UpdateLastCompareResult();
59 void UpdateAutoPaneResize();
60 void UpdateSplitter();
61 bool GenerateReport(const String& sFileName) const override;
62 bool GenerateReport(const String& sFileName, bool allPages) const;
63 const PackingInfo* GetUnpacker() const override { return &m_infoUnpacker; };
64 void SetUnpacker(const PackingInfo* infoUnpacker) override { if (infoUnpacker) m_infoUnpacker = *infoUnpacker; };
65 const PrediffingInfo* GetPrediffer() const override { return nullptr; };
66 int GetFileCount() const override { return m_filePaths.GetSize(); }
67 String GetPath(int pane) const override { return m_filePaths[pane]; }
68 bool GetReadOnly(int pane) const override { return m_bRO[pane]; }
69 CString GetTooltipString() const override;
70 void DoAutoMerge(int dstPane);
71 bool IsModified() const;
72 IMergeDoc::FileChange IsFileChangedOnDisk(int pane) const;
73 void CheckFileChanged(void) override;
74 String GetDescription(int pane) const override { return m_strDesc[pane]; }
75 static bool IsLoadable();
79 CEditorFilePathBar m_wndFilePathBar;
80 CStatusBar m_wndStatusBar[3];
83 // ClassWizard generated virtual function overrides
84 //{{AFX_VIRTUAL(CImgMergeFrame)
86 virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
87 virtual BOOL DestroyWindow();
88 virtual BOOL PreTranslateMessage(MSG *);
96 bool EnsureValidDockState(CDockState& state);
100 void SaveActivePane();
101 virtual ~CImgMergeFrame();
102 void CreateImgWndStatusBar(CStatusBar &, CWnd *);
105 int UpdateDiffItem(CDirDoc * pDirDoc);
106 void UpdateHeaderSizes();
107 void UpdateHeaderPath(int pane);
108 void SetTitle(LPCTSTR lpszTitle);
109 bool DoFileSave(int pane);
110 bool DoFileSaveAs(int pane, bool packing = true);
111 bool PromptAndSaveIfNeeded(bool bAllowCancel);
112 bool MergeModeKeyDown(MSG* pMsg);
113 static void OnChildPaneEvent(const IImgMergeWindow::Event& evt);
114 void OnDropFiles(int pane, const std::vector<String>& files);
115 static void TranslateLocationPane(int id, const wchar_t *org, size_t dstbufsize, wchar_t *dst);
116 CLocationBar m_wndLocationBar;
117 IImgMergeWindow *m_pImgMergeWindow;
118 IImgToolWindow *m_pImgToolWindow;
119 PathContext m_filePaths;
121 BUFFERTYPE m_nBufferType[3];
122 DiffFileInfo m_fileInfo[3];
127 PackingInfo m_infoUnpacker;
128 std::vector<int> m_unpackerSubcodes[3];
129 // Generated message map functions
131 //{{AFX_MSG(CImgMergeFrame)
132 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
133 afx_msg void OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd);
134 afx_msg void OnClose();
135 afx_msg void OnDestroy();
136 afx_msg void OnFileSave();
137 afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
138 afx_msg void OnFileSaveLeft();
139 afx_msg void OnFileSaveMiddle();
140 afx_msg void OnUpdateFileSaveMiddle(CCmdUI* pCmdUI);
141 afx_msg void OnFileSaveRight();
142 afx_msg void OnFileSaveAsLeft();
143 afx_msg void OnFileSaveAsMiddle();
144 afx_msg void OnUpdateFileSaveAsMiddle(CCmdUI* pCmdUI);
145 afx_msg void OnFileSaveAsRight();
146 afx_msg void OnFileReadOnlyLeft();
147 afx_msg void OnUpdateFileReadOnlyLeft(CCmdUI* pCmdUI);
148 afx_msg void OnFileReadOnlyMiddle();
149 afx_msg void OnUpdateFileReadOnlyMiddle(CCmdUI* pCmdUI);
150 afx_msg void OnFileReadOnlyRight();
151 afx_msg void OnUpdateFileReadOnlyRight(CCmdUI* pCmdUI);
152 afx_msg void OnFileReload();
153 afx_msg void OnFileClose();
154 afx_msg void OnFileRecompareAs(UINT nID);
155 afx_msg void OnUpdateFileRecompareAs(CCmdUI* pCmdUI);
156 afx_msg void OnOpenWithUnpacker();
157 afx_msg void OnWindowChangePane(UINT nID);
158 afx_msg void OnSize(UINT nType, int cx, int cy);
159 afx_msg void OnIdleUpdateCmdUI();
160 afx_msg void OnUpdateStatusNum(CCmdUI* pCmdUI);
161 afx_msg LRESULT OnStorePaneSizes(WPARAM wParam, LPARAM lParam);
162 afx_msg void OnEditUndo();
163 afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
164 afx_msg void OnEditRedo();
165 afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI);
166 afx_msg void OnEditCut();
167 afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI);
168 afx_msg void OnEditCopy();
169 afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI);
170 afx_msg void OnEditPaste();
171 afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI);
172 afx_msg void OnEditSelectAll();
173 afx_msg void OnViewZoomIn();
174 afx_msg void OnViewZoomOut();
175 afx_msg void OnViewZoomNormal();
176 afx_msg void OnViewSplitVertically();
177 afx_msg void OnUpdateViewSplitVertically(CCmdUI* pCmdUI);
178 afx_msg void OnFirstdiff();
179 afx_msg void OnUpdateFirstdiff(CCmdUI* pCmdUI);
180 afx_msg void OnLastdiff();
181 afx_msg void OnUpdateLastdiff(CCmdUI* pCmdUI);
182 afx_msg void OnNextdiff();
183 afx_msg void OnUpdateNextdiff(CCmdUI* pCmdUI);
184 afx_msg void OnPrevdiff();
185 afx_msg void OnUpdatePrevdiff(CCmdUI* pCmdUI);
186 afx_msg void OnNextConflict();
187 afx_msg void OnUpdateNextConflict(CCmdUI* pCmdUI);
188 afx_msg void OnPrevConflict();
189 afx_msg void OnUpdatePrevConflict(CCmdUI* pCmdUI);
190 afx_msg void OnX2Y(int srcPane, int dstPane);
191 afx_msg void OnUpdateX2Y(CCmdUI* pCmdUI);
192 afx_msg void OnL2r();
193 afx_msg void OnUpdateL2r(CCmdUI* pCmdUI);
194 afx_msg void OnR2l();
195 afx_msg void OnUpdateR2l(CCmdUI* pCmdUI);
196 afx_msg void OnUpdateL2RNext(CCmdUI* pCmdUI);
197 afx_msg void OnUpdateR2LNext(CCmdUI* pCmdUI);
198 afx_msg void OnCopyFromLeft();
199 afx_msg void OnUpdateCopyFromLeft(CCmdUI* pCmdUI);
200 afx_msg void OnCopyFromRight();
201 afx_msg void OnUpdateCopyFromRight(CCmdUI* pCmdUI);
202 afx_msg void OnAllLeft();
203 afx_msg void OnUpdateAllLeft(CCmdUI* pCmdUI);
204 afx_msg void OnAllRight();
205 afx_msg void OnUpdateAllRight(CCmdUI* pCmdUI);
206 afx_msg void OnCopyX2Y(UINT nID);
207 afx_msg void OnUpdateCopyFromXToY(CCmdUI *pCmdUI);
208 afx_msg void OnAutoMerge();
209 afx_msg void OnUpdateAutoMerge(CCmdUI* pCmdUI);
210 afx_msg void OnImgViewDifferences();
211 afx_msg void OnUpdateImgViewDifferences(CCmdUI* pCmdUI);
212 afx_msg void OnImgZoom(UINT nId);
213 afx_msg void OnUpdateImgZoom(CCmdUI* pCmdUI);
214 afx_msg void OnImgOverlayMode(UINT nId);
215 afx_msg void OnUpdateImgOverlayMode(CCmdUI* pCmdUI);
216 afx_msg void OnImgDraggingMode(UINT nId);
217 afx_msg void OnUpdateImgDraggingMode(CCmdUI* pCmdUI);
218 afx_msg void OnImgDiffBlockSize(UINT nId);
219 afx_msg void OnUpdateImgDiffBlockSize(CCmdUI* pCmdUI);
220 afx_msg void OnImgThreshold(UINT nId);
221 afx_msg void OnUpdateImgThreshold(CCmdUI* pCmdUI);
222 afx_msg void OnImgInsertionDeletionDetectionMode(UINT nId);
223 afx_msg void OnUpdateImgInsertionDeletionDetectionMode(CCmdUI* pCmdUI);
224 afx_msg void OnImgPrevPage();
225 afx_msg void OnUpdateImgPrevPage(CCmdUI* pCmdUI);
226 afx_msg void OnImgNextPage();
227 afx_msg void OnUpdateImgNextPage(CCmdUI* pCmdUI);
228 afx_msg void OnImgCurPaneRotateRight90();
229 afx_msg void OnImgCurPaneRotateLeft90();
230 afx_msg void OnImgCurPaneFlipVertically();
231 afx_msg void OnImgCurPaneFlipHorizontally();
232 afx_msg void OnImgCurPanePrevPage();
233 afx_msg void OnUpdateImgCurPanePrevPage(CCmdUI* pCmdUI);
234 afx_msg void OnImgCurPaneNextPage();
235 afx_msg void OnUpdateImgCurPaneNextPage(CCmdUI* pCmdUI);
236 afx_msg void OnImgUseBackColor();
237 afx_msg void OnImgVectorImageScaling(UINT nId);
238 afx_msg void OnUpdateImgVectorImageScaling(CCmdUI* pCmdUI);
239 afx_msg void OnUpdateImgUseBackColor(CCmdUI* pCmdUI);
240 afx_msg void OnImgCompareExtractedText();
241 afx_msg void OnToolsGenerateReport();
242 afx_msg void OnRefresh();
243 afx_msg void OnSetFocus(CWnd *pNewWnd);
244 afx_msg void OnHelp();
246 DECLARE_MESSAGE_MAP()