OSDN Git Service

印刷時に行がはみ出た場合、二ページ目がうまく印刷できないことがあった
[fooeditengine/FooEditEngine.git] / UWP / FooEditEngine.UWP / Print / DocumentSource.cs
index 9f6ce61..fb905b5 100644 (file)
@@ -15,7 +15,7 @@ using System.Runtime.InteropServices;
 using Windows.UI;
 using FooEditEngine.UWP;
 
-namespace FooEditEngine
+namespace FooEditEngine.UWP
 {
     /// <summary>
     /// イベントデータ
@@ -59,36 +59,19 @@ namespace FooEditEngine
 
     sealed class PrintableViewFactory
     {
-        Windows.UI.Color foreground, comment, keyword1, keyword2, literal, url;
+        public Windows.UI.Color foreground, comment, keyword1, keyword2, literal, url;
+
         string fontName;
         double fontSize;
-        LineBreakMethod lineBreakMethod;
-        int lineBreakCharCount, tabCount;
-        Document document;
-        bool urlMark;
-        IHilighter hilighter;
         float displayDpi;
         Padding padding;
-        public PrintableViewFactory(FooTextBox textbox,Padding padding)
+
+        public PrintableViewFactory(Padding padding, string FontName,double fontSize)
         {
-            this.foreground = textbox.Foreground;
-            this.comment = textbox.Comment;
-            this.keyword1 = textbox.Keyword1;
-            this.keyword2 = textbox.Keyword2;
-            this.literal = textbox.Literal;
-            this.url = textbox.URL;
-            this.fontName = textbox.FontFamily.Source;
-            this.fontSize = textbox.FontSize;
-            this.tabCount = textbox.TabChars;
-            this.document = textbox.Document;
-            this.lineBreakMethod = textbox.LineBreakMethod;
-            this.lineBreakCharCount = textbox.LineBreakCharCount;
-            this.drawLineNumber = textbox.DrawLineNumber;
-            this.urlMark = textbox.MarkURL;
-            this.hilighter = textbox.Hilighter;
+            this.fontName = FontName;
+            this.fontSize = fontSize;
             this.displayDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
             this.padding = padding;
-            this.EnableHilight = true;
         }
         public D2DPrintRender CreateRender(PrintPageDescription pagedesc, IPrintDocumentPackageTarget docPackageTarget)
         {
@@ -103,6 +86,7 @@ namespace FooEditEngine
             render.Url = D2DRenderBase.ToColor4(this.url);
             return render;
         }
+
         public D2DPrintPreviewRender CreateRender(PrintPageDescription pagedesc)
         {
             D2DPrintPreviewRender render;
@@ -116,35 +100,25 @@ namespace FooEditEngine
             render.Url = D2DRenderBase.ToColor4(this.url);
             return render;
         }
-        public PrintableView CreateView(PrintPageDescription pagedesc, IPrintableTextRender render, string header, string footer)
+
+        public PrintableView CreateView(Document document,PrintPageDescription pagedesc, IPrintableTextRender render, string header, string footer)
         {
-            Document documentSnap = new Document(this.document);
-            documentSnap.LayoutLines.Render = render;
-            PrintableView view = new PrintableView(documentSnap, render,padding);
+            document.LayoutLines.Render = render;
+            PrintableView view = new PrintableView(document, render,padding);
             view.Header = header;
             view.Footer = footer;
             view.PageBound = new Rectangle(pagedesc.ImageableRect.X, pagedesc.ImageableRect.Y, pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);
-            view.Hilighter = this.EnableHilight ? this.hilighter : null;
-            documentSnap.DrawLineNumber = this.drawLineNumber;
-            documentSnap.PerformLayout();
+            document.PerformLayout();
 
             return view;
         }
 
-        public bool drawLineNumber
-        {
-            get;
-            set;
-        }
-
-        public bool EnableHilight
-        {
-            get;
-            set;
-        }
     }
 
-    sealed class DocumentSource : IPrintDocumentPageSource, IPrintPreviewPageCollection, IPrintDocumentSource,IPrintPreviewSource
+    /// <summary>
+    /// 印刷用ソース
+    /// </summary>
+    public sealed class DocumentSource : IPrintDocumentPageSource, IPrintPreviewPageCollection, IPrintDocumentSource,IPrintPreviewSource
     {
         IPrintPreviewDxgiPackageTarget dxgiPreviewTarget;
         bool paginateCalled = false;
@@ -153,54 +127,137 @@ namespace FooEditEngine
         D2DPrintPreviewRender previewRender;
         PrintableView previewView;
         int maxPreviePageCount;
+        Document doc;
+        IHilighter hilighter;
 
         public ParseCommandHandler ParseHF;
         public string Header = string.Empty;
         public string Fotter = string.Empty;
 
-        public DocumentSource(FooTextBox textbox,Padding padding)
+        /// <summary>
+        /// コンストラクター
+        /// </summary>
+        /// <param name="textbox"></param>
+        /// <param name="padding"></param>
+        /// <param name="fontName"></param>
+        /// <param name="fontSize"></param>
+        public DocumentSource(Document doc,Padding padding, string fontName, double fontSize)
         {
-            this.factory = new PrintableViewFactory(textbox, padding);
+            this.factory = new PrintableViewFactory(padding, fontName, fontSize);
+            this.doc = new Document(doc);
+            this.hilighter = doc.LayoutLines.Hilighter;
         }
 
-        internal enum SyntaxHilightApplibility
+        public enum SyntaxHilightApplibility
         {
             Apply,
             NoApply,
         }
 
-        [DisplayPrintOptionResourceID("SyntaxHilight")]
-        internal SyntaxHilightApplibility EnableHilight
+        public Windows.UI.Color Forground
         {
             get
             {
-                return this.factory.EnableHilight ? SyntaxHilightApplibility.Apply : SyntaxHilightApplibility.NoApply;
+                return this.factory.foreground;
             }
             set
             {
-                this.factory.EnableHilight = value == SyntaxHilightApplibility.Apply;
+                this.factory.foreground = value;
             }
         }
 
-        internal enum LineNumberVisiblity
+        public Windows.UI.Color Comment
         {
-            Visible,
-            Hidden
+            get
+            {
+                return this.factory.comment;
+            }
+            set
+            {
+                this.factory.comment = value;
+            }
         }
 
-        [DisplayPrintOptionResourceID("ShowLineNumber")]
-        internal LineNumberVisiblity ShowLineNumber
+        public Windows.UI.Color Keyword1
+        {
+            get
+            {
+                return this.factory.keyword1;
+            }
+            set
+            {
+                this.factory.keyword1 = value;
+            }
+        }
+
+        public Windows.UI.Color Keyword2
         {
             get
             {
-                return this.factory.drawLineNumber ? LineNumberVisiblity.Visible : LineNumberVisiblity.Hidden;
+                return this.factory.keyword2;
             }
             set
             {
-                this.factory.drawLineNumber = value == LineNumberVisiblity.Visible;
+                this.factory.keyword2 = value;
             }
         }
 
+        public Windows.UI.Color Literal
+        {
+            get
+            {
+                return this.factory.literal;
+            }
+            set
+            {
+                this.factory.literal = value;
+            }
+        }
+
+        public Windows.UI.Color Url
+        {
+            get
+            {
+                return this.factory.url;
+            }
+            set
+            {
+                this.factory.url = value;
+            }
+        }
+
+        public LineBreakMethod LineBreak
+        {
+            get;
+            set;
+        }
+
+        public int LineBreakCount
+        {
+            get;
+            set;
+        }
+
+        [DisplayPrintOptionResourceID("SyntaxHilight")]
+        public SyntaxHilightApplibility EnableHilight
+        {
+            get;
+            set;
+        }
+
+        public enum LineNumberVisiblity
+        {
+            Visible,
+            Hidden
+        }
+
+        [DisplayPrintOptionResourceID("ShowLineNumber")]
+        public LineNumberVisiblity ShowLineNumber
+        {
+            get;
+            set;
+        }
+
         public void GetPreviewPageCollection(IPrintDocumentPackageTarget docPackageTarget, out IPrintPreviewPageCollection docPageCollection)
         {
             Guid guid = new Guid(PreviewPackageIds.IID_PREVIEWPACKAGETARGET_DXGI);
@@ -216,7 +273,11 @@ namespace FooEditEngine
             PrintPageDescription pagedesc = options.GetPageDescription(1);
 
             D2DPrintRender render = this.factory.CreateRender(pagedesc, docPackageTarget);
-            PrintableView view = this.factory.CreateView(pagedesc, render, this.Header, this.Fotter);
+            this.doc.DrawLineNumber = this.ShowLineNumber == LineNumberVisiblity.Visible;
+            this.doc.LayoutLines.Hilighter = this.EnableHilight == SyntaxHilightApplibility.Apply ? this.hilighter : null;
+            PrintableView view = this.factory.CreateView(this.doc, pagedesc, render, this.Header, this.Fotter);
+            this.doc.LineBreak = this.LineBreak;
+            this.doc.LineBreakCharCount = this.LineBreakCount;
 
             bool result = false;
             int currentPage = 0;
@@ -245,8 +306,18 @@ namespace FooEditEngine
 
             this.imageRect = new Size(pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);
 
+            //何度か呼ばれることがある
+            if (this.previewView != null)
+                this.previewView.Dispose();
+            if (this.previewRender != null)
+                this.previewRender.Dispose();
+
             this.previewRender = this.factory.CreateRender(pagedesc);
-            this.previewView = this.factory.CreateView(pagedesc, this.previewRender, this.Header, this.Fotter);
+            this.doc.DrawLineNumber = this.ShowLineNumber == LineNumberVisiblity.Visible;
+            this.doc.LayoutLines.Hilighter = this.EnableHilight == SyntaxHilightApplibility.Apply ? this.hilighter : null;
+            this.previewView = this.factory.CreateView(this.doc, pagedesc, this.previewRender, this.Header, this.Fotter);
+            this.doc.LineBreak = this.LineBreak;
+            this.doc.LineBreakCharCount = this.LineBreakCount;
 
             int maxPage = 1;
             while (!this.previewView.TryPageDown())
@@ -297,6 +368,9 @@ namespace FooEditEngine
                 this.previewView.Dispose();
             if (this.previewRender != null)
                 this.previewRender.Dispose();
+            if (this.doc != null)
+                this.doc.Dispose();
+            Marshal.ReleaseComObject(this.dxgiPreviewTarget);
         }
     }
 }