1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 14:15:23 +02:00

new C-Build console supporting mutiple streams.

This commit is contained in:
David Inglis 2004-03-12 16:07:50 +00:00
parent 2469b15201
commit b03b5aa0c6
30 changed files with 1775 additions and 744 deletions

View file

@ -1,3 +1,44 @@
2004-03-12 David Inglis
Implemented new build console using the Eclipse 3 generic console, supporting multiple
streams with colorizing.
* plugin.properties
* plugin.xml
moved to src/org/eclipse/cdt/internal/ui/buildconsole
* src/org/eclipse/cdt/internal/ui/BuildConsole.java
* src/org/eclipse/cdt/internal/ui/BuildConsoleManager.java
removed
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleAction.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleView.java
* src/org/eclipse/cdt/internal/ui/buildconsole/ClearConsoleAction.java
modified
* src/org/eclipse/cdt/internal/ui/CPluginImages.java
* src/org/eclipse/cdt/internal/ui/CPluginResources.properties
* src/org/eclipse/cdt/internal/ui/preferences/BuildConsolePreferencePage.java
* src/org/eclipse/cdt/ui/CUIPlugin.java
* src/org/eclipse/cdt/ui/IBuildConsoleManager.java
new
* src/org/eclipse/cdt/ui/IBuildConsole.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsole.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleDocument.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleManager.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePage.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartition.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsolePartitioner.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleStream.java
* src/org/eclipse/cdt/internal/ui/buildconsole/BuildConsoleViewer.java
* src/org/eclipse/cdt/internal/ui/buildconsole/CBuildConsole.java
* src/org/eclipse/cdt/internal/ui/buildconsole/ConsoleMessages.java
* src/org/eclipse/cdt/internal/ui/buildconsole/ConsoleMessages.properties
* src/org/eclipse/cdt/internal/ui/buildconsole/ConsoleOutputTextStore.java
* src/org/eclipse/cdt/internal/ui/buildconsole/ScrollLockAction.java
2004-03-11 Hoda Amer
Added the undo manager for the renaming refactor.

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

View file

@ -9,7 +9,6 @@ completionContributorName=Completion Contribution
nature.name=C Nature
perspective.name=C/C++ Development
viewsCategory.name=&C
BuildConsoleView.name=C-Build
CView.name=C/C++ Projects
# The Wizards
@ -112,3 +111,6 @@ ActionDefinition.openType.name= Open Type
ActionDefinition.openType.description= Open a type in a C editor
CElementWorkingSetPage.name = C/C++
BuildConsoleFontDefinition.description= The C-Build console font is used by the C-Build console
BuildConsoleFontDefinition.label= C-Build Console Text Font

View file

@ -20,14 +20,14 @@
<import plugin="org.eclipse.ui.editors"/>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.apache.xerces"/>
<import plugin="org.eclipse.search"/>
<import plugin="org.eclipse.compare"/>
<import plugin="org.eclipse.debug.ui"/>
<import plugin="org.eclipse.debug.core"/>
<import plugin="org.eclipse.cdt.core"/>
<import plugin="org.eclipse.core.runtime.compatibility"/>
<import plugin="org.eclipse.core.filebuffers"/>
<import plugin="org.eclipse.ui.console"/>
<import plugin="org.apache.xerces"/>
</requires>
@ -123,13 +123,6 @@
name="%viewsCategory.name"
id="org.eclipse.cdt.ui.views">
</category>
<view
name="%BuildConsoleView.name"
icon="icons/full/cview16/buildconsole.gif"
category="org.eclipse.cdt.ui.views"
class="org.eclipse.cdt.internal.ui.buildconsole.BuildConsoleView"
id="org.eclipse.cdt.ui.BuildConsoleView">
</view>
<view
name="%CView.name"
icon="icons/full/cview16/cview.gif"
@ -392,7 +385,7 @@
<extension
point="org.eclipse.cdt.core.CBuildConsole">
<CBuildConsole
class="org.eclipse.cdt.internal.ui.BuildConsole">
class="org.eclipse.cdt.internal.ui.buildconsole.CBuildConsole">
</CBuildConsole>
</extension>
<extension
@ -575,5 +568,15 @@
id="org.eclipse.cdt.ui.CElementWorkingSetPage">
</workingSet>
</extension>
<extension
point="org.eclipse.ui.fontDefinitions">
<fontDefinition
label="%BuildConsoleFontDefinition.label"
defaultsTo="org.eclipse.jface.textfont"
id="org.eclipse.cdt.ui.buildconsole.ConsoleFont">
<description>
%BuildConsoleFontDefinition.description
</description>
</fontDefinition>
</extension>
</plugin>

View file

@ -1,41 +0,0 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.ui;
import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.ui.*;
import org.eclipse.core.resources.IProject;
public class BuildConsole implements IConsole {
IProject project;
IBuildConsoleManager fConsoleManager;
/**
* Constructor for BuildConsole.
*/
public BuildConsole() {
fConsoleManager = CUIPlugin.getDefault().getConsoleManager();
}
public void start(IProject project ) {
this.project = project;
fConsoleManager.getConsole(project).start(project);
}
/**
* @see org.eclipse.cdt.core.resources.IConsole#clear()
*/
public void clear() {
fConsoleManager.getConsole(project).clear();
}
/**
* @see org.eclipse.cdt.core.resources.IConsole#getOutputStream()
*/
public ConsoleOutputStream getOutputStream() {
return fConsoleManager.getConsole(project).getOutputStream();
}
}

View file

