blob: e58b735fcb4fe7f7adad78f40f97022aa39d3029 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.console;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IBasicPropertyConstants;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleListener;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.IPageBookViewPage;
import org.eclipse.ui.part.MessagePage;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.PageBookView;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
/**
* Page book console view.
*
* @since 3.0
*/
public class ConsoleView extends PageBookView implements IConsoleView, IConsoleListener, IPropertyChangeListener {
/**
* Whether this console is pinned.
*/
private boolean fPinned = false;
/**
* Stack of consoles in MRU order
*/
private List fStack = new ArrayList();
/**
* The console being displayed, or <code>null</code> if none
*/
private IConsole fActiveConsole = null;
/**
* Map of consoles to dummy console parts (used to close pages)
*/
private Map fConsoleToPart;
/**
* Map of parts to consoles
*/
private Map fPartToConsole;
// actions
private PinConsoleAction fPinAction = null;
private ConsoleDropDownAction fDisplayConsoleAction = null;
private boolean isAvailable() {
return getPageBook() != null && !getPageBook().isDisposed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
Object source = event.getSource();
if (source instanceof IConsole && event.getProperty().equals(IBasicPropertyConstants.P_TEXT)) {
if (source.equals(getConsole())) {
updateTitle();
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
*/
public void partClosed(IWorkbenchPart part) {
if (isPinned()) {
// if closing the pinned console, un-pin
IConsole console = (IConsole)fPartToConsole.get(part);
if (console != null && console.equals(getConsole())) {
pin(null);
}
}
super.partClosed(part);
fPinAction.update();
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.ui.console.IConsoleView#getConsole()
*/
public IConsole getConsole() {
return fActiveConsole;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#showPageRec(org.eclipse.ui.part.PageBookView.PageRec)
*/
protected void showPageRec(PageRec pageRec) {
if (!isPinned()) {
super.showPageRec(pageRec);
fActiveConsole = (IConsole)fPartToConsole.get(pageRec.part);
fStack.remove(fActiveConsole);
fStack.add(0,fActiveConsole);
updateTitle();
// update console actions
if (fPinAction != null) {
fPinAction.update();
}
}
}
/**
* Returns a stack of consoles in the view in MRU order.
*
* @return a stack of consoles in the view in MRU order
*/
protected List getConsoleStack() {
return fStack;
}
/**
* Updates the view title based on the active console
*/
protected void updateTitle() {
IConsole console = getConsole();
if (console == null) {
setContentDescription(ConsoleMessages.getString("ConsoleView.0")); //$NON-NLS-1$
} else {
setContentDescription(console.getName()); //$NON-NLS-1$
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#doDestroyPage(org.eclipse.ui.IWorkbenchPart, org.eclipse.ui.part.PageBookView.PageRec)
*/
protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
IPage page = pageRecord.page;
page.dispose();
pageRecord.dispose();
IConsole console = (IConsole)fPartToConsole.get(part);
console.removePropertyChangeListener(this);
// empty cross-reference cache
fPartToConsole.remove(part);
fConsoleToPart.remove(console);
// update console actions
fPinAction.update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#doCreatePage(org.eclipse.ui.IWorkbenchPart)
*/
protected PageRec doCreatePage(IWorkbenchPart dummyPart) {
ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)dummyPart;
IConsole console = part.getConsole();
IPageBookViewPage page = console.createPage(this);
initPage(page);
page.createControl(getPageBook());
console.addPropertyChangeListener(this);
PageRec rec = new PageRec(dummyPart, page);
return rec;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#isImportant(org.eclipse.ui.IWorkbenchPart)
*/
protected boolean isImportant(IWorkbenchPart part) {
return part instanceof ConsoleWorkbenchPart;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
public void dispose() {
super.dispose();
ConsolePlugin.getDefault().getConsoleManager().removeConsoleListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#createDefaultPage(org.eclipse.ui.part.PageBook)
*/
protected IPage createDefaultPage(PageBook book) {
MessagePage page = new MessagePage();
page.createControl(getPageBook());
initPage(page);
return page;
}
/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleListener#consolesAdded(org.eclipse.ui.console.IConsole[])
*/
public void consolesAdded(final IConsole[] consoles) {
if (isAvailable()) {
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < consoles.length; i++) {
if (isAvailable()) {
IConsole console = consoles[i];
ConsoleWorkbenchPart part = new ConsoleWorkbenchPart(console, getSite());
fConsoleToPart.put(console, part);
fPartToConsole.put(part, console);
partActivated(part);
}
}
}
};
asyncExec(r);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleListener#consolesRemoved(org.eclipse.ui.console.IConsole[])
*/
public void consolesRemoved(final IConsole[] consoles) {
if (isAvailable()) {
Runnable r = new Runnable() {
public void run() {
for (int i = 0; i < consoles.length; i++) {
if (isAvailable()) {
IConsole console = consoles[i];
fStack.remove(console);
ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)fConsoleToPart.get(console);
if (part != null) {
partClosed(part);
}
if (getConsole() == null) {
IConsole[] available = ConsolePlugin.getDefault().getConsoleManager().getConsoles();
if (available.length > 0) {
display(available[available.length - 1]);
}
}
}
}
}
};
asyncExec(r);
}
}
/**
* Constructs a console view
*/
public ConsoleView() {
super();
fConsoleToPart = new HashMap();
fPartToConsole = new HashMap();
}
/**
* Creates a pop-up menu on the given control. The menu
* is registered with this view's site, such that other
* plug-ins may contribute to the menu.
*
* @param menuControl the control with which the pop-up
* menu will be associated with.
*/
protected void createContextMenu(Control menuControl) {
MenuManager menuMgr= new MenuManager("#PopUp"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
Menu menu= menuMgr.createContextMenu(menuControl);
menuControl.setMenu(menu);
// register the context menu such that other plugins may contribute to it
if (getSite() != null) {
getSite().registerContextMenu(menuMgr, null);
}
}
protected void createActions() {
fPinAction = new PinConsoleAction(this);
fDisplayConsoleAction = new ConsoleDropDownAction(this);
}
protected void configureToolBar(IToolBarManager mgr) {
mgr.add(new Separator(IConsoleConstants.LAUNCH_GROUP));
mgr.add(new Separator(IConsoleConstants.OUTPUT_GROUP));
mgr.add(new Separator("fixedGroup")); //$NON-NLS-1$
mgr.add(fPinAction);
mgr.add(fDisplayConsoleAction);
}
/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleView#display(org.eclipse.ui.console.IConsole)
*/
public void display(IConsole console) {
if (!isPinned()) {
ConsoleWorkbenchPart part = (ConsoleWorkbenchPart)fConsoleToPart.get(console);
if (part != null) {
partActivated(part);
}
}
}
/*/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleView#pin(org.eclipse.ui.console.IConsole)
*/
public void pin(IConsole console) {
if (console == null) {
fPinned = false;
} else {
fPinned = false; // need this off to change displayed console
display(console);
fPinned = true;
}
if (fPinAction != null) {
fPinAction.update();
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleView#isPinned()
*/
public boolean isPinned() {
return fPinned;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.PageBookView#getBootstrapPart()
*/
protected IWorkbenchPart getBootstrapPart() {
return null;
}
/**
* Registers the given runnable with the display
* associated with this view's control, if any.
*
* @see org.eclipse.swt.widgets.Display#asyncExec(java.lang.Runnable)
*/
public void asyncExec(Runnable r) {
if (isAvailable()) {
getPageBook().getDisplay().asyncExec(r);
}
}
/**
* Creates this view's underlying viewer and actions.
* Hooks a pop-up menu to the underlying viewer's control,
* as well as a key listener. When the delete key is pressed,
* the <code>REMOVE_ACTION</code> is invoked. Hooks help to
* this view. Subclasses must implement the following methods
* which are called in the following order when a view is
* created:<ul>
* <li><code>createViewer(Composite)</code> - the context
* menu is hooked to the viewer's control.</li>
* <li><code>createActions()</code></li>
* <li><code>configureToolBar(IToolBarManager)</code></li>
* <li><code>getHelpContextId()</code></li>
* </ul>
* @see IWorkbenchPart#createPartControl(Composite)
*/
public void createPartControl(Composite parent) {
//registerPartListener();
super.createPartControl(parent);
createActions();
IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
configureToolBar(tbm);
updateForExistingConsoles();
getViewSite().getActionBars().updateActionBars();
// Viewer viewer = getViewer();
// if (viewer != null) {
// createContextMenu(viewer.getControl());
// }
WorkbenchHelp.setHelp(parent, IConsoleHelpContextIds.CONSOLE_VIEW);
// if (viewer != null) {
// getViewer().getControl().addKeyListener(new KeyAdapter() {
// public void keyPressed(KeyEvent e) {
// handleKeyPressed(e);
// }
// });
// if (getViewer() instanceof StructuredViewer) {
// ((StructuredViewer)getViewer()).addDoubleClickListener(this);
// }
// }
// create the message page
//setMessagePage(new MessagePage());
//getMessagePage().createControl(getPageBook());
//initPage(getMessagePage());
// if (fEarlyMessage != null) { //bug 28127
// showMessage(fEarlyMessage);
// fEarlyMessage= null;
// }
}
/**
* Initialize for existing consoles
*/
private void updateForExistingConsoles() {
IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
// create pages for consoles
IConsole[] consoles = manager.getConsoles();
consolesAdded(consoles);
// add as a listener
manager.addConsoleListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ui.console.IConsoleView#warnOfContentChange(org.eclipse.ui.console.IConsole)
*/
public void warnOfContentChange(IConsole console) {
IWorkbenchPart part = (IWorkbenchPart)fConsoleToPart.get(console);
if (part != null) {
IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) part.getSite().getAdapter(IWorkbenchSiteProgressService.class);
if (service != null) {
service.warnOfContentChange();
}
}
}
}