/******************************************************************************* * Copyright (c) 2010 protos software gmbh (http://www.protos.de). * 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: * Thomas Schuetz and Henrik Rentz-Reichert (initial contribution) * *******************************************************************************/ package org.eclipse.etrice.ui.common; import java.io.File; import java.io.IOException; import java.util.Collections; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.etrice.core.room.RoomModel; import org.eclipse.etrice.core.room.StructureClass; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; /** * @author hrentz * */ public abstract class DiagramAccessBase { private static final String DIAGRAMS_FOLDER_NAME = "diagrams"; /** * */ public DiagramAccessBase() { super(); } public Diagram getDiagram(StructureClass sc) { Resource resource = sc.eResource(); if (resource==null) return null; URI uri = resource.getURI(); // TODOHRR: put common diagram access code into ui.common // make abstract methods get fileEtension() and populateDiagram() String modelName = ((RoomModel) sc.eContainer()).getName(); URI diagURI = null; boolean exists = false; if (uri.isPlatformResource()) { uri = uri.trimSegments(1); IFolder parentFolder = ResourcesPlugin.getWorkspace().getRoot().getFolder(new Path(uri.toPlatformString(true))); IFolder diagramFolder = parentFolder.getFolder(DIAGRAMS_FOLDER_NAME); IFile diagramFile = diagramFolder.getFile(modelName+"."+sc.getName()+getFileExtension()); diagURI = URI.createPlatformResourceURI(diagramFile.getFullPath().toString(), true); exists = diagramFile.exists(); } else { File diagramFile = new File(uri.toFileString()); diagramFile = new File(diagramFile.getParent() +File.separator+DIAGRAMS_FOLDER_NAME +File.separator+modelName+"."+sc.getName()+getFileExtension()); diagURI = URI.createFileURI(diagramFile.getPath()); exists = diagramFile.exists(); } ResourceSet rs = new ResourceSetImpl(); if (exists) { Resource diagRes = rs.getResource(diagURI, true); if (diagRes.getContents().isEmpty()) return null; if (diagRes.getContents().get(0) instanceof Diagram) return (Diagram) diagRes.getContents().get(0); } else { Resource diagRes = rs.createResource(diagURI); Diagram diagram = Graphiti.getPeCreateService().createDiagram(getDiagramTypeId(), getDiagramName(sc), true); diagRes.getContents().add(diagram); populatediagram(sc, diagram); try { diagRes.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } return diagram; } return null; } private void populatediagram(StructureClass ac, Diagram diagram) { ResourceSet rs = diagram.eResource().getResourceSet(); TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(rs); if (editingDomain == null) { // Not yet existing, create one editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); } // IMPORTANT STEP: this resolves the object and creates a new resource in the resource set URI boUri = EcoreUtil.getURI(ac); ac = (StructureClass) editingDomain.getResourceSet().getEObject(boUri, true); editingDomain.getCommandStack().execute(getInitialCommand(ac, diagram, editingDomain)); editingDomain.dispose(); } public void openDiagramEditor(StructureClass sc) { Diagram diagram = getDiagram(sc); String platformString = diagram.eResource().getURI().toPlatformString(true); IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(platformString)); IFileEditorInput input = new FileEditorInput(file); try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(input, getEditorId()); } catch (PartInitException e) { String error = "Error while opening diagram editor"; System.err.println(error); } } abstract protected String getDiagramName(StructureClass sc); abstract protected String getDiagramTypeId(); abstract protected String getEditorId(); abstract protected String getFileExtension(); abstract protected Command getInitialCommand(StructureClass ac, Diagram diagram, TransactionalEditingDomain editingDomain); }