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