@ -1,238 +0,0 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.ui;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsoleListener;
import org.eclipse.cdt.ui.IBuildConsoleManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
public class BuildConsoleManager implements IBuildConsoleManager, IResourceChangeListener, IPropertyChangeListener {
private HashMap fConsoleDocumentMap;
ListenerList listeners = new ListenerList(1);
private class BuildConsoleDocument extends Document {
private int fMaxLines;
public BuildConsoleDocument(int nLines) {
super();
fMaxLines = nLines;
}
public void setDocumentSize(int nLines) {
fMaxLines = nLines;
nLines = getNumberOfLines();
if (nLines > fMaxLines) {
try {
int start = getLineOffset(nLines - fMaxLines);
String part = get(start, getLength() - start);
set(part);
} catch (BadLocationException e) {
}
}
}
public BuildConsoleDocument(String initialContent) {
super(initialContent);
}
public void replace(int offset, int length, String text) throws BadLocationException {
super.replace(offset, length, text);
int nLines = getNumberOfLines();
if (nLines > fMaxLines) {
int start = getLineOffset(nLines - fMaxLines);
String part = get(start, getLength() - start);
set(part);
}
}
}
private class BuildConsole extends ConsoleOutputStream implements IConsole {
protected BuildConsoleDocument fDocument;
public BuildConsole() {
fDocument = new BuildConsoleDocument(BuildConsolePreferencePage.buildConsoleLines());
}
public void setConsoleSize(int nLines) {
fDocument.setDocumentSize(nLines);
}
public void start(IProject project) {
if (BuildConsolePreferencePage.isClearBuildConsole()) {
clear();
}
Object[] list = listeners.getListeners();
if (list.length > 0) {
for (int i = 0; i < list.length; i++) {
IBuildConsoleListener listener = (IBuildConsoleListener) list[i];
ConsoleEvent event = new ConsoleEvent(BuildConsoleManager.this, project, ConsoleEvent.CONSOLE_START);
listener.consoleChange(event);
}
}
}
public void clear() {
super.clear();
Display.getDefault().syncExec(new Runnable() {
public void run() {
fDocument.set(""); //$NON-NLS-1$
}
});
}
public ConsoleOutputStream getOutputStream() {
return this;
}
public IDocument getDocument() {
return fDocument;
}
public void flush() throws IOException {
Display.getDefault().syncExec(new Runnable() {
public void run() {
bringConsoleOnTop();
try {
int len = fDocument.getLength();
fDocument.replace(len, 0, readBuffer());
} catch (BadLocationException x) {
}
}
});
}
void bringConsoleOnTop() {
IWorkbenchWindow window = CUIPlugin.getDefault().getActiveWorkbenchWindow();
if (window == null)
return;
IWorkbenchPage page = window.getActivePage();
if (page != null) {
try {
// show the build console
IViewPart cBuild = page.findView(CUIPlugin.CONSOLE_ID);
if (cBuild == null) {
if (BuildConsolePreferencePage.isAutoOpenConsole()) {
IWorkbenchPart activePart = page.getActivePart();
cBuild = page.showView(CUIPlugin.CONSOLE_ID);
//restore focus
page.activate(activePart);
}
}
if (cBuild != null && BuildConsolePreferencePage.isConsoleOnTop()) {
page.bringToTop(cBuild);
}
} catch (PartInitException pie) {
}
}
}
public void close() throws IOException {
flush();
}
}
public BuildConsoleManager() {
fConsoleDocumentMap = new HashMap();
}
/**
* Traverses the delta looking for added/removed/changed launch
* configuration files.
*
* @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
if (fConsoleDocumentMap == null) {
return;
}
IResource resource = event.getResource();
if (resource != null && resource.getType() == IResource.PROJECT) {
if (event.getType() == IResourceChangeEvent.PRE_DELETE || event.getType() == IResourceChangeEvent.PRE_CLOSE) {
fConsoleDocumentMap.remove(resource);
Object[] list = listeners.getListeners();
if (list.length > 0) {
for (int i = 0; i < list.length; i++) {
IBuildConsoleListener listener = (IBuildConsoleListener) list[i];
ConsoleEvent consoleEvent = new ConsoleEvent(this, (IProject) resource, ConsoleEvent.CONSOLE_CLOSE);
listener.consoleChange(consoleEvent);
}
}
}
}
}
public void shutdown() {
CUIPlugin.getWorkspace().removeResourceChangeListener(this);
CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
}
public void startup() {
CUIPlugin.getWorkspace().addResourceChangeListener(this);
CUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
}
private BuildConsole getBuildConsole(IProject project) {
BuildConsole console = (BuildConsole) fConsoleDocumentMap.get(project);
if (console == null) {
console = new BuildConsole();
fConsoleDocumentMap.put(project, console);
}
return console;
}
public IConsole getConsole(IProject project) {
return getBuildConsole(project);
}
public IDocument getConsoleDocument(IProject project) {
return getBuildConsole(project).getDocument();
}
public void addConsoleListener(IBuildConsoleListener listener) {
listeners.add(listener);
}
public void removeConsoleListener(IBuildConsoleListener listener) {
listeners.remove(listener);
}
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() == BuildConsolePreferencePage.PREF_BUILDCONSOLE_LINES) {
Collection consoles = fConsoleDocumentMap.values();
Iterator iter = consoles.iterator();
while (iter.hasNext()) {
BuildConsole console = (BuildConsole) iter.next();
console.setConsoleSize(BuildConsolePreferencePage.buildConsoleLines());
}
}
}
}

View file

@ -24,6 +24,7 @@ public class CPluginImages {
// Subdirectory (under the package containing this class) where 16 color images are
private static URL fgIconBaseURL;
static {
try {
fgIconBaseURL= new URL(CUIPlugin.getDefault().getDescriptor().getInstallURL(), "icons/" ); //$NON-NLS-1$
@ -39,7 +40,7 @@ public class CPluginImages {
public static final String T_WIZBAN= T + "wizban/"; //$NON-NLS-1$
public static final String T_LCL= "lcl16/"; //$NON-NLS-1$
public static final String T_TOOL= "tool16/"; //$NON-NLS-1$
public static final String T_VIEW= "view16/"; //$NON-NLS-1$
public static final String T_VIEW= T + "cview16/"; //$NON-NLS-1$
public static final String T_OVR= T + "ovr16/"; //$NON-NLS-1$
public static final String IMG_OBJS_TEMPLATE= NAME_PREFIX + "template_obj.gif"; //$NON-NLS-1$
@ -81,6 +82,10 @@ public class CPluginImages {
public static final String IMG_OBJS_BREAKPOINT_DISABLED = NAME_PREFIX + "breakpoint_disabled.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_BREAKPOINT_ACTIVE = NAME_PREFIX + "breakpoint_active.gif"; //$NON-NLS-1$
// build console
public static final String IMG_VIEW_BUILD = NAME_PREFIX + "buildconsole.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_BUILD_CONSOLE = createManaged(T_VIEW, IMG_VIEW_BUILD);
public static final ImageDescriptor DESC_OBJS_VARIABLE= createManaged(T_OBJ, IMG_OBJS_VARIABLE);
public static final ImageDescriptor DESC_OBJS_LOCAL_VARIABLE= createManaged(T_OBJ, IMG_OBJS_LOCAL_VARIABLE);
public static final ImageDescriptor DESC_OBJS_CLASS= createManaged(T_OBJ, IMG_OBJS_CLASS);
@ -125,6 +130,7 @@ public class CPluginImages {
public static final String IMG_MENU_CODE_ASSIST= NAME_PREFIX + "metharg_obj.gif"; //$NON-NLS-1$
public static final String IMG_MENU_COLLAPSE_ALL= NAME_PREFIX + "collapseall.gif"; //$NON-NLS-1$
public static final String IMG_CLEAR_CONSOLE= NAME_PREFIX + "clear_co.gif"; //$NON-NLS-1$
public static final String IMG_SCROLL_LOCK= NAME_PREFIX + "lock_co.gif"; //$NON-NLS-1$
public static final String IMG_ALPHA_SORTING= NAME_PREFIX + "alphab_sort_co.gif"; //$NON-NLS-1$
public static final String IMG_TOOL_GOTO_PREV_ERROR= NAME_PREFIX + "prev_error_nav.gif"; //$NON-NLS-1$
public static final String IMG_TOOL_GOTO_NEXT_ERROR= NAME_PREFIX + "next_error_nav.gif"; //$NON-NLS-1$

View file

@ -8,19 +8,23 @@ CView.make_edit_action =Project properties
# ------- Preference Page -------
#CBasePreferencePage.description=The build command is an executable program which will be used by the builder\nto build your C project. If the build command is not on the current system\nenvironment path, you have to enter an absolute path name.\nThe command given here will be filled in new C projects by default.\nTo change the builder for a specific project, use the project's property page.
CBasePreferencePage.description=The build command is an executable program which will be used by the builder\nto build your C/C++ project. If the build command is not on the current system\nenvironment path, you have to enter an absolute path name.\nThe command given here will be filled in new C/C++ projects by default.
CBasePreferencePage.buildLocation.label=Default build command:
CBasePreferencePage.clearConsole.label=Always clear C-Build view before building
CBasePreferencePage.autoOpenConsole.label=Open C-Build view when building
CBasePreferencePage.consoleOnTop.label=Bring C-Build view to top when building (if present)
CBasePreferencePage.buildConsole.errorMessage=Value must be an integer between 10 and 2147483647
ConsolePreferencePage.clearConsole.label=Always clear console before building
ConsolePreferencePage.autoOpenConsole.label=Open console when building
ConsolePreferencePage.consoleOnTop.label=Bring console to top when building (if present)
ConsolePreferencePage.consoleLines.label=Limit console ouput (# lines):
ConsolePreferencePage.consoleLines.errorMessage=Value must be an integer between 10 and 2147483647
ConsolePreferencePage.tabWidth.label=Display tab with:
ConsolePreferencePage.tabWidth.errorMessage=Value must be an integer between 1 and 100
ConsolePreferencePage.colorSettings.label=Console text color settings
ConsolePreferencePage.outputColor.label=Output text color
ConsolePreferencePage.infoColor.label=Information message text color
ConsolePreferencePage.errorColor.label=Error message text color
CBasePreferencePage.linkToEditor.label=Link view selection to active editor
CBasePreferencePage.CUChildren.label=Show file members in Project View
CBasePreferencePage.OutlineView.structuralParseMode.label=Use Structural-Parse mode to build the CModel
CBasePreferencePage.editorFont.label=C Editor font:
CBasePreferencePage.consoleFont.label=C-Build view font:
CBasePreferencePage.bracketHighlightBox.label=Highlight matching brackets with box
CBasePreferencePage.bracketHighlightClr.label=Highlight matching brackets with color

View file

@ -0,0 +1,49 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.console.AbstractConsole;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.part.IPageBookViewPage;
public class BuildConsole extends AbstractConsole {
/**
* Property constant indicating the color of a stream has changed.
*/
public static final String P_STREAM_COLOR = CUIPlugin.PLUGIN_ID + ".CONSOLE_P_STREAM_COLOR"; //$NON-NLS-1$
private BuildConsoleManager fConsoleManager;
public BuildConsole(BuildConsoleManager manager) {
super(ConsoleMessages.getString("BuildConsole.buildConsole"), CPluginImages.DESC_BUILD_CONSOLE); //$NON-NLS-1$
fConsoleManager = manager;
}
public IPageBookViewPage createPage(IConsoleView view) {
return new BuildConsolePage(view, this);
}
public void setTitle(IProject project) {
String title = ConsoleMessages.getString("BuildConsole.buildConsole"); //$NON-NLS-1$
if (project != null) {
title += " [" + project.getName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
}
setName(title);
}
public BuildConsoleManager getConsoleManager() {
return fConsoleManager;
}
}

View file

