mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Bug 82264: Enhance the Shared Libraries view.
This commit is contained in:
parent
461f0b0ef0
commit
4fe2f1e7d8
22 changed files with 2514 additions and 963 deletions
|
@ -1,3 +1,28 @@
|
||||||
|
2005-02-07 Mikhail Khodjaiants
|
||||||
|
Bug 82264: Enhance the Shared Libraries view.
|
||||||
|
* CDebugUIMessages.properties
|
||||||
|
* CDebugImages.java
|
||||||
|
* CDebugModelPresentation.java
|
||||||
|
* CDTDebugModelPresentation.java: removed
|
||||||
|
* ICDebugHelpContextIds.java
|
||||||
|
* ActionMessages.properties
|
||||||
|
* CollapseAllModulesAction.java: new
|
||||||
|
* ToggleDetailPaneAction.java: new
|
||||||
|
* ICDebugPreferenceConstants.java
|
||||||
|
* DebugViewDecoratingLabelProvider.java: new
|
||||||
|
* DebugViewInterimLabelProvider.java: new
|
||||||
|
* DebugViewLabelDecorator.java: new
|
||||||
|
* org.eclipse.cdt.debug.internal.ui.views.modules: new package
|
||||||
|
* ModulesMessages.properties: new
|
||||||
|
* ModulesMessages.java: new
|
||||||
|
* ModulesView.java: new
|
||||||
|
* ModulesViewContentProvider.java: new
|
||||||
|
* ModulesViewer.java: new
|
||||||
|
* ModulesViewEventHandler.java: new
|
||||||
|
* CDebugUIPlugin.java
|
||||||
|
* plugin.xml
|
||||||
|
* plugin.properties
|
||||||
|
|
||||||
2005-02-07 Mikhail Khodjaiants
|
2005-02-07 Mikhail Khodjaiants
|
||||||
Added images for the "Collapse All" action of the modules view.
|
Added images for the "Collapse All" action of the modules view.
|
||||||
* icons\full\clcl16\collapseall.gif
|
* icons\full\clcl16\collapseall.gif
|
||||||
|
|
|
@ -14,6 +14,7 @@ providerName=Eclipse.org
|
||||||
|
|
||||||
MemoryView.name=Memory
|
MemoryView.name=Memory
|
||||||
SharedLibrariesView.name=Shared Libraries
|
SharedLibrariesView.name=Shared Libraries
|
||||||
|
ModulesView.name=Modules
|
||||||
SignalsView.name=Signals
|
SignalsView.name=Signals
|
||||||
|
|
||||||
CDebuggerPage.name=C Debugger UI Page
|
CDebuggerPage.name=C Debugger UI Page
|
||||||
|
@ -116,3 +117,6 @@ DebuggingCContext.description=Debugging C/C++ Programs
|
||||||
CommonBreakpointPage.label=Common
|
CommonBreakpointPage.label=Common
|
||||||
FilteringBreakpointPage.label=Filtering
|
FilteringBreakpointPage.label=Filtering
|
||||||
CommonSignalPage.label=Common
|
CommonSignalPage.label=Common
|
||||||
|
|
||||||
|
CollapseAllModulesAction.label=Collapse All
|
||||||
|
CollapseAllModulesAction.tooltip=Collapse All
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.debug.ui.debugModelPresentations">
|
point="org.eclipse.debug.ui.debugModelPresentations">
|
||||||
<debugModelPresentation
|
<debugModelPresentation
|
||||||
class="org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation"
|
class="org.eclipse.cdt.debug.internal.ui.CDebugModelPresentation"
|
||||||
id="org.eclipse.cdt.debug.core">
|
id="org.eclipse.cdt.debug.core">
|
||||||
</debugModelPresentation>
|
</debugModelPresentation>
|
||||||
</extension>
|
</extension>
|
||||||
|
@ -61,6 +61,12 @@
|
||||||
class="org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView"
|
class="org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView"
|
||||||
id="org.eclipse.cdt.debug.ui.DisassemblyView">
|
id="org.eclipse.cdt.debug.ui.DisassemblyView">
|
||||||
</view>
|
</view>
|
||||||
|
<view
|
||||||
|
icon="icons/full/cview16/modules_view.gif"
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.views.modules.ModulesView"
|
||||||
|
category="org.eclipse.debug.ui"
|
||||||
|
name="%ModulesView.name"
|
||||||
|
id="org.eclipse.cdt.debug.ui.ModulesView"/>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.perspectiveExtensions">
|
point="org.eclipse.ui.perspectiveExtensions">
|
||||||
|
@ -102,6 +108,12 @@
|
||||||
<actionSet
|
<actionSet
|
||||||
id="org.eclipse.cdt.debug.ui.debugActionSet">
|
id="org.eclipse.cdt.debug.ui.debugActionSet">
|
||||||
</actionSet>
|
</actionSet>
|
||||||
|
<view
|
||||||
|
visible="false"
|
||||||
|
relative="org.eclipse.debug.ui.VariableView"
|
||||||
|
relationship="stack"
|
||||||
|
id="org.eclipse.cdt.debug.ui.ModulesView"/>
|
||||||
|
<viewShortcut id="org.eclipse.cdt.debug.ui.ModulesView"/>
|
||||||
</perspectiveExtension>
|
</perspectiveExtension>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
|
@ -886,6 +898,21 @@
|
||||||
<separator name="emptyRefreshGroup"/>
|
<separator name="emptyRefreshGroup"/>
|
||||||
</menu>
|
</menu>
|
||||||
</viewContribution>
|
</viewContribution>
|
||||||
|
<viewContribution
|
||||||
|
targetID="org.eclipse.cdt.debug.ui.ModulesView"
|
||||||
|
id="org.eclipse.debug.ui.modulesView.toolbar">
|
||||||
|
<action
|
||||||
|
helpContextId="collapse_all_modules_context"
|
||||||
|
disabledIcon="icons/full/dlcl16/collapseall.gif"
|
||||||
|
hoverIcon="icons/full/clcl16/collapseall.gif"
|
||||||
|
toolbarPath="additions"
|
||||||
|
label="%CollapseAllModulesAction.label"
|
||||||
|
tooltip="%CollapseAllModulesAction.tooltip"
|
||||||
|
icon="icons/full/elcl16/collapseall.gif"
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.actions.CollapseAllModulesAction"
|
||||||
|
style="push"
|
||||||
|
id="org.eclipse.cdt.debug.ui.CollapseAllModulesAction"/>
|
||||||
|
</viewContribution>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.editorActions">
|
point="org.eclipse.ui.editorActions">
|
||||||
|
|
|
@ -1,914 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* 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 Common Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/cpl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
***********************************************************************/
|
|
||||||
package org.eclipse.cdt.debug.internal.ui;
|
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import org.eclipse.cdt.core.resources.FileStorage;
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugUtils;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIExitInfo;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryEvent;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISignalExitInfo;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointScope;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointTrigger;
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
|
|
||||||
import org.eclipse.cdt.debug.core.model.CDebugElementState;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICDebugElement;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICDebugElementStatus;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICGlobalVariable;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICSharedLibrary;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICSignal;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICThread;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICType;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICValue;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICVariable;
|
|
||||||
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
|
||||||
import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
|
|
||||||
import org.eclipse.cdt.debug.core.model.IEnableDisableTarget;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.EditorInputDelegate;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
|
||||||
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
|
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
|
||||||
import org.eclipse.core.resources.IMarker;
|
|
||||||
import org.eclipse.core.resources.IResource;
|
|
||||||
import org.eclipse.core.resources.IStorage;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.Path;
|
|
||||||
import org.eclipse.debug.core.DebugException;
|
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
|
||||||
import org.eclipse.debug.core.model.IBreakpoint;
|
|
||||||
import org.eclipse.debug.core.model.IDebugTarget;
|
|
||||||
import org.eclipse.debug.core.model.IDisconnect;
|
|
||||||
import org.eclipse.debug.core.model.IExpression;
|
|
||||||
import org.eclipse.debug.core.model.IRegister;
|
|
||||||
import org.eclipse.debug.core.model.IRegisterGroup;
|
|
||||||
import org.eclipse.debug.core.model.IStackFrame;
|
|
||||||
import org.eclipse.debug.core.model.ITerminate;
|
|
||||||
import org.eclipse.debug.core.model.IThread;
|
|
||||||
import org.eclipse.debug.core.model.IValue;
|
|
||||||
import org.eclipse.debug.core.model.IVariable;
|
|
||||||
import org.eclipse.debug.core.model.IWatchExpression;
|
|
||||||
import org.eclipse.debug.internal.ui.DebugUIPlugin;
|
|
||||||
import org.eclipse.debug.ui.DebugUITools;
|
|
||||||
import org.eclipse.debug.ui.IDebugModelPresentation;
|
|
||||||
import org.eclipse.debug.ui.IDebugUIConstants;
|
|
||||||
import org.eclipse.debug.ui.IValueDetailListener;
|
|
||||||
import org.eclipse.jface.resource.ImageDescriptor;
|
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
|
||||||
import org.eclipse.swt.graphics.Image;
|
|
||||||
import org.eclipse.ui.IEditorDescriptor;
|
|
||||||
import org.eclipse.ui.IEditorInput;
|
|
||||||
import org.eclipse.ui.IEditorRegistry;
|
|
||||||
import org.eclipse.ui.PlatformUI;
|
|
||||||
import org.eclipse.ui.part.FileEditorInput;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Responsible for providing labels, images, and editors associated with debug elements in the CDT debug model.
|
|
||||||
*/
|
|
||||||
public class CDTDebugModelPresentation extends LabelProvider implements IDebugModelPresentation {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Qualified names presentation property (value <code>"org.eclipse.debug.ui.displayQualifiedNames"</code>). When <code>DISPLAY_QUALIFIED_NAMES</code>
|
|
||||||
* is set to <code>True</code>, this label provider should use fully qualified type names when rendering elements. When set to <code>False</code> ,this
|
|
||||||
* label provider should use simple names when rendering elements.
|
|
||||||
*
|
|
||||||
* @see #setAttribute(String, Object)
|
|
||||||
*/
|
|
||||||
public final static String DISPLAY_FULL_PATHS = "DISPLAY_FULL_PATHS"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private static final String DUMMY_STACKFRAME_LABEL = "..."; //$NON-NLS-1$
|
|
||||||
|
|
||||||
protected HashMap fAttributes = new HashMap( 3 );
|
|
||||||
|
|
||||||
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
|
|
||||||
|
|
||||||
private static CDTDebugModelPresentation fInstance = null;
|
|
||||||
|
|
||||||
private OverlayImageCache fImageCache = new OverlayImageCache();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for CDTDebugModelPresentation.
|
|
||||||
*/
|
|
||||||
public CDTDebugModelPresentation() {
|
|
||||||
super();
|
|
||||||
fInstance = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CDTDebugModelPresentation getDefault() {
|
|
||||||
return fInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.IDebugModelPresentation#setAttribute(String, Object)
|
|
||||||
*/
|
|
||||||
public void setAttribute( String attribute, Object value ) {
|
|
||||||
if ( value != null ) {
|
|
||||||
fAttributes.put( attribute, value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.IDebugModelPresentation#computeDetail(IValue, IValueDetailListener)
|
|
||||||
*/
|
|
||||||
public void computeDetail( IValue value, IValueDetailListener listener ) {
|
|
||||||
CValueDetailProvider.getDefault().computeDetail( value, listener );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(Object)
|
|
||||||
*/
|
|
||||||
public IEditorInput getEditorInput( Object element ) {
|
|
||||||
if ( element instanceof IMarker ) {
|
|
||||||
IResource resource = ((IMarker)element).getResource();
|
|
||||||
if ( resource instanceof IFile )
|
|
||||||
return new FileEditorInput( (IFile)resource );
|
|
||||||
}
|
|
||||||
if ( element instanceof IFile ) {
|
|
||||||
return new FileEditorInput( (IFile)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof ICLineBreakpoint ) {
|
|
||||||
IFile file = (IFile)((ICLineBreakpoint)element).getMarker().getResource().getAdapter( IFile.class );
|
|
||||||
if ( file != null )
|
|
||||||
return new FileEditorInput( file );
|
|
||||||
}
|
|
||||||
if ( element instanceof FileStorage ) {
|
|
||||||
return new ExternalEditorInput( (IStorage)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof FileNotFoundElement ) {
|
|
||||||
return new EditorInputDelegate( (FileNotFoundElement)element );
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(IEditorInput, Object)
|
|
||||||
*/
|
|
||||||
public String getEditorId( IEditorInput input, Object element ) {
|
|
||||||
if ( input instanceof EditorInputDelegate ) {
|
|
||||||
if ( ((EditorInputDelegate)input).getDelegate() == null )
|
|
||||||
return CDebugEditor.EDITOR_ID;
|
|
||||||
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
|
|
||||||
}
|
|
||||||
String id = null;
|
|
||||||
if ( input != null ) {
|
|
||||||
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
|
|
||||||
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
|
|
||||||
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
|
|
||||||
}
|
|
||||||
if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
|
|
||||||
return CDebugEditor.EDITOR_ID;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.ILabelProvider#getImage(Object)
|
|
||||||
*/
|
|
||||||
public Image getImage( Object element ) {
|
|
||||||
Image baseImage = getBaseImage( element );
|
|
||||||
if ( baseImage != null ) {
|
|
||||||
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
|
||||||
if ( element instanceof ICDebugElementStatus && !((ICDebugElementStatus)element).isOK() ) {
|
|
||||||
switch( ((ICDebugElementStatus)element).getSeverity() ) {
|
|
||||||
case ICDebugElementStatus.WARNING:
|
|
||||||
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_WARNING;
|
|
||||||
break;
|
|
||||||
case ICDebugElementStatus.ERROR:
|
|
||||||
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( element instanceof IWatchExpression && ((IWatchExpression)element).hasErrors() )
|
|
||||||
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_ERROR;
|
|
||||||
if ( element instanceof ICVariable && ((ICVariable)element).isArgument() )
|
|
||||||
overlays[OverlayImageDescriptor.TOP_RIGHT] = CDebugImages.DESC_OVRS_ARGUMENT;
|
|
||||||
if ( element instanceof ICGlobalVariable && !(element instanceof IRegister) )
|
|
||||||
overlays[OverlayImageDescriptor.TOP_RIGHT] = CDebugImages.DESC_OVRS_GLOBAL;
|
|
||||||
return fImageCache.getImageFor( new OverlayImageDescriptor( baseImage, overlays ) );
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Image getBaseImage( Object element ) {
|
|
||||||
if ( element instanceof ICDebugTarget ) {
|
|
||||||
ICDebugTarget target = (ICDebugTarget)element;
|
|
||||||
if ( target.isPostMortem() ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED ) );
|
|
||||||
}
|
|
||||||
if ( target.isTerminated() || target.isDisconnected() ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED ) );
|
|
||||||
}
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET ) );
|
|
||||||
}
|
|
||||||
if ( element instanceof ICThread ) {
|
|
||||||
ICThread thread = (ICThread)element;
|
|
||||||
ICDebugTarget target = (ICDebugTarget)thread.getDebugTarget();
|
|
||||||
if ( target.isPostMortem() ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED ) );
|
|
||||||
}
|
|
||||||
if ( thread.isSuspended() ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED ) );
|
|
||||||
}
|
|
||||||
else if ( thread.isTerminated() ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED ) );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_RUNNING ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if ( element instanceof IMarker ) {
|
|
||||||
IBreakpoint bp = getBreakpoint( (IMarker)element );
|
|
||||||
if ( bp != null && bp instanceof ICBreakpoint ) {
|
|
||||||
return getBreakpointImage( (ICBreakpoint)bp );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( element instanceof ICBreakpoint ) {
|
|
||||||
return getBreakpointImage( (ICBreakpoint)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof IRegisterGroup ) {
|
|
||||||
return getRegisterGroupImage( (IRegisterGroup)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof IExpression ) {
|
|
||||||
return getExpressionImage( (IExpression)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof IRegister ) {
|
|
||||||
return getRegisterImage( (IRegister)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof IVariable ) {
|
|
||||||
return getVariableImage( (IVariable)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof ICSharedLibrary ) {
|
|
||||||
return getSharedLibraryImage( (ICSharedLibrary)element );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( CoreException e ) {
|
|
||||||
}
|
|
||||||
return super.getImage( element );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.ui.ILabelProvider#getText(Object)
|
|
||||||
*/
|
|
||||||
public String getText( Object element ) {
|
|
||||||
StringBuffer baseText = new StringBuffer( getBaseText( element ) );
|
|
||||||
if ( element instanceof ICDebugElementStatus && !((ICDebugElementStatus)element).isOK() ) {
|
|
||||||
baseText.append( getFormattedString( " <{0}>", ((ICDebugElementStatus)element).getMessage() ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if ( element instanceof IAdaptable ) {
|
|
||||||
IEnableDisableTarget target = (IEnableDisableTarget)((IAdaptable)element).getAdapter( IEnableDisableTarget.class );
|
|
||||||
if ( target != null ) {
|
|
||||||
if ( !target.isEnabled() ) {
|
|
||||||
baseText.append( ' ' );
|
|
||||||
baseText.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.25" ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return baseText.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getBaseText( Object element ) {
|
|
||||||
boolean showQualified = isShowQualifiedNames();
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
try {
|
|
||||||
if ( element instanceof ICSharedLibrary ) {
|
|
||||||
label.append( getSharedLibraryText( (ICSharedLibrary)element, showQualified ) );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof ICSignal ) {
|
|
||||||
label.append( getSignalText( (ICSignal)element ) );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof IRegisterGroup ) {
|
|
||||||
label.append( ((IRegisterGroup)element).getName() );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof IWatchExpression ) {
|
|
||||||
return getWatchExpressionText( (IWatchExpression)element );
|
|
||||||
}
|
|
||||||
if ( element instanceof IVariable ) {
|
|
||||||
label.append( getVariableText( (IVariable)element ) );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof IValue ) {
|
|
||||||
label.append( getValueText( (IValue)element ) );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof IStackFrame ) {
|
|
||||||
label.append( getStackFrameText( (IStackFrame)element, showQualified ) );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
if ( element instanceof IMarker ) {
|
|
||||||
IBreakpoint breakpoint = getBreakpoint( (IMarker)element );
|
|
||||||
if ( breakpoint != null ) {
|
|
||||||
return getBreakpointText( breakpoint, showQualified );
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if ( element instanceof IBreakpoint ) {
|
|
||||||
return getBreakpointText( (IBreakpoint)element, showQualified );
|
|
||||||
}
|
|
||||||
if ( element instanceof IDebugTarget )
|
|
||||||
label.append( getTargetText( (IDebugTarget)element, showQualified ) );
|
|
||||||
else if ( element instanceof IThread )
|
|
||||||
label.append( getThreadText( (IThread)element, showQualified ) );
|
|
||||||
if ( element instanceof ITerminate ) {
|
|
||||||
if ( ((ITerminate)element).isTerminated() ) {
|
|
||||||
label.insert( 0, CDebugUIMessages.getString( "CDTDebugModelPresentation.0" ) ); //$NON-NLS-1$
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( element instanceof IDisconnect ) {
|
|
||||||
if ( ((IDisconnect)element).isDisconnected() ) {
|
|
||||||
label.insert( 0, CDebugUIMessages.getString( "CDTDebugModelPresentation.1" ) ); //$NON-NLS-1$
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( label.length() > 0 ) {
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( DebugException e ) {
|
|
||||||
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.2" ), new String[] { e.getMessage() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
catch( CoreException e ) {
|
|
||||||
CDebugUIPlugin.log( e );
|
|
||||||
}
|
|
||||||
return getDefaultText( element );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isShowQualifiedNames() {
|
|
||||||
Boolean showQualified = (Boolean)fAttributes.get( DISPLAY_FULL_PATHS );
|
|
||||||
showQualified = showQualified == null ? Boolean.FALSE : showQualified;
|
|
||||||
return showQualified.booleanValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isShowVariableTypeNames() {
|
|
||||||
Boolean show = (Boolean)fAttributes.get( DISPLAY_VARIABLE_TYPE_NAMES );
|
|
||||||
show = show == null ? Boolean.FALSE : show;
|
|
||||||
return show.booleanValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getTargetText( IDebugTarget target, boolean qualified ) throws DebugException {
|
|
||||||
ICDebugTarget t = (ICDebugTarget)target.getAdapter( ICDebugTarget.class );
|
|
||||||
if ( t != null ) {
|
|
||||||
if ( !t.isPostMortem() ) {
|
|
||||||
CDebugElementState state = t.getState();
|
|
||||||
if ( state.equals( CDebugElementState.EXITED ) ) {
|
|
||||||
Object info = t.getCurrentStateInfo();
|
|
||||||
String label = CDebugUIMessages.getString( "CDTDebugModelPresentation.3" ); //$NON-NLS-1$
|
|
||||||
String reason = ""; //$NON-NLS-1$
|
|
||||||
if ( info != null && info instanceof ICDISignalExitInfo ) {
|
|
||||||
ICDISignalExitInfo sigInfo = (ICDISignalExitInfo)info;
|
|
||||||
reason = ' ' + MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.5" ), new String[]{ sigInfo.getName(), sigInfo.getDescription() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( info != null && info instanceof ICDIExitInfo ) {
|
|
||||||
reason = ' ' + MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.6" ), new Integer[] { new Integer( ((ICDIExitInfo)info).getCode() ) } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return MessageFormat.format( label, new String[] { target.getName(), reason } );
|
|
||||||
}
|
|
||||||
else if ( state.equals( CDebugElementState.SUSPENDED ) ) {
|
|
||||||
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.7" ), new String[] { target.getName() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return target.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getThreadText( IThread thread, boolean qualified ) throws DebugException {
|
|
||||||
ICDebugTarget target = (ICDebugTarget)thread.getDebugTarget().getAdapter( ICDebugTarget.class );
|
|
||||||
if ( target.isPostMortem() ) {
|
|
||||||
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.8" ), thread.getName() ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if ( thread.isTerminated() ) {
|
|
||||||
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.9" ), thread.getName() ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if ( thread.isStepping() ) {
|
|
||||||
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.10" ), thread.getName() ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if ( !thread.isSuspended() ) {
|
|
||||||
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.11" ), thread.getName() ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
if ( thread.isSuspended() ) {
|
|
||||||
String reason = ""; //$NON-NLS-1$
|
|
||||||
ICDebugElement element = (ICDebugElement)thread.getAdapter( ICDebugElement.class );
|
|
||||||
if ( element != null ) {
|
|
||||||
Object info = element.getCurrentStateInfo();
|
|
||||||
if ( info != null && info instanceof ICDISignalReceived ) {
|
|
||||||
ICDISignal signal = ((ICDISignalReceived)info).getSignal();
|
|
||||||
reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.13" ), new String[]{ signal.getName(), signal.getDescription() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( info != null && info instanceof ICDIWatchpointTrigger ) {
|
|
||||||
reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.14" ), new String[]{ ((ICDIWatchpointTrigger)info).getOldValue(), ((ICDIWatchpointTrigger)info).getNewValue() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( info != null && info instanceof ICDIWatchpointScope ) {
|
|
||||||
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.15" ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( info != null && info instanceof ICDIBreakpointHit ) {
|
|
||||||
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.16" ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( info != null && info instanceof ICDISharedLibraryEvent ) {
|
|
||||||
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.17" ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.18" ), new String[] { thread.getName(), reason } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.19" ), new String[] { thread.getName() } ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getStackFrameText( IStackFrame f, boolean qualified ) throws DebugException {
|
|
||||||
if ( f instanceof ICStackFrame ) {
|
|
||||||
ICStackFrame frame = (ICStackFrame)f;
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
label.append( frame.getLevel() );
|
|
||||||
label.append( ' ' );
|
|
||||||
String function = frame.getFunction();
|
|
||||||
if ( function != null ) {
|
|
||||||
function = function.trim();
|
|
||||||
if ( function.length() > 0 ) {
|
|
||||||
label.append( function );
|
|
||||||
label.append( "() " ); //$NON-NLS-1$
|
|
||||||
if ( frame.getFile() != null ) {
|
|
||||||
IPath path = new Path( frame.getFile() );
|
|
||||||
if ( !path.isEmpty() ) {
|
|
||||||
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.20" ) ); //$NON-NLS-1$
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( (qualified ? path.toOSString() : path.lastSegment()) );
|
|
||||||
label.append( ':' );
|
|
||||||
if ( frame.getFrameLineNumber() != 0 )
|
|
||||||
label.append( frame.getFrameLineNumber() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isEmpty( function ) )
|
|
||||||
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.21" ) ); //$NON-NLS-1$
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
return (f.getAdapter( IDummyStackFrame.class ) != null) ? getDummyStackFrameLabel( f ) : f.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getDummyStackFrameLabel( IStackFrame stackFrame ) {
|
|
||||||
return DUMMY_STACKFRAME_LABEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getWatchExpressionText( IWatchExpression expression ) {
|
|
||||||
StringBuffer result = new StringBuffer();
|
|
||||||
result.append( '"' ).append( expression.getExpressionText() ).append( '"' );
|
|
||||||
if ( expression.isPending() ) {
|
|
||||||
result.append( " = " ).append( "..." ); //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
IValue value = expression.getValue();
|
|
||||||
if ( value instanceof ICValue ) {
|
|
||||||
ICType type = null;
|
|
||||||
try {
|
|
||||||
type = ((ICValue)value).getType();
|
|
||||||
}
|
|
||||||
catch( DebugException e1 ) {
|
|
||||||
}
|
|
||||||
if ( type != null && isShowVariableTypeNames() ) {
|
|
||||||
String typeName = getVariableTypeName( type );
|
|
||||||
if ( !isEmpty( typeName ) ) {
|
|
||||||
result.insert( 0, typeName + ' ' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( expression.isEnabled() ) {
|
|
||||||
String valueString = getValueText( value );
|
|
||||||
if ( valueString.length() > 0 ) {
|
|
||||||
result.append( " = " ).append( valueString ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !expression.isEnabled() ) {
|
|
||||||
result.append( ' ' );
|
|
||||||
result.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.22" ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getVariableText( IVariable var ) throws DebugException {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
if ( var instanceof ICVariable ) {
|
|
||||||
ICType type = null;
|
|
||||||
try {
|
|
||||||
type = ((ICVariable)var).getType();
|
|
||||||
}
|
|
||||||
catch( DebugException e ) {
|
|
||||||
// don't display type
|
|
||||||
}
|
|
||||||
if ( type != null && isShowVariableTypeNames() ) {
|
|
||||||
String typeName = getVariableTypeName( type );
|
|
||||||
if ( typeName != null && typeName.length() > 0 ) {
|
|
||||||
label.append( typeName ).append( ' ' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String name = var.getName();
|
|
||||||
if ( name != null )
|
|
||||||
label.append( name.trim() );
|
|
||||||
IValue value = var.getValue();
|
|
||||||
if ( value != null ) {
|
|
||||||
String valueString = getValueText( value );
|
|
||||||
if ( !isEmpty( valueString ) ) {
|
|
||||||
label.append( " = " ); //$NON-NLS-1$
|
|
||||||
label.append( valueString );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getValueText( IValue value )/* throws DebugException*/ {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
if ( value instanceof ICDebugElementStatus && !((ICDebugElementStatus)value).isOK() ) {
|
|
||||||
label.append( getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.4" ), ((ICDebugElementStatus)value).getMessage() ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
else if ( value instanceof ICValue ) {
|
|
||||||
ICType type = null;
|
|
||||||
try {
|
|
||||||
type = ((ICValue)value).getType();
|
|
||||||
}
|
|
||||||
catch( DebugException e ) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String valueString = value.getValueString();
|
|
||||||
if ( valueString != null ) {
|
|
||||||
valueString = valueString.trim();
|
|
||||||
if ( type != null && type.isCharacter() ) {
|
|
||||||
if ( valueString.length() == 0 )
|
|
||||||
valueString = "."; //$NON-NLS-1$
|
|
||||||
label.append( valueString );
|
|
||||||
}
|
|
||||||
else if ( type != null && type.isFloatingPointType() ) {
|
|
||||||
Number floatingPointValue = CDebugUtils.getFloatingPointValue( (ICValue)value );
|
|
||||||
if ( CDebugUtils.isNaN( floatingPointValue ) )
|
|
||||||
valueString = "NAN"; //$NON-NLS-1$
|
|
||||||
if ( CDebugUtils.isPositiveInfinity( floatingPointValue ) )
|
|
||||||
valueString = CDebugUIMessages.getString( "CDTDebugModelPresentation.23" ); //$NON-NLS-1$
|
|
||||||
if ( CDebugUtils.isNegativeInfinity( floatingPointValue ) )
|
|
||||||
valueString = CDebugUIMessages.getString( "CDTDebugModelPresentation.24" ); //$NON-NLS-1$
|
|
||||||
label.append( valueString );
|
|
||||||
}
|
|
||||||
else if ( type == null || (!type.isArray() && !type.isStructure()) ) {
|
|
||||||
if ( valueString.length() > 0 ) {
|
|
||||||
label.append( valueString );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( DebugException e1 ) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getSharedLibraryText( ICSharedLibrary library, boolean qualified ) {
|
|
||||||
String label = new String();
|
|
||||||
IPath path = new Path( library.getFileName() );
|
|
||||||
if ( !path.isEmpty() )
|
|
||||||
label += (qualified ? path.toOSString() : path.lastSegment());
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getSignalText( ICSignal signal ) {
|
|
||||||
StringBuffer sb = new StringBuffer( CDebugUIMessages.getString( "CDTDebugModelPresentation.12" ) ); //$NON-NLS-1$
|
|
||||||
try {
|
|
||||||
String name = signal.getName();
|
|
||||||
sb.append( " \'" ).append( name ).append( '\'' ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
catch( DebugException e ) {
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plug in the single argument to the resource String for the key to get a formatted resource String.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static String getFormattedString( String key, String arg ) {
|
|
||||||
return getFormattedString( key, new String[]{ arg } );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plug in the arguments to the resource String for the key to get a formatted resource String.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static String getFormattedString( String string, String[] args ) {
|
|
||||||
return MessageFormat.format( string, args );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getBreakpointImage( ICBreakpoint breakpoint ) throws CoreException {
|
|
||||||
if ( breakpoint instanceof ICLineBreakpoint ) {
|
|
||||||
return getLineBreakpointImage( (ICLineBreakpoint)breakpoint );
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICWatchpoint ) {
|
|
||||||
return getWatchpointImage( (ICWatchpoint)breakpoint );
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getLineBreakpointImage( ICLineBreakpoint breakpoint ) throws CoreException {
|
|
||||||
ImageDescriptor descriptor = null;
|
|
||||||
if ( breakpoint.isEnabled() ) {
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_BREAKPOINT_ENABLED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_BREAKPOINT_DISABLED;
|
|
||||||
}
|
|
||||||
return fImageCache.getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( descriptor ), computeBreakpointOverlays( breakpoint ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getWatchpointImage( ICWatchpoint watchpoint ) throws CoreException {
|
|
||||||
ImageDescriptor descriptor = null;
|
|
||||||
if ( watchpoint.isEnabled() ) {
|
|
||||||
if ( watchpoint.isReadType() && !watchpoint.isWriteType() )
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_READ_WATCHPOINT_ENABLED;
|
|
||||||
else if ( !watchpoint.isReadType() && watchpoint.isWriteType() )
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_WRITE_WATCHPOINT_ENABLED;
|
|
||||||
else
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_WATCHPOINT_ENABLED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ( watchpoint.isReadType() && !watchpoint.isWriteType() )
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_READ_WATCHPOINT_DISABLED;
|
|
||||||
else if ( !watchpoint.isReadType() && watchpoint.isWriteType() )
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_WRITE_WATCHPOINT_DISABLED;
|
|
||||||
else
|
|
||||||
descriptor = CDebugImages.DESC_OBJS_WATCHPOINT_DISABLED;
|
|
||||||
}
|
|
||||||
return fImageCache.getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( descriptor ), computeBreakpointOverlays( watchpoint ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IBreakpoint getBreakpoint( IMarker marker ) {
|
|
||||||
return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint( marker );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getBreakpointText( IBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
|
||||||
if ( breakpoint instanceof ICAddressBreakpoint ) {
|
|
||||||
return getAddressBreakpointText( (ICAddressBreakpoint)breakpoint, qualified );
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICFunctionBreakpoint ) {
|
|
||||||
return getFunctionBreakpointText( (ICFunctionBreakpoint)breakpoint, qualified );
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICLineBreakpoint ) {
|
|
||||||
return getLineBreakpointText( (ICLineBreakpoint)breakpoint, qualified );
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICWatchpoint ) {
|
|
||||||
return getWatchpointText( (ICWatchpoint)breakpoint, qualified );
|
|
||||||
}
|
|
||||||
return ""; //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getLineBreakpointText( ICLineBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
appendSourceName( breakpoint, label, qualified );
|
|
||||||
appendLineNumber( breakpoint, label );
|
|
||||||
appendIgnoreCount( breakpoint, label );
|
|
||||||
appendCondition( breakpoint, label );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getWatchpointText( ICWatchpoint watchpoint, boolean qualified ) throws CoreException {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
appendSourceName( watchpoint, label, qualified );
|
|
||||||
appendWatchExpression( watchpoint, label );
|
|
||||||
appendIgnoreCount( watchpoint, label );
|
|
||||||
appendCondition( watchpoint, label );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getAddressBreakpointText( ICAddressBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
appendSourceName( breakpoint, label, qualified );
|
|
||||||
appendAddress( breakpoint, label );
|
|
||||||
appendIgnoreCount( breakpoint, label );
|
|
||||||
appendCondition( breakpoint, label );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getFunctionBreakpointText( ICFunctionBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
|
||||||
StringBuffer label = new StringBuffer();
|
|
||||||
appendSourceName( breakpoint, label, qualified );
|
|
||||||
appendFunction( breakpoint, label );
|
|
||||||
appendIgnoreCount( breakpoint, label );
|
|
||||||
appendCondition( breakpoint, label );
|
|
||||||
return label.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuffer appendSourceName( ICBreakpoint breakpoint, StringBuffer label, boolean qualified ) throws CoreException {
|
|
||||||
String handle = breakpoint.getSourceHandle();
|
|
||||||
if ( !isEmpty( handle ) ) {
|
|
||||||
IPath path = new Path( handle );
|
|
||||||
if ( path.isValidPath( handle ) ) {
|
|
||||||
label.append( qualified ? path.toOSString() : path.lastSegment() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuffer appendLineNumber( ICLineBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
|
||||||
int lineNumber = breakpoint.getLineNumber();
|
|
||||||
if ( lineNumber > 0 ) {
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.26" ), new String[]{ Integer.toString( lineNumber ) } ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuffer appendAddress( ICAddressBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
|
||||||
try {
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.27" ), new String[]{ breakpoint.getAddress() } ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
catch( NumberFormatException e ) {
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuffer appendFunction( ICFunctionBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
|
||||||
String function = breakpoint.getFunction();
|
|
||||||
if ( function != null && function.trim().length() > 0 ) {
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.28" ), new String[]{ function.trim() } ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuffer appendIgnoreCount( ICBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
|
||||||
int ignoreCount = breakpoint.getIgnoreCount();
|
|
||||||
if ( ignoreCount > 0 ) {
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.29" ), new String[]{ Integer.toString( ignoreCount ) } ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void appendCondition( ICBreakpoint breakpoint, StringBuffer buffer ) throws CoreException {
|
|
||||||
String condition = breakpoint.getCondition();
|
|
||||||
if ( condition != null && condition.length() > 0 ) {
|
|
||||||
buffer.append( ' ' );
|
|
||||||
buffer.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.30" ) ); //$NON-NLS-1$
|
|
||||||
buffer.append( ' ' );
|
|
||||||
buffer.append( condition );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void appendWatchExpression( ICWatchpoint watchpoint, StringBuffer label ) throws CoreException {
|
|
||||||
String expression = watchpoint.getExpression();
|
|
||||||
if ( expression != null && expression.length() > 0 ) {
|
|
||||||
label.append( ' ' );
|
|
||||||
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.31" ) ); //$NON-NLS-1$
|
|
||||||
label.append( " \'" ); //$NON-NLS-1$
|
|
||||||
label.append( expression );
|
|
||||||
label.append( '\'' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ImageDescriptor[] computeBreakpointOverlays( ICBreakpoint breakpoint ) {
|
|
||||||
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
|
||||||
try {
|
|
||||||
if ( breakpoint.isConditional() ) {
|
|
||||||
overlays[OverlayImageDescriptor.TOP_LEFT] = (breakpoint.isEnabled()) ? CDebugImages.DESC_OVRS_BREAKPOINT_CONDITIONAL : CDebugImages.DESC_OVRS_BREAKPOINT_CONDITIONAL_DISABLED;
|
|
||||||
}
|
|
||||||
if ( breakpoint.isInstalled() ) {
|
|
||||||
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = (breakpoint.isEnabled()) ? CDebugImages.DESC_OVRS_BREAKPOINT_INSTALLED : CDebugImages.DESC_OVRS_BREAKPOINT_INSTALLED_DISABLED;
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICAddressBreakpoint ) {
|
|
||||||
overlays[OverlayImageDescriptor.TOP_RIGHT] = (breakpoint.isEnabled()) ? CDebugImages.DESC_OVRS_ADDRESS_BREAKPOINT : CDebugImages.DESC_OVRS_ADDRESS_BREAKPOINT_DISABLED;
|
|
||||||
}
|
|
||||||
if ( breakpoint instanceof ICFunctionBreakpoint ) {
|
|
||||||
overlays[OverlayImageDescriptor.TOP_RIGHT] = (breakpoint.isEnabled()) ? CDebugImages.DESC_OVRS_FUNCTION_BREAKPOINT : CDebugImages.DESC_OVRS_FUNCTION_BREAKPOINT_DISABLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( CoreException e ) {
|
|
||||||
CDebugUIPlugin.log( e );
|
|
||||||
}
|
|
||||||
return overlays;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getVariableImage( IVariable element ) {
|
|
||||||
if ( element instanceof ICVariable ) {
|
|
||||||
ICType type = null;
|
|
||||||
try {
|
|
||||||
type = ((ICVariable)element).getType();
|
|
||||||
}
|
|
||||||
catch( DebugException e ) {
|
|
||||||
// use default image
|
|
||||||
}
|
|
||||||
if ( type != null && (type.isPointer() || type.isReference()) )
|
|
||||||
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_POINTER : CDebugImages.DESC_OBJS_VARIABLE_POINTER_DISABLED );
|
|
||||||
else if ( type != null && (type.isArray() || type.isStructure()) )
|
|
||||||
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_AGGREGATE : CDebugImages.DESC_OBJS_VARIABLE_AGGREGATE_DISABLED );
|
|
||||||
else
|
|
||||||
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_SIMPLE : CDebugImages.DESC_OBJS_VARIABLE_SIMPLE_DISABLED );
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getRegisterGroupImage( IRegisterGroup element ) {
|
|
||||||
IEnableDisableTarget target = (IEnableDisableTarget)element.getAdapter( IEnableDisableTarget.class );
|
|
||||||
if ( target != null && !target.isEnabled() )
|
|
||||||
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP_DISABLED );
|
|
||||||
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getRegisterImage( IRegister element ) {
|
|
||||||
return ( ( element instanceof ICVariable && ((ICVariable)element).isEnabled() ) ) ? fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER ) : fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_DISABLED );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getExpressionImage( IExpression element ) {
|
|
||||||
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_EXPRESSION ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getSharedLibraryImage( ICSharedLibrary element ) {
|
|
||||||
if ( element.areSymbolsLoaded() ) {
|
|
||||||
return fImageCache.getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( CDebugImages.DESC_OBJS_LOADED_SHARED_LIBRARY ), new ImageDescriptor[]{ null, CDebugImages.DESC_OVRS_SYMBOLS, null, null } ) );
|
|
||||||
}
|
|
||||||
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SHARED_LIBRARY );
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getVariableTypeName( ICType type ) {
|
|
||||||
StringBuffer result = new StringBuffer();
|
|
||||||
String typeName = type.getName();
|
|
||||||
if ( typeName != null )
|
|
||||||
typeName = typeName.trim();
|
|
||||||
if ( type.isArray() && typeName != null ) {
|
|
||||||
int index = typeName.indexOf( '[' );
|
|
||||||
if ( index != -1 )
|
|
||||||
typeName = typeName.substring( 0, index ).trim();
|
|
||||||
}
|
|
||||||
if ( typeName != null && typeName.length() > 0 ) {
|
|
||||||
result.append( typeName );
|
|
||||||
if ( type.isArray() ) {
|
|
||||||
int[] dims = type.getArrayDimensions();
|
|
||||||
for( int i = 0; i < dims.length; ++i ) {
|
|
||||||
result.append( '[' );
|
|
||||||
result.append( dims[i] );
|
|
||||||
result.append( ']' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
|
||||||
*/
|
|
||||||
public void dispose() {
|
|
||||||
fImageCache.disposeAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isEmpty( String str ) {
|
|
||||||
return (str == null || str.length() == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a default text label for the debug element
|
|
||||||
*/
|
|
||||||
protected String getDefaultText( Object element ) {
|
|
||||||
return DebugUIPlugin.getDefaultLabelProvider().getText( element );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a default image for the debug element
|
|
||||||
*/
|
|
||||||
protected Image getDefaultImage( Object element ) {
|
|
||||||
return DebugUIPlugin.getDefaultLabelProvider().getImage( element );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -95,7 +95,9 @@ public class CDebugImages
|
||||||
public static final String IMG_OBJS_PROJECT = NAME_PREFIX + "project_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PROJECT = NAME_PREFIX + "project_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_CLOSED_PROJECT = NAME_PREFIX + "cproject_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_CLOSED_PROJECT = NAME_PREFIX + "cproject_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_FOLDER = NAME_PREFIX + "folder_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_FOLDER = NAME_PREFIX + "folder_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_LOADED_SHARED_LIBRARY = NAME_PREFIX + "library_syms_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_EXECUTABLE_WITH_SYMBOLS = NAME_PREFIX + "exec_dbg_obj.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_OBJS_EXECUTABLE = NAME_PREFIX + "exec_obj.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_OBJS_SHARED_LIBRARY_WITH_SYMBOLS = NAME_PREFIX + "library_syms_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_SHARED_LIBRARY = NAME_PREFIX + "library_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_SHARED_LIBRARY = NAME_PREFIX + "library_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_SIGNAL = NAME_PREFIX + "signal_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_SIGNAL = NAME_PREFIX + "signal_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_WORKSPACE_SOURCE_FILE = NAME_PREFIX + "prj_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_WORKSPACE_SOURCE_FILE = NAME_PREFIX + "prj_file_obj.gif"; //$NON-NLS-1$
|
||||||
|
@ -112,6 +114,10 @@ public class CDebugImages
|
||||||
public static final String IMG_LCL_CAST_TO_TYPE = NAME_PREFIX + "casttotype_co.gif"; //$NON-NLS-1$
|
public static final String IMG_LCL_CAST_TO_TYPE = NAME_PREFIX + "casttotype_co.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_LCL_DISPLAY_AS_ARRAY = NAME_PREFIX + "showasarray_co.gif"; //$NON-NLS-1$
|
public static final String IMG_LCL_DISPLAY_AS_ARRAY = NAME_PREFIX + "showasarray_co.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_LCL_RESUME_AT_LINE = NAME_PREFIX + "jump_co.gif"; //$NON-NLS-1$
|
public static final String IMG_LCL_RESUME_AT_LINE = NAME_PREFIX + "jump_co.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_LCL_DETAIL_PANE_UNDER = NAME_PREFIX + "det_pane_under.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_LCL_DETAIL_PANE_RIGHT = NAME_PREFIX + "det_pane_right.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_LCL_DETAIL_PANE_HIDE = NAME_PREFIX + "det_pane_hide.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_LCL_COLLAPSE_ALL = NAME_PREFIX + "collapseall.gif"; //$NON-NLS-1$
|
||||||
|
|
||||||
public static final String IMG_TOOLS_ADD_DIR_SOURCE_LOCATION = NAME_PREFIX + "adddirsource_wiz.gif"; //$NON-NLS-1$
|
public static final String IMG_TOOLS_ADD_DIR_SOURCE_LOCATION = NAME_PREFIX + "adddirsource_wiz.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_TOOLS_ADD_PRJ_SOURCE_LOCATION = NAME_PREFIX + "addprjsource_wiz.gif"; //$NON-NLS-1$
|
public static final String IMG_TOOLS_ADD_PRJ_SOURCE_LOCATION = NAME_PREFIX + "addprjsource_wiz.gif"; //$NON-NLS-1$
|
||||||
|
@ -128,6 +134,7 @@ public class CDebugImages
|
||||||
private static final String T_WIZBAN = "wizban"; //$NON-NLS-1$
|
private static final String T_WIZBAN = "wizban"; //$NON-NLS-1$
|
||||||
private static final String T_LCL = "lcl16"; //$NON-NLS-1$
|
private static final String T_LCL = "lcl16"; //$NON-NLS-1$
|
||||||
private static final String T_CLCL = "clcl16"; //$NON-NLS-1$
|
private static final String T_CLCL = "clcl16"; //$NON-NLS-1$
|
||||||
|
private static final String T_ELCL = "elcl16"; //$NON-NLS-1$
|
||||||
private static final String T_DLCL = "dlcl16"; //$NON-NLS-1$
|
private static final String T_DLCL = "dlcl16"; //$NON-NLS-1$
|
||||||
private static final String T_CTOOL = "ctool16"; //$NON-NLS-1$
|
private static final String T_CTOOL = "ctool16"; //$NON-NLS-1$
|
||||||
// private static final String T_CVIEW = "cview16"; //$NON-NLS-1$
|
// private static final String T_CVIEW = "cview16"; //$NON-NLS-1$
|
||||||
|
@ -171,7 +178,9 @@ public class CDebugImages
|
||||||
public static final ImageDescriptor DESC_OBJS_PROJECT = createManaged( T_OBJ, IMG_OBJS_PROJECT );
|
public static final ImageDescriptor DESC_OBJS_PROJECT = createManaged( T_OBJ, IMG_OBJS_PROJECT );
|
||||||
public static final ImageDescriptor DESC_OBJS_CLOSED_PROJECT = createManaged( T_OBJ, IMG_OBJS_CLOSED_PROJECT );
|
public static final ImageDescriptor DESC_OBJS_CLOSED_PROJECT = createManaged( T_OBJ, IMG_OBJS_CLOSED_PROJECT );
|
||||||
public static final ImageDescriptor DESC_OBJS_FOLDER = createManaged( T_OBJ, IMG_OBJS_FOLDER );
|
public static final ImageDescriptor DESC_OBJS_FOLDER = createManaged( T_OBJ, IMG_OBJS_FOLDER );
|
||||||
public static final ImageDescriptor DESC_OBJS_LOADED_SHARED_LIBRARY = createManaged( T_OBJ, IMG_OBJS_LOADED_SHARED_LIBRARY );
|
public static final ImageDescriptor DESC_OBJS_EXECUTABLE_WITH_SYMBOLS = createManaged( T_OBJ, IMG_OBJS_EXECUTABLE_WITH_SYMBOLS );
|
||||||
|
public static final ImageDescriptor DESC_OBJS_EXECUTABLE = createManaged( T_OBJ, IMG_OBJS_EXECUTABLE );
|
||||||
|
public static final ImageDescriptor DESC_OBJS_SHARED_LIBRARY_WITH_SYMBOLS = createManaged( T_OBJ, IMG_OBJS_SHARED_LIBRARY_WITH_SYMBOLS );
|
||||||
public static final ImageDescriptor DESC_OBJS_SHARED_LIBRARY = createManaged( T_OBJ, IMG_OBJS_SHARED_LIBRARY );
|
public static final ImageDescriptor DESC_OBJS_SHARED_LIBRARY = createManaged( T_OBJ, IMG_OBJS_SHARED_LIBRARY );
|
||||||
public static final ImageDescriptor DESC_OBJS_SIGNAL = createManaged( T_OBJ, IMG_OBJS_SIGNAL );
|
public static final ImageDescriptor DESC_OBJS_SIGNAL = createManaged( T_OBJ, IMG_OBJS_SIGNAL );
|
||||||
public static final ImageDescriptor DESC_OBJS_WORKSPACE_SOURCE_FILE = createManaged( T_OBJ, IMG_OBJS_WORKSPACE_SOURCE_FILE );
|
public static final ImageDescriptor DESC_OBJS_WORKSPACE_SOURCE_FILE = createManaged( T_OBJ, IMG_OBJS_WORKSPACE_SOURCE_FILE );
|
||||||
|
@ -185,6 +194,14 @@ public class CDebugImages
|
||||||
public static final ImageDescriptor DESC_LCL_DISPLAY_AS_ARRAY = createManaged( T_CLCL, IMG_LCL_DISPLAY_AS_ARRAY );
|
public static final ImageDescriptor DESC_LCL_DISPLAY_AS_ARRAY = createManaged( T_CLCL, IMG_LCL_DISPLAY_AS_ARRAY );
|
||||||
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE = createManaged( T_CLCL, IMG_LCL_RESUME_AT_LINE );
|
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE = createManaged( T_CLCL, IMG_LCL_RESUME_AT_LINE );
|
||||||
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE_DISABLED = createManaged( T_DLCL, IMG_LCL_RESUME_AT_LINE );
|
public static final ImageDescriptor DESC_LCL_RESUME_AT_LINE_DISABLED = createManaged( T_DLCL, IMG_LCL_RESUME_AT_LINE );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_UNDER = createManaged( T_ELCL, IMG_LCL_DETAIL_PANE_UNDER );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_UNDER_DISABLED = createManaged( T_DLCL, IMG_LCL_DETAIL_PANE_UNDER );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_RIGHT = createManaged( T_ELCL, IMG_LCL_DETAIL_PANE_RIGHT );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_RIGHT_DISABLED = createManaged( T_DLCL, IMG_LCL_DETAIL_PANE_RIGHT );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_HIDE = createManaged( T_ELCL, IMG_LCL_DETAIL_PANE_HIDE );
|
||||||
|
public static final ImageDescriptor DESC_LCL_DETAIL_PANE_HIDE_DISABLED = createManaged( T_DLCL, IMG_LCL_DETAIL_PANE_HIDE );
|
||||||
|
public static final ImageDescriptor DESC_LCL_COLLAPSE_ALL = createManaged( T_ELCL, IMG_LCL_COLLAPSE_ALL );
|
||||||
|
public static final ImageDescriptor DESC_LCL_COLLAPSE_ALL_DISABLED = createManaged( T_DLCL, IMG_LCL_COLLAPSE_ALL );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the image managed under the given key in this registry.
|
* Returns the image managed under the given key in this registry.
|
||||||
|
|
|
@ -10,29 +10,80 @@
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.ui;
|
package org.eclipse.cdt.debug.internal.ui;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.resources.FileStorage;
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDIExitInfo;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDISharedLibraryEvent;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDISignalExitInfo;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDISignalReceived;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointScope;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDIWatchpointTrigger;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
|
||||||
|
import org.eclipse.cdt.debug.core.model.CDebugElementState;
|
||||||
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
|
||||||
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICDebugElement;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICDebugElementStatus;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
||||||
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICGlobalVariable;
|
||||||
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICModule;
|
||||||
import org.eclipse.cdt.debug.core.model.ICSharedLibrary;
|
import org.eclipse.cdt.debug.core.model.ICSharedLibrary;
|
||||||
import org.eclipse.cdt.debug.core.model.ICSignal;
|
import org.eclipse.cdt.debug.core.model.ICSignal;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICThread;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICType;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICValue;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICVariable;
|
||||||
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IEnableDisableTarget;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.editors.CDebugEditor;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.editors.EditorInputDelegate;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IMarker;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IStorage;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.model.IBreakpoint;
|
||||||
|
import org.eclipse.debug.core.model.IDebugTarget;
|
||||||
|
import org.eclipse.debug.core.model.IDisconnect;
|
||||||
|
import org.eclipse.debug.core.model.IExpression;
|
||||||
|
import org.eclipse.debug.core.model.IRegister;
|
||||||
import org.eclipse.debug.core.model.IRegisterGroup;
|
import org.eclipse.debug.core.model.IRegisterGroup;
|
||||||
|
import org.eclipse.debug.core.model.IStackFrame;
|
||||||
|
import org.eclipse.debug.core.model.ITerminate;
|
||||||
|
import org.eclipse.debug.core.model.IThread;
|
||||||
import org.eclipse.debug.core.model.IValue;
|
import org.eclipse.debug.core.model.IValue;
|
||||||
|
import org.eclipse.debug.core.model.IVariable;
|
||||||
|
import org.eclipse.debug.core.model.IWatchExpression;
|
||||||
import org.eclipse.debug.internal.ui.DebugUIPlugin;
|
import org.eclipse.debug.internal.ui.DebugUIPlugin;
|
||||||
|
import org.eclipse.debug.ui.DebugUITools;
|
||||||
import org.eclipse.debug.ui.IDebugModelPresentation;
|
import org.eclipse.debug.ui.IDebugModelPresentation;
|
||||||
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
import org.eclipse.debug.ui.IValueDetailListener;
|
import org.eclipse.debug.ui.IValueDetailListener;
|
||||||
import org.eclipse.jface.resource.ImageDescriptor;
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
import org.eclipse.swt.graphics.Image;
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.ui.IEditorDescriptor;
|
||||||
import org.eclipse.ui.IEditorInput;
|
import org.eclipse.ui.IEditorInput;
|
||||||
|
import org.eclipse.ui.IEditorRegistry;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.part.FileEditorInput;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IDebugModelPresentation
|
* @see IDebugModelPresentation
|
||||||
|
@ -41,6 +92,8 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
|
|
||||||
public final static String DISPLAY_FULL_PATHS = "DISPLAY_FULL_PATHS"; //$NON-NLS-1$
|
public final static String DISPLAY_FULL_PATHS = "DISPLAY_FULL_PATHS"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String DUMMY_STACKFRAME_LABEL = "..."; //$NON-NLS-1$
|
||||||
|
|
||||||
protected HashMap fAttributes = new HashMap( 3 );
|
protected HashMap fAttributes = new HashMap( 3 );
|
||||||
|
|
||||||
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
|
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
|
||||||
|
@ -68,15 +121,32 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
* @see org.eclipse.debug.ui.IDebugModelPresentation#computeDetail(org.eclipse.debug.core.model.IValue, org.eclipse.debug.ui.IValueDetailListener)
|
* @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 ) {
|
public void computeDetail( IValue value, IValueDetailListener listener ) {
|
||||||
// TODO Auto-generated method stub
|
CValueDetailProvider.getDefault().computeDetail( value, listener );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(java.lang.Object)
|
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public IEditorInput getEditorInput( Object element ) {
|
public IEditorInput getEditorInput( Object element ) {
|
||||||
// TODO Auto-generated method stub
|
if ( element instanceof IMarker ) {
|
||||||
|
IResource resource = ((IMarker)element).getResource();
|
||||||
|
if ( resource instanceof IFile )
|
||||||
|
return new FileEditorInput( (IFile)resource );
|
||||||
|
}
|
||||||
|
if ( element instanceof IFile ) {
|
||||||
|
return new FileEditorInput( (IFile)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof ICLineBreakpoint ) {
|
||||||
|
IFile file = (IFile)((ICLineBreakpoint)element).getMarker().getResource().getAdapter( IFile.class );
|
||||||
|
if ( file != null )
|
||||||
|
return new FileEditorInput( file );
|
||||||
|
}
|
||||||
|
if ( element instanceof FileStorage ) {
|
||||||
|
return new ExternalEditorInput( (IStorage)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof FileNotFoundElement ) {
|
||||||
|
return new EditorInputDelegate( (FileNotFoundElement)element );
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,46 +154,116 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
|
* @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public String getEditorId( IEditorInput input, Object element ) {
|
public String getEditorId( IEditorInput input, Object element ) {
|
||||||
// TODO Auto-generated method stub
|
if ( input instanceof EditorInputDelegate ) {
|
||||||
return null;
|
if ( ((EditorInputDelegate)input).getDelegate() == null )
|
||||||
|
return CDebugEditor.EDITOR_ID;
|
||||||
|
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
|
||||||
|
}
|
||||||
|
String id = null;
|
||||||
|
if ( input != null ) {
|
||||||
|
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
|
||||||
|
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
|
||||||
|
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
|
||||||
|
}
|
||||||
|
if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
|
||||||
|
return CDebugEditor.EDITOR_ID;
|
||||||
|
}
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage( Object element ) {
|
public Image getImage( Object element ) {
|
||||||
Image baseImage = getBaseImage( element );
|
Image baseImage = getBaseImage( element );
|
||||||
if ( baseImage != null ) {
|
if ( baseImage != null ) {
|
||||||
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
||||||
|
if ( element instanceof ICDebugElementStatus && !((ICDebugElementStatus)element).isOK() ) {
|
||||||
|
switch( ((ICDebugElementStatus)element).getSeverity() ) {
|
||||||
|
case ICDebugElementStatus.WARNING:
|
||||||
|
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_WARNING;
|
||||||
|
break;
|
||||||
|
case ICDebugElementStatus.ERROR:
|
||||||
|
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( element instanceof IWatchExpression && ((IWatchExpression)element).hasErrors() )
|
||||||
|
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_ERROR;
|
||||||
|
if ( element instanceof ICVariable && ((ICVariable)element).isArgument() )
|
||||||
|
overlays[OverlayImageDescriptor.TOP_RIGHT] = CDebugImages.DESC_OVRS_ARGUMENT;
|
||||||
|
if ( element instanceof ICGlobalVariable && !(element instanceof IRegister) )
|
||||||
|
overlays[OverlayImageDescriptor.TOP_RIGHT] = CDebugImages.DESC_OVRS_GLOBAL;
|
||||||
return getImageCache().getImageFor( new OverlayImageDescriptor( baseImage, overlays ) );
|
return getImageCache().getImageFor( new OverlayImageDescriptor( baseImage, overlays ) );
|
||||||
}
|
}
|
||||||
return getDefaultImage( element );
|
return getDefaultImage( element );
|
||||||
}
|
}
|
||||||
|
|
||||||
private Image getBaseImage( Object element ) {
|
private Image getBaseImage( Object element ) {
|
||||||
if ( element instanceof ICSharedLibrary )
|
if ( element instanceof ICDebugTarget ) {
|
||||||
return getSharedLibraryImage( (ICSharedLibrary)element );
|
ICDebugTarget target = (ICDebugTarget)element;
|
||||||
if ( element instanceof IRegisterGroup )
|
if ( target.isPostMortem() ) {
|
||||||
return getRegisterGroupImage( (IRegisterGroup)element );
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED ) );
|
||||||
if ( element instanceof ICSignal )
|
}
|
||||||
return getSignalImage( (ICSignal)element );
|
if ( target.isTerminated() || target.isDisconnected() ) {
|
||||||
if ( element instanceof ICBreakpoint )
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED ) );
|
||||||
|
}
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET ) );
|
||||||
|
}
|
||||||
|
if ( element instanceof ICThread ) {
|
||||||
|
ICThread thread = (ICThread)element;
|
||||||
|
ICDebugTarget target = (ICDebugTarget)thread.getDebugTarget();
|
||||||
|
if ( target.isPostMortem() ) {
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED ) );
|
||||||
|
}
|
||||||
|
if ( thread.isSuspended() ) {
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED ) );
|
||||||
|
}
|
||||||
|
else if ( thread.isTerminated() ) {
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED ) );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_THREAD_RUNNING ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( element instanceof IMarker ) {
|
||||||
|
IBreakpoint bp = getBreakpoint( (IMarker)element );
|
||||||
|
if ( bp != null && bp instanceof ICBreakpoint ) {
|
||||||
|
return getBreakpointImage( (ICBreakpoint)bp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( element instanceof ICBreakpoint ) {
|
||||||
return getBreakpointImage( (ICBreakpoint)element );
|
return getBreakpointImage( (ICBreakpoint)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof IRegisterGroup ) {
|
||||||
|
return getRegisterGroupImage( (IRegisterGroup)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof IExpression ) {
|
||||||
|
return getExpressionImage( (IExpression)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof IRegister ) {
|
||||||
|
return getRegisterImage( (IRegister)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof IVariable ) {
|
||||||
|
return getVariableImage( (IVariable)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof ICSharedLibrary ) {
|
||||||
|
return getSharedLibraryImage( (ICSharedLibrary)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof ICModule ) {
|
||||||
|
return getModuleImage( (ICModule)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof ICSignal ) {
|
||||||
|
return getSignalImage( (ICSignal)element );
|
||||||
|
}
|
||||||
return super.getImage( element );
|
return super.getImage( element );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Image getSharedLibraryImage( ICSharedLibrary element ) {
|
|
||||||
if ( element.areSymbolsLoaded() ) {
|
|
||||||
return getImageCache().getImageFor(
|
|
||||||
new OverlayImageDescriptor( getDebugImageRegistry().get( CDebugImages.DESC_OBJS_LOADED_SHARED_LIBRARY ),
|
|
||||||
new ImageDescriptor[] { null, CDebugImages.DESC_OVRS_SYMBOLS, null, null } ) );
|
|
||||||
}
|
|
||||||
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SHARED_LIBRARY );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Image getSignalImage( ICSignal signal ) {
|
protected Image getSignalImage( ICSignal signal ) {
|
||||||
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SIGNAL );
|
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SIGNAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Image getRegisterGroupImage( IRegisterGroup element ) {
|
protected Image getRegisterGroupImage( IRegisterGroup element ) {
|
||||||
|
IEnableDisableTarget target = (IEnableDisableTarget)element.getAdapter( IEnableDisableTarget.class );
|
||||||
|
if ( target != null && !target.isEnabled() )
|
||||||
|
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP_DISABLED );
|
||||||
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP );
|
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,31 +310,97 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
else
|
else
|
||||||
descriptor = CDebugImages.DESC_OBJS_WATCHPOINT_DISABLED;
|
descriptor = CDebugImages.DESC_OBJS_WATCHPOINT_DISABLED;
|
||||||
}
|
}
|
||||||
return fImageCache.getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( descriptor ), computeBreakpointOverlays( watchpoint ) ) );
|
return getImageCache().getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( descriptor ), computeBreakpointOverlays( watchpoint ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getText( Object element ) {
|
public String getText( Object element ) {
|
||||||
StringBuffer baseText = new StringBuffer( getBaseText( element ) );
|
StringBuffer baseText = new StringBuffer( getBaseText( element ) );
|
||||||
|
if ( element instanceof ICDebugElementStatus && !((ICDebugElementStatus)element).isOK() ) {
|
||||||
|
baseText.append( getFormattedString( " <{0}>", ((ICDebugElementStatus)element).getMessage() ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( element instanceof IAdaptable ) {
|
||||||
|
IEnableDisableTarget target = (IEnableDisableTarget)((IAdaptable)element).getAdapter( IEnableDisableTarget.class );
|
||||||
|
if ( target != null ) {
|
||||||
|
if ( !target.isEnabled() ) {
|
||||||
|
baseText.append( ' ' );
|
||||||
|
baseText.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.25" ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return baseText.toString();
|
return baseText.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getBaseText( Object element ) {
|
private String getBaseText( Object element ) {
|
||||||
boolean showQualified = isShowQualifiedNames();
|
boolean showQualified = isShowQualifiedNames();
|
||||||
StringBuffer label = new StringBuffer();
|
StringBuffer label = new StringBuffer();
|
||||||
|
try {
|
||||||
if ( element instanceof ICSharedLibrary ) {
|
if ( element instanceof ICSharedLibrary ) {
|
||||||
label.append( getSharedLibraryText( (ICSharedLibrary)element, showQualified ) );
|
label.append( getSharedLibraryText( (ICSharedLibrary)element, showQualified ) );
|
||||||
return label.toString();
|
return label.toString();
|
||||||
}
|
}
|
||||||
if ( element instanceof IRegisterGroup ) {
|
if ( element instanceof ICModule ) {
|
||||||
label.append( getRegisterGroupText( (IRegisterGroup)element ) );
|
label.append( getModuleText( (ICModule)element, showQualified ) );
|
||||||
return label.toString();
|
return label.toString();
|
||||||
}
|
}
|
||||||
|
if ( element instanceof ICSignal ) {
|
||||||
|
label.append( getSignalText( (ICSignal)element ) );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
if ( element instanceof IRegisterGroup ) {
|
||||||
|
label.append( ((IRegisterGroup)element).getName() );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
if ( element instanceof IWatchExpression ) {
|
||||||
|
return getWatchExpressionText( (IWatchExpression)element );
|
||||||
|
}
|
||||||
|
if ( element instanceof IVariable ) {
|
||||||
|
label.append( getVariableText( (IVariable)element ) );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
if ( element instanceof IValue ) {
|
||||||
|
label.append( getValueText( (IValue)element ) );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
if ( element instanceof IStackFrame ) {
|
||||||
|
label.append( getStackFrameText( (IStackFrame)element, showQualified ) );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
if ( element instanceof IMarker ) {
|
||||||
|
IBreakpoint breakpoint = getBreakpoint( (IMarker)element );
|
||||||
|
if ( breakpoint != null ) {
|
||||||
|
return getBreakpointText( breakpoint, showQualified );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( element instanceof IBreakpoint ) {
|
||||||
|
return getBreakpointText( (IBreakpoint)element, showQualified );
|
||||||
|
}
|
||||||
|
if ( element instanceof IDebugTarget )
|
||||||
|
label.append( getTargetText( (IDebugTarget)element, showQualified ) );
|
||||||
|
else if ( element instanceof IThread )
|
||||||
|
label.append( getThreadText( (IThread)element, showQualified ) );
|
||||||
|
if ( element instanceof ITerminate ) {
|
||||||
|
if ( ((ITerminate)element).isTerminated() ) {
|
||||||
|
label.insert( 0, CDebugUIMessages.getString( "CDTDebugModelPresentation.0" ) ); //$NON-NLS-1$
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( element instanceof IDisconnect ) {
|
||||||
|
if ( ((IDisconnect)element).isDisconnected() ) {
|
||||||
|
label.insert( 0, CDebugUIMessages.getString( "CDTDebugModelPresentation.1" ) ); //$NON-NLS-1$
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
if ( label.length() > 0 ) {
|
if ( label.length() > 0 ) {
|
||||||
return label.toString();
|
return label.toString();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.2" ), new String[] { e.getMessage() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
CDebugUIPlugin.log( e );
|
||||||
|
}
|
||||||
return getDefaultText( element );
|
return getDefaultText( element );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,6 +418,19 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getModuleText( ICModule module, boolean qualified ) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
IPath path = module.getImageName();
|
||||||
|
if ( !path.isEmpty() ) {
|
||||||
|
sb.append( path.lastSegment() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sb.append( CDebugUIMessages.getString( "CDebugModelPresentation.unknown_1" ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
sb.append( ( module.areSymbolsLoaded() ) ? CDebugUIMessages.getString( "CDebugModelPresentation.0" ) : CDebugUIMessages.getString( "CDebugModelPresentation.1" ) ); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
protected String getRegisterGroupText( IRegisterGroup group ) {
|
protected String getRegisterGroupText( IRegisterGroup group ) {
|
||||||
String name = CDebugUIMessages.getString( "CDebugModelPresentation.not_available_1" ); //$NON-NLS-1$
|
String name = CDebugUIMessages.getString( "CDebugModelPresentation.not_available_1" ); //$NON-NLS-1$
|
||||||
try {
|
try {
|
||||||
|
@ -259,6 +478,132 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
return DebugUIPlugin.getDefaultLabelProvider().getImage( element );
|
return DebugUIPlugin.getDefaultLabelProvider().getImage( element );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected IBreakpoint getBreakpoint( IMarker marker ) {
|
||||||
|
return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint( marker );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getBreakpointText( IBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
||||||
|
if ( breakpoint instanceof ICAddressBreakpoint ) {
|
||||||
|
return getAddressBreakpointText( (ICAddressBreakpoint)breakpoint, qualified );
|
||||||
|
}
|
||||||
|
if ( breakpoint instanceof ICFunctionBreakpoint ) {
|
||||||
|
return getFunctionBreakpointText( (ICFunctionBreakpoint)breakpoint, qualified );
|
||||||
|
}
|
||||||
|
if ( breakpoint instanceof ICLineBreakpoint ) {
|
||||||
|
return getLineBreakpointText( (ICLineBreakpoint)breakpoint, qualified );
|
||||||
|
}
|
||||||
|
if ( breakpoint instanceof ICWatchpoint ) {
|
||||||
|
return getWatchpointText( (ICWatchpoint)breakpoint, qualified );
|
||||||
|
}
|
||||||
|
return ""; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getLineBreakpointText( ICLineBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
appendSourceName( breakpoint, label, qualified );
|
||||||
|
appendLineNumber( breakpoint, label );
|
||||||
|
appendIgnoreCount( breakpoint, label );
|
||||||
|
appendCondition( breakpoint, label );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getWatchpointText( ICWatchpoint watchpoint, boolean qualified ) throws CoreException {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
appendSourceName( watchpoint, label, qualified );
|
||||||
|
appendWatchExpression( watchpoint, label );
|
||||||
|
appendIgnoreCount( watchpoint, label );
|
||||||
|
appendCondition( watchpoint, label );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getAddressBreakpointText( ICAddressBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
appendSourceName( breakpoint, label, qualified );
|
||||||
|
appendAddress( breakpoint, label );
|
||||||
|
appendIgnoreCount( breakpoint, label );
|
||||||
|
appendCondition( breakpoint, label );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getFunctionBreakpointText( ICFunctionBreakpoint breakpoint, boolean qualified ) throws CoreException {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
appendSourceName( breakpoint, label, qualified );
|
||||||
|
appendFunction( breakpoint, label );
|
||||||
|
appendIgnoreCount( breakpoint, label );
|
||||||
|
appendCondition( breakpoint, label );
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StringBuffer appendSourceName( ICBreakpoint breakpoint, StringBuffer label, boolean qualified ) throws CoreException {
|
||||||
|
String handle = breakpoint.getSourceHandle();
|
||||||
|
if ( !isEmpty( handle ) ) {
|
||||||
|
IPath path = new Path( handle );
|
||||||
|
if ( path.isValidPath( handle ) ) {
|
||||||
|
label.append( qualified ? path.toOSString() : path.lastSegment() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StringBuffer appendLineNumber( ICLineBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
||||||
|
int lineNumber = breakpoint.getLineNumber();
|
||||||
|
if ( lineNumber > 0 ) {
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.26" ), new String[]{ Integer.toString( lineNumber ) } ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StringBuffer appendAddress( ICAddressBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
||||||
|
try {
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.27" ), new String[]{ breakpoint.getAddress() } ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StringBuffer appendFunction( ICFunctionBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
||||||
|
String function = breakpoint.getFunction();
|
||||||
|
if ( function != null && function.trim().length() > 0 ) {
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.28" ), new String[]{ function.trim() } ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StringBuffer appendIgnoreCount( ICBreakpoint breakpoint, StringBuffer label ) throws CoreException {
|
||||||
|
int ignoreCount = breakpoint.getIgnoreCount();
|
||||||
|
if ( ignoreCount > 0 ) {
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.29" ), new String[]{ Integer.toString( ignoreCount ) } ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void appendCondition( ICBreakpoint breakpoint, StringBuffer buffer ) throws CoreException {
|
||||||
|
String condition = breakpoint.getCondition();
|
||||||
|
if ( condition != null && condition.length() > 0 ) {
|
||||||
|
buffer.append( ' ' );
|
||||||
|
buffer.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.30" ) ); //$NON-NLS-1$
|
||||||
|
buffer.append( ' ' );
|
||||||
|
buffer.append( condition );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendWatchExpression( ICWatchpoint watchpoint, StringBuffer label ) throws CoreException {
|
||||||
|
String expression = watchpoint.getExpression();
|
||||||
|
if ( expression != null && expression.length() > 0 ) {
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.31" ) ); //$NON-NLS-1$
|
||||||
|
label.append( " \'" ); //$NON-NLS-1$
|
||||||
|
label.append( expression );
|
||||||
|
label.append( '\'' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ImageDescriptor[] computeBreakpointOverlays( ICBreakpoint breakpoint ) {
|
private ImageDescriptor[] computeBreakpointOverlays( ICBreakpoint breakpoint ) {
|
||||||
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
ImageDescriptor[] overlays = new ImageDescriptor[]{ null, null, null, null };
|
||||||
try {
|
try {
|
||||||
|
@ -280,4 +625,330 @@ public class CDebugModelPresentation extends LabelProvider implements IDebugMode
|
||||||
}
|
}
|
||||||
return overlays;
|
return overlays;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected Image getVariableImage( IVariable element ) {
|
||||||
|
if ( element instanceof ICVariable ) {
|
||||||
|
ICType type = null;
|
||||||
|
try {
|
||||||
|
type = ((ICVariable)element).getType();
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
// use default image
|
||||||
|
}
|
||||||
|
if ( type != null && (type.isPointer() || type.isReference()) )
|
||||||
|
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_POINTER : CDebugImages.DESC_OBJS_VARIABLE_POINTER_DISABLED );
|
||||||
|
else if ( type != null && (type.isArray() || type.isStructure()) )
|
||||||
|
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_AGGREGATE : CDebugImages.DESC_OBJS_VARIABLE_AGGREGATE_DISABLED );
|
||||||
|
else
|
||||||
|
return fDebugImageRegistry.get( (((ICVariable)element).isEnabled()) ? CDebugImages.DESC_OBJS_VARIABLE_SIMPLE : CDebugImages.DESC_OBJS_VARIABLE_SIMPLE_DISABLED );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Image getRegisterImage( IRegister element ) {
|
||||||
|
return ( ( element instanceof ICVariable && ((ICVariable)element).isEnabled() ) ) ? fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER ) : fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_DISABLED );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Image getExpressionImage( IExpression element ) {
|
||||||
|
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_EXPRESSION ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Image getSharedLibraryImage( ICSharedLibrary element ) {
|
||||||
|
if ( element.areSymbolsLoaded() ) {
|
||||||
|
return getImageCache().getImageFor(
|
||||||
|
new OverlayImageDescriptor( getDebugImageRegistry().get( CDebugImages.DESC_OBJS_SHARED_LIBRARY_WITH_SYMBOLS ),
|
||||||
|
new ImageDescriptor[] { null, CDebugImages.DESC_OVRS_SYMBOLS, null, null } ) );
|
||||||
|
}
|
||||||
|
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SHARED_LIBRARY );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected Image getModuleImage( ICModule element ) {
|
||||||
|
switch( element.getType() ) {
|
||||||
|
case ICModule.EXECUTABLE:
|
||||||
|
if ( element.areSymbolsLoaded() ) {
|
||||||
|
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_EXECUTABLE_WITH_SYMBOLS );
|
||||||
|
}
|
||||||
|
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_EXECUTABLE );
|
||||||
|
case ICModule.SHARED_LIBRARY:
|
||||||
|
if ( element.areSymbolsLoaded() ) {
|
||||||
|
return getImageCache().getImageFor( new OverlayImageDescriptor( fDebugImageRegistry.get( CDebugImages.DESC_OBJS_SHARED_LIBRARY_WITH_SYMBOLS ), new ImageDescriptor[]{ null, CDebugImages.DESC_OVRS_SYMBOLS, null, null } ) );
|
||||||
|
}
|
||||||
|
return CDebugUIPlugin.getImageDescriptorRegistry().get( CDebugImages.DESC_OBJS_SHARED_LIBRARY );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getVariableTypeName( ICType type ) {
|
||||||
|
StringBuffer result = new StringBuffer();
|
||||||
|
String typeName = type.getName();
|
||||||
|
if ( typeName != null )
|
||||||
|
typeName = typeName.trim();
|
||||||
|
if ( type.isArray() && typeName != null ) {
|
||||||
|
int index = typeName.indexOf( '[' );
|
||||||
|
if ( index != -1 )
|
||||||
|
typeName = typeName.substring( 0, index ).trim();
|
||||||
|
}
|
||||||
|
if ( typeName != null && typeName.length() > 0 ) {
|
||||||
|
result.append( typeName );
|
||||||
|
if ( type.isArray() ) {
|
||||||
|
int[] dims = type.getArrayDimensions();
|
||||||
|
for( int i = 0; i < dims.length; ++i ) {
|
||||||
|
result.append( '[' );
|
||||||
|
result.append( dims[i] );
|
||||||
|
result.append( ']' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getVariableText( IVariable var ) throws DebugException {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
if ( var instanceof ICVariable ) {
|
||||||
|
ICType type = null;
|
||||||
|
try {
|
||||||
|
type = ((ICVariable)var).getType();
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
// don't display type
|
||||||
|
}
|
||||||
|
if ( type != null && isShowVariableTypeNames() ) {
|
||||||
|
String typeName = getVariableTypeName( type );
|
||||||
|
if ( typeName != null && typeName.length() > 0 ) {
|
||||||
|
label.append( typeName ).append( ' ' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String name = var.getName();
|
||||||
|
if ( name != null )
|
||||||
|
label.append( name.trim() );
|
||||||
|
IValue value = var.getValue();
|
||||||
|
if ( value != null ) {
|
||||||
|
String valueString = getValueText( value );
|
||||||
|
if ( !isEmpty( valueString ) ) {
|
||||||
|
label.append( " = " ); //$NON-NLS-1$
|
||||||
|
label.append( valueString );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getValueText( IValue value )/* throws DebugException*/ {
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
if ( value instanceof ICDebugElementStatus && !((ICDebugElementStatus)value).isOK() ) {
|
||||||
|
label.append( getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.4" ), ((ICDebugElementStatus)value).getMessage() ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( value instanceof ICValue ) {
|
||||||
|
ICType type = null;
|
||||||
|
try {
|
||||||
|
type = ((ICValue)value).getType();
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String valueString = value.getValueString();
|
||||||
|
if ( valueString != null ) {
|
||||||
|
valueString = valueString.trim();
|
||||||
|
if ( type != null && type.isCharacter() ) {
|
||||||
|
if ( valueString.length() == 0 )
|
||||||
|
valueString = "."; //$NON-NLS-1$
|
||||||
|
label.append( valueString );
|
||||||
|
}
|
||||||
|
else if ( type != null && type.isFloatingPointType() ) {
|
||||||
|
Number floatingPointValue = CDebugUtils.getFloatingPointValue( (ICValue)value );
|
||||||
|
if ( CDebugUtils.isNaN( floatingPointValue ) )
|
||||||
|
valueString = "NAN"; //$NON-NLS-1$
|
||||||
|
if ( CDebugUtils.isPositiveInfinity( floatingPointValue ) )
|
||||||
|
valueString = CDebugUIMessages.getString( "CDTDebugModelPresentation.23" ); //$NON-NLS-1$
|
||||||
|
if ( CDebugUtils.isNegativeInfinity( floatingPointValue ) )
|
||||||
|
valueString = CDebugUIMessages.getString( "CDTDebugModelPresentation.24" ); //$NON-NLS-1$
|
||||||
|
label.append( valueString );
|
||||||
|
}
|
||||||
|
else if ( type == null || (!type.isArray() && !type.isStructure()) ) {
|
||||||
|
if ( valueString.length() > 0 ) {
|
||||||
|
label.append( valueString );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( DebugException e1 ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getSignalText( ICSignal signal ) {
|
||||||
|
StringBuffer sb = new StringBuffer( CDebugUIMessages.getString( "CDTDebugModelPresentation.12" ) ); //$NON-NLS-1$
|
||||||
|
try {
|
||||||
|
String name = signal.getName();
|
||||||
|
sb.append( " \'" ).append( name ).append( '\'' ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getWatchExpressionText( IWatchExpression expression ) {
|
||||||
|
StringBuffer result = new StringBuffer();
|
||||||
|
result.append( '"' ).append( expression.getExpressionText() ).append( '"' );
|
||||||
|
if ( expression.isPending() ) {
|
||||||
|
result.append( " = " ).append( "..." ); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
IValue value = expression.getValue();
|
||||||
|
if ( value instanceof ICValue ) {
|
||||||
|
ICType type = null;
|
||||||
|
try {
|
||||||
|
type = ((ICValue)value).getType();
|
||||||
|
}
|
||||||
|
catch( DebugException e1 ) {
|
||||||
|
}
|
||||||
|
if ( type != null && isShowVariableTypeNames() ) {
|
||||||
|
String typeName = getVariableTypeName( type );
|
||||||
|
if ( !isEmpty( typeName ) ) {
|
||||||
|
result.insert( 0, typeName + ' ' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( expression.isEnabled() ) {
|
||||||
|
String valueString = getValueText( value );
|
||||||
|
if ( valueString.length() > 0 ) {
|
||||||
|
result.append( " = " ).append( valueString ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !expression.isEnabled() ) {
|
||||||
|
result.append( ' ' );
|
||||||
|
result.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.22" ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getTargetText( IDebugTarget target, boolean qualified ) throws DebugException {
|
||||||
|
ICDebugTarget t = (ICDebugTarget)target.getAdapter( ICDebugTarget.class );
|
||||||
|
if ( t != null ) {
|
||||||
|
if ( !t.isPostMortem() ) {
|
||||||
|
CDebugElementState state = t.getState();
|
||||||
|
if ( state.equals( CDebugElementState.EXITED ) ) {
|
||||||
|
Object info = t.getCurrentStateInfo();
|
||||||
|
String label = CDebugUIMessages.getString( "CDTDebugModelPresentation.3" ); //$NON-NLS-1$
|
||||||
|
String reason = ""; //$NON-NLS-1$
|
||||||
|
if ( info != null && info instanceof ICDISignalExitInfo ) {
|
||||||
|
ICDISignalExitInfo sigInfo = (ICDISignalExitInfo)info;
|
||||||
|
reason = ' ' + MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.5" ), new String[]{ sigInfo.getName(), sigInfo.getDescription() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( info != null && info instanceof ICDIExitInfo ) {
|
||||||
|
reason = ' ' + MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.6" ), new Integer[] { new Integer( ((ICDIExitInfo)info).getCode() ) } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return MessageFormat.format( label, new String[] { target.getName(), reason } );
|
||||||
|
}
|
||||||
|
else if ( state.equals( CDebugElementState.SUSPENDED ) ) {
|
||||||
|
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.7" ), new String[] { target.getName() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getThreadText( IThread thread, boolean qualified ) throws DebugException {
|
||||||
|
ICDebugTarget target = (ICDebugTarget)thread.getDebugTarget().getAdapter( ICDebugTarget.class );
|
||||||
|
if ( target.isPostMortem() ) {
|
||||||
|
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.8" ), thread.getName() ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( thread.isTerminated() ) {
|
||||||
|
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.9" ), thread.getName() ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( thread.isStepping() ) {
|
||||||
|
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.10" ), thread.getName() ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( !thread.isSuspended() ) {
|
||||||
|
return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.11" ), thread.getName() ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( thread.isSuspended() ) {
|
||||||
|
String reason = ""; //$NON-NLS-1$
|
||||||
|
ICDebugElement element = (ICDebugElement)thread.getAdapter( ICDebugElement.class );
|
||||||
|
if ( element != null ) {
|
||||||
|
Object info = element.getCurrentStateInfo();
|
||||||
|
if ( info != null && info instanceof ICDISignalReceived ) {
|
||||||
|
ICDISignal signal = ((ICDISignalReceived)info).getSignal();
|
||||||
|
reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.13" ), new String[]{ signal.getName(), signal.getDescription() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( info != null && info instanceof ICDIWatchpointTrigger ) {
|
||||||
|
reason = MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.14" ), new String[]{ ((ICDIWatchpointTrigger)info).getOldValue(), ((ICDIWatchpointTrigger)info).getNewValue() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( info != null && info instanceof ICDIWatchpointScope ) {
|
||||||
|
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.15" ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( info != null && info instanceof ICDIBreakpointHit ) {
|
||||||
|
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.16" ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else if ( info != null && info instanceof ICDISharedLibraryEvent ) {
|
||||||
|
reason = CDebugUIMessages.getString( "CDTDebugModelPresentation.17" ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.18" ), new String[] { thread.getName(), reason } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return MessageFormat.format( CDebugUIMessages.getString( "CDTDebugModelPresentation.19" ), new String[] { thread.getName() } ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getStackFrameText( IStackFrame f, boolean qualified ) throws DebugException {
|
||||||
|
if ( f instanceof ICStackFrame ) {
|
||||||
|
ICStackFrame frame = (ICStackFrame)f;
|
||||||
|
StringBuffer label = new StringBuffer();
|
||||||
|
label.append( frame.getLevel() );
|
||||||
|
label.append( ' ' );
|
||||||
|
String function = frame.getFunction();
|
||||||
|
if ( function != null ) {
|
||||||
|
function = function.trim();
|
||||||
|
if ( function.length() > 0 ) {
|
||||||
|
label.append( function );
|
||||||
|
label.append( "() " ); //$NON-NLS-1$
|
||||||
|
if ( frame.getFile() != null ) {
|
||||||
|
IPath path = new Path( frame.getFile() );
|
||||||
|
if ( !path.isEmpty() ) {
|
||||||
|
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.20" ) ); //$NON-NLS-1$
|
||||||
|
label.append( ' ' );
|
||||||
|
label.append( (qualified ? path.toOSString() : path.lastSegment()) );
|
||||||
|
label.append( ':' );
|
||||||
|
if ( frame.getFrameLineNumber() != 0 )
|
||||||
|
label.append( frame.getFrameLineNumber() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( isEmpty( function ) )
|
||||||
|
label.append( CDebugUIMessages.getString( "CDTDebugModelPresentation.21" ) ); //$NON-NLS-1$
|
||||||
|
return label.toString();
|
||||||
|
}
|
||||||
|
return (f.getAdapter( IDummyStackFrame.class ) != null) ? getDummyStackFrameLabel( f ) : f.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDummyStackFrameLabel( IStackFrame stackFrame ) {
|
||||||
|
return DUMMY_STACKFRAME_LABEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isShowVariableTypeNames() {
|
||||||
|
Boolean show = (Boolean)fAttributes.get( DISPLAY_VARIABLE_TYPE_NAMES );
|
||||||
|
show = show == null ? Boolean.FALSE : show;
|
||||||
|
return show.booleanValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFormattedString( String key, String arg ) {
|
||||||
|
return getFormattedString( key, new String[]{ arg } );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFormattedString( String string, String[] args ) {
|
||||||
|
return MessageFormat.format( string, args );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
getImageCache().disposeAll();
|
||||||
|
fAttributes.clear();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
CDebugModelPresentation.unknown_1=unknown
|
CDebugModelPresentation.unknown_1=unknown
|
||||||
|
CDebugModelPresentation.0=\ (symbols loaded)
|
||||||
|
CDebugModelPresentation.1=\ (symbols not loaded)
|
||||||
CDebugImageDescriptorRegistry.0=Allocating image for wrong display.
|
CDebugImageDescriptorRegistry.0=Allocating image for wrong display.
|
||||||
CDebugModelPresentation.not_available_1=<not available>
|
CDebugModelPresentation.not_available_1=<not available>
|
||||||
CDTDebugModelPresentation.0=<terminated>
|
CDTDebugModelPresentation.0=<terminated>
|
||||||
|
|
|
@ -48,10 +48,12 @@ public interface ICDebugHelpContextIds
|
||||||
public static final String TOGGLE_BREAKPOINT_ACTION = PREFIX + "manage_breakpoint_action_context"; //$NON-NLS-1$
|
public static final String TOGGLE_BREAKPOINT_ACTION = PREFIX + "manage_breakpoint_action_context"; //$NON-NLS-1$
|
||||||
public static final String ENABLE_DISABLE_BREAKPOINT_ACTION = PREFIX + "enable_disable_breakpoint_action_context"; //$NON-NLS-1$
|
public static final String ENABLE_DISABLE_BREAKPOINT_ACTION = PREFIX + "enable_disable_breakpoint_action_context"; //$NON-NLS-1$
|
||||||
public static final String BREAKPOINT_PROPERTIES_ACTION = PREFIX + "breakpoint_properties_action_context"; //$NON-NLS-1$
|
public static final String BREAKPOINT_PROPERTIES_ACTION = PREFIX + "breakpoint_properties_action_context"; //$NON-NLS-1$
|
||||||
|
public static final String SHOW_DETAIL_PANE_ACTION = PREFIX + "show_detail_pane_action_context"; //$NON-NLS-1$
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
public static final String MEMORY_VIEW = PREFIX + "memory_view_context"; //$NON-NLS-1$
|
public static final String MEMORY_VIEW = PREFIX + "memory_view_context"; //$NON-NLS-1$
|
||||||
public static final String SHARED_LIBRARIES_VIEW = PREFIX + "shared_libraries_view_context"; //$NON-NLS-1$
|
public static final String SHARED_LIBRARIES_VIEW = PREFIX + "shared_libraries_view_context"; //$NON-NLS-1$
|
||||||
|
public static final String MODULES_VIEW = PREFIX + "modules_view_context"; //$NON-NLS-1$
|
||||||
public static final String SIGNALS_VIEW = PREFIX + "signals_view_context"; //$NON-NLS-1$
|
public static final String SIGNALS_VIEW = PREFIX + "signals_view_context"; //$NON-NLS-1$
|
||||||
public static final String DISASSEMBLY_VIEW = PREFIX + "disassembly_view_context"; //$NON-NLS-1$
|
public static final String DISASSEMBLY_VIEW = PREFIX + "disassembly_view_context"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
|
|
@ -95,3 +95,11 @@ ResumeAtLineAdapter.1=Missing document
|
||||||
ResumeAtLineAdapter.2=Empty editor
|
ResumeAtLineAdapter.2=Empty editor
|
||||||
ResumeAtLineAdapter.3=Operation is not supported.
|
ResumeAtLineAdapter.3=Operation is not supported.
|
||||||
ResumeAtLineAdapter.4=Resume At Line failed.
|
ResumeAtLineAdapter.4=Resume At Line failed.
|
||||||
|
ToggleDetailPaneAction.0=Vertical View Orientation
|
||||||
|
ToggleDetailPaneAction.1=Place the Detail Pane Underneath the Main Tree View
|
||||||
|
ToggleDetailPaneAction.2=Place the Detail Pane Underneath the Main Tree View
|
||||||
|
ToggleDetailPaneAction.3=Horizontal View Orientation
|
||||||
|
ToggleDetailPaneAction.4=Place the Detail Pane on the Right of the Main Tree View
|
||||||
|
ToggleDetailPaneAction.5=Place the Detail Pane on the Right of the Main Tree View
|
||||||
|
ToggleDetailPaneAction.6=Hide the Detail Pane so that only the Main Tree View is Visible
|
||||||
|
ToggleDetailPaneAction.7=Hide the Detail Pane so that only the Main Tree View is Visible
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.actions;
|
||||||
|
|
||||||
|
import org.eclipse.debug.ui.IDebugView;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
import org.eclipse.jface.viewers.AbstractTreeViewer;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.ui.IViewActionDelegate;
|
||||||
|
import org.eclipse.ui.IViewPart;
|
||||||
|
import org.eclipse.ui.actions.ActionDelegate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The delegate for the "Collapse All" action of the Modules view.
|
||||||
|
*/
|
||||||
|
public class CollapseAllModulesAction extends ActionDelegate implements IViewActionDelegate {
|
||||||
|
|
||||||
|
private IDebugView fView;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
|
||||||
|
*/
|
||||||
|
public void init( IViewPart view ) {
|
||||||
|
Assert.isLegal( view instanceof IDebugView );
|
||||||
|
fView = (IDebugView)view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
|
||||||
|
*/
|
||||||
|
public void run( IAction action ) {
|
||||||
|
Viewer viewer = getView().getViewer();
|
||||||
|
if ( viewer instanceof AbstractTreeViewer ) {
|
||||||
|
viewer.getControl().setRedraw( false );
|
||||||
|
((AbstractTreeViewer)viewer).collapseToLevel( viewer.getInput(), AbstractTreeViewer.ALL_LEVELS );
|
||||||
|
viewer.getControl().setRedraw(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDebugView getView() {
|
||||||
|
return fView;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.actions;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.preferences.ICDebugPreferenceConstants;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.modules.ModulesView;
|
||||||
|
import org.eclipse.jface.action.Action;
|
||||||
|
import org.eclipse.ui.help.WorkbenchHelp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Action that controls the appearance of the details pane in debug views
|
||||||
|
* such as the modules view. Instances of this class can be created to show
|
||||||
|
* the detail pane underneath the main tree, to the right of the main tree,
|
||||||
|
* or not shown at all.
|
||||||
|
*/
|
||||||
|
public class ToggleDetailPaneAction extends Action {
|
||||||
|
|
||||||
|
private ModulesView fModulesView;
|
||||||
|
|
||||||
|
private String fOrientation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ToggleDetailPaneAction.
|
||||||
|
*/
|
||||||
|
public ToggleDetailPaneAction( ModulesView view, String orientation, String hiddenLabel ) {
|
||||||
|
super( "", AS_RADIO_BUTTON ); //$NON-NLS-1$
|
||||||
|
setModulesView( view );
|
||||||
|
setOrientation( orientation );
|
||||||
|
if ( orientation == ICDebugPreferenceConstants.MODULES_DETAIL_PANE_UNDERNEATH ) {
|
||||||
|
setText( ActionMessages.getString( "ToggleDetailPaneAction.0" ) ); //$NON-NLS-1$
|
||||||
|
setToolTipText( ActionMessages.getString( "ToggleDetailPaneAction.1" ) ); //$NON-NLS-1$
|
||||||
|
setDescription( ActionMessages.getString( "ToggleDetailPaneAction.2" ) ); //$NON-NLS-1$
|
||||||
|
setImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_UNDER );
|
||||||
|
setDisabledImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_UNDER_DISABLED );
|
||||||
|
setHoverImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_UNDER );
|
||||||
|
}
|
||||||
|
else if ( orientation == ICDebugPreferenceConstants.MODULES_DETAIL_PANE_RIGHT ) {
|
||||||
|
setText( ActionMessages.getString( "ToggleDetailPaneAction.3" ) ); //$NON-NLS-1$
|
||||||
|
setToolTipText( ActionMessages.getString( "ToggleDetailPaneAction.4" ) ); //$NON-NLS-1$
|
||||||
|
setDescription( ActionMessages.getString( "ToggleDetailPaneAction.5" ) ); //$NON-NLS-1$
|
||||||
|
setImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_RIGHT );
|
||||||
|
setDisabledImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_RIGHT_DISABLED );
|
||||||
|
setHoverImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_RIGHT );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setText( hiddenLabel );
|
||||||
|
setToolTipText( ActionMessages.getString( "ToggleDetailPaneAction.6" ) ); //$NON-NLS-1$
|
||||||
|
setDescription( ActionMessages.getString( "ToggleDetailPaneAction.7" ) ); //$NON-NLS-1$
|
||||||
|
setImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_HIDE );
|
||||||
|
setDisabledImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_HIDE_DISABLED );
|
||||||
|
setHoverImageDescriptor( CDebugImages.DESC_LCL_DETAIL_PANE_HIDE );
|
||||||
|
}
|
||||||
|
WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.SHOW_DETAIL_PANE_ACTION );
|
||||||
|
}
|
||||||
|
|
||||||
|
private ModulesView getModulesView() {
|
||||||
|
return fModulesView;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setModulesView( ModulesView modulesView ) {
|
||||||
|
fModulesView = modulesView;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setOrientation( String orientation ) {
|
||||||
|
fOrientation = orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOrientation() {
|
||||||
|
return fOrientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.action.IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
getModulesView().setDetailPaneOrientation( getOrientation() );
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,16 +13,11 @@ package org.eclipse.cdt.debug.internal.ui.preferences;
|
||||||
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
|
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* Constants defining the keys to be used for accessing preferences inside the debug ui plugin's preference bundle.
|
* Constants defining the keys to be used for accessing preferences inside the debug ui plugin's preference bundle.
|
||||||
*
|
* In descriptions (of the keys) below describe the preference stored at the given key.
|
||||||
* In descriptions (of the keys) below describe the preference stored at the given key. The type indicates type of the stored preferences
|
* The type indicates type of the stored preferences
|
||||||
*
|
|
||||||
* The preference store is loaded by the plugin (CDebugUIPlugin).
|
* The preference store is loaded by the plugin (CDebugUIPlugin).
|
||||||
*
|
|
||||||
* @see CDebugUIPlugin.initializeDefaultPreferences(IPreferenceStore) - for initialization of the store
|
* @see CDebugUIPlugin.initializeDefaultPreferences(IPreferenceStore) - for initialization of the store
|
||||||
*
|
|
||||||
* @since Jul 23, 2002
|
|
||||||
*/
|
*/
|
||||||
public interface ICDebugPreferenceConstants {
|
public interface ICDebugPreferenceConstants {
|
||||||
|
|
||||||
|
@ -40,4 +35,15 @@ public interface ICDebugPreferenceConstants {
|
||||||
* Boolean preference controlling whether primitive types types display char values.
|
* Boolean preference controlling whether primitive types types display char values.
|
||||||
*/
|
*/
|
||||||
public static final String PREF_SHOW_CHAR_VALUES = ICDebugUIConstants.PLUGIN_ID + ".cDebug.showCharValues"; //$NON-NLS-1$
|
public static final String PREF_SHOW_CHAR_VALUES = ICDebugUIConstants.PLUGIN_ID + ".cDebug.showCharValues"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The orientation of the detail view in the ModulesView
|
||||||
|
*/
|
||||||
|
public static final String MODULES_DETAIL_PANE_ORIENTATION = "Modules.detail.orientation"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String MODULES_DETAIL_PANE_RIGHT = "Modules.detail.orientation.right"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String MODULES_DETAIL_PANE_UNDERNEATH = "Modules.detail.orientation.underneath"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String MODULES_DETAIL_PANE_HIDDEN = "Modules.detail.orientation.hidden"; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 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 java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.eclipse.jface.viewers.DecoratingLabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.StructuredViewer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A label provider which receives notification of labels computed in
|
||||||
|
* the background by a LaunchViewLabelDecorator.
|
||||||
|
*/
|
||||||
|
public class DebugViewDecoratingLabelProvider extends DecoratingLabelProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A map of text computed for elements. Items are added to this map
|
||||||
|
* when notification is received that text has been computed for an element
|
||||||
|
* and they are removed the first time the text is returned for an
|
||||||
|
* element.
|
||||||
|
* key: Object the element
|
||||||
|
* value: String the label text
|
||||||
|
*/
|
||||||
|
private Map computedText= new HashMap();
|
||||||
|
private StructuredViewer viewer= null;
|
||||||
|
private boolean disposed= false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DecoratingLabelProvider#DecoratingLabelProvider(org.eclipse.jface.viewers.ILabelProvider, org.eclipse.jface.viewers.ILabelDecorator)
|
||||||
|
*/
|
||||||
|
public DebugViewDecoratingLabelProvider(StructuredViewer viewer, ILabelProvider provider, DebugViewLabelDecorator decorator) {
|
||||||
|
super(provider, decorator);
|
||||||
|
decorator.setLabelProvider(this);
|
||||||
|
this.viewer= viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies this label provider that the given text was computed
|
||||||
|
* for the given element. The given text will be returned the next
|
||||||
|
* time its text is requested.
|
||||||
|
*
|
||||||
|
* @param element the element whose label was computed
|
||||||
|
* @param text the label
|
||||||
|
*/
|
||||||
|
public void textComputed(Object element, String text) {
|
||||||
|
computedText.put(element, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Labels have been computed for the given block of elements.
|
||||||
|
* This method tells the label provider to update the
|
||||||
|
* given elements in the view.
|
||||||
|
*
|
||||||
|
* @param elements the elements which have had their text computed
|
||||||
|
*/
|
||||||
|
public void labelsComputed(Object[] elements) {
|
||||||
|
if (!disposed) {
|
||||||
|
viewer.update(elements, null);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < elements.length; i++) {
|
||||||
|
computedText.remove(elements[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stored text computed by the background decorator
|
||||||
|
* or delegates to the decorating label provider to compute text.
|
||||||
|
* The stored value is not cleared - the value is cleared when
|
||||||
|
* #lablesComputed(...) has completed the update of its elements.
|
||||||
|
*
|
||||||
|
* @see DecoratingLabelProvider#getText(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public String getText(Object element) {
|
||||||
|
String text= (String) computedText.get(element);
|
||||||
|
if (text != null) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
return super.getText(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
disposed= true;
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 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.debug.ui.IDebugModelPresentation;
|
||||||
|
import org.eclipse.jface.viewers.IColorProvider;
|
||||||
|
import org.eclipse.jface.viewers.IFontProvider;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProviderListener;
|
||||||
|
import org.eclipse.swt.graphics.Color;
|
||||||
|
import org.eclipse.swt.graphics.Font;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A label provider that provide interim text labels. When queried for text, the label provider
|
||||||
|
* returns a default string ("<pending...>"). When queried for images, the label provider
|
||||||
|
* queries a debug model presentation. This label provider is intended to be passed to
|
||||||
|
* a <code>DebugViewDecoratingLabelProvider</code>.
|
||||||
|
*/
|
||||||
|
public class DebugViewInterimLabelProvider implements ILabelProvider, IColorProvider, IFontProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The text label returned by this label provider (value: "...").
|
||||||
|
*/
|
||||||
|
public final static String PENDING_LABEL= "..."; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The debug model presentation used for computing images.
|
||||||
|
*/
|
||||||
|
protected IDebugModelPresentation presentation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new interim label provider with the given model presentation.
|
||||||
|
*
|
||||||
|
* @param presentation the model presentation to use for computing images
|
||||||
|
*/
|
||||||
|
public DebugViewInterimLabelProvider(IDebugModelPresentation presentation) {
|
||||||
|
this.presentation= presentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the debug model presentation used by this label provider
|
||||||
|
* to compute images.
|
||||||
|
*
|
||||||
|
* @return this label provider's model presentation
|
||||||
|
*/
|
||||||
|
public IDebugModelPresentation getPresentation() {
|
||||||
|
return presentation;
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Image getImage(Object element) {
|
||||||
|
return presentation.getImage(element);
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public String getText(Object element) {
|
||||||
|
return DebugViewInterimLabelProvider.PENDING_LABEL;
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
|
||||||
|
*/
|
||||||
|
public void addListener(ILabelProviderListener listener) {
|
||||||
|
presentation.addListener(listener);
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
presentation.dispose();
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
|
||||||
|
*/
|
||||||
|
public boolean isLabelProperty(Object element, String property) {
|
||||||
|
return presentation.isLabelProperty(element, property);
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
|
||||||
|
*/
|
||||||
|
public void removeListener(ILabelProviderListener listener) {
|
||||||
|
presentation.removeListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Color getForeground(Object element) {
|
||||||
|
if (presentation instanceof IColorProvider) {
|
||||||
|
IColorProvider colorProvider = (IColorProvider) presentation;
|
||||||
|
return colorProvider.getForeground(element);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Color getBackground(Object element) {
|
||||||
|
if (presentation instanceof IColorProvider) {
|
||||||
|
IColorProvider colorProvider = (IColorProvider) presentation;
|
||||||
|
return colorProvider.getBackground(element);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Font getFont(Object element) {
|
||||||
|
if (presentation instanceof IFontProvider) {
|
||||||
|
IFontProvider fontProvider = (IFontProvider) presentation;
|
||||||
|
return fontProvider.getFont(element);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,199 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Vector;
|
||||||
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.ISchedulingRule;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.IDebugEventSetListener;
|
||||||
|
import org.eclipse.debug.ui.IDebugModelPresentation;
|
||||||
|
import org.eclipse.jface.viewers.ILabelDecorator;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A label decorator which computes text for debug elements
|
||||||
|
* in the background and updates them asynchronously.
|
||||||
|
*/
|
||||||
|
public class DebugViewLabelDecorator extends LabelProvider implements ILabelDecorator, IDebugEventSetListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The presentation used to compute text.
|
||||||
|
*/
|
||||||
|
private IDebugModelPresentation fPresentation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The label provider notified when text is computed.
|
||||||
|
*/
|
||||||
|
protected DebugViewDecoratingLabelProvider fLabelProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The job which will be executed next. All new label requests
|
||||||
|
* are appended to this job.
|
||||||
|
*/
|
||||||
|
protected LabelJob fNextJob = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for DebugViewLabelDecorator.
|
||||||
|
*/
|
||||||
|
public DebugViewLabelDecorator( IDebugModelPresentation presentation ) {
|
||||||
|
fPresentation = presentation;
|
||||||
|
DebugPlugin.getDefault().addDebugEventListener( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the label provider which will be notified when a
|
||||||
|
* label has been computed in the background.
|
||||||
|
*
|
||||||
|
* @param labelProvider the label provider to notify when text
|
||||||
|
* is computed
|
||||||
|
*/
|
||||||
|
public void setLabelProvider( DebugViewDecoratingLabelProvider labelProvider ) {
|
||||||
|
fLabelProvider = labelProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Image decorateImage( Image image, Object element ) {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelDecorator#decorateText(java.lang.String, java.lang.Object)
|
||||||
|
*/
|
||||||
|
public String decorateText( String text, final Object element ) {
|
||||||
|
computeText( element );
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void computeText( Object element ) {
|
||||||
|
synchronized( this ) {
|
||||||
|
if ( fNextJob == null ) {
|
||||||
|
fNextJob = new LabelJob( "Debug", fPresentation ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
fNextJob.computeText( element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void labelsComputed( final Object[] computedElements ) {
|
||||||
|
CDebugUIPlugin.getStandardDisplay().asyncExec(
|
||||||
|
new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
fLabelProvider.labelsComputed( computedElements );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
|
||||||
|
*/
|
||||||
|
public void handleDebugEvents( DebugEvent[] events ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
DebugPlugin.getDefault().removeDebugEventListener( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A job which computes text for a queue of elements. The job's label
|
||||||
|
* decorator is notified when text has been computed for some number
|
||||||
|
* of elements.
|
||||||
|
*/
|
||||||
|
protected class LabelJob extends Job implements ISchedulingRule {
|
||||||
|
|
||||||
|
private Vector fElementQueue = new Vector();
|
||||||
|
private IDebugModelPresentation fJobPresentation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new job with the given name which will use the given
|
||||||
|
* presentation to compute labels in the background
|
||||||
|
* @param name the job's name
|
||||||
|
* @param presentation the presentation to use for label
|
||||||
|
* computation
|
||||||
|
*/
|
||||||
|
public LabelJob( String name, IDebugModelPresentation presentation ) {
|
||||||
|
super( name );
|
||||||
|
fJobPresentation = presentation;
|
||||||
|
setSystem( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queues up the given element to have its text computed.
|
||||||
|
* @param element the element whose text should be computed
|
||||||
|
* in this background job
|
||||||
|
*/
|
||||||
|
public void computeText( Object element ) {
|
||||||
|
if ( !fElementQueue.contains( element ) ) {
|
||||||
|
fElementQueue.add( element );
|
||||||
|
}
|
||||||
|
schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public IStatus run( IProgressMonitor monitor ) {
|
||||||
|
int numElements = fElementQueue.size();
|
||||||
|
monitor.beginTask( MessageFormat.format( "Fetching {0} labels", new String[]{ Integer.toString( numElements ) } ), numElements ); //$NON-NLS-1$
|
||||||
|
while( !fElementQueue.isEmpty() && !monitor.isCanceled() ) {
|
||||||
|
StringBuffer message = new StringBuffer( MessageFormat.format( "Fetching {0} labels", new String[]{ Integer.toString( fElementQueue.size() ) } ) ); //$NON-NLS-1$
|
||||||
|
message.append( MessageFormat.format( " ({0} pending)", new String[]{ Integer.toString( fNextJob.fElementQueue.size() ) } ) ); //$NON-NLS-1$
|
||||||
|
monitor.setTaskName( message.toString() );
|
||||||
|
int blockSize = 10;
|
||||||
|
if ( fElementQueue.size() < blockSize ) {
|
||||||
|
blockSize = fElementQueue.size();
|
||||||
|
}
|
||||||
|
final List computedElements = new ArrayList();
|
||||||
|
for( int i = 0; i < blockSize; i++ ) {
|
||||||
|
Object element = fElementQueue.remove( 0 );
|
||||||
|
if ( element == null ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fLabelProvider.textComputed( element, fJobPresentation.getText( element ) );
|
||||||
|
computedElements.add( element );
|
||||||
|
}
|
||||||
|
labelsComputed( computedElements.toArray() );
|
||||||
|
monitor.worked( computedElements.size() );
|
||||||
|
}
|
||||||
|
monitor.done();
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
|
||||||
|
*/
|
||||||
|
public boolean contains( ISchedulingRule rule ) {
|
||||||
|
return (rule instanceof LabelJob) && fJobPresentation == ((LabelJob)rule).fJobPresentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
|
||||||
|
*/
|
||||||
|
public boolean isConflicting( ISchedulingRule rule ) {
|
||||||
|
return (rule instanceof LabelJob) && fJobPresentation == ((LabelJob)rule).fJobPresentation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views.modules;
|
||||||
|
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comment for .
|
||||||
|
*/
|
||||||
|
public class ModulesMessages {
|
||||||
|
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.internal.ui.views.modules.ModulesMessages";//$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
|
||||||
|
|
||||||
|
private ModulesMessages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getString( String key ) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
try {
|
||||||
|
return RESOURCE_BUNDLE.getString( key );
|
||||||
|
}
|
||||||
|
catch( MissingResourceException e ) {
|
||||||
|
return '!' + key + '!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
ModulesView.0=Modules View Only
|
||||||
|
ModulesView.1=executable
|
||||||
|
ModulesView.2=shared library
|
||||||
|
ModulesView.3=Type:
|
||||||
|
ModulesView.4=Symbols:
|
||||||
|
ModulesView.5=loaded
|
||||||
|
ModulesView.6=not loaded
|
||||||
|
ModulesView.7=Symbols file:
|
|
@ -0,0 +1,801 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views.modules;
|
||||||
|
|
||||||
|
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.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.DebugViewDecoratingLabelProvider;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.DebugViewInterimLabelProvider;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.DebugViewLabelDecorator;
|
||||||
|
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.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.ui.IDebugModelPresentation;
|
||||||
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.action.IMenuListener;
|
||||||
|
import org.eclipse.jface.action.IMenuManager;
|
||||||
|
import org.eclipse.jface.action.IToolBarManager;
|
||||||
|
import org.eclipse.jface.action.MenuManager;
|
||||||
|
import org.eclipse.jface.action.Separator;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.resource.JFaceResources;
|
||||||
|
import org.eclipse.jface.text.Document;
|
||||||
|
import org.eclipse.jface.text.DocumentEvent;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IDocumentListener;
|
||||||
|
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.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;
|
||||||
|
import org.eclipse.swt.events.FocusAdapter;
|
||||||
|
import org.eclipse.swt.events.FocusEvent;
|
||||||
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
|
import org.eclipse.swt.events.KeyListener;
|
||||||
|
import org.eclipse.swt.events.MouseEvent;
|
||||||
|
import org.eclipse.swt.events.MouseListener;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
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.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.texteditor.IUpdate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays the modules currently loaded by the process being debugged.
|
||||||
|
*/
|
||||||
|
public class ModulesView extends AbstractDebugEventHandlerView implements IDebugExceptionHandler, IPropertyChangeListener, ISelectionListener, INullSelectionListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal interface for a cursor listener. I.e. aggregation
|
||||||
|
* of mouse and key listener.
|
||||||
|
*/
|
||||||
|
interface ICursorListener extends MouseListener, KeyListener {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The selection provider for the modules view changes depending on whether
|
||||||
|
* the variables viewer or detail pane source viewer have focus. This "super"
|
||||||
|
* provider ensures the correct selection is sent to all listeners.
|
||||||
|
*/
|
||||||
|
public class ModulesViewSelectionProvider implements ISelectionProvider {
|
||||||
|
|
||||||
|
private ListenerList fListeners= new ListenerList();
|
||||||
|
|
||||||
|
private ISelectionProvider fUnderlyingSelectionProvider;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
|
||||||
|
*/
|
||||||
|
public void addSelectionChangedListener( ISelectionChangedListener listener ) {
|
||||||
|
fListeners.add( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
|
||||||
|
*/
|
||||||
|
public ISelection getSelection() {
|
||||||
|
return getUnderlyingSelectionProvider().getSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
|
||||||
|
*/
|
||||||
|
public void removeSelectionChangedListener( ISelectionChangedListener listener ) {
|
||||||
|
fListeners.remove( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
|
||||||
|
*/
|
||||||
|
public void setSelection( ISelection selection ) {
|
||||||
|
getUnderlyingSelectionProvider().setSelection( selection );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ISelectionProvider getUnderlyingSelectionProvider() {
|
||||||
|
return fUnderlyingSelectionProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUnderlyingSelectionProvider( ISelectionProvider underlyingSelectionProvider ) {
|
||||||
|
fUnderlyingSelectionProvider = underlyingSelectionProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void fireSelectionChanged( SelectionChangedEvent event ) {
|
||||||
|
Object[] listeners = fListeners.getListeners();
|
||||||
|
for( int i = 0; i < listeners.length; i++ ) {
|
||||||
|
ISelectionChangedListener listener = (ISelectionChangedListener)listeners[i];
|
||||||
|
listener.selectionChanged( event );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The UI construct that provides a sliding sash between the modules tree
|
||||||
|
* and the detail pane.
|
||||||
|
*/
|
||||||
|
private SashForm fSashForm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The detail pane viewer.
|
||||||
|
*/
|
||||||
|
private ISourceViewer fDetailViewer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The document associated with the detail pane viewer.
|
||||||
|
*/
|
||||||
|
private IDocument fDetailDocument;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The configuration being used in the details area
|
||||||
|
*/
|
||||||
|
private SourceViewerConfiguration fSourceViewerConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selection provider for this view.
|
||||||
|
*/
|
||||||
|
private ModulesViewSelectionProvider fSelectionProvider = new ModulesViewSelectionProvider();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remembers which viewer (tree viewer or details viewer) had focus, so we
|
||||||
|
* can reset the focus properly when re-activated.
|
||||||
|
*/
|
||||||
|
private Viewer fFocusViewer = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Various listeners used to update the enabled state of actions and also to
|
||||||
|
* populate the detail pane.
|
||||||
|
*/
|
||||||
|
private ISelectionChangedListener fTreeSelectionChangedListener;
|
||||||
|
private ISelectionChangedListener fDetailSelectionChangedListener;
|
||||||
|
private IDocumentListener fDetailDocumentListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These are used to initialize and persist the position of the sash that
|
||||||
|
* separates the tree viewer from the detail pane.
|
||||||
|
*/
|
||||||
|
private static final int[] DEFAULT_SASH_WEIGHTS = { 13, 6 };
|
||||||
|
private int[] fLastSashWeights;
|
||||||
|
private boolean fToggledDetailOnce;
|
||||||
|
private ToggleDetailPaneAction[] fToggleDetailPaneActions;
|
||||||
|
private String fCurrentDetailPaneOrientation = ICDebugPreferenceConstants.MODULES_DETAIL_PANE_HIDDEN;
|
||||||
|
protected static final String SASH_WEIGHTS = CDebugUIPlugin.getUniqueIdentifier() + ".modulesView.SASH_WEIGHTS"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private ICursorListener fCursorListener;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
protected Viewer createViewer( Composite parent ) {
|
||||||
|
TreeViewer viewer = createTreeViewer( parent );
|
||||||
|
createDetailsViewer();
|
||||||
|
getSashForm().setMaximizedControl( viewer.getControl() );
|
||||||
|
|
||||||
|
createOrientationActions();
|
||||||
|
IPreferenceStore prefStore = CDebugUIPlugin.getDefault().getPreferenceStore();
|
||||||
|
String orientation = prefStore.getString( getDetailPanePreferenceKey() );
|
||||||
|
for( int i = 0; i < fToggleDetailPaneActions.length; i++ ) {
|
||||||
|
fToggleDetailPaneActions[i].setChecked( fToggleDetailPaneActions[i].getOrientation().equals( orientation ) );
|
||||||
|
}
|
||||||
|
setDetailPaneOrientation( orientation );
|
||||||
|
|
||||||
|
return viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#createActions()
|
||||||
|
*/
|
||||||
|
protected void createActions() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
|
||||||
|
*/
|
||||||
|
protected String getHelpContextId() {
|
||||||
|
return ICDebugHelpContextIds.MODULES_VIEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
|
||||||
|
*/
|
||||||
|
protected void fillContextMenu( IMenuManager menu ) {
|
||||||
|
menu.add( new Separator( ICDebugUIConstants.EMPTY_MODULES_GROUP ) );
|
||||||
|
menu.add( new Separator( ICDebugUIConstants.MODULES_GROUP ) );
|
||||||
|
menu.add( new Separator( ICDebugUIConstants.EMPTY_REFRESH_GROUP ) );
|
||||||
|
menu.add( new Separator( ICDebugUIConstants.REFRESH_GROUP ) );
|
||||||
|
menu.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) );
|
||||||
|
updateObjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface.action.IToolBarManager)
|
||||||
|
*/
|
||||||
|
protected void configureToolBar( IToolBarManager tbm ) {
|
||||||
|
tbm.add( new Separator( ICDebugUIConstants.MODULES_GROUP ) );
|
||||||
|
tbm.add( new Separator( ICDebugUIConstants.REFRESH_GROUP ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler#handleException(org.eclipse.debug.core.DebugException)
|
||||||
|
*/
|
||||||
|
public void handleException( DebugException e ) {
|
||||||
|
showMessage( e.getMessage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
|
||||||
|
*/
|
||||||
|
public void propertyChange( PropertyChangeEvent event ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
|
||||||
|
*/
|
||||||
|
public void selectionChanged( IWorkbenchPart part, ISelection selection ) {
|
||||||
|
if ( !isAvailable() || !isVisible() )
|
||||||
|
return;
|
||||||
|
if ( selection == null )
|
||||||
|
setViewerInput( new StructuredSelection() );
|
||||||
|
else if ( selection instanceof IStructuredSelection )
|
||||||
|
setViewerInput( (IStructuredSelection)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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Object current = getViewer().getInput();
|
||||||
|
if ( current == null && target == null ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( current != null && current.equals( target ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showViewer();
|
||||||
|
getViewer().setInput( target );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TreeViewer 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 );
|
||||||
|
modulesViewer.getControl().addFocusListener( new FocusAdapter() {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
|
||||||
|
*/
|
||||||
|
public void focusGained( FocusEvent e ) {
|
||||||
|
getModulesViewSelectionProvider().setUnderlyingSelectionProvider( modulesViewer );
|
||||||
|
setFocusViewer( getModulesViewer() );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
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() );
|
||||||
|
return modulesViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the widgetry for the details viewer.
|
||||||
|
*/
|
||||||
|
protected void createDetailsViewer() {
|
||||||
|
// Create & configure a SourceViewer
|
||||||
|
SourceViewer detailsViewer = new SourceViewer( getSashForm(), null, SWT.V_SCROLL | SWT.H_SCROLL );
|
||||||
|
setDetailViewer( detailsViewer );
|
||||||
|
detailsViewer.setDocument( getDetailDocument() );
|
||||||
|
detailsViewer.getTextWidget().setFont( JFaceResources.getFont( IInternalCDebugUIConstants.DETAIL_PANE_FONT ) );
|
||||||
|
getDetailDocument().addDocumentListener( getDetailDocumentListener() );
|
||||||
|
detailsViewer.setEditable( false );
|
||||||
|
Control control = detailsViewer.getControl();
|
||||||
|
GridData gd = new GridData( GridData.FILL_BOTH );
|
||||||
|
control.setLayoutData( gd );
|
||||||
|
detailsViewer.getSelectionProvider().addSelectionChangedListener( getDetailSelectionChangedListener() );
|
||||||
|
detailsViewer.getControl().addFocusListener( new FocusAdapter() {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
|
||||||
|
*/
|
||||||
|
public void focusGained( FocusEvent e ) {
|
||||||
|
getModulesViewSelectionProvider().setUnderlyingSelectionProvider( getDetailViewer().getSelectionProvider() );
|
||||||
|
setFocusViewer( (Viewer)getDetailViewer() );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
// add a context menu to the detail area
|
||||||
|
createDetailContextMenu( detailsViewer.getTextWidget() );
|
||||||
|
detailsViewer.getTextWidget().addMouseListener( getCursorListener() );
|
||||||
|
detailsViewer.getTextWidget().addKeyListener( getCursorListener() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDetailViewer( ISourceViewer viewer ) {
|
||||||
|
fDetailViewer = viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ISourceViewer getDetailViewer() {
|
||||||
|
return fDetailViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SashForm getSashForm() {
|
||||||
|
return fSashForm;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSashForm( SashForm sashForm ) {
|
||||||
|
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() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IDebugModelPresentation getModelPresentation() {
|
||||||
|
if ( fModelPresentation == null ) {
|
||||||
|
fModelPresentation = CDebugModelPresentation.getDefault();
|
||||||
|
}
|
||||||
|
return fModelPresentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ModulesViewSelectionProvider getModulesViewSelectionProvider() {
|
||||||
|
return fSelectionProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ModulesViewer getModulesViewer() {
|
||||||
|
return (ModulesViewer)getViewer();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setFocusViewer( Viewer viewer ) {
|
||||||
|
fFocusViewer = viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Viewer getFocusViewer() {
|
||||||
|
return fFocusViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily instantiate and return a selection listener that populates the detail pane,
|
||||||
|
* but only if the detail is currently visible.
|
||||||
|
*/
|
||||||
|
protected ISelectionChangedListener getTreeSelectionChangedListener() {
|
||||||
|
if ( fTreeSelectionChangedListener == null ) {
|
||||||
|
fTreeSelectionChangedListener = new ISelectionChangedListener() {
|
||||||
|
|
||||||
|
public void selectionChanged( SelectionChangedEvent event ) {
|
||||||
|
if ( event.getSelectionProvider().equals( getModulesViewer() ) ) {
|
||||||
|
getModulesViewSelectionProvider().fireSelectionChanged( event );
|
||||||
|
// if the detail pane is not visible, don't waste time retrieving details
|
||||||
|
if ( getSashForm().getMaximizedControl() == getViewer().getControl() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
|
||||||
|
populateDetailPaneFromSelection( selection );
|
||||||
|
treeSelectionChanged( event );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return fTreeSelectionChangedListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void treeSelectionChanged( SelectionChangedEvent event ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ask the modules tree for its current selection, and use this to populate
|
||||||
|
* the detail pane.
|
||||||
|
*/
|
||||||
|
public void populateDetailPane() {
|
||||||
|
if ( isDetailPaneVisible() ) {
|
||||||
|
Viewer viewer = getViewer();
|
||||||
|
if ( viewer != null ) {
|
||||||
|
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
|
||||||
|
populateDetailPaneFromSelection( selection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the details associated with the first of the selected elements in the
|
||||||
|
* detail pane.
|
||||||
|
*/
|
||||||
|
protected void populateDetailPaneFromSelection( IStructuredSelection selection ) {
|
||||||
|
getDetailDocument().set( "" ); //$NON-NLS-1$
|
||||||
|
if ( !selection.isEmpty() ) {
|
||||||
|
computeDetail( selection.getFirstElement() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily instantiate and return a selection listener that updates the enabled
|
||||||
|
* state of the selection oriented actions in this view.
|
||||||
|
*/
|
||||||
|
protected ISelectionChangedListener getDetailSelectionChangedListener() {
|
||||||
|
if ( fDetailSelectionChangedListener == null ) {
|
||||||
|
fDetailSelectionChangedListener = new ISelectionChangedListener() {
|
||||||
|
|
||||||
|
public void selectionChanged( SelectionChangedEvent event ) {
|
||||||
|
if ( event.getSelectionProvider().equals( getModulesViewSelectionProvider().getUnderlyingSelectionProvider() ) ) {
|
||||||
|
getModulesViewSelectionProvider().fireSelectionChanged( event );
|
||||||
|
updateSelectionDependentActions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return fDetailSelectionChangedListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily instantiate and return a document listener that updates the enabled state
|
||||||
|
* of the 'Find/Replace' action.
|
||||||
|
*/
|
||||||
|
protected IDocumentListener getDetailDocumentListener() {
|
||||||
|
if ( fDetailDocumentListener == null ) {
|
||||||
|
fDetailDocumentListener = new IDocumentListener() {
|
||||||
|
|
||||||
|
public void documentAboutToBeChanged( DocumentEvent event ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void documentChanged( DocumentEvent event ) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return fDetailDocumentListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily instantiate and return a Document for the detail pane text viewer.
|
||||||
|
*/
|
||||||
|
protected IDocument getDetailDocument() {
|
||||||
|
if ( fDetailDocument == null ) {
|
||||||
|
fDetailDocument = new Document();
|
||||||
|
}
|
||||||
|
return fDetailDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AbstractDebugEventHandler createEventHandler() {
|
||||||
|
return new ModulesViewEventHandler( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateSelectionDependentActions() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateAction( String actionId ) {
|
||||||
|
IAction action = getAction( actionId );
|
||||||
|
if ( action instanceof IUpdate ) {
|
||||||
|
((IUpdate)action).update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void createDetailContextMenu( Control menuControl ) {
|
||||||
|
MenuManager menuMgr = new MenuManager(); //$NON-NLS-1$
|
||||||
|
menuMgr.setRemoveAllWhenShown( true );
|
||||||
|
menuMgr.addMenuListener( new IMenuListener() {
|
||||||
|
|
||||||
|
public void menuAboutToShow( IMenuManager mgr ) {
|
||||||
|
fillDetailContextMenu( mgr );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
Menu menu = menuMgr.createContextMenu( menuControl );
|
||||||
|
menuControl.setMenu( menu );
|
||||||
|
// register the context menu such that other plugins may contribute to it
|
||||||
|
getSite().registerContextMenu( ICDebugUIConstants.MODULES_VIEW_DETAIL_ID, menuMgr, getDetailViewer().getSelectionProvider() );
|
||||||
|
addContextMenuManager( menuMgr );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void fillDetailContextMenu( IMenuManager menu ) {
|
||||||
|
menu.add( new Separator( ICDebugUIConstants.MODULES_GROUP ) );
|
||||||
|
menu.add( new Separator() );
|
||||||
|
menu.add( getAction( ActionFactory.CUT.getId() ) );
|
||||||
|
menu.add( getAction( ActionFactory.COPY.getId() + ".Detail" ) ); //$NON-NLS-1$
|
||||||
|
menu.add( getAction( ActionFactory.PASTE.getId() ) );
|
||||||
|
menu.add( new Separator( "FIND" ) ); //$NON-NLS-1$
|
||||||
|
menu.add( getAction( ActionFactory.FIND.getId() ) );
|
||||||
|
menu.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICursorListener getCursorListener() {
|
||||||
|
if ( fCursorListener == null ) {
|
||||||
|
fCursorListener = new ICursorListener() {
|
||||||
|
|
||||||
|
public void keyPressed( KeyEvent e ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void keyReleased( KeyEvent e ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mouseDoubleClick( MouseEvent e ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mouseDown( MouseEvent e ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mouseUp( MouseEvent e ) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return fCursorListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDetailPaneOrientation( String orientation ) {
|
||||||
|
if ( orientation.equals( fCurrentDetailPaneOrientation ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( orientation.equals( ICDebugPreferenceConstants.MODULES_DETAIL_PANE_HIDDEN ) ) {
|
||||||
|
hideDetailPane();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int vertOrHoriz = orientation.equals( ICDebugPreferenceConstants.MODULES_DETAIL_PANE_UNDERNEATH ) ? SWT.VERTICAL : SWT.HORIZONTAL;
|
||||||
|
getSashForm().setOrientation( vertOrHoriz );
|
||||||
|
if ( ICDebugPreferenceConstants.MODULES_DETAIL_PANE_HIDDEN.equals( fCurrentDetailPaneOrientation ) ) {
|
||||||
|
showDetailPane();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fCurrentDetailPaneOrientation = orientation;
|
||||||
|
CDebugUIPlugin.getDefault().getPreferenceStore().setValue( getDetailPanePreferenceKey(), orientation );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hideDetailPane() {
|
||||||
|
if ( fToggledDetailOnce ) {
|
||||||
|
setLastSashWeights( getSashForm().getWeights() );
|
||||||
|
}
|
||||||
|
getSashForm().setMaximizedControl( getViewer().getControl() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showDetailPane() {
|
||||||
|
getSashForm().setMaximizedControl( null );
|
||||||
|
getSashForm().setWeights( getLastSashWeights() );
|
||||||
|
populateDetailPane();
|
||||||
|
revealTreeSelection();
|
||||||
|
fToggledDetailOnce = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getDetailPanePreferenceKey() {
|
||||||
|
return ICDebugPreferenceConstants.MODULES_DETAIL_PANE_ORIENTATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int[] getLastSashWeights() {
|
||||||
|
if ( fLastSashWeights == null ) {
|
||||||
|
fLastSashWeights = DEFAULT_SASH_WEIGHTS;
|
||||||
|
}
|
||||||
|
return fLastSashWeights;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setLastSashWeights( int[] weights ) {
|
||||||
|
fLastSashWeights = weights;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createOrientationActions() {
|
||||||
|
IActionBars actionBars = getViewSite().getActionBars();
|
||||||
|
IMenuManager viewMenu = actionBars.getMenuManager();
|
||||||
|
fToggleDetailPaneActions = new ToggleDetailPaneAction[3];
|
||||||
|
fToggleDetailPaneActions[0] = new ToggleDetailPaneAction( this, ICDebugPreferenceConstants.MODULES_DETAIL_PANE_UNDERNEATH, null );
|
||||||
|
fToggleDetailPaneActions[1] = new ToggleDetailPaneAction( this, ICDebugPreferenceConstants.MODULES_DETAIL_PANE_RIGHT, null );
|
||||||
|
fToggleDetailPaneActions[2] = new ToggleDetailPaneAction( this, ICDebugPreferenceConstants.MODULES_DETAIL_PANE_HIDDEN, getToggleActionLabel() );
|
||||||
|
viewMenu.add( new Separator() );
|
||||||
|
viewMenu.add( fToggleDetailPaneActions[0] );
|
||||||
|
viewMenu.add( fToggleDetailPaneActions[1] );
|
||||||
|
viewMenu.add( fToggleDetailPaneActions[2] );
|
||||||
|
viewMenu.add( new Separator() );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getToggleActionLabel() {
|
||||||
|
return ModulesMessages.getString( "ModulesView.0" ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isDetailPaneVisible() {
|
||||||
|
return !fToggleDetailPaneActions[2].isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make sure the currently selected item in the tree is visible.
|
||||||
|
*/
|
||||||
|
protected void revealTreeSelection() {
|
||||||
|
ModulesViewer viewer = getModulesViewer();
|
||||||
|
if ( viewer != null ) {
|
||||||
|
ISelection selection = viewer.getSelection();
|
||||||
|
if ( selection instanceof IStructuredSelection ) {
|
||||||
|
Object selected = ((IStructuredSelection)selection).getFirstElement();
|
||||||
|
if ( selected != null ) {
|
||||||
|
viewer.reveal( selected );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set on or off the word wrap flag for the detail pane.
|
||||||
|
*/
|
||||||
|
public void toggleDetailPaneWordWrap( boolean on ) {
|
||||||
|
fDetailViewer.getTextWidget().setWordWrap( on );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.IViewPart#saveState(org.eclipse.ui.IMemento)
|
||||||
|
*/
|
||||||
|
public void saveState( IMemento memento ) {
|
||||||
|
super.saveState( memento );
|
||||||
|
SashForm sashForm = getSashForm();
|
||||||
|
if ( sashForm != null ) {
|
||||||
|
int[] weights = sashForm.getWeights();
|
||||||
|
memento.putInteger( SASH_WEIGHTS + "-Length", weights.length ); //$NON-NLS-1$
|
||||||
|
for( int i = 0; i < weights.length; i++ ) {
|
||||||
|
memento.putInteger( SASH_WEIGHTS + "-" + i, weights[i] ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
|
||||||
|
*/
|
||||||
|
public void init( IViewSite site, IMemento memento ) throws PartInitException {
|
||||||
|
super.init( site, memento );
|
||||||
|
if ( memento != null ) {
|
||||||
|
Integer bigI = memento.getInteger( SASH_WEIGHTS + "-Length" ); //$NON-NLS-1$
|
||||||
|
if ( bigI == null ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int numWeights = bigI.intValue();
|
||||||
|
int[] weights = new int[numWeights];
|
||||||
|
for( int i = 0; i < numWeights; i++ ) {
|
||||||
|
bigI = memento.getInteger( SASH_WEIGHTS + "-" + i ); //$NON-NLS-1$
|
||||||
|
if ( bigI == null ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
weights[i] = bigI.intValue();
|
||||||
|
}
|
||||||
|
if ( weights.length > 0 ) {
|
||||||
|
setLastSashWeights( weights );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#getDefaultControl()
|
||||||
|
*/
|
||||||
|
protected Control getDefaultControl() {
|
||||||
|
return getSashForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#becomesHidden()
|
||||||
|
*/
|
||||||
|
protected void becomesHidden() {
|
||||||
|
setViewerInput( new StructuredSelection() );
|
||||||
|
super.becomesHidden();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.AbstractDebugView#becomesVisible()
|
||||||
|
*/
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void computeDetail( final Object element ) {
|
||||||
|
if ( element != null ) {
|
||||||
|
DebugPlugin.getDefault().asyncExec( new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
detailComputed( element, doComputeDetail( element ) );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String doComputeDetail( Object element ) {
|
||||||
|
if ( element instanceof ICModule ) {
|
||||||
|
return getModuleDetail( ((ICModule)element) );
|
||||||
|
}
|
||||||
|
return ""; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getModuleDetail( ICModule module ) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
String type = null;
|
||||||
|
switch( module.getType() ) {
|
||||||
|
case ICModule.EXECUTABLE:
|
||||||
|
type = ModulesMessages.getString( "ModulesView.1" ); //$NON-NLS-1$
|
||||||
|
break;
|
||||||
|
case ICModule.SHARED_LIBRARY:
|
||||||
|
type = ModulesMessages.getString( "ModulesView.2" ); //$NON-NLS-1$
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( type != null ) {
|
||||||
|
sb.append( ModulesMessages.getString( "ModulesView.3" ) ); //$NON-NLS-1$
|
||||||
|
sb.append( type );
|
||||||
|
sb.append( '\n' );
|
||||||
|
}
|
||||||
|
sb.append( ModulesMessages.getString( "ModulesView.4" ) ); //$NON-NLS-1$
|
||||||
|
sb.append( ( module.areSymbolsLoaded() ) ? ModulesMessages.getString( "ModulesView.5" ) : ModulesMessages.getString( "ModulesView.6" ) ); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
sb.append( '\n' );
|
||||||
|
if ( module.areSymbolsLoaded() ) {
|
||||||
|
sb.append( ModulesMessages.getString( "ModulesView.7" ) ); //$NON-NLS-1$
|
||||||
|
sb.append( module.getSymbolsFileName().toOSString() );
|
||||||
|
sb.append( '\n' );
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void detailComputed( Object element, final String result ) {
|
||||||
|
Runnable runnable = new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
if ( isAvailable() ) {
|
||||||
|
getDetailDocument().set( result );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
asyncExec( runnable );
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,171 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views.modules;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICSharedLibrary;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the Modules view.
|
||||||
|
*/
|
||||||
|
public class ModulesViewEventHandler extends AbstractDebugEventHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ModulesViewEventHandler.
|
||||||
|
*/
|
||||||
|
public ModulesViewEventHandler( AbstractDebugView view ) {
|
||||||
|
super( view );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler#doHandleDebugEvents(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 ICSharedLibrary )
|
||||||
|
refresh();
|
||||||
|
break;
|
||||||
|
case DebugEvent.CHANGE :
|
||||||
|
if ( event.getSource() instanceof ICSharedLibrary )
|
||||||
|
refresh( event.getSource() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler#refresh()
|
||||||
|
*/
|
||||||
|
public void refresh() {
|
||||||
|
if ( isAvailable() ) {
|
||||||
|
getView().showViewer();
|
||||||
|
getTreeViewer().refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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 Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
***********************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views.modules;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Tree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The modules viewer used by the Modules view.
|
||||||
|
*/
|
||||||
|
public class ModulesViewer extends TreeViewer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ModulesViewer.
|
||||||
|
*/
|
||||||
|
public ModulesViewer( Composite parent ) {
|
||||||
|
super( parent );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ModulesViewer.
|
||||||
|
*/
|
||||||
|
public ModulesViewer( Composite parent, int style ) {
|
||||||
|
super( parent, style );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ModulesViewer.
|
||||||
|
*/
|
||||||
|
public ModulesViewer( Tree tree ) {
|
||||||
|
super( tree );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.Viewer#refresh()
|
||||||
|
*/
|
||||||
|
public void refresh() {
|
||||||
|
super.refresh();
|
||||||
|
ISelection selection = getSelection();
|
||||||
|
if ( !selection.isEmpty() ) {
|
||||||
|
setSelection( selection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,8 +14,8 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.internal.ui.CBreakpointUpdater;
|
import org.eclipse.cdt.debug.internal.ui.CBreakpointUpdater;
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
|
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.CDebugModelPresentation;
|
||||||
import org.eclipse.cdt.debug.internal.ui.ColorManager;
|
import org.eclipse.cdt.debug.internal.ui.ColorManager;
|
||||||
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
|
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
|
||||||
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
|
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
|
||||||
|
@ -100,8 +100,8 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
|
||||||
return ColorManager.getDefault().getColor( PreferenceConverter.getColor( getDefault().getPreferenceStore(), type ) );
|
return ColorManager.getDefault().getColor( PreferenceConverter.getColor( getDefault().getPreferenceStore(), type ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CDTDebugModelPresentation getDebugModelPresentation() {
|
public static CDebugModelPresentation getDebugModelPresentation() {
|
||||||
return CDTDebugModelPresentation.getDefault();
|
return CDebugModelPresentation.getDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue