fiore@3
|
1 /*
|
fiore@3
|
2 CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool
|
fiore@3
|
3
|
fiore@3
|
4 Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/)
|
fiore@3
|
5
|
fiore@3
|
6 This program is free software: you can redistribute it and/or modify
|
fiore@3
|
7 it under the terms of the GNU General Public License as published by
|
fiore@3
|
8 the Free Software Foundation, either version 3 of the License, or
|
fiore@3
|
9 (at your option) any later version.
|
fiore@3
|
10
|
fiore@3
|
11 This program is distributed in the hope that it will be useful,
|
fiore@3
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
fiore@3
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
fiore@3
|
14 GNU General Public License for more details.
|
fiore@3
|
15
|
fiore@3
|
16 You should have received a copy of the GNU General Public License
|
fiore@3
|
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
|
fiore@3
|
18 */
|
fiore@3
|
19 package uk.ac.qmul.eecs.ccmi.gui;
|
fiore@3
|
20
|
fiore@3
|
21 import java.text.MessageFormat;
|
fiore@3
|
22 import java.util.ResourceBundle;
|
fiore@3
|
23
|
fiore@3
|
24 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionEvent;
|
fiore@3
|
25 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionListener;
|
fiore@3
|
26 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramElement;
|
fiore@3
|
27 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramTreeNodeListener;
|
fiore@3
|
28 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramTreeNodeEvent;
|
fiore@3
|
29 import uk.ac.qmul.eecs.ccmi.diagrammodel.ElementChangedEvent;
|
fiore@3
|
30 import uk.ac.qmul.eecs.ccmi.diagrammodel.ElementChangedEvent.PropertyChangeArgs;
|
fiore@3
|
31 import uk.ac.qmul.eecs.ccmi.sound.PlayerListener;
|
fiore@3
|
32 import uk.ac.qmul.eecs.ccmi.sound.SoundEvent;
|
fiore@3
|
33 import uk.ac.qmul.eecs.ccmi.sound.SoundFactory;
|
fiore@3
|
34 import uk.ac.qmul.eecs.ccmi.speech.NarratorFactory;
|
fiore@3
|
35
|
fiore@3
|
36 /**
|
fiore@3
|
37 * This class is a listener providing audio (speech + sound) feedback to changes on the
|
fiore@3
|
38 * model (e.g. node added, node removed, node name changed etc.) operated only on the local (so not from
|
fiore@3
|
39 * a tree of another user sharing the same diagram)
|
fiore@3
|
40 * tree it is linked to. If the source of the events is different from the local tree , then no action
|
fiore@3
|
41 * is performed.
|
fiore@3
|
42 */
|
fiore@3
|
43 public class AudioFeedback implements CollectionListener, DiagramTreeNodeListener {
|
fiore@3
|
44
|
fiore@3
|
45 /**
|
fiore@3
|
46 * Construct an {@code AudioFeedback} object linked to a {@code DiagramTree}.
|
fiore@3
|
47 *
|
fiore@3
|
48 * @param tree the tree this instance is going to be linked to
|
fiore@3
|
49 */
|
fiore@3
|
50 AudioFeedback(DiagramTree tree){
|
fiore@3
|
51 resources = ResourceBundle.getBundle(EditorFrame.class.getName());
|
fiore@3
|
52 this.tree = tree;
|
fiore@3
|
53 }
|
fiore@3
|
54
|
fiore@3
|
55 @Override
|
fiore@3
|
56 public void elementInserted(CollectionEvent e) {
|
fiore@3
|
57 DiagramEventSource source = (DiagramEventSource)e.getSource();
|
fiore@3
|
58 if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){
|
fiore@3
|
59 final DiagramElement diagramElement = e.getDiagramElement();
|
fiore@3
|
60 boolean isNode = diagramElement instanceof Node;
|
fiore@3
|
61 if(isNode){
|
fiore@3
|
62 SoundFactory.getInstance().play( SoundEvent.OK ,new PlayerListener(){
|
fiore@3
|
63 @Override
|
fiore@3
|
64 public void playEnded() {
|
fiore@3
|
65 NarratorFactory.getInstance().speak(MessageFormat.format(resources.getString("speech.input.node.ack"),diagramElement.spokenText()));
|
fiore@3
|
66 }
|
fiore@3
|
67 });
|
fiore@3
|
68 }else{
|
fiore@3
|
69 Edge edge = (Edge)diagramElement;
|
fiore@3
|
70 final StringBuilder builder = new StringBuilder();
|
fiore@3
|
71 for(int i=0; i<edge.getNodesNum();i++){
|
fiore@3
|
72 if(i == edge.getNodesNum()-1)
|
fiore@3
|
73 builder.append(edge.getNodeAt(i)+resources.getString("speech.input.edge.ack"));
|
fiore@3
|
74 else
|
fiore@3
|
75 builder.append(edge.getNodeAt(i)+ resources.getString("speech.input.edge.ack2"));
|
fiore@3
|
76 }
|
fiore@3
|
77 SoundFactory.getInstance().play( SoundEvent.OK, new PlayerListener(){
|
fiore@3
|
78 @Override
|
fiore@3
|
79 public void playEnded() {
|
fiore@3
|
80 NarratorFactory.getInstance().speak(builder.toString());
|
fiore@3
|
81 }
|
fiore@3
|
82 });
|
fiore@3
|
83 }
|
fiore@3
|
84 }
|
fiore@3
|
85 }
|
fiore@3
|
86
|
fiore@3
|
87 @Override
|
fiore@3
|
88 public void elementTakenOut(CollectionEvent e) {
|
fiore@3
|
89 DiagramEventSource source = (DiagramEventSource)e.getSource();
|
fiore@3
|
90 if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){
|
fiore@3
|
91 final DiagramElement element = e.getDiagramElement();
|
fiore@3
|
92 SoundFactory.getInstance().play(SoundEvent.OK, new PlayerListener(){
|
fiore@3
|
93 @Override
|
fiore@3
|
94 public void playEnded() {
|
fiore@3
|
95 NarratorFactory.getInstance().speak(MessageFormat.format(resources.getString("speech.delete.element.ack"),element.spokenText(),tree.currentPathSpeech()));
|
fiore@3
|
96 }
|
fiore@3
|
97 });
|
fiore@3
|
98 }
|
fiore@3
|
99 }
|
fiore@3
|
100
|
fiore@3
|
101 @Override
|
fiore@3
|
102 public void elementChanged(ElementChangedEvent e) {
|
fiore@3
|
103 DiagramEventSource source = (DiagramEventSource)e.getSource();
|
fiore@3
|
104 if(!source.isLocal() || source.type != DiagramEventSource.Type.TREE)
|
fiore@3
|
105 return;
|
fiore@3
|
106 String change = e.getChangeType();
|
fiore@3
|
107 if("name".equals(change)){
|
fiore@3
|
108 playOK(tree.currentPathSpeech());
|
fiore@3
|
109 }else if ("property.add".equals(change)){
|
fiore@3
|
110 PropertyChangeArgs args = (PropertyChangeArgs)e.getArguments();
|
fiore@3
|
111 String propertyValue = ((Node)e.getDiagramElement()).getProperties().getValues(args.getPropertyType()).get(args.getPropertyIndex());
|
fiore@3
|
112 playOK(MessageFormat.format(resources.getString("speech.input.property.ack"),propertyValue));
|
fiore@3
|
113 }else if("property.set".equals(change)){
|
fiore@3
|
114 playOK(tree.currentPathSpeech());
|
fiore@3
|
115 }else if("property.remove".equals(change)){
|
fiore@3
|
116 PropertyChangeArgs args = (PropertyChangeArgs)e.getArguments();
|
fiore@3
|
117 playOK(MessageFormat.format(resources.getString("speech.deleted.property.ack"),args.getOldValue(),tree.currentPathSpeech()));
|
fiore@3
|
118 }else if("property.modifiers".equals(change)){
|
fiore@3
|
119 playOK(tree.currentPathSpeech());
|
fiore@3
|
120 }else if("arrowHead".equals(change)||"endLabel".equals(change)){
|
fiore@3
|
121 playOK(tree.currentPathSpeech());
|
fiore@3
|
122 }
|
fiore@3
|
123 }
|
fiore@3
|
124
|
fiore@3
|
125 @Override
|
fiore@3
|
126 public void bookmarkAdded(DiagramTreeNodeEvent evt) {
|
fiore@3
|
127 DiagramEventSource source = (DiagramEventSource)evt.getSource();
|
fiore@3
|
128 if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){
|
fiore@3
|
129 playOK(tree.currentPathSpeech());
|
fiore@3
|
130 }
|
fiore@3
|
131 }
|
fiore@3
|
132
|
fiore@3
|
133 @Override
|
fiore@3
|
134 public void bookmarkRemoved(DiagramTreeNodeEvent evt) {
|
fiore@3
|
135 DiagramEventSource source = (DiagramEventSource)evt.getSource();
|
fiore@3
|
136 if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){
|
fiore@3
|
137 playOK(MessageFormat.format(
|
fiore@3
|
138 resources.getString("speech.delete.bookmark.ack"),
|
fiore@3
|
139 evt.getValue(),
|
fiore@3
|
140 tree.currentPathSpeech()));
|
fiore@3
|
141 }
|
fiore@3
|
142 }
|
fiore@3
|
143
|
fiore@3
|
144 @Override
|
fiore@3
|
145 public void notesChanged(DiagramTreeNodeEvent evt) {
|
fiore@3
|
146 DiagramEventSource source = (DiagramEventSource)evt.getSource();
|
fiore@3
|
147 if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){
|
fiore@3
|
148 playOK(tree.currentPathSpeech());
|
fiore@3
|
149 }
|
fiore@3
|
150 }
|
fiore@3
|
151
|
fiore@3
|
152 private void playOK(final String speech){
|
fiore@3
|
153 SoundFactory.getInstance().play(SoundEvent.OK, new PlayerListener(){
|
fiore@3
|
154 @Override
|
fiore@3
|
155 public void playEnded() {
|
fiore@3
|
156 NarratorFactory.getInstance().speak(speech);
|
fiore@3
|
157 }
|
fiore@3
|
158 });
|
fiore@3
|
159 }
|
fiore@3
|
160
|
fiore@3
|
161 private ResourceBundle resources;
|
fiore@3
|
162 private DiagramTree tree;
|
fiore@3
|
163 }
|