/******************************************************************************* * Copyright (c) 2007 VTT Technical Research Centre of Finland and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package fi.vtt.simantics.processeditor.actions; import java.util.List; import org.simantics.db.Graph; import org.simantics.db.GraphRequestAdapter; import org.simantics.db.GraphRequestStatus; import org.simantics.db.GraphRequestWithResult; import org.simantics.db.Resource; import org.simantics.layer0.utils.EntityFactory; import org.simantics.layer0.utils.IEntity; import org.simantics.layer0.utils.instantiation.Instance; import org.simantics.layer0.utils.instantiation.InstanceFactory; import org.simantics.proconf.g3d.actions.WriteAction; import org.simantics.proconf.g3d.base.G3DAPI; import org.simantics.proconf.g3d.base.G3DTools; import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase; import org.simantics.proconf.g3d.common.StructuredResourceSelection; import org.simantics.proconf.g3d.dnd.DropListener; import fi.vtt.simantics.processeditor.Activator; import fi.vtt.simantics.processeditor.ProcessResource; import fi.vtt.simantics.processeditor.common.PipingTools2; import fi.vtt.simantics.processeditor.dialogs.NozzleDialog; import fi.vtt.simantics.processeditor.stubs.Equipment; import fi.vtt.simantics.processeditor.stubs.Nozzle; public class InsertNozzleAction extends WriteAction implements DropListener { Resource equipmentResource = null; Resource nozzleType = null; public InsertNozzleAction(ThreeDimensionalEditorBase parent) { super(parent,false); } @Override public boolean canActivate() { NozzleDialog dialog = new NozzleDialog(parent.getRenderingComposite().getShell(),"Select a nozzle", parent.getSession()); if (dialog.open() == NozzleDialog.CANCEL) { equipmentResource = null; return false; } Resource type = dialog.getComboValue(); if (type == null) { equipmentResource = null; return false; } nozzleType = type; return true; } @Override public GraphRequestStatus doChanges(Graph graph) throws Exception { createNozzle(graph); return GraphRequestStatus.transactionComplete(); } private void createNozzle(Graph graph) { assert(nozzleType != null); assert(equipmentResource != null); Nozzle n = PipingTools2.instantiateNozzle(graph, nozzleType); Equipment equipment = new Equipment(graph, equipmentResource); G3DAPI.addNodeLocal(equipment,ProcessResource.plant3Dresource.HasNozzle, n); //parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(n.getResource())); equipment = null; } public boolean usable(Graph graph, List resources) { if (resources.size() != 1) { return false; } Resource r = resources.iterator().next(); IEntity t = EntityFactory.create(graph,r); if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) { equipmentResource = r; return true; } return false; } @Override public void init() { setText("Insert Nozzle"); this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Nozzle.png")); } public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) { if(s.size() != 1) return false; if (ids == null) return false; if (ids.length != 1) return false; final Resource r = ids[0]; final Resource selectedResource = s.iterator().next(); GraphRequestWithResult query = new GraphRequestWithResult() { @Override public Boolean performWithResult(Graph g) throws Exception { IEntity t = EntityFactory.create(g,r); if (!t.isInheritedFrom(ProcessResource.plant3Dresource.Nozzle)) return false; t = EntityFactory.create(g,selectedResource); if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) { return true; } return false; } }; parent.getSession().syncRead(query); return query.getResult(); } public void doDrop(StructuredResourceSelection s, Resource[] ids) { equipmentResource = s.iterator().next(); parent.getSession().asyncWrite(new GraphRequestAdapter() { @Override public GraphRequestStatus perform(Graph g) throws Exception { createNozzle(g); return GraphRequestStatus.transactionComplete(); } }); } }