blob: cf38445abe52a15955a2257e24c1a671764adfe6 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}