Coverage report

| %line | %branch
--- | --- | ---
tsukuba_bunko.peko.ActionControler |
0% |
0% |

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: ActionControler.java,v 1.6 2005/07/23 18:45:12 ppoi Exp $
18 |  |
      */
19 |  |
     package tsukuba_bunko.peko;
20 |  |
21 |  |
     import	java.awt.event.ActionListener;
22 |  |
     import	java.awt.event.MouseEvent;
23 |  |
     import	java.awt.event.MouseListener;
24 |  |
     import	java.awt.event.KeyEvent;
25 |  |
     import	java.awt.event.KeyListener;
26 |  |
27 |  |
     import	java.text.MessageFormat;
28 |  |
29 |  |
     import	java.util.Timer;
30 |  |
     import	java.util.TimerTask;
31 |  |
32 |  |
     import	javax.swing.ButtonGroup;
33 |  |
     import	javax.swing.ImageIcon;
34 |  |
     import	javax.swing.JButton;
35 |  |
     import	javax.swing.JCheckBoxMenuItem;
36 |  |
     import	javax.swing.JDialog;
37 |  |
     import	javax.swing.JFrame;
38 |  |
     import	javax.swing.JMenu;
39 |  |
     import	javax.swing.JMenuBar;
40 |  |
     import	javax.swing.JMenuItem;
41 |  |
     import	javax.swing.JOptionPane;
42 |  |
     import	javax.swing.JRadioButtonMenuItem;
43 |  |
     import	javax.swing.KeyStroke;
44 |  |
45 |  |
     import	tsukuba_bunko.util.GenericListener;
46 |  |
47 |  |
     import	tsukuba_bunko.peko.canvas.CanvasManager;
48 |  |
49 |  |
     import	tsukuba_bunko.peko.resource.ResourceManager;
50 |  |
51 |  |
52 |  |
     /**
53 |  |
      * プレイヤーの操作を受け付けるコントローラです。
54 |  |
      * @author	$Author: ppoi $
55 |  |
      * @version	$Revision: 1.6 $
56 |  |
      */
57 | 0 |
     public class ActionControler	implements KeyListener, MouseListener	{
58 |  |
59 |  |
     	/**
60 |  |
     	 * プレイヤーが操作するまで停止するストップモード(デフォルト)
61 |  |
     	 */
62 |  |
     	public static final long	SM_DEFAULT = -1;
63 |  |
64 |  |
     	/**
65 |  |
     	 * ノンストップモード
66 |  |
     	 */
67 |  |
     	public static final long	SM_NONSTOP = 0;
68 |  |
69 |  |
70 |  |
     	/**
71 |  |
     	 * 早送りプレイ(次の選択肢までスキップ)モード
72 |  |
     	 */
73 |  |
     	public static final int	PM_SKIP = 1;
74 |  |
75 |  |
     	/**
76 |  |
     	 * 通常プレイモード
77 |  |
     	 */
78 |  |
     	public static final int PM_NORMAL = 0;
79 |  |
80 |  |
     	/**
81 |  |
     	 * 自動送りプレイモード
82 |  |
     	 */
83 |  |
     	public static final int	PM_AUTOMATIC = 2;
84 |  |
85 |  |
86 |  |
     	/**
87 |  |
     	 */
88 | 0 |
     	private Object	_lock = this;
89 |  |
90 |  |
     	/**
91 |  |
     	 * 有効かどうか
92 |  |
     	 */
93 | 0 |
     	private boolean	_activity = false;
94 |  |
95 |  |
     	/**
96 |  |
     	 * プレイモード
97 |  |
     	 */
98 | 0 |
     	private int	_playMode = -1;
99 |  |
100 |  |
     	/**
101 |  |
     	 * プレイモード変更ボタン(メニュー)リスト
102 |  |
     	 */
103 | 0 |
     	private JMenuItem[]	_buttons = new JMenuItem[3];
104 |  |
105 |  |
     	/**
106 |  |
     	 * エフェクトを使用しないメニュー
107 |  |
     	 */
108 | 0 |
     	private JMenuItem	_usingEffectMenu = null;
109 |  |
110 |  |
     	/**
111 |  |
     	 * セーブメニュー
112 |  |
     	 */
113 | 0 |
     	private JMenuItem	_saveMenu = null;
114 |  |
115 |  |
     	/**
116 |  |
     	 * ロードメニュー
117 |  |
     	 */
118 | 0 |
     	private JMenuItem	_loadMenu = null;
119 |  |
120 |  |
     	/**
121 |  |
     	 * タイトルに戻るメニュー
122 |  |
     	 */
123 | 0 |
     	private JMenuItem	_returnTileMenu = null;
124 |  |
125 |  |
     	/**
126 |  |
     	 * 過去の文章メニュー
127 |  |
     	 */
128 | 0 |
     	private JMenuItem	_readAgainMenu = null;
129 |  |
130 |  |
     	/**
131 |  |
     	 * タイマー
132 |  |
     	 */
133 | 0 |
     	private Timer	_timer = new Timer( true );
134 |  |
135 |  |
     	/**
136 |  |
     	 * 最新のタスク
137 |  |
     	 */
138 | 0 |
     	private TimerTask	_lastTask = null;
139 |  |
140 |  |
141 |  |
     	/**
142 |  |
     	 * 読み返しコントローラ
143 |  |
     	 */
144 | 0 |
     	private TextHistoryControler	_readAgainControler = null;
145 |  |
146 |  |
     	/**
147 |  |
     	 * 最後に押されたキーのキーコード
148 |  |
     	 */
149 | 0 |
     	private int	_lastKeyCode = -1;
150 |  |
151 |  |
     	/**
152 |  |
     	 * active 待ちかどうか
153 |  |
     	 */
154 | 0 |
     	private boolean	_waitingActivate = false;
155 |  |
156 |  |
     	/**
157 |  |
     	 * テキストを隠しているかどうか
158 |  |
     	 */
159 | 0 |
     	private boolean	_hiddenText = false;
160 |  |
161 |  |
162 |  |
     	/**
163 |  |
     	 * <code>ActionControler</code> のインスタンスを作成します。
164 |  |
     	 */
165 |  |
     	public ActionControler()
166 |  |
     	{
167 | 0 |
     		super();
168 | 0 |
     		prepareMenuBar();
169 | 0 |
     		setPlayModeToNormal();
170 | 0 |
     	}
171 |  |
172 |  |
     	/**
173 |  |
     	 * ActionContorler を有効にするかどうかを設定します。
174 |  |
     	 * @param	activity	有効にする場合 <code>false</code>、それ以外 <code>false</code>。
175 |  |
     	 */
176 |  |
     	public void setActive( boolean activity )
177 |  |
     	{
178 | 0 |
     		_activity = activity;
179 | 0 |
     		if( !activity )	{
180 | 0 |
     			_lastKeyCode = -1;
181 | 0 |
     		}
182 | 0 |
     		else if( _playMode != ActionControler.PM_NORMAL )	{
183 | 0 |
     			if( _waitingActivate )	{
184 | 0 |
     				synchronized( _lock )	{
185 | 0 |
     					if( _waitingActivate )	{
186 | 0 |
     						_lock.notify();
187 |  |
     					}
188 | 0 |
     				}
189 |  |
     			}
190 |  |
     		}
191 | 0 |
     	}
192 |  |
193 |  |
     	/**
194 |  |
     	 * ActionControler が有効かどうかを判定します。
195 |  |
     	 * @return	有効な場合 <code>true</code>、それ以外 <code>false</code>。
196 |  |
     	 */
197 |  |
     	public boolean isActive()
198 |  |
     	{
199 | 0 |
     		return _activity && !PekoSystem.getInstance().getCanvasManager().isShowingSelect();
200 |  |
     	}
201 |  |
202 |  |
     	/**
203 |  |
     	 * セーブ機能の有効／無効を設定します。
204 |  |
     	 * @param	enabled	有効にする場合 <code>true</code>、それ以外の場合 <code>false</code>
205 |  |
     	 */
206 |  |
     	public synchronized void setSaveEnabled( boolean enabled )
207 |  |
     	{
208 | 0 |
     		_saveMenu.setEnabled( enabled );
209 | 0 |
     	}
210 |  |
211 |  |
     	/**
212 |  |
     	 * 現在のプレイモードを取得します。
213 |  |
     	 */
214 |  |
     	public int getPlayMode()
215 |  |
     	{
216 | 0 |
     		return _playMode;
217 |  |
     	}
218 |  |
219 |  |
     	/**
220 |  |
     	 * プレイモードを設定します。
221 |  |
     	 * @param	playMode	プレイモード。<code>PM_FORWARD</code>、<code>PM_NORMAL</code>、<code>PM_AUTOMATIC</code> から選択。
222 |  |
     	 */
223 |  |
     	protected void setPlayMode( int playMode )
224 |  |
     	{
225 | 0 |
     		_playMode = playMode;
226 | 0 |
     		_buttons[playMode].setSelected( true );
227 | 0 |
     		if( playMode == ActionControler.PM_SKIP )	{
228 | 0 |
     			_readAgainMenu.setEnabled( false );
229 | 0 |
     		}
230 | 0 |
     		else if( !_readAgainMenu.isEnabled() )	{
231 | 0 |
     			_readAgainMenu.setEnabled( true );
232 |  |
     		}
233 | 0 |
     		PekoSystem.getInstance().getCanvasManager().getStageCanvas().setUsingEffect( !_usingEffectMenu.isSelected() && (playMode != ActionControler.PM_SKIP) );
234 | 0 |
     		if( (_playMode != ActionControler.PM_NORMAL) && !PekoSystem.getInstance().getCanvasManager().isShowingSelect() )	{
235 | 0 |
     			start();
236 |  |
     		}
237 | 0 |
     	}
238 |  |
239 |  |
     	/**
240 |  |
     	 * プレイモードを「早送り」に設定します。
241 |  |
     	 */
242 |  |
     	public void setPlayModeToSKip()
243 |  |
     	{
244 | 0 |
     		setPlayMode( ActionControler.PM_SKIP );
245 | 0 |
     	}
246 |  |
247 |  |
     	/**
248 |  |
     	 * プレイモードを「通常」に設定します。
249 |  |
     	 */
250 |  |
     	public void setPlayModeToNormal()
251 |  |
     	{
252 | 0 |
     		setPlayMode( ActionControler.PM_NORMAL );
253 | 0 |
     	}
254 |  |
255 |  |
     	/**
256 |  |
     	 * プレイモードを「自動」に設定します。
257 |  |
     	 */
258 |  |
     	public void setPlayModeToAutomatic()
259 |  |
     	{
260 | 0 |
     		setPlayMode( ActionControler.PM_AUTOMATIC );
261 | 0 |
     	}
262 |  |
263 |  |
     	/**
264 |  |
     	 * 画像切り替えエフェクトを使用するかどうかを切り替えます。
265 |  |
     	 */
266 |  |
     	public void changeUsingEffect()
267 |  |
     	{
268 | 0 |
     		PekoSystem.getInstance().getCanvasManager().getStageCanvas().setUsingEffect( !_usingEffectMenu.isSelected() && (_playMode != ActionControler.PM_SKIP) );
269 | 0 |
     	}
270 |  |
271 |  |
     	/**
272 |  |
     	 * 読み返しコントローラを表示します。
273 |  |
     	 */
274 |  |
     	public void showReadAgain()
275 |  |
     	{
276 | 0 |
     		setActive( false );
277 | 0 |
     		_saveMenu.setEnabled( false );
278 | 0 |
     		_loadMenu.setEnabled( false );
279 | 0 |
     		_returnTileMenu.setEnabled( false );
280 | 0 |
     		_readAgainMenu.setEnabled( false );
281 | 0 |
     		if( _readAgainControler == null )	{
282 | 0 |
     			_readAgainControler = new TextHistoryControler();
283 | 0 |
     			_readAgainControler.setLocationRelativeTo( PekoSystem.getInstance().getMainWindow() );
284 |  |
     		}
285 | 0 |
     		_readAgainControler.setVisible( true );
286 | 0 |
     		setActive( true );
287 | 0 |
     		_saveMenu.setEnabled( true );
288 | 0 |
     		_loadMenu.setEnabled( true );
289 | 0 |
     		_returnTileMenu.setEnabled( true );
290 | 0 |
     		_readAgainMenu.setEnabled( true );
291 | 0 |
     	}
292 |  |
293 |  |
     	/**
294 |  |
     	 * ロードダイアログを表示します。
295 |  |
     	 */
296 |  |
     	public void showLoadDialog()
297 |  |
     	{
298 | 0 |
     		setActive( false );
299 | 0 |
     		_saveMenu.setEnabled( false );
300 | 0 |
     		_loadMenu.setEnabled( false );
301 | 0 |
     		_returnTileMenu.setEnabled( false );
302 | 0 |
     		_readAgainMenu.setEnabled( false );
303 | 0 |
     		PekoSystem	system = PekoSystem.getInstance();
304 | 0 |
     		if( !system.load() )	{
305 | 0 |
     			setActive( true );
306 |  |
     		}
307 | 0 |
     		_saveMenu.setEnabled( true );
308 | 0 |
     		_loadMenu.setEnabled( true );
309 | 0 |
     		_returnTileMenu.setEnabled( true );
310 | 0 |
     		_readAgainMenu.setEnabled( true );
311 | 0 |
     	}
312 |  |
313 |  |
     	/**
314 |  |
     	 * セーブダイアログを表示します。
315 |  |
     	 */
316 |  |
     	public synchronized void showSaveDialog()
317 |  |
     	{
318 | 0 |
     		PekoSystem	system = PekoSystem.getInstance();
319 | 0 |
     		setActive( false );
320 | 0 |
     		_saveMenu.setEnabled( false );
321 | 0 |
     		_loadMenu.setEnabled( false );
322 | 0 |
     		_returnTileMenu.setEnabled( false );
323 | 0 |
     		_readAgainMenu.setEnabled( false );
324 | 0 |
     		system.save();
325 | 0 |
     		_saveMenu.setEnabled( true );
326 | 0 |
     		_loadMenu.setEnabled( true );
327 | 0 |
     		_returnTileMenu.setEnabled( true );
328 | 0 |
     		_readAgainMenu.setEnabled( true );
329 | 0 |
     		setActive( true );
330 | 0 |
     	}
331 |  |
332 |  |
     	/**
333 |  |
     	 * タイトル画面に戻ります。
334 |  |
     	 */
335 |  |
     	public void returnTitle()
336 |  |
     	{
337 | 0 |
     		returnTitle( false );
338 | 0 |
     	}
339 |  |
340 |  |
     	/**
341 |  |
     	 * タイトル画面に戻ります。
342 |  |
     	 */
343 |  |
     	public void returnTitle( boolean silence )
344 |  |
     	{
345 | 0 |
     		setActive( false );
346 | 0 |
     		setPlayMode( ActionControler.PM_NORMAL );
347 | 0 |
     		_saveMenu.setEnabled( false );
348 | 0 |
     		_loadMenu.setEnabled( false );
349 | 0 |
     		_returnTileMenu.setEnabled( false );
350 | 0 |
     		_readAgainMenu.setEnabled( false );
351 | 0 |
     		if( silence )	{
352 | 0 |
     			PekoSystem.getInstance().showTitle();
353 | 0 |
     		}
354 |  |
     		else	{
355 | 0 |
     			ResourceManager	resources = ResourceManager.getInstance();
356 | 0 |
     			String	message = (String)resources.getResource( "peko.dialog.return-title.message" );
357 | 0 |
     			if( message == null )	{
358 | 0 |
     				message = "Are you return title ?";
359 |  |
     			}
360 |  |
361 | 0 |
     			String	title = (String)resources.getResource( "peko.dialog.return-title.title" );
362 | 0 |
     			if( title == null )	{
363 | 0 |
     				title = "Confirm";
364 |  |
     			}
365 |  |
366 | 0 |
     			if( JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(PekoSystem.getInstance().getMainWindow(), message, title, JOptionPane.OK_CANCEL_OPTION) )	{
367 | 0 |
     				PekoSystem.getInstance().showTitle();
368 | 0 |
     			}
369 |  |
     			else	{
370 | 0 |
     				setActive( true );
371 |  |
     			}
372 |  |
     		}
373 | 0 |
     		_saveMenu.setEnabled( true );
374 | 0 |
     		_loadMenu.setEnabled( true );
375 | 0 |
     		_returnTileMenu.setEnabled( true );
376 | 0 |
     		_readAgainMenu.setEnabled( true );
377 | 0 |
     	}
378 |  |
379 |  |
380 |  |
     	/**
381 |  |
     	 * {@link #stop()} により停止されたスレッドを再開します。
382 |  |
     	 */
383 |  |
     	public void start()
384 |  |
     	{
385 | 0 |
     		synchronized( _lock )	{
386 | 0 |
     			if( _lastTask != null )	{
387 | 0 |
     				_lastTask.cancel();
388 |  |
     			}
389 | 0 |
     			_lastTask = null;
390 | 0 |
     			_lock.notify();
391 | 0 |
     			Logger.debug( "[system.controler] notify to finish wait." );
392 | 0 |
     		}
393 | 0 |
     	}
394 |  |
395 |  |
     	/**
396 |  |
     	 * プレイヤーがアクションを起こすまで現在のスレッドを停止します。
397 |  |
     	 */
398 |  |
     	public void stop()
399 |  |
     	{
400 | 0 |
     		stop( ActionControler.SM_DEFAULT );
401 | 0 |
     	}
402 |  |
403 |  |
     	/**
404 |  |
     	 * 現在のスレッドを停止します。
405 |  |
     	 * @param	wait	待ち時間。プレイヤーが操作するまでストップする場合は <code>SM_DEFAULT</code> を、無停止の場合は <code>SM_NONSTOP</code> を指定する。
406 |  |
     	 */
407 |  |
     	public void stop( long wait )
408 |  |
     	{
409 | 0 |
     		Logger.debug( "[system.controler] stop :" + wait );
410 | 0 |
     		if( (wait == 0) || (_playMode == ActionControler.PM_SKIP) )	{
411 |  |
     			//NOOP
412 | 0 |
     		}
413 | 0 |
     		else if( wait < 0 )	{
414 | 0 |
     			synchronized( _lock )	{
415 |  |
     				try	{
416 | 0 |
     					if( (_playMode == ActionControler.PM_AUTOMATIC) && !PekoSystem.getInstance().getCanvasManager().isShowingSelect() )	{
417 | 0 |
     						TimerTask	task = new TimerTask()	{
418 |  |
     							public void run()	{
419 |  |
     								synchronized( _lock )	{
420 |  |
     									_lock.notify();
421 |  |
     								}
422 |  |
     							}
423 |  |
     						};
424 | 0 |
     						_timer.schedule( task, 1000L );
425 | 0 |
     						_lastTask = task;
426 |  |
     					}
427 | 0 |
     					_lock.wait();
428 |  |
     				}
429 | 0 |
     				catch( InterruptedException ie )	{
430 | 0 |
     					Logger.debug( "[system.action] interrupted." );
431 | 0 |
     				}
432 | 0 |
     			}
433 | 0 |
     		}
434 |  |
     		else	{
435 | 0 |
     			synchronized( _lock )	{
436 |  |
     				try	{
437 | 0 |
     					TimerTask	task = new TimerTask()	{
438 |  |
     						public void run()	{
439 |  |
     							synchronized( _lock )	{
440 |  |
     								_lock.notify();
441 |  |
     							}
442 |  |
     						}
443 |  |
     					};
444 | 0 |
     					_timer.schedule( task, wait );
445 | 0 |
     					_lastTask = task;
446 | 0 |
     					_lock.wait();
447 |  |
     				}
448 | 0 |
     				catch( InterruptedException ie )	{
449 | 0 |
     					Logger.debug( "[system.action] interrupted." );
450 | 0 |
     				}
451 | 0 |
     			}
452 |  |
     		}
453 |  |
454 | 0 |
     		if( !isActive() && (_lastTask != null) )	{
455 | 0 |
     			synchronized( _lock )	{
456 | 0 |
     				if( !_activity && (_lastTask != null) )	{
457 | 0 |
     					_waitingActivate = true;
458 |  |
     					try	{
459 | 0 |
     						_lock.wait();
460 | 0 |
     						_lock.wait( 500 );
461 |  |
     					}
462 | 0 |
     					catch( InterruptedException ie )	{
463 | 0 |
     					}
464 | 0 |
     					_waitingActivate = false;
465 |  |
     				}
466 | 0 |
     			}
467 |  |
     		}
468 |  |
469 | 0 |
     		_lastTask = null;
470 | 0 |
     		Logger.debug( "[system.controler] finish wait." );
471 | 0 |
     	}
472 |  |
473 |  |
474 |  |
     	/**
475 |  |
     	 * メニューバーを準備します。
476 |  |
     	 */
477 |  |
     	private void prepareMenuBar()
478 |  |
     	{
479 | 0 |
     		PekoSystem	system = PekoSystem.getInstance();
480 | 0 |
     		ResourceManager	resources = ResourceManager.getInstance();
481 |  |
482 | 0 |
     		JMenuBar	menubar = new JMenuBar();
483 | 0 |
     		JMenu	menu = null;
484 | 0 |
     		JMenuItem	item = null;
485 |  |
486 | 0 |
     		menu = new JMenu( (String)resources.getResource("peko.menu.system.menu-caption") );
487 | 0 |
     		menu.setMnemonic( 'S' );
488 | 0 |
     		menubar.add( menu );
489 |  |
490 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.system.save") );
491 | 0 |
     		item.setEnabled( false );
492 | 0 |
     		item.setMnemonic( 'S' );
493 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK) );
494 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "showSaveDialog", true );
495 | 0 |
     		menu.add( item );
496 | 0 |
     		_saveMenu = item;
497 |  |
498 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.system.load") );
499 | 0 |
     		item.setEnabled( false );
500 | 0 |
     		item.setMnemonic( 'O' );
501 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK) );
502 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "showLoadDialog", true );
503 | 0 |
     		menu.add( item );
504 | 0 |
     		_loadMenu = item;
505 |  |
506 | 0 |
     		menu.addSeparator();
507 |  |
508 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.system.return-title") );
509 | 0 |
     		item.setEnabled( false );
510 | 0 |
     		item.setMnemonic( 'T' );
511 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.CTRL_MASK) );
512 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "returnTitle", true );
513 | 0 |
     		menu.add( item );
514 | 0 |
     		_returnTileMenu = item;
515 |  |
516 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.system.read-again") );
517 | 0 |
     		item.setEnabled( false );
518 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_R, 0) );
519 | 0 |
     		item.setMnemonic( 'R' );
520 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "showReadAgain" );
521 | 0 |
     		menu.add( item );
522 | 0 |
     		_readAgainMenu = item;
523 |  |
524 | 0 |
     		menu.addSeparator();
525 |  |
526 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.system.exit") );
527 | 0 |
     		item.setMnemonic( 'X' );
528 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK) );
529 | 0 |
     		GenericListener.connect( item, system, ActionListener.class, "actionPerformed", "exit" );
