1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package tsukuba_bunko.peko.canvas;
20
21 import java.awt.Color;
22 import java.awt.Dimension;
23 import java.awt.Font;
24
25 import java.awt.font.TextAttribute;
26
27 import java.io.Serializable;
28
29 import java.util.List;
30 import java.util.Map;
31
32 import javax.swing.ImageIcon;
33 import javax.swing.JComponent;
34 import javax.swing.JFrame;
35
36 import tsukuba_bunko.peko.ActionControler;
37 import tsukuba_bunko.peko.Logger;
38 import tsukuba_bunko.peko.PekoSystem;
39
40 import tsukuba_bunko.peko.canvas.select.SelectCanvas;
41 import tsukuba_bunko.peko.canvas.select.SelectItem;
42 import tsukuba_bunko.peko.canvas.select.SelectItemButton;
43
44 import tsukuba_bunko.peko.canvas.stage.Stage;
45 import tsukuba_bunko.peko.canvas.stage.StageCanvas;
46
47 import tsukuba_bunko.peko.canvas.text.Page;
48 import tsukuba_bunko.peko.canvas.text.TextCanvas;
49
50 import tsukuba_bunko.peko.resource.ResourceManager;
51 import tsukuba_bunko.peko.resource.FontManager;
52
53 import tsukuba_bunko.peko.session.Session;
54
55
56 /***
57 * Canvas を管理する機能を提供します。
58 * @author $Author: ppoi $
59 * @version $Revision: 1.3 $
60 */
61 public class CanvasManager {
62
63 /***
64 * テキストキャンバス
65 */
66 private TextCanvas _text = null;
67
68 /***
69 * ステージキャンバス
70 */
71 private StageCanvas _stage = null;
72
73 /***
74 * 選択肢キャンバス
75 */
76 private SelectCanvas _select = null;
77
78
79 /***
80 * テキストの履歴
81 */
82 private List _history = null;
83
84 /***
85 * テキストの履歴の最大数
86 */
87 private int _maxHistoryCount = 0;
88
89 /***
90 * 現在の Page
91 */
92 private Page _currentPage = null;
93
94 /***
95 * 現在選択肢を表示中かどうか
96 */
97 private boolean _selecting = false;
98
99
100
101 /***
102 * 選択肢ボタンスタイル
103 */
104 private Map _selectStyle = null;
105
106 /***
107 * タイトルメニューボタンスタイル
108 */
109 private Map _titleStyle = null;
110
111
112 /***
113 * <code>CanvasManager</code> のインスタンスを作成します。
114 */
115 public CanvasManager()
116 {
117 super();
118 }
119
120
121 /***
122 * 初期化します。
123 */
124 public void initialize()
125 {
126 PekoSystem system = PekoSystem.getInstance();
127 ResourceManager resources = ResourceManager.getInstance();
128
129 _history = new java.util.ArrayList();
130
131 JFrame mainWindow = system.getMainWindow();
132
133 String title = (String)resources.getResource( "game-info.title" );
134 Dimension canvasSize = (Dimension)resources.getResource( ResourceIDs.CANVAS_SIZE );
135 ImageIcon icon = (ImageIcon)resources.getResource( "game-info.icon" );
136
137 mainWindow.setTitle( title );
138 if( (icon.getIconHeight() > 0) && (icon.getIconWidth() > 0) ) {
139 mainWindow.setIconImage( icon.getImage() );
140 }
141
142 mainWindow.setResizable( true );
143 JComponent contentPane = (JComponent)mainWindow.getContentPane();
144 contentPane.setPreferredSize( canvasSize );
145 contentPane.setSize( canvasSize );
146 contentPane.setLayout( null );
147
148 _stage = new StageCanvas();
149 _stage.setStage( new Stage() );
150 contentPane.add( _stage );
151 _stage.setLocation( 0, 0 );
152
153 _text = new TextCanvas();
154 _text.setPreferredSize( canvasSize );
155 _text.setSize( canvasSize );
156 _text.setVisible( false );
157 _stage.add( _text );
158 _text.setLocation( 0, 0 );
159
160 _select = new SelectCanvas();
161 _select.setPreferredSize( canvasSize );
162 _select.setSize( canvasSize );
163 _select.setVisible( false );
164 _stage.add( _select );
165 _select.setLocation( 0, 0 );
166 mainWindow.addKeyListener( _select );
167
168 Integer maxHistory = (Integer)resources.getResource( ResourceIDs.CANVAS_PAGE_HISTORY );
169 if( maxHistory == null ) {
170 _maxHistoryCount = 10;
171 }
172 else {
173 _maxHistoryCount = maxHistory.intValue();
174 }
175
176 initializeSelectStyle();
177 initializeTitleStyle();
178 }
179
180 /***
181 * 選択肢のスタイルを設定します。
182 */
183 protected void initializeSelectStyle()
184 {
185 ResourceManager resources = ResourceManager.getInstance();
186
187 _selectStyle = new java.util.HashMap( 17 );
188
189 Color colorValue = (Color)resources.getResource( ResourceIDs.SELECT_BUTTON_BACKGROUND_COLOR );
190 if( colorValue == null ) {
191 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_COLOR, "black"} );
192 colorValue = Color.black;
193 }
194 _selectStyle.put( SelectItemButton.STYLE_BACKGROUND_COLOR, colorValue );
195
196 Float floatValue = (Float)resources.getResource( ResourceIDs.SELECT_BUTTON_BACKGROUND_TRANSPARENCY );
197 if( floatValue == null ) {
198 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, "0.5f"} );
199 floatValue = new Float( 0.5f );
200 }
201 else if( floatValue.floatValue() < 0f ) {
202 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, "0.5f"} );
203 floatValue = new Float( 0.5f );
204 }
205 _selectStyle.put( SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, floatValue );
206
207 Integer intValue = (Integer)resources.getResource( ResourceIDs.SELECT_BUTTON_WIDTH );
208 if( intValue == null ) {
209 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_WIDTH, "320"} );
210 intValue = new Integer( 320 );
211 }
212 _selectStyle.put( SelectItemButton.STYLE_WIDTH, intValue );
213
214 colorValue = (Color)resources.getResource( ResourceIDs.SELECT_BUTTON_FOREGROUND_SELECTED );
215 if( colorValue == null ) {
216 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_SELECTED, "white"} );
217 colorValue = Color.white;
218 }
219 _selectStyle.put( SelectItemButton.STYLE_FOREGROUND_SELECTED, colorValue );
220
221 colorValue = (Color)resources.getResource( ResourceIDs.SELECT_BUTTON_FOREGROUND_UNSELECTED );
222 if( colorValue == null ) {
223 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_UNSELECTED, "darkGray"} );
224 colorValue = Color.darkGray;
225 }
226 _selectStyle.put( SelectItemButton.STYLE_FOREGROUND_UNSELECTED, colorValue );
227
228 colorValue = (Color)resources.getResource( ResourceIDs.SELECT_BUTTON_FOREGROUND_SHADOW );
229 if( colorValue == null ) {
230 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_SHADOW, "black"} );
231 colorValue = Color.black;
232 }
233 _selectStyle.put( SelectItemButton.STYLE_FOREGROUND_SHADOW, colorValue );
234
235 Font fontValue = (Font)resources.getResource( ResourceIDs.SELECT_BUTTON_FONT );
236 if( fontValue == null ) {
237 Map attributes = new java.util.HashMap( 17 );
238 attributes.put( TextAttribute.FAMILY, "SansSerif" );
239 attributes.put( TextAttribute.SIZE, new Float(16f) );
240 fontValue = FontManager.getInstance().getFont( attributes );
241 }
242 _selectStyle.put( SelectItemButton.STYLE_FONT, fontValue );
243 }
244
245
246 /***
247 * タイトルメニューのスタイルを設定します。
248 */
249 protected void initializeTitleStyle()
250 {
251 ResourceManager resources = ResourceManager.getInstance();
252
253 _titleStyle = new java.util.HashMap( 17 );
254
255 Color colorValue = (Color)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_BACKGROUND_COLOR );
256 if( colorValue == null ) {
257 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_COLOR, "black"} );
258 colorValue = Color.black;
259 }
260 _titleStyle.put( SelectItemButton.STYLE_BACKGROUND_COLOR, colorValue );
261
262 Float floatValue = (Float)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_BACKGROUND_TRANSPARENCY );
263 if( floatValue == null ) {
264 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, "0.5f"} );
265 floatValue = new Float( 0.5f );
266 }
267 else if( floatValue.floatValue() < 0f ) {
268 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, "0.5f"} );
269 floatValue = new Float( 0.5f );
270 }
271 _titleStyle.put( SelectItemButton.STYLE_BACKGROUND_TRANSPARENCY, floatValue );
272
273 Integer intValue = (Integer)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_WIDTH );
274 if( intValue == null ) {
275 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_WIDTH, "320"} );
276 intValue = new Integer( 320 );
277 }
278 _titleStyle.put( SelectItemButton.STYLE_WIDTH, intValue );
279
280 colorValue = (Color)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_FOREGROUND_SELECTED );
281 if( colorValue == null ) {
282 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_SELECTED, "white"} );
283 colorValue = Color.white;
284 }
285 _titleStyle.put( SelectItemButton.STYLE_FOREGROUND_SELECTED, colorValue );
286
287 colorValue = (Color)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_FOREGROUND_UNSELECTED );
288 if( colorValue == null ) {
289 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_UNSELECTED, "darkGray"} );
290 colorValue = Color.darkGray;
291 }
292 _titleStyle.put( SelectItemButton.STYLE_FOREGROUND_UNSELECTED, colorValue );
293
294 colorValue = (Color)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_FOREGROUND_SHADOW );
295 if( colorValue == null ) {
296 Logger.warn( MessageIDs.CVS3003W, new Object[]{SelectItemButton.STYLE_FOREGROUND_SHADOW, "black"} );
297 colorValue = Color.black;
298 }
299 _titleStyle.put( SelectItemButton.STYLE_FOREGROUND_SHADOW, colorValue );
300
301 Font fontValue = (Font)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_FONT );
302 if( fontValue == null ) {
303 Map attributes = new java.util.HashMap( 17 );
304 attributes.put( TextAttribute.FAMILY, "SansSerif" );
305 attributes.put( TextAttribute.SIZE, new Float(16f) );
306 fontValue = FontManager.getInstance().getFont( attributes );
307 }
308 _titleStyle.put( SelectItemButton.STYLE_FONT, fontValue );
309 }
310
311 /***
312 * テキストキャンバスを取得します。
313 * @return テキストキャンバス
314 */
315 public TextCanvas getTextCanvas()
316 {
317 return _text;
318 }
319
320 /***
321 * ステージキャンバスを取得します。
322 * @return ステージキャンバス
323 */
324 public StageCanvas getStageCanvas()
325 {
326 return _stage;
327 }
328
329 /***
330 * ステージを取得します。
331 */
332 public Stage getStage()
333 {
334 return _stage.getStage();
335 }
336
337 /***
338 * 現在のページを取得します。
339 */
340 public Page getCurrentPage()
341 {
342 return _text.getPage();
343 }
344
345 /***
346 * 次の新しいページに移動します。
347 * @return 現在のページ(移動後)
348 */
349 public Page advancesNewPage()
350 {
351 Page page = _text.getPage();
352 if( page != null ) {
353 synchronized( page ) {
354 putTextHistory( page );
355 page.clearLines();
356 }
357 }
358 else {
359 page = new Page();
360 _text.setPage( page );
361 }
362
363 _currentPage = page;
364 return page;
365 }
366
367 /***
368 * <code>page</code> をテキストの履歴に追加します。
369 * @param page 履歴に追加するページ
370 */
371 protected void putTextHistory( Page page )
372 {
373 if( page.getLineCount() == 0 ) {
374
375 return;
376 }
377
378 Page previous = null;
379 if( _history.size() >= _maxHistoryCount ) {
380 previous = (Page)_history.remove( 0 );
381 page.clone( previous );
382 }
383 else {
384 previous = (Page)page.clone();
385 }
386 _history.add( previous );
387 }
388
389 /***
390 * 過去の文章を表示します。
391 * @param index 戻るページ数。
392 * @return 次があれば true
393 */
394 public boolean readAgain( int index )
395 {
396 if( _selecting ) {
397 _select.setVisible( false );
398 }
399
400 Page previous = (Page)_history.get( _history.size() - index );
401 _text.setPage( previous );
402 _text.updateCanvas();
403 _text.updateText();
404 return ((_history.size() - index) > 0);
405 }
406
407 /***
408 * 現在のページに戻ります。
409 */
410 public void returnCurrent()
411 {
412 _text.setPage( _currentPage );
413 _text.updateCanvas();
414 _text.updateText();
415
416 if( _selecting ) {
417 hideTextCanvas();
418 _select.setVisible( true );
419 }
420 }
421
422 /***
423 * 履歴として保存されている過去のページ数を取得します。
424 * @return 履歴として保存されている過去のページ数
425 */
426 public int getPageHistoryCount()
427 {
428 return _history.size();
429 }
430
431 /***
432 * 現在選択肢を表示中かどうかを取得します。
433 * @return 選択肢表示中の場合 <code>true</code>
434 */
435 public boolean isShowingSelect()
436 {
437 return _selecting;
438 }
439
440 /***
441 * 選択肢を表示します。
442 * @param selectItems 選択肢リスト
443 * @return 選択された選択肢の ID
444 */
445 public String showSelect( List selectItems )
446 {
447 ResourceManager resources = ResourceManager.getInstance();
448
449 String alignment = (String)resources.getResource( ResourceIDs.SELECT_ALIGN );
450 if( alignment == null ) {
451 Logger.warn( MessageIDs.CVS3001W, new Object[]{"center"} );
452 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
453 }
454 else if( "center".equalsIgnoreCase(alignment) ) {
455 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
456 }
457 else if( "left".equalsIgnoreCase(alignment) ) {
458 _select.setAlignment( SelectCanvas.ALIGN_LEFT );
459 }
460 else if( "right".equalsIgnoreCase(alignment) ) {
461 _select.setAlignment( SelectCanvas.ALIGN_RIGHT );
462 }
463 else {
464 Logger.warn( MessageIDs.CVS3001W, new Object[]{"center"} );
465 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
466 }
467
468 String valign = (String)resources.getResource( ResourceIDs.SELECT_VERTICAL_ALIGN );
469 if( valign == null ) {
470 Logger.warn( MessageIDs.CVS3006W, new Object[]{"middle"} );
471 _select.setVerticalAlignment( SelectCanvas.VALIGN_MIDDLE );
472 }
473 else if( "top".equalsIgnoreCase(valign) ) {
474 _select.setVerticalAlignment( SelectCanvas.VALIGN_TOP );
475 }
476 else if( "middle".equalsIgnoreCase(valign) ) {
477 _select.setVerticalAlignment( SelectCanvas.VALIGN_MIDDLE );
478 }
479 else if( "bottom".equalsIgnoreCase(valign) ) {
480 _select.setVerticalAlignment( SelectCanvas.VALIGN_BOTTOM );
481 }
482 else {
483 Logger.warn( MessageIDs.CVS3006W, new Object[]{"middle"} );
484 _select.setVerticalAlignment( SelectCanvas.VALIGN_MIDDLE );
485 }
486
487 Integer columns = (Integer)resources.getResource( ResourceIDs.SELECT_COLUMNS );
488 if( columns == null ) {
489 Logger.warn( MessageIDs.CVS3002W, new Object[]{"1"} );
490 _select.setColumns( 1 );
491 }
492 else {
493 _select.setColumns( columns.intValue() );
494 }
495
496 Integer span = (Integer)resources.getResource( ResourceIDs.SELECT_SPAN_COLUMN );
497 if( span == null ) {
498 Logger.warn( MessageIDs.CVS3004W, new Object[]{"5"} );
499 _select.setColumnSpan( 5 );
500 }
501 else {
502 _select.setColumnSpan( span.intValue() );
503 }
504
505 span = (Integer)resources.getResource( ResourceIDs.SELECT_SPAN_ROW );
506 if( span == null ) {
507 Logger.warn( MessageIDs.CVS3005W, new Object[]{"5"} );
508 _select.setRowSpan( 5 );
509 }
510 else {
511 _select.setRowSpan( span.intValue() );
512 }
513
514 span = (Integer)resources.getResource( ResourceIDs.SELECT_SPAN_BOUND );
515 if( span == null ) {
516 Logger.warn( MessageIDs.CVS3007W, new Object[]{"20"} );
517 _select.setBoundSpan( 20 );
518 }
519 else {
520 _select.setBoundSpan( span.intValue() );
521 }
522
523 _select.setButtonStyle( _selectStyle );
524
525 if( _text.isVisible() ) {
526 hideTextCanvas();
527 }
528
529 Page page = advancesNewPage();
530 page.commit();
531
532 _selecting = true;
533
534 ActionControler controler = PekoSystem.getInstance().getActionControler();
535 if( controler.getPlayMode() == ActionControler.PM_SKIP ) {
536 controler.setPlayModeToNormal();
537 }
538
539 _select.setVisible( true );
540 String id = _select.select( selectItems );
541 _select.setVisible( false );
542
543 _selecting = false;
544
545 return id;
546 }
547
548 /***
549 * タイトル画面を描画します。
550 * @param showTitle オープニングを表示するかどうか
551 */
552 public String showTitle( boolean showTitle )
553 {
554 ResourceManager resources = ResourceManager.getInstance();
555
556 String alignment = (String)resources.getResource( ResourceIDs.TITLE_MENU_ALIGN );
557 if( alignment == null ) {
558 Logger.warn( MessageIDs.CVS3001W, new Object[]{"center"} );
559 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
560 }
561 else if( "center".equalsIgnoreCase(alignment) ) {
562 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
563 }
564 else if( "left".equalsIgnoreCase(alignment) ) {
565 _select.setAlignment( SelectCanvas.ALIGN_LEFT );
566 }
567 else if( "right".equalsIgnoreCase(alignment) ) {
568 _select.setAlignment( SelectCanvas.ALIGN_RIGHT );
569 }
570 else {
571 Logger.warn( MessageIDs.CVS3001W, new Object[]{"center"} );
572 _select.setAlignment( SelectCanvas.ALIGN_CENTER );
573 }
574
575 String valign = (String)resources.getResource( ResourceIDs.TITLE_MENU_VERTICAL_ALIGN );
576 if( valign == null ) {
577 Logger.warn( MessageIDs.CVS3006W, new Object[]{"bottom"} );
578 _select.setVerticalAlignment( SelectCanvas.VALIGN_BOTTOM );
579 }
580 else if( "top".equalsIgnoreCase(valign) ) {
581 _select.setVerticalAlignment( SelectCanvas.VALIGN_TOP );
582 }
583 else if( "middle".equalsIgnoreCase(valign) ) {
584 _select.setVerticalAlignment( SelectCanvas.VALIGN_MIDDLE );
585 }
586 else if( "bottom".equalsIgnoreCase(valign) ) {
587 _select.setVerticalAlignment( SelectCanvas.VALIGN_BOTTOM );
588 }
589 else {
590 Logger.warn( MessageIDs.CVS3006W, new Object[]{"bottom"} );
591 _select.setVerticalAlignment( SelectCanvas.VALIGN_BOTTOM );
592 }
593
594 Integer columns = (Integer)resources.getResource( ResourceIDs.TITLE_MENU_COLUMNS );
595 if( columns == null ) {
596 Logger.warn( MessageIDs.CVS3002W, new Object[]{"1"} );
597 _select.setColumns( 1 );
598 }
599 else {
600 _select.setColumns( columns.intValue() );
601 }
602
603 String startCaption = (String)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_CAPTION_START );
604 if( startCaption == null ) {
605 startCaption = "Start";
606 Logger.warn( MessageIDs.CVS4001W, new Object[]{"start", startCaption} );
607 }
608 String resumeCaption = (String)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_CAPTION_RESUME );
609 if( resumeCaption == null ) {
610 resumeCaption = "Load";
611 Logger.warn( MessageIDs.CVS4001W, new Object[]{"resume", resumeCaption} );
612 }
613 String exitCaption = (String)resources.getResource( ResourceIDs.TITLE_MENU_BUTTON_CAPTION_EXIT );
614 if( exitCaption == null ) {
615 exitCaption = "Exit";
616 Logger.warn( MessageIDs.CVS4001W, new Object[]{"exit", exitCaption} );
617 }
618
619 _select.setButtonStyle( _titleStyle );
620
621 Integer span = (Integer)resources.getResource( ResourceIDs.TITLE_MENU_SPAN_COLUMN );
622 if( span == null ) {
623 Logger.warn( MessageIDs.CVS3004W, new Object[]{"5"} );
624 _select.setColumnSpan( 5 );
625 }
626 else {
627 _select.setColumnSpan( span.intValue() );
628 }
629
630 span = (Integer)resources.getResource( ResourceIDs.TITLE_MENU_SPAN_ROW );
631 if( span == null ) {
632 Logger.warn( MessageIDs.CVS3005W, new Object[]{"5"} );
633 _select.setRowSpan( 5 );
634 }
635 else {
636 _select.setRowSpan( span.intValue() );
637 }
638
639 span = (Integer)resources.getResource( ResourceIDs.TITLE_MENU_SPAN_BOUND );
640 if( span == null ) {
641 Logger.warn( MessageIDs.CVS3007W, new Object[]{"20"} );
642 _select.setBoundSpan( 20 );
643 }
644 else {
645 _select.setBoundSpan( span.intValue() );
646 }
647
648
649 List items = new java.util.ArrayList( 3 );
650 SelectItem item = new SelectItem();
651 item.setID( "start" );
652 item.setText( startCaption );
653 items.add( item );
654 item = new SelectItem();
655 item.setID( "resume" );
656 item.setText( resumeCaption );
657 items.add( item );
658 item = new SelectItem();
659 item.setID( "exit" );
660 item.setText( exitCaption );
661 items.add( item );
662
663 if( showTitle ) {
664 String imageName = (String)resources.getResource( ResourceIDs.TITLE_IMAGE );
665 if( (imageName != null) && (imageName.length() > 0) ) {
666 _stage.getStage().setBackgroundImage( imageName );
667 }
668 else {
669 _stage.getStage().setBackgroundColor( "white" );
670 }
671 _stage.updateCanvas( "mofing" );
672
673 String bgmName = (String)resources.getResource( ResourceIDs.OPENING_BGM, true );
674 if( (bgmName != null) && (bgmName.length() > 0) ) {
675 Logger.debug( "playBGM: " + bgmName );
676 _stage.getStage().getAudioPlayer().playBGM( "opening", bgmName, true );
677 }
678 }
679
680 hideTextCanvas();
681
682 _selecting = true;
683 _select.setVisible( true );
684 String id = _select.select( items );
685 _select.setVisible( false );
686 _selecting = false;
687
688 return id;
689 }
690
691
692 /***
693 * テキストキャンバスを隠します。
694 */
695 public void hideTextCanvas()
696 {
697 _text.setVisible( false );
698 _stage.paintPageBackground( false );
699 }
700
701 /***
702 * テキストキャンバスを表示します。
703 */
704 public void showTextCanvas()
705 {
706 _stage.paintPageBackground( true );
707 _text.setVisible( true );
708 }
709
710
711 /***
712 * キャンバスを全てクリアし、初期状態に戻します。
713 */
714 public synchronized void clearAll()
715 {
716 Logger.debug( "[canvas] clear All." );
717 _select.setVisible( false );
718 hideTextCanvas();
719
720 _select.cancel();
721 _stage.getStage().getAudioPlayer().stopAll();
722 advancesNewPage();
723 _text.getPage().commit();
724 _history.clear();
725 Stage stage = _stage.getStage();
726 stage.exitAll();
727 stage.setBackgroundColor( "black" );
728 stage.hideSlide();
729 _stage.updateCanvas( "mofing" );
730 stage.commit();
731 }
732
733
734 /***
735 * <code>serializableForm</code> に格納された状態を復元します。
736 * @param session 状態を格納したオブジェクト
737 */
738 public void resume( Session session )
739 {
740 Stage stage = _stage.getStage();
741 stage.setBackgroundColor( "black" );
742 stage.updateCanvas( "mofing" );
743 _stage.setVisible( false );
744
745 try {
746 SerializableForm form = (SerializableForm)session.getSessionAttribute( "canvasManager" );
747 _text.setPage( form.page );
748 _stage.setStage( form.stage );
749 form.stage.prepare();
750 form.page.rollback();
751 }
752 catch( Throwable th ) {
753 Logger.fatal( "[canvas] unsupported serializable form.", th );
754 }
755
756 _stage.setVisible( true );
757 _stage.getStage().getAudioPlayer().prepare();
758 }
759
760 /***
761 * 状態保存用のオブジェクトを取得します。
762 * @return 状態を格納したオブジェクト
763 */
764 public void saveState( Session session )
765 {
766 SerializableForm serializable = new SerializableForm();
767 serializable.page = _text.getPage();
768 serializable.stage = _stage.getStage();
769 session.setSessionAttribute( "canvasManager", serializable );
770 }
771
772
773
774 /***
775 * Canvas の状態を保持します。
776 */
777 public static class SerializableForm implements Serializable {
778
779 /***
780 * serial version UID
781 */
782 private static final long serialVersionUID = 7595927208130407689L;
783
784 /***
785 * Stage
786 */
787 public Stage stage = null;
788
789 /***
790 * Page
791 */
792 public Page page = null;
793 }
794 }