ca.uvic.chisel.javasketch.ui.internal.views.TraceNavigatorLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for ca.uvic.chisel.javasketch.ui.internal.views.TraceNavigatorLabelProvider.java

Source

/*******************************************************************************
 * 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;
        }
    }

}