530 | 0 |
     		menu.add( item );
531 |  |
532 |  |
533 | 0 |
     		menu = new JMenu( (String)resources.getResource("peko.menu.config.menu-caption") );
534 | 0 |
     		menu.setMnemonic( 'C' );
535 | 0 |
     		menubar.add( menu );
536 |  |
537 | 0 |
     		JMenu	submenu = new JMenu( (String)resources.getResource("peko.menu.config.playmode.menu-caption") );
538 | 0 |
     		submenu.setMnemonic( 'P' );
539 | 0 |
     		menu.add( submenu );
540 |  |
541 | 0 |
     		ButtonGroup	group = new ButtonGroup();
542 | 0 |
     		item = new JRadioButtonMenuItem( (String)resources.getResource("peko.menu.config.playmode.normal") );
543 | 0 |
     		item.setMnemonic( 'N' );
544 |  |
     //		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK) );
545 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "setPlayModeToNormal" );
546 | 0 |
     		group.add( item );
547 | 0 |
     		submenu.add( item );
548 | 0 |
     		_buttons[ ActionControler.PM_NORMAL ] = item;
549 |  |
550 | 0 |
     		item = new JRadioButtonMenuItem( (String)resources.getResource("peko.menu.config.playmode.automatic") );
551 | 0 |
     		item.setMnemonic( 'A' );
