package org.incha.ui.classview;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode;
import org.incha.core.jswingripples.eig.JSwingRipplesIMemberServices;
import org.incha.ui.jripples.EIGStatusMarks;
public abstract class AbstractMemberRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 5646472411943179112L;
protected final RootTypeIcon rootTypeIcon = new RootTypeIcon();
protected final FieldIcon fieldIcon = new FieldIcon();
protected final MethodIcon methodIcon = new MethodIcon();
/**
* Default constructor.
*/
public AbstractMemberRenderer() {
super();
}
/* (non-Javadoc)
* @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(final JTable t, final Object value,
final boolean isSelected, final boolean hasFocus, final int row, final int column) {
setBackground(null);
final JLabel label = (JLabel) super.getTableCellRendererComponent(
t, value, isSelected, hasFocus, row, column);
label.setHorizontalTextPosition(RIGHT);
final AbstractHierarchicalView view = (AbstractHierarchicalView) t;
final JSwingRipplesEIGNode node = (JSwingRipplesEIGNode) value;
if (node == null) {
return this;
}
try {
if (column == 0) {
final AbstractJavaElementIcon icon = getIcon(node);
if (icon != null) { // initializer can have not any icon
icon.setAccessType(getAccessType(node));
icon.setHierarchyOffset(view.getHierarchyOffset(node));
icon.setHasChildren(view.hasChildren(node));
icon.setExpanded(view.isExpanded(node));
}
if (node.getNodeIMember() instanceof IType) {
//expanded state
final IType type = (IType) node.getNodeIMember();
//access type
final int flags = type.getFlags();
//type (interface/enum/class)
if (Flags.isEnum(flags)) {
rootTypeIcon.setType(RootTypeIcon.ENUM);
} else if (Flags.isInterface(flags)) {
rootTypeIcon.setType(RootTypeIcon.INTERFACE);
} else {
rootTypeIcon.setType(RootTypeIcon.CLASS);
}
final String mark = node.getMark();
rootTypeIcon.setMarkImage(
EIGStatusMarks.getImageDescriptorForMark(mark == null ? "" : mark));
}
if (node.getNodeIMember() instanceof IInitializer) {
label.setText("{...}");
} else {
label.setText(node.getShortName());
}
label.setIcon(icon);
}
} catch (final JavaModelException e) {
e.printStackTrace();
}
renderOtherColumn(label, node, column);
return label;
}
/**
* @param member
* @return
*/
private AbstractJavaElementIcon getIcon(final JSwingRipplesEIGNode node) {
final IMember member = node.getNodeIMember();
if (member instanceof IType) {
return rootTypeIcon;
} else if (member instanceof IField) {
return fieldIcon;
} else if (member instanceof IInitializer) {
return methodIcon;
} else if (member instanceof IMethod) {
return methodIcon;
}
return null;
}
/**
* @param label
* @param member
* @param column
*/
protected abstract void renderOtherColumn(final JLabel label, final JSwingRipplesEIGNode member,
final int column);
/**
* @param member
* @return
*/
protected String getFullName(final JSwingRipplesEIGNode node) {
final IMember member = node.getNodeIMember();
String fullName;
if(member==null) return "";
if (member instanceof IType) fullName=((IType) member).getFullyQualifiedName();
else {fullName=JSwingRipplesIMemberServices.getTopDeclaringType(member).getFullyQualifiedName()+"::"+member.getElementName();
}
if (fullName!=null) return fullName;
return "";
}
/**
* @param member
* @return
* @throws JavaModelException
*/
protected int getAccessType(final JSwingRipplesEIGNode member) throws JavaModelException {
final int flags = member.getNodeIMember().getFlags();
if (Flags.isPrivate(flags)) {
return AbstractMemberIcon.PRIVATE;
}
if (Flags.isPackageDefault(flags)) {
return AbstractMemberIcon.DEFAULT;
}
if (Flags.isProtected(flags)) {
return AbstractMemberIcon.PROTECTED;
}
if (Flags.isPublic(flags)) {
return AbstractMemberIcon.PUBLIC;
}
return 0;
}
}