OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013, the Dart project authors. | 2 * Copyright (c) 2014, the Dart project authors. |
3 * | 3 * |
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except | 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except |
5 * in compliance with the License. You may obtain a copy of the License at | 5 * in compliance with the License. You may obtain a copy of the License at |
6 * | 6 * |
7 * http://www.eclipse.org/legal/epl-v10.html | 7 * http://www.eclipse.org/legal/epl-v10.html |
8 * | 8 * |
9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License | 9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License |
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express | 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express |
11 * or implied. See the License for the specific language governing permissions a
nd limitations under | 11 * or implied. See the License for the specific language governing permissions a
nd limitations under |
12 * the License. | 12 * the License. |
13 */ | 13 */ |
14 package com.google.dart.tools.ui.internal.text.editor; | 14 package com.google.dart.tools.ui.internal.text.editor; |
15 | 15 |
16 import com.google.common.base.Objects; | 16 import com.google.common.base.Objects; |
17 import com.google.dart.engine.ast.CompilationUnit; | 17 import com.google.dart.server.Outline; |
| 18 import com.google.dart.server.OutlineKind; |
18 import com.google.dart.tools.core.DartCore; | 19 import com.google.dart.tools.core.DartCore; |
19 import com.google.dart.tools.internal.search.ui.DartSearchActionGroup; | 20 import com.google.dart.tools.internal.search.ui.DartSearchActionGroup; |
| 21 import com.google.dart.tools.ui.DartElementImageDescriptor; |
20 import com.google.dart.tools.ui.DartPluginImages; | 22 import com.google.dart.tools.ui.DartPluginImages; |
21 import com.google.dart.tools.ui.DartToolsPlugin; | 23 import com.google.dart.tools.ui.DartToolsPlugin; |
22 import com.google.dart.tools.ui.actions.InstrumentedAction; | 24 import com.google.dart.tools.ui.actions.InstrumentedAction; |
23 import com.google.dart.tools.ui.actions.OpenViewActionGroup; | 25 import com.google.dart.tools.ui.actions.OpenViewActionGroup; |
24 import com.google.dart.tools.ui.actions.RefactorActionGroup; | 26 import com.google.dart.tools.ui.actions.RefactorActionGroup; |
25 import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder; | 27 import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder; |
26 import com.google.dart.tools.ui.internal.text.DartHelpContextIds; | 28 import com.google.dart.tools.ui.internal.text.DartHelpContextIds; |
27 import com.google.dart.tools.ui.internal.util.SWTUtil; | 29 import com.google.dart.tools.ui.internal.util.SWTUtil; |
28 import com.google.dart.tools.ui.internal.viewsupport.ColoredViewersManager; | 30 import com.google.dart.tools.ui.internal.viewsupport.ColoredViewersManager; |
| 31 import com.google.dart.tools.ui.internal.viewsupport.ImageDescriptorRegistry; |
29 | 32 |
| 33 import org.apache.commons.lang3.StringUtils; |
30 import org.eclipse.core.runtime.Assert; | 34 import org.eclipse.core.runtime.Assert; |
31 import org.eclipse.core.runtime.IProgressMonitor; | |
32 import org.eclipse.core.runtime.IStatus; | |
33 import org.eclipse.core.runtime.ListenerList; | 35 import org.eclipse.core.runtime.ListenerList; |
34 import org.eclipse.core.runtime.Status; | |
35 import org.eclipse.jface.action.IAction; | 36 import org.eclipse.jface.action.IAction; |
36 import org.eclipse.jface.action.IMenuListener; | 37 import org.eclipse.jface.action.IMenuListener; |
37 import org.eclipse.jface.action.IMenuManager; | 38 import org.eclipse.jface.action.IMenuManager; |
38 import org.eclipse.jface.action.IToolBarManager; | 39 import org.eclipse.jface.action.IToolBarManager; |
39 import org.eclipse.jface.action.MenuManager; | 40 import org.eclipse.jface.action.MenuManager; |
40 import org.eclipse.jface.preference.IPreferenceStore; | 41 import org.eclipse.jface.preference.IPreferenceStore; |
| 42 import org.eclipse.jface.resource.ImageDescriptor; |
41 import org.eclipse.jface.util.IPropertyChangeListener; | 43 import org.eclipse.jface.util.IPropertyChangeListener; |
42 import org.eclipse.jface.util.PropertyChangeEvent; | 44 import org.eclipse.jface.util.PropertyChangeEvent; |
| 45 import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; |
| 46 import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelP
rovider; |
43 import org.eclipse.jface.viewers.DoubleClickEvent; | 47 import org.eclipse.jface.viewers.DoubleClickEvent; |
44 import org.eclipse.jface.viewers.IDoubleClickListener; | 48 import org.eclipse.jface.viewers.IDoubleClickListener; |
45 import org.eclipse.jface.viewers.ISelection; | 49 import org.eclipse.jface.viewers.ISelection; |
46 import org.eclipse.jface.viewers.ISelectionChangedListener; | 50 import org.eclipse.jface.viewers.ISelectionChangedListener; |
47 import org.eclipse.jface.viewers.IStructuredSelection; | 51 import org.eclipse.jface.viewers.IStructuredSelection; |
| 52 import org.eclipse.jface.viewers.ITreeContentProvider; |
| 53 import org.eclipse.jface.viewers.LabelProvider; |
48 import org.eclipse.jface.viewers.SelectionChangedEvent; | 54 import org.eclipse.jface.viewers.SelectionChangedEvent; |
49 import org.eclipse.jface.viewers.StructuredSelection; | 55 import org.eclipse.jface.viewers.StructuredSelection; |
| 56 import org.eclipse.jface.viewers.StyledString; |
50 import org.eclipse.jface.viewers.TreeViewer; | 57 import org.eclipse.jface.viewers.TreeViewer; |
51 import org.eclipse.jface.viewers.Viewer; | 58 import org.eclipse.jface.viewers.Viewer; |
| 59 import org.eclipse.jface.viewers.ViewerComparator; |
52 import org.eclipse.jface.viewers.ViewerFilter; | 60 import org.eclipse.jface.viewers.ViewerFilter; |
53 import org.eclipse.swt.SWT; | 61 import org.eclipse.swt.SWT; |
54 import org.eclipse.swt.custom.BusyIndicator; | 62 import org.eclipse.swt.custom.BusyIndicator; |
| 63 import org.eclipse.swt.graphics.Image; |
| 64 import org.eclipse.swt.graphics.Point; |
55 import org.eclipse.swt.widgets.Composite; | 65 import org.eclipse.swt.widgets.Composite; |
56 import org.eclipse.swt.widgets.Control; | 66 import org.eclipse.swt.widgets.Control; |
57 import org.eclipse.swt.widgets.Display; | 67 import org.eclipse.swt.widgets.Display; |
58 import org.eclipse.swt.widgets.Event; | 68 import org.eclipse.swt.widgets.Event; |
59 import org.eclipse.swt.widgets.Menu; | 69 import org.eclipse.swt.widgets.Menu; |
60 import org.eclipse.swt.widgets.Tree; | 70 import org.eclipse.swt.widgets.Tree; |
61 import org.eclipse.ui.IActionBars; | 71 import org.eclipse.ui.IActionBars; |
62 import org.eclipse.ui.PlatformUI; | 72 import org.eclipse.ui.PlatformUI; |
63 import org.eclipse.ui.actions.ActionContext; | 73 import org.eclipse.ui.actions.ActionContext; |
64 import org.eclipse.ui.actions.ActionGroup; | 74 import org.eclipse.ui.actions.ActionGroup; |
65 import org.eclipse.ui.part.IPageSite; | 75 import org.eclipse.ui.part.IPageSite; |
66 import org.eclipse.ui.part.Page; | 76 import org.eclipse.ui.part.Page; |
67 import org.eclipse.ui.progress.UIJob; | |
68 import org.eclipse.ui.views.contentoutline.IContentOutlinePage; | 77 import org.eclipse.ui.views.contentoutline.IContentOutlinePage; |
69 | 78 |
70 /** | 79 /** |
71 * {@link IContentOutlinePage} for {@link DartEditor}. | 80 * {@link IContentOutlinePage} for {@link DartEditor}. |
72 */ | 81 */ |
73 public class DartOutlinePage extends Page implements IContentOutlinePage { | 82 public class DartOutlinePage_NEW extends Page implements IContentOutlinePage { |
| 83 |
| 84 /** |
| 85 * {@link ViewerComparator} for {@link Outline} names. |
| 86 */ |
| 87 public static class NameComparator extends ViewerComparator { |
| 88 private static final int NOT_ELEMENT = 2; |
| 89 private static final int PRIVATE_ELEMENT = 1; |
| 90 private static final int PUBLIC_ELEMENT = 0; |
| 91 |
| 92 @Override |
| 93 public int category(Object e) { |
| 94 if (!(e instanceof Outline)) { |
| 95 return NOT_ELEMENT; |
| 96 } |
| 97 Outline outline = (Outline) e; |
| 98 // TODO(scheglov) |
| 99 // if (outline.isPrivate()) { |
| 100 // return PRIVATE_ELEMENT; |
| 101 // } |
| 102 return PUBLIC_ELEMENT; |
| 103 } |
| 104 |
| 105 @Override |
| 106 public int compare(Viewer viewer, Object e1, Object e2) { |
| 107 // compare categories |
| 108 int cat1 = category(e1); |
| 109 int cat2 = category(e2); |
| 110 if (cat1 != cat2) { |
| 111 return cat1 - cat2; |
| 112 } |
| 113 // check types |
| 114 if (!(e1 instanceof Outline)) { |
| 115 return 0; |
| 116 } |
| 117 if (!(e2 instanceof Outline)) { |
| 118 return 0; |
| 119 } |
| 120 // compare names |
| 121 String name1 = ((Outline) e1).getName(); |
| 122 String name2 = ((Outline) e2).getName(); |
| 123 if (name1 == null || name2 == null) { |
| 124 return 0; |
| 125 } |
| 126 return name1.compareTo(name2); |
| 127 } |
| 128 } |
| 129 |
| 130 /** |
| 131 * {@link ViewerComparator} for {@link Outline} positions. |
| 132 */ |
| 133 public static class PositionComparator extends ViewerComparator { |
| 134 @Override |
| 135 public int compare(Viewer viewer, Object e1, Object e2) { |
| 136 if (!(e1 instanceof Outline)) { |
| 137 return 0; |
| 138 } |
| 139 if (!(e2 instanceof Outline)) { |
| 140 return 0; |
| 141 } |
| 142 int offset1 = ((Outline) e1).getOffset(); |
| 143 int offset2 = ((Outline) e2).getOffset(); |
| 144 return offset1 - offset2; |
| 145 } |
| 146 } |
74 | 147 |
75 private class CollapseAllAction extends InstrumentedAction { | 148 private class CollapseAllAction extends InstrumentedAction { |
76 CollapseAllAction() { | 149 CollapseAllAction() { |
77 super("Collapse All"); //$NON-NLS-1$ | 150 super("Collapse All"); //$NON-NLS-1$ |
78 setDescription("Collapse All"); //$NON-NLS-1$ | 151 setDescription("Collapse All"); //$NON-NLS-1$ |
79 setToolTipText("Collapse All"); //$NON-NLS-1$ | 152 setToolTipText("Collapse All"); //$NON-NLS-1$ |
80 DartPluginImages.setLocalImageDescriptors(this, "collapseall.gif"); //$NON
-NLS-1$ | 153 DartPluginImages.setLocalImageDescriptors(this, "collapseall.gif"); //$NON
-NLS-1$ |
81 PlatformUI.getWorkbench().getHelpSystem().setHelp( | 154 PlatformUI.getWorkbench().getHelpSystem().setHelp( |
82 this, | 155 this, |
83 DartHelpContextIds.COLLAPSE_ALL_ACTION); | 156 DartHelpContextIds.COLLAPSE_ALL_ACTION); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 valueChanged(isChecked(), true); | 230 valueChanged(isChecked(), true); |
158 } | 231 } |
159 | 232 |
160 private void valueChanged(final boolean on, boolean store) { | 233 private void valueChanged(final boolean on, boolean store) { |
161 setChecked(on); | 234 setChecked(on); |
162 // set comparator | 235 // set comparator |
163 BusyIndicator.showWhile(viewer.getControl().getDisplay(), new Runnable() { | 236 BusyIndicator.showWhile(viewer.getControl().getDisplay(), new Runnable() { |
164 @Override | 237 @Override |
165 public void run() { | 238 public void run() { |
166 if (on) { | 239 if (on) { |
167 viewer.setComparator(LightNodeElements.NAME_COMPARATOR); | 240 viewer.setComparator(NAME_COMPARATOR); |
168 } else { | 241 } else { |
169 viewer.setComparator(LightNodeElements.POSITION_COMPARATOR); | 242 viewer.setComparator(POSITION_COMPARATOR); |
170 } | 243 } |
171 } | 244 } |
172 }); | 245 }); |
173 // may be remember selection | 246 // may be remember selection |
174 if (store) { | 247 if (store) { |
175 DartToolsPlugin.getDefault().getPreferenceStore().setValue( | 248 DartToolsPlugin.getDefault().getPreferenceStore().setValue( |
176 "LexicalSortingAction.isChecked", on); //$NON-NLS-1$ | 249 "LexicalSortingAction.isChecked", on); //$NON-NLS-1$ |
177 } | 250 } |
178 } | 251 } |
179 } | 252 } |
180 | 253 |
| 254 private static class OutlineContentProvider implements ITreeContentProvider { |
| 255 @Override |
| 256 public void dispose() { |
| 257 } |
| 258 |
| 259 @Override |
| 260 public Object[] getChildren(Object parentElement) { |
| 261 return ((Outline) parentElement).getChildren(); |
| 262 } |
| 263 |
| 264 @Override |
| 265 public Object[] getElements(Object inputElement) { |
| 266 return ((Outline) inputElement).getChildren(); |
| 267 } |
| 268 |
| 269 @Override |
| 270 public Object getParent(Object element) { |
| 271 return ((Outline) element).getParent(); |
| 272 } |
| 273 |
| 274 @Override |
| 275 public boolean hasChildren(Object element) { |
| 276 return getChildren(element).length != 0; |
| 277 } |
| 278 |
| 279 @Override |
| 280 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| 281 } |
| 282 } |
| 283 private static class OutlineLabelProvider extends LabelProvider implements ISt
yledLabelProvider { |
| 284 private static final Point SIZE = new Point(22, 16); |
| 285 private static final ImageDescriptorRegistry registry = DartToolsPlugin.getI
mageDescriptorRegistry(); |
| 286 private static final String RIGHT_ARROW = " \u2192 "; //$NON-NLS-1$ |
| 287 |
| 288 private static ImageDescriptor getBaseImageDescriptor(OutlineKind kind, bool
ean isPrivate) { |
| 289 if (kind == OutlineKind.CLASS) { |
| 290 return isPrivate ? DartPluginImages.DESC_DART_CLASS_PRIVATE |
| 291 : DartPluginImages.DESC_DART_CLASS_PUBLIC; |
| 292 } |
| 293 if (kind == OutlineKind.FUNCTION_TYPE_ALIAS) { |
| 294 return isPrivate ? DartPluginImages.DESC_DART_FUNCTIONTYPE_PRIVATE |
| 295 : DartPluginImages.DESC_DART_FUNCTIONTYPE_PUBLIC; |
| 296 } |
| 297 if (kind == OutlineKind.FIELD || kind == OutlineKind.TOP_LEVEL_VARIABLE) { |
| 298 return isPrivate ? DartPluginImages.DESC_DART_FIELD_PRIVATE |
| 299 : DartPluginImages.DESC_DART_FIELD_PUBLIC; |
| 300 } |
| 301 if (kind == OutlineKind.CONSTRUCTOR || kind == OutlineKind.FUNCTION |
| 302 || kind == OutlineKind.GETTER || kind == OutlineKind.METHOD || kind ==
OutlineKind.SETTER) { |
| 303 return isPrivate ? DartPluginImages.DESC_DART_METHOD_PRIVATE |
| 304 : DartPluginImages.DESC_DART_METHOD_PUBLIC; |
| 305 } |
| 306 return null; |
| 307 } |
| 308 |
| 309 private static ImageDescriptor getImageDescriptor(OutlineKind kind, boolean
isPrivate) { |
| 310 ImageDescriptor base = getBaseImageDescriptor(kind, isPrivate); |
| 311 if (base == null) { |
| 312 return null; |
| 313 } |
| 314 int flags = 0; |
| 315 if (kind == OutlineKind.CONSTRUCTOR) { |
| 316 flags |= DartElementImageDescriptor.CONSTRUCTOR; |
| 317 } |
| 318 if (kind == OutlineKind.GETTER) { |
| 319 flags |= DartElementImageDescriptor.GETTER; |
| 320 } |
| 321 if (kind == OutlineKind.SETTER) { |
| 322 flags |= DartElementImageDescriptor.SETTER; |
| 323 } |
| 324 // TODO(scheglov) Analysis Server: add flags: abstract, private, static |
| 325 // // ClassDeclaration |
| 326 // if (node instanceof ClassDeclaration) { |
| 327 // ClassDeclaration classDeclaration = (ClassDeclaration) node; |
| 328 // if (classDeclaration.getAbstractKeyword() != null) { |
| 329 // flags |= DartElementImageDescriptor.ABSTRACT; |
| 330 // } |
| 331 // } |
| 332 // // ConstructorDeclaration |
| 333 // if (node instanceof ConstructorDeclaration) { |
| 334 // flags |= DartElementImageDescriptor.CONSTRUCTOR; |
| 335 // } |
| 336 // // MethodDeclaration |
| 337 // if (node instanceof MethodDeclaration) { |
| 338 // MethodDeclaration method = (MethodDeclaration) node; |
| 339 // if (method.isAbstract()) { |
| 340 // flags |= DartElementImageDescriptor.ABSTRACT; |
| 341 // } |
| 342 // if (method.isStatic()) { |
| 343 // flags |= DartElementImageDescriptor.STATIC; |
| 344 // } |
| 345 // if (method.isGetter()) { |
| 346 // flags |= DartElementImageDescriptor.GETTER; |
| 347 // } |
| 348 // if (method.isSetter()) { |
| 349 // flags |= DartElementImageDescriptor.SETTER; |
| 350 // } |
| 351 // } |
| 352 // done |
| 353 return new DartElementImageDescriptor(base, flags, SIZE); |
| 354 } |
| 355 |
| 356 @Override |
| 357 public Image getImage(Object o) { |
| 358 Outline outline = (Outline) o; |
| 359 // TODO(scheglov) Analysis Server: add isPrivate() accessor |
| 360 boolean isPrivate = outline.getName().startsWith("_"); |
| 361 ImageDescriptor descriptor = getImageDescriptor(outline.getKind(), isPriva
te); |
| 362 if (descriptor != null) { |
| 363 return registry.get(descriptor); |
| 364 } |
| 365 return null; |
| 366 } |
| 367 |
| 368 @Override |
| 369 public StyledString getStyledText(Object obj) { |
| 370 Outline outline = (Outline) obj; |
| 371 StyledString styledString = new StyledString(getText(obj)); |
| 372 // append parameters |
| 373 String parameters = outline.getArguments(); |
| 374 if (parameters != null) { |
| 375 styledString.append(parameters, StyledString.DECORATIONS_STYLER); |
| 376 } |
| 377 // append return type |
| 378 String returnType = outline.getReturnType(); |
| 379 if (!StringUtils.isEmpty(returnType)) { |
| 380 if (outline.getKind() == OutlineKind.FIELD |
| 381 || outline.getKind() == OutlineKind.TOP_LEVEL_VARIABLE) { |
| 382 styledString.append(" : " + returnType, StyledString.QUALIFIER_STYLER)
; |
| 383 } else { |
| 384 styledString.append(RIGHT_ARROW + returnType, StyledString.QUALIFIER_S
TYLER); |
| 385 } |
| 386 } |
| 387 // done |
| 388 return styledString; |
| 389 } |
| 390 |
| 391 @Override |
| 392 public String getText(Object element) { |
| 393 return ((Outline) element).getName(); |
| 394 } |
| 395 } |
| 396 |
181 private final ListenerList selectionChangedListeners = new ListenerList(Listen
erList.IDENTITY); | 397 private final ListenerList selectionChangedListeners = new ListenerList(Listen
erList.IDENTITY); |
182 private final String contextMenuID; | 398 private final String contextMenuID; |
183 private DartEditor editor; | 399 private DartEditor editor; |
| 400 private Outline input; |
184 private DartOutlineViewer viewer; | 401 private DartOutlineViewer viewer; |
| 402 |
185 private boolean ignoreSelectionChangedEvent = false; | 403 private boolean ignoreSelectionChangedEvent = false; |
186 private Menu contextMenu; | 404 private Menu contextMenu; |
| 405 |
187 private CompositeActionGroup actionGroups; | 406 private CompositeActionGroup actionGroups; |
| 407 private IPreferenceStore preferences; |
188 | 408 |
189 private CompilationUnit input; | |
190 | |
191 private IPreferenceStore preferences; | |
192 private IPropertyChangeListener propertyChangeListener = new IPropertyChangeLi
stener() { | 409 private IPropertyChangeListener propertyChangeListener = new IPropertyChangeLi
stener() { |
193 @Override | 410 @Override |
194 public void propertyChange(PropertyChangeEvent event) { | 411 public void propertyChange(PropertyChangeEvent event) { |
195 doPropertyChange(event); | 412 doPropertyChange(event); |
196 } | 413 } |
197 }; | 414 }; |
198 | 415 |
| 416 private static final ViewerComparator NAME_COMPARATOR = new NameComparator(); |
| 417 private static final ViewerComparator POSITION_COMPARATOR = new PositionCompar
ator(); |
199 private static final ViewerFilter PUBLIC_FILTER = new ViewerFilter() { | 418 private static final ViewerFilter PUBLIC_FILTER = new ViewerFilter() { |
200 @Override | 419 @Override |
201 public boolean select(Viewer viewer, Object parentElement, Object o) { | 420 public boolean select(Viewer viewer, Object parentElement, Object o) { |
202 if (o instanceof LightNodeElement) { | 421 // TODO(scheglov) |
203 LightNodeElement element = (LightNodeElement) o; | 422 // if (o instanceof LightNodeElement) { |
204 return !element.isPrivate(); | 423 // LightNodeElement element = (LightNodeElement) o; |
205 } | 424 // return !element.isPrivate(); |
| 425 // } |
206 return false; | 426 return false; |
207 } | 427 } |
208 }; | 428 }; |
209 | 429 |
210 public DartOutlinePage(String contextMenuID, DartEditor editor) { | 430 public DartOutlinePage_NEW(String contextMenuID, DartEditor editor) { |
211 Assert.isNotNull(editor); | 431 Assert.isNotNull(editor); |
212 this.contextMenuID = contextMenuID; | 432 this.contextMenuID = contextMenuID; |
213 this.editor = editor; | 433 this.editor = editor; |
214 } | 434 } |
215 | 435 |
216 @Override | 436 @Override |
217 public void addSelectionChangedListener(ISelectionChangedListener listener) { | 437 public void addSelectionChangedListener(ISelectionChangedListener listener) { |
218 if (viewer != null) { | 438 if (viewer != null) { |
219 viewer.addSelectionChangedListener(listener); | 439 viewer.addSelectionChangedListener(listener); |
220 } else { | 440 } else { |
221 selectionChangedListeners.add(listener); | 441 selectionChangedListeners.add(listener); |
222 } | 442 } |
223 } | 443 } |
224 | 444 |
225 @Override | 445 @Override |
226 public void createControl(Composite parent) { | 446 public void createControl(Composite parent) { |
227 preferences = DartToolsPlugin.getDefault().getCombinedPreferenceStore(); | 447 preferences = DartToolsPlugin.getDefault().getCombinedPreferenceStore(); |
228 Tree tree = new Tree(parent, SWT.MULTI | SWT.FULL_SELECTION); | 448 Tree tree = new Tree(parent, SWT.MULTI | SWT.FULL_SELECTION); |
229 // create "viewer" | 449 // create "viewer" |
230 viewer = new DartOutlineViewer(tree); | 450 viewer = new DartOutlineViewer(tree); |
231 ColoredViewersManager.install(viewer); | 451 ColoredViewersManager.install(viewer); |
232 viewer.setContentProvider(LightNodeElements.newTreeContentProvider(editor)); | 452 viewer.setContentProvider(new OutlineContentProvider()); |
233 viewer.setLabelProvider(LightNodeElements.newLabelProvider()); | 453 viewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new OutlineLab
elProvider())); |
234 SWTUtil.bindJFaceResourcesFontToControl(tree); | 454 SWTUtil.bindJFaceResourcesFontToControl(tree); |
235 // install listeners added before UI creation | 455 // install listeners added before UI creation |
236 { | 456 { |
237 Object[] listeners = selectionChangedListeners.getListeners(); | 457 Object[] listeners = selectionChangedListeners.getListeners(); |
238 for (Object listener : listeners) { | 458 for (Object listener : listeners) { |
239 selectionChangedListeners.remove(listener); | 459 selectionChangedListeners.remove(listener); |
240 viewer.addSelectionChangedListener((ISelectionChangedListener) listener)
; | 460 viewer.addSelectionChangedListener((ISelectionChangedListener) listener)
; |
241 } | 461 } |
242 } | 462 } |
243 // prepare context menu | 463 // prepare context menu |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 }); | 501 }); |
282 viewer.addDoubleClickListener(new IDoubleClickListener() { | 502 viewer.addDoubleClickListener(new IDoubleClickListener() { |
283 @Override | 503 @Override |
284 public void doubleClick(DoubleClickEvent event) { | 504 public void doubleClick(DoubleClickEvent event) { |
285 toggleExpansion(event.getSelection()); | 505 toggleExpansion(event.getSelection()); |
286 } | 506 } |
287 }); | 507 }); |
288 // update colors | 508 // update colors |
289 preferences.addPropertyChangeListener(propertyChangeListener); | 509 preferences.addPropertyChangeListener(propertyChangeListener); |
290 viewer.updateColors(); | 510 viewer.updateColors(); |
291 // schedule update in 100ms from now, to make impression that editor opens i
nstantaneously | |
292 new UIJob("Update Outline") { | |
293 @Override | |
294 public IStatus runInUIThread(IProgressMonitor monitor) { | |
295 if (viewer != null) { | |
296 viewer.setInput(input); | |
297 //LightNodeElements.expandTreeItemsTimeBoxed(viewer, 75L * 1000000L); | |
298 } | |
299 return Status.OK_STATUS; | |
300 } | |
301 }.schedule(); | |
302 } | 511 } |
303 | 512 |
304 @Override | 513 @Override |
305 public void dispose() { | 514 public void dispose() { |
306 // clear "editor" | 515 // clear "editor" |
307 if (editor == null) { | 516 if (editor == null) { |
308 return; | 517 return; |
309 } | 518 } |
310 editor.outlinePageClosed(); | 519 editor.outlinePageClosed(); |
311 editor = null; | 520 editor = null; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 | 559 |
351 @Override | 560 @Override |
352 public void removeSelectionChangedListener(ISelectionChangedListener listener)
{ | 561 public void removeSelectionChangedListener(ISelectionChangedListener listener)
{ |
353 if (viewer != null) { | 562 if (viewer != null) { |
354 viewer.removeSelectionChangedListener(listener); | 563 viewer.removeSelectionChangedListener(listener); |
355 } else { | 564 } else { |
356 selectionChangedListeners.remove(listener); | 565 selectionChangedListeners.remove(listener); |
357 } | 566 } |
358 } | 567 } |
359 | 568 |
360 public void select(final LightNodeElement element) { | 569 public void select(final int offset) { |
361 updateViewerWithoutDraw(new Runnable() { | 570 updateViewerWithoutDraw(new Runnable() { |
362 @Override | 571 @Override |
363 public void run() { | 572 public void run() { |
364 setSelection(new StructuredSelection(element)); | 573 // TODO(scheglov) Analysis Server: add source range |
365 viewer.reveal(element); | 574 // setSelection(new StructuredSelection(element)); |
| 575 // viewer.reveal(element); |
366 } | 576 } |
367 }); | 577 }); |
368 } | 578 } |
369 | 579 |
370 @Override | 580 @Override |
371 public void setFocus() { | 581 public void setFocus() { |
372 if (viewer != null) { | 582 if (viewer != null) { |
373 viewer.getControl().setFocus(); | 583 viewer.getControl().setFocus(); |
374 } | 584 } |
375 } | 585 } |
376 | 586 |
377 public void setInput(final CompilationUnit input) { | 587 public void setInput(final Outline input) { |
378 this.input = input; | 588 this.input = input; |
379 updateViewerWithoutDraw(new Runnable() { | 589 updateViewerWithoutDraw(new Runnable() { |
380 @Override | 590 @Override |
381 public void run() { | 591 public void run() { |
382 Object[] expandedElements = viewer.getExpandedElements(); | 592 Object[] expandedElements = viewer.getExpandedElements(); |
383 viewer.setInput(input); | 593 viewer.setInput(input); |
384 viewer.setExpandedElements(expandedElements); | 594 viewer.setExpandedElements(expandedElements); |
385 } | 595 } |
386 }); | 596 }); |
387 } | 597 } |
(...skipping 11 matching lines...) Expand all Loading... |
399 ignoreSelectionChangedEvent = false; | 609 ignoreSelectionChangedEvent = false; |
400 } | 610 } |
401 } | 611 } |
402 }); | 612 }); |
403 } | 613 } |
404 } | 614 } |
405 | 615 |
406 protected void toggleExpansion(ISelection selection) { | 616 protected void toggleExpansion(ISelection selection) { |
407 if (selection instanceof IStructuredSelection) { | 617 if (selection instanceof IStructuredSelection) { |
408 Object sel = ((IStructuredSelection) selection).getFirstElement(); | 618 Object sel = ((IStructuredSelection) selection).getFirstElement(); |
409 | |
410 boolean expanded = viewer.getExpandedState(sel); | 619 boolean expanded = viewer.getExpandedState(sel); |
411 | |
412 if (expanded) { | 620 if (expanded) { |
413 viewer.collapseToLevel(sel, 1); | 621 viewer.collapseToLevel(sel, 1); |
414 } else { | 622 } else { |
415 viewer.expandToLevel(sel, 1); | 623 viewer.expandToLevel(sel, 1); |
416 } | 624 } |
417 } | 625 } |
418 } | 626 } |
419 | 627 |
420 private void contextMenuAboutToShow(IMenuManager menu) { | 628 private void contextMenuAboutToShow(IMenuManager menu) { |
421 DartToolsPlugin.createStandardGroups(menu); | 629 DartToolsPlugin.createStandardGroups(menu); |
(...skipping 28 matching lines...) Expand all Loading... |
450 control.setRedraw(true); | 658 control.setRedraw(true); |
451 } | 659 } |
452 }); | 660 }); |
453 } else { | 661 } else { |
454 control.setRedraw(true); | 662 control.setRedraw(true); |
455 } | 663 } |
456 } | 664 } |
457 } | 665 } |
458 } | 666 } |
459 } | 667 } |
OLD | NEW |