blob: a37f124260ac52485f91bf26bfb721a8da2befa5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BestSolution.at 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:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tools.emf.editor3x.extension;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.e4.internal.tools.wizards.classes.NewAddonClassWizard;
import org.eclipse.e4.tools.emf.ui.common.IContributionClassCreator;
import org.eclipse.e4.ui.model.application.MContribution;
import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.core.project.IBundleProjectDescription;
import org.eclipse.pde.core.project.IBundleProjectService;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PartInitException;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
public class AddonContributionEditor implements IContributionClassCreator {
public boolean isSupported(EClass element) {
return Util.isTypeOrSuper(ApplicationPackageImpl.Literals.ADDON, element);
}
public void createOpen(MContribution contribution, EditingDomain domain,
IProject project, Shell shell) {
createOpen(contribution, domain, project, shell, false);
}
private void createOpen(MContribution contribution, EditingDomain domain,
IProject project, Shell shell, boolean forceNew) {
if( forceNew || contribution.getContributionURI() == null || contribution.getContributionURI().trim().length() == 0 || !contribution.getContributionURI().startsWith("bundleclass:") ) {
NewAddonClassWizard wizard = new NewAddonClassWizard();
wizard.init( null, new StructuredSelection(project));
WizardDialog dialog = new WizardDialog(shell, wizard);
if( dialog.open() == WizardDialog.OK ) {
IFile f = wizard.getFile();
ICompilationUnit el = JavaCore.createCompilationUnitFrom(f);
try {
String fullyQualified;
if( el.getPackageDeclarations() != null && el.getPackageDeclarations().length > 0 ) {
String packageName = el.getPackageDeclarations()[0].getElementName();
String className = wizard.getDomainClass().getName();
if( packageName.trim().length() > 0 ) {
fullyQualified = packageName + "." + className;
} else {
fullyQualified = className;
}
} else {
fullyQualified = wizard.getDomainClass().getName();
}
Command cmd = SetCommand.create(domain, contribution, ApplicationPackageImpl.Literals.CONTRIBUTION__CONTRIBUTION_URI, "bundleclass://" + Util.getBundleSymbolicName(f.getProject()) + "/" + fullyQualified);
if( cmd.canExecute() ) {
domain.getCommandStack().execute(cmd);
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
URI uri = URI.createURI(contribution.getContributionURI());
if (uri.segmentCount() == 3) {
IProject p = ResourcesPlugin.getWorkspace().getRoot()
.getProject(uri.segment(1));
if( ! p.exists() ) {
for( IProject check : ResourcesPlugin.getWorkspace().getRoot().getProjects() ) {
String name = Util.getBundleSymbolicName(check);
if( uri.segment(1).equals(name) ) {
p = check;
break;
}
}
}
// TODO If this is not a WS-Resource we need to open differently
if (p != null) {
IJavaProject jp = JavaCore.create(p);
try {
IType t = jp.findType(uri.segment(2));
if( t != null ) {
JavaUI.openInEditor(t);
} else {
if( MessageDialog.openQuestion(shell, "Class not found", "The class '"+uri.segment(2)+"' was not found. Would you like to start the class creation wizard?") ) {
createOpen(contribution, domain, project, shell, true);
}
}
} catch (JavaModelException e) {
if( MessageDialog.openQuestion(shell, "Class not found", "The class '"+uri.segment(2)+"' was not found. Would you like to start the class creation wizard?") ) {
createOpen(contribution, domain, project, shell, true);
}
} catch (PartInitException e) {
MessageDialog.openError(shell, "Failed to open editor", e.getMessage());
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
MessageDialog.openError(shell, "Invalid URL",
"The current url is invalid");
}
}
}
}