How to tell if a UIWindowMgr is handling an event

I’ve taken some code from the demoes for handling events:

UIEventAdapter eventAdapter = new UIEventAdapter(windowMgr);
canvas.get3DPeer().getComponent().addKeyListener(eventAdapter);
canvas.get3DPeer().getComponent().addMouseListener(eventAdapter);
canvas.get3DPeer().getComponent().addMouseMotionListener(eventAdapter);
canvas.get3DPeer().getComponent().setFocusable(true);

        Toolkit.getDefaultToolkit().addAWTEventListener(
              new EventListener(),   AWTEvent.KEY_EVENT_MASK
                                             | AWTEvent.MOUSE_EVENT_MASK
                                             | AWTEvent.MOUSE_MOTION_EVENT_MASK);

In the
public void mouseDragged(MouseEvent e)
{
}
method how would you determine if the UIWindowManager of a UIWindow is processing the event?

Thanks,

Jason

So, I’ve got 1 object in the scene that I want to be able to rotate with my mouse, but I also want to manipulate the object in other ways with some JSliders.

The following code:
Toolkit.getDefaultToolkit().addAWTEventListener(
new EventListener(), AWTEvent.KEY_EVENT_MASK
| AWTEvent.MOUSE_EVENT_MASK
| AWTEvent.MOUSE_MOTION_EVENT_MASK);

and
class EventListener implements AWTEventListener{
public void eventDispatched(AWTEvent event)
{
if(event instanceof MouseEvent)
{
MouseEvent e = (MouseEvent) event;
switch(e.getID())
{
case MouseEvent.MOUSE_DRAGGED: mouseDragged(e); break;

and
public void mouseDragged(MouseEvent e){

handles mouse drags and rotates the object, but if a UIWindow is also in the scene:

UIEventAdapter eventAdapter = new UIEventAdapter(windowMgr);
canvas.get3DPeer().getComponent().addMouseMotionListener(eventAdapter);

Then the mouseDragged method will get called twice. With one of the calls, e.getPoint() gives you a point relative to the canvas, and with the other call, e.getPoint() gives you a point relative to the UIWindow, and this can really mess up rotating the object!

Here’s an idea for the Xith3D API that would really help out:

Create a UIWindowMouseEvent class that extends the MouseEvent class.

Add a UIWindow field, and when the MouseEvent is created, set the UIWindow of the window that is currently handling the event.

That way in the mouseDragged(MouseEvent e)
method you can test if the mouseEvent is generated by a UIWindow

if( e instanceof UIWindowMouseEvent)
{

}

and you can also determine which UIWindow the event goes to in case you’re interested. Is this a good idea for an enhancement?

But I do have a hack that I think works for the meantime, so please help me if you have less of an ugly hack that works better.

Basically you store the previous mouse drag event and test to see if the new event’s component is the same as the previous event, and if it isn’t then you know the mouse is being dragged over a UIWindow and you can set a boolean. But if it is the same component and the mouseOverUIWindow variable hasn’t been set then you can forward the event to rotate the object.

protected MouseEvent m_previousMouseDragEvent = null;
protected boolean m_mouseOverUIWindow = false;
public void mouseDragged(MouseEvent e)
{
if(m_previousMouseDragEvent != null)
{
if(e.getComponent() == m_previousMouseDragEvent.getComponent())
{
if(!m_mouseOverUIWindow)
{
switch(e.getModifiers())
{
case MouseEvent.BUTTON1_MASK: leftMouseButtonDrag(e); break;
case MouseEvent.BUTTON2_MASK: middleMouseButtonDrag(e); break;
case MouseEvent.BUTTON3_MASK: rightMouseButtonDrag(e); break;
}
}
m_mouseOverUIWindow = false;
}
else
{
m_mouseOverUIWindow = true;
}
}
m_previousMouseDragEvent = e;
}

Another strategy is to see if the new event occured at the same time as the previous event. If it did then there’s a good chance that the mouse is being dragged over a UIWindow, but it still doesn’t guarantee it, so that doesn’t work.

Jason

One last thing to add to make it work correctly:

private void mouseReleased(MouseEvent e)
{
m_mouseOverUIWindow = true;
}

This prevents the object from rotating briefly if the user is using the JSliders.

Jason