blob: 031aef6aa5ae7ec8240d72896176960cce25ba7c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.ui.forms.internal;
import java.util.Enumeration;
import java.util.Hashtable;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
public class HyperlinkHandler
extends HyperlinkSettings
implements MouseListener, MouseTrackListener, SelectionListener, PaintListener {
private Hashtable hyperlinkListeners;
private Control lastActivated;
private Control lastEntered;
public HyperlinkHandler() {
hyperlinkListeners = new Hashtable();
}
public Control getLastLink() {
return lastActivated;
}
public void mouseDoubleClick(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
if (e.button == 1)
return;
lastActivated = (Control) e.widget;
}
public void mouseEnter(MouseEvent e) {
Control control = (Control) e.widget;
linkEntered(control);
}
public void mouseExit(MouseEvent e) {
Control control = (Control) e.widget;
linkExited(control);
}
public void mouseHover(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
if (e.button != 1)
return;
Control linkControl = (Control) e.widget;
Point size = linkControl.getSize();
// Filter out mouse up events outside
// the link. This can happen when mouse is
// clicked, dragged outside the link, then
// released.
if (e.x < 0)
return;
if (e.y < 0)
return;
if (e.x >= size.x)
return;
if (e.y >= size.y)
return;
linkActivated(linkControl);
}
public void widgetDefaultSelected(SelectionEvent e) {
Control link = (Control) e.widget;
linkActivated(link);
}
public void widgetSelected(SelectionEvent e) {
Control link = (Control) e.widget;
SelectableFormLabel l = (SelectableFormLabel) link;
if (l.getSelection())
linkEntered(link);
else
linkExited(link);
}
private void linkActivated(Control link) {
IHyperlinkListener action =
(IHyperlinkListener) hyperlinkListeners.get(link);
if (action != null) {
link.setCursor(getBusyCursor());
action.linkActivated(link);
if (!link.isDisposed())
link.setCursor(
isHyperlinkCursorUsed() ? getHyperlinkCursor() : null);
}
}
private void linkEntered(Control link) {
if (lastEntered != null
&& lastEntered instanceof SelectableFormLabel) {
SelectableFormLabel fl = (SelectableFormLabel) lastEntered;
linkExited(fl);
}
if (isHyperlinkCursorUsed())
link.setCursor(getHyperlinkCursor());
if (activeBackground != null)
link.setBackground(activeBackground);
if (activeForeground != null)
link.setForeground(activeForeground);
if (hyperlinkUnderlineMode == UNDERLINE_ROLLOVER)
underline(link, true);
IHyperlinkListener action =
(IHyperlinkListener) hyperlinkListeners.get(link);
if (action != null)
action.linkEntered(link);
lastEntered = link;
}
private void linkExited(Control link) {
if (isHyperlinkCursorUsed())
link.setCursor(null);
if (hyperlinkUnderlineMode == UNDERLINE_ROLLOVER)
underline(link, false);
if (background != null)
link.setBackground(background);
if (foreground != null)
link.setForeground(foreground);
IHyperlinkListener action =
(IHyperlinkListener) hyperlinkListeners.get(link);
if (action != null)
action.linkExited(link);
if (lastEntered == link)
lastEntered = null;
}
public void paintControl(PaintEvent e) {
Control label = (Control) e.widget;
if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
HyperlinkHandler.underline(label, true);
}
public void registerHyperlink(
Control control,
IHyperlinkListener listener) {
if (background != null)
control.setBackground(background);
if (foreground != null)
control.setForeground(foreground);
control.addMouseListener(this);
control.addMouseTrackListener(this);
if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS
&& control instanceof Label)
control.addPaintListener(this);
if (control instanceof SelectableFormLabel) {
SelectableFormLabel sl = (SelectableFormLabel) control;
sl.addSelectionListener(this);
if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
sl.setUnderlined(true);
}
hyperlinkListeners.put(control, listener);
removeDisposedLinks();
}
private void removeDisposedLinks() {
for (Enumeration keys = hyperlinkListeners.keys();
keys.hasMoreElements();
) {
Control control = (Control) keys.nextElement();
if (control.isDisposed()) {
hyperlinkListeners.remove(control);
}
}
}
public void reset() {
hyperlinkListeners.clear();
}
public static void underline(Control control, boolean inside) {
if (control instanceof SelectableFormLabel) {
SelectableFormLabel l = (SelectableFormLabel) control;
l.setUnderlined(inside);
l.redraw();
return;
}
if (!(control instanceof Label))
return;
Composite parent = control.getParent();
Rectangle bounds = control.getBounds();
GC gc = new GC(parent);
Color color =
inside ? control.getForeground() : control.getBackground();
gc.setForeground(color);
int y = bounds.y + bounds.height;
gc.drawLine(bounds.x, y, bounds.x + bounds.width, y);
gc.dispose();
}
public void setForeground(Color color) {
super.setForeground(color);
removeDisposedLinks();
for (Enumeration links = hyperlinkListeners.keys();
links.hasMoreElements();
) {
Control control = (Control) links.nextElement();
control.setForeground(color);
}
}
}