552 |  |
     //		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK) );
553 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "setPlayModeToAutomatic" );
554 | 0 |
     		group.add( item );
555 | 0 |
     		submenu.add( item );
556 | 0 |
     		_buttons[ ActionControler.PM_AUTOMATIC ] = item;
557 |  |
558 | 0 |
     		item = new JRadioButtonMenuItem( (String)resources.getResource("peko.menu.config.playmode.skip") );
559 | 0 |
     		item.setMnemonic( 'S' );
560 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, 0) );
561 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "setPlayModeToSKip" );
562 | 0 |
     		group.add( item );
563 | 0 |
     		submenu.add( item );
564 | 0 |
     		_buttons[ ActionControler.PM_SKIP ] = item;
565 |  |
566 | 0 |
     		menu.addSeparator();
567 |  |
568 | 0 |
     		item = new JCheckBoxMenuItem( (String)resources.getResource("peko.menu.config.use-effect") );
569 | 0 |
     		item.setSelected( false );
570 | 0 |
     		item.setMnemonic( 'E' );
571 | 0 |
     		GenericListener.connect( item, this, ActionListener.class, "actionPerformed", "changeUsingEffect" );
572 | 0 |
     		menu.add( item );
573 | 0 |
     		_usingEffectMenu = item;
574 |  |
575 |  |
576 | 0 |
     		menu = new JMenu( (String)resources.getResource("peko.menu.help.menu-caption") );
