diff options
author | Pawel Piech | 2012-02-23 00:30:07 +0000 |
---|---|---|
committer | Pawel Piech | 2012-02-23 00:35:40 +0000 |
commit | 34308a56094410da5a071c1736f8a0019e00c9d5 (patch) | |
tree | 863ebaa80f8151772915675c3eb7bb8e8f8f8ca4 | |
parent | 5952f49fa60c398ebd0dec4ecd6bf97e4803366e (diff) | |
download | eclipse.platform.debug-34308a56094410da5a071c1736f8a0019e00c9d5.tar.gz eclipse.platform.debug-34308a56094410da5a071c1736f8a0019e00c9d5.tar.xz eclipse.platform.debug-34308a56094410da5a071c1736f8a0019e00c9d5.zip |
Bug 370973 - [debug view] Copying a thread in the 'Debug' view no longer copies the stack trace like 3.7.x
5 files changed, 79 insertions, 74 deletions
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/debug_view_auto.gif b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_auto.gif Binary files differnew file mode 100644 index 000000000..3fe45fe64 --- /dev/null +++ b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_auto.gif diff --git a/org.eclipse.debug.ui/icons/full/elcl16/debug_view_tree.gif b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_tree.gif Binary files differnew file mode 100644 index 000000000..f2445808a --- /dev/null +++ b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_tree.gif diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java index cbe876009..51502945c 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java @@ -23,13 +23,10 @@ import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.actions.AbstractDebugActionDelegate; import org.eclipse.debug.internal.ui.actions.ActionMessages; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IVirtualItemListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.IVirtualItemValidator; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; @@ -61,64 +58,52 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel private static final String TAB = "\t"; //$NON-NLS-1$ private static final String SEPARATOR = "line.separator"; //$NON-NLS-1$ - private class VirtualViewerListener implements IViewerUpdateListener, ILabelUpdateListener { + /** + * Virtual viewer listener. It tracks progress of copy and increments + * the progress monitor. + */ + private class VirtualViewerListener implements ILabelUpdateListener, IVirtualItemListener { - private IProgressMonitor fProgressMonitor; - private int fRemainingUpdatesCount; - private boolean fViewerUpdatesComplete; - private boolean fLabelUpdatesComplete; - private int fSelectionRootDepth; + VirtualTreeModelViewer fVirtualViewer; + IProgressMonitor fProgressMonitor; + int fSelectionRootDepth; + Set fItemsToUpdate; public void labelUpdateStarted(ILabelUpdate update) {} public void labelUpdateComplete(ILabelUpdate update) { - incrementProgress(1); + VirtualItem updatedItem = fVirtualViewer.findItem(update.getElementPath()); + if (fItemsToUpdate.remove(updatedItem)) { + incrementProgress(1); + } } public void labelUpdatesBegin() { - fLabelUpdatesComplete = false; } public void labelUpdatesComplete() { - fLabelUpdatesComplete = true; - completeProgress(); } - public void updateStarted(IViewerUpdate update) {} - public void updateComplete(IViewerUpdate update) { - if (update instanceof IChildrenUpdate) { - incrementProgress(((IChildrenUpdate)update).getLength()); - } - } - public void viewerUpdatesBegin() { - fViewerUpdatesComplete = false; - } - public void viewerUpdatesComplete() { - fViewerUpdatesComplete = true; - completeProgress(); + public void revealed(VirtualItem item) { } - private void completeProgress() { - IProgressMonitor pm; - synchronized (VirtualCopyToClipboardActionDelegate.this) { - pm = fProgressMonitor; - } - if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { - pm.done(); - } + public void disposed(VirtualItem item) { + if (fItemsToUpdate.remove(item)) { + incrementProgress(1); + } } private void incrementProgress(int count) { IProgressMonitor pm; synchronized (VirtualCopyToClipboardActionDelegate.this) { pm = fProgressMonitor; - fRemainingUpdatesCount -= count; } - if (pm != null && fLabelUpdatesComplete && fViewerUpdatesComplete) { + if (pm != null) { pm.worked(count); - } + if (fItemsToUpdate.isEmpty()) { + pm.done(); + } + } } - } - /** * @see AbstractDebugActionDelegate#initialize(IAction, ISelection) */ @@ -163,10 +148,9 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel buffer.append(System.getProperty(SEPARATOR)); } } - + private IPresentationContext makeVirtualPresentationContext(final IPresentationContext clientViewerContext) { return new PresentationContext(clientViewerContext.getId()) { - { String[] clientProperties = clientViewerContext.getProperties(); for (int i = 0; i < clientProperties.length; i++) { @@ -195,22 +179,6 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel }; } - private int calcUpdatesCount(IModelDelta stateDelta) { - final int[] count = new int[] {0}; - stateDelta.accept( new IModelDeltaVisitor() { - public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & (IModelDelta.EXPAND | IModelDelta.SELECT)) != 0) { - count[0]++; - return true; - } - return false; - } - }); - - // Double it to account for separate element and label update ticks. - return count[0] * 2; - } - private class ItemsToCopyVirtualItemValidator implements IVirtualItemValidator { Set fItemsToCopy = Collections.EMPTY_SET; @@ -240,20 +208,19 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel Object input = clientViewer.getInput(); ModelDelta stateDelta = new ModelDelta(input, IModelDelta.NO_CHANGE); clientViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND); - listener.fRemainingUpdatesCount = calcUpdatesCount(stateDelta); VirtualTreeModelViewer virtualViewer = new VirtualTreeModelViewer( clientViewer.getDisplay(), SWT.VIRTUAL, makeVirtualPresentationContext(clientViewer.getPresentationContext()), validator); - virtualViewer.addViewerUpdateListener(listener); virtualViewer.addLabelUpdateListener(listener); + virtualViewer.getTree().addItemListener(listener); virtualViewer.setInput(input); virtualViewer.updateViewer(stateDelta); // Parse selected items from client viewer and add them to the virtual viewer selection. listener.fSelectionRootDepth = Integer.MAX_VALUE; - TreeItem[] selection = clientViewer.getTree().getSelection(); + TreeItem[] selection = getSelectedItems(clientViewer); Set vSelection = new HashSet(selection.length * 4/3); for (int i = 0; i < selection.length; i++) { TreePath parentPath = fClientViewer.getTreePathFromItem(selection[i].getParentItem()); @@ -269,12 +236,10 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel index = parentTree.indexOf(selection[i]); } vSelection.add( parentVItem.getItem(new Index(index)) ); - if (!selection[i].getExpanded()) { - listener.fRemainingUpdatesCount += 2; - } } } validator.setItemsToCopy(vSelection); + listener.fItemsToUpdate = new HashSet(vSelection); virtualViewer.getTree().validate(); return virtualViewer; } @@ -296,6 +261,7 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel final VirtualViewerListener listener = new VirtualViewerListener(); ItemsToCopyVirtualItemValidator validator = new ItemsToCopyVirtualItemValidator(); VirtualTreeModelViewer virtualViewer = initVirtualViewer(fClientViewer, listener, validator); + listener.fVirtualViewer = virtualViewer; ProgressMonitorDialog dialog = new TimeTriggeredProgressMonitorDialog(fClientViewer.getControl().getShell(), 500); final IProgressMonitor monitor = dialog.getProgressMonitor(); @@ -305,10 +271,10 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException { synchronized(listener) { listener.fProgressMonitor = m; - listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fRemainingUpdatesCount); + listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size()); } - while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) { + while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) { Thread.sleep(1); } synchronized(listener) { @@ -330,7 +296,7 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel } virtualViewer.removeLabelUpdateListener(listener); - virtualViewer.removeViewerUpdateListener(listener); + virtualViewer.getTree().removeItemListener(listener); virtualViewer.dispose(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java index c6a71d01a..2404db9b3 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java @@ -370,9 +370,9 @@ public class VirtualItem { Map.Entry entry = (Map.Entry)itr.next(); int index = ((Index)entry.getKey()).intValue(); if (index >= count) { - itr.remove(); VirtualItem item = (VirtualItem)entry.getValue(); item.dispose(); + itr.remove(); } } if (fItemCount == 0) { @@ -526,9 +526,9 @@ public class VirtualItem { buffer.append("\n"); indent = indent + " "; for (int i = 0; i < fItemCount; i++) { - VirtualItem item = (VirtualItem)fItems.get(new Integer(i)); + VirtualItem item = (VirtualItem)fItems.get(new Index(i)); if (item != null) { - toStringItem(buffer, indent); + item.toStringItem(buffer, indent); } else { buffer.append("<no item>\n"); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewCopyToClipboardActionDelegate.java index 8616af0a8..dbed5e238 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewCopyToClipboardActionDelegate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewCopyToClipboardActionDelegate.java @@ -10,6 +10,9 @@ *******************************************************************************/ package org.eclipse.debug.internal.ui.views.launch; +import java.util.HashSet; +import java.util.Set; + import org.eclipse.debug.internal.ui.viewers.model.VirtualCopyToClipboardActionDelegate; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.jface.viewers.ISelection; @@ -20,6 +23,15 @@ import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; /** + * Copy action for debug view. This action is specialized from the standard + * copy action in a couple of ways: + * <ul> + * <li>If debug view is in debug mode, then the selected element in + * breadcrumb is translated into the tree viewer, and then copied</li> + * <li> If an item is selected all the item's children are copied into + * clipbard.</li> + * </ul> + * * @since 3.5 */ public class LaunchViewCopyToClipboardActionDelegate extends VirtualCopyToClipboardActionDelegate { @@ -37,17 +49,44 @@ public class LaunchViewCopyToClipboardActionDelegate extends VirtualCopyToClipbo } return new TreeItem[0]; } else { - return super.getSelectedItems(clientViewer); + // Return tree selection plus children. + TreeItem[] selection = clientViewer.getTree().getSelection(); + Set set = new HashSet(); + collectChildItems(set, selection); + return (TreeItem[])set.toArray(new TreeItem[set.size()]); } } - + + /** + * Calculates selected items in viewer for given tree path. + * @param viewer Viewer to get items from. + * @param path Path for desired selection. + * @return Selected items. If no selected items found, returns an empty + * array. + */ private TreeItem[] getSelectedItemsInTreeViewer(TreeModelViewer viewer, TreePath path) { Widget item = viewer.findItem(path); + Set set = new HashSet(); if (item instanceof TreeItem) { - return new TreeItem[] { (TreeItem)item }; + set.add(item); + if (((TreeItem) item).getExpanded()) { + collectChildItems(set, ((TreeItem) item).getItems()); + } } else if (item instanceof Tree) { - return ((Tree)item).getItems(); + collectChildItems(set, ((Tree)item).getItems()); } - return new TreeItem[0]; + return (TreeItem[])set.toArray(new TreeItem[set.size()]); + } + + private void collectChildItems(Set set, TreeItem[] items) { + if (items == null) { + return; + } + for (int i = 0; i < items.length; i++) { + set.add(items[i]); + if (items[i].getExpanded()) { + collectChildItems(set, items[i].getItems()); + } + } } } |