@ -1,52 +0,0 @@
package org.eclipse.cdt.internal.ui.buildconsole;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.ResourceBundle;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.ui.texteditor.TextEditorAction;
public class BuildConsoleAction extends TextEditorAction {
private int fOperationCode= -1;
private ITextOperationTarget fOperationTarget;
public BuildConsoleAction(ResourceBundle bundle, String prefix, TextViewer viewer, int operationCode) {
super(bundle, prefix, null);
fOperationCode= operationCode;
fOperationTarget= viewer.getTextOperationTarget();
update();
}
/**
* @see Action
*/
public void run() {
if (fOperationCode != -1 && fOperationTarget != null) {
fOperationTarget.doOperation(fOperationCode);
}
}
/**
* @see TextEditorAction
*/
public void update() {
boolean wasEnabled= isEnabled();
boolean isEnabled= (fOperationTarget != null && fOperationTarget.canDoOperation(fOperationCode));
if (wasEnabled != isEnabled) {
setEnabled(isEnabled);
}
}
}

View file

@ -0,0 +1,23 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.jface.text.DefaultLineTracker;
import org.eclipse.jface.text.Document;
public class BuildConsoleDocument extends Document {
public BuildConsoleDocument() {
setTextStore(new ConsoleOutputTextStore(2500));
setLineTracker(new DefaultLineTracker());
completeInitialization();
}
}

View file

@ -0,0 +1,236 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.internal.ui.ConsoleEvent;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsole;
import org.eclipse.cdt.ui.IBuildConsoleListener;
import org.eclipse.cdt.ui.IBuildConsoleManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleView;
public class BuildConsoleManager implements IBuildConsoleManager, IResourceChangeListener, IPropertyChangeListener {
ListenerList listeners = new ListenerList(1);
BuildConsole fConsole;
private Map fConsoleMap = new HashMap();
private Color infoColor, outputColor, errorColor;
public BuildConsoleStream infoStream, outputStream, errorStream;
public BuildConsoleManager() {
}
/**
* Notifies the console manager that console activity has started on the project
* The manager will open the console if the preference is set to show the console, and notify listeners
*/
protected void startConsoleActivity(IProject project) {
Object[] list = listeners.getListeners();
if (list.length > 0) {
for (int i = 0; i < list.length; i++) {
IBuildConsoleListener listener = (IBuildConsoleListener) list[i];
ConsoleEvent event = new ConsoleEvent(BuildConsoleManager.this, project, ConsoleEvent.CONSOLE_START);
listener.consoleChange(event);
}
}
showConsole();
}
/**
* Opens the console view. If the view is already open, it is brought to
* the front.
*/
protected void showConsole() {
CUIPlugin.getStandardDisplay().asyncExec(new Runnable() {
public void run() {
IWorkbenchWindow window = CUIPlugin.getDefault().getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IViewPart consoleView = page.findView(IConsoleConstants.ID_CONSOLE_VIEW);
if (consoleView == null && BuildConsolePreferencePage.isAutoOpenConsole()) {
IWorkbenchPart activePart = page.getActivePart();
try {
consoleView = page.showView(IConsoleConstants.ID_CONSOLE_VIEW);
} catch (PartInitException pie) {
CUIPlugin.getDefault().log(pie);
}
//restore focus stolen by the creation of the
// console
page.activate(activePart);
} else {
boolean bringToTop = shouldBringToTop(consoleView);
if (bringToTop) {
page.bringToTop(consoleView);
}
}
if (consoleView instanceof IConsoleView) {
((IConsoleView) consoleView).display(fConsole);
}
}
}
}
});
}
boolean shouldBringToTop(IViewPart consoleView) {
boolean bringToTop = false;
if (consoleView instanceof IConsoleView) {
IConsoleView cView = (IConsoleView) consoleView;
return !cView.isPinned() && BuildConsolePreferencePage.isConsoleOnTop();
}
return bringToTop;
}
/**
* Traverses the delta looking for added/removed/changed launch
* configuration files.
*
* @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
IResource resource = event.getResource();
if (resource != null && resource.getType() == IResource.PROJECT) {
if (event.getType() == IResourceChangeEvent.PRE_DELETE || event.getType() == IResourceChangeEvent.PRE_CLOSE) {
IDocumentPartitioner partioner = (IDocumentPartitioner) fConsoleMap.remove(resource);
partioner.disconnect();
Object[] list = listeners.getListeners();
if (list.length > 0) {
for (int i = 0; i < list.length; i++) {
IBuildConsoleListener listener = (IBuildConsoleListener) list[i];
ConsoleEvent consoleEvent = new ConsoleEvent(this, (IProject) resource, ConsoleEvent.CONSOLE_CLOSE);
listener.consoleChange(consoleEvent);
}
}
}
}
}
public void shutdown() {
infoColor.dispose();
outputColor.dispose();
errorColor.dispose();
ConsolePlugin.getDefault().getConsoleManager().removeConsoles(new org.eclipse.ui.console.IConsole[]{fConsole});
CUIPlugin.getWorkspace().removeResourceChangeListener(this);
CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
}
public void startup() {
fConsole = new BuildConsole(this);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new org.eclipse.ui.console.IConsole[]{fConsole});
// install colors
infoColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_INFO_COLOR);
infoStream = new BuildConsoleStream(fConsole);
infoStream.setColor(infoColor);
outputColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_OUTPUT_COLOR);
outputStream = new BuildConsoleStream(fConsole);
outputStream.setColor(outputColor);
errorColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_ERROR_COLOR);
errorStream = new BuildConsoleStream(fConsole);
errorStream.setColor(errorColor);
CUIPlugin.getWorkspace().addResourceChangeListener(this);
CUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
// colors
if(property.equals(BuildConsolePreferencePage.PREF_BUILDCONSOLE_INFO_COLOR)) {
Color newColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_INFO_COLOR);
infoStream.setColor(newColor);
infoColor.dispose();
infoColor = newColor;
} else if(property.equals(BuildConsolePreferencePage.PREF_BUILDCONSOLE_OUTPUT_COLOR)) {
Color newColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_OUTPUT_COLOR);
outputStream.setColor(newColor);
outputColor.dispose();
outputColor = newColor;
} else if(property.equals(BuildConsolePreferencePage.PREF_BUILDCONSOLE_ERROR_COLOR)) {
Color newColor = createColor(CUIPlugin.getStandardDisplay(), BuildConsolePreferencePage.PREF_BUILDCONSOLE_ERROR_COLOR);
errorStream.setColor(newColor);
errorColor.dispose();
errorColor = newColor;
}
}
/**
* Returns a color instance based on data from a preference field.
*/
private Color createColor(Display display, String preference) {
RGB rgb = PreferenceConverter.getColor(CUIPlugin.getDefault().getPreferenceStore(), preference);
return new Color(display, rgb);
}
/**
* Returns the console for the project, or <code>null</code> if none.
*/
public IBuildConsole getConsole(IProject project) {
Assert.isNotNull(project);
return getConsolePartioner(project).getConsole();
}
private BuildConsolePartitioner getConsolePartioner(IProject project) {
BuildConsolePartitioner partioner = (BuildConsolePartitioner) fConsoleMap.get(project);
if ( partioner == null) {
partioner = new BuildConsolePartitioner(this);
fConsoleMap.put(project, partioner);
}
return partioner;
}
/**
* Returns the document for the projects console, or <code>null</code> if none.
*/
public IDocument getConsoleDocument(IProject project) {
Assert.isNotNull(project);
return getConsolePartioner(project).getDocument();
}
public void addConsoleListener(IBuildConsoleListener listener) {
listeners.add(listener);
}
public void removeConsoleListener(IBuildConsoleListener listener) {
listeners.remove(listener);
}
}

View file

