/*******************************************************************************
 * Copyright (c) 2000, 2005 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 java.util.Vector;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;

/**
 * This segment contains a collection of images and links that all belong to one
 * logical hyperlink.
 */
public class AggregateHyperlinkSegment extends ParagraphSegment implements
		IHyperlinkSegment {
	private String href;

	private Vector segments = new Vector();

	public AggregateHyperlinkSegment() {
	}

	public void add(TextHyperlinkSegment segment) {
		segments.add(segment);
	}

	public void add(ImageHyperlinkSegment segment) {
		segments.add(segment);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#advanceLocator(org.eclipse.swt.graphics.GC,
	 *      int, org.eclipse.ui.internal.forms.widgets.Locator,
	 *      java.util.Hashtable, boolean)
	 */
	public boolean advanceLocator(GC gc, int wHint, Locator loc,
			Hashtable objectTable, boolean computeHeightOnly) {
		boolean newLine = false;
		for (int i = 0; i < segments.size(); i++) {
			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
			if (segment.advanceLocator(gc, wHint, loc, objectTable,
					computeHeightOnly))
				newLine = true;
		}
		return newLine;
	}

	/**
	 * @return Returns the href.
	 */
	public String getHref() {
		return href;
	}

	/**
	 * @param href
	 *            The href to set.
	 */
	public void setHref(String href) {
		this.href = href;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#repaint(org.eclipse.swt.graphics.GC,
	 *      boolean)
	 */
	public void paint(GC gc, boolean hover, Hashtable resourceTable,
			boolean selected, SelectionData selData, Rectangle repaintRegion) {
		for (int i = 0; i < segments.size(); i++) {
			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
			segment.paint(gc, hover, resourceTable, selected, selData,
					repaintRegion);
		}
	}

	public String getText() {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < segments.size(); i++) {
			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
			buf.append(segment.getText());
		}
		return buf.toString();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#paintFocus(org.eclipse.swt.graphics.GC,
	 *      org.eclipse.swt.graphics.Color, org.eclipse.swt.graphics.Color,
	 *      boolean)
	 */
	public void paintFocus(GC gc, Color bg, Color fg, boolean selected,
			Rectangle repaintRegion) {
		for (int i = 0; i < segments.size(); i++) {
			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
			segment.paintFocus(gc, bg, fg, selected, repaintRegion);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#getBounds()
	 */
	public Rectangle getBounds() {
		Rectangle bounds = new Rectangle(Integer.MAX_VALUE, Integer.MAX_VALUE,
				0, 0);
		// TODO this is wrong
		for (int i = 0; i < segments.size(); i++) {
			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
			Rectangle sbounds = segment.getBounds();
			bounds.x = Math.min(bounds.x, sbounds.x);
			bounds.y = Math.min(bounds.y, sbounds.y);
			bounds.width = Math.max(bounds.width, sbounds.width);
			bounds.height = Math.max(bounds.height, sbounds.height);
		}
		return bounds;
	}

	public boolean contains(int x, int y) {
		for (int i = 0; i < segments.size(); i++) {
			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
			if (segment.contains(x, y))
				return true;
		}
		return false;
	}

	public boolean intersects(Rectangle rect) {
		for (int i = 0; i < segments.size(); i++) {
			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
			if (segment.intersects(rect))
				return true;
		}
		return false;
	}

	/*
	 * (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 locator,
			Hashtable resourceTable, boolean selected) {
		for (int i = 0; i < segments.size(); i++) {
			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
			segment.layout(gc, width, locator, resourceTable, selected);
		}
	}

	/*
	 * (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) {
		for (int i = 0; i < segments.size(); i++) {
			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
			segment.computeSelection(gc, resourceTable, selData);
		}
	}

	public void clearCache(String fontId) {
		for (int i = 0; i < segments.size(); i++) {
			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
			segment.clearCache(fontId);
		}
	}

	public String getTooltipText() {
		if (segments.size() > 0)
			return ((ParagraphSegment) segments.get(0)).getTooltipText();
		return super.getTooltipText();
	}

	public boolean isFocusSelectable(Hashtable resourceTable) {
		return true;
	}

	public boolean setFocus(Hashtable resourceTable, boolean direction) {
		return true;
	}
}
