/**
*
*/
package com.aelitis.azureus.ui.swt.skin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.*;
/**
* @author TuxPaper
* @created Jun 8, 2006
*
*/
public class SWTSkinImageChanger
implements Listener
{
private final static boolean DEBUG = false;
private final String suffix;
private final int eventOn;
private final int eventOff;
private Control lastControl;
/**
* Default Constructor
*
* @param suffix
* @param eventOff
* @param eventOn
*/
public SWTSkinImageChanger(String suffix, int eventOn, int eventOff) {
this.suffix = suffix;
this.eventOn = eventOn;
this.eventOff = eventOff;
}
public void handleEvent(Event event) {
Control control = (Control) event.widget;
if (control == null) {
return;
}
//System.out.println("event " + event.type + ";" + control.handle);
try {
boolean isExit = event.type == SWT.MouseExit
|| event.type == SWT.Deactivate;
if (isExit && lastControl != null) {
if (control.getParent() == lastControl) {
if (DEBUG) {
System.out.println("skip because parent is last control");
}
return;
}
}
SWTSkinObject skinObject = (SWTSkinObject) control.getData("SkinObject");
if (skinObject != null && (DEBUG || skinObject.isDebug())) {
System.out.println("exit " + skinObject);
}
if (isExit && (skinObject instanceof SWTSkinObjectContainer)) {
// check if exiting and going into child
SWTSkinObjectContainer soContainer = (SWTSkinObjectContainer) skinObject;
if (soContainer.getPropogation()) {
Point pt = control.toDisplay(event.x, event.y);
Composite composite = soContainer.getComposite();
Point relPt = composite.toControl(pt);
// mouse exit and enter happens on client area (not full widget area)
Rectangle bounds = composite.getClientArea();
if (bounds.contains(relPt)
&& composite.getDisplay().getActiveShell() != null) {
if (skinObject != null && (DEBUG || skinObject.isDebug())) {
System.out.println("skip " + skinObject
+ " because going into child");
}
return;
}
}
}
if (isExit && control.getParent() != null) {
// check if exiting and going into parent
Composite parent = control.getParent();
SWTSkinObject soParent = (SWTSkinObject) parent.getData("SkinObject");
if (soParent != null && (soParent instanceof SWTSkinObjectContainer)) {
SWTSkinObjectContainer container = (SWTSkinObjectContainer) soParent;
if (container.getPropogation()) {
Point pt = control.toDisplay(event.x, event.y);
Point relPt = container.getComposite().toControl(pt);
Rectangle bounds = parent.getClientArea();
if (bounds.contains(relPt)
&& parent.getDisplay().getActiveShell() != null) {
if (skinObject != null && (DEBUG || skinObject.isDebug())) {
System.out.println("skip " + skinObject
+ " because going into parent " + bounds + ";" + relPt + ";" + parent.getDisplay().getActiveShell());
}
// XXX Disabled for now as it doesn't always work
//return;
}
}
}
}
if (skinObject != null) {
String sSuffix = (event.type == eventOn) ? suffix : "";
if (skinObject != null && (DEBUG || skinObject.isDebug())) {
System.out.println(System.currentTimeMillis() + ": " + skinObject
+ "--" + sSuffix);
}
Point ptMouse = control.toDisplay(0, 0);
while (skinObject != null) {
Rectangle bounds = skinObject.getControl().getBounds();
Point pt = skinObject.getControl().toDisplay(0, 0);
bounds.x = pt.x;
bounds.y = pt.y;
if (bounds.contains(ptMouse)) {
skinObject.switchSuffix(sSuffix, 2, false, false);
skinObject = skinObject.getParent();
} else {
break;
}
}
}
} finally {
lastControl = control;
}
}
}