/*******************************************************************************
 * Copyright (c) 2000, 2004 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 org.eclipse.swt.graphics.Rectangle;
import org.eclipse.ui.IMemento;

public class DetachedPlaceHolder extends PartPlaceholder implements ILayoutContainer {
	ArrayList children = new ArrayList();
	Rectangle bounds;
	/**
	 * DetachedPlaceHolder constructor comment.
	 * @param id java.lang.String
	 */
	public DetachedPlaceHolder(String id, Rectangle bounds) {
		super(id);
		this.bounds = bounds;
	}
	/**
	 * Add a child to the container.
	 */
	public void add(LayoutPart newPart) {
		if (!(newPart instanceof PartPlaceholder))
			return;
		children.add(newPart);
	}
	/**
	 * Return true if the container allows its
	 * parts to show a border if they choose to,
	 * else false if the container does not want
	 * its parts to show a border.
	 */
	public boolean allowsBorder() {
		return false;
	}
	public Rectangle getBounds() {
		return bounds;
	}
	/**
	 * Returns a list of layout children.
	 */
	public LayoutPart[] getChildren() {
		LayoutPart result[] = new LayoutPart[children.size()];
		children.toArray(result);
		return result;
	}
	/**
	 * Remove a child from the container.
	 */
	public void remove(LayoutPart part) {
		children.remove(part);
	}
	/**
	 * Replace one child with another
	 */
	public void replace(LayoutPart oldPart, LayoutPart newPart) {
		remove(oldPart);
		add(newPart);
	}
	/**
	 * @see IPersistablePart
	 */
	public void restoreState(IMemento memento) {
		// Read the bounds.
		Integer bigInt;
		bigInt = memento.getInteger(IWorkbenchConstants.TAG_X);
		int x = bigInt.intValue();
		bigInt = memento.getInteger(IWorkbenchConstants.TAG_Y);
		int y = bigInt.intValue();
		bigInt = memento.getInteger(IWorkbenchConstants.TAG_WIDTH);
		int width = bigInt.intValue();
		bigInt = memento.getInteger(IWorkbenchConstants.TAG_HEIGHT);
		int height = bigInt.intValue();

		bounds = new Rectangle(x, y, width, height);

		// Restore the placeholders.
		IMemento childrenMem[] = memento.getChildren(IWorkbenchConstants.TAG_VIEW);
		for (int i = 0; i < childrenMem.length; i++) {
			PartPlaceholder holder =
				new PartPlaceholder(childrenMem[i].getString(IWorkbenchConstants.TAG_ID));
			holder.setContainer(this);
			children.add(holder);
		}
	}
	/**
	 * @see IPersistablePart
	 */
	public void saveState(IMemento memento) {
		// Save the bounds.
		memento.putInteger(IWorkbenchConstants.TAG_X, bounds.x);
		memento.putInteger(IWorkbenchConstants.TAG_Y, bounds.y);
		memento.putInteger(IWorkbenchConstants.TAG_WIDTH, bounds.width);
		memento.putInteger(IWorkbenchConstants.TAG_HEIGHT, bounds.height);

		// Save the views.
		for (int i = 0; i < children.size(); i++) {
			IMemento childMem = memento.createChild(IWorkbenchConstants.TAG_VIEW);
			LayoutPart child = (LayoutPart) children.get(i);
			childMem.putString(IWorkbenchConstants.TAG_ID, child.getID());
		}
	}
	
	public void findSashes(LayoutPart part, PartPane.Sashes sashes) {
		ILayoutContainer container = getContainer();
		
		if (container != null) {
			container.findSashes(this, sashes);
		}
	}
	/* (non-Javadoc)
	 * @see org.eclipse.ui.internal.ILayoutContainer#allowsAutoFocus()
	 */
	public boolean allowsAutoFocus() {
		return false;
	}
}