@ -0,0 +1,399 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsoleEvent;
import org.eclipse.cdt.ui.IBuildConsoleListener;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.actions.ClearOutputAction;
import org.eclipse.ui.console.actions.TextViewerAction;
import org.eclipse.ui.console.actions.TextViewerGotoLineAction;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.Page;
import org.eclipse.ui.texteditor.FindReplaceAction;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.IUpdate;
public class BuildConsolePage extends Page implements ISelectionListener, IPropertyChangeListener, IBuildConsoleListener {
private BuildConsole fConsole;
private IConsoleView fConsoleView;
private BuildConsoleViewer fViewer;
private IProject fProject;
// text selection listener
private ISelectionChangedListener fTextListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateSelectionDependentActions();
}
};
// actions
private ClearOutputAction fClearOutputAction;
private Map fGlobalActions = new HashMap(10);
private List fSelectionActions = new ArrayList(3);
// menus
private Menu fMenu;
private ScrollLockAction fScrollLockAction;
private boolean fIsLocked;
/**
* @param view
* @param console
*/
public BuildConsolePage(IConsoleView view, BuildConsole console) {
fConsole = console;
fConsoleView = view;
}
protected void setProject(IProject project) {
fProject = project;
}
protected IProject getProject() {
return fProject;
}
protected BuildConsole getConsole() {
return fConsole;
}
protected IDocument setDocument() {
IProject project = getProject();
if (project != null) {
getViewer().setDocument(getConsole().getConsoleManager().getConsoleDocument(project));
}
return null;
}
public void consoleChange(IBuildConsoleEvent event) {
if (event.getType() == IBuildConsoleEvent.CONSOLE_START || event.getType() == IBuildConsoleEvent.CONSOLE_CLOSE) {
if (isAvailable()) {
Display display = getControl().getDisplay();
if (event.getType() == IBuildConsoleEvent.CONSOLE_CLOSE && getProject() != event.getProject()) {
return;
}
setProject(event.getProject());
display.asyncExec(new Runnable() {
public void run() {
if (isAvailable()) {
setDocument();
getConsole().setTitle(getProject());
}
}
});
}
}
}
boolean isAvailable() {
return getControl() != null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
fViewer = new BuildConsoleViewer(parent);
MenuManager manager = new MenuManager("#MessageConsole", "#MessageConsole"); //$NON-NLS-1$ //$NON-NLS-2$
manager.setRemoveAllWhenShown(true);
manager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
contextMenuAboutToShow(m);
}
});
fMenu = manager.createContextMenu(getControl());
getControl().setMenu(fMenu);
IPageSite site = getSite();
site.registerContextMenu(CUIPlugin.PLUGIN_ID + ".CBuildConole", manager, getViewer()); //$NON-NLS-1$
site.setSelectionProvider(getViewer());
createActions();
configureToolBar(site.getActionBars().getToolBarManager());
fViewer.getSelectionProvider().addSelectionChangedListener(fTextListener);
JFaceResources.getFontRegistry().addListener(this);
setFont(JFaceResources.getFont(BuildConsolePreferencePage.PREF_BUILDCONSOLE_FONT));
setTabs(CUIPlugin.getDefault().getPluginPreferences().getInt(BuildConsolePreferencePage.PREF_BUILDCONSOLE_TAB_WIDTH));
getConsole().addPropertyChangeListener(this);
setDocument();
getConsole().setTitle(getProject());
}
/**
* Fill the context menu
*
* @param menu
* menu
*/
protected void contextMenuAboutToShow(IMenuManager menu) {
menu.add((IAction) fGlobalActions.get(ActionFactory.COPY.getId()));
menu.add((IAction) fGlobalActions.get(ActionFactory.SELECT_ALL.getId()));
menu.add(new Separator("FIND")); //$NON-NLS-1$
menu.add((IAction) fGlobalActions.get(ActionFactory.FIND.getId()));
menu.add((IAction) fGlobalActions.get(ITextEditorActionConstants.GOTO_LINE));
menu.add(fClearOutputAction);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
Object source = event.getSource();
String property = event.getProperty();
if (BuildConsole.P_STREAM_COLOR.equals(property) && source instanceof BuildConsoleStream) {
BuildConsoleStream stream = (BuildConsoleStream) source;
if (stream.getConsole().equals(getConsole())) {
getViewer().getTextWidget().redraw();
}
} else if (property.equals(BuildConsolePreferencePage.PREF_BUILDCONSOLE_FONT)) {
setFont(JFaceResources.getFont(BuildConsolePreferencePage.PREF_BUILDCONSOLE_FONT));
} else if (property.equals(BuildConsolePreferencePage.PREF_BUILDCONSOLE_TAB_WIDTH)) {
setTabs(CUIPlugin.getDefault().getPluginPreferences().getInt(BuildConsolePreferencePage.PREF_BUILDCONSOLE_TAB_WIDTH));
}
}
protected void createActions() {
fClearOutputAction = new ClearOutputAction(getViewer());
fScrollLockAction = new ScrollLockAction(getViewer());
fScrollLockAction.setChecked(fIsLocked);
getViewer().setAutoScroll(!fIsLocked);
// In order for the clipboard actions to accessible via their shortcuts
// (e.g., Ctrl-C, Ctrl-V), we *must* set a global action handler for
// each action
IActionBars actionBars = getSite().getActionBars();
TextViewerAction action = new TextViewerAction(getViewer(), ITextOperationTarget.COPY);
action.configureAction(ConsoleMessages.getString("BuildConsolePage.&Copy@Ctrl+C_6"), //$NON-NLS-1$
ConsoleMessages.getString("BuildConsolePage.Copy_7"), ConsoleMessages.getString("BuildConsolePage.Copy_7")); //$NON-NLS-1$ //$NON-NLS-2$
action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
action.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_COPY_DISABLED));
action.setHoverImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_COPY_HOVER));
setGlobalAction(actionBars, ActionFactory.COPY.getId(), action);
action = new TextViewerAction(getViewer(), ITextOperationTarget.SELECT_ALL);
action.configureAction(ConsoleMessages.getString("BuildConsolePage.Select_&All@Ctrl+A_12"), //$NON-NLS-1$
ConsoleMessages.getString("BuildConsolePage.Select_All"), //$NON-NLS-1$
ConsoleMessages.getString("BuildConsolePage.Select_All")); //$NON-NLS-1$
setGlobalAction(actionBars, ActionFactory.SELECT_ALL.getId(), action);
//XXX Still using "old" resource access
ResourceBundle bundle = ResourceBundle.getBundle(ConsoleMessages.BUNDLE_NAME); //$NON-NLS-1$
setGlobalAction(actionBars, ActionFactory.FIND.getId(), new FindReplaceAction(bundle, "find_replace_action.", //$NON-NLS-1$
getConsoleView())); //$NON-NLS-1$
action = new TextViewerGotoLineAction(getViewer());
setGlobalAction(actionBars, ITextEditorActionConstants.GOTO_LINE, action);
actionBars.updateActionBars();
fSelectionActions.add(ActionFactory.COPY.getId());
fSelectionActions.add(ActionFactory.FIND.getId());
}
protected void updateSelectionDependentActions() {
Iterator iterator = fSelectionActions.iterator();
while (iterator.hasNext()) {
updateAction((String) iterator.next());
}
}
protected void updateAction(String actionId) {
IAction action = (IAction) fGlobalActions.get(actionId);
if (action instanceof IUpdate) {
((IUpdate) action).update();
}
}
protected void setGlobalAction(IActionBars actionBars, String actionID, IAction action) {
fGlobalActions.put(actionID, action);
actionBars.setGlobalActionHandler(actionID, action);
}
protected void configureToolBar(IToolBarManager mgr) {
mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fScrollLockAction);
mgr.appendToGroup(IConsoleConstants.OUTPUT_GROUP, fClearOutputAction);
}
protected BuildConsoleViewer getViewer() {
return fViewer;
}
/**
* Returns the view this page is contained in
*
* @return the view this page is contained in
*/
protected IConsoleView getConsoleView() {
return fConsoleView;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.IPage#dispose()
*/
public void dispose() {
super.dispose();
getSite().getPage().removeSelectionListener(this);
getConsole().getConsoleManager().addConsoleListener(this);
}
public void init(IPageSite pageSite) {
super.init(pageSite);
setProject(convertSelectionToProject(getSite().getPage().getSelection()));
getSite().getPage().addSelectionListener(this);
getConsole().getConsoleManager().addConsoleListener(this);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
IProject newProject = convertSelectionToProject(selection);
IProject oldProject = getProject();
if (oldProject == null || (newProject != null && !newProject.equals(oldProject))) {
setProject(newProject);
setDocument();
getConsole().setTitle(getProject());
}
}
IProject convertSelectionToProject(ISelection selection) {
IProject project = null;
if (selection == null || !(selection instanceof IStructuredSelection)) {
return project;
}
IStructuredSelection ssel = (IStructuredSelection) selection;
Object element = ssel.getFirstElement();
if (element instanceof IAdaptable) {
IAdaptable input = (IAdaptable) element;
if (input != null) {
IResource resource = null;
if (input instanceof IResource) {
resource = (IResource) input;
} else {
resource = (IResource) input.getAdapter(IResource.class);
}
if (resource != null) {
project = resource.getProject();
}
}
}
return project;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.IPage#getControl()
*/
public Control getControl() {
if (fViewer != null) {
return fViewer.getControl();
}
return null;
}
// /*
// * (non-Javadoc)
// *
// * @see
// org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
// */
// public void setActionBars(IActionBars actionBars) {
// }
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.IPage#setFocus()
*/
public void setFocus() {
Control control = getControl();
if (control != null) {
control.setFocus();
}
updateSelectionDependentActions();
}
/**
* Sets the font for this page.
*
* @param font
* font
*/
protected void setFont(Font font) {
getViewer().getTextWidget().setFont(font);
}
/**
* Sets the tab width for this page.
*
* @param int
* tab width
*/
protected void setTabs(int tabs) {
getViewer().getTextWidget().setTabs(tabs);
}
/**
* Refreshes this page
*/
protected void refresh() {
getViewer().refresh();
}
}

View file

@ -0,0 +1,103 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.text.TypedRegion;
public class BuildConsolePartition extends TypedRegion {
/**
* Associated stream
*/
private BuildConsoleStream fStream;
/**
* Partition type
*/
public static final String CONSOLE_PARTITION_TYPE = CUIPlugin.getPluginId() + ".CONSOLE_PARTITION_TYPE"; //$NON-NLS-1$
public BuildConsolePartition(BuildConsoleStream stream, int offset, int length) {
super(offset, length, CONSOLE_PARTITION_TYPE);
fStream = stream;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object partition) {
if (super.equals(partition)) {
fStream.equals(((BuildConsolePartition) partition).getStream());
}
return false;
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return super.hashCode() + fStream.hashCode();
}
/**
* Returns this partition's stream
*
* @return this partition's stream
*/
public BuildConsoleStream getStream() {
return fStream;
}
/**
* Returns whether this partition is allowed to be combined with the given
* partition.
*
* @param partition
* @return boolean
*/
public boolean canBeCombinedWith(BuildConsolePartition partition) {
int start = getOffset();
int end = start + getLength();
int otherStart = partition.getOffset();
int otherEnd = otherStart + partition.getLength();
boolean overlap = (otherStart >= start && otherStart <= end) || (start >= otherStart && start <= otherEnd);
return overlap && getType().equals(partition.getType()) && getStream().equals(partition.getStream());
}
/**
* Returns a new partition representing this and the given parition
* combined.
*
* @param partition
* @return partition
*/
public BuildConsolePartition combineWith(BuildConsolePartition partition) {
int start = getOffset();
int end = start + getLength();
int otherStart = partition.getOffset();
int otherEnd = otherStart + partition.getLength();
int theStart = Math.min(start, otherStart);
int theEnd = Math.max(end, otherEnd);
return createNewPartition(theStart, theEnd - theStart);
}
/**
* Creates a new patition of this type with the given color, offset, and
* length.
*
* @param offset
* @param length
* @return a new partition with the given range
*/
public BuildConsolePartition createNewPartition(int offset, int length) {
return new BuildConsolePartition(getStream(), offset, length);
}
}

View file

@ -0,0 +1,332 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsole;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.IDocumentPartitionerExtension;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Display;
public class BuildConsolePartitioner
implements
IDocumentPartitioner,
IDocumentPartitionerExtension,
IBuildConsole,
IPropertyChangeListener {
/**
* List of partitions
*/
List fPartitions = new ArrayList(5);
private int fMaxLines;
/**
* The stream that was last appended to
*/
BuildConsoleStream fLastStream = null;
BuildConsoleDocument fDocument;
boolean killed;
BuildConsoleManager fManager;
public BuildConsolePartitioner(BuildConsoleManager manager) {
fManager = manager;
fMaxLines = BuildConsolePreferencePage.buildConsoleLines();
fDocument = new BuildConsoleDocument();
fDocument.setDocumentPartitioner(this);
connect(fDocument);
}
/**
* Adds the new text to the document.
*
* @param text
* the text to append
* @param stream
* the stream to append to
*/
public void appendToDocument(final String text, final BuildConsoleStream stream) {
Runnable r = new Runnable() {
public void run() {
fLastStream = stream;
try {
if (stream == null) {
fDocument.set(text);
} else {
fDocument.replace(fDocument.getLength(), 0, text);
checkOverflow();
}
} catch (BadLocationException e) {
}
}
};
Display display = CUIPlugin.getStandardDisplay();
if (display != null) {
display.asyncExec(r);
}
}
public IDocument getDocument() {
return fDocument;
}
public void setDocumentSize(int nLines) {
fMaxLines = nLines;
nLines = fDocument.getNumberOfLines();
checkOverflow();
}
public void connect(IDocument document) {
CUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
}
public void disconnect() {
fDocument.setDocumentPartitioner(null);
CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
killed = true;
}
public void documentAboutToBeChanged(DocumentEvent event) {
}
public boolean documentChanged(DocumentEvent event) {
return documentChanged2(event) != null;
}
/**
* @see org.eclipse.jface.text.IDocumentPartitioner#getLegalContentTypes()
*/
public String[] getLegalContentTypes() {
return new String[]{BuildConsolePartition.CONSOLE_PARTITION_TYPE};
}
/**
* @see org.eclipse.jface.text.IDocumentPartitioner#getContentType(int)
*/
public String getContentType(int offset) {
ITypedRegion partition = getPartition(offset);
if (partition != null) {
return partition.getType();
}
return null;
}
/**
* @see org.eclipse.jface.text.IDocumentPartitioner#computePartitioning(int,
* int)
*/
public ITypedRegion[] computePartitioning(int offset, int length) {
if (offset == 0 && length == fDocument.getLength()) {
return (ITypedRegion[]) fPartitions.toArray(new ITypedRegion[fPartitions.size()]);
} else {
int end = offset + length;
List list = new ArrayList();
for (int i = 0; i < fPartitions.size(); i++) {
ITypedRegion partition = (ITypedRegion) fPartitions.get(i);
int partitionStart = partition.getOffset();
int partitionEnd = partitionStart + partition.getLength();
if ((offset >= partitionStart && offset <= partitionEnd) || (offset < partitionStart && end >= partitionStart)) {
list.add(partition);
}
}
return (ITypedRegion[]) list.toArray(new ITypedRegion[list.size()]);
}
}
/**
* @see org.eclipse.jface.text.IDocumentPartitioner#getPartition(int)
*/
public ITypedRegion getPartition(int offset) {
for (int i = 0; i < fPartitions.size(); i++) {
ITypedRegion partition = (ITypedRegion) fPartitions.get(i);
int start = partition.getOffset();
int end = start + partition.getLength();
if (offset >= start && offset < end) {
return partition;
}
}
return null;
}
public IRegion documentChanged2(DocumentEvent event) {
String text = event.getText();
if (getDocument().getLength() == 0) {
// cleared
fPartitions.clear();
return new Region(0, 0);
}
addPartition(new BuildConsolePartition(fLastStream, event.getOffset(), text.length()));
ITypedRegion[] affectedRegions = computePartitioning(event.getOffset(), text.length());
if (affectedRegions.length == 0) {
return null;
}
if (affectedRegions.length == 1) {
return affectedRegions[0];
}
int affectedLength = affectedRegions[0].getLength();
for (int i = 1; i < affectedRegions.length; i++) {
ITypedRegion region = affectedRegions[i];
affectedLength += region.getLength();
}
return new Region(affectedRegions[0].getOffset(), affectedLength);
}
/**
* Checks to see if the console buffer has overflowed, and empties the
* overflow if needed, updating partitions and hyperlink positions.
*/
protected void checkOverflow() {
if (fMaxLines >= 0) {
int nLines = fDocument.getNumberOfLines();
if (nLines > fMaxLines + 1) {
int overflow = 0;
try {
overflow = fDocument.getLineOffset(nLines - fMaxLines);
} catch (BadLocationException e1) {
}
// update partitions
List newParitions = new ArrayList(fPartitions.size());
Iterator partitions = fPartitions.iterator();
while (partitions.hasNext()) {
ITypedRegion region = (ITypedRegion) partitions.next();
if (region instanceof BuildConsolePartition) {
BuildConsolePartition messageConsolePartition = (BuildConsolePartition)region;
ITypedRegion newPartition = null;
int offset = region.getOffset();
if (offset < overflow) {
int endOffset = offset + region.getLength();
if (endOffset < overflow) {
// remove partition
} else {
// split partition
int length = endOffset - overflow;
newPartition = messageConsolePartition.createNewPartition(0, length);
}
} else {
// modify parition offset
newPartition = messageConsolePartition.createNewPartition(messageConsolePartition.getOffset()-overflow, messageConsolePartition.getLength());
}
if (newPartition != null) {
newParitions.add(newPartition);
}
}
}
fPartitions = newParitions;
//called from GUI Thread (see startUpdaterThread()), no asyncExec needed.
try {
fDocument.replace(0, overflow, ""); //$NON-NLS-1$
} catch (BadLocationException e) {
}
}
}
}
/**
* Adds a new colored input partition, combining with the previous
* partition if possible.
*/
private BuildConsolePartition addPartition(BuildConsolePartition partition) {
if (fPartitions.isEmpty()) {
fPartitions.add(partition);
} else {
int index = fPartitions.size() - 1;
BuildConsolePartition last = (BuildConsolePartition) fPartitions.get(index);
if (last.canBeCombinedWith(partition)) {
// replace with a single partition
partition = last.combineWith(partition);
fPartitions.set(index, partition);
} else {
// different kinds - add a new parition
fPartitions.add(partition);
}
}
return partition;
}
public IBuildConsole getConsole() {
return this;
}
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() == BuildConsolePreferencePage.PREF_BUILDCONSOLE_LINES) {
setDocumentSize(BuildConsolePreferencePage.buildConsoleLines());
}
}
public void start(IProject project) {
if (BuildConsolePreferencePage.isClearBuildConsole()) {
appendToDocument("", null); //$NON-NLS-1$
}
fManager.startConsoleActivity(project);
}
public class BuildOutputStream extends ConsoleOutputStream {
final BuildConsoleStream fStream;
public BuildOutputStream(BuildConsoleStream stream) {
fStream = stream;
}
public void flush() throws IOException {
appendToDocument(readBuffer(), fStream);
fManager.showConsole();
}
public void close() throws IOException {
flush();
}
public synchronized void write(byte[] b, int off, int len) throws IOException {
super.write(b, off, len);
flush();
}
}
public ConsoleOutputStream getOutputStream() {
return new BuildOutputStream(fManager.outputStream);
}
public ConsoleOutputStream getInfoStream() {
return new BuildOutputStream(fManager.infoStream);
}
public ConsoleOutputStream getErrorStream() {
return new BuildOutputStream(fManager.errorStream);
}
}

