diff -r ae942d28ec0e -r 2455ef1f5bbc javauis/lcdui_akn/javalcdui/src/Toolkit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/lcdui_akn/javalcdui/src/Toolkit.cpp Wed Sep 01 12:33:18 2010 +0100 @@ -0,0 +1,256 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "CMIDToolkit.h" +#include "MIDUtils.h" +#include "javax_microedition_lcdui_Toolkit.h" +#include "lcdgr.h" +#include "CMIDEvent.h" +#include +#include + +#ifdef LCDUI_DEBUG_ON +#include +#define LCDUI_DEBUG(msg) DEBUG(msg) +#define LCDUI_DEBUG_INT(msg,x) DEBUG_INT(msg,x) +#define LCDUI_DEBUG_INT2(msg,x,y) DEBUG_INT2(msg, x, y) +#else +#define LCDUI_DEBUG(msg) +#define LCDUI_DEBUG_INT(msg, x) +#define LCDUI_DEBUG_INT2(msg, x, y) +#endif + +/** + * Flag indexes and total number of flags + * @since S60 9.2 + */ +enum TFlags +{ + EFlagNgaEnabledIndex = 0, + EFlagCount +}; + +// +// Close the Java peers handle onto the toolkit. +// +// This stops any remaining events from being posted or dispatched. +// +// If there are any events on the queue the toolkit will continue +// to exists until the last event has been dequeued. +// +LOCAL_C void DisposeToolkit(JNIEnv& aJni, TInt aHandle) +{ + CMIDToolkit::Unhand(aHandle).Dispose(aJni); +} + +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1create +( + JNIEnv* aJni, + jobject aToolkit, + jint aServer, + jstring aName, + jint aUid, + jstring aHomeDir, + jobjectArray aAttributes, + jintArray aFlags +) +{ + RJString name(*aJni,aName); + RJString homeDir(*aJni,aHomeDir); + RPointerArray* attribArray = NULL; + + jint error = 0; + RPointerArray attributes; + if (aAttributes) + { + jint count = aJni->GetArrayLength(aAttributes); + jint index = 0; + ASSERT(count%2 == 0); + while ((indexGetObjectArrayElement(aAttributes, index); + { + RJString rjString(*aJni,jniString); + + HBufC* element = NULL; + TRAP(error, element = rjString.AllocL()) + if (error == KErrNone) + { + error = attributes.Append(element); + if (error) delete element; + } + } + // Delete only after rjString has been destructed + aJni->DeleteLocalRef(jniString); + + ++index; + } + } + if (error) + { + attributes.ResetAndDestroy(); + attributes.Close(); + return error; + } + attribArray=&attributes; + jint handle = CMIDToolkit::New(*aJni, aToolkit, aServer, name, aUid, homeDir, attribArray); + attributes.ResetAndDestroy(); + attributes.Close(); + + jint flags[EFlagCount]; +#ifdef RD_JAVA_NGA_ENABLED + flags[EFlagNgaEnabledIndex] = 1; +#else // !RD_JAVA_NGA_ENABLED + flags[EFlagNgaEnabledIndex] = 0; +#endif // RD_JAVA_NGA_ENABLED + aJni->SetIntArrayRegion(aFlags, 0, EFlagCount, &flags[0]); + return handle; +} + +JNIEXPORT void JNICALL Java_javax_microedition_lcdui_Toolkit__1dispose(JNIEnv* aJni,jobject,jint aToolkit) +{ + DisposeToolkit(*aJni, aToolkit); +} + +LOCAL_C void InvokeDisposeObject(CMIDToolkit* aToolkit, jint aObject) +{ + MMIDComponent* object = MIDUnhandObject(aObject); + aToolkit->DisposeObject(object); +} + +extern void DoDisposeObject(CMIDToolkit& aToolkit, jint aObject) +{ + aToolkit.ExecuteV(&InvokeDisposeObject, &aToolkit, aObject); +} + +JNIEXPORT void JNICALL Java_javax_microedition_lcdui_Toolkit__1disposeObject +(JNIEnv*,jobject,jint aToolkit,jint aObject) +{ + LCDUI_DEBUG_INT("Toolkit_disposeObject(%x)", aObject); + DoDisposeObject(*JavaUnhand(aToolkit), aObject); +} + +void InvokeSetCurrentL(CMIDToolkit* aToolkit, MMIDDisplayable* aDisplayable) +{ + LCDUI_DEBUG_INT2("Toolkit_setCurrent(%x, [%d])", (TInt)aDisplayable, (TInt)aDisplayable->Component()->Type()); + aToolkit->SetCurrentL(aDisplayable); +} + +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1setCurrent +( + JNIEnv*, + jobject, + jint aToolkitHandle, + jint aDisplayable +) +{ + CMIDToolkit* toolkit =JavaUnhand(aToolkitHandle); + MMIDDisplayable* displayable = MIDUnhandObject(aDisplayable); + return toolkit->ExecuteTrap(&InvokeSetCurrentL,toolkit,displayable); +} + +void InvokeSetForeground(CMIDToolkit* aToolkit, jboolean aForeground) +{ + LCDUI_DEBUG_INT("Toolkit_requestForeground(%d)", (TInt)aForeground); + if (aForeground) + { + aToolkit->BringToForeground(); + } + else + { + aToolkit->SendToBackground(); + } +} + +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1setForeground +( + JNIEnv*, + jobject, + jint aToolkit, + jboolean aForeground +) +{ + CMIDToolkit* toolkit = JavaUnhand(aToolkit); + toolkit->ExecuteV(&InvokeSetForeground,toolkit, aForeground); + return KErrNone; +} + +void InvokeSetCanvasAssumedSize(CMIDToolkit* aToolkit, jint aWidth, jint aHeight) +{ + CMIDEnv& env = *(CMIDEnv*)aToolkit->Env(); + env.SetCanvasAssumedSize(TSize(aWidth, aHeight)); +} +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1setCanvasSize +( + JNIEnv*, jobject, jint aToolkit, jint aWidth, jint aHeight +) +{ + CMIDToolkit* toolkit = JavaUnhand(aToolkit); + toolkit->ExecuteV(InvokeSetCanvasAssumedSize, toolkit, aWidth, aHeight); + return KErrNone; +} + +void InvokeActivateL(CMIDToolkit* aToolkit) +{ + aToolkit->ActivateL(); +} + +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1activate(JNIEnv*, jobject, jint aToolkit) +{ + CMIDToolkit* toolkit = JavaUnhand(aToolkit); + return toolkit->ExecuteTrap(&InvokeActivateL, toolkit); +} + +extern "C" void pss(); + +jint InvokePostEvent(CMIDToolkit* aToolkit, jint aSource, jint aType, jint aEvent) +{ + LCDUI_DEBUG_INT2("InvokePostEvent(%x,%d)", aSource, aEvent); + //pss(); + MMIDComponent* source = MIDUnhand(aSource); + switch (aType) + { + case EItem: + return aToolkit->PostItemEvent(*source, (TEventType)aEvent, 0, 0, 0); + case EDisplayable: + return aToolkit->PostDisplayableEvent(*source, (TEventType)aEvent, 0, 0); + case EMIDlet: + return aToolkit->PostDisplayEvent((TEventType)aEvent); + case ECanvasGraphicsItemPainterEvent: + return aToolkit->PostCanvasGraphicsItemPainterEvent(*source, (TEventType)aEvent, 0, 0); + default: + ASSERT(EFalse); + } + return KErrArgument; +} + +JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Toolkit__1postEvent +( + JNIEnv* /*aEnv*/, + jobject /*aToolkit*/, + jint aHandle, + jint aSource, + jint aType, + jint aEvent +) +{ + CMIDToolkit* toolkit = JavaUnhand(aHandle); + return toolkit->Execute(&InvokePostEvent, toolkit, aSource, aType, aEvent); +}