/*******************************************************************************
* 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;
// RAP [if] unnecessary
//import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.rwt.Adaptable;
import org.eclipse.ui.forms.internal.widgets.IAggregateHyperlinkSegmentAdapter;
/**
* This segment contains a collection of images and links that all belong to one
* logical hyperlink.
*/
public class AggregateHyperlinkSegment extends ParagraphSegment implements
IHyperlinkSegment, Adaptable {
private String href;
private Vector segments = new Vector();
// RAP [if] Adapter to reach into widget implementation from within LCA
private IAggregateHyperlinkSegmentAdapter aggregateHyperlinkSegmentAdapter;
public AggregateHyperlinkSegment() {
}
// RAP [if] getAdapter implementation
public Object getAdapter( Class adapter ) {
Object result = null;
if( adapter == IAggregateHyperlinkSegmentAdapter.class ) {
if( aggregateHyperlinkSegmentAdapter == null ) {
aggregateHyperlinkSegmentAdapter
= new IAggregateHyperlinkSegmentAdapter() {
public Object[] getHyperlinkSegments() {
return segments.toArray();
}
};
}
result = aggregateHyperlinkSegmentAdapter;
}
return result;
}
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)
*/
// RAP [if] paint unnecessary
// 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)
*/
// RAP [if] paintFocus unnecessary
// 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;
}
}