diff -r f5050f1da672 -r 04becd199f91 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtevents.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtevents.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,1386 @@ +/******************************************************************************* + * Copyright (c) 2005, 2010 Nokia Corporation and/or its subsidiary(-ies). + * 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: + * Nokia Corporation - S60 implementation + *******************************************************************************/ + + +#include +#include +#include "swtevents.h" +#include "eswtwidgetscore.h" +#include "eswtwidgetsexpanded.h" +#include "javalocalref.h" +#include "methodcall.h" +#include "utils.h" +#include "swtdialogbroker.h" + + +// ======== MEMBER FUNCTIONS ======== + + +// ----------------------------------------------------------------------------- +// CSwtEvent::CSwtEvent +// ----------------------------------------------------------------------------- +// +inline CSwtEvent::CSwtEvent(TSwtPeer aPeer) + : iPeer(aPeer) +{ + ASSERT(iPeer); +} + +// ----------------------------------------------------------------------------- +// CSwtEvent::Dispatch +// ----------------------------------------------------------------------------- +// +void CSwtEvent::Dispatch(JNIEnv* aJniEnv) +{ + ASSERT(!IsDisplayDisposed()); + ASSERT(!IsPeerDisposed()); + DoDispatch(aJniEnv); +} + +// ----------------------------------------------------------------------------- +// CSwtCallbackEvent::CSwtCallbackEvent +// ----------------------------------------------------------------------------- +// +inline CSwtCallbackEvent::CSwtCallbackEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtCallbackEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtCallbackEvent::DoDispatch(JNIEnv* aJniEnv) +{ + // Dispatch the message + jboolean doIt; + TBool ok = SendEvent(aJniEnv, doIt); + + // Check if further execution should stop + if (IsDisplayDisposed() || IsPeerDisposed() || !ok) + { + return; + } + + // Call back the originator + TRAPD(error, CallMethodL(this, &CSwtCallbackEvent::CallbackL, doIt)); + ThrowIfError(error, aJniEnv); +} + +// ----------------------------------------------------------------------------- +// CSwtPlainEvent::CSwtPlainEvent +// ----------------------------------------------------------------------------- +// +CSwtPlainEvent::CSwtPlainEvent(TSwtPeer aPeer, TSwtEventType aType) + : CSwtEvent(aPeer) + , iType(aType) + , iDetail(KSwtNone) + , iItemPeer(NULL) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtPlainEvent::CSwtPlainEvent +// ----------------------------------------------------------------------------- +// +CSwtPlainEvent::CSwtPlainEvent(TSwtPeer aPeer, TSwtEventType aType, + TInt aDetail, TSwtPeer aItemPeer) + : CSwtEvent(aPeer) + , iType(aType) + , iDetail(aDetail) + , iItemPeer(aItemPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtPlainEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtPlainEvent::Type() const +{ + return iType; +} + +// ----------------------------------------------------------------------------- +// CSwtPlainEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtPlainEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendEvent", + "(IILorg/eclipse/swt/widgets/Widget;)V", static_cast(iType), + iDetail, iItemPeer); +} + +// ----------------------------------------------------------------------------- +// CSwtKeyEvent::CSwtKeyEvent +// ----------------------------------------------------------------------------- +// +CSwtKeyEvent::CSwtKeyEvent(MSwtControl& aControl, const TSwtKeyEventData& aData, + const TKeyEvent& aKeyEvent, TEventCode aType) + : CSwtCallbackEvent(aControl.JavaPeer()) + , iControl(aControl) + , iSwtType(aData.iType) + , iCharacter(static_cast(aData.iCharacter)) + , iKeyCode(aData.iKeyCode) + , iStateMask(aData.iStateMask) + , iKeyEvent(aKeyEvent) + , iType(aType) +{ + ASSERT(aType == EEventKeyDown || aType == EEventKey || aType == EEventKeyUp); +} + +// ----------------------------------------------------------------------------- +// CSwtKeyEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtKeyEvent::Type() const +{ + return iSwtType; +} + +// ----------------------------------------------------------------------------- +// CSwtKeyEvent::SendEvent +// ----------------------------------------------------------------------------- +// +TBool CSwtKeyEvent::SendEvent(JNIEnv* aJniEnv, jboolean& aDoIt) +{ + TBool failed; + aDoIt = CallBooleanJavaMethod(failed, aJniEnv, Peer(), "sendKeyEvent", + "(ICII)Z", static_cast(iSwtType), iCharacter, iKeyCode, + iStateMask); + return (failed || aJniEnv->ExceptionCheck()) ? EFalse : ETrue; +} + +// ----------------------------------------------------------------------------- +// CSwtKeyEvent::CSwtKeyEvent +// ----------------------------------------------------------------------------- +// +void CSwtKeyEvent::CallbackL(TBool aDoIt) +{ + if (aDoIt) + { + // There is no difference between key-down and key event in SWT. Therefore, + // those events are merged. If this is such an event, let's un-merge. + // EEventKeyDown can be posted only if the key does not generate EEventKey! + if (iType == EEventKey && iKeyEvent.iRepeats == 0) + { + TKeyEvent keyDownEvent(iKeyEvent); + keyDownEvent.iCode = 0; + iControl.ProcessKeyEventL(keyDownEvent, EEventKeyDown); + } + iControl.ProcessKeyEventL(iKeyEvent, iType); + +#ifndef RD_JAVA_S60_RELEASE_9_2 + if (AknLayoutUtils::MSKEnabled()) + { + // Cba consumes the MSK event key, we have to create a simulated + // EEventKey for EStdKeyDevice3 key down event. + if (iType == EEventKeyDown && iKeyEvent.iScanCode == EStdKeyDevice3 && + iKeyEvent.iRepeats == 0) + { + TKeyEvent keyEvent(iKeyEvent); + keyEvent.iCode = EKeyOK; + iControl.ProcessKeyEventL(keyEvent, EEventKey); + } + } +#endif // RD_JAVA_S60_RELEASE_9_2 + } +} + +// ----------------------------------------------------------------------------- +// CSwtTraverseEvent::CSwtTraverseEvent +// ----------------------------------------------------------------------------- +// +CSwtTraverseEvent::CSwtTraverseEvent(MSwtControl& aControl, TSwtTraversal aDetail, + TBool aDoIt, const TSwtKeyEventData& aData, const TKeyEvent& aKeyEvent, + TEventCode aType) + : CSwtKeyEvent(aControl, aData, aKeyEvent, aType) + , iDetail(aDetail) + , iDoItDefault(ConvertBoolean(aDoIt)) +{ +} + + +// ----------------------------------------------------------------------------- +// CSwtTraverseEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtTraverseEvent::Type() const +{ + return ESwtEventTraverse; +} + + +// ----------------------------------------------------------------------------- +// CSwtTraverseEvent::DoDispatch +// Dispatches the traverse event, and depending on the event's "doit" field may +// also dispatch the original key event. +// ----------------------------------------------------------------------------- +// +void CSwtTraverseEvent::DoDispatch(JNIEnv* aJniEnv) +{ + // Dispatch the message + jboolean doIt; + TBool ok = SendTraverseEvent(aJniEnv, doIt); + + // Check if further execution should stop + if (IsDisplayDisposed() || IsPeerDisposed() || !ok) + { + return; + } + + // Perform traversal or key event + if (doIt) + { + if (iDetail != ESwtTraverseNone) + { + TRAPD(error, CallMethodL(this, &CSwtTraverseEvent::TraverseCallbackL)); + ThrowIfError(error, aJniEnv); + } + } + else + { + CSwtKeyEvent::DoDispatch(aJniEnv); + } +} + +// ----------------------------------------------------------------------------- +// CSwtTraverseEvent::SendTraverseEvent +// ----------------------------------------------------------------------------- +// +TBool CSwtTraverseEvent::SendTraverseEvent(JNIEnv* aJniEnv, jboolean& aDoIt) +{ + TBool failed; + const char* signature = "(IZCII)Lorg/eclipse/swt/widgets/Event;"; + jobject event = CallObjectJavaMethod(failed, aJniEnv, Peer(), + "sendTraverseEvent", signature, iDetail, iDoItDefault, + iCharacter, iKeyCode, iStateMask); + + // Check if further execution should stop + if (IsDisplayDisposed() || aJniEnv->ExceptionCheck() || failed) + { + return EFalse; + } + + ASSERT(event); + jclass clazz = aJniEnv->FindClass("org/eclipse/swt/widgets/Event"); + if (!clazz) + { + failed = ETrue; + } + else + { + aDoIt = GetBooleanField(aJniEnv, event, clazz, "doit", failed); + iDetail = GetIntField(aJniEnv, event, clazz, "detail", failed); + aJniEnv->DeleteLocalRef(clazz); + } + aJniEnv->DeleteLocalRef(event); + + return !failed; +} + +// ----------------------------------------------------------------------------- +// CSwtTraverseEvent::TraverseCallbackL +// ----------------------------------------------------------------------------- +// +void CSwtTraverseEvent::TraverseCallbackL() +{ + // Ensure the control still has the focus, it may not always be so if + // too many events have been generated before being processed + // Must call here IsFocusControl() instead of CoeControl().IsFocused() + // because Shells can never get Coe focus. Shell focus is defined to be + // the state when the Shell is active and has no focused children. + if (iControl.IsFocusControl()) + { + // Find the Control's Shell + MSwtShell* shell; + MSwtControl* ctrl = &iControl; + while ((shell = ctrl->ShellInterface()) == NULL) + { + ctrl = ctrl->GetParent()->Control(); + } + + // Find next focusable control + MSwtControl* newFocus = shell->FindTraversalTargetL(iDetail, iControl); + if (newFocus) + { + newFocus->CoeControl().SetFocus(ETrue, ENoDrawNow); + } + } +} + +// ----------------------------------------------------------------------------- +// CSwtMouseEvent::CSwtMouseEvent +// ----------------------------------------------------------------------------- +// +CSwtMouseEvent::CSwtMouseEvent(TSwtPeer aPeer, TSwtEventType aType, + TInt aButton, const TPoint& aPos, TInt aStateMask) + : CSwtEvent(aPeer) + , iType(aType) + , iButton(aButton) + , iX(aPos.iX) + , iY(aPos.iY) + , iStateMask(aStateMask) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtMouseEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtMouseEvent::Type() const +{ + return iType; +} + +// ----------------------------------------------------------------------------- +// CSwtMouseEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtMouseEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "sendMouseEvent", "(IIIII)V", + static_cast(iType), iButton, iX, iY, iStateMask); +} + +// ----------------------------------------------------------------------------- +// CSwtScrollEvent::CSwtScrollEvent +// ----------------------------------------------------------------------------- +// +CSwtScrollEvent::CSwtScrollEvent(TSwtPeer aPeer, TInt aDetail) + : CSwtEvent(aPeer) + , iDetail(aDetail) +{ + ASSERT((aDetail >= ESwtKeyArrowUp && aDetail <= ESwtKeyEnd) + || aDetail == KSwtDrag || aDetail == 0); +} + +// ----------------------------------------------------------------------------- +// CSwtScrollEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtScrollEvent::Type() const +{ + return ESwtEventSelection; +} + +// ----------------------------------------------------------------------------- +// CSwtScrollEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtScrollEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "sendScrollEvent", "(I)V", iDetail); +} + +// ----------------------------------------------------------------------------- +// CSwtPaintEvent::CSwtPaintEvent +// ----------------------------------------------------------------------------- +// +CSwtPaintEvent::CSwtPaintEvent(TSwtPeer aSenderPeer, TSwtPeer aShellPeer, + const TRect& aRect, TBool aMergeable) + : CSwtEvent(aShellPeer) + , iMergeable(aMergeable) + , iRect(aRect) + , iSenderPeer(aSenderPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtPaintEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtPaintEvent::Type() const +{ + return ESwtEventPaint; +} + +// ----------------------------------------------------------------------------- +// CSwtPaintEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtPaintEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallObjectJavaMethod(failed, aJniEnv, Peer(), "paint", + "(Lorg/eclipse/swt/graphics/Rectangle;ZZ)Lorg/eclipse/swt/graphics/Rectangle;", + NewJavaRectangle(aJniEnv, iRect), ConvertBoolean(ETrue), + ConvertBoolean(ETrue)); +} + +// ----------------------------------------------------------------------------- +// CSwtResizeEvent::CSwtResizeEvent +// ----------------------------------------------------------------------------- +// +CSwtResizeEvent::CSwtResizeEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtResizeEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtResizeEvent::Type() const +{ + return ESwtEventResize; +} + +// ----------------------------------------------------------------------------- +// CSwtResizeEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtResizeEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "sendResizeEvent", "()V"); +} + +// ----------------------------------------------------------------------------- +// CSwtTimerCallback::CSwtTimerCallback +// ----------------------------------------------------------------------------- +// +CSwtTimerCallback::CSwtTimerCallback(TSwtPeer aPeer, TInt aTimerHandle) + : CSwtEvent(aPeer) + , iTimerHandle(aTimerHandle) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtTimerCallback::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtTimerCallback::Type() const +{ + return ESwtEventNone; +} + +// ----------------------------------------------------------------------------- +// CSwtTimerCallback::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtTimerCallback::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "timerCallback", "(I)V", + iTimerHandle); +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::CSwtVerifyEvent +// ----------------------------------------------------------------------------- +// +CSwtVerifyEvent::CSwtVerifyEvent(MSwtVerifyEventObserver& aWidget, + TSwtPeer aPeer, TInt aStart, TInt aEnd) + : CSwtEvent(aPeer) + , iWidget(aWidget) + , iStart(aStart) + , iEnd(aEnd) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::~CSwtVerifyEvent +// ----------------------------------------------------------------------------- +// +CSwtVerifyEvent::~CSwtVerifyEvent() +{ + delete iOriginalText; +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtVerifyEvent::ConstructL(const TDesC& aText) +{ + iOriginalText = aText.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtVerifyEvent* CSwtVerifyEvent::NewL(MSwtVerifyEventObserver& aWidget, + TSwtPeer aPeer, TInt aStart, TInt aEnd, const TDesC& aText) +{ + CSwtVerifyEvent* self = new(ELeave) CSwtVerifyEvent(aWidget, aPeer, + aStart, aEnd); + CleanupStack::PushL(self); + self->ConstructL(aText); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtVerifyEvent::Type() const +{ + return ESwtEventVerify; +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtVerifyEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TRAPD(error, DoDispatchL(aJniEnv)); + ThrowIfError(error, aJniEnv); +} + +// ----------------------------------------------------------------------------- +// CSwtVerifyEvent::DoDispatchL +// ----------------------------------------------------------------------------- +// +void CSwtVerifyEvent::DoDispatchL(JNIEnv* aJniEnv) +{ + // Convert the original string to a Java string + jstring text = NewJavaString(aJniEnv, *iOriginalText); + DeleteInUiHeap(iOriginalText); + iOriginalText = NULL; + if (!text) + { + return; + } + + // Dispatch the message + TBool failed; + const char* signature = "(IILjava/lang/String;)Lorg/eclipse/swt/widgets/Event;"; + RJavaLocalRef event(aJniEnv, CallObjectJavaMethod(failed, aJniEnv, + Peer(), "sendVerifyEvent", signature, iStart, iEnd, text)); + aJniEnv->DeleteLocalRef(text); + + // Check if further execution should stop + if (IsDisplayDisposed() || failed || aJniEnv->ExceptionCheck()) + { + return; + } + + ASSERT(event); + + // Retrieve "doit" and "text" + jboolean doIt = JNI_FALSE; + HBufC* verifiedText = NULL; + CleanupClosePushL(event); + RJavaLocalRef clazz(aJniEnv, aJniEnv->FindClass( + "org/eclipse/swt/widgets/Event")); + if (!clazz) + { + failed = ETrue; + } + else + { + CleanupClosePushL(clazz); + doIt = GetBooleanField(aJniEnv, event, clazz, "doit", failed); + if (doIt) + { + verifiedText = GetStringFieldL(aJniEnv, event, clazz, "text", failed); + } + CleanupStack::PopAndDestroy(&clazz); + } + CleanupStack::PopAndDestroy(&event); + + // Callback the originator + if (doIt && !failed && !IsPeerDisposed()) + { + TPtr ptr(NULL, 0, 0); + if (verifiedText) + { + CleanupStack::PushL(verifiedText); + ptr.Set(verifiedText->Des()); + } + CallMethodL(&iWidget, &MSwtVerifyEventObserver::ProcessVerifiedTextL, + iStart, iEnd, ptr); + if (verifiedText) + { + CleanupStack::Pop(verifiedText); + } + } + delete verifiedText; +} + +// ----------------------------------------------------------------------------- +// CSwtScreenEvent::CSwtScreenEvent +// ----------------------------------------------------------------------------- +// +CSwtScreenEvent::CSwtScreenEvent(TSwtPeer aPeer, TInt aType) + : CSwtEvent(aPeer) + , iType(aType) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtScreenEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtScreenEvent::Type() const +{ + return ESwtEventNone; +} + +// ----------------------------------------------------------------------------- +// CSwtScreenEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtScreenEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + + const char* methodName; + switch (iType) + { + case MSwtScreen::KEventScreenActivated: + methodName = "internal_sendScreenEventActivated"; + break; + case MSwtScreen::KEventScreenDeactivated: + methodName = "internal_sendScreenEventDeactivated"; + break; + case MSwtScreen::KEventScreenOrientationChanged: + methodName = "internal_sendOrientationScreenChanged"; + break; + default: + return; + } + + CallVoidJavaMethod(failed, aJniEnv, Peer(), methodName, "()V"); +} + +// ----------------------------------------------------------------------------- +// CSwtMobileDeviceEvent::CSwtMobileDeviceEvent +// ----------------------------------------------------------------------------- +// +CSwtMobileDeviceEvent::CSwtMobileDeviceEvent(TSwtPeer aPeer, TInt aEventType) + : CSwtEvent(aPeer) + , iEventType(aEventType) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtMobileDeviceEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtMobileDeviceEvent::Type() const +{ + return ESwtEventNone; +} + +// ----------------------------------------------------------------------------- +// CSwtMobileDeviceEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtMobileDeviceEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), + "internal_sendMobileDeviceEvent", "(I)V", iEventType); +} + +// ----------------------------------------------------------------------------- +// CSwtTreeEvent::CSwtTreeEvent +// ----------------------------------------------------------------------------- +// +CSwtTreeEvent::CSwtTreeEvent(TSwtPeer aPeer, TSwtEventType aType, TInt aItemHandle) + : CSwtEvent(aPeer) + , iType(aType) + , iItemHandle(aItemHandle) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtTreeEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtTreeEvent::Type() const +{ + return iType; +} + +// ----------------------------------------------------------------------------- +// CSwtTreeEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtTreeEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendEvent", + "(II)V", static_cast< jint >(iType), static_cast< jint >(iItemHandle)); +} + +// ----------------------------------------------------------------------------- +// CSwtForegroundEvent::CSwtForegroundEvent +// ----------------------------------------------------------------------------- +// +CSwtForegroundEvent::CSwtForegroundEvent(TSwtPeer aPeer, + const TBool& aForeground) + : CSwtEvent(aPeer) + , iForeground(aForeground) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtForegroundEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtForegroundEvent::Type() const +{ + return ESwtEventForeground; +} + +// ----------------------------------------------------------------------------- +// CSwtForegroundEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtForegroundEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + jboolean jForeground = JNI_TRUE; + if (!iForeground) + { + jForeground = JNI_FALSE; + } + CallStaticVoidJavaMethod(failed, aJniEnv, + "org/eclipse/swt/internal/symbian/ForegroundNotifyWrapper", + "setForeground", "(Z)V", jForeground); +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::CSwtLocationChangingEvent +// ----------------------------------------------------------------------------- +// +CSwtLocationChangingEvent::CSwtLocationChangingEvent(TSwtPeer aPeer, + MSwtBrowser& aBrowser, TBool aDoIt, TBool aTop, + TSwtBrCallBackOperationType aCallBackOperationType) + : CSwtCallbackEvent(aPeer) + , iBrowser(&aBrowser) + , iDoIt(aDoIt) + , iTop(aTop) + , iCallBackOperationType(aCallBackOperationType) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtLocationChangingEvent::ConstructL(const TDesC& aLocation) +{ + iLocation = aLocation.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtLocationChangingEvent* CSwtLocationChangingEvent::NewL(TSwtPeer aPeer, + MSwtBrowser& aBrowser, TBool aDoIt, TBool aTop, + const TDesC& aLocation, TSwtBrCallBackOperationType aCallBackOperationType) +{ + CSwtLocationChangingEvent* self = new(ELeave) CSwtLocationChangingEvent( + aPeer, aBrowser, aDoIt, aTop, aCallBackOperationType); + CleanupStack::PushL(self); + self->ConstructL(aLocation); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::~CSwtLocationChangingEvent +// ----------------------------------------------------------------------------- +// +CSwtLocationChangingEvent::~CSwtLocationChangingEvent() +{ + delete iLocation; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::SendEvent +// ----------------------------------------------------------------------------- +// +TBool CSwtLocationChangingEvent::SendEvent(JNIEnv* aJniEnv, jboolean& aDoIt) +{ + TBool failed; + jstring location = NewJavaString(aJniEnv, *iLocation); + aDoIt = CallBooleanJavaMethod(failed, aJniEnv, Peer(), + "internal_sendLocationChangingEvent", "(ZZLjava/lang/String;)Z", + static_cast(iDoIt), static_cast(iTop), + location); + // Don't delete iLocation here, CallBack function still needs it. + return (failed || aJniEnv->ExceptionCheck()) ? EFalse : ETrue; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangingEvent::CallbackL +// This function is always called in UI thread +// ----------------------------------------------------------------------------- +// +void CSwtLocationChangingEvent::CallbackL(TBool aDoIt) +{ + if (aDoIt) + { + // Load URL based on iCallBackOperationType + TRAP_IGNORE(iBrowser->DoSetUrlL(*iLocation, iCallBackOperationType)); + } + delete iLocation; + iLocation = NULL; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangedEvent::CSwtLocationChangedEvent +// ----------------------------------------------------------------------------- +// +CSwtLocationChangedEvent::CSwtLocationChangedEvent(TSwtPeer aPeer, TBool aDoIt, + TBool aTop) + : CSwtEvent(aPeer) + , iDoIt(aDoIt) + , iTop(aTop) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangedEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtLocationChangedEvent::ConstructL(const TDesC& aLocation) +{ + iLocation = aLocation.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangedEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtLocationChangedEvent* CSwtLocationChangedEvent::NewL(TSwtPeer aPeer, + TBool aDoIt, TBool aTop, const TDesC& aLocation) +{ + CSwtLocationChangedEvent* self = new(ELeave) CSwtLocationChangedEvent( + aPeer, aDoIt, aTop); + CleanupStack::PushL(self); + self->ConstructL(aLocation); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangedEvent::~CSwtLocationChangedEvent +// ----------------------------------------------------------------------------- +// +CSwtLocationChangedEvent::~CSwtLocationChangedEvent() +{ + delete iLocation; +} + +// ----------------------------------------------------------------------------- +// CSwtLocationChangedEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtLocationChangedEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + jstring location = NewJavaString(aJniEnv, *iLocation); + + DeleteInUiHeap(iLocation); + iLocation = NULL; + + CallVoidJavaMethod(failed, aJniEnv, Peer(), + "internal_sendLocationChangedEvent", "(ZZLjava/lang/String;)V", + static_cast< jboolean >(iDoIt), static_cast< jboolean >(iTop), + location); +} + +// ----------------------------------------------------------------------------- +// CSwtProgressEvent::CSwtProgressEvent +// ----------------------------------------------------------------------------- +// +CSwtProgressEvent::CSwtProgressEvent(TSwtPeer aPeer, TInt aCurrent,TInt aTotal) + : CSwtEvent(aPeer) + , iCurrent(aCurrent) + , iTotal(aTotal) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtProgressEvent::~CSwtProgressEvent +// ----------------------------------------------------------------------------- +// +CSwtProgressEvent::~CSwtProgressEvent() +{ +} + +// ----------------------------------------------------------------------------- +// CSwtProgressEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtProgressEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendProgressEvent", + "(II)V", static_cast< jint >(iCurrent),static_cast< jint >(iTotal)); +} + +// ----------------------------------------------------------------------------- +// CSwtProgressCompletedEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +CSwtProgressCompletedEvent::CSwtProgressCompletedEvent(TSwtPeer aPeer, + TInt aCurrent, TInt aTotal) + : CSwtEvent(aPeer) + , iCurrent(aCurrent) + , iTotal(aTotal) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtProgressCompletedEvent::~CSwtProgressCompletedEvent +// ----------------------------------------------------------------------------- +// +CSwtProgressCompletedEvent::~CSwtProgressCompletedEvent() +{ +} + +// ----------------------------------------------------------------------------- +// CSwtProgressCompletedEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtProgressCompletedEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), + "internal_sendProgressCompletedEvent", "(II)V", + static_cast< jint >(iCurrent),static_cast< jint >(iTotal)); +} + +// ----------------------------------------------------------------------------- +// CSwtStatusTextEvent::CSwtStatusTextEvent +// ----------------------------------------------------------------------------- +// +CSwtStatusTextEvent::CSwtStatusTextEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtStatusTextEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtStatusTextEvent::ConstructL(const TDesC& aStatusText) +{ + iStatusText = aStatusText.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtStatusTextEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtStatusTextEvent* CSwtStatusTextEvent::NewL(TSwtPeer aPeer, + const TDesC& aStatusText) +{ + CSwtStatusTextEvent* self = new(ELeave) CSwtStatusTextEvent(aPeer); + CleanupStack::PushL(self); + self->ConstructL(aStatusText); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtStatusTextEvent::~CSwtStatusTextEvent +// ----------------------------------------------------------------------------- +// +CSwtStatusTextEvent::~CSwtStatusTextEvent() +{ + delete iStatusText; +} + +// ----------------------------------------------------------------------------- +// CSwtStatusTextEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtStatusTextEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + jstring statusText = NewJavaString(aJniEnv, *iStatusText); + DeleteInUiHeap(iStatusText); + iStatusText = NULL; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendStatusTextEvent", + "(Ljava/lang/String;)V", statusText); +} + +// ----------------------------------------------------------------------------- +// CSwtTitleEvent::CSwtTitleEvent +// ----------------------------------------------------------------------------- +// +CSwtTitleEvent::CSwtTitleEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtTitleEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtTitleEvent::ConstructL(const TDesC& aTitle) +{ + iTitle = aTitle.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtTitleEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtTitleEvent* CSwtTitleEvent::NewL(TSwtPeer aPeer, const TDesC& aTitle) +{ + + CSwtTitleEvent* self = new(ELeave) CSwtTitleEvent(aPeer); + CleanupStack::PushL(self); + self->ConstructL(aTitle); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtTitleEvent::~CSwtTitleEvent +// ----------------------------------------------------------------------------- +// +CSwtTitleEvent::~CSwtTitleEvent() +{ + delete iTitle; +} + +// ----------------------------------------------------------------------------- +// CSwtTitleEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtTitleEvent::DoDispatch(JNIEnv* aJniEnv) +{ + + TBool failed; + jstring title = NewJavaString(aJniEnv, *iTitle); + DeleteInUiHeap(iTitle); + iTitle = NULL; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendTitleEvent", + "(Ljava/lang/String;)V", title); +} + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::CSwtDialogStringResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogStringResultEvent::CSwtDialogStringResultEvent(CSwtDialogBroker* aBroker, TSwtPeer aPeer) + : CSwtEvent(aPeer), iDialogBroker(aBroker) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtDialogStringResultEvent::ConstructL(const TDesC& aDialogResult) +{ + iDialogResult = aDialogResult.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtDialogStringResultEvent* CSwtDialogStringResultEvent +::NewL(CSwtDialogBroker* aBroker, TSwtPeer aPeer, const TDesC& aDialogResult) +{ + + CSwtDialogStringResultEvent* self = new(ELeave) CSwtDialogStringResultEvent(aBroker, aPeer); + CleanupStack::PushL(self); + self->ConstructL(aDialogResult); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::~CSwtDialogStringResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogStringResultEvent::~CSwtDialogStringResultEvent() +{ + delete iDialogBroker; + delete iDialogResult; +} + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtDialogStringResultEvent::Type() const +{ + return ESwtEventDialogStringResult; +} + + +// ----------------------------------------------------------------------------- +// CSwtDialogStringResultEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtDialogStringResultEvent::DoDispatch(JNIEnv* aJniEnv) +{ + + CSwtDisplay* display = CSwtDisplay::CurrentOrNull(); + ASSERT(display); + // active object have to be deleted in UI thread + CallMethod(display, &CSwtDisplay::RemoveDialogBroker, iDialogBroker); + iDialogBroker = NULL; + + TBool failed; + jstring string = NewJavaString(aJniEnv, *iDialogResult); + DeleteInUiHeap(iDialogResult); + iDialogResult = NULL; + + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendResult", + "(Ljava/lang/String;)V", string); +} + + +// ----------------------------------------------------------------------------- +// CSwtDialogIntegerResultEvent::CSwtDialogIntegerResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogIntegerResultEvent::CSwtDialogIntegerResultEvent(CSwtDialogBroker* aBroker, + TSwtPeer aPeer, TInt aDialogResult) + : CSwtEvent(aPeer), iDialogBroker(aBroker) + , iDialogResult(aDialogResult) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtDialogIntegerResultEvent::~CSwtDialogIntegerResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogIntegerResultEvent::~CSwtDialogIntegerResultEvent() +{ + delete iDialogBroker; +} + +// ----------------------------------------------------------------------------- +// CSwtDialogIntegerResultEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtDialogIntegerResultEvent::Type() const +{ + return ESwtEventDialogIntegerResult; +} + + +// ----------------------------------------------------------------------------- +// CSwtDialogIntegerResultEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtDialogIntegerResultEvent::DoDispatch(JNIEnv* aJniEnv) +{ + + CSwtDisplay* display = CSwtDisplay::CurrentOrNull(); + ASSERT(display); + // active object have to be deleted in UI thread + CallMethod(display, &CSwtDisplay::RemoveDialogBroker, iDialogBroker); + iDialogBroker = NULL; + + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendResult", + "(I)V", static_cast< jint >(iDialogResult)); +} +// ----------------------------------------------------------------------------- +// CSwtDialogRgbResultEvent::CSwtDialogRgbResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogRgbResultEvent::CSwtDialogRgbResultEvent(CSwtDialogBroker* aBroker, TSwtPeer aPeer, TInt aRed, TInt aGreen, TInt aBlue) + : CSwtEvent(aPeer) + , iDialogBroker(aBroker) + , iRed(aRed) + , iGreen(aGreen) + , iBlue(aBlue) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtDialogRgbResultEvent::~CSwtDialogRgbResultEvent +// ----------------------------------------------------------------------------- +// +CSwtDialogRgbResultEvent::~CSwtDialogRgbResultEvent() +{ + delete iDialogBroker; +} + +// ----------------------------------------------------------------------------- +// CSwtDialogRgbResultEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtDialogRgbResultEvent::Type() const +{ + return ESwtEventDialogRgbResult; +} + + +// ----------------------------------------------------------------------------- +// CSwtDialogRgbResultEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtDialogRgbResultEvent::DoDispatch(JNIEnv* aJniEnv) +{ + CSwtDisplay* display = CSwtDisplay::CurrentOrNull(); + ASSERT(display); + // active object have to be deleted in UI thread + CallMethod(display, &CSwtDisplay::RemoveDialogBroker, iDialogBroker); + iDialogBroker = NULL; + + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendResult", + "(III)V", static_cast< jint >(iRed), + static_cast< jint >(iGreen), + static_cast< jint >(iBlue)); +} + + + +// ----------------------------------------------------------------------------- +// CSwtSettingsEvent::CSwtSettingsEvent +// ----------------------------------------------------------------------------- +// +CSwtSettingsEvent::CSwtSettingsEvent(TSwtPeer aPeer, TBool aThemeChanged) + :CSwtEvent(aPeer) + ,iThemeChanged(aThemeChanged) +{ +} + +TSwtEventType CSwtSettingsEvent::Type() const +{ + return ESwtEventSettings; +} + +void CSwtSettingsEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "runSettings", + "(Z)V", static_cast< jboolean >(iThemeChanged)); +} + + +// ----------------------------------------------------------------------------- +// CSwtCloseEvent::CSwtCloseEvent +// ----------------------------------------------------------------------------- +// +CSwtCloseEvent::CSwtCloseEvent(TSwtPeer aPeer, TBool& aDispatched) + : CSwtCallbackEvent(aPeer), iDispatched(aDispatched) +{ +} + + +// ----------------------------------------------------------------------------- +// CSwtCloseEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtCloseEvent::Type() const +{ + return ESwtEventClose; +} + +// ----------------------------------------------------------------------------- +// CSwtCloseEvent::SendEvent +// ----------------------------------------------------------------------------- +// +TBool CSwtCloseEvent::SendEvent(JNIEnv* aJniEnv, jboolean &aDoIt) +{ + TBool failed; + aDoIt = CallBooleanJavaMethod(failed, aJniEnv, Peer(), + "sendCloseEvent", "()Z"); + + TBool fine = !failed && !aJniEnv->ExceptionCheck(); + if (fine && aDoIt) + { + // CallbackL needs the display. Get it here as we are in the Java ui thread. + iDisplay = CSwtDisplay::CurrentOrNull(); + } + + return fine; +} + +// ----------------------------------------------------------------------------- +// CSwtCloseEvent::SendEvent +// ----------------------------------------------------------------------------- +// +void CSwtCloseEvent::CallbackL(TBool aDoIt) +{ + iDispatched = ETrue; + if (aDoIt) + { + if (iDisplay) + { + iDisplay->OfferWsEventL(SwtWsEventShutdown); + } + } +} + +// ----------------------------------------------------------------------------- +// CSwtTextSelectionEvent::CSwtTextSelectionEvent +// ----------------------------------------------------------------------------- +// +CSwtTextSelectionEvent::CSwtTextSelectionEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtTextSelectionEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CSwtTextSelectionEvent::ConstructL(const TDesC& aSelectedText) +{ + iSelectedText = aSelectedText.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CSwtTextSelectionEvent::NewL +// ----------------------------------------------------------------------------- +// +CSwtTextSelectionEvent* CSwtTextSelectionEvent::NewL(TSwtPeer aPeer, + const TDesC& aSelectedText) +{ + CSwtTextSelectionEvent* self = new(ELeave) CSwtTextSelectionEvent(aPeer); + CleanupStack::PushL(self); + self->ConstructL(aSelectedText); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CSwtTextSelectionEvent::~CSwtTextSelectionEvent +// ----------------------------------------------------------------------------- +// +CSwtTextSelectionEvent::~CSwtTextSelectionEvent() +{ + delete iSelectedText; +} + +// ----------------------------------------------------------------------------- +// CSwtTextSelectionEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtTextSelectionEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + jstring selectedText = NewJavaString(aJniEnv, *iSelectedText); + DeleteInUiHeap(iSelectedText); + iSelectedText = NULL; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "internal_sendEvent", + "(ILjava/lang/String;)V", static_cast(Type()), selectedText); +} +