/******************************************************************************* * CogTool Copyright Notice and Distribution Terms * CogTool 1.3, Copyright (c) 2005-2013 Carnegie Mellon University * This software is distributed under the terms of the FSF Lesser * Gnu Public License (see LGPL.txt). * * CogTool 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 2.1 of the License, or * (at your option) any later version. * * CogTool 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 CogTool; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * CogTool makes use of several third-party components, with the * following notices: * * Eclipse SWT version 3.448 * Eclipse GEF Draw2D version 3.2.1 * * Unless otherwise indicated, all Content made available by the Eclipse * Foundation is provided to you under the terms and conditions of the Eclipse * Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this * Content and is also available at http://www.eclipse.org/legal/epl-v10.html. * * CLISP version 2.38 * * Copyright (c) Sam Steingold, Bruno Haible 2001-2006 * This software is distributed under the terms of the FSF Gnu Public License. * See COPYRIGHT file in clisp installation folder for more information. * * ACT-R 6.0 * * Copyright (c) 1998-2007 Dan Bothell, Mike Byrne, Christian Lebiere & * John R Anderson. * This software is distributed under the terms of the FSF Lesser * Gnu Public License (see LGPL.txt). * * Apache Jakarta Commons-Lang 2.1 * * This product contains software developed by the Apache Software Foundation * (http://www.apache.org/) * * jopt-simple version 1.0 * * Copyright (c) 2004-2013 Paul R. Holser, Jr. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Mozilla XULRunner 1.9.0.5 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/. * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * The J2SE(TM) Java Runtime Environment version 5.0 * * Copyright 2009 Sun Microsystems, Inc., 4150 * Network Circle, Santa Clara, California 95054, U.S.A. All * rights reserved. U.S. * See the LICENSE file in the jre folder for more information. ******************************************************************************/ package edu.cmu.cs.hcii.cogtool.view; import java.util.Collection; import java.util.Iterator; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Text; import edu.cmu.cs.hcii.cogtool.model.DesignUtil; import edu.cmu.cs.hcii.cogtool.model.DeviceType; import edu.cmu.cs.hcii.cogtool.model.InputDevice; import edu.cmu.cs.hcii.cogtool.model.Project; import edu.cmu.cs.hcii.cogtool.ui.DesignEditorLID; import edu.cmu.cs.hcii.cogtool.uimodel.DefaultSEUIModel; import edu.cmu.cs.hcii.cogtool.uimodel.DesignEditorFrame; import edu.cmu.cs.hcii.cogtool.util.DoubleEntry; import edu.cmu.cs.hcii.cogtool.util.FontUtils; import edu.cmu.cs.hcii.cogtool.util.L10N; import edu.cmu.cs.hcii.cogtool.util.ListenerIdentifierMap; import edu.cmu.cs.hcii.cogtool.util.MenuUtil; import edu.cmu.cs.hcii.cogtool.util.SWTContextMenuUtil; import edu.cmu.cs.hcii.cogtool.util.TextWithEnableFix; import edu.cmu.cs.hcii.cogtool.util.ListenerIdentifier.ILIDTransmuter; import edu.cmu.cs.hcii.cogtool.util.MenuUtil.MenuItemDefinition; import edu.cmu.cs.hcii.cogtool.util.MenuUtil.SimpleMenuItemDefinition; import edu.cmu.cs.hcii.cogtool.view.MenuFactory.IWindowMenuData; import edu.cmu.cs.hcii.cogtool.view.MenuFactory.MenuType; /** * Common code for SEDemoView and ScriptViewerView */ public class DefaultSEView extends ScriptView { /** * A simple class whose purpose is to perform the extra layout required * by ScriptViewerView's editor. Because of constructor binding time issues, * we cannot access "final" variables in the override to addAndLayOutFields * as that is called by StandardDrawingEditor's constructor. So, we * use this class to hold the same values and to perform the layout using * the necessary instance variables from InteractionDrawingEditor. */ protected static class FrameNameDevicesLayout { protected DefaultSEUIModel uiModel; protected SWTContextMenuUtil.MenuListener deviceL; protected SWTContextMenuUtil.MenuListener frameL; protected boolean usesSpeaker; public void reset(DefaultSEUIModel uim, SWTContextMenuUtil.MenuListener deviceLr, SWTContextMenuUtil.MenuListener frameLr, int deviceTypes) { uiModel = uim; deviceL = deviceLr; frameL = frameLr; usesSpeaker = DeviceType.contains(deviceTypes, DeviceType.SPEAKER_PERSISTENCE); } public void addSpeakerDevice(DefaultSEUIModel uim, int deviceTypes, Composite bodyComposite, Composite scrollComposite, FormData scrollFormData) { uiModel = uim; usesSpeaker = DeviceType.contains(deviceTypes, DeviceType.SPEAKER_PERSISTENCE); addSpeaker(bodyComposite, scrollComposite, scrollFormData); } protected void addSpeaker(Composite bodyComposite, Composite scrollComposite, FormData scrollFormData) { if (usesSpeaker && (uiModel.getSpeakerText() == null)) { Image speakerIconImage = DesignEditorFrame.getSpeakerIconImage(); Label speakerImg = new Label(bodyComposite, SWT.NONE); speakerImg.setImage(speakerIconImage); speakerImg.setToolTipText(L10N.get("FE.SpeakerText", "Speaker text")); FormData formData = new FormData(); formData.top = scrollFormData.top; formData.left = new FormAttachment(scrollComposite, 0, SWT.LEFT); speakerImg.setLayoutData(formData); scrollFormData.top = new FormAttachment(speakerImg, 0, SWT.BOTTOM); Text speakerText = new TextWithEnableFix(bodyComposite, SWT.BORDER | SWT.READ_ONLY); DoubleEntry listenTime = new DoubleEntry(bodyComposite, SWT.BORDER | SWT.READ_ONLY); speakerText.setBackground(SPEAKER_BGK_COLOR); listenTime.setUnits("s"); listenTime.setDecimalPlaces(2); listenTime.setToolTipText(DesignEditorFrame.LISTEN_TIME_TOOLTIP); listenTime.setBackground(SPEAKER_BGK_COLOR); formData = new FormData(); formData.top = new FormAttachment(speakerImg, 0, SWT.CENTER); formData.left = new FormAttachment(speakerImg, 0, SWT.RIGHT); formData.right = new FormAttachment(listenTime.getOuter(), 0, SWT.LEFT); speakerText.setLayoutData(formData); formData = new FormData(); formData.top = new FormAttachment(speakerImg, 0, SWT.CENTER); formData.width = 100; formData.right = new FormAttachment(scrollComposite, 0, SWT.RIGHT); listenTime.setLayoutData(formData); uiModel.setSpeaker(listenTime, speakerText); } } public void addInputDevice(DefaultSEUIModel uim, SWTContextMenuUtil.MenuListener deviceLr, InputDevice inputDevice, Composite bodyComposite, Composite scrollComposite, FormData scrollFormData) { uiModel = uim; deviceL = deviceLr; Composite devicesFooter = uiModel.getDevicesFooter(); if (devicesFooter == null) { devicesFooter = layoutHelper.addDevicesFooter(bodyComposite, scrollComposite, scrollFormData); } addDeviceToFooter(inputDevice, devicesFooter); uiModel.updateDeviceDisplay(); } protected void addDeviceToFooter(InputDevice inputDevice, Composite devicesFooter) { Label deviceLabel = new Label(devicesFooter, SWT.CENTER); deviceLabel.setBackground(INPUT_DEVICE_BKG_COLOR); deviceLabel.setFont(FontUtils.DEFAULT_FONT); deviceLabel.addListener(SWT.MenuDetect, deviceL); deviceLabel.addMouseListener(deviceL); uiModel.addDeviceLabel(inputDevice, deviceLabel); } public Composite addDevicesFooter(Composite bodyComposite, Composite scrollComposite, FormData scrollFormData) { Composite devicesFooter = new Composite(bodyComposite, SWT.BORDER); devicesFooter.setBackground(HEADER_FOOTER_BKG_COLOR); FormData formData = new FormData(); formData.top = new FormAttachment(scrollComposite, 0, SWT.BOTTOM); formData.bottom = scrollFormData.bottom; formData.left = new FormAttachment(scrollComposite, 0, SWT.LEFT); formData.right = new FormAttachment(scrollComposite, 0, SWT.RIGHT); devicesFooter.setLayoutData(formData); uiModel.setDevicesFooter(devicesFooter); scrollFormData.bottom = new FormAttachment(devicesFooter, - DesignUtil.DEVICE_HEIGHT - 5, SWT.BOTTOM); return devicesFooter; } public void addFrameNameDevices(Composite bodyComposite, Composite scrollComposite, FormData scrollFormData) { Label frameNameHdr = new Label(bodyComposite, SWT.BORDER | SWT.CENTER | SWT.SHADOW_IN); frameNameHdr.setFont(FontUtils.DEFAULT_FONT); frameNameHdr.setBackground(HEADER_FOOTER_BKG_COLOR); FormData formData = new FormData(); formData.top = scrollFormData.top; formData.left = new FormAttachment(scrollComposite, 0, SWT.LEFT); formData.right = new FormAttachment(scrollComposite, 0, SWT.RIGHT); formData.height = 22; frameNameHdr.setLayoutData(formData); scrollFormData.top = new FormAttachment(frameNameHdr, 0, SWT.BOTTOM); uiModel.setFrameHeader(frameNameHdr); frameNameHdr.addListener(SWT.MenuDetect, frameL); frameNameHdr.addMouseListener(frameL); addSpeaker(bodyComposite, scrollComposite, scrollFormData); Collection<InputDevice> devices = uiModel.getCurrentFrame().getFrame().getInputDevices(); if (devices.size() > 0) { Composite devicesFooter = addDevicesFooter(bodyComposite, scrollComposite, scrollFormData); Iterator<InputDevice> inputDevices = devices.iterator(); while (inputDevices.hasNext()) { addDeviceToFooter(inputDevices.next(), devicesFooter); } uiModel.updateDeviceDisplay(); } } } protected static FrameNameDevicesLayout layoutHelper = new FrameNameDevicesLayout(); /** * SWT Label for the step table */ protected Label scriptStepListLabel; /** * The SIDE area as specified in interactionEditor * Also used to set the limits of how big you can make the properties or * drawing area by dragging the sash. */ final static protected int HISTORY_LIST_WIDTH = 200; /** * The minimum size of the drawing area. * This is needed since their are properties in the drawing area that * should not be hidden. */ final static protected int MIN_DRAWING_AREA_WIDTH = 375; // The size of the bottom SWT area for DEMO VIEW final static protected int PROPERTIES_PANE_HEIGHT = 45; /** * Return the list of needed menus * This is to handle MACOS which is only supposed to show a limited set of * specific menus. */ @Override protected MenuType[] neededMenus() { return new MenuFactory.MenuType[] { MenuFactory.MenuType.FileMenu, MenuFactory.MenuType.EditMenu, MenuFactory.MenuType.ScriptModifyMenu, //TODO: script menu? MenuFactory.MenuType.WindowMenu, MenuFactory.MenuType.HelpMenu }; } protected static MenuItemDefinition editFrameItem = new SimpleMenuItemDefinition(L10N.get("SV.EditFrame", "Edit Frame"), DesignEditorLID.EditFrame, MenuUtil.ENABLED); protected static Menu editFrameMenu = null; protected DefaultSEUIModel uiModel; protected SWTContextMenuUtil.MenuListener deviceL; public DefaultSEView(ListenerIdentifierMap listenerIDMap, ILIDTransmuter transformer, IWindowMenuData<Project> menuData, DefaultSEUIModel uiM, SWTContextMenuUtil.MenuListener deviceLr, Rectangle loc, int defaultWidth, int defaultHeight) { super(listenerIDMap, transformer, menuData, loc, defaultWidth, defaultHeight); uiModel = uiM; deviceL = deviceLr; } public void addInputDevice(InputDevice inputDevice) { Composite bodyComposite = editor.getSWTBodyComposite(); layoutHelper.addInputDevice(uiModel, deviceL, inputDevice, bodyComposite, editor.getSWTScrollComposite(), editor.getScrollFormData()); bodyComposite.layout(); } public void addSpeakerDevice(int deviceTypes) { Composite bodyComposite = editor.getSWTBodyComposite(); layoutHelper.addSpeakerDevice(uiModel, deviceTypes, bodyComposite, editor.getSWTScrollComposite(), editor.getScrollFormData()); bodyComposite.layout(); } protected static final int STANDARD_MENU = 0; protected static final int SCRIPT_STEP_MENU = 1; /** * If the user clicked on open area, then show the zoom contexual menu */ protected static final MenuItemDefinition[] STANDARD_ITEMS = new MenuItemDefinition[] { MenuFactory.ZOOM_IN, MenuFactory.ZOOM_OUT, MenuFactory.ZOOM_NORMAL, MenuFactory.ZOOM_FIT }; public void showFrameMenu() { if (editFrameMenu == null) { MenuItemDefinition[] frameMenuItems = new MenuItemDefinition[1]; frameMenuItems[0] = editFrameItem; editFrameMenu = contextMenus.createContextMenu(frameMenuItems); } editFrameMenu.setVisible(true); } /** * Show the standard script menu */ public void showStandardMenu() { contextMenus.setContextSelection(View.SELECTION); contextMenus.getMenu(STANDARD_MENU).setVisible(true); } }