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
353 /// <param name="row">行</param>
\r
354 /// <param name="alignTop">指定行を画面上に置くなら真。そうでないなら偽</param>
\r
355 public void ScrollIntoView(int row, bool alignTop)
\r
357 this.View.ScrollIntoView(row, alignTop);
\r
361 /// ストリームからドキュメントを構築する
\r
363 /// <param name="tr">TextReader</param>
\r
364 /// <param name="token">キャンセル用トークン</param>
\r
365 /// <returns>Taskオブジェクト</returns>
\r
366 public async Task LoadAsync(System.IO.TextReader tr, System.Threading.CancellationTokenSource token)
\r
368 WinFileReader fs = new WinFileReader(tr);
\r
369 await this.LoadAsyncImpl(fs, token);
\r
373 /// ファイルからドキュメントを構築する
\r
375 /// <param name="filepath">ファイルパス</param>
\r
376 /// <param name="enc">エンコード</param>
\r
377 /// <param name="token">キャンセル用トークン</param>
\r
378 /// <returns>Taskオブジェクト</returns>
\r
379 public async Task LoadFileAsync(string filepath, Encoding enc,System.Threading.CancellationTokenSource token)
\r
381 WinFileReader fs = new WinFileReader(filepath, enc);
\r
382 await this.LoadAsyncImpl(fs, token);
\r
386 async Task LoadAsyncImpl(WinFileReader fs,System.Threading.CancellationTokenSource token)
\r
388 this.IsEnabled = false;
\r
389 this.View.LayoutLines.IsFrozneDirtyFlag = true;
\r
390 await this.Document.LoadAsync(fs, token);
\r
391 this.View.LayoutLines.IsFrozneDirtyFlag = false;
\r
392 TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);
\r
393 if (this.verticalScrollBar != null)
\r
394 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;
\r
395 this.View.CalculateLineCountOnScreen();
\r
396 this.IsEnabled = true;
\r
400 /// ドキュメントの内容をファイルに保存する
\r
402 /// <param name="filepath">ファイルパス</param>
\r
403 /// <param name="newLine">改行コード</param>
\r
404 /// <param name="enc">エンコード</param>
\r
405 /// <returns>Taskオブジェクト</returns>
\r
406 public async Task SaveFile(string filepath, Encoding enc,string newLine, System.Threading.CancellationTokenSource token)
\r
408 WinFileWriter fs = new WinFileWriter(filepath, enc);
\r
409 fs.NewLine = newLine;
\r
410 await this.Document.SaveAsync(fs, token);
\r
415 /// アンマネージドリソースを開放する
\r
417 public void Dispose()
\r
421 this.Dispose(true);
\r
422 GC.SuppressFinalize(this);
\r
423 this.disposed = true;
\r
429 /// <param name="disposing">真ならマネージドリソースも開放し、そうでないならアンマネージドリソースのみを開放する</param>
\r
430 void Dispose(bool disposing)
\r
434 this.textStore.Dispose();
\r
436 this.View.Dispose();
\r
437 this.Render.Dispose();
\r
439 SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
\r
442 void Refresh(Rectangle updateRect)
\r
444 if (this.disposed || this.Visibility == Visibility.Collapsed)
\r
447 this.Render.BegineDraw();
\r
448 if (this.IsEnabled)
\r
449 this.View.Draw(updateRect);
\r
451 this.Render.FillBackground(updateRect);
\r
452 this.Render.EndDraw();
\r
456 void CanExecute(object sender, CanExecuteRoutedEventArgs e)
\r
458 e.CanExecute = this.IsEnabled;
\r
461 void ToggleCodePointCommand(object sender, RoutedEventArgs e)
\r
463 if (!this._Controller.ConvertToChar())
\r
464 this._Controller.ConvertToCodePoint();
\r
468 void CopyCommand(object sender, RoutedEventArgs e)
\r
473 void CutCommand(object sender, RoutedEventArgs e)
\r
479 void PasteCommand(object sender, RoutedEventArgs e)
\r
485 void DeleteCommand(object sender, RoutedEventArgs e)
\r
487 int oldLength = this.Document.Length;
\r
488 this._Controller.DoDeleteAction();
\r
492 void SelectAllCommand(object sender, RoutedEventArgs e)
\r
494 this.Select(0, this.Document.Length);
\r
498 void UndoCommand(object sender, RoutedEventArgs e)
\r
500 int oldLength = this.Document.Length;
\r
501 this.Document.UndoManager.undo();
\r
505 void RedoCommand(object sender, RoutedEventArgs e)
\r
507 int oldLength = this.Document.Length;
\r
508 this.Document.UndoManager.redo();
\r
512 void ToggleInsertCommand(object sender, RoutedEventArgs e)
\r
514 if (this.InsertMode)
\r
515 this.InsertMode = false;
\r
517 this.InsertMode = true;
\r
521 void ToggleRectSelectCommand(object sender, RoutedEventArgs e)
\r
523 if (this.RectSelectMode)
\r
524 this.RectSelectMode = false;
\r
526 this.RectSelectMode = true;
\r
529 void ToggleFlowDirectionCommand(object sender, RoutedEventArgs e)
\r
531 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
532 this.FlowDirection = System.Windows.FlowDirection.RightToLeft;
\r
534 this.FlowDirection = System.Windows.FlowDirection.LeftToRight;
\r
539 internal TextStore TextStore
\r
541 get { return this.textStore; }
\r
544 double textStore_GetDpi()
\r
547 this.Render.GetDpi(out dpi, out dpi);
\r
551 bool textStore_IsReadOnly()
\r
556 bool textStore_IsLoading()
\r
561 void textStore_CompositionEnded()
\r
563 TextStoreHelper.EndCompostion(this.Document);
\r
567 void textStore_CompositionUpdated(int start, int end)
\r
569 if (TextStoreHelper.ScrollToCompstionUpdated(this.textStore, this.View, start, end))
\r
572 bool textStore_CompositionStarted()
\r
574 bool result = TextStoreHelper.StartCompstion(this.Document);
\r
576 System.Media.SystemSounds.Beep.Play();
\r
580 string _textStore_GetString(int start, int length)
\r
582 return this.Document.ToString(start, length);
\r
585 IntPtr _textStore_GetHWnd()
\r
587 var hwndSource = HwndSource.FromVisual(this) as HwndSource;
\r
588 if (hwndSource != null)
\r
589 return hwndSource.Handle;
\r
591 return IntPtr.Zero;
\r
594 void _textStore_GetStringExtent(
\r
597 out POINT o_topLeft,
\r
598 out POINT o_bottomRight
\r
601 Point startPos, endPos;
\r
602 TextStoreHelper.GetStringExtent(this.Document, this.View, i_startIndex, i_endIndex, out startPos, out endPos);
\r
604 startPos = PointToScreen(this.TranslatePoint(startPos, this));
\r
605 endPos = PointToScreen(this.TranslatePoint(endPos, this));
\r
607 o_topLeft = new POINT((int)startPos.X, (int)startPos.Y);
\r
608 o_bottomRight = new POINT((int)endPos.X, (int)endPos.Y);
\r
611 void _textStore_GetScreenExtent(out POINT o_topLeft, out POINT o_bottomRight)
\r
613 var pointTopLeft = new Point(0, 0);
\r
614 var pointBottomRight = new Point(this.RenderSize.Width, this.RenderSize.Height);
\r
616 pointTopLeft = PointToScreen(pointTopLeft);
\r
617 pointBottomRight = PointToScreen(pointBottomRight);
\r
619 o_topLeft = new POINT((int)pointTopLeft.X, (int)pointTopLeft.Y);
\r
620 o_bottomRight = new POINT((int)pointBottomRight.X, (int)pointBottomRight.Y);
\r
623 void _textStore_GetSelectionIndex(out int o_startIndex, out int o_endIndex)
\r
625 TextStoreHelper.GetSelection(this._Controller, this.View.Selections, out o_startIndex, out o_endIndex);
\r
628 void _textStore_SetSelectionIndex(int i_startIndex, int i_endIndex)
\r
630 TextStoreHelper.SetSelectionIndex(this._Controller, this.View, i_startIndex, i_endIndex);
\r
634 void _textStore_InsertAtSelection(string i_value, ref int o_startIndex, ref int o_endIndex)
\r
636 TextStoreHelper.InsertTextAtSelection(this._Controller, i_value);
\r
641 /// キーボードフォーカスが取得されたときに呼ばれます
\r
643 /// <param name="e">イベントデーター</param>
\r
644 protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
646 base.OnGotKeyboardFocus(e);
\r
647 this.textStore.SetFocus();
\r
648 this.View.IsFocused = true;
\r
653 /// キーボードフォーカスが失われたときに呼ばれます
\r
655 /// <param name="e">イベントデーター</param>
\r
656 protected override void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
658 base.OnLostKeyboardFocus(e);
\r
659 this.View.IsFocused = false;
\r
665 /// キャレットが移動したときに通知されるイベント
\r
667 public event EventHandler CaretMoved;
\r
670 protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
\r
672 this.peer = new FooTextBoxAutomationPeer(this);
\r
678 protected override void OnTextInput(TextCompositionEventArgs e)
\r
680 if (e.Text == "\r")
\r
682 this._Controller.DoEnterAction();
\r
683 this.AutoIndentHooker(this, null);
\r
685 else if (e.Text == "\b")
\r
687 this._Controller.DoBackSpaceAction();
\r
691 if(this.IsInputString(e.Text))
\r
692 this._Controller.DoInputString(e.Text);
\r
695 base.OnTextInput(e);
\r
699 bool IsInputString(string s)
\r
701 foreach (char charCode in s)
\r
703 if ((0x20 <= charCode && charCode <= 0x7e)
\r
704 || 0x7f < charCode)
\r
711 protected override void OnKeyDown(KeyEventArgs e)
\r
713 if (this.textStore.IsLocked())
\r
716 ModifierKeys modiferKeys = e.KeyboardDevice.Modifiers;
\r
717 bool movedCaret = false;
\r
721 this._Controller.MoveCaretVertical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
727 this._Controller.MoveCaretVertical(+1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
733 this._Controller.MoveCaretHorizontical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
739 this._Controller.MoveCaretHorizontical(1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
745 this._Controller.Scroll(ScrollDirection.Up,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
750 this._Controller.Scroll(ScrollDirection.Down,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
755 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
756 this._Controller.JumpToHead(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
758 this._Controller.JumpToLineHead(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
763 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
764 this._Controller.JumpToEnd(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
766 this._Controller.JumpToLineEnd(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
771 int oldLength = this.Document.Length;
\r
772 if (this.Selection.Length == 0)
\r
773 this._Controller.DoInputChar('\t');
\r
774 else if(this.IsPressedModifierKey(modiferKeys,ModifierKeys.Shift))
\r
775 this._Controller.DownIndent();
\r
777 this._Controller.UpIndent();
\r
782 if (movedCaret && this.peer != null)
\r
783 this.peer.OnNotifyCaretChanged();
\r
787 bool IsPressedModifierKey(ModifierKeys keys, ModifierKeys pressed)
\r
789 if (keys == pressed)
\r
791 if ((keys & pressed) == pressed)
\r
797 /// ダブルクリックされたときに呼ばれます
\r
799 /// <param name="e">イベントパラメーター</param>
\r
801 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
802 /// e.Handledを真にした場合、単語単位の選択が行われなくなります
\r
804 protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
\r
806 System.Windows.Point p = e.GetPosition(this);
\r
807 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
808 if (tp == TextPoint.Null)
\r
810 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
812 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
817 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
818 base.OnMouseDoubleClick(newEventArgs);
\r
820 if (newEventArgs.Handled)
\r
823 if (e.LeftButton == MouseButtonState.Pressed)
\r
826 this._Controller.SelectWord(index);
\r
827 this.textStore.NotifySelectionChanged();
\r
828 if(this.peer != null)
\r
829 this.peer.OnNotifyCaretChanged();
\r
835 /// マウスボタンが押されたときに呼ばれます
\r
837 /// <param name="e">イベントパラメーター</param>
\r
839 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
840 /// e.Handledを真にした場合、キャレットの移動処理が行われなくなります
\r
842 protected override void OnMouseDown(MouseButtonEventArgs e)
\r
844 System.Windows.Point p = e.GetPosition(this);
\r
845 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
846 if (tp == TextPoint.Null)
\r
848 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
850 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
855 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
856 base.OnMouseDown(newEventArgs);
\r
858 if (newEventArgs.Handled)
\r
861 if (e.LeftButton == MouseButtonState.Pressed)
\r
863 FoldingItem foldingData = this.View.HitFoldingData(p.X,tp.row);
\r
864 if (foldingData != null)
\r
866 if (foldingData.Expand)
\r
867 this.View.LayoutLines.FoldingCollection.Collapse(foldingData);
\r
869 this.View.LayoutLines.FoldingCollection.Expand(foldingData);
\r
870 this._Controller.JumpCaret(foldingData.Start,false);
\r
874 this._Controller.JumpCaret(tp.row, tp.col, false);
\r
876 if (this.peer != null)
\r
877 this.peer.OnNotifyCaretChanged();
\r
878 this.View.IsFocused = true;
\r
885 /// マウスが移動したときに呼ばれます
\r
887 /// <param name="e">イベントパラメーター</param>
\r
889 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
890 /// e.Handledを真にした場合、選択処理と状況に応じたカーソルの変化が行われなくなります
\r
892 protected override void OnMouseMove(MouseEventArgs e)
\r
894 System.Windows.Point p = e.GetPosition(this);
\r
895 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
896 if (tp == TextPoint.Null)
\r
898 base.OnMouseMove(e);
\r
901 int index = this.View.GetIndexFromLayoutLine(tp);
\r
903 FooMouseEventArgs newEventArgs = new FooMouseEventArgs(e.MouseDevice, e.Timestamp, e.StylusDevice, index);
\r
904 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
905 base.OnMouseMove(newEventArgs);
\r
907 if (newEventArgs.Handled)
\r
910 if (this.View.HitTextArea(p.X,p.Y))
\r
912 if (this._Controller.IsMarker(tp, HilightType.Url))
\r
913 this.Cursor = Cursors.Hand;
\r
915 this.Cursor = Cursors.IBeam;
\r
917 if (e.LeftButton == MouseButtonState.Pressed)
\r
919 this._Controller.MoveCaretAndSelect(tp);
\r
920 if (this.peer != null)
\r
921 this.peer.OnNotifyCaretChanged();
\r
927 this.Cursor = Cursors.Arrow;
\r
932 protected override void OnMouseWheel(MouseWheelEventArgs e)
\r
934 if(Keyboard.Modifiers == ModifierKeys.None)
\r
937 this._Controller.Scroll(ScrollDirection.Up, SystemParameters.WheelScrollLines, false, false);
\r
939 this._Controller.Scroll(ScrollDirection.Down, SystemParameters.WheelScrollLines, false, false);
\r
941 else if (Keyboard.Modifiers == ModifierKeys.Control)
\r
943 double newFontSize = this.Render.FontSize;
\r
948 if (newFontSize > MaxFontSize)
\r
950 else if (newFontSize < MinFontSize)
\r
952 this.Render.FontSize = newFontSize;
\r
953 SetValue(MagnificationPowerPropertyKey, this.Render.FontSize / this.FontSize);
\r
956 base.OnMouseWheel(e);
\r
959 void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
\r
961 if (e.Category == UserPreferenceCategory.Keyboard)
\r
963 int blinkTime = (int)NativeMethods.GetCaretBlinkTime();
\r
964 this.View.CaretBlink = blinkTime >= 0;
\r
965 this.View.CaretBlinkTime = blinkTime * 2;
\r
967 if (e.Category == UserPreferenceCategory.General)
\r
969 this.View.CaretWidthOnInsertMode = SystemParameters.CaretWidth;
\r
973 void Document_Update(object sender, DocumentUpdateEventArgs e)
\r
975 if (this.textStore.IsLocked())
\r
977 TextStoreHelper.NotifyTextChanged(this.textStore, e.startIndex, e.removeLength, e.insertLength);
\r
980 void timer_Tick(object sender, EventArgs e)
\r
982 if (this.image.ActualWidth == 0 || this.image.ActualHeight == 0)
\r
984 if (this.Resize(this.image.ActualWidth, this.image.ActualHeight))
\r
990 ITextLayout layout = this.View.LayoutLines.GetLayout(this.View.CaretPostion.row);
\r
991 double width = layout.GetWidthFromIndex(this.View.CaretPostion.col);
\r
993 width = this.View.CaretWidthOnInsertMode;
\r
994 double height = layout.Height;
\r
995 Rectangle updateRect = new Rectangle(
\r
996 this.View.CaretLocation.X,
\r
997 this.View.CaretLocation.Y,
\r
1001 this.Refresh(updateRect);
\r
1004 void horizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1006 if (this.horizontalScrollBar == null)
\r
1009 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
1010 toX = this.horizontalScrollBar.Value;
\r
1012 toX = -this.horizontalScrollBar.Value;
\r
1013 this._Controller.Scroll(toX, this.View.Src.Row, false, false);
\r
1017 void verticalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1019 if (this.verticalScrollBar == null)
\r
1021 int newRow = (int)this.verticalScrollBar.Value;
\r
1022 if (newRow >= this.View.LayoutLines.Count)
\r
1024 this._Controller.Scroll(this.View.Src.X,newRow, false, false);
\r
1028 void View_SrcChanged(object sender, EventArgs e)
\r
1030 if (this.horizontalScrollBar == null || this.verticalScrollBar == null)
\r
1032 EditView view = this.View;
\r
1033 if (view.Src.Row > this.verticalScrollBar.Maximum)
\r
1034 this.verticalScrollBar.Maximum = view.Src.Row + view.LineCountOnScreen + 1;
\r
1035 double absoulteX = Math.Abs(view.Src.X);
\r
1036 if(absoulteX > this.horizontalScrollBar.Maximum)
\r
1037 this.horizontalScrollBar.Maximum = absoulteX + view.PageBound.Width + 1;
\r
1038 if(view.Src.Row != this.verticalScrollBar.Value)
\r
1039 this.verticalScrollBar.Value = view.Src.Row;
\r
1040 if (view.Src.X != this.horizontalScrollBar.Value)
\r
1041 this.horizontalScrollBar.Value = Math.Abs(view.Src.X);
\r
1044 void Controller_SelectionChanged(object sender, EventArgs e)
\r
1046 this.View.CaretBlink = this.View.CaretBlink;
\r
1047 this.CaretMoved(this, null);
\r
1048 //こうしないと選択できなくなってしまう
\r
1049 this.nowCaretMove = true;
\r
1050 SetValue(SelectionProperty, new TextRange(this._Controller.SelectionStart, this._Controller.SelectionLength));
\r
1051 SetValue(CaretPostionProperty, this.View.CaretPostion);
\r
1052 this.nowCaretMove = false;
\r
1053 if(this.textStore.IsLocked() == false)
\r
1054 this.textStore.NotifySelectionChanged();
\r
1057 void FooTextBox_Loaded(object sender, RoutedEventArgs e)
\r
1059 this.Resize(this.image.ActualWidth, this.image.ActualHeight);
\r
1061 this.timer.Start();
\r
1064 bool Resize(double width, double height)
\r
1066 if (width == 0 || height == 0)
\r
1067 throw new ArgumentOutOfRangeException();
\r
1068 if (this.Render.Resize(width, height))
\r
1070 this.View.PageBound = new Rectangle(0, 0, width, height);
\r
1072 if (this.horizontalScrollBar != null)
\r
1074 this.horizontalScrollBar.LargeChange = this.View.PageBound.Width;
\r
1075 this.horizontalScrollBar.Maximum = this.View.LongestWidth + this.horizontalScrollBar.LargeChange + 1;
\r
1077 if (this.verticalScrollBar != null)
\r
1079 this.verticalScrollBar.LargeChange = this.View.LineCountOnScreen;
\r
1080 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count + this.verticalScrollBar.LargeChange + 1;
\r
1088 /// プロパティーが変更されたときに呼ばれます
\r
1090 /// <param name="e">イベントパラメーター</param>
\r
1091 protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
\r
1093 switch (e.Property.Name)
\r
1095 case "IndentMode":
\r
1096 this._Controller.IndentMode = this.IndentMode;
\r
1099 if(!this.nowCaretMove)
\r
1100 this.Select(this.Selection.Index, this.Selection.Length);
\r
1102 case "CaretPostion":
\r
1103 if (!this.nowCaretMove)
\r
1104 this.JumpCaret(this.CaretPostion.row, this.CaretPostion.col);
\r
1106 case "LineBreakMethod":
\r
1107 this.View.LineBreak = this.LineBreakMethod;
\r
1109 case "LineBreakCharCount":
\r
1110 this.View.LineBreakCharCount = this.LineBreakCharCount;
\r
1112 case "InsertMode":
\r
1113 this.View.InsertMode = this.InsertMode;
\r
1116 this.View.TabStops = this.TabChars;
\r
1118 case "RectSelectMode":
\r
1119 this._Controller.RectSelection = this.RectSelectMode;
\r
1122 this.View.HideCaret = !this.DrawCaret;
\r
1124 case "DrawCaretLine":
\r
1125 this.View.HideLineMarker = !this.DrawCaretLine;
\r
1127 case "DrawLineNumber":
\r
1128 this.View.DrawLineNumber = this.DrawLineNumber;
\r
1129 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1131 case "FontFamily":
\r
1132 this.Render.FontFamily = this.FontFamily;
\r
1135 this.Render.FontSize = this.FontSize;
\r
1138 this.Render.FontStyle = this.FontStyle;
\r
1140 case "FontWeight":
\r
1141 this.Render.FontWeigth = this.FontWeight;
\r
1143 case "Foreground":
\r
1144 this.Render.Foreground = D2DRender.ToColor4(this.Foreground);
\r
1146 case "Background":
\r
1147 this.Render.Background = D2DRender.ToColor4(this.Background);
\r
1149 case "ControlChar":
\r
1150 this.Render.ControlChar =D2DRender.ToColor4( this.ControlChar);
\r
1153 this.Render.Hilight = D2DRender.ToColor4(this.Hilight);
\r
1156 this.Render.Keyword1 = D2DRender.ToColor4(this.Keyword1);
\r
1159 this.Render.Keyword2 = D2DRender.ToColor4(this.Keyword2);
\r
1162 this.Render.Comment = D2DRender.ToColor4(this.Comment);
\r
1165 this.Render.Literal = D2DRender.ToColor4(this.Literal);
\r
1168 this.Render.Url = D2DRender.ToColor4(this.URL);
\r
1170 case "InsertCaret":
\r
1171 this.Render.InsertCaret = D2DRender.ToColor4(this.InsertCaret);
\r
1173 case "OverwriteCaret":
\r
1174 this.Render.OverwriteCaret = D2DRender.ToColor4(this.OverwriteCaret);
\r
1177 this.View.Padding = new Padding((int)this.Padding.Left, (int)this.Padding.Top, (int)this.Padding.Right, (int)this.Padding.Bottom);
\r
1179 case "LineMarker":
\r
1180 this.Render.LineMarker = D2DRender.ToColor4(this.LineMarker);
\r
1183 this.View.UrlMark = this.MarkURL;
\r
1185 case "ShowFullSpace":
\r
1186 this.Render.ShowFullSpace = this.ShowFullSpace;
\r
1188 case "ShowHalfSpace":
\r
1189 this.Render.ShowHalfSpace = this.ShowHalfSpace;
\r
1192 this.Render.ShowTab = this.ShowTab;
\r
1194 case "ShowLineBreak":
\r
1195 this.Render.ShowLineBreak = this.ShowLineBreak;
\r
1197 case "FlowDirection":
\r
1198 this.Render.RightToLeft = this.FlowDirection == System.Windows.FlowDirection.RightToLeft;
\r
1199 this.horizontalScrollBar.FlowDirection = this.FlowDirection;
\r
1202 this.View.HideRuler = !this.DrawRuler;
\r
1203 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1205 case "UpdateArea":
\r
1206 this.Render.UpdateArea = D2DRender.ToColor4(this.UpdateArea);
\r
1208 case "LineNumber":
\r
1209 this.Render.LineNumber = D2DRender.ToColor4(this.LineNumber);
\r
1212 base.OnPropertyChanged(e);
\r
1217 internal Controller Controller
\r
1221 return this._Controller;
\r
1226 /// 文字列の描写に使用されるアンチエイリアシング モードを表します
\r
1228 public TextAntialiasMode TextAntialiasMode
\r
1232 return this.Render.TextAntialiasMode;
\r
1236 this.Render.TextAntialiasMode = value;
\r
1241 /// シンタックスハイライターを表す
\r
1243 public IHilighter Hilighter
\r
1247 return this.View.Hilighter;
\r
1251 this.View.Hilighter = value;
\r
1252 this.View.LayoutLines.ClearLayoutCache();
\r
1257 /// フォールティングを作成するインターフェイスを表す
\r
1259 public IFoldingStrategy FoldingStrategy
\r
1263 return this.View.LayoutLines.FoldingStrategy;
\r
1267 this.View.LayoutLines.FoldingStrategy = value;
\r
1268 if (value == null)
\r
1269 this.View.LayoutLines.FoldingCollection.Clear();
\r
1276 public MarkerPatternSet MarkerPatternSet
\r
1280 return this.View.MarkerPatternSet;
\r
1287 public Document Document
\r
1296 public LineToIndexTable LayoutLineCollection
\r
1298 get { return this.View.LayoutLines; }
\r
1304 public string SelectedText
\r
1308 return this._Controller.SelectedText;
\r
1312 int oldLength = this.Document.Length;
\r
1313 this._Controller.SelectedText = value;
\r
1320 public IndentMode IndentMode
\r
1322 get { return (IndentMode)GetValue(IndentModeProperty); }
\r
1323 set { SetValue(IndentModeProperty, value); }
\r
1327 /// IndentModeの依存プロパティを表す
\r
1329 public static readonly DependencyProperty IndentModeProperty =
\r
1330 DependencyProperty.Register("IndentMode", typeof(IndentMode), typeof(FooTextBox), new PropertyMetadata(IndentMode.Tab));
\r
1336 /// Lengthが0の場合はキャレット位置を表します。
\r
1337 /// 矩形選択モードの場合、選択範囲の文字数ではなく、開始位置から終了位置までの長さとなります
\r
1339 public TextRange Selection
\r
1341 get { return (TextRange)GetValue(SelectionProperty); }
\r
1342 set { SetValue(SelectionProperty, value); }
\r
1346 /// Selectionの依存プロパティを表す
\r
1348 public static readonly DependencyProperty SelectionProperty =
\r
1349 DependencyProperty.Register("Selection", typeof(TextRange), typeof(FooTextBox), new PropertyMetadata(TextRange.Null));
\r
1354 public double MagnificationPower
\r
1356 get { return (double)GetValue(MagnificationPowerPropertyKey.DependencyProperty); }
\r
1362 public static readonly DependencyPropertyKey MagnificationPowerPropertyKey =
\r
1363 DependencyProperty.RegisterReadOnly("MagnificationPower", typeof(double), typeof(FooTextBox), new PropertyMetadata(1.0));
\r
1368 public new FlowDirection FlowDirection
\r
1370 get { return (FlowDirection)GetValue(FlowDirectionProperty); }
\r
1371 set { SetValue(FlowDirectionProperty, value); }
\r
1375 /// レタリング方向を表す。これは依存プロパティです
\r
1377 public new static readonly DependencyProperty FlowDirectionProperty =
\r
1378 DependencyProperty.Register("FlowDirection", typeof(FlowDirection), typeof(FooTextBox), new PropertyMetadata(FlowDirection.LeftToRight));
\r
1381 /// キャレット位置を表す。これは依存プロパティです
\r
1383 public TextPoint CaretPostion
\r
1385 get { return (TextPoint)GetValue(CaretPostionProperty); }
\r
1386 set { SetValue(CaretPostionProperty, value); }
\r
1390 /// CaretPostionの依存プロパティを表す
\r
1392 public static readonly DependencyProperty CaretPostionProperty =
\r
1393 DependencyProperty.Register("CaretPostion", typeof(TextPoint), typeof(FooTextBox), new PropertyMetadata(TextPoint.Null));
\r
1396 /// デフォルトの文字色を表す。これは依存プロパティです
\r
1398 public new System.Windows.Media.Color Foreground
\r
1400 get { return (System.Windows.Media.Color)GetValue(ForegroundProperty); }
\r
1401 set { SetValue(ForegroundProperty, value); }
\r
1405 /// Foregroundの依存プロパティを表す
\r
1407 public new static readonly DependencyProperty ForegroundProperty =
\r
1408 DependencyProperty.Register("Foreground", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1411 /// 背景色を表す。これは依存プロパティです
\r
1413 public new System.Windows.Media.Color Background
\r
1415 get { return (System.Windows.Media.Color)GetValue(BackgroundProperty); }
\r
1416 set { SetValue(BackgroundProperty, value); }
\r
1420 /// Backgroundの依存プロパティを表す
\r
1422 public new static readonly DependencyProperty BackgroundProperty =
\r
1423 DependencyProperty.Register("Background", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowColor));
\r
1426 /// コントロールコードの文字色を表す。これは依存プロパティです
\r
1428 public System.Windows.Media.Color ControlChar
\r
1430 get { return (System.Windows.Media.Color)GetValue(ControlCharProperty); }
\r
1431 set { SetValue(ControlCharProperty, value); }
\r
1435 /// ControlCharの依存プロパティを表す
\r
1437 public static readonly DependencyProperty ControlCharProperty =
\r
1438 DependencyProperty.Register("ControlChar", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Gray));
\r
1441 /// 選択時の背景色を表す。これは依存プロパティです
\r
1443 public System.Windows.Media.Color Hilight
\r
1445 get { return (System.Windows.Media.Color)GetValue(HilightProperty); }
\r
1446 set { SetValue(HilightProperty, value); }
\r
1450 /// Hilightの依存プロパティを表す
\r
1452 public static readonly DependencyProperty HilightProperty =
\r
1453 DependencyProperty.Register("Hilight", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DeepSkyBlue));
\r
1456 /// キーワード1の文字色を表す。これは依存プロパティです
\r
1458 public System.Windows.Media.Color Keyword1
\r
1460 get { return (System.Windows.Media.Color)GetValue(Keyword1Property); }
\r
1461 set { SetValue(Keyword1Property, value); }
\r
1465 /// Keyword1の依存プロパティを表す
\r
1467 public static readonly DependencyProperty Keyword1Property =
\r
1468 DependencyProperty.Register("Keyword1", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1471 /// キーワード2の文字色を表す。これは依存プロパティです
\r
1473 public System.Windows.Media.Color Keyword2
\r
1475 get { return (System.Windows.Media.Color)GetValue(Keyword2Property); }
\r
1476 set { SetValue(Keyword2Property, value); }
\r
1480 /// Keyword2の依存プロパティを表す
\r
1482 public static readonly DependencyProperty Keyword2Property =
\r
1483 DependencyProperty.Register("Keyword2", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DarkCyan));
\r
1486 /// コメントの文字色を表す。これは依存プロパティです
\r
1488 public System.Windows.Media.Color Comment
\r
1490 get { return (System.Windows.Media.Color)GetValue(CommentProperty); }
\r
1491 set { SetValue(CommentProperty, value); }
\r
1495 /// Commentの依存プロパティを表す
\r
1497 public static readonly DependencyProperty CommentProperty =
\r
1498 DependencyProperty.Register("Comment", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Green));
\r
1501 /// 文字リテラルの文字色を表す。これは依存プロパティです
\r
1503 public System.Windows.Media.Color Literal
\r
1505 get { return (System.Windows.Media.Color)GetValue(LiteralProperty); }
\r
1506 set { SetValue(LiteralProperty, value); }
\r
1510 /// Literalの依存プロパティを表す
\r
1512 public static readonly DependencyProperty LiteralProperty =
\r
1513 DependencyProperty.Register("Literal", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Brown));
\r
1516 /// URLの文字色を表す。これは依存プロパティです
\r
1518 public System.Windows.Media.Color URL
\r
1520 get { return (System.Windows.Media.Color)GetValue(URLProperty); }
\r
1521 set { SetValue(URLProperty, value); }
\r
1525 /// URLの依存プロパティを表す
\r
1527 public static readonly DependencyProperty URLProperty =
\r
1528 DependencyProperty.Register("URL", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1534 public System.Windows.Media.Color LineMarker
\r
1536 get { return (System.Windows.Media.Color)GetValue(LineMarkerProperty); }
\r
1537 set { SetValue(LineMarkerProperty, value); }
\r
1541 /// LineMarkerの依存プロパティを表す
\r
1543 public static readonly DependencyProperty LineMarkerProperty =
\r
1544 DependencyProperty.Register("LineMarker", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Silver));
\r
1547 /// 挿入モード時のキャレットの色を表す
\r
1549 public System.Windows.Media.Color InsertCaret
\r
1551 get { return (System.Windows.Media.Color)GetValue(InsertCaretProperty); }
\r
1552 set { SetValue(InsertCaretProperty, value); }
\r
1556 /// InsertCaretの依存プロパティを表す
\r
1558 public static readonly DependencyProperty InsertCaretProperty =
\r
1559 DependencyProperty.Register("InsertCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1564 public System.Windows.Media.Color UpdateArea
\r
1566 get { return (System.Windows.Media.Color)GetValue(UpdateAreaProperty); }
\r
1567 set { SetValue(UpdateAreaProperty, value); }
\r
1571 /// UpdateAreaの依存プロパティを表す
\r
1573 public static readonly DependencyProperty UpdateAreaProperty =
\r
1574 DependencyProperty.Register("UpdateArea", typeof(System.Windows.Media.Color), typeof(FooTextBox), new PropertyMetadata(Colors.MediumSeaGreen));
\r
1577 /// 上書きモード時のキャレット職を表す
\r
1579 public System.Windows.Media.Color OverwriteCaret
\r
1581 get { return (System.Windows.Media.Color)GetValue(OverwriteCaretProperty); }
\r
1582 set { SetValue(OverwriteCaretProperty, value); }
\r
1586 /// OverwriteCaretの依存プロパティを表す
\r
1588 public static readonly DependencyProperty OverwriteCaretProperty =
\r
1589 DependencyProperty.Register("OverwriteCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1594 public System.Windows.Media.Color LineNumber
\r
1596 get { return (System.Windows.Media.Color)GetValue(LineNumberProperty); }
\r
1597 set { SetValue(LineNumberProperty, value); }
\r
1601 /// Using a DependencyProperty as the backing store for LineNumber. This enables animation, styling, binding, etc...
\r
1603 public static readonly DependencyProperty LineNumberProperty =
\r
1604 DependencyProperty.Register("LineNumber", typeof(System.Windows.Media.Color), typeof(FooTextBox), new PropertyMetadata(Colors.DimGray));
\r
1607 /// 挿入モードなら真を返し、そうでないなら、偽を返す。これは依存プロパティです
\r
1609 public bool InsertMode
\r
1611 get { return (bool)GetValue(InsertModeProperty); }
\r
1612 set { SetValue(InsertModeProperty, value); }
\r
1616 /// InsertModeの依存プロパティを表す
\r
1618 public static readonly DependencyProperty InsertModeProperty =
\r
1619 DependencyProperty.Register("InsertMode",
\r
1621 typeof(FooTextBox),
\r
1622 new FrameworkPropertyMetadata(true));
\r
1625 /// タブの文字数を表す。これは依存プロパティです
\r
1627 public int TabChars
\r
1629 get { return (int)GetValue(TabCharsProperty); }
\r
1630 set { SetValue(TabCharsProperty, value); }
\r
1634 /// TabCharsの依存プロパティを表す
\r
1636 public static readonly DependencyProperty TabCharsProperty =
\r
1637 DependencyProperty.Register("TabChars",
\r
1639 typeof(FooTextBox),
\r
1640 new FrameworkPropertyMetadata(4));
\r
1643 /// 矩形選択モードなら真を返し、そうでないなら偽を返す。これは依存プロパティです
\r
1645 public bool RectSelectMode
\r
1647 get { return (bool)GetValue(RectSelectModeProperty); }
\r
1648 set { SetValue(RectSelectModeProperty, value); }
\r
1652 /// RectSelectModeの依存プロパティを表す
\r
1654 public static readonly DependencyProperty RectSelectModeProperty =
\r
1655 DependencyProperty.Register("RectSelectMode", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1661 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1663 public LineBreakMethod LineBreakMethod
\r
1665 get { return (LineBreakMethod)GetValue(LineBreakProperty); }
\r
1666 set { SetValue(LineBreakProperty, value); }
\r
1670 /// LineBreakMethodの依存プロパティを表す
\r
1672 public static readonly DependencyProperty LineBreakProperty =
\r
1673 DependencyProperty.Register("LineBreakMethod", typeof(LineBreakMethod), typeof(FooTextBox), new PropertyMetadata(LineBreakMethod.None));
\r
1677 /// 折り返しの幅を指定する。LineBreakMethod.CharUnit以外の時は無視されます
\r
1680 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1682 public int LineBreakCharCount
\r
1684 get { return (int)GetValue(LineBreakCharCountProperty); }
\r
1685 set { SetValue(LineBreakCharCountProperty, value); }
\r
1689 /// LineBreakCharCountの依存プロパティを表す
\r
1691 public static readonly DependencyProperty LineBreakCharCountProperty =
\r
1692 DependencyProperty.Register("LineBreakCharCount", typeof(int), typeof(FooTextBox), new PropertyMetadata(80));
\r
1695 /// キャレットを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1697 public bool DrawCaret
\r
1699 get { return (bool)GetValue(DrawCaretProperty); }
\r
1700 set { SetValue(DrawCaretProperty, value); }
\r
1704 /// DrawCaretの依存プロパティを表す
\r
1706 public static readonly DependencyProperty DrawCaretProperty =
\r
1707 DependencyProperty.Register("DrawCaret", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(true));
\r
1711 /// キャレットラインを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1713 public bool DrawCaretLine
\r
1715 get { return (bool)GetValue(DrawCaretLineProperty); }
\r
1716 set { SetValue(DrawCaretLineProperty, value); }
\r
1720 /// DrawCaretLineの依存プロパティを表す
\r
1722 public static readonly DependencyProperty DrawCaretLineProperty =
\r
1723 DependencyProperty.Register("DrawCaretLine", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1726 /// 行番号を描くなら真。そうでなければ偽。これは依存プロパティです
\r
1728 public bool DrawLineNumber
\r
1730 get { return (bool)GetValue(DrawLineNumberProperty); }
\r
1731 set { SetValue(DrawLineNumberProperty, value); }
\r
1735 /// ルーラーを描くなら真。そうでなければ偽。これは依存プロパティです
\r
1737 public bool DrawRuler
\r
1739 get { return (bool)GetValue(DrawRulerProperty); }
\r
1740 set { SetValue(DrawRulerProperty, value); }
\r
1744 /// DrawRulerの依存プロパティを表す
\r
1746 public static readonly DependencyProperty DrawRulerProperty =
\r
1747 DependencyProperty.Register("DrawRuler", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1751 /// DrawLineNumberの依存プロパティを表す
\r
1753 public static readonly DependencyProperty DrawLineNumberProperty =
\r
1754 DependencyProperty.Register("DrawLineNumber", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1757 /// URLに下線を引くなら真。そうでないなら偽を表す。これは依存プロパティです
\r
1759 public bool MarkURL
\r
1761 get { return (bool)GetValue(MarkURLProperty); }
\r
1762 set { SetValue(MarkURLProperty, value); }
\r
1766 /// MarkURLの依存プロパティを表す
\r
1768 public static readonly DependencyProperty MarkURLProperty =
\r
1769 DependencyProperty.Register("MarkURL", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1772 /// 全角スペースを表示するなら真。そうでないなら偽
\r
1774 public bool ShowFullSpace
\r
1776 get { return (bool)GetValue(ShowFullSpaceProperty); }
\r
1777 set { SetValue(ShowFullSpaceProperty, value); }
\r
1781 /// ShowFullSpaceの依存プロパティを表す
\r
1783 public static readonly DependencyProperty ShowFullSpaceProperty =
\r
1784 DependencyProperty.Register("ShowFullSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1787 /// 半角スペースを表示するなら真。そうでないなら偽
\r
1789 public bool ShowHalfSpace
\r
1791 get { return (bool)GetValue(ShowHalfSpaceProperty); }
\r
1792 set { SetValue(ShowHalfSpaceProperty, value); }
\r
1796 /// ShowHalfSpaceの依存プロパティを表す
\r
1798 public static readonly DependencyProperty ShowHalfSpaceProperty =
\r
1799 DependencyProperty.Register("ShowHalfSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1802 /// タブを表示するなら真。そうでないなら偽
\r
1804 public bool ShowTab
\r
1806 get { return (bool)GetValue(ShowTabProperty); }
\r
1807 set { SetValue(ShowTabProperty, value); }
\r
1811 /// ShowTabの依存プロパティを表す
\r
1813 public static readonly DependencyProperty ShowTabProperty =
\r
1814 DependencyProperty.Register("ShowTab", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1817 /// 改行マークを表示するなら真。そうでないなら偽
\r
1819 public bool ShowLineBreak
\r
1821 get { return (bool)GetValue(ShowLineBreakProperty); }
\r
1822 set { SetValue(ShowLineBreakProperty, value); }
\r
1826 /// ShowLineBreakの依存プロパティを表す
\r
1828 public static readonly DependencyProperty ShowLineBreakProperty =
\r
1829 DependencyProperty.Register("ShowLineBreak", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1834 /// マウスボタン関連のイベントクラス
\r
1836 public sealed class FooMouseButtonEventArgs : MouseButtonEventArgs
\r
1839 /// イベントが発生したドキュメントのインデックス
\r
1850 /// <param name="mouse">マウスデバイス</param>
\r
1851 /// <param name="timestamp">タイムスタンプ</param>
\r
1852 /// <param name="button">ボタン</param>
\r
1853 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1854 /// <param name="index">インデックス</param>
\r
1855 public FooMouseButtonEventArgs(MouseDevice mouse, int timestamp, MouseButton button, StylusDevice stylusDevice, int index)
\r
1856 : base(mouse, timestamp, button, stylusDevice)
\r
1858 this.Index = index;
\r
1864 public sealed class FooMouseEventArgs : MouseEventArgs
\r
1867 /// イベントが発生したドキュメントのインデックス
\r
1878 /// <param name="mouse">マウスデバイス</param>
\r
1879 /// <param name="timestamp">タイムスタンプ</param>
\r
1880 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1881 /// <param name="index">インデックス</param>
\r
1882 public FooMouseEventArgs(MouseDevice mouse,
\r
1884 StylusDevice stylusDevice,
\r
1886 : base(mouse, timestamp, stylusDevice)
\r
1888 this.Index = index;
\r