View Javadoc

1   package cz.cuni.amis.pogamut.sposh.elements;
2   
3   import java.awt.datatransfer.DataFlavor;
4   import java.util.ArrayList;
5   import java.util.Collections;
6   import java.util.List;
7   
8   /**
9    * Triggers is a list of PoshSenses.
10   *
11   * If all sense of triggers are fulfilled, some action can
12   * be executed (in competence, drive ...)
13   *
14   * @author Honza
15   */
16  public class Triggers extends PoshDummyElement {
17  
18      private ElementList<Sense> _sense_list;
19  
20      /**
21       * Create a new Triggers with one sense.
22       *
23       * @param defaultTrigger
24       */
25      public Triggers(Sense defaultTrigger) {
26          _sense_list = new ElementList<Sense>();
27          this.addTrigger(defaultTrigger);
28      }
29  
30      /**
31       * Triggers can have an empty list of senses. Not sure what to do with it, but whatever
32       */
33      public Triggers() {
34          _sense_list = new ElementList<Sense>();
35      }
36  
37      public Triggers(ElementList<Sense> sense_list) {
38          _sense_list = new ElementList<Sense>();
39  
40          for (Sense sense : sense_list) {
41              addTrigger(sense);
42          }
43      }
44  
45      /**
46       * Add a trigger to the triggers (add, set parent, emit)
47       * @param trigger
48       */
49      public void addTrigger(Sense sense) {
50          sense.setParent(this);
51          _sense_list.add(sense);
52  
53          emitChildNode(sense);
54      }
55  
56      /**
57       * If there is only one sense in {@link Triggers} named either "fail" 
58       * or "succeed", replace it with passed sense.
59       * <p>
60       * Otherwise behave same as {Triggers.addTrigger()}.
61       * @param sense Sense to add to trigger
62       */
63      public void addUserTrigger(Sense sense) {
64          if (_sense_list.size() == 1 && ("succeed".equals(_sense_list.get(0).getSenseName()) || "fail".equals(_sense_list.get(0).getSenseName()))) {
65              _sense_list.get(0).changeTo(sense);
66          } else {
67              addTrigger(sense);
68          }
69      }
70  
71      @Override
72      public String toString() {
73          return _sense_list.toString();
74      }
75  
76      @Override
77      public List<PoshElement> getChildDataNodes() {
78          return new ArrayList<PoshElement>(_sense_list);
79      }
80  
81      @Override
82      public boolean moveChild(PoshElement child, int relativePosition) {
83          return moveNodeInList(this._sense_list, child, relativePosition);
84      }
85      public static final DataFlavor dataFlavor = new DataFlavor(Triggers.class, "triggers");
86  
87      @Override
88      public DataFlavor getDataFlavor() {
89          return dataFlavor;
90      }
91  
92      @Override
93      public void addChildDataNode(PoshElement newChild) {
94          if (newChild instanceof Sense) {
95              this.addTrigger((Sense) newChild);
96          } else {
97              throw new RuntimeException("Class " + newChild.getClass().getSimpleName() + " not accepted.");
98          }
99      }
100 
101     @Override
102     public void neutralizeChild(PoshElement childNode) {
103         if (this._sense_list.contains(childNode)) {
104             if (this._sense_list.size() <= 1) {
105                 this.addTrigger(new Sense("fail"));
106             }
107             this._sense_list.remove(childNode);
108             childNode.remove();
109         }
110     }
111 
112     /**
113      * Get unmodifiable list of senses in this trigger
114      */
115     public List<Sense> getSenses() {
116         return Collections.unmodifiableList(_sense_list);
117     }
118 }