mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 06:32:10 +02:00
Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
This commit is contained in:
parent
f9c9df1db7
commit
af37524c7a
45 changed files with 2235 additions and 733 deletions
|
@ -1,3 +1,21 @@
|
||||||
|
2005-04-21 Mikhail Khodjaiants
|
||||||
|
Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
|
||||||
|
* CDebugCorePlugin.java
|
||||||
|
* MappingSourceContainer.java
|
||||||
|
* SourceLookupMessages.java: new
|
||||||
|
* SourceLookupMessages.properties: new
|
||||||
|
* CBreakpointManager.java
|
||||||
|
* ICDebugInternalConstants.java
|
||||||
|
* CommonSourceLookupDirector.java: new
|
||||||
|
* CSourceLookupDirector.java
|
||||||
|
* CSourceLookupParticipant.java
|
||||||
|
* CSourcePathComputerDelegate.java
|
||||||
|
* InternalSourceLookupMessages.properties
|
||||||
|
* MapEntrySourceContainer.java
|
||||||
|
* MapEntrySourceContainerType.java
|
||||||
|
* MappingSourceContainerType.java
|
||||||
|
* SourceUtils.java
|
||||||
|
|
||||||
2005-04-15 Alain Magloire
|
2005-04-15 Alain Magloire
|
||||||
Fix Pr 91581
|
Fix Pr 91581
|
||||||
* src/org/eclipse/cdt/debug/internal/core/breakpoint/CAddressBreakpoint.java
|
* src/org/eclipse/cdt/debug/internal/core/breakpoint/CAddressBreakpoint.java
|
||||||
|
|
|
@ -13,9 +13,12 @@ package org.eclipse.cdt.debug.core;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
||||||
import org.eclipse.cdt.debug.internal.core.DebugConfiguration;
|
import org.eclipse.cdt.debug.internal.core.DebugConfiguration;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
|
||||||
import org.eclipse.cdt.debug.internal.core.ListenerList;
|
import org.eclipse.cdt.debug.internal.core.ListenerList;
|
||||||
import org.eclipse.cdt.debug.internal.core.SessionManager;
|
import org.eclipse.cdt.debug.internal.core.SessionManager;
|
||||||
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.CommonSourceLookupDirector;
|
||||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -58,6 +61,11 @@ public class CDebugCorePlugin extends Plugin {
|
||||||
* Breakpoint listener list.
|
* Breakpoint listener list.
|
||||||
*/
|
*/
|
||||||
private ListenerList fBreakpointListeners;
|
private ListenerList fBreakpointListeners;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy source lookup director needed to manage common source containers.
|
||||||
|
*/
|
||||||
|
private CommonSourceLookupDirector fCommonSourceLookupDirector;
|
||||||
|
|
||||||
private SessionManager fSessionManager = null;
|
private SessionManager fSessionManager = null;
|
||||||
|
|
||||||
|
@ -243,6 +251,7 @@ public class CDebugCorePlugin extends Plugin {
|
||||||
*/
|
*/
|
||||||
public void start( BundleContext context ) throws Exception {
|
public void start( BundleContext context ) throws Exception {
|
||||||
super.start( context );
|
super.start( context );
|
||||||
|
initializeCommonSourceLookupDirector();
|
||||||
createBreakpointListenersList();
|
createBreakpointListenersList();
|
||||||
resetBreakpointsInstallCount();
|
resetBreakpointsInstallCount();
|
||||||
setSessionManager( new SessionManager() );
|
setSessionManager( new SessionManager() );
|
||||||
|
@ -255,6 +264,39 @@ public class CDebugCorePlugin extends Plugin {
|
||||||
setSessionManager( null );
|
setSessionManager( null );
|
||||||
disposeBreakpointListenersList();
|
disposeBreakpointListenersList();
|
||||||
resetBreakpointsInstallCount();
|
resetBreakpointsInstallCount();
|
||||||
|
disposeCommonSourceLookupDirector();
|
||||||
super.stop( context );
|
super.stop( context );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initializeCommonSourceLookupDirector() {
|
||||||
|
if ( fCommonSourceLookupDirector == null ) {
|
||||||
|
fCommonSourceLookupDirector = new CommonSourceLookupDirector();
|
||||||
|
String newMemento = CDebugCorePlugin.getDefault().getPluginPreferences().getString( ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS );
|
||||||
|
if ( newMemento.length() == 0 ) {
|
||||||
|
// Convert source locations to source containers
|
||||||
|
convertSourceLocations( fCommonSourceLookupDirector );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
fCommonSourceLookupDirector.initializeFromMemento( newMemento );
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
log( e.getStatus() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void disposeCommonSourceLookupDirector() {
|
||||||
|
if ( fCommonSourceLookupDirector != null )
|
||||||
|
fCommonSourceLookupDirector.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CSourceLookupDirector getCommonSourceLookupDirector() {
|
||||||
|
return fCommonSourceLookupDirector;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convertSourceLocations( CommonSourceLookupDirector director ) {
|
||||||
|
director.setSourceContainers( SourceUtils.convertSourceLocations( getCommonSourceLocations() ) );
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -17,13 +17,14 @@ import java.util.List;
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.MultiStatus;
|
import org.eclipse.core.runtime.MultiStatus;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
||||||
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
|
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
|
||||||
import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The source container for path mappings.
|
* The source container for path mappings.
|
||||||
|
@ -36,27 +37,22 @@ public class MappingSourceContainer extends AbstractSourceContainer {
|
||||||
*/
|
*/
|
||||||
public static final String TYPE_ID = CDebugCorePlugin.getUniqueIdentifier() + ".containerType.mapping"; //$NON-NLS-1$
|
public static final String TYPE_ID = CDebugCorePlugin.getUniqueIdentifier() + ".containerType.mapping"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private String fName;
|
||||||
private ArrayList fContainers;
|
private ArrayList fContainers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for MappingSourceContainer.
|
* Constructor for MappingSourceContainer.
|
||||||
*/
|
*/
|
||||||
public MappingSourceContainer() {
|
public MappingSourceContainer( String name ) {
|
||||||
|
fName = name;
|
||||||
fContainers = new ArrayList();
|
fContainers = new ArrayList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for MappingSourceContainer.
|
|
||||||
*/
|
|
||||||
public MappingSourceContainer( MapEntrySourceContainer[] entries ) {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
|
* @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "Path Mappings";
|
return fName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -110,7 +106,7 @@ public class MappingSourceContainer extends AbstractSourceContainer {
|
||||||
single = e;
|
single = e;
|
||||||
}
|
}
|
||||||
else if ( multiStatus == null ) {
|
else if ( multiStatus == null ) {
|
||||||
multiStatus = new MultiStatus( DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{ single.getStatus() }, SourceLookupMessages.getString( "CompositeSourceContainer.0" ), null ); //$NON-NLS-1$
|
multiStatus = new MultiStatus( DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, new IStatus[]{ single.getStatus() }, SourceLookupMessages.getString( "MappingSourceContainer.0" ), null ); //$NON-NLS-1$
|
||||||
multiStatus.add( e.getStatus() );
|
multiStatus.add( e.getStatus() );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -172,4 +168,36 @@ public class MappingSourceContainer extends AbstractSourceContainer {
|
||||||
}
|
}
|
||||||
fContainers.clear();
|
fContainers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MappingSourceContainer copy() {
|
||||||
|
MappingSourceContainer copy = new MappingSourceContainer( fName );
|
||||||
|
MapEntrySourceContainer[] entries = new MapEntrySourceContainer[fContainers.size()];
|
||||||
|
for ( int i = 0; i < entries.length; ++i ) {
|
||||||
|
copy.addMapEntry( ((MapEntrySourceContainer)fContainers.get( i )).copy() );
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName( String name ) {
|
||||||
|
fName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPath getCompilationPath( String sourceName ) {
|
||||||
|
IPath path = new Path( sourceName );
|
||||||
|
IPath result = null;
|
||||||
|
try {
|
||||||
|
ISourceContainer[] containers = getSourceContainers();
|
||||||
|
for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
MapEntrySourceContainer entry = (MapEntrySourceContainer)containers[i];
|
||||||
|
IPath local = entry.getLocalPath();
|
||||||
|
if ( local.isPrefixOf( path ) ) {
|
||||||
|
result = entry.getBackendPath().append( path.removeFirstSegments( local.segmentCount() ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the 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.core.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
public class SourceLookupMessages {
|
||||||
|
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.core.sourcelookup.SourceLookupMessages"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
|
||||||
|
|
||||||
|
private SourceLookupMessages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
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 @@
|
||||||
|
MappingSourceContainer.0=Source lookup error
|
|
@ -44,6 +44,7 @@ import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||||
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
||||||
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
|
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IMarkerDelta;
|
import org.eclipse.core.resources.IMarkerDelta;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -211,19 +212,18 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTargetBreakpoint( ICBreakpoint breakpoint ) {
|
public boolean isTargetBreakpoint( ICBreakpoint breakpoint ) {
|
||||||
// Problem: gdb doesn't accept breakpoint if the file is specified by full path (depends on the current directory).
|
|
||||||
// This prevents us from using gdb as a breakpoint filter. The case when two unrelated projects contain files
|
|
||||||
// with the same name will cause problems.
|
|
||||||
// Current solution: the source locator is used as a breakpoint filter.
|
|
||||||
IResource resource = breakpoint.getMarker().getResource();
|
IResource resource = breakpoint.getMarker().getResource();
|
||||||
if ( breakpoint instanceof ICAddressBreakpoint )
|
if ( breakpoint instanceof ICAddressBreakpoint )
|
||||||
return supportsAddressBreakpoint( (ICAddressBreakpoint)breakpoint );
|
return supportsAddressBreakpoint( (ICAddressBreakpoint)breakpoint );
|
||||||
if ( breakpoint instanceof ICLineBreakpoint ) {
|
if ( breakpoint instanceof ICLineBreakpoint ) {
|
||||||
try {
|
try {
|
||||||
String handle = breakpoint.getSourceHandle();
|
String handle = breakpoint.getSourceHandle();
|
||||||
ICSourceLocator sl = getSourceLocator();
|
ISourceLocator sl = getSourceLocator();
|
||||||
if ( sl != null )
|
if ( sl instanceof ICSourceLocator )
|
||||||
return ( sl.findSourceElement( handle ) != null );
|
return ( ((ICSourceLocator)sl).findSourceElement( handle ) != null );
|
||||||
|
else if ( sl instanceof CSourceLookupDirector ) {
|
||||||
|
return true;//( ((CSourceLookupDirector)sl).getCompilationPath( handle ) != null || ((CSourceLookupDirector)sl).findSourceElements( handle ).length > 0 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch( CoreException e ) {
|
catch( CoreException e ) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -232,9 +232,11 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
else {
|
else {
|
||||||
IProject project = resource.getProject();
|
IProject project = resource.getProject();
|
||||||
if ( project != null && project.exists() ) {
|
if ( project != null && project.exists() ) {
|
||||||
ICSourceLocator sl = getSourceLocator();
|
ISourceLocator sl = getSourceLocator();
|
||||||
if ( sl != null )
|
if ( sl instanceof ICSourceLocator )
|
||||||
return sl.contains( project );
|
return ((ICSourceLocator)sl).contains( project );
|
||||||
|
else if ( sl instanceof CSourceLookupDirector )
|
||||||
|
return ((CSourceLookupDirector)sl).contains( project );
|
||||||
if ( project.equals( getProject() ) )
|
if ( project.equals( getProject() ) )
|
||||||
return true;
|
return true;
|
||||||
return CDebugUtils.isReferencedProject( getProject(), project );
|
return CDebugUtils.isReferencedProject( getProject(), project );
|
||||||
|
@ -554,15 +556,13 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setLineBreakpoint( ICLineBreakpoint breakpoint ) throws CDIException, CoreException {
|
private void setLineBreakpoint( ICLineBreakpoint breakpoint ) throws CDIException, CoreException {
|
||||||
final boolean enabled = breakpoint.isEnabled();
|
boolean enabled = breakpoint.isEnabled();
|
||||||
final ICDITarget cdiTarget = getCDITarget();
|
ICDITarget cdiTarget = getCDITarget();
|
||||||
String handle = breakpoint.getSourceHandle();
|
String handle = breakpoint.getSourceHandle();
|
||||||
IPath path = new Path( handle );
|
IPath path = convertPath( handle );
|
||||||
if ( path.isValidPath( handle ) ) {
|
ICDILocation location = cdiTarget.createLocation( path.toPortableString(), null, breakpoint.getLineNumber() );
|
||||||
final ICDILocation location = cdiTarget.createLocation( path.lastSegment(), null, breakpoint.getLineNumber() );
|
ICDICondition condition = createCondition( breakpoint );
|
||||||
final ICDICondition condition = createCondition( breakpoint );
|
setLocationBreakpointOnTarget( breakpoint, cdiTarget, location, condition, enabled );
|
||||||
setLocationBreakpointOnTarget( breakpoint, cdiTarget, location, condition, enabled );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setWatchpointOnTarget( final ICWatchpoint watchpoint, final ICDITarget target, final int accessType, final String expression, final ICDICondition condition, final boolean enabled ) {
|
private void setWatchpointOnTarget( final ICWatchpoint watchpoint, final ICDITarget target, final int accessType, final String expression, final ICDICondition condition, final boolean enabled ) {
|
||||||
|
@ -617,20 +617,26 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
ICLineBreakpoint breakpoint = null;
|
ICLineBreakpoint breakpoint = null;
|
||||||
try {
|
try {
|
||||||
if ( !isEmpty( cdiBreakpoint.getLocation().getFile() ) ) {
|
if ( !isEmpty( cdiBreakpoint.getLocation().getFile() ) ) {
|
||||||
ICSourceLocator locator = getSourceLocator();
|
ISourceLocator locator = getSourceLocator();
|
||||||
if ( locator != null ) {
|
if ( locator instanceof ICSourceLocator || locator instanceof CSourceLookupDirector ) {
|
||||||
Object sourceElement = locator.findSourceElement( cdiBreakpoint.getLocation().getFile() );
|
String sourceHandle = cdiBreakpoint.getLocation().getFile();
|
||||||
|
IResource resource = getProject();
|
||||||
|
Object sourceElement = null;
|
||||||
|
if ( locator instanceof ICSourceLocator )
|
||||||
|
sourceElement = ((ICSourceLocator)locator).findSourceElement( cdiBreakpoint.getLocation().getFile() );
|
||||||
|
else
|
||||||
|
sourceElement = ((CSourceLookupDirector)locator).getSourceElement( cdiBreakpoint.getLocation().getFile() );
|
||||||
if ( sourceElement instanceof IFile || sourceElement instanceof IStorage ) {
|
if ( sourceElement instanceof IFile || sourceElement instanceof IStorage ) {
|
||||||
String sourceHandle = ( sourceElement instanceof IFile ) ? ((IFile)sourceElement).getLocation().toOSString() : ((IStorage)sourceElement).getFullPath().toOSString();
|
sourceHandle = ( sourceElement instanceof IFile ) ? ((IFile)sourceElement).getLocation().toOSString() : ((IStorage)sourceElement).getFullPath().toOSString();
|
||||||
IResource resource = ( sourceElement instanceof IFile ) ? (IResource)sourceElement : ResourcesPlugin.getWorkspace().getRoot();
|
resource = ( sourceElement instanceof IFile ) ? (IResource)sourceElement : ResourcesPlugin.getWorkspace().getRoot();
|
||||||
breakpoint = createLineBreakpoint( sourceHandle, resource, cdiBreakpoint );
|
|
||||||
}
|
|
||||||
else if ( !isEmpty( cdiBreakpoint.getLocation().getFunction() ) ) {
|
|
||||||
breakpoint = createFunctionBreakpoint( cdiBreakpoint );
|
|
||||||
}
|
|
||||||
else if ( ! cdiBreakpoint.getLocation().getAddress().equals( BigInteger.ZERO ) ) {
|
|
||||||
breakpoint = createAddressBreakpoint( cdiBreakpoint );
|
|
||||||
}
|
}
|
||||||
|
breakpoint = createLineBreakpoint( sourceHandle, resource, cdiBreakpoint );
|
||||||
|
// else if ( !isEmpty( cdiBreakpoint.getLocation().getFunction() ) ) {
|
||||||
|
// breakpoint = createFunctionBreakpoint( cdiBreakpoint );
|
||||||
|
// }
|
||||||
|
// else if ( ! cdiBreakpoint.getLocation().getAddress().equals( BigInteger.ZERO ) ) {
|
||||||
|
// breakpoint = createAddressBreakpoint( cdiBreakpoint );
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( !isEmpty( cdiBreakpoint.getLocation().getFunction() ) ) {
|
else if ( !isEmpty( cdiBreakpoint.getLocation().getFunction() ) ) {
|
||||||
|
@ -711,9 +717,8 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
return watchpoint;
|
return watchpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICSourceLocator getSourceLocator() {
|
private ISourceLocator getSourceLocator() {
|
||||||
ISourceLocator locator = getDebugTarget().getLaunch().getSourceLocator();
|
return getDebugTarget().getLaunch().getSourceLocator();
|
||||||
return (locator instanceof IAdaptable) ? (ICSourceLocator)((IAdaptable)locator).getAdapter( ICSourceLocator.class ) : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IProject getProject() {
|
private IProject getProject() {
|
||||||
|
@ -816,4 +821,18 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
private ICDICondition createCondition( ICBreakpoint breakpoint ) throws CoreException, CDIException {
|
private ICDICondition createCondition( ICBreakpoint breakpoint ) throws CoreException, CDIException {
|
||||||
return getCDITarget().createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition(), getThreadNames( breakpoint ) );
|
return getCDITarget().createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition(), getThreadNames( breakpoint ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IPath convertPath( String sourceHandle ) {
|
||||||
|
IPath path = null;
|
||||||
|
if ( Path.EMPTY.isValidPath( sourceHandle ) ) {
|
||||||
|
ISourceLocator sl = getSourceLocator();
|
||||||
|
if ( sl instanceof CSourceLookupDirector ) {
|
||||||
|
path = ((CSourceLookupDirector)sl).getCompilationPath( sourceHandle );
|
||||||
|
}
|
||||||
|
if ( path == null ) {
|
||||||
|
path = new Path( sourceHandle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.core;
|
package org.eclipse.cdt.debug.internal.core;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Definitions of the internal constants for C/C++ Debug plug-in.
|
* Definitions of the internal constants for C/C++ Debug plug-in.
|
||||||
*/
|
*/
|
||||||
|
@ -21,4 +23,9 @@ public class ICDebugInternalConstants {
|
||||||
public static final int STATUS_CODE_QUESTION = 10000;
|
public static final int STATUS_CODE_QUESTION = 10000;
|
||||||
public static final int STATUS_CODE_INFO = 10001;
|
public static final int STATUS_CODE_INFO = 10001;
|
||||||
public static final int STATUS_CODE_ERROR = 10002;
|
public static final int STATUS_CODE_ERROR = 10002;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String preference for the common source containers.
|
||||||
|
*/
|
||||||
|
public static final String PREF_COMMON_SOURCE_CONTAINERS = CDebugCorePlugin.getUniqueIdentifier() + ".cDebug.common_source_containers"; //$NON-NLS-1$
|
||||||
}
|
}
|
|
@ -13,7 +13,11 @@ package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
|
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
||||||
import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
|
import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
|
||||||
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
|
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
|
||||||
|
@ -49,4 +53,64 @@ public class CSourceLookupDirector extends AbstractSourceLookupDirector {
|
||||||
public boolean supportsSourceContainerType( ISourceContainerType type ) {
|
public boolean supportsSourceContainerType( ISourceContainerType type ) {
|
||||||
return fFilteredTypes.contains( type.getId() );
|
return fFilteredTypes.contains( type.getId() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean contains( IProject project ) {
|
||||||
|
ISourceContainer[] containers = getSourceContainers();
|
||||||
|
for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
if ( contains( containers[i], project ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean contains( ISourceContainer container, IProject project ) {
|
||||||
|
if ( container instanceof ProjectSourceContainer && ((ProjectSourceContainer)container).getProject().equals( project ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ISourceContainer[] containers;
|
||||||
|
containers = container.getSourceContainers();
|
||||||
|
for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
if ( contains( containers[i], project ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPath getCompilationPath( String sourceName ) {
|
||||||
|
IPath path = null;
|
||||||
|
ISourceContainer[] containers = getSourceContainers();
|
||||||
|
for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
IPath cp = getCompilationPath( containers[i], sourceName );
|
||||||
|
if ( cp != null ) {
|
||||||
|
path = cp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IPath getCompilationPath( ISourceContainer container, String sourceName ) {
|
||||||
|
IPath path = null;
|
||||||
|
if ( container instanceof MappingSourceContainer ) {
|
||||||
|
path = ((MappingSourceContainer)container).getCompilationPath( sourceName );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
ISourceContainer[] containers;
|
||||||
|
containers = container.getSourceContainers();
|
||||||
|
for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
path = getCompilationPath( containers[i], sourceName );
|
||||||
|
if ( path != null )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,15 @@
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
|
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A source lookup participant that searches for C/C++ source code.
|
* A source lookup participant that searches for C/C++ source code.
|
||||||
|
@ -47,14 +52,32 @@ public class CSourceLookupParticipant extends AbstractSourceLookupParticipant {
|
||||||
*/
|
*/
|
||||||
public Object[] findSourceElements( Object object ) throws CoreException {
|
public Object[] findSourceElements( Object object ) throws CoreException {
|
||||||
// Workaround for cases when the stack frame doesn't contain the source file name
|
// Workaround for cases when the stack frame doesn't contain the source file name
|
||||||
|
String name = null;
|
||||||
if ( object instanceof IAdaptable ) {
|
if ( object instanceof IAdaptable ) {
|
||||||
ICStackFrame frame = (ICStackFrame)((IAdaptable)object).getAdapter( ICStackFrame.class );
|
ICStackFrame frame = (ICStackFrame)((IAdaptable)object).getAdapter( ICStackFrame.class );
|
||||||
if ( frame != null ) {
|
if ( frame != null ) {
|
||||||
String name = frame.getFile();
|
name = frame.getFile().trim();
|
||||||
if ( name == null || name.trim().length() == 0 )
|
if ( name == null || name.length() == 0 )
|
||||||
return new Object[] { gfNoSource };
|
return new Object[] { gfNoSource };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ( object instanceof String ) {
|
||||||
|
name = (String)object;
|
||||||
|
}
|
||||||
|
// Workaround. See bug #91808.
|
||||||
|
if ( name != null ) {
|
||||||
|
File file = new File( name );
|
||||||
|
if ( file.isAbsolute() && file.exists() ) {
|
||||||
|
return findSourceElementByFile( file );
|
||||||
|
}
|
||||||
|
}
|
||||||
return super.findSourceElements( object );
|
return super.findSourceElements( object );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object[] findSourceElementByFile( File file ) {
|
||||||
|
IFile[] wfiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation( new Path( file.getPath() ) );
|
||||||
|
if ( wfiles.length > 0 )
|
||||||
|
return wfiles;
|
||||||
|
return new LocalFileStorage[] { new LocalFileStorage( file ) };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -36,13 +39,16 @@ public class CSourcePathComputerDelegate implements ISourcePathComputerDelegate
|
||||||
* @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
|
* @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
|
||||||
*/
|
*/
|
||||||
public ISourceContainer[] computeSourceContainers( ILaunchConfiguration configuration, IProgressMonitor monitor ) throws CoreException {
|
public ISourceContainer[] computeSourceContainers( ILaunchConfiguration configuration, IProgressMonitor monitor ) throws CoreException {
|
||||||
|
ISourceContainer[] common = CDebugCorePlugin.getDefault().getCommonSourceLookupDirector().getSourceContainers();
|
||||||
|
ArrayList containers = new ArrayList( common.length + 1 );
|
||||||
|
containers.addAll( Arrays.asList( common ) );
|
||||||
String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
|
String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
|
||||||
if ( projectName != null ) {
|
if ( projectName != null ) {
|
||||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
||||||
if ( project.exists() ) {
|
if ( project.exists() ) {
|
||||||
return new ISourceContainer[] { new ProjectSourceContainer( project, true ) };
|
containers.add( 0, new ProjectSourceContainer( project, true ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ISourceContainer[0];
|
return (ISourceContainer[])containers.toArray( new ISourceContainer[containers.size()] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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.core.sourcelookup;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Director of the common source containers.
|
||||||
|
*/
|
||||||
|
public class CommonSourceLookupDirector extends CSourceLookupDirector {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#setSourceContainers(org.eclipse.debug.core.sourcelookup.ISourceContainer[])
|
||||||
|
*/
|
||||||
|
public void setSourceContainers( ISourceContainer[] containers ) {
|
||||||
|
try {
|
||||||
|
super.setSourceContainers( containers );
|
||||||
|
CDebugCorePlugin.getDefault().getPluginPreferences().setValue( ICDebugInternalConstants.PREF_COMMON_SOURCE_CONTAINERS, getMemento() );
|
||||||
|
CDebugCorePlugin.getDefault().savePluginPreferences();
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
CDebugCorePlugin.log( e.getStatus() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,3 +20,11 @@ CSourceLocator.0=Unable to create memento for C/C++ source locator.
|
||||||
CSourceLocator.1=Unable to restore C/C++ source locator - invalid format.
|
CSourceLocator.1=Unable to restore C/C++ source locator - invalid format.
|
||||||
CSourceLocator.2=Exception occurred initializing source locator.
|
CSourceLocator.2=Exception occurred initializing source locator.
|
||||||
CSourceLocator.3=Error initializing directory source location.
|
CSourceLocator.3=Error initializing directory source location.
|
||||||
|
MapEntrySourceContainerType.0=Source lookup: unable to restore map entry - missing backend path attribute.
|
||||||
|
MapEntrySourceContainerType.1=Source lookup: unable to restore map entry - missing local path attribute.
|
||||||
|
MapEntrySourceContainerType.2=Source lookup: unable to restore map entry - expecting map entry element.
|
||||||
|
MapEntrySourceContainerType.3=Source lookup: unable to restore map entry - invalid memento.
|
||||||
|
MappingSourceContainerType.0=Source lookup: unable to restore map entry - expecting memnto attribute.
|
||||||
|
MappingSourceContainerType.1=Source lookup: unable to restore mapping - expecting mapping element.
|
||||||
|
MappingSourceContainerType.2=Source lookup: unable to restore mapping - invalid memento.
|
||||||
|
SourceUtils.0=Mapping
|
||||||
|
|
|
@ -13,7 +13,6 @@ package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -39,6 +38,14 @@ public class MapEntrySourceContainer extends AbstractSourceContainer {
|
||||||
|
|
||||||
private IPath fBackendPath;
|
private IPath fBackendPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for MapEntrySourceContainer.
|
||||||
|
*/
|
||||||
|
public MapEntrySourceContainer() {
|
||||||
|
fBackendPath = Path.EMPTY;
|
||||||
|
fLocalPath = Path.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for MapEntrySourceContainer.
|
* Constructor for MapEntrySourceContainer.
|
||||||
*/
|
*/
|
||||||
|
@ -80,7 +87,7 @@ public class MapEntrySourceContainer extends AbstractSourceContainer {
|
||||||
* @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
|
* @see org.eclipse.debug.core.sourcelookup.ISourceContainer#getName()
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return MessageFormat.format( "{0} - {1}", new String[] { getBackendPath().toString(), getLocalPath().toOSString() } ); //$NON-NLS-1$
|
return MessageFormat.format( "{0} - {1}", new String[] { getBackendPath().toOSString(), getLocalPath().toOSString() } ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -90,14 +97,22 @@ public class MapEntrySourceContainer extends AbstractSourceContainer {
|
||||||
return getSourceContainerType( TYPE_ID );
|
return getSourceContainerType( TYPE_ID );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IPath getLocalPath() {
|
public IPath getLocalPath() {
|
||||||
return fLocalPath;
|
return fLocalPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IPath getBackendPath() {
|
public IPath getBackendPath() {
|
||||||
return fBackendPath;
|
return fBackendPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLocalPath( IPath local ) {
|
||||||
|
fLocalPath = local;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBackendPath( IPath backend ) {
|
||||||
|
fBackendPath = backend;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see java.lang.Object#equals(java.lang.Object)
|
* @see java.lang.Object#equals(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
|
@ -107,4 +122,8 @@ public class MapEntrySourceContainer extends AbstractSourceContainer {
|
||||||
MapEntrySourceContainer entry = (MapEntrySourceContainer)o;
|
MapEntrySourceContainer entry = (MapEntrySourceContainer)o;
|
||||||
return ( entry.getBackendPath().equals( getBackendPath() ) && entry.getLocalPath().equals( getLocalPath() ) );
|
return ( entry.getBackendPath().equals( getBackendPath() ) && entry.getLocalPath().equals( getLocalPath() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MapEntrySourceContainer copy() {
|
||||||
|
return new MapEntrySourceContainer( fBackendPath, fLocalPath );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,18 +39,18 @@ public class MapEntrySourceContainerType extends AbstractSourceContainerTypeDele
|
||||||
String path = element.getAttribute( BACKEND_PATH );
|
String path = element.getAttribute( BACKEND_PATH );
|
||||||
IPath backend = new Path( path );
|
IPath backend = new Path( path );
|
||||||
if ( !backend.isValidPath( path ) ) {
|
if ( !backend.isValidPath( path ) ) {
|
||||||
abort( "Source lookup: unable to restore map entry - missing backend path attribute.", null );
|
abort( InternalSourceLookupMessages.getString( "MapEntrySourceContainerType.0" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
path = element.getAttribute( LOCAL_PATH );
|
path = element.getAttribute( LOCAL_PATH );
|
||||||
IPath local = new Path( path );
|
IPath local = new Path( path );
|
||||||
if ( !local.isValidPath( path ) ) {
|
if ( !local.isValidPath( path ) ) {
|
||||||
abort( "Source lookup: unable to restore map entry - missing local path attribute.", null );
|
abort( InternalSourceLookupMessages.getString( "MapEntrySourceContainerType.1" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
return new MapEntrySourceContainer( backend, local );
|
return new MapEntrySourceContainer( backend, local );
|
||||||
}
|
}
|
||||||
abort( "Source lookup: unable to restore map entry - expecting map entry element.", null );
|
abort( InternalSourceLookupMessages.getString( "MapEntrySourceContainerType.2" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
abort( "Source lookup: unable to restore map entry - invalid memento.", null );
|
abort( InternalSourceLookupMessages.getString( "MapEntrySourceContainerType.3" ), null ); //$NON-NLS-1$
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ public class MappingSourceContainerType extends AbstractSourceContainerTypeDeleg
|
||||||
|
|
||||||
private final static String ELEMENT_MAPPING = "mapping"; //$NON-NLS-1$
|
private final static String ELEMENT_MAPPING = "mapping"; //$NON-NLS-1$
|
||||||
private final static String ELEMENT_MAP_ENTRY = "mapEntry"; //$NON-NLS-1$
|
private final static String ELEMENT_MAP_ENTRY = "mapEntry"; //$NON-NLS-1$
|
||||||
|
private final static String ATTR_NAME = "name"; //$NON-NLS-1$
|
||||||
private final static String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
private final static String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -40,6 +41,9 @@ public class MappingSourceContainerType extends AbstractSourceContainerTypeDeleg
|
||||||
if ( node.getNodeType() == Node.ELEMENT_NODE ) {
|
if ( node.getNodeType() == Node.ELEMENT_NODE ) {
|
||||||
Element element = (Element)node;
|
Element element = (Element)node;
|
||||||
if ( ELEMENT_MAPPING.equals( element.getNodeName() ) ) {
|
if ( ELEMENT_MAPPING.equals( element.getNodeName() ) ) {
|
||||||
|
String name = element.getAttribute( ATTR_NAME );
|
||||||
|
if ( name == null )
|
||||||
|
name = ""; //$NON-NLS-1$
|
||||||
List entries = new ArrayList();
|
List entries = new ArrayList();
|
||||||
Node childNode = element.getFirstChild();
|
Node childNode = element.getFirstChild();
|
||||||
while( childNode != null ) {
|
while( childNode != null ) {
|
||||||
|
@ -48,7 +52,7 @@ public class MappingSourceContainerType extends AbstractSourceContainerTypeDeleg
|
||||||
if ( ELEMENT_MAP_ENTRY.equals( child.getNodeName() ) ) {
|
if ( ELEMENT_MAP_ENTRY.equals( child.getNodeName() ) ) {
|
||||||
String childMemento = child.getAttribute( ATTR_MEMENTO );
|
String childMemento = child.getAttribute( ATTR_MEMENTO );
|
||||||
if ( childMemento == null || childMemento.length() == 0 ) {
|
if ( childMemento == null || childMemento.length() == 0 ) {
|
||||||
abort( "Source lookup: unable to restore map entry - expecting memnto attribute.", null );
|
abort( InternalSourceLookupMessages.getString( "MappingSourceContainerType.0" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
ISourceContainerType type = DebugPlugin.getDefault().getLaunchManager().getSourceContainerType( MapEntrySourceContainer.TYPE_ID );
|
ISourceContainerType type = DebugPlugin.getDefault().getLaunchManager().getSourceContainerType( MapEntrySourceContainer.TYPE_ID );
|
||||||
MapEntrySourceContainer entry = (MapEntrySourceContainer)type.createSourceContainer( childMemento );
|
MapEntrySourceContainer entry = (MapEntrySourceContainer)type.createSourceContainer( childMemento );
|
||||||
|
@ -57,16 +61,16 @@ public class MappingSourceContainerType extends AbstractSourceContainerTypeDeleg
|
||||||
}
|
}
|
||||||
childNode = childNode.getNextSibling();
|
childNode = childNode.getNextSibling();
|
||||||
}
|
}
|
||||||
MappingSourceContainer container = new MappingSourceContainer();
|
MappingSourceContainer container = new MappingSourceContainer( name );
|
||||||
Iterator it = entries.iterator();
|
Iterator it = entries.iterator();
|
||||||
while( it.hasNext() ) {
|
while( it.hasNext() ) {
|
||||||
container.addMapEntry( (MapEntrySourceContainer)it.next() );
|
container.addMapEntry( (MapEntrySourceContainer)it.next() );
|
||||||
}
|
}
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
abort( "Source lookup: unable to restore mapping - expecting mapping element.", null );
|
abort( InternalSourceLookupMessages.getString( "MappingSourceContainerType.1" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
abort( "Source lookup: unable to restore mapping - invalid memento.", null );
|
abort( InternalSourceLookupMessages.getString( "MappingSourceContainerType.2" ), null ); //$NON-NLS-1$
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,6 +80,7 @@ public class MappingSourceContainerType extends AbstractSourceContainerTypeDeleg
|
||||||
public String getMemento( ISourceContainer container ) throws CoreException {
|
public String getMemento( ISourceContainer container ) throws CoreException {
|
||||||
Document document = newDocument();
|
Document document = newDocument();
|
||||||
Element element = document.createElement( ELEMENT_MAPPING );
|
Element element = document.createElement( ELEMENT_MAPPING );
|
||||||
|
element.setAttribute( ATTR_NAME, container.getName() );
|
||||||
ISourceContainer[] entries = ((MappingSourceContainer)container).getSourceContainers();
|
ISourceContainer[] entries = ((MappingSourceContainer)container).getSourceContainers();
|
||||||
for ( int i = 0; i < entries.length; ++i ) {
|
for ( int i = 0; i < entries.length; ++i ) {
|
||||||
Element child = document.createElement( ELEMENT_MAP_ENTRY );
|
Element child = document.createElement( ELEMENT_MAP_ENTRY );
|
||||||
|
|
|
@ -8,26 +8,31 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
package org.eclipse.cdt.debug.internal.core.sourcelookup;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.transform.TransformerException;
|
import javax.xml.transform.TransformerException;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.CDebugUtils;
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.IDirectorySourceLocation;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
|
@ -35,58 +40,47 @@ import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
/**
|
public class SourceUtils {
|
||||||
* Enter type comment.
|
|
||||||
*
|
|
||||||
* @since Oct 22, 2003
|
|
||||||
*/
|
|
||||||
public class SourceUtils
|
|
||||||
{
|
|
||||||
private static final String NAME_COMMON_SOURCE_LOCATIONS = "commonSourceLocations"; //$NON-NLS-1$
|
private static final String NAME_COMMON_SOURCE_LOCATIONS = "commonSourceLocations"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String NAME_SOURCE_LOCATION = "sourceLocation"; //$NON-NLS-1$
|
private static final String NAME_SOURCE_LOCATION = "sourceLocation"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
|
private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
||||||
|
|
||||||
public static String getCommonSourceLocationsMemento( ICSourceLocation[] locations )
|
public static String getCommonSourceLocationsMemento( ICSourceLocation[] locations ) {
|
||||||
{
|
Document document = null;
|
||||||
Document document = null;
|
Throwable ex = null;
|
||||||
Throwable ex = null;
|
try {
|
||||||
try
|
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
{
|
Element element = document.createElement( NAME_COMMON_SOURCE_LOCATIONS );
|
||||||
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
document.appendChild( element );
|
||||||
Element element = document.createElement( NAME_COMMON_SOURCE_LOCATIONS );
|
saveSourceLocations( document, element, locations );
|
||||||
document.appendChild( element );
|
|
||||||
saveSourceLocations( document, element, locations );
|
|
||||||
return CDebugUtils.serializeDocument( document );
|
return CDebugUtils.serializeDocument( document );
|
||||||
}
|
}
|
||||||
catch( ParserConfigurationException e )
|
catch( ParserConfigurationException e ) {
|
||||||
{
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
catch( IOException e )
|
|
||||||
{
|
|
||||||
ex = e;
|
ex = e;
|
||||||
}
|
}
|
||||||
catch( TransformerException e )
|
catch( IOException e ) {
|
||||||
{
|
ex = e;
|
||||||
|
}
|
||||||
|
catch( TransformerException e ) {
|
||||||
ex = e;
|
ex = e;
|
||||||
}
|
}
|
||||||
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error saving common source settings.", ex ) ); //$NON-NLS-1$
|
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error saving common source settings.", ex ) ); //$NON-NLS-1$
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void saveSourceLocations( Document doc, Element node, ICSourceLocation[] locations )
|
private static void saveSourceLocations( Document doc, Element node, ICSourceLocation[] locations ) {
|
||||||
{
|
for( int i = 0; i < locations.length; i++ ) {
|
||||||
for ( int i = 0; i < locations.length; i++ )
|
|
||||||
{
|
|
||||||
Element child = doc.createElement( NAME_SOURCE_LOCATION );
|
Element child = doc.createElement( NAME_SOURCE_LOCATION );
|
||||||
child.setAttribute( ATTR_CLASS, locations[i].getClass().getName() );
|
child.setAttribute( ATTR_CLASS, locations[i].getClass().getName() );
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
child.setAttribute( ATTR_MEMENTO, locations[i].getMemento() );
|
child.setAttribute( ATTR_MEMENTO, locations[i].getMemento() );
|
||||||
}
|
}
|
||||||
catch( CoreException e )
|
catch( CoreException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( e );
|
CDebugCorePlugin.log( e );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -94,91 +88,71 @@ public class SourceUtils
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ICSourceLocation[] getCommonSourceLocationsFromMemento( String memento )
|
public static ICSourceLocation[] getCommonSourceLocationsFromMemento( String memento ) {
|
||||||
{
|
|
||||||
ICSourceLocation[] result = new ICSourceLocation[0];
|
ICSourceLocation[] result = new ICSourceLocation[0];
|
||||||
if ( !isEmpty( memento ) )
|
if ( !isEmpty( memento ) ) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||||
StringReader reader = new StringReader( memento );
|
StringReader reader = new StringReader( memento );
|
||||||
InputSource source = new InputSource( reader );
|
InputSource source = new InputSource( reader );
|
||||||
Element root = parser.parse( source ).getDocumentElement();
|
Element root = parser.parse( source ).getDocumentElement();
|
||||||
|
|
||||||
if ( root.getNodeName().equalsIgnoreCase( NAME_COMMON_SOURCE_LOCATIONS ) )
|
if ( root.getNodeName().equalsIgnoreCase( NAME_COMMON_SOURCE_LOCATIONS ) )
|
||||||
result = initializeSourceLocations( root );
|
result = initializeSourceLocations( root );
|
||||||
}
|
}
|
||||||
catch( ParserConfigurationException e )
|
catch( ParserConfigurationException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
catch( SAXException e )
|
catch( SAXException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
catch( IOException e )
|
catch( IOException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
CDebugCorePlugin.log( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), 0, "Error initializing common source settings.", e ) ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ICSourceLocation[] initializeSourceLocations( Element root )
|
public static ICSourceLocation[] initializeSourceLocations( Element root ) {
|
||||||
{
|
|
||||||
List sourceLocations = new LinkedList();
|
List sourceLocations = new LinkedList();
|
||||||
NodeList list = root.getChildNodes();
|
NodeList list = root.getChildNodes();
|
||||||
int length = list.getLength();
|
int length = list.getLength();
|
||||||
for ( int i = 0; i < length; ++i )
|
for( int i = 0; i < length; ++i ) {
|
||||||
{
|
|
||||||
Node node = list.item( i );
|
Node node = list.item( i );
|
||||||
short type = node.getNodeType();
|
short type = node.getNodeType();
|
||||||
if ( type == Node.ELEMENT_NODE )
|
if ( type == Node.ELEMENT_NODE ) {
|
||||||
{
|
|
||||||
Element entry = (Element)node;
|
Element entry = (Element)node;
|
||||||
if ( entry.getNodeName().equalsIgnoreCase( NAME_SOURCE_LOCATION ) )
|
if ( entry.getNodeName().equalsIgnoreCase( NAME_SOURCE_LOCATION ) ) {
|
||||||
{
|
|
||||||
String className = entry.getAttribute( ATTR_CLASS );
|
String className = entry.getAttribute( ATTR_CLASS );
|
||||||
String data = entry.getAttribute( ATTR_MEMENTO );
|
String data = entry.getAttribute( ATTR_MEMENTO );
|
||||||
if ( className == null || className.trim().length() == 0 )
|
if ( className == null || className.trim().length() == 0 ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( "Unable to restore common source locations - invalid format." ); //$NON-NLS-1$
|
CDebugCorePlugin.log( "Unable to restore common source locations - invalid format." ); //$NON-NLS-1$
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Class clazz = null;
|
Class clazz = null;
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
clazz = CDebugCorePlugin.getDefault().getBundle().loadClass( className );
|
clazz = CDebugCorePlugin.getDefault().getBundle().loadClass( className );
|
||||||
}
|
}
|
||||||
catch( ClassNotFoundException e )
|
catch( ClassNotFoundException e ) {
|
||||||
{
|
CDebugCorePlugin.log( MessageFormat.format( "Unable to restore source location - class not found {0}", new String[]{ className } ) ); //$NON-NLS-1$
|
||||||
CDebugCorePlugin.log( MessageFormat.format( "Unable to restore source location - class not found {0}", new String[] { className } ) ); //$NON-NLS-1$
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ICSourceLocation location = null;
|
ICSourceLocation location = null;
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
location = (ICSourceLocation)clazz.newInstance();
|
location = (ICSourceLocation)clazz.newInstance();
|
||||||
}
|
}
|
||||||
catch( IllegalAccessException e )
|
catch( IllegalAccessException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
catch( InstantiationException e )
|
catch( InstantiationException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
location.initializeFrom( data );
|
location.initializeFrom( data );
|
||||||
sourceLocations.add( location );
|
sourceLocations.add( location );
|
||||||
}
|
}
|
||||||
catch( CoreException e )
|
catch( CoreException e ) {
|
||||||
{
|
|
||||||
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
CDebugCorePlugin.log( "Unable to restore source location: " + e.getMessage() ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,8 +161,29 @@ public class SourceUtils
|
||||||
return (ICSourceLocation[])sourceLocations.toArray( new ICSourceLocation[sourceLocations.size()] );
|
return (ICSourceLocation[])sourceLocations.toArray( new ICSourceLocation[sourceLocations.size()] );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEmpty( String string )
|
private static boolean isEmpty( String string ) {
|
||||||
{
|
return (string == null || string.trim().length() == 0);
|
||||||
return ( string == null || string.trim().length() == 0 );
|
}
|
||||||
|
|
||||||
|
static public ISourceContainer[] convertSourceLocations( ICSourceLocation[] locations ) {
|
||||||
|
ArrayList containers = new ArrayList( locations.length );
|
||||||
|
int mappingCount = 0;
|
||||||
|
for ( int i = 0; i < locations.length; ++i ) {
|
||||||
|
if ( locations[i] instanceof IProjectSourceLocation ) {
|
||||||
|
containers.add( new ProjectSourceContainer( ((IProjectSourceLocation)locations[i]).getProject(), false ) );
|
||||||
|
}
|
||||||
|
else if ( locations[i] instanceof IDirectorySourceLocation ) {
|
||||||
|
IDirectorySourceLocation d = (IDirectorySourceLocation)locations[i];
|
||||||
|
IPath a = d.getAssociation();
|
||||||
|
if ( a != null ) {
|
||||||
|
MappingSourceContainer mapping = new MappingSourceContainer( InternalSourceLookupMessages.getString( "SourceUtils.0" ) + (++mappingCount) ); //$NON-NLS-1$
|
||||||
|
mapping.addMapEntries( new MapEntrySourceContainer[] { new MapEntrySourceContainer( a, d.getDirectory() ) } );
|
||||||
|
containers.add( mapping );
|
||||||
|
|
||||||
|
}
|
||||||
|
containers.add( new DirectorySourceContainer( d.getDirectory(), d.searchSubfolders() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ISourceContainer[])containers.toArray( new ISourceContainer[containers.size()] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,29 @@
|
||||||
|
2005-04-21 Mikhail Khodjaiants
|
||||||
|
Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
|
||||||
|
* CDebugModelPresentation.java
|
||||||
|
* ICDebugHelpContextIds.java
|
||||||
|
* CDebugPreferencePage.java
|
||||||
|
* PreferenceMessages.properties
|
||||||
|
* SourcePreferencePage.java
|
||||||
|
* AddContainerAction.java: new
|
||||||
|
* AddSourceContainerDialog.java: new
|
||||||
|
* DownAction.java: new
|
||||||
|
* EditContainerAction.java: new
|
||||||
|
* MappingSourceContainerBrowser.java
|
||||||
|
* PathMappingDialog.java
|
||||||
|
* RemoveAction.java: new
|
||||||
|
* SourceContainerAction.java: new
|
||||||
|
* SourceContainerLabelProvider.java: new
|
||||||
|
* SourceContainerViewer.java: new
|
||||||
|
* SourceContainerWorkbenchAdapter.java
|
||||||
|
* SourceLookupUIMessages.java: new
|
||||||
|
* SourceLookupUIMessages.properties: new
|
||||||
|
* UpAction.java: new
|
||||||
|
* CDebugUIPlugin.java
|
||||||
|
* DefaultSourceLocator.java
|
||||||
|
* OldDefaultSourceLocator.java: new
|
||||||
|
* plugin.properties
|
||||||
|
|
||||||
2005-04-12 Mikhail Khodjaiants
|
2005-04-12 Mikhail Khodjaiants
|
||||||
Bug 91155: Wrong icon for "Restart".
|
Bug 91155: Wrong icon for "Restart".
|
||||||
* icons/dlcl16/restart.gif
|
* icons/dlcl16/restart.gif
|
||||||
|
|
|
@ -19,7 +19,7 @@ SignalsView.name=Signals
|
||||||
CDebuggerPage.name=C Debugger UI Page
|
CDebuggerPage.name=C Debugger UI Page
|
||||||
MemoryPreferencePage.name=Memory View
|
MemoryPreferencePage.name=Memory View
|
||||||
CDebugPreferencePage.name=Debug
|
CDebugPreferencePage.name=Debug
|
||||||
SourcePreferencePage.name=Source Code Locations
|
SourcePreferencePage.name=Source Lookup Path
|
||||||
|
|
||||||
RunMenu.label=&Run
|
RunMenu.label=&Run
|
||||||
DebugActionSet.label=C/C++ Debug
|
DebugActionSet.label=C/C++ Debug
|
||||||
|
|
|
@ -41,7 +41,6 @@ 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.IDummyStackFrame;
|
||||||
import org.eclipse.cdt.debug.core.model.IEnableDisableTarget;
|
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.EditorInputDelegate;
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
@ -153,20 +152,20 @@ 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 ) {
|
||||||
if ( input instanceof EditorInputDelegate ) {
|
// if ( input instanceof EditorInputDelegate ) {
|
||||||
if ( ((EditorInputDelegate)input).getDelegate() == null )
|
// if ( ((EditorInputDelegate)input).getDelegate() == null )
|
||||||
return CDebugEditor.EDITOR_ID;
|
// return CDebugEditor.EDITOR_ID;
|
||||||
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
|
// return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
|
||||||
}
|
// }
|
||||||
String id = null;
|
String id = null;
|
||||||
if ( input != null ) {
|
if ( input != null ) {
|
||||||
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
|
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
|
||||||
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
|
IEditorDescriptor descriptor = registry.getDefaultEditor( input.getName() );
|
||||||
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
|
id = (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
|
||||||
}
|
}
|
||||||
if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
|
// if ( CUIPlugin.EDITOR_ID.equals( id ) ) {
|
||||||
return CDebugEditor.EDITOR_ID;
|
// return CDebugEditor.EDITOR_ID;
|
||||||
}
|
// }
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,4 +66,5 @@ public interface ICDebugHelpContextIds
|
||||||
// dialogs
|
// dialogs
|
||||||
public static final String SOURCE_PATH_MAPPING_DIALOG = PREFIX + "source_path_mapping_dialog_context"; //$NON-NLS-1$
|
public static final String SOURCE_PATH_MAPPING_DIALOG = PREFIX + "source_path_mapping_dialog_context"; //$NON-NLS-1$
|
||||||
public static final String SOURCE_PATH_MAP_ENTRY_DIALOG = PREFIX + "source_path_map_entry_dialog_context"; //$NON-NLS-1$
|
public static final String SOURCE_PATH_MAP_ENTRY_DIALOG = PREFIX + "source_path_map_entry_dialog_context"; //$NON-NLS-1$
|
||||||
|
public static final String ADD_SOURCE_CONTAINER_DIALOG = PREFIX + "add_source_container_dialog"; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,10 +20,8 @@ import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
||||||
import org.eclipse.debug.ui.IDebugUIConstants;
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
import org.eclipse.debug.ui.IDebugView;
|
import org.eclipse.debug.ui.IDebugView;
|
||||||
import org.eclipse.jface.dialogs.DialogPage;
|
|
||||||
import org.eclipse.jface.preference.ColorFieldEditor;
|
import org.eclipse.jface.preference.ColorFieldEditor;
|
||||||
import org.eclipse.jface.preference.FieldEditor;
|
import org.eclipse.jface.preference.FieldEditor;
|
||||||
import org.eclipse.jface.preference.IPreferencePage;
|
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.preference.IntegerFieldEditor;
|
import org.eclipse.jface.preference.IntegerFieldEditor;
|
||||||
import org.eclipse.jface.preference.PreferenceConverter;
|
import org.eclipse.jface.preference.PreferenceConverter;
|
||||||
|
@ -186,8 +184,8 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
|
||||||
PreferenceConverter.setDefault( store, IInternalCDebugUIConstants.DISASSEMBLY_SOURCE_LINE_COLOR, IInternalCDebugUIConstants.DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB );
|
PreferenceConverter.setDefault( store, IInternalCDebugUIConstants.DISASSEMBLY_SOURCE_LINE_COLOR, IInternalCDebugUIConstants.DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* @see DialogPage#dispose()
|
* @see org.eclipse.jface.dialogs.IDialogPage#dispose()
|
||||||
*/
|
*/
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
@ -274,8 +272,8 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
|
||||||
label.setLayoutData( gd );
|
label.setLayoutData( gd );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/* (non-Javadoc)
|
||||||
* @see IPreferencePage#performOk() Also, notifies interested listeners
|
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
|
||||||
*/
|
*/
|
||||||
public boolean performOk() {
|
public boolean performOk() {
|
||||||
storeValues();
|
storeValues();
|
||||||
|
|
|
@ -22,6 +22,5 @@ CDebugPreferencePage.10=Default register format:
|
||||||
CDebugPreferencePage.11=Disassembly options
|
CDebugPreferencePage.11=Disassembly options
|
||||||
CDebugPreferencePage.12=Maximum number of displayed instructions:
|
CDebugPreferencePage.12=Maximum number of displayed instructions:
|
||||||
CDebugPreferencePage.13=The valid value range is [{0},{1}].
|
CDebugPreferencePage.13=The valid value range is [{0},{1}].
|
||||||
SourcePreferencePage.0=Common source lookup settings.
|
SourcePreferencePage.0=Common source lookup path settings.
|
||||||
SourcePreferencePage.1=Source Locations
|
SourcePreferencePage.0=S&ource Lookup Path:
|
||||||
SourcePreferencePage.2=Search for duplicate source files
|
|
||||||
|
|
|
@ -1,90 +1,115 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2004 QNX Software Systems and others.
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v1.0
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v10.html
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.ui.preferences;
|
package org.eclipse.cdt.debug.internal.ui.preferences;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.ArrayList;
|
||||||
import java.util.Observable;
|
import java.util.Iterator;
|
||||||
import java.util.Observer;
|
import java.util.List;
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.ICDebugConstants;
|
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
||||||
import org.eclipse.cdt.debug.internal.ui.PixelConverter;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.AddContainerAction;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.DialogField;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.DownAction;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.IDialogFieldListener;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.EditContainerAction;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.IListAdapter;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.RemoveAction;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.LayoutUtil;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerAction;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceContainerViewer;
|
||||||
import org.eclipse.cdt.debug.internal.ui.wizards.AddSourceLocationWizard;
|
import org.eclipse.cdt.debug.internal.ui.sourcelookup.UpAction;
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
import org.eclipse.cdt.debug.ui.sourcelookup.SourceListDialogField;
|
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
import org.eclipse.jface.preference.PreferencePage;
|
import org.eclipse.jface.preference.PreferencePage;
|
||||||
import org.eclipse.jface.resource.JFaceResources;
|
|
||||||
import org.eclipse.jface.window.Window;
|
|
||||||
import org.eclipse.jface.wizard.WizardDialog;
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Font;
|
||||||
|
import org.eclipse.swt.graphics.FontMetrics;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.ui.IWorkbench;
|
import org.eclipse.ui.IWorkbench;
|
||||||
import org.eclipse.ui.IWorkbenchPreferencePage;
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "Source Code Locations" preference page.
|
* The "Source Lookup Path" preference page.
|
||||||
*/
|
*/
|
||||||
public class SourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage, Observer {
|
public class SourcePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
|
||||||
|
|
||||||
|
private SourceContainerViewer fPathViewer;
|
||||||
|
private List fActions = new ArrayList(6);
|
||||||
private IWorkbench fWorkbench;
|
private IWorkbench fWorkbench;
|
||||||
|
private AddContainerAction fAddAction;
|
||||||
|
private EditContainerAction fEditAction;
|
||||||
|
|
||||||
private SourceListDialogField fSourceListField;
|
/* (non-Javadoc)
|
||||||
|
|
||||||
private SelectionButtonDialogField fSearchForDuplicateFiles;
|
|
||||||
|
|
||||||
private boolean fChanged = false;
|
|
||||||
|
|
||||||
public SourcePreferencePage() {
|
|
||||||
super();
|
|
||||||
setPreferenceStore( CDebugUIPlugin.getDefault().getPreferenceStore() );
|
|
||||||
setDescription( PreferenceMessages.getString( "SourcePreferencePage.0" ) ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
|
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
|
||||||
*/
|
*/
|
||||||
protected Control createContents( Composite parent ) {
|
protected Control createContents( Composite parent ) {
|
||||||
getWorkbench().getHelpSystem().setHelp( getControl(), ICDebugHelpContextIds.SOURCE_PREFERENCE_PAGE );
|
Font font = parent.getFont();
|
||||||
fSourceListField = createSourceListField();
|
Composite comp = new Composite( parent, SWT.NONE );
|
||||||
fSearchForDuplicateFiles = createSearchForDuplicateFilesButton();
|
GridLayout topLayout = new GridLayout();
|
||||||
Composite control = new Composite( parent, SWT.NONE );
|
topLayout.numColumns = 2;
|
||||||
GridLayout layout = new GridLayout();
|
comp.setLayout( topLayout );
|
||||||
layout.numColumns = 2;
|
GridData gd = new GridData( GridData.FILL_BOTH );
|
||||||
layout.marginWidth = 5;
|
comp.setLayoutData( gd );
|
||||||
layout.marginHeight = 5;
|
Label viewerLabel = new Label( comp, SWT.LEFT );
|
||||||
control.setLayout( layout );
|
viewerLabel.setText( PreferenceMessages.getString( "SourcePreferencePage.0" ) ); //$NON-NLS-1$
|
||||||
GridData data = new GridData();
|
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL );
|
||||||
data.verticalAlignment = GridData.FILL;
|
gd.horizontalSpan = 2;
|
||||||
data.horizontalAlignment = GridData.FILL;
|
viewerLabel.setLayoutData( gd );
|
||||||
control.setLayoutData( data );
|
viewerLabel.setFont( font );
|
||||||
control.setFont( JFaceResources.getDialogFont() );
|
fPathViewer = new SourceContainerViewer( comp );
|
||||||
PixelConverter converter = new PixelConverter( control );
|
gd = new GridData( GridData.FILL_BOTH );
|
||||||
fSourceListField.doFillIntoGrid( control, 3 );
|
fPathViewer.getControl().setLayoutData( gd );
|
||||||
LayoutUtil.setHorizontalSpan( fSourceListField.getLabelControl( null ), 2 );
|
fPathViewer.getControl().setFont( font );
|
||||||
LayoutUtil.setWidthHint( fSourceListField.getLabelControl( null ), converter.convertWidthInCharsToPixels( 40 ) );
|
Composite pathButtonComp = new Composite( comp, SWT.NONE );
|
||||||
LayoutUtil.setHorizontalGrabbing( fSourceListField.getListControl( null ) );
|
GridLayout pathButtonLayout = new GridLayout();
|
||||||
fSearchForDuplicateFiles.doFillIntoGrid( control, 3 );
|
pathButtonLayout.marginHeight = 0;
|
||||||
setValues();
|
pathButtonLayout.marginWidth = 0;
|
||||||
return control;
|
pathButtonComp.setLayout( pathButtonLayout );
|
||||||
|
gd = new GridData( GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL );
|
||||||
|
pathButtonComp.setLayoutData( gd );
|
||||||
|
pathButtonComp.setFont( font );
|
||||||
|
createVerticalSpacer( comp, 2 );
|
||||||
|
GC gc = new GC( parent );
|
||||||
|
gc.setFont( parent.getFont() );
|
||||||
|
FontMetrics fontMetrics = gc.getFontMetrics();
|
||||||
|
gc.dispose();
|
||||||
|
fAddAction = new AddContainerAction();
|
||||||
|
Button button = createPushButton( pathButtonComp, fAddAction.getText(), fontMetrics );
|
||||||
|
fAddAction.setButton( button );
|
||||||
|
addAction( fAddAction );
|
||||||
|
fEditAction = new EditContainerAction();
|
||||||
|
button = createPushButton( pathButtonComp, fEditAction.getText(), fontMetrics );
|
||||||
|
fEditAction.setButton( button );
|
||||||
|
addAction( fEditAction );
|
||||||
|
SourceContainerAction action = new RemoveAction();
|
||||||
|
button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
|
||||||
|
action.setButton( button );
|
||||||
|
addAction( action );
|
||||||
|
action = new UpAction();
|
||||||
|
button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
|
||||||
|
action.setButton( button );
|
||||||
|
addAction( action );
|
||||||
|
action = new DownAction();
|
||||||
|
button = createPushButton( pathButtonComp, action.getText(), fontMetrics );
|
||||||
|
action.setButton( button );
|
||||||
|
addAction( action );
|
||||||
|
retargetActions( fPathViewer );
|
||||||
|
Dialog.applyDialogFont( comp );
|
||||||
|
getWorkbench().getHelpSystem().setHelp( comp, ICDebugHelpContextIds.SOURCE_PREFERENCE_PAGE );
|
||||||
|
initialize();
|
||||||
|
return comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -96,125 +121,66 @@ public class SourcePreferencePage extends PreferencePage implements IWorkbenchPr
|
||||||
fWorkbench = workbench;
|
fWorkbench = workbench;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
private Button createPushButton( Composite parent, String label, FontMetrics fontMetrics ) {
|
||||||
* (non-Javadoc)
|
Button button = new Button( parent, SWT.PUSH );
|
||||||
*
|
button.setFont( parent.getFont() );
|
||||||
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
|
button.setText( label );
|
||||||
*/
|
GridData gd = getButtonGridData( button, fontMetrics );
|
||||||
public void update( Observable o, Object arg ) {
|
button.setLayoutData( gd );
|
||||||
setChanged( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
private SourceListDialogField createSourceListField() {
|
|
||||||
SourceListDialogField field = new SourceListDialogField( PreferenceMessages.getString( "SourcePreferencePage.1" ), //$NON-NLS-1$
|
|
||||||
new IListAdapter() {
|
|
||||||
|
|
||||||
public void customButtonPressed( DialogField f, int index ) {
|
|
||||||
sourceButtonPressed( index );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void selectionChanged( DialogField f ) {
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
field.addObserver( this );
|
|
||||||
return field;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SelectionButtonDialogField createSearchForDuplicateFilesButton() {
|
|
||||||
SelectionButtonDialogField button = new SelectionButtonDialogField( SWT.CHECK );
|
|
||||||
button.setLabelText( PreferenceMessages.getString( "SourcePreferencePage.2" ) ); //$NON-NLS-1$
|
|
||||||
button.setDialogFieldListener( new IDialogFieldListener() {
|
|
||||||
|
|
||||||
public void dialogFieldChanged( DialogField field ) {
|
|
||||||
setChanged( true );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void sourceButtonPressed( int index ) {
|
private GridData getButtonGridData( Button button, FontMetrics fontMetrics ) {
|
||||||
switch( index ) {
|
GridData gd = new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING );
|
||||||
case 0: // Add...
|
int widthHint = Dialog.convertHorizontalDLUsToPixels( fontMetrics, IDialogConstants.BUTTON_WIDTH );
|
||||||
if ( addSourceLocation() )
|
gd.widthHint = Math.max( widthHint, button.computeSize( SWT.DEFAULT, SWT.DEFAULT, true ).x );
|
||||||
setChanged( true );
|
return gd;
|
||||||
break;
|
|
||||||
case 2: // Up
|
|
||||||
case 3: // Down
|
|
||||||
case 5: // Remove
|
|
||||||
setChanged( true );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isChanged() {
|
|
||||||
return fChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setChanged( boolean changed ) {
|
|
||||||
fChanged = changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean addSourceLocation() {
|
|
||||||
AddSourceLocationWizard wizard = new AddSourceLocationWizard( getSourceLocations() );
|
|
||||||
WizardDialog dialog = new WizardDialog( getShell(), wizard );
|
|
||||||
if ( dialog.open() == Window.OK ) {
|
|
||||||
fSourceListField.addElement( wizard.getSourceLocation() );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICSourceLocation[] getSourceLocations() {
|
|
||||||
return (fSourceListField != null) ? fSourceListField.getSourceLocations() : new ICSourceLocation[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSourceLocations( ICSourceLocation[] locations ) {
|
|
||||||
if ( fSourceListField != null )
|
|
||||||
fSourceListField.setElements( Arrays.asList( locations ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
|
|
||||||
*/
|
|
||||||
protected void performDefaults() {
|
|
||||||
setSourceLocations( new ICSourceLocation[0] );
|
|
||||||
setSearchForDuplicateFiles( false );
|
|
||||||
super.performDefaults();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
|
|
||||||
*/
|
|
||||||
public boolean performOk() {
|
|
||||||
storeValues();
|
|
||||||
CDebugCorePlugin.getDefault().savePluginPreferences();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean searchForDuplicateFiles() {
|
|
||||||
return (fSearchForDuplicateFiles != null) ? fSearchForDuplicateFiles.isSelected() : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setSearchForDuplicateFiles( boolean search ) {
|
|
||||||
if ( fSearchForDuplicateFiles != null )
|
|
||||||
fSearchForDuplicateFiles.setSelection( search );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setValues() {
|
|
||||||
setSourceLocations( CDebugCorePlugin.getDefault().getCommonSourceLocations() );
|
|
||||||
setSearchForDuplicateFiles( CDebugCorePlugin.getDefault().getPluginPreferences().getBoolean( ICDebugConstants.PREF_SEARCH_DUPLICATE_FILES ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void storeValues() {
|
|
||||||
CDebugCorePlugin.getDefault().saveCommonSourceLocations( getSourceLocations() );
|
|
||||||
CDebugCorePlugin.getDefault().getPluginPreferences().setValue( ICDebugConstants.PREF_SEARCH_DUPLICATE_FILES, searchForDuplicateFiles() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IWorkbench getWorkbench() {
|
private IWorkbench getWorkbench() {
|
||||||
return fWorkbench;
|
return fWorkbench;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addAction( SourceContainerAction action ) {
|
||||||
|
fActions.add( action );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void retargetActions( SourceContainerViewer viewer ) {
|
||||||
|
Iterator actions = fActions.iterator();
|
||||||
|
while( actions.hasNext() ) {
|
||||||
|
SourceContainerAction action = (SourceContainerAction)actions.next();
|
||||||
|
action.setViewer( viewer );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createVerticalSpacer( Composite comp, int colSpan ) {
|
||||||
|
Label label = new Label( comp, SWT.NONE );
|
||||||
|
GridData gd = new GridData();
|
||||||
|
gd.horizontalSpan = colSpan;
|
||||||
|
label.setLayoutData( gd );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize() {
|
||||||
|
ISourceLookupDirector director = CDebugCorePlugin.getDefault().getCommonSourceLookupDirector();
|
||||||
|
fPathViewer.setEntries( director.getSourceContainers() );
|
||||||
|
fAddAction.setSourceLookupDirector( director );
|
||||||
|
fEditAction.setSourceLookupDirector( director );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
|
||||||
|
*/
|
||||||
|
protected void performDefaults() {
|
||||||
|
fPathViewer.setEntries( new ISourceContainer[0] );
|
||||||
|
super.performDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.PreferencePage#performOk()
|
||||||
|
*/
|
||||||
|
public boolean performOk() {
|
||||||
|
CDebugCorePlugin.getDefault().getCommonSourceLookupDirector().setSourceContainers( fPathViewer.getEntries() );
|
||||||
|
CDebugCorePlugin.getDefault().savePluginPreferences();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.sourcelookup;
|
||||||
|
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action to add a new source container.
|
||||||
|
* Used by the CommonSourceNotFoundEditor, the launch configuration source tab,
|
||||||
|
* and the EditSourceLookupPathDialog.
|
||||||
|
*/
|
||||||
|
public class AddContainerAction extends SourceContainerAction {
|
||||||
|
|
||||||
|
private ISourceLookupDirector fDirector;
|
||||||
|
|
||||||
|
public AddContainerAction() {
|
||||||
|
super(SourceLookupUIMessages.getString( "AddContainerAction.0" )); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts for a project to add.
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.action.IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
AddSourceContainerDialog dialog = new AddSourceContainerDialog(getShell(), getViewer(), fDirector);
|
||||||
|
dialog.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLookupDirector(ISourceLookupDirector director) {
|
||||||
|
fDirector = director;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
|
||||||
|
*/
|
||||||
|
protected boolean updateSelection(IStructuredSelection selection) {
|
||||||
|
if(selection == null || selection.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return getViewer().getTree().getSelection()[0].getParentItem()==null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
|
||||||
|
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
|
||||||
|
import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.dialogs.TitleAreaDialog;
|
||||||
|
import org.eclipse.jface.viewers.ArrayContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TableViewer;
|
||||||
|
import org.eclipse.jface.viewers.ViewerSorter;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.swt.widgets.Table;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dialog for adding new source containers. Presents the user with a list of
|
||||||
|
* source container types and allows them to select one.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
public class AddSourceContainerDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
|
private TableViewer fViewer;
|
||||||
|
private SourceContainerViewer fSourceContainerViewer;
|
||||||
|
private boolean fDoubleClickSelects = true;
|
||||||
|
private ISourceLookupDirector fDirector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public AddSourceContainerDialog(Shell shell, SourceContainerViewer viewer, ISourceLookupDirector director) {
|
||||||
|
super(shell);
|
||||||
|
setShellStyle(getShellStyle() | SWT.RESIZE);
|
||||||
|
fSourceContainerViewer=viewer;
|
||||||
|
fDirector = director;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the dialog area to display source container types that are "browseable"
|
||||||
|
*/
|
||||||
|
protected Control createDialogArea(Composite ancestor) {
|
||||||
|
|
||||||
|
getShell().setText(SourceLookupUIMessages.getString( "AddSourceContainerDialog.0" )); //$NON-NLS-1$
|
||||||
|
setTitle(SourceLookupUIMessages.getString( "AddSourceContainerDialog.1" )); //$NON-NLS-1$
|
||||||
|
|
||||||
|
Composite parent = new Composite(ancestor, SWT.NULL);
|
||||||
|
GridData gd= new GridData(GridData.FILL_BOTH);
|
||||||
|
GridLayout topLayout = new GridLayout();
|
||||||
|
topLayout.numColumns = 1;
|
||||||
|
parent.setLayout(topLayout);
|
||||||
|
parent.setLayoutData(gd);
|
||||||
|
|
||||||
|
ISourceContainerType[] types = filterTypes(DebugPlugin.getDefault().getLaunchManager().getSourceContainerTypes());
|
||||||
|
|
||||||
|
fViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE);
|
||||||
|
final Table table = fViewer.getTable();
|
||||||
|
gd = new GridData(GridData.FILL_BOTH);
|
||||||
|
table.setLayoutData(gd);
|
||||||
|
|
||||||
|
if (fDoubleClickSelects) {
|
||||||
|
table.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
if (table.getSelectionCount() == 1)
|
||||||
|
okPressed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fViewer.setLabelProvider(new SourceContainerLabelProvider());
|
||||||
|
fViewer.setContentProvider(new ArrayContentProvider());
|
||||||
|
fViewer.setSorter(new ViewerSorter());
|
||||||
|
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
ISelection selection = event.getSelection();
|
||||||
|
String desc = null;
|
||||||
|
if (!selection.isEmpty()) {
|
||||||
|
ISourceContainerType type = (ISourceContainerType) ((IStructuredSelection)selection).getFirstElement();
|
||||||
|
desc = type.getDescription();
|
||||||
|
}
|
||||||
|
setMessage(desc);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(types.length != 0) {
|
||||||
|
fViewer.setInput(types);
|
||||||
|
}
|
||||||
|
Dialog.applyDialogFont(parent);
|
||||||
|
PlatformUI.getWorkbench().getHelpSystem().setHelp( getShell(), ICDebugHelpContextIds.ADD_SOURCE_CONTAINER_DIALOG );
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes types without browsers from the provided list of types.
|
||||||
|
* @param types the complete list of source container types
|
||||||
|
* @return the list of source container types that have browsers
|
||||||
|
*/
|
||||||
|
private ISourceContainerType[] filterTypes(ISourceContainerType[] types){
|
||||||
|
ArrayList validTypes = new ArrayList();
|
||||||
|
for (int i=0; i< types.length; i++) {
|
||||||
|
ISourceContainerType type = types[i];
|
||||||
|
if (fDirector.supportsSourceContainerType(type)) {
|
||||||
|
ISourceContainerBrowser sourceContainerBrowser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
|
||||||
|
if(sourceContainerBrowser != null && sourceContainerBrowser.canAddSourceContainers(fDirector)) {
|
||||||
|
validTypes.add(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ISourceContainerType[]) validTypes.toArray(new ISourceContainerType[validTypes.size()]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
|
||||||
|
*/
|
||||||
|
protected void okPressed() {
|
||||||
|
//single selection dialog, so take first item in array
|
||||||
|
//there will always be a selected item since we set it with viewer.setSelection
|
||||||
|
ISourceContainerType type = (ISourceContainerType) ((StructuredSelection) fViewer.getSelection()).getFirstElement();
|
||||||
|
ISourceContainerBrowser browser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
|
||||||
|
if (browser != null) {
|
||||||
|
ISourceContainer[] results = browser.addSourceContainers(getShell(), fDirector);
|
||||||
|
if(results != null) {
|
||||||
|
fSourceContainerViewer.addEntries(results);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.okPressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action for sorting the order of source containers in the dialog.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DownAction extends SourceContainerAction {
|
||||||
|
|
||||||
|
public DownAction() {
|
||||||
|
super(SourceLookupUIMessages.getString( "DownAction.0" )); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @see IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
List targets = getOrderedSelection();
|
||||||
|
if (targets.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List list = getEntriesAsList();
|
||||||
|
int bottom = list.size() - 1;
|
||||||
|
int index = 0;
|
||||||
|
for (int i = targets.size() - 1; i >= 0; i--) {
|
||||||
|
Object target = targets.get(i);
|
||||||
|
index = list.indexOf(target);
|
||||||
|
if (index < bottom) {
|
||||||
|
bottom = index + 1;
|
||||||
|
Object temp = list.get(bottom);
|
||||||
|
list.set(bottom, target);
|
||||||
|
list.set(index, temp);
|
||||||
|
}
|
||||||
|
bottom = index;
|
||||||
|
}
|
||||||
|
setEntries(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SelectionListenerAction#updateSelection(IStructuredSelection)
|
||||||
|
*/
|
||||||
|
protected boolean updateSelection(IStructuredSelection selection) {
|
||||||
|
return !selection.isEmpty() && !isIndexSelected(selection, getEntriesAsList().size() - 1) && getViewer().getTree().getSelection()[0].getParentItem()==null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
|
||||||
|
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
|
||||||
|
import org.eclipse.debug.ui.sourcelookup.ISourceContainerBrowser;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Action used to edit source containers on a source lookup path
|
||||||
|
*/
|
||||||
|
public class EditContainerAction extends SourceContainerAction {
|
||||||
|
|
||||||
|
private ISourceLookupDirector fDirector;
|
||||||
|
private ISourceContainer[] fContainers;
|
||||||
|
private ISourceContainerBrowser fBrowser;
|
||||||
|
|
||||||
|
public EditContainerAction() {
|
||||||
|
super(SourceLookupUIMessages.getString( "EditContainerAction.0" )); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts for a project to add.
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.action.IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
ISourceContainer[] replacements = fBrowser.editSourceContainers(getShell(), fDirector, fContainers);
|
||||||
|
int j = 0;
|
||||||
|
ISourceContainer[] existing = getViewer().getEntries();
|
||||||
|
for (int i = 0; i < existing.length && j < replacements.length; i++) {
|
||||||
|
ISourceContainer toBeReplaced = fContainers[j];
|
||||||
|
ISourceContainer container = existing[i];
|
||||||
|
if (container.equals(toBeReplaced)) {
|
||||||
|
existing[i] = replacements[j];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getViewer().setEntries(existing);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLookupDirector(ISourceLookupDirector director) {
|
||||||
|
fDirector = director;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
|
||||||
|
*/
|
||||||
|
protected boolean updateSelection(IStructuredSelection selection) {
|
||||||
|
if(selection == null || selection.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getViewer().getTree().getSelection()[0].getParentItem()==null) {
|
||||||
|
// can only edit top level items of same type
|
||||||
|
fContainers = new ISourceContainer[selection.size()];
|
||||||
|
Iterator iterator = selection.iterator();
|
||||||
|
ISourceContainer container = (ISourceContainer) iterator.next();
|
||||||
|
ISourceContainerType type = container.getType();
|
||||||
|
fContainers[0] = container;
|
||||||
|
int i = 1;
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
container = (ISourceContainer) iterator.next();
|
||||||
|
fContainers[i] = container;
|
||||||
|
i++;
|
||||||
|
if (!container.getType().equals(type)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// all the same type, see if editing is supported
|
||||||
|
fBrowser = SourceLookupUIUtils.getSourceContainerBrowser(type.getId());
|
||||||
|
if (fBrowser != null) {
|
||||||
|
return fBrowser.canEditSourceContainers(fDirector, fContainers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,11 +22,13 @@ import org.eclipse.swt.widgets.Shell;
|
||||||
*/
|
*/
|
||||||
public class MappingSourceContainerBrowser extends AbstractSourceContainerBrowser {
|
public class MappingSourceContainerBrowser extends AbstractSourceContainerBrowser {
|
||||||
|
|
||||||
|
private static final String MAPPING = SourceLookupUIMessages.getString( "MappingSourceContainerBrowser.0" ); //$NON-NLS-1$
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#addSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
|
* @see org.eclipse.debug.ui.sourcelookup.AbstractSourceContainerBrowser#addSourceContainers(org.eclipse.swt.widgets.Shell, org.eclipse.debug.core.sourcelookup.ISourceLookupDirector)
|
||||||
*/
|
*/
|
||||||
public ISourceContainer[] addSourceContainers( Shell shell, ISourceLookupDirector director ) {
|
public ISourceContainer[] addSourceContainers( Shell shell, ISourceLookupDirector director ) {
|
||||||
return new ISourceContainer[] { new MappingSourceContainer() };
|
return new ISourceContainer[] { new MappingSourceContainer( generateName( director ) ) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -55,4 +57,25 @@ public class MappingSourceContainerBrowser extends AbstractSourceContainerBrowse
|
||||||
}
|
}
|
||||||
return new ISourceContainer[0];
|
return new ISourceContainer[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String generateName( ISourceLookupDirector director ) {
|
||||||
|
// int counter = 1;
|
||||||
|
// ISourceContainer[] containers = director.getSourceContainers();
|
||||||
|
// for ( int i = 0; i < containers.length; ++i ) {
|
||||||
|
// if ( MappingSourceContainer.TYPE_ID.equals( containers[i].getType().getId() ) ) {
|
||||||
|
// String name = containers[i].getName();
|
||||||
|
// if ( name.startsWith( MAPPING ) ) {
|
||||||
|
// try {
|
||||||
|
// int number = Integer.valueOf( name.substring( MAPPING.length() ) ).intValue();
|
||||||
|
// if ( number == counter )
|
||||||
|
// ++counter;
|
||||||
|
// }
|
||||||
|
// catch( NumberFormatException e ) {
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return MAPPING + counter;
|
||||||
|
return MAPPING;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
||||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
||||||
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
||||||
|
@ -22,9 +23,11 @@ import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
import org.eclipse.jface.dialogs.TitleAreaDialog;
|
import org.eclipse.jface.dialogs.TitleAreaDialog;
|
||||||
import org.eclipse.jface.viewers.ILabelProvider;
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
import org.eclipse.jface.viewers.ISelection;
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
||||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
import org.eclipse.jface.viewers.TableViewer;
|
import org.eclipse.jface.viewers.TableViewer;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
import org.eclipse.jface.window.Window;
|
import org.eclipse.jface.window.Window;
|
||||||
|
@ -57,8 +60,9 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
class MapEntryDialog extends TitleAreaDialog {
|
class MapEntryDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
protected Text fBackendPathText;
|
private MapEntrySourceContainer fEntry;
|
||||||
|
|
||||||
|
protected Text fBackendPathText;
|
||||||
protected Text fLocalPathText;
|
protected Text fLocalPathText;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,13 +70,22 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
*/
|
*/
|
||||||
public MapEntryDialog( Shell parentShell ) {
|
public MapEntryDialog( Shell parentShell ) {
|
||||||
super( parentShell );
|
super( parentShell );
|
||||||
|
fEntry = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for MapEntryDialog.
|
||||||
|
*/
|
||||||
|
public MapEntryDialog( Shell parentShell, MapEntrySourceContainer entry ) {
|
||||||
|
super( parentShell );
|
||||||
|
fEntry = entry;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
||||||
*/
|
*/
|
||||||
protected Control createDialogArea( Composite parent ) {
|
protected Control createDialogArea( Composite parent ) {
|
||||||
setTitle( "Specify the mapping paths" );
|
setTitle( SourceLookupUIMessages.getString( "PathMappingDialog.0" ) ); //$NON-NLS-1$
|
||||||
|
|
||||||
Font font = parent.getFont();
|
Font font = parent.getFont();
|
||||||
Composite composite = new Composite( parent, SWT.NONE );
|
Composite composite = new Composite( parent, SWT.NONE );
|
||||||
|
@ -93,7 +106,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
setMessage( null );
|
setMessage( null );
|
||||||
|
|
||||||
Label label = new Label( composite, SWT.LEFT );
|
Label label = new Label( composite, SWT.LEFT );
|
||||||
label.setText( "Compilation path:" );
|
label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.1" ) ); //$NON-NLS-1$
|
||||||
data = new GridData( GridData.FILL_HORIZONTAL );
|
data = new GridData( GridData.FILL_HORIZONTAL );
|
||||||
data.horizontalSpan = 2;
|
data.horizontalSpan = 2;
|
||||||
label.setLayoutData( data );
|
label.setLayoutData( data );
|
||||||
|
@ -111,7 +124,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
} );
|
} );
|
||||||
|
|
||||||
label = new Label( composite, SWT.LEFT );
|
label = new Label( composite, SWT.LEFT );
|
||||||
label.setText( "Local file system path:" );
|
label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.2" ) ); //$NON-NLS-1$
|
||||||
data = new GridData( GridData.FILL_HORIZONTAL );
|
data = new GridData( GridData.FILL_HORIZONTAL );
|
||||||
data.horizontalSpan = 2;
|
data.horizontalSpan = 2;
|
||||||
label.setLayoutData( data );
|
label.setLayoutData( data );
|
||||||
|
@ -129,7 +142,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
Button button = new Button( composite, SWT.PUSH );
|
Button button = new Button( composite, SWT.PUSH );
|
||||||
button.setFont( font );
|
button.setFont( font );
|
||||||
button.setText( "&Browse..." );
|
button.setText( SourceLookupUIMessages.getString( "PathMappingDialog.3" ) ); //$NON-NLS-1$
|
||||||
button.addSelectionListener( new SelectionListener() {
|
button.addSelectionListener( new SelectionListener() {
|
||||||
|
|
||||||
public void widgetSelected( SelectionEvent e ) {
|
public void widgetSelected( SelectionEvent e ) {
|
||||||
|
@ -149,15 +162,23 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
protected Control createContents( Composite parent ) {
|
protected Control createContents( Composite parent ) {
|
||||||
Control control = super.createContents( parent );
|
Control control = super.createContents( parent );
|
||||||
|
initialize();
|
||||||
update();
|
update();
|
||||||
return control;
|
return control;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void configureShell( Shell newShell ) {
|
protected void configureShell( Shell newShell ) {
|
||||||
newShell.setText( "Path Mapping" );
|
newShell.setText( SourceLookupUIMessages.getString( "PathMappingDialog.4" ) ); //$NON-NLS-1$
|
||||||
super.configureShell( newShell );
|
super.configureShell( newShell );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initialize() {
|
||||||
|
if ( fEntry != null ) {
|
||||||
|
fBackendPathText.setText( fEntry.getBackendPath().toOSString() );
|
||||||
|
fLocalPathText.setText( fEntry.getLocalPath().toOSString() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void update() {
|
protected void update() {
|
||||||
boolean isOk = updateErrorMessage();
|
boolean isOk = updateErrorMessage();
|
||||||
Button ok = getButton( IDialogConstants.OK_ID );
|
Button ok = getButton( IDialogConstants.OK_ID );
|
||||||
|
@ -169,20 +190,29 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
setErrorMessage( null );
|
setErrorMessage( null );
|
||||||
String backendText = fBackendPathText.getText().trim();
|
String backendText = fBackendPathText.getText().trim();
|
||||||
if ( backendText.length() == 0 ) {
|
if ( backendText.length() == 0 ) {
|
||||||
setErrorMessage( "The compilation path must not be empty" );
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.5" ) ); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ( !new Path( backendText ).isValidPath( backendText ) ) {
|
if ( !new Path( backendText ).isValidPath( backendText ) ) {
|
||||||
setErrorMessage( "Invalid compilation path." );
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.6" ) ); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String localText = fLocalPathText.getText().trim();
|
String localText = fLocalPathText.getText().trim();
|
||||||
if ( localText.length() == 0 ) {
|
if ( localText.length() == 0 ) {
|
||||||
setErrorMessage( "The local file systems path must not be empty" );
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.7" ) ); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ( !new Path( localText ).isValidPath( localText ) ) {
|
File localPath = new File( localText );
|
||||||
setErrorMessage( "Invalid local file system path." );
|
if ( !localPath.exists() ) {
|
||||||
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.8" ) ); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !localPath.isDirectory() ) {
|
||||||
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.9" ) ); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !localPath.isAbsolute() ) {
|
||||||
|
setErrorMessage( SourceLookupUIMessages.getString( "PathMappingDialog.10" ) ); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -197,7 +227,12 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void okPressed() {
|
protected void okPressed() {
|
||||||
fMapping.addMapEntry( new MapEntrySourceContainer( getBackendPath(), getLocalPath() ) );
|
if ( fEntry == null ) {
|
||||||
|
fEntry = new MapEntrySourceContainer();
|
||||||
|
fMapping.addMapEntry( fEntry );
|
||||||
|
}
|
||||||
|
fEntry.setBackendPath( getBackendPath() );
|
||||||
|
fEntry.setLocalPath( getLocalPath() );
|
||||||
super.okPressed();
|
super.okPressed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,26 +322,31 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
private TableViewer fViewer;
|
private TableViewer fViewer;
|
||||||
|
|
||||||
|
private Text fNameText;
|
||||||
private Button fAddButton;
|
private Button fAddButton;
|
||||||
|
private Button fEditButton;
|
||||||
private Button fRemoveButton;
|
private Button fRemoveButton;
|
||||||
|
|
||||||
public PathMappingDialog( Shell parentShell, MappingSourceContainer mapping ) {
|
public PathMappingDialog( Shell parentShell, MappingSourceContainer mapping ) {
|
||||||
super( parentShell );
|
super( parentShell );
|
||||||
fOriginalMapping = mapping;
|
fOriginalMapping = mapping;
|
||||||
fMapping = new MappingSourceContainer();
|
fMapping = fOriginalMapping.copy();
|
||||||
try {
|
}
|
||||||
fMapping.addMapEntries( (MapEntrySourceContainer[])mapping.getSourceContainers() );
|
|
||||||
}
|
/* (non-Javadoc)
|
||||||
catch( CoreException e ) {
|
* @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
|
||||||
setErrorMessage( e.getMessage() );
|
*/
|
||||||
}
|
protected Control createContents( Composite parent ) {
|
||||||
|
Control control = super.createContents( parent );
|
||||||
|
updateButtons();
|
||||||
|
return control;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
||||||
*/
|
*/
|
||||||
protected Control createDialogArea( Composite parent ) {
|
protected Control createDialogArea( Composite parent ) {
|
||||||
setTitle( "Modify the list of path mappings" );
|
setTitle( SourceLookupUIMessages.getString( "PathMappingDialog.11" ) ); //$NON-NLS-1$
|
||||||
//TODO Add image
|
//TODO Add image
|
||||||
|
|
||||||
Font font = parent.getFont();
|
Font font = parent.getFont();
|
||||||
|
@ -325,10 +365,39 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
Dialog.applyDialogFont( composite );
|
Dialog.applyDialogFont( composite );
|
||||||
PlatformUI.getWorkbench().getHelpSystem().setHelp( getShell(), ICDebugHelpContextIds.SOURCE_PATH_MAPPING_DIALOG );
|
PlatformUI.getWorkbench().getHelpSystem().setHelp( getShell(), ICDebugHelpContextIds.SOURCE_PATH_MAPPING_DIALOG );
|
||||||
|
|
||||||
|
Composite nameComp = new Composite( composite, SWT.NONE );
|
||||||
|
layout = new GridLayout();
|
||||||
|
layout.numColumns = 2;
|
||||||
|
nameComp.setLayout( layout );
|
||||||
|
data = new GridData( GridData.FILL_HORIZONTAL );
|
||||||
|
data.horizontalSpan = 2;
|
||||||
|
nameComp.setLayoutData( data );
|
||||||
|
nameComp.setFont( font );
|
||||||
|
|
||||||
|
Label label = new Label( nameComp, SWT.LEFT );
|
||||||
|
data = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING );
|
||||||
|
label.setLayoutData( data );
|
||||||
|
label.setFont( font );
|
||||||
|
label.setText( SourceLookupUIMessages.getString( "PathMappingDialog.12" ) ); //$NON-NLS-1$
|
||||||
|
fNameText = new Text( nameComp, SWT.SINGLE | SWT.BORDER );
|
||||||
|
data = new GridData( GridData.FILL_HORIZONTAL );
|
||||||
|
fNameText.setLayoutData( data );
|
||||||
|
fNameText.setFont( font );
|
||||||
|
fNameText.setText( getMapping().getName() );
|
||||||
|
fNameText.addModifyListener( new ModifyListener() {
|
||||||
|
public void modifyText( ModifyEvent e ) {
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
fViewer = createViewer( composite );
|
fViewer = createViewer( composite );
|
||||||
data = new GridData( GridData.FILL_BOTH );
|
data = new GridData( GridData.FILL_BOTH );
|
||||||
fViewer.getControl().setLayoutData( data );
|
fViewer.getControl().setLayoutData( data );
|
||||||
fViewer.getControl().setFont( font );
|
fViewer.getControl().setFont( font );
|
||||||
|
fViewer.addSelectionChangedListener( new ISelectionChangedListener() {
|
||||||
|
public void selectionChanged( SelectionChangedEvent event ) {
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
Composite buttonComp = new Composite( composite, SWT.NONE );
|
Composite buttonComp = new Composite( composite, SWT.NONE );
|
||||||
GridLayout buttonLayout = new GridLayout();
|
GridLayout buttonLayout = new GridLayout();
|
||||||
|
@ -344,7 +413,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
FontMetrics fontMetrics = gc.getFontMetrics();
|
FontMetrics fontMetrics = gc.getFontMetrics();
|
||||||
gc.dispose();
|
gc.dispose();
|
||||||
|
|
||||||
fAddButton = createPushButton( buttonComp, "&Add...", fontMetrics );
|
fAddButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.13" ), fontMetrics ); //$NON-NLS-1$
|
||||||
fAddButton.addSelectionListener( new SelectionAdapter() {
|
fAddButton.addSelectionListener( new SelectionAdapter() {
|
||||||
public void widgetSelected( SelectionEvent evt ) {
|
public void widgetSelected( SelectionEvent evt ) {
|
||||||
MapEntryDialog dialog = new MapEntryDialog( getShell() );
|
MapEntryDialog dialog = new MapEntryDialog( getShell() );
|
||||||
|
@ -354,17 +423,27 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
fRemoveButton = createPushButton( buttonComp, "Re&move", fontMetrics );
|
fEditButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.14" ), fontMetrics ); //$NON-NLS-1$
|
||||||
|
fEditButton.addSelectionListener( new SelectionAdapter() {
|
||||||
|
public void widgetSelected( SelectionEvent evt ) {
|
||||||
|
MapEntrySourceContainer[] entries = getSelection();
|
||||||
|
if ( entries.length > 0 ) {
|
||||||
|
MapEntryDialog dialog = new MapEntryDialog( getShell(), entries[0] );
|
||||||
|
if ( dialog.open() == Window.OK ) {
|
||||||
|
getViewer().refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
fRemoveButton = createPushButton( buttonComp, SourceLookupUIMessages.getString( "PathMappingDialog.15" ), fontMetrics ); //$NON-NLS-1$
|
||||||
fRemoveButton.addSelectionListener( new SelectionAdapter() {
|
fRemoveButton.addSelectionListener( new SelectionAdapter() {
|
||||||
public void widgetSelected( SelectionEvent evt ) {
|
public void widgetSelected( SelectionEvent evt ) {
|
||||||
ISelection s = getViewer().getSelection();
|
MapEntrySourceContainer[] entries = getSelection();
|
||||||
if ( s instanceof IStructuredSelection ) {
|
for ( int i = 0; i < entries.length; ++i ) {
|
||||||
Object[] ss = ((IStructuredSelection)s).toArray();
|
fMapping.removeMapEntry( entries[i] );
|
||||||
for ( int i = 0; i < ss.length; ++i ) {
|
|
||||||
fMapping.removeMapEntry( (MapEntrySourceContainer)ss[i] );
|
|
||||||
}
|
}
|
||||||
getViewer().refresh();
|
getViewer().refresh();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
@ -406,7 +485,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
|
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
|
||||||
*/
|
*/
|
||||||
protected void configureShell( Shell newShell ) {
|
protected void configureShell( Shell newShell ) {
|
||||||
newShell.setText( "Path Mappings" );
|
newShell.setText( SourceLookupUIMessages.getString( "PathMappingDialog.16" ) ); //$NON-NLS-1$
|
||||||
super.configureShell( newShell );
|
super.configureShell( newShell );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,6 +498,7 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
*/
|
*/
|
||||||
protected void okPressed() {
|
protected void okPressed() {
|
||||||
fOriginalMapping.clear();
|
fOriginalMapping.clear();
|
||||||
|
fOriginalMapping.setName( fNameText.getText().trim() );
|
||||||
try {
|
try {
|
||||||
fOriginalMapping.addMapEntries( (MapEntrySourceContainer[])fMapping.getSourceContainers() );
|
fOriginalMapping.addMapEntries( (MapEntrySourceContainer[])fMapping.getSourceContainers() );
|
||||||
}
|
}
|
||||||
|
@ -427,4 +507,24 @@ public class PathMappingDialog extends TitleAreaDialog {
|
||||||
fMapping.dispose();
|
fMapping.dispose();
|
||||||
super.okPressed();
|
super.okPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected MapEntrySourceContainer[] getSelection() {
|
||||||
|
MapEntrySourceContainer[] result = new MapEntrySourceContainer[0];
|
||||||
|
ISelection s = getViewer().getSelection();
|
||||||
|
if ( s instanceof IStructuredSelection ) {
|
||||||
|
int size = ((IStructuredSelection)s).size();
|
||||||
|
result = (MapEntrySourceContainer[])((IStructuredSelection)s).toList().toArray( new MapEntrySourceContainer[size] );
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateButtons() {
|
||||||
|
MapEntrySourceContainer[] entries = getSelection();
|
||||||
|
if ( fEditButton != null ) {
|
||||||
|
fEditButton.setEnabled( entries.length == 1 );
|
||||||
|
}
|
||||||
|
if ( fRemoveButton != null ) {
|
||||||
|
fRemoveButton.setEnabled( entries.length > 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action used to remove source containers in the source location dialog/tab.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class RemoveAction extends SourceContainerAction {
|
||||||
|
public RemoveAction() {
|
||||||
|
super(SourceLookupUIMessages.getString( "RemoveAction.0" )); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Removes all selected entries.
|
||||||
|
*
|
||||||
|
* @see IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
List targets = getOrderedSelection();
|
||||||
|
List list = getEntriesAsList();
|
||||||
|
list.removeAll(targets);
|
||||||
|
setEntries(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SelectionListenerAction#updateSelection(IStructuredSelection)
|
||||||
|
*/
|
||||||
|
protected boolean updateSelection(IStructuredSelection selection) {
|
||||||
|
//check that something is selected and it is a root tree node.
|
||||||
|
return !selection.isEmpty() && getViewer().getTree().getSelection()[0].getParentItem()==null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.actions.SelectionListenerAction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The abstract class for all source lookup actions.
|
||||||
|
*/
|
||||||
|
public abstract class SourceContainerAction extends SelectionListenerAction {
|
||||||
|
//the viewer that the action is operating on
|
||||||
|
private SourceContainerViewer fViewer;
|
||||||
|
//the button that is used to invoke the action
|
||||||
|
private Button fButton;
|
||||||
|
//the shell used to realize this action's dialog (if any)
|
||||||
|
private Shell fShell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constructor for the action
|
||||||
|
* @param label the label for the action's button
|
||||||
|
*/
|
||||||
|
public SourceContainerAction(String label) {
|
||||||
|
super(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the viewer on which this action operates.
|
||||||
|
*
|
||||||
|
* @param viewer the viewer on which this action operates
|
||||||
|
*/
|
||||||
|
public void setViewer(SourceContainerViewer viewer) {
|
||||||
|
if (fViewer != null) {
|
||||||
|
fViewer.removeSelectionChangedListener(this);
|
||||||
|
}
|
||||||
|
fViewer = viewer;
|
||||||
|
if (fViewer != null) {
|
||||||
|
fViewer.addSelectionChangedListener(this);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the viewer on which this action operates.
|
||||||
|
*
|
||||||
|
* @return the viewer on which this action operates
|
||||||
|
*/
|
||||||
|
protected SourceContainerViewer getViewer() {
|
||||||
|
return fViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selected items in the list, in the order they are
|
||||||
|
* displayed.
|
||||||
|
*
|
||||||
|
* @return targets for an action
|
||||||
|
*/
|
||||||
|
protected List getOrderedSelection() {
|
||||||
|
List targets = new ArrayList();
|
||||||
|
List selection =
|
||||||
|
((IStructuredSelection) getViewer().getSelection()).toList();
|
||||||
|
ISourceContainer[] entries = getViewer().getEntries();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
ISourceContainer target = entries[i];
|
||||||
|
if (selection.contains(target)) {
|
||||||
|
targets.add(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list (copy) of the entries in the viewer
|
||||||
|
*/
|
||||||
|
protected List getEntriesAsList() {
|
||||||
|
ISourceContainer[] entries = getViewer().getEntries();
|
||||||
|
List list = new ArrayList(entries.length);
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
list.add(entries[i]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the entries to the entries in the given list
|
||||||
|
*/
|
||||||
|
protected void setEntries(List list) {
|
||||||
|
getViewer().setEntries(
|
||||||
|
(ISourceContainer[]) list.toArray(new ISourceContainer[list.size()]));
|
||||||
|
// update all selection listeners
|
||||||
|
getViewer().setSelection(getViewer().getSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the item at the given index in the list
|
||||||
|
* (visually) is selected.
|
||||||
|
*/
|
||||||
|
protected boolean isIndexSelected(
|
||||||
|
IStructuredSelection selection,
|
||||||
|
int index) {
|
||||||
|
if (selection.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Iterator entries = selection.iterator();
|
||||||
|
List list = getEntriesAsList();
|
||||||
|
while (entries.hasNext()) {
|
||||||
|
Object next = entries.next();
|
||||||
|
if (list.indexOf(next) == index) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the button that invokes this action
|
||||||
|
*/
|
||||||
|
public void setButton(Button button) {
|
||||||
|
fButton = button;
|
||||||
|
button.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent evt) {
|
||||||
|
run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IAction#setEnabled(boolean)
|
||||||
|
*/
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
super.setEnabled(enabled);
|
||||||
|
if (fButton != null) {
|
||||||
|
fButton.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the enabled state.
|
||||||
|
*/
|
||||||
|
protected void update() {
|
||||||
|
selectionChanged((IStructuredSelection) getViewer().getSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the shell used to realize this action's dialog (if any).
|
||||||
|
*/
|
||||||
|
protected Shell getShell() {
|
||||||
|
if (fShell == null) {
|
||||||
|
fShell = getViewer().getControl().getShell();
|
||||||
|
}
|
||||||
|
return fShell;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the shell used to realize this action's dialog (if any).
|
||||||
|
*/
|
||||||
|
public void setShell(Shell shell) {
|
||||||
|
fShell = shell;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
|
||||||
|
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label provider for source containers and source container types.
|
||||||
|
*/
|
||||||
|
public class SourceContainerLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
|
private ILabelProvider fLabelProvider = null;
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Image getImage(Object element) {
|
||||||
|
// first allow workbench adapter to provide image
|
||||||
|
Image image = getWorkbenchLabelProvider().getImage(element);
|
||||||
|
if (image == null) {
|
||||||
|
ISourceContainerType type = null;
|
||||||
|
if (element instanceof ISourceContainer) {
|
||||||
|
type = ((ISourceContainer)element).getType();
|
||||||
|
} else if (element instanceof ISourceContainerType) {
|
||||||
|
type = (ISourceContainerType) element;
|
||||||
|
}
|
||||||
|
if (type != null) {
|
||||||
|
// next consult contributed image
|
||||||
|
image = SourceLookupUIUtils.getSourceContainerImage(type.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (image != null) {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
return super.getImage(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public String getText(Object element) {
|
||||||
|
// first, allo workbench adapter to provide label
|
||||||
|
String label = getWorkbenchLabelProvider().getText(element);
|
||||||
|
if (label == null || label.length() == 0) {
|
||||||
|
if (element instanceof ISourceContainer) {
|
||||||
|
return ((ISourceContainer) element).getName();
|
||||||
|
} else if (element instanceof ISourceContainerType) {
|
||||||
|
return ((ISourceContainerType)element).getName();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
return super.getText(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ILabelProvider getWorkbenchLabelProvider() {
|
||||||
|
if (fLabelProvider == null) {
|
||||||
|
fLabelProvider = new WorkbenchLabelProvider();
|
||||||
|
}
|
||||||
|
return fLabelProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
if (fLabelProvider != null) {
|
||||||
|
fLabelProvider.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,188 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The viewer containing the source containers.
|
||||||
|
* It is a tree viewer since the containers are represented in tree form.
|
||||||
|
*/
|
||||||
|
public class SourceContainerViewer extends TreeViewer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether enabled/editable.
|
||||||
|
*/
|
||||||
|
private boolean fEnabled = true;
|
||||||
|
/**
|
||||||
|
* The source container entries displayed in this viewer
|
||||||
|
*/
|
||||||
|
protected List fEntries = new ArrayList();
|
||||||
|
|
||||||
|
class ContentProvider implements ITreeContentProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IStructuredContentProvider#getElements(Object)
|
||||||
|
*/
|
||||||
|
public Object[] getElements(Object inputElement) {
|
||||||
|
return getEntries();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IContentProvider#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IContentProvider#inputChanged(Viewer, Object, Object)
|
||||||
|
*/
|
||||||
|
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Object[] getChildren(Object parentElement) {
|
||||||
|
try {
|
||||||
|
return ((ISourceContainer)parentElement).getSourceContainers();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
return new Object[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Object getParent(Object element) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public boolean hasChildren(Object element) {
|
||||||
|
return ((ISourceContainer)element).isComposite();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a runtime classpath viewer with the given parent.
|
||||||
|
*
|
||||||
|
* @param parent the parent control
|
||||||
|
* @param panel the panel hosting this viewer
|
||||||
|
*/
|
||||||
|
public SourceContainerViewer(Composite parent) {
|
||||||
|
super(parent);
|
||||||
|
setContentProvider(new ContentProvider());
|
||||||
|
SourceContainerLabelProvider lp = new SourceContainerLabelProvider();
|
||||||
|
setLabelProvider(lp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the entries in this viewer
|
||||||
|
*
|
||||||
|
* @param entries source container entries
|
||||||
|
*/
|
||||||
|
public void setEntries(ISourceContainer[] entries) {
|
||||||
|
fEntries.clear();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if(entries[i] != null)
|
||||||
|
fEntries.add(entries[i]);
|
||||||
|
}
|
||||||
|
if (getInput() == null) {
|
||||||
|
setInput(fEntries);
|
||||||
|
//select first item in list
|
||||||
|
if(!fEntries.isEmpty() && fEntries.get(0)!=null)
|
||||||
|
setSelection(new StructuredSelection(fEntries.get(0)));
|
||||||
|
} else {
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the entries in this viewer
|
||||||
|
*
|
||||||
|
* @return the entries in this viewer
|
||||||
|
*/
|
||||||
|
public ISourceContainer[] getEntries() {
|
||||||
|
return (ISourceContainer[])fEntries.toArray(new ISourceContainer[fEntries.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the given entries to the list. If there is no selection
|
||||||
|
* in the list, the entries are added at the end of the list,
|
||||||
|
* otherwise the new entries are added before the (first) selected
|
||||||
|
* entry. The new entries are selected.
|
||||||
|
*
|
||||||
|
* @param entries additions
|
||||||
|
*/
|
||||||
|
public void addEntries(ISourceContainer[] entries) {
|
||||||
|
IStructuredSelection sel = (IStructuredSelection)getSelection();
|
||||||
|
if (sel.isEmpty()) {
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (!fEntries.contains(entries[i])) {
|
||||||
|
fEntries.add(entries[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int index = fEntries.indexOf(sel.getFirstElement());
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
if (!fEntries.contains(entries[i])) {
|
||||||
|
fEntries.add(index, entries[i]);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!fEntries.isEmpty() && fEntries.get(0)!=null)
|
||||||
|
setSelection(new StructuredSelection(fEntries.get(0)));
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables/disables this viewer. Note the control is not disabled, since
|
||||||
|
* we still want the user to be able to scroll if required to see the
|
||||||
|
* existing entries. Just actions should be disabled.
|
||||||
|
*/
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
fEnabled = enabled;
|
||||||
|
// fire selection change to upate actions
|
||||||
|
setSelection(getSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this viewer is enabled
|
||||||
|
*/
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return fEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the index of an equivalent entry, or -1 if none.
|
||||||
|
*
|
||||||
|
* @return the index of an equivalent entry, or -1 if none
|
||||||
|
*/
|
||||||
|
public int indexOf(ISourceContainer entry) {
|
||||||
|
return fEntries.indexOf(entry);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer;
|
||||||
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer;
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
||||||
|
@ -44,7 +45,9 @@ public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
|
||||||
}
|
}
|
||||||
if ( o instanceof ProjectSourceContainer ) {
|
if ( o instanceof ProjectSourceContainer ) {
|
||||||
IProject project = ((ProjectSourceContainer)o).getProject();
|
IProject project = ((ProjectSourceContainer)o).getProject();
|
||||||
return getImageDescriptor( CCorePlugin.getDefault().getCoreModel().create( project ) );
|
ICProject cProject = CCorePlugin.getDefault().getCoreModel().create( project );
|
||||||
|
if ( cProject != null )
|
||||||
|
return getImageDescriptor( cProject );
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +65,7 @@ public class SourceContainerWorkbenchAdapter implements IWorkbenchAdapter {
|
||||||
*/
|
*/
|
||||||
public String getLabel( Object o ) {
|
public String getLabel( Object o ) {
|
||||||
if ( o instanceof MappingSourceContainer ) {
|
if ( o instanceof MappingSourceContainer ) {
|
||||||
return ((MappingSourceContainer)o).getName();
|
return SourceLookupUIMessages.getString( "SourceContainerWorkbenchAdapter.0" ) + ((MappingSourceContainer)o).getName(); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
if ( o instanceof MapEntrySourceContainer ) {
|
if ( o instanceof MapEntrySourceContainer ) {
|
||||||
return ((MapEntrySourceContainer)o).getName();
|
return ((MapEntrySourceContainer)o).getName();
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the 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.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
public class SourceLookupUIMessages {
|
||||||
|
|
||||||
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceLookupUIMessages"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
|
||||||
|
|
||||||
|
private SourceLookupUIMessages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
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,26 @@
|
||||||
|
AddContainerAction.0=&Add...
|
||||||
|
AddSourceContainerDialog.0=Add Source
|
||||||
|
AddSourceContainerDialog.1=Select the type of source to add to the source lookup path
|
||||||
|
DownAction.0=&Down
|
||||||
|
EditContainerAction.0=&Edit...
|
||||||
|
MappingSourceContainerBrowser.0=New Mapping
|
||||||
|
PathMappingDialog.0=Specify the mapping paths
|
||||||
|
PathMappingDialog.1=Compilation path:
|
||||||
|
PathMappingDialog.2=Local file system path:
|
||||||
|
PathMappingDialog.3=&Browse...
|
||||||
|
PathMappingDialog.4=Path Mapping
|
||||||
|
PathMappingDialog.5=The compilation path must not be empty
|
||||||
|
PathMappingDialog.6=Invalid compilation path.
|
||||||
|
PathMappingDialog.7=The local file systems path must not be empty
|
||||||
|
PathMappingDialog.8=The specified local file system path doesn't exist
|
||||||
|
PathMappingDialog.9=The local file system path must be a directory
|
||||||
|
PathMappingDialog.10=The local file system path must be absolute
|
||||||
|
PathMappingDialog.11=Modify the path mappings
|
||||||
|
PathMappingDialog.12=Name:
|
||||||
|
PathMappingDialog.13=&Add...
|
||||||
|
PathMappingDialog.14=&Edit...
|
||||||
|
PathMappingDialog.15=Re&move
|
||||||
|
PathMappingDialog.16=Path Mappings
|
||||||
|
RemoveAction.0=Re&move
|
||||||
|
SourceContainerWorkbenchAdapter.0=Path Mapping:
|
||||||
|
UpAction.0=U&p
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2003, 2005 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action used to move source containers up in the list
|
||||||
|
*/
|
||||||
|
public class UpAction extends SourceContainerAction {
|
||||||
|
|
||||||
|
public UpAction() {
|
||||||
|
super(SourceLookupUIMessages.getString( "UpAction.0" )); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Moves all selected entries up one position (if possible).
|
||||||
|
*
|
||||||
|
* @see IAction#run()
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
List targets = getOrderedSelection();
|
||||||
|
if (targets.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int top = 0;
|
||||||
|
int index = 0;
|
||||||
|
List list = getEntriesAsList();
|
||||||
|
Iterator entries = targets.iterator();
|
||||||
|
while (entries.hasNext()) {
|
||||||
|
Object target = entries.next();
|
||||||
|
index = list.indexOf(target);
|
||||||
|
if (index > top) {
|
||||||
|
top = index - 1;
|
||||||
|
Object temp = list.get(top);
|
||||||
|
list.set(top, target);
|
||||||
|
list.set(index, temp);
|
||||||
|
}
|
||||||
|
top = index;
|
||||||
|
}
|
||||||
|
setEntries(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SelectionListenerAction#updateSelection(IStructuredSelection)
|
||||||
|
*/
|
||||||
|
protected boolean updateSelection(IStructuredSelection selection) {
|
||||||
|
//check that something is selected, it's not first in the list, and it is a root tree node.
|
||||||
|
return !selection.isEmpty() && !isIndexSelected(selection, 0) && getViewer().getTree().getSelection()[0].getParentItem()==null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ 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;
|
||||||
import org.eclipse.cdt.debug.ui.sourcelookup.DefaultSourceLocator;
|
import org.eclipse.cdt.debug.ui.sourcelookup.DefaultSourceLocator;
|
||||||
|
import org.eclipse.cdt.debug.ui.sourcelookup.OldDefaultSourceLocator;
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -230,14 +231,14 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDefaultSourceLocatorID() {
|
public static String getDefaultSourceLocatorID() {
|
||||||
return DefaultSourceLocator.ID_DEFAULT_SOURCE_LOCATOR;
|
return OldDefaultSourceLocator.ID_DEFAULT_SOURCE_LOCATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* to support old launch configurations
|
* to support old launch configurations
|
||||||
*/
|
*/
|
||||||
public static String getDefaultSourceLocatorOldID() {
|
public static String getDefaultSourceLocatorOldID() {
|
||||||
return DefaultSourceLocator.ID_OLD_DEFAULT_SOURCE_LOCATOR;
|
return OldDefaultSourceLocator.ID_OLD_DEFAULT_SOURCE_LOCATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,382 +1,95 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2004 QNX Software Systems and others.
|
* Copyright (c) 2004 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v1.0
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v10.html
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
package org.eclipse.cdt.debug.ui.sourcelookup;
|
package org.eclipse.cdt.debug.ui.sourcelookup;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.util.ArrayList;
|
||||||
import java.io.StringReader;
|
import java.util.Arrays;
|
||||||
import java.text.MessageFormat;
|
import java.util.HashSet;
|
||||||
import java.util.HashMap;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import org.eclipse.cdt.core.resources.FileStorage;
|
|
||||||
import org.eclipse.cdt.debug.core.CDebugUtils;
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
|
||||||
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.SourceLookupFactory;
|
import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation;
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
import org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils;
|
||||||
import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.editors.NoSymbolOrSourceElement;
|
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
|
||||||
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResourceChangeListener;
|
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
|
||||||
import org.eclipse.debug.core.model.IPersistableSourceLocator;
|
import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
|
||||||
import org.eclipse.debug.core.model.IStackFrame;
|
|
||||||
import org.eclipse.jface.viewers.ArrayContentProvider;
|
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Image;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Control;
|
|
||||||
import org.eclipse.swt.widgets.Shell;
|
|
||||||
import org.eclipse.ui.dialogs.ListDialog;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.xml.sax.InputSource;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default source locator.
|
* The replacement of the old default source locator. Used only for migration purposes.
|
||||||
*/
|
*/
|
||||||
public class DefaultSourceLocator implements IPersistableSourceLocator, IAdaptable {
|
public class DefaultSourceLocator extends CSourceLookupDirector {
|
||||||
|
|
||||||
public class SourceSelectionDialog extends ListDialog {
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#initializeFromMemento(java.lang.String, org.eclipse.debug.core.ILaunchConfiguration)
|
||||||
private SelectionButtonDialogField fAlwaysUseThisFileButton = new SelectionButtonDialogField( SWT.CHECK );
|
|
||||||
|
|
||||||
public SourceSelectionDialog( Shell parent ) {
|
|
||||||
super( parent );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
|
||||||
*/
|
|
||||||
protected Control createDialogArea( Composite parent ) {
|
|
||||||
Composite comp = ControlFactory.createComposite( parent, 1 );
|
|
||||||
super.createDialogArea( comp );
|
|
||||||
Composite comp1 = ControlFactory.createComposite( comp, 1 );
|
|
||||||
fAlwaysUseThisFileButton.setLabelText( SourceLookupMessages.getString( "DefaultSourceLocator.0" ) ); //$NON-NLS-1$
|
|
||||||
fAlwaysUseThisFileButton.doFillIntoGrid( comp1, 1 );
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean alwaysMapToSelection() {
|
|
||||||
return fAlwaysUseThisFileButton.isSelected();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SourceElementLabelProvider extends LabelProvider {
|
|
||||||
|
|
||||||
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
|
|
||||||
|
|
||||||
public SourceElementLabelProvider() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getText( Object element ) {
|
|
||||||
if ( element instanceof IFile )
|
|
||||||
return ((IFile)element).getFullPath().toString();
|
|
||||||
if ( element instanceof FileStorage )
|
|
||||||
return ((FileStorage)element).getFullPath().toOSString();
|
|
||||||
return super.getText( element );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Image getImage( Object element ) {
|
|
||||||
if ( element instanceof IFile )
|
|
||||||
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_WORKSPACE_SOURCE_FILE );
|
|
||||||
if ( element instanceof FileStorage )
|
|
||||||
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_EXTERNAL_SOURCE_FILE );
|
|
||||||
return super.getImage( element );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Identifier for the 'Default C/C++ Source Locator' extension (value <code>"org.eclipse.cdt.debug.ui.DefaultSourceLocator"</code>).
|
|
||||||
*/
|
*/
|
||||||
public static final String ID_DEFAULT_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".DefaultSourceLocator"; //$NON-NLS-1$
|
public void initializeFromMemento( String memento, ILaunchConfiguration configuration ) throws CoreException {
|
||||||
|
Element rootElement = DebugPlugin.parseDocument( memento );
|
||||||
// to support old configurations
|
if ( rootElement.getNodeName().equalsIgnoreCase( OldDefaultSourceLocator.ELEMENT_NAME ) ) {
|
||||||
public static final String ID_OLD_DEFAULT_SOURCE_LOCATOR = "org.eclipse.cdt.launch" + ".DefaultSourceLocator"; //$NON-NLS-1$ //$NON-NLS-2$
|
initializeFromOldMemento( memento, configuration );
|
||||||
|
|
||||||
private static final String ELEMENT_NAME = "PromptingSourceLocator"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Underlying source locator.
|
|
||||||
*/
|
|
||||||
private ICSourceLocator fSourceLocator;
|
|
||||||
|
|
||||||
private HashMap fFramesToSource = null;
|
|
||||||
|
|
||||||
private HashMap fNamesToSource = null;
|
|
||||||
|
|
||||||
public DefaultSourceLocator() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
|
|
||||||
*/
|
|
||||||
public String getMemento() throws CoreException {
|
|
||||||
if ( getCSourceLocator() != null ) {
|
|
||||||
Document document = null;
|
|
||||||
Throwable ex = null;
|
|
||||||
try {
|
|
||||||
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
|
||||||
Element element = document.createElement( ELEMENT_NAME );
|
|
||||||
document.appendChild( element );
|
|
||||||
element.setAttribute( ATTR_PROJECT, getCSourceLocator().getProject().getName() );
|
|
||||||
IPersistableSourceLocator psl = getPersistableSourceLocator();
|
|
||||||
if ( psl != null ) {
|
|
||||||
element.setAttribute( ATTR_MEMENTO, psl.getMemento() );
|
|
||||||
}
|
|
||||||
return CDebugUtils.serializeDocument( document );
|
|
||||||
}
|
|
||||||
catch( ParserConfigurationException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
catch( IOException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
catch( TransformerException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
abort( SourceLookupMessages.getString( "DefaultSourceLocator.1" ), ex ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String)
|
|
||||||
*/
|
|
||||||
public void initializeFromMemento( String memento ) throws CoreException {
|
|
||||||
Exception ex = null;
|
|
||||||
try {
|
|
||||||
Element root = null;
|
|
||||||
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
|
||||||
StringReader reader = new StringReader( memento );
|
|
||||||
InputSource source = new InputSource( reader );
|
|
||||||
root = parser.parse( source ).getDocumentElement();
|
|
||||||
if ( !root.getNodeName().equalsIgnoreCase( ELEMENT_NAME ) ) {
|
|
||||||
abort( SourceLookupMessages.getString( "DefaultSourceLocator.2" ), null ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
String projectName = root.getAttribute( ATTR_PROJECT );
|
|
||||||
String data = root.getAttribute( ATTR_MEMENTO );
|
|
||||||
if ( isEmpty( projectName ) ) {
|
|
||||||
abort( SourceLookupMessages.getString( "DefaultSourceLocator.3" ), null ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
|
||||||
if ( getCSourceLocator() == null )
|
|
||||||
setCSourceLocator( SourceLookupFactory.createSourceLocator( project ) );
|
|
||||||
if ( getCSourceLocator().getProject() != null && !getCSourceLocator().getProject().equals( project ) )
|
|
||||||
return;
|
|
||||||
if ( project == null || !project.exists() || !project.isOpen() )
|
|
||||||
abort( MessageFormat.format( SourceLookupMessages.getString( "DefaultSourceLocator.4" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
|
|
||||||
IPersistableSourceLocator psl = getPersistableSourceLocator();
|
|
||||||
if ( psl != null )
|
|
||||||
psl.initializeFromMemento( data );
|
|
||||||
else
|
|
||||||
abort( SourceLookupMessages.getString( "DefaultSourceLocator.5" ), null ); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch( ParserConfigurationException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
catch( SAXException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
catch( IOException e ) {
|
|
||||||
ex = e;
|
|
||||||
}
|
|
||||||
abort( SourceLookupMessages.getString( "DefaultSourceLocator.6" ), ex ); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
|
|
||||||
*/
|
|
||||||
public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException {
|
|
||||||
setCSourceLocator( SourceLookupFactory.createSourceLocator( getProject( configuration ) ) );
|
|
||||||
String memento = configuration.getAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, "" ); //$NON-NLS-1$
|
|
||||||
if ( !isEmpty( memento ) )
|
|
||||||
initializeFromMemento( memento );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
|
|
||||||
*/
|
|
||||||
public Object getAdapter( Class adapter ) {
|
|
||||||
if ( getCSourceLocator() instanceof IAdaptable ) {
|
|
||||||
if ( adapter.equals( ICSourceLocator.class ) ) {
|
|
||||||
return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
|
|
||||||
}
|
|
||||||
if ( adapter.equals( IResourceChangeListener.class ) ) {
|
|
||||||
return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
|
|
||||||
*/
|
|
||||||
public Object getSourceElement( IStackFrame stackFrame ) {
|
|
||||||
Object res = cacheLookup( stackFrame );
|
|
||||||
if ( res == null ) {
|
|
||||||
res = getCSourceLocator().getSourceElement( stackFrame );
|
|
||||||
if ( res instanceof List ) {
|
|
||||||
List list = (List)res;
|
|
||||||
if ( list.size() != 0 ) {
|
|
||||||
SourceSelectionDialog dialog = createSourceSelectionDialog( list );
|
|
||||||
dialog.open();
|
|
||||||
Object[] objs = dialog.getResult();
|
|
||||||
res = (objs != null && objs.length > 0) ? objs[0] : null;
|
|
||||||
if ( res != null )
|
|
||||||
cacheSourceElement( stackFrame, res, dialog.alwaysMapToSelection() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
res = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( res == null ) {
|
|
||||||
if ( stackFrame instanceof ICStackFrame && !isEmpty( ((ICStackFrame)stackFrame).getFile() ) ) {
|
|
||||||
res = new FileNotFoundElement( stackFrame );
|
|
||||||
}
|
|
||||||
else // don't show in editor
|
|
||||||
{
|
|
||||||
res = new NoSymbolOrSourceElement( stackFrame );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator ) {
|
|
||||||
try {
|
|
||||||
ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
|
|
||||||
copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
|
|
||||||
copy.doSave();
|
|
||||||
}
|
|
||||||
catch( CoreException e ) {
|
|
||||||
CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private SourceSelectionDialog createSourceSelectionDialog( List list ) {
|
|
||||||
SourceSelectionDialog dialog = new SourceSelectionDialog( CDebugUIPlugin.getActiveWorkbenchShell() );
|
|
||||||
dialog.setInput( list.toArray() );
|
|
||||||
dialog.setContentProvider( new ArrayContentProvider() );
|
|
||||||
dialog.setLabelProvider( new SourceElementLabelProvider() );
|
|
||||||
dialog.setTitle( SourceLookupMessages.getString( "DefaultSourceLocator.7" ) ); //$NON-NLS-1$
|
|
||||||
dialog.setMessage( SourceLookupMessages.getString( "DefaultSourceLocator.8" ) ); //$NON-NLS-1$
|
|
||||||
dialog.setInitialSelections( new Object[]{ list.get( 0 ) } );
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cacheSourceElement( IStackFrame frame, Object sourceElement, boolean alwaysMapToSelection ) {
|
|
||||||
if ( alwaysMapToSelection ) {
|
|
||||||
String name = getFileName( frame );
|
|
||||||
if ( name != null ) {
|
|
||||||
if ( fNamesToSource == null )
|
|
||||||
fNamesToSource = new HashMap();
|
|
||||||
fNamesToSource.put( name, sourceElement );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( fFramesToSource == null )
|
super.initializeFromMemento( memento, configuration );
|
||||||
fFramesToSource = new HashMap();
|
|
||||||
fFramesToSource.put( frame, sourceElement );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object cacheLookup( IStackFrame frame ) {
|
private void initializeFromOldMemento( String memento, ILaunchConfiguration configuration ) throws CoreException {
|
||||||
String name = getFileName( frame );
|
dispose();
|
||||||
if ( name != null && fNamesToSource != null ) {
|
setLaunchConfiguration( configuration );
|
||||||
Object result = fNamesToSource.get( name );
|
OldDefaultSourceLocator old = new OldDefaultSourceLocator();
|
||||||
if ( result != null )
|
old.initializeFromMemento( memento );
|
||||||
return result;
|
ICSourceLocator csl = (ICSourceLocator)old.getAdapter( ICSourceLocator.class );
|
||||||
|
setFindDuplicates( csl.searchForDuplicateFiles() );
|
||||||
|
ICSourceLocation[] locations = csl.getSourceLocations();
|
||||||
|
|
||||||
|
// Check if the old source locator includes all referenced projects.
|
||||||
|
// If so, DefaultSpourceContainer should be used.
|
||||||
|
IProject project = csl.getProject();
|
||||||
|
List list = CDebugUtils.getReferencedProjects( project );
|
||||||
|
HashSet names = new HashSet( list.size() + 1 );
|
||||||
|
names.add( project.getName() );
|
||||||
|
Iterator it = list.iterator();
|
||||||
|
while( it.hasNext() ) {
|
||||||
|
names.add( ((IProject)it.next()).getName() );
|
||||||
}
|
}
|
||||||
return (fFramesToSource != null) ? fFramesToSource.get( frame ) : null;
|
boolean includesDefault = true;
|
||||||
}
|
for( int i = 0; i < locations.length; ++i ) {
|
||||||
|
if ( locations[i] instanceof IProjectSourceLocation && ((IProjectSourceLocation)locations[i]).isGeneric() ) {
|
||||||
private String getFileName( IStackFrame frame ) {
|
if ( !names.contains( ((IProjectSourceLocation)locations[i]).getProject().getName() ) ) {
|
||||||
if ( frame instanceof ICStackFrame ) {
|
includesDefault = false;
|
||||||
String name = ((ICStackFrame)frame).getFile();
|
break;
|
||||||
if ( !isEmpty( name ) )
|
}
|
||||||
return name.trim();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ICSourceLocator getCSourceLocator() {
|
|
||||||
return fSourceLocator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCSourceLocator( ICSourceLocator locator ) {
|
|
||||||
fSourceLocator = locator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IPersistableSourceLocator getPersistableSourceLocator() {
|
|
||||||
ICSourceLocator sl = getCSourceLocator();
|
|
||||||
return (sl instanceof IPersistableSourceLocator) ? (IPersistableSourceLocator)sl : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Throws an internal error exception
|
|
||||||
*/
|
|
||||||
private void abort( String message, Throwable e ) throws CoreException {
|
|
||||||
IStatus s = new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), 0, message, e );
|
|
||||||
throw new CoreException( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isEmpty( String string ) {
|
|
||||||
return string == null || string.trim().length() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IProject getProject( ILaunchConfiguration configuration ) throws CoreException {
|
|
||||||
String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
|
|
||||||
if ( !isEmpty( projectName ) ) {
|
|
||||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
|
||||||
if ( project.exists() ) {
|
|
||||||
return project;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
abort( MessageFormat.format( SourceLookupMessages.getString( "DefaultSourceLocator.9" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
|
|
||||||
return null;
|
// Generate an array of new source containers including DefaultSourceContainer
|
||||||
|
ArrayList locs = new ArrayList( locations.length );
|
||||||
|
for ( int i = 0; i < locations.length; ++i ) {
|
||||||
|
if ( !includesDefault || !( locations[i] instanceof IProjectSourceLocation && names.contains( ((IProjectSourceLocation)locations[i]).getProject().getName() ) ) )
|
||||||
|
locs.add( locations[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
ISourceContainer[] containers = SourceUtils.convertSourceLocations( (ICSourceLocation[])locs.toArray( new ICSourceLocation[locs.size()] ) );
|
||||||
|
ArrayList cons = new ArrayList( Arrays.asList( containers ) );
|
||||||
|
if ( includesDefault ) {
|
||||||
|
DefaultSourceContainer defaultContainer = new DefaultSourceContainer();
|
||||||
|
defaultContainer.init( this );
|
||||||
|
cons.add( 0, defaultContainer );
|
||||||
|
}
|
||||||
|
setSourceContainers( (ISourceContainer[])cons.toArray( new ISourceContainer[cons.size()] ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,382 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* 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.ui.sourcelookup;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import org.eclipse.cdt.core.resources.FileStorage;
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||||
|
import org.eclipse.cdt.debug.core.sourcelookup.SourceLookupFactory;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.dialogfields.SelectionButtonDialogField;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.editors.FileNotFoundElement;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.editors.NoSymbolOrSourceElement;
|
||||||
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeListener;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
|
import org.eclipse.debug.core.model.IPersistableSourceLocator;
|
||||||
|
import org.eclipse.debug.core.model.IStackFrame;
|
||||||
|
import org.eclipse.jface.viewers.ArrayContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.dialogs.ListDialog;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Old default source locator. We keep it for migration purposes.
|
||||||
|
*/
|
||||||
|
public class OldDefaultSourceLocator implements IPersistableSourceLocator, IAdaptable {
|
||||||
|
|
||||||
|
public class SourceSelectionDialog extends ListDialog {
|
||||||
|
|
||||||
|
private SelectionButtonDialogField fAlwaysUseThisFileButton = new SelectionButtonDialogField( SWT.CHECK );
|
||||||
|
|
||||||
|
public SourceSelectionDialog( Shell parent ) {
|
||||||
|
super( parent );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
protected Control createDialogArea( Composite parent ) {
|
||||||
|
Composite comp = ControlFactory.createComposite( parent, 1 );
|
||||||
|
super.createDialogArea( comp );
|
||||||
|
Composite comp1 = ControlFactory.createComposite( comp, 1 );
|
||||||
|
fAlwaysUseThisFileButton.setLabelText( SourceLookupMessages.getString( "OldDefaultSourceLocator.0" ) ); //$NON-NLS-1$
|
||||||
|
fAlwaysUseThisFileButton.doFillIntoGrid( comp1, 1 );
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean alwaysMapToSelection() {
|
||||||
|
return fAlwaysUseThisFileButton.isSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SourceElementLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
|
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
|
||||||
|
|
||||||
|
public SourceElementLabelProvider() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText( Object element ) {
|
||||||
|
if ( element instanceof IFile )
|
||||||
|
return ((IFile)element).getFullPath().toString();
|
||||||
|
if ( element instanceof FileStorage )
|
||||||
|
return ((FileStorage)element).getFullPath().toOSString();
|
||||||
|
return super.getText( element );
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image getImage( Object element ) {
|
||||||
|
if ( element instanceof IFile )
|
||||||
|
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_WORKSPACE_SOURCE_FILE );
|
||||||
|
if ( element instanceof FileStorage )
|
||||||
|
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_EXTERNAL_SOURCE_FILE );
|
||||||
|
return super.getImage( element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifier for the 'Default C/C++ Source Locator' extension (value <code>"org.eclipse.cdt.debug.ui.DefaultSourceLocator"</code>).
|
||||||
|
*/
|
||||||
|
public static final String ID_DEFAULT_SOURCE_LOCATOR = CDebugUIPlugin.getUniqueIdentifier() + ".DefaultSourceLocator"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
// to support old configurations
|
||||||
|
public static final String ID_OLD_DEFAULT_SOURCE_LOCATOR = "org.eclipse.cdt.launch" + ".DefaultSourceLocator"; //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
|
||||||
|
protected static final String ELEMENT_NAME = "PromptingSourceLocator"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String ATTR_PROJECT = "project"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String ATTR_MEMENTO = "memento"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Underlying source locator.
|
||||||
|
*/
|
||||||
|
private ICSourceLocator fSourceLocator;
|
||||||
|
|
||||||
|
private HashMap fFramesToSource = null;
|
||||||
|
|
||||||
|
private HashMap fNamesToSource = null;
|
||||||
|
|
||||||
|
public OldDefaultSourceLocator() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
|
||||||
|
*/
|
||||||
|
public String getMemento() throws CoreException {
|
||||||
|
if ( getCSourceLocator() != null ) {
|
||||||
|
Document document = null;
|
||||||
|
Throwable ex = null;
|
||||||
|
try {
|
||||||
|
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
|
Element element = document.createElement( ELEMENT_NAME );
|
||||||
|
document.appendChild( element );
|
||||||
|
element.setAttribute( ATTR_PROJECT, getCSourceLocator().getProject().getName() );
|
||||||
|
IPersistableSourceLocator psl = getPersistableSourceLocator();
|
||||||
|
if ( psl != null ) {
|
||||||
|
element.setAttribute( ATTR_MEMENTO, psl.getMemento() );
|
||||||
|
}
|
||||||
|
return CDebugUtils.serializeDocument( document );
|
||||||
|
}
|
||||||
|
catch( ParserConfigurationException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
catch( IOException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
catch( TransformerException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.1" ), ex ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeFromMemento(java.lang.String)
|
||||||
|
*/
|
||||||
|
public void initializeFromMemento( String memento ) throws CoreException {
|
||||||
|
Exception ex = null;
|
||||||
|
try {
|
||||||
|
Element root = null;
|
||||||
|
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||||
|
StringReader reader = new StringReader( memento );
|
||||||
|
InputSource source = new InputSource( reader );
|
||||||
|
root = parser.parse( source ).getDocumentElement();
|
||||||
|
if ( !root.getNodeName().equalsIgnoreCase( ELEMENT_NAME ) ) {
|
||||||
|
abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.2" ), null ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
String projectName = root.getAttribute( ATTR_PROJECT );
|
||||||
|
String data = root.getAttribute( ATTR_MEMENTO );
|
||||||
|
if ( isEmpty( projectName ) ) {
|
||||||
|
abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.3" ), null ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
||||||
|
if ( getCSourceLocator() == null )
|
||||||
|
setCSourceLocator( SourceLookupFactory.createSourceLocator( project ) );
|
||||||
|
if ( getCSourceLocator().getProject() != null && !getCSourceLocator().getProject().equals( project ) )
|
||||||
|
return;
|
||||||
|
if ( project == null || !project.exists() || !project.isOpen() )
|
||||||
|
abort( MessageFormat.format( SourceLookupMessages.getString( "OldDefaultSourceLocator.4" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
|
||||||
|
IPersistableSourceLocator psl = getPersistableSourceLocator();
|
||||||
|
if ( psl != null )
|
||||||
|
psl.initializeFromMemento( data );
|
||||||
|
else
|
||||||
|
abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.5" ), null ); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch( ParserConfigurationException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
catch( SAXException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
catch( IOException e ) {
|
||||||
|
ex = e;
|
||||||
|
}
|
||||||
|
abort( SourceLookupMessages.getString( "OldDefaultSourceLocator.6" ), ex ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
|
||||||
|
*/
|
||||||
|
public void initializeDefaults( ILaunchConfiguration configuration ) throws CoreException {
|
||||||
|
setCSourceLocator( SourceLookupFactory.createSourceLocator( getProject( configuration ) ) );
|
||||||
|
String memento = configuration.getAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, "" ); //$NON-NLS-1$
|
||||||
|
if ( !isEmpty( memento ) )
|
||||||
|
initializeFromMemento( memento );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
|
||||||
|
*/
|
||||||
|
public Object getAdapter( Class adapter ) {
|
||||||
|
if ( getCSourceLocator() instanceof IAdaptable ) {
|
||||||
|
if ( adapter.equals( ICSourceLocator.class ) ) {
|
||||||
|
return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
|
||||||
|
}
|
||||||
|
if ( adapter.equals( IResourceChangeListener.class ) ) {
|
||||||
|
return ((IAdaptable)getCSourceLocator()).getAdapter( adapter );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
|
||||||
|
*/
|
||||||
|
public Object getSourceElement( IStackFrame stackFrame ) {
|
||||||
|
Object res = cacheLookup( stackFrame );
|
||||||
|
if ( res == null ) {
|
||||||
|
res = getCSourceLocator().getSourceElement( stackFrame );
|
||||||
|
if ( res instanceof List ) {
|
||||||
|
List list = (List)res;
|
||||||
|
if ( list.size() != 0 ) {
|
||||||
|
SourceSelectionDialog dialog = createSourceSelectionDialog( list );
|
||||||
|
dialog.open();
|
||||||
|
Object[] objs = dialog.getResult();
|
||||||
|
res = (objs != null && objs.length > 0) ? objs[0] : null;
|
||||||
|
if ( res != null )
|
||||||
|
cacheSourceElement( stackFrame, res, dialog.alwaysMapToSelection() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
res = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( res == null ) {
|
||||||
|
if ( stackFrame instanceof ICStackFrame && !isEmpty( ((ICStackFrame)stackFrame).getFile() ) ) {
|
||||||
|
res = new FileNotFoundElement( stackFrame );
|
||||||
|
}
|
||||||
|
else // don't show in editor
|
||||||
|
{
|
||||||
|
res = new NoSymbolOrSourceElement( stackFrame );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveChanges( ILaunchConfiguration configuration, IPersistableSourceLocator locator ) {
|
||||||
|
try {
|
||||||
|
ILaunchConfigurationWorkingCopy copy = configuration.copy( configuration.getName() );
|
||||||
|
copy.setAttribute( ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, locator.getMemento() );
|
||||||
|
copy.doSave();
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
CDebugUIPlugin.errorDialog( e.getMessage(), (IStatus)null );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SourceSelectionDialog createSourceSelectionDialog( List list ) {
|
||||||
|
SourceSelectionDialog dialog = new SourceSelectionDialog( CDebugUIPlugin.getActiveWorkbenchShell() );
|
||||||
|
dialog.setInput( list.toArray() );
|
||||||
|
dialog.setContentProvider( new ArrayContentProvider() );
|
||||||
|
dialog.setLabelProvider( new SourceElementLabelProvider() );
|
||||||
|
dialog.setTitle( SourceLookupMessages.getString( "OldDefaultSourceLocator.7" ) ); //$NON-NLS-1$
|
||||||
|
dialog.setMessage( SourceLookupMessages.getString( "OldDefaultSourceLocator.8" ) ); //$NON-NLS-1$
|
||||||
|
dialog.setInitialSelections( new Object[]{ list.get( 0 ) } );
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cacheSourceElement( IStackFrame frame, Object sourceElement, boolean alwaysMapToSelection ) {
|
||||||
|
if ( alwaysMapToSelection ) {
|
||||||
|
String name = getFileName( frame );
|
||||||
|
if ( name != null ) {
|
||||||
|
if ( fNamesToSource == null )
|
||||||
|
fNamesToSource = new HashMap();
|
||||||
|
fNamesToSource.put( name, sourceElement );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ( fFramesToSource == null )
|
||||||
|
fFramesToSource = new HashMap();
|
||||||
|
fFramesToSource.put( frame, sourceElement );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object cacheLookup( IStackFrame frame ) {
|
||||||
|
String name = getFileName( frame );
|
||||||
|
if ( name != null && fNamesToSource != null ) {
|
||||||
|
Object result = fNamesToSource.get( name );
|
||||||
|
if ( result != null )
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return (fFramesToSource != null) ? fFramesToSource.get( frame ) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getFileName( IStackFrame frame ) {
|
||||||
|
if ( frame instanceof ICStackFrame ) {
|
||||||
|
String name = ((ICStackFrame)frame).getFile();
|
||||||
|
if ( !isEmpty( name ) )
|
||||||
|
return name.trim();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICSourceLocator getCSourceLocator() {
|
||||||
|
return fSourceLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCSourceLocator( ICSourceLocator locator ) {
|
||||||
|
fSourceLocator = locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IPersistableSourceLocator getPersistableSourceLocator() {
|
||||||
|
ICSourceLocator sl = getCSourceLocator();
|
||||||
|
return (sl instanceof IPersistableSourceLocator) ? (IPersistableSourceLocator)sl : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an internal error exception
|
||||||
|
*/
|
||||||
|
private void abort( String message, Throwable e ) throws CoreException {
|
||||||
|
IStatus s = new Status( IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), 0, message, e );
|
||||||
|
throw new CoreException( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isEmpty( String string ) {
|
||||||
|
return string == null || string.trim().length() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IProject getProject( ILaunchConfiguration configuration ) throws CoreException {
|
||||||
|
String projectName = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null );
|
||||||
|
if ( !isEmpty( projectName ) ) {
|
||||||
|
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( projectName );
|
||||||
|
if ( project.exists() ) {
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abort( MessageFormat.format( SourceLookupMessages.getString( "OldDefaultSourceLocator.9" ), new String[]{ projectName } ), null ); //$NON-NLS-1$
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,10 @@
|
||||||
|
2005-04-21 Mikhail Khodjaiants
|
||||||
|
Bug 80175: Replace the CDT source lookup by the source lookup provided by Eclipse platform.
|
||||||
|
* CoreFileLaunchConfigurationTabGroup.java
|
||||||
|
* LocalAttachLaunchConfigurationTabGroup.java
|
||||||
|
* LocalRunLaunchConfigurationTabGroup.java
|
||||||
|
* plugin.xml
|
||||||
|
|
||||||
2005-04-07 David Daoust
|
2005-04-07 David Daoust
|
||||||
Update icons
|
Update icons
|
||||||
|
|
||||||
|
|
|
@ -32,25 +32,31 @@
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.debug.core.launchConfigurationTypes">
|
point="org.eclipse.debug.core.launchConfigurationTypes">
|
||||||
<launchConfigurationType
|
<launchConfigurationType
|
||||||
name="%LocalCDTLaunch.name"
|
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
||||||
delegate="org.eclipse.cdt.launch.internal.LocalRunLaunchDelegate"
|
delegate="org.eclipse.cdt.launch.internal.LocalRunLaunchDelegate"
|
||||||
modes="run,debug"
|
|
||||||
public="true"
|
public="true"
|
||||||
id="org.eclipse.cdt.launch.localCLaunch">
|
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer"
|
||||||
|
name="%LocalCDTLaunch.name"
|
||||||
|
id="org.eclipse.cdt.launch.localCLaunch"
|
||||||
|
modes="run,debug">
|
||||||
</launchConfigurationType>
|
</launchConfigurationType>
|
||||||
<launchConfigurationType
|
<launchConfigurationType
|
||||||
name="%LocalAttachCDTLaunch.name"
|
|
||||||
delegate="org.eclipse.cdt.launch.internal.LocalAttachLaunchDelegate"
|
delegate="org.eclipse.cdt.launch.internal.LocalAttachLaunchDelegate"
|
||||||
|
id="org.eclipse.cdt.launch.localAttachCLaunch"
|
||||||
modes="debug"
|
modes="debug"
|
||||||
|
name="%LocalAttachCDTLaunch.name"
|
||||||
public="true"
|
public="true"
|
||||||
id="org.eclipse.cdt.launch.localAttachCLaunch">
|
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
||||||
|
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
|
||||||
</launchConfigurationType>
|
</launchConfigurationType>
|
||||||
<launchConfigurationType
|
<launchConfigurationType
|
||||||
name="%CoreFileCDTLaunch.name"
|
|
||||||
delegate="org.eclipse.cdt.launch.internal.CoreFileLaunchDelegate"
|
delegate="org.eclipse.cdt.launch.internal.CoreFileLaunchDelegate"
|
||||||
|
id="org.eclipse.cdt.launch.coreFileCLaunch"
|
||||||
modes="debug"
|
modes="debug"
|
||||||
|
name="%CoreFileCDTLaunch.name"
|
||||||
public="true"
|
public="true"
|
||||||
id="org.eclipse.cdt.launch.coreFileCLaunch">
|
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
||||||
|
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
|
||||||
</launchConfigurationType>
|
</launchConfigurationType>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
|
|
|
@ -12,13 +12,13 @@ package org.eclipse.cdt.launch.internal.ui;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.launch.ui.CMainTab;
|
import org.eclipse.cdt.launch.ui.CMainTab;
|
||||||
import org.eclipse.cdt.launch.ui.CSourceLookupTab;
|
|
||||||
import org.eclipse.cdt.launch.ui.CoreFileDebuggerTab;
|
import org.eclipse.cdt.launch.ui.CoreFileDebuggerTab;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
||||||
import org.eclipse.debug.ui.CommonTab;
|
import org.eclipse.debug.ui.CommonTab;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
||||||
|
import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
|
||||||
|
|
||||||
public class CoreFileLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
public class CoreFileLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
|
|
||||||
|
@ -29,7 +29,8 @@ public class CoreFileLaunchConfigurationTabGroup extends AbstractLaunchConfigura
|
||||||
ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
|
ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
|
||||||
new CMainTab(),
|
new CMainTab(),
|
||||||
new CoreFileDebuggerTab(),
|
new CoreFileDebuggerTab(),
|
||||||
new CSourceLookupTab(),
|
// new CSourceLookupTab(),
|
||||||
|
new SourceLookupTab(),
|
||||||
new CommonTab()
|
new CommonTab()
|
||||||
};
|
};
|
||||||
setTabs(tabs);
|
setTabs(tabs);
|
||||||
|
|
|
@ -12,11 +12,11 @@ package org.eclipse.cdt.launch.internal.ui;
|
||||||
|
|
||||||
import org.eclipse.cdt.launch.ui.CDebuggerTab;
|
import org.eclipse.cdt.launch.ui.CDebuggerTab;
|
||||||
import org.eclipse.cdt.launch.ui.CMainTab;
|
import org.eclipse.cdt.launch.ui.CMainTab;
|
||||||
import org.eclipse.cdt.launch.ui.CSourceLookupTab;
|
|
||||||
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
||||||
import org.eclipse.debug.ui.CommonTab;
|
import org.eclipse.debug.ui.CommonTab;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
||||||
|
import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
|
||||||
|
|
||||||
public class LocalAttachLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
public class LocalAttachLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
|
|
||||||
|
@ -27,7 +27,8 @@ public class LocalAttachLaunchConfigurationTabGroup extends AbstractLaunchConfig
|
||||||
ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
|
ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
|
||||||
new CMainTab(),
|
new CMainTab(),
|
||||||
new CDebuggerTab(true),
|
new CDebuggerTab(true),
|
||||||
new CSourceLookupTab(),
|
// new CSourceLookupTab(),
|
||||||
|
new SourceLookupTab(),
|
||||||
new CommonTab()
|
new CommonTab()
|
||||||
};
|
};
|
||||||
setTabs(tabs);
|
setTabs(tabs);
|
||||||
|
|
|
@ -13,11 +13,11 @@ package org.eclipse.cdt.launch.internal.ui;
|
||||||
import org.eclipse.cdt.launch.ui.CArgumentsTab;
|
import org.eclipse.cdt.launch.ui.CArgumentsTab;
|
||||||
import org.eclipse.cdt.launch.ui.CDebuggerTab;
|
import org.eclipse.cdt.launch.ui.CDebuggerTab;
|
||||||
import org.eclipse.cdt.launch.ui.CMainTab;
|
import org.eclipse.cdt.launch.ui.CMainTab;
|
||||||
import org.eclipse.cdt.launch.ui.CSourceLookupTab;
|
|
||||||
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
|
||||||
import org.eclipse.debug.ui.CommonTab;
|
import org.eclipse.debug.ui.CommonTab;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
|
||||||
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
import org.eclipse.debug.ui.ILaunchConfigurationTab;
|
||||||
|
import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
|
||||||
|
|
||||||
public class LocalRunLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
public class LocalRunLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
|
|
||||||
|
@ -30,7 +30,8 @@ public class LocalRunLaunchConfigurationTabGroup extends AbstractLaunchConfigura
|
||||||
new CArgumentsTab(),
|
new CArgumentsTab(),
|
||||||
new MigratingCEnvironmentTab(),
|
new MigratingCEnvironmentTab(),
|
||||||
new CDebuggerTab(false),
|
new CDebuggerTab(false),
|
||||||
new CSourceLookupTab(),
|
// new CSourceLookupTab(),
|
||||||
|
new SourceLookupTab(),
|
||||||
new CommonTab()
|
new CommonTab()
|
||||||
};
|
};
|
||||||
setTabs(tabs);
|
setTabs(tabs);
|
||||||
|
|
Loading…
Add table
Reference in a new issue