{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Verdana;}{\f1\fswiss\fcharset0 Arial;}} {\colortbl ;\red127\green0\blue85;\red192\green192\blue192;\red0\green0\blue0;\red63\green127\blue95;\red42\green0\blue255;\red230\green230\blue230;\red63\green95\blue191;\red127\green159\blue191;} \viewkind4\uc1\pard\cf1\highlight2\b\f0\fs18 package \cf3\b0 org.eclipse.ant.internal.ui;\cf0\highlight0\par \par \cf4\highlight2 /*\cf0\highlight0\par \cf4\highlight2 * (c) Copyright IBM Corp. 2000, 2001.\cf0\highlight0\par \cf4\highlight2 * All Rights Reserved.\cf0\highlight0\par \cf4\highlight2 */\cf0\highlight0\par \par \cf1\highlight2\b import \cf3\b0 java.net.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 java.util.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.apache.tools.ant.Project;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.action.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.preference.PreferenceConverter;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.resource.ImageDescriptor;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.text.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.util.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.jface.viewers.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.SWT;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.custom.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.events.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.graphics.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.layout.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.swt.widgets.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.ui.*;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.ui.part.ViewPart;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.ui.texteditor.FindReplaceAction;\cf0\highlight0\par \cf1\highlight2\b import \cf3\b0 org.eclipse.ui.texteditor.ITextEditorActionConstants;\cf0\highlight0\par \par \cf1\highlight2\b public class \cf3\b0 AntConsole \cf1\b extends \cf3\b0 ViewPart \{\cf0\highlight0\par \par \cf3\highlight2\tab\cf1\b public final static \cf3\b0 String CONSOLE_ID = \cf5 "org.eclipse.ant.ui.antconsole"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b public final static \cf3\b0 String PROPERTY_PREFIX_FIND = \cf5 "find_action."\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private final static int \cf3\b0 SASH_WIDTH = 3; \cf4 // regular width for a sash\cf0\highlight0\par \highlight2\tab\highlight0\par \highlight2\tab\cf4 // strings for the memento\cf0\highlight0\par \cf1\highlight2\b\tab private final static \cf3\b0 String TREE_WIDTH_PROPERTY = \cf5 "tree_width"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private final static \cf3\b0 String SHOW_ONLY_SELECTED_ITEM_PROPERTY = \cf5 "wasShowOnlySelectedTreeItemsTurnedOn"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private final static \cf3\b0 String SHOW_TREE_PROPERTY = \cf5 "hideOrShowTreeAction"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 // UI objects\cf0\highlight0\par \cf1\highlight2\b\tab private \cf3\b0 SashForm sash;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 TreeViewer tree;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 TextViewer viewer;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action copyAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action selectAllAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action clearOutputAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action findAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action expandTreeItemAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action showTreeAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Action showSelectedItemAction;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 IDocument document;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 Vector styleRangeVector;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 AntTreeLabelProvider labelprovider;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private \cf3\b0 AntTreeContentProvider contentProvider;\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 // Structure to store the textwidget index information\cf0\highlight0\par \cf3\highlight2\tab OutputStructureElement root = \cf1\b null\cf3\b0 ;\tab\cf0\highlight0\par \cf3\highlight2\tab OutputStructureElement currentElement = \cf1\b null\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 // class variables that handle the colors and the font\cf0\highlight0\par \cf1\highlight2\b\tab static \cf3\b0 Color ERROR_COLOR;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b static \cf3\b0 Color WARN_COLOR;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b static \cf3\b0 Color INFO_COLOR;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b static \cf3\b0 Color VERBOSE_COLOR;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b static \cf3\b0 Color DEBUG_COLOR;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b static \cf3\b0 Font ANT_FONT;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b private static \cf3\b0 AntPropertyChangeListener changeListener = AntPropertyChangeListener.getInstance();\cf0\highlight0\par \cf3\highlight2\tab\cf4 // a Vector that keeps track of al the instances of this class so that they can share the Colors and the Font\cf0\highlight0\par \cf1\highlight2\b\tab static \cf3\b0 Vector instances = \cf1\b new \cf3\b0 Vector();\cf0\highlight0\par \par \cf3\highlight2\tab\cf4 // lastWidth is used to store the width of the tree that the user set\cf0\highlight0\par \cf1\highlight6\b\tab private int \cf3\b0 lastTreeWidth;\cf0\highlight0\par \cf3\highlight6\tab\cf1\b private boolean \cf3\b0 showOnlySelectedItems;\cf0\highlight0\par \cf3\highlight6\tab\cf1\b private boolean \cf3\b0 showTree;\cf0\highlight0\par \par \cf7\highlight2 /**\cf0\highlight0\par \cf7\highlight2 * Constructor for AntConsole\cf0\highlight0\par \cf7\highlight2 */\cf0\highlight0\par \cf1\highlight2\b public \cf3\b0 AntConsole() \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b super\cf3\b0 ();\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (instances.size() == 0) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf4 // first time there is an instance of this class: intantiate the colors and register the listener\cf0\highlight0\par \cf3\highlight2\tab\tab ERROR_COLOR = \cf1\b new \cf3\b0 Color(\cf1\b null\cf3\b0 , PreferenceConverter.getColor(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_ERROR_RGB));\cf0\highlight0\par \cf3\highlight2\tab\tab WARN_COLOR = \cf1\b new \cf3\b0 Color(\cf1\b null\cf3\b0 , PreferenceConverter.getColor(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_WARNING_RGB));\cf0\highlight0\par \cf3\highlight2\tab\tab INFO_COLOR = \cf1\b new \cf3\b0 Color(\cf1\b null\cf3\b0 , PreferenceConverter.getColor(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_INFO_RGB));\cf0\highlight0\par \cf3\highlight2\tab\tab VERBOSE_COLOR = \cf1\b new \cf3\b0 Color(\cf1\b null\cf3\b0 , PreferenceConverter.getColor(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_VERBOSE_RGB));\cf0\highlight0\par \cf3\highlight2\tab\tab DEBUG_COLOR = \cf1\b new \cf3\b0 Color(\cf1\b null\cf3\b0 , PreferenceConverter.getColor(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_DEBUG_RGB));\cf0\highlight0\par \cf3\highlight2\tab\tab ANT_FONT = \cf1\b new \cf3\b0 Font(\cf1\b null\cf3\b0 , PreferenceConverter.getFontData(AntUIPlugin.getPlugin().getPreferenceStore(),IAntPreferenceConstants.CONSOLE_FONT));\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\tab AntUIPlugin.getPlugin().getPreferenceStore().addPropertyChangeListener(changeListener);\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab instances.add(\cf1\b this\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab document = \cf1\b new \cf3\b0 Document();\cf0\highlight0\par \cf3\highlight2\tab styleRangeVector = \cf1\b new \cf3\b0 Vector(5);\cf0\highlight0\par \cf3\highlight2\tab labelprovider = \cf1\b new \cf3\b0 AntTreeLabelProvider(\cf1\b this\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab contentProvider = \cf1\b new \cf3\b0 AntTreeContentProvider(\cf1\b this\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab initializeOutputStructure();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf7\highlight2 /**\cf0\highlight0\par \cf7\highlight2 * \cf8\b @see \cf7\b0 IViewPart\cf0\highlight0\par \cf7\highlight2 */\cf0\highlight0\par \cf1\highlight2\b public void \cf3\b0 init(IViewSite site, IMemento memento) \cf1\b throws \cf3\b0 PartInitException \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b super\cf3\b0 .init(site,memento);\cf0\highlight0\par \par \cf3\highlight6\tab\cf1\b if \cf3\b0 (memento == \cf1\b null\cf3\b0 ) \{\cf0\highlight0\par \cf3\highlight6\tab\tab\cf4 // default values (first time the console is created)\cf0\highlight0\par \cf3\highlight6\tab\tab lastTreeWidth = 30;\cf0\highlight0\par \cf3\highlight6\tab\tab showSelectedTreeItems = \cf1\b false\cf3\b0 ;\cf0\highlight0\par \cf3\highlight6\tab\tab showTree = \cf1\b false\cf3\b0 ;\cf0\highlight0\par \cf3\highlight6\tab\} \cf1\b else \cf3\b0\{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf4 // retrieve the values of the previous session\cf0\highlight0\par \cf3\highlight2\tab\tab lastTreeWidth = memento.getInteger(TREE_WIDTH_PROPERTY).intValue();\cf0\highlight0\par \cf3\highlight6\tab\tab showSelectedTreeItems = memento.getInteger(SHOW_ONLY_SELECTED_ITEM_PROPERTY).intValue() != 0;\cf0\highlight0\par \cf3\highlight2\tab\tab showTree = memento.getInteger(SHOW_TREE_PROPERTY).intValue() != 0;\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 addContributions() \{\cf0\highlight0\par \par \cf3\highlight2\tab\cf4 // In order for the clipboard actions to be accessible via their shortcuts\cf0\highlight0\par \highlight2\tab\cf4 // (e.g., Ctrl-C, Ctrl-V), we *must* set a global action handler for\cf0\highlight0\par \highlight2\tab\cf4 // each action\cf0\highlight0\par \cf3\highlight2\tab IActionBars actionBars= getViewSite().getActionBars();\cf0\highlight0\par \cf3\highlight2\tab actionBars.setGlobalActionHandler(ITextEditorActionConstants.COPY, copyAction);\cf0\highlight0\par \cf3\highlight2\tab actionBars.setGlobalActionHandler(ITextEditorActionConstants.FIND, findAction);\cf0\highlight0\par \cf3\highlight2\tab actionBars.setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, selectAllAction);\cf0\highlight0\par \cf3\highlight2\tab\tab\cf0\highlight0\par \cf3\highlight2\tab MenuManager textViewerMgr = \cf1\b new \cf3\b0 MenuManager();\cf0\highlight0\par \cf3\highlight2\tab textViewerMgr.setRemoveAllWhenShown(\cf1\b true\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab textViewerMgr.addMenuListener(\cf1\b new \cf3\b0 IMenuListener() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 menuAboutToShow(IMenuManager textViewerMgr) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab fillTextViewerContextMenu(textViewerMgr);\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\tab Menu textViewerMenu = textViewerMgr.createContextMenu(viewer.getControl());\cf0\highlight0\par \cf3\highlight2\tab viewer.getControl().setMenu(textViewerMenu);\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab MenuManager treeViewerMgr = \cf1\b new \cf3\b0 MenuManager();\cf0\highlight0\par \cf3\highlight2\tab treeViewerMgr.setRemoveAllWhenShown(\cf1\b true\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab treeViewerMgr.addMenuListener(\cf1\b new \cf3\b0 IMenuListener() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 menuAboutToShow(IMenuManager treeViewerMgr) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab fillTreeViewerContextMenu(treeViewerMgr);\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\tab Menu treeViewerMenu = treeViewerMgr.createContextMenu(tree.getControl());\cf0\highlight0\par \cf3\highlight2\tab tree.getControl().setMenu(treeViewerMenu);\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 //add toolbar actions\cf0\highlight0\par \cf3\highlight2\tab IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();\cf0\highlight0\par \cf3\highlight2\tab tbm.add(showTreeAction);\cf0\highlight0\par \cf3\highlight2\tab tbm.add(showSelectedItemAction);\cf0\highlight0\par \cf3\highlight2\tab tbm.add(clearOutputAction);\cf0\highlight0\par \cf3\highlight2\tab getViewSite().getActionBars().updateActionBars();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b private void \cf3\b0 createHideOrShowTreeAction() \{\cf0\highlight0\par \cf3\highlight2\tab showTreeAction = \cf1\b new \cf3\b0 Action() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\cf1\b if \cf3\b0 (isChecked()) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // the tree is hidden, let's show it\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab sash.SASH_WIDTH = SASH_WIDTH;\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab sash.setWeights(\cf1\b new int\cf3\b0 [] \{lastTreeWidth, 100-lastTreeWidth\});\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab setToolTipText(Policy.bind(\cf5 "console.hideOutputStructureTree"\cf3 ));\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab\cf4 // the "ShowOnlySelectedElement" functionnality can be turned on\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab showSelectedItemAction.setEnabled(\cf1\b true\cf3\b0 );\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab showSelectedItemAction.setChecked(showSelectedTreeItems);\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab showSelectedItemAction.run();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b else \cf3\b0\{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // let's hide the tree\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab sash.SASH_WIDTH = 0;\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab sash.setWeights(\cf1\b new int\cf3\b0 [] \{0,100\});\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab setToolTipText(Policy.bind(\cf5 "console.showOutputStructureTree"\cf3 ));\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab\cf4 // the "ShowOnlySelectedElement" functionality must be turned off: we keep its state\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab showSelectedTreeItems = showSelectedItemAction.isChecked();\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab\cf4 // and show the whole document\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab showSelectedItemAction.setChecked(\cf1\b false\cf3\b0 );\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab showSelectedItemAction.run();\cf0\highlight0\par \cf3\highlight6\tab\tab\tab\tab\cf4 // and finally disable it\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab showSelectedItemAction.setEnabled(\cf1\b false\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab showTreeAction.setImageDescriptor(getImageDescriptor(\cf5 "icons/full/clcl16/hideOrShowTree.gif"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab showTreeAction.setChecked(showTree);\cf0\highlight0\par \cf3\highlight2\tab showTreeAction.setText(Policy.bind(\cf5 "console.showTree"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab String tooltip = showTree ? \cf5 "console.hideOutputStructureTree" \cf3 : \cf5 "console.showOutputStructureTree"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab showTreeAction.setToolTipText(Policy.bind(tooltip));\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \par \cf1\highlight2\b private boolean \cf3\b0 isTreeHidden() \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b return \cf3\b0 sash.getWeights()[0] == 0;\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 append(String value) \{\cf0\highlight0\par \cf3\highlight2\tab append(value, Project.MSG_INFO);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 append(\cf1\b final \cf3\b0 String value, \cf1\b final int \cf3\b0 ouputLevel) \{\cf0\highlight0\par \cf3\highlight2\tab getViewSite().getShell().getDisplay().syncExec(\cf1\b new \cf3\b0 Runnable() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b int \cf3\b0 start = document.get().length();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab document.set(document.get() + value);\cf0\highlight0\par \cf3\highlight2\tab\tab\tab setOutputLevelColor(ouputLevel, start, value.length());\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (value.length() > 0 && viewer != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab viewer.revealRange(document.get().length() - 1, 1);\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b private void \cf3\b0 setOutputLevelColor(\cf1\b int \cf3\b0 level, \cf1\b int \cf3\b0 start, \cf1\b int \cf3\b0 end) \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b switch \cf3\b0 (level) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b case \cf3\b0 Project.MSG_ERR: \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, ERROR_COLOR); \cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b break\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b case \cf3\b0 Project.MSG_WARN: \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, WARN_COLOR); \cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b break\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b case \cf3\b0 Project.MSG_INFO: \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, INFO_COLOR); \cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b break\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b case \cf3\b0 Project.MSG_VERBOSE: \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, VERBOSE_COLOR); \cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b break\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b case \cf3\b0 Project.MSG_DEBUG: \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, DEBUG_COLOR); \cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b break\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b default\cf3\b0 : \cf0\highlight0\par \cf3\highlight2\tab\tab\tab addRangeStyle(start, end, INFO_COLOR);\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b private void \cf3\b0 addRangeStyle(\cf1\b int \cf3\b0 start, \cf1\b int \cf3\b0 length, Color color) \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (styleRangeVector.size() != 0) \{\cf0\highlight0\par \cf3\highlight2\tab\tab StyleRange lastStyle = (StyleRange) styleRangeVector.lastElement();\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b if \cf3\b0 (color.equals(lastStyle.foreground))\cf0\highlight0\par \cf3\highlight2\tab\tab\tab lastStyle.length += length;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b else\cf0\highlight0\b0\par \cf1\highlight2\b\tab\tab\tab\cf3\b0 styleRangeVector.add(\cf1\b new \cf3\b0 StyleRange(start, length, color, \cf1\b null\cf3\b0 ));\cf0\highlight0\par \cf3\highlight2\tab\} \cf1\b else\cf0\highlight0\b0\par \cf1\highlight2\b\tab\tab\cf3\b0 styleRangeVector.add(\cf1\b new \cf3\b0 StyleRange(start, length, color, \cf1\b null\cf3\b0 ));\cf0\highlight0\par \par \cf3\highlight2\tab StyleRange[] styleArray = (StyleRange[]) styleRangeVector.toArray(\cf1\b new \cf3\b0 StyleRange[styleRangeVector.size()]);\tab\tab\tab\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (viewer != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.getTextWidget().setStyleRanges(styleArray);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 copySelectionToClipboard() \{\cf0\highlight0\par \cf3\highlight2\tab viewer.doOperation(viewer.COPY);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \cf7\highlight2 /**\cf0\highlight0\par \cf7\highlight2 * Creates the actions that will appear in this view's toolbar and popup menus.\cf0\highlight0\par \cf7\highlight2 */\cf0\highlight0\par \cf1\highlight2\b protected void \cf3\b0 createActions() \{\cf0\highlight0\par \cf3\highlight2\tab\cf4 // Create the actions for the text viewer.\cf0\highlight0\par \cf3\highlight2\tab copyAction = \cf1\b new \cf3\b0 Action(Policy.bind(\cf5 "console.copy"\cf3 )) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab copySelectionToClipboard();\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab selectAllAction = \cf1\b new \cf3\b0 Action(Policy.bind(\cf5 "console.selectAll"\cf3 )) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab selectAllText();\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab clearOutputAction = \cf1\b new \cf3\b0 Action(Policy.bind(\cf5 "console.clearOutput"\cf3 )) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab clearOutput();\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab clearOutputAction.setImageDescriptor(getImageDescriptor(\cf5 "icons/full/clcl16/clear.gif"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab clearOutputAction.setToolTipText(Policy.bind(\cf5 "console.clearOutput"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab findAction = \cf1\b new \cf3\b0 FindReplaceAction(\cf0\highlight0\par \cf3\highlight2\tab\tab AntUIPlugin.getResourceBundle(),\cf0\highlight0\par \cf3\highlight2\tab\tab PROPERTY_PREFIX_FIND,\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b this\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab findAction.setEnabled(\cf1\b true\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 // Create the actions for the tree viewer.\cf0\highlight0\par \cf3\highlight2\tab createHideOrShowTreeAction();\cf0\highlight0\par \cf3\highlight2\tab expandTreeItemAction = \cf1\b new \cf3\b0 Action(Policy.bind(\cf5 "console.expandAll"\cf3 )) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab OutputStructureElement selectedElement = (OutputStructureElement) ((IStructuredSelection) tree.getSelection()).getFirstElement();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab tree.expandToLevel(selectedElement, tree.ALL_LEVELS);\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 //create the toolbar actions\cf0\highlight0\par \cf3\highlight2\tab showSelectedItemAction = \cf1\b new \cf3\b0 Action() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab showOnlySelectedItems = isChecked();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (showOnlySelectedItems) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // we want to show only the selected tree items\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab showSelectedElementOnly();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // changes the labels\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab setToolTipText(Policy.bind(\cf5 "console.showCompleteOutput"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b else \cf3\b0\{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // we want to show the whole document now\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab showCompleteOutput();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // changes the labels\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab setToolTipText(Policy.bind(\cf5 "console.showSelectedElementOnly"\cf3 ));\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\};\cf0\highlight0\par \cf3\highlight2\tab showSelectedItemAction.setImageDescriptor(getImageDescriptor(\cf5 "icons/full/clcl16/showOnlySelectedText.gif"\cf3 ));\cf0\highlight0\par \cf3\highlight6\tab showOnlySelectedItems.setChecked(showSelectedTreeItems);\cf0\highlight0\par \cf3\highlight2\tab showSelectedItemAction.setText(Policy.bind(\cf5 "console.showSelectedElementOnly"\cf3 ));\tab\tab\cf0\highlight0\par \cf3\highlight2\tab String tooltip = showOnlySelectedItems ? \cf5 "console.showCompleteOutput" \cf3 : \cf5 "console.showSelectedElementOnly"\cf3 ;\cf0\highlight0\par \cf3\highlight2\tab showSelectedItemAction.setToolTipText(Policy.bind(tooltip));\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 clearOutput() \{\cf0\highlight0\par \cf3\highlight2\tab document.set(\cf5 ""\cf3 );\cf0\highlight0\par \cf3\highlight2\tab styleRangeVector.removeAllElements();\cf0\highlight0\par \cf3\highlight2\tab\cf4 // the tree can be null if #createPartControl has not called yet, \cf0\highlight0\par \highlight2\tab\cf4 // i.e. if the console exists but has never been shown so far\cf0\highlight0\par \cf1\highlight2\b\tab if \cf3\b0 (tree != \cf1\b null\cf3\b0 ) \{\cf0\highlight0\par \cf3\highlight2\tab\tab initializeOutputStructure();\cf0\highlight0\par \cf3\highlight2\tab\tab refreshTree();\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf4\highlight2 /*\cf0\highlight0\par \cf4\highlight2 * Shows the output of the selected item only\cf0\highlight0\par \cf4\highlight2 */\cf0\highlight0\par \cf1\highlight2\b protected void \cf3\b0 showSelectedElementOnly() \{\cf0\highlight0\par \cf3\highlight2\tab IStructuredSelection selection = (IStructuredSelection) tree.getSelection();\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (selection.isEmpty())\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.setVisibleRegion(0,0);\cf0\highlight0\par \cf3\highlight2\tab\cf1\b else \cf3\b0\{\cf0\highlight0\par \cf3\highlight2\tab\tab OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement();\cf0\highlight0\par \cf3\highlight2\tab\tab\cf4 // XXX NOTE: #setVisibleRegion doesn't keep the color information... See "1GHQC7Q: ITPUI:WIN2000 - TextViewer#setVisibleRegion doesn't take into account the colors"\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.setVisibleRegion(selectedElement.getStartIndex(), selectedElement.getLength());\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf4\highlight2 /*\cf0\highlight0\par \cf4\highlight2 * Shows the output of the whole docuent, and reveals the range of the selected item\cf0\highlight0\par \cf4\highlight2 */\cf0\highlight0\par \cf1\highlight2\b protected void \cf3\b0 showCompleteOutput() \{\cf0\highlight0\par \cf3\highlight2\tab\cf4 // show all the document\cf0\highlight0\par \cf3\highlight2\tab viewer.setVisibleRegion(0, document.get().length());\cf0\highlight0\par \cf3\highlight2\tab\cf4 // 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"\cf0\highlight0\par \cf3\highlight2\tab viewer.getTextWidget().setStyleRanges((StyleRange[]) styleRangeVector.toArray(\cf1\b new \cf3\b0 StyleRange[styleRangeVector.size()]));\cf0\highlight0\par \cf3\highlight2\tab\cf4 // and then reveal the range of the selected item\cf0\highlight0\par \cf3\highlight2\tab revealRangeOfSelectedItem();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b private void \cf3\b0 revealRangeOfSelectedItem() \{\cf0\highlight0\par \cf3\highlight2\tab IStructuredSelection selection = (IStructuredSelection) tree.getSelection();\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (!selection.isEmpty()) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf4 // then show the reveal the range of the output accordingly\cf0\highlight0\par \cf3\highlight2\tab\tab OutputStructureElement selectedElement = (OutputStructureElement) selection.getFirstElement();\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.revealRange(selectedElement.getStartIndex(), selectedElement.getLength());\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.setSelectedRange(selectedElement.getStartIndex(), selectedElement.getLength());\cf0\highlight0\par \cf3\highlight2\tab\}\tab\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 initializeOutputStructure() \{\cf0\highlight0\par \cf3\highlight2\tab\cf4 // root is the first element of the structure: it is a fake so it doesn't need a real name\cf0\highlight0\par \cf3\highlight2\tab root = \cf1\b new \cf3\b0 OutputStructureElement(\cf5 "-- root --"\cf3 );\cf0\highlight0\par \cf3\highlight2\tab currentElement = \cf1\b new \cf3\b0 OutputStructureElement(Policy.bind(\cf5 "console.antScript"\cf3 ), root, 0);\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (tree != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab initializeTreeInput();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 initializeTreeInput() \{\cf0\highlight0\par \cf3\highlight2\tab getSite().getShell().getDisplay().syncExec(\cf1\b new \cf3\b0 Runnable()\{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (tree != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab tree.setInput(root);\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 refreshTree() \{\cf0\highlight0\par \cf3\highlight2\tab\cf4 // if the tree is null, it means that the view hasn't been shown yet, so we don't need to refresh it.\cf0\highlight0\par \cf1\highlight2\b\tab if \cf3\b0 (tree != \cf1\b null\cf3\b0 ) \{\cf0\highlight0\par \cf3\highlight2\tab\tab getSite().getShell().getDisplay().syncExec(\cf1\b new \cf3\b0 Runnable()\{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b public void \cf3\b0 run() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\tab tree.refresh();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\tab tree.expandAll();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\});\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public void \cf3\b0 updateFont() \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (viewer != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab viewer.getTextWidget().setFont(ANT_FONT);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 fillTextViewerContextMenu(IMenuManager manager) \{\cf0\highlight0\par \cf3\highlight2\tab copyAction.setEnabled(viewer.canDoOperation(viewer.COPY));\cf0\highlight0\par \cf3\highlight2\tab selectAllAction.setEnabled(viewer.canDoOperation(viewer.SELECT_ALL));\cf0\highlight0\par \cf3\highlight2\tab manager.add(copyAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(findAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(selectAllAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(\cf1\b new \cf3\b0 Separator());\cf0\highlight0\par \cf3\highlight2\tab manager.add(showTreeAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(clearOutputAction);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 fillTreeViewerContextMenu(IMenuManager manager) \{\cf0\highlight0\par \cf3\highlight2\tab manager.add(showSelectedItemAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(expandTreeItemAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(\cf1\b new \cf3\b0 Separator());\cf0\highlight0\par \cf3\highlight2\tab manager.add(showTreeAction);\cf0\highlight0\par \cf3\highlight2\tab manager.add(clearOutputAction);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b public \cf3\b0 Object getAdapter(Class required) \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (IFindReplaceTarget.\cf1\b class\cf3\b0 .equals(required))\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b return \cf3\b0 viewer.getFindReplaceTarget();\cf0\highlight0\par \cf3\highlight2\tab\cf1\b return super\cf3\b0 .getAdapter(required);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected \cf3\b0 ImageDescriptor getImageDescriptor(String relativePath) \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b try \cf3\b0\{\cf0\highlight0\par \cf3\highlight2\tab\tab URL installURL = AntUIPlugin.getPlugin().getDescriptor().getInstallURL();\cf0\highlight0\par \cf3\highlight2\tab\tab URL url = \cf1\b new \cf3\b0 URL(installURL,relativePath);\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b return \cf3\b0 ImageDescriptor.createFromURL(url);\cf0\highlight0\par \cf3\highlight2\tab\} \cf1\b catch \cf3\b0 (MalformedURLException e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b return null\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \cf1\highlight2\b protected void \cf3\b0 selectAllText() \{\cf0\highlight0\par \cf3\highlight2\tab viewer.doOperation(viewer.SELECT_ALL);\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf7\highlight2 /**\cf0\highlight0\par \cf7\highlight2 * \cf8\b @see \cf7\b0 WorkbenchPart#setFocus()\cf0\highlight0\par \cf7\highlight2 */\cf0\highlight0\par \cf1\highlight2\b public void \cf3\b0 setFocus() \{\cf0\highlight0\par \cf3\highlight2\tab sash.setFocus();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf7\highlight2 /**\cf0\highlight0\par \cf7\highlight2 * \cf8\b @see \cf7\b0 WorkbenchPart#createPartControl(Composite)\cf0\highlight0\par \cf7\highlight2 */\cf0\highlight0\par \cf1\highlight2\b public void \cf3\b0 createPartControl(Composite parent) \{\cf0\highlight0\par \cf3\highlight2\tab sash = \cf1\b new \cf3\b0 SashForm(parent, SWT.HORIZONTAL);\cf0\highlight0\par \cf3\highlight2\tab GridLayout sashLayout = \cf1\b new \cf3\b0 GridLayout();\cf0\highlight0\par \cf3\highlight2\tab sashLayout.marginHeight = 0;\cf0\highlight0\par \cf3\highlight2\tab sashLayout.marginWidth = 0;\cf0\highlight0\par \cf3\highlight2\tab sash.setLayout(sashLayout);\cf0\highlight0\par \cf3\highlight2\tab sash.setLayoutData(\cf1\b new \cf3\b0 GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));\cf0\highlight0\par \par \cf3\highlight2\tab tree = \cf1\b new \cf3\b0 TreeViewer(sash, SWT.V_SCROLL | SWT.H_SCROLL);\cf0\highlight0\par \cf3\highlight2\tab GridData treeData = \cf1\b new \cf3\b0 GridData(GridData.FILL_BOTH);\cf0\highlight0\par \cf3\highlight2\tab tree.getControl().setLayoutData(treeData);\cf0\highlight0\par \cf3\highlight2\tab tree.setContentProvider(contentProvider);\cf0\highlight0\par \cf3\highlight2\tab tree.setLabelProvider(labelprovider);\cf0\highlight0\par \cf3\highlight2\tab tree.setInput(root);\cf0\highlight0\par \cf3\highlight2\tab tree.expandAll();\cf0\highlight0\par \cf3\highlight2\tab addTreeViewerListeners();\cf0\highlight0\par \par \cf3\highlight2\tab viewer = \cf1\b new \cf3\b0 TextViewer(sash,SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);\cf0\highlight0\par \cf3\highlight2\tab GridData viewerData = \cf1\b new \cf3\b0 GridData(GridData.FILL_BOTH);\cf0\highlight0\par \cf3\highlight2\tab viewer.getControl().setLayoutData(viewerData);\cf0\highlight0\par \cf3\highlight2\tab viewer.setEditable(\cf1\b false\cf3\b0 );\cf0\highlight0\par \cf3\highlight2\tab viewer.setDocument(document);\cf0\highlight0\par \cf3\highlight2\tab viewer.getTextWidget().setFont(ANT_FONT);\cf0\highlight0\par \cf3\highlight2\tab viewer.getTextWidget().setStyleRanges((StyleRange[]) styleRangeVector.toArray(\cf1\b new \cf3\b0 StyleRange[styleRangeVector.size()]));\cf0\highlight0\par \cf3\highlight2\tab addTextViewerListeners();\cf0\highlight0\par \cf3\highlight2\tab\cf0\highlight0\par \cf3\highlight2\tab\cf4 // sets the ratio tree/textViewer for the sashForm\cf0\highlight0\par \cf1\highlight2\b\tab if \cf3\b0 (showTree)\cf0\highlight0\par \cf3\highlight2\tab\tab sash.setWeights(\cf1\b new int\cf3\b0 [] \{lastTreeWidth, 100-lastTreeWidth\});\cf0\highlight0\par \cf3\highlight2\tab\cf1\b else\cf0\highlight0\b0\par \cf1\highlight2\b\tab\tab\cf4\b0 // the "hideOrShowTree" action wasn't checked: this means that the user didn't want to have the tree\cf0\highlight0\par \cf3\highlight2\tab\tab sash.setWeights(\cf1\b new int\cf3\b0 [] \{0, 100\});\cf0\highlight0\par \par \cf3\highlight2\tab createActions();\cf0\highlight0\par \cf3\highlight2\tab addContributions();\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 addTreeViewerListeners() \{\cf0\highlight0\par \cf3\highlight2\tab tree.addSelectionChangedListener(\cf1\b new \cf3\b0 ISelectionChangedListener() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 selectionChanged(SelectionChangedEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (viewer != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf1\b if \cf3\b0 (showSelectedItemAction.isChecked())\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\tab showSelectedElementOnly();\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf1\b else\cf0\highlight0\b0\par \cf1\highlight2\b\tab\tab\tab\tab\tab\cf3\b0 revealRangeOfSelectedItem();\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\tab\cf4 // to remember the place of the sash when we hide the tree\cf0\highlight0\par \cf3\highlight2\tab tree.getControl().addControlListener(\cf1\b new \cf3\b0 ControlListener() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 controlMoved(ControlEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 controlResized(ControlEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (tree.getControl().getSize().x != 0)\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab\cf4 // we don't want the width to be stored when the tree is getting hidden \cf0\highlight0\par \highlight2\tab\tab\tab\tab\cf4 // (because it equals zero and we want to have the previous value)\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab lastTreeWidth = \cf1\b new \cf3\b0 Float( (\cf1\b float\cf3\b0 ) tree.getControl().getSize().x / sash.getSize().x * 100).intValue();\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 addTextViewerListeners() \{\cf0\highlight0\par \cf3\highlight2\tab viewer.getTextWidget().addMouseListener(\cf1\b new \cf3\b0 MouseListener() \{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 mouseDown(MouseEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (!showSelectedItemAction.isChecked())\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab selectTreeItem(viewer.getTextWidget().getCaretOffset());\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 mouseUp(MouseEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 mouseDoubleClick(MouseEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\tab viewer.getTextWidget().addKeyListener(\cf1\b new \cf3\b0 KeyListener()\{\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b public void \cf3\b0 keyPressed(KeyEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\}\cf0\highlight0\par \cf3\highlight2 \tab\tab\cf1\b public void \cf3\b0 keyReleased(KeyEvent e) \{\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf1\b if \cf3\b0 (!showSelectedItemAction.isChecked())\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\tab selectTreeItem(viewer.getTextWidget().getCaretOffset());\cf0\highlight0\par \cf3\highlight2 \tab\tab\}\cf0\highlight0\par \cf3\highlight2\tab\});\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b protected void \cf3\b0 selectTreeItem(\cf1\b int \cf3\b0 caretPosition) \{\cf0\highlight0\par \cf3\highlight2\tab\cf4 // tree.getTree().getItems()[1] returns the root of the tree that contains the project\cf0\highlight0\par \highlight2\tab\cf4 // it may not exist if there is no output (in this case, there is only one item: the "Ant Script" one)\cf0\highlight0\par \cf1\highlight2\b\tab if \cf3\b0 (tree.getTree().getItems().length != 1) \{\cf0\highlight0\par \cf3\highlight2\tab\tab TreeItem itemToSelect = \cf1\b null\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b if \cf3\b0 (findItem(tree.getTree().getItems()[0], caretPosition) != \cf1\b null\cf3\b0 )\cf0\highlight0\par \cf3\highlight2\tab\tab\tab\cf4 // the first item is the good one\cf0\highlight0\par \cf3\highlight2\tab\tab\tab itemToSelect = tree.getTree().getItems()[0];\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b else\cf0\highlight0\b0\par \cf1\highlight2\b\tab\tab\tab\cf4\b0 // the first item is not the good one, let's check the second one and its children\cf0\highlight0\par \cf3\highlight2\tab\tab\tab itemToSelect = findItem(tree.getTree().getItems()[1], caretPosition);\cf0\highlight0\par \par \cf3\highlight2\tab\tab tree.getTree().setSelection(\cf1\b new \cf3\b0 TreeItem[] \{itemToSelect\});\cf0\highlight0\par \cf3\highlight2\tab\}\cf0\highlight0\par \cf3\highlight2\}\cf0\highlight0\par \par \cf1\highlight2\b private \cf3\b0 TreeItem findItem(TreeItem item, \cf1\b int \cf3\b0 position) \{\cf0\highlight0\par \cf3\highlight2\tab\cf1\b if \cf3\b0 (!( ((OutputStructureElement) item.getData()).getStartIndex() <= position \cf0\highlight0\par \cf3\highlight2\tab\tab\tab && ((OutputStructureElement) item.getData()).getEndIndex() > position))\cf0\highlight0\par \cf3\highlight2\tab\tab\cf1\b return null\cf3\b0 ;\cf0\highlight0\par \cf3\highlight2\tab\cf1\b for \cf3\b0 (\cf1\b int \cf3\b0 i=0; i