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.Dimension;
22 import java.awt.FlowLayout;
23 import java.awt.Rectangle;
24
25 import java.awt.event.ActionEvent;
26 import java.awt.event.ActionListener;
27
28 import javax.swing.JButton;
29 import javax.swing.JDialog;
30 import javax.swing.JList;
31 import javax.swing.JOptionPane;
32 import javax.swing.JPanel;
33 import javax.swing.JScrollPane;
34 import javax.swing.ListSelectionModel;
35
36 import javax.swing.event.ListSelectionEvent;
37 import javax.swing.event.ListSelectionListener;
38
39 import tsukuba_bunko.peko.Logger;
40 import tsukuba_bunko.peko.PekoSystem;
41
42 import tsukuba_bunko.peko.resource.ResourceManager;
43
44
45 /***
46 * セーブデータ選択ダイアログです。
47 * @author $Author: ppoi $
48 * @version $Revision: 1.2 $
49 */
50 public class SaveDataDialog extends JDialog implements ActionListener, ListSelectionListener {
51
52 /***
53 * serial version UID
54 */
55 private static final long serialVersionUID = 1778414332192365566L;
56
57 /***
58 * ダイアログの用途:セーブ用
59 */
60 public static final boolean FOR_SAVE = true;
61
62 /***
63 * ダイアログの用途:ロード用
64 */
65 public static final boolean FOR_LOAD = false;
66
67
68
69 /***
70 * 選択された番号
71 */
72 protected int _selected = -1;
73
74 /***
75 * 表示されるセーブデータ一覧
76 */
77 protected SaveDataInfo[] _infoList = null;
78
79
80 /***
81 * セーブデータ一覧
82 */
83 protected JList _list = null;
84
85 /***
86 * OK ボタン
87 */
88 protected JButton _ok = null;
89
90 /***
91 * Cancel ボタン
92 */
93 protected JButton _cancel = null;
94
95 /***
96 * ダイアログの用途
97 */
98 protected boolean _forSave = false;
99
100 /***
101 * セーブデータ情報を描画する ListCellRenderer
102 */
103 protected SaveDataInfoRenderer _renderer = null;
104
105
106 /***
107 * <code>SaveDataDialig</code> のインスタンスを生成します。
108 * @param forSave ダイアログの用途
109 */
110 public SaveDataDialog( boolean forSave )
111 {
112 super( PekoSystem.getInstance().getMainWindow(), true );
113 _forSave = forSave;
114
115 ResourceManager resources = ResourceManager.getInstance();
116 Boolean decorated = (Boolean)resources.getResource( ResourceIDs.DIALOG_DECORATED, true );
117 if( decorated != null ) {
118 setUndecorated( !decorated.booleanValue() );
119 }
120
121 if( forSave ) {
122 String title = (String)resources.getResource( ResourceIDs.DIALOG_TITLE_SAVE );
123 if( title == null ) {
124 Logger.warn( MessageIDs.SAV0012W );
125 }
126 else {
127 setTitle( title );
128 }
129 }
130 else {
131 String title = (String)resources.getResource( ResourceIDs.DIALOG_TITLE_LOAD );
132 if( title == null ) {
133 Logger.warn( MessageIDs.SAV0012W );
134 }
135 else {
136 setTitle( title );
137 }
138 }
139
140 _renderer = new SaveDataInfoRenderer();
141 }
142
143
144 /***
145 * <code>SaveDataDialog</code> の初期化を行います。
146 * @param infoList 表示するセーブデータ一覧
147 */
148 protected void initialize( SaveDataInfo[] infoList, int initialIndex )
149 {
150 ResourceManager resources = ResourceManager.getInstance();
151
152 JList list = new JList( infoList );
153 list.setAutoscrolls( true );
154 list.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
155 list.setCellRenderer( _renderer );
156 list.addListSelectionListener( this );
157
158 JScrollPane container = new JScrollPane( list );
159 container.setAutoscrolls( true );
160
161 Integer atonce = (Integer)resources.getResource( ResourceIDs.ITEMS_AT_ONCE );
162 if( atonce == null ) {
163 atonce = new Integer( 5 );
164 Logger.warn( MessageIDs.SAV0013W, new Object[]{"5"} );
165 }
166 else if( atonce.intValue() <= 0 ) {
167 atonce = new Integer( 5 );
168 Logger.warn( MessageIDs.SAV0014W, new Object[]{"5"} );
169 }
170 Dimension size = container.getPreferredSize();
171 Dimension cellSize = _renderer.getPreferredSize();
172 size.height = cellSize.height * atonce.intValue() + 5;
173 container.setPreferredSize( size );
174 container.setSize( size );
175
176 Rectangle visibleRect = new Rectangle( 5, (cellSize.height * (initialIndex - 1)), cellSize.width, cellSize.height );
177 container.getViewport().scrollRectToVisible( visibleRect );
178
179 JPanel buttons = new JPanel( new FlowLayout() );
180 JButton ok = new JButton();
181 String caption = (String)resources.getResource( ResourceIDs.BUTTON_OK );
182 if( caption == null ) {
183 caption = "OK";
184 Logger.warn( MessageIDs.SAV0019W, new Object[]{"OK", caption} );
185 }
186 ok.setText( caption );
187 ok.addActionListener( this );
188 JButton cancel = new JButton();
189 caption = (String)resources.getResource( ResourceIDs.BUTTON_CANCEL );
190 if( caption == null ) {
191 caption = "CANCEL";
192 Logger.warn( MessageIDs.SAV0019W, new Object[]{"Cancel", caption} );
193 }
194 cancel.setText( caption );
195 cancel.addActionListener( this );
196 buttons.add( ok );
197
198 buttons.add( cancel );
199
200 JPanel cp = new JPanel( new java.awt.BorderLayout() );
201 cp.add( container );
202 cp.add( buttons, java.awt.BorderLayout.SOUTH );
203 setContentPane( cp );
204
205 pack();
206 setResizable( false );
207
208 _list = list;
209 _ok = ok;
210 _cancel = cancel;
211 getRootPane().setDefaultButton( _ok );
212
213 _infoList = infoList;
214 list.setSelectedIndex( initialIndex );
215 }
216
217
218 /***
219 * 現在選択されているセーブデータのインデックスを取得します。
220 * @return 選択されているセーブデータのインデックス
221 */
222 public int getSelectedIndex()
223 {
224 return _selected;
225 }
226
227
228
229
230
231 public void actionPerformed( ActionEvent ev )
232 {
233 if( ev.getSource() == _ok ) {
234 if( _list.getSelectedValue() == null ) {
235 if( _forSave ) {
236 _selected = _list.getSelectedIndex();
237 }
238 else {
239 return;
240 }
241 }
242 else {
243 if( _forSave ) {
244 ResourceManager resources = ResourceManager.getInstance();
245 String title = (String)resources.getResource( ResourceIDs.DIALOG_CONFIRM_TITLE );
246 if( title == null ) {
247 Logger.warn( MessageIDs.SAV0015W );
248 }
249 String message = (String)resources.getResource( ResourceIDs.DIALOG_CONFIRM_MESSAGE );
250 if( message == null ) {
251 message = "Do you overwrite save data ?";
252 Logger.warn( MessageIDs.SAV0016W, new Object[]{"\"" + message + "\""} );
253 }
254
255 if( JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION) ) {
256 _selected = _list.getSelectedIndex();
257 }
258 else {
259 return;
260 }
261 }
262 else {
263 _selected = _list.getSelectedIndex();
264 }
265 }
266 }
267 else {
268 _selected = -1;
269 }
270
271 dispose();
272 }
273
274
275
276
277
278 public void valueChanged( ListSelectionEvent ev )
279 {
280 if( _forSave ) {
281 return;
282 }
283
284 int selected = _list.getSelectedIndex();
285 if( (selected != -1) && (_infoList[selected] != null) ) {
286 _ok.setEnabled( true );
287 }
288 else {
289 _ok.setEnabled( false );
290 }
291 }
292
293
294
295
296
297
298
299 /***
300 * セーブデータ選択ダイアログを表示し、選択されたセーブデータのインデックスを取得します。
301 * @param list 表示するセーブデータ一覧
302 * @return 選択されたセーブデータのインデックス
303 */
304 public static int showDialog( SaveDataInfo[] list, int initialIndex, boolean forSave )
305 {
306 SaveDataDialog dialog = new SaveDataDialog( forSave );
307 dialog.initialize( list, initialIndex );
308 dialog.setLocationRelativeTo( dialog.getOwner() );
309 dialog.setVisible( true );
310 return dialog.getSelectedIndex();
311 }
312 }