-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lines.cs
147 lines (120 loc) · 4.07 KB
/
Lines.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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace MeFastTextBox
{
/// <summary>
/// слово в тексте
/// </summary>
class Word
{
/// <summary>
///
/// </summary>
/// <param name="text">контекст</param>
public Word(string text = default(string))
{
Text = text;
}
public int Start { get; set; }
public int End { get; set; }
private string Text { get; }
/// <summary>
/// текущая позиция курсора в слове
/// </summary>
public int Position { get; set; }
/// <summary>
/// длина слова
/// </summary>
public int Length => End - Start;
public string GetValue()
{
if (string.IsNullOrEmpty(Text)) throw new Exception("Текущий экземпляер не содержит контекста");
else return Text.GetRange(Start, End);
}
public string GetValue(string context)
{
return context.GetRange(Start, End);
}
public string GetValue(NeoRTB context)
{
return context.Text.GetRange(Start, End);
}
public string MakeWord(char KeyChar, string text)
{
if (Char.IsPunctuation(KeyChar)) return "";
string keyword = this.GetValue(text);
if (KeyChar > 8) //если это не 7 и не 8
{
keyword = keyword.Insert(this.Position, KeyChar.ToString()); //мб еще 7 - это доп вирт флаг Delete
}
else if (KeyChar == (char)7) //7 == delete
{
if (this.Position < keyword.Length) keyword = keyword.Remove(this.Position, 1);
}
return keyword;
}
}
//каждая линия - класс
//каждая строка без отступа - класс
//класс, базовый для всех линий
internal abstract class BaseClass
{
internal string Content { get; set; }
protected SmartDictionary smd;
/// <summary>
/// возвращает список текстовых координат для каждого цвета
/// </summary>
/// <param name="smd"></param>
/// <returns></returns>
internal Dictionary<Color, List<KeyValuePair<int, int>>> HighLightList()
{
var matches = new Regex(@"\w+").Matches(Content);
var vals = new Dictionary<Color, List<KeyValuePair<int, int>>>();
for (int i = 0; i < matches.Count; i++)
{
Color cw = smd[matches[i].Value];
if (cw != Color.Black)
{
if (!vals.ContainsKey(cw))
{
vals.Add(cw,
new List<KeyValuePair<int, int>>
{
new KeyValuePair<int, int>(
matches[i].Index,
matches[i].Length)
}
);
}
else
{
vals[cw].Add(new KeyValuePair<int, int>(
matches[i].Index,
matches[i].Length));
}
}
}
return vals;
}
}
/// <summary>
/// класс строки
/// </summary>
internal class Line : BaseClass
{
//string Content;
internal Line(string content, Block father)
{
base.smd = father.parent.SmaDict;
Content = content;
Parent = father;
}
int Indent { get; set; }
int Num { get; set; }
Block Parent { get; set; }
}
}