Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarin Wright2005-03-29 00:03:17 +0000
committerDarin Wright2005-03-29 00:03:17 +0000
commitb36eef19245c0f76158f19c3101af78b5605ee06 (patch)
treeebea877b911be2678340d31d894a0f10bdf83595
parent3e900867daa8c1c72f1af10adb32aad88fc15c03 (diff)
downloadeclipse.platform.debug-b36eef19245c0f76158f19c3101af78b5605ee06.tar.gz
eclipse.platform.debug-b36eef19245c0f76158f19c3101af78b5605ee06.tar.xz
eclipse.platform.debug-b36eef19245c0f76158f19c3101af78b5605ee06.zip
Bug 89293 - [Memory View] Selection problems in Memory View
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java10
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java28
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java256
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java9
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java23
5 files changed, 200 insertions, 126 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
index 6f9c190ce..e6a4397e4 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java
@@ -29,6 +29,7 @@ import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
@@ -340,7 +341,14 @@ public class AddMemoryRenderingDialog extends SelectionDialog {
currentBlock = lastAdded;
else
{
- ISelection selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IInternalDebugUIConstants.ID_MEMORY_VIEW); //$NON-NLS-1$
+ // take Memory View's selection if possible
+ ISelectionProvider selectionProvider = fSite.getSite().getSelectionProvider();
+ ISelection selection = null;
+
+ if (selectionProvider != null)
+ selection = selectionProvider.getSelection();
+ else // otherwise, take selection from selection service
+ selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IInternalDebugUIConstants.ID_MEMORY_VIEW); //$NON-NLS-1$
IDebugElement element = getMemoryBlock(selection);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
index 7f700c6f2..042bbd11e 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
@@ -27,6 +27,7 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
import org.eclipse.debug.internal.ui.views.memory.renderings.BasicDebugViewContentProvider;
import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.debug.ui.memory.IMemoryRendering;
import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
@@ -445,6 +446,33 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, IMemoryView
if (obj instanceof IDebugElement)
fTreeViewer.setInput(((IDebugElement)obj).getDebugTarget());
}
+
+ ISelection selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IInternalDebugUIConstants.ID_MEMORY_VIEW);
+ IMemoryBlock memoryBlock = getMemoryBlock(selection);
+
+ if (memoryBlock != null)
+ fTreeViewer.setSelection(new StructuredSelection(memoryBlock));
+ }
+
+ private IMemoryBlock getMemoryBlock(ISelection selection)
+ {
+ if (!(selection instanceof IStructuredSelection))
+ return null;
+
+ //only single selection of PICLDebugElements is allowed for this action
+ if (selection == null || selection.isEmpty() || ((IStructuredSelection)selection).size() > 1)
+ {
+ return null;
+ }
+
+ Object elem = ((IStructuredSelection)selection).getFirstElement();
+
+ if (elem instanceof IMemoryBlock)
+ return (IMemoryBlock)elem;
+ else if (elem instanceof IMemoryRendering)
+ return ((IMemoryRendering)elem).getMemoryBlock();
+ else
+ return null;
}
protected MenuManager createContextMenuManager() {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java
index 6b8efff24..0ac041308 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java
@@ -78,9 +78,6 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
* org.eclipse.debug.ui.MemoryView.RenderingViewPane.2. and so on.
* View pane are created from left to right by the Memory View.
*
- * Note: Currently, there is only one rendering view pane with id
- * org.eclipse.debug.ui.MemoryView.RenderingViewPane.1. Memory View is
- * equipped to host more than one rendering view pane.
*/
public RenderingViewPane(IViewPart parent) {
super(parent);
@@ -101,7 +98,7 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
{
IMemoryBlock memory = memoryBlocks[i];
- // create a tab folder when there is a new memory block
+ // if there is already and tab folder for this memory block, display it
if (fTabFolderForMemoryBlock.containsKey(memory)) {
if (fStackLayout.topControl != (TabFolder)fTabFolderForMemoryBlock.get(memory)) {
@@ -125,18 +122,24 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
else { //otherwise, add a new one
TabFolder folder = new TabFolder(fViewPaneCanvas, SWT.NULL);
- TabItem newItem = new TabItem(folder, SWT.NULL);
-
- CreateRendering rendering = new CreateRendering(this);
- rendering.init(this, memory);
- MemoryViewTab createTab = new MemoryViewTab(newItem, rendering, this);
-
- folder.setSelection(0);
-
fTabFolderForMemoryBlock.put(memory, folder);
fMemoryBlockFromTabFolder.put(folder, memory);
fTabFolderForDebugView.put(getMemoryBlockRetrieval(memory), folder);
+ // check renderings, only create if there is no rendering
+ IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memory);
+
+ MemoryViewTab createTab = null;
+ if (renderings.length == 0)
+ {
+ TabItem newItem = new TabItem(folder, SWT.NULL);
+ CreateRendering rendering = new CreateRendering(this);
+ rendering.init(this, memory);
+ createTab = new MemoryViewTab(newItem, rendering, this);
+ folder.setSelection(0);
+ }
+
+ // switch to tab folder if display is not pinned
if (fParent instanceof MemoryView)
{
MemoryView mv = (MemoryView)fParent;
@@ -144,13 +147,15 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
if (!mv.isPinMBDisplay() || mbs.length == 1)
{
setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory));
- setRenderingSelection(createTab.getRendering());
+ if (createTab != null)
+ setRenderingSelection(createTab.getRendering());
}
}
else
{
setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory));
- setRenderingSelection(createTab.getRendering());
+ if (createTab != null)
+ setRenderingSelection(createTab.getRendering());
}
fViewPaneCanvas.layout();
@@ -199,7 +204,7 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
(TabFolder) fTabFolderForMemoryBlock.get(memory);
if (tabFolder == null)
- return;
+ continue;
fTabFolderForMemoryBlock.remove(memory);
fMemoryBlockFromTabFolder.remove(tabFolder);
@@ -374,109 +379,94 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
Display.getDefault().syncExec(new Runnable()
{
- public void run()
- {
-
- // don't do anything if the debug target is already terminated
- if (memBlock.getDebugTarget().isDisconnected() ||
- memBlock.getDebugTarget().isTerminated())
- {
- emptyFolder();
- return;
- }
-
- // check current memory block
- TabFolder currentFolder = (TabFolder)fStackLayout.topControl;
- if (currentFolder != null && !currentFolder.isDisposed())
- {
- IMemoryBlock currentBlk = (IMemoryBlock)fMemoryBlockFromTabFolder.get(currentFolder);
- if (currentBlk != null)
- {
- if (currentBlk == memBlock)
+ public void run() {
+
+ // don't do anything if the debug target is already terminated
+ if (memBlock.getDebugTarget().isDisconnected()
+ || memBlock.getDebugTarget().isTerminated()) {
+ emptyFolder();
return;
- }
- }
-
- if (getTopMemoryTab() != null)
- {
- if (getTopMemoryTab().getRendering().getMemoryBlock() == memBlock)
- {
- return;
- }
- }
-
- //if we've got a tabfolder to go with the IMemoryBlock, display it
- if (fTabFolderForMemoryBlock.containsKey(memBlock)) {
- if (fStackLayout.topControl != (TabFolder)fTabFolderForMemoryBlock.get(memBlock)) {
- setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memBlock));
- fViewPaneCanvas.layout();
- }
- } else { //otherwise, add a new one
- TabFolder folder = new TabFolder(fViewPaneCanvas, SWT.NULL);
-
- fTabFolderForMemoryBlock.put(memBlock, folder);
- fMemoryBlockFromTabFolder.put(folder, memBlock);
- setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memBlock));
- fViewPaneCanvas.layout();
- }
-
- // remember this memory block for this memory block retrieval
- fTabFolderForDebugView.put(getMemoryBlockRetrieval(memBlock), fTabFolderForMemoryBlock.get(memBlock));
-
- // restore view tabs
- IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memBlock);
- TabFolder toDisplay = (TabFolder)fStackLayout.topControl;
-
- // remember tab folder for current debug target
- fTabFolderForDebugView.put(getMemoryBlockRetrieval(memBlock), toDisplay);
-
- if (toDisplay.getItemCount() == 0)
- {
- restoreViewTabs(renderings);
- }
-
- // disable last view tab as it becomes hidden
- IMemoryViewTab newViewTab = getTopMemoryTab();
+ }
- if (lastViewTab != null && lastViewTab != newViewTab)
- {
- lastViewTab.setEnabled(false);
- }
+ // check current memory block
+ TabFolder currentFolder = (TabFolder) fStackLayout.topControl;
+ if (currentFolder != null && !currentFolder.isDisposed()) {
+ IMemoryBlock currentBlk = (IMemoryBlock) fMemoryBlockFromTabFolder.get(currentFolder);
+ if (currentBlk != null) {
+ if (currentBlk == memBlock)
+ return;
+ }
+ }
- if (newViewTab != null)
- {
- // if new view tab is not already enabled, enable it
- if (!newViewTab.isEnabled())
- {
- // if the view tab is visible, enable it
- if (fVisible)
- {
- newViewTab.setEnabled(fVisible);
- }
- }
- }
-
- IMemoryViewTab viewTab = getTopMemoryTab();
- if (viewTab != null)
- setRenderingSelection(viewTab.getRendering());
-
- if (viewTab == null)
- {
- // do not ever want to put it on the empty folder
- if (toDisplay != fEmptyTabFolder)
- {
- TabItem newItem = new TabItem(toDisplay, SWT.NULL);
- CreateRendering rendering = new CreateRendering(getInstance());
- rendering.init(getInstance(), memBlock);
- MemoryViewTab createTab = new MemoryViewTab(newItem, rendering, getInstance());
-
- setRenderingSelection(createTab.getRendering());
+ if (getTopMemoryTab() != null) {
+ if (getTopMemoryTab().getRendering().getMemoryBlock() == memBlock) {
+ return;
+ }
+ }
+
+ // if we've got a tabfolder to go with the IMemoryBlock, display
+ // it
+ if (fTabFolderForMemoryBlock.containsKey(memBlock)) {
+ if (fStackLayout.topControl != (TabFolder) fTabFolderForMemoryBlock.get(memBlock)) {
+ setTabFolder((TabFolder) fTabFolderForMemoryBlock.get(memBlock));
+ fViewPaneCanvas.layout();
+ }
+ } else { // otherwise, add a new one
+ TabFolder folder = new TabFolder(fViewPaneCanvas, SWT.NULL);
+
+ fTabFolderForMemoryBlock.put(memBlock, folder);
+ fMemoryBlockFromTabFolder.put(folder, memBlock);
+ setTabFolder((TabFolder) fTabFolderForMemoryBlock.get(memBlock));
+ fViewPaneCanvas.layout();
+ }
+
+ // restore view tabs
+ IMemoryRendering[] renderings = fRenderingMgr.getRenderingsFromMemoryBlock(memBlock);
+ TabFolder toDisplay = (TabFolder) fStackLayout.topControl;
+
+ // remember tab folder for current debug target
+ fTabFolderForDebugView.put(getMemoryBlockRetrieval(memBlock),toDisplay);
+
+ if (toDisplay.getItemCount() == 0) {
+ restoreViewTabs(renderings);
+ }
+
+ // disable last view tab as it becomes hidden
+ IMemoryViewTab newViewTab = getTopMemoryTab();
+
+ if (lastViewTab != null && lastViewTab != newViewTab) {
+ lastViewTab.setEnabled(false);
+ }
+
+ if (newViewTab != null) {
+ // if new view tab is not already enabled, enable it
+ if (!newViewTab.isEnabled()) {
+ // if the view tab is visible, enable it
+ if (fVisible) {
+ newViewTab.setEnabled(fVisible);
+ }
+ }
+ }
+
+ IMemoryViewTab viewTab = getTopMemoryTab();
+ if (viewTab != null)
+ setRenderingSelection(viewTab.getRendering());
+
+ if (viewTab == null) {
+ // do not ever want to put it on the empty folder
+ if (toDisplay != fEmptyTabFolder) {
+ TabItem newItem = new TabItem(toDisplay, SWT.NULL);
+ CreateRendering rendering = new CreateRendering(getInstance());
+ rendering.init(getInstance(), memBlock);
+ MemoryViewTab createTab = new MemoryViewTab(newItem,rendering, getInstance());
+ setRenderingSelection(createTab.getRendering());
+ }
+ }
+
+ //set toolbar actions enabled/disabled
+ updateToolBarActionsEnablement();
}
- }
-
- //set toolbar actions enabled/disabled
- updateToolBarActionsEnablement();
- }});
+ });
}
public void memoryBlockRenderingAdded(IMemoryRendering rendering) {
@@ -614,13 +604,19 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
{
if (tabFolder != fEmptyTabFolder)
{
- TabItem newItem = new TabItem(tabFolder, SWT.NULL);
- CreateRendering createRendering = new CreateRendering(getInstance());
- createRendering.init(getInstance(), memory);
+ IDebugTarget target = memory.getDebugTarget();
- MemoryViewTab viewTab = new MemoryViewTab(newItem, createRendering, getInstance());
- tabFolder.setSelection(0);
- setRenderingSelection(viewTab.getRendering());
+ // do not create if the target is already terminated or if the memory block is removed
+ if (!target.isDisconnected() && !target.isTerminated() && !isMeomryBlockRemoved(memory))
+ {
+ TabItem newItem = new TabItem(tabFolder, SWT.NULL);
+ CreateRendering createRendering = new CreateRendering(getInstance());
+ createRendering.init(getInstance(), memory);
+
+ MemoryViewTab viewTab = new MemoryViewTab(newItem, createRendering, getInstance());
+ tabFolder.setSelection(0);
+ setRenderingSelection(viewTab.getRendering());
+ }
}
}
@@ -631,6 +627,26 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory
}
/**
+ * @param memoryBlock
+ * @return if this memory block is removed
+ */
+ private boolean isMeomryBlockRemoved(IMemoryBlock memoryBlock)
+ {
+ IMemoryBlockRetrieval retrieval = getMemoryBlockRetrieval(memoryBlock);
+ IMemoryBlock[] memoryBlocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks(retrieval);
+ boolean removed = true;
+
+ for (int i=0; i<memoryBlocks.length; i++)
+ {
+ if (memoryBlocks[i] == memoryBlock)
+ removed = false;
+ }
+
+ return removed;
+ }
+
+
+ /**
* @param viewTab
*/
protected void setRenderingSelection(IMemoryRendering rendering) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
index 244212667..721fcba38 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java
@@ -213,8 +213,6 @@ public class CreateRendering extends AbstractMemoryRendering implements IMemoryR
addRenderings();
}});
- addButton.setFocus();
-
DebugUITools.getMemoryRenderingManager().addListener(this);
return fCanvas;
@@ -253,6 +251,9 @@ public class CreateRendering extends AbstractMemoryRendering implements IMemoryR
if (standardMemRetrieval == null)
return;
+
+ // make a copy of the container, may be diposed when a rendering is added
+ IMemoryRenderingContainer container = fContainer;
// add memory renderings to Memory Rendering Manager
for (int i=0; i<renderings.length; i++)
{
@@ -262,8 +263,8 @@ public class CreateRendering extends AbstractMemoryRendering implements IMemoryR
IMemoryRendering rendering = ((IMemoryRenderingType)renderings[i]).createRendering();
if (rendering != null)
{
- rendering.init(fContainer, getMemoryBlock());
- fContainer.addMemoryRendering(rendering);
+ rendering.init(container, getMemoryBlock());
+ container.addMemoryRendering(rendering);
}
} catch (CoreException e) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java
index 7bfad472f..683eb2a90 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/GoToAddressAction.java
@@ -23,11 +23,13 @@ import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.views.memory.MemoryView;
import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.memory.AbstractTableRendering;
import org.eclipse.debug.ui.memory.IMemoryRendering;
+import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
import org.eclipse.debug.ui.memory.IMemoryRenderingType;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
@@ -168,6 +170,7 @@ public class GoToAddressAction extends Action
{
ISelection selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_DEBUG_VIEW);
Object elem = ((IStructuredSelection)selection).getFirstElement();
+ boolean pin = true;
if (!(elem instanceof IDebugElement))
return;
@@ -175,6 +178,15 @@ public class GoToAddressAction extends Action
try {
if (retrieval != null)
{
+ // save the pin setting in the parent view
+ IMemoryRenderingSite site = fRendering.getMemoryRenderingContainer().getMemoryRenderingSite();
+ if (site instanceof MemoryView)
+ {
+ MemoryView view = (MemoryView)site;
+ pin = view.isPinMBDisplay();
+ view.setPinMBDisplay(false);
+ }
+
IMemoryBlockExtension mbext = retrieval.getExtendedMemoryBlock(expression, elem);
if (mbext != null)
DebugPlugin.getDefault().getMemoryBlockManager().addMemoryBlocks(new IMemoryBlock[]{mbext});
@@ -200,6 +212,15 @@ public class GoToAddressAction extends Action
MemoryViewUtil.openError(DebugUIMessages.getString(GO_TO_ADDRESS_FAILED),
DebugUIMessages.getString(GO_TO_ADDRESS_FAILED), e);
}
+ finally
+ {
+ // restore setting
+ IMemoryRenderingSite site = fRendering.getMemoryRenderingContainer().getMemoryRenderingSite();
+ if (site instanceof MemoryView)
+ {
+ MemoryView view = (MemoryView)site;
+ view.setPinMBDisplay(pin);
+ }
+ }
}
-
}

Back to the top