diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java index 3211986c4f0..5f1c82bb23a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java @@ -905,17 +905,19 @@ implements @Override public void dispose() { if (displayedConfig) forEach(ICPropertyTab.DISPOSE); - + if (!isNewOpening) handleResize(false); // save page size isNewOpening = true; + // Remove this page from the property manager + CDTPropertyManager.remove(this); // clear static variables if (CDTPropertyManager.getPagesCount() == 0) { resd = null; cfgDescs = null; } - } - + } + /** * The only method to be redefined in descendants * @return diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPropertyManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPropertyManager.java index 5b384719553..2c2bc809762 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPropertyManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPropertyManager.java @@ -37,7 +37,10 @@ import org.eclipse.cdt.ui.CUIPlugin; * * When page's "performOK" called, it should call * manager's method - * performOk() + * performOk() + * + * Registered pages can call {@link CDTPropertyManager#remove(Object)} + * to explicitly remove themselves from this manager. * * In addition, there are utility methods for pages: * getPagesCount() @@ -116,8 +119,17 @@ public class CDTPropertyManager { prjd = null; saveDone = false; } - } - + } + + /** + * Explicitly remove the page from this CDTPropertyManager + * @param p + * @since 5.1 + */ + public static void remove(Object p) { + DListener.dispose(p); + } + /** * Performs mandatory saving * @param p @@ -141,17 +153,14 @@ public class CDTPropertyManager { public static boolean isSaveDone() { return saveDone; } public static int getPagesCount() { return pages.size(); } public static Object getPage(int index) { return pages.get(index); } - + // Removes disposed items from list static class DListener implements DisposeListener { - public void widgetDisposed(DisposeEvent e) { - Widget w = e.widget; + public static void dispose (Object w) { if (pages.contains(w)) { // Widget ? pages.remove(w); } else { // Property Page ? - Iterator it = pages.iterator(); - while (it.hasNext()) { - Object ob = it.next(); + for (Object ob : pages) { if (ob != null && ob instanceof PropertyPage) { if (((PropertyPage)ob).getControl().equals(w)) { pages.remove(ob); @@ -160,24 +169,17 @@ public class CDTPropertyManager { } } } - - - if (pages.size() == 0) { -// if(!saveDone){ -// if(prjd != null){ -// saveDone = !prjd.isModified(); -// } -// } - + + if (pages.isEmpty()) { saveDone = true; - -// if(saveDone){ - project = null; - prjd = null; - saveDone = false; -// } + project = null; + prjd = null; + saveDone = false; } } + public void widgetDisposed(DisposeEvent e) { + dispose(e.widget); + } } }