From e3f978319bd1eb46d713bce11554651edf67d554 Mon Sep 17 00:00:00 2001 From: Sup Yut Sum Date: Mon, 30 Jun 2014 23:53:10 +0800 Subject: [PATCH] Add ad-hoc tab mode combobox in ribbon status bar Based on TortoiseSVN revision 25628 Signed-off-by: Sup Yut Sum --- src/TortoiseMerge/BaseView.cpp | 24 +++++++++- src/TortoiseMerge/BaseView.h | 4 ++ src/TortoiseMerge/MainFrm.cpp | 104 +++++++++++++++++++++++++++++++++++++++++ src/TortoiseMerge/MainFrm.h | 16 ++++++- src/TortoiseMerge/resource.h | 6 +++ 5 files changed, 152 insertions(+), 2 deletions(-) diff --git a/src/TortoiseMerge/BaseView.cpp b/src/TortoiseMerge/BaseView.cpp index b352ef2f4..32944fbfe 100644 --- a/src/TortoiseMerge/BaseView.cpp +++ b/src/TortoiseMerge/BaseView.cpp @@ -262,6 +262,19 @@ void CBaseView::DocumentUpdated() Invalidate(); } +static CString GetTabModeString(int nTabMode, int nTabSize) +{ + CString text; + if (nTabMode & TABMODE_USESPACES) + text = L"Space"; + else + text = L"Tab"; + text.AppendFormat(L" %d", nTabSize); + if (nTabMode & TABMODE_SMARTINDENT) + text += L" Smart"; + return text; +} + void CBaseView::UpdateStatusBar() { int nRemovedLines = 0; @@ -380,6 +393,9 @@ void CBaseView::UpdateStatusBar() pButton = new CMFCRibbonButton(ID_INDICATOR_BOTTOMVIEWCOMBOEOL, L""); m_pMainFrame->FillEOLButton(pButton, ID_INDICATOR_BOTTOMEOLSTART); apBtnGroupBottom->AddButton(pButton); + pButton = new CMFCRibbonButton(ID_INDICATOR_BOTTOMVIEWCOMBOTABMODE, L""); + m_pMainFrame->FillEOLButton(pButton, ID_INDICATOR_BOTTOMTABMODESTART); + apBtnGroupBottom->AddButton(pButton); apBtnGroupBottom->AddButton(new CMFCRibbonStatusBarPane(ID_INDICATOR_BOTTOMVIEW, L"", TRUE)); m_pwndRibbonStatusBar->AddExtendedElement(apBtnGroupBottom.release(), L""); } @@ -387,7 +403,7 @@ void CBaseView::UpdateStatusBar() CMFCRibbonButtonsGroup * pGroup = DYNAMIC_DOWNCAST(CMFCRibbonButtonsGroup, m_pwndRibbonStatusBar->FindByID(m_nStatusBarID)); if (pGroup) { - CMFCRibbonStatusBarPane* pPane = DYNAMIC_DOWNCAST(CMFCRibbonStatusBarPane, pGroup->GetButton(3)); + CMFCRibbonStatusBarPane* pPane = DYNAMIC_DOWNCAST(CMFCRibbonStatusBarPane, pGroup->GetButton(4)); if (pPane) { pPane->SetText(sBarText); @@ -404,6 +420,12 @@ void CBaseView::UpdateStatusBar() pButton->SetText(GetEolName(m_lineendings)); pButton->SetDescription(GetEolName(m_lineendings)); } + pButton = DYNAMIC_DOWNCAST(CMFCRibbonButton, pGroup->GetButton(3)); + if (pButton) + { + pButton->SetText(GetTabModeString(m_nTabMode, m_nTabSize)); + pButton->SetDescription(GetTabModeString(m_nTabMode, m_nTabSize)); + } } m_pwndRibbonStatusBar->RecalcLayout(); m_pwndRibbonStatusBar->Invalidate(); diff --git a/src/TortoiseMerge/BaseView.h b/src/TortoiseMerge/BaseView.h index 16dd6be98..6dbd3349a 100644 --- a/src/TortoiseMerge/BaseView.h +++ b/src/TortoiseMerge/BaseView.h @@ -272,6 +272,10 @@ public: // variables UnicodeType GetTextType() { return m_texttype; } void SetTextType(UnicodeType); ///< Changes TextType void AskUserForNewLineEndingsAndTextType(int); ///< Open gui + int GetTabMode() { return m_nTabMode; } + void SetTabMode(int nTabMode) { m_nTabMode = nTabMode; } + int GetTabSize() { return m_nTabSize; } + void SetTabSize(int nTabSize) { m_nTabSize = nTabSize; } CWorkingFile * m_pWorkingFile; ///< pointer to source/destination file parametrers diff --git a/src/TortoiseMerge/MainFrm.cpp b/src/TortoiseMerge/MainFrm.cpp index 2fd086bed..4fa231976 100644 --- a/src/TortoiseMerge/MainFrm.cpp +++ b/src/TortoiseMerge/MainFrm.cpp @@ -157,18 +157,27 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_COMMAND(ID_INDICATOR_LEFTVIEWCOMBOEOL, &CMainFrame::OnDummyEnabled) ON_COMMAND(ID_INDICATOR_RIGHTVIEWCOMBOEOL, &CMainFrame::OnDummyEnabled) ON_COMMAND(ID_INDICATOR_BOTTOMVIEWCOMBOEOL, &CMainFrame::OnDummyEnabled) + ON_COMMAND(ID_INDICATOR_LEFTVIEWCOMBOTABMODE, &CMainFrame::OnDummyEnabled) + ON_COMMAND(ID_INDICATOR_RIGHTVIEWCOMBOTABMODE, &CMainFrame::OnDummyEnabled) + ON_COMMAND(ID_INDICATOR_BOTTOMVIEWCOMBOTABMODE, &CMainFrame::OnDummyEnabled) ON_COMMAND_RANGE(ID_INDICATOR_LEFTENCODINGSTART, ID_INDICATOR_LEFTENCODINGSTART+19, &CMainFrame::OnEncodingLeft) ON_COMMAND_RANGE(ID_INDICATOR_RIGHTENCODINGSTART, ID_INDICATOR_RIGHTENCODINGSTART+19, &CMainFrame::OnEncodingRight) ON_COMMAND_RANGE(ID_INDICATOR_BOTTOMENCODINGSTART, ID_INDICATOR_BOTTOMENCODINGSTART+19, &CMainFrame::OnEncodingBottom) ON_COMMAND_RANGE(ID_INDICATOR_LEFTEOLSTART, ID_INDICATOR_LEFTEOLSTART+19, &CMainFrame::OnEOLLeft) ON_COMMAND_RANGE(ID_INDICATOR_RIGHTEOLSTART, ID_INDICATOR_RIGHTEOLSTART+19, &CMainFrame::OnEOLRight) ON_COMMAND_RANGE(ID_INDICATOR_BOTTOMEOLSTART, ID_INDICATOR_BOTTOMEOLSTART+19, &CMainFrame::OnEOLBottom) + ON_COMMAND_RANGE(ID_INDICATOR_LEFTTABMODESTART, ID_INDICATOR_LEFTTABMODESTART+19, &CMainFrame::OnTabModeLeft) + ON_COMMAND_RANGE(ID_INDICATOR_RIGHTTABMODESTART, ID_INDICATOR_RIGHTTABMODESTART+19, &CMainFrame::OnTabModeRight) + ON_COMMAND_RANGE(ID_INDICATOR_BOTTOMTABMODESTART, ID_INDICATOR_BOTTOMTABMODESTART+19, &CMainFrame::OnTabModeBottom) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_LEFTENCODINGSTART, ID_INDICATOR_LEFTENCODINGSTART+19, &CMainFrame::OnUpdateEncodingLeft) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_RIGHTENCODINGSTART, ID_INDICATOR_RIGHTENCODINGSTART+19, &CMainFrame::OnUpdateEncodingRight) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_BOTTOMENCODINGSTART, ID_INDICATOR_BOTTOMENCODINGSTART+19, &CMainFrame::OnUpdateEncodingBottom) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_LEFTEOLSTART, ID_INDICATOR_LEFTEOLSTART+19, &CMainFrame::OnUpdateEOLLeft) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_RIGHTEOLSTART, ID_INDICATOR_RIGHTEOLSTART+19, &CMainFrame::OnUpdateEOLRight) ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_BOTTOMEOLSTART, ID_INDICATOR_BOTTOMEOLSTART+19, &CMainFrame::OnUpdateEOLBottom) + ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_LEFTTABMODESTART, ID_INDICATOR_LEFTTABMODESTART+19, &CMainFrame::OnUpdateTabModeLeft) + ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_RIGHTTABMODESTART, ID_INDICATOR_RIGHTTABMODESTART+19, &CMainFrame::OnUpdateTabModeRight) + ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_BOTTOMTABMODESTART, ID_INDICATOR_BOTTOMTABMODESTART+19, &CMainFrame::OnUpdateTabModeBottom) END_MESSAGE_MAP() static UINT indicators[] = @@ -299,6 +308,9 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) pButton = new CMFCRibbonButton(ID_INDICATOR_LEFTVIEWCOMBOEOL, L""); FillEOLButton(pButton, ID_INDICATOR_LEFTEOLSTART); apBtnGroupLeft->AddButton(pButton); + pButton = new CMFCRibbonButton(ID_INDICATOR_LEFTVIEWCOMBOTABMODE, L""); + FillTabModeButton(pButton, ID_INDICATOR_LEFTTABMODESTART); + apBtnGroupLeft->AddButton(pButton); apBtnGroupLeft->AddButton(new CMFCRibbonStatusBarPane(ID_INDICATOR_LEFTVIEW, L"", TRUE)); m_wndRibbonStatusBar.AddExtendedElement(apBtnGroupLeft.release(), L""); @@ -311,6 +323,9 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) pButton = new CMFCRibbonButton(ID_INDICATOR_RIGHTVIEWCOMBOEOL, L""); FillEOLButton(pButton, ID_INDICATOR_RIGHTEOLSTART); apBtnGroupRight->AddButton(pButton); + pButton = new CMFCRibbonButton(ID_INDICATOR_RIGHTVIEWCOMBOTABMODE, L""); + FillTabModeButton(pButton, ID_INDICATOR_RIGHTTABMODESTART); + apBtnGroupRight->AddButton(pButton); apBtnGroupRight->AddButton(new CMFCRibbonStatusBarPane(ID_INDICATOR_RIGHTVIEW, L"", TRUE)); m_wndRibbonStatusBar.AddExtendedElement(apBtnGroupRight.release(), L""); } @@ -3347,6 +3362,20 @@ void CMainFrame::FillEOLButton( CMFCRibbonButton * pButton, int start ) pButton->AddSubItem(new CMFCRibbonButton(start + EOL::EOL_PS , L"PS" )); } +void CMainFrame::FillTabModeButton(CMFCRibbonButton * pButton, int start) +{ + pButton->SetDefaultCommand(FALSE); + pButton->AddSubItem(new CMFCRibbonButton(start + TABMODE_NONE , L"Tab")); + pButton->AddSubItem(new CMFCRibbonButton(start + TABMODE_USESPACES , L"Space")); + pButton->AddSubItem(new CMFCRibbonSeparator(TRUE)); + pButton->AddSubItem(new CMFCRibbonButton(start + TABMODE_SMARTINDENT , L"Smart tab char")); + pButton->AddSubItem(new CMFCRibbonSeparator(TRUE)); + pButton->AddSubItem(new CMFCRibbonButton(start + TABSIZEBUTTON1, L"1")); + pButton->AddSubItem(new CMFCRibbonButton(start + TABSIZEBUTTON2, L"2")); + pButton->AddSubItem(new CMFCRibbonButton(start + TABSIZEBUTTON4, L"4")); + pButton->AddSubItem(new CMFCRibbonButton(start + TABSIZEBUTTON8, L"8")); +} + void CMainFrame::OnEncodingLeft( UINT cmd ) { if (m_pwndLeftView) @@ -3401,6 +3430,41 @@ void CMainFrame::OnEOLBottom( UINT cmd ) } } +void CMainFrame::OnTabModeLeft( UINT cmd ) +{ + OnTabMode(m_pwndLeftView, (int)cmd - ID_INDICATOR_LEFTTABMODESTART); +} + +void CMainFrame::OnTabModeRight( UINT cmd ) +{ + OnTabMode(m_pwndRightView, (int)cmd - ID_INDICATOR_RIGHTTABMODESTART); +} + +void CMainFrame::OnTabModeBottom( UINT cmd ) +{ + OnTabMode(m_pwndBottomView, (int)cmd - ID_INDICATOR_BOTTOMTABMODESTART); +} + +void CMainFrame::OnTabMode(CBaseView *view, int cmd) +{ + if (!view) + return; + int nTabMode = view->GetTabMode(); + if (cmd == TABMODE_NONE || cmd == TABMODE_USESPACES) + view->SetTabMode((nTabMode & (~TABMODE_USESPACES)) | (cmd & TABMODE_USESPACES)); + else if (cmd == TABMODE_SMARTINDENT) // Toggle + view->SetTabMode((nTabMode & (~TABMODE_SMARTINDENT)) | (nTabMode & TABMODE_SMARTINDENT ? 0 : TABMODE_SMARTINDENT)); + else if (cmd == TABSIZEBUTTON1) + view->SetTabSize(1); + else if (cmd == TABSIZEBUTTON2) + view->SetTabSize(2); + else if (cmd == TABSIZEBUTTON4) + view->SetTabSize(4); + else if (cmd == TABSIZEBUTTON8) + view->SetTabSize(8); + view->RefreshViews(); +} + void CMainFrame::OnUpdateEncodingLeft( CCmdUI *pCmdUI ) { if (m_pwndLeftView) @@ -3466,3 +3530,43 @@ void CMainFrame::OnUpdateEOLBottom( CCmdUI *pCmdUI ) else pCmdUI->Enable(FALSE); } + +void CMainFrame::OnUpdateTabModeLeft(CCmdUI *pCmdUI) +{ + OnUpdateTabMode(m_pwndLeftView, pCmdUI, ID_INDICATOR_LEFTTABMODESTART); +} + +void CMainFrame::OnUpdateTabModeRight(CCmdUI *pCmdUI) +{ + OnUpdateTabMode(m_pwndRightView, pCmdUI, ID_INDICATOR_RIGHTTABMODESTART); +} + +void CMainFrame::OnUpdateTabModeBottom(CCmdUI *pCmdUI) +{ + OnUpdateTabMode(m_pwndBottomView, pCmdUI, ID_INDICATOR_BOTTOMTABMODESTART); +} + +void CMainFrame::OnUpdateTabMode(CBaseView *view, CCmdUI *pCmdUI, int startid) +{ + if (view) + { + int cmd = (int)pCmdUI->m_nID - startid; + if (cmd == TABMODE_NONE) + pCmdUI->SetCheck((view->GetTabMode() & TABMODE_USESPACES) == TABMODE_NONE); + else if (cmd == TABMODE_USESPACES) + pCmdUI->SetCheck(view->GetTabMode() & TABMODE_USESPACES); + else if (cmd == TABMODE_SMARTINDENT) + pCmdUI->SetCheck(view->GetTabMode() & TABMODE_SMARTINDENT); + else if (cmd == TABSIZEBUTTON1) + pCmdUI->SetCheck(view->GetTabSize() == 1); + else if (cmd == TABSIZEBUTTON2) + pCmdUI->SetCheck(view->GetTabSize() == 2); + else if (cmd == TABSIZEBUTTON4) + pCmdUI->SetCheck(view->GetTabSize() == 4); + else if (cmd == TABSIZEBUTTON8) + pCmdUI->SetCheck(view->GetTabSize() == 8); + pCmdUI->Enable(view->IsWritable()); + } + else + pCmdUI->Enable(FALSE); +} diff --git a/src/TortoiseMerge/MainFrm.h b/src/TortoiseMerge/MainFrm.h index f63dd6399..ac26b0764 100644 --- a/src/TortoiseMerge/MainFrm.h +++ b/src/TortoiseMerge/MainFrm.h @@ -1,7 +1,7 @@ // TortoiseGitMerge - a Diff/Patch program // Copyright (C) 2013 - TortoiseGit -// Copyright (C) 2006-2013 - TortoiseSVN +// Copyright (C) 2006-2014 - TortoiseSVN // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -39,6 +39,11 @@ class CBottomView; #define TABMODE_USESPACES 0x01 #define TABMODE_SMARTINDENT 0x02 +#define TABSIZEBUTTON1 3 +#define TABSIZEBUTTON2 4 +#define TABSIZEBUTTON4 5 +#define TABSIZEBUTTON8 6 + /** * \ingroup TortoiseMerge @@ -168,12 +173,18 @@ protected: afx_msg void OnEOLLeft(UINT cmd); afx_msg void OnEOLRight(UINT cmd); afx_msg void OnEOLBottom(UINT cmd); + afx_msg void OnTabModeLeft(UINT cmd); + afx_msg void OnTabModeRight(UINT cmd); + afx_msg void OnTabModeBottom(UINT cmd); afx_msg void OnUpdateEncodingLeft(CCmdUI *pCmdUI); afx_msg void OnUpdateEncodingRight(CCmdUI *pCmdUI); afx_msg void OnUpdateEncodingBottom(CCmdUI *pCmdUI); afx_msg void OnUpdateEOLLeft(CCmdUI *pCmdUI); afx_msg void OnUpdateEOLRight(CCmdUI *pCmdUI); afx_msg void OnUpdateEOLBottom(CCmdUI *pCmdUI); + afx_msg void OnUpdateTabModeLeft(CCmdUI *pCmdUI); + afx_msg void OnUpdateTabModeRight(CCmdUI *pCmdUI); + afx_msg void OnUpdateTabModeBottom(CCmdUI *pCmdUI); DECLARE_MESSAGE_MAP() protected: @@ -208,6 +219,8 @@ protected: int CheckForSave(ECheckForSaveReason eReason/* = CHFSR_SWITCH*/); void OnViewLineUpDown(int direction); void OnViewLineLeftRight(int direction); + static void OnTabMode(CBaseView *view, int cmd); + static void OnUpdateTabMode(CBaseView *view, CCmdUI *pCmdUI, int startid); bool HasConflictsWontKeep(); bool TryGetFileName(CString& result); CBaseView* GetActiveBaseView() const; @@ -282,6 +295,7 @@ public: const CMFCToolBar * GetToolbar() const { return &m_wndToolBar; } void FillEncodingButton( CMFCRibbonButton * pButton, int start ); void FillEOLButton( CMFCRibbonButton * pButton, int start ); + void FillTabModeButton(CMFCRibbonButton * pButton, int start); CMFCMenuBar m_wndMenuBar; CMFCToolBar m_wndToolBar; }; \ No newline at end of file diff --git a/src/TortoiseMerge/resource.h b/src/TortoiseMerge/resource.h index f2c0c4743..eee1045ca 100644 --- a/src/TortoiseMerge/resource.h +++ b/src/TortoiseMerge/resource.h @@ -218,12 +218,18 @@ #define ID_INDICATOR_LEFTVIEWCOMBOEOL 2020 #define ID_INDICATOR_RIGHTVIEWCOMBOEOL 2021 #define ID_INDICATOR_BOTTOMVIEWCOMBOEOL 2022 +#define ID_INDICATOR_LEFTVIEWCOMBOTABMODE 2030 +#define ID_INDICATOR_RIGHTVIEWCOMBOTABMODE 2031 +#define ID_INDICATOR_BOTTOMVIEWCOMBOTABMODE 2032 #define ID_INDICATOR_LEFTENCODINGSTART 2100 #define ID_INDICATOR_RIGHTENCODINGSTART 2120 #define ID_INDICATOR_BOTTOMENCODINGSTART 2140 #define ID_INDICATOR_LEFTEOLSTART 2200 #define ID_INDICATOR_RIGHTEOLSTART 2220 #define ID_INDICATOR_BOTTOMEOLSTART 2240 +#define ID_INDICATOR_LEFTTABMODESTART 2300 +#define ID_INDICATOR_RIGHTTABMODESTART 2320 +#define ID_INDICATOR_BOTTOMTABMODESTART 2340 #define IDS_COMMONFILEFILTER 2500 #define IDS_PATCHFILEFILTER 2501 #define IDS_PATCH_SEARCHPATHTITLE 2700 -- 2.11.4.GIT