javauis/lcdui_akn/javalcdui/src/Canvas.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 12:05:25 +0300
branchRCL_3
changeset 77 7cee158cb8cd
parent 19 04becd199f91
child 83 26b2b12093af
permissions -rw-r--r--
Revision: v2.2.13 Kit: 201036

/*
* 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_Canvas.h"

#ifdef LCDUI_DEBUG_ON
#include <jdebug.h>
#define LCDUI_DEBUG_INT2(msg, x, y) DEBUG_INT2(msg, x, y)
#else
#define LCDUI_DEBUG_INT2(msg, x, y)
#endif

struct TCanvasCreate
{
    jweak       iRef;
    jint        iDisplayable;
    jboolean    iIsGameCanvas;
};

struct TCanvasAttribs
{
    TInt  iHandle;
    TSize iSize;
    TBool iFrameBuffer;
    TBool iHasBackground;
    TBool iVideoOverlayEnabled;
};

LOCAL_C void CreateCanvasL(CMIDToolkit* aToolkit, TCanvasCreate* aCreate, TCanvasAttribs* aAttribs)
{
    MMIDDisplayable* container = MIDUnhand<MMIDDisplayable>(aCreate->iDisplayable);
    // Create a new MMIDCanvas object
    MMIDCanvas* canvas = aToolkit->ComponentFactory()->CreateCanvasL(
                             *container,
                             (aCreate->iIsGameCanvas ? MMIDComponent::EGameCanvas : MMIDComponent::ECanvas));
    CleanupDisposePushL(canvas);
    aAttribs->iHandle = aToolkit->RegisterComponentL(canvas, aCreate->iRef);
    container->SetComponentL(*canvas);
    CleanupPopComponent(canvas);
    aCreate->iRef = 0;
    aAttribs->iSize = canvas->ContentSize();
    aAttribs->iFrameBuffer = static_cast< TBool >(canvas->FrameBuffer() != NULL);

    // Check from a MMIDEnv object if the canvas object has a background or not
    aAttribs->iHasBackground = aToolkit->Env()->CanvasHasBackground(*canvas);
    aAttribs->iVideoOverlayEnabled = aToolkit->Env()->VideoOverlayEnabled();
}

JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1create
(
    JNIEnv*   aJni,
    jobject   aCanvas,
    jint      aToolkit,
    jint      aDisplayable,
    jboolean  aIsGameCanvas,
    jintArray aAttribsReturn
)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);

    TCanvasCreate create;
    create.iDisplayable=aDisplayable;
    create.iRef= aJni->NewWeakGlobalRef(aCanvas);
    create.iIsGameCanvas = aIsGameCanvas;

    TCanvasAttribs attribs;
    attribs.iFrameBuffer=EFalse;
    attribs.iHasBackground = EFalse;
    attribs.iVideoOverlayEnabled = EFalse;

    jint error;
    if (create.iRef)
    {
        error = toolkit->ExecuteTrap(&CreateCanvasL, toolkit, &create, &attribs);
    }
    else
    {
        error = KErrNoMemory;
    }

    if (create.iRef)
    {
        // should be cleared in CreateCanvasL if no error
        aJni->DeleteWeakGlobalRef(create.iRef);
    }

    ASSERT(aJni->GetArrayLength(aAttribsReturn) == 6);
    jint attribsArray[6];
    attribsArray[0] = static_cast< jint >(attribs.iHandle);
    attribsArray[1] = static_cast< jint >(attribs.iSize.iWidth);
    attribsArray[2] = static_cast< jint >(attribs.iSize.iHeight);
    attribsArray[3] = static_cast< jint >(attribs.iFrameBuffer);
    attribsArray[4] = static_cast< jint >(attribs.iHasBackground);
    attribsArray[5] = static_cast< jint >(attribs.iVideoOverlayEnabled);
    aJni->SetIntArrayRegion(aAttribsReturn, 0, 6, &attribsArray[0]);

    LCDUI_DEBUG_INT2("Canvas_create(%x == %x)", handle, (TInt)MIDUnhandObject<MMIDCanvas>(handle));
    return error;
}

LOCAL_C TInt GetKeyCode(MMIDUtils* aUtils,TInt aGameAction)
{
    return aUtils->GetKeyCode(aGameAction);
}
JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1getKeyCode
(JNIEnv *,jobject,jint aToolkit,jint aGameAction)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    jint keyCode = toolkit->Execute(&GetKeyCode, toolkit->Utils(),(TInt)aGameAction);
    return keyCode;
}

LOCAL_C void GetKeyName(MMIDUtils* aUtils,TDes* aText,TInt aKeyCode)
{
    aUtils->GetKeyName(*aText,aKeyCode);
}
JNIEXPORT jstring JNICALL Java_javax_microedition_lcdui_Canvas__1getKeyName
(JNIEnv* aJni,jobject,jint aToolkit,jint aKeyCode)
{
    TBuf<KMaxName> keyName;
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    toolkit->ExecuteV(&GetKeyName,toolkit->Utils(),(TDes*)&keyName,(TInt)aKeyCode);
    jstring str = CreateJavaString(*aJni,keyName);
    return str;
}

LOCAL_C TInt GetGameAction(MMIDUtils* aUtils,TInt aKeyCode)
{
    return aUtils->GetGameAction(aKeyCode);
}
JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1getGameAction
(JNIEnv*, jclass, jint aToolkit, jint aKeyCode)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    jint gameAction = toolkit->Execute(&GetGameAction, toolkit->Utils(), (TInt)aKeyCode);
    LCDUI_DEBUG_INT2("getGameAction(%d) -> %d", aKeyCode, gameAction);
    return gameAction;
}

LOCAL_C void InvokeGetCanvasSize(MMIDCanvas* aCanvas, TSize* aSize)
{
    *aSize = aCanvas->ContentSize();
}

JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1getCanvasSize
(
    JNIEnv*,
    jobject,
    jint aToolkit,
    jint aCanvas
)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    MMIDCanvas* canvas = MIDUnhand<MMIDCanvas>(aCanvas);
    TSize size;
    toolkit->ExecuteV(&InvokeGetCanvasSize, canvas, &size);
    return (size.iWidth << 16) | (size.iHeight & 0x0000ffff);
}

LOCAL_C void InvokeSuppressKeys(MMIDCanvas* aCanvas)
{
    ASSERT(aCanvas);
    aCanvas->SuppressKeys();
}

JNIEXPORT void JNICALL Java_javax_microedition_lcdui_Canvas__1suppressKeyEvents
(JNIEnv*,jobject,jint aToolkit,jint aCanvas)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    MMIDCanvas*  canvas  = MIDUnhand<MMIDCanvas>(aCanvas);
    toolkit->ExecuteV(&InvokeSuppressKeys, canvas);
}

LOCAL_C TInt InvokeGameActions(MMIDCanvas* aCanvas)
{
    ASSERT(aCanvas);
    return TInt(aCanvas->GameActions());
}

JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1getKeyStates
(JNIEnv *,jobject,jint aToolkit, jint aCanvas)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    MMIDCanvas*  canvas  = MIDUnhand<MMIDCanvas>(aCanvas);

    TInt actions = toolkit->Execute(&InvokeGameActions, canvas);
    return actions;
}

LOCAL_C void InvokeSetFullScreenModeL(jint aDisplayable,jboolean aFullScreen, jint* aSizeArray)
{
    MMIDDisplayable* displayable = MIDUnhandObject<MMIDDisplayable>(aDisplayable);
    MMIDCanvas* canvas = (MMIDCanvas*)displayable->Component();
    displayable->SetFullScreenModeL(aFullScreen);
    TSize size = canvas->ContentSize();
    aSizeArray[0]=size.iWidth;
    aSizeArray[1]=size.iHeight;
}

JNIEXPORT jint JNICALL Java_javax_microedition_lcdui_Canvas__1setFullScreenMode
(JNIEnv* aEnv,jobject,jint aToolkit,jint aDisplayable,jboolean aFullScreen, jintArray aSizeReturn)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    jint sizeArray[2];
    jint err = toolkit->ExecuteTrap(&InvokeSetFullScreenModeL, aDisplayable, aFullScreen, sizeArray);
    aEnv->SetIntArrayRegion(aSizeReturn, 0, 2, sizeArray);
    return err;
}

LOCAL_C jboolean InvokeNetworkIndicatorLocation(MMIDCanvas* aCanvas, jint* aPositionArray, jint* aSizeArray)
{
    TSize size;
    TPoint position;
    TBool indicatorExists = aCanvas->NetworkIndicatorLocation(position, size);
    aPositionArray[0] = position.iX;
    aPositionArray[1] = position.iY;
    aSizeArray[0] = size.iWidth;
    aSizeArray[1] = size.iHeight;
    return indicatorExists;
}

JNIEXPORT jboolean JNICALL Java_javax_microedition_lcdui_Canvas__1getNetworkIndicatorLocation
(JNIEnv* aEnv,jobject, jint aToolkit, jint aCanvas, jintArray aPosition, jintArray aSize)
{
    CMIDToolkit* toolkit = JavaUnhand<CMIDToolkit>(aToolkit);
    MMIDCanvas*  canvas  = MIDUnhand<MMIDCanvas>(aCanvas);
    jint positionArray[2];
    jint sizeArray[2];
    jboolean indicatorExists = toolkit->Execute(&InvokeNetworkIndicatorLocation, canvas, positionArray, sizeArray);
    aEnv->SetIntArrayRegion(aPosition, 0, 2, positionArray);
    aEnv->SetIntArrayRegion(aSize,     0, 2, sizeArray);
    return indicatorExists;
}