blob: 7bee99b3f9e466e751e2b2a63908f8172ac07d01 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.iproduct.IProduct;
import org.eclipse.pde.internal.core.util.CoreUtility;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.product.LauncherSection;
import org.eclipse.pde.internal.ui.editor.validation.IValidatorMessageHandler;
import org.eclipse.pde.internal.ui.parts.FormEntry;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
public class EditorUtilities {
private static final int F_EXACT_IMAGE_SIZE = 0;
private static final int F_MAX_IMAGE_SIZE = 1;
private static final int F_ICO_IMAGE = 2;
private static final int F_IMAGE_DEPTH = 3;
static class ValidationMessage {
String fMessage;
int fSeverity = IMessageProvider.WARNING;
ValidationMessage(String message) {
fMessage = message;
}
}
static class ValidationInfo {
int maxWidth, maxHeight, warningWidth, warningHeight, requiredDepth;
}
private static ImageData[] getImageData(IValidatorMessageHandler validator, FormEntry provider, IProduct product) {
String imagePath = provider.getText().getText();
String message = null;
try {
IPath path = getFullPath(new Path(imagePath), product);
URL url = new URL(path.toString());
ImageLoader loader = new ImageLoader();
try (InputStream stream = url.openStream()) {
ImageData[] idata = loader.load(stream);
if (idata != null && idata.length > 0)
return idata;
}
message = PDEUIMessages.EditorUtilities_noImageData;
} catch (SWTException e) {
message = PDEUIMessages.EditorUtilities_pathNotValidImage;
} catch (IOException e) {
message = PDEUIMessages.EditorUtilities_invalidFilePath;
}
validator.addMessage(message, IMessageProvider.WARNING);
return null;
}
private static boolean containsEmptyField(FormEntry provider) {
return provider.getText().getText().length() == 0;
}
private static boolean imageEntryInternalValidate(IValidatorMessageHandler validator, FormEntry provider, IProduct product, ValidationInfo info, int validationType) {
if (containsEmptyField(provider))
return true;
ImageData[] idata = getImageData(validator, provider, product);
if (idata == null)
return false;
ValidationMessage ms = null;
switch (validationType) {
case F_MAX_IMAGE_SIZE :
ms = getMS_maxImageSize(idata[0], info.maxWidth, info.maxHeight, info.warningWidth, info.warningHeight);
break;
case F_ICO_IMAGE :
ms = getMS_icoImage(idata);
break;
case F_IMAGE_DEPTH : // do not break after F_IMAGEDEPTH since we are also checking exact size
ms = getMS_imageDepth(idata[0], info.requiredDepth);
case F_EXACT_IMAGE_SIZE :
if (ms == null)
ms = getMS_exactImageSize(idata[0], info.maxWidth, info.maxHeight);
break;
}
if (ms != null) {
validator.addMessage(ms.fMessage, ms.fSeverity);
}
return ms == null;
}
public static boolean imageEntryHasValidIco(IValidatorMessageHandler validator, FormEntry provider, IProduct product) {
ValidationInfo info = new ValidationInfo();
return imageEntryInternalValidate(validator, provider, product, info, F_ICO_IMAGE);
}
public static boolean imageEntrySizeDoesNotExceed(IValidatorMessageHandler validator, FormEntry provider, IProduct product, int mwidth, int mheight, int wwidth, int wheight) {
ValidationInfo info = new ValidationInfo();
info.maxWidth = mwidth;
info.maxHeight = mheight;
info.warningWidth = wwidth;
info.warningHeight = wheight;
return imageEntryInternalValidate(validator, provider, product, info, F_MAX_IMAGE_SIZE);
}
public static boolean imageEntryHasExactSize(IValidatorMessageHandler validator, FormEntry provider, IProduct product, int width, int height) {
ValidationInfo info = new ValidationInfo();
info.maxWidth = width;
info.maxHeight = height;
return imageEntryInternalValidate(validator, provider, product, info, F_EXACT_IMAGE_SIZE);
}
public static boolean imageEntryHasExactDepthAndSize(IValidatorMessageHandler validator, FormEntry provider, IProduct product, int width, int height, int depth) {
ValidationInfo info = new ValidationInfo();
info.maxWidth = width;
info.maxHeight = height;
info.requiredDepth = depth;
return imageEntryInternalValidate(validator, provider, product, info, F_IMAGE_DEPTH);
}
private static ValidationMessage getMS_icoImage(ImageData[] imagedata) {
int totalSizes = LauncherSection.F_WIN_ICON_DIMENSIONS.length;
boolean[] found = new boolean[totalSizes];
for (ImageData data : imagedata) {
int width = data.width;
int height = data.height;
int depth = data.depth;
for (int w = 0; w < totalSizes; w++)
if (width == LauncherSection.F_WIN_ICON_DIMENSIONS[w][0] && height == LauncherSection.F_WIN_ICON_DIMENSIONS[w][1] && depth == LauncherSection.F_WIN_ICON_DEPTHS[w])
found[w] = true;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < found.length; i++) {
if (!found[i]) {
if (sb.length() == 0)
sb.append(PDEUIMessages.EditorUtilities_icoError);
else
sb.append(", "); //$NON-NLS-1$
int width = LauncherSection.F_WIN_ICON_DIMENSIONS[i][0];
int height = LauncherSection.F_WIN_ICON_DIMENSIONS[i][1];
int depth = LauncherSection.F_WIN_ICON_DEPTHS[i];
sb.append(NLS.bind(PDEUIMessages.EditorUtilities_missingIcoNote, getSizeString(width, height), Integer.toString(depth)));
}
}
if (sb.length() > 0)
return new ValidationMessage(sb.toString());
return null;
}
private static ValidationMessage getMS_exactImageSize(ImageData imagedata, int mwidth, int mheight) {
int width = imagedata.width;
int height = imagedata.height;
if (width != mwidth || height != mheight)
return new ValidationMessage(NLS.bind(PDEUIMessages.EditorUtilities_incorrectSize, getSizeString(width, height)));
return null;
}
private static ValidationMessage getMS_maxImageSize(ImageData imagedata, int mwidth, int mheight, int wwidth, int wheight) {
int width = imagedata.width;
int height = imagedata.height;
if (width > mwidth || height > mheight)
return new ValidationMessage(NLS.bind(PDEUIMessages.EditorUtilities_imageTooLarge, getSizeString(width, height)));
else if (width > wwidth || height > wheight)
return new ValidationMessage(NLS.bind(PDEUIMessages.EditorUtilities_imageTooLargeInfo, getSizeString(wwidth, wheight)));
return null;
}
private static ValidationMessage getMS_imageDepth(ImageData imagedata, int depth) {
if (imagedata.depth != depth)
return new ValidationMessage(NLS.bind(PDEUIMessages.EditorUtilities_incorrectImageDepth, Integer.toString(imagedata.depth)));
return null;
}
private static String getSizeString(int width, int height) {
return width + " x " + height; //$NON-NLS-1$
}
private static IPath getFullPath(IPath path, IProduct product) throws MalformedURLException {
String filePath = path.toString();
IWorkspaceRoot root = PDEPlugin.getWorkspace().getRoot();
// look in root
if (filePath.indexOf('/') == 0) {
IResource resource = root.findMember(filePath);
if (resource != null)
return new Path("file:", resource.getLocation().toString()); //$NON-NLS-1$
throw new MalformedURLException();
}
// look in project
IProject project = product.getModel().getUnderlyingResource().getProject();
IResource resource = project.findMember(filePath);
if (resource != null)
return new Path("file:", resource.getLocation().toString()); //$NON-NLS-1$
// look in external models
IPluginModelBase model = PluginRegistry.findModel(product.getDefiningPluginId());
if (model != null && model.getInstallLocation() != null) {
File modelNode = new File(model.getInstallLocation());
String pluginPath = modelNode.getAbsolutePath();
if (modelNode.isFile() && CoreUtility.jarContainsResource(modelNode, filePath, false))
return new Path("jar:file:", pluginPath + "!/" + filePath); //$NON-NLS-1$ //$NON-NLS-2$
return new Path("file:", pluginPath + "/" + filePath); //$NON-NLS-1$ //$NON-NLS-2$
}
// no file found - throw exception
throw new MalformedURLException();
}
private static IPath getRootPath(IPath path, String definingPluginId) {
IPluginModelBase model = PluginRegistry.findModel(definingPluginId);
if (model != null && model.getInstallLocation() != null) {
IPath newPath = new Path(model.getInstallLocation()).append(path);
IWorkspaceRoot root = PDEPlugin.getWorkspace().getRoot();
IContainer container = root.getContainerForLocation(newPath);
if (container != null)
return container.getFullPath();
}
return path;
}
private static IResource getImageResource(String value, String definingPluginId) {
if (value == null)
return null;
IPath path = new Path(value);
if (path.isEmpty())
return null;
if (!path.isAbsolute()) {
path = getRootPath(path, definingPluginId);
}
IWorkspaceRoot root = PDEPlugin.getWorkspace().getRoot();
return root.findMember(path);
}
public static void openImage(String value, String definingPluginId) {
IResource resource = getImageResource(value, definingPluginId);
try {
if (resource != null && resource instanceof IFile)
IDE.openEditor(PDEPlugin.getActivePage(), (IFile) resource, true);
else
MessageDialog.openWarning(PDEPlugin.getActiveWorkbenchShell(), PDEUIMessages.AboutSection_open, PDEUIMessages.AboutSection_warning); //
} catch (PartInitException e) {
}
}
}