| /******************************************************************************* |
| * 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.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.MultiStatus; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.internal.StartupThreading.StartupRunnable; |
| |
| /** |
| * Represents the top level container. |
| */ |
| public class ViewSashContainer extends PartSashContainer { |
| public ViewSashContainer(WorkbenchPage page, Composite parent) { |
| super("root layout container", page, parent);//$NON-NLS-1$ |
| } |
| |
| /** |
| * Gets root container for this part. |
| */ |
| public ViewSashContainer getRootContainer() { |
| return this; |
| } |
| |
| /** |
| * Subclasses override this method to specify |
| * the composite to use to parent all children |
| * layout parts it contains. |
| */ |
| protected Composite createParent(Composite parentWidget) { |
| return parentWidget; |
| } |
| |
| /** |
| * Subclasses override this method to dispose |
| * of any swt resources created during createParent. |
| */ |
| protected void disposeParent() { |
| // do nothing |
| } |
| |
| /** |
| * Get the part control. This method may return null. |
| */ |
| public Control getControl() { |
| return this.parent; |
| } |
| |
| /** |
| * @see IPersistablePart |
| */ |
| public IStatus restoreState(IMemento memento) { |
| MultiStatus result = new MultiStatus( |
| PlatformUI.PLUGIN_ID, |
| IStatus.OK, |
| WorkbenchMessages.get().RootLayoutContainer_problemsRestoringPerspective, null); |
| |
| // Read the info elements. |
| IMemento[] children = memento.getChildren(IWorkbenchConstants.TAG_INFO); |
| |
| // Create a part ID to part hashtable. |
| final Map mapIDtoPart = new HashMap(children.length); |
| |
| // Loop through the info elements. |
| for (int i = 0; i < children.length; i++) { |
| // Get the info details. |
| IMemento childMem = children[i]; |
| String partID = childMem.getString(IWorkbenchConstants.TAG_PART); |
| final String relativeID = childMem |
| .getString(IWorkbenchConstants.TAG_RELATIVE); |
| int relationship = 0; |
| float ratio = 0.0f; |
| int left = 0, right = 0; |
| if (relativeID != null) { |
| relationship = childMem.getInteger( |
| IWorkbenchConstants.TAG_RELATIONSHIP).intValue(); |
| |
| // Note: the ratio is used for reading pre-3.0 eclipse workspaces. It should be ignored |
| // if "left" and "right" are available. |
| Float ratioFloat = childMem |
| .getFloat(IWorkbenchConstants.TAG_RATIO); |
| Integer leftInt = childMem |
| .getInteger(IWorkbenchConstants.TAG_RATIO_LEFT); |
| Integer rightInt = childMem |
| .getInteger(IWorkbenchConstants.TAG_RATIO_RIGHT); |
| if (leftInt != null && rightInt != null) { |
| left = leftInt.intValue(); |
| right = rightInt.intValue(); |
| } else { |
| if (ratioFloat != null) { |
| ratio = ratioFloat.floatValue(); |
| } |
| } |
| } |
| String strFolder = childMem |
| .getString(IWorkbenchConstants.TAG_FOLDER); |
| |
| // Create the part. |
| LayoutPart part = null; |
| if (strFolder == null) { |
| part = new PartPlaceholder(partID); |
| } else { |
| ViewStack folder = new ViewStack(page); |
| folder.setID(partID); |
| result.add(folder.restoreState(childMem |
| .getChild(IWorkbenchConstants.TAG_FOLDER))); |
| ContainerPlaceholder placeholder = new ContainerPlaceholder( |
| partID); |
| placeholder.setRealContainer(folder); |
| part = placeholder; |
| } |
| // 1FUN70C: ITPUI:WIN - Shouldn't set Container when not active |
| part.setContainer(this); |
| |
| final int myLeft = left, myRight= right, myRelationship = relationship; |
| final float myRatio = ratio; |
| final LayoutPart myPart = part; |
| |
| StartupThreading.runWithoutExceptions(new StartupRunnable() { |
| |
| public void runWithException() throws Throwable { |
| // Add the part to the layout |
| if (relativeID == null) { |
| add(myPart); |
| } else { |
| LayoutPart refPart = (LayoutPart) mapIDtoPart.get(relativeID); |
| if (refPart != null) { |
| if (myLeft != 0) { |
| add(myPart, myRelationship, myLeft, myRight, refPart); |
| } else { |
| add(myPart, myRelationship, myRatio, refPart); |
| } |
| } else { |
| WorkbenchPlugin |
| .log("Unable to find part for ID: " + relativeID);//$NON-NLS-1$ |
| } |
| } |
| }}); |
| |
| mapIDtoPart.put(partID, part); |
| } |
| return result; |
| } |
| |
| /** |
| * @see IPersistablePart |
| */ |
| public IStatus saveState(IMemento memento) { |
| RelationshipInfo[] relationships = computeRelation(); |
| |
| MultiStatus result = new MultiStatus( |
| PlatformUI.PLUGIN_ID, |
| IStatus.OK, |
| WorkbenchMessages.get().RootLayoutContainer_problemsSavingPerspective, null); |
| |
| // Loop through the relationship array. |
| for (int i = 0; i < relationships.length; i++) { |
| // Save the relationship info .. |
| // private LayoutPart part; |
| // private int relationship; |
| // private float ratio; |
| // private LayoutPart relative; |
| RelationshipInfo info = relationships[i]; |
| IMemento childMem = memento |
| .createChild(IWorkbenchConstants.TAG_INFO); |
| childMem.putString(IWorkbenchConstants.TAG_PART, info.part.getID()); |
| if (info.relative != null) { |
| childMem.putString(IWorkbenchConstants.TAG_RELATIVE, |
| info.relative.getID()); |
| childMem.putInteger(IWorkbenchConstants.TAG_RELATIONSHIP, |
| info.relationship); |
| childMem.putInteger(IWorkbenchConstants.TAG_RATIO_LEFT, |
| info.left); |
| childMem.putInteger(IWorkbenchConstants.TAG_RATIO_RIGHT, |
| info.right); |
| |
| // The ratio is only needed for saving workspaces that can be read by old versions |
| // of Eclipse. It is not used in newer versions of Eclipse, which use the "left" |
| // and "right" attributes instead. |
| childMem.putFloat(IWorkbenchConstants.TAG_RATIO, info |
| .getRatio()); |
| } |
| |
| // Is this part a folder or a placeholder for one? |
| ViewStack folder = null; |
| if (info.part instanceof ViewStack) { |
| folder = (ViewStack) info.part; |
| } else if (info.part instanceof ContainerPlaceholder) { |
| LayoutPart part = ((ContainerPlaceholder) info.part) |
| .getRealContainer(); |
| if (part instanceof ViewStack) { |
| folder = (ViewStack) part; |
| } |
| } |
| |
| // If this is a folder (ViewStack) save the contents. |
| if (folder != null) { |
| childMem.putString(IWorkbenchConstants.TAG_FOLDER, "true");//$NON-NLS-1$ |
| |
| IMemento folderMem = childMem |
| .createChild(IWorkbenchConstants.TAG_FOLDER); |
| result.add(folder.saveState(folderMem)); |
| } |
| } |
| return result; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#getDockingRatio(org.eclipse.ui.internal.LayoutPart, org.eclipse.ui.internal.LayoutPart) |
| */ |
| protected float getDockingRatio(LayoutPart dragged, LayoutPart target) { |
| if (isStackType(target)) { |
| return super.getDockingRatio(dragged, target); |
| } else { |
| return 0.25f; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#isStackType(org.eclipse.ui.internal.LayoutPart) |
| */ |
| public boolean isStackType(LayoutPart toTest) { |
| return (toTest instanceof ViewStack); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#isPaneType(org.eclipse.ui.internal.LayoutPart) |
| */ |
| public boolean isPaneType(LayoutPart toTest) { |
| return (toTest instanceof ViewPane); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#createStack(org.eclipse.ui.internal.LayoutPart) |
| */ |
| protected PartStack createStack() { |
| ViewStack result = new ViewStack(page); |
| return result; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#setVisiblePart(org.eclipse.ui.internal.ILayoutContainer, org.eclipse.ui.internal.LayoutPart) |
| */ |
| protected void setVisiblePart(ILayoutContainer container, |
| LayoutPart visiblePart) { |
| if (container instanceof ViewStack) { |
| ViewStack tabFolder = (ViewStack) container; |
| |
| tabFolder.setSelection(visiblePart); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#getVisiblePart(org.eclipse.ui.internal.ILayoutContainer) |
| */ |
| protected LayoutPart getVisiblePart(ILayoutContainer container) { |
| return ((ViewStack) container).getSelection(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#derefPart(org.eclipse.ui.internal.LayoutPart) |
| */ |
| protected void derefPart(LayoutPart sourcePart) { |
| page.getActivePerspective().getPresentation().derefPart(sourcePart); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.PartSashContainer#addChild(org.eclipse.ui.internal.PartSashContainer.RelationshipInfo) |
| */ |
| protected void addChild(RelationshipInfo info) { |
| LayoutPart child = info.part; |
| |
| // Nasty hack: ensure that all views end up inside a tab folder. |
| // Since the view title is provided by the tab folder, this ensures |
| // that views don't get created without a title tab. |
| if (child instanceof ViewPane) { |
| ViewStack folder = new ViewStack(page); |
| folder.add(child); |
| info.part = folder; |
| } |
| |
| super.addChild(info); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.ILayoutContainer#replace(org.eclipse.ui.internal.LayoutPart, org.eclipse.ui.internal.LayoutPart) |
| */ |
| public void replace(LayoutPart oldChild, LayoutPart newChild) { |
| if (!isChild(oldChild)) { |
| return; |
| } |
| |
| // Nasty hack: ensure that all views end up inside a tab folder. |
| // Since the view title is provided by the tab folder, this ensures |
| // that views don't get created without a title tab. |
| if (newChild instanceof ViewPane) { |
| ViewStack folder = new ViewStack(page); |
| folder.add(newChild); |
| newChild = folder; |
| } |
| |
| super.replace(oldChild, newChild); |
| } |
| } |