Mercurial > hg > accesspd
diff java/src/uk/ac/qmul/eecs/ccmi/gui/AudioFeedback.java @ 0:78b7fc5391a2
first import, outcome of NIME 2014 hackaton
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Tue, 08 Jul 2014 16:28:59 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/src/uk/ac/qmul/eecs/ccmi/gui/AudioFeedback.java Tue Jul 08 16:28:59 2014 +0100 @@ -0,0 +1,163 @@ +/* + CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool + + Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +package uk.ac.qmul.eecs.ccmi.gui; + +import java.text.MessageFormat; +import java.util.ResourceBundle; + +import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionEvent; +import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionListener; +import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramElement; +import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramTreeNodeListener; +import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramTreeNodeEvent; +import uk.ac.qmul.eecs.ccmi.diagrammodel.ElementChangedEvent; +import uk.ac.qmul.eecs.ccmi.diagrammodel.ElementChangedEvent.PropertyChangeArgs; +import uk.ac.qmul.eecs.ccmi.sound.PlayerListener; +import uk.ac.qmul.eecs.ccmi.sound.SoundEvent; +import uk.ac.qmul.eecs.ccmi.sound.SoundFactory; +import uk.ac.qmul.eecs.ccmi.speech.NarratorFactory; + +/** + * This class is a listener providing audio (speech + sound) feedback to changes on the + * model (e.g. node added, node removed, node name changed etc.) operated only on the local (so not from + * a tree of another user sharing the same diagram) + * tree it is linked to. If the source of the events is different from the local tree , then no action + * is performed. + */ +public class AudioFeedback implements CollectionListener, DiagramTreeNodeListener { + + /** + * Construct an {@code AudioFeedback} object linked to a {@code DiagramTree}. + * + * @param tree the tree this instance is going to be linked to + */ + AudioFeedback(DiagramTree tree){ + resources = ResourceBundle.getBundle(EditorFrame.class.getName()); + this.tree = tree; + } + + @Override + public void elementInserted(CollectionEvent e) { + DiagramEventSource source = (DiagramEventSource)e.getSource(); + if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){ + final DiagramElement diagramElement = e.getDiagramElement(); + boolean isNode = diagramElement instanceof Node; + if(isNode){ + SoundFactory.getInstance().play( SoundEvent.OK ,new PlayerListener(){ + @Override + public void playEnded() { + NarratorFactory.getInstance().speak(MessageFormat.format(resources.getString("speech.input.node.ack"),diagramElement.spokenText())); + } + }); + }else{ + Edge edge = (Edge)diagramElement; + final StringBuilder builder = new StringBuilder(); + for(int i=0; i<edge.getNodesNum();i++){ + if(i == edge.getNodesNum()-1) + builder.append(edge.getNodeAt(i)+resources.getString("speech.input.edge.ack")); + else + builder.append(edge.getNodeAt(i)+ resources.getString("speech.input.edge.ack2")); + } + SoundFactory.getInstance().play( SoundEvent.OK, new PlayerListener(){ + @Override + public void playEnded() { + NarratorFactory.getInstance().speak(builder.toString()); + } + }); + } + } + } + + @Override + public void elementTakenOut(CollectionEvent e) { + DiagramEventSource source = (DiagramEventSource)e.getSource(); + if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){ + final DiagramElement element = e.getDiagramElement(); + SoundFactory.getInstance().play(SoundEvent.OK, new PlayerListener(){ + @Override + public void playEnded() { + NarratorFactory.getInstance().speak(MessageFormat.format(resources.getString("speech.delete.element.ack"),element.spokenText(),tree.currentPathSpeech())); + } + }); + } + } + + @Override + public void elementChanged(ElementChangedEvent e) { + DiagramEventSource source = (DiagramEventSource)e.getSource(); + if(!source.isLocal() || source.type != DiagramEventSource.Type.TREE) + return; + String change = e.getChangeType(); + if("name".equals(change)){ + playOK(tree.currentPathSpeech()); + }else if ("property.add".equals(change)){ + PropertyChangeArgs args = (PropertyChangeArgs)e.getArguments(); + String propertyValue = ((Node)e.getDiagramElement()).getProperties().getValues(args.getPropertyType()).get(args.getPropertyIndex()); + playOK(MessageFormat.format(resources.getString("speech.input.property.ack"),propertyValue)); + }else if("property.set".equals(change)){ + playOK(tree.currentPathSpeech()); + }else if("property.remove".equals(change)){ + PropertyChangeArgs args = (PropertyChangeArgs)e.getArguments(); + playOK(MessageFormat.format(resources.getString("speech.deleted.property.ack"),args.getOldValue(),tree.currentPathSpeech())); + }else if("property.modifiers".equals(change)){ + playOK(tree.currentPathSpeech()); + }else if("arrowHead".equals(change)||"endLabel".equals(change)){ + playOK(tree.currentPathSpeech()); + } + } + + @Override + public void bookmarkAdded(DiagramTreeNodeEvent evt) { + DiagramEventSource source = (DiagramEventSource)evt.getSource(); + if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){ + playOK(tree.currentPathSpeech()); + } + } + + @Override + public void bookmarkRemoved(DiagramTreeNodeEvent evt) { + DiagramEventSource source = (DiagramEventSource)evt.getSource(); + if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){ + playOK(MessageFormat.format( + resources.getString("speech.delete.bookmark.ack"), + evt.getValue(), + tree.currentPathSpeech())); + } + } + + @Override + public void notesChanged(DiagramTreeNodeEvent evt) { + DiagramEventSource source = (DiagramEventSource)evt.getSource(); + if(source.isLocal() && source.type == DiagramEventSource.Type.TREE){ + playOK(tree.currentPathSpeech()); + } + } + + private void playOK(final String speech){ + SoundFactory.getInstance().play(SoundEvent.OK, new PlayerListener(){ + @Override + public void playEnded() { + NarratorFactory.getInstance().speak(speech); + } + }); + } + + private ResourceBundle resources; + private DiagramTree tree; +}