4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.binio;
10 import java.util.Iterator;
11 import java.util.List;
12 import jp.sfjp.mikutoga.bin.parser.ParseStage;
13 import jp.sfjp.mikutoga.pmd.model.BoneGroup;
14 import jp.sfjp.mikutoga.pmd.model.BoneInfo;
15 import jp.sfjp.mikutoga.pmd.model.MorphPart;
16 import jp.sfjp.mikutoga.pmd.model.PmdModel;
17 import jp.sfjp.mikutoga.pmd.parser.PmdBasicHandler;
18 import jp.sfjp.mikutoga.pmd.parser.PmdEngHandler;
21 * テキスト関係の通知をパーサから受け取る。
23 class TextBuilder implements PmdBasicHandler, PmdEngHandler {
25 private final PmdModel model;
27 private Iterator<BoneInfo> boneIt;
28 private BoneInfo currentBone = null;
30 private List<MorphPart> morphPartList;
31 private Iterator<MorphPart> morphPartIt;
32 private MorphPart currentMorphPart = null;
34 private Iterator<BoneGroup> boneGroupIt;
35 private BoneGroup currentBoneGroup = null;
37 private boolean hasMoreData = false;
43 TextBuilder(PmdModel model){
50 * PMDファイル中の出現順で各モーフを格納するためのリストを設定する。
51 * 主な用途はモーフ和英名の突き合わせ作業。
52 * @param list モーフ格納リスト
54 void setMorphPartList(List<MorphPart> list){
55 this.morphPartList = list;
63 public void pmdParseStart(){
69 * @param hasMoreDataArg {@inheritDoc}
72 public void pmdParseEnd(boolean hasMoreDataArg){
73 this.hasMoreData = hasMoreDataArg;
79 * @param stage {@inheritDoc}
80 * @param loops {@inheritDoc}
83 public void loopStart(ParseStage stage, int loops){
84 if(stage == PmdEngHandler.ENGBONE_LIST){
85 this.boneIt = this.model.getBoneList().iterator();
86 if(this.boneIt.hasNext()){
87 this.currentBone = this.boneIt.next();
89 }else if(stage == PmdEngHandler.ENGMORPH_LIST){
90 if(this.morphPartList.isEmpty()){
94 this.morphPartIt = this.morphPartList.iterator();
97 MorphPart part = this.morphPartIt.next();
100 if(this.morphPartIt.hasNext()){
101 this.currentMorphPart = this.morphPartIt.next();
103 }else if(stage == PmdEngHandler.ENGBONEGROUP_LIST){
104 this.boneGroupIt = this.model.getBoneGroupList().iterator();
106 // デフォルトボーングループを読み飛ばす
107 assert this.boneGroupIt.hasNext();
108 BoneGroup group = this.boneGroupIt.next();
109 assert group != null;
111 if(this.boneGroupIt.hasNext()){
112 this.currentBoneGroup = this.boneGroupIt.next();
116 throw new AssertionError();
123 * @param stage {@inheritDoc}
126 public void loopNext(ParseStage stage){
127 if(stage == PmdEngHandler.ENGBONE_LIST){
128 if(this.boneIt.hasNext()){
129 this.currentBone = this.boneIt.next();
131 }else if(stage == PmdEngHandler.ENGMORPH_LIST){
132 if(this.morphPartIt.hasNext()){
133 this.currentMorphPart = this.morphPartIt.next();
135 }else if(stage == PmdEngHandler.ENGBONEGROUP_LIST){
136 if(this.boneGroupIt.hasNext()){
137 this.currentBoneGroup = this.boneGroupIt.next();
141 throw new AssertionError();
148 * @param stage {@inheritDoc}
151 public void loopEnd(ParseStage stage){
157 * @param header {@inheritDoc}
160 public void pmdHeaderInfo(byte[] header){
166 * @param modelNameArg {@inheritDoc}
167 * @param descriptionArg {@inheritDoc}
170 public void pmdModelInfo(String modelNameArg, String descriptionArg){
171 this.model.getModelName() .setPrimaryText(modelNameArg);
172 this.model.getDescription().setPrimaryText(descriptionArg);
178 * @param hasEnglishInfo {@inheritDoc}
181 public void pmdEngEnabled(boolean hasEnglishInfo){
187 * @param modelNameArg {@inheritDoc}
188 * @param descriptionArg {@inheritDoc}
191 public void pmdEngModelInfo(String modelNameArg, String descriptionArg){
192 this.model.getModelName() .setGlobalText(modelNameArg);
193 this.model.getDescription().setGlobalText(descriptionArg);
199 * @param boneName {@inheritDoc}
202 public void pmdEngBoneInfo(String boneName){
203 this.currentBone.getBoneName().setGlobalText(boneName);
209 * @param morphName {@inheritDoc}
212 public void pmdEngMorphInfo(String morphName){
213 this.currentMorphPart.getMorphName().setGlobalText(morphName);
219 * @param groupName {@inheritDoc}
222 public void pmdEngBoneGroupInfo(String groupName){
223 this.currentBoneGroup.getGroupName().setGlobalText(groupName);
229 * @return 読み残したデータがあればtrue
231 public boolean hasMoreData(){
232 return this.hasMoreData;