From 3a5e3abee6db2ae6a479ad1d282cff25485b2b82 Mon Sep 17 00:00:00 2001 From: Johan t Hart Date: Tue, 21 Apr 2009 23:55:28 +0200 Subject: [PATCH] Initial version of BrowseRefsDlg --- src/Resources/TortoiseProcENG.rc | Bin 423502 -> 426026 bytes src/TortoiseProc/BrowseRefsDlg.cpp | 135 ++++++++++++++++++++++++++++++++++ src/TortoiseProc/BrowseRefsDlg.h | 53 +++++++++++++ src/TortoiseProc/Commands/Command.cpp | 16 +++- src/TortoiseProc/TortoiseProc.vcproj | 104 ++++++++++++++------------ src/TortoiseProc/resource.h | Bin 158272 -> 158454 bytes 6 files changed, 259 insertions(+), 49 deletions(-) create mode 100644 src/TortoiseProc/BrowseRefsDlg.cpp create mode 100644 src/TortoiseProc/BrowseRefsDlg.h diff --git a/src/Resources/TortoiseProcENG.rc b/src/Resources/TortoiseProcENG.rc index 2182cd9b92ebab1a3752d5d366d2775aaa07b481..52dedbeecc5d79b31aa4e7b62141a652fcf8b12d 100644 GIT binary patch delta 406 zcwRgAMsihyR6`463sVbo3rh>@7PgdBWfz80h7yKkh71M;1`P&3hEyOg14tGzyk7lu%V5C&%kkI5TZL=n8{6Z6=Fr_W1clbHOE zWzFOe3l&8d22Tb@1|J5026u*d1}BCfAS;|9n86ju3j&gE(;ICVl_wvFX5ltx&;h!^ zh{24(VERQirh~#xKu6>=lrt0qoudF`r!u5X-}s)Xd-?=^Mxp5o_?S7EjTnq4Kdg%9 zHe#?~FaYX@@TI34@H6Z2hk$K>+cdfNNb=+ztK_Ehd}q{{98kbEdBRaPULyt*pk9zp z0|v{f2U!kJ??_}`LWH{mk1@AT4>-V_FkNX6v(WT_d}glc6aE8@7Pges?GE{DuLJ;>CkiA0 diff --git a/src/TortoiseProc/BrowseRefsDlg.cpp b/src/TortoiseProc/BrowseRefsDlg.cpp new file mode 100644 index 000000000..beaf97e42 --- /dev/null +++ b/src/TortoiseProc/BrowseRefsDlg.cpp @@ -0,0 +1,135 @@ +// BrowseRefsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "TortoiseProc.h" +#include "BrowseRefsDlg.h" + + +// CBrowseRefsDlg dialog + +IMPLEMENT_DYNAMIC(CBrowseRefsDlg, CDialog) + +CBrowseRefsDlg::CBrowseRefsDlg(CWnd* pParent /*=NULL*/) + : CDialog(CBrowseRefsDlg::IDD, pParent) +{ + +} + +CBrowseRefsDlg::~CBrowseRefsDlg() +{ +} + +void CBrowseRefsDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_TREE_REF, m_RefTreeCtrl); +} + + +BEGIN_MESSAGE_MAP(CBrowseRefsDlg, CDialog) + ON_BN_CLICKED(IDOK, &CBrowseRefsDlg::OnBnClickedOk) +END_MESSAGE_MAP() + + +// CBrowseRefsDlg message handlers + +void CBrowseRefsDlg::OnBnClickedOk() +{ + OnOK(); +} + +BOOL CBrowseRefsDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + Refresh(); + + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +CShadowTree* CShadowTree::GetNextSub(CString& nameLeft) +{ + int posSlash=nameLeft.Find('/'); + CString nameSub; + if(posSlash<0) + { + nameSub=nameLeft; + nameLeft.Empty();//Nothing left + } + else + { + nameSub=nameLeft.Left(posSlash); + nameLeft=nameLeft.Mid(posSlash+1); + } + if(nameSub.IsEmpty()) + return NULL; + + CShadowTree& nextNode=m_ShadowTree[nameSub]; + nextNode.m_csName=nameSub; + nextNode.m_pParent=this; + return &nextNode; +} + +typedef std::map MAP_STRING_STRING; + +void CBrowseRefsDlg::Refresh() +{ + m_RefMap.clear(); + g_Git.GetMapHashToFriendName(m_RefMap); + + m_RefTreeCtrl.DeleteAllItems(); + m_TreeRoot.m_ShadowTree.clear(); + m_TreeRoot.m_csName="Refs"; + m_TreeRoot.m_hTree=m_RefTreeCtrl.InsertItem(L"Refs",NULL,NULL); + m_RefTreeCtrl.SetItemData(m_TreeRoot.m_hTree,(DWORD_PTR)&m_TreeRoot); + + + MAP_STRING_STRING refName; + + //First sort on ref name + for(MAP_HASH_NAME::iterator iterRef=m_RefMap.begin();iterRef!=m_RefMap.end();++iterRef) + for(STRING_VECTOR::iterator iterRefName=iterRef->second.begin();iterRefName!=iterRef->second.end();++iterRefName) + refName[*iterRefName]=iterRef->first; + + //Populate ref tree + for(MAP_STRING_STRING::iterator iterRefName=refName.begin();iterRefName!=refName.end();++iterRefName) + { + CShadowTree& treeLeaf=GetTreeNode(iterRefName->first); + treeLeaf.m_csRef=iterRefName->second; + } + + m_RefTreeCtrl.Expand(m_TreeRoot.m_hTree,TVE_EXPAND); + +} + +CShadowTree& CBrowseRefsDlg::GetTreeNode(CString refName, CShadowTree* pTreePos) +{ + if(pTreePos==NULL) + { + if(wcsnicmp(refName,L"refs/",5)==0) + refName=refName.Mid(5); + pTreePos=&m_TreeRoot; + } + if(refName.IsEmpty()) + return *pTreePos;//Found leaf + + CShadowTree* pNextTree=pTreePos->GetNextSub(refName); + if(pNextTree==NULL) + { + //Should not occur when all ref-names are valid. + ASSERT(FALSE); + return *pTreePos; + } + if(pNextTree->m_hTree==NULL) + { + //New tree. Create node in control. + pNextTree->m_hTree=m_RefTreeCtrl.InsertItem(pNextTree->m_csName,pTreePos->m_hTree,NULL); + m_RefTreeCtrl.SetItemData(pNextTree->m_hTree,(DWORD_PTR)pNextTree); + } + + return GetTreeNode(refName,pNextTree); +} + diff --git a/src/TortoiseProc/BrowseRefsDlg.h b/src/TortoiseProc/BrowseRefsDlg.h new file mode 100644 index 000000000..8980ec90f --- /dev/null +++ b/src/TortoiseProc/BrowseRefsDlg.h @@ -0,0 +1,53 @@ +#pragma once + +#include "Git.h" +#include +#include "afxcmn.h" + +class CShadowTree +{ +public: + typedef std::map TShadowTreeMap; + + CShadowTree():m_hTree(NULL){} + + CShadowTree* GetNextSub(CString& nameLeft); + + + CString m_csName; + CString m_csRef; + + HTREEITEM m_hTree; + + TShadowTreeMap m_ShadowTree; + CShadowTree* m_pParent; +}; + +class CBrowseRefsDlg : public CDialog +{ + DECLARE_DYNAMIC(CBrowseRefsDlg) + +public: + CBrowseRefsDlg(CWnd* pParent = NULL); // standard constructor + virtual ~CBrowseRefsDlg(); + +// Dialog Data + enum { IDD = IDD_DIALOG_BROWSE_REFS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedOk(); + virtual BOOL OnInitDialog(); + + void Refresh(); + + CShadowTree& GetTreeNode(CString refName, CShadowTree* pTreePos=NULL); + + MAP_HASH_NAME m_RefMap; + + CShadowTree m_TreeRoot; + CTreeCtrl m_RefTreeCtrl; +}; diff --git a/src/TortoiseProc/Commands/Command.cpp b/src/TortoiseProc/Commands/Command.cpp index acaa4fed5..62d0ceffc 100644 --- a/src/TortoiseProc/Commands/Command.cpp +++ b/src/TortoiseProc/Commands/Command.cpp @@ -62,6 +62,8 @@ #include "SendMailCommand.h" #include "CatCommand.h" +#include "BrowseRefsDlg.h" + #if 0 @@ -271,7 +273,19 @@ Command * CommandServer::GetCommand(const CString& sCmd) } } - + + // CBrowseRefsDlg dialog +#if 1 + class TestCommand : public Command + { + virtual bool Execute() + { + CBrowseRefsDlg().DoModal(); + return true; + } + }; + return new TestCommand; +#endif switch (command) { diff --git a/src/TortoiseProc/TortoiseProc.vcproj b/src/TortoiseProc/TortoiseProc.vcproj index ee4ab86fc..6325d5dd7 100644 --- a/src/TortoiseProc/TortoiseProc.vcproj +++ b/src/TortoiseProc/TortoiseProc.vcproj @@ -1,7 +1,7 @@ @@ -165,14 +166,19 @@ @@ -254,19 +259,14 @@ + + + + @@ -564,11 +572,11 @@ > diff --git a/src/TortoiseProc/resource.h b/src/TortoiseProc/resource.h index 0e39ff48fb66d2b689dee7904ddae6bae7651037..2d4a6a6eb257537fcc0a6975b29cc7eda877afd9 100644 GIT binary patch delta 117 zcwRejh4b50&J8hclP552gWF_5d-3TD;+R;bi&!(sH7B@j zPjF*w(V9FVmW>;vz?A{4aPmcV?dcbC7}=&D$Yc_m?7+gY{Y3$z+>gmi6vU>>WHK$8 Qu2#qhW{FIHmB|za0QZU}BLDyZ delta 62 zcwYN