Parse time in BrowseRefsDlg ourselves
[TortoiseGit.git] / src / TortoiseProc / BrowseRefsDlg.h
blob6028433a208974ce6e957d0667401ada2f74b2ca
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2015 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
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.
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 Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #pragma once
21 #include <map>
22 #include "StandAloneDlg.h"
23 #include "FilterEdit.h"
24 #include "GitStatusListCtrl.h"
25 #include "gittype.h"
27 const int gPickRef_Head = 1;
28 const int gPickRef_Tag = 2;
29 const int gPickRef_Remote = 4;
30 const int gPickRef_All = gPickRef_Head | gPickRef_Tag | gPickRef_Remote;
31 const int gPickRef_NoTag = gPickRef_All & ~gPickRef_Tag;
33 class CShadowTree
35 public:
36 typedef std::map<CString,CShadowTree> TShadowTreeMap;
38 CShadowTree():m_hTree(NULL),m_pParent(NULL){}
40 CShadowTree* GetNextSub(CString& nameLeft, bool bCreateIfNotExist);
42 bool IsLeaf()const {return m_ShadowTree.empty();}
43 CString GetRefName()const
45 if(m_pParent==NULL)
46 return m_csRefName;
47 return m_pParent->GetRefName()+"/"+m_csRefName;
49 bool IsFrom(const wchar_t* from)const
51 return wcsncmp(GetRefName(),from,wcslen(from))==0;
54 CShadowTree* FindLeaf(CString partialRefName);
56 CString m_csRefName;
57 CString m_csUpstream;
58 CString m_csRefHash;
59 CTime m_csDate;
60 CString m_csAuthor;
61 CString m_csSubject;
62 CString m_csDescription;
64 HTREEITEM m_hTree;
66 TShadowTreeMap m_ShadowTree;
67 CShadowTree* m_pParent;
69 typedef std::vector<CShadowTree*> VectorPShadowTree;
71 class CBrowseRefsDlg : public CResizableStandAloneDialog
73 DECLARE_DYNAMIC(CBrowseRefsDlg)
75 public:
76 CBrowseRefsDlg(CString cmdPath, CWnd* pParent = NULL); // standard constructor
77 virtual ~CBrowseRefsDlg();
79 enum eCmd
81 eCmd_ViewLog = WM_APP,
82 eCmd_AddRemote,
83 eCmd_ManageRemotes,
84 eCmd_CreateBranch,
85 eCmd_CreateTag,
86 eCmd_DeleteAllTags,
87 eCmd_DeleteBranch,
88 eCmd_DeleteRemoteBranch,
89 eCmd_DeleteTag,
90 eCmd_ShowReflog,
91 eCmd_Diff,
92 eCmd_Fetch,
93 eCmd_Switch,
94 eCmd_Merge,
95 eCmd_Rename,
96 eCmd_RepoBrowser,
97 eCmd_DeleteRemoteTag,
98 eCmd_EditBranchDescription,
99 eCmd_ViewLogRange,
100 eCmd_ViewLogRangeReachableFromOnlyOne,
101 eCmd_UnifiedDiff,
104 enum eCol
106 eCol_Name,
107 eCol_Upstream,
108 eCol_Date,
109 eCol_Msg,
110 eCol_LastAuthor,
111 eCol_Hash,
112 eCol_Description,
115 // Dialog Data
116 enum { IDD = IDD_DIALOG_BROWSE_REFS };
118 protected:
119 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
121 DECLARE_MESSAGE_MAP()
123 afx_msg void OnBnClickedOk();
124 virtual BOOL OnInitDialog();
126 CString GetSelectedRef(bool onlyIfLeaf, bool pickFirstSelIfMultiSel = false);
128 void Refresh(CString selectRef = CString());
130 CShadowTree& GetTreeNode(CString refName, CShadowTree* pTreePos=NULL, bool bCreateIfNotExist=false);
132 void FillListCtrlForTreeNode(HTREEITEM treeNode);
134 void FillListCtrlForShadowTree(CShadowTree* pTree, CString refNamePrefix, bool isFirstLevel);
136 bool SelectRef(CString refName, bool bExactMatch);
138 bool ConfirmDeleteRef(VectorPShadowTree& leafs);
139 bool DoDeleteRefs(VectorPShadowTree& leafs);
140 bool DoDeleteRef(CString completeRefName);
142 CString GetFullRefName(CString partialRefName);
144 private:
145 bool m_bHasWC;
147 CString m_cmdPath;
149 STRING_VECTOR remotes;
151 CShadowTree m_TreeRoot;
152 CShadowTree* m_pListCtrlRoot;
153 CTreeCtrl m_RefTreeCtrl;
154 CListCtrl m_ListRefLeafs;
155 ColumnManager m_ColumnManager;
157 CFilterEdit m_ctrlFilter;
158 afx_msg void OnEnChangeEditFilter();
159 afx_msg void OnTimer(UINT_PTR nIDEvent);
160 DWORD m_SelectedFilters;
161 void SetFilterCueText();
162 afx_msg LRESULT OnClickedInfoIcon(WPARAM wParam, LPARAM lParam);
163 afx_msg LRESULT OnClickedCancelFilter(WPARAM wParam, LPARAM lParam);
164 bool IsMatchFilter(const CShadowTree* pTree, const CString &ref, const CString &filter, bool positive);
166 int m_currSortCol;
167 bool m_currSortDesc;
168 afx_msg void OnTvnSelchangedTreeRef(NMHDR *pNMHDR, LRESULT *pResult);
170 afx_msg void OnContextMenu(CWnd* pWndFrom, CPoint point);
172 void GetSelectedLeaves(VectorPShadowTree& selectedLeafs);
173 void OnContextMenu_ListRefLeafs(CPoint point);
174 void OnContextMenu_RefTreeCtrl(CPoint point);
175 static CString GetTwoSelectedRefs(VectorPShadowTree& selectedLeafs, const CString &lastSelected, const CString &separator);
177 bool AreAllFrom(VectorPShadowTree& leafs, const wchar_t* from);
178 void ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPShadowTree& selectedLeafs);
179 virtual BOOL PreTranslateMessage(MSG* pMsg);
180 afx_msg void OnLvnColumnclickListRefLeafs(NMHDR *pNMHDR, LRESULT *pResult);
181 afx_msg void OnDestroy();
182 afx_msg void OnNMDblclkListRefLeafs(NMHDR *pNMHDR, LRESULT *pResult);
183 afx_msg void OnItemChangedListRefLeafs(NMHDR *pNMHDR, LRESULT *pResult);
184 afx_msg void OnLvnEndlabeleditListRefLeafs(NMHDR *pNMHDR, LRESULT *pResult);
185 afx_msg void OnLvnBeginlabeleditListRefLeafs(NMHDR *pNMHDR, LRESULT *pResult);
186 afx_msg void OnBnClickedCurrentbranch();
187 void UpdateInfoLabel();
189 CString m_sLastSelected;
190 CString m_initialRef;
191 int m_pickRef_Kind;
192 CString m_pickedRef;
193 bool m_bPickOne;
194 bool m_bPickedRefSet;
196 DWORD m_DateFormat; // DATE_SHORTDATE or DATE_LONGDATE
197 bool m_bRelativeTimes; // Show relative times
199 public:
200 static CString PickRef(bool returnAsHash = false, CString initialRef = CString(), int pickRef_Kind = gPickRef_All, bool pickMultipleRefsOrRange = false);
201 static bool PickRefForCombo(CComboBoxEx* pComboBox, int pickRef_Kind = gPickRef_All);