-
Notifications
You must be signed in to change notification settings - Fork 0
/
EditItem.cs
209 lines (187 loc) · 8.3 KB
/
EditItem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace qqEd
{
// This class contains a RichTextBox that displays a portion of a text file.
public class EditItem
{
public string file;
public int lineStart;
public int lineEnd;
public string descr;
public bool isPivot; // True if current instance is the pivot (see qqEdit.pivot)
public Paragraph paragraph;
public StrDelta dlt0; // Delta between textMain and textGui
public StrDelta dlt1; // Delta between pivot.textMain and this.textMain
public StrDelta dltM; // Merge i.e. delta between pivot.textMain and this.textGui
public TextBox txtStatus;
public RichTextBox textBox;
// This class contains a single version of the text.
// Possible versions are textFile, textCurrent, textRtb.
// Different versions of the text are needed to implement merging, revert, ...
public class Instance
{
public List<string> strList = new List<string>();
public string str = null;
public int hash = -1;
public int[] hashArray = null;
public Instance()
{
}
public Instance(Instance ttt)
{
this.strList = new List<string>(ttt.strList);
this.str = ttt.str;
this.hash = ttt.hash;
this.hashArray = ttt.hashArray;
}
}
public Instance textFile = new Instance(); // A copy of the file (see Copy_file_to_textFile() and )
public Instance textMain = new Instance(); // Main version (see Copy_textFile_to_textMain(), Copy_textRtb_to_textMain())
public Instance textGui = new Instance(); // A copy of 'textBox' (GUI) (see Copy_textRtb_to_GUI() and Copy_GUI_to_textGui())
// public List<string> text_File = new List<string>(); // 'Version File': original version of the text. Loaded from the file.
// private string text_File_str;
// private int text_File_HashCode;
// private bool changedVF; // True if current text and 'Version File' are different. The flag is updated on request by UpdateChangedVF()
// private List<string> textVM; // 'Version Merge': result of the last merge. To be used as base for next merge.
// private string textVM_str;
// private int textVM_HashCode;
// private bool changedVM; // True if current text and 'Version Merge' are different. The flag is updated on request by UpdateChangedVM()
public enum Status
{
NotInitialized,
File, // 'text' is aligned with the copy on the file (i.e status=Aligned after a load or after a save)
ModByInt, // 'text' has been modified using the qqEdit internal editor
ModByExt, // 'text' has been modified using an external editor
Merged // 'text' has been merged
};
public Status status = Status.NotInitialized;
public EditItem()
{
}
public EditItem(EditItem qqei)
{
this.file = qqei.file;
this.lineStart = qqei.lineStart;
this.lineEnd = qqei.lineEnd;
this.descr = qqei.descr;
this.textFile = new Instance(qqei.textFile);
// this.text_File = new List<string>(qqei.text_File);
// this.text_File_str = qqei.text_File_str;
// this.text_File_HashCode = qqei.text_File_HashCode;
// this.changedVF = qqei.changedVF;
this.status = qqei.status;
// textBox = new RichTextBox();
// textBox.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
// textBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
// textBox.Document.PageWidth = 2000;
//
// ContextMenu cm = new ContextMenu();
// MenuItem mi = new MenuItem();
// mi.Header = "Open";
// cm.Items.Add(mi);
// mi.Click += new System.Windows.RoutedEventHandler(this.MEFile_Open_Click);
// textBox.ContextMenu = cm;
}
public void MEFile_Open_Click(object sender, RoutedEventArgs e)
{
RichTextBox rtp = this.textBox;
int caretLinePos = Util.Rtb_GetCaretLinePos(rtp);
Util.FileOpenInTextEditor(this.file, String.Format("{0}", this.lineStart + caretLinePos));
}
// Load textFile from the file system
public void Copy_file_to_textFile()
{
Util.FileRead(this.file, this.lineStart, this.lineEnd, out this.textFile.strList); // EOL characters are discarded. Last line of the file, if empty, is discarded.
this.textFile.str = string.Join("\r\n", this.textFile.strList);
this.textFile.hash = this.textFile.str.GetHashCode();
this.textFile.hashArray = Util.Hash_StringList2DigestArray(this.textFile.strList, false);
this.status = Status.File;
}
// Copy the content of the RichTextBox to textGui
public void Copy_GUI_to_textGui()
{
this.textGui.str = Util.Rtb_GetContent(this.textBox);
// this.text_Current.strList = this.text_Current.str.Split('\n').ToList();
this.textGui.strList = this.textGui.str.Split(new string[] { "\r\n" }, StringSplitOptions.None).ToList();
this.textGui.hash = this.textGui.str.GetHashCode();
this.textGui.hashArray = Util.Hash_StringList2DigestArray(this.textGui.strList, false);
}
// Copy textFile to textMain
public void Copy_textFile_to_textMain()
{
this.textMain = new Instance(this.textFile);
}
// Copy textFile to textMain
public void Copy_textFile_to_GUI()
{
Util.Rtb_SetContent(this.textBox, this.textFile.str);
}
// Copy merge result to the GUI
public void Copy_dltM_to_GUI()
{
Paragraph paragraph = this.dltM.TextHighlight_strList(false, true);
Util.Rtb_SetContent(this.textBox, paragraph);
}
public void Copy_textRtb_to_textMain()
{
this.textMain = new Instance(this.textGui);
}
public bool GetChangedVF()
{
return false; // this.changedVF;
}
public string GetContent()
{
return Util.Rtb_GetContent(this.textBox);
}
public string GetContentV0()
{
return this.textFile.str;
}
public List<string> GetContent2()
{
string text = Util.Rtb_GetContent(this.textBox);
return text.Split(new string[] { "\r\n" }, StringSplitOptions.None).ToList();
}
// State machine: handle the Status
public void StateMachine()
{
// switch (this.status)
// {
// case Status.NotInitialized:
// break;
//
// case Status.File:
// if (Util.Rtb_GetContent(this.textBox) != this.text_File.str)
// {
// this.status = Status.ModByInt;
// }
// break;
//
// case Status.ModByInt:
// break;
//
// case Status.ModByExt:
// break;
//
// case Status.Merged:
// break;
//
// default:
// throw new Exception(String.Format("Illegal qqEditItem.Status={0}", this.status));
// }
txtStatus.Dispatcher.Invoke(() =>
{
// this.UpdateChangedVF();
txtStatus.Text = String.Format("File: {0}\nLine start/end: {1}/{2}\nStatus: {3}", this.file, this.lineStart, this.lineEnd, this.status);
});
}
}
}