/** * Squidy Interaction Library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * Squidy Interaction Library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squidy Interaction Library. If not, see * <http://www.gnu.org/licenses/>. * * 2009 Human-Computer Interaction Group, University of Konstanz. * <http://hci.uni-konstanz.de> * * Please contact info@squidy-lib.de or visit our website * <http://www.squidy-lib.de> for further information. */ package org.squidy.nodes; import java.awt.event.KeyEvent; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; import org.squidy.manager.controls.ComboBox; import org.squidy.manager.controls.ComboBoxControl; import org.squidy.manager.data.IData; import org.squidy.manager.data.IDataContainer; import org.squidy.manager.data.Processor; import org.squidy.manager.data.Property; import org.squidy.manager.data.Processor.Status; import org.squidy.manager.data.domainprovider.DomainProvider; import org.squidy.manager.data.impl.DataButton; import org.squidy.manager.data.impl.DataDigital; import org.squidy.manager.data.impl.DataPosition2D; import org.squidy.manager.data.impl.DataString; import org.squidy.manager.model.AbstractNode; import org.squidy.manager.util.DataUtility; /** * <code>PowerpointControl</code>. * * <pre> * Date: Aug 20, 2009 * Time: 6:23:29 PM * </pre> * * * @author * Roman R�dle * <a href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a> * Human-Computer Interaction Group * University of Konstanz * * @version $Id: PowerpointControl.java 772 2011-09-16 15:39:44Z raedle $ * @since 1.0.0 */ @XmlType(name = "PowerpointControl") @Processor( name = "PowerpointControl", icon = "/org/squidy/nodes/image/48x48/funnel.png", description = "Empty Node to be filled...", types = { Processor.Type.INPUT, Processor.Type.FILTER, Processor.Type.OUTPUT }, tags = { }, status = Status.UNSTABLE ) public class PowerpointControl extends AbstractNode { // ################################################################################ // BEGIN OF PROPERTIES // ################################################################################ @XmlAttribute(name = "operating-system") @Property( name = "Operating System PowerPoint Application runs on" ) @ComboBox(domainProvider = OperatingSystemProvider.class) private String operatingSystem = "osx"; public String getOperatingSystem() { return operatingSystem; } public void setOperatingSystem(String operatingSystem) { this.operatingSystem = operatingSystem; } @XmlAttribute(name = "language") @Property( name = "Language of PowerPoint Application" ) @ComboBox(domainProvider = LanguageDomainProvider.class) private String language = "english"; /** * @return the language */ public final String getLanguage() { return language; } /** * @param language the language to set */ public final void setLanguage(String language) { this.language = language; } /** * <code>OperatingSystemProvider</code>. * * <pre> * Date: Sep 16, 2009 * Time: 5:35:36 PM * </pre> * * * @author * Roman R�dle * <a href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a> * Human-Computer Interaction Group * University of Konstanz * * @version $Id: PowerpointControl.java 772 2011-09-16 15:39:44Z raedle $ * @since 1.0.0 */ public static class OperatingSystemProvider implements DomainProvider { // Operating system values. private static final Object[] VALUES = new Object[]{ new ComboBoxControl.ComboBoxItemWrapper("osx", "OS X"), new ComboBoxControl.ComboBoxItemWrapper("windows", "Windows") }; /* (non-Javadoc) * @see org.squidy.manager.data.domainprovider.DomainProvider#getValues() */ public Object[] getValues() { return VALUES; } } /** * <code>LanguageDomainProvider</code>. * * <pre> * Date: Aug 24, 2009 * Time: 6:17:14 AM * </pre> * * * @author * Roman R�dle * <a href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a> * Human-Computer Interaction Group * University of Konstanz * * @version $Id: PowerpointControl.java 772 2011-09-16 15:39:44Z raedle $ * @since 1.0.0 */ public static class LanguageDomainProvider implements DomainProvider { // Language values. private static final Object[] VALUES = new Object[]{ new ComboBoxControl.ComboBoxItemWrapper("english", "English"), new ComboBoxControl.ComboBoxItemWrapper("german", "German") }; /* (non-Javadoc) * @see org.squidy.manager.data.domainprovider.DomainProvider#getValues() */ public Object[] getValues() { return VALUES; } } // ################################################################################ // END OF PROPERTIES // ################################################################################ // ################################################################################ // BEGIN OF PROCESS // ################################################################################ private boolean ignoreInput = false; private boolean penActivated = false; /* (non-Javadoc) * @see org.squidy.manager.model.AbstractNode#beforeDataContainerProcessing(org.squidy.manager.data.IDataContainer) */ @Override public IDataContainer preProcess(IDataContainer dataContainer) { if (ignoreInput) { return null; } List<DataPosition2D> positions = DataUtility.getDataOfType(DataPosition2D.class, dataContainer); if (positions.size() == 1 && penActivated) { DataPosition2D dataPosition2D = positions.get(0); if (dataPosition2D.hasAttribute(iPhone.TOUCHES_MOVED)) { DataButton buttonDown = new DataButton(PaintInPowerpoint.class, DataButton.BUTTON_1, true); publish(buttonDown); } else if (dataPosition2D.hasAttribute(iPhone.TOUCHES_ENDED)) { DataButton buttonUp = new DataButton(PaintInPowerpoint.class, DataButton.BUTTON_1, false); publish(buttonUp); } } if (positions.size() == 2) { boolean bothDown = true; for (DataPosition2D dataPosition2D : positions) { bothDown = dataPosition2D.hasAttribute(iPhone.TOUCHES_BEGAN); if (!bothDown) { break; } } if (bothDown) { ignoreInput = true; new Thread() { /* (non-Javadoc) * @see java.lang.Thread#run() */ public void run() { try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } ignoreInput = false; }; }.start(); int keyCode = getModeKeyEvent(penActivated); penActivated = !penActivated; DataButton buttonUp = new DataButton(PaintInPowerpoint.class, DataButton.BUTTON_1, false); publish(buttonUp); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } DataDigital ctrlDown = new DataDigital(PaintInPowerpoint.class, true); ctrlDown.setAttribute(Keyboard.KEY_EVENT, getModeKeyModifier()); publish(ctrlDown); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } DataDigital keyDown = new DataDigital(PaintInPowerpoint.class, true); keyDown.setAttribute(Keyboard.KEY_EVENT, keyCode); publish(keyDown); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } DataDigital keyUp = new DataDigital(PaintInPowerpoint.class, false); keyUp.setAttribute(Keyboard.KEY_EVENT, keyCode); publish(keyUp); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } DataDigital ctrlUp = new DataDigital(PaintInPowerpoint.class, false); ctrlUp.setAttribute(Keyboard.KEY_EVENT, getModeKeyModifier()); publish(ctrlUp); return null; } } return super.preProcess(dataContainer); } /** * Uncomment method if processing of data string is desired. * * @param dataToken The data token object. * @return Any desired data object of interface IData. */ public IData process(DataString dataString) { if (dataString.hasAttribute(ShakeRecognizer.SHAKE_EVENT)) { int eraseKeyEvent = getEraseKeyEvent(); DataDigital keyDown = new DataDigital(PaintInPowerpoint.class, true); keyDown.setAttribute(Keyboard.KEY_EVENT, eraseKeyEvent); publish(keyDown); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } DataDigital keyUp = new DataDigital(PaintInPowerpoint.class, false); keyUp.setAttribute(Keyboard.KEY_EVENT, eraseKeyEvent); publish(keyUp); } return dataString; } // ################################################################################ // END OF PROCESS // ################################################################################ /** * @param isPenActivated * @return */ private int getModeKeyEvent(boolean isPenActivated) { if (penActivated) { if ("english".equals(language)) { return KeyEvent.VK_A; } else if ("german".equals(language)) { return KeyEvent.VK_A; } } else { if ("english".equals(language)) { return KeyEvent.VK_P; } else if ("german".equals(language)) { return KeyEvent.VK_P; } } return -1; } /** * @return */ private int getModeKeyModifier() { if ("osx".equals(operatingSystem)) { return KeyEvent.VK_META; } else if ("windows".equals(operatingSystem)) { return KeyEvent.VK_CONTROL; } return -1; } /** * @return */ private int getEraseKeyEvent() { if ("english".equals(language)) { return KeyEvent.VK_E; } else if ("german".equals(language)) { return KeyEvent.VK_L; } return -1; } }