diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog
index 84db7ee0610..d02e10b9b42 100644
--- a/debug/org.eclipse.cdt.debug.core/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.core/ChangeLog
@@ -1,3 +1,13 @@
+2005-12-29 Mikhail Khodjaiants
+ Bug 122336: Use the asynchronous tree viewer in the Modules view.
+ Grouped the modules-related methods of ICDebugTarget under the
+ new IModuleRetrieval interface.
+ * ICDebugTarget.java
+ + IModuleRetrieval.java
+ * CDebugElement.java
+ * CDebugTarget.java
+ * CModuleManager.java
+
2005-12-27 Mikhail Khodjaiants
Bug 109526: Support Eclipse-LazyStart and deprecate Eclipse-AutoStart.
* MANIFEST.MF
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
index 1eca2e86e42..612711cf98e 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
@@ -24,6 +24,7 @@ public interface ICDebugTarget extends IDebugTarget,
IResumeWithoutSignal,
ICDebugElement,
ISteppingModeTarget,
+ IModuleRetrieval,
ITargetProperties {
/**
@@ -64,30 +65,6 @@ public interface ICDebugTarget extends IDebugTarget,
*/
public boolean isPostMortem();
- /**
- * Returns whether there are modules currently loaded in this debug target.
- *
- * @return whether there are modules currently loaded in this debug target
- *
- * @throws DebugException
- */
- public boolean hasModules() throws DebugException;
-
- /**
- * Returns the array of the currently loaded modules.
- *
- * @return the array of the currently loaded modules
- * @throws DebugException if this method fails. Reasons include:
- */
- public ICModule[] getModules() throws DebugException;
-
- /**
- * Load symbols for all currently loaded modules.
- *
- * @throws DebugException if this method fails. Reasons include:
- */
- public void loadSymbolsForAllModules() throws DebugException;
-
/**
* Returns the list of descriptors of the target registers
*
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IModuleRetrieval.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IModuleRetrieval.java
new file mode 100644
index 00000000000..774dd217c75
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IModuleRetrieval.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems 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:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.core.model;
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Comment for .
+ */
+public interface IModuleRetrieval {
+
+ /**
+ * Returns whether there are modules currently loaded in this debug target.
+ *
+ * @return whether there are modules currently loaded in this debug target
+ *
+ * @throws DebugException
+ */
+ public boolean hasModules() throws DebugException;
+
+ /**
+ * Returns the array of the currently loaded modules.
+ *
+ * @return the array of the currently loaded modules
+ * @throws DebugException if this method fails. Reasons include:
+ */
+ public ICModule[] getModules() throws DebugException;
+
+ /**
+ * Load symbols for all currently loaded modules.
+ *
+ * @throws DebugException if this method fails. Reasons include:
+ */
+ public void loadSymbolsForAllModules() throws DebugException;
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugElement.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugElement.java
index b61fa20e07c..414ef5c5699 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugElement.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugElement.java
@@ -302,6 +302,8 @@ abstract public class CDebugElement extends PlatformObject implements ICDebugEle
return getCDISession();
if ( adapter.equals( ICDebugTarget.class ) )
return getDebugTarget();
+ if ( adapter.equals( IDebugTarget.class ) )
+ return getDebugTarget();
// See bug #100261
if ( adapter.equals( IMemoryBlockRetrieval.class ) )
return getDebugTarget().getAdapter( adapter );
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
index 6d7e7a87ae3..9fcc59f7709 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
@@ -73,6 +73,7 @@ import org.eclipse.cdt.debug.core.model.IDebuggerProcessSupport;
import org.eclipse.cdt.debug.core.model.IDisassembly;
import org.eclipse.cdt.debug.core.model.IExecFileInfo;
import org.eclipse.cdt.debug.core.model.IGlobalVariableDescriptor;
+import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.core.model.IPersistableRegisterGroup;
import org.eclipse.cdt.debug.core.model.IRegisterDescriptor;
import org.eclipse.cdt.debug.core.sourcelookup.CDirectorySourceContainer;
@@ -765,6 +766,8 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
return getMemoryBlockRetrieval();
if ( adapter.equals( IMemoryBlockRetrieval.class ) )
return getMemoryBlockRetrieval();
+ if ( adapter.equals( IModuleRetrieval.class ) )
+ return getModuleManager();
return super.getAdapter( adapter );
}
@@ -1591,30 +1594,6 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
return CVariableFactory.createGlobalVariable( this, info, vo );
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#hasModules()
- */
- public boolean hasModules() throws DebugException {
- CModuleManager mm = getModuleManager();
- return ( mm != null ) ? mm.hasModules() : false;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getModules()
- */
- public ICModule[] getModules() throws DebugException {
- CModuleManager mm = getModuleManager();
- return ( mm != null ) ? mm.getModules() : new ICModule[0];
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.model.ICDebugTarget#loadSymbolsForAllModules()
- */
- public void loadSymbolsForAllModules() throws DebugException {
- CModuleManager mm = getModuleManager();
- mm.loadSymbolsForAll();
- }
-
public void sourceContainersChanged( ISourceLookupDirector director ) {
setSourceLookupPath( director.getSourceContainers() );
}
@@ -1713,4 +1692,24 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
}
}
}
+
+ public boolean hasModules() throws DebugException {
+ CModuleManager mm = getModuleManager();
+ if ( mm != null )
+ return mm.hasModules();
+ return false;
+ }
+
+ public ICModule[] getModules() throws DebugException {
+ CModuleManager mm = getModuleManager();
+ if ( mm != null )
+ return mm.getModules();
+ return new ICModule[0];
+ }
+
+ public void loadSymbolsForAllModules() throws DebugException {
+ CModuleManager mm = getModuleManager();
+ if ( mm != null )
+ mm.loadSymbolsForAllModules();
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CModuleManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CModuleManager.java
index a53c963100d..3e6aacfd58e 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CModuleManager.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CModuleManager.java
@@ -17,9 +17,11 @@ import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
import org.eclipse.cdt.debug.core.model.ICModule;
+import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
@@ -27,7 +29,7 @@ import org.eclipse.debug.core.DebugException;
/**
* Manages the modules loaded on this debug target.
*/
-public class CModuleManager {
+public class CModuleManager extends PlatformObject implements IModuleRetrieval {
/**
* The debug target associated with this manager.
@@ -47,15 +49,15 @@ public class CModuleManager {
fModules = new ArrayList( 5 );
}
- public boolean hasModules() {
+ public boolean hasModules() throws DebugException {
return !fModules.isEmpty();
}
- public ICModule[] getModules() {
+ public ICModule[] getModules() throws DebugException {
return (ICModule[])fModules.toArray( new ICModule[fModules.size()] );
}
- public void loadSymbolsForAll() throws DebugException {
+ public void loadSymbolsForAllModules() throws DebugException {
MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, CoreModelMessages.getString( "CModuleManager.0" ), null ); //$NON-NLS-1$
Iterator it = fModules.iterator();
while( it.hasNext() ) {
diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog
index c8b4ae761ff..1fcd87155ec 100644
--- a/debug/org.eclipse.cdt.debug.ui/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog
@@ -1,3 +1,15 @@
+2005-12-29 Mikhail Khodjaiants
+ Bug 122336: Use the asynchronous tree viewer in the Modules view.
+ * LoadSymbolsForAllActionDelegate.java
+ * AbstractViewerState.java
+ * ModulesView.java
+ - ModulesViewContentProvider.java
+ * ModulesViewer.java
+ * ModulesViewerState.java
+ * ModulesViewEventHandler.java
+ + ModulesViewModelProxy.java
+ + ModuleTreeContentAdapter.java
+
2005-12-27 Mikhail Khodjaiants
HTMLTextPresenter implements DefaultInformationControl.IInformationPresenterExtension
instead of deprecated DefaultInformationControl.IInformationPresenter.
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/LoadSymbolsForAllActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/LoadSymbolsForAllActionDelegate.java
index ee6ac77d23a..4954d6239df 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/LoadSymbolsForAllActionDelegate.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/LoadSymbolsForAllActionDelegate.java
@@ -13,6 +13,7 @@ package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
@@ -46,20 +47,23 @@ public class LoadSymbolsForAllActionDelegate extends AbstractViewActionDelegate
* @see org.eclipse.cdt.debug.internal.ui.actions.AbstractViewActionDelegate#doAction()
*/
protected void doAction() throws DebugException {
- final ICDebugTarget target = getDebugTarget( getView().getViewer().getInput() );
+ ICDebugTarget target = getDebugTarget( getView().getViewer().getInput() );
if ( target != null ) {
- DebugPlugin.getDefault().asyncExec(
- new Runnable() {
-
- public void run() {
- try {
- target.loadSymbolsForAllModules();
+ final IModuleRetrieval mr = (IModuleRetrieval)target.getAdapter( IModuleRetrieval.class );
+ if ( mr != null ) {
+ DebugPlugin.getDefault().asyncExec(
+ new Runnable() {
+
+ public void run() {
+ try {
+ mr.loadSymbolsForAllModules();
+ }
+ catch( DebugException e ) {
+ failed( e );
+ }
}
- catch( DebugException e ) {
- failed( e );
- }
- }
- } );
+ } );
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/AbstractViewerState.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/AbstractViewerState.java
index 645c2a4a1e3..0c14c8d471b 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/AbstractViewerState.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/AbstractViewerState.java
@@ -1,20 +1,23 @@
-/*******************************************************************************
+/**********************************************************************
* Copyright (c) 2004, 2005 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
+ * 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:
+ *
+ * Contributors:
* QNX Software Systems - Initial API and implementation
- *******************************************************************************/
+***********************************************************************/
package org.eclipse.cdt.debug.internal.ui.views;
+
import java.util.ArrayList;
import java.util.List;
+
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.DebugException;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer;
+import org.eclipse.debug.internal.ui.viewers.TreePath;
+import org.eclipse.debug.internal.ui.viewers.TreeSelection;
import org.eclipse.swt.widgets.TreeItem;
/**
@@ -24,15 +27,14 @@ import org.eclipse.swt.widgets.TreeItem;
public abstract class AbstractViewerState {
// paths to expanded elements
- private List fExpandedElements = null;
- // paths to selected elements
- private IPath[] fSelection = null;
+ private List fSavedExpansion = null;
+ private IPath[] fSelection;
/**
* Constructs a memento for the given viewer.
*/
- public AbstractViewerState( TreeViewer viewer ) {
- saveState( viewer );
+ public AbstractViewerState(AsynchronousTreeViewer viewer) {
+ saveState(viewer);
}
/**
@@ -41,42 +43,60 @@ public abstract class AbstractViewerState {
*
* @param viewer viewer of which to save the state
*/
- public void saveState( TreeViewer viewer ) {
+ public void saveState(AsynchronousTreeViewer viewer) {
List expanded = new ArrayList();
- fExpandedElements = null;
+ fSavedExpansion = null;
TreeItem[] items = viewer.getTree().getItems();
try {
- for( int i = 0; i < items.length; i++ ) {
- collectExandedItems( items[i], expanded );
+ for (int i = 0; i < items.length; i++) {
+ collectExpandedItems(items[i], expanded);
}
- if ( expanded.size() > 0 ) {
- fExpandedElements = expanded;
+ if (expanded.size() > 0) {
+ fSavedExpansion = expanded;
}
- }
- catch( DebugException e ) {
- fExpandedElements = null;
+ } catch (DebugException e) {
+ fSavedExpansion = null;
}
TreeItem[] selection = viewer.getTree().getSelection();
fSelection = new IPath[selection.length];
try {
- for( int i = 0; i < selection.length; i++ ) {
- fSelection[i] = encodeElement( selection[i] );
- }
- }
- catch( DebugException e ) {
- fSelection = null;
+ for (int i = 0; i < selection.length; i++) {
+ fSelection[i] = encodeElement(selection[i]);
+ if (fSelection[i] == null) {
+ fSelection = null;
+ return;
+ }
+ }
+ } catch (DebugException e) {
+ fSelection = null;
}
}
- protected void collectExandedItems( TreeItem item, List expanded ) throws DebugException {
- if ( item.getExpanded() ) {
- expanded.add( encodeElement( item ) );
- TreeItem[] items = item.getItems();
- for( int i = 0; i < items.length; i++ ) {
- collectExandedItems( items[i], expanded );
- }
- }
- }
+ /**
+ * Collects paths to expanded children of the given element and returns
+ * whether any paths were expanded.
+ *
+ * @param item item to collect expanded paths for
+ * @param expanded list to add to
+ * @return whether any paths were found expanded
+ * @throws DebugException
+ */
+ protected boolean collectExpandedItems(TreeItem item, List expanded) throws DebugException {
+ if (item.getExpanded()) {
+ boolean childExpanded = false;
+ TreeItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ childExpanded = collectExpandedItems(items[i], expanded) || childExpanded;
+ }
+ if (!childExpanded) {
+ IPath path = encodeElement(item);
+ expanded.add(path);
+ }
+ } else {
+ return false;
+ }
+ return true;
+ }
/**
* Constructs a path representing the given tree item. The segments in the
@@ -87,7 +107,7 @@ public abstract class AbstractViewerState {
* @return path encoding the given item
* @throws DebugException if unable to generate a path
*/
- protected abstract IPath encodeElement( TreeItem item ) throws DebugException;
+ protected abstract IPath encodeElement(TreeItem item) throws DebugException;
/**
* Restores the state of the given viewer to this memento's
@@ -95,41 +115,56 @@ public abstract class AbstractViewerState {
*
* @param viewer viewer to which state is restored
*/
- public void restoreState( TreeViewer viewer ) {
- if ( fExpandedElements != null ) {
- List expansion = new ArrayList( fExpandedElements.size() );
- for( int i = 0; i < fExpandedElements.size(); i++ ) {
- IPath path = (IPath)fExpandedElements.get( i );
- if ( path != null ) {
- Object obj;
+ public void restoreState(AsynchronousTreeViewer viewer) {
+ boolean expansionComplete = true;
+ if (fSavedExpansion != null && fSavedExpansion.size() > 0) {
+ for (int i = 0; i < fSavedExpansion.size(); i++) {
+ IPath path = (IPath) fSavedExpansion.get(i);
+ if (path != null) {
try {
- obj = decodePath( path, viewer );
- if ( obj != null ) {
- expansion.add( obj );
+ TreePath treePath = decodePath(path, viewer);
+ if (treePath != null) {
+ viewer.expand(new TreeSelection(new TreePath[] { treePath }));
+
+ if (treePath.getSegmentCount()-1 != path.segmentCount()) {
+ expansionComplete = false;
+ }
+ } else {
+ expansionComplete =false;
}
- }
- catch( DebugException e ) {
+ } catch (DebugException e) {
}
}
}
- viewer.setExpandedElements( expansion.toArray() );
- }
- if ( fSelection != null ) {
- List selection = new ArrayList( fSelection.length );
- for( int i = 0; i < fSelection.length; i++ ) {
- IPath path = fSelection[i];
- Object obj;
- try {
- obj = decodePath( path, viewer );
- if ( obj != null ) {
- selection.add( obj );
- }
- }
- catch( DebugException e ) {
- }
+ if (expansionComplete) {
+ fSavedExpansion = null;
}
- viewer.setSelection( new StructuredSelection( selection ) );
}
+
+ boolean selectionComplete = true;
+ if (fSelection != null && fSelection.length > 0) {
+ List selection = new ArrayList(fSelection.length);
+ for (int i = 0; i < fSelection.length; i++) {
+ IPath path = fSelection[i];
+ TreePath obj;
+ try {
+ obj = decodePath(path, viewer);
+ if (obj != null && obj.getSegmentCount()-1 == path.segmentCount()) {
+ selection.add(obj);
+ } else {
+ selectionComplete = false;
+ }
+ } catch (DebugException e) {
+ }
+ }
+ if (selection.size() > 0) {
+ TreePath[] treePaths = (TreePath[]) selection.toArray(new TreePath[0]);
+ viewer.setSelection(new TreeSelection(treePaths));
+ }
+ if (selectionComplete) {
+ fSelection = null;
+ }
+ }
}
/**
@@ -141,5 +176,6 @@ public abstract class AbstractViewerState {
* @return element represented by the path, or null
if none
* @throws DebugException if unable to locate a variable
*/
- protected abstract Object decodePath( IPath path, TreeViewer viewer ) throws DebugException;
+ protected abstract TreePath decodePath(IPath path, AsynchronousTreeViewer viewer) throws DebugException;
+
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModuleTreeContentAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModuleTreeContentAdapter.java
new file mode 100644
index 00000000000..79290b60c8e
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModuleTreeContentAdapter.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems 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:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.views.modules;
+
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.IBinary;
+import org.eclipse.cdt.core.model.IParent;
+import org.eclipse.cdt.debug.core.model.ICModule;
+import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
+import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeContentAdapter;
+import org.eclipse.debug.internal.ui.viewers.IPresentationContext;
+
+/**
+ * Comment for .
+ */
+public class ModuleTreeContentAdapter extends AsynchronousTreeContentAdapter {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousTreeContentAdapter#getChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.IPresentationContext)
+ */
+ protected Object[] getChildren( Object parent, IPresentationContext context ) throws CoreException {
+ if ( parent instanceof IModuleRetrieval ) {
+ return ((IModuleRetrieval)parent).getModules();
+ }
+ else if ( parent instanceof ICModule ) {
+ IBinary binary = (IBinary)((ICModule)parent).getAdapter( IBinary.class );
+ if ( binary != null ) {
+ try {
+ return binary.getChildren();
+ }
+ catch( CModelException e ) {
+ }
+ }
+ }
+ else if ( parent instanceof IParent ) {
+ try {
+ return ((IParent)parent).getChildren();
+ }
+ catch( CModelException e ) {
+ }
+ }
+ return EMPTY;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousTreeContentAdapter#hasChildren(java.lang.Object, org.eclipse.debug.internal.ui.viewers.IPresentationContext)
+ */
+ protected boolean hasChildren( Object element, IPresentationContext context ) throws CoreException {
+ if ( element instanceof IModuleRetrieval ) {
+ return ((IModuleRetrieval)element).hasModules();
+ }
+ else if ( element instanceof ICModule ) {
+ IBinary binary = (IBinary)((ICModule)element).getAdapter( IBinary.class );
+ if ( binary != null ) {
+ return binary.hasChildren();
+ }
+ }
+ else if ( element instanceof IParent ) {
+ return ((IParent)element).hasChildren();
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousTreeContentAdapter#supportsPartId(java.lang.String)
+ */
+ protected boolean supportsPartId( String id ) {
+ return ICDebugUIConstants.ID_MODULES_VIEW.equals( id );
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java
index 2a2c401f69a..79c0b0e4b1b 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesView.java
@@ -15,27 +15,26 @@ import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.debug.core.model.ICDebugElement;
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
import org.eclipse.cdt.debug.core.model.ICModule;
-import org.eclipse.cdt.debug.internal.ui.CDebugModelPresentation;
+import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.internal.ui.actions.ToggleDetailPaneAction;
import org.eclipse.cdt.debug.internal.ui.preferences.ICDebugPreferenceConstants;
-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.AbstractViewerState;
import org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.ListenerList;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.internal.ui.contexts.DebugContextManager;
+import org.eclipse.debug.internal.ui.contexts.IDebugContextListener;
+import org.eclipse.debug.internal.ui.viewers.PresentationContext;
+import org.eclipse.debug.ui.AbstractDebugView;
import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
@@ -54,19 +53,13 @@ import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-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.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
@@ -82,132 +75,22 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.INullSelectionListener;
import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.console.actions.TextViewerAction;
-import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
/**
* Displays the modules currently loaded by the process being debugged.
*/
-public class ModulesView extends AbstractDebugEventHandlerView implements IDebugExceptionHandler, IPropertyChangeListener, ISelectionListener, INullSelectionListener {
-
-
- class ModulesViewModelPresentation implements IDebugModelPresentation {
-
- private CDebugModelPresentation fDelegate;
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.ui.IDebugModelPresentation#setAttribute(java.lang.String, java.lang.Object)
- */
- public void setAttribute( String attribute, Object value ) {
- getModelPresentation().setAttribute( attribute, value );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
- */
- public Image getImage( Object element ) {
- Image image = getModelPresentation().getImage( element );
- if ( image == null ) {
- if ( element instanceof IAdaptable ) {
- IWorkbenchAdapter de = (IWorkbenchAdapter)((IAdaptable)element).getAdapter( IWorkbenchAdapter.class );
- if ( de != null ) {
- ImageDescriptor descriptor = de.getImageDescriptor( element );
- if ( descriptor != null ) {
- image = ModulesView.this.getImage( descriptor );
- }
- }
- }
- }
- return image;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
- */
- public String getText( Object element ) {
- String text = getModelPresentation().getText( element );
- if ( text == null ) {
- if ( element instanceof IAdaptable ) {
- IWorkbenchAdapter de = (IWorkbenchAdapter)((IAdaptable)element).getAdapter( IWorkbenchAdapter.class );
- if ( de != null ) {
- text = de.getLabel( element );
- }
- else {
- text = element.toString();
- }
- }
- }
- if ( element instanceof ICModule ) {
- ICModule module = (ICModule)element;
- text += ( module.areSymbolsLoaded() ) ? ModulesMessages.getString( "ModulesView.11" ) : ModulesMessages.getString( "ModulesView.12" ); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return text;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.ui.IDebugModelPresentation#computeDetail(org.eclipse.debug.core.model.IValue, org.eclipse.debug.ui.IValueDetailListener)
- */
- public void computeDetail( IValue value, IValueDetailListener listener ) {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(java.lang.Object)
- */
- public IEditorInput getEditorInput( Object element ) {
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
- */
- public String getEditorId( IEditorInput input, Object element ) {
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
- */
- public void addListener( ILabelProviderListener listener ) {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
- */
- public void dispose() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
- */
- public boolean isLabelProperty( Object element, String property ) {
- return false;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
- */
- public void removeListener( ILabelProviderListener listener ) {
- }
-
- private CDebugModelPresentation getModelPresentation() {
- if ( fDelegate == null ) {
- fDelegate = CDebugModelPresentation.getDefault();
- }
- return fDelegate;
- }
- }
+public class ModulesView extends AbstractDebugView implements IDebugContextListener, IDebugExceptionHandler, IPropertyChangeListener, ISelectionListener, INullSelectionListener {
/**
* Internal interface for a cursor listener. I.e. aggregation
@@ -297,7 +180,7 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
* The model presentation used as the label provider for the tree viewer,
* and also as the detail information provider for the detail pane.
*/
- private IDebugModelPresentation fModelPresentation;
+// private IDebugModelPresentation fModelPresentation;
/**
* Remembers which viewer (tree viewer or details viewer) had focus, so we
@@ -336,7 +219,9 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
* @see org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets.Composite)
*/
protected Viewer createViewer( Composite parent ) {
- TreeViewer viewer = createTreeViewer( parent );
+ ModulesViewer viewer = (ModulesViewer)createTreeViewer( parent );
+ viewer.setContext( new PresentationContext( this ) );
+
createDetailsViewer();
getSashForm().setMaximizedControl( viewer.getControl() );
@@ -418,58 +303,80 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
if ( selection == null )
setViewerInput( new StructuredSelection() );
else if ( selection instanceof IStructuredSelection )
- setViewerInput( (IStructuredSelection)selection );
+ setViewerInput( selection );
}
- protected void setViewerInput( IStructuredSelection ssel ) {
- ICDebugTarget target = null;
- if ( ssel.size() == 1 ) {
- Object input = ssel.getFirstElement();
- if ( input instanceof ICDebugElement ) {
- target = (ICDebugTarget)((ICDebugElement)input).getDebugTarget();
- }
+ protected void setViewerInput( Object context ) {
+ IModuleRetrieval mr = null;
+ if ( context instanceof IAdaptable ) {
+ ICDebugTarget target = (ICDebugTarget)((IAdaptable)context).getAdapter( ICDebugTarget.class );
+ if ( target != null )
+ mr = (IModuleRetrieval)target.getAdapter( IModuleRetrieval.class );
}
-
Object current = getViewer().getInput();
- if ( current == null && target == null ) {
+ if ( current == null && mr == null ) {
return;
}
- if ( current != null && current.equals( target ) ) {
+ if ( current != null && current.equals( mr ) ) {
return;
}
-
if ( current != null ) {
// save state
fLastState = getViewerState();
- fSelectionStates.put( current, fLastState );
- }
+ cacheViewerState( current, fLastState );
+ }
showViewer();
- getViewer().setInput( target );
+ getViewer().setInput( mr );
+ restoreState();
- // restore state
- if ( target != null ) {
- AbstractViewerState state = (AbstractViewerState)fSelectionStates.get( target );
- if ( state == null ) {
- // attempt to restore selection/expansion based on last target
- state = fLastState;
- }
- if ( state != null ) {
- state.restoreState( getModulesViewer() );
- }
- }
+//
+// ICDebugTarget target = null;
+// if ( ssel.size() == 1 ) {
+// Object input = ssel.getFirstElement();
+// if ( input instanceof ICDebugElement ) {
+// target = (ICDebugTarget)((ICDebugElement)input).getDebugTarget();
+// }
+// }
+//
+// Object current = getViewer().getInput();
+// if ( current == null && target == null ) {
+// return;
+// }
+// if ( current != null && current.equals( target ) ) {
+// return;
+// }
+//
+// if ( current != null ) {
+// // save state
+// fLastState = getViewerState();
+// cacheViewerState( current, fLastState );
+// }
+//
+// showViewer();
+// getViewer().setInput( target );
+//
+// // restore state
+// if ( target != null ) {
+// AbstractViewerState state = (AbstractViewerState)fSelectionStates.get( target );
+// if ( state == null ) {
+// // attempt to restore selection/expansion based on last target
+// state = fLastState;
+// }
+// if ( state != null ) {
+// state.restoreState( getModulesViewer() );
+// }
+// }
}
- protected TreeViewer createTreeViewer( Composite parent ) {
+ protected Viewer createTreeViewer( Composite parent ) {
CDebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener( this );
JFaceResources.getFontRegistry().addListener( this );
// create the sash form that will contain the tree viewer & text viewer
setSashForm( new SashForm( parent, SWT.NONE ) );
// add tree viewer
- final TreeViewer modulesViewer = new ModulesViewer( getSashForm(), SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL );
- modulesViewer.setContentProvider( createContentProvider() );
- modulesViewer.setLabelProvider( createLabelProvider( modulesViewer ) );
- modulesViewer.setUseHashlookup( true );
+ final ModulesViewer modulesViewer = new ModulesViewer( getSashForm(), SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL, this );
+ modulesViewer.setUseHashlookup( false );
modulesViewer.getControl().addFocusListener( new FocusAdapter() {
/* (non-Javadoc)
@@ -483,9 +390,9 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
modulesViewer.addPostSelectionChangedListener( getTreeSelectionChangedListener() );
getModulesViewSelectionProvider().setUnderlyingSelectionProvider( modulesViewer );
getSite().setSelectionProvider( getModulesViewSelectionProvider() );
- // listen to selection in debug view
- getSite().getPage().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this );
- setEventHandler( createEventHandler() );
+
+ // listen to debug context
+ DebugContextManager.getDefault().addDebugContextListener(this, getSite().getWorkbenchWindow());
return modulesViewer;
}
@@ -537,24 +444,24 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
fSashForm = sashForm;
}
- protected IContentProvider createContentProvider() {
- ModulesViewContentProvider cp = new ModulesViewContentProvider();
- cp.setExceptionHandler( this );
- return cp;
- }
-
- protected IBaseLabelProvider createLabelProvider( StructuredViewer viewer ) {
-// return new DebugViewDecoratingLabelProvider( viewer, new DebugViewInterimLabelProvider( getModelPresentation() ), new DebugViewLabelDecorator( getModelPresentation() ) );
- return getModelPresentation();
- }
-
- protected IDebugModelPresentation getModelPresentation() {
- if ( fModelPresentation == null ) {
- fModelPresentation = new ModulesViewModelPresentation();
- }
- return fModelPresentation;
- }
-
+// protected IContentProvider createContentProvider() {
+// ModulesViewContentProvider cp = new ModulesViewContentProvider();
+// cp.setExceptionHandler( this );
+// return cp;
+// }
+//
+// protected IBaseLabelProvider createLabelProvider( StructuredViewer viewer ) {
+//// return new DebugViewDecoratingLabelProvider( viewer, new DebugViewInterimLabelProvider( getModelPresentation() ), new DebugViewLabelDecorator( getModelPresentation() ) );
+// return getModelPresentation();
+// }
+//
+// protected IDebugModelPresentation getModelPresentation() {
+// if ( fModelPresentation == null ) {
+// fModelPresentation = new ModulesViewModelPresentation();
+// }
+// return fModelPresentation;
+// }
+//
protected ModulesViewSelectionProvider getModulesViewSelectionProvider() {
return fSelectionProvider;
}
@@ -671,10 +578,6 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
return fDetailDocument;
}
- protected AbstractDebugEventHandler createEventHandler() {
- return new ModulesViewEventHandler( this );
- }
-
protected void updateSelectionDependentActions() {
}
@@ -686,7 +589,7 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
}
protected void createDetailContextMenu( Control menuControl ) {
- MenuManager menuMgr = new MenuManager(); //$NON-NLS-1$
+ MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown( true );
menuMgr.addMenuListener( new IMenuListener() {
@@ -886,11 +789,8 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
*/
protected void becomesVisible() {
super.becomesVisible();
- IViewPart part = getSite().getPage().findView( IDebugUIConstants.ID_DEBUG_VIEW );
- if ( part != null ) {
- ISelection selection = getSite().getPage().getSelection( IDebugUIConstants.ID_DEBUG_VIEW );
- selectionChanged( part, selection );
- }
+ ISelection selection = DebugContextManager.getDefault().getActiveContext( getSite().getWorkbenchWindow() );
+ contextActivated( selection, null );
}
private void computeDetail( final Object element ) {
@@ -1018,4 +918,70 @@ public class ModulesView extends AbstractDebugEventHandlerView implements IDebug
}
fImageCache.clear();
}
+
+ protected void restoreState() {
+ ModulesViewer viewer = (ModulesViewer)getViewer();
+ if ( viewer != null ) {
+ Object context = viewer.getInput();
+ if ( context != null ) {
+ AbstractViewerState state = getCachedViewerState( context );
+ if ( state == null ) {
+ // attempt to restore selection/expansion based on last
+ // frame
+ state = fLastState;
+ }
+ if ( state != null ) {
+ state.restoreState( viewer );
+ }
+ }
+ }
+ }
+
+ /**
+ * Caches the given viewer state for the given viewer input.
+ *
+ * @param input viewer input
+ * @param state viewer state
+ */
+ protected void cacheViewerState( Object input, AbstractViewerState state ) {
+ // generate a key for the input based on its hashcode, we don't
+ // want to maintain reference real model objects preventing GCs.
+ fSelectionStates.put( generateKey( input ), state );
+ }
+
+ /**
+ * Generate a key for an input object.
+ *
+ * @param input
+ * @return key
+ */
+ protected Object generateKey( Object input ) {
+ return new Integer( input.hashCode() );
+ }
+
+ /**
+ * Returns the cached viewer state for the given viewer input or
+ * null
if none.
+ *
+ * @param input viewer input
+ * @return viewer state or null
+ */
+ protected AbstractViewerState getCachedViewerState( Object input ) {
+ return (AbstractViewerState)fSelectionStates.get( generateKey( input ) );
+ }
+
+ public void contextActivated( ISelection selection, IWorkbenchPart part ) {
+ if ( !isAvailable() || !isVisible() ) {
+ return;
+ }
+ if ( selection instanceof IStructuredSelection ) {
+ setViewerInput( ((IStructuredSelection)selection).getFirstElement() );
+ }
+ showViewer();
+ }
+
+ public void contextChanged( ISelection selection, IWorkbenchPart part ) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewContentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewContentProvider.java
deleted file mode 100644
index aefcc7c8b61..00000000000
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewContentProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems 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:
- * QNX Software Systems - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.internal.ui.views.modules;
-
-import java.util.HashMap;
-import org.eclipse.cdt.core.model.CModelException;
-import org.eclipse.cdt.core.model.IBinary;
-import org.eclipse.cdt.core.model.IParent;
-import org.eclipse.cdt.debug.core.model.ICDebugTarget;
-import org.eclipse.cdt.debug.core.model.ICModule;
-import org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler;
-import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Provides content for the Modules view.
- */
-public class ModulesViewContentProvider implements ITreeContentProvider {
-
- /**
- * A table that maps children to their parent element such that this
- * content provider can walk back up the parent chain.
- */
- private HashMap fParentCache;
-
- /**
- * Handler for exceptions as content is retrieved
- */
- private IDebugExceptionHandler fExceptionHandler;
-
- /**
- * Constructor for ModulesViewContentProvider.
- */
- public ModulesViewContentProvider() {
- setParentCache( new HashMap( 10 ) );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
- */
- public Object[] getChildren( Object parent ) {
- if ( parent instanceof ICDebugTarget ) {
- Object[] children = null;
- ICDebugTarget target = (ICDebugTarget)parent;
- try {
- if ( target != null )
- children = target.getModules();
- if ( children != null ) {
- cache( parent, children );
- return children;
- }
- }
- catch( DebugException e ) {
- if ( getExceptionHandler() != null )
- getExceptionHandler().handleException( e );
- else
- CDebugUIPlugin.log( e );
- }
- }
- else if ( parent instanceof ICModule ) {
- IBinary binary = (IBinary)((ICModule)parent).getAdapter( IBinary.class );
- if ( binary != null ) {
- try {
- return binary.getChildren();
- }
- catch( CModelException e ) {
- }
- }
- }
- else if ( parent instanceof IParent ) {
- try {
- return ((IParent)parent).getChildren();
- }
- catch( CModelException e ) {
- }
- }
- return new Object[0];
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
- */
- public Object getParent( Object element ) {
- return getParentCache().get( element );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
- */
- public boolean hasChildren( Object parent ) {
- if ( parent instanceof ICDebugTarget ) {
- try {
- ICDebugTarget target = (ICDebugTarget)parent;
- return target.hasModules();
- }
- catch( DebugException e ) {
- CDebugUIPlugin.log( e );
- }
- }
- else if ( parent instanceof ICModule ) {
- IBinary binary = (IBinary)((ICModule)parent).getAdapter( IBinary.class );
- if ( binary != null ) {
- return binary.hasChildren();
- }
- }
- else if ( parent instanceof IParent ) {
- return ((IParent)parent).hasChildren();
- }
- return false;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
- */
- public Object[] getElements( Object inputElement ) {
- return getChildren( inputElement );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IContentProvider#dispose()
- */
- public void dispose() {
- setParentCache( null );
- setExceptionHandler( null );
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
- */
- public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
- clearCache();
- }
-
- protected void setExceptionHandler( IDebugExceptionHandler handler ) {
- fExceptionHandler = handler;
- }
-
- protected IDebugExceptionHandler getExceptionHandler() {
- return fExceptionHandler;
- }
-
- private HashMap getParentCache() {
- return fParentCache;
- }
-
- private void setParentCache( HashMap parentCache ) {
- fParentCache = parentCache;
- }
-
- protected void cache( Object parent, Object[] children ) {
- for ( int i = 0; i < children.length; i++ ) {
- getParentCache().put( children[i], parent );
- }
- }
-
- protected void clearCache() {
- if ( getParentCache() != null ) {
- getParentCache().clear();
- }
- }
-}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewEventHandler.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewEventHandler.java
index ebec1604165..e678dde63f2 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewEventHandler.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewEventHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
+ * Copyright (c) 2004 QNX Software Systems 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
@@ -11,60 +11,65 @@
package org.eclipse.cdt.debug.internal.ui.views.modules;
import org.eclipse.cdt.debug.core.model.ICModule;
-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.ui.AbstractDebugView;
+import org.eclipse.debug.internal.ui.viewers.AbstractModelProxy;
+import org.eclipse.debug.internal.ui.viewers.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
+import org.eclipse.debug.internal.ui.viewers.update.ModelDelta;
/**
- * Updates the Modules view.
+ * Comment for .
*/
-public class ModulesViewEventHandler extends AbstractDebugEventHandler {
+public class ModulesViewEventHandler extends DebugEventHandler {
/**
* Constructor for ModulesViewEventHandler.
*/
- public ModulesViewEventHandler( AbstractDebugView view ) {
- super( view );
+ public ModulesViewEventHandler( AbstractModelProxy proxy ) {
+ super( proxy );
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler#doHandleDebugEvents(org.eclipse.debug.core.DebugEvent[])
+ * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handlesEvent(org.eclipse.debug.core.DebugEvent)
*/
- protected void doHandleDebugEvents( DebugEvent[] events ) {
- for ( int i = 0; i < events.length; i++ ) {
- DebugEvent event = events[i];
- switch( event.getKind() ) {
- case DebugEvent.CREATE:
- case DebugEvent.TERMINATE:
- if ( event.getSource() instanceof IDebugTarget || event.getSource() instanceof ICModule )
- refresh();
- break;
- case DebugEvent.CHANGE :
- if ( event.getSource() instanceof ICModule )
- refresh( event.getSource() );
- break;
- }
+ protected boolean handlesEvent( DebugEvent event ) {
+ if ( event.getKind() == DebugEvent.CREATE ||
+ event.getKind() == DebugEvent.TERMINATE ||
+ event.getKind() == DebugEvent.CHANGE )
+ return true;
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handleChange(org.eclipse.debug.core.DebugEvent)
+ */
+ protected void handleChange( DebugEvent event ) {
+ if ( event.getSource() instanceof ICModule )
+ fireDelta( new ModelDelta( event.getSource(), IModelDelta.CHANGED | IModelDelta.STATE ) );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handleCreate(org.eclipse.debug.core.DebugEvent)
+ */
+ protected void handleCreate( DebugEvent event ) {
+ if ( event.getSource() instanceof IDebugTarget ) {
+ refreshRoot( event );
+ }
+ else if ( event.getSource() instanceof ICModule ) {
+ fireDelta( new ModelDelta( event.getSource(), IModelDelta.ADDED ) );
}
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler#refresh()
+ * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handleTerminate(org.eclipse.debug.core.DebugEvent)
*/
- public void refresh() {
- if ( isAvailable() ) {
- getView().showViewer();
- getTreeViewer().refresh();
+ protected void handleTerminate( DebugEvent event ) {
+ if ( event.getSource() instanceof IDebugTarget ) {
+ refreshRoot( event );
}
- }
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler#refresh(java.lang.Object)
- */
- protected void refresh( Object element ) {
- if ( isAvailable() ) {
- getView().showViewer();
- getTreeViewer().refresh( element );
- getTreeViewer().setSelection( getTreeViewer().getSelection() );
+ else if ( event.getSource() instanceof ICModule ) {
+ fireDelta( new ModelDelta( event.getSource(), IModelDelta.REMOVED ) );
}
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewModelProxy.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewModelProxy.java
new file mode 100644
index 00000000000..7fd8d411a67
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewModelProxy.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004 QNX Software Systems 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:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.views.modules;
+
+import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
+import org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy;
+
+/**
+ * Default update for modules view.
+ */
+public class ModulesViewModelProxy extends EventHandlerModelProxy {
+
+ /**
+ * Constructor for ModulesViewModelProxy.
+ */
+ public ModulesViewModelProxy() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy#createEventHandlers()
+ */
+ protected DebugEventHandler[] createEventHandlers() {
+ return new DebugEventHandler[] { new ModulesViewEventHandler( this ) };
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewer.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewer.java
index 196d90bd060..70c021f3431 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewer.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2005 QNX Software Systems and others.
+ * Copyright (c) 2004 QNX Software Systems 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
@@ -10,45 +10,108 @@
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.views.modules;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.internal.ui.elements.adapters.AsynchronousDebugLabelAdapter;
+import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer;
+import org.eclipse.debug.internal.ui.viewers.IAsynchronousLabelAdapter;
+import org.eclipse.debug.internal.ui.viewers.IAsynchronousRequestMonitor;
+import org.eclipse.debug.internal.ui.viewers.IAsynchronousTreeContentAdapter;
+import org.eclipse.debug.internal.ui.viewers.IModelProxy;
+import org.eclipse.debug.internal.ui.viewers.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.IPresentationContext;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.progress.UIJob;
/**
- * The modules viewer used by the Modules view.
+ * Asynchronous viewer used by the Modules view.
*/
-public class ModulesViewer extends TreeViewer {
+public class ModulesViewer extends AsynchronousTreeViewer {
+
+ static class ModuleProxyFactory implements IModelProxyFactory {
- /**
- * Constructor for ModulesViewer.
- */
- public ModulesViewer( Composite parent ) {
- super( parent );
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.IModelProxyFactory#createModelProxy(java.lang.Object, org.eclipse.debug.internal.ui.viewers.IPresentationContext)
+ */
+ public IModelProxy createModelProxy( Object element, IPresentationContext context ) {
+ IWorkbenchPart part = context.getPart();
+ if ( part != null ) {
+ String id = part.getSite().getId();
+ if ( ICDebugUIConstants.ID_MODULES_VIEW.equals( id ) ) {
+ if ( element instanceof IAdaptable ) {
+ ICDebugTarget target = (ICDebugTarget)((IAdaptable)element).getAdapter( ICDebugTarget.class );
+ if ( target != null )
+ return new ModulesViewModelProxy();
+ }
+ }
+ }
+ return null;
+ }
}
+ private static IAsynchronousLabelAdapter fgModuleLabelAdapter = new AsynchronousDebugLabelAdapter();
+ private static IAsynchronousTreeContentAdapter fgModuleTreeContentAdapter = new ModuleTreeContentAdapter();
+ private static IModelProxyFactory fgModuleProxyFactory = new ModuleProxyFactory();
+
+ protected ModulesView fView;
+
+ private UIJob fRestoreJob = new UIJob( "restore viewer state" ) { //$NON-NLS-1$
+
+ public IStatus runInUIThread( IProgressMonitor monitor ) {
+ fView.restoreState();
+ return Status.OK_STATUS;
+ }
+ };
+
/**
* Constructor for ModulesViewer.
*/
- public ModulesViewer( Composite parent, int style ) {
+ public ModulesViewer( Composite parent, int style, ModulesView view ) {
super( parent, style );
- }
-
- /**
- * Constructor for ModulesViewer.
- */
- public ModulesViewer( Tree tree ) {
- super( tree );
+ fView = view;
+ fRestoreJob.setSystem( true );
}
/* (non-Javadoc)
- * @see org.eclipse.jface.viewers.Viewer#refresh()
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#updateComplete(org.eclipse.debug.internal.ui.viewers.IAsynchronousRequestMonitor)
*/
- public void refresh() {
- super.refresh();
- ISelection selection = getSelection();
- if ( !selection.isEmpty() ) {
- setSelection( selection );
+ protected void updateComplete( IAsynchronousRequestMonitor update ) {
+ super.updateComplete( update );
+ if ( fView != null ) {
+ fRestoreJob.schedule( 100 );
}
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#handlePresentationFailure(org.eclipse.debug.internal.ui.viewers.IAsynchronousRequestMonitor, org.eclipse.core.runtime.IStatus)
+ */
+ protected void handlePresentationFailure( IAsynchronousRequestMonitor update, IStatus status ) {
+ fView.showMessage( status.getMessage() );
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer#getTreeContentAdapter(java.lang.Object)
+ */
+ protected IAsynchronousTreeContentAdapter getTreeContentAdapter( Object element ) {
+ return fgModuleTreeContentAdapter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#getLabelAdapter(java.lang.Object)
+ */
+ protected IAsynchronousLabelAdapter getLabelAdapter( Object element ) {
+ return fgModuleLabelAdapter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.internal.ui.viewers.AsynchronousViewer#getModelProxyFactoryAdapter(java.lang.Object)
+ */
+ protected IModelProxyFactory getModelProxyFactoryAdapter( Object element ) {
+ return fgModuleProxyFactory;
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewerState.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewerState.java
index b4372170dfa..166921c10af 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewerState.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/modules/ModulesViewerState.java
@@ -10,14 +10,15 @@
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.views.modules;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.debug.core.model.ICModule;
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.cdt.debug.internal.ui.views.AbstractViewerState;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer;
+import org.eclipse.debug.internal.ui.viewers.TreePath;
+import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
/**
@@ -28,7 +29,7 @@ public class ModulesViewerState extends AbstractViewerState {
/**
* Constructor for ModulesViewerState.
*/
- public ModulesViewerState( TreeViewer viewer ) {
+ public ModulesViewerState( AsynchronousTreeViewer viewer ) {
super( viewer );
}
@@ -36,61 +37,46 @@ public class ModulesViewerState extends AbstractViewerState {
* @see org.eclipse.cdt.debug.internal.ui.views.AbstractViewerState#encodeElement(org.eclipse.swt.widgets.TreeItem)
*/
protected IPath encodeElement( TreeItem item ) throws DebugException {
- String name = getTreeItemName( item );
- IPath path = new Path( name );
+ StringBuffer path = new StringBuffer( item.getText() );
TreeItem parent = item.getParentItem();
while( parent != null ) {
- name = getTreeItemName( parent );
- path = new Path( name ).append( path );
+ path.insert( 0, parent.getText() + IPath.SEPARATOR );
parent = parent.getParentItem();
}
- return path;
+ return new Path( path.toString() );
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.debug.internal.ui.views.AbstractViewerState#decodePath(org.eclipse.core.runtime.IPath, org.eclipse.jface.viewers.TreeViewer)
+ * @see org.eclipse.cdt.debug.internal.ui.views.AbstractViewerState#decodePath(org.eclipse.core.runtime.IPath, org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer)
*/
- protected Object decodePath( IPath path, TreeViewer viewer ) throws DebugException {
- ITreeContentProvider contentProvider = (ITreeContentProvider)viewer.getContentProvider();
+ protected TreePath decodePath( IPath path, AsynchronousTreeViewer viewer ) throws DebugException {
String[] names = path.segments();
- Object parent = viewer.getInput();
- Object element = null;
+ Tree tree = viewer.getTree();
+ TreeItem[] items = tree.getItems();
+ List elements = new ArrayList();
+ elements.add( viewer.getInput() );
+ boolean pathFound = false;
for( int i = 0; i < names.length; i++ ) {
- element = null;
- Object[] children = contentProvider.getChildren( parent );
- for( int j = 0; j < children.length; j++ ) {
- String name = getElementName( children[j] );
- if ( names[i].equals( name ) ) {
- element = children[j];
- break;
- }
+ String name = names[i];
+ TreeItem item = findItem( name, items );
+ if ( item != null ) {
+ pathFound = true;
+ elements.add( item.getData() );
+ items = item.getItems();
}
- if ( element == null ) {
- return null;
- }
- parent = element;
}
- return element;
+ if ( pathFound ) {
+ return new TreePath( elements.toArray() );
+ }
+ return null;
}
- private String getTreeItemName( TreeItem item ) {
- Object data = item.getData();
- String name = null;
- if ( data instanceof ICModule ) {
- name = ((ICModule)data).getName();
- }
- else if ( data instanceof ICElement ) {
- name = ((ICElement)data).getElementName();
- }
- return name;
- }
-
- private String getElementName( Object element ) {
- if ( element instanceof ICModule ) {
- return ((ICModule)element).getName();
- }
- if ( element instanceof ICElement ) {
- return ((ICElement)element).getElementName();
+ private TreeItem findItem( String name, TreeItem[] items ) {
+ for( int i = 0; i < items.length; i++ ) {
+ TreeItem item = items[i];
+ if ( item.getText().equals( name ) ) {
+ return item;
+ }
}
return null;
}