/*******************************************************************************
 * 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.forms.widgets;

import java.util.Hashtable;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;


public abstract class ObjectSegment extends ParagraphSegment {
	public static final int TOP = 1;

	public static final int MIDDLE = 2;

	public static final int BOTTOM = 3;

	private int alignment = BOTTOM;
	private boolean nowrap=false;
	private Rectangle bounds;
	private String objectId;

	public int getVerticalAlignment() {
		return alignment;
	}

	void setVerticalAlignment(int alignment) {
		this.alignment = alignment;
	}

	public String getObjectId() {
		return objectId;
	}

	void setObjectId(String objectId) {
		this.objectId = objectId;
	}
	
	protected abstract Point getObjectSize(Hashtable resourceTable, int wHint);

	public boolean advanceLocator(GC gc, int wHint, Locator loc,
			Hashtable objectTable, boolean computeHeightOnly) {
		Point objectSize = getObjectSize(objectTable, wHint);
		int iwidth = 0;
		int iheight = 0;
		boolean newLine = false;

		if (objectSize != null) {
			iwidth = objectSize.x + (isSelectable()?2:0);
			iheight = objectSize.y + (isSelectable()?2:0);
		}
		if (wHint != SWT.DEFAULT && !nowrap && loc.x + iwidth > wHint) {
			// new line
			if (computeHeightOnly)
				loc.collectHeights();
			loc.x = loc.indent;
			loc.x += iwidth;
			loc.y += loc.rowHeight;
			loc.width = loc.indent + iwidth;
			loc.rowHeight = iheight;
			loc.leading = 0;
			newLine = true;
		} else {
			loc.x += iwidth;
			loc.width += iwidth;
			loc.rowHeight = Math.max(loc.rowHeight, iheight);
		}
		return newLine;
	}

	public boolean contains(int x, int y) {
		if (bounds==null) 
			return false;
		return bounds.contains(x, y);
	}
	public boolean intersects(Rectangle rect) {
		if (bounds==null)
			return false;
		return bounds.intersects(rect);
	}

	public Rectangle getBounds() {
		return bounds;
	}

	public boolean isSelectable() {
		return false;
	}
	/**
	 * @return Returns the nowrap.
	 */
	public boolean isNowrap() {
		return nowrap;
	}
	/**
	 * @param nowrap The nowrap to set.
	 */
	public void setNowrap(boolean nowrap) {
		this.nowrap = nowrap;
	}
	public void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle repaintRegion) {
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#layout(org.eclipse.swt.graphics.GC, int, org.eclipse.ui.internal.forms.widgets.Locator, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
	 */
	public void layout(GC gc, int width, Locator loc, Hashtable resourceTable,
			boolean selected) {
		Point size = getObjectSize(resourceTable, width);

		int objWidth = 0;
		int objHeight = 0;
		if (size != null) {
			objWidth = size.x + (isSelectable()?2:0);
			objHeight = size.y + (isSelectable()?2:0);
		} else
			return;
		loc.width = objWidth;

		if (!nowrap && loc.x + objWidth > width) {
			// new row
			loc.newLine();
			loc.rowCounter++;
		}
		int ix = loc.x;
		int iy = loc.y;
		
		if (alignment==MIDDLE)
			iy = loc.getMiddle(objHeight, false);
		else if (alignment==BOTTOM)
			iy = loc.getBaseline(objHeight, false);
		loc.x += objWidth;
		loc.rowHeight = Math.max(loc.rowHeight, objHeight);
		bounds = new Rectangle(ix, iy, objWidth, objHeight);
	}
	/* (non-Javadoc)
	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#computeSelection(org.eclipse.swt.graphics.GC, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
	 */
	public void computeSelection(GC gc, Hashtable resourceTable, SelectionData selData) {
		// TODO we should add this to the selection 
		// if we want to support rich text
	}
}
