annotate java/src/uk/ac/qmul/eecs/ccmi/gui/AudioFeedback.java @ 8:ea7885bd9bff tip

fixed bug : render solid line as dotted/dashed when moving the stylus from dotted/dashed to solid
author ccmi-guest
date Thu, 03 Jul 2014 16:12:20 +0100
parents 9e67171477bc
children
rev   line source
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 }