/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.preference;

import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.AncestorListener;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.FreeformFigure;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayeredPane;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.FreeformListener;
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.LayeredPane;
import org.eclipse.draw2d.ScalableFreeformLayeredPane;
import org.eclipse.draw2d.ScrollPane;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.GridLayer;
import org.eclipse.gef.editparts.GuideLayer;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;

/**
 * A ScollPane used as figure container
 *
 */
/*package*/ class WindowFigure extends ScrollPane implements IContainerFigure,
		LayerConstants, FreeformFigure {
	private TabbedWindowBorder windowBorder;

	private TabbedTitleBarBorder titleBarBorder;

	private FreeformViewport myViewport;

	// private FreeformLayeredPane layeredPane;

	private ScalableFreeformLayeredPane scaledLayers;

	private LayeredPane innerLayers;

	private LayeredPane printableLayers;

	private FreeformLayer primaryLayer;

	private final static Font defaultFont = JFaceResources.getFontRegistry().get(
			JFaceResources.DEFAULT_FONT);

	private final static Color defaultForegroundColor = ColorConstants.black;

	private final static Color defaultBackgroundColor = ColorConstants.white;

	private final static Color defaultGridColor = ColorConstants.lightGray;

	private final static Dimension defaultGridSpacing = null;

	private final static boolean defaultGridEnabled = false;

	// Line Routing is not used within the WindowFigure class; it just serves as
	// a storage
	// location for communicating between the GEMPreferences and EditParts that
	// actually
	// create the line routers.
	private final static int LINE_ROUTING_MANUAL = 0;

	// TODO: should this really be static?
	private static int defaultLineRoutingStyle = LINE_ROUTING_MANUAL;

	private class MyGridLayer extends GridLayer {
	    
//		public Point getOrigin() {
//			return origin.getCopy();
//		}
	}

	private class MyFeedbackLayer extends FreeformLayer {
		MyFeedbackLayer() {
			setEnabled(false);
		}
	}

	/**
	 * Default constructor
	 */
	public WindowFigure() {
		super();

		windowBorder = new TabbedWindowBorder(this);
		titleBarBorder = (TabbedTitleBarBorder) windowBorder.getInnerBorder();
		setBorder(windowBorder);
		setFont(defaultFont);
		setForegroundColor(defaultForegroundColor);
		setBackgroundColor(defaultBackgroundColor);

		innerLayers = new FreeformLayeredPane();
		createLayers(innerLayers);

		myViewport = new FreeformViewport();
		myViewport.setContents(innerLayers);

		setViewport(myViewport);

		// CR389495: Working with nested complex activities causes in the BP
		// editor causes lockup
		// not related to this CR but discovered while working on it:
		// make sure we observe grid visibility from preferences
		getGridLayer().setVisible(defaultGridEnabled);
		getGridLayer().setSpacing(defaultGridSpacing);
		getGridLayer().setForegroundColor(defaultGridColor);

		setText(PreferenceMessages.WindowFigure_Title);

		addTabbedWindowListener(new WindowFigureListener() {
			public void tabChanged(int oldIndex, int newIndex) {
				internalSetCurrentTab(newIndex);
				validate();
			}
		});
		addAncestorListener(new AncestorListener() {

			public void ancestorAdded(IFigure ancestor) {
				setVisible(true);
			}

			public void ancestorMoved(IFigure ancestor) {
				// validateComposite();
			}

			public void ancestorRemoved(IFigure ancestor) {
				setVisible(false);
			}
		});
	}

	// //////////////////////////////////////////////////////////////////////////
	// Layer management
	// //////////////////////////////////////////////////////////////////////////

	/**
	 * @param layeredPane
	 */
	protected void createLayers(LayeredPane layeredPane) {
		layeredPane.add(getScaledLayers(), SCALABLE_LAYERS);
		layeredPane.add(new FreeformLayer(), HANDLE_LAYER);
		// CR377650: Horizontal scrolling needs to be improved
		// moved the feedback layer into printable layers so it shows up in
		// content outline
		// layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
		layeredPane.add(new GuideLayer(), GUIDE_LAYER);
	}

	/**
	 * @return the pane
	 */
	protected ScalableFreeformLayeredPane createScaledLayers() {
		ScalableFreeformLayeredPane layers = new ScalableFreeformLayeredPane();
		layers.add(createGridLayer(), GRID_LAYER);
		layers.add(getPrintableLayers(), PRINTABLE_LAYERS);
		// CR389070: Figures are abbreviating rule figures names and making them
		// unreadable
		// not needed (?)
		// layers.add(new MyFeedbackLayer(), SCALED_FEEDBACK_LAYER);
		return layers;
	}

	/**
	 * @return layered pane
	 */
	protected LayeredPane getScaledLayers() {
		if (scaledLayers == null)
			scaledLayers = createScaledLayers();
		return scaledLayers;
	}

	/**
	 * @return layered pane
	 */
	protected LayeredPane createPrintableLayers() {
		FreeformLayeredPane layeredPane = new FreeformLayeredPane();

		PrintedPageLayer pageTileLayer = new PrintedPageLayer(this);
		// TODO: get the printer page size from printer preferences
		// and set into the PageTileLayer.
		pageTileLayer.setPageSize(new Dimension(0, 0));
		layeredPane.add(pageTileLayer, PrintedPageLayer.PRINTED_PAGE_LAYER, -1);

		// CR400208: Lines bleed from the bp canvas through the Fault handler
		// window
		// changed z-order of connection layer so that it is below figures
		layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER, -1);
		primaryLayer = new FreeformLayer();
		layeredPane.add(primaryLayer, PRIMARY_LAYER, -1);
		primaryLayer.setLayoutManager(new FreeformLayout());

		// CR377650: Horizontal scrolling needs to be improved
		// let's put the feedback layer in with the printable layers so
		// we can see the feedback figures in the content outline viewer
		layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
		return layeredPane;
	}

	/**
	 * @return the layered pane
	 */
	protected LayeredPane getPrintableLayers() {
		if (printableLayers == null)
			printableLayers = createPrintableLayers();
		return printableLayers;
	}

	/**
	 * @return the grid layer
	 */
	protected GridLayer createGridLayer() {
		return new MyGridLayer();
	}

	/**
	 * @return the grid layer
	 */
	public GridLayer getGridLayer() {
		return (GridLayer) getLayer(GRID_LAYER);
	}

	public Layer getLayer(Object key) {
		// ScalableFreeformRootEditPart:
		Layer layer = null;
		if (scaledLayers != null)
			layer = scaledLayers.getLayer(key);
		if (layer != null)
			return layer;
		// FreeformGraphicalRootEditPart:
		if (innerLayers == null)
			return null;
		layer = innerLayers.getLayer(key);
		if (layer != null)
			return layer;
		if (printableLayers == null)
			return null;
		return printableLayers.getLayer(key);
	}

	// //////////////////////////////////////////////////////////////////////////
	// Properties
	// //////////////////////////////////////////////////////////////////////////

	/**
	 * @return the scroll position
	 */
	public Point getScrollPosition() {
		int x = getHorizontalScrollBar().getRangeModel().getValue();
		int y = getVerticalScrollBar().getRangeModel().getValue();
		return new Point(x, y);
	}

	/**
	 * @return the border
	 */
	public TabbedTitleBarBorder getTabbedTitleBarBorder() {
		return titleBarBorder;
	}

	/**
	 * @return the border
	 */
	public TabbedWindowBorder getTabbedWindowBorder() {
		return windowBorder;
	}

	/**
	 * @param listener
	 */
	public void addTabbedWindowListener(WindowFigureListener listener) {
		titleBarBorder.addTabbedWindowListener(listener);
	}

	/**
	 * @param listener
	 */
	public void removeTabbedWindowListener(WindowFigureListener listener) {
		titleBarBorder.removeTabbedWindowListener(listener);
	}

	public Dimension getMinimumSize(int wHint, int hHint) {
		Dimension d = titleBarBorder.getMinimumSize(wHint, hHint);
		d.expand(getInsets().getWidth(), getInsets().getHeight());
		return d;
	}

	/**
	 * @param s
	 * @return the previous number of tabs
	 */
	public int addTab(String s) {
		return titleBarBorder.addTab(s);
	}

	/**
	 * @param index
	 */
	public void removeTab(int index) {
		titleBarBorder.removeTab(index);
		internalSetCurrentTab(titleBarBorder.getCurrentTab());
	}

	private void internalSetCurrentTab(int index) {
		// Object contents = titleBarBorder.getContents(index);
		// if (contents instanceof IFigure)
		// setContents((IFigure) contents);
	}

	/**
	 * @param index
	 */
	public void setCurrentTab(int index) {
		internalSetCurrentTab(index);
		titleBarBorder.setCurrentTab(index);
	}

	/**
	 * @return the current tab index
	 */
	public int getCurrentTab() {
		return titleBarBorder.getCurrentTab();
	}

	public void setContents(IFigure figure) {
		titleBarBorder.setContents(0, figure);
		super.setContents(figure);
	}

	/**
	 * @param index
	 * @param contents
	 */
	public void setContents(int index, Object contents) {
		if (contents instanceof IFigure)
			setContents((IFigure) contents);
		titleBarBorder.setContents(index, contents);
	}

	/**
	 * @param index
	 * @return the content object of the index
	 */
	public Object getContents(int index) {
		return titleBarBorder.getContents(index);
	}

	public void setVisible(boolean flag) {
		super.setVisible(flag);
		windowBorder.setVisible(flag);
		// hide/show the window contents if it's a SWT composite
		Object contents = getContents();
		if (contents instanceof Composite)
			((Composite) contents).setVisible(flag);
	}

	public void setHighlight(boolean flag) {
		windowBorder.setHighlight(flag);
	}

	public void setFont(Font f) {
		titleBarBorder.setFont(f);
	}

	public void setForegroundColor(Color c) {
		titleBarBorder.setTextColor(c);
	}

	/**
	 * @param style
	 */
	public void setLineRoutingStyle(int style) {
		defaultLineRoutingStyle = style;
		revalidate();
	}

	/**
	 * @return the line routing style
	 */
	public int getLineRoutingStyle() {
		return defaultLineRoutingStyle;
	}

	public Dimension getPreferredSize(int wHint, int hHint) {
		if (prefSize == null) {
			IFigure parent = getParent();
			prefSize = parent.getSize();
			this.getLayoutManager().invalidate();
			Dimension m = super.getPreferredSize(wHint, hHint);
			if (getParent() instanceof CompoundNodeFigure) {
				if (((CompoundNodeFigure) parent).getState() == CompoundNodeFigure.RESTORED) {
					Insets in = ((CompoundNodeFigure) getParent())
							.getAnchorInsets();
					prefSize.width -= in.getWidth();
					prefSize.height -= in.getHeight();
				}
			} else {
				if (m.width > prefSize.width)
					prefSize.width = m.width;
				if (m.height > prefSize.height)
					prefSize.height = m.height;
			}
		}
		return prefSize;
	}

	protected boolean isValidationRoot() {
		return true;
	}

	// private void validateComposite() {
	// Object contents = getContents();
	// // System.out.println("validate: "+titleBarBorder.getLabel(0)+"
	// // "+contents);
	// if (contents instanceof Composite) {
	// if (getParent() == null) {
	// System.err.println("TabbedWindowFigure.validate() - ERROR");
	// return;
	// }
	// Rectangle r = getBounds().getCopy();
	// r.crop(getInsets());
	// Dimension ps = getParent().getParent().getPreferredSize();
	// Rectangle pr = getParent().getParent().getBounds();
	// titleBarBorder.invalidate();
	// titleBarBorder.getInsets(this);
	// Insets in = getParent().getParent().getInsets();
	// Composite comp = (Composite) getContents();
	// comp.setBounds(pr.x + r.x + in.left, pr.y + r.y, r.width, r.height);
	// comp.moveAbove(null);
	// }
	// }

	public void invalidate() {
		prefSize = null;
		super.invalidate();
	}

	// //////////////////////////////////////////////////////////////////////
	// IBaseFigure methods
	// //////////////////////////////////////////////////////////////////////

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(String
	 *      text)
	 */
	public void setText(String name) {
		titleBarBorder.setLabel(name);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
	 */
	public String getText() {
		if (titleBarBorder == null)
			return PreferenceMessages.WindowFigure_NoTitleText;
		return titleBarBorder.getLabel();
	}

	/*
	 * CR374981: Long activity labels do not get wrapped or truncated This
	 * method was added to the IBaseFigure interface to support direct edit of
	 * figure labels on the canvas.
	 */
	public Rectangle getTextBounds() {
		Rectangle r = getClientArea().getCopy();
		r.height = titleBarBorder.getTextExtents(this).height;
		r.x += getInsets().left;
		r.y -= getInsets().top;
		return r;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
	 */
	public Image getIcon() {
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
	 */
	public void setIcon(Image image) {
        // do nothing
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText(java.lang.String)
	 */
	public void setToolTipText(String text) {
        // do nothing
	}

	public String getToolTipText() {
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
	 */
	public void addDecorator(BaseFigureDecorator decorator) {
        // do nothing
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
	 */
	public void removeDecorator() {
        // do nothing
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
	 */
	public void removeDecorator(int position) {
        // do nothing
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
	 */
	public List getDecorators() {
		return null;
	}

	// //////////////////////////////////////////////////////////////////////
	// FreeformFigure methods
	// //////////////////////////////////////////////////////////////////////

	private WindowFreeformHelper helper = new WindowFreeformHelper(this);

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
	 */
	public void addFreeformListener(FreeformListener listener) {
		addListener(FreeformListener.class, listener);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
	 */
	public void fireExtentChanged() {
		Iterator iter = getListeners(FreeformListener.class);
		while (iter.hasNext())
			((FreeformListener) iter.next()).notifyFreeformExtentChanged();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
	 */
	public Rectangle getFreeformExtent() {
		Rectangle r = helper.getFreeformExtent();
		r.x = 0;
		r.y = 0;
		return r;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
	 */
	public void removeFreeformListener(FreeformListener listener) {
		removeListener(FreeformListener.class, listener);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
	 */
	public void setFreeformBounds(Rectangle bounds) {
		helper.setFreeformBounds(bounds);
	}
}