2 * Copyright (C) 2013 FooProject
\r
3 * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
\r
4 * the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
\r
6 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
7 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
\r
9 You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
13 using System.Threading.Tasks;
\r
14 using System.Runtime.InteropServices;
\r
15 using System.Windows;
\r
16 using System.Windows.Input;
\r
17 using System.Windows.Media;
\r
18 using System.Windows.Controls;
\r
19 using System.Windows.Controls.Primitives;
\r
20 using System.Windows.Documents;
\r
21 using System.Windows.Interop;
\r
22 using System.Windows.Threading;
\r
23 using DotNetTextStore;
\r
24 using DotNetTextStore.UnmanagedAPI.TSF;
\r
25 using DotNetTextStore.UnmanagedAPI.WinDef;
\r
26 using Microsoft.Win32;
\r
28 namespace FooEditEngine.WPF
\r
31 /// オートインデントを行うためのデリゲートを表す
\r
33 /// <param name="sender">イベント発生元のオブジェクト</param>
\r
34 /// <param name="e">イベントデーター</param>
\r
35 public delegate void AutoIndentHookerHandler(object sender,EventArgs e);
\r
38 /// WPFでのFooTextBoxの実装
\r
40 public sealed class FooTextBox : Control, IDisposable
\r
42 const double MaxFontSize = 72.0f;
\r
43 const double MinFontSize = 1;
\r
46 Controller _Controller;
\r
49 ScrollBar verticalScrollBar, horizontalScrollBar;
\r
50 TextStore textStore;
\r
51 DispatcherTimer timer;
\r
52 bool disposed = false;
\r
53 FooTextBoxAutomationPeer peer;
\r
54 bool nowCaretMove = false;
\r
58 DefaultStyleKeyProperty.OverrideMetadata(typeof(FooTextBox), new FrameworkPropertyMetadata(typeof(FooTextBox)));
\r
59 KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(FooTextBox), new FrameworkPropertyMetadata(true));
\r
60 KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(FooTextBox), new FrameworkPropertyMetadata(KeyboardNavigationMode.None));
\r
68 this.image = new Image();
\r
69 this.image.Stretch = Stretch.Fill;
\r
70 this.image.HorizontalAlignment = HorizontalAlignment.Left;
\r
71 this.image.VerticalAlignment = VerticalAlignment.Top;
\r
73 this.textStore = new TextStore();
\r
74 this.textStore.IsLoading += textStore_IsLoading;
\r
75 this.textStore.IsReadOnly += textStore_IsReadOnly;
\r
76 this.textStore.GetDpi += textStore_GetDpi;
\r
77 this.textStore.GetStringLength += () => this.Document.Length;
\r
78 this.textStore.GetString += _textStore_GetString;
\r
79 this.textStore.GetSelectionIndex += _textStore_GetSelectionIndex;
\r
80 this.textStore.SetSelectionIndex += _textStore_SetSelectionIndex;
\r
81 this.textStore.InsertAtSelection += _textStore_InsertAtSelection;
\r
82 this.textStore.GetHWnd += _textStore_GetHWnd;
\r
83 this.textStore.GetScreenExtent += _textStore_GetScreenExtent;
\r
84 this.textStore.GetStringExtent += _textStore_GetStringExtent;
\r
85 this.textStore.CompositionStarted += textStore_CompositionStarted;
\r
86 this.textStore.CompositionUpdated += textStore_CompositionUpdated;
\r
87 this.textStore.CompositionEnded += textStore_CompositionEnded;
\r
89 this.Render = new D2DRender(this, 200, 200,this.image);
\r
90 this.Render.ShowFullSpace = this.ShowFullSpace;
\r
91 this.Render.ShowHalfSpace = this.ShowHalfSpace;
\r
92 this.Render.ShowTab = this.ShowTab;
\r
94 this.Document = new Document();
\r
95 this.Document.LayoutLines.Render = this.Render;
\r
97 this.View = new EditView(this.Document, this.Render, new Padding(5, 5, 5, 5));
\r
98 this.View.SrcChanged += View_SrcChanged;
\r
99 this.View.InsertMode = this.InsertMode;
\r
100 this.View.DrawLineNumber = this.DrawLineNumber;
\r
101 this.View.HideCaret = !this.DrawCaret;
\r
102 this.View.HideLineMarker = !this.DrawCaretLine;
\r
103 this.View.HideRuler = !this.DrawRuler;
\r
104 this.View.UrlMark = this.MarkURL;
\r
105 this.View.TabStops = this.TabChars;
\r
107 this._Controller = new Controller(this.Document, this.View);
\r
108 this._Controller.SelectionChanged += new EventHandler(Controller_SelectionChanged);
\r
110 //Viewを作成した後に追加しないと例外が発生する
\r
111 this.Document.Update += new DocumentUpdateEventHandler(Document_Update);
\r
113 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, CopyCommand, CanExecute));
\r
114 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, CutCommand, CanExecute));
\r
115 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, PasteCommand, CanExecute));
\r
116 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, DeleteCommand, CanExecute));
\r
117 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAllCommand, CanExecute));
\r
118 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, UndoCommand, CanExecute));
\r
119 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, RedoCommand, CanExecute));
\r
120 this.CommandBindings.Add(new CommandBinding(EditingCommands.ToggleInsert, ToggleInsertCommand, CanExecute));
\r
121 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleRectSelectMode, ToggleRectSelectCommand, CanExecute));
\r
122 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleFlowDirection, ToggleFlowDirectionCommand, CanExecute));
\r
123 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleCodePoint, ToggleCodePointCommand, CanExecute));
\r
125 this.InputBindings.Add(new InputBinding(ApplicationCommands.Copy, new KeyGesture(Key.C, ModifierKeys.Control)));
\r
126 this.InputBindings.Add(new InputBinding(ApplicationCommands.Cut, new KeyGesture(Key.X, ModifierKeys.Control)));
\r
127 this.InputBindings.Add(new InputBinding(ApplicationCommands.Paste, new KeyGesture(Key.V, ModifierKeys.Control)));
\r
128 this.InputBindings.Add(new InputBinding(ApplicationCommands.Delete, new KeyGesture(Key.Delete, ModifierKeys.None)));
\r
129 this.InputBindings.Add(new InputBinding(ApplicationCommands.SelectAll, new KeyGesture(Key.A, ModifierKeys.Control)));
\r
130 this.InputBindings.Add(new InputBinding(ApplicationCommands.Undo, new KeyGesture(Key.Z, ModifierKeys.Control)));
\r
131 this.InputBindings.Add(new InputBinding(ApplicationCommands.Redo, new KeyGesture(Key.Y, ModifierKeys.Control)));
\r
132 this.InputBindings.Add(new InputBinding(EditingCommands.ToggleInsert, new KeyGesture(Key.Insert, ModifierKeys.None)));
\r
133 this.InputBindings.Add(new InputBinding(FooTextBoxCommands.ToggleCodePoint, new KeyGesture(Key.X, ModifierKeys.Alt)));
\r
135 this.timer = new DispatcherTimer();
\r
136 this.timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
\r
137 this.timer.Tick += new EventHandler(timer_Tick);
\r
139 this.Loaded += new RoutedEventHandler(FooTextBox_Loaded);
\r
141 this.AutoIndentHooker = (s,e)=>{};
\r
143 SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
\r
145 this.SystemEvents_UserPreferenceChanged(null, new UserPreferenceChangedEventArgs(UserPreferenceCategory.Keyboard));
\r
147 this.CaretMoved += (s, e) => { };
\r
155 //Dispose(false)を呼び出すと落ちる
\r
156 this.Dispose(false);
\r
160 /// オートインデントを行うためのイベント
\r
162 public AutoIndentHookerHandler AutoIndentHooker;
\r
167 public override void OnApplyTemplate()
\r
169 base.OnApplyTemplate();
\r
171 Grid grid = this.GetTemplateChild("PART_Grid") as Grid;
\r
174 Grid.SetRow(this.image, 0);
\r
175 Grid.SetColumn(this.image, 0);
\r
176 grid.Children.Add(this.image);
\r
179 this.horizontalScrollBar = this.GetTemplateChild("PART_HorizontalScrollBar") as ScrollBar;
\r
180 if (this.horizontalScrollBar != null)
\r
182 this.horizontalScrollBar.SmallChange = 10;
\r
183 this.horizontalScrollBar.LargeChange = 100;
\r
184 this.horizontalScrollBar.Maximum = this.horizontalScrollBar.LargeChange + 1;
\r
185 this.horizontalScrollBar.Scroll += new ScrollEventHandler(horizontalScrollBar_Scroll);
\r
187 this.verticalScrollBar = this.GetTemplateChild("PART_VerticalScrollBar") as ScrollBar;
\r
188 if (this.verticalScrollBar != null)
\r
190 this.verticalScrollBar.SmallChange = 1;
\r
191 this.verticalScrollBar.LargeChange = 10;
\r
192 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;
\r
193 this.verticalScrollBar.Scroll += new ScrollEventHandler(verticalScrollBar_Scroll);
\r
200 /// <param name="start">開始インデックス</param>
\r
201 /// <param name="length">長さ</param>
\r
202 public void Select(int start, int length)
\r
204 this._Controller.Select(start, length);
\r
205 this.textStore.NotifySelectionChanged();
\r
209 /// キャレットを指定した行に移動させます
\r
211 /// <param name="index">インデックス</param>
\r
212 /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>
\r
213 public void JumpCaret(int index)
\r
215 this._Controller.JumpCaret(index);
\r
218 /// キャレットを指定した行と桁に移動させます
\r
220 /// <param name="row">行番号</param>
\r
221 /// <param name="col">桁</param>
\r
222 /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>
\r
223 public void JumpCaret(int row, int col)
\r
225 this._Controller.JumpCaret(row, col);
\r
229 /// 選択中のテキストをクリップボードにコピーします
\r
233 string text = this._Controller.SelectedText;
\r
234 if (text != null && text != string.Empty)
\r
235 Clipboard.SetText(text);
\r
239 /// 選択中のテキストをクリップボードに切り取ります
\r
243 string text = this._Controller.SelectedText;
\r
244 if (text != null && text != string.Empty)
\r
246 Clipboard.SetText(text);
\r
247 this._Controller.SelectedText = "";
\r
252 /// 選択中のテキストを貼り付けます
\r
254 public void Paste()
\r
256 if (Clipboard.ContainsText() == false)
\r
258 string text = Clipboard.GetText();
\r
259 this._Controller.SelectedText = text;
\r
265 public void DeSelectAll()
\r
267 this._Controller.DeSelectAll();
\r
268 this.textStore.NotifySelectionChanged();
\r
274 /// <param name="tp">テキストポイント</param>
\r
275 /// <returns>座標</returns>
\r
276 /// <remarks>テキストポイントがクライアント領域の原点より外にある場合、返される値は原点に丸められます</remarks>
\r
277 public System.Windows.Point GetPostionFromTextPoint(TextPoint tp)
\r
279 if (this.Document.FireUpdateEvent == false)
\r
280 throw new InvalidOperationException("");
\r
281 return this.View.GetPostionFromTextPoint(tp);
\r
285 /// 対応するテキストポイントを返します
\r
287 /// <param name="p">クライアント領域の原点を左上とする座標</param>
\r
288 /// <returns>テキストポイント</returns>
\r
289 public TextPoint GetTextPointFromPostion(System.Windows.Point p)
\r
291 if (this.Document.FireUpdateEvent == false)
\r
292 throw new InvalidOperationException("");
\r
293 return this.View.GetTextPointFromPostion(p);
\r
299 /// <param name="row">レイアウト行</param>
\r
300 /// <returns>行の高さ</returns>
\r
301 public double GetLineHeight(int row)
\r
303 if (this.Document.FireUpdateEvent == false)
\r
304 throw new InvalidOperationException("");
\r
305 return this.View.LayoutLines.GetLayout(row).Height;;
\r
309 /// インデックスに対応する座標を得ます
\r
311 /// <param name="index">インデックス</param>
\r
312 /// <returns>座標を返す</returns>
\r
313 public System.Windows.Point GetPostionFromIndex(int index)
\r
315 if (this.Document.FireUpdateEvent == false)
\r
316 throw new InvalidOperationException("");
\r
317 TextPoint tp = this.View.GetLayoutLineFromIndex(index);
\r
318 return this.View.GetPostionFromTextPoint(tp);
\r
322 /// 座標からインデックスに変換します
\r
324 /// <param name="p">座標</param>
\r
325 /// <returns>インデックスを返す</returns>
\r
326 public int GetIndexFromPostion(System.Windows.Point p)
\r
328 if (this.Document.FireUpdateEvent == false)
\r
329 throw new InvalidOperationException("");
\r
330 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
331 return this.View.GetIndexFromLayoutLine(tp);
\r
337 public void Refresh()
\r
339 this.Refresh(this.View.PageBound);
\r
343 /// レイアウト行をすべて破棄し、再度レイアウトを行う
\r
345 public void PerfomLayouts()
\r
347 this.View.PerfomLayouts();
\r
351 /// ストリームからドキュメントを構築する
\r
353 /// <param name="tr">TextReader</param>
\r
354 /// <param name="token">キャンセル用トークン</param>
\r
355 /// <returns>Taskオブジェクト</returns>
\r
356 public async Task LoadAsync(System.IO.TextReader tr, System.Threading.CancellationTokenSource token)
\r
358 WinFileReader fs = new WinFileReader(tr);
\r
359 await this.LoadAsyncImpl(fs, token);
\r
363 /// ファイルからドキュメントを構築する
\r
365 /// <param name="filepath">ファイルパス</param>
\r
366 /// <param name="enc">エンコード</param>
\r
367 /// <param name="token">キャンセル用トークン</param>
\r
368 /// <returns>Taskオブジェクト</returns>
\r
369 public async Task LoadFileAsync(string filepath, Encoding enc,System.Threading.CancellationTokenSource token)
\r
371 WinFileReader fs = new WinFileReader(filepath, enc);
\r
372 await this.LoadAsyncImpl(fs, token);
\r
376 async Task LoadAsyncImpl(WinFileReader fs,System.Threading.CancellationTokenSource token)
\r
378 this.IsEnabled = false;
\r
379 this.View.LayoutLines.IsFrozneDirtyFlag = true;
\r
380 await this.Document.LoadAsync(fs, token);
\r
381 this.View.LayoutLines.IsFrozneDirtyFlag = false;
\r
382 TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);
\r
383 if (this.verticalScrollBar != null)
\r
384 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;
\r
385 this.View.CalculateLineCountOnScreen();
\r
386 this.IsEnabled = true;
\r
390 /// ドキュメントの内容をファイルに保存する
\r
392 /// <param name="filepath">ファイルパス</param>
\r
393 /// <param name="newLine">改行コード</param>
\r
394 /// <param name="enc">エンコード</param>
\r
395 /// <returns>Taskオブジェクト</returns>
\r
396 public async Task SaveFile(string filepath, Encoding enc,string newLine, System.Threading.CancellationTokenSource token)
\r
398 WinFileWriter fs = new WinFileWriter(filepath, enc);
\r
399 fs.NewLine = newLine;
\r
400 await this.Document.SaveAsync(fs, token);
\r
405 /// アンマネージドリソースを開放する
\r
407 public void Dispose()
\r
411 this.Dispose(true);
\r
412 GC.SuppressFinalize(this);
\r
413 this.disposed = true;
\r
419 /// <param name="disposing">真ならマネージドリソースも開放し、そうでないならアンマネージドリソースのみを開放する</param>
\r
420 void Dispose(bool disposing)
\r
424 this.textStore.Dispose();
\r
426 this.View.Dispose();
\r
427 this.Render.Dispose();
\r
429 SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
\r
432 void Refresh(Rectangle updateRect)
\r
439 this.Render.BegineDraw();
\r
440 if (this.IsEnabled)
\r
441 this.View.Draw(updateRect);
\r
443 this.Render.FillBackground(updateRect);
\r
444 this.Render.EndDraw();
\r
446 this.timer.Start();
\r
450 void CanExecute(object sender, CanExecuteRoutedEventArgs e)
\r
452 e.CanExecute = this.IsEnabled;
\r
455 void ToggleCodePointCommand(object sender, RoutedEventArgs e)
\r
457 if (!this._Controller.ConvertToChar())
\r
458 this._Controller.ConvertToCodePoint();
\r
462 void CopyCommand(object sender, RoutedEventArgs e)
\r
467 void CutCommand(object sender, RoutedEventArgs e)
\r
473 void PasteCommand(object sender, RoutedEventArgs e)
\r
479 void DeleteCommand(object sender, RoutedEventArgs e)
\r
481 int oldLength = this.Document.Length;
\r
482 this._Controller.DoDeleteAction();
\r
486 void SelectAllCommand(object sender, RoutedEventArgs e)
\r
488 this.Select(0, this.Document.Length);
\r
492 void UndoCommand(object sender, RoutedEventArgs e)
\r
494 int oldLength = this.Document.Length;
\r
495 this.Document.UndoManager.undo();
\r
499 void RedoCommand(object sender, RoutedEventArgs e)
\r
501 int oldLength = this.Document.Length;
\r
502 this.Document.UndoManager.redo();
\r
506 void ToggleInsertCommand(object sender, RoutedEventArgs e)
\r
508 if (this.InsertMode)
\r
509 this.InsertMode = false;
\r
511 this.InsertMode = true;
\r
515 void ToggleRectSelectCommand(object sender, RoutedEventArgs e)
\r
517 if (this.RectSelectMode)
\r
518 this.RectSelectMode = false;
\r
520 this.RectSelectMode = true;
\r
523 void ToggleFlowDirectionCommand(object sender, RoutedEventArgs e)
\r
525 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
526 this.FlowDirection = System.Windows.FlowDirection.RightToLeft;
\r
528 this.FlowDirection = System.Windows.FlowDirection.LeftToRight;
\r
533 internal TextStore TextStore
\r
535 get { return this.textStore; }
\r
538 double textStore_GetDpi()
\r
541 this.Render.GetDpi(out dpi, out dpi);
\r
545 bool textStore_IsReadOnly()
\r
550 bool textStore_IsLoading()
\r
555 void textStore_CompositionEnded()
\r
557 TextStoreHelper.EndCompostion(this.Document);
\r
561 void textStore_CompositionUpdated(int start, int end)
\r
563 if (TextStoreHelper.ScrollToCompstionUpdated(this.textStore, this.View, start, end))
\r
566 bool textStore_CompositionStarted()
\r
568 bool result = TextStoreHelper.StartCompstion(this.Document);
\r
570 System.Media.SystemSounds.Beep.Play();
\r
574 string _textStore_GetString(int start, int length)
\r
576 return this.Document.ToString(start, length);
\r
579 IntPtr _textStore_GetHWnd()
\r
581 var hwndSource = HwndSource.FromVisual(this) as HwndSource;
\r
582 if (hwndSource != null)
\r
583 return hwndSource.Handle;
\r
585 return IntPtr.Zero;
\r
588 void _textStore_GetStringExtent(
\r
591 out POINT o_topLeft,
\r
592 out POINT o_bottomRight
\r
595 Point startPos, endPos;
\r
596 TextStoreHelper.GetStringExtent(this.Document, this.View, i_startIndex, i_endIndex, out startPos, out endPos);
\r
598 startPos = PointToScreen(this.TranslatePoint(startPos, this));
\r
599 endPos = PointToScreen(this.TranslatePoint(endPos, this));
\r
601 o_topLeft = new POINT((int)startPos.X, (int)startPos.Y);
\r
602 o_bottomRight = new POINT((int)endPos.X, (int)endPos.Y);
\r
605 void _textStore_GetScreenExtent(out POINT o_topLeft, out POINT o_bottomRight)
\r
607 var pointTopLeft = new Point(0, 0);
\r
608 var pointBottomRight = new Point(this.RenderSize.Width, this.RenderSize.Height);
\r
610 pointTopLeft = PointToScreen(pointTopLeft);
\r
611 pointBottomRight = PointToScreen(pointBottomRight);
\r
613 o_topLeft = new POINT((int)pointTopLeft.X, (int)pointTopLeft.Y);
\r
614 o_bottomRight = new POINT((int)pointBottomRight.X, (int)pointBottomRight.Y);
\r
617 void _textStore_GetSelectionIndex(out int o_startIndex, out int o_endIndex)
\r
619 TextStoreHelper.GetSelection(this._Controller, this.View.Selections, out o_startIndex, out o_endIndex);
\r
622 void _textStore_SetSelectionIndex(int i_startIndex, int i_endIndex)
\r
624 TextStoreHelper.SetSelectionIndex(this._Controller, this.View, i_startIndex, i_endIndex);
\r
628 void _textStore_InsertAtSelection(string i_value)
\r
630 TextStoreHelper.InsertTextAtSelection(this._Controller, i_value);
\r
635 /// キーボードフォーカスが取得されたときに呼ばれます
\r
637 /// <param name="e">イベントデーター</param>
\r
638 protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
640 base.OnGotKeyboardFocus(e);
\r
641 this.textStore.SetFocus();
\r
642 this.View.IsFocused = true;
\r
647 /// キーボードフォーカスが失われたときに呼ばれます
\r
649 /// <param name="e">イベントデーター</param>
\r
650 protected override void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
652 base.OnLostKeyboardFocus(e);
\r
653 this.View.IsFocused = false;
\r
659 /// キャレットが移動したときに通知されるイベント
\r
661 public event EventHandler CaretMoved;
\r
664 protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
\r
666 this.peer = new FooTextBoxAutomationPeer(this);
\r
672 protected override void OnTextInput(TextCompositionEventArgs e)
\r
674 if (e.Text == "\r")
\r
676 this._Controller.DoEnterAction();
\r
677 this.AutoIndentHooker(this, null);
\r
679 else if (e.Text == "\b")
\r
681 this._Controller.DoBackSpaceAction();
\r
685 if(this.IsInputString(e.Text))
\r
686 this._Controller.DoInputString(e.Text);
\r
689 base.OnTextInput(e);
\r
693 bool IsInputString(string s)
\r
695 foreach (char charCode in s)
\r
697 if ((0x20 <= charCode && charCode <= 0x7e)
\r
698 || 0x7f < charCode)
\r
705 protected override void OnKeyDown(KeyEventArgs e)
\r
707 if (this.textStore.IsLocked())
\r
710 ModifierKeys modiferKeys = e.KeyboardDevice.Modifiers;
\r
711 bool movedCaret = false;
\r
715 this._Controller.MoveCaretVertical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
721 this._Controller.MoveCaretVertical(+1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
727 this._Controller.MoveCaretHorizontical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
733 this._Controller.MoveCaretHorizontical(1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
739 this._Controller.Scroll(ScrollDirection.Up,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
744 this._Controller.Scroll(ScrollDirection.Down,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
749 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
750 this._Controller.JumpToHead(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
752 this._Controller.JumpToLineHead(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
757 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
758 this._Controller.JumpToEnd(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
760 this._Controller.JumpToLineEnd(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
765 int oldLength = this.Document.Length;
\r
766 if (this.Selection.Length == 0)
\r
767 this._Controller.DoInputChar('\t');
\r
768 else if(this.IsPressedModifierKey(modiferKeys,ModifierKeys.Shift))
\r
769 this._Controller.DownIndent();
\r
771 this._Controller.UpIndent();
\r
776 if (movedCaret && this.peer != null)
\r
777 this.peer.OnNotifyCaretChanged();
\r
781 bool IsPressedModifierKey(ModifierKeys keys, ModifierKeys pressed)
\r
783 if (keys == pressed)
\r
785 if ((keys & pressed) == pressed)
\r
791 /// ダブルクリックされたときに呼ばれます
\r
793 /// <param name="e">イベントパラメーター</param>
\r
795 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
796 /// e.Handledを真にした場合、単語単位の選択が行われなくなります
\r
798 protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
\r
800 System.Windows.Point p = e.GetPosition(this);
\r
801 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
802 if (tp == TextPoint.Null)
\r
804 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
806 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
811 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
812 base.OnMouseDoubleClick(newEventArgs);
\r
814 if (newEventArgs.Handled)
\r
817 if (e.LeftButton == MouseButtonState.Pressed)
\r
820 this._Controller.SelectWord(index);
\r
821 this.textStore.NotifySelectionChanged();
\r
822 if(this.peer != null)
\r
823 this.peer.OnNotifyCaretChanged();
\r
829 /// マウスボタンが押されたときに呼ばれます
\r
831 /// <param name="e">イベントパラメーター</param>
\r
833 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
834 /// e.Handledを真にした場合、キャレットの移動処理が行われなくなります
\r
836 protected override void OnMouseDown(MouseButtonEventArgs e)
\r
838 System.Windows.Point p = e.GetPosition(this);
\r
839 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
840 if (tp == TextPoint.Null)
\r
842 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
844 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
849 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
850 base.OnMouseDown(newEventArgs);
\r
852 if (newEventArgs.Handled)
\r
855 if (e.LeftButton == MouseButtonState.Pressed)
\r
857 FoldingItem foldingData = this.View.HitFoldingData(p.X,tp.row);
\r
858 if (foldingData != null)
\r
860 if (foldingData.Expand)
\r
861 this.View.LayoutLines.FoldingCollection.Collapse(foldingData);
\r
863 this.View.LayoutLines.FoldingCollection.Expand(foldingData);
\r
864 this._Controller.JumpCaret(foldingData.Start,false);
\r
868 this._Controller.JumpCaret(tp.row, tp.col, false);
\r
870 if (this.peer != null)
\r
871 this.peer.OnNotifyCaretChanged();
\r
872 this.View.IsFocused = true;
\r
879 /// マウスが移動したときに呼ばれます
\r
881 /// <param name="e">イベントパラメーター</param>
\r
883 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
884 /// e.Handledを真にした場合、選択処理と状況に応じたカーソルの変化が行われなくなります
\r
886 protected override void OnMouseMove(MouseEventArgs e)
\r
888 System.Windows.Point p = e.GetPosition(this);
\r
889 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
890 if (tp == TextPoint.Null)
\r
892 base.OnMouseMove(e);
\r
895 int index = this.View.GetIndexFromLayoutLine(tp);
\r
897 FooMouseEventArgs newEventArgs = new FooMouseEventArgs(e.MouseDevice, e.Timestamp, e.StylusDevice, index);
\r
898 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
899 base.OnMouseMove(newEventArgs);
\r
901 if (newEventArgs.Handled)
\r
904 if (this.View.HitTextArea(p.X,p.Y))
\r
906 if (this._Controller.IsMarker(tp, HilightType.Url))
\r
907 this.Cursor = Cursors.Hand;
\r
909 this.Cursor = Cursors.IBeam;
\r
911 if (e.LeftButton == MouseButtonState.Pressed)
\r
913 this._Controller.MoveCaretAndSelect(tp);
\r
914 if (this.peer != null)
\r
915 this.peer.OnNotifyCaretChanged();
\r
921 this.Cursor = Cursors.Arrow;
\r
926 protected override void OnMouseWheel(MouseWheelEventArgs e)
\r
928 if(Keyboard.Modifiers == ModifierKeys.None)
\r
931 this._Controller.Scroll(ScrollDirection.Up, SystemParameters.WheelScrollLines, false, false);
\r
933 this._Controller.Scroll(ScrollDirection.Down, SystemParameters.WheelScrollLines, false, false);
\r
935 else if (Keyboard.Modifiers == ModifierKeys.Control)
\r
937 double newFontSize = this.Render.FontSize;
\r
942 if (newFontSize > MaxFontSize)
\r
944 else if (newFontSize < MinFontSize)
\r
946 this.Render.FontSize = newFontSize;
\r
947 SetValue(MagnificationPowerPropertyKey, this.Render.FontSize / this.FontSize);
\r
950 base.OnMouseWheel(e);
\r
953 void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
\r
955 if (e.Category == UserPreferenceCategory.Keyboard)
\r
957 int blinkTime = (int)NativeMethods.GetCaretBlinkTime();
\r
958 this.View.CaretBlink = blinkTime >= 0;
\r
959 this.View.CaretBlinkTime = blinkTime * 2;
\r
961 if (e.Category == UserPreferenceCategory.General)
\r
963 this.View.CaretWidthOnInsertMode = SystemParameters.CaretWidth;
\r
967 void Document_Update(object sender, DocumentUpdateEventArgs e)
\r
969 if (this.textStore.IsLocked())
\r
971 TextStoreHelper.NotifyTextChanged(this.textStore, e.startIndex, e.removeLength, e.insertLength);
\r
974 void timer_Tick(object sender, EventArgs e)
\r
976 if (this.image.ActualWidth == 0 || this.image.ActualHeight == 0)
\r
978 if (this.Resize(this.image.ActualWidth, this.image.ActualHeight))
\r
984 ITextLayout layout = this.View.LayoutLines.GetLayout(this.View.CaretPostion.row);
\r
985 double width = layout.GetWidthFromIndex(this.View.CaretPostion.col);
\r
987 width = this.View.CaretWidthOnInsertMode;
\r
988 double height = layout.Height;
\r
989 Rectangle updateRect = new Rectangle(
\r
990 this.View.CaretLocation.X,
\r
991 this.View.CaretLocation.Y,
\r
995 this.Refresh(updateRect);
\r
998 void horizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1000 if (this.horizontalScrollBar == null)
\r
1003 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
1004 toX = this.horizontalScrollBar.Value;
\r
1006 toX = -this.horizontalScrollBar.Value;
\r
1007 this._Controller.Scroll(toX, this.View.Src.Row, false, false);
\r
1011 void verticalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1013 if (this.verticalScrollBar == null)
\r
1015 int newRow = (int)this.verticalScrollBar.Value;
\r
1016 if (newRow >= this.View.LayoutLines.Count)
\r
1018 this._Controller.Scroll(this.View.Src.X,newRow, false, false);
\r
1022 void View_SrcChanged(object sender, EventArgs e)
\r
1024 if (this.horizontalScrollBar == null || this.verticalScrollBar == null)
\r
1026 EditView view = this.View;
\r
1027 if (view.Src.Row > this.verticalScrollBar.Maximum)
\r
1028 this.verticalScrollBar.Maximum = view.Src.Row + view.LineCountOnScreen + 1;
\r
1029 double absoulteX = Math.Abs(view.Src.X);
\r
1030 if(absoulteX > this.horizontalScrollBar.Maximum)
\r
1031 this.horizontalScrollBar.Maximum = absoulteX + view.PageBound.Width + 1;
\r
1032 if(view.Src.Row != this.verticalScrollBar.Value)
\r
1033 this.verticalScrollBar.Value = view.Src.Row;
\r
1034 if (view.Src.X != this.horizontalScrollBar.Value)
\r
1035 this.horizontalScrollBar.Value = Math.Abs(view.Src.X);
\r
1038 void Controller_SelectionChanged(object sender, EventArgs e)
\r
1040 this.View.CaretBlink = this.View.CaretBlink;
\r
1041 this.CaretMoved(this, null);
\r
1042 //こうしないと選択できなくなってしまう
\r
1043 this.nowCaretMove = true;
\r
1044 SetValue(SelectionProperty, new TextRange(this._Controller.SelectionStart, this._Controller.SelectionLength));
\r
1045 SetValue(CaretPostionProperty, this.View.CaretPostion);
\r
1046 this.nowCaretMove = false;
\r
1047 if(this.textStore.IsLocked() == false)
\r
1048 this.textStore.NotifySelectionChanged();
\r
1051 void FooTextBox_Loaded(object sender, RoutedEventArgs e)
\r
1053 this.Resize(this.image.ActualWidth, this.image.ActualHeight);
\r
1056 bool Resize(double width, double height)
\r
1058 if (width == 0 || height == 0)
\r
1059 throw new ArgumentOutOfRangeException();
\r
1060 if (this.Render.Resize(width, height))
\r
1062 this.View.PageBound = new Rectangle(0, 0, width, height);
\r
1064 if (this.horizontalScrollBar != null)
\r
1066 this.horizontalScrollBar.LargeChange = this.View.PageBound.Width;
\r
1067 this.horizontalScrollBar.Maximum = this.View.LongestWidth + this.horizontalScrollBar.LargeChange + 1;
\r
1069 if (this.verticalScrollBar != null)
\r
1071 this.verticalScrollBar.LargeChange = this.View.LineCountOnScreen;
\r
1072 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count + this.verticalScrollBar.LargeChange + 1;
\r
1080 /// プロパティーが変更されたときに呼ばれます
\r
1082 /// <param name="e">イベントパラメーター</param>
\r
1083 protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
\r
1085 switch (e.Property.Name)
\r
1088 if(!this.nowCaretMove)
\r
1089 this.Select(this.Selection.Index, this.Selection.Length);
\r
1091 case "CaretPostion":
\r
1092 if (!this.nowCaretMove)
\r
1093 this.JumpCaret(this.CaretPostion.row, this.CaretPostion.col);
\r
1095 case "LineBreakMethod":
\r
1096 this.View.LineBreak = this.LineBreakMethod;
\r
1098 case "LineBreakCharCount":
\r
1099 this.View.LineBreakCharCount = this.LineBreakCharCount;
\r
1101 case "InsertMode":
\r
1102 this.View.InsertMode = this.InsertMode;
\r
1105 this.View.TabStops = this.TabChars;
\r
1107 case "RectSelectMode":
\r
1108 this._Controller.RectSelection = this.RectSelectMode;
\r
1111 this.View.HideCaret = !this.DrawCaret;
\r
1113 case "DrawCaretLine":
\r
1114 this.View.HideLineMarker = !this.DrawCaretLine;
\r
1116 case "DrawLineNumber":
\r
1117 this.View.DrawLineNumber = this.DrawLineNumber;
\r
1118 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1120 case "FontFamily":
\r
1121 this.Render.FontFamily = this.FontFamily;
\r
1124 this.Render.FontSize = this.FontSize;
\r
1127 this.Render.FontStyle = this.FontStyle;
\r
1129 case "FontWeight":
\r
1130 this.Render.FontWeigth = this.FontWeight;
\r
1132 case "Foreground":
\r
1133 this.Render.Foreground = D2DRender.ToColor4(this.Foreground);
\r
1135 case "Background":
\r
1136 this.Render.Background = D2DRender.ToColor4(this.Background);
\r
1138 case "ControlChar":
\r
1139 this.Render.ControlChar =D2DRender.ToColor4( this.ControlChar);
\r
1142 this.Render.Hilight = D2DRender.ToColor4(this.Hilight);
\r
1145 this.Render.Keyword1 = D2DRender.ToColor4(this.Keyword1);
\r
1148 this.Render.Keyword2 = D2DRender.ToColor4(this.Keyword2);
\r
1151 this.Render.Comment = D2DRender.ToColor4(this.Comment);
\r
1154 this.Render.Literal = D2DRender.ToColor4(this.Literal);
\r
1157 this.Render.Url = D2DRender.ToColor4(this.URL);
\r
1159 case "InsertCaret":
\r
1160 this.Render.InsertCaret = D2DRender.ToColor4(this.InsertCaret);
\r
1162 case "OverwriteCaret":
\r
1163 this.Render.OverwriteCaret = D2DRender.ToColor4(this.OverwriteCaret);
\r
1166 this.View.Padding = new Padding((int)this.Padding.Left, (int)this.Padding.Top, (int)this.Padding.Right, (int)this.Padding.Bottom);
\r
1168 case "LineMarker":
\r
1169 this.Render.LineMarker = D2DRender.ToColor4(this.LineMarker);
\r
1172 this.View.UrlMark = this.MarkURL;
\r
1174 case "ShowFullSpace":
\r
1175 this.Render.ShowFullSpace = this.ShowFullSpace;
\r
1177 case "ShowHalfSpace":
\r
1178 this.Render.ShowHalfSpace = this.ShowHalfSpace;
\r
1181 this.Render.ShowTab = this.ShowTab;
\r
1183 case "ShowLineBreak":
\r
1184 this.Render.ShowLineBreak = this.ShowLineBreak;
\r
1186 case "FlowDirection":
\r
1187 this.Render.RightToLeft = this.FlowDirection == System.Windows.FlowDirection.RightToLeft;
\r
1188 this.horizontalScrollBar.FlowDirection = this.FlowDirection;
\r
1191 this.View.HideRuler = !this.DrawRuler;
\r
1192 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1194 case "UpdateArea":
\r
1195 this.Render.UpdateArea = D2DRender.ToColor4(this.UpdateArea);
\r
1198 base.OnPropertyChanged(e);
\r
1203 internal Controller Controller
\r
1207 return this._Controller;
\r
1212 /// 文字列の描写に使用されるアンチエイリアシング モードを表します
\r
1214 public TextAntialiasMode TextAntialiasMode
\r
1218 return this.Render.TextAntialiasMode;
\r
1222 this.Render.TextAntialiasMode = value;
\r
1227 /// シンタックスハイライターを表す
\r
1229 public IHilighter Hilighter
\r
1233 return this.View.Hilighter;
\r
1237 this.View.Hilighter = value;
\r
1238 this.View.LayoutLines.ClearLayoutCache();
\r
1243 /// フォールティングを作成するインターフェイスを表す
\r
1245 public IFoldingStrategy FoldingStrategy
\r
1249 return this.View.LayoutLines.FoldingStrategy;
\r
1253 this.View.LayoutLines.FoldingStrategy = value;
\r
1254 if (value == null)
\r
1255 this.View.LayoutLines.FoldingCollection.Clear();
\r
1262 public MarkerPatternSet MarkerPatternSet
\r
1266 return this.View.MarkerPatternSet;
\r
1273 public Document Document
\r
1282 public LineToIndexTable LayoutLineCollection
\r
1284 get { return this.View.LayoutLines; }
\r
1290 public string SelectedText
\r
1294 return this._Controller.SelectedText;
\r
1298 int oldLength = this.Document.Length;
\r
1299 this._Controller.SelectedText = value;
\r
1307 /// Lengthが0の場合はキャレット位置を表します。
\r
1308 /// 矩形選択モードの場合、選択範囲の文字数ではなく、開始位置から終了位置までの長さとなります
\r
1310 public TextRange Selection
\r
1312 get { return (TextRange)GetValue(SelectionProperty); }
\r
1313 set { SetValue(SelectionProperty, value); }
\r
1317 /// Selectionの依存プロパティを表す
\r
1319 public static readonly DependencyProperty SelectionProperty =
\r
1320 DependencyProperty.Register("Selection", typeof(TextRange), typeof(FooTextBox), new PropertyMetadata(TextRange.Null));
\r
1325 public double MagnificationPower
\r
1327 get { return (double)GetValue(MagnificationPowerPropertyKey.DependencyProperty); }
\r
1333 public static readonly DependencyPropertyKey MagnificationPowerPropertyKey =
\r
1334 DependencyProperty.RegisterReadOnly("MagnificationPower", typeof(double), typeof(FooTextBox), new PropertyMetadata(1.0));
\r
1339 public new FlowDirection FlowDirection
\r
1341 get { return (FlowDirection)GetValue(FlowDirectionProperty); }
\r
1342 set { SetValue(FlowDirectionProperty, value); }
\r
1346 /// レタリング方向を表す。これは依存プロパティです
\r
1348 public new static readonly DependencyProperty FlowDirectionProperty =
\r
1349 DependencyProperty.Register("FlowDirection", typeof(FlowDirection), typeof(FooTextBox), new PropertyMetadata(FlowDirection.LeftToRight));
\r
1352 /// キャレット位置を表す。これは依存プロパティです
\r
1354 public TextPoint CaretPostion
\r
1356 get { return (TextPoint)GetValue(CaretPostionProperty); }
\r
1357 set { SetValue(CaretPostionProperty, value); }
\r
1361 /// CaretPostionの依存プロパティを表す
\r
1363 public static readonly DependencyProperty CaretPostionProperty =
\r
1364 DependencyProperty.Register("CaretPostion", typeof(TextPoint), typeof(FooTextBox), new PropertyMetadata(TextPoint.Null));
\r
1367 /// デフォルトの文字色を表す。これは依存プロパティです
\r
1369 public new System.Windows.Media.Color Foreground
\r
1371 get { return (System.Windows.Media.Color)GetValue(ForegroundProperty); }
\r
1372 set { SetValue(ForegroundProperty, value); }
\r
1376 /// Foregroundの依存プロパティを表す
\r
1378 public new static readonly DependencyProperty ForegroundProperty =
\r
1379 DependencyProperty.Register("Foreground", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1382 /// 背景色を表す。これは依存プロパティです
\r
1384 public new System.Windows.Media.Color Background
\r
1386 get { return (System.Windows.Media.Color)GetValue(BackgroundProperty); }
\r
1387 set { SetValue(BackgroundProperty, value); }
\r
1391 /// Backgroundの依存プロパティを表す
\r
1393 public new static readonly DependencyProperty BackgroundProperty =
\r
1394 DependencyProperty.Register("Background", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowColor));
\r
1397 /// コントロールコードの文字色を表す。これは依存プロパティです
\r
1399 public System.Windows.Media.Color ControlChar
\r
1401 get { return (System.Windows.Media.Color)GetValue(ControlCharProperty); }
\r
1402 set { SetValue(ControlCharProperty, value); }
\r
1406 /// ControlCharの依存プロパティを表す
\r
1408 public static readonly DependencyProperty ControlCharProperty =
\r
1409 DependencyProperty.Register("ControlChar", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Gray));
\r
1412 /// 選択時の背景色を表す。これは依存プロパティです
\r
1414 public System.Windows.Media.Color Hilight
\r
1416 get { return (System.Windows.Media.Color)GetValue(HilightProperty); }
\r
1417 set { SetValue(HilightProperty, value); }
\r
1421 /// Hilightの依存プロパティを表す
\r
1423 public static readonly DependencyProperty HilightProperty =
\r
1424 DependencyProperty.Register("Hilight", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DeepSkyBlue));
\r
1427 /// キーワード1の文字色を表す。これは依存プロパティです
\r
1429 public System.Windows.Media.Color Keyword1
\r
1431 get { return (System.Windows.Media.Color)GetValue(Keyword1Property); }
\r
1432 set { SetValue(Keyword1Property, value); }
\r
1436 /// Keyword1の依存プロパティを表す
\r
1438 public static readonly DependencyProperty Keyword1Property =
\r
1439 DependencyProperty.Register("Keyword1", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1442 /// キーワード2の文字色を表す。これは依存プロパティです
\r
1444 public System.Windows.Media.Color Keyword2
\r
1446 get { return (System.Windows.Media.Color)GetValue(Keyword2Property); }
\r
1447 set { SetValue(Keyword2Property, value); }
\r
1451 /// Keyword2の依存プロパティを表す
\r
1453 public static readonly DependencyProperty Keyword2Property =
\r
1454 DependencyProperty.Register("Keyword2", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DarkCyan));
\r
1457 /// コメントの文字色を表す。これは依存プロパティです
\r
1459 public System.Windows.Media.Color Comment
\r
1461 get { return (System.Windows.Media.Color)GetValue(CommentProperty); }
\r
1462 set { SetValue(CommentProperty, value); }
\r
1466 /// Commentの依存プロパティを表す
\r
1468 public static readonly DependencyProperty CommentProperty =
\r
1469 DependencyProperty.Register("Comment", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Green));
\r
1472 /// 文字リテラルの文字色を表す。これは依存プロパティです
\r
1474 public System.Windows.Media.Color Literal
\r
1476 get { return (System.Windows.Media.Color)GetValue(LiteralProperty); }
\r
1477 set { SetValue(LiteralProperty, value); }
\r
1481 /// Literalの依存プロパティを表す
\r
1483 public static readonly DependencyProperty LiteralProperty =
\r
1484 DependencyProperty.Register("Literal", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Brown));
\r
1487 /// URLの文字色を表す。これは依存プロパティです
\r
1489 public System.Windows.Media.Color URL
\r
1491 get { return (System.Windows.Media.Color)GetValue(URLProperty); }
\r
1492 set { SetValue(URLProperty, value); }
\r
1496 /// URLの依存プロパティを表す
\r
1498 public static readonly DependencyProperty URLProperty =
\r
1499 DependencyProperty.Register("URL", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1505 public System.Windows.Media.Color LineMarker
\r
1507 get { return (System.Windows.Media.Color)GetValue(LineMarkerProperty); }
\r
1508 set { SetValue(LineMarkerProperty, value); }
\r
1512 /// LineMarkerの依存プロパティを表す
\r
1514 public static readonly DependencyProperty LineMarkerProperty =
\r
1515 DependencyProperty.Register("LineMarker", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Silver));
\r
1518 /// 挿入モード時のキャレットの色を表す
\r
1520 public System.Windows.Media.Color InsertCaret
\r
1522 get { return (System.Windows.Media.Color)GetValue(InsertCaretProperty); }
\r
1523 set { SetValue(InsertCaretProperty, value); }
\r
1527 /// InsertCaretの依存プロパティを表す
\r
1529 public static readonly DependencyProperty InsertCaretProperty =
\r
1530 DependencyProperty.Register("InsertCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1535 public System.Windows.Media.Color UpdateArea
\r
1537 get { return (System.Windows.Media.Color)GetValue(UpdateAreaProperty); }
\r
1538 set { SetValue(UpdateAreaProperty, value); }
\r
1542 /// UpdateAreaの依存プロパティを表す
\r
1544 public static readonly DependencyProperty UpdateAreaProperty =
\r
1545 DependencyProperty.Register("UpdateArea", typeof(System.Windows.Media.Color), typeof(FooTextBox), new PropertyMetadata(Colors.MediumSeaGreen));
\r
1548 /// 上書きモード時のキャレット職を表す
\r
1550 public System.Windows.Media.Color OverwriteCaret
\r
1552 get { return (System.Windows.Media.Color)GetValue(OverwriteCaretProperty); }
\r
1553 set { SetValue(OverwriteCaretProperty, value); }
\r
1557 /// OverwriteCaretの依存プロパティを表す
\r
1559 public static readonly DependencyProperty OverwriteCaretProperty =
\r
1560 DependencyProperty.Register("OverwriteCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1563 /// 挿入モードなら真を返し、そうでないなら、偽を返す。これは依存プロパティです
\r
1565 public bool InsertMode
\r
1567 get { return (bool)GetValue(InsertModeProperty); }
\r
1568 set { SetValue(InsertModeProperty, value); }
\r
1572 /// InsertModeの依存プロパティを表す
\r
1574 public static readonly DependencyProperty InsertModeProperty =
\r
1575 DependencyProperty.Register("InsertMode",
\r
1577 typeof(FooTextBox),
\r
1578 new FrameworkPropertyMetadata(true));
\r
1581 /// タブの文字数を表す。これは依存プロパティです
\r
1583 public int TabChars
\r
1585 get { return (int)GetValue(TabCharsProperty); }
\r
1586 set { SetValue(TabCharsProperty, value); }
\r
1590 /// TabCharsの依存プロパティを表す
\r
1592 public static readonly DependencyProperty TabCharsProperty =
\r
1593 DependencyProperty.Register("TabChars",
\r
1595 typeof(FooTextBox),
\r
1596 new FrameworkPropertyMetadata(4));
\r
1599 /// 矩形選択モードなら真を返し、そうでないなら偽を返す。これは依存プロパティです
\r
1601 public bool RectSelectMode
\r
1603 get { return (bool)GetValue(RectSelectModeProperty); }
\r
1604 set { SetValue(RectSelectModeProperty, value); }
\r
1608 /// RectSelectModeの依存プロパティを表す
\r
1610 public static readonly DependencyProperty RectSelectModeProperty =
\r
1611 DependencyProperty.Register("RectSelectMode", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1617 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1619 public LineBreakMethod LineBreakMethod
\r
1621 get { return (LineBreakMethod)GetValue(LineBreakProperty); }
\r
1622 set { SetValue(LineBreakProperty, value); }
\r
1626 /// LineBreakMethodの依存プロパティを表す
\r
1628 public static readonly DependencyProperty LineBreakProperty =
\r
1629 DependencyProperty.Register("LineBreakMethod", typeof(LineBreakMethod), typeof(FooTextBox), new PropertyMetadata(LineBreakMethod.None));
\r
1633 /// 折り返しの幅を指定する。LineBreakMethod.CharUnit以外の時は無視されます
\r
1636 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1638 public int LineBreakCharCount
\r
1640 get { return (int)GetValue(LineBreakCharCountProperty); }
\r
1641 set { SetValue(LineBreakCharCountProperty, value); }
\r
1645 /// LineBreakCharCountの依存プロパティを表す
\r
1647 public static readonly DependencyProperty LineBreakCharCountProperty =
\r
1648 DependencyProperty.Register("LineBreakCharCount", typeof(int), typeof(FooTextBox), new PropertyMetadata(80));
\r
1651 /// キャレットを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1653 public bool DrawCaret
\r
1655 get { return (bool)GetValue(DrawCaretProperty); }
\r
1656 set { SetValue(DrawCaretProperty, value); }
\r
1660 /// DrawCaretの依存プロパティを表す
\r
1662 public static readonly DependencyProperty DrawCaretProperty =
\r
1663 DependencyProperty.Register("DrawCaret", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(true));
\r
1667 /// キャレットラインを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1669 public bool DrawCaretLine
\r
1671 get { return (bool)GetValue(DrawCaretLineProperty); }
\r
1672 set { SetValue(DrawCaretLineProperty, value); }
\r
1676 /// DrawCaretLineの依存プロパティを表す
\r
1678 public static readonly DependencyProperty DrawCaretLineProperty =
\r
1679 DependencyProperty.Register("DrawCaretLine", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1682 /// 行番号を描くなら真。そうでなければ偽。これは依存プロパティです
\r
1684 public bool DrawLineNumber
\r
1686 get { return (bool)GetValue(DrawLineNumberProperty); }
\r
1687 set { SetValue(DrawLineNumberProperty, value); }
\r
1691 /// ルーラーを描くなら真。そうでなければ偽。これは依存プロパティです
\r
1693 public bool DrawRuler
\r
1695 get { return (bool)GetValue(DrawRulerProperty); }
\r
1696 set { SetValue(DrawRulerProperty, value); }
\r
1700 /// DrawRulerの依存プロパティを表す
\r
1702 public static readonly DependencyProperty DrawRulerProperty =
\r
1703 DependencyProperty.Register("DrawRuler", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1707 /// DrawLineNumberの依存プロパティを表す
\r
1709 public static readonly DependencyProperty DrawLineNumberProperty =
\r
1710 DependencyProperty.Register("DrawLineNumber", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1713 /// URLに下線を引くなら真。そうでないなら偽を表す。これは依存プロパティです
\r
1715 public bool MarkURL
\r
1717 get { return (bool)GetValue(MarkURLProperty); }
\r
1718 set { SetValue(MarkURLProperty, value); }
\r
1722 /// MarkURLの依存プロパティを表す
\r
1724 public static readonly DependencyProperty MarkURLProperty =
\r
1725 DependencyProperty.Register("MarkURL", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1728 /// 全角スペースを表示するなら真。そうでないなら偽
\r
1730 public bool ShowFullSpace
\r
1732 get { return (bool)GetValue(ShowFullSpaceProperty); }
\r
1733 set { SetValue(ShowFullSpaceProperty, value); }
\r
1737 /// ShowFullSpaceの依存プロパティを表す
\r
1739 public static readonly DependencyProperty ShowFullSpaceProperty =
\r
1740 DependencyProperty.Register("ShowFullSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1743 /// 半角スペースを表示するなら真。そうでないなら偽
\r
1745 public bool ShowHalfSpace
\r
1747 get { return (bool)GetValue(ShowHalfSpaceProperty); }
\r
1748 set { SetValue(ShowHalfSpaceProperty, value); }
\r
1752 /// ShowHalfSpaceの依存プロパティを表す
\r
1754 public static readonly DependencyProperty ShowHalfSpaceProperty =
\r
1755 DependencyProperty.Register("ShowHalfSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1758 /// タブを表示するなら真。そうでないなら偽
\r
1760 public bool ShowTab
\r
1762 get { return (bool)GetValue(ShowTabProperty); }
\r
1763 set { SetValue(ShowTabProperty, value); }
\r
1767 /// ShowTabの依存プロパティを表す
\r
1769 public static readonly DependencyProperty ShowTabProperty =
\r
1770 DependencyProperty.Register("ShowTab", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1773 /// 改行マークを表示するなら真。そうでないなら偽
\r
1775 public bool ShowLineBreak
\r
1777 get { return (bool)GetValue(ShowLineBreakProperty); }
\r
1778 set { SetValue(ShowLineBreakProperty, value); }
\r
1782 /// ShowLineBreakの依存プロパティを表す
\r
1784 public static readonly DependencyProperty ShowLineBreakProperty =
\r
1785 DependencyProperty.Register("ShowLineBreak", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1790 /// マウスボタン関連のイベントクラス
\r
1792 public sealed class FooMouseButtonEventArgs : MouseButtonEventArgs
\r
1795 /// イベントが発生したドキュメントのインデックス
\r
1806 /// <param name="mouse">マウスデバイス</param>
\r
1807 /// <param name="timestamp">タイムスタンプ</param>
\r
1808 /// <param name="button">ボタン</param>
\r
1809 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1810 /// <param name="index">インデックス</param>
\r
1811 public FooMouseButtonEventArgs(MouseDevice mouse, int timestamp, MouseButton button, StylusDevice stylusDevice, int index)
\r
1812 : base(mouse, timestamp, button, stylusDevice)
\r
1814 this.Index = index;
\r
1820 public sealed class FooMouseEventArgs : MouseEventArgs
\r
1823 /// イベントが発生したドキュメントのインデックス
\r
1834 /// <param name="mouse">マウスデバイス</param>
\r
1835 /// <param name="timestamp">タイムスタンプ</param>
\r
1836 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1837 /// <param name="index">インデックス</param>
\r
1838 public FooMouseEventArgs(MouseDevice mouse,
\r
1840 StylusDevice stylusDevice,
\r
1842 : base(mouse, timestamp, stylusDevice)
\r
1844 this.Index = index;
\r