/******************************************************************************* * Copyright (c) 2009 the CHISEL group and contributors. * 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 * * Contributors: * Del Myers - initial API and implementation *******************************************************************************/ package ca.uvic.chisel.javasketch.ui.internal.views; import java.text.DateFormat; import java.util.ArrayList; import java.util.Calendar; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.UIJob; import ca.uvic.chisel.javasketch.IDegreeOfInterest; import ca.uvic.chisel.javasketch.IProgramSketch; import ca.uvic.chisel.javasketch.ISketchInterestListener; import ca.uvic.chisel.javasketch.SketchInterestEvent; import ca.uvic.chisel.javasketch.SketchPlugin; import ca.uvic.chisel.javasketch.data.model.IThread; import ca.uvic.chisel.javasketch.data.model.ITrace; import ca.uvic.chisel.javasketch.data.model.ITraceModel; import ca.uvic.chisel.javasketch.internal.JavaSearchUtils; import ca.uvic.chisel.javasketch.ui.ISketchImageConstants; import ca.uvic.chisel.javasketch.ui.internal.OverlayIcon; public class TraceNavigatorLabelProvider extends CellLabelProvider { ListenerList labelListeners; private SketchInterestListener activationListener; private class UpdateJob extends UIJob { private Object[] elements; public UpdateJob(Object[] elements) { super("Updating Labels"); this.elements = elements; } /* (non-Javadoc) * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { for (Object o : labelListeners.getListeners()) { ILabelProviderListener listener = (ILabelProviderListener) o; LabelProviderChangedEvent event = new LabelProviderChangedEvent(TraceNavigatorLabelProvider.this, elements); listener.labelProviderChanged(event); } return Status.OK_STATUS; } } private class SketchInterestListener implements ISketchInterestListener { /* (non-Javadoc) * @see ca.uvic.chisel.javasketch.ISketchInterestListener#sketchInterestChanged(ca.uvic.chisel.javasketch.SketchInterestEvent) */ @Override public void sketchInterestChanged(SketchInterestEvent event) { ILaunchConfiguration lc = event.getSketch().getTracedLaunchConfiguration(); ArrayList<Object> elements = new ArrayList<Object>(); for (IProgramSketch sketch : SketchPlugin.getDefault().getStoredSketches(lc.getName())) { elements.add(sketch); if (sketch.isConnected()) { ITrace trace = sketch.getTraceData(); if (trace != null) { elements.addAll(trace.getThreads()); } } } new UpdateJob(elements.toArray()).schedule(); } } /** * */ public TraceNavigatorLabelProvider() { labelListeners = new ListenerList(); activationListener = new SketchInterestListener(); SketchPlugin.getDefault().getDOI().addSketchInterestListener(activationListener); } public Image getImage(Object element) { if (element instanceof IProgramSketch) { return buildSketchImage((IProgramSketch)element); } else if (element instanceof IThread) { return SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_THREAD_TRACE); } else if (element instanceof ILaunchConfiguration) { return SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_TRACE); } else if (element instanceof ParentedCalendar) { return SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_CALENDAR); } else if (element instanceof ITraceModel) { try { IJavaElement je = JavaSearchUtils.findElement((ITraceModel) element, new NullProgressMonitor()); if (je != null) { return (Image) je.getAdapter(Image.class); } } catch (InterruptedException e) { } catch (CoreException e) { } } // TODO Auto-generated method stub return null; } /** * @param element * @return */ private Image buildSketchImage(IProgramSketch element) { String key = ISketchImageConstants.ICON_PROCESS_TRACE; ImageDescriptor baseImage = SketchPlugin.getDefault().getImageRegistry().getDescriptor(key); if (element.isAnalysing()) { key = key + "." + ISketchImageConstants.OVERLAY_ANALYSE; baseImage = overlayAnalyze(baseImage, key); } if (element.isRunning()) { key = key + "." + ISketchImageConstants.OVERLAY_PLAY; baseImage = overlayPlay(baseImage, key); } else { key = key + "." + ISketchImageConstants.OVERLAY_STOP; baseImage = overlayStop(baseImage, key); } return SketchPlugin.getDefault().getImageRegistry().get(key); } /** * @param baseImage * @param key * @return */ private ImageDescriptor overlayStop(ImageDescriptor baseImage, String key) { ImageDescriptor image = SketchPlugin.getDefault().getImageRegistry().getDescriptor(key); if (image == null) { ImageDescriptor overlay = SketchPlugin.getDefault().getImageRegistry().getDescriptor(ISketchImageConstants.OVERLAY_STOP); image = new OverlayIcon(baseImage, overlay, OverlayIcon.LEFT, OverlayIcon.BOTTOM); SketchPlugin.getDefault().getImageRegistry().put(key, image); } return image; } /** * @param baseImage * @param key * @return */ private ImageDescriptor overlayPlay(ImageDescriptor baseImage, String key) { ImageDescriptor image = SketchPlugin.getDefault().getImageRegistry().getDescriptor(key); if (image == null) { ImageDescriptor overlay = SketchPlugin.getDefault().getImageRegistry().getDescriptor(ISketchImageConstants.OVERLAY_PLAY); image = new OverlayIcon(baseImage, overlay, OverlayIcon.LEFT, OverlayIcon.BOTTOM); SketchPlugin.getDefault().getImageRegistry().put(key, image); } return image; } /** * @param baseImage * @param key * @return */ private ImageDescriptor overlayAnalyze(ImageDescriptor baseImage, String key) { ImageDescriptor image = SketchPlugin.getDefault().getImageRegistry().getDescriptor(key); if (image == null) { ImageDescriptor overlay = SketchPlugin.getDefault().getImageRegistry().getDescriptor(ISketchImageConstants.OVERLAY_ANALYSE); image = new OverlayIcon(baseImage, overlay, OverlayIcon.RIGHT, OverlayIcon.TOP); SketchPlugin.getDefault().getImageRegistry().put(key, image); } return image; } public String getText(Object element) { if (element instanceof IThread) { IThread thread = (IThread) element; return thread.getName(); } else if (element instanceof IProgramSketch) { IProgramSketch sketch = (IProgramSketch) element; DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT); return sketch.getLabel() + " " + timeFormat.format(sketch.getProcessTime()); } else if (element instanceof IProject) { return ((IProject)element).getName(); } else if (element instanceof ParentedCalendar) { Calendar day = ((ParentedCalendar) element).getCalendar(); DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM); return format.format(day.getTime()); } else if (element instanceof ITraceModel) { try { IJavaElement je = JavaSearchUtils.findElement((ITraceModel) element, new NullProgressMonitor()); if (je != null) { return je.getElementName(); } } catch (InterruptedException e) { } catch (CoreException e) { } } return element.toString(); } @Override public void addListener(ILabelProviderListener listener) { labelListeners.add(listener); } @Override public void dispose() { labelListeners.clear(); SketchPlugin.getDefault().getDOI().removeSketchInterestListener(activationListener); } @Override public boolean isLabelProperty(Object element, String property) { return true; } @Override public void removeListener(ILabelProviderListener listener) { labelListeners.remove(listener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) */ @Override public void update(ViewerCell cell) { Object element = cell.getElement(); IProgramSketch sketch = null; Image image = null; if (element instanceof IProgramSketch) { sketch = (IProgramSketch) element; } else if (element instanceof IThread) { IThread thread = (IThread) element; sketch = SketchPlugin.getDefault().getSketch(thread); } switch (cell.getColumnIndex()) { case TraceNavigator.ACTIVE_TRACE_COLUMN: if (sketch != null) { if (sketch.equals(SketchPlugin.getDefault().getActiveSketch())) { cell.setImage(SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_TRACE_ACTIVE)); } else { cell.setImage(SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_TRACE_INACTIVE)); } } break; case TraceNavigator.LABEL_COLUMN: cell.setText(getText(element)); cell.setImage(getImage(element)); break; case TraceNavigator.VISIBLE_TRACE_COLUMN: if (sketch != null) { IDegreeOfInterest doi = SketchPlugin.getDefault().getDOI(); IProgramSketch activeSketch = SketchPlugin.getDefault().getActiveSketch(); if (activeSketch != null) { if (activeSketch.getTracedLaunchConfiguration().equals(sketch.getTracedLaunchConfiguration())) { TraceNavigator navigator = (TraceNavigator) PlatformUI. getWorkbench(). getActiveWorkbenchWindow(). getActivePage(). findView(TraceNavigator.VIEW_ID); if (navigator != null) { if (doi.isSketchHidden(sketch)) { image = SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_ELEMENT_FILTERED); } else { image = SketchPlugin.getDefault().getImageRegistry().get(ISketchImageConstants.ICON_ELEMENT_VISIBLE); } } } } } cell.setImage(image); break; } } }