package com.netifera.platform.ui.tasks.list; import java.text.DateFormat; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import com.netifera.platform.api.tasks.ITaskRecord; import com.netifera.platform.ui.images.ImageCache; import com.netifera.platform.ui.internal.tasks.TasksPlugin; public class TaskLabelProvider extends LabelProvider implements ITableLabelProvider { private static final String TASK_WAITING_IMAGE = "icons/ledyellow_16x16.png"; private static final String TASK_RUNNING_IMAGE = "icons/ledgreen_16x16.png"; private static final String TASK_FINISHED_IMAGE = "icons/ledoff_16x16.png"; private static final String TASK_FAILED_IMAGE = "icons/ledred_16x16.png"; static final int SECONDS = 1000; static final int MINUTES = SECONDS * 60; static final int HOURS = MINUTES * 60; static final int DAYS = HOURS * 24; @Override public String getText(Object element) { if (!(element instanceof ITaskRecord)) { return element.toString(); } ITaskRecord taskRecord = (ITaskRecord) element; return getTaskName(taskRecord); } @Override public Image getImage(Object element) { if (!(element instanceof ITaskRecord)) { return null; } ITaskRecord taskRecord = (ITaskRecord) element; ImageCache images = TasksPlugin.getPlugin().getImageCache(); if (taskRecord.isWaiting()) { return images.get(TASK_WAITING_IMAGE); } else if (taskRecord.isRunning()) { return images.get(TASK_RUNNING_IMAGE); } else if (taskRecord.isFinished()) { return images.get(TASK_FINISHED_IMAGE); } return images.get(TASK_FAILED_IMAGE); } public Image getColumnImage(Object element, int columnIndex) { return (columnIndex != 0) ? null : getImage(element); } /** * Return text string to display for given element in the indicated column */ public String getColumnText(Object element, int columnIndex) { if ((element instanceof ITaskRecord) == false) { return "??"; } ITaskRecord tr = (ITaskRecord) element; switch (columnIndex) { case 0: return ""; case 1: /* label */ return getText(element); case 2: /* start time */ return getStartTime(tr); case 3: /* elapsed time */ return getElapsedTime(tr); default: return "? " + columnIndex; } } public String getTaskName(ITaskRecord taskRecord) { //TODO should use the action name String name = taskRecord.getTitle(); return name == null ? "Untitled task" : name; } /** * Content description for tasks. A short text describing the selected task and * its status. For example: * <status> title [tool name ] summary of the input (time reference) (short task id) * @param taskRecord a TaskRecord */ public String getDescription(ITaskRecord taskRecord) { return "<" + getState(taskRecord) + "> " + getTaskName(taskRecord) + " (" + getStartTime(taskRecord) + ")"; } public String getStartTime(ITaskRecord taskRecord) { long startTime = taskRecord.getStartTime(); if(startTime != 0) { /* * KLUDGE: thread-safe DateFormat * * creates a new instance of a Format object for each invocation * (performance hit) */ return DateFormat.getInstance().format(startTime); } /*start time not set and status is not waiting then the task never run*/ return taskRecord.isWaiting() ? "Waiting ..." : "Never"; } /** * @param taskRecord * @return English word representing the task status */ public String getState(ITaskRecord taskRecord) { return taskRecord.getStateDescription(); } public String getElapsedTime(ITaskRecord taskRecord) { long millis = taskRecord.getElapsedTime(); if (millis == 0) { return "00:00:00"; } StringBuffer sb = new StringBuffer(); if (millis < 0) { sb.append('-'); millis = -millis; } if(millis < SECONDS) { sb.append(millis); sb.append(" milliseconds"); return sb.toString(); } if(millis < MINUTES) { sb.append(millis / SECONDS); sb.append(" seconds"); return sb.toString(); } long day = millis / DAYS; if (day != 0) { sb.append(day); sb.append(" days "); millis = millis % DAYS; } long hours = millis / HOURS; millis = millis % HOURS; long minutes = millis / MINUTES; millis = millis % MINUTES; long seconds = millis / SECONDS; millis = millis % SECONDS; if(hours < 10) sb.append('0'); sb.append(hours); sb.append(':'); if(minutes < 10) sb.append('0'); sb.append(minutes); sb.append(':'); if(seconds < 10) sb.append('0'); sb.append(seconds); return sb.toString(); } }