1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2011 - 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.
23 #include "OutputWnd.h"
26 #include "TortoiseGitBlameDoc.h"
27 #include "TortoiseGitBlameView.h"
32 static char THIS_FILE
[] = __FILE__
;
35 /////////////////////////////////////////////////////////////////////////////
38 COutputWnd::COutputWnd()
42 COutputWnd::~COutputWnd()
46 IMPLEMENT_DYNCREATE(CGitMFCTabCtrl
, CMFCTabCtrl
)
48 BEGIN_MESSAGE_MAP(CGitMFCTabCtrl
, CMFCTabCtrl
)
49 ON_NOTIFY(LVN_ITEMCHANGED
, 0, OnLvnItemchangedLoglist
)
52 void CGitMFCTabCtrl::OnLvnItemchangedLoglist(NMHDR
*pNMHDR
, LRESULT
*pResult
)
54 COutputWnd
*pWnd
=DYNAMIC_DOWNCAST(COutputWnd
,this->GetParent());
55 pWnd
->OnLvnItemchangedLoglist(pNMHDR
,pResult
);
58 IMPLEMENT_DYNAMIC(COutputWnd
, CDockablePane
)
60 BEGIN_MESSAGE_MAP(COutputWnd
, CDockablePane
)
63 ON_NOTIFY(LVN_ITEMCHANGED
, 0, OnLvnItemchangedLoglist
)
66 int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct
)
68 if (CDockablePane::OnCreate(lpCreateStruct
) == -1)
71 TRACE(_T("%u\n"),LVN_ITEMCHANGED
);
72 m_Font
.CreateStockObject(DEFAULT_GUI_FONT
);
75 rectDummy
.SetRectEmpty();
77 // Create tabs window:
78 if (!m_wndTabs
.Create(CMFCTabCtrl::STYLE_FLAT
, rectDummy
, this, 0))
80 TRACE0("Failed to create output tab window\n");
81 return -1; // fail to create
84 // Create output panes:
85 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
86 const DWORD dwStyle
=LVS_REPORT
| LVS_SHOWSELALWAYS
| LVS_ALIGNLEFT
| LVS_OWNERDATA
| WS_BORDER
| WS_TABSTOP
|LVS_SINGLESEL
|WS_CHILD
| WS_VISIBLE
;
88 if (! m_LogList
.Create(dwStyle
,rectDummy
,&m_wndTabs
,0) )
90 TRACE0("Failed to create output windows\n");
91 return -1; // fail to create
94 if (!m_wndOutputBuild
.Create(dwStyle
, rectDummy
, &m_wndTabs
, 2) ||
95 !m_wndOutputDebug
.Create(dwStyle
, rectDummy
, &m_wndTabs
, 3) ||
96 !m_wndOutputFind
.Create(dwStyle
, rectDummy
, &m_wndTabs
, 4))
98 TRACE0("Failed to create output windows\n");
99 return -1; // fail to create
103 m_LogList
.SetFont(&m_Font
);
104 //m_wndOutputBuild.SetFont(&m_Font);
105 //m_wndOutputDebug.SetFont(&m_Font);
106 //m_wndOutputFind.SetFont(&m_Font);
111 // Attach list windows to tab:
112 bNameValid
= strTabName
.LoadString(IDS_GIT_LOG_TAB
);
115 m_wndTabs
.AddTab(&m_LogList
, strTabName
, (UINT
)0);
117 m_LogList
.m_IsIDReplaceAction
=TRUE
;
118 m_LogList
.DeleteAllItems();
119 m_LogList
.m_ColumnRegKey
=_T("Blame");
120 m_LogList
.InsertGitColumn();
122 m_LogList
.hideUnimplementedCommands();
125 bNameValid
= strTabName
.LoadString(IDS_DEBUG_TAB
);
127 m_wndTabs
.AddTab(&m_wndOutputDebug
, strTabName
, (UINT
)1);
128 bNameValid
= strTabName
.LoadString(IDS_FIND_TAB
);
130 m_wndTabs
.AddTab(&m_wndOutputFind
, strTabName
, (UINT
)2);
133 // Fill output tabs with some dummy text (nothing magic here)
135 // FillDebugWindow();
138 this->SetWindowTextW(_T("Git Log"));
142 void COutputWnd::OnSize(UINT nType
, int cx
, int cy
)
144 CDockablePane::OnSize(nType
, cx
, cy
);
146 // Tab control should cover the whole client area:
147 m_wndTabs
.SetWindowPos (NULL
, -1, -1, cx
, cy
, SWP_NOMOVE
| SWP_NOACTIVATE
| SWP_NOZORDER
);
150 void COutputWnd::AdjustHorzScroll(CListBox
& wndListBox
)
153 CFont
* pOldFont
= dc
.SelectObject(&m_Font
);
157 for (int i
= 0; i
< wndListBox
.GetCount(); i
++)
160 wndListBox
.GetText(i
, strItem
);
162 cxExtentMax
= max(cxExtentMax
, dc
.GetTextExtent(strItem
).cx
);
165 wndListBox
.SetHorizontalExtent(cxExtentMax
);
166 dc
.SelectObject(pOldFont
);
169 void COutputWnd::FillBuildWindow()
171 // m_wndOutputBuild.AddString(_T("Build output is being displayed here."));
172 // m_wndOutputBuild.AddString(_T("The output is being displayed in rows of a list view"));
173 // m_wndOutputBuild.AddString(_T("but you can change the way it is displayed as you wish..."));
176 void COutputWnd::FillDebugWindow()
178 // m_wndOutputDebug.AddString(_T("Debug output is being displayed here."));
179 // m_wndOutputDebug.AddString(_T("The output is being displayed in rows of a list view"));
180 // m_wndOutputDebug.AddString(_T("but you can change the way it is displayed as you wish..."));
183 void COutputWnd::FillFindWindow()
185 // m_wndOutputFind.AddString(_T("Find output is being displayed here."));
186 // m_wndOutputFind.AddString(_T("The output is being displayed in rows of a list view"));
187 // m_wndOutputFind.AddString(_T("but you can change the way it is displayed as you wish..."));
190 int COutputWnd::LoadHistory(CString filename
, bool follow
)
192 m_LogList
.ReloadHashMap();
194 path
.SetFromGit(filename
);
197 m_LogList
.FillGitLog(&path
, follow
? CGit::LOG_INFO_FOLLOW
: 0);
198 m_LogList
.UpdateProjectProperties();
202 void COutputWnd::OnLvnItemchangedLoglist(NMHDR
*pNMHDR
, LRESULT
*pResult
)
204 LPNMLISTVIEW pNMLV
= reinterpret_cast<LPNMLISTVIEW
>(pNMHDR
);
207 //if (this->IsThreadRunning())
208 if (pNMLV
->iItem
>= 0)
210 if (pNMLV
->iSubItem
!= 0)
213 if (pNMLV
->uNewState
& LVIS_SELECTED
)
215 CMainFrame
*pMain
=DYNAMIC_DOWNCAST(CMainFrame
,AfxGetApp()->GetMainWnd());
216 POSITION pos
=pMain
->GetActiveDocument()->GetFirstViewPosition();
217 CTortoiseGitBlameView
*pView
=DYNAMIC_DOWNCAST(CTortoiseGitBlameView
,pMain
->GetActiveDocument()->GetNextView(pos
));
218 pView
->FocusOn(&this->m_LogList
.m_logEntries
.GetGitRevAt(pNMLV
->iItem
));
222 /////////////////////////////////////////////////////////////////////////////
225 COutputList::COutputList()
229 COutputList::~COutputList()
233 BEGIN_MESSAGE_MAP(COutputList
, CListBox
)
235 ON_COMMAND(ID_EDIT_COPY
, OnEditCopy
)
236 ON_COMMAND(ID_EDIT_CLEAR
, OnEditClear
)
237 ON_COMMAND(ID_VIEW_OUTPUTWND
, OnViewOutput
)
238 ON_WM_WINDOWPOSCHANGING()
240 /////////////////////////////////////////////////////////////////////////////
241 // COutputList message handlers
243 void COutputList::OnContextMenu(CWnd
* /*pWnd*/, CPoint point
)
246 menu
.LoadMenu(IDR_OUTPUT_POPUP
);
248 CMenu
* pSumMenu
= menu
.GetSubMenu(0);
250 if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx
)))
252 CMFCPopupMenu
* pPopupMenu
= new CMFCPopupMenu
;
254 if (!pPopupMenu
->Create(this, point
.x
, point
.y
, (HMENU
)pSumMenu
->m_hMenu
, FALSE
, TRUE
))
257 ((CMDIFrameWndEx
*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu
);
258 UpdateDialogControls(this, FALSE
);
264 void COutputList::OnEditCopy()
266 MessageBox(_T("Copy output"));
269 void COutputList::OnEditClear()
271 MessageBox(_T("Clear output"));
274 void COutputList::OnViewOutput()
276 CDockablePane
* pParentBar
= DYNAMIC_DOWNCAST(CDockablePane
, GetOwner());
277 CMDIFrameWndEx
* pMainFrame
= DYNAMIC_DOWNCAST(CMDIFrameWndEx
, GetTopLevelFrame());
279 if (pMainFrame
!= NULL
&& pParentBar
!= NULL
)
281 pMainFrame
->SetFocus();
282 pMainFrame
->ShowPane(pParentBar
, FALSE
, FALSE
, FALSE
);
283 pMainFrame
->RecalcLayout();