This checkin enables MouseListener functionality. You can add a
MouseListener to the EventRegistration or BrowserControlCanvas and be notified of events on the browser canvas. You can snoop for onMouseOver information such as links. Next step is to cvs remove unused classes relating to mouse events, for example WCMouseListenerImpl and WCEventListenerWrapper. A webclient/test/automated/src/classes/org/mozilla/webclient/MouseListenerTest.java - exercise mouseListener added to BrowserControlCanvas and to EventRegistration. M webclient/build-tests.xml - hook up new test M webclient/classes_spec/org/mozilla/webclient/BrowserControlCanvas.java - enable adding the MouseListener from here. M webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java - absorb the functionality of WCMouseListenerImpl. Also need to remove WCEventListenerWrapper. - deal with MouseEvents. - refactor BrowserToJavaEventPump.run() to handle mouse listeners M webclient/src_moz/EmbedEventListener.cpp M webclient/src_moz/EmbedEventListener.h - absorb functionality from CBrowserContainer relating to mouse events. M webclient/src_moz/NativeBrowserControl.cpp - set the EventRegistration into the EmbedEventListener instance. M webclient/test/manual/src/classes/org/mozilla/webclient/test/TestBrowser.java - add mouseover url updating to status bar. git-svn-id: svn://10.0.0.236/trunk@164481 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -32,6 +32,7 @@ import org.mozilla.util.Log;
|
||||
import org.mozilla.util.ParameterCheck;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -52,7 +53,7 @@ import java.awt.*;
|
||||
|
||||
* See concrete subclasses for scope info.
|
||||
|
||||
* @version $Id: BrowserControlCanvas.java,v 1.7 2004-04-20 16:17:41 edburns%acm.org Exp $
|
||||
* @version $Id: BrowserControlCanvas.java,v 1.8 2004-10-27 01:33:56 edburns%acm.org Exp $
|
||||
|
||||
* @see org.mozilla.webclient.win32.Win32BrowserControlCanvas
|
||||
|
||||
@@ -272,6 +273,34 @@ public void setVisible(boolean b) {
|
||||
super.setVisible(b);
|
||||
}
|
||||
|
||||
public void addMouseListener(MouseListener listener) {
|
||||
try {
|
||||
EventRegistration er = (EventRegistration)
|
||||
webShell.queryInterface(BrowserControl.EVENT_REGISTRATION_NAME);
|
||||
er.addMouseListener(listener);
|
||||
}
|
||||
catch(Exception ex) {
|
||||
System.out.println("Can't addMouseListener(" + listener + ") " +
|
||||
ex.getMessage());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void removeMouseListener(MouseListener listener) {
|
||||
try {
|
||||
EventRegistration er = (EventRegistration)
|
||||
webShell.queryInterface(BrowserControl.EVENT_REGISTRATION_NAME);
|
||||
er.removeMouseListener(listener);
|
||||
}
|
||||
catch(Exception ex) {
|
||||
System.out.println("Can't removeMouseListener(" + listener + ") " +
|
||||
ex.getMessage());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // class BrowserControlCanvas
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,12 @@ import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.Collection;
|
||||
import java.util.Properties;
|
||||
import java.util.EventObject;
|
||||
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.Component;
|
||||
|
||||
import org.mozilla.webclient.BrowserControl;
|
||||
import org.mozilla.webclient.BrowserControlCanvas;
|
||||
@@ -45,6 +51,7 @@ import org.mozilla.webclient.NewWindowEvent;
|
||||
import org.mozilla.webclient.NewWindowListener;
|
||||
import java.awt.event.MouseListener;
|
||||
import org.mozilla.webclient.WebclientEvent;
|
||||
import org.mozilla.webclient.WCMouseEvent;
|
||||
import org.mozilla.webclient.WebclientEventListener;
|
||||
import org.mozilla.webclient.UnimplementedException;
|
||||
|
||||
@@ -70,6 +77,8 @@ public class EventRegistrationImpl extends ImplObjectNative implements EventRegi
|
||||
|
||||
private List documentLoadListeners;
|
||||
|
||||
private List mouseListeners;
|
||||
|
||||
private BrowserToJavaEventPump eventPump = null;
|
||||
|
||||
private static int instanceCount = 0;
|
||||
@@ -92,12 +101,17 @@ public EventRegistrationImpl(WrapperFactory yourFactory,
|
||||
}
|
||||
|
||||
documentLoadListeners = new ArrayList();
|
||||
mouseListeners = new ArrayList();
|
||||
eventPump = new BrowserToJavaEventPump(instanceCount++);
|
||||
eventPump.start();
|
||||
}
|
||||
|
||||
public void delete()
|
||||
{
|
||||
documentLoadListeners.clear();
|
||||
documentLoadListeners = null;
|
||||
mouseListeners.clear();
|
||||
mouseListeners = null;
|
||||
super.delete();
|
||||
eventPump.stopRunning();
|
||||
}
|
||||
@@ -159,31 +173,9 @@ public void addMouseListener(MouseListener listener)
|
||||
{
|
||||
ParameterCheck.nonNull(listener);
|
||||
getWrapperFactory().verifyInitialized();
|
||||
Assert.assert_it(-1 != getNativeBrowserControl());
|
||||
ParameterCheck.nonNull(listener);
|
||||
|
||||
// We have to wrap the user provided java.awt.event.MouseListener
|
||||
// instance in a custom WebclientEventListener subclass that also
|
||||
// implements java.awt.event.MouseListener. See WCMouseListener for
|
||||
// more information.
|
||||
|
||||
WCMouseListenerImpl mouseListenerWrapper =
|
||||
new WCMouseListenerImpl(listener);
|
||||
|
||||
if (null == mouseListenerWrapper) {
|
||||
throw new NullPointerException("Can't instantiate WCMouseListenerImpl, out of memory.");
|
||||
}
|
||||
|
||||
WCEventListenerWrapper listenerWrapper =
|
||||
new WCEventListenerWrapper(mouseListenerWrapper,
|
||||
MouseListener.class.getName());
|
||||
|
||||
if (null == listenerWrapper) {
|
||||
throw new NullPointerException("Can't instantiate WCEventListenerWrapper, out of memory.");
|
||||
}
|
||||
|
||||
synchronized(getBrowserControl()) {
|
||||
// PENDING nativeEventThread.addListener(listenerWrapper);
|
||||
|
||||
synchronized(mouseListeners) {
|
||||
mouseListeners.add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,26 +183,9 @@ public void removeMouseListener(MouseListener listener)
|
||||
{
|
||||
ParameterCheck.nonNull(listener);
|
||||
getWrapperFactory().verifyInitialized();
|
||||
Assert.assert_it(-1 != getNativeBrowserControl());
|
||||
ParameterCheck.nonNull(listener);
|
||||
|
||||
WCMouseListenerImpl mouseListenerWrapper =
|
||||
new WCMouseListenerImpl(listener);
|
||||
|
||||
if (null == mouseListenerWrapper) {
|
||||
throw new NullPointerException("Can't instantiate WCMouseListenerImpl, out of memory.");
|
||||
}
|
||||
|
||||
WCEventListenerWrapper listenerWrapper =
|
||||
new WCEventListenerWrapper(mouseListenerWrapper,
|
||||
MouseListener.class.getName());
|
||||
|
||||
if (null == listenerWrapper) {
|
||||
throw new NullPointerException("Can't instantiate WCEventListenerWrapper, out of memory.");
|
||||
}
|
||||
|
||||
synchronized(getBrowserControl()) {
|
||||
// PENDING nativeEventThread.removeListener(listenerWrapper);
|
||||
|
||||
synchronized(mouseListeners) {
|
||||
mouseListeners.remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,7 +241,7 @@ void nativeEventOccurred(String targetClassName, long eventType,
|
||||
{
|
||||
ParameterCheck.nonNull(targetClassName);
|
||||
|
||||
WebclientEvent event = null;
|
||||
EventObject event = null;
|
||||
|
||||
if (DocumentLoadListener.class.getName().equals(targetClassName)) {
|
||||
event = new DocumentLoadEvent(this, eventType,
|
||||
@@ -274,14 +249,7 @@ void nativeEventOccurred(String targetClassName, long eventType,
|
||||
eventData);
|
||||
}
|
||||
else if (MouseListener.class.getName().equals(targetClassName)) {
|
||||
// We create a plain vanilla WebclientEvent, which the
|
||||
// WCMouseListenerImpl target knows how to deal with.
|
||||
|
||||
// Also, the source happens to be the browserControlCanvas
|
||||
// to satisfy the java.awt.event.MouseEvent's requirement
|
||||
// that the source be a java.awt.Component subclass.
|
||||
|
||||
event = new WebclientEvent(browserControlCanvas, eventType, eventData);
|
||||
event = createMouseEvent(eventType, eventData);
|
||||
}
|
||||
else if (NewWindowListener.class.getName().equals(targetClassName)) {
|
||||
event = new NewWindowEvent(this, eventType, eventData);
|
||||
@@ -292,6 +260,97 @@ void nativeEventOccurred(String targetClassName, long eventType,
|
||||
eventPump.V();
|
||||
}
|
||||
|
||||
private EventObject createMouseEvent(long eventType, Object eventData) {
|
||||
WCMouseEvent mouseEvent = null;
|
||||
Properties props = (Properties) eventData;
|
||||
int modifiers = 0, x = -1, y = -1, clickCount = 0;
|
||||
String str;
|
||||
boolean bool;
|
||||
if (null != props) {
|
||||
if (null != (str = props.getProperty("ClientX"))) {
|
||||
x = Integer.valueOf(str).intValue();
|
||||
}
|
||||
if (null != (str = props.getProperty("ClientY"))) {
|
||||
y = Integer.valueOf(str).intValue();
|
||||
}
|
||||
if (null != (str = props.getProperty("ClickCount"))) {
|
||||
clickCount = Integer.valueOf(str).intValue();
|
||||
}
|
||||
if (null != (str = props.getProperty("Button"))) {
|
||||
int button = Integer.valueOf(str).intValue();
|
||||
if (1 == button) {
|
||||
modifiers += InputEvent.BUTTON1_MASK;
|
||||
}
|
||||
if (2 == button) {
|
||||
modifiers += InputEvent.BUTTON2_MASK;
|
||||
}
|
||||
if (3 == button) {
|
||||
modifiers += InputEvent.BUTTON3_MASK;
|
||||
}
|
||||
}
|
||||
if (null != (str = props.getProperty("Alt"))) {
|
||||
bool = Boolean.valueOf(str).booleanValue();
|
||||
if (bool) {
|
||||
modifiers += InputEvent.ALT_MASK;
|
||||
}
|
||||
}
|
||||
if (null != (str = props.getProperty("Ctrl"))) {
|
||||
bool = Boolean.valueOf(str).booleanValue();
|
||||
if (bool) {
|
||||
modifiers += InputEvent.CTRL_MASK;
|
||||
}
|
||||
}
|
||||
if (null != (str = props.getProperty("Meta"))) {
|
||||
bool = Boolean.valueOf(str).booleanValue();
|
||||
if (bool) {
|
||||
modifiers += InputEvent.META_MASK;
|
||||
}
|
||||
}
|
||||
if (null != (str = props.getProperty("Shift"))) {
|
||||
bool = Boolean.valueOf(str).booleanValue();
|
||||
if (bool) {
|
||||
modifiers += InputEvent.SHIFT_MASK;
|
||||
}
|
||||
}
|
||||
}
|
||||
WebclientEvent event = new WebclientEvent(browserControlCanvas, eventType,
|
||||
eventData);
|
||||
switch ((int) eventType) {
|
||||
case (int) WCMouseEvent.MOUSE_DOWN_EVENT_MASK:
|
||||
mouseEvent =
|
||||
new WCMouseEvent((Component) browserControlCanvas,
|
||||
MouseEvent.MOUSE_PRESSED, -1,
|
||||
modifiers, x, y, clickCount, false, event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_UP_EVENT_MASK:
|
||||
mouseEvent =
|
||||
new WCMouseEvent((Component) browserControlCanvas,
|
||||
MouseEvent.MOUSE_RELEASED, -1,
|
||||
modifiers, x, y, clickCount, false, event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_CLICK_EVENT_MASK:
|
||||
case (int) WCMouseEvent.MOUSE_DOUBLE_CLICK_EVENT_MASK:
|
||||
mouseEvent =
|
||||
new WCMouseEvent((Component) browserControlCanvas,
|
||||
MouseEvent.MOUSE_CLICKED, -1,
|
||||
modifiers, x, y, clickCount, false, event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_OVER_EVENT_MASK:
|
||||
mouseEvent =
|
||||
new WCMouseEvent((Component) browserControlCanvas,
|
||||
MouseEvent.MOUSE_ENTERED, -1,
|
||||
modifiers, x, y, clickCount, false, event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_OUT_EVENT_MASK:
|
||||
mouseEvent =
|
||||
new WCMouseEvent((Component) browserControlCanvas,
|
||||
MouseEvent.MOUSE_EXITED, -1,
|
||||
modifiers, x, y, clickCount, false, event);
|
||||
break;
|
||||
}
|
||||
return mouseEvent;
|
||||
}
|
||||
|
||||
private native void nativeSetCapturePageInfo(int webShellPtr,
|
||||
boolean newState);
|
||||
|
||||
@@ -324,7 +383,7 @@ public class BrowserToJavaEventPump extends Thread {
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
public void queueEvent(WebclientEvent toQueue) {
|
||||
public void queueEvent(EventObject toQueue) {
|
||||
synchronized (eventsToJava) {
|
||||
eventsToJava.add(toQueue);
|
||||
}
|
||||
@@ -335,8 +394,9 @@ public class BrowserToJavaEventPump extends Thread {
|
||||
}
|
||||
|
||||
public void run() {
|
||||
WebclientEvent curEvent = null;
|
||||
EventObject curEvent = null;
|
||||
WebclientEventListener curListener = null;
|
||||
Object cur = null;
|
||||
List listeners = null;
|
||||
|
||||
while (keepRunning) {
|
||||
@@ -344,7 +404,7 @@ public class BrowserToJavaEventPump extends Thread {
|
||||
|
||||
synchronized(eventsToJava) {
|
||||
if (!eventsToJava.isEmpty()) {
|
||||
curEvent = (WebclientEvent) eventsToJava.remove(0);
|
||||
curEvent = (EventObject) eventsToJava.remove(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,15 +415,26 @@ public class BrowserToJavaEventPump extends Thread {
|
||||
if (curEvent instanceof DocumentLoadEvent) {
|
||||
listeners = EventRegistrationImpl.this.documentLoadListeners;
|
||||
}
|
||||
else if (curEvent instanceof MouseEvent) {
|
||||
listeners = EventRegistrationImpl.this.mouseListeners;
|
||||
}
|
||||
// else...
|
||||
|
||||
if (null != curEvent && null != listeners) {
|
||||
synchronized (listeners) {
|
||||
Iterator iter = listeners.iterator();
|
||||
while (iter.hasNext()) {
|
||||
curListener = (WebclientEventListener) iter.next();
|
||||
cur = iter.next();
|
||||
try {
|
||||
curListener.eventDispatched(curEvent);
|
||||
if (cur instanceof WebclientEventListener) {
|
||||
curListener = (WebclientEventListener) cur;
|
||||
curListener.eventDispatched((WebclientEvent) curEvent);
|
||||
}
|
||||
else if (cur instanceof MouseListener) {
|
||||
dispatchMouseEvent((MouseListener) cur,
|
||||
(WCMouseEvent) curEvent);
|
||||
}
|
||||
// else ...
|
||||
}
|
||||
catch (Throwable e) {
|
||||
System.out.println("Caught Execption calling listener: " + curListener + ". Exception: " + e + " " + e.getMessage());
|
||||
@@ -377,6 +448,28 @@ public class BrowserToJavaEventPump extends Thread {
|
||||
System.out.println(this.getName() + " exiting");
|
||||
}
|
||||
|
||||
private void dispatchMouseEvent(MouseListener listener,
|
||||
WCMouseEvent event) {
|
||||
switch ((int) event.getWebclientEvent().getType()) {
|
||||
case (int) WCMouseEvent.MOUSE_DOWN_EVENT_MASK:
|
||||
listener.mousePressed(event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_UP_EVENT_MASK:
|
||||
listener.mouseReleased(event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_CLICK_EVENT_MASK:
|
||||
case (int) WCMouseEvent.MOUSE_DOUBLE_CLICK_EVENT_MASK:
|
||||
listener.mouseClicked(event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_OVER_EVENT_MASK:
|
||||
listener.mouseEntered(event);
|
||||
break;
|
||||
case (int) WCMouseEvent.MOUSE_OUT_EVENT_MASK:
|
||||
listener.mouseExited(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} // end of class BrowserToJavaEventPump
|
||||
|
||||
class URIToStringMap extends Object implements Map {
|
||||
|
||||
Reference in New Issue
Block a user