eclox.ui.console.ConsolePage.java Source code

Java tutorial

Introduction

Here is the source code for eclox.ui.console.ConsolePage.java

Source

/*******************************************************************************
 * Copyright (C) 2003-2007, 2013 Guillaume Brocker
 * 
 * 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:
 *     Guillaume Brocker - Initial API and implementation
 *
 ******************************************************************************/

package eclox.ui.console;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.part.Page;

import eclox.core.doxygen.BuildJob;
import eclox.core.doxygen.IBuildJobListener;
import eclox.ui.console.action.CancelJob;
import eclox.ui.console.action.ClearLog;
import eclox.ui.console.action.LockScroll;
import eclox.ui.console.action.RemoveConsole;

/**
 * Implements the page for the doxygen console.
 * 
 * @author gbrocker
 */
public class ConsolePage extends Page {

    /**
     * Implements a build job listener that will maintain the console up-to-date
     * with the job log.
     * 
     * @author gbrocker
     */
    private class MyBuildJobListener implements IBuildJobListener {
        /**
         * @see eclox.core.doxygen.IBuildJobListener#buildJobLogCleared(eclox.core.doxygen.BuildJob)
         */
        public void buildJobLogCleared(BuildJob job) {
            ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
                public void run() {
                    clear();
                }
            });
        }

        /**
         * @see eclox.core.doxygen.IBuildJobListener#buildJobLogUpdated(eclox.core.doxygen.BuildJob, java.lang.String)
         */
        public void buildJobLogUpdated(BuildJob job, String output) {
            final String text = new String(output);
            ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() {
                public void run() {
                    append(text);
                }
            });
        }

        /**
         * @see eclox.core.doxygen.IBuildJobListener#buildJobRemoved(eclox.core.doxygen.BuildJob)
         */
        public void buildJobRemoved(BuildJob job) {
        }
    }

    /**
     * @brief   Implements a job change listener used to update the interface state according to the
     *          build job events.
     * 
     * @author gbrocker
     */
    private class MyJobChangedListener implements IJobChangeListener {

        public void aboutToRun(IJobChangeEvent event) {
            ConsolePlugin.getStandardDisplay().syncExec(new Runnable() {
                public void run() {
                    updateActionStates();
                }
            });
        }

        public void awake(IJobChangeEvent event) {
        }

        public void done(final IJobChangeEvent event) {
            ConsolePlugin.getStandardDisplay().syncExec(new Runnable() {
                public void run() {
                    updateActionStates();

                    IStatus status = event.getResult();
                    if (status.isOK()) {
                        append("*** Build finished!");
                    } else {
                        append("*** Build aborted! ");
                        append(status.getMessage());
                    }
                }
            });
        }

        public void running(IJobChangeEvent event) {
        }

        public void scheduled(IJobChangeEvent event) {
        }

        public void sleeping(IJobChangeEvent event) {
        }

    }

    private boolean scrollLocked = false; ///< a boolean telling if the console scrolling is locked or not
    private StyledText styledText; ///< the control used to display text
    private Console console; ///< the console the page is attached to
    private CancelJob cancelJobAction; ///< the action that cancels the build job
    private MyBuildJobListener jobListener; ///< the build job listener
    private MyJobChangedListener jobChangedListener; ///< the build job change listener

    /**
     * Constructor
     * 
     * @param   console   the console the page is attached to
     */
    public ConsolePage(Console console) {
        this.console = console;
    }

    /**
     * Appends text to the console.
     * 
     * @param   text   a string containing the text to append
     */
    private void append(String text) {
        assert styledText != null;

        styledText.append(text);
        scroll();
    }

    /**
     * Clears the console content.
     */
    private void clear() {
        assert styledText != null;

        styledText.setText(new String());
    }

    /**
     * @see org.eclipse.ui.part.Page#dispose()
     */
    public void dispose() {
        // Removes job listeners.
        console.getJob().removeBuidJobListener(jobListener);
        console.getJob().removeJobChangeListener(jobChangedListener);

        // Release some references.
        console = null;
        styledText = null;
        cancelJobAction = null;

        // Base treatment.
        super.dispose();
    }

    /**
     * @see org.eclipse.ui.part.Page#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        assert console != null;
        assert styledText == null;
        assert cancelJobAction == null;

        // Creates the text control.
        styledText = new StyledText(parent, SWT.READ_ONLY | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        styledText.setFont(JFaceResources.getTextFont());

        // Creates the cancel job action.
        cancelJobAction = new CancelJob(console);

        // Creates job listeners;
        jobListener = new MyBuildJobListener();
        jobChangedListener = new MyJobChangedListener();
        console.getJob().addBuidJobListener(jobListener);
        console.getJob().addJobChangeListener(jobChangedListener);

        // Creates the actions
        IActionBars actionBars = getSite().getActionBars();
        actionBars.getToolBarManager().appendToGroup(IConsoleConstants.LAUNCH_GROUP, cancelJobAction);
        actionBars.getToolBarManager().appendToGroup(IConsoleConstants.LAUNCH_GROUP, new RemoveConsole(console));
        actionBars.getToolBarManager().appendToGroup(IConsoleConstants.OUTPUT_GROUP, new ClearLog(console));
        actionBars.getToolBarManager().appendToGroup(IConsoleConstants.OUTPUT_GROUP, new LockScroll(this));
        actionBars.updateActionBars();
    }

    /**
     * @see org.eclipse.ui.part.Page#getControl()
     */
    public Control getControl() {
        return styledText;
    }

    /**
     * Scrolls the console to the end of the log
     */
    private void scroll() {
        assert styledText != null;

        if (scrollLocked == false) {
            styledText.setSelection(styledText.getCharCount());
            styledText.showSelection();
        }
    }

    /**
     * @see org.eclipse.ui.part.Page#setFocus()
     */
    public void setFocus() {
        assert styledText != null;

        styledText.setFocus();
    }

    /**
     * Updates the lock of the console scroll.
     * 
     * @param   locked   a boolean giving the new lock state
     */
    public void setScrollLocked(boolean locked) {
        scrollLocked = locked;
    }

    /**
     * Updates the state of some action according to the current job's state
     */
    private void updateActionStates() {
        assert cancelJobAction != null;
        assert console != null;

        BuildJob job = console.getJob();
        cancelJobAction.setEnabled(job != null && job.getState() == Job.RUNNING);
    }

}