%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
tsukuba_bunko.peko.canvas.text.Page |
|
|
1 | /* |
|
2 | * All Rights Reserved. |
|
3 | * Copyright (C) 1999-2005 Tsukuba Bunko. |
|
4 | * |
|
5 | * Licensed under the BSD License ("the License"); you may not use |
|
6 | * this file except in compliance with the License. |
|
7 | * You may obtain a copy of the License at |
|
8 | * |
|
9 | * http://www.tsukuba-bunko.org/licenses/LICENSE.txt |
|
10 | * |
|
11 | * Unless required by applicable law or agreed to in writing, software |
|
12 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
14 | * See the License for the specific language governing permissions and |
|
15 | * limitations under the License. |
|
16 | * |
|
17 | * $Id: Page.java,v 1.5 2005/08/06 18:58:03 ppoi Exp $ |
|
18 | */ |
|
19 | package tsukuba_bunko.peko.canvas.text; |
|
20 | ||
21 | import java.awt.Color; |
|
22 | import java.awt.Dimension; |
|
23 | import java.awt.Font; |
|
24 | import java.awt.Insets; |
|
25 | import java.awt.Point; |
|
26 | ||
27 | import java.awt.font.FontRenderContext; |
|
28 | ||
29 | import java.io.Serializable; |
|
30 | ||
31 | import java.util.List; |
|
32 | ||
33 | import tsukuba_bunko.peko.Logger; |
|
34 | import tsukuba_bunko.peko.PekoSystem; |
|
35 | ||
36 | ||
37 | /** |
|
38 | * 一度にキャンバスに表示する行のリスト(= ページ)です。 |
|
39 | * @author $Author: ppoi $ |
|
40 | * @version $Revision: 1.5 $ |
|
41 | */ |
|
42 | public class Page implements Cloneable, Serializable { |
|
43 | ||
44 | /** |
|
45 | * serial version UID |
|
46 | */ |
|
47 | private static final long serialVersionUID = 2116822706503877518L; |
|
48 | ||
49 | ||
50 | /** |
|
51 | * このページを描画するテキストキャンバス |
|
52 | */ |
|
53 | 0 | transient private TextCanvas _canvas = null; |
54 | ||
55 | ||
56 | /** |
|
57 | * committed lines |
|
58 | */ |
|
59 | 0 | private List _committedLines = null; |
60 | ||
61 | /** |
|
62 | * コミットされた分のページの高さ |
|
63 | */ |
|
64 | 0 | private float _commitedPageHeight = 0f; |
65 | ||
66 | ||
67 | /** |
|
68 | * lines |
|
69 | */ |
|
70 | 0 | transient private List _lines = null; |
71 | ||
72 | /** |
|
73 | * 現在のページの高さ |
|
74 | */ |
|
75 | 0 | transient private float _pageHeight = 0f; |
76 | ||
77 | ||
78 | /** |
|
79 | * デフォルトフォント |
|
80 | */ |
|
81 | 0 | transient private Font _defaultFont = null; |
82 | ||
83 | /** |
|
84 | * サイズ |
|
85 | */ |
|
86 | 0 | private Dimension _size = new Dimension(); |
87 | ||
88 | /** |
|
89 | * 位置 |
|
90 | */ |
|
91 | 0 | private Point _location = new Point( 0, 0 ); |
92 | ||
93 | /** |
|
94 | * パディング |
|
95 | */ |
|
96 | 0 | private Insets _padding = new Insets( 10, 10, 10, 10 ); |
97 | ||
98 | /** |
|
99 | * 前景色 |
|
100 | */ |
|
101 | 0 | private Color _foreground = Color.white; |
102 | ||
103 | /** |
|
104 | * 影色 |
|
105 | */ |
|
106 | 0 | private Color _shadow = Color.black; |
107 | ||
108 | /** |
|
109 | * 背景色 |
|
110 | */ |
|
111 | 0 | private Color _background = Color.black; |
112 | ||
113 | /** |
|
114 | * 背景の透明度 |
|
115 | */ |
|
116 | 0 | private float _transparency = 0.5f; |
117 | ||
118 | ||
119 | /** |
|
120 | * <code>Page</code> のインスタンスを作成します。 |
|
121 | */ |
|
122 | public Page() |
|
123 | { |
|
124 | 0 | super(); |
125 | 0 | } |
126 | ||
127 | ||
128 | /** |
|
129 | * このページを描画するテキストキャンバスを設定します。 |
|
130 | * @param canvas テキストキャンバス |
|
131 | */ |
|
132 | void setTextCanvas( TextCanvas canvas ) |
|
133 | { |
|
134 | 0 | _canvas = canvas; |
135 | 0 | } |
136 | ||
137 | /** |
|
138 | * このページを描画するテキストキャンバスを取得します。 |
|
139 | * @return canvas |
|
140 | */ |
|
141 | public TextCanvas getTextCanvas() |
|
142 | { |
|
143 | 0 | return _canvas; |
144 | } |
|
145 | ||
146 | ||
147 | /** |
|
148 | * デフォルトフォントを設定します。 |
|
149 | * @param font デフォルトフォント |
|
150 | */ |
|
151 | public void setDefaultFont( Font font ) |
|
152 | { |
|
153 | 0 | _defaultFont = font; |
154 | 0 | } |
155 | ||
156 | /** |
|
157 | * デフォルトフォントを取得します。 |
|
158 | * @return デフォルトフォント |
|
159 | */ |
|
160 | public Font getDefaultFont() |
|
161 | { |
|
162 | 0 | return _defaultFont; |
163 | } |
|
164 | ||
165 | /** |
|
166 | * このページでテキストを描画する際に使用する FontRenderContext を取得します。 |
|
167 | * @return 描画に使用する FontRenderContext インスタンス |
|
168 | */ |
|
169 | public FontRenderContext getFontRenderContext() |
|
170 | { |
|
171 | 0 | if( _canvas == null ) { |
172 | 0 | return null; |
173 | } |
|
174 | else { |
|
175 | 0 | return _canvas.getFontRenderContext(); |
176 | } |
|
177 | } |
|
178 | ||
179 | /** |
|
180 | * 表示領域のサイズを設定します。 |
|
181 | * @param size サイズ |
|
182 | */ |
|
183 | public void setSize( Dimension size ) |
|
184 | { |
|
185 | 0 | _size.setSize( size ); |
186 | 0 | } |
187 | ||
188 | /** |
|
189 | * 表示領域のサイズを取得します。 |
|
190 | * @return 表示領域のサイズを格納した Dimension インスタンス |
|
191 | */ |
|
192 | public Dimension getSize() |
|
193 | { |
|
194 | 0 | return getSize( new Dimension() ); |
195 | } |
|
196 | ||
197 | /** |
|
198 | * 表示領域のサイズを取得し、<code>d</code> に格納します。 |
|
199 | * @param d 表示領域のサイズを格納する Dimension インスタンス |
|
200 | * @return <code>d</code>。<code>d == null</code> の場合は新規に生成された Dimension インスタンス |
|
201 | */ |
|
202 | public Dimension getSize( Dimension d ) |
|
203 | { |
|
204 | 0 | if( d == null ) { |
205 | 0 | d = new Dimension(); |
206 | } |
|
207 | 0 | d.setSize( _size ); |
208 | 0 | return d; |
209 | } |
|
210 | ||
211 | /** |
|
212 | * 表示領域の位置を設定します。 |
|
213 | * @param x 表示領域の左上隅 x 座標 |
|
214 | * @param y 表示領域の左上隅 y 座標 |
|
215 | */ |
|
216 | public void setLocation( int x, class="keyword">int y ) |
|
217 | { |
|
218 | 0 | _location.x = x; |
219 | 0 | _location.y = y; |
220 | 0 | } |
221 | ||
222 | /** |
|
223 | * マージン領域のサイズを取得します。 |
|
224 | * @return マージン領域のサイズを格納した Insets インスタンス |
|
225 | */ |
|
226 | public Point getMargin() |
|
227 | { |
|
228 | 0 | return getLocation( null ); |
229 | } |
|
230 | ||
231 | /** |
|
232 | * 表示領域の位置を取得し, <code>location</code> に格納します。 |
|
233 | * @param location 表示領域の位置を格納する Point インスタンス |
|
234 | * @return <code>location</code>。<code>location == null</code> の場合は新規に生成された Point インスタンス |
|
235 | */ |
|
236 | public Point getLocation( Point location ) |
|
237 | { |
|
238 | 0 | if( location == null ) { |
239 | 0 | location = (Point)_location.clone(); |
240 | 0 | } |
241 | else { |
|
242 | 0 | location.x = _location.x; |
243 | 0 | location.y = _location.y; |
244 | } |
|
245 | 0 | return location; |
246 | } |
|
247 | ||
248 | /** |
|
249 | * パディング領域のサイズを設定します。 |
|
250 | * @param top padding-top |
|
251 | * @param left padding-left |
|
252 | * @param bottom padding-bottom |
|
253 | * @param right padding-right |
|
254 | */ |
|
255 | public void setPadding( int top, class="keyword">int left, class="keyword">int bottom, class="keyword">int right ) |
|
256 | { |
|
257 | 0 | _padding.top = top; |
258 | 0 | _padding.left = left; |
259 | 0 | _padding.bottom = bottom; |
260 | 0 | _padding.right = right; |
261 | 0 | } |
262 | ||
263 | /** |
|
264 | * パディング領域のサイズを取得します。 |
|
265 | * @return パディング領域のサイズを格納した Insets インスタンス |
|
266 | */ |
|
267 | public Insets getPadding() |
|
268 | { |
|
269 | 0 | return getPadding( null ); |
270 | } |
|
271 | ||
272 | /** |
|
273 | * パディング領域のサイズを取得し、<code>padding</code> に格納して返します。 |
|
274 | * @param padding パディング領域のサイズを格納する Insets インスタンス |
|
275 | * @return <code>padding</code>。<code>padding == null</code> の場合は、新規に生成された Insets インスタンス |
|
276 | */ |
|
277 | public Insets getPadding( Insets padding ) |
|
278 | { |
|
279 | 0 | if( padding == null ) { |
280 | 0 | padding = (Insets)_padding.clone(); |
281 | 0 | } |
282 | else { |
|
283 | 0 | padding.top = _padding.top; |
284 | 0 | padding.left = _padding.left; |
285 | 0 | padding.bottom = _padding.bottom; |
286 | 0 | padding.right = _padding.right; |
287 | } |
|
288 | 0 | return padding; |
289 | } |
|
290 | ||
291 | /** |
|
292 | * 前景色を設定します。 |
|
293 | * @param foreground 前景色 |
|
294 | */ |
|
295 | public void setForeground( Color foreground ) |
|
296 | { |
|
297 | 0 | _foreground = foreground; |
298 | 0 | } |
299 | ||
300 | /** |
|
301 | * 前景色を取得します。 |
|
302 | * @return 前景色 |
|
303 | */ |
|
304 | public Color getForeground() |
|
305 | { |
|
306 | 0 | return _foreground; |
307 | } |
|
308 | ||
309 | /** |
|
310 | * 影色を設定します。 |
|
311 | * @param shadow 影色 |
|
312 | */ |
|
313 | public void setShadow( Color shadow ) |
|
314 | { |
|
315 | 0 | _shadow = shadow; |
316 | 0 | } |
317 | ||
318 | /** |
|
319 | * 影色を取得します。 |
|
320 | * @return 影色 |
|
321 | */ |
|
322 | public Color getShadow() |
|
323 | { |
|
324 | 0 | return _shadow; |
325 | } |
|
326 | ||
327 | /** |
|
328 | * 背景色を設定します。 |
|
329 | * @param background 背景色 |
|
330 | */ |
|
331 | public void setBackground( Color background ) |
|
332 | { |
|
333 | 0 | _background = background; |
334 | 0 | } |
335 | ||
336 | /** |
|
337 | * 背景色を取得します。 |
|
338 | * @return 背景色 |
|
339 | */ |
|
340 | public Color getBackground() |
|
341 | { |
|
342 | 0 | return _background; |
343 | } |
|
344 | ||
345 | /** |
|
346 | * 背景色の透明度を設定します. |
|
347 | * @param trans 透明度 |
|
348 | */ |
|
349 | public void setTransparency( float trans ) |
|
350 | { |
|
351 | 0 | _transparency = trans; |
352 | 0 | } |
353 | ||
354 | /** |
|
355 | * 背景色の透明度を取得します。 |
|
356 | * @return 透明度 |
|
357 | */ |
|
358 | public float getTransparency() |
|
359 | { |
|
360 | 0 | return _transparency; |
361 | } |
|
362 | ||
363 | ||
364 | /** |
|
365 | * このページで表示可能な行幅の最大値を取得します。 |
|
366 | * @return 最大行幅 |
|
367 | */ |
|
368 | public float getMaxLineWidth() |
|
369 | { |
|
370 | 0 | int width = _size.width; |
371 | 0 | width -= _padding.left; |
372 | 0 | width -= _padding.right; |
373 | ||
374 | 0 | return (float)width; |
375 | } |
|
376 | ||
377 | /** |
|
378 | * 行を末尾に追加します。 |
|
379 | * @param line 追加する行 |
|
380 | */ |
|
381 | public synchronized void addLine( Line line ) |
|
382 | { |
|
383 | 0 | if( _lines == null ) { |
384 | 0 | _lines = new java.util.ArrayList(); |
385 | } |
|
386 | 0 | _lines.add( line ); |
387 | 0 | _pageHeight += line.getAscent(); |
388 | 0 | _pageHeight += line.getDescent(); |
389 | 0 | } |
390 | ||
391 | /** |
|
392 | * 現在ページに含まれる行数を取得します。 |
|
393 | * @return 行数 |
|
394 | */ |
|
395 | public int getLineCount() |
|
396 | { |
|
397 | 0 | if( _lines != null ) { |
398 | 0 | return _lines.size(); |
399 | } |
|
400 | else { |
|
401 | 0 | return 0; |
402 | } |
|
403 | } |
|
404 | ||
405 | /** |
|
406 | * <code>index</code> で指定された行を <code>line</code> で置き換えます。 |
|
407 | * @param index 置換する行のインデックス |
|
408 | * @param line 新しい行 |
|
409 | */ |
|
410 | public synchronized void setLine( int index, Line line ) |
|
411 | { |
|
412 | try { |
|
413 | 0 | if( (_lines == null) || (index < 0) || (index >= _lines.size()) ) { |
414 | 0 | Logger.debug( "[canvas.text] invalid length! index:" + index + " size:" + ((_lines != null)?_lines.size():0) ); |
415 | } |
|
416 | ||
417 | 0 | synchronized( this ) { |
418 | 0 | Line old = (Line)_lines.get( index ); |
419 | 0 | _pageHeight -= (old.getAscent() + old.getDescent()); |
420 | 0 | _lines.set( index, line ); |
421 | 0 | _pageHeight += (line.getAscent() + line.getDescent()); |
422 | 0 | } |
423 | } |
|
424 | 0 | catch( IndexOutOfBoundsException ioobe ) { |
425 | 0 | Logger.error( "[canvas] invalid line number.", ioobe ); |
426 | 0 | throw ioobe; |
427 | 0 | } |
428 | 0 | } |
429 | ||
430 | /** |
|
431 | * <code>index</code> で指定された行をページから削除します。<code>index</code> |
|
432 | * より後ろの行は一行ずつ上に詰められます。 |
|
433 | * @param index 削除する行のインデックス |
|
434 | * @throws IndexOutOfBoundsException <code>index</code> が範囲外の場合 |
|
435 | */ |
|
436 | public void removeLine( int index ) |
|
437 | { |
|
438 | try { |
|
439 | 0 | if( _lines == null ) { |
440 | 0 | throw new IndexOutOfBoundsException( "there is still no line." ); |
441 | } |
|
442 | ||
443 | 0 | synchronized( this ) { |
444 | 0 | Line line = (Line)_lines.remove( index ); |
445 | 0 | _pageHeight -= (line.getAscent() + line.getDescent()); |
446 | 0 | } |
447 | } |
|
448 | 0 | catch( IndexOutOfBoundsException ioobe ) { |
449 | 0 | Logger.error( "[canvas] invalid line number.", ioobe ); |
450 | 0 | throw ioobe; |
451 | 0 | } |
452 | 0 | } |
453 | ||
454 | /** |
|
455 | * 行リストを取得します。 |
|
456 | */ |
|
457 | public List getLines() |
|
458 | { |
|
459 | 0 | if( _lines != null ) { |
460 | 0 | return (List)((java.util.ArrayList)_lines).clone(); |
461 | } |
|
462 | else { |
|
463 | 0 | return null; |
464 | } |
|
465 | } |
|
466 | ||
467 | /** |
|
468 | * すべての行をクリアします。 |
|
469 | */ |
|
470 | public void clearLines() |
|
471 | { |
|
472 | 0 | synchronized( this ) { |
473 | 0 | if( _lines != null ) { |
474 | 0 | _lines.clear(); |
475 | 0 | _pageHeight = 0f; |
476 | } |
|
477 | 0 | } |
478 | 0 | } |
479 | ||
480 | /** |
|
481 | * <code>line</code> をページに追加可能かどうかを判定します。 |
|
482 | * @param line 判定する行 |
|
483 | * @return 追加可能な場合 <code>true</code>、追加できな場合は <code>false</code> |
|
484 | */ |
|
485 | public boolean isAdaptive( Line line ) |
|
486 | { |
|
487 | 0 | if( line == null ) { |
488 | 0 | throw new NullPointerException( "てめぇ、なめてんじゃねぇぞぐらぁ!" ); |
489 | } |
|
490 | 0 | float pageHeight = _pageHeight + _padding.top + _padding.bottom; |
491 | 0 | return ((pageHeight + line.getAscent() + line.getDescent()) < (float)_size.height); |
492 | } |
|
493 | ||
494 | ||
495 | /** |
|
496 | * このページへの変更をキャンバスに反映させます。 |
|
497 | */ |
|
498 | public void updateCanvas() |
|
499 | { |
|
500 | 0 | if( _canvas != null ) { |
501 | 0 | _canvas.updateCanvas(); |
502 | } |
|
503 | 0 | } |
504 | ||
505 | /** |
|
506 | * このページの内容(テキスト)の変更をキャンバスに反映させます。 |
|
507 | */ |
|
508 | public void updateContents() |
|
509 | { |
|
510 | 0 | if( _canvas != null ) { |
511 | 0 | if( !_canvas.isVisible() ) { |
512 | //非表示だった場合は,300 msec wait する。 |
|
513 | 0 | PekoSystem.getInstance().getActionControler().stop( 300L ); |
514 | } |
|
515 | 0 | _canvas.updateText(); |
516 | } |
|
517 | 0 | } |
518 | ||
519 | /** |
|
520 | * 変更をコミットします。 |
|
521 | */ |
|
522 | public void commit() |
|
523 | { |
|
524 | 0 | Logger.debug( "[canvas.text] commit." ); |
525 | 0 | if( _lines != null ) { |
526 | 0 | if( _committedLines != null ) { |
527 | 0 | _committedLines.clear(); |
528 | 0 | _committedLines.addAll( _lines ); |
529 | 0 | } |
530 | else { |
|
531 | 0 | _committedLines = (List)((java.util.ArrayList)_lines).clone(); |
532 | } |
|
533 | 0 | Logger.debug( "[canvas.text] committed lines :" + _committedLines.size() ); |
534 | } |
|
535 | 0 | _commitedPageHeight = _pageHeight; |
536 | 0 | } |
537 | ||
538 | /** |
|
539 | * コミットされていない変更を破棄します。 |
|
540 | */ |
|
541 | public void rollback() |
|
542 | { |
|
543 | 0 | Logger.debug( "[canvas.text] rollback." ); |
544 | 0 | if( _lines != null ) { |
545 | 0 | _lines.clear(); |
546 | } |
|
547 | 0 | _lines = _committedLines; |
548 | 0 | _committedLines = null; |
549 | 0 | _pageHeight = _commitedPageHeight; |
550 | 0 | } |
551 | ||
552 | ||
553 | // |
|
554 | // Clonable の実装 |
|
555 | // |
|
556 | public Object clone() |
|
557 | { |
|
558 | 0 | return clone( new Page() ); |
559 | } |
|
560 | ||
561 | /** |
|
562 | * <code>page</code> をこのページのクローンとします。 |
|
563 | * @param copy このページのクローンにする Page インスタンス |
|
564 | * @return <code>copy</code> |
|
565 | */ |
|
566 | public Object clone( Page copy ) |
|
567 | { |
|
568 | 0 | synchronized( this ) { |
569 | 0 | if( _lines != null ) { |
570 | 0 | copy._lines = (List)((java.util.ArrayList)_lines).clone(); |
571 | } |
|
572 | 0 | } |
573 | 0 | copy._defaultFont = _defaultFont; |
574 | 0 | copy._size = (Dimension)_size.clone(); |
575 | 0 | copy._location = (Point)_location.clone(); |
576 | 0 | copy._padding = (Insets)_padding.clone(); |
577 | 0 | copy._foreground = _foreground; |
578 | 0 | copy._background = _background; |
579 | 0 | copy._transparency = _transparency; |
580 | ||
581 | 0 | return copy; |
582 | } |
|
583 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |