blob: f095c7e89c80e1c1d911a9654ff8ce40968cd438 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2000, 2020 IBM Corporation and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# IBM Corporation - org.eclipse.jdt: initial API and implementation
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.internal.ltk.buildpaths.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.statet.ecommons.ui.SharedUIResources;
import org.eclipse.statet.ltk.buildpaths.ui.BuildpathsUIResources;
public class BuildpathElementImageDescriptor extends CompositeImageDescriptor {
/** Flag to render the info adornment. */
public final static int INFO= 0b0_0000_0000_0001;
/** Flag to render the warning adornment. */
public final static int WARNING= 0b0_0000_0000_0010;
/** Flag to render the error adornment. */
public final static int ERROR= 0b0_0000_0000_0100;
/**
* Flag to render the 'deprecated' adornment.
*/
public final static int DEPRECATED= 0b0_0000_0001_0000;
/**
* Flag to render the 'ignore optional compile problems' adornment.
*/
public final static int IGNORE_OPTIONAL_PROBLEMS= 0b0_0001_0000_0000;
private static ImageData getImageData(final ImageDescriptor descriptor) {
ImageData data= descriptor.getImageData(); // see bug 51965: getImageData can return null
if (data == null) {
data= DEFAULT_IMAGE_DATA;
StatusManager.getManager().handle(new Status(IStatus.WARNING, BuildpathsUIPlugin.BUNDLE_ID,
"Image data not available: " + descriptor.toString() )); //$NON-NLS-1$
}
return data;
}
private final ImageDescriptor baseImage;
private final int flags;
private final Point size;
/**
* Creates a new JavaElementImageDescriptor.
*
* @param baseImage an image descriptor used as the base image
* @param flags flags indicating which adornments are to be rendered. See {@link #setAdornments(int)}
* for valid values.
* @param size the size of the resulting image
*/
public BuildpathElementImageDescriptor(final ImageDescriptor baseImage, final int flags, final Point size) {
if (baseImage == null) {
throw new NullPointerException("baseImage"); //$NON-NLS-1$
}
this.baseImage= baseImage;
this.flags= flags;
if (size != null) {
this.size= size;
}
else {
final ImageData data= getImageData(baseImage);
this.size= new Point(data.width, data.height);
}
}
protected final ImageDescriptor getBaseImage() {
return this.baseImage;
}
protected final int getFlags() {
return this.flags;
}
@Override
protected final Point getSize() {
return this.size;
}
@Override
protected void drawCompositeImage(final int width, final int height) {
if ((this.flags & DEPRECATED) != 0) { // draw *behind* the full image
final Point size= getSize();
final ImageData data= getImageData(SharedUIResources.INSTANCE.getImageDescriptor(
SharedUIResources.OVR_DEPRECATED_IMAGE_ID ));
drawImage(data, 0, size.y - data.height);
}
{ final ImageData data= getImageData(getBaseImage());
drawImage(data, 0, 0);
}
drawTopRight();
drawBottomRight();
drawBottomLeft();
}
private void addTopRightImage(final ImageDescriptor desc, final Point pos) {
final ImageData data= getImageData(desc);
final int x= pos.x - data.width;
if (x >= 0) {
drawImage(data, x, pos.y);
pos.x= x;
}
}
private void addBottomRightImage(final ImageDescriptor desc, final Point pos) {
final ImageData data= getImageData(desc);
final int x= pos.x - data.width;
final int y= pos.y - data.height;
if (x >= 0 && y >= 0) {
drawImage(data, x, y);
pos.x= x;
}
}
private void addBottomLeftImage(final ImageDescriptor desc, final Point pos) {
final ImageData data= getImageData(desc);
final int x= pos.x;
final int y= pos.y - data.height;
if (x + data.width < getSize().x && y >= 0) {
drawImage(data, x, y);
pos.x= x + data.width;
}
}
private void drawTopRight() {
}
private void drawBottomRight() {
}
private void drawBottomLeft() {
final Point pos= new Point(0, getSize().y);
if ((this.flags & INFO) != 0) {
addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
SharedUIResources.OVR_INFO_IMAGE_ID ), pos );
}
if ((this.flags & WARNING) != 0) {
addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
SharedUIResources.OVR_WARNING_IMAGE_ID ), pos );
}
if ((this.flags & ERROR) != 0) {
addBottomLeftImage(SharedUIResources.INSTANCE.getImageDescriptor(
SharedUIResources.OVR_WARNING_IMAGE_ID ), pos );
}
if ((this.flags & IGNORE_OPTIONAL_PROBLEMS) != 0) {
addBottomLeftImage(BuildpathsUIResources.INSTANCE.getImageDescriptor(
BuildpathsUIPlugin.OVR_IGNORE_OPTIONAL_PROBLEMS_IMAGE_ID ), pos );
}
}
@Override
public int hashCode() {
return (this.baseImage.hashCode() ^ this.flags) + this.size.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj != null && getClass().equals(obj.getClass())) {
final BuildpathElementImageDescriptor other= (BuildpathElementImageDescriptor) obj;
return (this.baseImage.equals(other.baseImage)
&& this.flags == other.flags
&& this.size.equals(other.size) );
}
return false;
}
}