/******************************************************************************* * Copyright (c) 2000, 2013 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * Bruno Medeiros - LangIDE adaptation. *******************************************************************************/ package melnorme.lang.ide.ui.tools.console; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentListener; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsoleDocumentPartitioner; import org.eclipse.ui.console.TextConsole; import org.eclipse.ui.console.TextConsoleViewer; /** * Viewer used to display an IOConsole */ public class IOConsoleViewer extends TextConsoleViewer { /** * will always scroll with output if value is true. */ private boolean fAutoScroll = true; private IDocumentListener fDocumentListener; public IOConsoleViewer(Composite parent, TextConsole console) { super(parent, console); } public boolean isAutoScroll() { return fAutoScroll; } public void setAutoScroll(boolean scroll) { fAutoScroll = scroll; } @Override protected void handleVerifyEvent(VerifyEvent e) { IDocument doc = getDocument(); String[] legalLineDelimiters = doc.getLegalLineDelimiters(); String eventString = e.text; try { IConsoleDocumentPartitioner partitioner = (IConsoleDocumentPartitioner) doc.getDocumentPartitioner(); if (!partitioner.isReadOnly(e.start)) { boolean isCarriageReturn = false; for (int i = 0; i < legalLineDelimiters.length; i++) { if (e.text.equals(legalLineDelimiters[i])) { isCarriageReturn = true; break; } } if (!isCarriageReturn) { super.handleVerifyEvent(e); return; } } int length = doc.getLength(); if (e.start == length) { super.handleVerifyEvent(e); } else { try { doc.replace(length, 0, eventString); } catch (BadLocationException e1) { } e.doit = false; } } finally { StyledText text = (StyledText) e.widget; text.setCaretOffset(text.getCharCount()); } } /** * makes the associated text widget uneditable. */ public void setReadOnly() { ConsolePlugin.getStandardDisplay().asyncExec(new Runnable() { @Override public void run() { StyledText text = getTextWidget(); if (text != null && !text.isDisposed()) { text.setEditable(false); } } }); } /** * @return <code>false</code> if text is editable */ public boolean isReadOnly() { return !getTextWidget().getEditable(); } @Override public void setDocument(IDocument document) { IDocument oldDocument= getDocument(); super.setDocument(document); if (oldDocument != null) { oldDocument.removeDocumentListener(getDocumentListener()); } if (document != null) { document.addDocumentListener(getDocumentListener()); } } private IDocumentListener getDocumentListener() { if (fDocumentListener == null) { fDocumentListener= new IDocumentListener() { @Override public void documentAboutToBeChanged(DocumentEvent event) { } @Override public void documentChanged(DocumentEvent event) { if (fAutoScroll) { revealEndOfDocument(); } } }; } return fDocumentListener; } }