577 | 0 |
     		menu.setMnemonic( 'H' );
578 | 0 |
     		menubar.add( menu );
579 |  |
580 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.help.help-contents") );
581 | 0 |
     		item.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0) );
582 | 0 |
     		item.setMnemonic( 'H' );
583 | 0 |
     		item.setEnabled( false );
584 |  |
     //		GenericListener.connect( item, system, ActionListener.class, "actionPerformed", "showGameVersionInfo" );
585 | 0 |
     		menu.add( item );
586 |  |
587 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.help.version") );
588 | 0 |
     		item.setMnemonic( 'A' );
589 | 0 |
     		GenericListener.connect( item, system, ActionListener.class, "actionPerformed", "showGameVersionInfo" );
590 | 0 |
     		menu.add( item );
591 |  |
592 | 0 |
     		menu.addSeparator();
593 |  |
594 | 0 |
     		item = new JMenuItem( (String)resources.getResource("peko.menu.help.about-pvns") );
595 | 0 |
     		item.setMnemonic( 'P' );
596 | 0 |
     		GenericListener.connect( item, system, ActionListener.class, "actionPerformed", "showSystemVersionInfo" );
597 | 0 |
     		menu.add( item );
598 |  |
599 |  |
600 | 0 |
     		JFrame	mainWindow = system.getMainWindow();
601 | 0 |
     		mainWindow.setJMenuBar( menubar );
602 | 0 |
     		mainWindow.pack();
603 | 0 |
     		mainWindow.setResizable( false );
604 | 0 |
     	}
605 |  |
606 |  |
607 |  |
     //
608 |  |
     //	MouseListener の実装
609 |  |
     //
610 |  |
     	public void mousePressed( MouseEvent ev )
