diff options
author | Darin Wright | 2005-03-24 20:25:03 +0000 |
---|---|---|
committer | Darin Wright | 2005-03-24 20:25:03 +0000 |
commit | e3a721b960b8c9b19c3b40eb9359227d36f5f900 (patch) | |
tree | bf2b0c1a11c2514a834ec0c186facf4d04458730 | |
parent | fff23d64abf936f48ac0894022add43cdc6af84b (diff) | |
download | eclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.tar.gz eclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.tar.xz eclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.zip |
Bug 82245 - Multiple memory views
12 files changed, 518 insertions, 148 deletions
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif b/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif Binary files differnew file mode 100644 index 000000000..fc06a2d63 --- /dev/null +++ b/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif diff --git a/org.eclipse.debug.ui/icons/full/elcl16/pin.gif b/org.eclipse.debug.ui/icons/full/elcl16/pin.gif Binary files differnew file mode 100644 index 000000000..cd9bc9cb6 --- /dev/null +++ b/org.eclipse.debug.ui/icons/full/elcl16/pin.gif diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties index e86e91d72..dccc034e5 100644 --- a/org.eclipse.debug.ui/plugin.properties +++ b/org.eclipse.debug.ui/plugin.properties @@ -332,4 +332,6 @@ SetPaddedStrActionName = Set Padded String ... DropToFrameAction.label=Drop to Frame DropToFrameAction.tooltip=Drop to Frame -SelectCodepagesAction.label = Select Codepages...
\ No newline at end of file +SelectCodepagesAction.label=Select Codepages... +NewMemoryViewAction.label=New Memory View +PinMemoryBlockAction.label=Pin Memory Monitor
\ No newline at end of file diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml index 3ccd92ba1..78b825bb8 100644 --- a/org.eclipse.debug.ui/plugin.xml +++ b/org.eclipse.debug.ui/plugin.xml @@ -108,11 +108,12 @@ id="org.eclipse.debug.ui.RegisterView"> </view> <view - name="%MemoryViewName" - icon="icons/full/eview16/memory_view.gif" + allowMultiple="true" category="org.eclipse.debug.ui" class="org.eclipse.debug.internal.ui.views.memory.MemoryView" - id="org.eclipse.debug.ui.MemoryView"> + icon="icons/full/eview16/memory_view.gif" + id="org.eclipse.debug.ui.MemoryView" + name="%MemoryViewName"> </view> </extension> <extension @@ -839,6 +840,25 @@ targetID="org.eclipse.debug.ui.MemoryView" id="org.eclipse.debug.ui.memoryView.toolbar"> <action + class="org.eclipse.debug.internal.ui.views.memory.PinMemoryBlockAction" + helpContextId="PinMemoryBlockAction_context" + icon="icons/full/elcl16/pin.gif" + id="org.eclipse.debug.ui.PinMemoryBlockAction" + label="%PinMemoryBlockAction.label " + state="true" + style="toggle" + toolbarPath="additions" + tooltip="%PinMemoryBlockAction.label "/> + <action + class="org.eclipse.debug.internal.ui.views.memory.NewMemoryViewAction" + helpContextId="NewMemoryViewAction_context" + icon="icons/full/elcl16/new_con.gif" + id="org.eclipse.debug.ui.NewMemoryViewAction" + label="%NewMemoryViewAction.label" + style="push" + toolbarPath="additions" + tooltip="%NewMemoryViewAction.label"/> + <action disabledIcon="icons/full/dlcl16/var_cntnt_prvdr.gif" hoverIcon="icons/full/elcl16/var_cntnt_prvdr.gif" toolbarPath="MemoryMonitorsGroup" diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java index df83d4a65..0f0be8ec5 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java @@ -133,137 +133,139 @@ public class AddMemoryBlockAction extends Action implements ISelectionListener, */ public void run() { - // get current selection from Debug View - ISelection selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_DEBUG_VIEW); - Object elem = ((IStructuredSelection)selection).getFirstElement(); - - if (!(elem instanceof IDebugElement)) - return; - - - // ask debug element about memeory retrieval - IDebugTarget debugTarget = ((IDebugElement)elem).getDebugTarget(); - IMemoryBlockRetrieval standardMemRetrieval = (IMemoryBlockRetrieval)((IDebugElement)elem).getAdapter(IMemoryBlockRetrieval.class); - - if (standardMemRetrieval == null) - { - // if getAdapter returns null, assume debug target as memory block retrieval - standardMemRetrieval = debugTarget; - } - - if (standardMemRetrieval == null) - return; - - Shell shell= DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); - - // create dialog to ask for expression/address to block - MonitorMemoryBlockDialog dialog = new MonitorMemoryBlockDialog(shell, standardMemRetrieval); - dialog.open(); - - int returnCode = dialog.getReturnCode(); - - if (returnCode == Window.CANCEL) - { - return; - } - - // get expression entered in dialog - String input = dialog.getExpression(); - ArrayList expressions = new ArrayList(); - - StringTokenizer tokenizer = new StringTokenizer(input, ","); //$NON-NLS-1$ - while (tokenizer.hasMoreTokens()) - { - expressions.add(tokenizer.nextToken()); - } - - String[] expressionsArray = (String[])expressions.toArray(new String[expressions.size()]); - - for (int i=0; i<expressionsArray.length; i++) - { - String expression = expressionsArray[i].trim(); - try { - if (standardMemRetrieval instanceof IMemoryBlockRetrievalExtension) - { - // if the debug session supports IMemoryBlockExtensionRetrieval - IMemoryBlockRetrievalExtension memRetrieval = (IMemoryBlockRetrievalExtension)standardMemRetrieval; - - // get extended memory block with the expression entered - IMemoryBlockExtension memBlock = memRetrieval.getExtendedMemoryBlock(expression, elem); - - // add block to memory block manager - if (memBlock != null) + boolean pin = true; + try { + + if (getMemoryView() != null) + { + pin = getMemoryView().isPinMBDisplay(); + getMemoryView().setPinMBDisplay(false); + } + + // get current selection from Debug View + ISelection selection = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection(IDebugUIConstants.ID_DEBUG_VIEW); + Object elem = ((IStructuredSelection)selection).getFirstElement(); + if (!(elem instanceof IDebugElement)) + return; + // ask debug element about memeory retrieval + IDebugTarget debugTarget = ((IDebugElement)elem).getDebugTarget(); + IMemoryBlockRetrieval standardMemRetrieval = (IMemoryBlockRetrieval)((IDebugElement)elem).getAdapter(IMemoryBlockRetrieval.class); + if (standardMemRetrieval == null) + { + // if getAdapter returns null, assume debug target as memory block retrieval + standardMemRetrieval = debugTarget; + } + if (standardMemRetrieval == null) + return; + Shell shell= DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); + // create dialog to ask for expression/address to block + MonitorMemoryBlockDialog dialog = new MonitorMemoryBlockDialog(shell, standardMemRetrieval); + dialog.open(); + int returnCode = dialog.getReturnCode(); + if (returnCode == Window.CANCEL) + { + return; + } + // get expression entered in dialog + String input = dialog.getExpression(); + ArrayList expressions = new ArrayList(); + StringTokenizer tokenizer = new StringTokenizer(input, ","); //$NON-NLS-1$ + while (tokenizer.hasMoreTokens()) + { + expressions.add(tokenizer.nextToken()); + } + String[] expressionsArray = (String[])expressions.toArray(new String[expressions.size()]); + for (int i=0; i<expressionsArray.length; i++) + { + String expression = expressionsArray[i].trim(); + try { + if (standardMemRetrieval instanceof IMemoryBlockRetrievalExtension) { - fLastMemoryBlock = memBlock; + // if the debug session supports IMemoryBlockExtensionRetrieval + IMemoryBlockRetrievalExtension memRetrieval = (IMemoryBlockRetrievalExtension)standardMemRetrieval; - MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(new IMemoryBlock[]{memBlock}); - if (fAddDefaultRenderings) - addDefaultRenderings(memBlock); + // get extended memory block with the expression entered + IMemoryBlockExtension memBlock = memRetrieval.getExtendedMemoryBlock(expression, elem); + + // add block to memory block manager + if (memBlock != null) + { + fLastMemoryBlock = memBlock; + + MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(new IMemoryBlock[]{memBlock}); + if (fAddDefaultRenderings) + addDefaultRenderings(memBlock); + } + else + { + // open error if it failed to retrieve a memory block + MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(NO_MEMORY_BLOCK), null); + } } else { - // open error if it failed to retrieve a memory block - MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(NO_MEMORY_BLOCK), null); + // if the debug session does not support IMemoryBlockExtensionRetrieval + expression = expression.toUpperCase(); + String hexPrefix = "0X"; //$NON-NLS-1$ + if (expression.startsWith(hexPrefix)) + { + expression = expression.substring(hexPrefix.length()); + } + + // convert the expression to an address + BigInteger address = new BigInteger(expression, 16); + + long longAddress = address.longValue(); + + // get the length of memory to block + String strLength = dialog.getLength(); + + long length = Long.parseLong(strLength); + + // must monitor at least one line + if (length == 0) + { + length = IInternalDebugUIConstants.ADD_UNIT_PER_LINE; + } + + // get standard memory block + IMemoryBlock memBlock = standardMemRetrieval.getMemoryBlock(longAddress, length); + + // make sure the memory block returned is not an instance of IMemoryBlockExtension + if (memBlock instanceof IMemoryBlockExtension) + { + Status status = new Status(IStatus.WARNING, DebugUIPlugin.getUniqueIdentifier(), 0, + "IMemoryBlockRetrieval returns IMemoryBlockExtension. This may result in unexpected behavior.", null); //$NON-NLS-1$ + DebugUIPlugin.log(status); + } + + if (memBlock != null) + { + // add memory block to memory block manager + fLastMemoryBlock = memBlock; + MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(new IMemoryBlock[]{memBlock}); + if (fAddDefaultRenderings) + addDefaultRenderings(memBlock); + } + else + { + // otherwise open up an error doalog + MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(NO_MEMORY_BLOCK), null); + } } + } catch (DebugException e1) { + MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(FAILED), e1); } - else + catch(NumberFormatException e2) { - // if the debug session does not support IMemoryBlockExtensionRetrieval - expression = expression.toUpperCase(); - String hexPrefix = "0X"; //$NON-NLS-1$ - if (expression.startsWith(hexPrefix)) - { - expression = expression.substring(hexPrefix.length()); - } - - // convert the expression to an address - BigInteger address = new BigInteger(expression, 16); - - long longAddress = address.longValue(); - - // get the length of memory to block - String strLength = dialog.getLength(); - - long length = Long.parseLong(strLength); - - // must monitor at least one line - if (length == 0) - { - length = IInternalDebugUIConstants.ADD_UNIT_PER_LINE; - } - - // get standard memory block - IMemoryBlock memBlock = standardMemRetrieval.getMemoryBlock(longAddress, length); - - // make sure the memory block returned is not an instance of IMemoryBlockExtension - if (memBlock instanceof IMemoryBlockExtension) - { - Status status = new Status(IStatus.WARNING, DebugUIPlugin.getUniqueIdentifier(), 0, - "IMemoryBlockRetrieval returns IMemoryBlockExtension. This may result in unexpected behavior.", null); //$NON-NLS-1$ - DebugUIPlugin.log(status); - } - - if (memBlock != null) - { - // add memory block to memory block manager - fLastMemoryBlock = memBlock; - MemoryViewUtil.getMemoryBlockManager().addMemoryBlocks(new IMemoryBlock[]{memBlock}); - if (fAddDefaultRenderings) - addDefaultRenderings(memBlock); - } - else - { - // otherwise open up an error doalog - MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(NO_MEMORY_BLOCK), null); - } + String message = DebugUIMessages.getString(FAILED) + "\n" + DebugUIMessages.getString(EXPR_EVAL_FAILED); //$NON-NLS-1$ + MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), message + " " + expression, null); //$NON-NLS-1$ } - } catch (DebugException e1) { - MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), DebugUIMessages.getString(FAILED), e1); } - catch(NumberFormatException e2) + } finally { + if (getMemoryView() != null) { - String message = DebugUIMessages.getString(FAILED) + "\n" + DebugUIMessages.getString(EXPR_EVAL_FAILED); //$NON-NLS-1$ - MemoryViewUtil.openError(DebugUIMessages.getString(TITLE), message + " " + expression, null); //$NON-NLS-1$ + getMemoryView().setPinMBDisplay(pin); } } } @@ -381,4 +383,11 @@ public class AddMemoryBlockAction extends Action implements ISelectionListener, rendering.init(container, memoryBlock); container.addMemoryRendering(rendering); } + + private MemoryView getMemoryView() + { + if (fSite instanceof MemoryView) + return (MemoryView)fSite; + return null; + } } 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 462d334d6..7f700c6f2 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 @@ -235,8 +235,23 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, IMemoryView } fTreeViewer.refresh(); - fTreeViewer.setSelection(new StructuredSelection(memory)); - fSelectionProvider.setSelection(new StructuredSelection(memory)); + + if (fParent instanceof MemoryView) + { + MemoryView mv = (MemoryView)fParent; + // force a selection if there is currently only one memory block in the view + if (!mv.isPinMBDisplay() || fMemoryBlocks.size() == 1) + { + // switch to the memory block if there is only one memory block in the view + fTreeViewer.setSelection(new StructuredSelection(memory)); + fSelectionProvider.setSelection(new StructuredSelection(memory)); + } + } + else + { + fTreeViewer.setSelection(new StructuredSelection(memory)); + fSelectionProvider.setSelection(new StructuredSelection(memory)); + } updateActionsEnablement(); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java index 74258313b..a01d1ac5e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java @@ -39,6 +39,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.IPartListener2; +import org.eclipse.ui.IViewReference; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; @@ -71,6 +72,9 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { private MemoryViewSynchronizationService fSyncService; + private boolean fPinMBDisplay = true; // pin memory block display, on by default + private static int fViewCnt = 0; + class MemoryViewSelectionProvider implements ISelectionProvider, ISelectionChangedListener { ArrayList fListeners = new ArrayList(); @@ -223,6 +227,33 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { public void init(IViewSite site) throws PartInitException { super.init(site); + + fViewCnt ++; + String secondaryId = site.getSecondaryId(); + if (secondaryId != null) + MemoryViewIdRegistry.registerView(secondaryId); + + // only do this the first time + // not sure if there is a bug in the UI... if the view is + // not a primary view and if it's hidden, the view is not + // init and created until it becomes visible. + if (fViewCnt == 1) + { + // also try to find other views and register + if (DebugUIPlugin.getActiveWorkbenchWindow() != null && + DebugUIPlugin.getActiveWorkbenchWindow().getActivePage() != null) + { + IViewReference references[] = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().getViewReferences(); + for (int i=0; i<references.length; i++) + { + if (references[i].getSecondaryId() != null) + { + MemoryViewIdRegistry.registerView(references[i].getSecondaryId()); + } + } + } + } + fSyncService = new MemoryViewSynchronizationService(); } @@ -347,6 +378,11 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { fViewPaneControls.clear(); + IViewSite viewSite = getViewSite(); + String secondaryId = viewSite.getSecondaryId(); + if (secondaryId != null) + MemoryViewIdRegistry.deregisterView(secondaryId); + super.dispose(); } @@ -440,7 +476,7 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { } private void storeViewPaneVisibility() - { + { fVisibleViewPanes.clear(); Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences(); StringBuffer visibleViewPanes= new StringBuffer(); @@ -460,13 +496,13 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { } } - prefs.setValue(VISIBILITY_PREF, visibleViewPanes.toString()); + prefs.setValue(getVisibilityPrefId(), visibleViewPanes.toString()); //$NON-NLS-1$ } private void loadViewPanesVisibility() { Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences(); - String visiblePanes = prefs.getString(VISIBILITY_PREF); + String visiblePanes = prefs.getString(getVisibilityPrefId()); if (visiblePanes != null && visiblePanes.length() > 0) { @@ -536,4 +572,24 @@ public class MemoryView extends ViewPart implements IMemoryRenderingSite { return null; } + + public boolean isPinMBDisplay() { + return fPinMBDisplay; + } + + + public void setPinMBDisplay(boolean pinMBDisplay) { + fPinMBDisplay = pinMBDisplay; + } + + private String getVisibilityPrefId() + { + IViewSite vs = getViewSite(); + String viewId = vs.getSecondaryId(); + + if (viewId != null) + return VISIBILITY_PREF + "." + viewId; //$NON-NLS-1$ + + return VISIBILITY_PREF; + } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java new file mode 100644 index 000000000..f26a4901e --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.internal.ui.views.memory; + +import java.util.ArrayList; + +/** + * Class for managing the secondary ids for Memory View + * + */ +public class MemoryViewIdRegistry{ + + private static ArrayList fgRegistry; + + public static void registerView(String secondaryId) + { + ArrayList registry = getRegistry(); + + if (!registry.contains(secondaryId)) + { + registry.add(secondaryId); + } + } + + public static void deregisterView(String secondaryId) + { + ArrayList registry = getRegistry(); + + if (registry.contains(secondaryId)) + { + registry.remove(secondaryId); + } + } + + public static String getUniqueSecondaryId(String viewId) + { + int cnt = 0; + String id = viewId + "." + cnt; //$NON-NLS-1$ + ArrayList registry = getRegistry(); + while (registry.contains(id)) + { + cnt ++; + id = viewId + "." + cnt; //$NON-NLS-1$ + } + return id; + } + + private static ArrayList getRegistry() + { + if (fgRegistry == null) + fgRegistry = new ArrayList(); + + return fgRegistry; + } +} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java new file mode 100644 index 000000000..4175d8a3a --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.debug.internal.ui.views.memory; + +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; + +/** + * Action for opening a new memory view. + */ +public class NewMemoryViewAction implements IViewActionDelegate { + + private MemoryView fView; + public void init(IViewPart view) { + if (view instanceof MemoryView) + fView = (MemoryView)view; + } + + public void run(IAction action) { + + String secondaryId = MemoryViewIdRegistry.getUniqueSecondaryId(IInternalDebugUIConstants.ID_MEMORY_VIEW); + try { + IWorkbenchPage page = DebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); + IViewPart newView = page.showView(IInternalDebugUIConstants.ID_MEMORY_VIEW, secondaryId, IWorkbenchPage.VIEW_ACTIVATE); + + setInitialViewSettings(newView); + } catch (PartInitException e) { + // if view cannot be opened, open error + DebugUIPlugin.log(e); + } + } + + private void setInitialViewSettings(IViewPart newView) { + if (fView != null && newView instanceof MemoryView) + { + MemoryView newMView = (MemoryView)newView; + IMemoryViewPane[] viewPanes = fView.getViewPanes(); + for (int i=0; i<viewPanes.length; i++) + { + // copy view pane visibility + newMView.showViewPane(fView.isViewPaneVisible(viewPanes[i].getId()), viewPanes[i].getId()); + } + + // do not want to copy renderings as it could be very expensive + // create a blank view and let user creates renderings as needed + } + } + + public void selectionChanged(IAction action, ISelection selection) { + + } + +} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java new file mode 100644 index 000000000..93f5fa3d3 --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.debug.internal.ui.views.memory; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; + +/** + * Action for pinning the display of the memory view to + * the current memory block. The view would not change + * selection when a new memory block is added if the diplay is pinned. + * + */ +public class PinMemoryBlockAction implements IViewActionDelegate { + + private MemoryView fView; + public void init(IViewPart view) { + if (view instanceof MemoryView) + fView = (MemoryView)view; + + } + + public void run(IAction action) { + if (fView == null) + return; + + boolean pin = !fView.isPinMBDisplay(); + fView.setPinMBDisplay(pin); + + action.setChecked(pin); + } + + public void selectionChanged(IAction action, ISelection selection) { + } + +} 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 160f66df0..cee469b9f 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 @@ -103,7 +103,19 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory // create a tab folder when there is a new memory block if (fTabFolderForMemoryBlock.containsKey(memory)) { if (fStackLayout.topControl != (TabFolder)fTabFolderForMemoryBlock.get(memory)) { - setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); + + if (fParent instanceof MemoryView) + { + MemoryView mv = (MemoryView)fParent; + if (!mv.isPinMBDisplay()) + { + setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); + } + } + else + { + setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); + } fTabFolderForDebugView.put(getMemoryBlockRetrieval(memory), fTabFolderForMemoryBlock.get(memory)); fViewPaneCanvas.layout(); } @@ -123,8 +135,20 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory fMemoryBlockFromTabFolder.put(folder, memory); fTabFolderForDebugView.put(getMemoryBlockRetrieval(memory), folder); - setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); - setRenderingSelection(createTab.getRendering()); + if (fParent instanceof MemoryView) + { + MemoryView mv = (MemoryView)fParent; + if (!mv.isPinMBDisplay()) + { + setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); + setRenderingSelection(createTab.getRendering()); + } + } + else + { + setTabFolder((TabFolder)fTabFolderForMemoryBlock.get(memory)); + setRenderingSelection(createTab.getRendering()); + } fViewPaneCanvas.layout(); } @@ -435,12 +459,16 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory if (viewTab == null) { - 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()); + // 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 @@ -877,11 +905,14 @@ public class RenderingViewPane extends AbstractMemoryViewPane implements IMemory else { TabFolder folder = (TabFolder)fStackLayout.topControl; - TabItem newItem = new TabItem(folder, SWT.NULL); - CreateRendering rendering = new CreateRendering(this); - rendering.init(getInstance(), memoryBlock); - new MemoryViewTab(newItem, rendering, this); - folder.setSelection(0); + if (folder != fEmptyTabFolder) + { + TabItem newItem = new TabItem(folder, SWT.NULL); + CreateRendering rendering = new CreateRendering(this); + rendering.init(getInstance(), memoryBlock); + new MemoryViewTab(newItem, rendering, this); + folder.setSelection(0); + } } } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java index b94a5d63f..1ca693209 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java @@ -28,7 +28,10 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.memory.IMemoryRendering; import org.eclipse.debug.ui.memory.IMemoryRenderingContainer; +import org.eclipse.debug.ui.memory.IMemoryRenderingSite; import org.eclipse.debug.ui.memory.IMemoryRenderingType; +import org.eclipse.ui.IViewSite; +import org.eclipse.ui.IWorkbenchPartSite; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -57,7 +60,7 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ public ViewPaneRenderingMgr(IMemoryRenderingContainer viewPane) { fViewPane = viewPane; - loadPersistedRenderings(); + loadPersistedRenderings(getPrefId()); } public void removeMemoryBlockRendering(IMemoryBlock mem, String renderingId) @@ -221,6 +224,15 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ // remove all renderings fRenderings.clear(); + String secondaryId = getViewSiteSecondaryId(); + if (secondaryId != null) + { + // do not save renderings if this is not the primary rendering view + String prefid = getPrefId(); + Preferences prefs = DebugUIPlugin.getDefault().getPluginPreferences(); + prefs.setToDefault(prefid); + } + DebugPlugin.getDefault().removeDebugEventListener(this); } @@ -241,8 +253,35 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ } catch (TransformerException e) { DebugUIPlugin.log(e); } - prefs.setValue(fViewPane.getId(), renderingsStr); - DebugUIPlugin.getDefault().savePluginPreferences(); + + String prefid = getPrefId(); + + if (renderingsStr != null) + prefs.setValue(prefid, renderingsStr); + else + prefs.setToDefault(prefid); + } + + private String getPrefId() { + // constructs id based on memory view's secondary id + the rendering view pane id + // format: secondaryId:viewPaneId + StringBuffer id = new StringBuffer(); + IMemoryRenderingSite renderingSite = fViewPane.getMemoryRenderingSite(); + IWorkbenchPartSite ps = renderingSite.getSite(); + if (ps instanceof IViewSite) + { + IViewSite vs = (IViewSite)ps; + String secondaryId = vs.getSecondaryId(); + if (secondaryId != null) + { + id.append(secondaryId); + id.append(":"); //$NON-NLS-1$ + } + + } + id.append(fViewPane.getId()); + String prefId = id.toString(); + return prefId; } /** @@ -254,6 +293,10 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ */ private String getRenderingsAsXML() throws IOException, ParserConfigurationException, TransformerException { IMemoryRendering[] renderings= (IMemoryRendering[])fRenderings.toArray(new IMemoryRendering[fRenderings.size()]); + + if (renderings.length == 0) + return null; + Document document= LaunchManager.getDocument(); Element rootElement= document.createElement(RENDERINGS_TAG); document.appendChild(rootElement); @@ -270,8 +313,8 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ /** * Load renderings currently stored. */ - private void loadPersistedRenderings() { - String renderingsStr= DebugUIPlugin.getDefault().getPluginPreferences().getString(fViewPane.getId()); + private void loadPersistedRenderings(String prefId) { + String renderingsStr= DebugUIPlugin.getDefault().getPluginPreferences().getString(prefId); if (renderingsStr.length() == 0) { return; } @@ -344,4 +387,20 @@ public class ViewPaneRenderingMgr implements IDebugEventSetListener{ DebugPlugin.getDefault().addDebugEventListener(this); } } + + /** + * @return secondary id, or null if not available + */ + private String getViewSiteSecondaryId() + { + IMemoryRenderingSite renderingSite = fViewPane.getMemoryRenderingSite(); + IWorkbenchPartSite ps = renderingSite.getSite(); + if (ps instanceof IViewSite) + { + IViewSite vs = (IViewSite)ps; + String secondaryId = vs.getSecondaryId(); + return secondaryId; + } + return null; + } } |