mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 437392 - first cut at handling descriptor takeovers.
If a launchObject changes such that a new higher priority descriptor type wants to take it over, we need to let it. This is handles on the launchObjectChanged call. I also added a note to the Project object provider as projects change a lot and we only care about a subset of those events. Not sure how to formalize that, though. Need to dig deeper into the deltas and see what we can ignore. Change-Id: I964d8785a474c43c917bcd7d8a84abf2b7904aa4
This commit is contained in:
parent
fd8148a659
commit
514a4ee209
2 changed files with 58 additions and 32 deletions
|
@ -423,14 +423,14 @@ public class LaunchBarManager implements ILaunchBarManager, ILaunchConfiguration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addDescriptor(Object element, ILaunchDescriptor descriptor) throws CoreException {
|
private void addDescriptor(Object launchObject, ILaunchDescriptor descriptor) throws CoreException {
|
||||||
descriptors.put(getDescriptorId(descriptor), descriptor);
|
descriptors.put(getDescriptorId(descriptor), descriptor);
|
||||||
objectDescriptorMap.put(element, descriptor);
|
objectDescriptorMap.put(launchObject, descriptor);
|
||||||
setActiveLaunchDescriptor(descriptor);
|
setActiveLaunchDescriptor(descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeDescriptor(Object element, ILaunchDescriptor descriptor) throws CoreException {
|
private void removeDescriptor(Object launchObject, ILaunchDescriptor descriptor) throws CoreException {
|
||||||
objectDescriptorMap.remove(element); // remove launch object unconditionally
|
objectDescriptorMap.remove(launchObject); // remove launch object unconditionally
|
||||||
if (descriptor != null) {
|
if (descriptor != null) {
|
||||||
descriptors.remove(getDescriptorId(descriptor));
|
descriptors.remove(getDescriptorId(descriptor));
|
||||||
if (descriptor.equals(activeLaunchDesc)) {
|
if (descriptor.equals(activeLaunchDesc)) {
|
||||||
|
@ -527,38 +527,68 @@ public class LaunchBarManager implements ILaunchBarManager, ILaunchConfiguration
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private ILaunchDescriptorType ownsLaunchObject(Object launchObject) throws CoreException {
|
||||||
public ILaunchDescriptor launchObjectAdded(Object element) {
|
|
||||||
Activator.trace("launch object added " + element);
|
|
||||||
ILaunchDescriptor desc = objectDescriptorMap.get(element);
|
|
||||||
if (desc != null)
|
|
||||||
return desc;
|
|
||||||
|
|
||||||
// TODO use enablement to find out what descriptor types to ask
|
// TODO use enablement to find out what descriptor types to ask
|
||||||
// to prevent unnecessary plug-in loading
|
// to prevent unnecessary plug-in loading
|
||||||
for (LaunchDescriptorTypeInfo descriptorInfo : orderedDescriptorTypes) {
|
for (LaunchDescriptorTypeInfo descriptorInfo : orderedDescriptorTypes) {
|
||||||
try {
|
ILaunchDescriptorType descriptorType = descriptorInfo.getType();
|
||||||
ILaunchDescriptorType descriptorType = descriptorInfo.getType();
|
if (descriptorType.ownsLaunchObject(launchObject)) {
|
||||||
if (descriptorType.ownsLaunchObject(element)) {
|
return descriptorType;
|
||||||
desc = descriptorType.getDescriptor(element);
|
|
||||||
if (desc != null) {
|
|
||||||
addDescriptor(element, desc);
|
|
||||||
return desc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
|
||||||
Activator.log(e.getStatus());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ILaunchDescriptor launchObjectAdded(Object launchObject) {
|
||||||
|
Activator.trace("launch object added " + launchObject);
|
||||||
|
ILaunchDescriptor desc = objectDescriptorMap.get(launchObject);
|
||||||
|
if (desc != null)
|
||||||
|
return desc;
|
||||||
|
|
||||||
|
try {
|
||||||
|
ILaunchDescriptorType type = ownsLaunchObject(launchObject);
|
||||||
|
if (type != null) {
|
||||||
|
desc = type.getDescriptor(launchObject);
|
||||||
|
if (desc != null) {
|
||||||
|
addDescriptor(launchObject, desc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
Activator.log(e.getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void launchObjectRemoved(Object element) throws CoreException {
|
public void launchObjectRemoved(Object launchObject) throws CoreException {
|
||||||
Activator.trace("launch object removed " + element);
|
Activator.trace("launch object removed " + launchObject);
|
||||||
ILaunchDescriptor desc = objectDescriptorMap.get(element);
|
ILaunchDescriptor desc = objectDescriptorMap.get(launchObject);
|
||||||
removeDescriptor(element, desc);
|
removeDescriptor(launchObject, desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void launchObjectChanged(Object launchObject) throws CoreException {
|
||||||
|
// TODO deal with object renames here, somehow
|
||||||
|
|
||||||
|
// check if a new descriptor wants to take over
|
||||||
|
ILaunchDescriptor origDesc = objectDescriptorMap.get(launchObject);
|
||||||
|
ILaunchDescriptorType newDescType = ownsLaunchObject(launchObject);
|
||||||
|
|
||||||
|
if (newDescType != null) {
|
||||||
|
if (origDesc == null || !origDesc.getType().equals(newDescType)) {
|
||||||
|
// we have a take over
|
||||||
|
if (origDesc != null) {
|
||||||
|
removeDescriptor(launchObject, origDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
ILaunchDescriptor newDesc = newDescType.getDescriptor(launchObject);
|
||||||
|
if (newDesc != null) {
|
||||||
|
addDescriptor(launchObject, newDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ILaunchDescriptor getLastUsedDescriptor() {
|
protected ILaunchDescriptor getLastUsedDescriptor() {
|
||||||
|
@ -1048,9 +1078,4 @@ public class LaunchBarManager implements ILaunchBarManager, ILaunchConfiguration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void launchObjectChanged(Object launchObject) throws CoreException {
|
|
||||||
// TODO deal with object renames here, somehow
|
|
||||||
// TODO handle descriptor type changes
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ public class ProjectLaunchObjectProvider implements ILaunchObjectProvider, IReso
|
||||||
} else if ((kind & IResourceDelta.REMOVED) != 0) {
|
} else if ((kind & IResourceDelta.REMOVED) != 0) {
|
||||||
manager.launchObjectRemoved(project);
|
manager.launchObjectRemoved(project);
|
||||||
} else if ((kind & IResourceDelta.CHANGED) != 0) {
|
} else if ((kind & IResourceDelta.CHANGED) != 0) {
|
||||||
|
// TODO may need to be more concise as to what changes we're looking for
|
||||||
manager.launchObjectChanged(project);
|
manager.launchObjectChanged(project);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Add table
Reference in a new issue