internal MyTextLayout(DW.Factory dwFactory,string str,DW.TextFormat format,double width,double height,float dip,bool showLineBreak)
{
if (dwFactory.IsDisposed)
+ {
throw new InvalidOperationException();
+ }
str = str.Trim(Document.NewLine); //取り除かないとキャレットの動きがおかしくなる
if (showLineBreak)
{
Regex regex;\r
Match match;\r
StringBuffer buffer;\r
+ LineToIndexTable _LayoutLines;\r
bool _EnableFireUpdateEvent = true;\r
SemaphoreSlim Semaphore = new SemaphoreSlim(MaxSemaphoreCount);\r
\r
/// <summary>\r
/// コンストラクター\r
/// </summary>\r
- public Document()\r
- : this(null)\r
+ internal Document(ITextRender render)\r
+ : this(null,render)\r
{\r
}\r
\r
- internal Document(Document doc)\r
+ internal Document(Document doc,ITextRender render)\r
{\r
if (doc == null)\r
this.buffer = new StringBuffer();\r
this.ChangeFireUpdateEvent += new EventHandler((s, e) => { });\r
this.Markers = new MarkerCollection(this);\r
this.UndoManager = new UndoManager();\r
+ this._LayoutLines = new LineToIndexTable(this, render);\r
+ this._LayoutLines.SpilitString = LayoutLines_SpilitStringByChar;\r
+ this._LayoutLines.Clear();\r
+ }\r
+\r
+ /// <summary>\r
+ /// レイアウト行を表す\r
+ /// </summary>\r
+ public LineToIndexTable LayoutLines\r
+ {\r
+ get\r
+ {\r
+ return this._LayoutLines;\r
+ }\r
+ }\r
+\r
+ IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)\r
+ {\r
+ return this.CreateLineList(e.index, e.length);\r
+ }\r
+\r
+ /// <summary>\r
+ /// レイアウト行を返す\r
+ /// </summary>\r
+ /// <param name="index">開始インデックス</param>\r
+ /// <param name="length">長さ</param>\r
+ /// <param name="lineLimitLength">1行当たりの最大文字数。-1で無制限</param>\r
+ /// <returns>レイアウト行リスト</returns>\r
+ internal IList<LineToIndexTableData> CreateLineList(int index, int length, int lineLimitLength = -1)\r
+ {\r
+ int startIndex = index;\r
+ int endIndex = index + length - 1;\r
+ List<LineToIndexTableData> output = new List<LineToIndexTableData>();\r
+\r
+ foreach (Tuple<int, int> range in this.ForEachLines(startIndex, endIndex, lineLimitLength))\r
+ {\r
+ int lineHeadIndex = range.Item1;\r
+ int lineLength = range.Item2;\r
+ char c = this.buffer[lineHeadIndex + lineLength - 1];\r
+ bool hasNewLine = c == Document.NewLine;\r
+ output.Add(this.LayoutLines.CreateLineToIndexTableData(lineHeadIndex, lineLength, hasNewLine, null));\r
+ }\r
+\r
+ if (output.Count > 0)\r
+ output.Last().LineEnd = true;\r
+\r
+ return output;\r
+ }\r
+\r
+ internal void FireUpdate(DocumentUpdateEventArgs e)\r
+ {\r
+ this.buffer_Update(this.buffer, e);\r
}\r
\r
/// <summary>\r
\r
void buffer_Update(object sender, DocumentUpdateEventArgs e)\r
{\r
+ switch (e.type)\r
+ {\r
+ case UpdateType.Replace:\r
+ this._LayoutLines.UpdateAsReplace(e.startIndex, e.removeLength, e.insertLength);\r
+ break;\r
+ case UpdateType.Clear:\r
+ this._LayoutLines.Clear();\r
+ break;\r
+ }\r
this.UpdateCalledAlways(this, e);\r
if(this.FireUpdateEvent)\r
this.Update(this, e);\r
const int SpiltCharCount = 1024;\r
\r
protected Document Document;\r
- protected LineToIndexTable _LayoutLines;\r
protected Point2 _Src = new Point2();\r
protected Rectangle _Rect;\r
protected double _LongestWidth;\r
this._Padding = padding;\r
this.Document = doc;\r
this.Document.UpdateCalledAlways += new DocumentUpdateEventHandler(doc_Update);\r
- this._LayoutLines = new LineToIndexTable(this.Document, r);\r
this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByChar);\r
this.render = r;\r
this.render.ChangedRenderResource += new ChangedRenderResourceEventHandler(render_ChangedRenderResource);\r
this.MarkerPatternSet.Updated += WacthDogPattern_Updated;\r
}\r
\r
+ protected LineToIndexTable _LayoutLines\r
+ {\r
+ get\r
+ {\r
+ return this.Document.LayoutLines;\r
+ }\r
+ }\r
+\r
public event EventHandler SrcChanged;\r
\r
public event EventHandler PerformLayouted;\r
/// </summary>\r
public virtual void PerfomLayouts()\r
{\r
- this.doc_Update(this.Document, new DocumentUpdateEventArgs(UpdateType.Clear, -1, -1, -1));\r
- this.doc_Update(this.Document, new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, this.Document.Length));\r
+ this.Document.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Clear, -1, -1, -1));\r
+ this.Document.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, this.Document.Length));\r
CalculateLineCountOnScreen();\r
this.PerformLayouted(this, null);\r
}\r
{\r
switch (e.type)\r
{\r
- case UpdateType.Replace:\r
- this._LayoutLines.UpdateAsReplace(e.startIndex, e.removeLength, e.insertLength);\r
- break;\r
case UpdateType.Clear:\r
- this._LayoutLines.Clear();\r
this._LongestWidth = 0;\r
break;\r
}\r
\r
IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)\r
{\r
- LineToIndexTable layoutLineCollection = (LineToIndexTable)sender;\r
- int startIndex = e.index;\r
- int endIndex = e.index + e.length - 1;\r
- List<LineToIndexTableData> output = new List<LineToIndexTableData>();\r
-\r
- foreach (Tuple<int, int> range in this.Document.ForEachLines(startIndex, endIndex, 1000))\r
- {\r
- int lineHeadIndex = range.Item1;\r
- int lineLength = range.Item2;\r
- char c = this.Document[lineHeadIndex + lineLength - 1];\r
- bool hasNewLine = c == Document.NewLine;\r
- output.Add(layoutLineCollection.CreateLineToIndexTableData(lineHeadIndex, lineLength, hasNewLine, null));\r
- }\r
-\r
- if (output.Count > 0)\r
- output.Last().LineEnd = true;\r
-\r
- return output;\r
+ return this.Document.CreateLineList(e.index, e.length,1000);\r
}\r
}\r
}\r
this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
this.textStore.CompositionEnded += textStore_CompositionEnded;\r
\r
- this.Document = new Document();\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.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
Windows.UI.Color foreground, comment, keyword1, keyword2, literal, url;\r
string fontName;\r
double fontSize;\r
- Document document;\r
LineBreakMethod lineBreakMethod;\r
int lineBreakCharCount, tabCount;\r
+ Document document;\r
bool urlMark;\r
IHilighter hilighter;\r
float displayDpi;\r
this.fontName = textbox.FontFamily.Source;\r
this.fontSize = textbox.FontSize;\r
this.tabCount = textbox.TabChars;\r
- this.document = new Document(textbox.Document);\r
+ this.document = textbox.Document;\r
this.lineBreakMethod = textbox.LineBreakMethod;\r
this.lineBreakCharCount = textbox.LineBreakCharCount;\r
this.drawLineNumber = textbox.DrawLineNumber;\r
this.padding = padding;\r
this.EnableHilight = true;\r
}\r
- public D2DRenderBase CreateRender(PrintPageDescription pagedesc, IPrintDocumentPackageTarget docPackageTarget)\r
+ public D2DPrintRender CreateRender(PrintPageDescription pagedesc, IPrintDocumentPackageTarget docPackageTarget)\r
{\r
- D2DRenderBase render;\r
+ D2DPrintRender render;\r
Size size = new Size(pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);\r
render = new D2DPrintRender(this.fontName, this.fontSize, size, Math.Min(pagedesc.DpiX, pagedesc.DpiY), docPackageTarget);\r
render.Foreground = D2DRenderBase.ToColor4(this.foreground);\r
render.Url = D2DRenderBase.ToColor4(this.url);\r
return render;\r
}\r
- public PrintableView CreateView(PrintPageDescription pagedesc, D2DRenderBase render, string header, string footer)\r
+ public PrintableView CreateView(PrintPageDescription pagedesc, IPrintableTextRender render, string header, string footer)\r
{\r
- PrintableView view = new PrintableView(this.document, (IPrintableTextRender)render,padding);\r
+ Document documentSnap = new Document(this.document, render);\r
+ PrintableView view = new PrintableView(documentSnap, render,padding);\r
view.TabStops = this.tabCount;\r
view.LineBreak = this.lineBreakMethod == LineBreakMethod.None ? LineBreakMethod.PageBound : this.lineBreakMethod;\r
view.LineBreakCharCount = this.lineBreakCharCount;\r
PrintTaskOptions options = (PrintTaskOptions)printTaskOptions;\r
PrintPageDescription pagedesc = options.GetPageDescription(1);\r
\r
- D2DRenderBase render = this.factory.CreateRender(pagedesc, docPackageTarget);\r
+ D2DPrintRender render = this.factory.CreateRender(pagedesc, docPackageTarget);\r
PrintableView view = this.factory.CreateView(pagedesc, render, this.Header, this.Fotter);\r
\r
bool result = false;\r
this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
this.textStore.CompositionEnded += textStore_CompositionEnded;\r
\r
- this.Document = new Document();\r
-\r
this.Render = new D2DRender(this, 200, 200,this.image);\r
this.Render.ShowFullSpace = this.ShowFullSpace;\r
this.Render.ShowHalfSpace = this.ShowHalfSpace;\r
this.Render.ShowTab = this.ShowTab;\r
\r
- this.View = new EditView(this.Document, this.Render,new Padding(5,5,5,5));\r
+ this.Document = new Document(this.Render);\r
+\r
+ this.View = new EditView(this.Document, this.Render, new Padding(5, 5, 5, 5));\r
this.View.SrcChanged += View_SrcChanged;\r
this.View.InsertMode = this.InsertMode;\r
this.View.DrawLineNumber = this.DrawLineNumber;\r
[TestMethod]
public void UpdateItems()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
FoldingCollection collection = new FoldingCollection();
collection.Add(new FoldingItem(0, 10));
collection.Add(new FoldingItem(1, 5));
[TestMethod]
public void InsertSingleLineTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
doc.Clear();
doc.Append("a\nb\nc\nd");
[TestMethod]
public void InsertMultiLineTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
doc.Clear();
[TestMethod]
public void RemoveSingleLineTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
doc.Clear();
doc.Append("aa\nbb\ncc\ndd");
[TestMethod]
public void RemoveMultiLineTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
doc.Clear();
[TestMethod]
public void QueryTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
doc.Clear();
doc.Append("a\nb\nc");
[TestMethod]
public void FindTest1()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("is this a pen");
doc.SetFindParam("is", false, RegexOptions.None);
IEnumerator<SearchResult> it = doc.Find();
[TestMethod]
public void FindTest2()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("is this a pen");
doc.SetFindParam("is", false, RegexOptions.None);
IEnumerator<SearchResult> it = doc.Find(3,4);
[TestMethod]
public void FindTest3()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("is this a pen");
doc.SetFindParam("is", false, RegexOptions.None);
IEnumerator<SearchResult> it = doc.Find(0, 8);
[TestMethod]
public void ReaderTest1()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("a");
DocumentReader reader = doc.CreateReader();
Assert.IsTrue(reader.Read() == 'a');
[TestMethod]
public void ReaderTest2()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("abc");
DocumentReader reader = doc.CreateReader();
char[] buf = new char[2];
[TestMethod]
public void GetLinesText()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("a\nb\nc");
var result = doc.GetLines(0, doc.Length - 1).ToArray();
Assert.AreEqual("a\n", result[0]);
[TestMethod]
public void MarkerTest()
{
- Document doc = new Document();
+ DummyRender render = new DummyRender();
+ Document doc = new Document(render);
doc.Append("this is a pen");
doc.SetMarker(MarkerIDs.Defalut, Marker.Create(0, 4, HilightType.Sold));
};
string str = "html haml";
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
DummyView view = new DummyView(doc, render);
view.MarkerPatternSet.Add(MarkerIDs.Defalut, dog);
doc.Clear();
[TestMethod]
public void SelectTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
- EditView view = new EditView(doc,render);
+ Document doc = new Document(render);
+ EditView view = new EditView(doc, render);
Controller ctrl = new Controller(doc, view);
doc.Clear();
doc.Append("a\nb\nc");
[TestMethod]
public void ReplaceSelectionTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
EditView view = new EditView(doc, render);
Controller ctrl = new Controller(doc, view);
doc.Clear();
[TestMethod]
public void SelectByRectTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
EditView view = new EditView(doc, render);
Controller ctrl = new Controller(doc, view);
doc.Clear();
[TestMethod]
public void RectEditTest()
{
- Document doc = new Document();
DummyRender render = new DummyRender();
+ Document doc = new Document(render);
EditView view = new EditView(doc, render);
Controller ctrl = new Controller(doc, view);
doc.Clear();
this.SetStyle(ControlStyles.UserPaint, true);\r
this.SetStyle(ControlStyles.Opaque, true);\r
\r
- this.Document = new Document();\r
-\r
this.render = new D2DTextRender(this);\r
- this.View = new EditView(this.Document,this.render,new FooEditEngine.Padding(5,5,5,5));\r
+ this.Document = new Document(this.render);\r
+ this.View = new EditView(this.Document, this.render, new FooEditEngine.Padding(5, 5, 5, 5));\r
this.View.SrcChanged += View_SrcChanged;\r
\r
this.Controller = new Controller(this.Document, this.View);\r