Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawel Piech2012-02-23 00:30:07 +0000
committerPawel Piech2012-02-23 00:35:40 +0000
commit34308a56094410da5a071c1736f8a0019e00c9d5 (patch)
tree863ebaa80f8151772915675c3eb7bb8e8f8f8ca4
parent5952f49fa60c398ebd0dec4ecd6bf97e4803366e (diff)
downloadeclipse.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
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/debug_view_auto.gifbin0 -> 380 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/debug_view_tree.gifbin0 -> 395 bytes
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java98
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/VirtualItem.java6
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewCopyToClipboardActionDelegate.java49
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
new file mode 100644
index 000000000..3fe45fe64
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_auto.gif
Binary files differ
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
new file mode 100644
index 000000000..f2445808a
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/debug_view_tree.gif
Binary files differ
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());
+ }
+ }
}
}

Back to the top