// XAAL toolkit // Copyright (C) 2009 Ville Karavirta // // 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 . package xaal.parser.modules; import org.xml.sax.Attributes; import xaal.objects.Xaal; import xaal.objects.animation.AddAnimationOperation; import xaal.objects.animation.AnimationOperation; import xaal.objects.animation.GroupOperation; import xaal.objects.animation.ParOperation; import xaal.objects.animation.PauseOperation; import xaal.objects.animation.SeqOperation; import xaal.objects.animation.SoundOperation; import xaal.objects.animation.SwapIdOperation; import xaal.objects.animation.timing.Timing; import xaal.parser.ParserModule; import xaal.util.ReflectionHelper; public class XaalAnimParserModule extends ParserModule { public XaalAnimParserModule() { super(); } public void characters(char[] text, int start, int length) { if (peek() != null && peek() instanceof StringBuffer) { StringBuffer sb = (StringBuffer) peek(); for (int i = start; i < start + length; i++) sb.append(text[i]); } } public void startElementNarrative(String namespaceURI, String localName, String qName, Attributes atts) { StringBuffer narrative = new StringBuffer(); push(narrative); } public void endElementNarrative(String namespaceURI, String localName, String qName) { StringBuffer sb = (StringBuffer) pop(); try { ReflectionHelper.invoke(new Object[] { sb.toString().trim() }, ParserModule.getCurrentObject(), "setNarrative"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void startElementTiming(String namespaceURI, String localName, String qName, Attributes atts) { Object o = peek(); if (o == null) o = ParserModule.getCurrentObject(); if (o != null && o instanceof AnimationOperation) { Timing t = new Timing(); ((AnimationOperation)o).setTiming(t); push(t); } else { push(null); // TODO error handling } } public void endElementTiming(String namespaceURI, String localName, String qName) { pop(); } public void startElementDelay(String namespaceURI, String localName, String qName, Attributes atts) { Object o = peek(); if (o == null) o = ParserModule.getCurrentObject(); if (o != null && o instanceof Timing) { Timing t = (Timing) o; if (atts.getIndex(Timing.MS_TYPE) != -1) { t.setDelay(Integer.parseInt(atts.getValue(Timing.MS_TYPE)), Timing.MS_TYPE); } else if (atts.getIndex(Timing.S_TYPE) != -1) { t.setDelay(Integer.parseInt(atts.getValue(Timing.S_TYPE)), Timing.S_TYPE); } else if (atts.getIndex(Timing.FRAMES_TYPE) != -1) { t.setDelay(Integer.parseInt(atts.getValue(Timing.FRAMES_TYPE)), Timing.FRAMES_TYPE); } } } public void startElementDuration(String namespaceURI, String localName, String qName, Attributes atts) { Object o = peek(); if (o == null) o = ParserModule.getCurrentObject(); if (o != null && o instanceof Timing) { Timing t = (Timing) o; if (atts.getIndex(Timing.MS_TYPE) != -1) { t.setDuration(Integer.parseInt(atts.getValue(Timing.MS_TYPE)), Timing.MS_TYPE); } else if (atts.getIndex(Timing.S_TYPE) != -1) { t.setDuration(Integer.parseInt(atts.getValue(Timing.S_TYPE)), Timing.S_TYPE); } else if (atts.getIndex(Timing.FRAMES_TYPE) != -1) { t.setDuration(Integer.parseInt(atts.getValue(Timing.FRAMES_TYPE)), Timing.FRAMES_TYPE); } } } public void startElementPause(String namespaceURI, String localName, String qName, Attributes atts) { AddAnimationOperation aao = getAAOObject(); if (aao != null) { PauseOperation p = new PauseOperation(getXaalObject()); handleAnimationAttributes(p, atts); aao.addAnimationOperation(p); } } public void startElementSound(String namespaceURI, String localName, String qName, Attributes atts) { AddAnimationOperation aao = getAAOObject(); if (aao != null) { SoundOperation so = new SoundOperation(getXaalObject()); handleAnimationAttributes(so, atts); aao.addAnimationOperation(so); if (atts.getIndex("repeat-count") != -1) { so.setRepeatCount(Integer.parseInt(atts.getValue("repeat-count"))); } if (atts.getIndex("src") != -1) so.setSrc(atts.getValue("src")); push(so); } else { // TODO error handling push(null); } } public void endElementSound(String namespaceURI, String localName, String qName) { pop(); } public void startElementSwapId(String namespaceURI, String localName, String qName, Attributes atts) { AddAnimationOperation aao = getAAOObject(); if (aao != null) { SwapIdOperation sio = new SwapIdOperation(getXaalObject()); handleAnimationAttributes(sio, atts); boolean ok = true; Xaal x = (Xaal) ParserModule.getProperty(XaalMainParserModule.XAAL_ROOT_OBJECT); if (atts.getIndex("swap") != -1) { String id = atts.getValue("swap"); Object o = x.getObject(id); if (o != null) sio.setSwap(id); else ok = false; } else ok = false; if (atts.getIndex("with") != -1) { String id = atts.getValue("with"); Object o = x.getObject(id); if (o != null) sio.setWith(id); else ok = false; } else ok = false; if (ok) { aao.addAnimationOperation(sio); push(sio); } else push(null); } else { // TODO error handling push(null); } } public void endElementSwapId(String namespaceURI, String localName, String qName) { pop(); } public void startElementSeq(String namespaceURI, String localName, String qName, Attributes atts) { AddAnimationOperation aao = getAAOObject(); push(ParserModule.getProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT)); if (aao != null) { SeqOperation seq = new SeqOperation(getXaalObject()); handleAnimationAttributes(seq, atts); aao.addAnimationOperation(seq); push(seq); ParserModule.setProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT, seq); } else { // TODO error handling -- warning("Element seq in illegal position"); push(null); } } public void endElementSeq(String namespaceURI, String localName, String qName) { pop(); ParserModule.setProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT, pop()); } public void startElementPar(String namespaceURI, String localName, String qName, Attributes atts) { AddAnimationOperation aao = getAAOObject(); push(ParserModule.getProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT)); if (aao != null) { ParOperation par = new ParOperation(getXaalObject()); handleAnimationAttributes(par, atts); aao.addAnimationOperation(par); push(par); ParserModule.setProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT, par); } else { // TODO error handling -- warning("Element seq in illegal position"); push(null); } } public void endElementPar(String namespaceURI, String localName, String qName) { pop(); ParserModule.setProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT, pop()); } public void startElementGroup(String namespaceURI, String localName, String qName, Attributes atts) { // TODO implementation missing AddAnimationOperation aao = getAAOObject(); if (aao != null) { GroupOperation go = new GroupOperation(getXaalObject(), atts.getValue("name")); handleAnimationAttributes(go, atts); aao.addAnimationOperation(go); push(go); } else { // TODO error handling -- warning("Element seq in illegal position"); push(null); } } public void endElementGroup(String namespaceURI, String localName, String qName) { // TODO implementation missing pop(); } public void startElementUngroup(String namespaceURI, String localName, String qName, Attributes atts) { // TODO implementation missing } public void endElementUngroup(String namespaceURI, String localName, String qName) { // TODO implementation missing } /** * Sets the attributes of the given AnimationOperation if they exists in the * given set of attributes. * * @param oper * The AnimationOperation to add the attributes. * @param atts * The set of attributes. */ private void handleAnimationAttributes(AnimationOperation oper, Attributes atts) { if (atts.getIndex("id") != -1) { oper.setId(atts.getValue("id")); Xaal x = (Xaal) ParserModule.getProperty(XaalMainParserModule.XAAL_ROOT_OBJECT); x.addObject(oper.getId(), oper); } } private AddAnimationOperation getAAOObject() { Object o = peek(); if (o == null) ParserModule.getCurrentObject(); if (o == null) o = getProperty(XaalMainParserModule.ADD_ANIMATIONOPERATION_OBJECT); if (o == null || !(o instanceof AddAnimationOperation)) return null; else return (AddAnimationOperation) o; } }