View file

@ -0,0 +1,59 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.swt.graphics.Color;
public class BuildConsoleStream {
private BuildConsole fConsole = null;
private Color fColor = null;
/**
* Constructs a new stream connected to the given console.
*
* @param console the console to write messages to
*/
public BuildConsoleStream(BuildConsole console) {
fConsole = console;
}
/**
* Sets the color of this message stream
*
* @param color color of this message stream, possibly <code>null</code>
*/
public void setColor(Color color) {
Color old = fColor;
fColor = color;
fConsole.firePropertyChange(this, BuildConsole.P_STREAM_COLOR, old, color);
}
/**
* Returns the color of this message stream, or <code>null</code>
* if default.
*
* @return the color of this message stream, or <code>null</code>
*/
public Color getColor() {
return fColor;
}
/**
* Returns the console this stream is connected to.
*
* @return the console this stream is connected to
*/
public BuildConsole getConsole() {
return fConsole;
}
}

View file

@ -1,313 +0,0 @@
package org.eclipse.cdt.internal.ui.buildconsole;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.ResourceBundle;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsoleEvent;
import org.eclipse.cdt.ui.IBuildConsoleListener;
import org.eclipse.cdt.ui.IBuildConsoleManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.TextEditorAction;
/**
/**
* Console view for the desktop. Registered using XML.
*/
public class BuildConsoleView extends ViewPart implements ISelectionListener, IBuildConsoleListener {
private IProject selProject;
private Font fFont;
private IPropertyChangeListener fPropertyChangeListener;
protected TextViewer fTextViewer;
IBuildConsoleManager fConsoleManager;
ClearConsoleAction fClearOutputAction;
TextEditorAction fCopyAction;
TextEditorAction fSelectAllAction;
String origTitle;
public BuildConsoleView() {
super();
fFont = null;
fPropertyChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (fTextViewer != null && event.getProperty().equals(BuildConsolePreferencePage.PREF_CONSOLE_FONT)) {
initializeWidgetFont(fTextViewer.getTextWidget());
}
}
};
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
store.addPropertyChangeListener(fPropertyChangeListener);
fConsoleManager = CUIPlugin.getDefault().getConsoleManager();
}
private void initializeActions() {
ResourceBundle bundle = CUIPlugin.getResourceBundle();
IActionBars actionBars = getViewSite().getActionBars();
fClearOutputAction = new ClearConsoleAction(this);
fCopyAction = new BuildConsoleAction(bundle, "Editor.Copy.", fTextViewer, ITextOperationTarget.COPY); //$NON-NLS-1$
fSelectAllAction = new BuildConsoleAction(bundle, "Editor.SelectAll.", fTextViewer, ITextOperationTarget.SELECT_ALL); //$NON-NLS-1$
actionBars.setGlobalActionHandler(ITextEditorActionConstants.COPY, fCopyAction);
actionBars.setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, fSelectAllAction);
fTextViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent e) {
// ensures that the copyAction updates is doability when the selections tate changes
fCopyAction.update();
}
});
}
/**
* @see ViewPart#createPartControl
*/
public void createPartControl(Composite parent) {
fTextViewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.MULTI);
fTextViewer.addTextListener(new ITextListener() {
public void textChanged(TextEvent event) {
revealEndOfDocument();
}
});
fTextViewer.setEditable(false);
origTitle = getTitle();
initializeWidgetFont(fTextViewer.getTextWidget());
initializeActions();
initializeContextMenu(fTextViewer.getControl());
initializeToolBar();
WorkbenchHelp.setHelp(fTextViewer.getControl(), ICHelpContextIds.CLEAR_CONSOLE_VIEW);
setProject(getSite().getPage().getSelection());
setDocument();
setTitle();
getSite().getPage().addSelectionListener(this);
fConsoleManager.addConsoleListener(this);
}
protected void setProject(ISelection selection) {
selProject = convertSelectionToProject(selection);
}
protected void setProject(IProject project) {
selProject = project;
}
protected IProject getProject() {
return selProject;
}
protected IDocument setDocument() {
IProject project = getProject();
if (project != null) {
fTextViewer.setDocument(fConsoleManager.getConsoleDocument(project));
}
return null;
}
protected void setTitle() {
String title = origTitle;
IProject project = getProject();
if (project != null) {
title += " [" + project.getName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
}
setTitle(title);
}
protected void initializeWidgetFont(StyledText styledText) {
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
String prefKey = BuildConsolePreferencePage.PREF_CONSOLE_FONT;
FontData data = null;
if (store.contains(prefKey) && !store.isDefault(prefKey)) {
data = PreferenceConverter.getFontData(store, prefKey);
} else {
data = PreferenceConverter.getDefaultFontData(store, prefKey);
}
if (data != null) {
Font font = new Font(styledText.getDisplay(), data);
styledText.setFont(font);
if (fFont != null)
fFont.dispose();
fFont = font;
} else {
// if all the preferences failed
styledText.setFont(JFaceResources.getTextFont());
}
}
/**
* @see IWorkbenchPart#setFocus()
*/
public void setFocus() {
fTextViewer.getControl().setFocus();
}
/**
* Initializes the context menu
*/
protected void initializeContextMenu(Control parent) {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(parent);
parent.setMenu(menu);
}
/**
* Adds the text manipulation actions to the <code>ConsoleViewer</code>
*/
protected void fillContextMenu(IMenuManager menu) {
fCopyAction.update();
menu.add(fCopyAction);
menu.add(fSelectAllAction);
menu.add(new Separator());
menu.add(fClearOutputAction);
}
/**
* Configures the toolBar.
*/
private void initializeToolBar() {
IActionBars actionBars = getViewSite().getActionBars();
actionBars.getToolBarManager().add(fClearOutputAction);
actionBars.updateActionBars();
}
/**
* Reveals (makes visible) the end of the current document
*/
protected void revealEndOfDocument() {
IDocument doc = fTextViewer.getDocument();
int docLength = doc.getLength();
if (docLength > 0) {
fTextViewer.revealRange(docLength - 1, 1);
StyledText widget = fTextViewer.getTextWidget();
widget.setCaretOffset(docLength);
widget.showSelection();
}
}
/**
* @see WorkbenchPart#dispose()
*/
public void dispose() {
super.dispose();
if (fPropertyChangeListener != null) {
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
store.removePropertyChangeListener(fPropertyChangeListener);
fPropertyChangeListener = null;
}
if (fFont != null) {
fFont.dispose();
fFont = null;
}
getSite().getPage().removeSelectionListener(this);
fConsoleManager.removeConsoleListener(this);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
IProject newProject = convertSelectionToProject(selection);
IProject oldProject = getProject();
if (oldProject == null || (newProject != null && !newProject.equals(oldProject))) {
setProject(newProject);
setDocument();
setTitle();
}
}
public void consoleChange(IBuildConsoleEvent event) {
if (event.getType() == IBuildConsoleEvent.CONSOLE_START || event.getType() == IBuildConsoleEvent.CONSOLE_CLOSE) {
Display display = fTextViewer.getControl().getDisplay();
selProject = event.getProject();
if (event.getType() == IBuildConsoleEvent.CONSOLE_CLOSE && selProject != event.getProject()) {
return;
}
display.asyncExec(new Runnable() {
public void run() {
setDocument();
setTitle();
}
});
}
}
IProject convertSelectionToProject(ISelection selection) {
IProject project = null;
if (selection == null || !(selection instanceof IStructuredSelection)) {
return project;
}
IStructuredSelection ssel = (IStructuredSelection) selection;
Object element = ssel.getFirstElement();
if (element instanceof IAdaptable) {
IAdaptable input = (IAdaptable) element;
if (input != null) {
IResource resource = null;
if (input instanceof IResource) {
resource = (IResource) input;
} else {
resource = (IResource) input.getAdapter(IResource.class);
}
if (resource != null) {
project = resource.getProject();
}
}
}
return project;
}
/**
* Clears the console
*/
void clear() {
if (selProject != null) {
fConsoleManager.getConsole(selProject).clear();
}
}
}

