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;
+ }
}