OSDN Git Service

変更漏れがあったので修正した
[fooeditengine/FooEditEngine.git] / Windows / FooEditEngine / FooPrintText.cs
1 /*\r
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
5 \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
8 \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
10  */\r
11 using System;\r
12 using System.Drawing;\r
13 using System.Drawing.Printing;\r
14 \r
15 namespace FooEditEngine.Windows\r
16 {\r
17     /// <summary>\r
18     /// イベントデータ\r
19     /// </summary>\r
20     public class ParseCommandEventArgs\r
21     {\r
22         /// <summary>\r
23         /// ページ番号\r
24         /// </summary>\r
25         public int PageNumber;\r
26         /// <summary>\r
27         /// プリンターの設定\r
28         /// </summary>\r
29         public PrinterSettings PrinterSetting;\r
30         /// <summary>\r
31         /// 処理前の文字列\r
32         /// </summary>\r
33         public string Original;\r
34         /// <summary>\r
35         /// コンストラクター\r
36         /// </summary>\r
37         /// <param name="nowPage">印刷中のページ番号</param>\r
38         /// <param name="setting">プリンターの設定</param>\r
39         /// <param name="org">処理前の文字列</param>\r
40         public ParseCommandEventArgs(int nowPage,PrinterSettings setting,string org)\r
41         {\r
42             this.PageNumber = nowPage;\r
43             this.PrinterSetting = setting;\r
44             this.Original = org;\r
45         }\r
46     }\r
47 \r
48     /// <summary>\r
49     /// コマンド処理用デリゲート\r
50     /// </summary>\r
51     /// <param name="sender">送信元のクラス</param>\r
52     /// <param name="e">イベントデータ</param>\r
53     /// <returns>処理後の文字列</returns>\r
54     public delegate string ParseCommandHandler(object sender,ParseCommandEventArgs e);\r
55 \r
56     /// <summary>\r
57     /// 印刷用のクラス\r
58     /// </summary>\r
59     public class FooPrintText\r
60     {\r
61         PrintableView view;\r
62         PrintableTextRender render;\r
63         int PageNumber;\r
64 \r
65         /// <summary>\r
66         /// コンストラクター\r
67         /// </summary>\r
68         public FooPrintText()\r
69         {\r
70             this.PrintDocument = new PrintDocument();\r
71             this.PrintDocument.PrintPage += new PrintPageEventHandler(PrintDocument_PrintPage);\r
72             this.PrintDocument.EndPrint += new PrintEventHandler(PrintDocument_EndPrint);\r
73             this.ParseHF = new ParseCommandHandler((s, e) => { return e.Original; });\r
74         }\r
75 \r
76         /// <summary>\r
77         /// 対象となるドキュメント\r
78         /// </summary>\r
79         public Document Document\r
80         {\r
81             get;\r
82             set;\r
83         }\r
84 \r
85         /// <summary>\r
86         /// プリントドキュメント\r
87         /// </summary>\r
88         public PrintDocument PrintDocument\r
89         {\r
90             get;\r
91             private set;\r
92         }\r
93 \r
94         /// <summary>\r
95         /// 右から左に表示するなら真\r
96         /// </summary>\r
97         public bool RightToLeft\r
98         {\r
99             get;\r
100             set;\r
101         }\r
102 \r
103         /// <summary>\r
104         /// 行番号を表示するかどうか\r
105         /// </summary>\r
106         public bool DrawLineNumber\r
107         {\r
108             get;\r
109             set;\r
110         }\r
111 \r
112         /// <summary>\r
113         /// 印刷に使用するフォント\r
114         /// </summary>\r
115         public Font Font\r
116         {\r
117             get;\r
118             set;\r
119         }\r
120 \r
121         /// <summary>\r
122         /// 折り返しの方法を指定する\r
123         /// </summary>\r
124         public LineBreakMethod LineBreakMethod\r
125         {\r
126             get;\r
127             set;\r
128         }\r
129 \r
130         /// <summary>\r
131         /// 折り返した時の文字数を指定する\r
132         /// </summary>\r
133         public int LineBreakCharCount\r
134         {\r
135             get;\r
136             set;\r
137         }\r
138 \r
139         /// <summary>\r
140         /// ヘッダー\r
141         /// </summary>\r
142         public string Header\r
143         {\r
144             get;\r
145             set;\r
146         }\r
147 \r
148         /// <summary>\r
149         /// フッター\r
150         /// </summary>\r
151         public string Footer\r
152         {\r
153             get;\r
154             set;\r
155         }\r
156 \r
157         /// <summary>\r
158         /// 余白\r
159         /// </summary>\r
160         public Padding Padding\r
161         {\r
162             get;\r
163             set;\r
164         }\r
165 \r
166         /// <summary>\r
167         /// 前景色\r
168         /// </summary>\r
169         public System.Drawing.Color Foreground\r
170         {\r
171             get;\r
172             set;\r
173         }\r
174 \r
175         /// <summary>\r
176         /// ヘッダーやフッターを処理する\r
177         /// </summary>\r
178         public ParseCommandHandler ParseHF;\r
179 \r
180         void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)\r
181         {\r
182             if (this.Font == null || this.Document == null)\r
183                 throw new InvalidOperationException();\r
184 \r
185             if (view == null)\r
186             {\r
187                 this.render = new PrintableTextRender(this.Font, e.Graphics);\r
188                 this.render.Foreground = this.Foreground;\r
189                 this.render.RightToLeft = this.RightToLeft;\r
190                 this.view = new PrintableView(this.Document, this.render,this.Padding);\r
191                 this.view.DrawLineNumber = this.DrawLineNumber;\r
192                 this.view.TabStops = 4;\r
193                 this.view.PageBound = e.MarginBounds;\r
194                 this.view.LineBreak = this.LineBreakMethod;\r
195                 this.view.LineBreakCharCount = this.LineBreakCharCount;\r
196                 this.PageNumber = 1;\r
197                 this.view.PerfomLayouts();\r
198             }\r
199 \r
200             if (e.PageSettings.PrinterSettings.PrintRange == PrintRange.SomePages)\r
201             {\r
202                 for (; this.PageNumber < e.PageSettings.PrinterSettings.FromPage; this.PageNumber++)\r
203                 {\r
204                     if (this.view.TryPageDown())\r
205                         return;\r
206                 }\r
207             }\r
208 \r
209             this.view.Header = this.ParseHF(this, new ParseCommandEventArgs(this.PageNumber, e.PageSettings.PrinterSettings,this.Header));\r
210             this.view.Footer = this.ParseHF(this, new ParseCommandEventArgs(this.PageNumber, e.PageSettings.PrinterSettings, this.Footer));\r
211 \r
212             this.render.BeginDraw(e.Graphics);\r
213 \r
214             this.view.Draw(e.MarginBounds);\r
215 \r
216             e.HasMorePages = !this.view.TryPageDown();\r
217 \r
218             this.render.EndDraw();\r
219 \r
220             this.PageNumber++;\r
221 \r
222             if (e.HasMorePages && e.PageSettings.PrinterSettings.PrintRange == PrintRange.SomePages && this.PageNumber > e.PageSettings.PrinterSettings.ToPage)\r
223                 e.HasMorePages = false;\r
224         }\r
225 \r
226         void PrintDocument_EndPrint(object sender, PrintEventArgs e)\r
227         {\r
228             this.view.Dispose();\r
229             this.view = null;\r
230             this.render = null;\r
231         }\r
232 \r
233     }\r
234 }\r