blob: 1b1a53077ff6d6fbe05569dbebb1c9061d498596 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.actions;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.IPluginExtension;
import org.eclipse.pde.core.plugin.IPluginExtensionPoint;
import org.eclipse.pde.internal.core.PDEStateHelper;
import org.eclipse.pde.internal.core.ischema.ISchema;
import org.eclipse.pde.internal.core.ischema.ISchemaDescriptor;
import org.eclipse.pde.internal.core.schema.SchemaDescriptor;
import org.eclipse.pde.internal.core.schema.SchemaRegistry;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEPluginImages;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.schema.SchemaEditor;
/**
* OpenSchemaAction
*
*/
public class OpenSchemaAction extends Action {
private ISchema fSchema;
private String fFullPointID;
/**
*
*/
public OpenSchemaAction() {
fSchema = null;
fFullPointID = null;
initialize();
}
/**
*
*/
private void initialize() {
setImageDescriptor(PDEPluginImages.DESC_SCHEMA_OBJ);
setText(PDEUIMessages.HyperlinkActionOpenSchema);
setToolTipText(PDEUIMessages.HyperlinkActionOpenSchema);
setEnabled(false);
}
/**
* @param schema
*/
public void setInput(ISchema schema) {
// Ensure schema is defined
if (schema == null) {
fFullPointID = PDEUIMessages.OpenSchemaAction_msgUnknown;
return;
}
fFullPointID = schema.getQualifiedPointId();
fSchema = schema;
}
/**
* @param point
*/
public void setInput(IPluginExtensionPoint point) {
// Ensure the point is defined
if (point == null) {
fSchema = null;
fFullPointID = PDEUIMessages.OpenSchemaAction_msgUnknown;
return;
}
fFullPointID = point.getFullId();
// Ensure the point is fully qualified
if (fFullPointID.indexOf('.') == -1) {
fSchema = null;
return;
}
// Find the schema
fSchema = findSchema(point);
}
/**
* @param fullPointID
*/
public void setInput(String fullPointID) {
// Ensure point ID is defined
if (fullPointID == null) {
fSchema = null;
fFullPointID = PDEUIMessages.OpenSchemaAction_msgUnknown;
return;
}
fFullPointID = fullPointID;
// Find the corresponding extension point
IPluginExtensionPoint point = PDEStateHelper.findExtensionPoint(fFullPointID);
// Ensure the extension point is defined
if (point == null) {
fSchema = null;
return;
}
// Find the schema
fSchema = findSchema(point);
}
/**
* @param extension
*/
public void setInput(IPluginExtension extension) {
// Ensure the extension is defined
if (extension == null) {
fSchema = null;
fFullPointID = PDEUIMessages.OpenSchemaAction_msgUnknown;
return;
}
// Get the full extension point ID
fFullPointID = extension.getPoint();
// Find the corresponding extension point
IPluginExtensionPoint point = PDEStateHelper.findExtensionPoint(fFullPointID);
// Ensure the extension point is defined
if (point == null) {
fSchema = null;
return;
}
// Find the schema
fSchema = findSchema(point);
}
/**
* @param point
* @return
*/
private ISchema findSchema(IPluginExtensionPoint point) {
// Find the corresponding schema URL for the extension point
URL url = SchemaRegistry.getSchemaURL(point);
// Ensure the URL is defined
if (url == null) {
return null;
}
// Create a schema descriptor
ISchemaDescriptor descriptor =
new SchemaDescriptor(fFullPointID, url);
// Get the schema
ISchema schema = descriptor.getSchema(false);
// Ensure schema is defined
if (schema == null) {
return null;
}
return schema;
}
/**
* @param fullPointID
*/
private void displayErrorDialog() {
String title = PDEUIMessages.OpenSchemaAction_titleExtensionPointSchema;
String message =
NLS.bind(PDEUIMessages.OpenSchemaAction_errorMsgSchemaNotFound, fFullPointID);
MessageDialog.openWarning(PDEPlugin.getActiveWorkbenchShell(),
title, message);
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
// Ensure the schema is defined
if (fSchema == null) {
displayErrorDialog();
return;
}
// Retrieve the schema URL
URL schemaURL = fSchema.getURL();
// Ensure the URL is defined
if (schemaURL == null) {
displayErrorDialog();
return;
}
// Get the raw URL, determine if it is stored in a JAR, and handle
// accordingly
String rawURL = schemaURL.toString();
if (rawURL.startsWith("jar")) { //$NON-NLS-1$
// Call to getPath removes the 'jar:' qualifier
openSchemaJar(schemaURL.getPath());
} else {
openSchemaFile(schemaURL.getPath());
}
}
/**
* @param path
*/
private void openSchemaFile(String path) {
// Open the schema in a new editor
try {
// see if schema URL is actually in workspace. If so, open it as we would if users opened file directly
IWorkspaceRoot root = PDEPlugin.getWorkspace().getRoot();
IPath workspacePath = root.getLocation();
String workspaceLoc = workspacePath.toFile().toURL().getPath();
if (path.startsWith(workspaceLoc)) {
String relativeLocation = path.substring(workspaceLoc.length());
IResource res = root.findMember(relativeLocation);
if (res != null && res instanceof IFile && res.getProject().isOpen()) {
SchemaEditor.openSchema((IFile)res);
return;
}
}
} catch (MalformedURLException e) {
}
SchemaEditor.openSchema(new File(path));
}
/**
* @param path
*/
private void openSchemaJar(String path) {
// Remove the 'file:' qualifier
if (path.startsWith("file:") == false) { //$NON-NLS-1$
displayErrorDialog();
return;
}
path = path.substring(5);
// An exclaimation point separates the jar filename from the
// schema file entry in the jar file
// Get the index of the '!'
int exclPointIndex = path.indexOf('!');
// Ensure there is an '!' and that the schema file entry is defined
// and the jar file name is defined
if ((exclPointIndex <= 0) ||
((exclPointIndex + 1) >= path.length())) {
displayErrorDialog();
return;
}
// Extract the jar file name - not including '!'
String jarFileName = path.substring(0, exclPointIndex);
// Extract the schema entry name - not including the '!'
String schemaEntryName = path.substring(exclPointIndex + 1);
// If the schema entry starts with a '/', remove it
if (schemaEntryName.startsWith("/")) { //$NON-NLS-1$
schemaEntryName = schemaEntryName.substring(1);
}
// Open the schema in a new editor
SchemaEditor.openSchema(new File(jarFileName), schemaEntryName);
}
}