/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.internal.ui.editor;
import org.deved.antlride.common.ui.AntlrImages;
import org.deved.antlride.core.model.ElementKind;
import org.deved.antlride.ui.AntlrUI;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
public class AntlrOutlineLabelDecorator extends LabelProvider implements
ILabelDecorator {
public String decorateText(String text, Object element) {
return text;
}
public Image decorateImage(Image image, Object element) {
String compositeImageName = null;
Image baseImage = null;
int imageDirection = SWT.LEFT;
try {
if (element instanceof IMember) {
IMember member = (IMember) element;
if (member.exists()) {
if (member.getElementType() == IMember.FIELD) {
IField field = (IField) member;
int modifiers = field.getFlags();
if (modifiers == ElementKind.GRAMMAR_ACTION.ordinal()
|| modifiers == ElementKind.RULE_ACTION
.ordinal()) {
compositeImageName = AntlrImages.ACTION;
}
} else if (member.getElementType() == IMember.METHOD) {
IMethod rule = (IMethod) member;
if (Character.isUpperCase(rule.getElementName().charAt(
0))) {
compositeImageName = AntlrImages.LEXER_RULE;
baseImage = image;
imageDirection = SWT.RIGHT;
}
} else if (member.getElementType() == IMember.TYPE) {
IType type = (IType) member;
if (type.getFlags() == ElementKind.GRAMMAR_SCOPE
.ordinal()) {
compositeImageName = AntlrImages.SCOPE;
}
}
}
}
} catch (ModelException e) {
AntlrUI.error(e);
}
if (compositeImageName != null) {
Image compositeImage = AntlrImages.getImage(compositeImageName, true);
if(compositeImage == null) {
compositeImage = AntlrImages.createCompositeImage(compositeImageName, getImageSize(image), imageDirection, baseImage);
}
return compositeImage;
}
return image;
}
private Point getImageSize(Image image) {
Rectangle bounds = image.getBounds();
Point size = new Point(bounds.width, bounds.height);
return size;
}
}