Index: Eclipse UI/org/eclipse/ui/internal/EditorManager.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorManager.java,v retrieving revision 1.87 diff -u -r1.87 EditorManager.java --- Eclipse UI/org/eclipse/ui/internal/EditorManager.java 16 May 2005 21:16:50 -0000 1.87 +++ Eclipse UI/org/eclipse/ui/internal/EditorManager.java 21 Jul 2005 13:44:06 -0000 @@ -713,41 +713,42 @@ return null; } - /* - * Create the site and action bars for each inner editor. - */ - private IEditorReference[] openMultiEditor(final IEditorReference ref, - final MultiEditor part, final EditorDescriptor desc, - final MultiEditorInput input, final boolean setVisible) - throws PartInitException { + /** + * Create the site and action bars for each inner editor. Just like + * createPart(), this method is called from the EditorReference. + */ + IEditorReference[] openMultiEditor(final IEditorReference ref, final MultiEditor part, + final MultiEditorInput input) throws PartInitException { - String[] editorArray = input.getEditors(); - IEditorInput[] inputArray = input.getInput(); + String[] editorArray = input.getEditors(); + IEditorInput[] inputArray = input.getInput(); - //find all descriptors - EditorDescriptor[] descArray = new EditorDescriptor[editorArray.length]; - IEditorReference refArray[] = new IEditorReference[editorArray.length]; - IEditorPart partArray[] = new IEditorPart[editorArray.length]; - - IEditorRegistry reg = getEditorRegistry(); - for (int i = 0; i < editorArray.length; i++) { - EditorDescriptor innerDesc = (EditorDescriptor) reg - .findEditor(editorArray[i]); - if (innerDesc == null) - throw new PartInitException( - NLS.bind(WorkbenchMessages.EditorManager_unknownEditorIDMessage, editorArray[i] )); - descArray[i] = innerDesc; - InnerEditor innerRef = new InnerEditor(ref, inputArray[i], descArray[i]); - refArray[i] = innerRef; - partArray[i] = innerRef.getEditor(true); - } - part.setChildren(partArray); - return refArray; + // find all descriptors + EditorDescriptor[] descArray = new EditorDescriptor[editorArray.length]; + IEditorPart partArray[] = new IEditorPart[editorArray.length]; + IEditorReference[] refArray = new IEditorReference[editorArray.length]; + + IEditorRegistry reg = getEditorRegistry(); + for (int i = 0; i < editorArray.length; i++) { + EditorDescriptor innerDesc = (EditorDescriptor) reg + .findEditor(editorArray[i]); + if (innerDesc == null) { + throw new PartInitException(NLS.bind( + WorkbenchMessages.EditorManager_unknownEditorIDMessage, + editorArray[i])); + } + descArray[i] = innerDesc; + refArray[i] = new InnerEditor(ref, inputArray[i], + descArray[i]); + partArray[i] = refArray[i].getEditor(true); + } + part.setChildren(partArray); + return refArray; } /* - * Opens an editor part. - */ + * Opens an editor part. + */ private void createEditorTab(final EditorReference ref, final String workbookId) throws PartInitException { editorPresentation.addEditor(ref, workbookId); Index: Eclipse UI/org/eclipse/ui/internal/EditorReference.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java,v retrieving revision 1.6 diff -u -r1.6 EditorReference.java --- Eclipse UI/org/eclipse/ui/internal/EditorReference.java 11 Jul 2005 23:14:35 -0000 1.6 +++ Eclipse UI/org/eclipse/ui/internal/EditorReference.java 21 Jul 2005 13:44:06 -0000 @@ -43,6 +43,8 @@ import org.eclipse.ui.internal.registry.EditorDescriptor; import org.eclipse.ui.internal.util.Util; import org.eclipse.ui.part.IWorkbenchPartOrientation; +import org.eclipse.ui.part.MultiEditor; +import org.eclipse.ui.part.MultiEditorInput; public class EditorReference extends WorkbenchPartReference implements IEditorReference { @@ -77,6 +79,12 @@ String factoryId; IEditorInput restoredInput; + + /** + * If the reference is instantiated as a MultiEditor, we need to dispose the + * inner references correctly. + */ + private IEditorReference[] multiEditorChildren = null; public EditorReference(EditorManager manager, IEditorInput input, EditorDescriptor desc) { this.manager = manager; @@ -231,6 +239,15 @@ } protected void doDisposePart() { + if (multiEditorChildren!=null) { + for (int i=0; inull if it has no reference - * (i.e. it is not a top-level part in this workbench page). + * (i.e. it is not a top-level part in this workbench page). For + * the MultiEditor, it returns parent reference. * * @param part the part * @return the part's reference or null if the given part does not belong * to this workbench page */ public IWorkbenchPartReference getReference(IWorkbenchPart part) { - if (part == null) { - return null; - } - IWorkbenchPartSite site = part.getSite(); - if (!(site instanceof PartSite)) { - return null; - } - PartSite partSite = ((PartSite) site); - PartPane pane = partSite.getPane(); - if (pane instanceof MultiEditorInnerPane) { - MultiEditorInnerPane innerPane = (MultiEditorInnerPane) pane; - return innerPane.getParentPane().getPartReference(); - } - return partSite.getPartReference(); + return getReference(part, true); + } + + /** + * Returns the reference to the given part, or null if it has + * no reference (i.e. it is not a top-level part in this workbench page). + * + * @param part + * the part + * @param findContainer + * true - return the parent reference for InnerEditors + * @return the part's reference or null if the given part + * does not belong to this workbench page + */ + public IWorkbenchPartReference getReference(IWorkbenchPart part, + boolean findContainer) { + if (part == null) { + return null; + } + IWorkbenchPartSite site = part.getSite(); + if (!(site instanceof PartSite)) { + return null; + } + PartSite partSite = ((PartSite) site); + PartPane pane = partSite.getPane(); + if (findContainer && pane instanceof MultiEditorInnerPane) { + MultiEditorInnerPane innerPane = (MultiEditorInnerPane) pane; + return innerPane.getParentPane().getPartReference(); + } + return partSite.getPartReference(); } private class ActivationList { - //List of parts in the activation order (oldest first) + // List of parts in the activation order (oldest first) List parts = new ArrayList(); /* - * Add/Move the active part to end of the list; - */ + * Add/Move the active part to end of the list; + */ void setActive(IWorkbenchPart part) { - if (parts.size() <= 0) - return; - PartPane pane = ((PartSite) part.getSite()).getPane(); - if (pane instanceof MultiEditorInnerPane) { - MultiEditorInnerPane innerPane = (MultiEditorInnerPane) pane; - setActive(innerPane.getParentPane().getPartReference().getPart( - true)); - } else { - IWorkbenchPartReference ref = getReference(part); - if (ref != null) { - if (ref == parts.get(parts.size() - 1)) - return; - parts.remove(ref); - parts.add(ref); - } - } + if (parts.size() <= 0) + return; + IWorkbenchPartReference ref = getReference(part); + if (ref != null) { + if (ref == parts.get(parts.size() - 1)) + return; + parts.remove(ref); + parts.add(ref); + } } /* - * Ensures that the given part appears AFTER any other part in the same - * container. - */ + * Ensures that the given part appears AFTER any other part in the same + * container. + */ void bringToTop(IWorkbenchPartReference ref) { ILayoutContainer targetContainer = getContainer(ref); Index: Eclipse UI/org/eclipse/ui/part/MultiEditor.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/MultiEditor.java,v retrieving revision 1.15 diff -u -r1.15 MultiEditor.java --- Eclipse UI/org/eclipse/ui/part/MultiEditor.java 25 Feb 2005 20:52:16 -0000 1.15 +++ Eclipse UI/org/eclipse/ui/part/MultiEditor.java 21 Jul 2005 13:44:06 -0000 @@ -77,20 +77,6 @@ return content; } - /** - * The MultiEditor implementation of this - * method extends the EditorPart implementation, - * and disposes any inner editors. Subclasses may extend. - * - * @since 3.0 - */ - public void dispose() { - super.dispose(); - IEditorPart[] editors = getInnerEditors(); - for (int i = 0; i < editors.length; i++) { - editors[i].dispose(); - } - } /* * @see IEditorPart#doSaveAs()