/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package org.absmodels.abs.plugin.debug.views.debugview; import static org.absmodels.abs.plugin.debug.DebugUtils.getDebugger; import static org.absmodels.abs.plugin.debug.DebugUtils.getSchedulerRef; import static org.absmodels.abs.plugin.util.Constants.STYLER_BLACK; import static org.absmodels.abs.plugin.util.Constants.STYLER_GREY; import static org.absmodels.abs.plugin.util.Images.*; import java.util.List; import org.absmodels.abs.plugin.debug.model.Objects; import org.absmodels.abs.plugin.debug.model.Tasks; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.graphics.Image; import abs.backend.java.debugging.COGInfo; import abs.backend.java.debugging.DebugModel; import abs.backend.java.debugging.TaskState; import abs.backend.java.observing.COGView; import abs.backend.java.observing.MethodView; import abs.backend.java.observing.ObjectView; import abs.backend.java.observing.TaskStackFrameView; import abs.backend.java.observing.TaskView; /** * StyledLabelProvider for the TreeViewer of the DebugView. This class provides colored labels and icons * for the debug tree reflecting the state of tasks, COGs and other elements of the debugged program. * @author tfischer */ public class DebugTreeStyledLabelProvider extends StyledCellLabelProvider implements ILabelProvider{ public DebugTreeStyledLabelProvider(){ super(StyledCellLabelProvider.COLORS_ON_SELECTION); } @Override public Image getImage(Object element) { DebugModel model = getDebugger().getModel(); if(element instanceof DebugModel){ return DEBUGGER_PROGRAM; } else if(element instanceof COGView){ if(((COGView)element).getScheduler().getSchedulableTasks().size() > 0){ return DEBUGGER_COG; } else{ return DEBUGGER_COG_INACTIVE; } } else if(element instanceof TaskView){ if(model.getTaskInfo((TaskView)element).getState() == TaskState.READY){ return DEBUGGER_TASK_READY; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.SUSPENDED){ return DEBUGGER_TASK_SUSPENDED; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.RUNNING){ return DEBUGGER_TASK_RUNNING; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.FINISHED){ return DEBUGGER_TASK_FINISHED; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.DEADLOCKED){ return DEBUGGER_TASK_DEADLOCKED; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.ASSERTION_FAILED){ return DEBUGGER_TASK_ASSERTION_FAILED; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.EXCEPTION){ return DEBUGGER_TASK_EXCEPTION; } else if(model.getTaskInfo((TaskView)element).getState() == TaskState.BLOCKED){ return DEBUGGER_TASK_BLOCKED; } else{ return null; } } else if(element instanceof Tasks){ if(((Tasks)element).getCOG().getScheduler().getSchedulableTasks().size() > 0){ return DEBUGGER_TASKS; } else{ return DEBUGGER_TASKS_INACTIVE; } } else if(element instanceof TaskStackFrameView){ return DEBUGGER_STACK_FRAME; } else if(element instanceof Objects){ return DEBUGGER_OBJECTS; } else if(element instanceof ObjectView){ return DEBUGGER_OBJECT; } else{ return null; } } @Override public String getText(Object element) { return getLabel(element).toString(); } @Override public void update(ViewerCell cell) { Object obj = cell.getElement(); StyledString styledString = getLabel(obj); cell.setText(styledString.toString()); cell.setStyleRanges(styledString.getStyleRanges()); cell.setImage(getImage(obj)); super.update(cell); } private COGInfo getCOGInfo(COGView cog){ return getDebugger().getModel().getCOGInfo(cog); } private ObjectView getInitialObject(COGView cog){ return getCOGInfo(cog).getInitialObject(); } private StyledString getLabel(Object element){ if (element instanceof TaskView){ String s = "Task " + ((TaskView)element).getID() + " ("+((TaskView)element).getMethodName()+")"; List<TaskView> schedulableTasks = getSchedulerRef().getSchedulableTasks(); if(schedulableTasks!=null){ for(TaskView taskView : schedulableTasks){ if(taskView.getID() == ((TaskView)element).getID()){ return new StyledString(s, STYLER_BLACK); } } } return new StyledString(s, STYLER_GREY); } else if (element instanceof COGView){ COGView cog = (COGView) element; String s = "COG " + cog.getID() + " (" + getInitialObject(cog).getClassName() + " " + getInitialObject(cog).getID()+ ")"; //for color of the string, check if there is a task that can be stepped if(cog.getScheduler().getSchedulableTasks().size() > 0){ return new StyledString(s, STYLER_BLACK); } else{ return new StyledString(s, STYLER_GREY); } } else if (element instanceof Tasks){ String s = "Tasks (" + getCOGInfo(((Tasks)element).getCOG()).getTasks().size() + ")"; //for color of the string, check if there is a task that can be stepped if(((Tasks)element).getCOG().getScheduler().getSchedulableTasks().size() > 0){ return new StyledString(s, STYLER_BLACK); } else{ return new StyledString(s, STYLER_GREY); } } else if (element instanceof Objects){ return new StyledString("Objects (" + ((Objects)element).getObjects().size() + ")", STYLER_BLACK); } else if(element instanceof TaskStackFrameView){ TaskStackFrameView tsv = ((TaskStackFrameView)element); MethodView mv = tsv.getMethod(); return new StyledString("StackFrame (" + mv.toString() + ")", STYLER_BLACK); } else if(element instanceof ObjectView){ ObjectView obj = (ObjectView)element; return new StyledString(obj.getClassName() + " " + obj.getID(), STYLER_BLACK); } else if(element instanceof DebugModel){ return new StyledString(getDebugger().getProjectName(), STYLER_BLACK); } else { return new StyledString("UnknownObject", STYLER_GREY); } } }