Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Register View Persistence

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/ChangeLog,v
retrieving revision 1.125
diff -u -r1.125 ChangeLog
--- ChangeLog 7 Apr 2003 22:49:08 -0000 1.125
+++ ChangeLog 8 Apr 2003 18:13:10 -0000
@@ -1,3 +1,9 @@
+2003-04-08 Mikhail Khodjaiants
+ Preserving the registers tree structure during the debug session.
+ * ViewerState.java: new
+ * RegistersView.java
+ * RegistersViewEventHandler.java

 2003-04-07 Mikhail Khodjaiants
  No dialog if switch to frame failed.
  * CDebugUIPlugin.java
Index: ViewerState.java
===================================================================
RCS file: ViewerState.java
diff -N ViewerState.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ViewerState.java 8 Apr 2003 18:13:35 -0000
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.views;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeViewer;
+
+/**
+ * Memento of the expanded and selected items in a tree
+ * viewer for.
+ *
+ * @since 2.1
+ */
+public class ViewerState {
+
+ private Object[] fExpandedElements = null; 
+ private ISelection fSelection = null;

+ /**
+  * Constructs a memento for the given viewer.
+  */
+ public ViewerState(TreeViewer viewer) {
+  saveState(viewer);
+ }
+
+ /**
+  * Saves the current state of the given viewer into
+  * this memento.
+  *
+  * @param viewer viewer of which to save the state
+  */
+ public void saveState(TreeViewer viewer) {
+  fExpandedElements = viewer.getExpandedElements();
+  fSelection = viewer.getSelection();
+ }

+ /**
+  * Restores the state of the given viewer to this mementos
+  * saved state.
+  *
+  * @param viewer viewer to which state is restored
+  */
+ public void restoreState(TreeViewer viewer) {
+  if (fExpandedElements != null) {
+   viewer.setExpandedElements(fExpandedElements);
+  }
+  if (fSelection != null) {
+   viewer.setSelection(fSelection);
+  }
+ }
+}Index: RegistersView.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersView.java,v
retrieving revision 1.12
diff -u -r1.12 RegistersView.java
--- RegistersView.java 1 Apr 2003 22:29:16 -0000 1.12
+++ RegistersView.java 8 Apr 2003 18:13:59 -0000
@@ -6,6 +6,8 @@
 
 package org.eclipse.cdt.debug.internal.ui.views.registers;
 
+import java.util.HashMap;
+
 import org.eclipse.cdt.debug.core.ICRegisterManager;
 import org.eclipse.cdt.debug.internal.ui.CDebugImages;
 import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
@@ -17,6 +19,7 @@
 import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler;
 import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandlerView;
 import org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler;
+import org.eclipse.cdt.debug.internal.ui.views.ViewerState;
 import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
 import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
 import org.eclipse.debug.core.DebugException;
@@ -60,6 +63,14 @@
 
  protected static final String VARIABLES_SELECT_ALL_ACTION = SELECT_ALL_ACTION + ".Registers"; //$NON-NLS-1$
 
+ /**
+  * A map of register managers to <code>ViewerState</code>s.
+  * Used to restore the expanded state of the registers view on
+  * re-selection of the register manager. The cache is cleared on
+  * a frame by frame basis when a thread/target is terminated.
+  */
+ private HashMap fExpandedRegisters = new HashMap( 10 );
+
  /* (non-Javadoc)
   * @see org.eclipse.debug.ui.AbstractDebugView#createViewer(Composite)
   */
@@ -262,8 +273,26 @@
    return;
   }
 
+  if ( current != null )
+  {
+   // save state
+   ViewerState state = new ViewerState( getRegistersViewer() );
+   fExpandedRegisters.put( current, state );
+  }
+
   showViewer();
   getViewer().setInput( rm );
+
+  // restore state
+  if ( rm != null )
+  {
+   ViewerState state = (ViewerState)fExpandedRegisters.get( rm );
+   if ( state != null )
+   {
+    state.restoreState( getRegistersViewer() );
+   }
+  }
+
   updateObjects();
  }
 
@@ -278,5 +307,15 @@
   {
    setViewerInput( (IStructuredSelection)selection );
   }
+ }

+ protected RegistersViewer getRegistersViewer()
+ {
+  return (RegistersViewer)getViewer();
+ }
+
+ protected void clearExpandedRegisters( ICRegisterManager rm )
+ {
+  fExpandedRegisters.remove( rm );
  }
 }
Index: RegistersViewEventHandler.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersViewEventHandler.java,v
retrieving revision 1.1
diff -u -r1.1 RegistersViewEventHandler.java
--- RegistersViewEventHandler.java 6 Aug 2002 19:00:46 -0000 1.1
+++ RegistersViewEventHandler.java 8 Apr 2003 18:13:59 -0000
@@ -5,8 +5,10 @@
  */
 package org.eclipse.cdt.debug.internal.ui.views.registers;
 
+import org.eclipse.cdt.debug.core.ICRegisterManager;
 import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler;
 import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.model.IDebugTarget;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.debug.ui.AbstractDebugView;
 
@@ -38,6 +40,13 @@
    DebugEvent event = events[i];
    switch( event.getKind() )
    {
+    case DebugEvent.TERMINATE :
+     if ( event.getSource() instanceof IDebugTarget &&
+       ((IDebugTarget)event.getSource()).getAdapter( ICRegisterManager.class ) != null )
+     {
+      getRegistersView().clearExpandedRegisters( (ICRegisterManager)(((IDebugTarget)event.getSource()).getAdapter( ICRegisterManager.class )) );
+     }
+     break;
     case DebugEvent.SUSPEND :
      if ( event.getDetail() != DebugEvent.EVALUATION_IMPLICIT )
      {
@@ -64,6 +73,11 @@
      }
      break;
    }
-  }
+  }  
+ }
+
+ protected RegistersView getRegistersView()
+ {
+  return (RegistersView)getView();
  }
 }


Back to the top