1 /* 2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab 3 * Copyright (C) 2009 - DIGITEO - Vincent COUVERT 4 * Copyright (C) 2010 - DIGITEO - Clement DAVID 5 * Copyright (C) 2011-2015 - Scilab Enterprises - Clement DAVID 6 * Copyright (C) 2017 - ESI Group - Clement DAVID 7 * 8 * Copyright (C) 2012 - 2016 - Scilab Enterprises 9 * 10 * This file is hereby licensed under the terms of the GNU GPL v2.0, 11 * pursuant to article 5.3.4 of the CeCILL v.2.1. 12 * This file was originally licensed under the terms of the CeCILL v2.1, 13 * and continues to be available under such terms. 14 * For more information, see the COPYING file which you should have received 15 * along with this program. 16 * 17 */ 18 19 package org.scilab.modules.xcos.block.actions; 20 21 import java.awt.Cursor; 22 import java.awt.Toolkit; 23 import java.awt.event.ActionEvent; 24 import java.awt.event.ActionListener; 25 import java.awt.event.KeyEvent; 26 27 import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException; 28 import org.scilab.modules.graph.ScilabGraph; 29 import org.scilab.modules.graph.actions.base.VertexSelectionDependantAction; 30 import org.scilab.modules.gui.menuitem.MenuItem; 31 import org.scilab.modules.xcos.JavaController; 32 import org.scilab.modules.xcos.Kind; 33 import org.scilab.modules.xcos.ObjectProperties; 34 import org.scilab.modules.xcos.Xcos; 35 import org.scilab.modules.xcos.XcosTab; 36 import org.scilab.modules.xcos.block.BasicBlock; 37 import org.scilab.modules.xcos.graph.XcosDiagram; 38 import org.scilab.modules.xcos.graph.model.BlockInterFunction; 39 import org.scilab.modules.xcos.graph.model.ScicosObjectOwner; 40 import org.scilab.modules.xcos.graph.model.XcosCell; 41 import org.scilab.modules.xcos.graph.model.XcosCellFactory; 42 import org.scilab.modules.xcos.io.scicos.ScilabDirectHandler; 43 import org.scilab.modules.xcos.utils.BlockPositioning; 44 import org.scilab.modules.xcos.utils.XcosMessages; 45 46 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.buildCall; 47 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.asynchronousScilabExec; 48 import org.scilab.modules.xcos.io.HandledElement; 49 50 /** 51 * Open dialog to set block parameters 52 */ 53 @SuppressWarnings(value = { "serial" }) 54 public class BlockParametersAction extends VertexSelectionDependantAction { 55 /** Name of the action */ 56 public static final String NAME = XcosMessages.BLOCK_PARAMETERS; 57 /** Icon name of the action */ 58 public static final String SMALL_ICON = "applications-system"; 59 /** Mnemonic key of the action */ 60 public static final int MNEMONIC_KEY = KeyEvent.VK_B; 61 /** Accelerator key for the action */ 62 public static final int ACCELERATOR_KEY = Toolkit.getDefaultToolkit() 63 .getMenuShortcutKeyMask(); 64 65 /** 66 * Constructor 67 * 68 * @param scilabGraph 69 * associated diagram 70 */ BlockParametersAction(ScilabGraph scilabGraph)71 public BlockParametersAction(ScilabGraph scilabGraph) { 72 super(scilabGraph); 73 } 74 75 /** 76 * Menu for diagram menubar 77 * 78 * @param scilabGraph 79 * associated diagram 80 * @return the menu 81 */ createMenu(ScilabGraph scilabGraph)82 public static MenuItem createMenu(ScilabGraph scilabGraph) { 83 return createMenu(scilabGraph, BlockParametersAction.class); 84 } 85 86 /** 87 * @param e 88 * parameter 89 * @see org.scilab.modules.graph.actions.base.DefaultAction#actionPerformed(java.awt.event.ActionEvent) 90 */ 91 @Override actionPerformed(ActionEvent e)92 public void actionPerformed(ActionEvent e) { 93 actionPerformed(); 94 } 95 actionPerformed()96 public void actionPerformed() { 97 XcosDiagram graph = (XcosDiagram) getGraph(null); 98 Object selectedCell = graph.getSelectionCell(); 99 if (selectedCell != null && selectedCell instanceof XcosCell) { 100 XcosCell cell = (XcosCell) selectedCell; 101 102 if (cell.getKind() != Kind.BLOCK) { 103 return; 104 } 105 106 final JavaController controller = new JavaController(); 107 108 String[] interfaceFunction = new String[1]; 109 controller.getObjectProperty(cell.getUID(), cell.getKind(), ObjectProperties.INTERFACE_FUNCTION, interfaceFunction); 110 111 BlockInterFunction func = XcosCellFactory.lookForInterfunction(interfaceFunction[0]); 112 if (func.equals(BlockInterFunction.SUPER_f)) { 113 // this is a super-block, open it 114 115 XcosDiagram sub = Xcos.findDiagram(cell.getUID()); 116 if (sub == null) { 117 sub = new XcosDiagram(controller, cell.getUID(), cell.getKind(), cell.getId()); 118 XcosCellFactory.insertChildren(controller, sub); 119 120 ScicosObjectOwner root = Xcos.findRoot(graph); 121 Xcos.getInstance().addDiagram(root, sub); 122 123 // propagate the modified status after discarding modification 124 // done on children insertion 125 sub.setModified(false); 126 sub.setModified(Xcos.getInstance().isModified(root)); 127 128 // setup graphical interface 129 sub.getUndoManager().clear(); 130 sub.installListeners(); 131 } 132 133 // restore the parent graph tab 134 final XcosTab tab = XcosTab.get(sub); 135 if (tab == null) { 136 XcosTab.restore(sub); 137 } else { 138 tab.setCurrent(); 139 tab.requestFocus(); 140 } 141 } else { 142 BasicBlock block = (BasicBlock) cell; 143 // prevent to open twice 144 if (block.isLocked()) { 145 return; 146 } 147 148 graph.setCellsLocked(true); 149 graph.getAsComponent().getGraphControl().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 150 JavaController.register_view(Xcos.class.getName(), Xcos.getInstance().getXcosView()); 151 152 try { 153 154 final ActionListener action = new ActionListener() { 155 @Override 156 public void actionPerformed(ActionEvent e) { 157 158 graph.getView().clear(this, true, true); 159 160 // Now read new Block 161 graph.getModel().beginUpdate(); 162 try { 163 ScicosObjectOwner last = XcosCellFactory.getLastCreated(); 164 if (last != null && last.getUID() != 0l) { 165 BasicBlock modified = XcosCellFactory.createBlock(controller, last); 166 if (modified != null) { 167 block.updateBlockSettings(controller, graph, modified); 168 } 169 } 170 BlockPositioning.updateBlockView(graph, block); 171 } finally { 172 graph.getModel().endUpdate(); 173 block.setLocked(false); 174 175 graph.getAsComponent().getGraphControl().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 176 graph.setCellsLocked(false); 177 JavaController.unregister_view(Xcos.getInstance().getXcosView()); 178 } 179 } 180 }; 181 182 ScilabDirectHandler handler = ScilabDirectHandler.acquire(); 183 try { 184 handler.writeContext(graph.getContext()); 185 } finally { 186 handler.release(); 187 } 188 189 block.setLocked(true); 190 String blk = buildCall("scicos_new", Long.toHexString(cell.getUID())); 191 String xcosBlockInterface = buildCall("xcosBlockInterface", interfaceFunction[0].toCharArray(), "set", blk.toCharArray(), ScilabDirectHandler.CONTEXT.toCharArray()); 192 193 asynchronousScilabExec(action, "xcosCellCreated", xcosBlockInterface.toCharArray()); 194 } catch (InterpreterException ex) { 195 block.setLocked(false); 196 197 graph.getAsComponent().getGraphControl().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 198 graph.setCellsLocked(false); 199 } 200 } 201 } 202 } 203 } 204