diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java index c19401c2f7a..507e0161c70 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 QNX Software Systems and others. + * Copyright (c) 2000, 2015 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -43,6 +43,7 @@ import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.IWorkspaceRoot; @@ -572,5 +573,81 @@ public class CModelTests extends TestCase { throw new CoreException(new Status(IStatus.ERROR, CTestPlugin.PLUGIN_ID, 0, "Import Interrupted", e)); } } + + public void testBinaryContainerDeltaAfterCloseProjDeleteBin_349564() throws Exception { + ICProject testProject; + testProject = CProjectHelper.createCProject("bug349564", "none", IPDOMManager.ID_NO_INDEXER); + if (testProject == null) { + fail("Unable to create project"); + } + CProjectHelper.addDefaultBinaryParser(testProject.getProject()); + + final IBinaryContainer bin = testProject.getBinaryContainer(); + assertEquals(0, bin.getBinaries().length); + // import with folder structure + importSourcesFromPlugin(testProject, CTestPlugin.getDefault().getBundle(), "resources/exe/x86/o"); + assertEquals(1, bin.getBinaries().length); + IResource resource = bin.getBinaries()[0].getResource(); + + final boolean binContainerChanged[] = { false }; + + IElementChangedListener elementChangedListener = new IElementChangedListener() { + @Override + public void elementChanged(ElementChangedEvent event) { + ICElementDelta delta = event.getDelta(); + processDelta(delta); + } + private boolean processDelta(ICElementDelta delta) { + if (delta.getElement() instanceof IBinaryContainer) { + synchronized (binContainerChanged) { + binContainerChanged[0] = true; + binContainerChanged.notify(); + } + return true; + } + ICElementDelta[] childDeltas = delta.getChangedChildren(); + for (ICElementDelta childDelta : childDeltas) { + if (processDelta(childDelta)) { + return true; + } + } + return false; + } + }; + + Thread waiter = new Thread() { + @Override + public void run() { + synchronized (binContainerChanged) { + try { + binContainerChanged.wait(1000); + } catch (InterruptedException exc) { + } + } + } + }; + + CoreModel.getDefault().addElementChangedListener(elementChangedListener); + + testProject.close(); + testProject.open(monitor); + + + waiter.start(); + Thread.sleep(50); + + workspace.delete(new IResource[] { resource }, false, monitor); + + // wait for delta notification + waiter.join(1000); + + assertEquals(0, testProject.getBinaryContainer().getBinaries().length); + assertTrue(binContainerChanged[0]); + + try { + testProject.getProject().delete(true, true, monitor); + } + catch (CoreException e) {} + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java index 525b807bf8f..bece18d5ec4 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2011 IBM Corporation and others. + * Copyright (c) 2002, 2015 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 @@ -601,6 +601,18 @@ final class DeltaProcessor { case IResourceDelta.REMOVED : if (element != null) { elementRemoved(element, delta); + } else { + // Bug 349564 - The 'Binaries' node does not always disappear when project is cleaned + CModel cModel = CModelManager.getDefault().getCModel(); + ICProject cProject = cModel.findCProject(resource.getProject()); + if (cProject != null && cProject.isOnOutputEntry(resource)) { + IBinaryContainer bin = cProject.getBinaryContainer(); + if (!bin.isOpen()) + fCurrentDelta.changed(bin, ICElementDelta.F_CONTENT); + IArchiveContainer archive = cProject.getArchiveContainer(); + if (!archive.isOpen()) + fCurrentDelta.changed(archive, ICElementDelta.F_CONTENT); + } } return element instanceof ICContainer; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java index f491b0d5b3e..cfed04511ae 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2009 QNX Software Systems and others. + * Copyright (c) 2000, 2015 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -29,7 +29,9 @@ import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ElementChangedEvent; import org.eclipse.cdt.core.model.IArchive; +import org.eclipse.cdt.core.model.IArchiveContainer; import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.IBinaryContainer; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElementDelta; @@ -315,7 +317,10 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme @Override public void refresh() { - if (container.hasChildren()) { + if (container instanceof IBinaryContainer || container instanceof IArchiveContainer) { + // Always refresh the project to properly show/hide container + fViewer.refresh(project); + } else if (container.hasChildren()) { if (fViewer.testFindItem(container) != null) { fViewer.refresh(container); } else {