OSDN Git Service

SAX対応
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / model / xml / SaxMorphListener.java
1 /*
2  * morph listener from XML
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd.model.xml;
9
10 import java.util.LinkedList;
11 import java.util.List;
12 import java.util.Map;
13 import jp.sfjp.mikutoga.corelib.I18nText;
14 import jp.sfjp.mikutoga.math.MkPos3D;
15 import jp.sfjp.mikutoga.pmd.MorphType;
16 import jp.sfjp.mikutoga.pmd.model.ListUtil;
17 import jp.sfjp.mikutoga.pmd.model.MorphPart;
18 import jp.sfjp.mikutoga.pmd.model.MorphVertex;
19
20 /*
21     + morphList
22         + morph
23             + i18nName
24             + morphVertex
25 */
26
27 /**
28  * モーフ関連のXML要素出現イベントを受信する。
29  */
30 class SaxMorphListener extends SaxListener{
31
32     private final RefHelper helper;
33
34     private MorphPart currentMorph = null;
35
36
37     /**
38      * コンストラクタ。
39      * @param helper 参照ヘルパ
40      */
41     SaxMorphListener(RefHelper helper) {
42         super();
43         this.helper = helper;
44         return;
45     }
46
47
48     /**
49      * morphListタグ終了の通知を受け取る。
50      * 各モーフは0番ではなく1番から採番される。
51      * 0番は暗黙のBASEモーフ。
52      */
53     @CloseXmlMark(PmdTag.MORPH_LIST)
54     void closeMorphList(){
55         Map<MorphType, List<MorphPart>> morphMap =
56                 getPmdModel().getMorphMap();
57         List<MorphPart> tempList = new LinkedList<MorphPart>();
58
59         tempList.addAll(morphMap.get(MorphType.EYEBROW));
60         tempList.addAll(morphMap.get(MorphType.EYE));
61         tempList.addAll(morphMap.get(MorphType.LIP));
62         tempList.addAll(morphMap.get(MorphType.EXTRA));
63
64         MorphPart baseDummy = new MorphPart();
65         tempList.add(0, baseDummy);  // BASE dummy
66
67         ListUtil.assignIndexedSerial(tempList);
68
69         return;
70     }
71
72     /**
73      * morphタグ開始の通知を受け取る。
74      */
75     @OpenXmlMark(PmdTag.MORPH)
76     void openMorph(){
77         this.currentMorph = new MorphPart();
78
79         String name = getStringAttr(PmdAttr.NAME);
80         I18nText morphName = this.currentMorph.getMorphName();
81         morphName.setPrimaryText(name);
82
83         String type = getStringAttr(PmdAttr.TYPE);
84         MorphType morphType = MorphType.valueOf(type);
85         this.currentMorph.setMorphType(morphType);
86
87         return;
88     }
89
90     /**
91      * morphタグ終了の通知を受け取る。
92      */
93     @CloseXmlMark(PmdTag.MORPH)
94     void closeMorph(){
95         Map<MorphType, List<MorphPart>> morphMap =
96                 getPmdModel().getMorphMap();
97
98         MorphType morphType = this.currentMorph.getMorphType();
99         List<MorphPart> morphList = morphMap.get(morphType);
100         morphList.add(this.currentMorph);
101
102         this.currentMorph = null;
103
104         return;
105     }
106
107     /**
108      * i18nTextタグ開始の通知を受け取る。
109      */
110     @OpenXmlMark(PmdTag.I18N_NAME)
111     void openI18nText(){
112         String lang = getStringAttr(PmdAttr.LANG);
113         String name = getStringAttr(PmdAttr.NAME);
114
115         I18nText morphName = this.currentMorph.getMorphName();
116         morphName.setI18nText(lang, name);
117
118         return;
119     }
120
121     /**
122      * morphVertexタグ開始の通知を受け取る。
123      */
124     @OpenXmlMark(PmdTag.MORPH_VERTEX)
125     void openMorphVertex(){
126         MorphVertex morphVertex = new MorphVertex();
127
128         String vertexIdRef = getStringAttr(PmdAttr.VERTEX_IDREF);
129         this.helper.addMorphVertexIdRef(morphVertex, vertexIdRef);
130
131         float xOff = getFloatAttr(PmdAttr.XOFF);
132         float yOff = getFloatAttr(PmdAttr.YOFF);
133         float zOff = getFloatAttr(PmdAttr.ZOFF);
134         MkPos3D offset = morphVertex.getOffset();
135         offset.setPosition(xOff, yOff, zOff);
136
137         List<MorphVertex> morphVertexList =
138                 this.currentMorph.getMorphVertexList();
139         morphVertexList.add(morphVertex);
140
141         return;
142     }
143
144 }