/******************************************************************************* * 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.forms; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.*; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.internal.widgets.IHyperlinkAdapter; import org.eclipse.ui.forms.widgets.Hyperlink; /** * Manages a group of hyperlinks. It tracks activation, updates normal and * active colors and updates underline state depending on the underline * preference. Hyperlink labels are added to the group after creation and are * automatically removed from the group when they are disposed. * * @since 1.0 */ public final class HyperlinkGroup extends HyperlinkSettings { private ArrayList links = new ArrayList(); private Hyperlink lastActivated; // private Hyperlink lastEntered; private GroupListener listener; // private boolean isActiveBackgroundSet; // private boolean isActiveForegroundSet; private boolean isBackgroundSet; private boolean isForegroundSet; private class GroupListener implements Listener, IHyperlinkListener { // private Color previousBackground; // private Color previousForeground; public void handleEvent(Event e) { switch (e.type) { // case SWT.MouseEnter : // onMouseEnter(e); // break; // case SWT.MouseExit : // onMouseExit(e); // break; // case SWT.MouseDown : // onMouseDown(e); // break; case SWT.Dispose : unhook((Hyperlink) e.widget); break; } } // private void onMouseEnter(Event e) { // Hyperlink link = (Hyperlink) e.widget; // previousBackground = link.getBackground(); // previousForeground = link.getForeground(); // if (isActiveBackgroundSet) // link.setBackground(getActiveBackground()); // if (isActiveForegroundSet) // link.setForeground(getActiveForeground()); // if (getHyperlinkUnderlineMode() == UNDERLINE_HOVER) // link.setUnderlined(true); // link.setCursor(getHyperlinkCursor()); // } // private void onMouseExit(Event e) { // Hyperlink link = (Hyperlink) e.widget; // if (isActiveBackgroundSet) // link.setBackground(previousBackground); // if (isActiveForegroundSet) // link.setForeground(previousForeground); // if (getHyperlinkUnderlineMode() == UNDERLINE_HOVER) // link.setUnderlined(false); // } public void linkActivated(HyperlinkEvent e) { } public void linkEntered(HyperlinkEvent e) { // Hyperlink link = (Hyperlink) e.widget; // if (lastEntered != null) { // linkExited(lastEntered); // } // lastEntered = link; } public void linkExited(HyperlinkEvent e) { // linkExited((Hyperlink) e.widget); } // private void linkExited(Hyperlink link) { // link.setCursor(null); // if (lastEntered == link) // lastEntered = null; // } } /** * Creates a hyperlink group. */ public HyperlinkGroup(Display display) { super(display); listener = new GroupListener(); } /** * Returns the link that has been active the last, or <code>null</code> * if no link has been active yet or the last active link has been * disposed. * * @return the last active link or <code>null</code> */ public Hyperlink getLastActivated() { return lastActivated; } /** * Adds a hyperlink to the group to be jointly managed. Hyperlink will be * managed until it is disposed. Settings like colors, cursors and modes * will affect all managed hyperlinks. * * @param link */ public void add(Hyperlink link) { if (isBackgroundSet) link.setBackground(getBackground()); if (isForegroundSet) link.setForeground(getForeground()); if (getHyperlinkUnderlineMode() == UNDERLINE_ALWAYS) link.setUnderlined(true); hook(link); // XXX RAP Specific updateActiveColors(); // XXX End RAP Specific } /** * Sets the new active hyperlink background for all the links. * * @param newActiveBackground * the new active background */ public void setActiveBackground(Color newActiveBackground) { super.setActiveBackground(newActiveBackground); // isActiveBackgroundSet = true; // Begin RAP specific updateActiveColors(); // End RAP specific } /** * Sets the new active hyperlink foreground for all the links. * * @param newActiveForeground * the new active foreground */ public void setActiveForeground(Color newActiveForeground) { super.setActiveForeground(newActiveForeground); // isActiveForegroundSet = true; // Begin RAP specific updateActiveColors(); // End RAP specific } // Begin RAP specific private void updateActiveColors() { if( links != null ) { Hyperlink[] hyperlinks = new Hyperlink[ links.size() ]; links.toArray( hyperlinks ); for( int i = 0; i < hyperlinks.length; i++ ) { updateActiveColors( hyperlinks[ i ] ); } } } private void updateActiveColors( final Hyperlink link ) { Object adapter = link.getAdapter( IHyperlinkAdapter.class ); IHyperlinkAdapter hyperlinkAdapter = ( IHyperlinkAdapter )adapter; hyperlinkAdapter.setActiveForeground( getActiveForeground() ); hyperlinkAdapter.setActiveBackground( getActiveBackground() ); } // End RAP specific /** * Sets the group background and also sets the background of all the * currently managed links. * * @param bg * the new background */ public void setBackground(Color bg) { super.setBackground(bg); isBackgroundSet = true; if (links != null) { for (int i = 0; i < links.size(); i++) { Hyperlink label = (Hyperlink) links.get(i); label.setBackground(bg); } } } /** * Sets the group foreground and also sets the background of all the * currently managed links. * * @param fg * the new foreground */ public void setForeground(Color fg) { super.setForeground(fg); isForegroundSet = true; if (links != null) { for (int i = 0; i < links.size(); i++) { Hyperlink label = (Hyperlink) links.get(i); label.setForeground(fg); } } } /** * Sets the hyperlink underline mode. * * @param mode * the new hyperlink underline mode * @see HyperlinkSettings */ public void setHyperlinkUnderlineMode(int mode) { super.setHyperlinkUnderlineMode(mode); if (links != null) { for (int i = 0; i < links.size(); i++) { Hyperlink label = (Hyperlink) links.get(i); label.setUnderlined(mode == UNDERLINE_ALWAYS); } } } private void hook(Hyperlink link) { // link.addListener(SWT.MouseDown, listener); link.addHyperlinkListener(listener); link.addListener(SWT.Dispose, listener); // link.addListener(SWT.MouseEnter, listener); // link.addListener(SWT.MouseExit, listener); links.add(link); } private void unhook(Hyperlink link) { // link.removeListener(SWT.MouseDown, listener); link.removeHyperlinkListener(listener); // link.removeListener(SWT.MouseEnter, listener); // link.removeListener(SWT.MouseExit, listener); if (lastActivated == link) lastActivated = null; // if (lastEntered == link) // lastEntered = null; links.remove(link); } // private void onMouseDown(Event e) { // if (e.button == 1) // return; // lastActivated = (Hyperlink) e.widget; // } }