Index: Eclipse UI/org/eclipse/ui/IWorkbenchPartSite.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPartSite.java,v retrieving revision 1.20 diff -u -r1.20 IWorkbenchPartSite.java --- Eclipse UI/org/eclipse/ui/IWorkbenchPartSite.java 25 Feb 2005 20:52:16 -0000 1.20 +++ Eclipse UI/org/eclipse/ui/IWorkbenchPartSite.java 25 Jul 2005 19:19:04 -0000 @@ -125,4 +125,14 @@ * @return the part associated with this site */ public IWorkbenchPart getPart(); + + /** + * Returns the part reference associated with this site. This + * method can return null. + * + * @since 3.1.1 + * + * @return the reference which can be used to get the part + */ + public IWorkbenchPartReference getPartReference(); } Index: Eclipse UI/org/eclipse/ui/internal/EditorAreaHelper.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorAreaHelper.java,v retrieving revision 1.19 diff -u -r1.19 EditorAreaHelper.java --- Eclipse UI/org/eclipse/ui/internal/EditorAreaHelper.java 11 Jul 2005 23:14:35 -0000 1.19 +++ Eclipse UI/org/eclipse/ui/internal/EditorAreaHelper.java 25 Jul 2005 19:19:05 -0000 @@ -256,8 +256,12 @@ */ public boolean setVisibleEditor(IEditorReference ref, boolean setFocus) { IEditorReference visibleEditor = getVisibleEditor(); - if (ref != visibleEditor) { - IEditorPart part = (IEditorPart) ref.getPart(true); + IEditorPart part = (IEditorPart) ref.getPart(false); + if (ref != visibleEditor || part instanceof MultiEditor) { + part = (IEditorPart) ref.getPart(true); + if (part instanceof MultiEditor) { + part = ((MultiEditor)part).getActiveEditor(); + } EditorPane pane = null; if (part != null) pane = (EditorPane) ((PartSite) part.getEditorSite()).getPane(); 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 25 Jul 2005 19:19:06 -0000 @@ -713,41 +713,44 @@ 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(); + 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]; + 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; } /* - * Opens an editor part. - */ + * Opens an editor part. + */ private void createEditorTab(final EditorReference ref, final String workbookId) throws PartInitException { editorPresentation.addEditor(ref, workbookId); @@ -1224,10 +1227,15 @@ return (IPathEditorInput) input.getAdapter(IPathEditorInput.class); } - private class InnerEditor extends EditorReference { + class InnerEditor extends EditorReference { private IEditorReference outerEditor; + /** + * @param outerEditor + * @param input + * @param desc + */ public InnerEditor(IEditorReference outerEditor, IEditorInput input, EditorDescriptor desc) { super(EditorManager.this, input, desc); this.outerEditor = outerEditor; 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 25 Jul 2005 19:19: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,13 @@ 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 +240,16 @@ } protected void doDisposePart() { + if (multiEditorChildren!=null) { + for (int i=0; inull for no active editor */ private void makeActiveEditor(IEditorReference ref) { - if (ref == getActiveEditor()) { + IEditorPart part = (ref == null) ? null : ref.getEditor(false); + if (ref == getActiveEditor() && !(part instanceof MultiEditor)) { return; } - IEditorPart part = (ref == null) ? null : ref.getEditor(true); + part = (ref == null) ? null : ref.getEditor(true); + if (part instanceof MultiEditor) { + part = ((MultiEditor)part).getActiveEditor(); + } if (part != null) { - editorMgr.setVisibleEditor(ref, false); + editorMgr.setVisibleEditor(ref, true); navigationHistory.markEditor(part); } @@ -2466,6 +2470,10 @@ // Sanity check. if (!certifyPart(part)) return; + + if (part instanceof MultiEditor) { + part = ((MultiEditor)part).getActiveEditor(); + } // Real work. setActivePart(part); @@ -2809,7 +2817,8 @@ */ private void setActivePart(IWorkbenchPart newPart) { // Optimize it. - if (getActivePart() == newPart) { + if (getActivePart() == newPart + && getReference(newPart).getPart(false)==newPart) { return; } @@ -2831,7 +2840,7 @@ try { window.largeUpdateStart(); IWorkbenchPartReference partref = getReference(newPart); - partBeingActivated = partref; + partBeingActivated = newPart.getSite().getPartReference(); UIStats.start(UIStats.ACTIVATE_PART, label); // Notify perspective. It may deactivate fast view. @@ -2849,8 +2858,7 @@ if (newPart != null) { activationList.setActive(newPart); if (newPart instanceof IEditorPart) { - IEditorReference ref = (IEditorReference) getReference(newPart); - makeActiveEditor(ref); + makeActiveEditor((IEditorReference) partref); } } activatePart(newPart); @@ -3460,7 +3468,7 @@ MultiEditorInnerPane innerPane = (MultiEditorInnerPane) pane; return innerPane.getParentPane().getPartReference(); } - return partSite.getPartReference(); + return site.getPartReference(); } private class ActivationList { @@ -3472,27 +3480,20 @@ */ 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); - } - } + 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/internal/WorkbenchPagePartList.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPagePartList.java,v retrieving revision 1.3 diff -u -r1.3 WorkbenchPagePartList.java --- Eclipse UI/org/eclipse/ui/internal/WorkbenchPagePartList.java 16 May 2005 16:26:55 -0000 1.3 +++ Eclipse UI/org/eclipse/ui/internal/WorkbenchPagePartList.java 25 Jul 2005 19:19:09 -0000 @@ -14,6 +14,7 @@ import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.internal.misc.UIListenerLogging; +import org.eclipse.ui.part.MultiEditor; public class WorkbenchPagePartList extends PartList { @@ -56,6 +57,9 @@ partService.setActivePart(newRef); IWorkbenchPart realPart = newRef == null? null : newRef.getPart(false); + if (realPart instanceof MultiEditor) { + realPart = ((MultiEditor)realPart).getActiveEditor(); + } selectionService.setActivePart(realPart); } Index: Eclipse UI/org/eclipse/ui/internal/part/CompatibilityPartSite.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/part/CompatibilityPartSite.java,v retrieving revision 1.5 diff -u -r1.5 CompatibilityPartSite.java --- Eclipse UI/org/eclipse/ui/internal/part/CompatibilityPartSite.java 2 May 2005 18:24:22 -0000 1.5 +++ Eclipse UI/org/eclipse/ui/internal/part/CompatibilityPartSite.java 25 Jul 2005 19:19:10 -0000 @@ -24,6 +24,7 @@ import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.PartSite; @@ -213,4 +214,12 @@ registerContextMenu(getId(), menuManager, selectionProvider, includeEditorInput); } + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchPartSite#getPartReference() + */ + public IWorkbenchPartReference getPartReference() { + // This is an extra method that's just part of the interface + return null; + } } 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 25 Jul 2005 19:19:11 -0000 @@ -77,21 +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() */ Index: Eclipse UI/org/eclipse/ui/part/MultiPageEditorSite.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/MultiPageEditorSite.java,v retrieving revision 1.16 diff -u -r1.16 MultiPageEditorSite.java --- Eclipse UI/org/eclipse/ui/part/MultiPageEditorSite.java 9 May 2005 15:09:18 -0000 1.16 +++ Eclipse UI/org/eclipse/ui/part/MultiPageEditorSite.java 25 Jul 2005 19:19:11 -0000 @@ -26,6 +26,7 @@ import org.eclipse.ui.INestableKeyBindingService; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.WorkbenchPlugin; @@ -386,4 +387,13 @@ getMultiPageEditor().getEditorSite().registerContextMenu(menuManager, selectionProvider, includeEditorInput); } + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchPartSite#getPartReference() + */ + public IWorkbenchPartReference getPartReference() { + // TODO Have this return the editor reference by searching the + // list of editor references to match the part. + return null; + } }