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.
This commit is contained in:
edburns%acm.org 2004-10-27 01:33:57 +00:00
Родитель a027c18f87
Коммит 2f2f7c9a72
8 изменённых файлов: 875 добавлений и 130 удалений

Просмотреть файл

@ -161,6 +161,7 @@
<test name="org.mozilla.webclient.impl.WebclientFactoryImplTest"/>
<test name="org.mozilla.webclient.NavigationTest"/>
<test name="org.mozilla.webclient.HistoryTest"/>
<test name="org.mozilla.webclient.MouseListenerTest"/>
<test name="org.mozilla.webclient.DocumentLoadListenerTest"/>
<!-- non running
<test name="org.mozilla.webclient.wrapper_native.gtk.TestGtkBrowserControlCanvas"/>

Просмотреть файл

@ -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 {

Просмотреть файл

@ -21,21 +21,42 @@
#include <nsCOMPtr.h>
#include <nsIDOMMouseEvent.h>
#include <nsIDOMNamedNodeMap.h>
#include "nsIDOMKeyEvent.h"
#include "nsString.h"
#include "EmbedEventListener.h"
#include "NativeBrowserControl.h"
#include "ns_globals.h" // for prLogModuleInfo
#include "dom_util.h" // for dom_iterateToRoot
#include <stdlib.h>
EmbedEventListener::EmbedEventListener(void)
EmbedEventListener::EmbedEventListener(void) : mOwner(nsnull), mEventRegistration(nsnull), mProperties(nsnull), mInverseDepth(-1)
{
mOwner = nsnull;
if (-1 == DOMMouseListener_maskValues[0]) {
util_InitializeEventMaskValuesFromClass("org/mozilla/webclient/WCMouseEvent",
DOMMouseListener_maskNames,
DOMMouseListener_maskValues);
}
}
EmbedEventListener::~EmbedEventListener()
{
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
if (mProperties) {
::util_DeleteGlobalRef(env, mProperties);
}
if (mEventRegistration) {
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
::util_DeleteGlobalRef(env, mEventRegistration);
mEventRegistration = nsnull;
}
mInverseDepth = -1;
mOwner = nsnull;
}
NS_IMPL_ADDREF(EmbedEventListener)
@ -51,6 +72,7 @@ nsresult
EmbedEventListener::Init(NativeBrowserControl *aOwner)
{
mOwner = aOwner;
mProperties = nsnull;
return NS_OK;
}
@ -130,137 +152,458 @@ EmbedEventListener::KeyPress(nsIDOMEvent* aDOMEvent)
}
NS_IMETHODIMP
EmbedEventListener::MouseDown(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseDown(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// return FALSE to this function to mark this event as not
// consumed...
PRBool return_val = PR_FALSE;
/**************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_DOWN],
(void *)mouseEvent, &return_val);
***********/
PopulatePropertiesFromEvent(aMouseEvent);
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_DOWN_EVENT_MASK],
mProperties);
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
NS_IMETHODIMP
EmbedEventListener::MouseUp(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseUp(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// Return FALSE to this function to mark the event as not
// consumed...
PRBool return_val = PR_FALSE;
/**************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_UP],
(void *)mouseEvent, &return_val);
*************/
PopulatePropertiesFromEvent(aMouseEvent);
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_UP_EVENT_MASK],
mProperties);
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
NS_IMETHODIMP
EmbedEventListener::MouseClick(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseClick(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// Return FALSE to this function to mark the event as not
// consumed...
PRBool return_val = FALSE;
/****************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_CLICK],
(void *)mouseEvent, &return_val);
***********/
PopulatePropertiesFromEvent(aMouseEvent);
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
::util_StoreIntoPropertiesObject(env, mProperties, CLICK_COUNT_KEY,
ONE_VALUE, (jobject)
&(mOwner->GetWrapperFactory()->shareContext));
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_CLICK_EVENT_MASK],
mProperties);
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
NS_IMETHODIMP
EmbedEventListener::MouseDblClick(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseDblClick(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// return FALSE to this function to mark this event as not
// consumed...
PRBool return_val = PR_FALSE;
/***************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_DBL_CLICK],
(void *)mouseEvent, &return_val);
**********/
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
::util_StoreIntoPropertiesObject(env, mProperties, CLICK_COUNT_KEY,
TWO_VALUE, (jobject)
&(mOwner->GetWrapperFactory()->shareContext));
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_DOUBLE_CLICK_EVENT_MASK],
mProperties);
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
NS_IMETHODIMP
EmbedEventListener::MouseOver(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseOver(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// return FALSE to this function to mark this event as not
// consumed...
PRBool return_val = PR_FALSE;
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("EmbedEventListener::MouseOver: \n"));
PopulatePropertiesFromEvent(aMouseEvent);
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_OVER_EVENT_MASK],
mProperties);
/*************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_OVER],
(void *)mouseEvent, &return_val);
**********/
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
NS_IMETHODIMP
EmbedEventListener::MouseOut(nsIDOMEvent* aDOMEvent)
EmbedEventListener::MouseOut(nsIDOMEvent* aMouseEvent)
{
nsCOMPtr <nsIDOMMouseEvent> mouseEvent;
mouseEvent = do_QueryInterface(aDOMEvent);
if (!mouseEvent)
if (!aMouseEvent)
return NS_OK;
// return FALSE to this function to mark this event as not
// consumed...
PRBool return_val = PR_FALSE;
/************
gtk_signal_emit(GTK_OBJECT(mOwner->mOwningWidget),
moz_embed_signals[DOM_MOUSE_OUT],
(void *)mouseEvent, &return_val);
***********/
PopulatePropertiesFromEvent(aMouseEvent);
util_SendEventToJava(nsnull,
mEventRegistration,
MOUSE_LISTENER_CLASSNAME,
DOMMouseListener_maskValues[MOUSE_OUT_EVENT_MASK],
mProperties);
if (return_val) {
aDOMEvent->StopPropagation();
aDOMEvent->PreventDefault();
aMouseEvent->StopPropagation();
aMouseEvent->PreventDefault();
}
return NS_OK;
}
nsresult
EmbedEventListener::SetEventRegistration(jobject yourEventRegistration)
{
nsresult rv = NS_OK;
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
mEventRegistration = ::util_NewGlobalRef(env, yourEventRegistration);
if (nsnull == mEventRegistration) {
::util_ThrowExceptionToJava(env, "Exception: EmbedEventListener->SetEventRegistration(): can't create NewGlobalRef\n\tfor eventRegistration");
rv = NS_ERROR_FAILURE;
}
return rv;
}
nsresult EmbedEventListener::PopulatePropertiesFromEvent(nsIDOMEvent *event)
{
nsCOMPtr<nsIDOMEventTarget> eventTarget;
nsCOMPtr<nsIDOMNode> currentNode;
nsCOMPtr<nsIDOMEvent> aMouseEvent = event;
nsresult rv = NS_OK;;
rv = aMouseEvent->GetTarget(getter_AddRefs(eventTarget));
if (NS_FAILED(rv)) {
return rv;
}
currentNode = do_QueryInterface(eventTarget);
if (!currentNode) {
return rv;
}
mInverseDepth = 0;
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
if (mProperties) {
util_ClearPropertiesObject(env, mProperties, (jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
else {
if (!(mProperties =
util_CreatePropertiesObject(env, (jobject)
&(mOwner->GetWrapperFactory()->shareContext)))) {
return rv;
}
}
dom_iterateToRoot(currentNode, EmbedEventListener::takeActionOnNode,
(void *)this);
rv = addMouseEventDataToProperties(aMouseEvent);
return rv;
}
nsresult EmbedEventListener::addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent)
{
// if the initialization failed, don't modify the mProperties
if (!mProperties || !util_StringConstantsAreInitialized()) {
return NS_ERROR_INVALID_ARG;
}
nsresult rv;
// Add modifiers, keys, mouse buttons, etc, to the mProperties table
nsCOMPtr<nsIDOMMouseEvent> mouseEvent;
rv = aMouseEvent->QueryInterface(nsIDOMMouseEvent::GetIID(),
getter_AddRefs(mouseEvent));
if (NS_FAILED(rv)) {
return rv;
}
PRInt32 intVal;
PRUint16 int16Val;
PRBool boolVal;
char buf[20];
jstring strVal;
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
// PENDING(edburns): perhaps use a macro to speed this up?
rv = mouseEvent->GetScreenX(&intVal);
if (NS_SUCCEEDED(rv)) {
WC_ITOA(intVal, buf, 10);
strVal = ::util_NewStringUTF(env, buf);
::util_StoreIntoPropertiesObject(env, mProperties, SCREEN_X_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetScreenY(&intVal);
if (NS_SUCCEEDED(rv)) {
WC_ITOA(intVal, buf, 10);
strVal = ::util_NewStringUTF(env, buf);
::util_StoreIntoPropertiesObject(env, mProperties, SCREEN_Y_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetClientX(&intVal);
if (NS_SUCCEEDED(rv)) {
WC_ITOA(intVal, buf, 10);
strVal = ::util_NewStringUTF(env, buf);
::util_StoreIntoPropertiesObject(env, mProperties, CLIENT_X_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetClientY(&intVal);
if (NS_SUCCEEDED(rv)) {
WC_ITOA(intVal, buf, 10);
strVal = ::util_NewStringUTF(env, buf);
::util_StoreIntoPropertiesObject(env, mProperties, CLIENT_Y_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
int16Val = 0;
rv = mouseEvent->GetButton(&int16Val);
if (NS_SUCCEEDED(rv)) {
WC_ITOA(int16Val, buf, 10);
strVal = ::util_NewStringUTF(env, buf);
::util_StoreIntoPropertiesObject(env, mProperties, BUTTON_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetAltKey(&boolVal);
if (NS_SUCCEEDED(rv)) {
strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE;
::util_StoreIntoPropertiesObject(env, mProperties, ALT_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetCtrlKey(&boolVal);
if (NS_SUCCEEDED(rv)) {
strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE;
::util_StoreIntoPropertiesObject(env, mProperties, CTRL_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetShiftKey(&boolVal);
if (NS_SUCCEEDED(rv)) {
strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE;
::util_StoreIntoPropertiesObject(env, mProperties, SHIFT_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
rv = mouseEvent->GetMetaKey(&boolVal);
if (NS_SUCCEEDED(rv)) {
strVal = boolVal ? (jstring) TRUE_VALUE : (jstring) FALSE_VALUE;
::util_StoreIntoPropertiesObject(env, mProperties, META_KEY,
(jobject) strVal,
(jobject)
&(mOwner->GetWrapperFactory()->shareContext));
}
return rv;
}
nsresult JNICALL EmbedEventListener::takeActionOnNode(nsCOMPtr<nsIDOMNode> currentNode,
void *myObject)
{
nsresult rv = NS_OK;
nsString nodeInfo, nodeName, nodeValue; //, nodeDepth;
jstring jNodeName, jNodeValue;
PRUint32 depth = 0;
EmbedEventListener *curThis = nsnull;
//const PRUint32 depthStrLen = 20;
// char depthStr[depthStrLen];
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
PR_ASSERT(nsnull != myObject);
curThis = (EmbedEventListener *) myObject;
depth = curThis->mInverseDepth++;
if (!(curThis->mProperties)) {
return rv;
}
// encode the depth of the node
// PR_snprintf(depthStr, depthStrLen, "depthFromLeaf:%d", depth);
// nodeDepth = (const char *) depthStr;
// Store the name and the value of this node
{
// get the name and prepend the depth
rv = currentNode->GetNodeName(nodeInfo);
if (NS_FAILED(rv)) {
return rv;
}
// nodeName = nodeDepth;
// nodeName += nodeInfo;
nodeName = nodeInfo;
if (prLogModuleInfo) {
char * nodeInfoCStr = ToNewCString(nodeName);
PR_LOG(prLogModuleInfo, 4, ("%s", nodeInfoCStr));
nsMemory::Free(nodeInfoCStr);
}
rv = currentNode->GetNodeValue(nodeInfo);
if (NS_FAILED(rv)) {
return rv;
}
// nodeValue = nodeDepth;
// nodeValue += nodeInfo;
nodeValue = nodeInfo;
if (prLogModuleInfo) {
char * nodeInfoCStr = ToNewCString(nodeName);
PR_LOG(prLogModuleInfo, 4, ("%s", (const char *)nodeInfoCStr));
nsMemory::Free(nodeInfoCStr);
}
jNodeName = ::util_NewString(env, nodeName.get(),
nodeName.Length());
jNodeValue = ::util_NewString(env, nodeValue.get(),
nodeValue.Length());
util_StoreIntoPropertiesObject(env, (jobject) curThis->mProperties,
(jobject) jNodeName,
(jobject) jNodeValue,
(jobject)
&(curThis->mOwner->GetWrapperFactory()->shareContext));
if (jNodeName) {
::util_DeleteString(env, jNodeName);
}
if (jNodeValue) {
::util_DeleteString(env, jNodeValue);
}
} // end of Storing the name and value of this node
// store any attributes of this node
{
nsCOMPtr<nsIDOMNamedNodeMap> nodeMap;
rv = currentNode->GetAttributes(getter_AddRefs(nodeMap));
if (NS_FAILED(rv) || !nodeMap) {
return rv;
}
PRUint32 length, i;
rv = nodeMap->GetLength(&length);
if (NS_FAILED(rv)) {
return rv;
}
for (i = 0; i < length; i++) {
rv = nodeMap->Item(i, getter_AddRefs(currentNode));
if (nsnull == currentNode) {
return rv;
}
rv = currentNode->GetNodeName(nodeInfo);
if (NS_FAILED(rv)) {
return rv;
}
// nodeName = nodeDepth;
// nodeName += nodeInfo;
nodeName = nodeInfo;
if (prLogModuleInfo) {
char * nodeInfoCStr = ToNewCString(nodeName);
PR_LOG(prLogModuleInfo, 4,
("attribute[%d], %s", i, (const char *)nodeInfoCStr));
nsMemory::Free(nodeInfoCStr);
}
rv = currentNode->GetNodeValue(nodeInfo);
if (NS_FAILED(rv)) {
return rv;
}
// nodeValue = nodeDepth;
// nodeValue += nodeInfo;
nodeValue = nodeInfo;
if (prLogModuleInfo) {
char * nodeInfoCStr = ToNewCString(nodeName);
PR_LOG(prLogModuleInfo, 4,
("attribute[%d] %s", i,(const char *)nodeInfoCStr));
nsMemory::Free(nodeInfoCStr);
}
jNodeName = ::util_NewString(env, nodeName.get(),
nodeName.Length());
jNodeValue = ::util_NewString(env, nodeValue.get(),
nodeValue.Length());
util_StoreIntoPropertiesObject(env, (jobject) curThis->mProperties,
(jobject) jNodeName,
(jobject) jNodeValue,
(jobject)
&(curThis->mOwner->GetWrapperFactory()->shareContext));
if (jNodeName) {
::util_DeleteString(env, jNodeName);
}
if (jNodeValue) {
::util_DeleteString(env, jNodeValue);
}
}
} // end of storing the attributes
return rv;
}

Просмотреть файл

@ -25,8 +25,11 @@
#include <nsIDOMKeyListener.h>
#include <nsIDOMMouseListener.h>
#include "jni_util.h"
class NativeBrowserControl;
class EmbedEventListener : public nsIDOMKeyListener,
public nsIDOMMouseListener
{
@ -58,9 +61,41 @@ class EmbedEventListener : public nsIDOMKeyListener,
NS_IMETHOD MouseOver(nsIDOMEvent* aDOMEvent);
NS_IMETHOD MouseOut(nsIDOMEvent* aDOMEvent);
nsresult SetEventRegistration(jobject eventRegistration);
private:
nsresult PopulatePropertiesFromEvent(nsIDOMEvent *aMouseEvent);
nsresult addMouseEventDataToProperties(nsIDOMEvent *aMouseEvent);
static nsresult JNICALL takeActionOnNode(nsCOMPtr<nsIDOMNode> curNode,
void *yourObject);
NativeBrowserControl *mOwner;
jobject mEventRegistration;
/**
* The properties table, created during a mouseEvent handler
*/
jobject mProperties;
//
// The following ivars are used in the takeActionOnNode method.
//
/**
* 0 is the leaf depth. That's why we call it the inverse depth.
*/
PRInt32 mInverseDepth;
//
// End of ivars used in takeActionOnNode
//
};
#endif /* __EmbedEventListener_h */

Просмотреть файл

@ -162,6 +162,7 @@ NativeBrowserControl::Realize(jobject javaBrowserControl,
this->QueryInterfaceJava(EVENT_REGISTRATION_INDEX);
if (nsnull != eventRegistration) {
mProgress->SetEventRegistration(eventRegistration);
mEventListener->SetEventRegistration(eventRegistration);
}
else {
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
@ -252,6 +253,7 @@ NativeBrowserControl::Destroy(void)
// object
mProgressGuard = nsnull;
mProgress = nsnull;
fflush(stdout);
parentHWnd = nsnull;
}

Просмотреть файл

@ -0,0 +1,202 @@
/*
* $Id: MouseListenerTest.java,v 1.1 2004-10-27 01:33:57 edburns%acm.org Exp $
*/
/*
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Sun
* Microsystems, Inc. Portions created by Sun are
* Copyright (C) 1999 Sun Microsystems, Inc. All
* Rights Reserved.
*
* Contributor(s): Ed Burns &lt;edburns@acm.org&gt;
*/
package org.mozilla.webclient;
import junit.framework.TestSuite;
import junit.framework.TestResult;
import junit.framework.Test;
import java.util.Enumeration;
import java.util.Map;
import java.awt.Frame;
import java.awt.Robot;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.InputEvent;
import java.awt.BorderLayout;
import java.io.File;
import java.io.FileInputStream;
// MouseListenerTest.java
public class MouseListenerTest extends WebclientTestCase {
public MouseListenerTest(String name) {
super(name);
try {
BrowserControlFactory.setAppData(getBrowserBinDir());
}
catch (Exception e) {
fail();
}
}
public static Test suite() {
TestSuite result = createServerTestSuite();
result.addTestSuite(MouseListenerTest.class);
return (result);
}
static final int IN_X = 20;
static final int IN_Y = 117;
static final int OUT_X = 700;
static final int OUT_Y = 500;
static EventRegistration2 eventRegistration;
static CurrentPage2 currentPage = null;
static boolean keepWaiting;
//
// Constants
//
//
// Testcases
//
public void testListenerAddedToEventRegistration() throws Exception {
doTest(false);
}
public void testListenerAddedToCanvas() throws Exception {
doTest(true);
}
public void doTest(boolean addToCanvas) throws Exception {
BrowserControl firstBrowserControl = null;
DocumentLoadListenerImpl listener = null;
Selection selection = null;
firstBrowserControl = BrowserControlFactory.newBrowserControl();
assertNotNull(firstBrowserControl);
History history = (History)
firstBrowserControl.queryInterface(BrowserControl.HISTORY_NAME);
BrowserControlCanvas canvas = (BrowserControlCanvas)
firstBrowserControl.queryInterface(BrowserControl.BROWSER_CONTROL_CANVAS_NAME);
eventRegistration = (EventRegistration2)
firstBrowserControl.queryInterface(BrowserControl.EVENT_REGISTRATION_NAME);
assertNotNull(canvas);
Frame frame = new Frame();
frame.setUndecorated(true);
frame.setBounds(0, 0, 640, 480);
frame.add(canvas, BorderLayout.CENTER);
frame.setVisible(true);
canvas.setVisible(true);
Navigation2 nav = (Navigation2)
firstBrowserControl.queryInterface(BrowserControl.NAVIGATION_NAME);
assertNotNull(nav);
currentPage = (CurrentPage2)
firstBrowserControl.queryInterface(BrowserControl.CURRENT_PAGE_NAME);
assertNotNull(currentPage);
eventRegistration.addDocumentLoadListener(listener = new DocumentLoadListenerImpl() {
public void doEndCheck() {
MouseListenerTest.keepWaiting = false;
}
});
// PENDING(edburns): flesh this out with more content
MouseListener mouseListener = new MouseListener() {
public void mouseEntered(MouseEvent e) {
assertEquals(IN_X, e.getX());
assertEquals(IN_Y, e.getY());
assertTrue(e instanceof WCMouseEvent);
WCMouseEvent wcMouseEvent = (WCMouseEvent) e;
Map eventMap =
(Map) wcMouseEvent.getWebclientEvent().getEventData();
assertNotNull(eventMap);
String href = (String) eventMap.get("href");
assertNotNull(href);
assertEquals(href, "HistoryTest1.html");
}
public void mouseExited(MouseEvent e) {
System.out.println("debug: edburns: exited: " +
e.getX() + ", " + e.getY());
}
public void mouseClicked(MouseEvent e) {
System.out.println("debug: edburns: clicked: " +
e.getX() + ", " + e.getY());
}
public void mousePressed(MouseEvent e) {
System.out.println("debug: edburns: pressed: " +
e.getX() + ", " + e.getY());
}
public void mouseReleased(MouseEvent e) {
System.out.println("debug: edburns: released: " +
e.getX() + ", " + e.getY());
}
};
if (addToCanvas) {
canvas.addMouseListener(mouseListener);
}
else {
eventRegistration.addMouseListener(mouseListener);
}
Thread.currentThread().sleep(3000);
//
// load four files.
//
MouseListenerTest.keepWaiting = true;
nav.loadURL("http://localhost:5243/HistoryTest0.html");
// keep waiting until the previous load completes
while (MouseListenerTest.keepWaiting) {
Thread.currentThread().sleep(1000);
}
Robot robot = new Robot();
robot.mouseMove(IN_X, IN_Y);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
MouseListenerTest.keepWaiting = true;
while (MouseListenerTest.keepWaiting) {
Thread.currentThread().sleep(1000);
}
frame.setVisible(false);
BrowserControlFactory.deleteBrowserControl(firstBrowserControl);
}
}

Просмотреть файл

@ -268,6 +268,46 @@ public class TestBrowser extends JPanel {
}
}
});
eventRegistration.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
if (e instanceof WCMouseEvent) {
WCMouseEvent wcMouseEvent = (WCMouseEvent) e;
Map eventProps =
(Map) wcMouseEvent.getWebclientEvent().getEventData();
if (null == eventProps) {
return;
}
if (e.isAltDown()) {
System.out.println("Alt ");
}
if (e.isControlDown()) {
System.out.println("Ctrl ");
}
if (e.isShiftDown()) {
System.out.println("Shift ");
}
if (e.isMetaDown()) {
// PENDING(edburns): this is always sent for some reason
//System.out.println("Meta ");
}
String href = (String) eventProps.get("href");
if (null != href) {
// PENDING(edburns): take care of relative URL
updateStatusInfo(href);
}
}
}
public void mouseExited(MouseEvent e) {
updateStatusInfo(" ");
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
jBrowserPanel.setLayout(new BorderLayout());
jBrowserPanel.add(browserControlCanvas, BorderLayout.CENTER);