Fixed issue #4141: Cannot remove remote: "usage: git remote remove <name>"
[TortoiseGit.git] / src / TortoiseMerge / LeftView.cpp
blob5b388d406343ee7386271f348d0d2feb24462d0f
1 // TortoiseGitMerge - a Diff/Patch program
3 // Copyright (C) 2023 - TortoiseGit
4 // Copyright (C) 2006-2013 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "resource.h"
22 #include "AppUtils.h"
24 #include "LeftView.h"
25 #include "BottomView.h"
27 IMPLEMENT_DYNCREATE(CLeftView, CBaseView)
29 CLeftView::CLeftView()
31 m_pwndLeft = this;
32 m_pState = &m_AllState.left;
33 m_nStatusBarID = ID_INDICATOR_LEFTVIEW;
36 CLeftView::~CLeftView()
41 void CLeftView::UseBothLeftFirst()
43 if (!IsRightViewGood())
44 return;
45 int nFirstViewLine = 0; // first view line in selection
46 int nLastViewLine = 0; // last view line in selection
48 if (!IsWritable())
49 return;
50 if (!GetViewSelection(nFirstViewLine, nLastViewLine))
51 return;
53 int nNextViewLine = nLastViewLine + 1; // first view line after selected block
55 CUndo::GetInstance().BeginGrouping();
57 // right original become added
58 for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++)
60 if (!IsStateEmpty(GetViewState(viewLine)))
62 SetViewState(viewLine, DiffState::Removed);
65 SaveUndoStep();
67 // your block is done, now insert their block
68 int viewindex = nNextViewLine;
69 for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++)
71 viewdata line = m_pwndRight->GetViewData(viewLine);
72 if (IsStateEmpty(line.state))
74 line.state = DiffState::Empty;
76 else
78 if (line.state!=DiffState::Normal) {
79 m_pwndRight->SetViewState(viewLine, DiffState::Normal);
80 line.state = DiffState::Normal;
82 SetModified();
84 InsertViewData(viewindex++, line);
86 SaveUndoStep();
88 // now insert an empty block in right view
89 int nCount = nLastViewLine - nFirstViewLine + 1;
90 m_pwndRight->InsertViewEmptyLines(nFirstViewLine, nCount);
91 m_pwndRight->Invalidate();
92 SaveUndoStep();
94 // clean up
95 int nRemovedLines = CleanEmptyLines();
96 SaveUndoStep();
97 UpdateViewLineNumbers();
98 SaveUndoStep();
100 CUndo::GetInstance().EndGrouping();
102 // final clean up
103 ClearSelection();
104 SetupAllViewSelection(nFirstViewLine, 2*nLastViewLine - nFirstViewLine - nRemovedLines + 1);
105 BuildAllScreen2ViewVector();
106 RefreshViews();
109 void CLeftView::UseBothRightFirst()
111 if (!IsRightViewGood())
112 return;
113 int nFirstViewLine = 0; // first view line in selection
114 int nLastViewLine = 0; // last view line in selection
116 if (!IsWritable())
117 return;
118 if (!GetViewSelection(nFirstViewLine, nLastViewLine))
119 return;
121 int nNextViewLine = nLastViewLine + 1; // first view line after selected block
123 CUndo::GetInstance().BeginGrouping();
125 // left original become removed
126 for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++)
128 if (!IsStateEmpty(GetViewState(viewLine)))
130 SetViewState(viewLine, DiffState::TheirsRemoved);
133 SaveUndoStep();
135 for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++)
137 viewdata line = m_pwndRight->GetViewData(viewLine);
138 if (IsStateEmpty(line.state))
140 line.state = DiffState::Empty;
142 else
144 if (line.state!=DiffState::Normal) {
145 m_pwndRight->SetViewState(viewLine, DiffState::Normal);
146 line.state = DiffState::Normal;
148 SetModified();
150 InsertViewData(viewLine, line);
153 // now insert an empty block in right view
154 int nCount = nLastViewLine - nFirstViewLine + 1;
155 m_pwndRight->InsertViewEmptyLines(nNextViewLine, nCount);
156 m_pwndRight->Invalidate(); // empty lines added
157 SaveUndoStep();
159 // clean up
160 int nRemovedLines = CleanEmptyLines();
161 SaveUndoStep();
162 UpdateViewLineNumbers();
163 SaveUndoStep();
165 CUndo::GetInstance().EndGrouping();
167 // final clean up
168 ClearSelection();
169 SetupAllViewSelection(nFirstViewLine, 2*nLastViewLine - nFirstViewLine - nRemovedLines + 1);
170 BuildAllScreen2ViewVector();
171 RefreshViews();
174 void CLeftView::UseRightBlock()
176 int nFirstViewLine = 0;
177 int nLastViewLine = 0;
179 if (!IsWritable())
180 return;
181 if (!GetViewSelection(nFirstViewLine, nLastViewLine))
182 return;
184 return UseViewBlock(m_pwndRight, nFirstViewLine, nLastViewLine);
187 void CLeftView::UseRightFile()
189 int nFirstViewLine = 0;
190 int nLastViewLine = GetViewCount()-1;
192 if (!IsWritable())
193 return;
194 ClearSelection();
195 return UseViewBlock(m_pwndRight, nFirstViewLine, nLastViewLine);
199 void CLeftView::AddContextItems(CIconMenu& popup, DiffState state)
201 const bool bShow = HasSelection() && (state != DiffState::Unknown);
203 if (IsBottomViewGood())
205 if (bShow)
206 popup.AppendMenuIcon(POPUPCOMMAND_USETHEIRBLOCK, IDS_VIEWCONTEXTMENU_USETHISBLOCK);
207 popup.AppendMenuIcon(POPUPCOMMAND_USETHEIRFILE, IDS_VIEWCONTEXTMENU_USETHISFILE);
208 if (bShow)
210 popup.AppendMenuIcon(POPUPCOMMAND_USEYOURANDTHEIRBLOCK, IDS_VIEWCONTEXTMENU_USEYOURANDTHEIRBLOCK);
211 popup.AppendMenuIcon(POPUPCOMMAND_USETHEIRANDYOURBLOCK, IDS_VIEWCONTEXTMENU_USETHEIRANDYOURBLOCK);
214 else
216 if (bShow)
218 popup.AppendMenuIcon(POPUPCOMMAND_USELEFTBLOCK, IDS_VIEWCONTEXTMENU_USETHISBLOCK);
219 popup.AppendMenuIcon(POPUPCOMMAND_USEBOTHLEFTFIRST, IDS_VIEWCONTEXTMENU_USEBOTHTHISFIRST);
220 popup.AppendMenuIcon(POPUPCOMMAND_USEBOTHRIGHTFIRST, IDS_VIEWCONTEXTMENU_USEBOTHTHISLAST);
221 if (IsLeftViewGood() && !m_pwndLeft->IsReadonly())
223 popup.AppendMenu(MF_SEPARATOR, NULL);
224 popup.AppendMenuIcon(POPUPCOMMAND_PREPENDFROMRIGHT, IDS_VIEWCONTEXTMENU_PREPENDRIGHT);
225 popup.AppendMenuIcon(POPUPCOMMAND_REPLACEBYRIGHT, IDS_VIEWCONTEXTMENU_USERIGHT);
226 popup.AppendMenuIcon(POPUPCOMMAND_APPENDFROMRIGHT, IDS_VIEWCONTEXTMENU_APPENDRIGHT);
228 popup.AppendMenu(MF_SEPARATOR, NULL);
230 popup.AppendMenuIcon(POPUPCOMMAND_USELEFTFILE, IDS_VIEWCONTEXTMENU_USETHISFILE);
231 if (IsLeftViewGood() && !m_pwndLeft->IsReadonly())
233 popup.AppendMenuIcon(POPUPCOMMAND_USERIGHTFILE, IDS_VIEWCONTEXTMENU_USEOTHERFILE);
237 CBaseView::AddContextItems(popup, state);