/*******************************************************************************
 * Copyright (c) 2000, 2010 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.gef.ui.parts;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.swt.SWT;

import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.palette.PaletteViewer;

/**
 * This class serves as a quick starting point for clients who are new to GEF.
 * It will create an Editor containing a Split composite, with one side
 * contianing a PaletteViewer, and the other a GraphicalViewer.
 * 
 * @author hudsonr
 */
public abstract class GraphicalEditorWithPalette extends GraphicalEditor {

	private static final int PALETTE_SIZE = 125;

	private PaletteViewer paletteViewer;

	/**
	 * Called to configure the viewer before it receives its contents.
	 */
	protected void configurePaletteViewer() {
	}

	/**
	 * Creates the palette on the given composite.
	 * 
	 * @param parent
	 *            the composite
	 */
	protected void createPaletteViewer(Composite parent) {
		PaletteViewer viewer = new PaletteViewer();
		setPaletteViewer(viewer);
		viewer.createControl(parent);
		configurePaletteViewer();
		hookPaletteViewer();
		initializePaletteViewer();
	}

	/**
	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createPartControl(Composite parent) {
		Splitter splitter = new Splitter(parent, SWT.HORIZONTAL);
		createPaletteViewer(splitter);
		createGraphicalViewer(splitter);
		splitter.maintainSize(getPaletteViewer().getControl());
		splitter.setFixedSize(getInitialPaletteSize());
		splitter.addFixedSizeChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent evt) {
				handlePaletteResized(((Splitter) evt.getSource())
						.getFixedSize());
			}
		});
	}

	/**
	 * Returns the PaletteRoot for the palette viewer.
	 * 
	 * @return the palette root
	 */
	protected abstract PaletteRoot getPaletteRoot();

	/**
	 * Returns the initial palette size in pixels. Subclasses may override this
	 * method to return a persisted value.
	 * 
	 * @see #handlePaletteResized(int)
	 * @return the initial size of the palette in pixels.
	 */
	protected int getInitialPaletteSize() {
		return PALETTE_SIZE;
	}

	/**
	 * Returns the PaletteViewer.
	 * 
	 * @return the palette viewer
	 */
	protected PaletteViewer getPaletteViewer() {
		return paletteViewer;
	}

	/**
	 * Called whenever the user resizes the palette.
	 * 
	 * @param newSize
	 *            the new size in pixels
	 */
	protected void handlePaletteResized(int newSize) {
	}

	/**
	 * Called when the palette viewer is set. By default, the EditDomain is
	 * given the palette viewer.
	 */
	protected void hookPaletteViewer() {
		getEditDomain().setPaletteViewer(paletteViewer);
	}

	/**
	 * Called to populate the palette viewer.
	 */
	protected void initializePaletteViewer() {
	}

	/**
	 * Sets the palette viewer
	 * 
	 * @param paletteViewer
	 *            the palette viewer
	 */
	protected void setPaletteViewer(PaletteViewer paletteViewer) {
		this.paletteViewer = paletteViewer;
	}

	/**
	 * Sets the {@link #getPaletteRoot() palette root} of the edit domain
	 * 
	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#setEditDomain(org.eclipse.gef.DefaultEditDomain)
	 */
	protected void setEditDomain(DefaultEditDomain ed) {
		super.setEditDomain(ed);
		getEditDomain().setPaletteRoot(getPaletteRoot());
	}

}
