com.arc.cdt.debug.seecode.ui.views.SeeCodeErrorLogView.java Source code

Java tutorial

Introduction

Here is the source code for com.arc.cdt.debug.seecode.ui.views.SeeCodeErrorLogView.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2012 Synopsys, Incorporated
 * 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:
 * Synopsys, Inc - Initial implementation 
 *******************************************************************************/
package com.arc.cdt.debug.seecode.ui.views;

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

import org.eclipse.cdt.debug.core.cdi.ICDISession;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.contexts.DebugContextEvent;
import org.eclipse.debug.ui.contexts.IDebugContextListener;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import com.arc.cdt.debug.seecode.core.ISeeCodeConstants;
import com.arc.cdt.debug.seecode.core.SeeCodePlugin;
import com.arc.cdt.debug.seecode.ui.UISeeCodePlugin;
import com.arc.cdt.debug.seecode.ui.Utilities;
import com.arc.seecode.engine.EngineInterface;

/**
 * @author dpickens
 */
public class SeeCodeErrorLogView extends ViewPart implements IPropertyChangeListener {

    public static final String VIEW_ID = "com.arc.cdt.seecode.errorlog";

    private boolean fIsVisible = false;

    private StackLayout mCardLayout;

    private Composite mBlank;

    private Composite mCards;

    private EngineInterface fEngine;

    private Map<EngineInterface, Text> fMap = new WeakHashMap<EngineInterface, Text>();

    // This must be static so that we can keep the state of things going even when the view is dismissed.
    // Is there a better way to do this?
    private static Map<EngineInterface, StringBuilder> fContent = new HashMap<EngineInterface, StringBuilder>();

    private static ILaunchesListener fLaunchListener = null;

    private IDebugContextListener mDebugContextListener = new IDebugContextListener() {

        @Override
        public void debugContextChanged(DebugContextEvent event) {
            if (fIsVisible)
                setSelection(event.getContext());

        }
    };

    private IPartListener2 fPartListener = new IPartListener2() {

        @Override
        public void partActivated(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partBroughtToTop(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partClosed(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partDeactivated(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partHidden(IWorkbenchPartReference partRef) {
            if (partRef.getPart(false) == SeeCodeErrorLogView.this) {
                // System.out.println("HIDDEN");
                fIsVisible = false;
            }
        }

        @Override
        public void partInputChanged(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partOpened(IWorkbenchPartReference partRef) {
        }

        @Override
        public void partVisible(IWorkbenchPartReference partRef) {
            if (partRef.getPart(false) == SeeCodeErrorLogView.this) {
                fIsVisible = true;
                // System.out.println("SHOWN");
                resetSelection();
            }
        }
    };

    public void write(final EngineInterface engine, final String string) {
        Display display = PlatformUI.getWorkbench().getDisplay();
        if (display.getThread() == Thread.currentThread()) {
            try {
                if (!fIsVisible)
                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(VIEW_ID);
            } catch (PartInitException e) {
                UISeeCodePlugin.log(e);
            }
            StringBuilder buf = fContent.get(engine);
            if (buf == null) {
                buf = new StringBuilder();
                fContent.put(engine, buf);
            }
            int maxSize = SeeCodePlugin.getDefault().getPreferences()
                    .getInt(ISeeCodeConstants.PREF_MAX_ERROR_LOG_SIZE, ISeeCodeConstants.DEF_MAX_ERROR_LOG_SIZE);
            if (buf.length() + string.length() > maxSize) {
                if (string.length() >= maxSize)
                    buf.delete(0, buf.length());
                else
                    buf.delete(0, maxSize - string.length());
            }
            buf.append(string);
            if (fEngine != engine) {
                setEngine(engine);
            } else {
                Text t = fMap.get(engine);
                if (t != null) {
                    t.setText(buf.toString());
                }
            }
        } else {
            display.syncExec(new Runnable() {
                @Override
                public void run() {
                    write(engine, string);
                }
            });
        }
    }

    @Override
    public void createPartControl(Composite parent) {
        mCards = new Composite(parent, 0);
        mCardLayout = new StackLayout();
        mCards.setLayout(mCardLayout);
        mBlank = new Composite(mCards, 0);
        mCardLayout.topControl = mBlank;
        // listen to selection in debug view
        IWorkbenchWindow w = this.getViewSite().getWorkbenchWindow();
        DebugUITools.getDebugContextManager().getContextService(w).addDebugContextListener(mDebugContextListener);
        getSite().getPage().addPartListener(fPartListener);

        setFont();
        setColor();
        JFaceResources.getFontRegistry().addListener(this);
        JFaceResources.getColorRegistry().addListener(this);
        fIsVisible = true;
        resetSelection();

        if (fLaunchListener == null) {
            // Remove engine's error log cache when reference is removed from Launch View.
            fLaunchListener = new ILaunchesListener() {

                @Override
                public void launchesRemoved(ILaunch[] launches) {
                    for (ILaunch launch : launches) {
                        IDebugTarget targets[] = launch.getDebugTargets();
                        for (IDebugTarget target : targets) {
                            ICDISession session = (ICDISession) target.getAdapter(ICDISession.class);
                            for (ICDITarget cdiTarget : session.getTargets()) {
                                if (cdiTarget instanceof IAdaptable) {
                                    EngineInterface engine = (EngineInterface) ((IAdaptable) cdiTarget)
                                            .getAdapter(EngineInterface.class);
                                    if (engine != null) {
                                        fContent.remove(engine);
                                    }
                                }
                            }
                        }
                    }
                }

                @Override
                public void launchesAdded(ILaunch[] launches) {
                }

                @Override
                public void launchesChanged(ILaunch[] launches) {

                }
            };
            DebugPlugin.getDefault().getLaunchManager().addLaunchListener(fLaunchListener);
        }
    }

    private void setFont() {
        Font font = UISeeCodePlugin.getSeeCodeFont();
        for (Text t : fMap.values()) {
            t.setFont(font);
        }
    }

    private void setColor() {
        Color background = (Color) UISeeCodePlugin.getColorPreferences().getErrorLogBackgroundColor().getObject();
        Color foreground = (Color) UISeeCodePlugin.getColorPreferences().getErrorLogForegroundColor().getObject();

        for (Text t : fMap.values()) {
            t.setBackground(background);
            t.setForeground(foreground);
        }
    }

    protected void setEngineSource(final IStructuredSelection selection) {
        if (fIsVisible && !selection.isEmpty()) {
            // At this point, we are NOT in the UI thread.
            final EngineInterface engine = Utilities.computeEngineFromSelection(selection);
            if (engine != null) {
                setEngine(engine);
            }
        }
    }

    private void resetSelection() {
        setSelection(getSite().getPage().getSelection(IDebugUIConstants.ID_DEBUG_VIEW));
    }

    protected void clearDisplay() {
        mCardLayout.topControl = mBlank;
        if (!mCards.isDisposed()) {
            mCards.layout();
            mCards.redraw();
        }
    }

    public void setEngine(final EngineInterface engine) {
        Display d = PlatformUI.getWorkbench().getDisplay();
        if (d.getThread() != Thread.currentThread()) {
            d.syncExec(new Runnable() {

                @Override
                public void run() {
                    setEngine(engine);
                }
            });
            return;
        }
        if (fEngine != engine && engine != null) {
            Text t = fMap.get(engine);
            if (t == null) {
                ICDITarget target = SeeCodePlugin.getEngineTarget(engine);
                if (target != null) {
                    t = new Text(mCards, SWT.WRAP | SWT.READ_ONLY);
                    fMap.put(engine, t);
                    setColor();
                    setFont();
                } else
                    return;
            }
            StringBuilder b = fContent.get(engine);
            t.setText(b != null ? b.toString() : "");
            fEngine = engine;
            mCardLayout.topControl = t;
            mCards.layout();
            mCards.redraw();
        }
    }

    protected void setSelection(ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            setEngineSource((IStructuredSelection) selection);
        }
    }

    @Override
    public void setFocus() {
        // TODO Auto-generated method stub

    }

    @Override
    public void propertyChange(PropertyChangeEvent event) {
        String prop = event.getProperty();
        if (prop.equals(UISeeCodePlugin.SEECODE_FONT)) {
            setFont();
        } else if (UISeeCodePlugin.isKnownColorProperty(prop)) {
            setColor();
        }

    }
}