blob: f7714785dba39a7d82cf7db02c3184b23824d9a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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.forms.widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.internal.forms.widgets.*;
/**
* Hyperlink is a concrete implementation of the abstract base class that draws
* text in the client area. Text can be wrapped and underlined. Hyperlink is
* typically added to the hyperlink group so that certain properties are managed
* for all the hyperlinks that belong to it.
* <p>
* Hyperlink can be extended.
*
* @see org.eclipse.ui.forms.HyperlinkGroup
* @since 3.0
*/
public class Hyperlink extends AbstractHyperlink {
private String text;
private boolean underlined;
/**
* Creates a new hyperlink control in the provided parent.
*
* @param parent
* the control parent
* @param style
* the widget style
*/
public Hyperlink(Composite parent, int style) {
super(parent, style);
initAccessible();
}
protected void initAccessible() {
Accessible accessible = getAccessible();
accessible.addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = getText();
if (e.result == null)
getHelp(e);
}
public void getHelp(AccessibleEvent e) {
e.result = getToolTipText();
}
});
accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
public void getChildAtPoint(AccessibleControlEvent e) {
Point pt = toControl(new Point(e.x, e.y));
e.childID = (getBounds().contains(pt)) ? ACC.CHILDID_SELF
: ACC.CHILDID_NONE;
}
public void getLocation(AccessibleControlEvent e) {
Rectangle location = getBounds();
Point pt = toDisplay(new Point(location.x, location.y));
e.x = pt.x;
e.y = pt.y;
e.width = location.width;
e.height = location.height;
}
public void getChildCount(AccessibleControlEvent e) {
e.detail = 0;
}
public void getRole(AccessibleControlEvent e) {
e.detail = ACC.ROLE_LINK;
}
public void getState(AccessibleControlEvent e) {
int state = ACC.STATE_NORMAL;
if (Hyperlink.this.getSelection())
state = ACC.STATE_SELECTED | ACC.STATE_FOCUSED;
e.detail = state;
}
});
}
/**
* Sets the underlined state. It is not necessary to call this method when
* in a hyperlink group.
*
* @param underlined
* if <samp>true </samp>, a line will be drawn below the text for
* each wrapped line.
*/
public void setUnderlined(boolean underlined) {
this.underlined = underlined;
redraw();
}
/**
* Returns the underline state of the hyperlink.
*
* @return <samp>true </samp> if text is underlined, <samp>false </samp>
* otherwise.
*/
public boolean isUnderlined() {
return underlined;
}
/**
* Overrides the parent by incorporating the margin.
*/
public Point computeSize(int wHint, int hHint, boolean changed) {
checkWidget();
int innerWidth = wHint;
if (innerWidth != SWT.DEFAULT)
innerWidth -= marginWidth * 2;
Point textSize = computeTextSize(innerWidth, hHint);
int textWidth = textSize.x + 2 * marginWidth;
int textHeight = textSize.y + 2 * marginHeight;
return new Point(textWidth, textHeight);
}
/**
* Returns the current hyperlink text.
*
* @return hyperlink text
*/
public String getText() {
return text;
}
/**
* Sets the text of this hyperlink.
*
* @param text
* the hyperlink text
*/
public void setText(String text) {
if (text != null)
this.text = text;
else
this.text = ""; //$NON-NLS-1$
redraw();
}
/**
* Paints the hyperlink text.
*
* @param gc
* graphic context
*/
protected void paintHyperlink(GC gc) {
Rectangle carea = getClientArea();
Rectangle bounds = new Rectangle(marginWidth, marginHeight, carea.width
- marginWidth - marginWidth, carea.height - marginHeight
- marginHeight);
paintText(gc, bounds);
}
/**
* Paints the hyperlink text in provided bounding rectangle.
*
* @param gc
* graphic context
* @param bounds
* the bounding rectangle in which to paint the text
*/
protected void paintText(GC gc, Rectangle bounds) {
gc.setFont(getFont());
gc.setForeground(getForeground());
if ((getStyle() & SWT.WRAP) != 0) {
FormUtil.paintWrapText(gc, text, bounds, underlined);
} else {
Point textSize = computeTextSize(bounds.width, SWT.DEFAULT);
int textWidth = textSize.x;
int textHeight = textSize.y;
gc.drawText(getText(), bounds.x, bounds.y, true);
if (underlined) {
int descent = gc.getFontMetrics().getDescent();
int lineY = bounds.y + textHeight - descent + 1;
gc.drawLine(bounds.x, lineY, bounds.x + textWidth, lineY);
}
}
}
protected Point computeTextSize(int wHint, int hHint) {
Point extent;
GC gc = new GC(this);
gc.setFont(getFont());
if ((getStyle() & SWT.WRAP) != 0 && wHint != SWT.DEFAULT) {
extent = FormUtil.computeWrapSize(gc, getText(), wHint);
} else {
extent = gc.textExtent(getText());
}
gc.dispose();
return extent;
}
}