Coverage report

  %line %branch
tsukuba_bunko.peko.scenario.text.TextCoordinator
0% 
0% 

 1  
 /*
 2  
  * "Peko" Visual Novel System
 3  
  *
 4  
  * All Rights Reserved.
 5  
  * Copyright (c) 1999-2003 Tsukuba Bunko.
 6  
  *
 7  
  * $Id: TextCoordinator.java,v 1.2 2005/07/11 14:27:50 ppoi Exp $
 8  
  */
 9  
 package tsukuba_bunko.peko.scenario.text;
 10  
 
 11  
 import	java.awt.Dimension;
 12  
 
 13  
 import	java.awt.font.LineBreakMeasurer;
 14  
 import	java.awt.font.TextAttribute;
 15  
 import	java.awt.font.TextLayout;
 16  
 
 17  
 import	java.text.AttributedString;
 18  
 
 19  
 import	tsukuba_bunko.peko.Logger;
 20  
 
 21  
 import	tsukuba_bunko.peko.canvas.text.Line;
 22  
 import	tsukuba_bunko.peko.canvas.text.Page;
 23  
 
 24  
 import	tsukuba_bunko.peko.resource.ResourceManager;
 25  
 
 26  
 import	tsukuba_bunko.peko.scenario.Coordinator;
 27  
 import	tsukuba_bunko.peko.scenario.SceneContext;
 28  
 
 29  
 
 30  
 /**
 31  
  * TextCanvas への操作を取り持つコーディネータモジュールです。
 32  
  * @author	$Author: ppoi $
 33  
  * @version	$Revision: 1.2 $
 34  
  */
 35  
 public class TextCoordinator	extends Coordinator	{
 36  
 
 37  
 	/**
 38  
 	 * Page の設定を行ったかどうか
 39  
 	 */
 40  0
 	protected boolean	_pageConfigured = false;
 41  
 
 42  
 	/**
 43  
 	 * 行間隔
 44  
 	 */
 45  0
 	protected float	_lineSpan = 0f;
 46  
 
 47  
 	/**
 48  
 	 * 最終行
 49  
 	 */
 50  0
 	protected Line	_lastLine = null;
 51  
 
 52  
 
 53  
 	/**
 54  
 	 * Dimension cache
 55  
 	 */
 56  0
 	protected Dimension	_sizeCache = new Dimension();
 57  
 
 58  
 
 59  
 	/**
 60  
 	 * <code>TextCoordinator</code> のインスタンスを生成します。
 61  
 	 */
 62  
 	public TextCoordinator()
 63  
 	{
 64  0
 		super();
 65  0
 	}
 66  
 
 67  
 
 68  
 	public void prepare( SceneContext context, Thread activeThread )
 69  
 	{
 70  0
 		super.prepare( context, activeThread );
 71  0
 		_pageConfigured = false;
 72  0
 		_lastLine = null;
 73  0
 	}
 74  
 
 75  
 
 76  
 	/**
 77  
 	 * TextCanvas への操作を開始します。
 78  
 	 */
 79  
 	public void begin()
 80  
 	{
 81  0
 		if( isActiveThread() )	{
 82  0
 			_lastLine = null;
 83  0
 			getActionControler().setSaveEnabled( true );
 84  
 		}
 85  0
 	}
 86  
 
 87  
 	/**
 88  
 	 * TextCanvas への操作を終了し、キャンバスの状態を確定します。
 89  
 	 */
 90  
 	public void commit()
 91  
 	{
 92  0
 		if( isActiveThread() )	{
 93  0
 			getActionControler().setSaveEnabled( false );
 94  0
 			getCurrentPage().commit();
 95  
 		}
 96  0
 	}
 97  
 
 98  
 	/**
 99  
 	 * 表示する文章を TextCanvsa に送信します。
 100  
 	 * @param	text	表示する文章
 101  
 	 */
 102  
 	public void pushText( String text )
 103  
 	{
 104  0
 		if( !isActiveThread() )	{
 105  0
 			return;
 106  
 		}
 107  
 
 108  0
 		Page	page = getCurrentPage();
 109  0
 		if( !_pageConfigured )	{
 110  0
 			PageConfigurator.configure( page, getSceneContext() );
 111  0
 			_pageConfigured = true;
 112  0
 			_lineSpan = getLineSpan();
 113  
 		}
 114  
 
 115  0
 		int	length = text.length();
 116  0
 		if( length == 0 )	{
 117  0
 			Logger.debug( "[scnario.text] empty string is pecified." );
 118  0
 			return;
 119  
 		}
 120  
 
 121  0
 		if( _lastLine != null )	{
 122  0
 			text = _lastLine.getText() + text;
 123  0
 			length = text.length();
 124  
 		}
 125  0
 		Logger.debug( text );
 126  
 
 127  0
 		AttributedString	astring = new AttributedString( text );
 128  0
 		astring.addAttribute( TextAttribute.FONT, page.getDefaultFont() );
 129  0
 		astring.addAttribute( TextAttribute.FOREGROUND, page.getForeground() );
 130  
 
 131  0
 		LineBreakMeasurer	lbm = new LineBreakMeasurer( astring.getIterator(), page.getFontRenderContext() );
 132  0
 		float	maxWidth = page.getMaxLineWidth();
 133  0
 		float	lineSpan = _lineSpan;
 134  0
 		boolean	conflictWait = false;
 135  0
 		TextLayout	layout = null;
 136  0
 		Line	line = null;
 137  
 
 138  0
 		layout = lbm.nextLayout( maxWidth );
 139  0
 		line = new Line();
 140  0
 		line.setTextLayout( layout );
 141  0
 		line.setText( text.substring(0, lbm.getPosition()) );
 142  0
 		line.setForeground( page.getForeground() );
 143  0
 		line.setShadowColor( page.getShadow() );
 144  
 
 145  0
 		if( _lastLine == null )	{
 146  0
 			if( isActiveThread() )	{
 147  0
 				line.setLineSpan( lineSpan );	//	ホントはここで margin-top を設定するデス。
 148  0
 				if( !page.isAdaptive(line) )	{
 149  0
 					page = advancesNewPage();
 150  
 				}
 151  0
 				page.addLine( line );
 152  0
 			}
 153  
 			else	{
 154  0
 				return;
 155  
 			}
 156  
 		}
 157  
 		else	{
 158  0
 			line.setLineSpan( lineSpan );
 159  0
 			if( isActiveThread() )	{
 160  0
 				page.setLine( (page.getLineCount() - 1), line );
 161  0
 				if( _lastLine.getText().equals(line.getText()) )	{
 162  0
 					conflictWait = true;
 163  0
 				}
 164  
 			}
 165  
 			else	{
 166  0
 				return;
 167  
 			}
 168  
 		}
 169  0
 		_lastLine = line;
 170  
 
 171  0
 		int	lastLinePosition = 0;
 172  0
 		while( (lastLinePosition = lbm.getPosition()) < length )	{
 173  0
 			line = new Line();
 174  0
 			line.setTextLayout( lbm.nextLayout(maxWidth) );
 175  0
 			line.setLineSpan( lineSpan );
 176  0
 			line.setText( text.substring(lastLinePosition, lbm.getPosition()) );
 177  0
 			line.setForeground( page.getForeground() );
 178  0
 			line.setShadowColor( page.getShadow() );
 179  0
 			if( isActiveThread() )	{
 180  0
 				if( !page.isAdaptive(line) )	{
 181  0
 					if( conflictWait )	{
 182  0
 						conflictWait = false;
 183  0
 					}
 184  
 					else	{
 185  0
 						page.updateContents();
 186  0
 						stop();	//	ここー!
 187  
 					}
 188  0
 					page = advancesNewPage();
 189  
 				}
 190  0
 				if( page != null )	{
 191  0
 					page.addLine( line );
 192  0
 					conflictWait = false;
 193  0
 				}
 194  
 				else	{
 195  0
 					return;
 196  
 				}
 197  0
 				_lastLine = line;
 198  0
 			}
 199  
 			else	{
 200  0
 				return;
 201  
 			}
 202  
 		}
 203  0
 		if( isActiveThread() )	{
 204  0
 			page.updateContents();
 205  
 		}
 206  0
 	}
 207  
 
 208  
 	/**
 209  
 	 * 現在表示中のページを取得します。
 210  
 	 * @return	現在表示中のページ
 211  
 	 */
 212  
 	public Page getCurrentPage()
 213  
 	{
 214  0
 		return getCanvasManager().getCurrentPage();
 215  
 	}
 216  
 
 217  
 	/**
 218  
 	 * 新しいページに切り替え、新しいページを取得します。
 219  
 	 * @return	新しいページ
 220  
 	 */
 221  
 	public Page advancesNewPage()
 222  
 	{
 223  0
 		if( isActiveThread() )	{
 224  0
 			return getCanvasManager().advancesNewPage();
 225  
 		}
 226  
 		else	{
 227  0
 			return null;
 228  
 		}
 229  
 	}
 230  
 
 231  
 	/**
 232  
 	 * 処理を一時停止します。
 233  
 	 */
 234  
 	protected void stop()
 235  
 	{
 236  0
 		if( isActiveThread() )	{
 237  0
 			getActionControler().stop();
 238  
 		}
 239  0
 	}
 240  
 
 241  
 	/**
 242  
 	 * 行間隔を取得します。
 243  
 	 * @return	行間隔
 244  
 	 */
 245  
 	protected float getLineSpan()
 246  
 	{
 247  0
 		SceneContext	context = getSceneContext();
 248  0
 		String	value = context.getProperty( PropertyIDs.CANVAS_TEXT_LINESPAN );
 249  0
 		if( value != null )	{
 250  
 			try	{
 251  0
 				return Float.parseFloat( value );
 252  
 			}
 253  0
 			catch( Exception e )	{
 254  0
 				Logger.warn( MessageIDs.SCN2002W, e );
 255  
 			}
 256  
 		}
 257  
 
 258  0
 		ResourceManager	resources = ResourceManager.getInstance();
 259  0
 		Float	lineSpan = (Float)resources.getResource( ResourceIDs.CANVAS_TEXT_LINESPAN );
 260  0
 		if( lineSpan != null )	{
 261  0
 			return lineSpan.floatValue();
 262  
 		}
 263  
 		else	{
 264  0
 			Logger.warn( MessageIDs.SCN2001W, new Object[]{"20.0"} );
 265  0
 			return 20f;
 266  
 		}
 267  
 	}
 268  
 }

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