OSDN Git Service

Show selected refs in list ctrl
authorJohan t Hart <johanthart@gmail.com>
Wed, 22 Apr 2009 21:55:07 +0000 (23:55 +0200)
committerFrank Li <lznuaa@gmail.com>
Fri, 24 Apr 2009 01:51:12 +0000 (09:51 +0800)
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/BrowseRefsDlg.cpp
src/TortoiseProc/BrowseRefsDlg.h
src/TortoiseProc/resource.h

index 5983b58..6ad4512 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index f24931a..50a4fe6 100644 (file)
@@ -23,12 +23,14 @@ CBrowseRefsDlg::~CBrowseRefsDlg()
 void CBrowseRefsDlg::DoDataExchange(CDataExchange* pDX)\r
 {\r
        CDialog::DoDataExchange(pDX);\r
-       DDX_Control(pDX, IDC_TREE_REF, m_RefTreeCtrl);\r
+       DDX_Control(pDX, IDC_TREE_REF,                  m_RefTreeCtrl);\r
+       DDX_Control(pDX, IDC_LIST_REF_LEAFS,    m_ListRefLeafs);\r
 }\r
 \r
 \r
 BEGIN_MESSAGE_MAP(CBrowseRefsDlg, CResizableStandAloneDialog)\r
        ON_BN_CLICKED(IDOK, &CBrowseRefsDlg::OnBnClickedOk)\r
+       ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_REF, &CBrowseRefsDlg::OnTvnSelchangedTreeRef)\r
 END_MESSAGE_MAP()\r
 \r
 \r
@@ -43,7 +45,14 @@ BOOL CBrowseRefsDlg::OnInitDialog()
 {\r
        CResizableStandAloneDialog::OnInitDialog();\r
 \r
-       AddAnchor(IDC_TREE_REF, TOP_LEFT, BOTTOM_RIGHT);\r
+       AddAnchor(IDC_TREE_REF, TOP_LEFT, BOTTOM_LEFT);\r
+       AddAnchor(IDC_LIST_REF_LEAFS, TOP_LEFT, BOTTOM_RIGHT);\r
+\r
+       m_ListRefLeafs.SetExtendedStyle(m_ListRefLeafs.GetExtendedStyle()|LVS_EX_FULLROWSELECT);\r
+       m_ListRefLeafs.InsertColumn(0,L"Name",0,150);\r
+       m_ListRefLeafs.InsertColumn(1,L"Date Last Commit",0,100);\r
+       m_ListRefLeafs.InsertColumn(2,L"Last Commit",0,300);\r
+       m_ListRefLeafs.InsertColumn(3,L"Hash",0,80);\r
 \r
        AddAnchor(IDOK,BOTTOM_RIGHT);\r
        AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
@@ -51,8 +60,7 @@ BOOL CBrowseRefsDlg::OnInitDialog()
        Refresh();\r
 \r
 \r
-       return TRUE;  // return TRUE unless you set the focus to a control\r
-       // EXCEPTION: OCX Property Pages should return FALSE\r
+       return TRUE;\r
 }\r
 \r
 CShadowTree* CShadowTree::GetNextSub(CString& nameLeft)\r
@@ -128,13 +136,63 @@ CShadowTree& CBrowseRefsDlg::GetTreeNode(CString refName, CShadowTree* pTreePos)
                ASSERT(FALSE);\r
                return *pTreePos;\r
        }\r
-       if(pNextTree->m_hTree==NULL)\r
+\r
+       if(!refName.IsEmpty())\r
        {\r
-               //New tree. Create node in control.\r
-               pNextTree->m_hTree=m_RefTreeCtrl.InsertItem(pNextTree->m_csName,pTreePos->m_hTree,NULL);\r
-               m_RefTreeCtrl.SetItemData(pNextTree->m_hTree,(DWORD_PTR)pNextTree);\r
+               //When the refName is not empty, this node is not a leaf, so lets add it to the tree control.\r
+               //Leafs are for the list control.\r
+               if(pNextTree->m_hTree==NULL)\r
+               {\r
+                       //New tree. Create node in control.\r
+                       pNextTree->m_hTree=m_RefTreeCtrl.InsertItem(pNextTree->m_csName,pTreePos->m_hTree,NULL);\r
+                       m_RefTreeCtrl.SetItemData(pNextTree->m_hTree,(DWORD_PTR)pNextTree);\r
+               }\r
        }\r
 \r
        return GetTreeNode(refName,pNextTree);\r
 }\r
 \r
