33 package org.openjdk.jmc.flightrecorder.ui;
34
35 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_COPY;
36 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_DELETE;
37 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_PASTE;
38
39 import java.util.List;
40
41 import org.eclipse.jface.action.Action;
42 import org.eclipse.jface.action.IAction;
43 import org.eclipse.jface.action.IMenuManager;
44 import org.eclipse.jface.action.MenuManager;
45 import org.eclipse.jface.dialogs.MessageDialog;
46 import org.eclipse.jface.resource.ImageDescriptor;
47 import org.eclipse.jface.util.IPropertyChangeListener;
48 import org.eclipse.jface.util.LocalSelectionTransfer;
49 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
50 import org.eclipse.jface.viewers.ISelection;
51 import org.eclipse.jface.viewers.IStructuredSelection;
52 import org.eclipse.jface.viewers.ITreeContentProvider;
53 import org.eclipse.jface.viewers.SelectionChangedEvent;
54 import org.eclipse.jface.viewers.StructuredSelection;
55 import org.eclipse.jface.viewers.TreeViewer;
56 import org.eclipse.jface.viewers.Viewer;
57 import org.eclipse.jface.viewers.ViewerDropAdapter;
58 import org.eclipse.swt.SWT;
59 import org.eclipse.swt.dnd.DND;
60 import org.eclipse.swt.dnd.DragSourceAdapter;
61 import org.eclipse.swt.dnd.DragSourceEvent;
62 import org.eclipse.swt.dnd.Transfer;
63 import org.eclipse.swt.dnd.TransferData;
64 import org.eclipse.swt.graphics.Image;
65 import org.eclipse.swt.widgets.Composite;
66 import org.eclipse.swt.widgets.Display;
67 import org.eclipse.ui.IActionBars;
68 import org.eclipse.ui.PlatformUI;
69 import org.eclipse.ui.part.IPageSite;
70 import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
71
72 import org.openjdk.jmc.flightrecorder.ui.messages.internal.Messages;
73 import org.openjdk.jmc.flightrecorder.ui.pages.itemhandler.ItemHandlerPage;
308 mm.appendToGroup(MCContextMenuManager.GROUP_NEW, createNewPageMenuManager());
309 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
310 ActionToolkit.action(() -> moveSelectedLeft(true), Messages.JFR_OUTLINE_MOVE_LEFT));
311 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
312 ActionToolkit.action(() -> moveSelectedLeft(false), Messages.JFR_OUTLINE_MOVE_RIGHT));
313 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
314 ActionToolkit.action(() -> moveSelectedUp(true), Messages.JFR_OUTLINE_MOVE_UP));
315 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
316 ActionToolkit.action(() -> moveSelectedUp(false), Messages.JFR_OUTLINE_MOVE_DOWN));
317 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, copyAction);
318 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, pasteAction);
319 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, deleteAction);
320 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
321 ActionToolkit.action(this::resetSelected, Messages.JFR_OUTLINE_RESET_ACTION, RESET_ICON));
322
323 ab.getMenuManager().add(createNewPageMenuManager());
324 ab.getToolBarManager().add(PAGE_STRUCTURE_LOCK_ACTION);
325 ab.getToolBarManager().add(RESET_ALL_PAGES_ACTION);
326
327 getTreeViewer().addDoubleClickListener(e -> expandSelected());
328
329 ColumnViewerToolTipSupport.enableFor(getTreeViewer());
330
331 getTreeViewer().addDragSupport(DND_OPERATIONS, DND_TRANSFER, new OutlineDragListener());
332 getTreeViewer().addDropSupport(DND_OPERATIONS, DND_TRANSFER, new OutlineDropListener(getTreeViewer()));
333
334 /*
335 * Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=438919
336 *
337 * This bug was introduced in Eclipse 3.6 M6, fixed in 3.6 RC4, reintroduced in 4.4.0, fixed
338 * in 4.4.1.
339 *
340 * While ContentViewer keeps its input in a private field, AbstractTreeViewer.inputChanged()
341 * also stores the root tree element derived from (and often the same as) the input using
342 * Widget.setData() on the tree, without using a key. This allows unified translation from a
343 * widget (Tree or TreeItem) to the corresponding tree element by using getData(),
344 * simplifying code.
345 *
346 * However, in Eclipse 4.4.0, PageBookView.createPage() also uses Widget.setData() without
347 * key on the topmost control of the page to store a ContributionInfo (used by the
422 FlightRecorderUI.getDefault().getPageManager().makeSibling(dpd, dpd, up ? -1 : 2);
423 }
424 }
425
426 private void moveSelectedLeft(boolean left) {
427 Object selected = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
428 if (selected instanceof DataPageDescriptor) {
429 DataPageDescriptor dpd = (DataPageDescriptor) selected;
430 if (!left) {
431 FlightRecorderUI.getDefault().getPageManager().makeChild(dpd, dpd, -1);
432 } else if (dpd.getParent() != null) {
433 FlightRecorderUI.getDefault().getPageManager().makeSibling(dpd, dpd.getParent(), 1);
434 }
435 }
436 }
437
438 private void expandSelected() {
439 Object selected = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
440 if (selected != null) {
441 getTreeViewer().setExpandedState(selected, !getTreeViewer().getExpandedState(selected));
442 }
443 }
444
445 @Override
446 public void selectionChanged(SelectionChangedEvent event) {
447 Object selected = (((IStructuredSelection) event.getSelection()).getFirstElement());
448 if (selected != null) {
449 editor.navigateTo((DataPageDescriptor) selected);
450 }
451 }
452
453 @Override
454 protected int getTreeStyle() {
455 return SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER;
456 }
457
458 @Override
459 public void dispose() {
460 FlightRecorderUI.getDefault().getPreferenceStore().removePropertyChangeListener(analysisEnabledListener);
461 super.dispose();
462 }
463
464 void refresh() {
465 refresh(false);
466 }
467
468 private void refresh(boolean forceRefreshPages) {
469 TreeViewer tv = getTreeViewer();
|
33 package org.openjdk.jmc.flightrecorder.ui;
34
35 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_COPY;
36 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_DELETE;
37 import static org.eclipse.ui.IWorkbenchCommandConstants.EDIT_PASTE;
38
39 import java.util.List;
40
41 import org.eclipse.jface.action.Action;
42 import org.eclipse.jface.action.IAction;
43 import org.eclipse.jface.action.IMenuManager;
44 import org.eclipse.jface.action.MenuManager;
45 import org.eclipse.jface.dialogs.MessageDialog;
46 import org.eclipse.jface.resource.ImageDescriptor;
47 import org.eclipse.jface.util.IPropertyChangeListener;
48 import org.eclipse.jface.util.LocalSelectionTransfer;
49 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
50 import org.eclipse.jface.viewers.ISelection;
51 import org.eclipse.jface.viewers.IStructuredSelection;
52 import org.eclipse.jface.viewers.ITreeContentProvider;
53 import org.eclipse.jface.viewers.StructuredSelection;
54 import org.eclipse.jface.viewers.TreeViewer;
55 import org.eclipse.jface.viewers.Viewer;
56 import org.eclipse.jface.viewers.ViewerDropAdapter;
57 import org.eclipse.swt.SWT;
58 import org.eclipse.swt.dnd.DND;
59 import org.eclipse.swt.dnd.DragSourceAdapter;
60 import org.eclipse.swt.dnd.DragSourceEvent;
61 import org.eclipse.swt.dnd.Transfer;
62 import org.eclipse.swt.dnd.TransferData;
63 import org.eclipse.swt.graphics.Image;
64 import org.eclipse.swt.widgets.Composite;
65 import org.eclipse.swt.widgets.Display;
66 import org.eclipse.ui.IActionBars;
67 import org.eclipse.ui.PlatformUI;
68 import org.eclipse.ui.part.IPageSite;
69 import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
70
71 import org.openjdk.jmc.flightrecorder.ui.messages.internal.Messages;
72 import org.openjdk.jmc.flightrecorder.ui.pages.itemhandler.ItemHandlerPage;
307 mm.appendToGroup(MCContextMenuManager.GROUP_NEW, createNewPageMenuManager());
308 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
309 ActionToolkit.action(() -> moveSelectedLeft(true), Messages.JFR_OUTLINE_MOVE_LEFT));
310 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
311 ActionToolkit.action(() -> moveSelectedLeft(false), Messages.JFR_OUTLINE_MOVE_RIGHT));
312 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
313 ActionToolkit.action(() -> moveSelectedUp(true), Messages.JFR_OUTLINE_MOVE_UP));
314 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
315 ActionToolkit.action(() -> moveSelectedUp(false), Messages.JFR_OUTLINE_MOVE_DOWN));
316 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, copyAction);
317 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, pasteAction);
318 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, deleteAction);
319 mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
320 ActionToolkit.action(this::resetSelected, Messages.JFR_OUTLINE_RESET_ACTION, RESET_ICON));
321
322 ab.getMenuManager().add(createNewPageMenuManager());
323 ab.getToolBarManager().add(PAGE_STRUCTURE_LOCK_ACTION);
324 ab.getToolBarManager().add(RESET_ALL_PAGES_ACTION);
325
326 getTreeViewer().addDoubleClickListener(e -> expandSelected());
327 getTreeViewer().addPostSelectionChangedListener((event) -> {
328 Object selected = (((IStructuredSelection) event.getSelection()).getFirstElement());
329 if (selected != null) {
330 editor.navigateTo((DataPageDescriptor) selected);
331 }
332 });
333
334 ColumnViewerToolTipSupport.enableFor(getTreeViewer());
335
336 getTreeViewer().addDragSupport(DND_OPERATIONS, DND_TRANSFER, new OutlineDragListener());
337 getTreeViewer().addDropSupport(DND_OPERATIONS, DND_TRANSFER, new OutlineDropListener(getTreeViewer()));
338
339 /*
340 * Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=438919
341 *
342 * This bug was introduced in Eclipse 3.6 M6, fixed in 3.6 RC4, reintroduced in 4.4.0, fixed
343 * in 4.4.1.
344 *
345 * While ContentViewer keeps its input in a private field, AbstractTreeViewer.inputChanged()
346 * also stores the root tree element derived from (and often the same as) the input using
347 * Widget.setData() on the tree, without using a key. This allows unified translation from a
348 * widget (Tree or TreeItem) to the corresponding tree element by using getData(),
349 * simplifying code.
350 *
351 * However, in Eclipse 4.4.0, PageBookView.createPage() also uses Widget.setData() without
352 * key on the topmost control of the page to store a ContributionInfo (used by the
427 FlightRecorderUI.getDefault().getPageManager().makeSibling(dpd, dpd, up ? -1 : 2);
428 }
429 }
430
431 private void moveSelectedLeft(boolean left) {
432 Object selected = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
433 if (selected instanceof DataPageDescriptor) {
434 DataPageDescriptor dpd = (DataPageDescriptor) selected;
435 if (!left) {
436 FlightRecorderUI.getDefault().getPageManager().makeChild(dpd, dpd, -1);
437 } else if (dpd.getParent() != null) {
438 FlightRecorderUI.getDefault().getPageManager().makeSibling(dpd, dpd.getParent(), 1);
439 }
440 }
441 }
442
443 private void expandSelected() {
444 Object selected = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
445 if (selected != null) {
446 getTreeViewer().setExpandedState(selected, !getTreeViewer().getExpandedState(selected));
447 }
448 }
449
450 @Override
451 protected int getTreeStyle() {
452 return SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER;
453 }
454
455 @Override
456 public void dispose() {
457 FlightRecorderUI.getDefault().getPreferenceStore().removePropertyChangeListener(analysisEnabledListener);
458 super.dispose();
459 }
460
461 void refresh() {
462 refresh(false);
463 }
464
465 private void refresh(boolean forceRefreshPages) {
466 TreeViewer tv = getTreeViewer();
|