blob: 7dd5c375a2ce39125e923c689dab5e4b6470cf35 [file] [log] [blame]
package org.eclipse.debug.internal.ui;
/*
* Licensed Materials - Property of IBM,
* WebSphere Studio Workbench
* (c) Copyright IBM Corp 2000
*/
import java.util.*;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.*;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IFindReplaceTarget;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.FindReplaceAction;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.IUpdate;
public class ConsoleView extends ViewPart {
protected final static String PREFIX= "console_view.";
protected ConsoleViewer fConsoleViewer= null;
protected ClearOutputAction fClearOutputAction= null;
protected Map fGlobalActions= new HashMap(10);
protected List fSelectionActions = new ArrayList(7);
/**
* @see ViewPart#createChild(IWorkbenchPartContainer)
*/
public void createPartControl(Composite parent) {
fConsoleViewer= new ConsoleViewer(parent);
initializeActions();
initializeToolBar();
// create context menu
MenuManager menuMgr= new MenuManager("#PopUp", IDebugUIConstants.ID_CONSOLE_VIEW);
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
fillContextMenu(mgr);
}
});
Menu menu= menuMgr.createContextMenu(fConsoleViewer.getTextWidget());
fConsoleViewer.getTextWidget().setMenu(menu);
// register the context menu such that other plugins may contribute to it
getSite().registerContextMenu(menuMgr.getId(), menuMgr, fConsoleViewer);
fConsoleViewer.getSelectionProvider().addSelectionChangedListener(getSelectionChangedListener());
setViewerInput(DebugUIPlugin.getDefault().getCurrentProcess());
setTitleToolTip(DebugUIUtils.getResourceString(PREFIX + AbstractDebugView.TITLE_TOOLTIPTEXT));
}
/**
* @see IWorkbenchPart
*/
public void setFocus() {
fConsoleViewer.getControl().setFocus();
}
/**
* Sets the input of the viewer of this view in the
* UI thread.
*/
protected void setViewerInput(final IAdaptable element) {
setViewerInput(element, true);
}
/**
* Sets the input of the viewer of this view in the
* UI thread. The current input process is determined
* if so specified.
*/
protected void setViewerInput(final IAdaptable element, final boolean determineCurrentProcess) {
if (fConsoleViewer == null) {
return;
}
Display display= fConsoleViewer.getControl().getDisplay();
if (display != null) {
display.asyncExec(new Runnable() {
public void run() {
if (fConsoleViewer == null) {
return;
}
IDocument doc= DebugUIPlugin.getDefault().getConsoleDocument((IProcess) element, determineCurrentProcess);
fConsoleViewer.setDocument(doc);
}
});
}
}
/**
* Initialize the actions of this view
*/
private void initializeActions() {
fClearOutputAction= new ClearOutputAction(fConsoleViewer);
fClearOutputAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_CLEAR));
fClearOutputAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_CLEAR));
fClearOutputAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_CLEAR));
ResourceBundle bundle= DebugUIUtils.getResourceBundle();
// 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= getViewSite().getActionBars();
setGlobalAction(actionBars, ITextEditorActionConstants.CUT, new ConsoleViewerAction(bundle, "cut_action.", fConsoleViewer, fConsoleViewer.CUT));
setGlobalAction(actionBars, ITextEditorActionConstants.COPY, new ConsoleViewerAction(bundle, "copy_action.", fConsoleViewer, fConsoleViewer.COPY));
setGlobalAction(actionBars, ITextEditorActionConstants.PASTE, new ConsoleViewerAction(bundle, "paste_action.", fConsoleViewer, fConsoleViewer.PASTE));
setGlobalAction(actionBars, ITextEditorActionConstants.SELECT_ALL, new ConsoleViewerAction(bundle, "select_all_action.", fConsoleViewer, fConsoleViewer.SELECT_ALL));
setGlobalAction(actionBars, ITextEditorActionConstants.FIND, new FindReplaceAction(bundle, "find_replace_action.", getSite().getWorkbenchWindow()));
setGlobalAction(actionBars, ITextEditorActionConstants.GOTO_LINE, new ConsoleGotoLineAction(bundle, "goto_line_action.", fConsoleViewer));
fSelectionActions.add(ITextEditorActionConstants.CUT);
fSelectionActions.add(ITextEditorActionConstants.COPY);
fSelectionActions.add(ITextEditorActionConstants.PASTE);
}
protected void setGlobalAction(IActionBars actionBars, String actionID, IAction action) {
fGlobalActions.put(actionID, action);
actionBars.setGlobalActionHandler(actionID, action);
}
public void markAsSelectionDependentAction(String actionId) {
if (!fSelectionActions.contains(actionId)) {
fSelectionActions.add(actionId);
}
}
/**
* Configures the toolBar.
*/
private void initializeToolBar() {
IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
tbm.add(fClearOutputAction);
getViewSite().getActionBars().updateActionBars();
}
/**
* Adds the text manipulation actions to the <code>ConsoleViewer</code>
*/
protected void fillContextMenu(IMenuManager menu) {
Point selectionRange= fConsoleViewer.getTextWidget().getSelection();
ConsoleDocument doc= (ConsoleDocument) fConsoleViewer.getDocument();
if (doc == null) {
return;
}
if (doc.isReadOnly() || selectionRange.x < doc.getStartOfEditableContent()) {
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.COPY));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));
} else {
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.CUT));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.COPY));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.PASTE));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));
}
menu.add(new Separator("FIND"));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.FIND));
menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.GOTO_LINE));
menu.add(fClearOutputAction);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* @see WorkbenchPart#getAdapter(Class)
*/
public Object getAdapter(Class required) {
if (IFindReplaceTarget.class.equals(required)) {
return fConsoleViewer.getFindReplaceTarget();
}
return super.getAdapter(required);
}
protected final ISelectionChangedListener getSelectionChangedListener() {
return new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateSelectionDependentActions();
}
};
}
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();
}
public void dispose() {
if (fConsoleViewer != null) {
fConsoleViewer.dispose();
fConsoleViewer= null;
}
super.dispose();
}
}