OSDN Git Service

Folder Compare: Add 'Parent Folder' menu item in 'Open Left/Middle/Right' menu
[winmerge-jp/winmerge-jp.git] / Src / DirView.h
1 /////////////////////////////////////////////////////////////////////////////
2 //    WinMerge:  an interactive diff/merge utility
3 //    Copyright (C) 1997  Dean P. Grimm
4 //
5 //    This program is free software; you can redistribute it and/or modify
6 //    it under the terms of the GNU General Public License as published by
7 //    the Free Software Foundation; either version 2 of the License, or
8 //    (at your option) any later version.
9 //
10 //    This program is distributed in the hope that it will be useful,
11 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //    GNU General Public License for more details.
14 //
15 //    You should have received a copy of the GNU General Public License
16 //    along with this program; if not, write to the Free Software
17 //    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //
19 /////////////////////////////////////////////////////////////////////////////
20 /**
21  *  @file DirView.h
22  *
23  *  @brief Declaration of class CDirView
24  */
25 #pragma once
26
27 /////////////////////////////////////////////////////////////////////////////
28 // CDirView view
29 #include <afxcview.h>
30 #include <memory>
31 #include "OptionsDiffColors.h"
32 #include "SortHeaderCtrl.h"
33 #include "UnicodeString.h"
34 #include "DirItemIterator.h"
35 #include "DirActions.h"
36
37 class FileActionScript;
38
39 struct DIFFITEM;
40
41 typedef enum { eMain, eContext } eMenuType;
42
43 class CDirDoc;
44 class CDirFrame;
45
46 class PackingInfo;
47 class PathContext;
48 class DirCompProgressBar;
49 class CompareStats;
50 struct DirColInfo;
51 class CLoadSaveCodepageDlg;
52 class CShellContextMenu;
53 class CDiffContext;
54 class DirViewColItems;
55 class DirItemEnumerator;
56 struct IListCtrl;
57
58 /**
59  * @brief Position value for special items (..) in directory compare view.
60  */
61 const uintptr_t SPECIAL_ITEM_POS = (uintptr_t) - 1L;
62
63 /** Default column width in directory compare */
64 const UINT DefColumnWidth = 150;
65
66 /**
67  * @brief Directory compare results view.
68  *
69  * Directory compare view is list-view based, so it shows one result (for
70  * folder or file, commonly called as 'item') in one line. User can select
71  * visible columns, re-order columns, sort by column etc.
72  *
73  * Actual data is stored in CDiffContext in CDirDoc. Dircompare items and
74  * CDiffContext items are linked by storing POSITION of CDiffContext item
75  * as CDirView listitem key.
76  */
77 class CDirView : public CListView
78 {
79         friend struct FileCmpReport;
80         friend DirItemEnumerator;
81 protected:
82         CDirView();           // protected constructor used by dynamic creation
83         DECLARE_DYNCREATE(CDirView)
84
85 // Attributes
86 public:
87         CDirDoc* GetDocument(); // non-debug version is inline
88         // const version, for const methods to be able to call
89         const CDirDoc * GetDocument() const { return const_cast<CDirView *>(this)->GetDocument(); }
90         const CDiffContext& GetDiffContext() const;
91         CDiffContext& GetDiffContext();
92
93 // Operations
94 public:
95         CDirFrame * GetParentFrame();
96
97         void StartCompare(CompareStats *pCompareStats);
98         void Redisplay();
99         void RedisplayChildren(uintptr_t diffpos, int level, UINT &index, int &alldiffs);
100         void UpdateResources();
101         void LoadColumnHeaderItems();
102         uintptr_t GetItemKey(int idx) const;
103         int GetItemIndex(uintptr_t key);
104         // for populating list
105         void DeleteItem(int sel);
106         void DeleteAllDisplayItems();
107         void SetFont(const LOGFONT & lf);
108
109         void SortColumnsAppropriately();
110
111         UINT GetSelectedCount() const;
112         int GetFirstSelectedInd();
113         void AddParentFolderItem(bool bEnable);
114         void RefreshOptions();
115
116         LRESULT HandleMenuMessage(UINT message, WPARAM wParam, LPARAM lParam);
117
118         bool HasNextDiff();
119         bool HasPrevDiff();
120         void MoveToNextDiff();
121         void MoveToPrevDiff();
122         void OpenNextDiff();
123         void OpenPrevDiff();
124
125 // Implementation types
126 private:
127
128 // Implementation in DirActions.cpp
129 private:
130         void GetItemFileNames(int sel, String& strLeft, String& strRight) const;
131         void GetItemFileNames(int sel, PathContext * paths) const;
132         void FormatEncodingDialogDisplays(CLoadSaveCodepageDlg * dlg);
133         bool IsItemLeftOnly(int code);
134         bool IsItemRightOnly(int code);
135         DirActions MakeDirActions(DirActions::method_type func) const;
136         DirActions MakeDirActions(DirActions::method_type2 func) const;
137         Counts Count(DirActions::method_type2 func) const;
138         void DoDirAction(DirActions::method_type func, const String& status_message);
139         void DoDirActionTo(SIDE_TYPE stype, DirActions::method_type func, const String& status_message);
140         void DoOpen(SIDE_TYPE stype);
141         void DoOpenWith(SIDE_TYPE stype);
142         void DoOpenWithEditor(SIDE_TYPE stype);
143         void DoOpenParentFolder(SIDE_TYPE stype);
144         void DoUpdateOpen(SELECTIONTYPE selectionType, CCmdUI* pCmdUI);
145         void ConfirmAndPerformActions(FileActionScript & actions);
146         void PerformActionList(FileActionScript & actions);
147         void UpdateAfterFileScript(FileActionScript & actionList);
148         void DoFileEncodingDialog();
149
150 // End DirActions.cpp
151         void ReflectGetdispinfo(NMLVDISPINFO *);
152
153 // Implementation in DirViewColHandler.cpp
154 public:
155         void UpdateColumnNames();
156         void SetColAlignments();
157         // class CompareState is used to pass parameters to the PFNLVCOMPARE callback function.
158         class CompareState
159         {
160         private:
161                 const DirViewColItems *const pColItems;
162                 const CDiffContext *const pCtxt;
163                 const int sortCol;
164                 const bool bSortAscending;
165                 const bool bTreeMode;
166         public:
167                 CompareState(const CDiffContext *pCtxt, const DirViewColItems *pColItems, int sortCol, bool bSortAscending, bool bTreeMode);
168                 static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
169         } friend;
170         void UpdateDiffItemStatus(UINT nIdx);
171 private:
172         void InitiateSort();
173         void NameColumn(const char* idname, int subitem);
174         int AddNewItem(int i, uintptr_t diffpos, int iImage, int iIndent);
175 // End DirViewCols.cpp
176
177 private:
178
179 // Overrides
180         // ClassWizard generated virtual function overrides
181         //{{AFX_VIRTUAL(CDirView)
182 public:
183         virtual void OnInitialUpdate();
184 protected:
185         virtual BOOL PreTranslateMessage(MSG* pMsg);
186         virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
187         virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, LRESULT*);
188         virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
189         //}}AFX_VIRTUAL
190
191 // Implementation
192 protected:
193         virtual ~CDirView();
194         int GetFocusedItem();
195         int GetFirstDifferentItem();
196         int GetLastDifferentItem();
197         int AddSpecialItems();
198         void GetCurrentColRegKeys(std::vector<String>& colKeys);
199         void OpenSpecialItems(uintptr_t pos1, uintptr_t pos2, uintptr_t pos3);
200
201 // Implementation data
202 protected:
203         CSortHeaderCtrl m_ctlSortHeader;
204         CImageList m_imageList;
205         CImageList m_imageState;
206         CListCtrl *m_pList;
207         std::unique_ptr<IListCtrl> m_pIList;
208         bool m_bEscCloses; /**< Cached value for option for ESC closing window */
209         bool m_bExpandSubdirs;
210         CFont m_font; /**< User-selected font */
211         UINT m_nHiddenItems; /**< Count of items we have hidden */
212         bool m_bTreeMode; /**< TRUE if tree mode is on*/
213         DirViewFilterSettings m_dirfilter;
214         std::unique_ptr<DirCompProgressBar> m_pCmpProgressBar;
215         clock_t m_compareStart; /**< Starting process time of the compare */
216         bool m_bUserCancelEdit; /**< TRUE if the user cancels rename */
217         String m_lastCopyFolder; /**< Last Copy To -target folder. */
218
219         int m_firstDiffItem;
220         int m_lastDiffItem;
221         bool m_bNeedSearchFirstDiffItem;
222         bool m_bNeedSearchLastDiffItem;
223         COLORSETTINGS m_cachedColors; /**< Cached color settings */
224
225         std::unique_ptr<CShellContextMenu> m_pShellContextMenuLeft; /**< Shell context menu for group of left files */
226         std::unique_ptr<CShellContextMenu> m_pShellContextMenuMiddle; /**< Shell context menu for group of middle files */
227         std::unique_ptr<CShellContextMenu> m_pShellContextMenuRight; /**< Shell context menu for group of right files */
228         HMENU m_hCurrentMenu; /**< Current shell context menu (either left or right) */
229         std::unique_ptr<DirViewTreeState> m_pSavedTreeState;
230         std::unique_ptr<DirViewColItems> m_pColItems;
231
232         // Generated message map functions
233         afx_msg void OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult);
234         afx_msg void OnContextMenu(CWnd*, CPoint point);
235         //{{AFX_MSG(CDirView)
236         afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
237         template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
238         afx_msg void OnDirCopy();
239         template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
240         afx_msg void OnCtxtDirCopy();
241         template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
242         afx_msg void OnUpdateDirCopy(CCmdUI* pCmdUI);
243         template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
244         afx_msg void OnUpdateCtxtDirCopy(CCmdUI* pCmdUI);
245         template<SIDE_TYPE stype>
246         afx_msg void OnCtxtDirDel();
247         template<SIDE_TYPE stype>
248         afx_msg void OnUpdateCtxtDirDel(CCmdUI* pCmdUI);
249         afx_msg void OnCtxtDirDelBoth();
250         afx_msg void OnUpdateCtxtDirDelBoth(CCmdUI* pCmdUI);
251         template<SIDE_TYPE stype>
252         afx_msg void OnCtxtDirOpen();
253         template<SIDE_TYPE stype>
254         afx_msg void OnUpdateCtxtDirOpen(CCmdUI* pCmdUI);
255         template<SIDE_TYPE stype>
256         afx_msg void OnCtxtDirOpenWith();
257         template<SIDE_TYPE stype>
258         afx_msg void OnUpdateCtxtDirOpenWith(CCmdUI* pCmdUI);
259         template<SIDE_TYPE stype>
260         afx_msg void OnCtxtDirOpenWithEditor();
261         template<SIDE_TYPE stype>
262         afx_msg void OnUpdateCtxtDirOpenWithEditor(CCmdUI* pCmdUI);
263         template<SIDE_TYPE stype>
264         afx_msg void OnCtxtDirOpenParentFolder();
265         template<SIDE_TYPE stype>
266         afx_msg void OnUpdateCtxtDirOpenParentFolder(CCmdUI* pCmdUI);
267         template<SIDE_TYPE stype>
268         afx_msg void OnCtxtDirCopyTo();
269         template<SIDE_TYPE stype>
270         afx_msg void OnUpdateCtxtDirCopyTo(CCmdUI* pCmdUI);
271         afx_msg void OnUpdateCtxtDirCopyBothTo(CCmdUI* pCmdUI);
272         afx_msg void OnUpdateCtxtDirCopyBothDiffsOnlyTo(CCmdUI* pCmdUI);
273         afx_msg void OnDestroy();
274         afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
275         afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
276         afx_msg void OnFirstdiff();
277         afx_msg void OnUpdateFirstdiff(CCmdUI* pCmdUI);
278         afx_msg void OnLastdiff();
279         afx_msg void OnUpdateLastdiff(CCmdUI* pCmdUI);
280         afx_msg void OnNextdiff();
281         afx_msg void OnUpdateNextdiff(CCmdUI* pCmdUI);
282         afx_msg void OnPrevdiff();
283         afx_msg void OnUpdatePrevdiff(CCmdUI* pCmdUI);
284         afx_msg void OnCurdiff();
285         afx_msg void OnUpdateCurdiff(CCmdUI* pCmdUI);
286         afx_msg void OnUpdateSave(CCmdUI* pCmdUI);
287         afx_msg LRESULT OnUpdateUIMessage(WPARAM wParam, LPARAM lParam);
288         afx_msg void OnRefresh();
289         afx_msg void OnUpdateRefresh(CCmdUI* pCmdUI);
290         afx_msg void OnTimer(UINT_PTR nIDEvent);
291         afx_msg void OnEditColumns();
292         template<SIDE_TYPE stype>
293         afx_msg void OnReadOnly();
294         template<SIDE_TYPE stype>
295         afx_msg void OnUpdateReadOnly(CCmdUI* pCmdUI);
296         afx_msg void OnUpdateStatusLeftRO(CCmdUI* pCmdUI);
297         afx_msg void OnUpdateStatusMiddleRO(CCmdUI* pCmdUI);
298         afx_msg void OnUpdateStatusRightRO(CCmdUI* pCmdUI);
299         afx_msg void OnCustomizeColumns();
300         afx_msg void OnCtxtOpenWithUnpacker();
301         afx_msg void OnUpdateCtxtOpenWithUnpacker(CCmdUI* pCmdUI);
302         afx_msg void OnToolsGenerateReport();
303         afx_msg void OnToolsGeneratePatch();
304         template<int flag>
305         afx_msg void OnCtxtDirZip();
306         template<SIDE_TYPE stype>
307         afx_msg void OnCtxtDirShellContextMenu();
308         afx_msg void OnUpdateCtxtDir(CCmdUI* pCmdUI);
309         afx_msg void OnSelectAll();
310         afx_msg void OnUpdateSelectAll(CCmdUI* pCmdUI);
311         afx_msg void OnPluginPredifferMode(UINT nID);
312         afx_msg void OnUpdatePluginPredifferMode(CCmdUI* pCmdUI);
313         template<SIDE_TYPE side>
314         afx_msg void OnCopyPathnames();
315         afx_msg void OnCopyBothPathnames();
316         afx_msg void OnCopyFilenames();
317         afx_msg void OnUpdateCopyFilenames(CCmdUI* pCmdUI);
318         template<SIDE_TYPE side>
319         afx_msg void OnCopyToClipboard();
320         afx_msg void OnCopyBothToClipboard();
321         afx_msg void OnItemRename();
322         afx_msg void OnUpdateItemRename(CCmdUI* pCmdUI);
323         afx_msg void OnHideFilenames();
324         afx_msg void OnSize(UINT nType, int cx, int cy);
325         template<SIDE_TYPE stype>
326         afx_msg void OnCtxtDirMoveTo();
327         template<SIDE_TYPE stype>
328         afx_msg void OnUpdateCtxtDirMoveTo(CCmdUI* pCmdUI);
329         afx_msg void OnUpdateHideFilenames(CCmdUI* pCmdUI);
330         afx_msg void OnDelete();
331         afx_msg void OnUpdateDelete(CCmdUI* pCmdUI);
332         afx_msg void OnMarkedRescan();
333         afx_msg void OnUpdateStatusNum(CCmdUI* pCmdUI);
334         afx_msg void OnViewShowHiddenItems();
335         afx_msg void OnUpdateViewShowHiddenItems(CCmdUI* pCmdUI);
336         afx_msg void OnViewTreeMode();
337         afx_msg void OnUpdateViewTreeMode(CCmdUI* pCmdUI);
338         afx_msg void OnViewExpandAllSubdirs();
339         afx_msg void OnUpdateViewExpandAllSubdirs(CCmdUI* pCmdUI);
340         afx_msg void OnViewCollapseAllSubdirs();
341         afx_msg void OnUpdateViewCollapseAllSubdirs(CCmdUI* pCmdUI);
342         afx_msg void OnViewSwapPanes();
343         afx_msg void OnOptionsShowDifferent();
344         afx_msg void OnOptionsShowIdentical();
345         afx_msg void OnOptionsShowUniqueLeft();
346         afx_msg void OnOptionsShowUniqueMiddle();
347         afx_msg void OnOptionsShowUniqueRight();
348         afx_msg void OnOptionsShowBinaries();
349         afx_msg void OnOptionsShowSkipped();
350         afx_msg void OnUpdateOptionsShowdifferent(CCmdUI* pCmdUI);
351         afx_msg void OnUpdateOptionsShowidentical(CCmdUI* pCmdUI);
352         afx_msg void OnUpdateOptionsShowuniqueleft(CCmdUI* pCmdUI);
353         afx_msg void OnUpdateOptionsShowuniquemiddle(CCmdUI* pCmdUI);
354         afx_msg void OnUpdateOptionsShowuniqueright(CCmdUI* pCmdUI);
355         afx_msg void OnUpdateOptionsShowBinaries(CCmdUI* pCmdUI);
356         afx_msg void OnUpdateOptionsShowSkipped(CCmdUI* pCmdUI);
357         afx_msg void OnMergeCompare();
358         template<SELECTIONTYPE seltype>
359         afx_msg void OnMergeCompare2();
360         afx_msg void OnMergeCompareXML();
361         afx_msg void OnMergeCompareHex();
362         afx_msg void OnUpdateMergeCompare(CCmdUI *pCmdUI);
363         template<SELECTIONTYPE seltype>
364         afx_msg void OnUpdateMergeCompare2(CCmdUI *pCmdUI);
365         afx_msg void OnViewCompareStatistics();
366         afx_msg void OnFileEncoding();
367         afx_msg void OnUpdateFileEncoding(CCmdUI* pCmdUI);
368         afx_msg void OnHelp();
369         afx_msg void OnEditCopy();
370         afx_msg void OnEditCut();
371         afx_msg void OnEditPaste();
372         afx_msg void OnEditUndo();
373         afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
374         afx_msg void OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult);
375         afx_msg void OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult);
376         afx_msg void OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult);
377         afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
378         afx_msg void OnSearch();
379         afx_msg void OnExpandFolder();
380         afx_msg void OnCollapseFolder();
381         afx_msg void OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult);
382         afx_msg void OnBnClickedComparisonStop();
383         //}}AFX_MSG
384         DECLARE_MESSAGE_MAP()
385         BOOL OnHeaderBeginDrag(LPNMHEADER hdr, LRESULT* pResult);
386         BOOL OnHeaderEndDrag(LPNMHEADER hdr, LRESULT* pResult);
387
388 private:
389         void OpenSelection(SELECTIONTYPE selectionType = SELECTIONTYPE_NORMAL, PackingInfo * infoUnpacker = NULL);
390         void OpenSelectionHex();
391         bool GetSelectedItems(int * sel1, int * sel2, int * sel3);
392         void OpenParentDirectory();
393         template<SIDE_TYPE srctype, SIDE_TYPE dsttype>
394         void DoUpdateDirCopy(CCmdUI* pCmdUI, eMenuType menuType);
395         const DIFFITEM & GetDiffItem(int sel) const;
396         DIFFITEM & GetDiffItem(int sel);
397         int GetSingleSelectedItem() const;
398         void MoveFocus(int currentInd, int i, int selCount);
399
400         void FixReordering();
401         void HeaderContextMenu(CPoint point, int i);
402         void ListContextMenu(CPoint point, int i);
403         bool ListShellContextMenu(SIDE_TYPE side);
404         void ShowShellContextMenu(SIDE_TYPE side);
405         CShellContextMenu* GetCorrespondingShellContextMenu(HMENU hMenu) const;
406         void ReloadColumns();
407         bool IsLabelEdit() const;
408         void CollapseSubdir(int sel);
409         void ExpandSubdir(int sel, bool bRecursive = false);
410         void GetColors(int nRow, int nCol, COLORREF& clrBk, COLORREF& clrText) const;
411 public:
412         DirItemIterator Begin() const { return DirItemIterator(m_pIList.get()); }
413         DirItemIterator End() const { return DirItemIterator(); }
414         DirItemIterator RevBegin() const { return DirItemIterator(m_pIList.get(), -1, false, true); }
415         DirItemIterator RevEnd() const { return DirItemIterator(); }
416         DirItemIterator SelBegin() const { return DirItemIterator(m_pIList.get(), -1, true); }
417         DirItemIterator SelEnd() const { return DirItemIterator(); }
418         DirItemIterator SelRevBegin() const { return DirItemIterator(m_pIList.get(), -1, true, true); }
419         DirItemIterator SelRevEnd() const { return DirItemIterator(); }
420 };
421
422 #ifndef _DEBUG  // debug version in DirView.cpp
423 inline CDirDoc* CDirView::GetDocument()
424 { return reinterpret_cast<CDirDoc*>(m_pDocument); }
425 #endif
426
427
428 /////////////////////////////////////////////////////////////////////////////
429
430 //{{AFX_INSERT_LOCATION}}
431 // Microsoft Developer Studio will insert additional declarations immediately before the previous line.