\r
// CBrowseRefsDlg dialog\r
\r
-IMPLEMENT_DYNAMIC(CBrowseRefsDlg, CDialog)\r
+IMPLEMENT_DYNAMIC(CBrowseRefsDlg, CResizableStandAloneDialog)\r
\r
CBrowseRefsDlg::CBrowseRefsDlg(CWnd* pParent /*=NULL*/)\r
- : CDialog(CBrowseRefsDlg::IDD, pParent)\r
+ : CResizableStandAloneDialog(CBrowseRefsDlg::IDD, pParent)\r
{\r
\r
}\r
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, CDialog)\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
\r
BOOL CBrowseRefsDlg::OnInitDialog()\r
{\r
- CDialog::OnInitDialog();\r
+ CResizableStandAloneDialog::OnInitDialog();\r
+\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
\r
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
treeLeaf.m_csRef=iterRefName->second;\r
}\r
\r
- m_RefTreeCtrl.Expand(m_TreeRoot.m_hTree,TVE_EXPAND);\r
+ CString currHead;\r
+ g_Git.Run(L"git symbolic-ref HEAD",&currHead,CP_UTF8);\r
+\r
+ currHead.Trim(L"\r\n\t ");\r
+\r
+ if(!SelectRef(currHead))\r
+ //Probably not on a branch. Select root node.\r
+ m_RefTreeCtrl.Expand(m_TreeRoot.m_hTree,TVE_EXPAND);\r
+\r
+}\r
+\r
+bool CBrowseRefsDlg::SelectRef(CString refName)\r
+{\r
+ if(wcsnicmp(refName,L"refs/",5)!=0)\r
+ return false; // Not a ref name\r
+\r
+ CShadowTree& treeLeafHead=GetTreeNode(refName);\r
+ if(treeLeafHead.m_pParent==NULL)\r
+ return false; //Weird... should not occur.\r
+\r
+ //This is the current head.\r
+ m_RefTreeCtrl.Select(treeLeafHead.m_pParent->m_hTree,TVGN_CARET);\r
+\r
+ for(int indexPos = 0; indexPos < m_ListRefLeafs.GetItemCount(); ++indexPos)\r
+ {\r
+ CShadowTree* pCurrShadowTree = (CShadowTree*)m_ListRefLeafs.GetItemData(indexPos);\r
+ if(pCurrShadowTree == &treeLeafHead)\r
+ {\r
+ m_ListRefLeafs.SetItemState(indexPos,LVIS_SELECTED,LVIS_SELECTED);\r
+ }\r
+ }\r
\r
+ return true;\r
}\r
\r
CShadowTree& CBrowseRefsDlg::GetTreeNode(CString refName, CShadowTree* pTreePos)\r
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