/******************************************************************************* * 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.proconf.g3d.actions.ContextAction; import org.simantics.proconf.g3d.base.G3DAPI; import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase; import org.simantics.proconf.g3d.common.StructuredResourceSelection; import org.simantics.proconf.g3d.dnd.DropListener; import org.simantics.proconf.g3d.stubs.G3DNode; import fi.vtt.simantics.processeditor.ProcessResource; import fi.vtt.simantics.processeditor.common.PipingTools2; import fi.vtt.simantics.processeditor.dialogs.EquipmentDialog; import fi.vtt.simantics.processeditor.stubs.Equipment; public class InsertEquipmentAction extends ContextAction implements DropListener{ public InsertEquipmentAction(ThreeDimensionalEditorBase parent) { super(parent); this.setText("Insert Equipment"); } @Override public void run() { EquipmentDialog dialog = new EquipmentDialog(parent.getRenderingComposite().getShell(),"Insert Equipment",parent.getSession()); if (dialog.open() == EquipmentDialog.CANCEL) return; final Resource typeResource = dialog.getComboValue(); parent.getSession().asyncWrite(new GraphRequestAdapter() { @Override public GraphRequestStatus perform(Graph g) throws Exception { createEquipment(g,typeResource); return GraphRequestStatus.transactionComplete(); } }); } private void createEquipment(Graph graph,Resource typeResource) { //G3DNode instanceNode = new G3DNode(graph, instance); Equipment instanceNode = PipingTools2.instantiateEquipment(graph, typeResource); G3DNode plant = parent.getScenegraphAdapter().getRootNode().getG3DNode(graph); G3DAPI.addNodeWorld(plant, instanceNode); //parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(instance))); } public boolean usable(Graph graph,List resources) { return (resources.size() == 0); } public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) { if(!s.isEmpty()) return false; if (ids == null) return false; if (ids.length != 1) return false; final Resource r = ids[0]; GraphRequestWithResult query = new GraphRequestWithResult() { @Override public Boolean performWithResult(Graph g) throws Exception { IEntity t = EntityFactory.create(g, r); if(!t.isInheritedFrom(ProcessResource.plant3Dresource.Equipment)) return false; if (t.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics).size() == 1) return true; return false; } }; parent.getSession().syncRead(query); return query.getResult(); } public void doDrop(StructuredResourceSelection s, Resource[] ids) { final Resource typeResource = ids[0]; parent.getSession().asyncWrite(new GraphRequestAdapter() { @Override public GraphRequestStatus perform(Graph g) throws Exception { createEquipment(g,typeResource); return GraphRequestStatus.transactionComplete(); } }); } }