611 |  |
     	{
612 | 0 |
     	}
613 |  |
614 |  |
     	public void mouseReleased( MouseEvent ev )
615 |  |
     	{
616 | 0 |
     	}
617 |  |
618 |  |
     	public void mouseEntered( MouseEvent ev )
619 |  |
     	{
620 | 0 |
     	}
621 |  |
622 |  |
     	public void mouseExited( MouseEvent ev )
623 |  |
     	{
624 | 0 |
     	}
625 |  |
626 |  |
     	public void mouseClicked( MouseEvent ev )
627 |  |
     	{
628 | 0 |
     		int	code = ev.getModifiers();
629 | 0 |
     		if( isActive() && (code == MouseEvent.BUTTON1_MASK) )	{
630 | 0 |
     			start();
631 | 0 |
     		}
632 | 0 |
     		else if( (_playMode == ActionControler.PM_SKIP) && (code == MouseEvent.BUTTON3_MASK) )	{
633 | 0 |
     			setPlayModeToNormal();
634 | 0 |
     			return;
635 |  |
     		}
636 | 0 |
     		else if( _hiddenText )	{
637 | 0 |
     			CanvasManager	canvasManager = PekoSystem.getInstance().getCanvasManager();
638 | 0 |
     			canvasManager.hideTextCanvas();
639 | 0 |
     			setActive( true );
640 |  |
     		}
641 | 0 |
     	}
642 |  |
643 |  |
644 |  |
     //
645 |  |
     //	KeyListener の実装
646 |  |
     //
647 |  |
     	public void keyPressed( KeyEvent ev )
648 |  |
     	{
649 | 0 |
     		if( isActive() )	{
650 | 0 |
     			int	code = ev.getKeyCode();
651 | 0 |
     			if( _lastKeyCode == -1 )	{
652 | 0 |
     				_lastKeyCode = code;
653 | 0 |
     			}
654 | 0 |
     			else if( _lastKeyCode != code )	{
655 | 0 |
     				_lastKeyCode = -1;
656 |  |
     			}
657 |  |
     		}
658 | 0 |
     	}
659 |  |
660 |  |
     	public void keyReleased( KeyEvent ev )
661 |  |
     	{
662 | 0 |
     		int	code = ev.getKeyCode();
663 | 0 |
     		if( code != _lastKeyCode )	{
664 | 0 |
     			_lastKeyCode = -1;
665 | 0 |
     			return;
666 |  |
     		}
667 |  |
668 | 0 |
     		if( _hiddenText )	{
669 | 0 |
     			CanvasManager	canvasManager = PekoSystem.getInstance().getCanvasManager();
670 | 0 |
     			canvasManager.showTextCanvas();
671 | 0 |
     			_saveMenu.setEnabled( true );
672 | 0 |
     			_loadMenu.setEnabled( true );
673 | 0 |
     			_returnTileMenu.setEnabled( true );
674 | 0 |
     			_hiddenText = false;
675 | 0 |
     		}
676 | 0 |
     		else if( isActive() && (code == KeyEvent.VK_ENTER) )	{
677 | 0 |
     			start();
678 | 0 |
     		}
679 | 0 |
     		else if( (_playMode != ActionControler.PM_NORMAL) && (code == KeyEvent.VK_ESCAPE) )	{
680 | 0 |
     			setPlayModeToNormal();
681 | 0 |
     		}
682 | 0 |
     		else if( !_hiddenText && (code == KeyEvent.VK_SPACE) )	{
683 | 0 |
     			CanvasManager	canvasManager = PekoSystem.getInstance().getCanvasManager();
684 | 0 |
     			_saveMenu.setEnabled( false );
685 | 0 |
     			_loadMenu.setEnabled( false );
686 | 0 |
     			_returnTileMenu.setEnabled( false );
687 | 0 |
     			canvasManager.hideTextCanvas();
688 | 0 |
     			_hiddenText = true;
689 |  |
     		}
690 | 0 |
     		_lastKeyCode = -1;
691 | 0 |
     	}
692 |  |
693 |  |
     	public void keyTyped( KeyEvent ev )
694 |  |
     	{
695 | 0 |
     	}
696 |  |
     }
697 |  |
698 |  |
699 |  |
700 |  |
701 |  |
     /**
702 |  |
      * テキストの履歴をブラウジングするコントローラです。
703 |  |
      */
