| /******************************************************************************* |
| * 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 org.eclipse.core.runtime.*; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.swt.widgets.*; |
| import org.eclipse.ui.*; |
| import java.util.*; |
| |
| /** |
| * Represents the top level container. |
| */ |
| public class RootLayoutContainer extends PartSashContainer { |
| public RootLayoutContainer(WorkbenchPage page) { |
| super("root layout container",page);//$NON-NLS-1$ |
| } |
| /** |
| * Notification that a child layout part has been |
| * added to the container. Subclasses may override |
| * this method to perform any container specific |
| * work. |
| */ |
| protected void childAdded(LayoutPart child) { |
| // do nothing |
| } |
| /** |
| * Gets root container for this part. |
| */ |
| public RootLayoutContainer getRootContainer() { |
| return this; |
| } |
| /** |
| * Notification that a child layout part has been |
| * removed from the container. Subclasses may override |
| * this method to perform any container specific |
| * work. |
| */ |
| protected void childRemoved(LayoutPart child) { |
| // do nothing |
| } |
| /** |
| * 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.getString("RootLayoutContainer.problemsRestoringPerspective"),null); //$NON-NLS-1$ |
| |
| // Read the info elements. |
| IMemento [] children = memento.getChildren(IWorkbenchConstants.TAG_INFO); |
| |
| // Create a part ID to part hashtable. |
| 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); |
| String relativeID = childMem.getString(IWorkbenchConstants.TAG_RELATIVE); |
| int relationship = 0; |
| float ratio = 0.0f; |
| if (relativeID != null) { |
| relationship = childMem.getInteger(IWorkbenchConstants.TAG_RELATIONSHIP).intValue(); |
| ratio = childMem.getFloat(IWorkbenchConstants.TAG_RATIO).floatValue(); |
| } |
| String strFolder = childMem.getString(IWorkbenchConstants.TAG_FOLDER); |
| |
| // Create the part. |
| LayoutPart part = null; |
| if (strFolder == null) |
| part = new PartPlaceholder(partID); |
| else { |
| PartTabFolder folder = new PartTabFolder(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); |
| |
| // Add the part to the layout |
| if (relativeID == null) { |
| add(part); |
| } else { |
| LayoutPart refPart = (LayoutPart)mapIDtoPart.get(relativeID); |
| if (refPart != null) { |
| add(part, relationship, ratio, 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.getString("RootLayoutContainer.problemsSavingPerspective"),null); //$NON-NLS-1$ |
| |
| // 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.putFloat(IWorkbenchConstants.TAG_RATIO, info.ratio); |
| } |
| |
| // Is this part a folder or a placeholder for one? |
| PartTabFolder folder = null; |
| if (info.part instanceof PartTabFolder) { |
| folder = (PartTabFolder)info.part; |
| } else if (info.part instanceof ContainerPlaceholder) { |
| LayoutPart part = ((ContainerPlaceholder)info.part).getRealContainer(); |
| if (part instanceof PartTabFolder) |
| folder = (PartTabFolder)part; |
| } |
| |
| // If this is a folder 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; |
| } |
| } |