diff options
author | Darin Wright | 2005-03-29 00:03:17 +0000 |
---|---|---|
committer | Darin Wright | 2005-03-29 00:03:17 +0000 |
commit | b36eef19245c0f76158f19c3101af78b5605ee06 (patch) | |
tree | ebea877b911be2678340d31d894a0f10bdf83595 | |
parent | 3e900867daa8c1c72f1af10adb32aad88fc15c03 (diff) | |
download | eclipse.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
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); + } + } } - } |