704 |  |
     class TextHistoryControler	extends JDialog	{
705 |  |
706 |  |
     	/**
707 |  |
     	 * serial version UID
708 |  |
     	 */
709 |  |
     	private static final long	serialVersionUID	= -5321584449609116120L;
710 |  |
711 |  |
     	/**
712 |  |
     	 * 現在のインデックス
713 |  |
     	 */
714 |  |
     	private int	_index = 0;
715 |  |
716 |  |
     	/**
717 |  |
     	 * キャンバスマネージャ
718 |  |
     	 */
719 |  |
     	private CanvasManager	_canvasManager = null;
720 |  |
721 |  |
     	/**
722 |  |
     	 * 「前」ボタン
723 |  |
     	 */
724 |  |
     	private JButton	_previous = null;
725 |  |
726 |  |
     	/**
727 |  |
     	 * 「次」ボタン
728 |  |
     	 */
729 |  |
     	private JButton	_next = null;
730 |  |
731 |  |
732 |  |
     	/**
733 |  |
     	 * <code>TextHistoryControler</code> のインスタンスを作成します。
734 |  |
     	 */
735 |  |
     	public TextHistoryControler()
736 |  |
     	{
737 |  |
     		super( PekoSystem.getInstance().getMainWindow(), true );
738 |  |
     		initialize();
739 |  |
     	}
740 |  |
741 |  |
742 |  |
     	/**
743 |  |
     	 * 初期化処理を実行します。
744 |  |
     	 */
745 |  |
     	private void initialize()
746 |  |
     	{
747 |  |
     		_canvasManager = PekoSystem.getInstance().getCanvasManager();
748 |  |
     		ClassLoader	cl = getClass().getClassLoader();
749 |  |
750 |  |
     		getContentPane().setLayout( new java.awt.FlowLayout() );
751 |  |
     		JButton	button = new JButton();
752 |  |
     		button.setIcon( new ImageIcon(cl.getResource("left-arrow.png")) );
753 |  |
     		getContentPane().add( button );
754 |  |
     		GenericListener.connect( button, this, ActionListener.class, "actionPerformed", "previous" );
755 |  |
     		_previous = button;
756 |  |
     		button.setEnabled( (_canvasManager.getPageHistoryCount() >= 1) );
757 |  |
758 |  |
     		button = new JButton();
759 |  |
     		button.setIcon( new ImageIcon(cl.getResource("right-arrow.png")) );
760 |  |
     		button.setEnabled( false );
761 |  |
     		getContentPane().add( button );
762 |  |
     		_next = button;
763 |  |
     		GenericListener.connect( button, this, ActionListener.class, "actionPerformed", "next" );
764 |  |
765 |  |
     		pack();
766 |  |
     		setResizable( false );
767 |  |
     	}
768 |  |
769 |  |
     	/**
770 |  |
     	 * 前のページを表示します。
771 |  |
     	 */
772 |  |
     	public void previous()
773 |  |
     	{
774 |  |
     		ResourceManager	resources = ResourceManager.getInstance();
775 |  |
     		_index++;
776 |  |
     		setTitle( ((MessageFormat)resources.getResource("peko.dialog.read-again.title-format")).format(new Object[]{String.valueOf(_index)}) );
777 |  |
     		_next.setEnabled( (_index > 1 ) );
778 |  |
     		if( _index == _canvasManager.getPageHistoryCount() )	{
779 |  |
     			_previous.setEnabled( false );
780 |  |
     		}
781 |  |
     		_previous.setEnabled( _canvasManager.readAgain(_index) );
782 |  |
     	}
783 |  |
784 |  |
     	/**
785 |  |
     	 * 次のページを表示します。
786 |  |
     	 */
787 |  |
     	public void next()
788 |  |
     	{
789 |  |
     		ResourceManager	resources = ResourceManager.getInstance();
790 |  |
     		_index--;
791 |  |
     		setTitle( ((MessageFormat)resources.getResource("peko.dialog.read-again.title-format")).format(new Object[]{String.valueOf(_index)}) );
792 |  |
     		_previous.setEnabled( true );
793 |  |
     		if( _index == 1 )	{
794 |  |
     			_next.setEnabled( false );
795 |  |
     		}
796 |  |
     		_canvasManager.readAgain( _index );
797 |  |
     	}
798 |  |
799 |  |
800 |  |
     //
801 |  |
     //	JDialog の実装
802 |  |
     //
803 |  |
     	public void setVisible( boolean visible )
804 |  |
     	{
805 |  |
     		if( visible )	{
806 |  |
     			_index = 0;
807 |  |
     			if( _canvasManager.getPageHistoryCount() > 0 )	{
808 |  |
     				previous();
809 |  |
     			}
810 |  |
     		}
811 |  |
     		else	{
812 |  |
     			_canvasManager.returnCurrent();
813 |  |
     		}
814 |  |
     		super.setVisible( visible );
815 |  |
     	}
816 |  |
     }

This report is generated by jcoverage, Maven and Maven JCoverage Plugin.