Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarin Wright2005-03-24 20:25:03 +0000
committerDarin Wright2005-03-24 20:25:03 +0000
commite3a721b960b8c9b19c3b40eb9359227d36f5f900 (patch)
treebf2b0c1a11c2514a834ec0c186facf4d04458730
parentfff23d64abf936f48ac0894022add43cdc6af84b (diff)
downloadeclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.tar.gz
eclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.tar.xz
eclipse.platform.debug-e3a721b960b8c9b19c3b40eb9359227d36f5f900.zip
Bug 82245 - Multiple memory views
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/new_con.gifbin0 -> 617 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/pin.gifbin0 -> 366 bytes
-rw-r--r--org.eclipse.debug.ui/plugin.properties4
-rw-r--r--org.eclipse.debug.ui/plugin.xml26
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryBlockAction.java249
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java19
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java62
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewIdRegistry.java63
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/NewMemoryViewAction.java68
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/PinMemoryBlockAction.java47
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/RenderingViewPane.java59
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/ViewPaneRenderingMgr.java69
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
new file mode 100644
index 000000000..fc06a2d63
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/new_con.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/pin.gif b/org.eclipse.debug.ui/icons/full/elcl16/pin.gif
new file mode 100644
index 000000000..cd9bc9cb6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/pin.gif
Binary files differ
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;
+ }
}

Back to the top