com.google.dart.tools.ui.console.DartConsoleView.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.tools.ui.console.DartConsoleView.java

Source

/*
 * Copyright (c) 2012, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.dart.tools.ui.console;

import com.google.dart.tools.deploy.Activator;
import com.google.dart.tools.ui.internal.preferences.FontPreferencePage;
import com.google.dart.tools.ui.internal.util.SWTUtil;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener2;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.views.console.ProcessConsole;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.part.IPageBookViewPage;
import org.eclipse.ui.part.PageSite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;

/**
 * An Eclipse view class that displays one and only one IConsole. This is different from the normal
 * ConsoleView which displays n consoles.
 */
@SuppressWarnings("restriction")
public class DartConsoleView extends ViewPart implements IConsoleView, IPropertyChangeListener {

    private class ClearAction extends Action {

        public ClearAction() {
            super("Clear", Activator.getImageDescriptor("icons/full/eview16/rem_co.gif"));
        }

        public void dispose() {

        }

        @Override
        public void run() {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    if (console instanceof IOConsole) {
                        IOConsole ioConsole = (IOConsole) console;

                        ioConsole.clearConsole();
                    } else if (console instanceof MessageConsole) {
                        MessageConsole messageConsole = (MessageConsole) console;

                        messageConsole.clearConsole();
                    }
                }
            };

