Bug 320372 - Memory Browser should invoke becomesVisible/becomesHidden on renderings
Also re-adds public constant MemoryBrowser.ID which got removed in version 1.21
diff --git a/memory/org.eclipse.cdt.debug.ui.memory.memorybrowser/src/org/eclipse/cdt/debug/ui/memory/memorybrowser/MemoryBrowser.java b/memory/org.eclipse.cdt.debug.ui.memory.memorybrowser/src/org/eclipse/cdt/debug/ui/memory/memorybrowser/MemoryBrowser.java
index 688fb1d..5180bd4 100644
--- a/memory/org.eclipse.cdt.debug.ui.memory.memorybrowser/src/org/eclipse/cdt/debug/ui/memory/memorybrowser/MemoryBrowser.java
+++ b/memory/org.eclipse.cdt.debug.ui.memory.memorybrowser/src/org/eclipse/cdt/debug/ui/memory/memorybrowser/MemoryBrowser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009-2010 Wind River Systems, Inc. and others.
+ * Copyright (c) 2009, 2010 Wind River Systems, Inc. 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
@@ -117,6 +117,8 @@
 @SuppressWarnings("restriction")
 public class MemoryBrowser extends ViewPart implements IDebugContextListener, IMemoryRenderingSite, IDebugEventSetListener
 {
+	public static final String ID = "org.eclipse.cdt.debug.ui.memory.memorybrowser.MemoryBrowser";  //$NON-NLS-1$
+	
 	protected StackLayout fStackLayout;
 	private Composite fRenderingsComposite;
 	private GoToAddressBarWidget fGotoAddressBar;
@@ -125,7 +127,8 @@
 	private Label fUnsupportedLabel;
 	private Composite fMainComposite;
 	private String defaultRenderingTypeId = null;
-
+	private IMemoryRendering fActiveRendering;
+	
 	/**
 	 * Every memory retrieval object is given its own tab folder. Typically all
 	 * elements of a "process" (process, threads, frames) have the same
@@ -191,6 +194,7 @@
 		return fMainComposite;
 	}
 
+	@Override
 	public void createPartControl(Composite parent) {
 		// set default rendering type. use the traditional rendering if available. fallback on first registered type.
 		// this should eventually be configurable via a preference page.
@@ -320,6 +324,7 @@
         return site.getId() + (site.getSecondaryId() != null ? (":" + site.getSecondaryId()) : ""); //$NON-NLS-1$ //$NON-NLS-2$
     }
 	
+	@Override
 	public void dispose() {
 		DebugPlugin.getDefault().removeDebugEventListener(this);
         IDebugContextService contextService = 
@@ -401,6 +406,7 @@
 					fContextFolders.put(retrieval, activeFolder);
 					activeFolder.setSelection(item);
 					getSite().getSelectionProvider().setSelection(new StructuredSelection(item.getData(KEY_RENDERING)));
+					handleTabActivated(item);
 				} catch (DebugException e1) {
 					fGotoAddressBar.handleExpressionStatus(new Status(Status.ERROR, MemoryBrowserPlugin.PLUGIN_ID, 
 							Messages.getString("MemoryBrowser.FailedToGoToAddressTitle"), e1));
@@ -420,6 +426,7 @@
 						rendering = populateTabWithRendering(item, retrieval, context, memorySpaceId, expression);
 						activeFolder.setSelection(item);
 						getSite().getSelectionProvider().setSelection(new StructuredSelection(item.getData(KEY_RENDERING)));
+						handleTabActivated(item);
 					} catch (DebugException e) {
 						fGotoAddressBar.handleExpressionStatus(new Status(Status.ERROR, MemoryBrowserPlugin.PLUGIN_ID, 
 								Messages.getString("MemoryBrowser.FailedToGoToAddressTitle"), e));
@@ -436,6 +443,7 @@
 					rendering instanceof IRepositionableMemoryRendering) {
 				final IRepositionableMemoryRendering renderingFinal = (IRepositionableMemoryRendering) rendering;
 				new Thread() {
+					@Override
 					public void run() {
 						try {
 							BigInteger newBase = getExpressionAddress(retrieval, expression, context, memorySpaceId);
@@ -534,6 +542,7 @@
 		
 		// listener to dispose rendering resources for each closed tab
 		folder.addCTabFolder2Listener(new CTabFolder2Adapter() {
+			@Override
 			public void close(CTabFolderEvent event) {
 				event.doit = true;
 				CTabItem item = (CTabItem) event.item;
@@ -582,6 +591,9 @@
 			// always deactivate rendering before disposing it.
 			rendering.deactivated();
 			rendering.dispose();
+			if (rendering == fActiveRendering) {
+				fActiveRendering = null;
+			}
 		}
 		map.clear();
 		
@@ -632,7 +644,8 @@
 			final Action action = new Action(
 				type.getLabel(), IAction.AS_RADIO_BUTTON)
 	        {
-	            public void run()
+	            @Override
+				public void run()
 	            {
 	            	setDefaultRenderingTypeId(type.getId());
 	            }
@@ -691,6 +704,7 @@
 		});
 	}
 
+	@Override
 	public void setFocus() {
 		getControl().setFocus();
 	}
@@ -752,6 +766,7 @@
 
 		public void propertyChange(final PropertyChangeEvent event) {
 			WorkbenchJob job = new WorkbenchJob("MemoryBrowser PropertyChanged") { //$NON-NLS-1$
+				@Override
 				public IStatus runInUIThread(IProgressMonitor monitor) {
 					if(tab.isDisposed())
 						return Status.OK_STATUS;
@@ -794,6 +809,7 @@
 			if (retrieval instanceof IMemorySpaceAwareMemoryBlockRetrieval) {
 			    final IMemoryBlockRetrieval _retrieval = retrieval;
 				((IMemorySpaceAwareMemoryBlockRetrieval)retrieval).getMemorySpaces(context, new GetMemorySpacesRequest(){
+					@Override
 					public void done() {
 						updateTab(_retrieval, context, isSuccess() ? getMemorySpaces() : new String[0]);
 					}
@@ -839,14 +855,17 @@
 				CTabFolder tabFolder = fContextFolders.get(retrieval);
 				if(tabFolder != null) {
 					fStackLayout.topControl = tabFolder;
+					handleTabActivated(tabFolder.getSelection());
 				}
 				else {
 					tabFolder = createTabFolder(fRenderingsComposite);
 					tabFolder.addSelectionListener(new SelectionListener() {
 						public void widgetDefaultSelected(SelectionEvent e) {}
 						public void widgetSelected(SelectionEvent e) {
-							updateMemorySpaceControlSelection((CTabItem)e.item);
-							getSite().getSelectionProvider().setSelection(new StructuredSelection(((CTabItem) e.item).getData(KEY_RENDERING)));
+							CTabItem tabItem = (CTabItem)e.item;
+							updateMemorySpaceControlSelection(tabItem);
+							getSite().getSelectionProvider().setSelection(new StructuredSelection(tabItem.getData(KEY_RENDERING)));
+							handleTabActivated(tabItem);
 						}
 					});
 					
@@ -893,6 +912,27 @@
 		});
 	}
 	
+	protected final void handleTabActivated(CTabItem item) {
+		if (item != null) {
+			updateActiveRendering((IMemoryRendering) item.getData(KEY_RENDERING));
+		}
+	}
+	
+	private void updateActiveRendering(IMemoryRendering rendering) {
+		if (fActiveRendering == rendering) {
+			return;
+		}
+		if (fActiveRendering != null) {
+			fActiveRendering.deactivated();
+			fActiveRendering.becomesHidden();
+		}
+		if (rendering != null) {
+			rendering.activated();
+			rendering.becomesVisible();
+		}
+		fActiveRendering = rendering;
+	}
+
 	private void setMemorySpaceControlVisible(boolean visible) {
 		FormData data = (FormData)fGotoAddressBarControl.getLayoutData();
 		if (visible) {
@@ -1128,6 +1168,7 @@
 		}
 		else {
 			UIJob job = new UIJob("Memory Browser UI Job"){ //$NON-NLS-1$
+				@Override
 				public IStatus runInUIThread(IProgressMonitor monitor) {
 					runnable.run();
 					return Status.OK_STATUS;