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
*/\r
using System;\r
+using System.Text;\r
using System.ComponentModel;\r
using System.Threading.Tasks;\r
using Windows.ApplicationModel.Resources.Core;\r
this.textStore = new TextStore2();\r
this.textStore.IsLoading += textStore_IsLoading;\r
this.textStore.IsReadOnly += textStore_IsReadOnly;\r
+ this.textStore.GetDpi += textStore_GetDpi;\r
this.textStore.GetStringLength += () => this.Document.Length;\r
this.textStore.GetString += _textStore_GetString;\r
this.textStore.GetSelectionIndex += _textStore_GetSelectionIndex;\r
this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
this.textStore.CompositionEnded += textStore_CompositionEnded;\r
\r
- this.Document = new Document();\r
- DocumentExtend.Progress += Document_Progress;\r
-\r
this.rectangle = new Windows.UI.Xaml.Shapes.Rectangle();\r
this.rectangle.Margin = this.Padding;\r
this.Render = new D2DRender(this,this.rectangle,this.textStore);\r
\r
- this.View = new EditView(this.Document, this.Render, new Padding(Gripper.GripperWidth / 2, Gripper.GripperWidth, Gripper.GripperWidth / 2, Gripper.GripperWidth));\r
+ this.Document = new Document(this.Render);\r
+\r
+ this.View = new EditView(this.Document, this.Render, new Padding(5, Gripper.HitAreaWidth, Gripper.HitAreaWidth / 2, Gripper.HitAreaWidth));\r
this.View.SrcChanged += View_SrcChanged;\r
this.View.InsertMode = this.InsertMode;\r
this.View.DrawLineNumber = this.DrawLineNumber;\r
this.View.Dispose();\r
this.Render.Dispose();\r
}\r
- DocumentExtend.Progress -= this.Document_Progress;\r
}\r
\r
/// <summary>\r
/// <param name="length">長さ</param>\r
public void Select(int start, int length)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
this._Controller.Select(start, length);\r
}\r
\r
/// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>\r
public void JumpCaret(int index)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
this._Controller.JumpCaret(index);\r
}\r
/// <summary>\r
/// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>\r
public void JumpCaret(int row, int col)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
this._Controller.JumpCaret(row, col);\r
}\r
\r
/// </summary>\r
public void Copy()\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
string text = this._Controller.SelectedText;\r
if (text != null && text != string.Empty)\r
{\r
/// </summary>\r
public void Cut()\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
string text = this._Controller.SelectedText;\r
if (text != null && text != string.Empty)\r
{\r
/// </summary>\r
public async Task PasteAsync()\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
-\r
var dataPackageView = Clipboard.GetContent();\r
if (dataPackageView.Contains(StandardDataFormats.Text))\r
{\r
/// </summary>\r
public void SelectAll()\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
this._Controller.Select(0, this.Document.Length);\r
}\r
\r
/// </summary>\r
public void DeSelectAll()\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
this._Controller.DeSelectAll();\r
}\r
\r
/// <remarks>テキストポイントがクライアント領域の原点より外にある場合、返される値は原点に丸められます</remarks>\r
public Windows.Foundation.Point GetPostionFromTextPoint(TextPoint tp)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
if (this.Document.FireUpdateEvent == false)\r
throw new InvalidOperationException("");\r
return this.View.GetPostionFromTextPoint(tp);\r
/// <returns>テキストポイント</returns>\r
public TextPoint GetTextPointFromPostion(Windows.Foundation.Point p)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
if (this.Document.FireUpdateEvent == false)\r
throw new InvalidOperationException("");\r
return this.View.GetTextPointFromPostion(p);\r
/// <returns>行の高さ</returns>\r
public double GetLineHeight(int row)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
if (this.Document.FireUpdateEvent == false)\r
throw new InvalidOperationException("");\r
return this.View.LayoutLines.GetLayout(row).Height; ;\r
/// <returns>座標を返す</returns>\r
public Windows.Foundation.Point GetPostionFromIndex(int index)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
if (this.Document.FireUpdateEvent == false)\r
throw new InvalidOperationException("");\r
TextPoint tp = this.View.GetLayoutLineFromIndex(index);\r
/// <returns>インデックスを返す</returns>\r
public int GetIndexFromPostion(Windows.Foundation.Point p)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- throw new InvalidOperationException();\r
if (this.Document.FireUpdateEvent == false)\r
throw new InvalidOperationException("");\r
TextPoint tp = this.View.GetTextPointFromPostion(p);\r
this.View.PerfomLayouts();\r
}\r
\r
+ /// <summary>\r
+ /// ファイルからドキュメントを構築する\r
+ /// </summary>\r
+ /// <param name="sr">StremReader</param>\r
+ /// <returns>Taskオブジェクト</returns>\r
+ public async Task LoadFileAsync(System.IO.StreamReader sr, System.Threading.CancellationTokenSource token)\r
+ {\r
+ this.IsEnabled = false;\r
+ this.View.LayoutLines.IsFrozneDirtyFlag = true;\r
+ WinFileReader fs = new WinFileReader(sr);\r
+ await this.Document.LoadAsync(fs, token);\r
+ this.View.LayoutLines.IsFrozneDirtyFlag = false;\r
+ TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);\r
+ if (this.verticalScrollBar != null)\r
+ this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
+ this.View.CalculateLineCountOnScreen();\r
+ this.IsEnabled = true;\r
+ }\r
+\r
+ /// <summary>\r
+ /// ドキュメントの内容をファイルに保存する\r
+ /// </summary>\r
+ /// <param name="sw">StreamWriter</param>\r
+ /// <param name="enc">エンコード</param>\r
+ /// <returns>Taskオブジェクト</returns>\r
+ public async Task SaveFile(System.IO.StreamWriter sw, System.Threading.CancellationTokenSource token)\r
+ {\r
+ WinFileWriter fs = new WinFileWriter(sw);\r
+ await this.Document.SaveAsync(fs, token);\r
+ }\r
+\r
#region command\r
void CopyCommand()\r
{\r
/// <inheritdoc/>\r
protected override async void OnKeyDown(KeyRoutedEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
bool isControlPressed = this.IsModiferKeyPressed(VirtualKey.Control);\r
bool isShiftPressed = this.IsModiferKeyPressed(VirtualKey.Shift);\r
bool isMovedCaret = false;\r
this.gestureRecongnizer.ProcessMoveEvents(e.GetIntermediatePoints(this));\r
e.Handled = true;\r
\r
- if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && this.Document.State != AsyncState.Loading)\r
+ if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse)\r
{\r
Point p = e.GetCurrentPoint(this).Position;\r
if (this.View.HitTextArea(p.X, p.Y))\r
\r
void CoreWindow_CharacterReceived(CoreWindow sender, CharacterReceivedEventArgs args)\r
{\r
- if (this.FocusState == FocusState.Unfocused || this.Document.State == AsyncState.Loading)\r
+ if (this.FocusState == FocusState.Unfocused || !this.IsEnabled)\r
return;\r
if (args.KeyCode >= 00 && args.KeyCode <= 0x1f)\r
return;\r
this.Refresh();\r
}\r
\r
+ double textStore_GetDpi()\r
+ {\r
+ float dpi;\r
+ this.Render.GetDpi(out dpi, out dpi);\r
+ return dpi;\r
+ }\r
+\r
bool textStore_IsReadOnly()\r
{\r
return false;\r
\r
bool textStore_IsLoading()\r
{\r
- return this.Document.State == AsyncState.Loading;\r
+ return false;\r
}\r
\r
void textStore_CompositionEnded()\r
\r
void _textStore_SetSelectionIndex(int i_startIndex, int i_endIndex)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
TextStoreHelper.SetSelectionIndex(this._Controller, this.View, i_startIndex, i_endIndex);\r
this.Refresh();\r
}\r
\r
void gestureRecongnizer_ManipulationUpdated(GestureRecognizer sender, ManipulationUpdatedEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
-\r
if (HittedCaret)\r
{\r
Point p;\r
else\r
this._Controller.MoveCaretAndSelect(tp);\r
}\r
- if (this.peer != null)\r
- this.peer.OnNotifyCaretChanged();\r
- this.Refresh();\r
- return;\r
}\r
+ else\r
+ {\r
+ TextPoint tp = this.View.GetTextPointFromPostion(p);\r
+ this._Controller.MoveCaretAndSelect(tp);\r
+ }\r
+ if (this.peer != null)\r
+ this.peer.OnNotifyCaretChanged();\r
+ this.Refresh();\r
+ return;\r
}\r
if (e.Delta.Scale < 1)\r
{\r
\r
void JumpCaret(Point p)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
- \r
TextPoint tp = this.View.GetTextPointFromPostion(p);\r
if (tp == TextPoint.Null)\r
return;\r
\r
void gestureRecongnizer_Dragging(GestureRecognizer sender, DraggingEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
Point p = e.Position;\r
if (this.View.HitTextArea(p.X, p.Y))\r
{\r
if (this.rectangle.ActualWidth == 0 || this.rectangle.ActualHeight == 0/* || !this.Render.IsCanDraw()*/)\r
return;\r
\r
- this.Render.BeginDraw();\r
- if (this.Document.State != AsyncState.Loading)\r
+ this.Render.BegineDraw();\r
+ if (this.IsEnabled)\r
this.View.Draw(updateRect);\r
else\r
this.Render.FillBackground(updateRect);\r
{\r
if (width == 0 || height == 0)\r
throw new ArgumentOutOfRangeException();\r
- if (this.Document.State != AsyncState.Loading && this.Render.Resize(this.rectangle, width, height))\r
+ if (this.Render.Resize(this.rectangle, width, height))\r
{\r
this.View.PageBound = new Rectangle(0, 0, width, height);\r
\r
\r
void FooTextBox_SizeChanged(object sender, SizeChangedEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading || this.Resize(this.rectangle.ActualWidth, this.rectangle.ActualHeight))\r
+ if (this.Resize(this.rectangle.ActualWidth, this.rectangle.ActualHeight))\r
{\r
this.Refresh();\r
return;\r
\r
void horizontalScrollBar_Scroll(object sender, ScrollEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
if (this.horizontalScrollBar == null)\r
return;\r
double toX;\r
\r
void verticalScrollBar_Scroll(object sender, ScrollEventArgs e)\r
{\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
if (this.verticalScrollBar == null)\r
return;\r
int newRow = (int)this.verticalScrollBar.Value;\r
\r
void Document_Update(object sender, DocumentUpdateEventArgs e)\r
{\r
- if (this.textStore.IsLocked() || this.Document.State == AsyncState.Loading || e.type == UpdateType.Clear)\r
+ if (this.textStore.IsLocked())\r
return;\r
- TextStoreHelper.NotifyTextChanged(this.textStore, this.Document);\r
- }\r
-\r
- void Document_Progress(object sender, ProgressEventArgs e)\r
- {\r
- if (this.Document.State == AsyncState.Loading)\r
- return;\r
- switch (e.state)\r
- {\r
- case ProgressState.Start:\r
- TextStoreHelper.NotifyTextChanged(this.textStore, this.Document);\r
- break;\r
- case ProgressState.Complete:\r
- TextStoreHelper.NotifyTextChanged(this.textStore, this.Document);\r
- if (this.verticalScrollBar != null)\r
- this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
- this.View.CalculateLineCountOnScreen();\r
- break;\r
- }\r
+ TextStoreHelper.NotifyTextChanged(this.textStore, e.startIndex, e.removeLength, e.insertLength);\r
}\r
\r
void FooTextBox_Loaded(object sender, RoutedEventArgs e)\r
if (e.Property.Equals(FontSizeProperty))\r
source.Render.FontSize = source.FontSize;\r
if (e.Property.Equals(ForegroundProperty))\r
- source.Render.Foreground = source.Foreground;\r
+ source.Render.Foreground = D2DRenderBase.ToColor4(source.Foreground);\r
if (e.Property.Equals(BackgroundProperty))\r
- source.Render.Background = source.Background;\r
+ source.Render.Background = D2DRenderBase.ToColor4(source.Background);\r
if (e.Property.Equals(ControlCharProperty))\r
- source.Render.ControlChar = source.ControlChar;\r
+ source.Render.ControlChar = D2DRenderBase.ToColor4(source.ControlChar);\r
if (e.Property.Equals(HilightProperty))\r
- source.Render.Hilight = source.Hilight;\r
+ source.Render.Hilight = D2DRenderBase.ToColor4(source.Hilight);\r
if (e.Property.Equals(Keyword1Property))\r
- source.Render.Keyword1 = source.Keyword1;\r
+ source.Render.Keyword1 = D2DRenderBase.ToColor4(source.Keyword1);\r
if (e.Property.Equals(Keyword2Property))\r
- source.Render.Keyword2 = source.Keyword2;\r
+ source.Render.Keyword2 = D2DRenderBase.ToColor4(source.Keyword2);\r
if (e.Property.Equals(CommentProperty))\r
- source.Render.Comment = source.Comment;\r
+ source.Render.Comment = D2DRenderBase.ToColor4(source.Comment);\r
if (e.Property.Equals(LiteralProperty))\r
- source.Render.Literal = source.Literal;\r
+ source.Render.Literal = D2DRenderBase.ToColor4(source.Literal);\r
if (e.Property.Equals(URLProperty))\r
- source.Render.Url = source.URL;\r
+ source.Render.Url = D2DRenderBase.ToColor4(source.URL);\r
if (e.Property.Equals(InsertCaretProperty))\r
- source.Render.InsertCaret = source.InsertCaret;\r
+ source.Render.InsertCaret = D2DRenderBase.ToColor4(source.InsertCaret);\r
if (e.Property.Equals(OverwriteCaretProperty))\r
- source.Render.OverwriteCaret = source.OverwriteCaret;\r
+ source.Render.OverwriteCaret = D2DRenderBase.ToColor4(source.OverwriteCaret);\r
+ if (e.Property.Equals(PaddingProperty))\r
+ source.View.Padding = new Padding((int)source.Padding.Left, (int)source.Padding.Top, (int)source.Padding.Right, (int)source.Padding.Bottom);\r
if (e.Property.Equals(LineMarkerProperty))\r
- source.Render.LineMarker = source.LineMarker;\r
+ source.Render.LineMarker = D2DRenderBase.ToColor4(source.LineMarker);\r
if (e.Property.Equals(MarkURLProperty))\r
source.View.UrlMark = source.MarkURL;\r
if (e.Property.Equals(ShowFullSpaceProperty))\r
source.View.LineBreak = source.LineBreakMethod;\r
if (e.Property.Equals(LineBreakCharCountProperty))\r
source.View.LineBreakCharCount = source.LineBreakCharCount;\r
+ if (e.Property.Equals(UpdateAreaProperty))\r
+ source.Render.UpdateArea = D2DRenderBase.ToColor4(source.UpdateArea);\r
if (e.Property.Equals(FlowDirectionProperty))\r
{\r
source.Render.RightToLeft = source.FlowDirection == Windows.UI.Xaml.FlowDirection.RightToLeft;\r
public static readonly DependencyProperty URLProperty =\r
DependencyProperty.Register("URL", typeof(Windows.UI.Color), typeof(FooTextBox), new PropertyMetadata(Colors.Blue, OnPropertyChanged));\r
\r
+ /// <summary>\r
+ /// 行更新フラグの色を表す\r
+ /// </summary>\r
+ public Windows.UI.Color UpdateArea\r
+ {\r
+ get { return (Windows.UI.Color)GetValue(UpdateAreaProperty); }\r
+ set { SetValue(UpdateAreaProperty, value); }\r
+ }\r
+\r
+ /// <summary>\r
+ /// UpdateAreaの依存プロパティを表す\r
+ /// </summary>\r
+ public static readonly DependencyProperty UpdateAreaProperty =\r
+ DependencyProperty.Register("UpdateArea", typeof(Windows.UI.Color), typeof(FooTextBox), new PropertyMetadata(Colors.MediumSeaGreen));\r
\r
/// <summary>\r
/// ラインマーカーの色を表す\r
DependencyProperty.Register("OverwriteCaret", typeof(Windows.UI.Color), typeof(FooTextBox), new PropertyMetadata(Colors.Black, OnPropertyChanged));\r
\r
/// <summary>\r
+ /// 余白を表す\r
+ /// </summary>\r
+ public new Thickness Padding\r
+ {\r
+ get { return (Thickness)GetValue(PaddingProperty); }\r
+ set { SetValue(PaddingProperty, value); }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Paddingの依存プロパティを表す\r
+ /// </summary>\r
+ public new static readonly DependencyProperty PaddingProperty =\r
+ DependencyProperty.Register("Padding", typeof(Thickness), typeof(FooTextBox), new PropertyMetadata(new Thickness(),OnPropertyChanged)); \r
+\r
+ /// <summary>\r
/// 挿入モードなら真を返し、そうでないなら、偽を返す。これは依存プロパティです\r
/// </summary>\r
public bool InsertMode\r