private void txtCommand_TextChanged(object sender, TextChangedEventArgs e) { TextBox txt = (TextBox)sender; txt.Foreground = getBrush(Colors.Black); TabItem item = this.tc.SelectedItem as TabItem; if (item == null) { return; } else if (item == this.tiHTML_DOM) { if (_document == null) { return; } #region tiHTML_DOM try { if (this.previous_DOM_mapKeys != null) { foreach (HtmlNode node in this.previous_DOM_mapKeys) { if (this._DOM_map.ContainsKey(node)) { this._DOM_map[node].Background = getBrush(Colors.Transparent); } } } if (string.IsNullOrEmpty(txt.Text)) { return; } HtmlNodeCollection nodes = _document.DocumentNode.SelectNodes(txt.Text); foreach (HtmlNode node in nodes) { if (this._DOM_map.ContainsKey(node)) { this._DOM_map[node].Background = getBrush(0xFF, 0x7F, 0xFF); } } this.previous_DOM_mapKeys = nodes; } catch (Exception) { txt.Foreground = getBrush(Colors.Red); } #endregion } else if (item == this.tiHTML_SORTED) { #region tiHTML_SOURTED try { foreach (TextRange range in previous_SORTED_textRanges) { range.ApplyPropertyValue(TextElement.BackgroundProperty, getBrush(Colors.Transparent)); } if (string.IsNullOrEmpty(txt.Text)) { return; } TextRange contentRange = new TextRange(this.fdsvHTML_SORTED.Document.ContentStart, this.fdsvHTML_SORTED.Document.ContentEnd); string source = contentRange.Text; MatchCollection matches = Regex.Matches(source, txt.Text); foreach (Match match in matches) { int index = 0; TextPointer position = this.fdsvHTML_SORTED.Document.ContentStart; TextPointer start = null; TextPointer end = null; while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string text = position.GetTextInRun(LogicalDirection.Forward); if (index <= match.Index && (index + text.Length) > match.Index) { start = position.GetPositionAtOffset(match.Index - index); } if (index <= (match.Index + match.Length) && (index + text.Length) > (match.Index + match.Length)) { end = position.GetPositionAtOffset(match.Index + match.Length - index); } index += text.Length; } if (start != null && end != null) { break; } position = position.GetNextContextPosition(LogicalDirection.Forward); } if (start != null && end != null) { TextRange range = new TextRange(start, end); range.ApplyPropertyValue(TextElement.BackgroundProperty, getBrush(0xFF, 0x7F, 0xFF)); this.previous_SORTED_textRanges.Add(range); } } } catch (Exception) { txt.Foreground = getBrush(Colors.Red); } #endregion } else if (item == this.tiHTML_SOURCE) { if (this._source == null) { return; } #region tiHTML_SOURCE try { foreach (TextRange range in previous_SOURCE_textRanges) { range.ApplyPropertyValue(TextElement.BackgroundProperty, getBrush(Colors.Transparent)); } if (string.IsNullOrEmpty(txt.Text)) { return; } MatchCollection matches = Regex.Matches(_source.Replace(Environment.NewLine, string.Empty), txt.Text); foreach (Match match in matches) { int index = 0; TextPointer position = this.rtbHTML_SOURCE.Document.ContentStart; TextPointer start = null; TextPointer end = null; while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string text = position.GetTextInRun(LogicalDirection.Forward); if (index <= match.Index && (index + text.Length) > match.Index) { start = position.GetPositionAtOffset(match.Index - index); } if (index <= (match.Index + match.Length) && (index + text.Length) > (match.Index + match.Length)) { end = position.GetPositionAtOffset(match.Index + match.Length - index); } index += text.Length; } if (start != null && end != null) { break; } position = position.GetNextContextPosition(LogicalDirection.Forward); } if (start != null && end != null) { TextRange range = new TextRange(start, end); range.ApplyPropertyValue(TextElement.BackgroundProperty, getBrush(0xFF, 0x7F, 0xFF)); this.previous_SOURCE_textRanges.Add(range); } } } catch (Exception) { txt.Foreground = getBrush(Colors.Red); } #endregion } else if (item == this.tiHTML_DocumentViewer) { ; // Do nothing. } else { throw new NotSupportedException(); } }
public static void ChangeColor(string l, RichTextBox richBox, string keyword) { //设置文字指针为Document初始位置 // richBox.Document.FlowDirection TextPointer position = richBox.Document.ContentStart, old = richBox.Selection.Start; while (position != null) { //向前搜索,需要内容为Text if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { //拿出Run的Text string text = position.GetTextInRun(LogicalDirection.Forward); //可能包含多个keyword,做遍历查找 int index = 0; while (index < text.Length) { index = text.IndexOf(keyword, index); if (index == -1) { break; } else { if (index - 1 >= 0) { foreach (var c in RichTextEditor.HighLightEdit.ignore) { if (c == text[index - 1]) { goto keywordend; } } break; } keywordend: if (index + keyword.Length < text.Length) { foreach (var c in RichTextEditor.HighLightEdit.ignore) { if (c == text[index + keyword.Length]) { goto addrange; } } break; } addrange: //添加为新的Range TextPointer start = position.GetPositionAtOffset(index); TextPointer end = start.GetPositionAtOffset(keyword.Length); TextPointer end1 = start.GetPositionAtOffset(index + keyword.Length); selecta(l, richBox, keyword.Length, start, end); index += keyword.Length; } } } //文字指针向前偏移 position = position.GetNextContextPosition(LogicalDirection.Forward); } richBox.Selection.Select(old, old); }
/// <summary> /// Replace Emoji characters with EmojiInline objects inside the document. /// </summary> /// <param name="e"></param> protected override void OnTextChanged(TextChangedEventArgs e) { if (m_pending_change) { return; } m_pending_change = true; base.OnTextChanged(e); // Prevent our operation from polluting the undo buffer BeginChange(); TextPointer cur = Document.ContentStart; while (cur.CompareTo(Document.ContentEnd) < 0) { TextPointer next = cur.GetNextInsertionPosition(LogicalDirection.Forward); if (next == null) { break; } var emoji_range = new TextRange(cur, next); if (EmojiData.MatchOne.IsMatch(emoji_range.Text)) { // Preserve caret position bool caret_was_next = (0 == next.CompareTo(CaretPosition)); // We found an emoji, but it’s possible that GetNextInsertionPosition // did not pick enough characters and the emoji sequence is actually // longer. To avoid this, we look up to 50 characters ahead and retry // the match. var lookup = next.GetNextContextPosition(LogicalDirection.Forward); if (cur.GetOffsetToPosition(lookup) > 50) { lookup = cur.GetPositionAtOffset(50, LogicalDirection.Forward); } var full_text = new TextRange(cur, lookup).Text; var match = EmojiData.MatchOne.Match(new TextRange(cur, lookup).Text); while (match.Length > emoji_range.Text.Length) { next = next.GetNextInsertionPosition(LogicalDirection.Forward); if (next == null) { break; } emoji_range = new TextRange(cur, next); } var font_size = emoji_range.GetPropertyValue(TextElement.FontSizeProperty); var foreground = emoji_range.GetPropertyValue(TextElement.ForegroundProperty); // Delete the Unicode characters and insert our emoji inline instead. emoji_range.Text = ""; Inline inline = new EmojiInline(cur) { FontSize = (double)(font_size ?? FontSize), Foreground = (Brush)(foreground ?? Foreground), Text = match.Value, }; next = inline.ContentEnd; if (caret_was_next) { CaretPosition = next; } } cur = next; } EndChange(); // FIXME: make this call lazy inside Text.get() SetValue(TextProperty, new TextSelection(Document.ContentStart, Document.ContentEnd).Text); m_pending_change = false; #if DEBUG try { var xaml = XamlWriter.Save(Document); xaml = Regex.Replace(xaml, "<FlowDocument[^>]*>", "<FlowDocument>"); SetValue(XamlTextProperty, xaml); } catch { } #endif }
/// <summary> /// Finds the corresponding<see cref="TextRange"/> instance /// representing the input string given a specified text pointer position. /// </summary> /// <param name="position">the current text position</param> /// <param name="textToFind">input text</param> /// <param name="findOptions">the search option</param> /// <returns> /// An<see cref="TextRange"/> instance represeneting the matching /// string withing the text container. /// </returns> public TextRange GetTextRangeFromPosition(ref TextPointer position, String input, FindOptions findOptions) { Boolean matchCase = (findOptions & FindOptions.MatchCase) == FindOptions.MatchCase; Boolean matchWholeWord = (findOptions & FindOptions.MatchWholeWord) == FindOptions.MatchWholeWord; TextRange textRange = null; while (position != null) { if (position.CompareTo(inputDocument.ContentEnd) == 0) { break; } if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { String textRun = position.GetTextInRun(LogicalDirection.Forward); StringComparison stringComparison = matchCase ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase; Int32 indexInRun = textRun.IndexOf(input, stringComparison); if (indexInRun >= 0) { position = position.GetPositionAtOffset(indexInRun); TextPointer nextPointer = position.GetPositionAtOffset(input.Length); textRange = new TextRange(position, nextPointer); if (matchWholeWord) { if (IsWholeWord(textRange)) // Test if the "textRange" represents a word. { // If a WholeWord match is found, directly terminate the loop. position = position.GetPositionAtOffset(input.Length); break; } else { // If a WholeWord match is not found, go to next recursion to find it. position = position.GetPositionAtOffset(input.Length); return(GetTextRangeFromPosition(ref position, input, findOptions)); } } else { // If a none-WholeWord match is found, directly terminate the loop. position = position.GetPositionAtOffset(input.Length); break; } } else { // If a match is not found, go over to the next context position after the "textRun". position = position.GetPositionAtOffset(textRun.Length); } } else { //If the current position doesn't represent a text context position, go to the next context position. // This can effectively ignore the formatting or embed element symbols. position = position.GetNextContextPosition(LogicalDirection.Forward); } } if (textRange != null) { return(new TextRange(textRange.Start, textRange.Start.GetPositionAtOffset(input.Length))); } return(null); }
private bool BoldTextFromPosition(TextPointer position, string word, bool red, bool green) { TextRange range; Object obj; int indexInRun; string textRun; FontWeight fontWeight; TextPointer start, end; TextRange selection; string pattern = @"[a-zA-Zа-яА-Я0-9]"; bool fl; while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { textRun = position.GetTextInRun(LogicalDirection.Forward); indexInRun = textRun.IndexOf(word, StringComparison.CurrentCultureIgnoreCase); while (indexInRun != -1) { //проверка окаймляющих символов - должны быть nonword fl = false; // - не найдены word символы // символ перед словом start = position.GetPositionAtOffset(indexInRun - 1); range = new TextRange(start, start.GetPositionAtOffset(1)); if (Regex.IsMatch(range.Text, pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase)) { fl = true; } // символ после слова start = position.GetPositionAtOffset(indexInRun + word.Length); range = new TextRange(start, start.GetPositionAtOffset(1)); if (Regex.IsMatch(range.Text, pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase)) { fl = true; } //конец проверка окаймляющих символов - должны быть nonword if (!fl) { start = position.GetPositionAtOffset(indexInRun); range = new TextRange(start, start.GetPositionAtOffset(1)); obj = range.GetPropertyValue(TextElement.FontWeightProperty); fontWeight = (FontWeight)obj; if (fontWeight == FontWeights.Normal) { end = start.GetPositionAtOffset(word.Length); selection = new TextRange(start, end); selection.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); if (red) { selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red); } if (green) { selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Aqua); } return(true); } } indexInRun = textRun.IndexOf(word, indexInRun + 1, StringComparison.CurrentCultureIgnoreCase); } position = position.GetPositionAtOffset(textRun.Length); } else { position = position.GetNextContextPosition(LogicalDirection.Forward); } } return(false); }
private void DelNote_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { var im = sender as System.Windows.Controls.Image; if (im == null) { return; } var key = im.Tag.ToString(); if (key == null) { return; } byte[] flag = getJPGFromImageControl(Properties.Resources.noteFlag); Notes[key].Range.ApplyPropertyValue(TextElement.BackgroundProperty, null); for (TextPointer position = Notes[key].Range.Start; position != null && position.CompareTo(Notes[key].Range.End) != 1; position = position.GetNextContextPosition(LogicalDirection.Forward)) { InlineUIContainer element = position.Parent as InlineUIContainer; if (element != null && element.Child is System.Windows.Controls.Image) { var image = element.Child as System.Windows.Controls.Image; if (image == null) { continue; } var imageSourse = image.Source as System.Windows.Media.ImageSource; if (imageSourse == null) { continue; } byte[] byt = getJPGFromImageControl(imageSourse); //сравнивает картинки if (byt.Length == flag.Length) { bool isflag = true; for (int t = 0; t < byt.Length; t++) { if (byt[t] != flag[t]) { isflag = false; break; } } if (!isflag) { continue; } element.SiblingInlines.Remove(element); //new TextRange(element.ContentStart, element.ContentEnd).Text = string.Empty; } } } Notes.Remove(im.Tag.ToString()); OnSave(() => { }, ParentControl.BrowseProject.LoadedFile); MainControl.Items.Refresh(); }
/// <summary> /// Find the corresponding <see cref="TextRange"/> instance /// representing the input string given a specified text pointer position. /// </summary> /// <param name="position">the current text position</param> /// <param name="textToFind">input text</param> /// <param name="findOptions">the search option</param> /// <returns>An <see cref="TextRange"/> instance represeneting the matching string withing the text container.</returns> public TextRange GetTextRangeFromPosition(ref TextPointer position, String input, FindOptions findOptions) { Boolean matchCase = findOptions.MatchCase; Boolean matchWholeWord = findOptions.MatchWholeWord; TextRange textRange = null; while (position != null) { if (position.CompareTo(inputDocument.ContentEnd) == 0) //到了文档结尾 { break; } //是文本元素 if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { String textRun = position.GetTextInRun(LogicalDirection.Forward); //读取文本 StringComparison stringComparison = matchCase ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase; //进行查找 Int32 indexInRun = textRun.IndexOf(input, stringComparison); if (indexInRun >= 0) //找到了 { position = position.GetPositionAtOffset(indexInRun); //移动文字指针到开头 TextPointer nextPointer = position.GetPositionAtOffset(input.Length); //设定匹配项尾文字指针 textRange = new TextRange(position, nextPointer); if (matchWholeWord) //是全字匹配的话 { if (IsWholeWord(textRange)) // 测试匹配项是否是一个单词 { // 是一个完整的单词 break; } else { // 找到的不是一个完整的单词,继续在本Run元素中查找 position = position.GetPositionAtOffset(input.Length); return(GetTextRangeFromPosition(ref position, input, findOptions)); } } else { //不要求全字匹配 position = position.GetPositionAtOffset(input.Length); break; } } else { // 没找到匹配项,移到当前的Run元素之后 "textRun". position = position.GetPositionAtOffset(textRun.Length); } } else { //如果当前位置不是文本类型的元素,继续"前进",跳过这些非文本元素. position = position.GetNextContextPosition(LogicalDirection.Forward); } } return(textRange); }
private void TextChangedEventHandler(object sender, TextChangedEventArgs e) { if (rtbEditor.Document == null) { return; } printLineNumbers(); foreach (TextChange C in e.Changes) { TextPointer P = rtbEditor.Document.ContentStart.GetPositionAtOffset(C.Offset); if (P.Paragraph != null) { P.Paragraph.Tag = null; //It needs reformatting } } if (rtbEditor.Document.Blocks.Count > 0) { Block B = rtbEditor.Document.Blocks.FirstBlock; while (B != null) { if (B is Paragraph) { Paragraph P = B as Paragraph; if (P.Tag == null) { TextRange documentRange = new TextRange(P.ContentStart, P.ContentEnd); documentRange.ClearAllProperties(); TextPointer navigator = P.ContentStart; while (navigator.CompareTo(P.ContentEnd) < 0) { TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); if (context == TextPointerContext.ElementStart && navigator.Parent is Run) { CheckWordsInRun((Run)navigator.Parent); } navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } P.Tag = true; //It has been highlighted } } else { throw new Exception("Unknown block type " + B.ToString()); } B = B.NextBlock; } } /* * TextRange documentRange = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); * documentRange.ClearAllProperties(); * * TextPointer navigator = rtbEditor.Document.ContentStart; * while (navigator.CompareTo(rtbEditor.Document.ContentEnd) < 0) * { * TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); * if (context == TextPointerContext.ElementStart && navigator.Parent is Run) * { * CheckWordsInRun((Run)navigator.Parent); * * } * navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); * } */ Format(); }
private Tuple <List <TextRange>, List <double[]> > get_range(Point p, double w, double h) // 上下k行 { List <TextRange> select = new List <TextRange>(); var pos = richTextBox.GetPositionFromPoint(p, true); if (pos == null) { return(new Tuple <List <TextRange>, List <double[]> >(select, new List <double[]>())); } TextPointer begin = pos.GetLineStartPosition(-1); // TextPointer lastEnd = poz.DocumentEnd.GetLineStartPosition(-3); if (begin == null) { begin = pos.DocumentStart; } if (begin.CompareTo(pos.DocumentEnd) < -1) { begin = pos.DocumentStart; } /*if (begin != null && lastEnd != null && begin.CompareTo(lastEnd) > 0) * { * begin = lastEnd; * }*/ TextPointer end = pos.GetLineStartPosition(1); begin = begin.GetPositionAtOffset(2); //?? Magic 2 Rect beginR = begin.GetCharacterRect(LogicalDirection.Forward); List <double[]> arrayPos = new List <double[]>(); TextPointer lineBegin = begin; //Console.WriteLine("========================"); while (begin != null) { if (end != null && begin.CompareTo(end) > -1) { break; } if (begin.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string text = begin.GetTextInRun(LogicalDirection.Forward); string[] words = text.Split(' '); int startIndex = 0; foreach (var word in words) { if (word.Length > 0) { // Console.WriteLine("startIndes:{0}, word.length:{1}", startIndex, word.Length); TextPointer headP = lineBegin.GetPositionAtOffset(startIndex, LogicalDirection.Forward); TextPointer tailP = lineBegin.GetPositionAtOffset(startIndex + word.Length, LogicalDirection.Forward); // Console.WriteLine(new TextRange(headP, tailP).Text + "|"); //Console.WriteLine(new TextRange(headP, lineBegin.GetPositionAtOffset(startIndex+word.Length+1, LogicalDirection.Forward)).Text + "|"); //Console.WriteLine(new TextRange(headP, lineBegin.GetPositionAtOffset(startIndex + word.Length + 2, LogicalDirection.Forward)).Text + "|"); bool dealed = false; // Console.WriteLine("{0}", headP.GetLineStartPosition(0).CompareTo(lineBegin.GetLineStartPosition(0))); if (headP.GetLineStartPosition(0).CompareTo(lineBegin.GetLineStartPosition(0)) != 0 /*|| * (headP.GetLineStartPosition(0).CompareTo(lineBegin.GetLineStartPosition(0)) == 0 && * beginR.X + (startIndex + word.Length) * Config.fontWidth > richTextBox.ActualWidth)*/) { dealed = true; //beginR = headP.GetCharacterRect(LogicalDirection.Forward); beginR.Y += beginR.Height; beginR.X = 0; lineBegin = headP; startIndex = 0; } //Rect head = headP.GetCharacterRect(LogicalDirection.Forward); //Rect tail = tailP.GetCharacterRect(LogicalDirection.Backward); Rect head = new Rect(); Rect tail = new Rect(); head.X = beginR.X + startIndex * Config.fontWidth; head.Y = beginR.Y; head.Height = beginR.Height; tail.X = beginR.X + (startIndex + word.Length) * Config.fontWidth; tail.Y = beginR.Y; tail.Height = beginR.Height; if (tailP.GetLineStartPosition(0).CompareTo(headP.GetLineStartPosition(0)) != 0 && !dealed) //如果换行 { //Rect tp = tailP.GetCharacterRect(LogicalDirection.Backward); //tail = tp; head.X = 0; head.Y += head.Height; tail.X = (word.Length * Config.fontWidth); tail.Y += head.Height; lineBegin = tailP; beginR.Y += head.Height; beginR.X = tail.X; startIndex = -(word.Length); //if (tp.X > 0) //{ // head.Y = tp.Y; // head.X = 0; // head.Height = tp.Height; //} } //Console.WriteLine("{0},{1},{2}, {3}", word, head.X, tail.X, tailP.GetLineStartPosition(0).CompareTo(headP.GetLineStartPosition(0))); if (!(head.X > (p.X + w) || tail.X < (p.X - w)) && !(head.Y > (p.Y + h + head.Height + 5) || head.Y - head.Height < (p.Y - h - head.Height - 5))) { if ((arrayPos.Count == 0) || Math.Abs(arrayPos.Last()[0] - head.Y) > Double.Epsilon) { arrayPos.Add(new double[3]); arrayPos.Last()[0] = head.Y; arrayPos.Last()[1] = head.X; arrayPos.Last()[2] = tail.X; } else { arrayPos.Last()[1] = Math.Min(arrayPos.Last()[1], head.X); arrayPos.Last()[2] = Math.Max(arrayPos.Last()[2], tail.X); } select.Add(new TextRange(headP, tailP)); //Console.WriteLine("in:" + textRange.Text); } } startIndex += (word.Length + 1); } } begin = begin.GetNextContextPosition(LogicalDirection.Forward); } /*if (end != null) * { * end = poz.DocumentEnd; * }*/ //List<TextRange> allTextRanges = GetAllWordRanges(begin, end).ToList(); // Console.WriteLine(arrayPos); return(new Tuple <List <TextRange>, List <double[]> >(select, arrayPos)); }
private void commandEnterPressed(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { TextRange range1 = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range1.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Black)); string key = commandLine.Text; string[] k = key.Split(null); lblAction.Text = k[0]; if (k[0].ToLower() == "save") { if (k[1] != null) { if (k[1].ToLower() == "as") { FileStream fileStream = new FileStream(k[2], FileMode.Create); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Save(fileStream, DataFormats.Rtf); } } else { Save_Executed(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "open") { if (k[1] != null) { FileStream fileStream = new FileStream(k[1], FileMode.Open); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Load(fileStream, DataFormats.Rtf); } commandLine.Text = ""; } else if (k[0].ToLower() == "find") { int n = 0; try { int h = Int32.Parse(k[2]); if (h > 0) { n = h; } } catch (Exception a) { } var str = k[1].Split('/'); int num = 0; rtbEditor.SelectAll(); TextPointer start = rtbEditor.Selection.Start.GetLineStartPosition(currentLine - 1 + n); TextPointer end = rtbEditor.Selection.Start.GetLineStartPosition(currentLine + num - 1); TextRange range = new TextRange(start, end); Regex reg = new Regex(str[1], RegexOptions.Compiled | RegexOptions.IgnoreCase); while (start != null && start.CompareTo(end) < 0) { if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { var match = reg.Match(start.GetTextInRun(LogicalDirection.Forward)); var textrange = new TextRange(start.GetPositionAtOffset(match.Index, LogicalDirection.Forward), start.GetPositionAtOffset(match.Index + match.Length, LogicalDirection.Backward)); textrange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); start = textrange.End; } start = start.GetNextContextPosition(LogicalDirection.Forward); } commandLine.Text = "Press enter to turn text back to black"; } else if (k[0].ToLower() == "up") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); if (!isNumeric) { num = 1; } } for (int i = 0; i < num; i++) { UpButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "down") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); if (!isNumeric) { num = 1; } } for (int i = 0; i < num; i++) { DownButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "i") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); if (!isNumeric) { num = 1; } } for (int i = 0; i < num; i++) { // File.AppendText("\n"); //Lines(); } commandLine.Text = ""; } else if (k[0].ToLower() == "forward") { for (int i = 0; i < Lines(); i++) { forwardButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "backward") { for (int i = 0; i < Lines(); i++) { backButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "left") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); if (!isNumeric) { num = 1; } } for (int i = 0; i < num; i++) { LeftButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "right") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); if (!isNumeric) { num = 1; } } for (int i = 0; i < num; i++) { RightButton_Click(sender, null); } commandLine.Text = ""; } else if (k[0].ToLower() == "change") { var str = k[1].Split('/'); int num = 0; bool isNumeric = int.TryParse(str[3], out num); int n = 0; int h = Int32.Parse(str[3]); if (h > 0) { n = h; } rtbEditor.SelectAll(); TextPointer start = rtbEditor.Selection.Start.GetLineStartPosition(currentLine - 1 + n); TextPointer end = rtbEditor.Selection.Start.GetLineStartPosition(currentLine + num - 1 + n); TextRange range = new TextRange(start, end); String txt = new TextRange(start, end).Text; txt = txt.Replace(str[1], str[2]); if (txt != new TextRange(start, end).Text) { new TextRange(start, end).Text = txt; // Change the current text to _Text } } else if (k[0].ToLower() == "setcl") { int num = 1; if (k[1] != null) { bool isNumeric = int.TryParse(k[1], out num); // int deneme = Convert.ToInt16(k[1]);//str[0]; // num = int.Parse(k[1]); if (!isNumeric) { num = 1; } // currentLine = num; } // Console.WriteLine(deneme); /* * * TextPointer start = rtbEditor.Selection.Start.GetLineStartPosition(currentLine - 1); * * TextPointer end = rtbEditor.Selection.Start.GetLineStartPosition(currentLine + num - 1); * int someBigNumber = int.MaxValue; * * int lineMoved, currentLineNumber; * * suffix.Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved); * * currentLineNumber = -lineMoved; * * */ var textToSync = (sender == rtbEditor) ? suffix : rtbEditor; textToSync.ScrollToVerticalOffset(num); textToSync.ScrollToHorizontalOffset(num); // TextPointer start = rtbEditor.Selection.Start.GetLineStartPosition(num); // TextPointer end = rtbEditor.Selection.Start.GetLineStartPosition(num); //currentLine = num; commandLine.Text = ""; } else if (k[0].ToLower() == "help") { Help_Click(e, null); } else { int num; bool isNumeric = int.TryParse(k[0], out num); if (isNumeric) { rtbEditor.ScrollToHome(); for (int i = 0; i < num - 1; i++) { DownButton_Click(sender, null); } rtbEditor.SelectAll(); TextPointer start = rtbEditor.Selection.Start.GetLineStartPosition(num - 1); TextPointer end = rtbEditor.Selection.Start.GetLineStartPosition(num); var textrange = new TextRange(start, end); textrange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); } else { commandLine.Text = "Type help for options"; } } } }
/// <summary> /// <para>Gets a TextPointer to a text character offset in the FlowDocument.</para> /// <para>Notes:</para> /// <para>This method searches for next character-offset TextPointer in a forward direction.</para> /// <para>Search iterates through text blocks and determines if character offset is within current /// text block (instead of searching every character.)</para> /// <para>If CharOffset is beyond FlowDocument, an end-of-document TextPointer is returned.</para> /// <para>Tabs in a Paragraph's Margin Left or TextIndent property are not counted /// as tab characters.</para> /// <para>Assumes newlines are "\r\n" characters.</para> /// <para>Multiple calls can be made without reseting text position fields to speed up /// finding Textpointers.</para> /// <para>If one is operating in a forward order, one can use the obtained TextPointers to create /// TextRanges and call ApplyPropertyValue method without needing to reset text positions to start.</para> /// </summary> /// <param name="CharOffset">The text character offset in the FlowDocument.</param> /// <param name="ResetToStart">Whether or not to reset text positions to start of FlowDocument before /// next search.</param> /// <returns>The TextPointer if found, or an end-of-document TextPointer.</returns> public TextPointer GetTextPointer(int CharOffset, bool ResetToStart) { #region Strategy // The goal is to count Text run lengths until CharOffset is within a Text run. // Characters also need to be added to the count for end of Paragraph and Linebreak // (which in the text string is signified as "\r\n" characters) // // The CharOffset is considered to be inside the run if the caret (textpointer) is positioned // before the first character of the run, or after the last character of the run (to // keep the textpointer within the run.) // // i_start: character index of start of current run // i_end: character index of end of current run #endregion if (ResetToStart) { this.ResetToStart(); } // loop until end of doc while (this.navigator.CompareTo(this.endOfDoc) < 0) { // switch pointer context switch (this.navigator.GetPointerContext(LogicalDirection.Forward)) { case TextPointerContext.ElementEnd: { DependencyObject d = this.navigator.GetAdjacentElement(LogicalDirection.Forward); if (d is Paragraph || d is LineBreak) { // Add 2 for linebreak: "\r\n" // Note: Text in a TextRange between to TextPointers inserts "\r\n" at // end of a Paragraph and end of LinkBreak this.i_start += 2; } break; } case TextPointerContext.Text: { // 0 1 2 3 4 5 6 // a b c d e X // calc character index of end of current run int i_end = this.i_start + this.navigator.GetTextRunLength(LogicalDirection.Forward); // case: character offset is within current run if (CharOffset <= i_end) { // calc offset within current run int offset = CharOffset - this.i_start; // return text pointer to character offset return(this.navigator.GetPositionAtOffset(offset, LogicalDirection.Forward)); } // calc character index to next text run (if it exists) this.i_start = i_end; break; } } // Advance the naviagtor to the next context position. this.navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } // case: counter index went past CharOffset and last paragraph and there is no more // text runs to check for CharOffset: therefore, return end-of-doc text pointer if (this.i_start != 0 && CharOffset <= this.i_start) { return(this.endOfDoc.GetNextInsertionPosition(LogicalDirection.Backward)); } // default: not found return(this.endOfDoc); }
private void tb_class_text_TextChanged(object sender, TextChangedEventArgs e) { if (this.tb_class_text.Document == null) { return; } // this prevents infinite loops this.tb_class_text.TextChanged -= tb_class_text_TextChanged; this.keywords.Clear(); this.specialwords.Clear(); //clear all formats TextRange documentRange = new TextRange(this.tb_class_text.Document.ContentStart, this.tb_class_text.Document.ContentEnd); documentRange.ClearAllProperties(); // save caret position TextPointer caretPos = this.tb_class_text.CaretPosition; int offset = caretPos.GetOffsetToPosition(this.tb_class_text.Document.ContentStart); // combine runs (user input is placed in a new run...) Dictionary <Paragraph, string> current_content = new Dictionary <Paragraph, string>(); var rtb_blocks = this.tb_class_text.Document.Blocks; foreach (var block in rtb_blocks) { Paragraph p = block as Paragraph; if (p != null) { // combine runs in the paragraph var inlines = p.Inlines; string p_content = ""; foreach (var inline in inlines) { Run r = inline as Run; if (r != null) { p_content += r.Text; } } current_content.Add(p, p_content); } } foreach (var entry in current_content) { entry.Key.Inlines.Clear(); entry.Key.Inlines.Add(new Run(entry.Value)); } // restore caret position this.tb_class_text.CaretPosition = this.tb_class_text.Document.ContentStart.GetPositionAtOffset(-offset + this.caret_offset_add, caretPos.LogicalDirection); // find all keywords TextPointer navigator = this.tb_class_text.Document.ContentStart; while (navigator.CompareTo(this.tb_class_text.Document.ContentEnd) < 0) { TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); if (context == TextPointerContext.ElementStart && navigator.Parent is Run) { string text_snippet = ((Run)navigator.Parent).Text; if (text_snippet != "") { LookForKeyordsInRun((Run)navigator.Parent, text_snippet); } } navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } //only after all keywords are found, then we highlight them for (int i = 0; i < this.keywords.Count; i++) { try { TextRange range = new TextRange(this.keywords[i].start_pos, this.keywords[i].end_pos); range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Blue)); range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); } catch { } } for (int i = 0; i < this.specialwords.Count; i++) { try { TextRange range = new TextRange(this.specialwords[i].start_pos, this.specialwords[i].end_pos); range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ff008ab7"))); } catch { } } // this prevents infinite loops this.tb_class_text.TextChanged += tb_class_text_TextChanged; }
private TextRange SelectCurrentWord(RichTextBox edit) { TextPointer pointer = edit.CaretPosition; TextPointer wordEnd = edit.CaretPosition; TextPointer wordStart = edit.CaretPosition; // Ищем вперед pointer = wordEnd; bool wSpaceFound = false; while (pointer != null) { string nextText = pointer.GetTextInRun(LogicalDirection.Forward); if (nextText != "") { for (int i = 0; i < nextText.Length; i++) { if (WordParser.IsAlphanumeric(nextText[i]) || WordParser.IsWhitespace(nextText[i])) { wordEnd = pointer.GetPositionAtOffset(i, LogicalDirection.Forward); wSpaceFound = true; break; } } if (wSpaceFound) { break; } else { wordEnd = pointer.GetPositionAtOffset(nextText.Length); } } pointer = pointer.GetNextContextPosition(LogicalDirection.Forward); } // ищем назад pointer = wordStart; wSpaceFound = false; while (pointer != null) { string prevText = pointer.GetTextInRun(LogicalDirection.Backward); if (prevText != "") { for (int i = prevText.Length - 1; i >= 0; i--) { if (WordParser.IsAlphanumeric(prevText[i]) || WordParser.IsWhitespace(prevText[i])) { wordStart = pointer.GetPositionAtOffset(-(prevText.Length - i) + 1); wSpaceFound = true; break; } } if (wSpaceFound) { break; } } TextPointer lastPointer = pointer; pointer = pointer.GetNextContextPosition(LogicalDirection.Backward); if (pointer == null) { wordStart = lastPointer; } } return(new TextRange(wordStart, wordEnd)); }
void advanceColor_Click(object sender, RoutedEventArgs e) { DialogWindowBrushColor dialoWindow = new DialogWindowBrushColor(); dialoWindow.Owner = Application.Current.MainWindow; Lovatts.ColorEditor.BrushEditor brushEditor = (Lovatts.ColorEditor.BrushEditor)dialoWindow.Content; brushEditor.ParentWindow = dialoWindow; if (dialoWindow.ShowDialog() == true) { Brush newBrush = brushEditor.BrushEditorViewModel.Brush; MainWindow mainWindow = (MainWindow)Application.Current.MainWindow; ColorButton colorButton = new ColorButton(CustomRichTextBox, Grid, newBrush, stackPanelRecentColor, DropButton, RectangleColor); if (mainWindow.RecentColorCollection.Count < 7) { stackPanelRecentColor.Children.Add(colorButton); mainWindow.RecentColorCollection.Add(colorButton); } else { mainWindow.RecentColorCollection.RemoveAt(0); mainWindow.RecentColorCollection.Add(colorButton); stackPanelRecentColor.Children.RemoveAt(0); stackPanelRecentColor.Children.Add(colorButton); } RectangleColor.Fill = newBrush; TextPointer textPoint = CustomRichTextBox.CaretPosition; CustomRichTextBox.startTextPointer = null; CustomRichTextBox.endTextPointer = null; if (CustomRichTextBox.Selection.IsEmpty) { TextElement textElement = null; if (CustomRichTextBox.CaretPosition.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.None) { CustomRichTextBox.IsCreateRunNull = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } else if (CustomRichTextBox.CaretPosition.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.ElementStart) { textElement = (TextElement)CustomRichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection.Backward); if (textElement is Paragraph) { CustomRichTextBox.IsCreateRunNull = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } else if (textElement is ListItem) { CustomRichTextBox.IsCreateRunNull = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } } else if (CustomRichTextBox.CaretPosition.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.ElementEnd) { textElement = (TextElement)CustomRichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection.Backward); if (textElement is LineBreak) { CustomRichTextBox.IsCreateRunNull = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } } if (textPoint.GetTextRunLength(LogicalDirection.Backward) > 0) // Если позади каретки в текстовом элементе есть текст { TextPointer textPointer = textPoint.GetNextContextPosition(LogicalDirection.Backward); Run run = (Run)textPointer.GetAdjacentElement(LogicalDirection.Backward); TextElement nextBackTextElement = (TextElement)run.ElementStart.GetAdjacentElement(LogicalDirection.Backward); int i = CustomRichTextBox.CaretPosition.GetTextRunLength(LogicalDirection.Backward); TextRange textRange = new TextRange(textPointer, CustomRichTextBox.CaretPosition); int index = textRange.Text.LastIndexOfAny(new char[] { ' ', ',', '.', '?', '!', ':', ';' }); if (index != -1) { if (textRange.Text[i - 1] != ' ' && textRange.Text[i - 1] != ',' && textRange.Text[i - 1] != '.' && textRange.Text[i - 1] != '?' && textRange.Text[i - 1] != '!' && textRange.Text[i - 1] != ':' && textRange.Text[i - 1] != ';') { CustomRichTextBox.startTextPointer = CustomRichTextBox.CaretPosition.GetPositionAtOffset(index + 1 - i); } else { CustomRichTextBox.startTextPointer = null; } } else { CustomRichTextBox.IsText = true; CustomRichTextBox.StartTextPointer(nextBackTextElement); } } else { CustomRichTextBox.IsTextNull = true; TextElement nextBackTextElement = (TextElement)CustomRichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection.Backward); if (nextBackTextElement is Run) { nextBackTextElement = (TextElement)nextBackTextElement.ElementStart.GetAdjacentElement(LogicalDirection.Backward); } CustomRichTextBox.StartTextPointer(nextBackTextElement); } CustomRichTextBox.IsTextNull = false; CustomRichTextBox.IsText = false; if (textPoint.GetTextRunLength(LogicalDirection.Forward) > 0) // Если в текстовом элементе впереди каретки есть текст { TextPointer textPointer = textPoint.GetNextContextPosition(LogicalDirection.Forward); Run run = (Run)textPointer.GetAdjacentElement(LogicalDirection.Forward); TextElement nextForwardTextElement = (TextElement)run.ElementEnd.GetAdjacentElement(LogicalDirection.Forward); int i = CustomRichTextBox.CaretPosition.GetTextRunLength(LogicalDirection.Forward); TextRange textRange = new TextRange(CustomRichTextBox.CaretPosition, textPointer); int index = textRange.Text.IndexOfAny(new char[] { ' ', ',', '.', '?', '!', ':', ';' }); if (index != -1) { if (textRange.Text[0] != ' ' && textRange.Text[0] != ',' && textRange.Text[0] != '.' && textRange.Text[0] != '?' && textRange.Text[0] != '!' && textRange.Text[0] != ':' && textRange.Text[0] != ';') { CustomRichTextBox.endTextPointer = CustomRichTextBox.CaretPosition.GetPositionAtOffset(index); } else { CustomRichTextBox.endTextPointer = null; } } else { CustomRichTextBox.IsText = true; CustomRichTextBox.EndTextPointer(nextForwardTextElement); } } else { CustomRichTextBox.IsTextNull = true; TextElement nextForwardTextElement = (TextElement)CustomRichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection.Forward); if (nextForwardTextElement is Run) { nextForwardTextElement = (TextElement)nextForwardTextElement.ElementEnd.GetAdjacentElement(LogicalDirection.Forward); } CustomRichTextBox.EndTextPointer(nextForwardTextElement); } CustomRichTextBox.IsText = false; CustomRichTextBox.IsTextNull = false; if (CustomRichTextBox.startTextPointer != null && CustomRichTextBox.endTextPointer != null) { TextRange textRange = new TextRange(CustomRichTextBox.startTextPointer, CustomRichTextBox.endTextPointer); textRange.ApplyPropertyValue(TextElement.ForegroundProperty, newBrush); } else { if (CustomRichTextBox.Run.Foreground is SolidColorBrush && newBrush is SolidColorBrush) { SolidColorBrush runBrush = CustomRichTextBox.Run.Foreground as SolidColorBrush; SolidColorBrush newSolidColorBrush = newBrush as SolidColorBrush; if (runBrush.Color.A != newSolidColorBrush.Color.A || runBrush.Color.B != newSolidColorBrush.Color.B || runBrush.Color.G != newSolidColorBrush.Color.G || runBrush.Color.R != newSolidColorBrush.Color.R || runBrush.Color.ScA != newSolidColorBrush.Color.ScA || runBrush.Color.ScB != newSolidColorBrush.Color.ScB || runBrush.Color.ScG != newSolidColorBrush.Color.ScG || runBrush.Color.ScR != newSolidColorBrush.Color.ScR || runBrush.Opacity != newSolidColorBrush.Opacity) { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; } else { CustomRichTextBox.IsCreateRunColor = false; } } else if (CustomRichTextBox.Run.Foreground is LinearGradientBrush && newBrush is LinearGradientBrush) { LinearGradientBrush runBrush = CustomRichTextBox.Run.Foreground as LinearGradientBrush; LinearGradientBrush newLinearGradientBrush = newBrush as LinearGradientBrush; int count = 0; if (runBrush.ColorInterpolationMode != newLinearGradientBrush.ColorInterpolationMode || runBrush.EndPoint != newLinearGradientBrush.EndPoint || runBrush.Opacity != newLinearGradientBrush.Opacity || runBrush.MappingMode != newLinearGradientBrush.MappingMode || runBrush.SpreadMethod != newLinearGradientBrush.SpreadMethod || runBrush.StartPoint != newLinearGradientBrush.StartPoint || runBrush.GradientStops.Count != newLinearGradientBrush.GradientStops.Count) { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; } else { GradientStop newGradientStop; foreach (GradientStop runGradientStop in runBrush.GradientStops) { newGradientStop = newLinearGradientBrush.GradientStops[count]; if (runGradientStop.Color.A != newGradientStop.Color.A || runGradientStop.Color.B != newGradientStop.Color.B || runGradientStop.Color.G != newGradientStop.Color.G || runGradientStop.Color.R != newGradientStop.Color.R || runGradientStop.Color.ScA != newGradientStop.Color.ScA || runGradientStop.Color.ScB != newGradientStop.Color.ScB || runGradientStop.Color.ScG != newGradientStop.Color.ScG || runGradientStop.Color.ScR != newGradientStop.Color.ScR) { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } else { CustomRichTextBox.IsCreateRunColor = false; } count++; } } } else if (CustomRichTextBox.Run.Foreground is RadialGradientBrush && newBrush is RadialGradientBrush) { RadialGradientBrush runBrush = CustomRichTextBox.Run.Foreground as RadialGradientBrush; RadialGradientBrush newRadialGradientBrush = newBrush as RadialGradientBrush; int count = 0; if (runBrush.Center != newRadialGradientBrush.Center || runBrush.ColorInterpolationMode != newRadialGradientBrush.ColorInterpolationMode || runBrush.GradientOrigin != newRadialGradientBrush.GradientOrigin || runBrush.MappingMode != newRadialGradientBrush.MappingMode || runBrush.Opacity != newRadialGradientBrush.Opacity || runBrush.RadiusX != newRadialGradientBrush.RadiusX || runBrush.RadiusY != newRadialGradientBrush.RadiusY || runBrush.SpreadMethod != newRadialGradientBrush.SpreadMethod || runBrush.GradientStops.Count != newRadialGradientBrush.GradientStops.Count) { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; } else { GradientStop newGradientStop; foreach (GradientStop runGradientStop in runBrush.GradientStops) { newGradientStop = newRadialGradientBrush.GradientStops[count]; if (runGradientStop.Color.A != newGradientStop.Color.A || runGradientStop.Color.B != newGradientStop.Color.B || runGradientStop.Color.G != newGradientStop.Color.G || runGradientStop.Color.R != newGradientStop.Color.R || runGradientStop.Color.ScA != newGradientStop.Color.ScA || runGradientStop.Color.ScB != newGradientStop.Color.ScB || runGradientStop.Color.ScG != newGradientStop.Color.ScG || runGradientStop.Color.ScR != newGradientStop.Color.ScR) { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; e.Handled = true; return; } else { CustomRichTextBox.IsCreateRunColor = false; } count++; } } } else { CustomRichTextBox.IsCreateRunColor = true; CustomRichTextBox.CreateRunTextPointer = CustomRichTextBox.CaretPosition; } } } else { CustomRichTextBox.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, newBrush); } } e.Handled = true; }
public void LoadText(Dictionary <string, string> fields, string source) { try { this.source = source; FileStream fileStream = new FileStream(source, FileMode.Open); TextRange range = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); range.Load(fileStream, DataFormats.Rtf); fileStream.Close(); ComputeFields(); for (int i = 0; i < ModelsField.Count; i++) { string keyword = '#' + ModelsField[i] + '#'; string newString = fields[ModelsField[i]]; TextRange trange = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd); TextPointer current = trange.Start.GetInsertionPosition(LogicalDirection.Forward); while (current != null) { string textInRun = current.GetTextInRun(LogicalDirection.Forward); if (!string.IsNullOrWhiteSpace(textInRun)) { int index = textInRun.IndexOf(keyword); if (index != -1) { TextPointer start = current.GetPositionAtOffset(index, LogicalDirection.Forward); TextPointer end = start.GetPositionAtOffset(keyword.Length, LogicalDirection.Forward); TextRange selection = new TextRange(start, end); bool underlined = false; object fontWeight = selection.GetPropertyValue(Inline.FontWeightProperty); object fontStyle = selection.GetPropertyValue(Inline.FontStyleProperty); object fontUnderline = selection.GetPropertyValue(Inline.TextDecorationsProperty); if (fontUnderline.Equals(TextDecorations.Underline)) { underlined = true; } object fontFamily = selection.GetPropertyValue(Inline.FontFamilyProperty); object fontSize = selection.GetPropertyValue(Inline.FontSizeProperty); selection.Text = newString; selection.ApplyPropertyValue(TextElement.FontWeightProperty, fontWeight); selection.ApplyPropertyValue(TextElement.FontStyleProperty, fontStyle); if (underlined) { selection.ApplyPropertyValue(Inline.TextDecorationsProperty, TextDecorations.Underline); } selection.ApplyPropertyValue(TextElement.FontFamilyProperty, fontFamily); selection.ApplyPropertyValue(TextElement.FontSizeProperty, fontSize); } } current = current.GetNextContextPosition(LogicalDirection.Forward); } } } catch (Exception Ex) { MessageBox.Show(Ex.Message); } }
//private SearchResult Find(string therm, string file) //{ // var document = LoadFile(file); // TextPointer current = document.ContentStart; // int index; // int count = 0; // foreach (var block in document.Blocks) // { // string textInRun = new TextRange(block.ContentStart, block.ContentEnd).Text; // if (!string.IsNullOrWhiteSpace(textInRun)) // { // index = textInRun.IndexOf(therm); // if (index != -1) // { // return new SearchResult { Position = index + count, Path = file, Text = therm };// new TextRange(document.ContentStart.GetPositionAtOffset(index), document.ContentStart.GetPositionAtOffset(index + therm.Length)).Text }); // } // count += textInRun.Length; // } // } // // while (current != null) // //{ // // int index; // // string textInRun = current.GetTextInRun(LogicalDirection.Forward); // // if (!string.IsNullOrWhiteSpace(textInRun)) // // { // // index = textInRun.IndexOf(therm); // // if (index != -1) // // { // // return new KeyValuePair<int, SearchResult>(index, new SearchResult { Path = file, Text = new TextRange(document.ContentStart.GetPositionAtOffset(index), document.ContentStart.GetPositionAtOffset(index + therm.Length)).Text }); // // } // // } // // current = current.GetNextContextPosition(LogicalDirection.Forward); // //} // return null; //} //private void SelectSearchWord(string file, List<SearchResult> items) //{ // foreach (var item in items) // { // if (item.Path == file) // { // new TextRange // (TextBox.MainControl.GetTextPointAt(TextBox.MainControl.Document.ContentStart, item.Position), // TextBox.MainControl.GetTextPointAt(TextBox.MainControl.Document.ContentStart, item.Position + item.Text.Length)) // .ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Yellow); // } // } //} //private void Founds(string textInRun, string threm, string file, int paragraphPosition, ref List<SearchResult> items) //{ // if (!string.IsNullOrWhiteSpace(textInRun)) // { // int count = 0; // while (count != -1) // { // count = textInRun.IndexOf(threm, count); // if (count > -1) // { // items.Add(new SearchResult { Position = paragraphPosition+count, Path = file, Text = threm}); // count += threm.Length; // } // } // } //} private List <SearchResult> FindAll(string therm, string file) { var list = new List <SearchResult>(); var document = TextBox.MainControl;//LoadFile(file); document.SelectAll(); document.Selection // new TextRange // (document.ContentStart, document.ContentEnd) .ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.White); Regex reg = new Regex(therm, RegexOptions.Compiled | RegexOptions.IgnoreCase); TextPointer position = document.Document.ContentStart; List <TextRange> ranges = new List <TextRange>(); int count = 0; while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string text = position.GetTextInRun(LogicalDirection.Forward); var matchs = reg.Matches(text); foreach (Match match in matchs) { TextPointer start = position.GetPositionAtOffset(match.Index); TextPointer end = start.GetPositionAtOffset(therm.Trim().Length); TextRange textrange = new TextRange(start, end); // ranges.Add(textrange); // var range = new TextRange(start, end);// document.ContentStart.(position)+document.ContentStart.GetPositionAtOffset(match.Index), document.ContentStart.GetPositionAtOffset(therm.Trim().Length)); list.Add(new SearchResult { Path = file, Text = textrange.Text, Range = textrange /*Start = document.ContentStart.GetOffsetToPosition(start), End = document.ContentStart.GetOffsetToPosition(end)*/ }); //range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); } } else { count++; } position = position.GetNextContextPosition(LogicalDirection.Forward); } foreach (var range in list) { range.Range.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Red)); // range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); } //foreach (var item in list) //{ // new TextRange(document.ContentStart.GetPositionAtOffset(list.LastOrDefault().Start), document.ContentStart.GetPositionAtOffset(list.LastOrDefault().End)). // ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Yellow); //} //TextPointer p = TextBox.MainControl.Document.ContentStart; //while (true) //{ // var range = FindWordFromPosition(p, therm); // if(range == null) { break; } // list.Add(new SearchResult { Path = file, Position = TextBox.MainControl.Document.ContentStart.GetOffsetToPosition(range.Start.DocumentStart), Text = range.Text }); // p = range.End; //} return(list); }
private void bnt_Search_Click(object sender, RoutedEventArgs e) { TextRange textRange = new TextRange(rich.Document.ContentStart, rich.Document.ContentEnd); //clear up highlighted text before starting a new search textRange.ClearAllProperties(); lbl_Status.Content = ""; //get the richtextbox text string textBoxText = textRange.Text; //get search text string searchText = searchTextBox.Text; if (string.IsNullOrWhiteSpace(textBoxText) || string.IsNullOrWhiteSpace(searchText)) { lbl_Status.Content = "Please provide search text or source text to search from"; } else { //using regex to get the search count //this will include search word even it is part of another word //say we are searching "hi" in "hi, how are you Mahi?" --> match count will be 2 (hi in 'Mahi' also) Regex regex = new Regex(searchText); int count_MatchFound = Regex.Matches(textBoxText, regex.ToString()).Count; for (TextPointer startPointer = rich.Document.ContentStart; startPointer.CompareTo(rich.Document.ContentEnd) <= 0; startPointer = startPointer.GetNextContextPosition(LogicalDirection.Forward)) { //check if end of text if (startPointer.CompareTo(rich.Document.ContentEnd) == 0) { break; } //get the adjacent string string parsedString = startPointer.GetTextInRun(LogicalDirection.Forward); //check if the search string present here int indexOfParseString = parsedString.IndexOf(searchText); if (indexOfParseString >= 0) //present { //setting up the pointer here at this matched index startPointer = startPointer.GetPositionAtOffset(indexOfParseString); if (startPointer != null) { //next pointer will be the length of the search string TextPointer nextPointer = startPointer.GetPositionAtOffset(searchText.Length); //create the text range TextRange searchedTextRange = new TextRange(startPointer, nextPointer); //color up searchedTextRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow)); //add other setting property } } } //update the label text with count if (count_MatchFound > 0) { lbl_Status.Content = "Total Match Found : " + count_MatchFound; } else { lbl_Status.Content = "No Match Found !"; } } }
public static void highlightText(FlowDocument document, string keyword0, bool isRegex0, bool isCasesensitive0) { string keyword1; if (isRegex0) { keyword1 = keyword0; } else { StringBuilder sb1 = new StringBuilder(); foreach (var item in Regex.Split(keyword0, "\\s+")) { if (0 < sb1.Length) { sb1.Append("|"); } sb1.Append("(" + Regex.Escape(item) + ")"); } keyword1 = sb1.ToString(); } // 半角・全角を区別しない { Regex rgx_Wide1 = new Regex("[0-9A-Za-z:- ]+"); Regex rgx_Narrow1 = new Regex("[0-9A-Za-z\\:\\- ]+"); StringBuilder sb1 = new StringBuilder(); bool isEscaped1 = false; for (int i1 = 0; i1 < keyword1.Length; i1++) { string s2 = keyword1[i1].ToString(); if (isRegex0 && keyword1[i1] == '\\') { sb1.Append(s2); isEscaped1 = true; } else if (isEscaped1) { sb1.Append(s2); isEscaped1 = false; } else { Match m_W2 = rgx_Wide1.Match(s2); Match m_N2 = rgx_Narrow1.Match(s2); if (m_W2.Success) { string s3 = Strings.StrConv(m_W2.Value, VbStrConv.Narrow, 0); sb1.Append("(" + s2 + "|" + s3 + ")"); } else if (m_N2.Success) { string s3 = Strings.StrConv(m_N2.Value, VbStrConv.Wide, 0); sb1.Append("(" + s2 + "|" + s3 + ")"); } else { sb1.Append(s2); } } } keyword1 = sb1.ToString(); } // RegexOptions regexOptions1 = RegexOptions.Compiled; if (!isCasesensitive0) { regexOptions1 |= RegexOptions.IgnoreCase; } Regex rgx1 = new Regex(keyword1, regexOptions1); TextPointer pointer = document.ContentStart; while (pointer != null) { if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string textRun = pointer.GetTextInRun(LogicalDirection.Forward); List <TextRange> textRanges1 = new List <TextRange>(); foreach (Match match1 in rgx1.Matches(textRun)) { TextPointer start = pointer.GetPositionAtOffset(match1.Index); TextPointer end = start.GetPositionAtOffset(match1.Length); TextRange textRange1 = new TextRange(start, end); textRanges1.Add(textRange1); } foreach (var textRange1 in textRanges1) { textRange1.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Yellow); } } pointer = pointer.GetNextContextPosition(LogicalDirection.Forward); } }
private void updageTagOnFlag(Note note) { byte[] flag = NotesBrowser.getJPGFromImageControl(Properties.Resources.noteFlag); for (TextPointer position = note.Range.Start; position != null && position.CompareTo(note.Range.End) != 1; position = position.GetNextContextPosition(LogicalDirection.Forward)) { InlineUIContainer element = position.Parent as InlineUIContainer; if (element != null && element.Child is System.Windows.Controls.Image) { var image = element.Child as System.Windows.Controls.Image; if (image == null) { continue; } var imageSourse = image.Source as System.Windows.Media.ImageSource; if (imageSourse == null) { continue; } byte[] byt = NotesBrowser.getJPGFromImageControl(imageSourse); //сравнивает картинки if (byt.Length == flag.Length) { bool isflag = true; for (int t = 0; t < byt.Length; t++) { if (byt[t] != flag[t]) { isflag = false; break; } } if (!isflag) { continue; } image.Tag = note.Name; } } } }
public void HighlightText() { // Clear out the old highlights within the correct block. highlights.RemoveAll(i => HighlightStart.CompareTo(i.Range.Start) >= 0 && HighlightEnd.CompareTo(i.Range.Start) < 0); // Create a pointer to the start - which we will increment. CurrentPointer = HighlightStart; // Initilize the parser. TextHighlighter.Init(); // Set the textbox within the parser to this textbox. TextHighlighter.TextBox = this; // Reset text for parser instead of setting, b/c we'll dynamically set it as we come across each run, // so that the whitespace detection (which allows anything at the end) will allow tokens at the end of a run! //TextHighlighter.Text = ABParse.ABParser.ToCharArray(TextNoLineBreaks); TextHighlighter.Text = new char[TextNoLineBreaks.Length]; // Move forward through all the symbols, and act where all the text is... while (CurrentPointer.CompareTo(HighlightEnd) < 0) { // We're going to use ABParser, which is another ABSoftware product capable of parsing a test JSON string (55 characters) within 0.0232ms! // However, we can't use it the way it's intended (with a string) because this RichTextBox has a BUNCH of other symbols added. // So, instead... We're going to manually call to method that processes each character... When we're actually at a piece of text! // Get the current context - this is essentially what this symbol means. var context = CurrentPointer.GetPointerContext(LogicalDirection.Backward); // If this is a run - that's where the text is so we can process it! if (context == TextPointerContext.ElementStart && CurrentPointer.Parent is Run run) { // Just in case the "Highlight" methods execute too late, we'll store this run in a variable. lastRun = run; // Add this run as text to the parser - the parser works with character arrays so we need to make sure we convert it. ABParse.ABParser.ToCharArray(run.Text).CopyTo(TextHighlighter.Text, TextHighlighter.CurrentLocation); // Go through all the text in this run - this is where the heart of the highlighter is. for (currentPos = 0; currentPos < run.Text.Length; currentPos++) { // Process this character. var result = TextHighlighter.ProcessChar(true); // Also, we passed false to the process character method because we wanted the events to execute AFTER getting // the start of the token, so, NOW we'll check the events - if we should. //if (!result) //TextHighlighter.ProcessBuiltUpTokens(false); // Make sure we move on the next character in the parser - if this isn't the last one. if (TextHighlighter.CurrentLocation + 1 < TextHighlighter.Text.Length) { TextHighlighter.MoveForward(); } } // We need to store the end of this run - so that the whitespace detection can allow tokens at start/ends of runs. TextHighlighter.RunStart = TextHighlighter.CurrentLocation; // Now that we've finished with this run - which represent lines in our case, make sure we aren't highlighting the line anymore. TextHighlighter.LineHighlighted = false; // The currentPos is now one character too far ahead - so, if this is the end of the string, shift it back one. //if (TextHighlighter.CurrentLocation + 1 == TextHighlighter.Text.Length) // currentPos--; } // Go to the next insertion point if it isn't at a valid one. CurrentPointer = CurrentPointer.GetNextContextPosition(LogicalDirection.Forward); } // Now that we're completely finished, we haven't chosen a start/emd yet. chosenStartEnd = false; // Make sure we clean it up afterwards TextHighlighter.ProcessBuiltUpTokens(false); // We also want to reset all the variables ready for the next go. TextHighlighter.Stop(); // Now, apply all the highlights that were created - they had to be put into an array, because, // otherwise, the runs start to change while we're highlighting... which isn't what we want. ApplyHighlights(); //// Create a navigator to go through the text. //var navigator = txtCode.Document.ContentStart; //// Go through all the text. //while (navigator.CompareTo(txtCode.Document.ContentEnd) < 0) //{ // // Get a context of where the navigator is. // var context = navigator.GetPointerContext(LogicalDirection.Backward); // // If we're at the start of a run, start highlighting. // if (context == TextPointerContext.ElementStart && navigator.Parent is Run) // HighlightRun(navigator.Parent as Run); // // Go to the next character. // navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); //} }
/// <summary> /// Writes the container into the specified XmlWriter. /// </summary> private void WriteContainer(TextPointer start, TextPointer end, XmlWriter writer) { TextElement textElement; System.Diagnostics.Debug.Assert(start != null); System.Diagnostics.Debug.Assert(end != null); System.Diagnostics.Debug.Assert(writer != null); _writer = writer; WriteWordXmlHead(); _cursor = start; while (_cursor.CompareTo(end) < 0) { switch (_cursor.GetPointerContext(_dir)) { case TextPointerContext.None: System.Diagnostics.Debug.Assert(false, "Next symbol should never be None if cursor < End."); break; case TextPointerContext.Text: RequireOpenRange(); _writer.WriteStartElement(WordXmlSerializer.WordTextTag); _writer.WriteString(_cursor.GetTextInRun(_dir)); _writer.WriteEndElement(); break; case TextPointerContext.EmbeddedElement: DependencyObject obj = _cursor.GetAdjacentElement(LogicalDirection.Forward); if (obj is LineBreak) { RequireOpenRange(); _writer.WriteStartElement(WordXmlSerializer.WordBreakTag); _writer.WriteEndElement(); } // TODO: try to convert some known embedded objects. break; case TextPointerContext.ElementStart: TextPointer position; position = _cursor; position = position.GetNextContextPosition(LogicalDirection.Forward); textElement = position.Parent as TextElement; if (textElement is Paragraph) { RequireClosedRange(); RequireOpenParagraph(); } else if (textElement is Inline) { RequireClosedRange(); RequireOpenParagraph(); RequireOpenRange(); } break; case TextPointerContext.ElementEnd: textElement = _cursor.Parent as TextElement; if (textElement is Inline) { RequireClosedRange(); } else if (textElement is Paragraph) { RequireClosedParagraph(); } break; } _cursor = _cursor.GetNextContextPosition(_dir); } RequireClosedRange(); WriteWordXmlTail(); }
private void btnTab1Ok_Click(object sender, RoutedEventArgs e) { try { txtTab3Search.Text = txtTab4Search.Text = txtTab1Search.Text; var myFile = (File.ReadAllText(myOpenedFile)).Split(); labNumberHits.Text = myFile.Where(u => u.Contains(txtTab1Search.Text)).Count().ToString(); int i = 0; List <int> indexOfFind = new List <int>(); foreach (var q in myFile) { if (q.Contains(txtTab1Search.Text)) { indexOfFind.Add(i); } i++; } txtRichText1.Document.Blocks.Clear(); foreach (var t in indexOfFind) { string S = ""; if (t >= 7) { for (int u = 7; u >= 0; u--) { S += " " + myFile[t - u]; } } else { for (int u = t % 7; u >= 0; u--) { S += " " + myFile[t - u]; } } if (t + 7 <= myFile.Count()) { for (int u = 1; u <= 7; u++) { S += " " + myFile[t + u]; } } else { for (int u = 1; u <= u - myFile.Count(); u++) { S += " " + myFile[t + u]; } } txtRichText1.Document.Blocks.Add(new Paragraph(new Run(S))); } txtRichText1.SelectAll(); txtRichText1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Black)); txtRichText1.Selection.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal); Regex reg = new Regex(txtTab1Search.Text.Trim(), RegexOptions.Compiled | RegexOptions.IgnoreCase); TextPointer position = txtRichText1.Document.ContentStart; List <TextRange> ranges = new List <TextRange>(); while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { string text = position.GetTextInRun(LogicalDirection.Forward); var matchs = reg.Matches(text); foreach (Match match in matchs) { TextPointer start = position.GetPositionAtOffset(match.Index); TextPointer end = start.GetPositionAtOffset(txtTab1Search.Text.Trim().Length); TextRange textrange = new TextRange(start, end); ranges.Add(textrange); } } position = position.GetNextContextPosition(LogicalDirection.Forward); } foreach (TextRange range in ranges) { range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Blue)); range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); } } catch (Exception ex) { MessageBox.Show("File not selected!"); } }
private void TextInput_TextChanged(object sender, TextChangedEventArgs e) { TextInput.TextChanged -= TextInput_TextChanged; string tokens = "(auto|double|int|struct|break|else|long|switch|case|" + "enum|register|typedef|char|extern|return|union|const|" + "float|short|unsigned|continue|for|signed|void |default|" + "goto|sizeof|volatile|do|if|static|while|using)"; Regex rex = new Regex(tokens); if (TextInput.Document == null) { return; } TextRange documentRange = new TextRange(TextInput.Document.ContentStart, TextInput.Document.ContentEnd); documentRange.ClearAllProperties(); //Console.WriteLine(documentRange.Text); TextPointer position = TextInput.Document.ContentStart; while (position != null) { if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { break; } position = position.GetNextContextPosition(LogicalDirection.Forward); } MatchCollection mc = rex.Matches(documentRange.Text); foreach (Match m in mc) { //Console.Write("{0}({1}-{2}), ", m.Value, m.Index, m.Index + m.Length); TextPointer t1 = GetTextPointAt(position, m.Index); TextRange tr = new TextRange(t1, GetTextPointAt(t1, m.Length)); tr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); } TextInput.TextChanged += TextInput_TextChanged; return; /* * int line = 0; * int b = 0; * while (position != null) * { * if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) * { * string textRun = position.GetTextInRun(LogicalDirection.Forward); * MatchCollection mc = rex.Matches(textRun); * foreach (Match m in mc) * { * //Console.Write("{0}({1}-{2}), ", m.Value, m.Index, m.Index+m.Length); * TextPointer t1 = GetTextPointAt(position, m.Index); * TextRange tr = new TextRange(t1, GetTextPointAt(t1, m.Length)); * * if ((b % 3) == 0) * { * tr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red)); * } * else if ((b % 3) == 1) * { * tr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.LightBlue)); * } * else * { * tr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Yellow)); * } ++b; * * } * // Find the starting index of any substring that matches "word". * /*int indexInRun = textRun.IndexOf("void"); * if (indexInRun >= 0) * { * Console.WriteLine("Found: {0}, text:\"{1}\" ", indexInRun, textRun); * //position = position.GetPositionAtOffset(indexInRun); * //break; * } * position = position.GetLineStartPosition(1); * continue; * } * position = position.GetNextContextPosition(LogicalDirection.Forward); * } */ /*if (tp1 == null) * return; * while (tp1.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text) * { * tp1 = tp1.GetNextContextPosition(LogicalDirection.Forward); * } * //Console.WriteLine(""); * * foreach (Match m in mc) * { * Console.WriteLine("Match: {0} [{1},{2}]", m.Value, m.Index, m.Length); * //int startIdx = m.Index; * //int stopIdx = m.Length; * //documentRange.Select(TextInput.Document.ContentStart, TextInput.Document.ContentStart.GetPositionAtOffset(m.Index + m.Length, LogicalDirection.Forward)); * TextPointer tp2 = tp1.GetPositionAtOffset(m.Index, LogicalDirection.Forward); * * Console.WriteLine(tp2.GetOffsetToPosition(tp2.GetPositionAtOffset(m.Length, LogicalDirection.Forward))); * * TextRange tr = new TextRange(tp2, tp2.GetPositionAtOffset(m.Length, LogicalDirection.Forward)); * * tr.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red); * }*/ TextInput.TextChanged += TextInput_TextChanged; //TextInput.TextChanged += TextInput_TextChanged; /*documentRange.ClearAllProperties(); * * Console.WriteLine(documentRange.Text); * * TextPointer navigator = TextInput.Document.ContentStart; * * while (navigator.CompareTo(TextInput.Document.ContentEnd) < 0) * { * TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); * if (context == TextPointerContext.ElementStart && navigator.Parent is Run) * { * Console.WriteLine(navigator.GetTextRunLength(LogicalDirection.Forward)); * } * * navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); * } * * Format(); * */ }
/// <summary> /// When input text is changed, change colors of text based on syntax /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void InputTextBox_TextChanged(object sender, TextChangedEventArgs e) { string text = ""; //Input is empty, no need to color anything if (inputTextBox.Document == null || inputTextBox.Document.Blocks.Count == 0) { return; } //Remove event handler to prevent infinite loop. inputTextBox.TextChanged -= InputTextBox_TextChanged; words.Clear(); TextRange documentRange = new TextRange(inputTextBox.Document.ContentStart, inputTextBox.Document.ContentEnd); documentRange.ClearAllProperties(); TextPointer navigator = inputTextBox.Document.ContentStart; //Go through the document while (navigator.CompareTo(inputTextBox.Document.ContentEnd) < 0) { TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); if (context == TextPointerContext.ElementStart && navigator.Parent is Run) { text = ((Run)navigator.Parent).Text; if (text != "" && text.Length != 0) { Run parentRun = (Run)navigator.Parent; CheckWords(parentRun, text); } } navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } RedrawInput(); if (words.Count() > 0) { if (GetItemIndex(-1, words) != -1) { //There was an error in the input, equation can not be solved } else { string result = Solve(WordToNodeList(words)); if (result == "" || (result.Length >= 3 && result.Substring(0, 3) == "err")) { textBlockResult.Text = "Neplatny vyraz"; } else { textBlockResult.Text = result; } textBlockMemory.Text = ""; for (int i = 0; i < memory.Count(); i++) { if (i % 3 == 2) { textBlockMemory.Text += memory[i].Letter + "=" + Convert.ToString(memory[i].Number) + "\n"; } else { textBlockMemory.Text += memory[i].Letter + "=" + Convert.ToString(memory[i].Number) + "\t"; } } } } //Add back event handler inputTextBox.TextChanged += InputTextBox_TextChanged; }
private void txtStatus_TextChanged(object sender, TextChangedEventArgs e) { string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string settingsPath = desktopPath + "\\CodeVoidProject\\CodeVoid\\CodeVoidWPF\\bin\\Debug\\Data\\DarkModeFix.txt"; using (StreamReader sr = new StreamReader(settingsPath)) { string line; line = sr.ReadLine(); if (line.Contains("DarkMode:True")) { txtStatus.Background = Brushes.DarkGray; } else { //do something.. } } if (txtStatus.Document == null) { return; } txtStatus.TextChanged -= txtStatus_TextChanged; m_blueTags.Clear(); gr_Tags.Clear(); yellow_Tags.Clear(); Console.WriteLine(); TextPointer navigator = txtStatus.Document.ContentStart; TextPointer grnavigator = txtStatus.Document.ContentStart; TextPointer yellownavigator = txtStatus.Document.ContentStart; while (navigator.CompareTo(txtStatus.Document.ContentEnd) < 0) { TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); if (context == TextPointerContext.ElementStart && navigator.Parent is Run) { text = ((Run)navigator.Parent).Text; //fix 2 if (text != "") { CheckWordsInRun((Run)navigator.Parent); } } navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } while (grnavigator.CompareTo(txtStatus.Document.ContentEnd) < 0) { TextPointerContext grcontext = grnavigator.GetPointerContext(LogicalDirection.Backward); if (grcontext == TextPointerContext.ElementStart && grnavigator.Parent is Run) { grtext = ((Run)grnavigator.Parent).Text; //fix 2 if (grtext != "") { grCheckWordsInRun((Run)grnavigator.Parent); } } grnavigator = grnavigator.GetNextContextPosition(LogicalDirection.Forward); } while (yellownavigator.CompareTo(txtStatus.Document.ContentEnd) < 0) { TextPointerContext yellowcontext = yellownavigator.GetPointerContext(LogicalDirection.Backward); if (yellowcontext == TextPointerContext.ElementStart && yellownavigator.Parent is Run) { yellowtext = ((Run)yellownavigator.Parent).Text; //fix 2 if (yellowtext != "") { yellowCheckWordsInRun((Run)yellownavigator.Parent); } } yellownavigator = yellownavigator.GetNextContextPosition(LogicalDirection.Forward); } for (int i = 0; i < m_blueTags.Count; i++) { try { TextRange range = new TextRange(m_blueTags[i].StartPosition, m_blueTags[i].EndPosition); range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Blue)); range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal); } catch { } } for (int i = 0; i < gr_Tags.Count; i++) { try { Console.WriteLine(); TextRange grrange = new TextRange(gr_Tags[i].grStartPosition, gr_Tags[i].grEndPosition); grrange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Green)); grrange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal); } catch { } } for (int i = 0; i < yellow_Tags.Count; i++) { try { Console.WriteLine(); TextRange yellowrange = new TextRange(yellow_Tags[i].yellowStartPosition, yellow_Tags[i].yellowEndPosition); yellowrange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.GreenYellow)); yellowrange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal); } catch { } } txtStatus.TextChanged += txtStatus_TextChanged; }
void WriteOpenXML(TextPointer contentstart, TextPointer contentend, XmlWriter xmlwriter, XmlWriter numberingwriter) { TextElement textElement; _openxmlwriter = xmlwriter; _numberingwriter = numberingwriter; WriteOpenXmlHeader(); WriteNumberingHeader(); WriteNumberingBody(); _textpointer = contentstart; while (_textpointer.CompareTo(contentend) < 0) { TextPointerContext tpc = _textpointer.GetPointerContext(LogicalDirection.Forward); if (tpc == TextPointerContext.ElementStart) { TextPointer position; position = _textpointer; position = position.GetNextContextPosition(LogicalDirection.Forward); textElement = position.Parent as TextElement; if (textElement is Paragraph) { CloseTextRunTag(); CreateParagraphTag(); } else if (textElement is Inline) { CloseTextRunTag(); EnsureWithinParagraphTag(); CreateTextRunTag(); } else if (textElement is List) { //keep track of list levels (add) List lx = (List)textElement; TextMarkerStyle mst = (TextMarkerStyle)lx.GetValue(List.MarkerStyleProperty); listMarkerStyle[listLevel] = mst; listLevel++; if (listLevel > 29) { listLevel = 29; } } else if (textElement is ListItem) { listContext = 1; } } else if (tpc == TextPointerContext.ElementEnd) { textElement = _textpointer.Parent as TextElement; if (textElement is Inline) { CloseTextRunTag(); } else if (textElement is Paragraph) { CloseParagraphTag(); } else if (textElement is List) { //keep track of list levels (subtract) listLevel--; if (listLevel < 0) { listLevel = 0; } } else if (textElement is ListItem) { } } else if (tpc == TextPointerContext.Text) { CreateTextRunTag(); _openxmlwriter.WriteStartElement("w:t"); _openxmlwriter.WriteString(_textpointer.GetTextInRun(LogicalDirection.Forward)); _openxmlwriter.WriteEndElement(); } else if (tpc == TextPointerContext.EmbeddedElement) { DependencyObject obj = _textpointer.GetAdjacentElement(LogicalDirection.Forward); if (obj is LineBreak) { CreateTextRunTag(); _openxmlwriter.WriteStartElement("w:br"); _openxmlwriter.WriteEndElement(); } // other embedded objects here } _textpointer = _textpointer.GetNextContextPosition(LogicalDirection.Forward); }//end while CloseTextRunTag(); WriteNumberingFooter(); WriteOpenXmlFooter(); }
internal string GetTextInternal(TextPointer startPosition, TextPointer endPosition, ref char[] charArray) { StringBuilder textBuffer = new StringBuilder(); Stack <int> listItemCounter = null; TextPointer navigator = startPosition; Debug.Assert(startPosition.CompareTo(endPosition) <= 0, "expecting: startPosition <= endPosition"); while (navigator.CompareTo(endPosition) < 0) { Type elementType; int start = textBuffer.Length; TextPointer begin = navigator; switch (navigator.GetPointerContext(LogicalDirection.Forward)) { case TextPointerContext.Text: { PlainConvertTextRun(textBuffer, ref navigator, endPosition, ref charArray); Add(begin, navigator, start, textBuffer.Length); continue; } case TextPointerContext.EmbeddedElement: { textBuffer.Append(' '); navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); Add(begin, navigator, start, textBuffer.Length); continue; } case TextPointerContext.ElementStart: { elementType = navigator.GetAdjacentElement(LogicalDirection.Forward).GetType(); if (!typeof(AnchoredBlock).IsAssignableFrom(elementType)) { if (typeof(List).IsAssignableFrom(elementType) && (navigator is TextPointer)) { PlainConvertListStart(navigator, ref listItemCounter); } else if (typeof(ListItem).IsAssignableFrom(elementType)) { PlainConvertListItemStart(textBuffer, navigator, ref listItemCounter); } else { PlainConvertAccessKey(textBuffer, navigator); } } //textBuffer.Append(Environment.NewLine); navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); Add(begin, navigator, start, textBuffer.Length); continue; } case TextPointerContext.ElementEnd: { elementType = navigator.Parent.GetType(); if (!typeof(Paragraph).IsAssignableFrom(elementType) && !typeof(BlockUIContainer).IsAssignableFrom(elementType)) { break; } PlainConvertParagraphEnd(textBuffer, ref navigator); Add(begin, navigator, start, textBuffer.Length); continue; } default: Debug.Assert(false, "Unexpected value for TextPointerContext"); continue; } if (typeof(LineBreak).IsAssignableFrom(elementType)) { navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); textBuffer.Append(Environment.NewLine); Add(begin, navigator, start, textBuffer.Length); } else if (typeof(List).IsAssignableFrom(elementType)) { PlainConvertListEnd(ref navigator, ref listItemCounter); Add(begin, navigator, start, textBuffer.Length); } else { navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); } continue; } return(textBuffer.ToString()); }
/* * ---------------- / HELPER FUNCTIONS -------------- */ /* * ---------------- TEXT EDITOR STYLE HANDLERS ---------------- */ private void Editor_TextChanged(object sender, TextChangedEventArgs e) { /* Don't do anything if the document is not set up yet */ if (Editor.Document == null) { return; } /* Temporarily disable TextChanged event handler */ Editor.TextChanged -= Editor_TextChanged; /* Clear the buffer that holds the words to be styled */ keywordBuffer.Clear(); /* Remove all current formatting properties */ TextRange docRange = new TextRange(Editor.Document.ContentStart, Editor.Document.ContentEnd); docRange.ClearAllProperties(); /* Find keywords in program by checking each run */ TextPointer nav = Editor.Document.ContentStart; while (nav.CompareTo(Editor.Document.ContentEnd) < 0) { TextPointerContext ctxt = nav.GetPointerContext(LogicalDirection.Backward); if (ctxt == TextPointerContext.ElementStart && nav.Parent is Run) { currentText = ((Run)nav.Parent).Text; /* Only check words if the Run is not empty */ if (currentText != "") { CheckWordsInRun((Run)nav.Parent); } } nav = nav.GetNextContextPosition(LogicalDirection.Forward); } /* / Find keywords in program */ /* Highlight keywords in program */ for (int i = 0; i < keywordBuffer.Count; ++i) { try { /* Find the desired keyword in the text box using the current word's location data */ TextRange range = new TextRange(keywordBuffer[i].Start, keywordBuffer[i].End); /* Apply every style property from the Style data */ foreach (KeyValuePair <DependencyProperty, object> style in keywordBuffer[i].Style.GetDict()) { range.ApplyPropertyValue(style.Key, style.Value); } } /* This shouldn't ever happen */ catch { MessageBox.Show("There was a problem with the editor's color highlighting feature\nSorry for the inconvenience...."); System.Environment.Exit(1); } } /* / Highlight keywords in program */ Editor.TextChanged += Editor_TextChanged; /* Re-enable TextChanged event handler */ }