Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsarsenau2002-08-19 15:43:38 +0000
committersarsenau2002-08-19 15:43:38 +0000
commit742a4d07a7a91f8b7594caa107f4169d40826ff3 (patch)
tree3deecfaa9aa1f51a3aab1fe4d76f01cf5c06ff27 /org.eclipse.ui.externaltools
parenta5f6e675364bd8d37a38275d1293bd69064034a7 (diff)
downloadeclipse.platform.debug-742a4d07a7a91f8b7594caa107f4169d40826ff3.tar.gz
eclipse.platform.debug-742a4d07a7a91f8b7594caa107f4169d40826ff3.tar.xz
eclipse.platform.debug-742a4d07a7a91f8b7594caa107f4169d40826ff3.zip
Fix for PR 3079
Diffstat (limited to 'org.eclipse.ui.externaltools')
-rw-r--r--org.eclipse.ui.externaltools/.classpath5
-rw-r--r--org.eclipse.ui.externaltools/.project3
-rw-r--r--org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/LogConsoleView.java2
-rw-r--r--org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/OpenOnLogConsoleTypeAction.java15
-rw-r--r--org.eclipse.ui.externaltools/plugin.properties2
-rw-r--r--org.eclipse.ui.externaltools/plugin.xml18
6 files changed, 41 insertions, 4 deletions
diff --git a/org.eclipse.ui.externaltools/.classpath b/org.eclipse.ui.externaltools/.classpath
index 7103b9205..0f627a006 100644
--- a/org.eclipse.ui.externaltools/.classpath
+++ b/org.eclipse.ui.externaltools/.classpath
@@ -7,8 +7,11 @@
<classpathentry kind="src" path="/org.eclipse.ant.core"/>
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
<classpathentry kind="src" path="/org.eclipse.ui"/>
+ <classpathentry kind="src" path="/org.eclipse.jdt.debug.ui"/>
+ <classpathentry kind="src" path="/org.eclipse.jdt.core"/>
+ <classpathentry kind="src" path="/org.eclipse.jdt.ui"/>
<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
<classpathentry kind="src" path="/org.apache.xerces"/>
<classpathentry kind="output" path="bin"/>
-</classpath>
+</classpath> \ No newline at end of file
diff --git a/org.eclipse.ui.externaltools/.project b/org.eclipse.ui.externaltools/.project
index 6f3deaf9b..2895d1705 100644
--- a/org.eclipse.ui.externaltools/.project
+++ b/org.eclipse.ui.externaltools/.project
@@ -9,6 +9,9 @@
<project>org.eclipse.core.boot</project>
<project>org.eclipse.core.resources</project>
<project>org.eclipse.core.runtime</project>
+ <project>org.eclipse.jdt.core</project>
+ <project>org.eclipse.jdt.debug.ui</project>
+ <project>org.eclipse.jdt.ui</project>
<project>org.eclipse.ui</project>
</projects>
<buildSpec>
diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/LogConsoleView.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/LogConsoleView.java
index 61a8d2797..d3d899494 100644
--- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/LogConsoleView.java
+++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/LogConsoleView.java
@@ -1 +1 @@
-package org.eclipse.ui.externaltools.internal.ui; /********************************************************************** Copyright (c) 2002 IBM Corp. and others. All rights reserved.   This program and the accompanying materials are made available under the terms of the Common Public License v0.5 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v05.html   Contributors: **********************************************************************/ import java.net.*; import java.util.ArrayList; import org.eclipse.jface.action.*; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.*; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.*; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.ui.*; import org.eclipse.ui.externaltools.internal.core.*; import org.eclipse.ui.help.WorkbenchHelp; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.*; public class LogConsoleView extends ViewPart { public final static String PROPERTY_PREFIX_FIND = "LogConsoleView.findAction."; // $NON-NLS-1$ private final static int SASH_WIDTH = 3; // regular width for a sash // strings for the memento private final static String TREE_WIDTH_PROPERTY = "tree_width"; private final static String SHOW_ONLY_SELECTED_ITEM_PROPERTY = "wasShowOnlySelectedTreeItemsTurnedOn"; // $NON-NLS-1$ private final static String SHOW_TREE_PROPERTY = "hideOrShowTreeAction"; // $NON-NLS-1$ // UI objects private SashForm sash; private TreeViewer treeViewer; private TextViewer textViewer; private Action copyAction; private Action selectAllAction; private Action clearOutputAction; private Action findAction; private Action expandTreeItemAction; private Action showTreeAction; private Action showSelectedItemAction; private LogTreeLabelProvider labelprovider; private LogTreeContentProvider contentProvider; // lastWidth is used to store the width of the tree that the user set private int lastTreeWidth = 30; private boolean showOnlySelectedItems = false; private boolean showTree = false; /** * Constructor for AntConsole */ public LogConsoleView() { super(); LogConsoleDocument.getInstance().registerView(this); labelprovider = new LogTreeLabelProvider(this); contentProvider = new LogTreeContentProvider(this); } /** * @see IViewPart */ public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); if (memento != null) { // retrieve the values of the previous session lastTreeWidth = memento.getInteger(TREE_WIDTH_PROPERTY).intValue(); showOnlySelectedItems = memento.getInteger(SHOW_ONLY_SELECTED_ITEM_PROPERTY).intValue() != 0; showTree = memento.getInteger(SHOW_TREE_PROPERTY).intValue() != 0; } } protected void addContributions() { // In order for the clipboard actions to be accessible via their shortcuts // (e.g., Ctrl-C, Ctrl-V), we *must* set a global action handler for // each action IActionBars actionBars = getViewSite().getActionBars(); actionBars.setGlobalActionHandler(ITextEditorActionConstants.COPY, copyAction); actionBars.setGlobalActionHandler(ITextEditorActionConstants.FIND, findAction); actionBars.setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, selectAllAction); MenuManager textViewerMgr = new MenuManager(); textViewerMgr.setRemoveAllWhenShown(true); textViewerMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager textViewerMgr) { fillTextViewerContextMenu(textViewerMgr); } }); Menu textViewerMenu = textViewerMgr.createContextMenu(textViewer.getControl()); textViewer.getControl().setMenu(textViewerMenu); MenuManager treeViewerMgr = new MenuManager(); treeViewerMgr.setRemoveAllWhenShown(true); treeViewerMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager treeViewerMgr) { fillTreeViewerContextMenu(treeViewerMgr); } }); Menu treeViewerMenu = treeViewerMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(treeViewerMenu); //add toolbar actions IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager(); tbm.add(showTreeAction); tbm.add(showSelectedItemAction); tbm.add(clearOutputAction); getViewSite().getActionBars().updateActionBars(); } private void createHideOrShowTreeAction() { showTreeAction = new Action() { public void run() { showTree = isChecked(); if (showTree) { // the tree is hidden, let's show it sash.SASH_WIDTH = SASH_WIDTH; sash.setWeights(new int[] { lastTreeWidth, 100 - lastTreeWidth }); setToolTipText(ToolMessages.getString("LogConsoleView.hideOutputStructureTree")); // $NON-NLS-1$ // the "ShowOnlySelectedElement" functionality can be turned on showSelectedItemAction.setEnabled(true); showSelectedItemAction.setChecked(showOnlySelectedItems); showSelectedItemAction.run(); } else { // let's hide the tree sash.SASH_WIDTH = 0; sash.setWeights(new int[] { 0, 100 }); setToolTipText(ToolMessages.getString("LogConsoleView.showOutputStructureTree")); // $NON-NLS-1$ // show the whole document showCompleteOutput(); // disable the show selected item action showSelectedItemAction.setEnabled(false); } } }; showTreeAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/hide_show_tree.gif")); // $NON-NLS-1$ showTreeAction.setChecked(showTree); showTreeAction.setText(ToolMessages.getString("LogConsoleView.showTree")); // $NON-NLS-1$ String tooltip = showTree ? "LogConsoleView.hideOutputStructureTree" : "LogConsoleView.showOutputStructureTree"; // $NON-NLS-1$ showTreeAction.setToolTipText(ToolMessages.getString(tooltip)); } private boolean isTreeHidden() { return sash.getWeights()[0] == 0; } public void append(String value) { append(value, LogConsoleDocument.MSG_INFO); } public void append(final String value, final int ouputLevel) { getViewSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { if (value.length() > 0 && textViewer != null) { revealEndOfDocument(); // XXX If this is not done, then the colors don't appear --> bug of #setVisibleRegion ? // See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); } } }); } private void setOutputLevelColor(int level, int start, int end) { LogConsoleDocument.getInstance().setOutputLevelColor(level, start, end); } protected void copySelectionToClipboard() { textViewer.doOperation(textViewer.COPY); } /** * Creates the actions that will appear in this view's toolbar and popup menus. */ protected void createActions() { // Create the actions for the text viewer. copyAction = new Action(ToolMessages.getString("LogConsoleView.copy")) { // $NON-NLS-1$ public void run() { copySelectionToClipboard(); } }; selectAllAction = new Action(ToolMessages.getString("LogConsoleView.selectAll")) { // $NON-NLS-1$ public void run() { selectAllText(); } }; clearOutputAction = new Action(ToolMessages.getString("LogConsoleView.clearOutput")) {// $NON-NLS-1$ public void run() { LogConsoleDocument.getInstance().clearOutput(); } }; clearOutputAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/clear.gif")); // $NON-NLS-1$ clearOutputAction.setToolTipText(ToolMessages.getString("LogConsoleView.clearOutput")); // $NON-NLS-1$ findAction = new FindReplaceAction(ToolMessages.getResourceBundle(), PROPERTY_PREFIX_FIND, this); findAction.setEnabled(true); // Create the actions for the tree viewer. createHideOrShowTreeAction(); expandTreeItemAction = new Action(ToolMessages.getString("LogConsoleView.expandAll")) {// $NON-NLS-1$ public void run() { OutputStructureElement selectedElement = (OutputStructureElement) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement(); treeViewer.expandToLevel(selectedElement, treeViewer.ALL_LEVELS); } }; //create the toolbar actions showSelectedItemAction = new Action() { public void run() { showOnlySelectedItems = isChecked(); if (showOnlySelectedItems) { // we want to show only the selected tree items showSelectedElementOnly(); // changes the labels setToolTipText(ToolMessages.getString("LogConsoleView.showCompleteOutput")); // $NON-NLS-1$ } else { // we want to show the whole document now showCompleteOutput(); // changes the labels setToolTipText(ToolMessages.getString("LogConsoleView.showSelectedElementOnly")); // $NON-NLS-1$ } } }; showSelectedItemAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/show_selected_text.gif")); // $NON-NLS-1$ showSelectedItemAction.setChecked(showOnlySelectedItems); showSelectedItemAction.setEnabled(showTreeAction.isChecked()); showSelectedItemAction.setText(ToolMessages.getString("LogConsoleView.showSelectedElementOnly")); // $NON-NLS-1$ String tooltip = showOnlySelectedItems ? "LogConsoleView.showCompleteOutput" : "LogConsoleView.showSelectedElementOnly"; // $NON-NLS-1$ showSelectedItemAction.setToolTipText(ToolMessages.getString(tooltip)); } /* * Shows the output of the selected item only */ protected void showSelectedElementOnly() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (selection.isEmpty()) textViewer.setVisibleRegion(0, 0); else { OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement(); // XXX NOTE: #setVisibleRegion doesn't keep the color information... See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.setVisibleRegion(selectedElement.getStartIndex(), selectedElement.getLength()); } } /* * Shows the output of the whole docuent, and reveals the range of the selected item */ protected void showCompleteOutput() { // show all the document textViewer.setVisibleRegion(0, getDocument().get().length()); // XXX should I have to do that? If this is not done, then the colors don't appear --> bug of #setVisibleRegion ? --> See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); // and then reveal the range of the selected item revealRangeOfSelectedItem(); } private void revealRangeOfSelectedItem() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (!selection.isEmpty()) { // then show the reveal the range of the output accordingly OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement(); textViewer.revealRange(selectedElement.getStartIndex(), selectedElement.getLength()); textViewer.setSelectedRange(selectedElement.getStartIndex(), selectedElement.getLength()); } } private void revealEndOfDocument() { IDocument doc= getDocument(); int docLength= doc.getLength(); if (docLength > 0) { StyledText widget= textViewer.getTextWidget(); widget.setCaretOffset(docLength); widget.showSelection(); } } public void initializeTreeInput() { getSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { if (treeViewer != null) treeViewer.setInput(LogConsoleDocument.getInstance().getRoot()); } }); } public void refreshTree() { // if the tree is null, it means that the view hasn't been shown yet, so we don't need to refresh it. if (treeViewer != null) { getSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { treeViewer.refresh(); treeViewer.expandAll(); } }); } } public void updateFont() { if (textViewer != null) textViewer.getTextWidget().setFont(LogConsoleDocument.ANT_FONT); } protected void fillTextViewerContextMenu(IMenuManager manager) { copyAction.setEnabled(textViewer.canDoOperation(textViewer.COPY)); selectAllAction.setEnabled(textViewer.canDoOperation(textViewer.SELECT_ALL)); manager.add(copyAction); manager.add(findAction); manager.add(selectAllAction); manager.add(new Separator()); manager.add(showTreeAction); manager.add(clearOutputAction); } protected void fillTreeViewerContextMenu(IMenuManager manager) { manager.add(showSelectedItemAction); manager.add(expandTreeItemAction); manager.add(new Separator()); manager.add(showTreeAction); manager.add(clearOutputAction); } public Object getAdapter(Class required) { if (IFindReplaceTarget.class.equals(required)) return textViewer.getFindReplaceTarget(); return super.getAdapter(required); } private Document getDocument() { return LogConsoleDocument.getInstance().getDocument(); } private ArrayList getStyleRanges() { return LogConsoleDocument.getInstance().getStyleRanges(); } public TextViewer getTextViewer() { return textViewer; } public TreeViewer getTreeViewer() { return treeViewer; } protected ImageDescriptor getImageDescriptor(String relativePath) { try { URL installURL = ExternalToolsPlugin.getDefault().getDescriptor().getInstallURL(); URL url = new URL(installURL, relativePath); return ImageDescriptor.createFromURL(url); } catch (MalformedURLException e) { return null; } } protected void selectAllText() { textViewer.doOperation(textViewer.SELECT_ALL); } /** * @see WorkbenchPart#setFocus() */ public void setFocus() { sash.setFocus(); } /** * @see WorkbenchPart#createPartControl(Composite) */ public void createPartControl(Composite parent) { sash = new SashForm(parent, SWT.HORIZONTAL); GridLayout sashLayout = new GridLayout(); sashLayout.marginHeight = 0; sashLayout.marginWidth = 0; sash.setLayout(sashLayout); sash.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); treeViewer = new TreeViewer(sash, SWT.V_SCROLL | SWT.H_SCROLL); GridData treeData = new GridData(GridData.FILL_BOTH); treeViewer.getControl().setLayoutData(treeData); treeViewer.setContentProvider(contentProvider); treeViewer.setLabelProvider(labelprovider); treeViewer.setInput(LogConsoleDocument.getInstance().getRoot()); treeViewer.expandAll(); addTreeViewerListeners(); textViewer = new TextViewer(sash, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); GridData viewerData = new GridData(GridData.FILL_BOTH); textViewer.getControl().setLayoutData(viewerData); textViewer.setEditable(false); textViewer.setDocument(getDocument()); textViewer.getTextWidget().setFont(LogConsoleDocument.ANT_FONT); textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); addTextViewerListeners(); // sets the ratio tree/textViewer for the sashForm if (showTree) { sash.setWeights(new int[] { lastTreeWidth, 100 - lastTreeWidth }); } else { // the "hideOrShowTree" action wasn't checked: this means that the user didn't want to have the tree sash.SASH_WIDTH = 0; sash.setWeights(new int[] { 0, 100 }); } createActions(); addContributions(); WorkbenchHelp.setHelp(parent, IHelpContextIds.LOG_CONSOLE_VIEW); } protected void addTreeViewerListeners() { treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { if (textViewer != null) if (showSelectedItemAction.isChecked()) showSelectedElementOnly(); else revealRangeOfSelectedItem(); } }); // to remember the place of the sash when we hide the tree treeViewer.getControl().addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { if (treeViewer.getControl().getSize().x != 0) // we don't want the width to be stored when the tree is getting hidden // (because it equals zero and we want to have the previous value) lastTreeWidth = new Float((float) treeViewer.getControl().getSize().x / sash.getSize().x * 100).intValue(); } }); } protected void addTextViewerListeners() { textViewer.getTextWidget().addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { if (!showSelectedItemAction.isChecked()) selectTreeItem(textViewer.getTextWidget().getCaretOffset()); } }); textViewer.getTextWidget().addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if (!showSelectedItemAction.isChecked()) selectTreeItem(textViewer.getTextWidget().getCaretOffset()); } }); } protected void selectTreeItem(int caretPosition) { // tree.getTree().getItems()[1] returns the root of the tree that contains the project // it may not exist if there is no output (in this case, there is only one item: the "External Tool" one) if (treeViewer.getTree().getItems().length != 1) { TreeItem itemToSelect = null; if (findItem(treeViewer.getTree().getItems()[0], caretPosition) != null) // the first item is the good one itemToSelect = treeViewer.getTree().getItems()[0]; else // the first item is not the good one, let's check the second one and its children itemToSelect = findItem(treeViewer.getTree().getItems()[1], caretPosition); treeViewer.getTree().setSelection(new TreeItem[] { itemToSelect }); } } private TreeItem findItem(TreeItem item, int position) { if (!(((OutputStructureElement) item.getData()).getStartIndex() <= position && ((OutputStructureElement) item.getData()).getEndIndex() > position)) return null; for (int i = 0; i < item.getItems().length; i++) { TreeItem child = findItem(item.getItems()[i], position); if (child != null) return child; } return item; } /** * @see IViewPart */ public void saveState(IMemento memento) { memento.putInteger(TREE_WIDTH_PROPERTY, lastTreeWidth); // it is not possible to put a boolean in a memento, so we use integers memento.putInteger(SHOW_ONLY_SELECTED_ITEM_PROPERTY, showOnlySelectedItems ? 1 : 0); memento.putInteger(SHOW_TREE_PROPERTY, showTree ? 1 : 0); } public void dispose() { LogConsoleDocument.getInstance().unregisterView(this); super.dispose(); } } \ No newline at end of file
+package org.eclipse.ui.externaltools.internal.ui; /********************************************************************** Copyright (c) 2002 IBM Corp. and others. All rights reserved.   This program and the accompanying materials are made available under the terms of the Common Public License v0.5 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v05.html   Contributors: **********************************************************************/ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.GroupMarker; 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.ImageDescriptor; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IFindReplaceTarget; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.externaltools.internal.core.ExternalToolsPlugin; import org.eclipse.ui.externaltools.internal.core.ToolMessages; import org.eclipse.ui.help.WorkbenchHelp; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.FindReplaceAction; import org.eclipse.ui.texteditor.ITextEditorActionConstants; public class LogConsoleView extends ViewPart { public final static String PROPERTY_PREFIX_FIND = "LogConsoleView.findAction."; // $NON-NLS-1$ private final static int SASH_WIDTH = 3; // regular width for a sash // strings for the memento private final static String TREE_WIDTH_PROPERTY = "tree_width"; private final static String SHOW_ONLY_SELECTED_ITEM_PROPERTY = "wasShowOnlySelectedTreeItemsTurnedOn"; // $NON-NLS-1$ private final static String SHOW_TREE_PROPERTY = "hideOrShowTreeAction"; // $NON-NLS-1$ // UI objects private SashForm sash; private TreeViewer treeViewer; private TextViewer textViewer; private Action copyAction; private Action selectAllAction; private Action clearOutputAction; private Action findAction; private Action expandTreeItemAction; private Action showTreeAction; private Action showSelectedItemAction; private LogTreeLabelProvider labelprovider; private LogTreeContentProvider contentProvider; // lastWidth is used to store the width of the tree that the user set private int lastTreeWidth = 30; private boolean showOnlySelectedItems = false; private boolean showTree = false; /** * Constructor for AntConsole */ public LogConsoleView() { super(); LogConsoleDocument.getInstance().registerView(this); labelprovider = new LogTreeLabelProvider(this); contentProvider = new LogTreeContentProvider(this); } /** * @see IViewPart */ public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); if (memento != null) { // retrieve the values of the previous session lastTreeWidth = memento.getInteger(TREE_WIDTH_PROPERTY).intValue(); showOnlySelectedItems = memento.getInteger(SHOW_ONLY_SELECTED_ITEM_PROPERTY).intValue() != 0; showTree = memento.getInteger(SHOW_TREE_PROPERTY).intValue() != 0; } } protected void addContributions() { // In order for the clipboard actions to be accessible via their shortcuts // (e.g., Ctrl-C, Ctrl-V), we *must* set a global action handler for // each action IActionBars actionBars = getViewSite().getActionBars(); actionBars.setGlobalActionHandler(ITextEditorActionConstants.COPY, copyAction); actionBars.setGlobalActionHandler(ITextEditorActionConstants.FIND, findAction); actionBars.setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, selectAllAction); MenuManager textViewerMgr = new MenuManager(); textViewerMgr.setRemoveAllWhenShown(true); textViewerMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager textViewerMgr) { fillTextViewerContextMenu(textViewerMgr); } }); getSite().registerContextMenu(textViewerMgr, textViewer); Menu textViewerMenu = textViewerMgr.createContextMenu(textViewer.getControl()); textViewer.getControl().setMenu(textViewerMenu); MenuManager treeViewerMgr = new MenuManager(); treeViewerMgr.setRemoveAllWhenShown(true); treeViewerMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager treeViewerMgr) { fillTreeViewerContextMenu(treeViewerMgr); } }); Menu treeViewerMenu = treeViewerMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(treeViewerMenu); //add toolbar actions IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager(); tbm.add(showTreeAction); tbm.add(showSelectedItemAction); tbm.add(clearOutputAction); getViewSite().getActionBars().updateActionBars(); } private void createHideOrShowTreeAction() { showTreeAction = new Action() { public void run() { showTree = isChecked(); if (showTree) { // the tree is hidden, let's show it sash.SASH_WIDTH = SASH_WIDTH; sash.setWeights(new int[] { lastTreeWidth, 100 - lastTreeWidth }); setToolTipText(ToolMessages.getString("LogConsoleView.hideOutputStructureTree")); // $NON-NLS-1$ // the "ShowOnlySelectedElement" functionality can be turned on showSelectedItemAction.setEnabled(true); showSelectedItemAction.setChecked(showOnlySelectedItems); showSelectedItemAction.run(); } else { // let's hide the tree sash.SASH_WIDTH = 0; sash.setWeights(new int[] { 0, 100 }); setToolTipText(ToolMessages.getString("LogConsoleView.showOutputStructureTree")); // $NON-NLS-1$ // show the whole document showCompleteOutput(); // disable the show selected item action showSelectedItemAction.setEnabled(false); } } }; showTreeAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/hide_show_tree.gif")); // $NON-NLS-1$ showTreeAction.setChecked(showTree); showTreeAction.setText(ToolMessages.getString("LogConsoleView.showTree")); // $NON-NLS-1$ String tooltip = showTree ? "LogConsoleView.hideOutputStructureTree" : "LogConsoleView.showOutputStructureTree"; // $NON-NLS-1$ showTreeAction.setToolTipText(ToolMessages.getString(tooltip)); } private boolean isTreeHidden() { return sash.getWeights()[0] == 0; } public void append(String value) { append(value, LogConsoleDocument.MSG_INFO); } public void append(final String value, final int ouputLevel) { getViewSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { if (value.length() > 0 && textViewer != null) { revealEndOfDocument(); // XXX If this is not done, then the colors don't appear --> bug of #setVisibleRegion ? // See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); } } }); } private void setOutputLevelColor(int level, int start, int end) { LogConsoleDocument.getInstance().setOutputLevelColor(level, start, end); } protected void copySelectionToClipboard() { textViewer.doOperation(textViewer.COPY); } /** * Creates the actions that will appear in this view's toolbar and popup menus. */ protected void createActions() { // Create the actions for the text viewer. copyAction = new Action(ToolMessages.getString("LogConsoleView.copy")) { // $NON-NLS-1$ public void run() { copySelectionToClipboard(); } }; selectAllAction = new Action(ToolMessages.getString("LogConsoleView.selectAll")) { // $NON-NLS-1$ public void run() { selectAllText(); } }; clearOutputAction = new Action(ToolMessages.getString("LogConsoleView.clearOutput")) {// $NON-NLS-1$ public void run() { LogConsoleDocument.getInstance().clearOutput(); } }; clearOutputAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/clear.gif")); // $NON-NLS-1$ clearOutputAction.setToolTipText(ToolMessages.getString("LogConsoleView.clearOutput")); // $NON-NLS-1$ findAction = new FindReplaceAction(ToolMessages.getResourceBundle(), PROPERTY_PREFIX_FIND, this); findAction.setEnabled(true); // Create the actions for the tree viewer. createHideOrShowTreeAction(); expandTreeItemAction = new Action(ToolMessages.getString("LogConsoleView.expandAll")) {// $NON-NLS-1$ public void run() { OutputStructureElement selectedElement = (OutputStructureElement) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement(); treeViewer.expandToLevel(selectedElement, treeViewer.ALL_LEVELS); } }; //create the toolbar actions showSelectedItemAction = new Action() { public void run() { showOnlySelectedItems = isChecked(); if (showOnlySelectedItems) { // we want to show only the selected tree items showSelectedElementOnly(); // changes the labels setToolTipText(ToolMessages.getString("LogConsoleView.showCompleteOutput")); // $NON-NLS-1$ } else { // we want to show the whole document now showCompleteOutput(); // changes the labels setToolTipText(ToolMessages.getString("LogConsoleView.showSelectedElementOnly")); // $NON-NLS-1$ } } }; showSelectedItemAction.setImageDescriptor(getImageDescriptor("icons/full/clcl16/show_selected_text.gif")); // $NON-NLS-1$ showSelectedItemAction.setChecked(showOnlySelectedItems); showSelectedItemAction.setEnabled(showTreeAction.isChecked()); showSelectedItemAction.setText(ToolMessages.getString("LogConsoleView.showSelectedElementOnly")); // $NON-NLS-1$ String tooltip = showOnlySelectedItems ? "LogConsoleView.showCompleteOutput" : "LogConsoleView.showSelectedElementOnly"; // $NON-NLS-1$ showSelectedItemAction.setToolTipText(ToolMessages.getString(tooltip)); } /* * Shows the output of the selected item only */ protected void showSelectedElementOnly() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (selection.isEmpty()) textViewer.setVisibleRegion(0, 0); else { OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement(); // XXX NOTE: #setVisibleRegion doesn't keep the color information... See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.setVisibleRegion(selectedElement.getStartIndex(), selectedElement.getLength()); } } /* * Shows the output of the whole docuent, and reveals the range of the selected item */ protected void showCompleteOutput() { // show all the document textViewer.setVisibleRegion(0, getDocument().get().length()); // XXX should I have to do that? If this is not done, then the colors don't appear --> bug of #setVisibleRegion ? --> See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors" textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); // and then reveal the range of the selected item revealRangeOfSelectedItem(); } private void revealRangeOfSelectedItem() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (!selection.isEmpty()) { // then show the reveal the range of the output accordingly OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement(); textViewer.revealRange(selectedElement.getStartIndex(), selectedElement.getLength()); textViewer.setSelectedRange(selectedElement.getStartIndex(), selectedElement.getLength()); } } private void revealEndOfDocument() { IDocument doc= getDocument(); int docLength= doc.getLength(); if (docLength > 0) { StyledText widget= textViewer.getTextWidget(); widget.setCaretOffset(docLength); widget.showSelection(); } } public void initializeTreeInput() { getSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { if (treeViewer != null) treeViewer.setInput(LogConsoleDocument.getInstance().getRoot()); } }); } public void refreshTree() { // if the tree is null, it means that the view hasn't been shown yet, so we don't need to refresh it. if (treeViewer != null) { getSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { treeViewer.refresh(); treeViewer.expandAll(); } }); } } public void updateFont() { if (textViewer != null) textViewer.getTextWidget().setFont(LogConsoleDocument.ANT_FONT); } protected void fillTextViewerContextMenu(IMenuManager manager) { copyAction.setEnabled(textViewer.canDoOperation(textViewer.COPY)); selectAllAction.setEnabled(textViewer.canDoOperation(textViewer.SELECT_ALL)); manager.add(copyAction); manager.add(findAction); manager.add(selectAllAction); manager.add(new Separator()); manager.add(showTreeAction); manager.add(clearOutputAction); manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); } protected void fillTreeViewerContextMenu(IMenuManager manager) { manager.add(showSelectedItemAction); manager.add(expandTreeItemAction); manager.add(new Separator()); manager.add(showTreeAction); manager.add(clearOutputAction); } public Object getAdapter(Class required) { if (IFindReplaceTarget.class.equals(required)) return textViewer.getFindReplaceTarget(); if (Widget.class.equals(required)) { return getTextViewer().getTextWidget(); } return super.getAdapter(required); } private Document getDocument() { return LogConsoleDocument.getInstance().getDocument(); } private ArrayList getStyleRanges() { return LogConsoleDocument.getInstance().getStyleRanges(); } public TextViewer getTextViewer() { return textViewer; } public TreeViewer getTreeViewer() { return treeViewer; } protected ImageDescriptor getImageDescriptor(String relativePath) { try { URL installURL = ExternalToolsPlugin.getDefault().getDescriptor().getInstallURL(); URL url = new URL(installURL, relativePath); return ImageDescriptor.createFromURL(url); } catch (MalformedURLException e) { return null; } } protected void selectAllText() { textViewer.doOperation(textViewer.SELECT_ALL); } /** * @see WorkbenchPart#setFocus() */ public void setFocus() { sash.setFocus(); } /** * @see WorkbenchPart#createPartControl(Composite) */ public void createPartControl(Composite parent) { sash = new SashForm(parent, SWT.HORIZONTAL); GridLayout sashLayout = new GridLayout(); sashLayout.marginHeight = 0; sashLayout.marginWidth = 0; sash.setLayout(sashLayout); sash.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); treeViewer = new TreeViewer(sash, SWT.V_SCROLL | SWT.H_SCROLL); GridData treeData = new GridData(GridData.FILL_BOTH); treeViewer.getControl().setLayoutData(treeData); treeViewer.setContentProvider(contentProvider); treeViewer.setLabelProvider(labelprovider); treeViewer.setInput(LogConsoleDocument.getInstance().getRoot()); treeViewer.expandAll(); addTreeViewerListeners(); textViewer = new TextViewer(sash, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); GridData viewerData = new GridData(GridData.FILL_BOTH); textViewer.getControl().setLayoutData(viewerData); textViewer.setEditable(false); textViewer.setDocument(getDocument()); textViewer.getTextWidget().setFont(LogConsoleDocument.ANT_FONT); textViewer.getTextWidget().setStyleRanges((StyleRange[]) getStyleRanges().toArray(new StyleRange[getStyleRanges().size()])); addTextViewerListeners(); // sets the ratio tree/textViewer for the sashForm if (showTree) { sash.setWeights(new int[] { lastTreeWidth, 100 - lastTreeWidth }); } else { // the "hideOrShowTree" action wasn't checked: this means that the user didn't want to have the tree sash.SASH_WIDTH = 0; sash.setWeights(new int[] { 0, 100 }); } createActions(); addContributions(); WorkbenchHelp.setHelp(parent, IHelpContextIds.LOG_CONSOLE_VIEW); textViewer.getTextWidget().setDoubleClickEnabled(true); } protected void addTreeViewerListeners() { treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { if (textViewer != null) if (showSelectedItemAction.isChecked()) showSelectedElementOnly(); else revealRangeOfSelectedItem(); } }); // to remember the place of the sash when we hide the tree treeViewer.getControl().addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { if (treeViewer.getControl().getSize().x != 0) // we don't want the width to be stored when the tree is getting hidden // (because it equals zero and we want to have the previous value) lastTreeWidth = new Float((float) treeViewer.getControl().getSize().x / sash.getSize().x * 100).intValue(); } }); } protected void addTextViewerListeners() { textViewer.getTextWidget().addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { if (!showSelectedItemAction.isChecked()) selectTreeItem(textViewer.getTextWidget().getCaretOffset()); } }); textViewer.getTextWidget().addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if (!showSelectedItemAction.isChecked()) selectTreeItem(textViewer.getTextWidget().getCaretOffset()); } }); } protected void selectTreeItem(int caretPosition) { // tree.getTree().getItems()[1] returns the root of the tree that contains the project // it may not exist if there is no output (in this case, there is only one item: the "External Tool" one) if (treeViewer.getTree().getItems().length != 1) { TreeItem itemToSelect = null; if (findItem(treeViewer.getTree().getItems()[0], caretPosition) != null) // the first item is the good one itemToSelect = treeViewer.getTree().getItems()[0]; else // the first item is not the good one, let's check the second one and its children itemToSelect = findItem(treeViewer.getTree().getItems()[1], caretPosition); treeViewer.getTree().setSelection(new TreeItem[] { itemToSelect }); } } private TreeItem findItem(TreeItem item, int position) { if (!(((OutputStructureElement) item.getData()).getStartIndex() <= position && ((OutputStructureElement) item.getData()).getEndIndex() > position)) return null; for (int i = 0; i < item.getItems().length; i++) { TreeItem child = findItem(item.getItems()[i], position); if (child != null) return child; } return item; } /** * @see IViewPart */ public void saveState(IMemento memento) { memento.putInteger(TREE_WIDTH_PROPERTY, lastTreeWidth); // it is not possible to put a boolean in a memento, so we use integers memento.putInteger(SHOW_ONLY_SELECTED_ITEM_PROPERTY, showOnlySelectedItems ? 1 : 0); memento.putInteger(SHOW_TREE_PROPERTY, showTree ? 1 : 0); } public void dispose() { LogConsoleDocument.getInstance().unregisterView(this); super.dispose(); } } \ No newline at end of file
diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/OpenOnLogConsoleTypeAction.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/OpenOnLogConsoleTypeAction.java
new file mode 100644
index 000000000..a7728d3c0
--- /dev/null
+++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/OpenOnLogConsoleTypeAction.java
@@ -0,0 +1,15 @@
+package org.eclipse.ui.externaltools.internal.ui;
+
+import org.eclipse.jdt.internal.debug.ui.actions.OpenOnConsoleTypeAction;
+import org.eclipse.jface.text.IDocument;
+
+/**
+ */
+public class OpenOnLogConsoleTypeAction extends OpenOnConsoleTypeAction {
+ protected IDocument getConsoleDocument() {
+ LogConsoleView lv = (LogConsoleView)getViewPart();
+ if (lv != null)
+ return lv.getTextViewer().getDocument();
+ return null;
+ }
+}
diff --git a/org.eclipse.ui.externaltools/plugin.properties b/org.eclipse.ui.externaltools/plugin.properties
index 07bc79bb3..0a4e0b185 100644
--- a/org.eclipse.ui.externaltools/plugin.properties
+++ b/org.eclipse.ui.externaltools/plugin.properties
@@ -2,6 +2,8 @@ Plugin.name = External Tools
Plugin.providerName = Eclipse.org
PopupMenu.runAnt = Run &Ant...
PopupMenu.runAntTip = Run Ant With The Selected File
+PopupMenu.openOnConsoleType = Open On Type
+PopupMenu.openOnConsoleTypeTip = Open Editor On Selected Type
ActionSet.externalTools = External Tools
Action.externalTools = &External Tools
Action.externalToolsTip = Run or Configure External Tools
diff --git a/org.eclipse.ui.externaltools/plugin.xml b/org.eclipse.ui.externaltools/plugin.xml
index 1c7c9f0f6..1d5da41a0 100644
--- a/org.eclipse.ui.externaltools/plugin.xml
+++ b/org.eclipse.ui.externaltools/plugin.xml
@@ -16,6 +16,9 @@
<import plugin="org.eclipse.ant.core"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.jdt.debug.ui"/>
+ <import plugin="org.eclipse.jdt.core"/>
+ <import plugin="org.eclipse.jdt.ui"/>
</requires>
@@ -44,8 +47,19 @@
enablesFor="1"
class="org.eclipse.ui.externaltools.internal.ui.AntRunActionDelegate">
</action>
- </objectContribution>
- </extension>
+ </objectContribution>
+ <viewerContribution
+ id="org.eclipse.jdt.debug.OpenOnConsoleTypeActions"
+ targetID="org.eclipse.ui.externaltools.LogConsoleView">
+ <action
+ id="org.eclipse.jdt.ui.actions.OpenOnConsoleType"
+ label="%PopupMenu.openOnConsoleType"
+ menubarPath="additions"
+ tooltip="%Popup.openOnConsoleTypeTip"
+ class="org.eclipse.ui.externaltools.internal.ui.OpenOnLogConsoleTypeAction">
+ </action>
+ </viewerContribution>
+ </extension>
<extension point="org.eclipse.ui.actionSets">
<actionSet

Back to the top