Newer
Older
org.ntlab.traceDebugger / src / org / ntlab / traceDebugger / VariableLabelProvider.java
package org.ntlab.traceDebugger;

import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.ntlab.traceDebugger.Variable.VariableType;
import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager;

public class VariableLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider {
	public static final String SPECIAL_VARIABLE = "SpecialVariable";
	public static final String THIS_VARIABLE = "ThisVariable";
	public static final String FIELD_VARIABLE = "FieldVariable";
	public static final String ARG_VARIABLE = "ArgVariable";

	@Override
	public String getColumnText(Object element, int columnIndex) {
		if (element instanceof TreeNode) {
			Object value = ((TreeNode)element).getValue();
			if (value instanceof String) {
				String name = (String)value;
				switch (columnIndex) {
				case 0:
					if (name.contains("Constructor")) {
						return name.substring(0, name.indexOf("Constructor"));
					}
					return name.substring(0, name.indexOf(":"));
				case 1:
					String valueName = name.substring(name.indexOf(":") + 1);
					valueName = valueName.substring(valueName.lastIndexOf(" ") + 1);
					boolean isConstructor = name.contains("Constructor");
					return getReadableName(valueName, isConstructor);
				}
			}
			if (value instanceof Variable) {
				Variable variableData = (Variable)value;
				String variableName = variableData.getVariableName();
				switch (columnIndex) {
				case 0:
					if (variableName.contains("[")) {
						return variableName.substring(variableName.lastIndexOf("["));
					} else if (variableName.contains(".")) {
						return variableName.substring(variableName.lastIndexOf(".") + 1);	
					}
					return variableName;
				case 1:
					String simpleName;
					String id;
					if (variableData.getVariableType().isContainerSide()) {
						simpleName = variableData.getContainerClassName();
						id = variableData.getContainerId();
					} else {
						simpleName = variableData.getValueClassName();
						id = variableData.getValueId();
					}
					simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1);
					if (simpleName.equals(Variable.NULL_VALUE)) {
						return simpleName;
					} else {
						return simpleName + " (" + "id = " + id + ")";	
					}
				}
			}
		}
		return "テスト用テキスト" + columnIndex;
	}
	
	@Override
	public Image getColumnImage(Object element, int columnIndex) {
		if (columnIndex != 0) return null;
		ImageRegistry registry = TraceDebuggerPlugin.getDefault().getImageRegistry();
		if (element instanceof TreeNode) {
			Object value = ((TreeNode)element).getValue();
			if (value instanceof String) {
				return registry.getDescriptor(SPECIAL_VARIABLE).createImage();
			} else if (value instanceof Variable) {
				Variable variable = (Variable)value;
				VariableType variableType = variable.getVariableType();
				if (variable.getVariableName().equals("this")) {
					return registry.getDescriptor(THIS_VARIABLE).createImage();
				} else if (variableType == VariableType.PARAMETER){
					return registry.getDescriptor(ARG_VARIABLE).createImage();
				} else if (variableType.isContainerSide()) {
					return registry.getDescriptor(THIS_VARIABLE).createImage();
				} else {
					return registry.getDescriptor(FIELD_VARIABLE).createImage();
				}				
			}
		}
		return null;
	}
	
	@Override
	public Image getImage(Object element) {
		return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
	}

	@Override
	public Color getForeground(Object element, int columnIndex) {
		return null;
	}

	@Override
	public Color getBackground(Object element, int columnIndex) {
		if (element instanceof TreeNode) {
			Object value = ((TreeNode)element).getValue();
			if (value instanceof Variable) {
				Variable variable = (Variable)value;
				Object markerId = variable.getAdditionalAttribute("markerId");
				if (!(markerId instanceof String)) return null;
				switch ((String)markerId) {
				case DeltaMarkerManager.SRC_SIDE_DELTA_MARKER:
					return DeltaMarkerLabelProvider.SETTER_SIDE_LABEL_COLOR;
				case DeltaMarkerManager.DST_SIDE_DELTA_MARKER:
					return DeltaMarkerLabelProvider.GETTER_SIDE_LABEL_COLOR;
				case DeltaMarkerManager.COORDINATOR_DELTA_MARKER:
					return DeltaMarkerLabelProvider.COORDINATOR_LABEL_COLOR;
				}
			}
		}
		return null;
	}
	
	private String getReadableName(String name, boolean isConstrutor) {
		if (!(name.contains("("))) {
			String[] splits = name.split("\\.");
			if (splits.length < 2) return name;
			return splits[splits.length - 2] + "." + splits[splits.length - 1];
		}
		StringBuilder sb = new StringBuilder();	
		String receiverTypeAndMethodName = name.substring(0, name.indexOf("("));
		String[] receiverTypeAndMethodNameSplits = receiverTypeAndMethodName.split("\\."); 
		if (receiverTypeAndMethodNameSplits.length < 2) {
			sb.append(receiverTypeAndMethodName);
		} else {
			if (!isConstrutor) {
				sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 2]);
				sb.append(".");
			}
			sb.append(receiverTypeAndMethodNameSplits[receiverTypeAndMethodNameSplits.length - 1]);
		}
		sb.append("(");
		String argsName = name.substring(name.indexOf("(") + 1, name.lastIndexOf(")"));
		String delimiter = "";
		for (String argName : argsName.split(",")) {
			String[] argNameSplits = argName.split("\\.");
			if (argNameSplits.length < 1) {
				sb.append(delimiter + argName);
			} else {
				sb.append(delimiter + argNameSplits[argNameSplits.length - 1]);
			}
			delimiter = ",";
		}
		sb.append(")");
		return sb.toString();		
	}
}