/* Copyright (c) 1997-2009 The Regents of the University of California. All rights reserved. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. PT_COPYRIGHT_VERSION_2 COPYRIGHTENDKEY */ package ptolemy.vergil.gt; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.lang.ref.WeakReference; import java.util.List; import ptolemy.actor.CompositeActor; import ptolemy.actor.Manager; import ptolemy.actor.gt.GTTools; import ptolemy.actor.gt.controller.TransformationAttribute; import ptolemy.actor.gui.Configuration; import ptolemy.actor.gui.Tableau; import ptolemy.domains.ptera.kernel.PteraModalModel; import ptolemy.kernel.CompositeEntity; import ptolemy.kernel.util.ChangeListener; import ptolemy.kernel.util.ChangeRequest; import ptolemy.kernel.util.IllegalActionException; import ptolemy.kernel.util.InternalErrorException; import ptolemy.kernel.util.NameDuplicationException; import ptolemy.kernel.util.NamedObj; import ptolemy.vergil.basic.BasicGraphFrame; import ptolemy.vergil.basic.NamedObjController; import ptolemy.vergil.basic.NodeControllerFactory; import ptolemy.vergil.gt.TransformationAttributeEditorFactory.TransformationListener; import ptolemy.vergil.kernel.AttributeController; import ptolemy.vergil.ptera.PteraGraphFrame; import ptolemy.vergil.toolbox.FigureAction; import ptolemy.vergil.toolbox.MenuActionFactory; import diva.graph.GraphController; /** @author Thomas Huining Feng @version $Id$ @since Ptolemy II 7.1 @Pt.ProposedRating Red (tfeng) @Pt.AcceptedRating Red (tfeng) */ public class TransformationAttributeController extends AttributeController { public TransformationAttributeController(GraphController controller) { this(controller, FULL); } public TransformationAttributeController(GraphController controller, Access access) { super(controller, access); _menuFactory.addMenuItemFactory(new MenuActionFactory( new LookInsideAction())); } public static class Factory extends NodeControllerFactory { public Factory(NamedObj container, String name) throws NameDuplicationException, IllegalActionException { super(container, name); } public NamedObjController create(GraphController controller) { return new TransformationAttributeController(controller); } } private static class Listener extends TransformationListener implements ChangeListener, WindowListener { public void changeExecuted(ChangeRequest change) { if (_child.isModified()) { _parent.setModified(true); _child.setModified(false); } } public void changeFailed(ChangeRequest change, Exception exception) { } public void managerStateChanged(Manager manager) { if (manager.getState() == Manager.PREINITIALIZING) { try { _model = (CompositeEntity) GTTools.cleanupModel(_parent .getModel()); } catch (IllegalActionException e) { throw new InternalErrorException(null, e, "Unable to " + "clean up model."); } } super.managerStateChanged(manager); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { if (e.getWindow() == _child) { _removeListeners(); } } public void windowClosing(WindowEvent e) { if (e.getWindow() == _parent) { _child.close(); } } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } Listener(PteraModalModel transformation, BasicGraphFrame parent, PteraGraphFrame child) throws NameDuplicationException { super(transformation, null, parent); _parent = parent; _child = child; } @SuppressWarnings("unchecked") private void _addListeners() { _parent.addWindowListener(this); _child.addWindowListener(this); CompositeActor toplevel = (CompositeActor) _child.getModel() .toplevel(); List<Object> changeListeners = toplevel.getChangeListeners(); if (changeListeners == null) { toplevel.addChangeListener(this); } else { changeListeners.add(new WeakReference<Listener>(this)); } toplevel.getManager().addExecutionListener(this); } private void _removeListeners() { _parent.removeWindowListener(this); _child.removeWindowListener(this); CompositeActor toplevel = (CompositeActor) _child.getModel() .toplevel(); toplevel.removeChangeListener(this); toplevel.getManager().removeExecutionListener(this); } private PteraGraphFrame _child; private BasicGraphFrame _parent; } private static class LookInsideAction extends FigureAction { public LookInsideAction() { super("Open Transformation Controller"); } public void actionPerformed(ActionEvent event) { super.actionPerformed(event); TransformationAttribute attribute = (TransformationAttribute) getTarget(); BasicGraphFrame actorFrame = (BasicGraphFrame) getFrame(); Configuration configuration = actorFrame.getConfiguration(); try { PteraModalModel modelUpdater = attribute.getModelUpdater(); Tableau tableau = configuration.openInstance(modelUpdater); PteraGraphFrame frame = (PteraGraphFrame) tableau.getFrame(); Listener listener = new Listener(modelUpdater, actorFrame, frame); listener._addListeners(); } catch (Exception e) { throw new InternalErrorException(null, e, "Unable to create " + "transformation editor for " + attribute.getName()); } } } }