1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package tsukuba_bunko.peko.canvas.text;
20
21 import java.awt.Dimension;
22 import java.awt.Graphics;
23 import java.awt.Graphics2D;
24
25 import java.awt.font.TextLayout;
26
27 import javax.swing.JComponent;
28
29 import tsukuba_bunko.peko.Logger;
30
31
32 /***
33 * テキストの末尾に表示する待ちマーカーです。
34 * @author $Author: ppoi $
35 * @version $Revision: 1.2 $
36 */
37 public class Marker extends JComponent implements Runnable {
38
39 /***
40 * serial version UID
41 */
42 private static final long serialVersionUID = -3817987151858534019L;
43
44 /***
45 * マーカー文字
46 */
47 private Line _text = null;
48
49 /***
50 * 点滅フラグ
51 */
52 private boolean _light = false;
53
54 /***
55 * 点滅スレッド
56 */
57 private Thread _blinker = null;
58
59 /***
60 * 点滅状態
61 */
62 private boolean _blinking = false;
63
64
65 /***
66 * <code>Marker</code> のインスタンスを作成します。
67 */
68 public Marker()
69 {
70 super();
71 }
72
73
74 /***
75 * マーカー文字を設定します。
76 * @param text マーカー文字
77 */
78 public void setText( Line text )
79 {
80 _text = text;
81 int height = (int)(text.getAscent() + text.getDescent());
82 int width = (int)text.getTextLayout().getAdvance();
83 Dimension size = new Dimension( width, height );
84 setPreferredSize( size );
85 setSize( size );
86 }
87
88 /***
89 * マーカー文字を設定します。
90 * @param text マーカー文字
91 * @param page ページ
92 */
93 public void setText( String text, Page page )
94 {
95 setForeground( page.getForeground() );
96 TextLayout layout = new TextLayout( text, page.getDefaultFont(), page.getFontRenderContext() );
97 Line line = new Line();
98 line.setLineSpan( 0f );
99 line.setTextLayout( layout );
100 line.setForeground( page.getForeground() );
101 line.setShadowColor( page.getShadow() );
102 setText( line );
103 }
104
105 /***
106 * マーカー文字を取得します。
107 * @return マーカー文字
108 */
109 public Line getText()
110 {
111 return _text;
112 }
113
114 /***
115 * 点滅を開始します。
116 */
117 public void start()
118 {
119 if( _blinker == null ) {
120 synchronized( this ) {
121 if( _blinker == null ) {
122 _blinker = new Thread( this );
123 _blinking = true;
124 _blinker.start();
125 }
126 }
127 }
128 }
129
130 /***
131 * 点滅を終了します。
132 */
133 public void stop()
134 {
135 synchronized( this ) {
136 _blinking = false;
137 notify();
138 }
139 }
140
141 /***
142 * マーカーの左下隅の位置を設定します。
143 * @param x X 座標値
144 * @param y Y 座標値
145 */
146 public void setPosition( int x, int y )
147 {
148 if( _text != null ) {
149 setLocation( x, (y - (int)(_text.getAscent() + _text.getDescent())) );
150 }
151 else {
152 setLocation( x, y );
153 }
154 }
155
156
157
158
159
160 public void run()
161 {
162 Logger.debug( "[canvas.text] blinking start." );
163 while( _blinking ) {
164 synchronized( this ) {
165 try {
166 wait( 520 );
167 }
168 catch( InterruptedException ie ) {
169 }
170 }
171 _light = !_light;
172 if( isVisible() ) {
173 repaint();
174 }
175 }
176 Logger.debug( "[canvas.text] blinking stop." );
177 }
178
179
180
181
182
183 protected void paintComponent( Graphics g )
184 {
185 if( !_light || (_text == null) || !isVisible() ) {
186 return;
187 }
188
189 _text.draw( (Graphics2D)g, 0, _text.getAscent() );
190 }
191 }