OSDN Git Service

Documentのコンストラクターを変更した
[fooeditengine/FooEditEngine.git] / Metro / FooEditEngine / Print / DocumentSource.cs
index 5072ba9..df94768 100644 (file)
@@ -9,6 +9,7 @@
 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 Windows.Graphics.Display;\r
 using Windows.Graphics.Printing;\r
 using System.Runtime.InteropServices;\r
 using Windows.UI;\r
@@ -55,17 +56,20 @@ namespace FooEditEngine
     /// <returns>処理後の文字列</returns>\r
     public delegate string ParseCommandHandler(object sender, ParseCommandEventArgs e);\r
 \r
+\r
     sealed class PrintableViewFactory\r
     {\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
-        bool drawLineNumber, urlMark;\r
+        Document document;\r
+        bool urlMark;\r
         IHilighter hilighter;\r
-        public PrintableViewFactory(FooTextBox textbox)\r
+        float displayDpi;\r
+        Padding padding;\r
+        public PrintableViewFactory(FooTextBox textbox,Padding padding)\r
         {\r
             this.foreground = textbox.Foreground;\r
             this.comment = textbox.Comment;\r
@@ -76,42 +80,47 @@ namespace FooEditEngine
             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.urlMark = textbox.MarkURL;\r
             this.hilighter = textbox.Hilighter;\r
+            this.displayDpi = DisplayInformation.GetForCurrentView().LogicalDpi;\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 = this.foreground;\r
-            render.Comment = this.comment;\r
-            render.Keyword1 = this.keyword1;\r
-            render.Keyword2 = this.keyword2;\r
-            render.Literal = this.literal;\r
-            render.Url = this.url;\r
+            render.Foreground = D2DRenderBase.ToColor4(this.foreground);\r
+            render.Comment = D2DRenderBase.ToColor4(this.comment);\r
+            render.Keyword1 = D2DRenderBase.ToColor4(this.keyword1);\r
+            render.Keyword2 = D2DRenderBase.ToColor4(this.keyword2);\r
+            render.Literal = D2DRenderBase.ToColor4(this.literal);\r
+            render.Url = D2DRenderBase.ToColor4(this.url);\r
             return render;\r
         }\r
         public D2DPrintPreviewRender CreateRender(PrintPageDescription pagedesc)\r
         {\r
             D2DPrintPreviewRender render;\r
             Size size = new Size(pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);\r
-            render = new D2DPrintPreviewRender(this.fontName, this.fontSize, size);\r
-            render.Foreground = this.foreground;\r
-            render.Comment = this.comment;\r
-            render.Keyword1 = this.keyword1;\r
-            render.Keyword2 = this.keyword2;\r
-            render.Literal = this.literal;\r
-            render.Url = this.url;\r
+            render = new D2DPrintPreviewRender(this.fontName, this.fontSize, size, this.displayDpi);\r
+            render.Foreground = D2DRenderBase.ToColor4(this.foreground);\r
+            render.Comment = D2DRenderBase.ToColor4(this.comment);\r
+            render.Keyword1 = D2DRenderBase.ToColor4(this.keyword1);\r
+            render.Keyword2 = D2DRenderBase.ToColor4(this.keyword2);\r
+            render.Literal = D2DRenderBase.ToColor4(this.literal);\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);\r
+            Document documentSnap = new Document(this.document);\r
+            documentSnap.LayoutLines.Render = 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
@@ -120,14 +129,26 @@ namespace FooEditEngine
             view.Footer = footer;\r
             view.UrlMark = this.urlMark;\r
             view.PageBound = new Rectangle(pagedesc.ImageableRect.X, pagedesc.ImageableRect.Y, pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);\r
-            view.Hilighter = this.hilighter;\r
+            view.Hilighter = this.EnableHilight ? this.hilighter : null;\r
             view.PerfomLayouts();\r
 \r
             return view;\r
         }\r
+\r
+        public bool drawLineNumber\r
+        {\r
+            get;\r
+            set;\r
+        }\r
+\r
+        public bool EnableHilight\r
+        {\r
+            get;\r
+            set;\r
+        }\r
     }\r
 \r
-    sealed class DocumentSource : IPrintDocumentPageSource, IPrintPreviewPageCollection, IPrintDocumentSource\r
+    sealed class DocumentSource : IPrintDocumentPageSource, IPrintPreviewPageCollection, IPrintDocumentSource,IPrintPreviewSource\r
     {\r
         IPrintPreviewDxgiPackageTarget dxgiPreviewTarget;\r
         bool paginateCalled = false;\r
@@ -135,18 +156,56 @@ namespace FooEditEngine
         PrintableViewFactory factory;\r
         D2DPrintPreviewRender previewRender;\r
         PrintableView previewView;\r
+        int maxPreviePageCount;\r
 \r
         public ParseCommandHandler ParseHF;\r
         public string Header = string.Empty;\r
         public string Fotter = string.Empty;\r
 \r
-        public DocumentSource(FooTextBox textbox)\r
+        public DocumentSource(FooTextBox textbox,Padding padding)\r
         {\r
-            this.factory = new PrintableViewFactory(textbox);\r
-            this.ParseHF = (s, e) => { return e.Original; };\r
+            this.factory = new PrintableViewFactory(textbox, padding);\r
         }\r
 \r
-        public void GetPreviewPageCollection(IPrintDocumentPackageTarget docPackageTarget,out IPrintPreviewPageCollection docPageCollection)\r
+        internal enum SyntaxHilightApplibility\r
+        {\r
+            Apply,\r
+            NoApply,\r
+        }\r
+\r
+        [DisplayPrintOptionResourceID("SyntaxHilight")]\r
+        internal SyntaxHilightApplibility EnableHilight\r
+        {\r
+            get\r
+            {\r
+                return this.factory.EnableHilight ? SyntaxHilightApplibility.Apply : SyntaxHilightApplibility.NoApply;\r
+            }\r
+            set\r
+            {\r
+                this.factory.EnableHilight = value == SyntaxHilightApplibility.Apply;\r
+            }\r
+        }\r
+\r
+        internal enum LineNumberVisiblity\r
+        {\r
+            Visible,\r
+            Hidden\r
+        }\r
+\r
+        [DisplayPrintOptionResourceID("ShowLineNumber")]\r
+        internal LineNumberVisiblity ShowLineNumber\r
+        {\r
+            get\r
+            {\r
+                return this.factory.drawLineNumber ? LineNumberVisiblity.Visible : LineNumberVisiblity.Hidden;\r
+            }\r
+            set\r
+            {\r
+                this.factory.drawLineNumber = value == LineNumberVisiblity.Visible;\r
+            }\r
+        }\r
+\r
+        public void GetPreviewPageCollection(IPrintDocumentPackageTarget docPackageTarget, out IPrintPreviewPageCollection docPageCollection)\r
         {\r
             Guid guid = new Guid(PreviewPackageIds.IID_PREVIEWPACKAGETARGET_DXGI);\r
             IntPtr target;\r
@@ -160,7 +219,7 @@ namespace FooEditEngine
             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
@@ -169,11 +228,11 @@ namespace FooEditEngine
             while (!result)\r
             {\r
                 if(!string.IsNullOrEmpty(this.Header))\r
-                    view.Header = this.ParseHF(this, new ParseCommandEventArgs(currentPage, -1, this.Header));\r
+                    view.Header = this.ParseHF(this, new ParseCommandEventArgs(currentPage, this.maxPreviePageCount, this.Header));\r
                 if (!string.IsNullOrEmpty(this.Fotter))\r
-                    view.Footer = this.ParseHF(this, new ParseCommandEventArgs(currentPage, -1, this.Fotter));\r
+                    view.Footer = this.ParseHF(this, new ParseCommandEventArgs(currentPage, this.maxPreviePageCount, this.Fotter));\r
 \r
-                render.BeginDraw();\r
+                render.BegineDraw();\r
                 view.Draw(view.PageBound);\r
                 render.EndDraw();\r
                 result = view.TryPageDown();\r
@@ -202,9 +261,16 @@ namespace FooEditEngine
 \r
             this.dxgiPreviewTarget.InvalidatePreview();\r
 \r
+            this.maxPreviePageCount = maxPage;\r
+\r
             this.paginateCalled = true;\r
         }\r
 \r
+        public void InvalidatePreview()\r
+        {\r
+            this.dxgiPreviewTarget.InvalidatePreview();\r
+        }\r
+\r
         public void MakePage(uint desiredJobPage, float width, float height)\r
         {\r
             if (width <= 0 || height <= 0)\r
@@ -219,10 +285,15 @@ namespace FooEditEngine
             for (int i = 1; i < desiredJobPage; i++)\r
                 this.previewView.TryPageDown();\r
 \r
+            if (!string.IsNullOrEmpty(this.Header))\r
+                this.previewView.Header = this.ParseHF(this, new ParseCommandEventArgs((int)desiredJobPage, this.maxPreviePageCount, this.Header));\r
+            if (!string.IsNullOrEmpty(this.Fotter))\r
+                this.previewView.Footer = this.ParseHF(this, new ParseCommandEventArgs((int)desiredJobPage, this.maxPreviePageCount, this.Fotter));\r
+\r
             this.previewRender.Resize(width, height);\r
             this.previewRender.SetScale((float)(this.previewView.PageBound.Width / width)); //BeginDraw()で倍率が1に戻る\r
 \r
-            this.previewRender.BeginDraw();\r
+            this.previewRender.BegineDraw();\r
             this.previewView.Draw(this.previewView.PageBound);\r
             this.previewRender.EndDraw(this.dxgiPreviewTarget,desiredJobPage);\r
         }\r