blob: 9be98f6f93da8af1b3cbae42307895864569a70e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.AbstractHandler;
import org.eclipse.ui.commands.ExecutionException;
import org.eclipse.ui.commands.HandlerSubmission;
import org.eclipse.ui.commands.IHandler;
import org.eclipse.ui.commands.Priority;
import org.eclipse.ui.part.MultiEditor;
/**
* EditorAreaHelper is a wrapper for PartTabworkbook.
*/
public class EditorAreaHelper {
private WorkbenchPage page;
private ArrayList editorTable = new ArrayList(4);
private EditorSashContainer editorArea;
private HandlerSubmission openEditorDropDownHandlerSubmission;
/**
* Creates a new EditorAreaHelper.
*/
public EditorAreaHelper(WorkbenchPage page) {
this.page = page;
this.editorArea = new EditorSashContainer(IPageLayout.ID_EDITOR_AREA, page);
final Shell shell = page.getWorkbenchWindow().getShell();
IHandler openEditorDropDownHandler = new AbstractHandler() {
public Object execute(Map parameterValuesByName) throws ExecutionException {
displayEditorList();
return null;
}
};
openEditorDropDownHandlerSubmission = new HandlerSubmission(null,
shell, null, "org.eclipse.ui.window.openEditorDropDown", //$NON-NLS-1$
openEditorDropDownHandler, Priority.MEDIUM);
PlatformUI.getWorkbench().getCommandSupport().addHandlerSubmission(
openEditorDropDownHandlerSubmission);
}
/**
* Displays a list of open editors
*/
public void displayEditorList() {
EditorStack activeWorkbook = editorArea.getActiveWorkbook();
if (activeWorkbook != null) {
activeWorkbook.showPartList();
}
}
/**
* Closes all of the editors.
*/
public void closeAllEditors() {
editorArea.removeAllEditors();
ArrayList editorsToDispose = (ArrayList) editorTable.clone();
editorTable.clear();
for (int i = 0; i < editorsToDispose.size(); i++) {
((EditorPane) editorsToDispose.get(i)).dispose();
}
}
/**
* 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);
editorTable.remove(pane);
pane.dispose();
}
}
/**
* 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() {
PlatformUI.getWorkbench().getCommandSupport()
.removeHandlerSubmission(
openEditorDropDownHandlerSubmission);
if (editorArea != null) {
editorArea.dispose();
}
}
/**
* @see IEditorPresentation
*/
public String getActiveEditorWorkbookID() {
return editorArea.getActiveWorkbookID();
}
/**
* Returns an array of the open editors.
*
* @return an array of open editors
*/
public IEditorReference[] getEditors() {
int nSize = editorTable.size();
IEditorReference[] retArray = new IEditorReference[nSize];
for (int i = 0; i < retArray.length; i++) {
retArray[i] = ((EditorPane) editorTable.get(i)).getEditorReference();
}
return retArray;
}
/**
* 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 = activeWorkbook.getVisibleEditor();
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.getPane().getPartReference();
}
return result;
}
return null;
}
/**
* The active editor has failed to be restored. Find another editor, restore it
* and make it visible.
*/
public void fixVisibleEditor() {
EditorStack activeWorkbook = editorArea.getActiveWorkbook();
EditorPane pane = activeWorkbook.getVisibleEditor();
if (pane == null) {
LayoutPart editors[] = activeWorkbook.getChildren();
if (editors.length > 0)
pane = (EditorPane) editors[0];
}
if (pane != null) {
IEditorReference result = pane.getEditorReference();
IEditorPart editorPart = (IEditorPart) result.getPart(true);
if (editorPart != null)
activeWorkbook.setVisibleEditor(pane);
}
}
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);
}
/**
* Opens an editor within the presentation but does not give it focus.
* </p>
* @param part the editor
*/
public void openEditor(
IEditorReference ref,
IEditorReference[] innerEditors,
boolean setVisible) {
EditorPane pane = new MultiEditorOuterPane(ref, page, editorArea.getActiveWorkbook());
initPane(pane, ref);
for (int i = 0; i < innerEditors.length; i++) {
EditorPane innerPane =
new MultiEditorInnerPane(
pane,
innerEditors[i],
page,
editorArea.getActiveWorkbook());
initPane(innerPane, innerEditors[i]);
}
// Show the editor.
editorArea.addEditor(pane);
if (setVisible)
setVisibleEditor(ref, false);
}
/**
* Opens an editor within the presentation but does not give it focus.
* </p>
* @param part the editor
*/
public void openEditor(IEditorReference ref, boolean setVisible) {
EditorPane pane = new EditorPane(ref, page, editorArea.getActiveWorkbook());
initPane(pane, ref);
// Show the editor.
editorArea.addEditor(pane);
if (setVisible)
setVisibleEditor(ref, false);
}
private EditorPane initPane(EditorPane pane, IEditorReference ref) {
((WorkbenchPartReference) ref).setPane(pane);
// Record the new editor.
editorTable.add(pane);
return pane;
}
/**
* @see IPersistablePart
*/
public IStatus restoreState(IMemento memento) {
// Restore the editor area workbooks layout/relationship
return editorArea.restoreState(memento);
}
/**
* @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);
}
/**
* Makes sure the visible editor's tab is visible.
*/
public void showVisibleEditor() {
EditorStack activeWorkbook = editorArea.getActiveWorkbook();
if (activeWorkbook != null)
activeWorkbook.showVisibleEditor();
}
/**
* 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();
EditorPane activePane = activeWorkbook.getVisibleEditor();
if (activePane != parentPane)
parentPane.getWorkbook().setVisibleEditor(parentPane);
else
return false;
} else {
pane.getWorkbook().setVisibleEditor(pane);
}
if (setFocus)
part.setFocus();
return true;
}
}
return false;
}
/**
* Method getWorkbooks.
* @return ArrayList
*/
public ArrayList getWorkbooks() {
return editorArea.getEditorWorkbooks();
}
}