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.GetStringLength += () => this.Document.Length;
\r
77 this.textStore.GetString += _textStore_GetString;
\r
78 this.textStore.GetSelectionIndex += _textStore_GetSelectionIndex;
\r
79 this.textStore.SetSelectionIndex += _textStore_SetSelectionIndex;
\r
80 this.textStore.InsertAtSelection += _textStore_InsertAtSelection;
\r
81 this.textStore.GetHWnd += _textStore_GetHWnd;
\r
82 this.textStore.GetScreenExtent += _textStore_GetScreenExtent;
\r
83 this.textStore.GetStringExtent += _textStore_GetStringExtent;
\r
84 this.textStore.CompositionStarted += textStore_CompositionStarted;
\r
85 this.textStore.CompositionUpdated += textStore_CompositionUpdated;
\r
86 this.textStore.CompositionEnded += textStore_CompositionEnded;
\r
88 this.Render = new D2DRender(this, 200, 200,this.image);
\r
89 this.Render.ShowFullSpace = this.ShowFullSpace;
\r
90 this.Render.ShowHalfSpace = this.ShowHalfSpace;
\r
91 this.Render.ShowTab = this.ShowTab;
\r
93 this.Document = new Document();
\r
94 this.Document.LayoutLines.Render = this.Render;
\r
96 this.View = new EditView(this.Document, this.Render, new Padding(5, 5, 5, 5));
\r
97 this.View.SrcChanged += View_SrcChanged;
\r
98 this.View.InsertMode = this.InsertMode;
\r
99 this.View.DrawLineNumber = this.DrawLineNumber;
\r
100 this.View.HideCaret = !this.DrawCaret;
\r
101 this.View.HideLineMarker = !this.DrawCaretLine;
\r
102 this.View.HideRuler = !this.DrawRuler;
\r
103 this.View.UrlMark = this.MarkURL;
\r
104 this.View.TabStops = this.TabChars;
\r
106 this._Controller = new Controller(this.Document, this.View);
\r
107 this._Controller.SelectionChanged += new EventHandler(Controller_SelectionChanged);
\r
109 //Viewを作成した後に追加しないと例外が発生する
\r
110 this.Document.Update += new DocumentUpdateEventHandler(Document_Update);
\r
112 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, CopyCommand, CanExecute));
\r
113 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, CutCommand, CanExecute));
\r
114 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, PasteCommand, CanExecute));
\r
115 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, DeleteCommand, CanExecute));
\r
116 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAllCommand, CanExecute));
\r
117 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, UndoCommand, CanExecute));
\r
118 this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, RedoCommand, CanExecute));
\r
119 this.CommandBindings.Add(new CommandBinding(EditingCommands.ToggleInsert, ToggleInsertCommand, CanExecute));
\r
120 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleRectSelectMode, ToggleRectSelectCommand, CanExecute));
\r
121 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleFlowDirection, ToggleFlowDirectionCommand, CanExecute));
\r
122 this.CommandBindings.Add(new CommandBinding(FooTextBoxCommands.ToggleCodePoint, ToggleCodePointCommand, CanExecute));
\r
124 this.InputBindings.Add(new InputBinding(ApplicationCommands.Copy, new KeyGesture(Key.C, ModifierKeys.Control)));
\r
125 this.InputBindings.Add(new InputBinding(ApplicationCommands.Cut, new KeyGesture(Key.X, ModifierKeys.Control)));
\r
126 this.InputBindings.Add(new InputBinding(ApplicationCommands.Paste, new KeyGesture(Key.V, ModifierKeys.Control)));
\r
127 this.InputBindings.Add(new InputBinding(ApplicationCommands.Delete, new KeyGesture(Key.Delete, ModifierKeys.None)));
\r
128 this.InputBindings.Add(new InputBinding(ApplicationCommands.SelectAll, new KeyGesture(Key.A, ModifierKeys.Control)));
\r
129 this.InputBindings.Add(new InputBinding(ApplicationCommands.Undo, new KeyGesture(Key.Z, ModifierKeys.Control)));
\r
130 this.InputBindings.Add(new InputBinding(ApplicationCommands.Redo, new KeyGesture(Key.Y, ModifierKeys.Control)));
\r
131 this.InputBindings.Add(new InputBinding(EditingCommands.ToggleInsert, new KeyGesture(Key.Insert, ModifierKeys.None)));
\r
132 this.InputBindings.Add(new InputBinding(FooTextBoxCommands.ToggleCodePoint, new KeyGesture(Key.X, ModifierKeys.Alt)));
\r
134 this.timer = new DispatcherTimer();
\r
135 this.timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
\r
136 this.timer.Tick += new EventHandler(timer_Tick);
\r
138 this.Loaded += new RoutedEventHandler(FooTextBox_Loaded);
\r
140 this.AutoIndentHooker = (s,e)=>{};
\r
142 SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
\r
144 this.SystemEvents_UserPreferenceChanged(null, new UserPreferenceChangedEventArgs(UserPreferenceCategory.Keyboard));
\r
146 this.CaretMoved += (s, e) => { };
\r
154 //Dispose(false)を呼び出すと落ちる
\r
155 this.Dispose(false);
\r
159 /// オートインデントを行うためのイベント
\r
161 public AutoIndentHookerHandler AutoIndentHooker;
\r
166 public override void OnApplyTemplate()
\r
168 base.OnApplyTemplate();
\r
170 Grid grid = this.GetTemplateChild("PART_Grid") as Grid;
\r
173 Grid.SetRow(this.image, 0);
\r
174 Grid.SetColumn(this.image, 0);
\r
175 grid.Children.Add(this.image);
\r
178 this.horizontalScrollBar = this.GetTemplateChild("PART_HorizontalScrollBar") as ScrollBar;
\r
179 if (this.horizontalScrollBar != null)
\r
181 this.horizontalScrollBar.SmallChange = 10;
\r
182 this.horizontalScrollBar.LargeChange = 100;
\r
183 this.horizontalScrollBar.Maximum = this.horizontalScrollBar.LargeChange + 1;
\r
184 this.horizontalScrollBar.Scroll += new ScrollEventHandler(horizontalScrollBar_Scroll);
\r
186 this.verticalScrollBar = this.GetTemplateChild("PART_VerticalScrollBar") as ScrollBar;
\r
187 if (this.verticalScrollBar != null)
\r
189 this.verticalScrollBar.SmallChange = 1;
\r
190 this.verticalScrollBar.LargeChange = 10;
\r
191 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;
\r
192 this.verticalScrollBar.Scroll += new ScrollEventHandler(verticalScrollBar_Scroll);
\r
199 /// <param name="start">開始インデックス</param>
\r
200 /// <param name="length">長さ</param>
\r
201 public void Select(int start, int length)
\r
203 this._Controller.Select(start, length);
\r
204 this.textStore.NotifySelectionChanged();
\r
208 /// キャレットを指定した行に移動させます
\r
210 /// <param name="index">インデックス</param>
\r
211 /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>
\r
212 public void JumpCaret(int index)
\r
214 this._Controller.JumpCaret(index);
\r
217 /// キャレットを指定した行と桁に移動させます
\r
219 /// <param name="row">行番号</param>
\r
220 /// <param name="col">桁</param>
\r
221 /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>
\r
222 public void JumpCaret(int row, int col)
\r
224 this._Controller.JumpCaret(row, col);
\r
228 /// 選択中のテキストをクリップボードにコピーします
\r
232 string text = this._Controller.SelectedText;
\r
233 if (text != null && text != string.Empty)
\r
234 Clipboard.SetText(text);
\r
238 /// 選択中のテキストをクリップボードに切り取ります
\r
242 string text = this._Controller.SelectedText;
\r
243 if (text != null && text != string.Empty)
\r
245 Clipboard.SetText(text);
\r
246 this._Controller.SelectedText = "";
\r
251 /// 選択中のテキストを貼り付けます
\r
253 public void Paste()
\r
255 if (Clipboard.ContainsText() == false)
\r
257 string text = Clipboard.GetText();
\r
258 this._Controller.SelectedText = text;
\r
264 public void DeSelectAll()
\r
266 this._Controller.DeSelectAll();
\r
267 this.textStore.NotifySelectionChanged();
\r
273 /// <param name="tp">テキストポイント</param>
\r
274 /// <returns>座標</returns>
\r
275 /// <remarks>テキストポイントがクライアント領域の原点より外にある場合、返される値は原点に丸められます</remarks>
\r
276 public System.Windows.Point GetPostionFromTextPoint(TextPoint tp)
\r
278 if (this.Document.FireUpdateEvent == false)
\r
279 throw new InvalidOperationException("");
\r
280 return this.View.GetPostionFromTextPoint(tp);
\r
284 /// 対応するテキストポイントを返します
\r
286 /// <param name="p">クライアント領域の原点を左上とする座標</param>
\r
287 /// <returns>テキストポイント</returns>
\r
288 public TextPoint GetTextPointFromPostion(System.Windows.Point p)
\r
290 if (this.Document.FireUpdateEvent == false)
\r
291 throw new InvalidOperationException("");
\r
292 return this.View.GetTextPointFromPostion(p);
\r
298 /// <param name="row">レイアウト行</param>
\r
299 /// <returns>行の高さ</returns>
\r
300 public double GetLineHeight(int row)
\r
302 if (this.Document.FireUpdateEvent == false)
\r
303 throw new InvalidOperationException("");
\r
304 return this.View.LayoutLines.GetLayout(row).Height;;
\r
308 /// インデックスに対応する座標を得ます
\r
310 /// <param name="index">インデックス</param>
\r
311 /// <returns>座標を返す</returns>
\r
312 public System.Windows.Point GetPostionFromIndex(int index)
\r
314 if (this.Document.FireUpdateEvent == false)
\r
315 throw new InvalidOperationException("");
\r
316 TextPoint tp = this.View.GetLayoutLineFromIndex(index);
\r
317 return this.View.GetPostionFromTextPoint(tp);
\r
321 /// 座標からインデックスに変換します
\r
323 /// <param name="p">座標</param>
\r
324 /// <returns>インデックスを返す</returns>
\r
325 public int GetIndexFromPostion(System.Windows.Point p)
\r
327 if (this.Document.FireUpdateEvent == false)
\r
328 throw new InvalidOperationException("");
\r
329 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
330 return this.View.GetIndexFromLayoutLine(tp);
\r
336 public void Refresh()
\r
338 this.Refresh(this.View.PageBound);
\r
342 /// レイアウト行をすべて破棄し、再度レイアウトを行う
\r
344 public void PerfomLayouts()
\r
346 this.View.PerfomLayouts();
\r
352 /// <param name="row">行</param>
\r
353 /// <param name="alignTop">指定行を画面上に置くなら真。そうでないなら偽</param>
\r
354 public void ScrollIntoView(int row, bool alignTop)
\r
356 this.View.ScrollIntoView(row, alignTop);
\r
360 /// ストリームからドキュメントを構築する
\r
362 /// <param name="tr">TextReader</param>
\r
363 /// <param name="token">キャンセル用トークン</param>
\r
364 /// <returns>Taskオブジェクト</returns>
\r
365 public async Task LoadAsync(System.IO.TextReader tr, System.Threading.CancellationTokenSource token)
\r
367 WinFileReader fs = new WinFileReader(tr);
\r
368 await this.LoadAsyncImpl(fs, token);
\r
372 /// ファイルからドキュメントを構築する
\r
374 /// <param name="filepath">ファイルパス</param>
\r
375 /// <param name="enc">エンコード</param>
\r
376 /// <param name="token">キャンセル用トークン</param>
\r
377 /// <returns>Taskオブジェクト</returns>
\r
378 public async Task LoadFileAsync(string filepath, Encoding enc,System.Threading.CancellationTokenSource token)
\r
380 WinFileReader fs = new WinFileReader(filepath, enc);
\r
381 await this.LoadAsyncImpl(fs, token);
\r
385 async Task LoadAsyncImpl(WinFileReader fs,System.Threading.CancellationTokenSource token)
\r
387 this.IsEnabled = false;
\r
388 this.View.LayoutLines.IsFrozneDirtyFlag = true;
\r
389 await this.Document.LoadAsync(fs, token);
\r
390 this.View.LayoutLines.IsFrozneDirtyFlag = false;
\r
391 TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);
\r
392 if (this.verticalScrollBar != null)
\r
393 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;
\r
394 this.View.CalculateLineCountOnScreen();
\r
395 this.IsEnabled = true;
\r
399 /// ドキュメントの内容をファイルに保存する
\r
401 /// <param name="filepath">ファイルパス</param>
\r
402 /// <param name="newLine">改行コード</param>
\r
403 /// <param name="enc">エンコード</param>
\r
404 /// <returns>Taskオブジェクト</returns>
\r
405 public async Task SaveFile(string filepath, Encoding enc,string newLine, System.Threading.CancellationTokenSource token)
\r
407 WinFileWriter fs = new WinFileWriter(filepath, enc);
\r
408 fs.NewLine = newLine;
\r
409 await this.Document.SaveAsync(fs, token);
\r
414 /// アンマネージドリソースを開放する
\r
416 public void Dispose()
\r
420 this.Dispose(true);
\r
421 GC.SuppressFinalize(this);
\r
422 this.disposed = true;
\r
428 /// <param name="disposing">真ならマネージドリソースも開放し、そうでないならアンマネージドリソースのみを開放する</param>
\r
429 void Dispose(bool disposing)
\r
433 this.textStore.Dispose();
\r
435 this.View.Dispose();
\r
436 this.Render.Dispose();
\r
438 SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
\r
441 void Refresh(Rectangle updateRect)
\r
443 if (this.disposed || this.Visibility == Visibility.Collapsed)
\r
446 this.Render.BegineDraw();
\r
447 if (this.IsEnabled)
\r
448 this.View.Draw(updateRect);
\r
450 this.Render.FillBackground(updateRect);
\r
451 this.Render.EndDraw();
\r
455 void CanExecute(object sender, CanExecuteRoutedEventArgs e)
\r
457 e.CanExecute = this.IsEnabled;
\r
460 void ToggleCodePointCommand(object sender, RoutedEventArgs e)
\r
462 if (!this._Controller.ConvertToChar())
\r
463 this._Controller.ConvertToCodePoint();
\r
467 void CopyCommand(object sender, RoutedEventArgs e)
\r
472 void CutCommand(object sender, RoutedEventArgs e)
\r
478 void PasteCommand(object sender, RoutedEventArgs e)
\r
484 void DeleteCommand(object sender, RoutedEventArgs e)
\r
486 int oldLength = this.Document.Length;
\r
487 this._Controller.DoDeleteAction();
\r
491 void SelectAllCommand(object sender, RoutedEventArgs e)
\r
493 this.Select(0, this.Document.Length);
\r
497 void UndoCommand(object sender, RoutedEventArgs e)
\r
499 int oldLength = this.Document.Length;
\r
500 this.Document.UndoManager.undo();
\r
504 void RedoCommand(object sender, RoutedEventArgs e)
\r
506 int oldLength = this.Document.Length;
\r
507 this.Document.UndoManager.redo();
\r
511 void ToggleInsertCommand(object sender, RoutedEventArgs e)
\r
513 if (this.InsertMode)
\r
514 this.InsertMode = false;
\r
516 this.InsertMode = true;
\r
520 void ToggleRectSelectCommand(object sender, RoutedEventArgs e)
\r
522 if (this.RectSelectMode)
\r
523 this.RectSelectMode = false;
\r
525 this.RectSelectMode = true;
\r
528 void ToggleFlowDirectionCommand(object sender, RoutedEventArgs e)
\r
530 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
531 this.FlowDirection = System.Windows.FlowDirection.RightToLeft;
\r
533 this.FlowDirection = System.Windows.FlowDirection.LeftToRight;
\r
538 internal TextStore TextStore
\r
540 get { return this.textStore; }
\r
543 bool textStore_IsReadOnly()
\r
548 bool textStore_IsLoading()
\r
553 void textStore_CompositionEnded()
\r
555 TextStoreHelper.EndCompostion(this.Document);
\r
559 void textStore_CompositionUpdated(int start, int end)
\r
561 if (TextStoreHelper.ScrollToCompstionUpdated(this.textStore, this.View, start, end))
\r
564 bool textStore_CompositionStarted()
\r
566 bool result = TextStoreHelper.StartCompstion(this.Document);
\r
568 System.Media.SystemSounds.Beep.Play();
\r
572 string _textStore_GetString(int start, int length)
\r
574 return this.Document.ToString(start, length);
\r
577 IntPtr _textStore_GetHWnd()
\r
579 var hwndSource = HwndSource.FromVisual(this) as HwndSource;
\r
580 if (hwndSource != null)
\r
581 return hwndSource.Handle;
\r
583 return IntPtr.Zero;
\r
586 void _textStore_GetStringExtent(
\r
589 out POINT o_topLeft,
\r
590 out POINT o_bottomRight
\r
593 Point startPos, endPos;
\r
594 TextStoreHelper.GetStringExtent(this.Document, this.View, i_startIndex, i_endIndex, out startPos, out endPos);
\r
597 this.Render.GetDpi(out dpi, out dpi);
\r
598 double scale = dpi / 96.0;
\r
600 startPos = PointToScreen(this.TranslatePoint(startPos.Scale(scale), this));
\r
601 endPos = PointToScreen(this.TranslatePoint(endPos.Scale(scale), this));
\r
603 o_topLeft = new POINT((int)startPos.X, (int)startPos.Y);
\r
604 o_bottomRight = new POINT((int)endPos.X, (int)endPos.Y);
\r
607 void _textStore_GetScreenExtent(out POINT o_topLeft, out POINT o_bottomRight)
\r
609 var pointTopLeft = new Point(0, 0);
\r
610 var pointBottomRight = new Point(this.RenderSize.Width, this.RenderSize.Height);
\r
612 pointTopLeft = PointToScreen(pointTopLeft);
\r
613 pointBottomRight = PointToScreen(pointBottomRight);
\r
615 o_topLeft = new POINT((int)pointTopLeft.X, (int)pointTopLeft.Y);
\r
616 o_bottomRight = new POINT((int)pointBottomRight.X, (int)pointBottomRight.Y);
\r
619 void _textStore_GetSelectionIndex(out int o_startIndex, out int o_endIndex)
\r
621 TextStoreHelper.GetSelection(this._Controller, this.View.Selections, out o_startIndex, out o_endIndex);
\r
624 void _textStore_SetSelectionIndex(int i_startIndex, int i_endIndex)
\r
626 TextStoreHelper.SetSelectionIndex(this._Controller, this.View, i_startIndex, i_endIndex);
\r
630 void _textStore_InsertAtSelection(string i_value, ref int o_startIndex, ref int o_endIndex)
\r
632 TextStoreHelper.InsertTextAtSelection(this._Controller, i_value);
\r
637 /// キーボードフォーカスが取得されたときに呼ばれます
\r
639 /// <param name="e">イベントデーター</param>
\r
640 protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
642 base.OnGotKeyboardFocus(e);
\r
643 this.textStore.SetFocus();
\r
644 this.View.IsFocused = true;
\r
649 /// キーボードフォーカスが失われたときに呼ばれます
\r
651 /// <param name="e">イベントデーター</param>
\r
652 protected override void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
\r
654 base.OnLostKeyboardFocus(e);
\r
655 this.View.IsFocused = false;
\r
661 /// キャレットが移動したときに通知されるイベント
\r
663 public event EventHandler CaretMoved;
\r
666 protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
\r
668 this.peer = new FooTextBoxAutomationPeer(this);
\r
674 protected override void OnTextInput(TextCompositionEventArgs e)
\r
676 if (e.Text == "\r")
\r
678 this._Controller.DoEnterAction();
\r
679 this.AutoIndentHooker(this, null);
\r
681 else if (e.Text == "\b")
\r
683 this._Controller.DoBackSpaceAction();
\r
687 if(this.IsInputString(e.Text))
\r
688 this._Controller.DoInputString(e.Text);
\r
691 base.OnTextInput(e);
\r
695 bool IsInputString(string s)
\r
697 foreach (char charCode in s)
\r
699 if ((0x20 <= charCode && charCode <= 0x7e)
\r
700 || 0x7f < charCode)
\r
707 protected override void OnKeyDown(KeyEventArgs e)
\r
709 if (this.textStore.IsLocked())
\r
712 ModifierKeys modiferKeys = e.KeyboardDevice.Modifiers;
\r
713 bool movedCaret = false;
\r
717 this._Controller.MoveCaretVertical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
723 this._Controller.MoveCaretVertical(+1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
729 this._Controller.MoveCaretHorizontical(-1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
735 this._Controller.MoveCaretHorizontical(1, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift), this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control));
\r
741 this._Controller.Scroll(ScrollDirection.Up,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
746 this._Controller.Scroll(ScrollDirection.Down,this.View.LineCountOnScreen, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift),true);
\r
751 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
752 this._Controller.JumpToHead(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
754 this._Controller.JumpToLineHead(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
759 if (this.IsPressedModifierKey(modiferKeys, ModifierKeys.Control))
\r
760 this._Controller.JumpToEnd(this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
762 this._Controller.JumpToLineEnd(this.View.CaretPostion.row, this.IsPressedModifierKey(modiferKeys, ModifierKeys.Shift));
\r
767 int oldLength = this.Document.Length;
\r
768 if (this.Selection.Length == 0)
\r
769 this._Controller.DoInputChar('\t');
\r
770 else if(this.IsPressedModifierKey(modiferKeys,ModifierKeys.Shift))
\r
771 this._Controller.DownIndent();
\r
773 this._Controller.UpIndent();
\r
778 if (movedCaret && this.peer != null)
\r
779 this.peer.OnNotifyCaretChanged();
\r
783 bool IsPressedModifierKey(ModifierKeys keys, ModifierKeys pressed)
\r
785 if (keys == pressed)
\r
787 if ((keys & pressed) == pressed)
\r
793 /// ダブルクリックされたときに呼ばれます
\r
795 /// <param name="e">イベントパラメーター</param>
\r
797 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
798 /// e.Handledを真にした場合、単語単位の選択が行われなくなります
\r
800 protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
\r
802 System.Windows.Point p = e.GetPosition(this);
\r
803 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
804 if (tp == TextPoint.Null)
\r
806 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
808 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
813 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
814 base.OnMouseDoubleClick(newEventArgs);
\r
816 if (newEventArgs.Handled)
\r
819 if (e.LeftButton == MouseButtonState.Pressed)
\r
822 this._Controller.SelectWord(index);
\r
823 this.textStore.NotifySelectionChanged();
\r
824 if(this.peer != null)
\r
825 this.peer.OnNotifyCaretChanged();
\r
831 /// マウスボタンが押されたときに呼ばれます
\r
833 /// <param name="e">イベントパラメーター</param>
\r
835 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
836 /// e.Handledを真にした場合、キャレットの移動処理が行われなくなります
\r
838 protected override void OnMouseDown(MouseButtonEventArgs e)
\r
840 var p = this.GetDipFromPoint(e.GetPosition(this));
\r
841 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
842 if (tp == TextPoint.Null)
\r
844 int index = this.View.LayoutLines.GetIndexFromTextPoint(tp);
\r
846 FooMouseButtonEventArgs newEventArgs = new FooMouseButtonEventArgs(e.MouseDevice,
\r
851 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
852 base.OnMouseDown(newEventArgs);
\r
854 if (newEventArgs.Handled)
\r
857 if (e.LeftButton == MouseButtonState.Pressed)
\r
859 FoldingItem foldingData = this.View.HitFoldingData(p.X,tp.row);
\r
860 if (foldingData != null)
\r
862 if (foldingData.Expand)
\r
863 this.View.LayoutLines.FoldingCollection.Collapse(foldingData);
\r
865 this.View.LayoutLines.FoldingCollection.Expand(foldingData);
\r
866 this._Controller.JumpCaret(foldingData.Start,false);
\r
870 this._Controller.JumpCaret(tp.row, tp.col, false);
\r
872 if (this.peer != null)
\r
873 this.peer.OnNotifyCaretChanged();
\r
874 this.View.IsFocused = true;
\r
881 /// マウスが移動したときに呼ばれます
\r
883 /// <param name="e">イベントパラメーター</param>
\r
885 /// イベントパラメーターはFooMouseEventArgsにキャスト可能です。
\r
886 /// e.Handledを真にした場合、選択処理と状況に応じたカーソルの変化が行われなくなります
\r
888 protected override void OnMouseMove(MouseEventArgs e)
\r
890 var p = this.GetDipFromPoint(e.GetPosition(this));
\r
891 TextPoint tp = this.View.GetTextPointFromPostion(p);
\r
892 if (tp == TextPoint.Null)
\r
894 base.OnMouseMove(e);
\r
897 int index = this.View.GetIndexFromLayoutLine(tp);
\r
899 FooMouseEventArgs newEventArgs = new FooMouseEventArgs(e.MouseDevice, e.Timestamp, e.StylusDevice, index);
\r
900 newEventArgs.RoutedEvent = e.RoutedEvent;
\r
901 base.OnMouseMove(newEventArgs);
\r
903 if (newEventArgs.Handled)
\r
906 if (this.View.HitTextArea(p.X,p.Y))
\r
908 if (this._Controller.IsMarker(tp, HilightType.Url))
\r
909 this.Cursor = Cursors.Hand;
\r
911 this.Cursor = Cursors.IBeam;
\r
913 if (e.LeftButton == MouseButtonState.Pressed)
\r
915 this._Controller.MoveCaretAndSelect(tp);
\r
916 if (this.peer != null)
\r
917 this.peer.OnNotifyCaretChanged();
\r
923 this.Cursor = Cursors.Arrow;
\r
927 private Point GetDipFromPoint(Point p)
\r
930 this.Render.GetDpi(out dpi,out dpi);
\r
931 double scale = dpi / 96.0;
\r
932 return p.Scale(1 / scale);
\r
936 protected override void OnMouseWheel(MouseWheelEventArgs e)
\r
938 if(Keyboard.Modifiers == ModifierKeys.None)
\r
941 this._Controller.Scroll(ScrollDirection.Up, SystemParameters.WheelScrollLines, false, false);
\r
943 this._Controller.Scroll(ScrollDirection.Down, SystemParameters.WheelScrollLines, false, false);
\r
945 else if (Keyboard.Modifiers == ModifierKeys.Control)
\r
947 double newFontSize = this.Render.FontSize;
\r
952 if (newFontSize > MaxFontSize)
\r
954 else if (newFontSize < MinFontSize)
\r
956 this.Render.FontSize = newFontSize;
\r
957 SetValue(MagnificationPowerPropertyKey, this.Render.FontSize / this.FontSize);
\r
960 base.OnMouseWheel(e);
\r
963 void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
\r
965 if (e.Category == UserPreferenceCategory.Keyboard)
\r
967 int blinkTime = (int)NativeMethods.GetCaretBlinkTime();
\r
968 this.View.CaretBlink = blinkTime >= 0;
\r
969 this.View.CaretBlinkTime = blinkTime * 2;
\r
971 if (e.Category == UserPreferenceCategory.General)
\r
973 this.View.CaretWidthOnInsertMode = SystemParameters.CaretWidth;
\r
977 void Document_Update(object sender, DocumentUpdateEventArgs e)
\r
979 if (this.textStore.IsLocked())
\r
981 TextStoreHelper.NotifyTextChanged(this.textStore, e.startIndex, e.removeLength, e.insertLength);
\r
984 void timer_Tick(object sender, EventArgs e)
\r
986 if (this.image.ActualWidth == 0 || this.image.ActualHeight == 0)
\r
988 if (this.Resize(this.image.ActualWidth, this.image.ActualHeight))
\r
994 ITextLayout layout = this.View.LayoutLines.GetLayout(this.View.CaretPostion.row);
\r
995 double width = layout.GetWidthFromIndex(this.View.CaretPostion.col);
\r
997 width = this.View.CaretWidthOnInsertMode;
\r
998 double height = layout.Height;
\r
999 Rectangle updateRect = new Rectangle(
\r
1000 this.View.CaretLocation.X,
\r
1001 this.View.CaretLocation.Y,
\r
1005 this.Refresh(updateRect);
\r
1008 void horizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1010 if (this.horizontalScrollBar == null)
\r
1013 if (this.FlowDirection == System.Windows.FlowDirection.LeftToRight)
\r
1014 toX = this.horizontalScrollBar.Value;
\r
1016 toX = -this.horizontalScrollBar.Value;
\r
1017 this._Controller.Scroll(toX, this.View.Src.Row, false, false);
\r
1021 void verticalScrollBar_Scroll(object sender, ScrollEventArgs e)
\r
1023 if (this.verticalScrollBar == null)
\r
1025 int newRow = (int)this.verticalScrollBar.Value;
\r
1026 if (newRow >= this.View.LayoutLines.Count)
\r
1028 this._Controller.Scroll(this.View.Src.X,newRow, false, false);
\r
1032 void View_SrcChanged(object sender, EventArgs e)
\r
1034 if (this.horizontalScrollBar == null || this.verticalScrollBar == null)
\r
1036 EditView view = this.View;
\r
1037 if (view.Src.Row > this.verticalScrollBar.Maximum)
\r
1038 this.verticalScrollBar.Maximum = view.Src.Row + view.LineCountOnScreen + 1;
\r
1039 double absoulteX = Math.Abs(view.Src.X);
\r
1040 if(absoulteX > this.horizontalScrollBar.Maximum)
\r
1041 this.horizontalScrollBar.Maximum = absoulteX + view.PageBound.Width + 1;
\r
1042 if(view.Src.Row != this.verticalScrollBar.Value)
\r
1043 this.verticalScrollBar.Value = view.Src.Row;
\r
1044 if (view.Src.X != this.horizontalScrollBar.Value)
\r
1045 this.horizontalScrollBar.Value = Math.Abs(view.Src.X);
\r
1048 void Controller_SelectionChanged(object sender, EventArgs e)
\r
1050 this.View.CaretBlink = this.View.CaretBlink;
\r
1051 this.CaretMoved(this, null);
\r
1052 //こうしないと選択できなくなってしまう
\r
1053 this.nowCaretMove = true;
\r
1054 SetValue(SelectionProperty, new TextRange(this._Controller.SelectionStart, this._Controller.SelectionLength));
\r
1055 SetValue(CaretPostionProperty, this.View.CaretPostion);
\r
1056 this.nowCaretMove = false;
\r
1057 if(this.textStore.IsLocked() == false)
\r
1058 this.textStore.NotifySelectionChanged();
\r
1061 void FooTextBox_Loaded(object sender, RoutedEventArgs e)
\r
1063 this.Resize(this.image.ActualWidth, this.image.ActualHeight);
\r
1065 this.timer.Start();
\r
1068 bool Resize(double width, double height)
\r
1070 if (width == 0 || height == 0)
\r
1071 throw new ArgumentOutOfRangeException();
\r
1072 if (this.Render.Resize(width, height))
\r
1074 this.View.PageBound = new Rectangle(0, 0, width, height);
\r
1076 if (this.horizontalScrollBar != null)
\r
1078 this.horizontalScrollBar.LargeChange = this.View.PageBound.Width;
\r
1079 this.horizontalScrollBar.Maximum = this.View.LongestWidth + this.horizontalScrollBar.LargeChange + 1;
\r
1081 if (this.verticalScrollBar != null)
\r
1083 this.verticalScrollBar.LargeChange = this.View.LineCountOnScreen;
\r
1084 this.verticalScrollBar.Maximum = this.View.LayoutLines.Count + this.verticalScrollBar.LargeChange + 1;
\r
1092 /// プロパティーが変更されたときに呼ばれます
\r
1094 /// <param name="e">イベントパラメーター</param>
\r
1095 protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
\r
1097 switch (e.Property.Name)
\r
1099 case "IndentMode":
\r
1100 this._Controller.IndentMode = this.IndentMode;
\r
1103 if(!this.nowCaretMove)
\r
1104 this.Select(this.Selection.Index, this.Selection.Length);
\r
1106 case "CaretPostion":
\r
1107 if (!this.nowCaretMove)
\r
1108 this.JumpCaret(this.CaretPostion.row, this.CaretPostion.col);
\r
1110 case "LineBreakMethod":
\r
1111 this.View.LineBreak = this.LineBreakMethod;
\r
1113 case "LineBreakCharCount":
\r
1114 this.View.LineBreakCharCount = this.LineBreakCharCount;
\r
1116 case "InsertMode":
\r
1117 this.View.InsertMode = this.InsertMode;
\r
1120 this.View.TabStops = this.TabChars;
\r
1122 case "RectSelectMode":
\r
1123 this._Controller.RectSelection = this.RectSelectMode;
\r
1126 this.View.HideCaret = !this.DrawCaret;
\r
1128 case "DrawCaretLine":
\r
1129 this.View.HideLineMarker = !this.DrawCaretLine;
\r
1131 case "DrawLineNumber":
\r
1132 this.View.DrawLineNumber = this.DrawLineNumber;
\r
1133 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1135 case "FontFamily":
\r
1136 this.Render.FontFamily = this.FontFamily;
\r
1139 this.Render.FontSize = this.FontSize;
\r
1142 this.Render.FontStyle = this.FontStyle;
\r
1144 case "FontWeight":
\r
1145 this.Render.FontWeigth = this.FontWeight;
\r
1147 case "Foreground":
\r
1148 this.Render.Foreground = D2DRender.ToColor4(this.Foreground);
\r
1150 case "Background":
\r
1151 this.Render.Background = D2DRender.ToColor4(this.Background);
\r
1153 case "ControlChar":
\r
1154 this.Render.ControlChar =D2DRender.ToColor4( this.ControlChar);
\r
1157 this.Render.Hilight = D2DRender.ToColor4(this.Hilight);
\r
1160 this.Render.Keyword1 = D2DRender.ToColor4(this.Keyword1);
\r
1163 this.Render.Keyword2 = D2DRender.ToColor4(this.Keyword2);
\r
1166 this.Render.Comment = D2DRender.ToColor4(this.Comment);
\r
1169 this.Render.Literal = D2DRender.ToColor4(this.Literal);
\r
1172 this.Render.Url = D2DRender.ToColor4(this.URL);
\r
1174 case "InsertCaret":
\r
1175 this.Render.InsertCaret = D2DRender.ToColor4(this.InsertCaret);
\r
1177 case "OverwriteCaret":
\r
1178 this.Render.OverwriteCaret = D2DRender.ToColor4(this.OverwriteCaret);
\r
1181 this.View.Padding = new Padding((int)this.Padding.Left, (int)this.Padding.Top, (int)this.Padding.Right, (int)this.Padding.Bottom);
\r
1183 case "LineMarker":
\r
1184 this.Render.LineMarker = D2DRender.ToColor4(this.LineMarker);
\r
1187 this.View.UrlMark = this.MarkURL;
\r
1189 case "ShowFullSpace":
\r
1190 this.Render.ShowFullSpace = this.ShowFullSpace;
\r
1192 case "ShowHalfSpace":
\r
1193 this.Render.ShowHalfSpace = this.ShowHalfSpace;
\r
1196 this.Render.ShowTab = this.ShowTab;
\r
1198 case "ShowLineBreak":
\r
1199 this.Render.ShowLineBreak = this.ShowLineBreak;
\r
1201 case "FlowDirection":
\r
1202 this.Render.RightToLeft = this.FlowDirection == System.Windows.FlowDirection.RightToLeft;
\r
1203 this.horizontalScrollBar.FlowDirection = this.FlowDirection;
\r
1206 this.View.HideRuler = !this.DrawRuler;
\r
1207 this._Controller.JumpCaret(this.View.CaretPostion.row, this.View.CaretPostion.col);
\r
1209 case "UpdateArea":
\r
1210 this.Render.UpdateArea = D2DRender.ToColor4(this.UpdateArea);
\r
1212 case "LineNumber":
\r
1213 this.Render.LineNumber = D2DRender.ToColor4(this.LineNumber);
\r
1216 base.OnPropertyChanged(e);
\r
1221 internal Controller Controller
\r
1225 return this._Controller;
\r
1230 /// 文字列の描写に使用されるアンチエイリアシング モードを表します
\r
1232 public TextAntialiasMode TextAntialiasMode
\r
1236 return this.Render.TextAntialiasMode;
\r
1240 this.Render.TextAntialiasMode = value;
\r
1245 /// シンタックスハイライターを表す
\r
1247 public IHilighter Hilighter
\r
1251 return this.View.Hilighter;
\r
1255 this.View.Hilighter = value;
\r
1256 this.View.LayoutLines.ClearLayoutCache();
\r
1261 /// フォールティングを作成するインターフェイスを表す
\r
1263 public IFoldingStrategy FoldingStrategy
\r
1267 return this.View.LayoutLines.FoldingStrategy;
\r
1271 this.View.LayoutLines.FoldingStrategy = value;
\r
1272 if (value == null)
\r
1273 this.View.LayoutLines.FoldingCollection.Clear();
\r
1280 public MarkerPatternSet MarkerPatternSet
\r
1284 return this.View.MarkerPatternSet;
\r
1291 public Document Document
\r
1300 public LineToIndexTable LayoutLineCollection
\r
1302 get { return this.View.LayoutLines; }
\r
1308 public string SelectedText
\r
1312 return this._Controller.SelectedText;
\r
1316 int oldLength = this.Document.Length;
\r
1317 this._Controller.SelectedText = value;
\r
1324 public IndentMode IndentMode
\r
1326 get { return (IndentMode)GetValue(IndentModeProperty); }
\r
1327 set { SetValue(IndentModeProperty, value); }
\r
1331 /// IndentModeの依存プロパティを表す
\r
1333 public static readonly DependencyProperty IndentModeProperty =
\r
1334 DependencyProperty.Register("IndentMode", typeof(IndentMode), typeof(FooTextBox), new PropertyMetadata(IndentMode.Tab));
\r
1340 /// Lengthが0の場合はキャレット位置を表します。
\r
1341 /// 矩形選択モードの場合、選択範囲の文字数ではなく、開始位置から終了位置までの長さとなります
\r
1343 public TextRange Selection
\r
1345 get { return (TextRange)GetValue(SelectionProperty); }
\r
1346 set { SetValue(SelectionProperty, value); }
\r
1350 /// Selectionの依存プロパティを表す
\r
1352 public static readonly DependencyProperty SelectionProperty =
\r
1353 DependencyProperty.Register("Selection", typeof(TextRange), typeof(FooTextBox), new PropertyMetadata(TextRange.Null));
\r
1358 public double MagnificationPower
\r
1360 get { return (double)GetValue(MagnificationPowerPropertyKey.DependencyProperty); }
\r
1366 public static readonly DependencyPropertyKey MagnificationPowerPropertyKey =
\r
1367 DependencyProperty.RegisterReadOnly("MagnificationPower", typeof(double), typeof(FooTextBox), new PropertyMetadata(1.0));
\r
1372 public new FlowDirection FlowDirection
\r
1374 get { return (FlowDirection)GetValue(FlowDirectionProperty); }
\r
1375 set { SetValue(FlowDirectionProperty, value); }
\r
1379 /// レタリング方向を表す。これは依存プロパティです
\r
1381 public new static readonly DependencyProperty FlowDirectionProperty =
\r
1382 DependencyProperty.Register("FlowDirection", typeof(FlowDirection), typeof(FooTextBox), new PropertyMetadata(FlowDirection.LeftToRight));
\r
1385 /// キャレット位置を表す。これは依存プロパティです
\r
1387 public TextPoint CaretPostion
\r
1389 get { return (TextPoint)GetValue(CaretPostionProperty); }
\r
1390 set { SetValue(CaretPostionProperty, value); }
\r
1394 /// CaretPostionの依存プロパティを表す
\r
1396 public static readonly DependencyProperty CaretPostionProperty =
\r
1397 DependencyProperty.Register("CaretPostion", typeof(TextPoint), typeof(FooTextBox), new PropertyMetadata(TextPoint.Null));
\r
1400 /// デフォルトの文字色を表す。これは依存プロパティです
\r
1402 public new System.Windows.Media.Color Foreground
\r
1404 get { return (System.Windows.Media.Color)GetValue(ForegroundProperty); }
\r
1405 set { SetValue(ForegroundProperty, value); }
\r
1409 /// Foregroundの依存プロパティを表す
\r
1411 public new static readonly DependencyProperty ForegroundProperty =
\r
1412 DependencyProperty.Register("Foreground", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1415 /// 背景色を表す。これは依存プロパティです
\r
1417 public new System.Windows.Media.Color Background
\r
1419 get { return (System.Windows.Media.Color)GetValue(BackgroundProperty); }
\r
1420 set { SetValue(BackgroundProperty, value); }
\r
1424 /// Backgroundの依存プロパティを表す
\r
1426 public new static readonly DependencyProperty BackgroundProperty =
\r
1427 DependencyProperty.Register("Background", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowColor));
\r
1430 /// コントロールコードの文字色を表す。これは依存プロパティです
\r
1432 public System.Windows.Media.Color ControlChar
\r
1434 get { return (System.Windows.Media.Color)GetValue(ControlCharProperty); }
\r
1435 set { SetValue(ControlCharProperty, value); }
\r
1439 /// ControlCharの依存プロパティを表す
\r
1441 public static readonly DependencyProperty ControlCharProperty =
\r
1442 DependencyProperty.Register("ControlChar", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Gray));
\r
1445 /// 選択時の背景色を表す。これは依存プロパティです
\r
1447 public System.Windows.Media.Color Hilight
\r
1449 get { return (System.Windows.Media.Color)GetValue(HilightProperty); }
\r
1450 set { SetValue(HilightProperty, value); }
\r
1454 /// Hilightの依存プロパティを表す
\r
1456 public static readonly DependencyProperty HilightProperty =
\r
1457 DependencyProperty.Register("Hilight", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DeepSkyBlue));
\r
1460 /// キーワード1の文字色を表す。これは依存プロパティです
\r
1462 public System.Windows.Media.Color Keyword1
\r
1464 get { return (System.Windows.Media.Color)GetValue(Keyword1Property); }
\r
1465 set { SetValue(Keyword1Property, value); }
\r
1469 /// Keyword1の依存プロパティを表す
\r
1471 public static readonly DependencyProperty Keyword1Property =
\r
1472 DependencyProperty.Register("Keyword1", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1475 /// キーワード2の文字色を表す。これは依存プロパティです
\r
1477 public System.Windows.Media.Color Keyword2
\r
1479 get { return (System.Windows.Media.Color)GetValue(Keyword2Property); }
\r
1480 set { SetValue(Keyword2Property, value); }
\r
1484 /// Keyword2の依存プロパティを表す
\r
1486 public static readonly DependencyProperty Keyword2Property =
\r
1487 DependencyProperty.Register("Keyword2", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.DarkCyan));
\r
1490 /// コメントの文字色を表す。これは依存プロパティです
\r
1492 public System.Windows.Media.Color Comment
\r
1494 get { return (System.Windows.Media.Color)GetValue(CommentProperty); }
\r
1495 set { SetValue(CommentProperty, value); }
\r
1499 /// Commentの依存プロパティを表す
\r
1501 public static readonly DependencyProperty CommentProperty =
\r
1502 DependencyProperty.Register("Comment", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Green));
\r
1505 /// 文字リテラルの文字色を表す。これは依存プロパティです
\r
1507 public System.Windows.Media.Color Literal
\r
1509 get { return (System.Windows.Media.Color)GetValue(LiteralProperty); }
\r
1510 set { SetValue(LiteralProperty, value); }
\r
1514 /// Literalの依存プロパティを表す
\r
1516 public static readonly DependencyProperty LiteralProperty =
\r
1517 DependencyProperty.Register("Literal", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Brown));
\r
1520 /// URLの文字色を表す。これは依存プロパティです
\r
1522 public System.Windows.Media.Color URL
\r
1524 get { return (System.Windows.Media.Color)GetValue(URLProperty); }
\r
1525 set { SetValue(URLProperty, value); }
\r
1529 /// URLの依存プロパティを表す
\r
1531 public static readonly DependencyProperty URLProperty =
\r
1532 DependencyProperty.Register("URL", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Blue));
\r
1538 public System.Windows.Media.Color LineMarker
\r
1540 get { return (System.Windows.Media.Color)GetValue(LineMarkerProperty); }
\r
1541 set { SetValue(LineMarkerProperty, value); }
\r
1545 /// LineMarkerの依存プロパティを表す
\r
1547 public static readonly DependencyProperty LineMarkerProperty =
\r
1548 DependencyProperty.Register("LineMarker", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(Colors.Silver));
\r
1551 /// 挿入モード時のキャレットの色を表す
\r
1553 public System.Windows.Media.Color InsertCaret
\r
1555 get { return (System.Windows.Media.Color)GetValue(InsertCaretProperty); }
\r
1556 set { SetValue(InsertCaretProperty, value); }
\r
1560 /// InsertCaretの依存プロパティを表す
\r
1562 public static readonly DependencyProperty InsertCaretProperty =
\r
1563 DependencyProperty.Register("InsertCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1568 public System.Windows.Media.Color UpdateArea
\r
1570 get { return (System.Windows.Media.Color)GetValue(UpdateAreaProperty); }
\r
1571 set { SetValue(UpdateAreaProperty, value); }
\r
1575 /// UpdateAreaの依存プロパティを表す
\r
1577 public static readonly DependencyProperty UpdateAreaProperty =
\r
1578 DependencyProperty.Register("UpdateArea", typeof(System.Windows.Media.Color), typeof(FooTextBox), new PropertyMetadata(Colors.MediumSeaGreen));
\r
1581 /// 上書きモード時のキャレット職を表す
\r
1583 public System.Windows.Media.Color OverwriteCaret
\r
1585 get { return (System.Windows.Media.Color)GetValue(OverwriteCaretProperty); }
\r
1586 set { SetValue(OverwriteCaretProperty, value); }
\r
1590 /// OverwriteCaretの依存プロパティを表す
\r
1592 public static readonly DependencyProperty OverwriteCaretProperty =
\r
1593 DependencyProperty.Register("OverwriteCaret", typeof(System.Windows.Media.Color), typeof(FooTextBox), new FrameworkPropertyMetadata(SystemColors.WindowTextColor));
\r
1598 public System.Windows.Media.Color LineNumber
\r
1600 get { return (System.Windows.Media.Color)GetValue(LineNumberProperty); }
\r
1601 set { SetValue(LineNumberProperty, value); }
\r
1605 /// Using a DependencyProperty as the backing store for LineNumber. This enables animation, styling, binding, etc...
\r
1607 public static readonly DependencyProperty LineNumberProperty =
\r
1608 DependencyProperty.Register("LineNumber", typeof(System.Windows.Media.Color), typeof(FooTextBox), new PropertyMetadata(Colors.DimGray));
\r
1611 /// 挿入モードなら真を返し、そうでないなら、偽を返す。これは依存プロパティです
\r
1613 public bool InsertMode
\r
1615 get { return (bool)GetValue(InsertModeProperty); }
\r
1616 set { SetValue(InsertModeProperty, value); }
\r
1620 /// InsertModeの依存プロパティを表す
\r
1622 public static readonly DependencyProperty InsertModeProperty =
\r
1623 DependencyProperty.Register("InsertMode",
\r
1625 typeof(FooTextBox),
\r
1626 new FrameworkPropertyMetadata(true));
\r
1629 /// タブの文字数を表す。これは依存プロパティです
\r
1631 public int TabChars
\r
1633 get { return (int)GetValue(TabCharsProperty); }
\r
1634 set { SetValue(TabCharsProperty, value); }
\r
1638 /// TabCharsの依存プロパティを表す
\r
1640 public static readonly DependencyProperty TabCharsProperty =
\r
1641 DependencyProperty.Register("TabChars",
\r
1643 typeof(FooTextBox),
\r
1644 new FrameworkPropertyMetadata(4));
\r
1647 /// 矩形選択モードなら真を返し、そうでないなら偽を返す。これは依存プロパティです
\r
1649 public bool RectSelectMode
\r
1651 get { return (bool)GetValue(RectSelectModeProperty); }
\r
1652 set { SetValue(RectSelectModeProperty, value); }
\r
1656 /// RectSelectModeの依存プロパティを表す
\r
1658 public static readonly DependencyProperty RectSelectModeProperty =
\r
1659 DependencyProperty.Register("RectSelectMode", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1665 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1667 public LineBreakMethod LineBreakMethod
\r
1669 get { return (LineBreakMethod)GetValue(LineBreakProperty); }
\r
1670 set { SetValue(LineBreakProperty, value); }
\r
1674 /// LineBreakMethodの依存プロパティを表す
\r
1676 public static readonly DependencyProperty LineBreakProperty =
\r
1677 DependencyProperty.Register("LineBreakMethod", typeof(LineBreakMethod), typeof(FooTextBox), new PropertyMetadata(LineBreakMethod.None));
\r
1681 /// 折り返しの幅を指定する。LineBreakMethod.CharUnit以外の時は無視されます
\r
1684 /// 変更した場合、レイアウトの再構築を行う必要があります
\r
1686 public int LineBreakCharCount
\r
1688 get { return (int)GetValue(LineBreakCharCountProperty); }
\r
1689 set { SetValue(LineBreakCharCountProperty, value); }
\r
1693 /// LineBreakCharCountの依存プロパティを表す
\r
1695 public static readonly DependencyProperty LineBreakCharCountProperty =
\r
1696 DependencyProperty.Register("LineBreakCharCount", typeof(int), typeof(FooTextBox), new PropertyMetadata(80));
\r
1699 /// キャレットを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1701 public bool DrawCaret
\r
1703 get { return (bool)GetValue(DrawCaretProperty); }
\r
1704 set { SetValue(DrawCaretProperty, value); }
\r
1708 /// DrawCaretの依存プロパティを表す
\r
1710 public static readonly DependencyProperty DrawCaretProperty =
\r
1711 DependencyProperty.Register("DrawCaret", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(true));
\r
1715 /// キャレットラインを描くなら真。そうでないなら偽を返す。これは依存プロパティです
\r
1717 public bool DrawCaretLine
\r
1719 get { return (bool)GetValue(DrawCaretLineProperty); }
\r
1720 set { SetValue(DrawCaretLineProperty, value); }
\r
1724 /// DrawCaretLineの依存プロパティを表す
\r
1726 public static readonly DependencyProperty DrawCaretLineProperty =
\r
1727 DependencyProperty.Register("DrawCaretLine", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1730 /// 行番号を描くなら真。そうでなければ偽。これは依存プロパティです
\r
1732 public bool DrawLineNumber
\r
1734 get { return (bool)GetValue(DrawLineNumberProperty); }
\r
1735 set { SetValue(DrawLineNumberProperty, value); }
\r
1739 /// ルーラーを描くなら真。そうでなければ偽。これは依存プロパティです
\r
1741 public bool DrawRuler
\r
1743 get { return (bool)GetValue(DrawRulerProperty); }
\r
1744 set { SetValue(DrawRulerProperty, value); }
\r
1748 /// DrawRulerの依存プロパティを表す
\r
1750 public static readonly DependencyProperty DrawRulerProperty =
\r
1751 DependencyProperty.Register("DrawRuler", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1755 /// DrawLineNumberの依存プロパティを表す
\r
1757 public static readonly DependencyProperty DrawLineNumberProperty =
\r
1758 DependencyProperty.Register("DrawLineNumber", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1761 /// URLに下線を引くなら真。そうでないなら偽を表す。これは依存プロパティです
\r
1763 public bool MarkURL
\r
1765 get { return (bool)GetValue(MarkURLProperty); }
\r
1766 set { SetValue(MarkURLProperty, value); }
\r
1770 /// MarkURLの依存プロパティを表す
\r
1772 public static readonly DependencyProperty MarkURLProperty =
\r
1773 DependencyProperty.Register("MarkURL", typeof(bool), typeof(FooTextBox), new FrameworkPropertyMetadata(false));
\r
1776 /// 全角スペースを表示するなら真。そうでないなら偽
\r
1778 public bool ShowFullSpace
\r
1780 get { return (bool)GetValue(ShowFullSpaceProperty); }
\r
1781 set { SetValue(ShowFullSpaceProperty, value); }
\r
1785 /// ShowFullSpaceの依存プロパティを表す
\r
1787 public static readonly DependencyProperty ShowFullSpaceProperty =
\r
1788 DependencyProperty.Register("ShowFullSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1791 /// 半角スペースを表示するなら真。そうでないなら偽
\r
1793 public bool ShowHalfSpace
\r
1795 get { return (bool)GetValue(ShowHalfSpaceProperty); }
\r
1796 set { SetValue(ShowHalfSpaceProperty, value); }
\r
1800 /// ShowHalfSpaceの依存プロパティを表す
\r
1802 public static readonly DependencyProperty ShowHalfSpaceProperty =
\r
1803 DependencyProperty.Register("ShowHalfSpace", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1806 /// タブを表示するなら真。そうでないなら偽
\r
1808 public bool ShowTab
\r
1810 get { return (bool)GetValue(ShowTabProperty); }
\r
1811 set { SetValue(ShowTabProperty, value); }
\r
1815 /// ShowTabの依存プロパティを表す
\r
1817 public static readonly DependencyProperty ShowTabProperty =
\r
1818 DependencyProperty.Register("ShowTab", typeof(bool), typeof(FooTextBox), new UIPropertyMetadata(false));
\r
1821 /// 改行マークを表示するなら真。そうでないなら偽
\r
1823 public bool ShowLineBreak
\r
1825 get { return (bool)GetValue(ShowLineBreakProperty); }
\r
1826 set { SetValue(ShowLineBreakProperty, value); }
\r
1830 /// ShowLineBreakの依存プロパティを表す
\r
1832 public static readonly DependencyProperty ShowLineBreakProperty =
\r
1833 DependencyProperty.Register("ShowLineBreak", typeof(bool), typeof(FooTextBox), new PropertyMetadata(false));
\r
1838 /// マウスボタン関連のイベントクラス
\r
1840 public sealed class FooMouseButtonEventArgs : MouseButtonEventArgs
\r
1843 /// イベントが発生したドキュメントのインデックス
\r
1854 /// <param name="mouse">マウスデバイス</param>
\r
1855 /// <param name="timestamp">タイムスタンプ</param>
\r
1856 /// <param name="button">ボタン</param>
\r
1857 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1858 /// <param name="index">インデックス</param>
\r
1859 public FooMouseButtonEventArgs(MouseDevice mouse, int timestamp, MouseButton button, StylusDevice stylusDevice, int index)
\r
1860 : base(mouse, timestamp, button, stylusDevice)
\r
1862 this.Index = index;
\r
1868 public sealed class FooMouseEventArgs : MouseEventArgs
\r
1871 /// イベントが発生したドキュメントのインデックス
\r
1882 /// <param name="mouse">マウスデバイス</param>
\r
1883 /// <param name="timestamp">タイムスタンプ</param>
\r
1884 /// <param name="stylusDevice">スタイラスデバイス</param>
\r
1885 /// <param name="index">インデックス</param>
\r
1886 public FooMouseEventArgs(MouseDevice mouse,
\r
1888 StylusDevice stylusDevice,
\r
1890 : base(mouse, timestamp, stylusDevice)
\r
1892 this.Index = index;
\r