            new Thread(r).start();
        }
    }

    private class FontPropertyChangeListener implements IPropertyChangeListener {
        @Override
        public void propertyChange(final PropertyChangeEvent event) {
            if (FontPreferencePage.BASE_FONT_KEY.equals(event.getProperty())) {
                updateFont();
            }
        }
    }

    private class TerminateAction extends Action implements ILaunchesListener2 {

        public TerminateAction() {
            super("Terminate", Activator.getImageDescriptor("icons/full/eview16/terminate.gif"));

            DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);

            update();
        }

        public void dispose() {
            DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
        }

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

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

        @Override
        public void launchesRemoved(ILaunch[] launches) {
            update();
        }

        @Override
        public void launchesTerminated(ILaunch[] launches) {
            update();
        }

        @Override
        public void run() {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        getProcess().terminate();
                    } catch (DebugException e) {
                        Activator.logError(e);
                    }
                }
            };

            new Thread(r).start();
        }

        void update() {
            IProcess process = getProcess();

            if (process != null) {
                setEnabled(!process.isTerminated());
            } else {
                setEnabled(false);
            }
        }
    }

    public static final String VIEW_ID = "com.google.dart.tools.ui.console";

    private Composite parent;
    private IConsole console;

    private IPageBookViewPage page;

    private PageSite pageSite;

    private TerminateAction terminateAction;
    private ClearAction clearAction;

    private Display display;

    private IPropertyChangeListener fontPropertyChangeListener = new FontPropertyChangeListener();

    public DartConsoleView() {
        DartConsoleManager.getManager().consoleViewOpened(this);
    }

    @Override
    public void createPartControl(Composite parent) {
        this.parent = parent;

        IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
        clearAction = new ClearAction();
        toolbar.add(clearAction);
        toolbar.add(new Separator());
        terminateAction = new TerminateAction();
        toolbar.add(terminateAction);
        toolbar.add(new Separator("outputGroup"));
        getViewSite().getActionBars().updateActionBars();

        display = Display.getCurrent();

        JFaceResources.getFontRegistry().addListener(fontPropertyChangeListener);
    }

    @Override
    public void display(IConsole inConsole) {
        if (this.console != null) {
            this.console.removePropertyChangeListener(this);

            this.console = null;
        }

        if (this.page != null) {
            page.getControl().dispose();
            page.dispose();
            page = null;
        }

        this.console = inConsole;

        // show the new console
        if (this.console != null) {
            this.console.addPropertyChangeListener(this);

            page = console.createPage(this);

            try {
                page.init(getPageSite());
                page.createControl(parent);
            } catch (PartInitException e) {
                Activator.logError(e);
            }

            parent.layout();
        }

        updateFont();

        updateContentDescription();

        updateIcon();

        terminateAction.update();
    }

    @Override
    public void dispose() {
        JFaceResources.getFontRegistry().removeListener(fontPropertyChangeListener);

        display = null;

        DartConsoleManager.getManager().consoleViewClosed(this);

        if (console != null && isDead()) {
            IProcess process = ((ProcessConsole) console).getProcess();

            DebugPlugin.getDefault().getLaunchManager().removeLaunch(process.getLaunch());
        }

        terminateAction.dispose();
        clearAction.dispose();

        super.dispose();
    }

    @Override
    public IConsole getConsole() {
        return console;
    }

    @Override
    public boolean getScrollLock() {
        return false;
    }

    public boolean isDead() {
        if (console == null) {
            return true;
        }

        if (console instanceof ProcessConsole) {
            ProcessConsole processConsole = (ProcessConsole) console;

            if (processConsole.getProcess() == null) {
                return true;
            }

            return processConsole.getProcess().isTerminated();
        }

        return false;
    }

    @Override
    public boolean isPinned() {
        return false;
    }

    @Override
    public void pin(IConsole console) {

    }

    @Override
    public void propertyChange(PropertyChangeEvent event) {
        if (display != null) {
            display.asyncExec(new Runnable() {
                @Override
                public void run() {
                    updateContentDescription();
                    updateIcon();
                }
            });
        }
    }

    @Override
    public void setFocus() {
        if (page != null) {
            page.setFocus();
        }
    }

    @Override
    public void setPinned(boolean pin) {

    }

    @Override
    public void setScrollLock(boolean scrollLock) {

    }

    @Override
    public void warnOfContentChange(IConsole console) {
        IWorkbenchSiteProgressService progressService = (IWorkbenchSiteProgressService) getViewSite()
                .getAdapter(IWorkbenchSiteProgressService.class);

        if (progressService != null) {
            progressService.warnOfContentChange();
        }

        bringToFront();
    }

    private void bringToFront() {
        if (!getViewSite().getPage().isPartVisible(this)) {
            getViewSite().getPage().activate(this);
        }
    }

    private PageSite getPageSite() {
        if (pageSite == null) {
            pageSite = new PageSite(getViewSite());
        }

        return pageSite;
    }

    private IProcess getProcess() {
        if (console instanceof ProcessConsole) {
            return ((ProcessConsole) console).getProcess();
        } else {
            return null;
        }
    }

    private void updateContentDescription() {
        if (console == null) {
            setContentDescription("");
        } else {
            String suffix = "";

            if (console instanceof ProcessConsole) {
                IProcess process = ((ProcessConsole) console).getProcess();

                if (process.isTerminated()) {
                    try {
                        suffix = " [exit value: " + process.getExitValue() + "]";
                    } catch (DebugException ex) {
                        // ignore
                    }

                    bringToFront();
                }
            }

            setContentDescription(console.getName() + suffix);
        }

        if (console instanceof ProcessConsole) {
            IProcess process = ((ProcessConsole) console).getProcess();

            setPartName(process.getLaunch().getLaunchConfiguration().getName());
        } else {
            setPartName("Output");
        }
    }

    private void updateFont() {
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                Font newFont = JFaceResources.getFont(FontPreferencePage.BASE_FONT_KEY);
                if (page != null && page.getControl() != null) {
                    Font oldFont = page.getControl().getFont();
                    Font font = SWTUtil.changeFontSize(oldFont, newFont);
                    page.getControl().setFont(font);
                }
            }
        });
    }

    private void updateIcon() {
        if (isDead()) {
            setTitleImage(Activator.getImage("icons/full/eview16/console_view_d.gif"));
        } else {
            setTitleImage(Activator.getImage("icons/full/eview16/console_view.gif"));
        }
    }

}