View file

@ -0,0 +1,188 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
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.jface.text.ITypedRegion;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.LineStyleEvent;
import org.eclipse.swt.custom.LineStyleListener;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
public class BuildConsoleViewer extends TextViewer implements LineStyleListener {
protected InternalDocumentListener fInternalDocumentListener = new InternalDocumentListener();
/**
* Whether the console scrolls as output is appended.
*/
private boolean fAutoScroll = true;
/**
* Internal document listener.
*/
class InternalDocumentListener implements IDocumentListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
*/
public void documentAboutToBeChanged(DocumentEvent e) {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
*/
public void documentChanged(DocumentEvent e) {
revealEndOfDocument();
}
}
/**
* Sets whether this viewer should auto-scroll as output is appended to the
* document.
*
* @param scroll
*/
public void setAutoScroll(boolean scroll) {
fAutoScroll = scroll;
}
/**
* Returns whether this viewer should auto-scroll as output is appended to
* the document.
*/
public boolean isAutoScroll() {
return fAutoScroll;
}
/**
* Creates a new console viewer and adds verification checking to only
* allow text modification if the text is being modified in the editable
* portion of the underlying document.
*
* @see org.eclipse.swt.events.VerifyListener
*/
public BuildConsoleViewer(Composite parent) {
super(parent, getSWTStyles());
getTextWidget().setDoubleClickEnabled(true);
getTextWidget().setFont(parent.getFont());
getTextWidget().addLineStyleListener(this);
getTextWidget().setEditable(false);
}
/**
* Returns the SWT style flags used when instantiating this viewer
*/
private static int getSWTStyles() {
int styles = SWT.H_SCROLL | SWT.V_SCROLL;
return styles;
}
/**
* Reveals (makes visible) the end of the current document
*/
protected void revealEndOfDocument() {
if (isAutoScroll()) {
IDocument doc = getDocument();
int lines = doc.getNumberOfLines();
try {
// lines are 0-based
int lineStartOffset = doc.getLineOffset(lines - 1);
StyledText widget = getTextWidget();
if (lineStartOffset > 0) {
widget.setCaretOffset(lineStartOffset);
widget.showSelection();
}
int lineEndOffset = lineStartOffset + doc.getLineLength(lines - 1);
if (lineEndOffset > 0) {
widget.setCaretOffset(lineEndOffset);
}
} catch (BadLocationException e) {
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.ITextViewer#setDocument(org.eclipse.jface.text.IDocument)
*/
public void setDocument(IDocument doc) {
IDocument oldDoc = getDocument();
IDocument document = doc;
if (oldDoc == null && document == null) {
return;
}
if (oldDoc != null) {
oldDoc.removeDocumentListener(fInternalDocumentListener);
if (oldDoc.equals(document)) {
document.addDocumentListener(fInternalDocumentListener);
return;
}
}
super.setDocument(document);
if (document != null) {
revealEndOfDocument();
document.addDocumentListener(fInternalDocumentListener);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.TextViewer#canPerformFind()
*/
protected boolean canPerformFind() {
return (getTextWidget() != null && getVisibleDocument() != null && getVisibleDocument().getLength() > 0);
}
/**
* Dispose this viewer and resources
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.custom.LineStyleListener#lineGetStyle(org.eclipse.swt.custom.LineStyleEvent)
*/
public void lineGetStyle(LineStyleEvent event) {
IDocument document = getDocument();
if (document != null) {
BuildConsolePartitioner partitioner = (BuildConsolePartitioner) document.getDocumentPartitioner();
if (partitioner != null) {
ITypedRegion[] regions = partitioner.computePartitioning(event.lineOffset, event.lineOffset
+ event.lineText.length());
StyleRange[] styles = new StyleRange[regions.length];
for (int i = 0; i < regions.length; i++) {
BuildConsolePartition partition = (BuildConsolePartition) regions[i];
Color color = partition.getStream().getColor();
styles[i] = new StyleRange(partition.getOffset(), partition.getLength(), color, null);
}
event.styles = styles;
}
}
}
}

View file

@ -0,0 +1,49 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IBuildConsoleManager;
import org.eclipse.core.resources.IProject;
public class CBuildConsole implements IConsole {
IProject project;
IBuildConsoleManager fConsoleManager;
/**
* Constructor for BuildConsole.
*/
public CBuildConsole() {
fConsoleManager = CUIPlugin.getDefault().getConsoleManager();
}
public void start(IProject project ) {
this.project = project;
fConsoleManager.getConsole(project).start(project);
}
/**
* @see org.eclipse.cdt.core.resources.IConsole#getOutputStream()
*/
public ConsoleOutputStream getOutputStream() {
return fConsoleManager.getConsole(project).getOutputStream();
}
public ConsoleOutputStream getInfoStream() {
return fConsoleManager.getConsole(project).getInfoStream();
}
public ConsoleOutputStream getErrorStream() {
return fConsoleManager.getConsole(project).getErrorStream();
}
}

View file

@ -1,39 +0,0 @@
package org.eclipse.cdt.internal.ui.buildconsole;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.action.Action;
import org.eclipse.ui.help.WorkbenchHelp;
/**
* Clears the output of the selected launches
*/
public class ClearConsoleAction extends Action {
private BuildConsoleView fConsoleView;
public ClearConsoleAction(BuildConsoleView view) {
super(CUIPlugin.getResourceString("ClearOutputAction.label")); //$NON-NLS-1$
CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, CPluginImages.IMG_CLEAR_CONSOLE);
fConsoleView= view;
setToolTipText(CUIPlugin.getResourceString("ClearOutputAction.tooltip")); //$NON-NLS-1$
WorkbenchHelp.setHelp(this, ICHelpContextIds.CLEAR_CONSOLE_ACTION);
}
/**
* @see Action
*/
public void run() {
fConsoleView.clear();
}
}

View file

@ -0,0 +1,32 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class ConsoleMessages {
public static final String BUNDLE_NAME = "org.eclipse.cdt.internal.ui.buildconsole.ConsoleMessages";//$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private ConsoleMessages() {
}
public static String getString(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}

View file

@ -0,0 +1,13 @@
BuildConsole.buildConsole=C-Build
find_replace_action.label=&Find/Replace...@Ctrl+F
find_replace_action.tooltip=Find/Replace
find_replace_action.image=
find_replace_action.description=Find/Replace
BuildConsolePage.&Copy@Ctrl+C_6=&Copy@Ctrl+C
BuildConsolePage.Copy_7=Copy
BuildConsolePage.Select_&All@Ctrl+A_12=Select &All@Ctrl+A
BuildConsolePage.Select_All=Select All
ScrollLockAction.Scroll_Lock_1=Scroll Lock

View file

@ -0,0 +1,67 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.jface.text.ITextStore;
public class ConsoleOutputTextStore implements ITextStore {
private StringBuffer fBuffer;
public ConsoleOutputTextStore(int bufferSize) {
fBuffer = new StringBuffer(bufferSize);
}
/**
* @see ITextStore#get(int)
*/
public char get(int pos) {
return fBuffer.charAt(pos);
}
/**
* @see ITextStore#get(int, int)
*/
public String get(int pos, int length) {
return fBuffer.substring(pos, pos + length);
}
/**
* @see ITextStore#getLength()
*/
public int getLength() {
return fBuffer.length();
}
/**
* @see ITextStore#replace(int, int, String)
*/
public void replace(int pos, int length, String text) {
if (text == null) {
text = ""; //$NON-NLS-1$
}
fBuffer.replace(pos, pos + length, text);
}
/**
* @see ITextStore#set(String)
*/
public void set(String text) {
fBuffer = new StringBuffer(text);
}
/**
* @see StringBuffer#ensureCapacity(int)
*/
public void setMinimalBufferSize(int bufferSize) {
fBuffer.ensureCapacity(bufferSize);
}
}

View file

@ -0,0 +1,39 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.buildconsole;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.jface.action.Action;
/**
* Toggles console auto-scroll
*/
public class ScrollLockAction extends Action {
private BuildConsoleViewer fConsoleViewer;
public ScrollLockAction(BuildConsoleViewer viewer) {
super(ConsoleMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$
fConsoleViewer = viewer;
setToolTipText(ConsoleMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$
CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, CPluginImages.IMG_SCROLL_LOCK);
setChecked(false);
}
/**
* @see org.eclipse.jface.action.IAction#run()
*/
public void run() {
fConsoleViewer.setAutoScroll(!isChecked());
}
}

View file

@ -6,31 +6,33 @@ package org.eclipse.cdt.internal.ui.preferences;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.FontFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
public class BuildConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public static final String PREF_CONSOLE_FONT = "consoleFont"; //$NON-NLS-1$
private static final String PREF_CLEAR_CONSOLE = "clearConsole"; //$NON-NLS-1$
private static final String PREF_CONSOLE_ON_TOP = "consoleOnTop"; //$NON-NLS-1$
private static final String PREF_AUTO_OPEN_CONSOLE = "autoOpenConsole"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_LINES = "buildConsoleLines"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_LINES_ERROR = "CBasePreferencePage.buildConsole.errorMessage"; //$NON-NLS-1$
private static final String CLEAR_CONSOLE_LABEL= "CBasePreferencePage.clearConsole.label"; //$NON-NLS-1$
private static final String CONSOLE_ON_TOP_LABEL= "CBasePreferencePage.consoleOnTop.label"; //$NON-NLS-1$
private static final String AUTO_OPEN_CONSOLE_LABEL= "CBasePreferencePage.autoOpenConsole.label"; //$NON-NLS-1$
private static final String CONSOLE_FONT_LABEL= "CBasePreferencePage.consoleFont.label"; //$NON-NLS-1$
// In font registry
public static final String PREF_BUILDCONSOLE_FONT = "org.eclipse.cdt.ui.buildconsole.ConsoleFont"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_TAB_WIDTH = "buildConsoleTabWith"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_LINES = "buildConsoleLines"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_INFO_COLOR = "buildConsoleInfoStreamColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_OUTPUT_COLOR = "buildConsoleOutputStreamColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_ERROR_COLOR = "buildConsoleErrorStreamColor"; //$NON-NLS-1$
public BuildConsolePreferencePage() {
super(GRID);
@ -39,28 +41,61 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem
protected void createFieldEditors() {
Composite parent = getFieldEditorParent();
BooleanFieldEditor clearConsole =
new BooleanFieldEditor(PREF_CLEAR_CONSOLE, CUIPlugin.getResourceString(CLEAR_CONSOLE_LABEL), parent);
BooleanFieldEditor clearConsole = new BooleanFieldEditor(PREF_CLEAR_CONSOLE,
CUIPlugin.getResourceString("ConsolePreferencePage.clearConsole.label"), parent); //$NON-NLS-1$
addField(clearConsole);
BooleanFieldEditor autoOpenConsole =
new BooleanFieldEditor(PREF_AUTO_OPEN_CONSOLE, CUIPlugin.getResourceString(AUTO_OPEN_CONSOLE_LABEL), parent);
BooleanFieldEditor autoOpenConsole = new BooleanFieldEditor(PREF_AUTO_OPEN_CONSOLE,
CUIPlugin.getResourceString("ConsolePreferencePage.autoOpenConsole.label"), parent); //$NON-NLS-1$
addField(autoOpenConsole);
BooleanFieldEditor consoleOnTop =
new BooleanFieldEditor(PREF_CONSOLE_ON_TOP, CUIPlugin.getResourceString(CONSOLE_ON_TOP_LABEL), parent);
BooleanFieldEditor consoleOnTop = new BooleanFieldEditor(PREF_CONSOLE_ON_TOP,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleOnTop.label"), parent); //$NON-NLS-1$
addField(consoleOnTop);
IntegerFieldEditor buildCount = new IntegerFieldEditor( PREF_BUILDCONSOLE_LINES, PreferencesMessages.getString("BuildConsolePreferencePage.fieldEditors.buildConsoleLines"), parent ); //$NON-NLS-1$
buildCount.setErrorMessage(CUIPlugin.getResourceString(PREF_BUILDCONSOLE_LINES_ERROR));
buildCount.setValidRange( 10, Integer.MAX_VALUE );
addField( buildCount );
IntegerFieldEditor buildCount = new IntegerFieldEditor(PREF_BUILDCONSOLE_LINES,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.label"), parent); //$NON-NLS-1$
buildCount.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.errorMessage")); //$NON-NLS-1$
buildCount.setValidRange(10, Integer.MAX_VALUE);
addField(buildCount);
addField(new FontFieldEditor(PREF_CONSOLE_FONT, CUIPlugin.getResourceString(CONSOLE_FONT_LABEL), parent));
IntegerFieldEditor tabSize = new IntegerFieldEditor(PREF_BUILDCONSOLE_TAB_WIDTH,
CUIPlugin.getResourceString("ConsolePreferencePage.tabWidth.label"), parent); //$NON-NLS-1$
addField(tabSize);
tabSize.setValidRange(1, 100);
tabSize.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.tabWidth.errorMessage")); //$NON-NLS-1$
createLabel(parent, CUIPlugin.getResourceString("ConsolePreferencePage.colorSettings.label")); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_OUTPUT_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.outputColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_INFO_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.infoColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_ERROR_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.errorColor.label"), parent)); //$NON-NLS-1$
}
private Label createLabel(Composite parent, String text) {
Label label = new Label(parent, SWT.LEFT);
label.setText(text);
GridData data = new GridData();
data.horizontalSpan = 2;
data.horizontalAlignment = GridData.FILL;
label.setLayoutData(data);
return label;
}
/**
* Creates a new color field editor.
*/
private ColorFieldEditor createColorFieldEditor(String preferenceName, String label, Composite parent) {
ColorFieldEditor editor = new ColorFieldEditor(preferenceName, label, parent);
editor.setPreferencePage(this);
editor.setPreferenceStore(getPreferenceStore());
return editor;
}
/**
* Returns the current preference setting if the build console should
* be cleared before each build.
* Returns the current preference setting if the build console should be
* cleared before each build.
*/
public static boolean isClearBuildConsole() {
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_CLEAR_CONSOLE);
@ -85,14 +120,10 @@ public class BuildConsolePreferencePage extends FieldEditorPreferencePage implem
prefs.setDefault(PREF_AUTO_OPEN_CONSOLE, false);
prefs.setDefault(PREF_CONSOLE_ON_TOP, true);
prefs.setDefault(PREF_BUILDCONSOLE_LINES, 500);
Font font = JFaceResources.getTextFont();
if (font != null) {
FontData[] data = font.getFontData();
if (data != null && data.length > 0) {
PreferenceConverter.setDefault(prefs, PREF_CONSOLE_FONT, data[0]);
}
}
prefs.setDefault(PREF_BUILDCONSOLE_TAB_WIDTH, 4);
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_OUTPUT_COLOR, new RGB(0, 0, 0));
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_INFO_COLOR, new RGB(0, 0, 255));
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_ERROR_COLOR, new RGB(255, 0, 0));
}
}

View file

@ -26,10 +26,10 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.cdt.internal.corext.refactoring.base.Refactoring;
import org.eclipse.cdt.internal.ui.BuildConsoleManager;
import org.eclipse.cdt.internal.ui.CElementAdapterFactory;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.ResourceAdapterFactory;
import org.eclipse.cdt.internal.ui.buildconsole.BuildConsoleManager;
import org.eclipse.cdt.internal.ui.cview.CView;
import org.eclipse.cdt.internal.ui.editor.CDocumentProvider;
import org.eclipse.cdt.internal.ui.editor.SharedTextColors;
@ -457,5 +457,17 @@ public class CUIPlugin extends AbstractUIPlugin {
}
return (IEditorPart[])result.toArray(new IEditorPart[result.size()]);
}
/**
* Returns the standard display to be used. The method first checks, if
* the thread calling this method has an associated display. If so, this
* display is returned. Otherwise the method returns the default display.
*/
public static Display getStandardDisplay() {
Display display= Display.getCurrent();
if (display == null) {
display= Display.getDefault();
}
return display;
}
}

View file

@ -0,0 +1,21 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.ui;
import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.core.resources.IProject;
public interface IBuildConsole {
void start(IProject project);
ConsoleOutputStream getOutputStream();
ConsoleOutputStream getInfoStream();
ConsoleOutputStream getErrorStream();
}

View file

@ -1,15 +1,20 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.ui;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.text.IDocument;
public interface IBuildConsoleManager {
IConsole getConsole(IProject project);
IBuildConsole getConsole(IProject project);
IDocument getConsoleDocument(IProject project);
void addConsoleListener(IBuildConsoleListener listener);
void removeConsoleListener(IBuildConsoleListener listener);