| /******************************************************************************* |
| * Copyright (c) 2000, 2007 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 |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ui.internal; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorReference; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.IPageLayout; |
| import org.eclipse.ui.part.MultiEditor; |
| |
| /** |
| * EditorAreaHelper is a wrapper for PartTabworkbook. |
| */ |
| public class EditorAreaHelper { |
| |
| //private ArrayList editorTable = new ArrayList(4); |
| |
| private EditorSashContainer editorArea; |
| |
| /** |
| * Creates a new EditorAreaHelper. |
| */ |
| public EditorAreaHelper(WorkbenchPage page) { |
| this.editorArea = new EditorSashContainer(IPageLayout.ID_EDITOR_AREA, |
| page, page.getClientComposite()); |
| |
| this.editorArea.createControl(page.getClientComposite()); |
| this.editorArea.setActive(true); |
| } |
| |
| /** |
| * Displays a list of open editors |
| */ |
| public void displayEditorList() { |
| EditorStack activeWorkbook = editorArea.getActiveWorkbook(); |
| if (activeWorkbook != null) { |
| activeWorkbook.showPartList(); |
| } |
| } |
| |
| /** |
| * Closes an editor. |
| * |
| * @param part the editor to close |
| */ |
| public void closeEditor(IEditorReference ref) { |
| EditorPane pane = (EditorPane) ((WorkbenchPartReference) ref).getPane(); |
| closeEditor(pane); |
| } |
| |
| /** |
| * Closes an editor. |
| * |
| * @param part the editor to close |
| */ |
| public void closeEditor(IEditorPart part) { |
| EditorPane pane = (EditorPane) ((PartSite) part.getEditorSite()) |
| .getPane(); |
| closeEditor(pane); |
| } |
| |
| /** |
| * Closes an editor. |
| * |
| * @param part the editor to close |
| */ |
| private void closeEditor(EditorPane pane) { |
| if (pane != null) { |
| if (!(pane instanceof MultiEditorInnerPane)) { |
| editorArea.removeEditor(pane); |
| } |
| } |
| } |
| |
| /** |
| * Deref a given part. Deconstruct its container as required. |
| * Do not remove drag listeners. |
| */ |
| public static void derefPart(LayoutPart part) { |
| |
| // Get vital part stats before reparenting. |
| ILayoutContainer oldContainer = part.getContainer(); |
| |
| // Reparent the part back to the main window |
| //part.reparent(editorArea.getParent()); |
| // Update container. |
| if (oldContainer == null) { |
| return; |
| } |
| oldContainer.remove(part); |
| LayoutPart[] children = oldContainer.getChildren(); |
| if (children == null || children.length == 0) { |
| // There are no more children in this container, so get rid of it |
| if (oldContainer instanceof LayoutPart) { |
| LayoutPart parent = (LayoutPart) oldContainer; |
| ILayoutContainer parentContainer = parent.getContainer(); |
| if (parentContainer != null) { |
| parentContainer.remove(parent); |
| parent.dispose(); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Dispose of the editor presentation. |
| */ |
| public void dispose() { |
| if (editorArea != null) { |
| editorArea.setActive(false); |
| editorArea.dispose(); |
| } |
| } |
| |
| /** |
| * @see IEditorPresentation |
| */ |
| public String getActiveEditorWorkbookID() { |
| return editorArea.getActiveWorkbookID(); |
| } |
| |
| public EditorStack getActiveWorkbook() { |
| return editorArea.getActiveWorkbook(); |
| } |
| |
| /** |
| * Returns the editor area. |
| */ |
| public LayoutPart getLayoutPart() { |
| return editorArea; |
| } |
| |
| /** |
| * Returns the active editor in this perspective. If the editors appear |
| * in a workbook this will be the visible editor. If the editors are |
| * scattered around the workbench this will be the most recent editor |
| * to hold focus. |
| * |
| * @return the active editor, or <code>null</code> if no editor is active |
| */ |
| public IEditorReference getVisibleEditor() { |
| EditorStack activeWorkbook = editorArea.getActiveWorkbook(); |
| EditorPane pane = (EditorPane)activeWorkbook.getSelection(); |
| if (pane != null) { |
| IEditorReference result = pane.getEditorReference(); |
| IEditorPart editorPart = (IEditorPart) result.getPart(false); |
| if ((editorPart != null) && (editorPart instanceof MultiEditor)) { |
| editorPart = ((MultiEditor) editorPart).getActiveEditor(); |
| EditorSite site = (EditorSite) editorPart.getSite(); |
| result = (IEditorReference) site.getPartReference(); |
| } |
| return result; |
| } |
| return null; |
| } |
| |
| public void moveEditor(IEditorPart part, int position) { |
| /*EditorPane pane = (EditorPane)*/ ((EditorSite) part.getSite()).getPane(); |
| //TODO commented this out during presentations works |
| //pane.getWorkbook().reorderTab(pane, position); |
| } |
| |
| |
| |
| /** |
| * Main entry point for adding an editor. Adds the editor to the layout in the given |
| * stack, and notifies the workbench page when done. |
| * |
| * @param ref editor to add |
| * @param workbookId workbook that will contain the editor (or null if the editor |
| * should be added to the default workbook) |
| */ |
| public void addEditor(EditorReference ref, String workbookId) { |
| IEditorReference refs[] = editorArea.getPage().getEditorReferences(); |
| for (int i = 0; i < refs.length; i++) { |
| if (ref == refs[i]) { |
| return; |
| } |
| } |
| |
| if (!(ref.getPane() instanceof MultiEditorInnerPane)) { |
| |
| EditorStack stack = null; |
| |
| if (workbookId != null) { |
| stack = getWorkbookFromID(workbookId); |
| } |
| |
| if (stack == null) { |
| stack = getActiveWorkbook(); |
| } |
| |
| addToLayout((EditorPane)ref.getPane(), stack); |
| } |
| |
| editorArea.getPage().partAdded(ref); |
| } |
| |
| private void addToLayout(EditorPane pane, EditorStack stack) { |
| //EditorStack stack = editorArea.getActiveWorkbook(); |
| pane.setWorkbook(stack); |
| |
| editorArea.addEditor(pane, stack); |
| } |
| |
| |
| /** |
| * @see IPersistablePart |
| */ |
| public IStatus restoreState(IMemento memento) { |
| // Restore the editor area workbooks layout/relationship |
| return editorArea.restoreState(memento); |
| } |
| |
| /** |
| * Restore the presentation |
| * @param areaMem |
| * @return |
| */ |
| public IStatus restorePresentationState(IMemento areaMem) { |
| return editorArea.restorePresentationState(areaMem); |
| } |
| |
| /** |
| * @see IPersistablePart |
| */ |
| public IStatus saveState(IMemento memento) { |
| // Save the editor area workbooks layout/relationship |
| return editorArea.saveState(memento); |
| } |
| |
| /** |
| * @see IEditorPresentation |
| */ |
| public void setActiveEditorWorkbookFromID(String id) { |
| editorArea.setActiveWorkbookFromID(id); |
| } |
| |
| /** |
| * Brings an editor to the front and optionally gives it focus. |
| * |
| * @param part the editor to make visible |
| * @param setFocus whether to give the editor focus |
| * @return true if the visible editor was changed, false if not. |
| */ |
| public boolean setVisibleEditor(IEditorReference ref, boolean setFocus) { |
| IEditorReference visibleEditor = getVisibleEditor(); |
| if (ref != visibleEditor) { |
| IEditorPart part = (IEditorPart) ref.getPart(true); |
| EditorPane pane = null; |
| if (part != null) { |
| pane = (EditorPane) ((PartSite) part.getEditorSite()).getPane(); |
| } |
| if (pane != null) { |
| if (pane instanceof MultiEditorInnerPane) { |
| EditorPane parentPane = ((MultiEditorInnerPane) pane) |
| .getParentPane(); |
| EditorStack activeWorkbook = parentPane.getWorkbook(); |
| PartPane activePane = activeWorkbook.getSelection(); |
| if (activePane != parentPane) { |
| parentPane.getWorkbook().setSelection(parentPane); |
| } else { |
| return false; |
| } |
| } else { |
| pane.getWorkbook().setSelection(pane); |
| } |
| if (setFocus) { |
| part.setFocus(); |
| } |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| |
| |
| /** |
| * Method getWorkbooks. |
| * @return ArrayList |
| */ |
| public ArrayList getWorkbooks() { |
| return editorArea.getEditorWorkbooks(); |
| } |
| |
| public IEditorReference[] getEditors() { |
| List result = new ArrayList(); |
| List workbooks = editorArea.getEditorWorkbooks(); |
| |
| for (Iterator iter = workbooks.iterator(); iter.hasNext();) { |
| PartStack stack = (PartStack) iter.next(); |
| |
| LayoutPart[] children = stack.getChildren(); |
| |
| for (int i = 0; i < children.length; i++) { |
| LayoutPart part = children[i]; |
| |
| result.add(((PartPane)part).getPartReference()); |
| } |
| } |
| |
| return (IEditorReference[]) result.toArray(new IEditorReference[result.size()]); |
| } |
| |
| public EditorStack getWorkbookFromID(String workbookId) { |
| return editorArea.getWorkbookFromID(workbookId); |
| } |
| |
| public void updateStackButtons() { |
| editorArea.updateStackButtons(); |
| } |
| } |