View Javadoc

1   /*
2    * To change this template, choose Tools | Templates
3    * and open the template in the editor.
4    */
5   
6   package cz.cuni.amis.pogamut.udk.t3dgenerator.elements.kismet;
7   
8   import cz.cuni.amis.pogamut.unreal.t3dgenerator.annotations.FieldName;
9   import cz.cuni.amis.pogamut.udk.t3dgenerator.datatypes.KismetInputLink;
10  import cz.cuni.amis.pogamut.udk.t3dgenerator.datatypes.KismetLinkTarget;
11  import cz.cuni.amis.pogamut.udk.t3dgenerator.datatypes.KismetOutputLink;
12  import cz.cuni.amis.pogamut.udk.t3dgenerator.datatypes.KismetVariableLink;
13  import cz.cuni.amis.pogamut.unreal.t3dgenerator.datatypes.UnrealReference;
14  import cz.cuni.amis.pogamut.udk.t3dgenerator.elements.AbstractObject;
15  import java.util.ArrayList;
16  import java.util.HashMap;
17  import java.util.List;
18  import java.util.Map;
19  
20  /**
21   * Abstract predecessor for all objects that are part of Kismet.
22   * Declares utitlity methods for handling input, output and variable links.
23   * The object must be initialized with link names in correct order (internally, the links
24   * are referenced by number solely).
25   * @author Martin Cerny
26   */
27  public abstract class AbstractKismetObject extends AbstractObject {
28  
29      private transient Map<String, Integer> inputLinksMapping = new HashMap<String, Integer>();
30      private transient Map<String, Integer> outputLinksMapping = new HashMap<String, Integer>();
31      private transient Map<String, Integer> variableLinksMapping = new HashMap<String, Integer>();
32      
33      private List<KismetInputLink> inputLinks;
34      private List<KismetOutputLink> outputLinks;
35      private List<KismetVariableLink> variableLinks;
36  
37      private Sequence parentSequence;
38      
39      @FieldName("ObjInstanceVersion")
40      private Integer instanceVersion = 1;
41  
42      private String objComment;
43      private Boolean outputObjCommentToScreen;
44      private Boolean suppressAutoComment;
45      
46      /**
47       * The location of the object for GUI
48       */
49      private Integer objPosX;
50      private Integer objPosY;
51      
52      public AbstractKismetObject(String className, String archetypeName, String[] inputLinkNames, String[] outputLinkNames, String[] variableLinkNames) {
53          super(className,archetypeName);
54          init(inputLinkNames, outputLinkNames, variableLinkNames);
55      }
56  
57      public AbstractKismetObject(String className, UnrealReference archetype, String[] inputLinkNames, String[] outputLinkNames, String[] variableLinkNames) {
58          super(className, archetype);
59          init(inputLinkNames, outputLinkNames, variableLinkNames);
60      }
61  
62      private void init(String[] inputLinkNames, String[] outputLinkNames,String[] variableLinkNames) {
63  
64          inputLinks = new ArrayList<KismetInputLink>(inputLinkNames.length);
65          for(int i = 0; i < inputLinkNames.length; i++){
66              inputLinks.add(new KismetInputLink(null));
67              addInputLinkMapping(inputLinkNames[i], i);
68          }
69          outputLinks = new ArrayList<KismetOutputLink>(outputLinkNames.length);
70          for(int i = 0; i < outputLinkNames.length; i++){
71              outputLinks.add(new KismetOutputLink(new ArrayList<KismetLinkTarget>()));
72              addOutputLinkMapping(outputLinkNames[i], i);
73          }
74          variableLinks = new ArrayList<KismetVariableLink>(variableLinkNames.length);
75          for(int i = 0; i < variableLinkNames.length; i++){
76              variableLinks.add(new KismetVariableLink(new ArrayList<UnrealReference>()));
77              addVariableLinkMapping(variableLinkNames[i], i);
78          }
79      }
80  
81      private void addInputLinkMapping(String linkName, int linkIndex){
82          if(linkIndex >= inputLinks.size()){
83              throw new IndexOutOfBoundsException("Link " + linkIndex + " not found");
84          }
85          inputLinksMapping.put(linkName, linkIndex);
86      }
87  
88      private void addOutputLinkMapping(String linkName, int linkIndex){
89          if(linkIndex >= outputLinks.size()){
90              throw new IndexOutOfBoundsException("Link " + linkIndex + " not found");
91          }
92          outputLinksMapping.put(linkName, linkIndex);
93      }
94      
95      private void addVariableLinkMapping(String linkName, int linkIndex){
96          if(linkIndex >= variableLinks.size()){
97              throw new IndexOutOfBoundsException("Link " + linkIndex + " not found");
98          }
99          variableLinksMapping.put(linkName, linkIndex);
100     }
101 
102     /**
103      * Adds a variable link with first avaliable index and given name.
104      * @param name
105      */
106     protected void addVariableLink(String name){
107         int linkIndex = variableLinks.size();
108         variableLinks.add(new KismetVariableLink(new ArrayList<UnrealReference>()));
109         addVariableLinkMapping(name, linkIndex);
110     }
111 
112     public void setInputLinkMappingByNamesList(String[] linkNames){
113         for(int i = 0; i < linkNames.length; i++){
114             addInputLinkMapping(linkNames[i], i);
115         }
116     }
117 
118     public void setOutputLinkMappingByNamesList(String[] linkNames){
119         for(int i = 0; i < linkNames.length; i++){
120             addOutputLinkMapping(linkNames[i], i);
121         }
122     }
123 
124     public void setVariableLinkMappingByNamesList(String[] linkNames){
125         for(int i = 0; i < linkNames.length; i++){
126             addVariableLinkMapping(linkNames[i], i);
127         }
128     }
129 
130     public void setInputLink(String linkName, KismetInputLink link){
131         if(link == null){
132             throw new NullPointerException("Link cannot be set to null");
133         }
134         Integer linkIndex = inputLinksMapping.get(linkName);
135         if(linkIndex == null){
136             throw new IllegalArgumentException("Mapping for input link '" + linkName + "' not found.");
137         }
138         inputLinks.set(linkIndex,link);
139     }
140 
141     public int getInputLinkIndex(String linkName){
142         return inputLinksMapping.get(linkName);
143     }
144 
145     public KismetInputLink getInputLink(String linkName){
146         Integer linkIndex = inputLinksMapping.get(linkName);
147         if(linkIndex == null){
148             throw new IllegalArgumentException("Mapping for input link '" + linkName + "' not found.");
149         }
150         return inputLinks.get(linkIndex);
151     }
152     
153     public void setIntputLinkTarget(String linkName, UnrealReference target){
154         getInputLink(linkName).setTarget(target);
155     }
156 
157     public void setOutputLink(String linkName, KismetOutputLink link){
158         if(link == null){
159             throw new NullPointerException("Link cannot be set to null");
160         }
161         Integer linkIndex = outputLinksMapping.get(linkName);
162         if(linkIndex == null){
163             throw new IllegalArgumentException("Mapping for output link '" + linkName + "' not found.");
164         }
165         outputLinks.set(linkIndex,link);
166     }
167 
168     public KismetOutputLink getOutputLink(String linkName){
169         Integer linkIndex = outputLinksMapping.get(linkName);
170         if(linkIndex == null){
171             throw new IllegalArgumentException("Mapping for output link '" + linkName + "' not found.");
172         }
173         return outputLinks.get(linkIndex);
174     }
175 
176     /**
177      * Adds a target to specified output link
178      * @param linkName
179      * @param target 
180      */
181     public void addOutputLinkTarget(String linkName,KismetLinkTarget target){
182         getOutputLink(linkName).addLink(target);
183     }
184 
185     /**
186      * Sets a variable link, clearing all previous state.
187      * @param linkName
188      * @param link 
189      */
190     public void setVariableLink(String linkName, KismetVariableLink link){
191         if(link == null){
192             throw new NullPointerException("Link cannot be set to null");
193         }
194         Integer linkIndex = variableLinksMapping.get(linkName);
195         if(linkIndex == null){
196             throw new IllegalArgumentException("Mapping for variable link '" + linkName + "' not found.");
197         }
198         variableLinks.set(linkIndex,link);
199     }
200 
201     public void addVariableLinkTarget(String linkName, UnrealReference target){
202         getVariableLink(linkName).addLinkedVariable(target);
203     }
204 
205     public KismetVariableLink getVariableLink(String linkName){
206         Integer linkIndex = variableLinksMapping.get(linkName);
207         if(linkIndex == null){
208             throw new IllegalArgumentException("Mapping for variable link '" + linkName + "' not found.");
209         }
210         return variableLinks.get(linkIndex);
211     }
212 
213     public Integer getInstanceVersion() {
214         return instanceVersion;
215     }
216 
217     public void setInstanceVersion(Integer instanceVersion) {
218         this.instanceVersion = instanceVersion;
219     }
220 
221     public String getObjComment() {
222         return objComment;
223     }
224 
225     public void setObjComment(String objComment) {
226         this.objComment = objComment;
227     }
228 
229     public Integer getObjPosX() {
230         return objPosX;
231     }
232 
233     public void setObjPosX(Integer objPosX) {
234         this.objPosX = objPosX;
235     }
236 
237     public Integer getObjPosY() {
238         return objPosY;
239     }
240 
241     public void setObjPosY(Integer objPosY) {
242         this.objPosY = objPosY;
243     }
244 
245     public Boolean getOutputObjCommentToScreen() {
246         return outputObjCommentToScreen;
247     }
248 
249     public void setOutputObjCommentToScreen(Boolean outputObjCommentToScreen) {
250         this.outputObjCommentToScreen = outputObjCommentToScreen;
251     }
252 
253     public Sequence getParentSequence() {
254         return parentSequence;
255     }
256 
257     public void setParentSequence(Sequence parentSequence) {
258         this.parentSequence = parentSequence;
259     }
260 
261     public Boolean getSuppressAutoComment() {
262         return suppressAutoComment;
263     }
264 
265     public void setSuppressAutoComment(Boolean suppressAutoComment) {
266         this.suppressAutoComment = suppressAutoComment;
267     }
268 
269     public List<KismetInputLink> getInputLinks() {
270         return inputLinks;
271     }
272 
273     public List<KismetOutputLink> getOutputLinks() {
274         return outputLinks;
275     }
276 
277     public List<KismetVariableLink> getVariableLinks() {
278         return variableLinks;
279     }
280 
281 
282     
283     
284     public void setPositionForGUI(int x, int y){
285         setObjPosX(x);
286         setObjPosY(y);
287     }
288     
289 }