1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package tsukuba_bunko.peko.session;
20
21 import java.awt.Color;
22 import java.awt.Component;
23 import java.awt.Dimension;
24 import java.awt.Font;
25 import java.awt.Graphics;
26 import java.awt.Graphics2D;
27 import java.awt.RenderingHints;
28
29 import java.awt.font.TextAttribute;
30 import java.awt.font.TextLayout;
31
32 import java.text.AttributedString;
33 import java.text.MessageFormat;
34 import java.text.SimpleDateFormat;
35
36 import java.util.Map;
37
38 import javax.swing.BorderFactory;
39 import javax.swing.JComponent;
40 import javax.swing.JList;
41 import javax.swing.ListCellRenderer;
42
43 import tsukuba_bunko.peko.Logger;
44
45 import tsukuba_bunko.peko.resource.ResourceManager;
46 import tsukuba_bunko.peko.resource.ColorManager;
47 import tsukuba_bunko.peko.resource.FontManager;
48
49
50 /***
51 * セーブデータ情報を描画する <code>ListCellRenderer</code> です。
52 * @author $Author: ppoi $
53 * @version $Revision: 1.2 $
54 */
55 public class SaveDataInfoRenderer extends JComponent implements ListCellRenderer {
56
57 /***
58 * serial version UID
59 */
60 private static final long serialVersionUID = 2614501005677152982L;
61
62 /***
63 * 描画するセーブデータ情報
64 */
65 private SaveDataInfo _info = null;
66
67 /***
68 * 選択されているかどうか
69 */
70 private boolean _selected = false;
71
72 /***
73 */
74 private int _index = -1;
75
76 /***
77 * 選択時の背景色
78 */
79 private Color _selectedBackground = null;
80
81 /***
82 * 非選択時の背景色
83 */
84 private Color _unselectedBackground = null;
85
86 /***
87 * タイトルフォント
88 */
89 private Font _titleFont = null;
90
91 /***
92 * タイトル前景色
93 */
94 private Color _titleColor = null;
95
96 /***
97 * タイムスタンプフォント
98 */
99 private Font _timestampFont = null;
100
101 /***
102 * タイムスタンプ前景色
103 */
104 private Color _timestampColor = null;
105
106 /***
107 * コメントフォント
108 */
109 private Font _commentFont = null;
110
111 /***
112 * コメント前景色
113 */
114 private Color _commentColor;
115
116
117 /***
118 * タイトルのフォーマット
119 */
120 private MessageFormat _titleFormat = null;
121
122 /***
123 * タイムスタンプのフォーマット
124 */
125 private SimpleDateFormat _timestampFormat = null;
126
127 /***
128 * 未登録セルのタイトル
129 */
130 private String _nodataTitle = null;
131
132
133 /***
134 * <code>SaveDataInfoRenderer</code> のインスタンスを生成します。
135 */
136 public SaveDataInfoRenderer()
137 {
138 ResourceManager resources = ResourceManager.getInstance();
139 ColorManager colors = ColorManager.getInstance();
140 FontManager fonts = FontManager.getInstance();
141
142 Dimension size = (Dimension)resources.getResource( ResourceIDs.CELL_SIZE );
143 if( size == null ) {
144 Logger.warn( MessageIDs.SAV0009W, new Object[]{"380,65"} );
145 size = new Dimension( 380, 65 );
146 }
147 setPreferredSize( size );
148 setSize( size );
149
150 _selectedBackground = (Color)resources.getResource( ResourceIDs.CELL_BACKGROUND_SELECTED );
151 if( _selectedBackground == null ) {
152 _selectedBackground = colors.getColor( "#FF88FF" );
153 Logger.warn( MessageIDs.SAV0024W, new Object[]{"cell.background.selected", "#FF88FF"} );
154 }
155
156 _unselectedBackground = (Color)resources.getResource( ResourceIDs.CELL_BACKGROUND_UNSELECTED );
157 if( _unselectedBackground == null ) {
158 _unselectedBackground = colors.getColor( "white" );
159 Logger.warn( MessageIDs.SAV0024W, new Object[]{"cell.background.unselected", "white"} );
160 }
161
162 _titleColor = (Color)resources.getResource( ResourceIDs.CELL_TITLE_COLOR );
163 if( _titleColor == null ) {
164 _titleColor = colors.getColor( "black" );
165 Logger.warn( MessageIDs.SAV0023W, new Object[]{"cell.title", "black", } );
166 }
167
168 _timestampColor = (Color)resources.getResource( ResourceIDs.CELL_TIMESTAMP_COLOR );
169 if( _timestampColor == null ) {
170 _timestampColor = colors.getColor( "black" );
171 Logger.warn( MessageIDs.SAV0023W, new Object[]{"cell.timestamp", "black"} );
172 }
173
174 _commentColor = (Color)resources.getResource( ResourceIDs.CELL_COMMENT_COLOR );
175 if( _commentColor == null ) {
176 _commentColor = colors.getColor( "black" );
177 Logger.warn( MessageIDs.SAV0023W, new Object[]{"cell.comment", "black"} );
178 }
179
180
181 _titleFont = (Font)resources.getResource( ResourceIDs.CELL_TITLE_FONT );
182 if( _titleFont == null ) {
183 Logger.warn( MessageIDs.SAV0010W, new Object[]{"cell.title", "family:SansSerif; size:16.0; style:normal; weight:bold"} );
184 Map attributes = new java.util.HashMap();
185 attributes.put( TextAttribute.FAMILY, "SansSerif" );
186 attributes.put( TextAttribute.SIZE, new Float(16f) );
187 attributes.put( TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR );
188 attributes.put( TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD );
189 _titleFont = fonts.getFont( attributes );
190 }
191
192 _timestampFont = (Font)resources.getResource( ResourceIDs.CELL_TIMESTAMP_FONT );
193 if( _timestampFont == null ) {
194 Logger.warn( MessageIDs.SAV0010W, new Object[]{"cell.timestamp", "family:SansSerif; size:11.0; style:normal; weight:normarl"} );
195 Map attributes = new java.util.HashMap();
196 attributes.put( TextAttribute.FAMILY, "SansSerif" );
197 attributes.put( TextAttribute.SIZE, new Float(11f) );
198 attributes.put( TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR );
199 attributes.put( TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD );
200 _timestampFont = fonts.getFont( attributes );
201 }
202
203 _commentFont = (Font)resources.getResource( ResourceIDs.CELL_COMMENT_FONT );
204 if( _timestampFont == null ) {
205 Logger.warn( MessageIDs.SAV0010W, new Object[]{"cell.comment", "family:SansSerif; size:16.0; style:normal; weight:normarl"} );
206 Map attributes = new java.util.HashMap();
207 attributes.put( TextAttribute.FAMILY, "SansSerif" );
208 attributes.put( TextAttribute.SIZE, new Float(11f) );
209 attributes.put( TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR );
210 attributes.put( TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD );
211 _commentFont = fonts.getFont( attributes );
212 }
213
214 _titleFormat = (MessageFormat)resources.getResource( ResourceIDs.CELL_TITLE_FORMAT );
215 if( _titleFormat == null ) {
216 _titleFormat = new MessageFormat( "No.{0} {1}" );
217 Logger.warn( MessageIDs.SAV0011W, new Object[]{"\"No.{0} {1}\""} );
218 }
219
220 String timestampFormat = (String)resources.getResource( ResourceIDs.CELL_TIMESTAMP_FORMAT );
221 if( timestampFormat == null ) {
222 timestampFormat = "yyyy/MM/dd hh:mm";
223 Logger.warn( MessageIDs.SAV0017W, new Object[]{"\"" + timestampFormat + "\""} );
224 }
225 _timestampFormat = new SimpleDateFormat( timestampFormat );
226
227 _nodataTitle = (String)resources.getResource( ResourceIDs.CELL_NO_DATA_TITLE );
228 if( _nodataTitle == null ) {
229 _nodataTitle = "-NO DATA-";
230 Logger.warn( MessageIDs.SAV0018W, new Object[]{"\"" + _nodataTitle + "\""} );
231 }
232 }
233
234
235
236
237
238 public void paintComponent( Graphics g )
239 {
240 Dimension size = getSize();
241 if( _selected ) {
242 g.setColor( _selectedBackground );
243 }
244 else {
245 g.setColor( _unselectedBackground );
246 }
247 g.fillRect( 0, 0, size.width, size.height );
248
249 g.setColor( Color.black );
250
251 Graphics2D g2 = (Graphics2D)g;
252 g2.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
253 float y = 3f;
254 AttributedString as = null;
255 TextLayout layout = null;
256
257 if( _info == null ) {
258 as = new AttributedString( _titleFormat.format(new Object[]{String.valueOf(_index + 1), _nodataTitle}) );
259 as.addAttribute( TextAttribute.FONT, _titleFont );
260 as.addAttribute( TextAttribute.FOREGROUND, _titleColor );
261
262 layout = new TextLayout( as.getIterator(), g2.getFontRenderContext() );
263 layout.draw( g2, 5, layout.getAscent() + y );
264 y += layout.getAscent() + layout.getDescent() + 5f;
265 }
266 else {
267 as = new AttributedString( _titleFormat.format(new Object[]{String.valueOf(_index + 1), _info.getTitle()}) );
268 as.addAttribute( TextAttribute.FONT, _titleFont );
269 as.addAttribute( TextAttribute.FOREGROUND, _titleColor );
270
271 layout = new TextLayout( as.getIterator(), g2.getFontRenderContext() );
272 layout.draw( g2, 5, layout.getAscent() + y );
273 y += layout.getAscent() + layout.getDescent() + 5f;
274
275 as = new AttributedString( _timestampFormat.format(_info.getTimestamp()) );
276 as.addAttribute( TextAttribute.FONT, _timestampFont );
277 as.addAttribute( TextAttribute.FOREGROUND, _timestampColor );
278
279 layout = new TextLayout( as.getIterator(), g2.getFontRenderContext() );
280 layout.draw( g2, 5, layout.getAscent() + y );
281 y += layout.getAscent() + layout.getDescent() + 5f;
282
283 if( _info.getComment() != null ) {
284 as = new AttributedString( _info.getComment() );
285 as.addAttribute( TextAttribute.FONT, _commentFont );
286 as.addAttribute( TextAttribute.FOREGROUND, _commentColor );
287
288 layout = new TextLayout( as.getIterator(), g2.getFontRenderContext() );
289 layout.draw( g2, 5, layout.getAscent() + y );
290 }
291 }
292 }
293
294
295
296
297
298 public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasForcus )
299 {
300 _info = (SaveDataInfo)value;
301 _selected = isSelected;
302 _index = index;
303 setBorder( BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.LOWERED) );
304 return this;
305 }
306 }