/*******************************************************************************
* 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
* Exadel, Inc.
* Red Hat, Inc.
*******************************************************************************/
package org.jboss.tools.common.model.ui.widgets.xpl;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.Accessible;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleControlAdapter;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TypedListener;
public class SelectableFormLabel extends FormLabel {
private boolean hasFocus;
private Color passiveColor;
private Color activeColor;
private Color disabledColor;
private Cursor activeCursor;
boolean hover=false; //WARNING: never used
private boolean oldUnderlined;
public boolean getSelection() {
return hasFocus;
}
//public boolean setFocus () {
// hasFocus = Boolean.TRUE.booleanValue();
// return hasFocus;
//}
/**
* Constructor for SelectableFormLabel
*/
public SelectableFormLabel(Composite parent, int style) {
super(parent, style);
setUnderlined(Boolean.TRUE.booleanValue());
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.character == '\r') {
// Activation
notifyListeners(SWT.DefaultSelection);
}
}
});
addListener(SWT.Traverse, new Listener () {
public void handleEvent(Event e) {
switch (e.detail) {
case SWT.TRAVERSE_PAGE_NEXT:
case SWT.TRAVERSE_PAGE_PREVIOUS:
case SWT.TRAVERSE_ARROW_NEXT:
case SWT.TRAVERSE_ARROW_PREVIOUS:
case SWT.TRAVERSE_RETURN:
e.doit = false;
return;
}
e.doit = true;
}
});
addMouseListener(new MouseListener(){
public void mouseDoubleClick(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
if (!hasFocus) {
hasFocus=true;
//notifyListeners(SWT.Selection);
redraw();
}
}
public void mouseUp(MouseEvent e) {
if (hasFocus) {
hasFocus=false;
notifyListeners(SWT.Selection);
if(!SelectableFormLabel.this.isDisposed()) {
redraw();
}
}
}
});
addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (!hasFocus) {
hasFocus=true;
notifyListeners(SWT.Selection);
redraw();
}
}
public void focusLost(FocusEvent e) {
if (hasFocus) {
hasFocus=false;
notifyListeners(SWT.Selection);
redraw();
}
}
});
addMouseTrackListener(new MouseTrackAdapter() {
public void mouseEnter(MouseEvent e) {
hover = true;
setForeground(activeColor);
if (activeCursor!=null)
setCursor(activeCursor);
redraw();
}
public void mouseExit(MouseEvent e) {
hover = false;
setForeground(passiveColor);
if (activeCursor!=null)
setCursor(null);
redraw();
}
});
marginWidth = 1;
marginHeight = 1;
}
protected void initAccessible() {
Accessible accessible = getAccessible();
accessible.addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = getText();
}
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_PUSHBUTTON;
}
public void getState(AccessibleControlEvent e) {
e.detail = SelectableFormLabel.this.getSelection()?ACC.STATE_SELECTED:ACC.STATE_NORMAL;
}
});
}
private void notifyListeners(int eventType) {
Event event = new Event();
event.type = eventType;
event.widget = this;
notifyListeners(eventType, event);
}
protected void paint(PaintEvent e) {
super.paint(e);
if (hasFocus) {
GC gc = e.gc;
Point size = getSize();
gc.setForeground(getForeground());
gc.drawFocus(0, 0, size.x, size.y);
}
}
public void addSelectionListener(SelectionListener listener) {
checkWidget ();
if (listener == null) return;
TypedListener typedListener = new TypedListener (listener);
addListener (SWT.Selection,typedListener);
addListener (SWT.DefaultSelection,typedListener);
}
public void removeSelectionListener(SelectionListener listener) {
checkWidget ();
if (listener == null) return;
removeListener (SWT.Selection, listener);
removeListener (SWT.DefaultSelection, listener);
}
public void setActiveCursor(Cursor cursor) {
activeCursor = cursor;
}
public void setActiveColor(Color color) {
activeColor = color;
}
public void setPassiveColor(Color color) {
passiveColor = color;
// by default
setForeground(color);
}
public Color getDisabledColor() {
return disabledColor;
}
public void setDisabledColor(Color color) {
disabledColor = color;
}
public void setEnabled(boolean enabled) {
if (isEnabled()) {
oldUnderlined = isUnderlined();
}
super.setEnabled(enabled);
if (enabled) {
this.setForeground(this.passiveColor);
this.setUnderlined(oldUnderlined);
this.setCursor(this.activeCursor);
} else {
if (disabledColor!=null)
this.setForeground(disabledColor);
else
this.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
this.setUnderlined(Boolean.FALSE.booleanValue());
this.setCursor(null);
}
this.redraw();
}
/*
private boolean active;
public boolean isActive() {
return active;
}
public void setActive(boolean b) {
active = b;
}
*/
}