+\r
+void CBrowseRefsDlg::OnTvnSelchangedTreeRef(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+       LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);\r
+       *pResult = 0;\r
+\r
+       FillListCtrlForTreeNode(pNMTreeView->itemNew.hItem);\r
+}\r
+\r
+void CBrowseRefsDlg::FillListCtrlForTreeNode(HTREEITEM treeNode)\r
+{\r
+       m_ListRefLeafs.DeleteAllItems();\r
+\r
+       CShadowTree* pTree=(CShadowTree*)(m_RefTreeCtrl.GetItemData(treeNode));\r
+       if(pTree==NULL)\r
+       {\r
+               ASSERT(FALSE);\r
+               return;\r
+       }\r
+       FillListCtrlForShadowTree(pTree,L"",true);\r
+}\r
+\r
+void CBrowseRefsDlg::FillListCtrlForShadowTree(CShadowTree* pTree, CString refNamePrefix, bool isFirstLevel)\r
+{\r
+       if(pTree->IsLeaf())\r
+       {\r
+               int indexItem=m_ListRefLeafs.InsertItem(m_ListRefLeafs.GetItemCount(),L"");\r
+\r
+               m_ListRefLeafs.SetItemData(indexItem,(DWORD_PTR)pTree);\r
+               m_ListRefLeafs.SetItemText(indexItem,0,refNamePrefix+pTree->m_csName);\r
+               m_ListRefLeafs.SetItemText(indexItem,3,pTree->m_csRef);\r
+       }\r
+       else\r
+       {\r
+\r
+               CString csThisName;\r
+               if(!isFirstLevel)\r
+                       csThisName=refNamePrefix+pTree->m_csName+L"/";\r
+               for(CShadowTree::TShadowTreeMap::iterator itSubTree=pTree->m_ShadowTree.begin(); itSubTree!=pTree->m_ShadowTree.end(); ++itSubTree)\r
+               {\r
+                       FillListCtrlForShadowTree(&itSubTree->second,csThisName,false);\r
+               }\r
+       }\r
+}\r
index ce31d63..d1a1f4b 100644 (file)
@@ -14,6 +14,8 @@ public:
        \r
        CShadowTree*    GetNextSub(CString& nameLeft);\r
 \r
+       bool                    IsLeaf()const {return m_ShadowTree.empty();}\r
+\r
 \r
        CString                 m_csName;\r
        CString                 m_csRef;\r
@@ -43,12 +45,19 @@ public:
        afx_msg void OnBnClickedOk();\r
        virtual BOOL OnInitDialog();\r
 \r
-       void            Refresh();\r
+       void                    Refresh();\r
 \r
        CShadowTree&    GetTreeNode(CString refName, CShadowTree* pTreePos=NULL);\r
 \r
+       void                    FillListCtrlForTreeNode(HTREEITEM treeNode);\r
+\r
+       void                    FillListCtrlForShadowTree(CShadowTree* pTree, CString refNamePrefix, bool isFirstLevel);\r
+\r
+private:\r
        MAP_HASH_NAME   m_RefMap;\r
 \r
        CShadowTree             m_TreeRoot;\r
        CTreeCtrl               m_RefTreeCtrl;\r
+       CListCtrl               m_ListRefLeafs;\r
+       afx_msg void OnTvnSelchangedTreeRef(NMHDR *pNMHDR, LRESULT *pResult);\r
 };\r
index 2d4a6a6..4af780c 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