1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013 - 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.
21 // MainFrm.cpp : implementation of the CMainFrame class
25 #include "TortoiseGitBlame.h"
26 #include "MenuEncode.h"
28 #include "TaskbarUUID.h"
36 IMPLEMENT_DYNCREATE(CMainFrame
, CFrameWndEx
)
38 const int iMaxUserToolbars
= 10;
39 const UINT uiFirstUserToolBarId
= AFX_IDW_CONTROLBAR_FIRST
+ 40;
40 const UINT uiLastUserToolBarId
= uiFirstUserToolBarId
+ iMaxUserToolbars
- 1;
41 const UINT TaskBarButtonCreated
= RegisterWindowMessage(L
"TaskbarButtonCreated");
43 BEGIN_MESSAGE_MAP(CMainFrame
, CFrameWndEx
)
45 // Global help commands
46 ON_COMMAND(ID_HELP_FINDER
, &CFrameWndEx::OnHelpFinder
)
47 ON_UPDATE_COMMAND_UI(ID_HELP_FINDER
, &CMainFrame::OnUpdateHelpFinder
)
48 ON_COMMAND(ID_HELP
, &CFrameWndEx::OnHelp
)
49 ON_COMMAND(ID_CONTEXT_HELP
, &CFrameWndEx::OnContextHelp
)
50 ON_COMMAND(ID_DEFAULT_HELP
, &CFrameWndEx::OnHelpFinder
)
51 ON_COMMAND(ID_VIEW_CUSTOMIZE
, &CMainFrame::OnViewCustomize
)
52 ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR
, &CMainFrame::OnToolbarCreateNew
)
53 ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000
, ID_VIEW_APPLOOK_OFF_2007_AQUA
, &CMainFrame::OnApplicationLook
)
54 ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000
, ID_VIEW_APPLOOK_OFF_2007_AQUA
, &CMainFrame::OnUpdateApplicationLook
)
55 ON_REGISTERED_MESSAGE(TaskBarButtonCreated
, &CMainFrame::OnTaskbarButtonCreated
)
58 static UINT indicators
[] =
60 ID_SEPARATOR
, // status line indicator
61 ID_INDICATOR_ENCODING
,
65 // CMainFrame construction/destruction
67 CMainFrame::CMainFrame()
69 theApp
.m_nAppLook
= theApp
.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2005
);
72 CMainFrame::~CMainFrame()
76 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct
)
78 if (CFrameWndEx::OnCreate(lpCreateStruct
) == -1)
82 // set the visual manager and style based on persisted value
83 OnApplicationLook(theApp
.m_nAppLook
);
85 if (!m_wndMenuBar
.Create(this))
87 TRACE0("Failed to create menubar\n");
88 return -1; // fail to create
91 m_wndMenuBar
.SetPaneStyle(m_wndMenuBar
.GetPaneStyle() | CBRS_SIZE_DYNAMIC
| CBRS_TOOLTIPS
| CBRS_FLYBY
);
93 // prevent the menu bar from taking the focus on activation
94 CMFCPopupMenu::SetForceMenuFocus(FALSE
);
96 if (!m_wndToolBar
.CreateEx(this, TBSTYLE_FLAT
, WS_CHILD
| WS_VISIBLE
| CBRS_TOP
| CBRS_GRIPPER
| CBRS_TOOLTIPS
| CBRS_FLYBY
| CBRS_SIZE_DYNAMIC
) ||
97 !m_wndToolBar
.LoadToolBar(theApp
.m_bHiColorIcons
? IDR_TORTOISE_GIT_BLAME_MAINFRAME_256
: IDR_TORTOISE_GIT_BLAME_MAINFRAME
))
99 TRACE0("Failed to create toolbar\n");
100 return -1; // fail to create
103 CString strToolBarName
;
104 bNameValid
= strToolBarName
.LoadString(IDS_TOOLBAR_STANDARD
);
106 m_wndToolBar
.SetWindowText(strToolBarName
);
108 CString strCustomize
;
109 bNameValid
= strCustomize
.LoadString(IDS_TOOLBAR_CUSTOMIZE
);
111 m_wndToolBar
.EnableCustomizeButton(TRUE
, ID_VIEW_CUSTOMIZE
, strCustomize
);
113 // Allow user-defined toolbars operations:
114 InitUserToolbars(NULL
, uiFirstUserToolBarId
, uiLastUserToolBarId
);
116 if (!m_wndStatusBar
.Create(this))
118 TRACE0("Failed to create status bar\n");
119 return -1; // fail to create
121 m_wndStatusBar
.SetIndicators(indicators
, _countof(indicators
));
123 // Delete these five lines if you don't want the toolbar and menubar to be dockable
124 m_wndMenuBar
.EnableDocking(CBRS_ALIGN_ANY
);
125 m_wndToolBar
.EnableDocking(CBRS_ALIGN_ANY
);
126 EnableDocking(CBRS_ALIGN_ANY
);
127 DockPane(&m_wndMenuBar
);
128 DockPane(&m_wndToolBar
);
131 // enable Visual Studio 2005 style docking window behavior
132 CDockingManager::SetDockingMode(DT_SMART
);
133 // enable Visual Studio 2005 style docking window auto-hide behavior
134 EnableAutoHidePanes(CBRS_ALIGN_ANY
);
136 // create docking windows
137 if (!CreateDockingWindows())
139 TRACE0("Failed to create docking windows\n");
143 m_wndOutput
.EnableDocking(CBRS_ALIGN_ANY
);
144 DockPane(&m_wndOutput
);
145 m_wndProperties
.EnableDocking(CBRS_ALIGN_ANY
);
146 DockPane(&m_wndProperties
);
149 // Enable toolbar and docking window menu replacement
150 EnablePaneMenu(TRUE
, ID_VIEW_CUSTOMIZE
, strCustomize
, ID_VIEW_TOOLBAR
);
152 // enable quick (Alt+drag) toolbar customization
153 CMFCToolBar::EnableQuickCustomization();
158 LRESULT
CMainFrame::OnTaskbarButtonCreated(WPARAM
/*wParam*/, LPARAM
/*lParam*/)
160 SetUUIDOverlayIcon(m_hWnd
);
164 BOOL
CMainFrame::PreCreateWindow(CREATESTRUCT
& cs
)
166 if( !CFrameWndEx::PreCreateWindow(cs
) )
168 // TODO: Modify the Window class or styles here by modifying
169 // the CREATESTRUCT cs
174 BOOL
CMainFrame::CreateDockingWindows()
177 // Create output window
178 CString strOutputWnd
;
179 bNameValid
= strOutputWnd
.LoadString(IDS_OUTPUT_WND
);
181 if (!m_wndOutput
.Create(strOutputWnd
, this, CRect(0, 0, 100, 100), TRUE
, ID_VIEW_OUTPUTWND
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| CBRS_BOTTOM
| CBRS_FLOAT_MULTI
))
183 TRACE0("Failed to create Output window\n");
184 return FALSE
; // failed to create
187 // Create properties window
188 CString strPropertiesWnd
;
189 bNameValid
= strPropertiesWnd
.LoadString(IDS_PROPERTIES_WND
);
191 if (!m_wndProperties
.Create(strPropertiesWnd
, this, CRect(0, 0, 200, 200), TRUE
, ID_VIEW_PROPERTIESWND
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| CBRS_RIGHT
| CBRS_FLOAT_MULTI
))
193 TRACE0("Failed to create Properties window\n");
194 return FALSE
; // failed to create
197 SetDockingWindowIcons(theApp
.m_bHiColorIcons
);
201 void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons
)
203 HICON hOutputBarIcon
= (HICON
) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons
? IDI_OUTPUT_WND_HC
: IDI_OUTPUT_WND
), IMAGE_ICON
, ::GetSystemMetrics(SM_CXSMICON
), ::GetSystemMetrics(SM_CYSMICON
), 0);
204 m_wndOutput
.SetIcon(hOutputBarIcon
, FALSE
);
206 HICON hPropertiesBarIcon
= (HICON
) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons
? IDI_PROPERTIES_WND_HC
: IDI_PROPERTIES_WND
), IMAGE_ICON
, ::GetSystemMetrics(SM_CXSMICON
), ::GetSystemMetrics(SM_CYSMICON
), 0);
207 m_wndProperties
.SetIcon(hPropertiesBarIcon
, FALSE
);
211 // CMainFrame diagnostics
214 void CMainFrame::AssertValid() const
216 CFrameWndEx::AssertValid();
219 void CMainFrame::Dump(CDumpContext
& dc
) const
221 CFrameWndEx::Dump(dc
);
226 // CMainFrame message handlers
228 void CMainFrame::OnUpdateHelpFinder(CCmdUI
*pCmdUI
)
230 pCmdUI
->Enable(FALSE
);
233 void CMainFrame::OnViewCustomize()
235 CMFCToolBarsCustomizeDialog
* pDlgCust
= new CMFCToolBarsCustomizeDialog(this, TRUE
/* scan menus */);
236 pDlgCust
->EnableUserDefinedToolbars();
240 LRESULT
CMainFrame::OnToolbarCreateNew(WPARAM wp
,LPARAM lp
)
242 LRESULT lres
= CFrameWndEx::OnToolbarCreateNew(wp
,lp
);
248 CMFCToolBar
* pUserToolbar
= (CMFCToolBar
*)lres
;
249 ASSERT_VALID(pUserToolbar
);
252 CString strCustomize
;
253 bNameValid
= strCustomize
.LoadString(IDS_TOOLBAR_CUSTOMIZE
);
256 pUserToolbar
->EnableCustomizeButton(TRUE
, ID_VIEW_CUSTOMIZE
, strCustomize
);
260 void CMainFrame::OnApplicationLook(UINT id
)
264 theApp
.m_nAppLook
= id
;
266 switch (theApp
.m_nAppLook
)
268 case ID_VIEW_APPLOOK_WIN_2000
:
269 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager
));
272 case ID_VIEW_APPLOOK_OFF_XP
:
273 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP
));
276 case ID_VIEW_APPLOOK_WIN_XP
:
277 CMFCVisualManagerWindows::m_b3DTabsXPTheme
= TRUE
;
278 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows
));
281 case ID_VIEW_APPLOOK_OFF_2003
:
282 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003
));
283 CDockingManager::SetDockingMode(DT_SMART
);
286 case ID_VIEW_APPLOOK_VS_2005
:
287 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005
));
288 CDockingManager::SetDockingMode(DT_SMART
);
291 case ID_VIEW_APPLOOK_VS_2008
:
292 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008
));
293 CDockingManager::SetDockingMode(DT_SMART
);
296 case ID_VIEW_APPLOOK_WIN7
:
297 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7
));
298 CDockingManager::SetDockingMode(DT_SMART
);
302 switch (theApp
.m_nAppLook
)
304 case ID_VIEW_APPLOOK_OFF_2007_BLUE
:
305 CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue
);
308 case ID_VIEW_APPLOOK_OFF_2007_BLACK
:
309 CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack
);
312 case ID_VIEW_APPLOOK_OFF_2007_SILVER
:
313 CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver
);
316 case ID_VIEW_APPLOOK_OFF_2007_AQUA
:
317 CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua
);
321 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007
));
322 CDockingManager::SetDockingMode(DT_SMART
);
325 RedrawWindow(NULL
, NULL
, RDW_ALLCHILDREN
| RDW_INVALIDATE
| RDW_UPDATENOW
| RDW_FRAME
| RDW_ERASE
);
327 theApp
.WriteInt(_T("ApplicationLook"), theApp
.m_nAppLook
);
330 void CMainFrame::OnUpdateApplicationLook(CCmdUI
* pCmdUI
)
333 pCmdUI
->SetRadio(theApp
.m_nAppLook
== pCmdUI
->m_nID
);
336 BOOL
CMainFrame::LoadFrame(UINT nIDResource
, DWORD dwDefaultStyle
, CWnd
* pParentWnd
, CCreateContext
* pContext
)
338 // base class does the real work
340 if (!CFrameWndEx::LoadFrame(nIDResource
, dwDefaultStyle
, pParentWnd
, pContext
))
345 // enable customization button for all user toolbars
347 CString strCustomize
;
348 bNameValid
= strCustomize
.LoadString(IDS_TOOLBAR_CUSTOMIZE
);
351 for (int i
= 0; i
< iMaxUserToolbars
; ++i
)
353 CMFCToolBar
* pUserToolbar
= GetUserToolBarByIndex(i
);
354 if (pUserToolbar
!= NULL
)
356 pUserToolbar
->EnableCustomizeButton(TRUE
, ID_VIEW_CUSTOMIZE
, strCustomize
);