# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1276065247 -10800 # Node ID 71c436fe3ce075d1edd4a02ff8db85bbf9f4491e # Parent 9ac0a0a7da70788fe4910dcfebe026e58ed61dc8 Revision: v2.1.28 Kit: 2010123 diff -r 9ac0a0a7da70 -r 71c436fe3ce0 build/buildutils/checkfilenames.py --- a/build/buildutils/checkfilenames.py Tue May 25 12:34:19 2010 +0300 +++ b/build/buildutils/checkfilenames.py Wed Jun 09 09:34:07 2010 +0300 @@ -42,7 +42,7 @@ ".cvsignore", ".dat", ".dcf", ".def", ".defs", ".dll", ".der", ".doc", ".dr", ".dso", ".dsp", ".dsw", ".dtd", ".emx", ".exe", ".flm", ".gcfml", ".gif", - ".h", ".hrh", ".html", ".iby", ".inf", ".ini", ".inl", + ".h", ".hrh", ".htm", ".html", ".iby", ".inf", ".ini", ".inl", ".jad", ".jar", ".java", ".javaversion", ".jpeg", ".jpg", ".js", ".jsp", ".jupiter", ".key", ".ks", ".launch", ".lib", ".loc", ".log", ".mak", ".make", "makefile", "makefile_akn", "makefile_qt", "manifest", ".mbm", ".mdl", diff -r 9ac0a0a7da70 -r 71c436fe3ce0 build/makefile.javaversion --- a/build/makefile.javaversion Tue May 25 12:34:19 2010 +0300 +++ b/build/makefile.javaversion Wed Jun 09 09:34:07 2010 +0300 @@ -1,6 +1,6 @@ # Set Java version (must be dot separated, without spaces) ifdef RD_JAVA_S60_RELEASE_5_0_IAD - JAVA_VERSION = 2.1.26 + JAVA_VERSION = 2.1.28 else - JAVA_VERSION = 2.1.26 + JAVA_VERSION = 2.1.28 endif diff -r 9ac0a0a7da70 -r 71c436fe3ce0 build/sis/java_2_0.pkg --- a/build/sis/java_2_0.pkg Tue May 25 12:34:19 2010 +0300 +++ b/build/sis/java_2_0.pkg Wed Jun 09 09:34:07 2010 +0300 @@ -663,6 +663,7 @@ "\epoc32\data\z\resource\plugins\LCDC64K.rsc"-"c:\resource\plugins\LCDC64K.rsc" "\epoc32\release\armv5\urel\lcdgdrv.dll"-"c:\sys\bin\lcdgdrv.dll" "\epoc32\release\armv5\urel\lcdgdrvi.dll"-"c:\sys\bin\lcdgdrvi.dll" +"\epoc32\release\armv5\urel\lcduiphysicswrap.dll"-"c:\sys\bin\lcduiphysicswrap.dll" #ifdef RD_JAVA_S60_RELEASE_5_0_IAD "\epoc32\release\armv5\urel\midp2permissiondb.dll"-"c:\sys\bin\midp2permissiondb.dll" "\epoc32\release\armv5\urel\midp2userpreferences.dll"-"c:\sys\bin\midp2userpreferences.dll" diff -r 9ac0a0a7da70 -r 71c436fe3ce0 inc/build_defines.hrh --- a/inc/build_defines.hrh Tue May 25 12:34:19 2010 +0300 +++ b/inc/build_defines.hrh Wed Jun 09 09:34:07 2010 +0300 @@ -15,7 +15,7 @@ * */ -#define RD_JAVA_VERSION 2,1,26 +#define RD_JAVA_VERSION 2,1,28 #define RD_JAVA_SYMBIAN_TARGET #define RD_JAVA_S60_RELEASE_9_2 #define RD_JAVA_S60_RELEASE_9_2_ONWARDS diff -r 9ac0a0a7da70 -r 71c436fe3ce0 inc/java.txt --- a/inc/java.txt Tue May 25 12:34:19 2010 +0300 +++ b/inc/java.txt Wed Jun 09 09:34:07 2010 +0300 @@ -1,1 +1,1 @@ -2.1.26 +2.1.28 diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java --- a/javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/gcfprotocols/http/javasrc.s60/com/nokia/mj/impl/gcf/protocol/http/Protocol.java Wed Jun 09 09:34:07 2010 +0300 @@ -45,7 +45,7 @@ String urls = null; int apnid = -1; int index = -1; - int responsetimeout = -1; + int responsetimeout = 180; // default timeout of 3 minutes ConnectionManager cminstance = null; AccessPoint apn = null; iFullUrl = "http:" + aUri; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp --- a/javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/gcfprotocols/http/src.s60/chttptransactionclient.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -626,6 +626,14 @@ iStatus = CHttpTransactionClient::ERequestNextBodayData; break; } + + case THTTPEvent::EReceiveTimeOut: + { + ELOG(ESOCKET,"MHFRunL EReceiveTimeOut"); + NotifyErrorL(KErrTimedOut); // send timeout error to java + break; + + } /* * -j2me expects the http stack to be able to post body data with no content type * the native stack default validation filter does not allow this. @@ -694,7 +702,6 @@ iTransaction.Cancel(); iHttpSession.RestartConnection(); - } if (iJavaWaitingOnCallBack) { @@ -707,7 +714,7 @@ LOG(ESOCKET,EInfo,"Notifiy Read EOF / Cancel"); iJavaWaitingOnCallBack=EFalse; //Notify Java of error if it is waiting for a read - iObserver->DataReadyForRead(-1); + iObserver->DataReadyForRead(aErrorCode); } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/jvms/j9/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/jvms/j9/bld.inf Wed Jun 09 09:34:07 2010 +0300 @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2009 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: Generated bld.inf -file +* +*/ + +PRJ_PLATFORMS +default + +#include "exports.inf" diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/jvms/j9/exports.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/jvms/j9/exports.inf Wed Jun 09 09:34:07 2010 +0300 @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2010 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: +* +*/ + +PRJ_PLATFORMS +default + +#ifndef RD_JAVA_SF_BUILD +#include "s60/exports.inf" +#endif diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/jvms/j9/j9.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/jvms/j9/j9.pro Wed Jun 09 09:34:07 2010 +0300 @@ -0,0 +1,23 @@ +# +# Copyright (c) 2010 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: +# + +TEMPLATE = subdirs + +# Export J9 only when available here (not available here in SF builds) +# (use indirection through ./exports.inf for pregenerated bld.inf variation) +exists($${_PRO_FILE_PWD_}/s60/exports.inf): { + BLD_INF_RULES.prj_extensions += "$${LITERAL_HASH}include \"exports.inf\"" \ +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/att_manufacturer.txt --- a/javacommons/security/data/att_manufacturer.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/att_manufacturer.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/att_operator.txt --- a/javacommons/security/data/att_operator.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/att_operator.txt Wed Jun 09 09:34:07 2010 +0300 @@ -48,8 +48,16 @@ permission javax.microedition.io.PushRegistryPermission "*" "staticregistration,dynamicregistration,autoinvocation"; } +grant user "Url start" blanket,session,oneshot,no { + permission javax.microedition.midlet.CmdLineArgsPermission; +} + grant allowed { permission javax.microedition.io.Connector.sms "sms://*" "open,receive"; permission javax.microedition.io.Connector.mms "mms://*" "open,receive"; permission javax.microedition.io.Connector.cbs "cbs://*" "open,receive"; } + +grant assigned { + permission javax.microedition.midlet.AutoStartPermission; +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/att_operatorextra.txt --- a/javacommons/security/data/att_operatorextra.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/att_operatorextra.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/msa_manufacturer.txt --- a/javacommons/security/data/msa_manufacturer.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/msa_manufacturer.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/msa_operator.txt --- a/javacommons/security/data/msa_operator.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/msa_operator.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/msa_trustedthirdparty.txt --- a/javacommons/security/data/msa_trustedthirdparty.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/msa_trustedthirdparty.txt Wed Jun 09 09:34:07 2010 +0300 @@ -62,6 +62,10 @@ permission javax.microedition.apdu.aid "apdu://*" "aid"; } +grant user "Url start" session,oneshot,no { + permission javax.microedition.midlet.CmdLineArgsPermission; +} + grant allowed { permission javax.microedition.io.Connector.sms "sms://*" "open,receive"; permission javax.microedition.io.Connector.mms "mms://*" "open,receive"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/s60_manufacturer.txt --- a/javacommons/security/data/s60_manufacturer.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/s60_manufacturer.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/s60_operator.txt --- a/javacommons/security/data/s60_operator.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/s60_operator.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/data/s60_trustedthirdparty.txt --- a/javacommons/security/data/s60_trustedthirdparty.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/data/s60_trustedthirdparty.txt Wed Jun 09 09:34:07 2010 +0300 @@ -63,6 +63,10 @@ permission javax.microedition.securityservice.CMSMessageSignatureService "pki://*" "authenticate"; } +grant user "Url start" session,oneshot,no { + permission javax.microedition.midlet.CmdLineArgsPermission; +} + grant allowed { permission javax.microedition.io.Connector.sms "sms://*" "open,receive"; permission javax.microedition.io.Connector.mms "mms://*" "open,receive"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/inc/securitystoragedatadefs.h --- a/javacommons/security/inc/securitystoragedatadefs.h Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/inc/securitystoragedatadefs.h Wed Jun 09 09:34:07 2010 +0300 @@ -42,6 +42,7 @@ const wchar_t* const AUTHENTICATION_SETTINGS = L"Authentication"; const wchar_t* const BROADCAST_SETTINGS = L"Broadcast"; const wchar_t* const NFC_WRITE_ACCESS_SETTINGS = L"NFC Write Access"; +const wchar_t* const URL_START_SETTINGS = L"Url start"; // interaction modes values const wchar_t* const ONESHOT_INTERACTION_MODE = L"1"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/common/Certificate.java Wed Jun 09 09:34:07 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -318,8 +318,9 @@ { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, Integer.parseInt(str.substring(0,4))); - cal.set(Calendar.MONTH, Integer.parseInt(str.substring(4,6))); - cal.set(Calendar.DAY_OF_WEEK, Integer.parseInt(str.substring(6,8))); + // Calendar.MONTH begins from 0 (0=January, 1=Februrary, ...) + cal.set(Calendar.MONTH, Integer.parseInt(str.substring(4,6)) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(str.substring(6,8))); cal.set(Calendar.HOUR, Integer.parseInt(str.substring(8,10))); cal.set(Calendar.MINUTE, Integer.parseInt(str.substring(10,12))); cal.set(Calendar.SECOND, Integer.parseInt(str.substring(12,14))); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/AccessControllerFactoryImpl.java Wed Jun 09 09:34:07 2010 +0300 @@ -61,7 +61,7 @@ * which the AccessControllerImpl instance * is retrieved */ - public static AccessControllerImpl getAccessController(StorageSession aStorageSession, + public synchronized static AccessControllerImpl getAccessController(StorageSession aStorageSession, Uid aAppSuiteUid, String aAppName) { @@ -69,7 +69,6 @@ { return null; } - // Synchronization missing AccessControllerImpl instance = (AccessControllerImpl)instances.get( aAppSuiteUid); @@ -82,14 +81,13 @@ return instance; } - public static void destroyAccessController(Uid appUID) + public synchronized static void destroyAccessController(Uid appUID) { if (appUID == null) { return; } // This is to be called when a MIDlet suite is stoped - // Synchronization missing // Remove the instance or mark it as inactive? AccessControllerImpl ac = (AccessControllerImpl)instances .remove(appUID); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPromptHandler.java Wed Jun 09 09:34:07 2010 +0300 @@ -81,7 +81,7 @@ } } - public UserSecuritySettings handleUserPermission( + public synchronized UserSecuritySettings handleUserPermission( UserPermission userPermission, boolean blanketPromptShown) { UserSecuritySettings settings = userPermission @@ -219,7 +219,7 @@ } else { - RuntimeUi ui = getUiInstance(); + getUiInstance(); boolean responseAvailable = ui.confirm( appName, cData); @@ -329,13 +329,12 @@ } } - private RuntimeUi getUiInstance() + private void getUiInstance() { if (ui == null) { ui = RuntimeUiFactory.getRuntimeUi(); } - return ui; } private UserSecuritySettings handleDenyAnswer(UserSecuritySettings settings) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/PermissionMappingTable.java Wed Jun 09 09:34:07 2010 +0300 @@ -228,6 +228,12 @@ PERMISSION_MAPPING_TABLE.put( "javax.microedition.midlet.AutoStartPermission", new MIDPPermission( "com.nokia.mj.impl.installer.utils.AutoStartPermission", null)); + PERMISSION_MAPPING_TABLE.put( + "javax.microedition.midlet.CmdLineArgsPermission", new MIDPPermission( + "com.nokia.mj.impl.rt.utils.CmdLineArgsPermission", null)); + PERMISSION_MAPPING_TABLE.put( + "com.nokia.webstart", new MIDPPermission( + "com.nokia.mj.impl.rt.utils.CmdLineArgsPermission", null)); } /** diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettings.java Wed Jun 09 09:34:07 2010 +0300 @@ -48,6 +48,7 @@ public static final String AUTHENTICATION_SETTINGS = "Authentication"; public static final String BROADCAST_SETTINGS = "Broadcast"; public static final String NFC_WRITE_ACCESS_SETTINGS = "NFC Write Access"; + public static final String URL_START_SETTINGS = "Url start"; // security warnings modes public static final String SECURITY_WARNINGS_USER_DEFINED_MODE = "1"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/midp/common/UserSecuritySettingsImpl.java Wed Jun 09 09:34:07 2010 +0300 @@ -51,6 +51,7 @@ private static final String AUTHENTICATION_ID = "setting_auth"; private static final String BROADCAST_ID = "setting_broadcast"; private static final String NFC_WRITE_ACCESS_ID = "setting_nfc_write_access"; + private static final String URL_START_ID = "setting_url_start"; public UserSecuritySettingsImpl( String name, @@ -159,6 +160,10 @@ { id = BROADCAST_ID; } + else if (URL_START_SETTINGS.equalsIgnoreCase(aSettingName)) + { + id = URL_START_ID; + } return resLoader.format(id, null /*aTextParameters*/); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java --- a/javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/javasrc/com/nokia/mj/impl/security/utils/SecurityPromptMessage.java Wed Jun 09 09:34:07 2010 +0300 @@ -79,6 +79,7 @@ public static final String QUESTION_ID_PUSH_DYNAMIC_REGISTRATION = "push_registration_dynamic"; public static final String QUESTION_ID_AUTO_INVOCATION = "auto_invocation"; public static final String QUESTION_ID_NDEF_TAG_WRITE = "nfc_ndef_tag_write"; + public static final String QUESTION_ID_APP_AUTO_LAUNCH = "url_start"; // identifiers for the security prompt answer options public static final String ANSWER_ID_ALLOW = "prompt_allow"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/tsrc/data/policies/test_manufacturer.txt --- a/javacommons/security/tsrc/data/policies/test_manufacturer.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/tsrc/data/policies/test_manufacturer.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { permission javax.microedition.PropertyPermission "mobinfo.msisdn" "read"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/tsrc/data/policies/test_operator.txt --- a/javacommons/security/tsrc/data/policies/test_operator.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/tsrc/data/policies/test_operator.txt Wed Jun 09 09:34:07 2010 +0300 @@ -30,6 +30,7 @@ permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; permission javax.microedition.PropertyPermission "mobinfo.imsi" "read"; + permission javax.microedition.midlet.CmdLineArgsPermission; } grant assigned { permission javax.microedition.PropertyPermission "mobinfo.msisdn" "read"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/tsrc/data/policies/test_operatorextra.txt --- a/javacommons/security/tsrc/data/policies/test_operatorextra.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/tsrc/data/policies/test_operatorextra.txt Wed Jun 09 09:34:07 2010 +0300 @@ -29,4 +29,5 @@ permission javax.microedition.media.control.RecordControl "*" "record"; permission javax.microedition.media.control.VideoControl.getSnapshot "*" "snapshot"; permission javax.microedition.io.Connector.rtsp "*"; + permission javax.microedition.midlet.CmdLineArgsPermission; } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt --- a/javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/tsrc/data/policies/test_trustedthirdparty.txt Wed Jun 09 09:34:07 2010 +0300 @@ -63,6 +63,10 @@ permission javax.microedition.securityservice.CMSMessageSignatureService "pki://*" "authenticate"; } +grant user "Url start" session,oneshot,no { + permission javax.microedition.midlet.CmdLineArgsPermission; +} + grant allowed { permission javax.microedition.io.Connector.sms "sms://*" "open,receive"; permission javax.microedition.io.Connector.mms "mms://*" "open,receive"; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java --- a/javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/security/tsrc/javasrc/com/nokia/mj/impl/security/midp/authorization/SecurityPolicyModuleTests.java Wed Jun 09 09:34:07 2010 +0300 @@ -89,6 +89,7 @@ new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null), new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null), new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.AutoStartPermission"),null,null,null), + new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null,null,null), }; static final SecurityPolicyPermission[] OPERATOR_PERMS = { @@ -142,6 +143,7 @@ new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null), new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null), new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.AutoStartPermission"),null,null,null), + new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null,null,null), }; static final SecurityPolicyPermission[] IDENTIFIED_THIRD_PARTY_PERMS = { @@ -265,6 +267,9 @@ new int[]{UserSecuritySettings.BLANKET_INTERACTION_MODE,UserSecuritySettings.ONESHOT_INTERACTION_MODE,UserSecuritySettings.NO_INTERACTION_MODE,UserSecuritySettings.SESSION_INTERACTION_MODE})), new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.publicinfo","read",null), new SecurityPolicyPermission(getPermissionName("javax.microedition.PropertyPermission"),"mobinfo.cellid","read",null), + new SecurityPolicyPermission(getPermissionName("javax.microedition.midlet.CmdLineArgsPermission"),null, null, + new SecurityPolicyPermissionSettings("Url start",UserSecuritySettings.SESSION_INTERACTION_MODE, + new int[]{UserSecuritySettings.ONESHOT_INTERACTION_MODE,UserSecuritySettings.NO_INTERACTION_MODE,UserSecuritySettings.SESSION_INTERACTION_MODE})), }; static final SecurityPolicyPermission[] UNIDENTIFIED_THIRD_PARTY_PERMS = { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javacommons/utils/src.s60/s60commonutils.cpp --- a/javacommons/utils/src.s60/s60commonutils.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javacommons/utils/src.s60/s60commonutils.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -118,6 +118,12 @@ for (int i = 0; i< count; i++) { + if( !aNativeArray[ i ] ) + { + // Skip null elements since already initialized + continue; + } + //TPtr16 temp = aNativeArray[i]->Des(); jstring javaString = S60CommonUtils::NativeToJavaString(aJni, *aNativeArray[i]); if (javaString == NULL) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javamanager/javasettings/appmngrplugin/data/javaapplicationsettings.rss --- a/javamanager/javasettings/appmngrplugin/data/javaapplicationsettings.rss Tue May 25 12:34:19 2010 +0300 +++ b/javamanager/javasettings/appmngrplugin/data/javaapplicationsettings.rss Wed Jun 09 09:34:07 2010 +0300 @@ -432,6 +432,21 @@ editor_resource_id = r_java__sec_lbx_resource; } +//---------------------------------------------------------- +// +// r_java_setting_url_start_page +// Setting page for url start security permission +// +//---------------------------------------------------------- +// +RESOURCE AVKON_SETTING_PAGE r_java_setting_url_start_page + { + label = qtn_java_setting_url_start; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + type = EAknSetListBox; + editor_resource_id = r_java__sec_lbx_resource; + } + // ------------------------------------------------------ // Misc strings // ------------------------------------------------------ @@ -463,6 +478,7 @@ RESOURCE TBUF r_java_setting_name_network_destination { buf=qtn_netw_conset_sett_destination; } RESOURCE TBUF r_java_setting_name_broadcast { buf=qtn_java_setting_broadcast; } RESOURCE TBUF r_java_setting_name_nfc_write_access { buf=qtn_java_setting_nfc_write_access; } +RESOURCE TBUF r_java_setting_name_url_start { buf=qtn_java_setting_url_start; } RESOURCE TBUF r_java_setting_name_security_warnings { buf=qtn_java_setting_security_level; } RESOURCE TBUF r_java_setting_value_no { buf=qtn_java_setting_value_no; } RESOURCE TBUF r_java_setting_value_oneshot { buf=qtn_java_setting_value_oneshot; } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javamanager/javasettings/appmngrplugin/inc/appmngr2midletsettingsutil.h --- a/javamanager/javasettings/appmngrplugin/inc/appmngr2midletsettingsutil.h Tue May 25 12:34:19 2010 +0300 +++ b/javamanager/javasettings/appmngrplugin/inc/appmngr2midletsettingsutil.h Wed Jun 09 09:34:07 2010 +0300 @@ -65,7 +65,8 @@ const int SMART_CARD_COMMUNICATION_SETTINGS_DISPLAY_INDEX = 15; const int BROADCAST_SETTINGS_DISPLAY_INDEX = 16; const int NFC_WRITE_ACCESS_SETTINGS_DISPLAY_INDEX = 17; -const int LAST_SETTINGS_DISPLAY_INDEX = 18; +const int URL_START_SETTINGS_DISPLAY_INDEX = 18; +const int LAST_SETTINGS_DISPLAY_INDEX = 19; // CLASS DECLARATION class MidletSuiteSecuritySettings: public CBase diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingshandler.cpp --- a/javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingshandler.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingshandler.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -140,14 +140,23 @@ } default: { - RCmManagerExt manager; - manager.OpenLC(); - RCmDestinationExt destination = manager.DestinationL(apnId); - CleanupClosePushL(destination); - name = destination.NameLC(); - CleanupStack::Pop(name); - CleanupStack::PopAndDestroy(&destination); - CleanupStack::PopAndDestroy(&manager); + TRAPD(err, + RCmManagerExt manager; + manager.OpenLC(); + RCmDestinationExt destination = manager.DestinationL(apnId); + CleanupClosePushL(destination); + name = destination.NameLC(); + CleanupStack::Pop(name); + CleanupStack::PopAndDestroy(&destination); + CleanupStack::PopAndDestroy(&manager); + ); + if (err != KErrNone) + { + // reset it back to default + snap->iId = (TUint)KDefaultConnection; + name = StringLoader::LoadL(R_JAVA_CONSET_SETT_DEFAULT_CONNECTION); + ConnectionManager::setDestinationNetworkIdL(iMidletSuiteUid, snap->iId); + } } } if (resourceOffset > 0) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingsutil.cpp --- a/javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingsutil.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javamanager/javasettings/appmngrplugin/src/appmngr2midletsettingsutil.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -382,6 +382,10 @@ { return NFC_WRITE_ACCESS_SETTINGS_DISPLAY_INDEX; } + if (aSettingsName == URL_START_SETTINGS) + { + return URL_START_SETTINGS_DISPLAY_INDEX; + } return LAST_SETTINGS_DISPLAY_INDEX; } @@ -472,99 +476,106 @@ { return R_JAVA_SETTING_NFC_WRITE_ACCESS_PAGE; } + if (aSettingsName == URL_START_SETTINGS) + { + return R_JAVA_SETTING_URL_START_PAGE; + } return R_JAVA_SETTING_DEFAULT_PAGE; } const wstring AppMngr2MidletSettingsUtil::getLocalizedSettingsName(wstring aSettingsName) { - HBufC* localizedName = NULL; - if (aSettingsName == ACCESS_POINT_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NETWORK_DESTINATION); - } - else if (aSettingsName == ON_SCREEN_KEYPAD_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_KEYPAD); - } - else if (aSettingsName == SECURITY_WARNINGS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_SECURITY_WARNINGS); - } - else if (aSettingsName == NET_ACCESS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NET_ACCESS); - } - else if (aSettingsName == LOW_LEVEL_NET_ACCESS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOW_LEVEL_NET_ACCESS); - } - else if (aSettingsName == CALL_CONTROL_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_RESTRICTED_CALL_CONTROL); - } - else if (aSettingsName == MESSAGING_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_MESSAGING); - } - else if (aSettingsName == RESTRICTED_MESSAGING_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_RESTRICTED_MESSAGING); - } - else if (aSettingsName == APPLICATION_AUTO_INVOCATION_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_APP_AUTO_INVOCAT); - } - else if (aSettingsName == LOCAL_CONNECTIVITY_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOCAL_CONN); - } - else if (aSettingsName == MULTIMEDIA_RECORDING_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_MM_RECORD); - } - else if (aSettingsName == READ_USER_DATA_ACCESS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_READ_DATA); - } - else if (aSettingsName == WRITE_USER_DATA_ACCESS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_WRITE_DATA); - } - else if (aSettingsName == LOCATION_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOCATION); - } - else if (aSettingsName == LANDMARK_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LANDMARKS); - } - else if (aSettingsName == AUTHENTICATION_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_AUT); - } - else if (aSettingsName == SMART_CARD_COMMUNICATION_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_SMARTCARD); - } - else if (aSettingsName == BROADCAST_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_BROADCAST); - } - else if (aSettingsName == NFC_WRITE_ACCESS_SETTINGS) - { - localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NFC_WRITE_ACCESS); - } - if (localizedName != NULL) - { - wstring ret = wstring((const wchar_t*)localizedName->Ptr(), localizedName->Length()); - CleanupStack::PopAndDestroy(localizedName); - return ret; - } - else - { - return aSettingsName; - } + wstring ret = aSettingsName; + TRAP_IGNORE( + HBufC* localizedName = NULL; + if (aSettingsName == ACCESS_POINT_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NETWORK_DESTINATION); + } + else if (aSettingsName == ON_SCREEN_KEYPAD_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_KEYPAD); + } + else if (aSettingsName == SECURITY_WARNINGS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_SECURITY_WARNINGS); + } + else if (aSettingsName == NET_ACCESS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NET_ACCESS); + } + else if (aSettingsName == LOW_LEVEL_NET_ACCESS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOW_LEVEL_NET_ACCESS); + } + else if (aSettingsName == CALL_CONTROL_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_RESTRICTED_CALL_CONTROL); + } + else if (aSettingsName == MESSAGING_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_MESSAGING); + } + else if (aSettingsName == RESTRICTED_MESSAGING_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_RESTRICTED_MESSAGING); + } + else if (aSettingsName == APPLICATION_AUTO_INVOCATION_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_APP_AUTO_INVOCAT); + } + else if (aSettingsName == LOCAL_CONNECTIVITY_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOCAL_CONN); + } + else if (aSettingsName == MULTIMEDIA_RECORDING_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_MM_RECORD); + } + else if (aSettingsName == READ_USER_DATA_ACCESS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_READ_DATA); + } + else if (aSettingsName == WRITE_USER_DATA_ACCESS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_WRITE_DATA); + } + else if (aSettingsName == LOCATION_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LOCATION); + } + else if (aSettingsName == LANDMARK_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_LANDMARKS); + } + else if (aSettingsName == AUTHENTICATION_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_AUT); + } + else if (aSettingsName == SMART_CARD_COMMUNICATION_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_SMARTCARD); + } + else if (aSettingsName == BROADCAST_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_BROADCAST); + } + else if (aSettingsName == NFC_WRITE_ACCESS_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_NFC_WRITE_ACCESS); + } + else if (aSettingsName == URL_START_SETTINGS) + { + localizedName = StringLoader::LoadLC(R_JAVA_SETTING_NAME_URL_START); + } + if (localizedName != NULL) + { + ret = wstring((const wchar_t*)localizedName->Ptr(), localizedName->Length()); + CleanupStack::PopAndDestroy(localizedName); + } + ); + return ret; } const wstring AppMngr2MidletSettingsUtil::getLocalizedSettingsInteractionMode(int aInteractionMode) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java --- a/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java Tue May 25 12:34:19 2010 +0300 +++ b/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/midp/MidletLifeCycle.java Wed Jun 09 09:34:07 2010 +0300 @@ -25,16 +25,18 @@ import java.util.Timer; import java.util.TimerTask; +import java.security.AccessControlException; + import com.nokia.mj.impl.rt.utils.ExtensionUtil; +import com.nokia.mj.impl.rt.utils.CmdLineArgsPermission; import com.nokia.mj.impl.rt.support.Jvm; import com.nokia.mj.impl.rt.support.JvmInternal; import com.nokia.mj.impl.rt.support.ThreadEventListener; +import com.nokia.mj.impl.rt.support.ApplicationUtils; import com.nokia.mj.impl.rt.legacy.LegacySupport; -import com.nokia.mj.impl.gcf.PushSecurityUtils; - import com.nokia.mj.impl.security.packageprotection.PackageProtector; import com.nokia.mj.impl.security.common.RuntimeSecurityException; import com.nokia.mj.impl.security.midp.authentication.AuthenticationModule; @@ -620,7 +622,7 @@ { if (Log.mOn) Log.logI("MidletLifeCycle.handleStartRequest(), subTask: " + subTask); - if ((mState == POST_INIT_DONE && subTask != LifeCycleTask.PRE_WARM_START) || + if ((mState == POST_INIT_DONE && subTask != LifeCycleTask.PRE_WARM_START) || (mState == PRE_INIT_DONE && subTask == LifeCycleTask.PRE_WARM_START)) { if (subTask == LifeCycleTask.NORMAL_START) @@ -879,7 +881,7 @@ t = encodedArgs.charAt(idx); if (t < 'a') { - if (idx + 4 >= len) + if (idx + 3 >= len) break; // decode one 16-bit char char a = (char)(t - 'A'); @@ -892,7 +894,7 @@ } else { - if (idx + 2 >= len) + if (idx + 1 >= len) break; // decode one 8-bit char char a = (char)(t - 'a'); @@ -960,7 +962,7 @@ // If system property com.nokia.mid.cmdline has value, it contains // the arguments for the current MIDlet. setMidletArguments(); - + if (mPrewarmStart) { // Get the recorded heap size from previous run. @@ -995,23 +997,23 @@ if ((mMainArgs.findArgument("-autoinvocation") != null) || mAutoinvocationFromUrl) { + if (Log.mOn) Log.logI("Ensuring autoinvocation."); + String pushAdditionalInfo = + mMainArgs.findArgument("-autoInvocationAdditional"); + if (Log.mOn) Log.logI(" addInfo: '" + pushAdditionalInfo + "'"); + + // ensure security try { - if (Log.mOn) Log.logI("Ensuring autoinvocation."); - String pushAdditionalInfo = - mMainArgs.findArgument("-autoInvocationAdditional"); - if (Log.mOn) Log.logI(" addInfo: '" + pushAdditionalInfo + "'"); - PushSecurityUtils.ensurePermission("autoinvocation", - pushAdditionalInfo); - + ApplicationUtils appUtils = ApplicationUtils.getInstance(); + CmdLineArgsPermission cmdLineArgsPermission = + new CmdLineArgsPermission(); + appUtils.checkPermission(cmdLineArgsPermission); if (Log.mOn) Log.logI("Autoinvocation allowed."); - } - catch (SecurityException se) + }catch(AccessControlException e) { - // The user didn't allow starting. Throw StartupException and - // mark it as non fatal. - if (Log.mOn) Log.logI("Autoinvocation NOT allowed."); - throw new StartupException("Auto invocation not allowed.", + if (Log.mOn) Log.logI("Autoinvocation NOT allowed."); + throw new StartupException(e.toString(), false); } } @@ -1169,7 +1171,7 @@ if (mAcceptedUserProperties == null) { // Doing intialization only once. - String launchParams = + String launchParams = ApplicationInfoImpl.getMidletInfo().getAttribute("Nokia-MIDlet-Launch-Params"); mAcceptedUserProperties = split(launchParams, ","); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/utils/CmdLineArgsPermission.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaruntimes/midp/runtime/javasrc/com/nokia/mj/impl/rt/utils/CmdLineArgsPermission.java Wed Jun 09 09:34:07 2010 +0300 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2010 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: Permission object for managing access to command line API feature +* +*/ + + + +package com.nokia.mj.impl.rt.utils; + +import java.security.Permission; +import java.security.PermissionCollection; +import com.nokia.mj.impl.security.common.PermissionBase; +import com.nokia.mj.impl.security.utils.SecurityPromptMessage; + +/** + * Permission class representing the token access to command line API feature. + * + */ +public class CmdLineArgsPermission extends PermissionBase +{ + /** + * Constructor + * + */ + public CmdLineArgsPermission() + { + super(null); + } + + /** + * Returns the question (as localized text) associated with the security + * prompt + * + * @return the localized text associated with the security prompt + */ + public String getSecurityPromptQuestion(int aInteractionMode) + { + return (SecurityPromptMessage.getInstance()).getText( + SecurityPromptMessage.QUESTION_ID_APP_AUTO_LAUNCH, + null); + } + + /** + * Only implies permission objects of same instance + */ + public boolean implies(Permission p) + { + if (p instanceof CmdLineArgsPermission) + { + return true; + } + return false; + } + + /** + * String representation of the permission + */ + public String toString() + { + return "com.nokia.webstart"; + } + + /** + * Don't allow cloning + */ + public boolean equals(Object obj) + { + return (obj.hashCode() == hashCode()); + } + + /** + * Not supported + */ + public int hashCode() + { + return 0; + } + + /** + * Actions are not supported + */ + public String getActions() + { + return null; + } + + /** + * Permission collections not supported + */ + public PermissionCollection newPermissionCollection() + { + return null; + } +} \ No newline at end of file diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java --- a/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java Tue May 25 12:34:19 2010 +0300 +++ b/javaruntimes/midp/runtime/javasrc/javax/microedition/midlet/MIDlet.java Wed Jun 09 09:34:07 2010 +0300 @@ -312,6 +312,8 @@ mNetworkPromptSchemes = new Hashtable(); mNetworkPromptSchemes.put("http:","javax.microedition.io.Connector.http"); mNetworkPromptSchemes.put("https:","javax.microedition.io.Connector.https"); + mNetworkPromptSchemes.put("rtsp:","javax.microedition.io.Connector.rtsp"); + mNetworkPromptSchemes.put("mms:","javax.microedition.io.Connector.rtsp"); } if (mNoPromptSchemes == null) { diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp --- a/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -165,6 +165,14 @@ // Starting with lower old space in pre warm case. jvm->overrideOldHeapSize(36); + + // In the pre-warm start we need to add something into class path. + // Otherwise the VM puts class path to point MIDP private data cage. +#ifdef RD_JAVA_SYMBIAN_TARGET + jvm->appendClassPath(L"z:/private/ignore.jar"); +#else // RD_JAVA_SYMBIAN_TARGET + jvm->appendClassPath(L"./ignore.jar"); +#endif // RD_JAVA_SYMBIAN_TARGET } // If the requested to go to back ground, pass the info to Java peer. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/starter/build/javamidp_installer.pkg --- a/javaruntimes/starter/build/javamidp_installer.pkg Tue May 25 12:34:19 2010 +0300 +++ b/javaruntimes/starter/build/javamidp_installer.pkg Wed Jun 09 09:34:07 2010 +0300 @@ -1,4 +1,4 @@ -; javamidp_installer.pkg generated by qmake at 2010-05-10T13:53:31 +; javamidp_installer.pkg generated by qmake at 2010-05-25T10:01:51 ; This file is generated by qmake and should not be modified by the user ; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javaruntimes/starter/build/javamidp_template.pkg --- a/javaruntimes/starter/build/javamidp_template.pkg Tue May 25 12:34:19 2010 +0300 +++ b/javaruntimes/starter/build/javamidp_template.pkg Wed Jun 09 09:34:07 2010 +0300 @@ -1,4 +1,4 @@ -; javamidp_template.pkg generated by qmake at 2010-05-10T13:53:31 +; javamidp_template.pkg generated by qmake at 2010-05-25T10:01:51 ; This file is generated by qmake and should not be modified by the user ; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/bwins/eswtu.def --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/bwins/eswtu.def Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/bwins/eswtu.def Wed Jun 09 09:34:07 2010 +0300 @@ -87,4 +87,6 @@ ?RegisterWithParentL@ASwtControlBase@@IAEXXZ @ 86 NONAME ; void ASwtControlBase::RegisterWithParentL(void) ?DrawBorder@ASwtControlBase@@MBEXABVTRect@@@Z @ 87 NONAME ; void ASwtControlBase::DrawBorder(class TRect const &) const ?ComputeTabListL@ASwtControlBase@@UAEXAAV?$RPointerArray@VMSwtControl@@@@@Z @ 88 NONAME ; void ASwtControlBase::ComputeTabListL(class RPointerArray &) + ?VisibleRect@ASwtControlBase@@UBE?AVTRect@@H@Z @ 89 NONAME ; class TRect ASwtControlBase::VisibleRect(int) const + ?EnableFocusHighlight@ASwtControlBase@@UAEXH@Z @ 90 NONAME ; void ASwtControlBase::EnableFocusHighlight(int) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/eabi/eswtu.def --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/eabi/eswtu.def Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/build/eabi/eswtu.def Wed Jun 09 09:34:07 2010 +0300 @@ -97,4 +97,6 @@ _ZTV15ASwtControlBase @ 96 NONAME _ZTV22CSwtBrowserPreferences @ 97 NONAME _ZThn4_NK15ASwtControlBase4DrawER9CWindowGcRK11CCoeControlRK5TRect @ 98 NONAME + _ZNK15ASwtControlBase11VisibleRectEi @ 99 NONAME + _ZN15ASwtControlBase20EnableFocusHighlightEi @ 100 NONAME diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswt.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswt.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswt.h Wed Jun 09 09:34:07 2010 +0300 @@ -305,7 +305,8 @@ ESwtEventForeground = 1006, ESwtEventDialogStringResult = 1007, ESwtEventDialogIntegerResult = 1008, - ESwtEventDialogRgbResult = 1009 + ESwtEventDialogRgbResult = 1009, + ESwtEventShowFocusedControl = 1010 }; @@ -1062,7 +1063,12 @@ * @return void */ virtual void PostTitleEventL(TSwtPeer aPeer, const TDesC& aTitle) = 0; - + + /** + * Posts a show focused control to a ScrolledComposite. + */ + virtual void PostShowFocusedControlEventL(TSwtPeer aPeer) =0; + /** * Get eSWT Java application allocated id * @return Java application allocated id diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswtwidgetscore.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswtwidgetscore.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/eswtwidgetscore.h Wed Jun 09 09:34:07 2010 +0300 @@ -765,6 +765,23 @@ const TPointerEvent& aPointerEvent) const = 0; virtual void PostMouseEventL(const TPointerEvent& aPointerEvent) = 0; + + /** + * Enables or disables focus highlight for controls + * Used only for list controls (Lists, ListView, ListBox and Table) + * Only for 9.2 + */ + virtual void EnableFocusHighlight(TBool aEnable) = 0; + + /** + * Get the visible rectangle of this control. + * Window coordinates. + * The clipping take in account the parent, but not the brother. + * To take in account the sibblings use VisibleRegion() method. + * @param aVisibleBounds If true return the visible rectangle of the control, + * else return visible client rectangle of the control. + */ + virtual TRect VisibleRect(TBool aVisibleBounds = EFalse) const = 0; }; @@ -1408,6 +1425,11 @@ */ virtual void SetTaskTip() = 0; virtual TBool IsTaskTip() const = 0; + + /** + * Sets the location even if top shell. + */ + virtual void DoSetLocation(const TPoint& aPoint) = 0; }; /** @@ -2838,6 +2860,60 @@ * Returns the current control that is grabbing the pointer events. */ virtual MSwtControl* PointerCaptureControl() = 0; + + /** + * Rearranges the application layout (status pane, Shell position, split + * input view size) for best editing experience. There can be only one + * editor in split view mode at a time. Setting 0 clears the split view + * and restores the layout. + * + * Following actions must be delegated to UiUtils while split editing is on: + * - Relocating the split input Shell (@see SetSplitInputShellPos) + * - Resizing the split input view. (@see SetSplitInputViewSize) + * + * Following actions must be notified to UiUtils while split editing is on: + * - Resizing the split input shell. (@see AdjustSplitInputShellPos) + * - Relocating the split input view. (@see AdjustSplitInputShellPos) + */ + virtual void SetSplitInputEditor(MSwtControl* aEditor) = 0; + + /** + * The currently active(focused) split input editor. + * Can be any Text, TextExtension, ConstrainedText or DateEditor. + */ + virtual MSwtControl* SplitInputEditor() const = 0; + + /** + * The currently active split input editor or a parent ScrolledComposite. + * The view is getting resized automatically to fit in the available space + * above the VKB. + */ + virtual MSwtControl* SplitInputView() const = 0; + + /** + * The parent shell of the active split input editor is temporarily + * moved vertically during split input editing therefore setting a new + * location must be diverted trough UiUtils. + * @param aOriginalPos - The real position of the Shell, which will be + * applied when VKB closes. + */ + virtual void SetSplitInputShellPos(const TPoint& aOriginalPos) = 0; + + /** + * The active split input editor or its ScrolledComposite ancestor + * is temporarily resized vertically during split input editing + * therefore setting a new size must be diverted trough UiUtils. + * @param aOriginalSize - The real size of the control, which will be + * applied when VKB closes. + */ + virtual void SetSplitInputViewSize(const TSize& aOriginalSize) = 0; + + /** + * The split input shell resized during split editing or + * the split input view relocated during split editing. + * The vertical position of the shell will be readjusted. + */ + virtual void AdjustSplitInputShellPos() = 0; }; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcombo.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcombo.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcombo.h Wed Jun 09 09:34:07 2010 +0300 @@ -188,11 +188,6 @@ void DoSelectItemL(TInt aIdx); /** - * Fixed border for the contained combo. - */ - void DrawContainedComboBorder() const; - - /** * Position the contained combo in the middle of the compound control. */ void CenterContainedCombo(); @@ -241,6 +236,12 @@ * Not own. */ MTouchFeedback* iFeedback; + + /** + * True for as long as pressed by pointer. + * Eclipses ASwtControlBase::iPressed! + */ + TBool iPressed; }; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcomposite.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcomposite.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcomposite.h Wed Jun 09 09:34:07 2010 +0300 @@ -91,6 +91,8 @@ void ComputeTabListL(RSwtControlArray& aList); void UpdateDoNotDrawFlag(); void Update() const; + void SetBounds(const TRect& aRect); + void SetWidgetSize(const TSize& aSize); // From ASwtScrollableBase protected: diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcontrolbase.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcontrolbase.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcontrolbase.h Wed Jun 09 09:34:07 2010 +0300 @@ -57,16 +57,6 @@ // Own methods public: /** - * Get the visible rectangle of this control. - * Window coordinates. - * The clipping take in account the parent, but not the brother. - * To take in account the brother use VisibleRegion() method. - * @param aVisibleBounds If true return the visible rectangle of the control, - * else return visible client rectangle of the control. - */ - TRect VisibleRect(TBool aVisibleBounds = EFalse) const; - - /** * Clips given rectangle to rectangle which can be fully visible in * its parent. Other controls in the same parent are not taken * into account. @@ -75,18 +65,6 @@ */ TRect ClipToVisibleRect(const TRect& aRect) const; -// Hurts the performance of non overlapping drawing when there are a lot -// of control sibblings and does not really work for overlapping drawing -#if 0 - /** - * Get the visible region of the Control. - * Screen coordinates. - * @param If true return the visible region of the control, - * else return visible client region of the control. - */ - void VisibleRegion(RRegion& aRegion, TBool aVisibleBounds = EFalse) const; -#endif - /** * Provide the Skin background. * Should be called by the MopSupplyObject of all implementeded controls. @@ -397,6 +375,8 @@ IMPORT_C void DoControlSpecificFeedback(const TBool& aFirstTap, const TBool& aTappedToChildRect, const TPointerEvent& aPointerEvent) const; IMPORT_C void PostMouseEventL(const TPointerEvent& aPointerEvent); + IMPORT_C void EnableFocusHighlight(TBool aEnable); + IMPORT_C TRect VisibleRect(TBool aVisibleBounds = EFalse) const; protected: MSwtDisplay& iDisplay; @@ -413,7 +393,6 @@ CAknsFrameBackgroundControlContext* iFocusFrame; // Frame context used to draw focus highlight background. TBool iTraverse; // True when a keypress causes traversing TPoint iPrevSwtPos; // Used by HandleSizeChanged and HandlePositionChanged only - TSize iPrevSwtSize; // Used by HandleSizeChanged and HandlePositionChanged only TPoint iPrevCoePos; // Used by HandleSizeChanged and HandlePositionChanged only TSize iPrevCoeSize; // Used by HandleSizeChanged and HandlePositionChanged only diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdateeditor.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdateeditor.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdateeditor.h Wed Jun 09 09:34:07 2010 +0300 @@ -158,6 +158,9 @@ void SetBackgroundL(const MSwtColor* aColor); void SetForegroundL(const MSwtColor* aColor); TBool IsKeyUsed(TUint aKeyCode) const; + void SetBounds(const TRect& aRect); + void SetWidgetSize(const TSize& aSize); + TSwtPeer Dispose(); // From ASwtControlBase protected: diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdisplaybase.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdisplaybase.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtdisplaybase.h Wed Jun 09 09:34:07 2010 +0300 @@ -149,6 +149,7 @@ void PostDialogResultEventL(CSwtDialogBroker* aBroker, TSwtPeer aPeer, TInt aDialogResult); void PostDialogResultEventL(CSwtDialogBroker* aBroker, TSwtPeer aPeer, TInt aDialogResult1, TInt aDialogResult2, TInt aDialogResult3); void PostCloseEventL(TSwtPeer aPeer, TBool& aDispatched); + void PostShowFocusedControlEventL(TSwtPeer aPeer); TInt ApplicationUid(); void SetMobileDevice(MSwtMobileDevice* aMobileDevice); MSwtMobileDevice* MobileDevice(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtevents.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtevents.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtevents.h Wed Jun 09 09:34:07 2010 +0300 @@ -1155,4 +1155,22 @@ HBufC* iSelectedText; }; +/** + * CSwtShowFocusedControlEvent + * @lib eswt + */ +NONSHARABLE_CLASS(CSwtShowFocusedControlEvent) + : public CSwtEvent +{ +// Own methods +public: + CSwtShowFocusedControlEvent(TSwtPeer aPeer); + +// From CSwtEvent +public: + TSwtEventType Type() const; + +protected: + void DoDispatch(JNIEnv* aJniEnv); +}; #endif // SWTEVENTS_H diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtgrid.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtgrid.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtgrid.h Wed Jun 09 09:34:07 2010 +0300 @@ -70,6 +70,13 @@ void SetItemDrawerClippingRect(const TRect& aRect); /** + * Forwards pointer event directly to CEikListbox's HandlePointerEventL. + * This method is used to handle scrollbar pointer events delivered while + * kinetic scrolling is ongoing. + */ + void ForwardPointerEventL(const TPointerEvent& aPointerEvent); + + /** * Wrapper for protected member function HandleScrollEventL of CAknGrid. */ #if defined( RD_SCALABLE_UI_V2) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbase.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbase.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbase.h Wed Jun 09 09:34:07 2010 +0300 @@ -242,6 +242,12 @@ */ void GetUserSelectionL(CArrayFix* aCurrSelItems); + /** + * Updates flick scrolling status. + * @param aEventType CEikListbox event type. + */ + void UpdateFlickScrollingState(TListBoxEvent aEventType); + // From CCoeControl public: TInt CountComponentControls() const; @@ -280,6 +286,9 @@ void SetForegroundL(const MSwtColor* aColor); void SetBackgroundL(const MSwtColor* aColor); TBool IsLongTapAnimationCandidate(const TPointerEvent& aPointerEvent) const; +#ifdef RD_JAVA_S60_RELEASE_9_2 + void EnableFocusHighlight(TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 // From ASwtScrollableBase protected: @@ -368,6 +377,16 @@ * View visible rect at last draw */ mutable TRect iLastViewVisibleRect; + + /** + * True when list is flick scrolling + */ + TBool iFlickScrollingOngoing; + + /** + * True when pointer events on scrollbar should be delivered to listbox + */ + TBool iScrollbarPointerEventToListbox; }; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbox.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbox.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistbox.h Wed Jun 09 09:34:07 2010 +0300 @@ -176,6 +176,9 @@ void SetForegroundL(const MSwtColor* aColor); void SetBackgroundL(const MSwtColor* aColor); TBool IsLongTapAnimationCandidate(const TPointerEvent& aPointerEvent) const; +#ifdef RD_JAVA_S60_RELEASE_9_2 + void EnableFocusHighlight(TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 // From MSwtListBox public: @@ -398,6 +401,12 @@ */ void RemoveSubRefs(); + /** + * Updates flick scrolling status. + * @param aEventType CEikListbox event type. + */ + void UpdateFlickScrollingState(TListBoxEvent aEventType); + #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK public: void DoControlSpecificFeedback( @@ -485,6 +494,16 @@ * View visible rect at last draw */ mutable TRect iLastViewVisibleRect; + + /** + * True when list is flick scrolling + */ + TBool iFlickScrollingOngoing; + + /** + * True when pointer events on scrollbar should be delivered to listbox + */ + TBool iScrollbarPointerEventToListbox; }; #endif // SWTLISTBOX_H diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistboxlists.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistboxlists.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistboxlists.h Wed Jun 09 09:34:07 2010 +0300 @@ -267,6 +267,15 @@ TInt aListType, CEikTextListBox* aList, TBool aEnabled); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + /** + * Enabling focus highlight for lists + */ + static void EnableFocusHighlight( + CListItemDrawer* aItemDrawer, + TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 }; #endif // SWTLISTBOXLISTS_H diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistview.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistview.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtlistview.h Wed Jun 09 09:34:07 2010 +0300 @@ -126,6 +126,9 @@ void HandlePointerEventL(const TPointerEvent& aPointerEvent); const MSwtMenu* GetStylusPopupControlMenu() const; #endif +#ifdef RD_JAVA_S60_RELEASE_9_2 + void EnableFocusHighlight(TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 // From MEikCommandObserver public: @@ -154,7 +157,9 @@ CAknGridView* GetGridView() const; CGulIcon* CreateIconL(const MSwtImage* aIcon) const; void DoGridCellLayoutL(const TSwtListViewDensity& aDensity); - void LoadLayouts(const TSwtListViewDensity& aDensity, TSize& aCellSize, TRect& aIconRect, TRect& aSelRect, TRect& aTextRect, TInt& aTextCellFontId); + void LoadLayouts(const TSwtListViewDensity& aDensity, TSize& aCellSize, + TRect& aIconRect, TRect& aSelRect, TRect& aTextRect, + TInt& aTextCellFontId); void CalcRowsColumns(const TSize& aCellSize, TInt& aXCells, TInt& aYCells) const; void AddTextL(const TDesC& aPtr, const TInt& aPos); void AddIconL(const MSwtImage* aImage, const TInt& aPos); @@ -200,6 +205,7 @@ ) const; void CoerceCellRect(const TSwtListViewDensity& aDensity, TRect& aCellRect) const; + void UpdateFlickScrollingState(TListBoxEvent aEventType); #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK public: @@ -337,6 +343,16 @@ * View visible rect at last draw */ mutable TRect iLastViewVisibleRect; + + /** + * True when list is flick scrolling + */ + TBool iFlickScrollingOngoing; + + /** + * True when pointer events on scrollbar should be delivered to listbox + */ + TBool iScrollbarPointerEventToListbox; }; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtshell.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtshell.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtshell.h Wed Jun 09 09:34:07 2010 +0300 @@ -36,6 +36,11 @@ void ConstructL(); MSwtShell& GetTopShell() const; void RemoveAndRememberFocus(); + + // Relocating an editor's Shell must be delegated to UiUtils + // while split editing is on (@see SetSplitInputShellPos) + // CCoeControl::SetRect must not be called directly. + void DoSetRect(const TRect& aRect); // From CSwtComposite protected: @@ -57,6 +62,7 @@ protected: void FocusChanged(TDrawNow aDrawNow); void Draw(const TRect& aRect) const; + void SizeChanged(); // From MCoeControlBackground public: @@ -150,6 +156,7 @@ TBool HasCba() const; void SetTaskTip(); TBool IsTaskTip() const; + void DoSetLocation(const TPoint& aPoint); // From MEikStatusPaneObserver public: diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtsortedlist.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtsortedlist.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtsortedlist.h Wed Jun 09 09:34:07 2010 +0300 @@ -160,6 +160,9 @@ TRect ClientRect() const; TSize ComputeSizeL(TInt aWHint, TInt aHHint); void ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType); +#ifdef RD_JAVA_S60_RELEASE_9_2 + void EnableFocusHighlight(TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 protected: void DoPaint(const TRect& aRect) const; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttable.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttable.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttable.h Wed Jun 09 09:34:07 2010 +0300 @@ -280,6 +280,9 @@ TBool IsKeyUsed(TUint aKeyCode) const; TBool MSKSelCmdEnabled() const; void UpdateDoNotDrawFlag(); +#ifdef RD_JAVA_S60_RELEASE_9_2 + void EnableFocusHighlight(TBool aEnable); +#endif //RD_JAVA_S60_RELEASE_9_2 // from base class ASwtScrollableBase diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttablelistbox.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttablelistbox.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttablelistbox.h Wed Jun 09 09:34:07 2010 +0300 @@ -254,6 +254,12 @@ TInt HorizontalScrollPixelsPerArrowEvent(); TInt HorizontalScrollPixelsPerPageEvent(); + /** + * Updates flick scrolling status. + * @param aEventType CEikListbox event type. + */ + void UpdateFlickScrollingState(TListBoxEvent aEventType); + private: // data /** @@ -299,6 +305,16 @@ * Used to implement horizontal panning. */ TPoint iDragPos; + + /** + * True when list is flick scrolling + */ + TBool iFlickScrollingOngoing; + + /** + * True when pointer events on scrollbar should be delivered to listbox + */ + TBool iScrollbarPointerEventToListbox; }; #endif // SWTTABLELISTBOX_H diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttextbase.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttextbase.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swttextbase.h Wed Jun 09 09:34:07 2010 +0300 @@ -18,7 +18,7 @@ #include "swtscrollablebase.h" #include "swteditindicator.h" -#if defined( RD_SCALABLE_UI_V2) +#ifdef RD_SCALABLE_UI_V2 #include #endif //RD_SCALABLE_UI_V2 @@ -32,7 +32,7 @@ NONSHARABLE_CLASS(CSwtTextBase) : public CAknControl , public ASwtScrollableBase -#if defined( RD_SCALABLE_UI_V2) +#ifdef RD_SCALABLE_UI_V2 , public MCoeCaptionRetrieverForFep #endif //RD_SCALABLE_UI_V2 { @@ -192,6 +192,9 @@ TBool CanDrawOutsideRect() const; void SetBackgroundL(const MSwtColor* aColor); void SetForegroundL(const MSwtColor* aColor); + void SetBounds(const TRect& aRect); + void SetWidgetSize(const TSize& aSize); + TSwtPeer Dispose(); // From ASwtControlBase protected: diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtuiutils.h --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtuiutils.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtuiutils.h Wed Jun 09 09:34:07 2010 +0300 @@ -187,6 +187,11 @@ void HideIndicator(TInt aId); void HideIndicators(); + + void DoSetSplitInputShellPos(const TPoint& aPos); + void DoSetSplitInputViewSize(const TSize& aSize); + + MSwtControl* ScrolledCompositeAncestor(const MSwtControl& aControl) const; // From MSwtUiUtils public: @@ -229,7 +234,13 @@ TRect TaskTipRect() const; void SetPointerCaptureControl(MSwtControl* aControl); MSwtControl* PointerCaptureControl(); - + void SetSplitInputEditor(MSwtControl *aEditor); + MSwtControl* SplitInputEditor() const; + MSwtControl* SplitInputView() const; + void SetSplitInputShellPos(const TPoint& aOriginalPos); + void SetSplitInputViewSize(const TSize& aOriginalSize); + void AdjustSplitInputShellPos(); + protected: void HandleFreeRamEventL(TInt aEventType); @@ -389,6 +400,15 @@ * Key input flag. */ TBool iNaviKeyInput; + + /** + * Split input data. + */ + MSwtControl* iSplitInputEditor; + MSwtControl* iSplitInputView; + TSize iSplitInputViewSize; + TPoint iSplitInputShellPos; + TBool iSplitInputSPVisible; }; /** diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbrowser.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbrowser.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbrowser.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -419,6 +419,8 @@ } iHandlingPointerEv = EFalse; + + PostMouseEventL(aPointerEvent); } #endif diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbutton.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbutton.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtbutton.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -213,12 +213,18 @@ iButton->SetBackground(this); // Back will be drawn by ASwtControlBase::Draw // Set default color - TRgb color; + TRgb colorNormal; AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), - color, + colorNormal, KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG63); // Messaging touch buttons - iButton->OverrideColorL(EColorButtonText, color); + EAknsCIQsnTextColorsCG13); // SK + TRgb colorPressed; + AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), + colorPressed, + KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG69); // pressed SK + iButton->OverrideColorL(EColorButtonText, colorNormal); + iButton->OverrideColorL(EColorButtonTextPressed, colorPressed); } // --------------------------------------------------------------------------- @@ -641,10 +647,12 @@ else { // Reset to default color + TRgb colorNormal; AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), - color, + colorNormal, KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG63); // Messaging touch buttons + EAknsCIQsnTextColorsCG13); // SK + iButton->OverrideColorL(EColorButtonText, colorNormal); } if (iButton) @@ -1182,6 +1190,8 @@ #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK iButton->HandlePointerEventL(aPointerEvent); } + + PostMouseEventL(aPointerEvent); } #endif // RD_SCALABLE_UI_V2 diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcaptionedcontrol.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcaptionedcontrol.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcaptionedcontrol.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -90,7 +90,16 @@ if (iChild) { - iChild->CoeControl().SetSize(iSize); + // Divert the job to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iChild->GetShell().Display().UiUtils(); + if (utils.SplitInputView() == iChild) + { + utils.SetSplitInputViewSize(iSize); + } + else + { + iChild->CoeControl().SetSize(iSize); + } } } @@ -674,6 +683,7 @@ { iPointerGrabbingControl = NULL; ASwtControlBase::SetSwtFocus(KSwtFocusByPointer); + PostMouseEventL(aPointerEvent); } } #endif // RD_SCALABLE_UI_V2 diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcombo.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcombo.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcombo.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -293,7 +293,11 @@ } if (pressed != iPressed) + { Redraw(); + } + + PostMouseEventL(aPointerEvent); } #endif //RD_SCALABLE_UI_V2 @@ -314,7 +318,23 @@ // void CSwtCombo::Draw(const TRect& /*aRect*/) const { - DrawContainedComboBorder(); + CWindowGc& gc = SystemGc(); + TRect rect(iCombo->Rect()); + TAknLayoutRect topLeft = CSwtLafFacade::GetLayoutRect( + CSwtLafFacade::EListHighlightSkinPlacingGeneralLine2, rect); + + TAknLayoutRect bottomRight = CSwtLafFacade::GetLayoutRect( + CSwtLafFacade::EListHighlightSkinPlacingGeneralLine5, rect); + + TRect innerRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + + // "Connect" the label and the button with a toolbar frame. + AknsDrawUtils::DrawFrame(AknsUtils::SkinInstance(), + gc, + rect, + innerRect, + iPressed || iOpen ? KAknsIIDQsnFrButtonTbPressed : KAknsIIDQsnFrButtonTb, + iPressed || iOpen ? KAknsIIDQsnFrButtonTbCenterPressed : KAknsIIDQsnFrButtonTbCenter); } // --------------------------------------------------------------------------- @@ -1452,17 +1472,3 @@ #endif //RD_TACTILE_FEEDBACK } -// --------------------------------------------------------------------------- -// CSwtCombo::DrawContainedComboBorder() -// --------------------------------------------------------------------------- -// -void CSwtCombo::DrawContainedComboBorder() const -{ - CWindowGc& gc = SystemGc(); - gc.SetBrushStyle(CGraphicsContext::ENullBrush); - gc.SetPenColor(iDisplay.UiUtils().GetSystemColor(ESwtColorWidgetBorder)); - gc.SetPenStyle(CGraphicsContext::ESolidPen); - gc.SetPenSize(TSize(1, 1)); - gc.DrawRect(iCombo->Rect()); -} - diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcomposite.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcomposite.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcomposite.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -451,9 +451,17 @@ // Unfocus MSwtControl* ctrl = GetShell().FocusControl(); - if (ctrl && ctrl != iPhysicsFocusedCtrl) + if (ctrl) { - ctrl->CoeControl().SetFocus(EFalse); +#ifdef RD_JAVA_S60_RELEASE_9_2 + // While panning there should be no focus highlight + // Highlight is enabled after pressing any key + ctrl->EnableFocusHighlight(EFalse); +#endif //RD_JAVA_S60_RELEASE_9_2 + if (ctrl != iPhysicsFocusedCtrl) + { + ctrl->CoeControl().SetFocus(EFalse); + } } // Revert @@ -528,6 +536,7 @@ // CSwtTable::CountComponentControls(), etc. CAknControl::HandlePointerEventL(aPointerEvent); } + PostMouseEventL(aPointerEvent); } void CSwtComposite::HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType) @@ -936,6 +945,37 @@ } } +void CSwtComposite::SetBounds(const TRect& aRect) +{ + // Divert the job to UiUtils if this is a parent to an editor + // open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aRect.Size()); + SetLocation(aRect.iTl); + } + else + { + ASwtScrollableBase::SetBounds(aRect); + } +} + +void CSwtComposite::SetWidgetSize(const TSize& aSize) +{ + // Divert the job to UiUtils if this is a parent to an editor + // open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aSize); + } + else + { + ASwtScrollableBase::SetWidgetSize(aSize); + } +} + void CSwtComposite::DrawScrollBarBackground(const TRect& aRect) const { const CCoeControl& coeControl = CoeControl(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtconstrainedtext.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtconstrainedtext.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtconstrainedtext.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -655,51 +655,53 @@ { case ENumeric: { - CSwtIntegerEdwin* ed = new(ELeave)CSwtIntegerEdwin; - editor = ed; + editor = new(ELeave)CSwtIntegerEdwin; SetEditor(editor); - ed->ConstructL(-KMaxTInt, KMaxTInt, iTextLimit); - Editor().SetTextLimit(iTextLimit); - Editor().SetAknEditorCase(EAknSCTNumeric); - Editor().SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); - Editor().SetAknEditorInputMode(EAknEditorNumericInputMode); - Editor().SetAknEditorCurrentInputMode(EAknEditorNumericInputMode); - Editor().SetAknEditorFlags(EAknEditorFlagFixedCase | EAknEditorFlagNoT9); - Editor().SetAknEditorNumericKeymap(EAknEditorPlainNumberModeKeymap); -#ifdef RD_SCALABLE_UI_V2 - Editor().SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap - | EAknEditorFlagDeliverVirtualKeyEventsToApplication); -#else - Editor().SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap); -#endif // RD_SCALABLE_UI_V2 - Editor().SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_NUMERIC_MODE_DIALOG); + editor->ConstructL(-KMaxTInt, KMaxTInt, iTextLimit); + editor->SetTextLimit(iTextLimit); + editor->SetAknEditorCase(EAknSCTNumeric); + editor->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); + editor->SetAknEditorInputMode(EAknEditorNumericInputMode); + editor->SetAknEditorCurrentInputMode(EAknEditorNumericInputMode); + editor->SetAknEditorNumericKeymap(EAknEditorPlainNumberModeKeymap); + editor->SetAknEditorFlags(EAknEditorFlagFixedCase + | EAknEditorFlagNoT9 + | EAknEditorFlagUseSCTNumericCharmap + | EAknEditorFlagDeliverVirtualKeyEventsToApplication +#ifdef RD_JAVA_S60_RELEASE_9_2 + | EAknEditorFlagEnablePartialScreen +#endif // RD_JAVA_S60_RELEASE_9_2 + ); + editor->SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_NUMERIC_MODE_DIALOG); } break; case EDecimal: { - CSwtFloatingPointEdwin* fpe = new(ELeave) CSwtFloatingPointEdwin; - editor = fpe; + editor = new(ELeave) CSwtFloatingPointEdwin; SetEditor(editor); - fpe->ConstructL(-KMaxTInt, KMaxTInt, iTextLimit); - Editor().SetAknEditorCase(EAknSCTNumeric); - Editor().SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); - Editor().SetAknEditorInputMode(EAknEditorNumericInputMode); - Editor().SetAknEditorCurrentInputMode(EAknEditorNumericInputMode); - Editor().SetAknEditorFlags(EAknEditorFlagFixedCase | EAknEditorFlagNoT9); - Editor().SetAknEditorNumericKeymap(EAknEditorPlainNumberModeKeymap); -#ifdef RD_SCALABLE_UI_V2 - Editor().SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap - | EAknEditorFlagDeliverVirtualKeyEventsToApplication); -#else - Editor().SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap); -#endif // RD_SCALABLE_UI_V2 + editor->ConstructL(-KMaxTInt, KMaxTInt, iTextLimit); + editor->SetAknEditorCase(EAknSCTNumeric); + editor->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); + editor->SetAknEditorInputMode(EAknEditorNumericInputMode); + editor->SetAknEditorCurrentInputMode(EAknEditorNumericInputMode); + editor->SetAknEditorNumericKeymap(EAknEditorPlainNumberModeKeymap); + + editor->SetAknEditorFlags(EAknEditorFlagFixedCase + | EAknEditorFlagNoT9 + | EAknEditorFlagUseSCTNumericCharmap + | EAknEditorFlagDeliverVirtualKeyEventsToApplication +#ifdef RD_JAVA_S60_RELEASE_9_2 + | EAknEditorFlagEnablePartialScreen +#endif // RD_JAVA_S60_RELEASE_9_2 + ); + if (iDecimalSeparator == ',') { - Editor().SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_DECIMAL_MODE_WITH_COMMA_DIALOG); + editor->SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_DECIMAL_MODE_WITH_COMMA_DIALOG); } else { - Editor().SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_DECIMAL_MODE_DIALOG); + editor->SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_DECIMAL_MODE_DIALOG); } } break; @@ -716,12 +718,12 @@ editor->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); editor->SetAknEditorInputMode(EAknEditorNumericInputMode); editor->SetAknEditorNumericKeymap(EAknEditorAlphanumericNumberModeKeymap); -#ifdef RD_SCALABLE_UI_V2 editor->SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap - | EAknEditorFlagDeliverVirtualKeyEventsToApplication); -#else - editor->SetAknEditorFlags(EAknEditorFlagUseSCTNumericCharmap); -#endif // RD_SCALABLE_UI_V2 + | EAknEditorFlagDeliverVirtualKeyEventsToApplication +#ifdef RD_JAVA_S60_RELEASE_9_2 + | EAknEditorFlagEnablePartialScreen +#endif // RD_JAVA_S60_RELEASE_9_2 + ); editor->SetAknEditorSpecialCharacterTable(R_ESWT_CONSTRAINEDTEXT_PHONENUMBER_MODE_DIALOG); } break; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcontrolbase.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcontrolbase.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtcontrolbase.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -418,6 +418,12 @@ iDisplay.PostMouseEventL(iPeer, type, button, pos, stateMask); } +EXPORT_C void ASwtControlBase::EnableFocusHighlight(TBool /*aEnable*/) +{ + // Method is used only on 9.2 for list controls (Lists, ListView, + // ListBox and Table) +} + TPoint ASwtControlBase::ComputeLocationToSet(const TPoint& aLocation) { ASSERT(!IsShell()); @@ -505,7 +511,7 @@ delete this; } -TRect ASwtControlBase::VisibleRect(TBool aVisibleBounds) const +EXPORT_C TRect ASwtControlBase::VisibleRect(TBool aVisibleBounds) const { // WINDOW COORDINATES! if (!CoeControl().IsVisible()) @@ -1213,20 +1219,15 @@ EXPORT_C void ASwtControlBase::HandleSizeChanged() { - if (iPrevSwtSize == GetWidgetSize() && iPrevCoeSize == CoeControl().Size()) + if (iPrevCoeSize == CoeControl().Size()) { return; } - if (iPrevSwtSize != GetWidgetSize()) - { - iPrevSwtSize = GetWidgetSize(); - TRAP_IGNORE(iDisplay.PostResizeEventL(iPeer)); - } - if (iPrevCoeSize != CoeControl().Size()) { iPrevCoeSize = CoeControl().Size(); + TRAP_IGNORE(iDisplay.PostResizeEventL(iPeer)); HandleRectChanged(); } } @@ -1904,13 +1905,13 @@ return CoeControl().Size(); } -EXPORT_C void ASwtControlBase::SetWidgetSize(const TSize& aNewSize) +EXPORT_C void ASwtControlBase::SetWidgetSize(const TSize& aSize) { ASSERT(!IsShell()); CCoeControl& coeCtrl = CoeControl(); TRect oldRect(coeCtrl.Rect()); - TRect newRect(coeCtrl.Position(), aNewSize); + TRect newRect(coeCtrl.Position(), aSize); if (newRect == oldRect) { @@ -1963,7 +1964,7 @@ } // Set and redraw new rect - coeCtrl.SetSize(aNewSize); + coeCtrl.SetSize(aSize); if (!(iStyle & KSwtStyleNoRedrawResize)) { if (urgent) @@ -2562,6 +2563,7 @@ EXPORT_C void ASwtControlBase::HandlePointerEventL(const TPointerEvent& aPointerEvent) { CoeControl().HandlePointerEventL(aPointerEvent); + PostMouseEventL(aPointerEvent); } #else EXPORT_C void ASwtControlBase::HandlePointerEventL(const TPointerEvent& /*aPointerEvent*/) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdateeditor.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdateeditor.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdateeditor.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -17,6 +17,9 @@ #include #include #include +#ifdef RD_JAVA_S60_RELEASE_9_2 +#include +#endif #include #if defined( RD_SCALABLE_UI_V2 ) #include @@ -202,17 +205,10 @@ // --------------------------------------------------------------------------------------------- // void CSwtDateEditor::FocusChanged(TDrawNow aDrawNow) -{ +{ if (iEditor) { TRAP_IGNORE(PrepareForFocusChangeL()); - - // Aparenlty this is the only way of forcing the VKB to close. - if (iEditor->IsFocused() && !IsFocused()) - { - iDisplay.CoeEnv()->Fep()->HandleDestructionOfFocusedItem(); - } - iEditor->SetFocus(IsFocused()); } @@ -225,6 +221,15 @@ // void CSwtDateEditor::MakeVisible(TBool aVisible) { + // Close VKB. Do it here instead of FocusChange to avoid split input flicker. + if (iEditor->IsFocused() && !aVisible) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } CCoeControl::MakeVisible(aVisible); FocusabilityChanged(); } @@ -534,9 +539,19 @@ void CSwtDateEditor::SetDimmed(TBool aDimmed) { ASSERT(iEditor); + + // Close VKB. Do it here instead of FocusChange to avoid split input flicker. + if (iEditor->IsFocused() && aDimmed) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } + CCoeControl::SetDimmed(aDimmed); iEditor->SetDimmed(aDimmed); - FocusabilityChanged(); } @@ -570,6 +585,16 @@ } SizeChanged(); } +#ifdef RD_JAVA_S60_RELEASE_9_2 + else if (aType == KAknSplitInputEnabled) + { + const MSwtShell* activeShell = iDisplay.UiUtils().GetActiveShell(); + if (activeShell && activeShell->FocusControl() == this) + { + iDisplay.UiUtils().SetSplitInputEditor(this); + } + } +#endif } // --------------------------------------------------------------------------------------------- @@ -661,6 +686,12 @@ void CSwtDateEditor::PositionChanged() { HandlePositionChanged(); + // Notify change to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.AdjustSplitInputShellPos(); + } } // --------------------------------------------------------------------------------------------- @@ -983,6 +1014,13 @@ iEditor->SetDimmed(IsDimmed()); RetrieveDefaultFontL(); iEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG6); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (iEditor->SupportsFeature(CEikMfne::EPartialScreenInput)) + { + iEditor->SetFeature(CEikMfne::EPartialScreenInput, ETrue); + } +#endif } ActivateL(); } @@ -1106,6 +1144,51 @@ return EFalse; } + +void CSwtDateEditor::SetBounds(const TRect& aRect) +{ + // Divert the job to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aRect.Size()); + SetLocation(aRect.iTl); + } + else + { + ASwtControlBase::SetBounds(aRect); + } +} + +void CSwtDateEditor::SetWidgetSize(const TSize& aSize) +{ + // Divert the job to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aSize); + } + else + { + ASwtControlBase::SetWidgetSize(aSize); + } +} + +TSwtPeer CSwtDateEditor::Dispose() +{ + // Close VKB. + if (iEditor->IsFocused()) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } + return ASwtControlBase::Dispose(); +} + + // --------------------------------------------------------------------------------------------- // CSwtDateEditor::HandlePointerEventL // --------------------------------------------------------------------------------------------- @@ -1116,15 +1199,16 @@ TBool hit = ETrue; #ifdef RD_JAVA_S60_RELEASE_9_2 + TBool isActiveSplitEditor = iDisplay.UiUtils().SplitInputEditor() == this; TBool pressed = iPressed; hit = Rect().Contains(aPointerEvent.iPosition); if (aPointerEvent.iType == TPointerEvent::EButton1Down) - iPressed = ETrue; + iPressed = !isActiveSplitEditor; else if (aPointerEvent.iType == TPointerEvent::EButton1Up) iPressed = EFalse; else if (aPointerEvent.iType == TPointerEvent::EDrag) - iPressed = hit; + iPressed = hit && !isActiveSplitEditor; #endif if (!(aPointerEvent.iType == TPointerEvent::EButton1Up @@ -1153,6 +1237,8 @@ if (pressed != iPressed) Redraw(); #endif + + PostMouseEventL(aPointerEvent); } // --------------------------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdecorations.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdecorations.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdecorations.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -620,23 +620,9 @@ // CSwtDecorations::SetMaximized // --------------------------------------------------------------------------- // -void CSwtDecorations::SetMaximized(TBool aMaximized) +void CSwtDecorations::SetMaximized(TBool /*aMaximized*/) { - ASSERT(aMaximized != iIsMaximized); - - if (aMaximized) - { - // Set bounds so as to cover the parent's client area - iNormalBounds = GetBounds(); - TRect newBounds(iParent->Control()->ClientRect().Size()); - SetBounds(newBounds); - } - else - { - SetBounds(iNormalBounds); - } - - iIsMaximized = aMaximized; + // Nothing to do, unsupported feature } // --------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdisplaybase.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdisplaybase.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtdisplaybase.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -705,6 +705,12 @@ iEventQueue->PushL(new(ELeave) CSwtCloseEvent(aPeer, aDispatched)); } +void ASwtDisplayBase::PostShowFocusedControlEventL(TSwtPeer aPeer) +{ + ASSERT_NATIVEUITHREAD(); + iEventQueue->PushL(new(ELeave) CSwtShowFocusedControlEvent(aPeer)); +} + TInt ASwtDisplayBase::ApplicationUid() { return iApplicationUid; @@ -1148,7 +1154,20 @@ // Forward delayed pointer event TPointerEvent event(iLongTapPointerEvent); event.iType = TPointerEvent::EButton1Up; - iLongTapControl->HandlePointerEventL(event); // revert + + MSwtShell* shell = iLongTapControl->ShellInterface(); + if (shell) + { + // The Shells do not process (forward event to children + // or send mouse event to Java) the pointer if revert is on. + // Therefore reset early to let Shell send the mouse event. + CancelLongTapAnimation(); + shell->Control()->HandlePointerEventL(event); // revert + } + else + { + iLongTapControl->HandlePointerEventL(event); // revert + } } // Just to clear the flags. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtevents.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtevents.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtevents.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -1384,3 +1384,30 @@ "(ILjava/lang/String;)V", static_cast(Type()), selectedText); } +// ----------------------------------------------------------------------------- +// CSwtShowFocusedControlEvent::CSwtShowFocusedControlEvent +// ----------------------------------------------------------------------------- +// +CSwtShowFocusedControlEvent::CSwtShowFocusedControlEvent(TSwtPeer aPeer) + : CSwtEvent(aPeer) +{ +} + +// ----------------------------------------------------------------------------- +// CSwtShowFocusedControlEvent::Type +// ----------------------------------------------------------------------------- +// +TSwtEventType CSwtShowFocusedControlEvent::Type() const +{ + return ESwtEventShowFocusedControl; +} + +// ----------------------------------------------------------------------------- +// CSwtShowFocusedControlEvent::DoDispatch +// ----------------------------------------------------------------------------- +// +void CSwtShowFocusedControlEvent::DoDispatch(JNIEnv* aJniEnv) +{ + TBool failed; + CallVoidJavaMethod(failed, aJniEnv, Peer(), "handleShowFocusedControlEvent", "()V"); +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtgrid.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtgrid.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtgrid.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -258,6 +258,14 @@ CleanupStack::Pop(); } +// --------------------------------------------------------------------------- +// CSwtGrid::ForwardPointerEvent +// --------------------------------------------------------------------------- +// +void CSwtGrid::ForwardPointerEventL(const TPointerEvent& aPointerEvent) +{ + CEikListBox::HandlePointerEventL(aPointerEvent); +} // --------------------------------------------------------------------------- // CSwtGrid::DoHandleScrollEventL diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swthyperlink.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swthyperlink.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swthyperlink.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -486,6 +486,8 @@ default: break; } + + PostMouseEventL(aPointerEvent); } // --------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlink.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlink.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlink.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -1198,6 +1198,8 @@ break; } } + + PostMouseEventL(aPointerEvent); } // --------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbase.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbase.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbase.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -535,8 +535,9 @@ MSwtDisplay& aDisplay, TSwtPeer aPeer, MSwtComposite& aParent, - TInt aStyle) : - ASwtScrollableBase(aDisplay, aPeer, &aParent, aStyle) + TInt aStyle) + : ASwtScrollableBase(aDisplay, aPeer, &aParent, aStyle) + , iFlickScrollingOngoing(EFalse) { } @@ -958,7 +959,32 @@ // Deliver event to scrollbar if (iVScrollBarGrabsPointerEvents && vsb) { - vsb->HandlePointerEventL(aPointerEvent); + if (!iFlickScrollingOngoing + && aPointerEvent.iType == TPointerEvent::EButton1Down) + { + // Scrollbar was tapped after scrolling stopped + // by itself, so no need to redirect events + iScrollbarPointerEventToListbox = EFalse; + } + + if (iScrollbarPointerEventToListbox) + { + // Stops kinetic scrolling when scrollbar is tapped + iList->HandlePointerEventL(aPointerEvent); + // Continue delivering events until button up appears to prevent + // some unexpected behavior in both scrollbar and listbox + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Up: + iScrollbarPointerEventToListbox = EFalse; + break; + } + } + else + { + // Handles scrollbar behavior + vsb->HandlePointerEventL(aPointerEvent); + } } // Deliver event to list @@ -1030,6 +1056,8 @@ { iVScrollBarGrabsPointerEvents = EFalse; } + + PostMouseEventL(aPointerEvent); } #else //RD_SCALABLE_UI_V2 void CSwtListBase::HandlePointerEventL( @@ -1069,6 +1097,9 @@ ASSERT(iList); TBool isFocused = IsFocusControl(); +#ifdef RD_JAVA_S60_RELEASE_9_2 + EnableFocusHighlight(isFocused); +#endif //RD_JAVA_S60_RELEASE_9_2 iList->SetFocus(isFocused, aDrawNow); HandleFocusChanged(aDrawNow); } @@ -1207,6 +1238,14 @@ // void CSwtListBase::ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (aType == EEventKeyDown) + { + // After panning focus highlight was disabled, so enabling again + EnableFocusHighlight(ETrue); + } +#endif //RD_JAVA_S60_RELEASE_9_2 + // No items or not a normal key event if (iList->Model()->NumberOfItems() == 0 || aType != EEventKey) { @@ -1370,6 +1409,22 @@ } #endif +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtListBase::EnableFocusHighlight +// From MSwtControl +// --------------------------------------------------------------------------- +// +void CSwtListBase::EnableFocusHighlight(TBool aEnable) +{ + ASSERT(iList); + ASSERT(iList->View()); + + CSwtListBoxLists::EnableFocusHighlight(iList->View()->ItemDrawer(), + aEnable); +} +#endif //RD_JAVA_S60_RELEASE_9_2 + // --------------------------------------------------------------------------- // CSwtListBase::SbFrame // From ASwtScrollableBase @@ -1525,6 +1580,8 @@ return; } + UpdateFlickScrollingState(aEventType); + switch (aEventType) { // On 5.0, drawing trough Java gives simply a better fps. @@ -1558,3 +1615,21 @@ } #endif //RD_SCALABLE_UI_V2 +// --------------------------------------------------------------------------- +// CSwtListBase::UpdateFlickScrollingState +// Updates flick scrolling status based on received listbox event. +// --------------------------------------------------------------------------- +// +void CSwtListBase::UpdateFlickScrollingState(TListBoxEvent aEventType) +{ + switch (aEventType) + { + case EEventFlickStarted: + iFlickScrollingOngoing = ETrue; + iScrollbarPointerEventToListbox = ETrue; + break; + case EEventFlickStopped: + iFlickScrollingOngoing = EFalse; + break; + } +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbox.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbox.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistbox.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -140,6 +140,8 @@ MSwtComposite& aParent, TInt aStyle) : ASwtScrollableBase(aDisplay, aPeer, &aParent, aStyle) + , iFlickScrollingOngoing(EFalse) + { } @@ -343,7 +345,32 @@ // Deliver event to scrollbar if (iVScrollBarGrabsPointerEvents && vsb) { - vsb->HandlePointerEventL(aPointerEvent); + if (!iFlickScrollingOngoing + && aPointerEvent.iType == TPointerEvent::EButton1Down) + { + // Scrollbar was tapped after scrolling stopped + // by itself, so no need to redirect events + iScrollbarPointerEventToListbox = EFalse; + } + + if (iScrollbarPointerEventToListbox) + { + // Stops kinetic scrolling when scrollbar is tapped + iList->HandlePointerEventL(aPointerEvent); + // Continue delivering events until button up appears to prevent + // some unexpected behavior in both scrollbar and listbox + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Up: + iScrollbarPointerEventToListbox = EFalse; + break; + } + } + else + { + // Handles scrollbar behavior + vsb->HandlePointerEventL(aPointerEvent); + } } // Deliver event to list @@ -415,6 +442,8 @@ { iVScrollBarGrabsPointerEvents = EFalse; } + + PostMouseEventL(aPointerEvent); } #else //RD_SCALABLE_UI_V2 void CSwtListBox::HandlePointerEventL( @@ -472,6 +501,9 @@ // This gets called before contained list is created. if (iList) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + EnableFocusHighlight(isFocused); +#endif //RD_JAVA_S60_RELEASE_9_2 iList->SetFocus(isFocused, aDrawNow); } HandleFocusChanged(aDrawNow); @@ -645,6 +677,14 @@ // void CSwtListBox::ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (aType == EEventKeyDown) + { + // After panning focus highlight was disabled, so enabling again + EnableFocusHighlight(ETrue); + } +#endif //RD_JAVA_S60_RELEASE_9_2 + // No items or not a normal key event if (iList->Model()->NumberOfItems() == 0 || aType != EEventKey) { @@ -818,6 +858,22 @@ } #endif +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtListBox::EnableFocusHighlight +// From MSwtControl +// --------------------------------------------------------------------------- +// +void CSwtListBox::EnableFocusHighlight(TBool aEnable) +{ + ASSERT(iList); + ASSERT(iList->View()); + + CSwtListBoxLists::EnableFocusHighlight(iList->View()->ItemDrawer(), + aEnable); +} +#endif //RD_JAVA_S60_RELEASE_9_2 + // --------------------------------------------------------------------------- // CSwtListBox::Scrollable // From MSwtListBox @@ -1330,6 +1386,8 @@ return; } + UpdateFlickScrollingState(aEventType); + switch (aEventType) { // On 5.0, drawing trough Java gives simply a better fps. @@ -2480,3 +2538,22 @@ } } #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK + +// --------------------------------------------------------------------------- +// CSwtTableListBox::UpdateFlickScrollingState +// Updates flick scrolling status based on received listbox event. +// --------------------------------------------------------------------------- +// +void CSwtListBox::UpdateFlickScrollingState(TListBoxEvent aEventType) +{ + switch (aEventType) + { + case EEventFlickStarted: + iFlickScrollingOngoing = ETrue; + iScrollbarPointerEventToListbox = ETrue; + break; + case EEventFlickStopped: + iFlickScrollingOngoing = EFalse; + break; + } +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistboxlists.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistboxlists.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistboxlists.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -505,6 +505,31 @@ } } +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtListBoxLists::EnableFocusHighlight +// --------------------------------------------------------------------------- +// +void CSwtListBoxLists::EnableFocusHighlight(CListItemDrawer* aItemDrawer, + TBool aEnable) +{ + if (aItemDrawer) + { + TInt disabledHighlight = + aItemDrawer->Flags() & CListItemDrawer::EDisableHighlight; + + if (aEnable && disabledHighlight) + { + aItemDrawer->ClearFlags(CListItemDrawer::EDisableHighlight); + } + else if (!aEnable && !disabledHighlight) + { + aItemDrawer->SetFlags(CListItemDrawer::EDisableHighlight); + } + } +} +#endif //RD_JAVA_S60_RELEASE_9_2 + // The compiler does not automatically instantiate templates defined in other // files. Because of this, code written will often produce undefined symbol // errors when compiled with the compiler. You need to tell the compiler which diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtlistview.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -143,7 +143,9 @@ iWidthOfSpaceBetweenItems(0), iHeightOfSpaceBetweenItems(0), iDensity(EMediumListViewDensity), // must match Java-side default - iIsGridCellLayoutNeeded(EFalse) + iIsGridCellLayoutNeeded(EFalse), + iFlickScrollingOngoing(EFalse) + { // Default to horizontal layout orientation (vertical scrollbar) //if( iStyle & KSwtStyleVertical ) @@ -1620,8 +1622,11 @@ // void CSwtListView::FocusChanged(TDrawNow aDrawNow) { - TBool focused = IsFocused(); - iGrid->SetFocus(focused); + TBool isFocused = IsFocused(); +#ifdef RD_JAVA_S60_RELEASE_9_2 + EnableFocusHighlight(isFocused); +#endif //RD_JAVA_S60_RELEASE_9_2 + iGrid->SetFocus(isFocused); HandleFocusChanged(aDrawNow); } @@ -2653,6 +2658,14 @@ // void CSwtListView::ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (aType == EEventKeyDown) + { + // After panning focus highlight was disabled, so enabling again + EnableFocusHighlight(ETrue); + } +#endif //RD_JAVA_S60_RELEASE_9_2 + if (GetItemCount() == 0) { iGrid->OfferKeyEventL(aKeyEvent, aType); @@ -3040,6 +3053,8 @@ return; } + UpdateFlickScrollingState(aEventType); + switch (aEventType) { // On 5.0, drawing trough Java gives simply a better fps. @@ -3492,7 +3507,32 @@ // Deliver event to scrollbar if (iVScrollBarGrabsPointerEvents && vsb) { - vsb->HandlePointerEventL(aPointerEvent); + if (!iFlickScrollingOngoing + && aPointerEvent.iType == TPointerEvent::EButton1Down) + { + // Scrollbar was tapped after scrolling stopped + // by itself, so no need to redirect events + iScrollbarPointerEventToListbox = EFalse; + } + + if (iScrollbarPointerEventToListbox) + { + // Stops kinetic scrolling when scrollbar is tapped + iGrid->ForwardPointerEventL(aPointerEvent); + // Continue delivering events until button up appears to prevent + // some unexpected behavior in both scrollbar and listbox + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Up: + iScrollbarPointerEventToListbox = EFalse; + break; + } + } + else + { + // Handles scrollbar behavior + vsb->HandlePointerEventL(aPointerEvent); + } } // Deliver event to list @@ -3574,6 +3614,8 @@ { iVScrollBarGrabsPointerEvents = EFalse; } + + PostMouseEventL(aPointerEvent); } // --------------------------------------------------------------------------- @@ -3587,6 +3629,36 @@ } #endif // RD_SCALABLE_UI_V2 + +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtListView::EnableFocusHighlight +// From MSwtControl +// --------------------------------------------------------------------------- +// +void CSwtListView::EnableFocusHighlight(TBool aEnable) +{ + ASSERT(iGrid); + ASSERT(iGrid->View()); + + CListItemDrawer* itemDrawer = iGrid->View()->ItemDrawer(); + if (itemDrawer) + { + TInt disabledHighlight = + itemDrawer->Flags() & CListItemDrawer::EDisableHighlight; + + if (aEnable && disabledHighlight) + { + itemDrawer->ClearFlags(CListItemDrawer::EDisableHighlight); + } + else if (!aEnable && !disabledHighlight) + { + itemDrawer->SetFlags(CListItemDrawer::EDisableHighlight); + } + } +} +#endif //RD_JAVA_S60_RELEASE_9_2 + #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK void CSwtListView::DoControlSpecificFeedback( const TBool& aFirstTap, @@ -3609,3 +3681,21 @@ } #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK +// --------------------------------------------------------------------------- +// CSwtTableListBox::UpdateFlickScrollingState +// Updates flick scrolling status based on received listbox event. +// --------------------------------------------------------------------------- +// +void CSwtListView::UpdateFlickScrollingState(TListBoxEvent aEventType) +{ + switch (aEventType) + { + case EEventFlickStarted: + iFlickScrollingOngoing = ETrue; + iScrollbarPointerEventToListbox = ETrue; + break; + case EEventFlickStopped: + iFlickScrollingOngoing = EFalse; + break; + } +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmenuarranger.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmenuarranger.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmenuarranger.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -1222,7 +1222,8 @@ { if (aCommandId == EAknSoftkeyOptions && IsOptionsCommandAdded() - && !EikMenuBar()->IsDisplayed()) + && !EikMenuBar()->IsDisplayed() + && !iDisplay.UiUtils().SplitInputView()) { TryDisplayMenuBarL(EFalse); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmobileshell.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmobileshell.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmobileshell.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -216,7 +216,7 @@ utils.UpdateStatusPaneL(); } - CCoeControl::SetRect(DefaultBounds()); + DoSetRect(DefaultBounds()); } // --------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtshell.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtshell.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtshell.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -29,10 +29,7 @@ static const TInt KSwtMainPainVarietySmallSpLandscape = 9; static const TInt KSwtMainPainVarietySmallSpLandscapePen = 4; -// Area bottom pane varieties -static const TInt KSwtAreaBottomPaneVarietyPortrait = 0; #ifdef RD_JAVA_S60_RELEASE_9_2 -static const TInt KSwtAreaBottomPaneVarietyLandscape = 2; static const TInt KSwtRoundCornerBgColorDiff = 50; #endif // RD_JAVA_S60_RELEASE_9_2 @@ -134,7 +131,7 @@ window.SetPointerGrab(ETrue); #endif //RD_SCALABLE_UI_V2 - CCoeControl::SetRect(DefaultBounds()); + DoSetRect(DefaultBounds()); SetMinimumSize(TSize()); UiUtils().RegisterShellL(*this); @@ -209,6 +206,28 @@ } // --------------------------------------------------------------------------- +// CSwtShell::DoSetRect +// Note that calling SetRect on the Shell does not cause a PositionChanged! +// --------------------------------------------------------------------------- +// +void CSwtShell::DoSetRect(const TRect& aRect) +{ + // Divert the job to UiUtils if this is the Shell of an editor open for + // split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + MSwtControl* splitInputView = utils.SplitInputView(); + if (splitInputView && (&(splitInputView->GetShell())) == this) + { + utils.SetSplitInputShellPos(aRect.iTl); + CCoeControl::SetSize(aRect.Size()); + } + else + { + CCoeControl::SetRect(aRect); + } +} + +// --------------------------------------------------------------------------- // CSwtShell::SwtHandleResourceChangeL // From CSwtComposite // --------------------------------------------------------------------------- @@ -225,7 +244,7 @@ { bg->SetRect(iDisplay.Device().Bounds()); } - CCoeControl::SetRect(DefaultBounds()); + DoSetRect(DefaultBounds()); } } @@ -394,27 +413,15 @@ capturingControl->SetSwtFocus(KSwtFocusByPointer); } capturingControl->HandlePointerEventL(aPointerEvent); - capturingControl->PostMouseEventL(aPointerEvent); iDisplay.TryDetectLongTapL(aPointerEvent); return; } - MSwtControl* ctrl = NULL; - - if (aPointerEvent.iType == TPointerEvent::EButton1Up) - ctrl = iDisplay.UiUtils().GetPointerGrabbingControl(); - if (!iDisplay.RevertPointerEvent()) { CSwtComposite::HandlePointerEventL(aPointerEvent); } - if (aPointerEvent.iType != TPointerEvent::EButton1Up) - ctrl = iDisplay.UiUtils().GetPointerGrabbingControl(); - - if (ctrl) - ctrl->PostMouseEventL(aPointerEvent); - iDisplay.TryDetectLongTapL(aPointerEvent); } #else @@ -590,6 +597,17 @@ } } +void CSwtShell::SizeChanged() +{ + CSwtDecorations::SizeChanged(); + MSwtUiUtils& utils = iDisplay.UiUtils(); + MSwtControl* splitInputView = utils.SplitInputView(); + if (splitInputView && (&(splitInputView->GetShell())) == this) + { + utils.AdjustSplitInputShellPos(); + } +} + // --------------------------------------------------------------------------- // CSwtShell::Draw // From MCoeControlBackground @@ -626,7 +644,7 @@ } // --------------------------------------------------------------------------- -// CSwtShell::DoSetFocus +// CSwtShell::SetSwtFocus // From MSwtControl // --------------------------------------------------------------------------- // @@ -710,22 +728,7 @@ return; } - TPoint originalLocation(GetLocation()); - iPosition = aPoint; - - Window().SetPosition(aPoint); - - // Post the MoveEvent if the location changed. - if (GetLocation() != originalLocation) - { - PositionChanged(); - } - - // Drawing after everything else. - if (!(iStyle & KSwtStyleNoRedrawResize)) - { - Redraw(); - } + DoSetLocation(aPoint); } // --------------------------------------------------------------------------- @@ -743,12 +746,16 @@ TSize checkedSize(Max(aSize.iWidth, iMinSize.iWidth), Max(aSize.iHeight, iMinSize.iHeight)); - SetSize(checkedSize); + + if (Size() != checkedSize) + { + SetSize(checkedSize); - // Drawing only after everything else. - if (!(iStyle & KSwtStyleNoRedrawResize)) - { - Redraw(); + // Drawing only after everything else. + if (!(iStyle & KSwtStyleNoRedrawResize)) + { + Redraw(); + } } } @@ -765,22 +772,38 @@ return; } + TBool changed = EFalse; TSize checkedSize(Max(aRect.Size().iWidth, iMinSize.iWidth), Max(aRect.Size().iHeight, iMinSize.iHeight)); - SetSize(checkedSize); - - TPoint originalLocation(GetLocation()); - iPosition = aRect.iTl; - Window().SetPosition(aRect.iTl); - if (GetLocation() != originalLocation) + if (Size() != checkedSize) { - PositionChanged(); + SetSize(checkedSize); + changed = ETrue; } - // No need to recurse on the children, their positions within the - // window do not change + // Divert the job to UiUtils if this is the Shell of an editor open for + // split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + MSwtControl* splitInputView = utils.SplitInputView(); + if (splitInputView && (&(splitInputView->GetShell())) == this) + { + utils.SetSplitInputShellPos(aRect.iTl); + } + else + { + if (aRect.iTl != iPosition) + { + iPosition = aRect.iTl; + Window().SetPosition(aRect.iTl); + PositionChanged(); + changed = ETrue; + } - if (!(iStyle & KSwtStyleNoRedrawResize)) + // No need to recurse on the children, their positions within the + // window do not change + } + + if (changed && !(iStyle & KSwtStyleNoRedrawResize)) { Redraw(); } @@ -976,26 +999,22 @@ TRect newRect(TRect::EUninitialized); if (aMaximized) { - // Set bounds so as to cover the whole application area - RRegion clientRegion; - clientRegion.AddRect(iEikonEnv->EikAppUi()->ClientRect()); - if (!IsMobileShell()) + TRect screenRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, screenRect); + TInt variety(0); + if (CSwtLafFacade::IsLandscapeOrientation()) { - TInt variety(KSwtAreaBottomPaneVarietyPortrait); -#ifdef RD_JAVA_S60_RELEASE_9_2 - if (CSwtLafFacade::IsLandscapeOrientation()) - { - variety = KSwtAreaBottomPaneVarietyLandscape; - } -#endif // RD_JAVA_S60_RELEASE_9_2 - - clientRegion.SubRect(CSwtLafFacade::GetLayoutRect( - CSwtLafFacade::EAreaBottomPane, - iDisplay.Device().Bounds(), - variety).Rect()); + variety = AknLayoutUtils::PenEnabled() ? + KSwtMainPainVarietySmallSpLandscapePen : + KSwtMainPainVarietySmallSpLandscape; } - newRect = clientRegion.BoundingRect(); - clientRegion.Close(); + else + { + variety = KSwtMainPainVarietyClassic; + } + TAknLayoutRect layoutRect = CSwtLafFacade::GetComposeAndLayoutRect( + CSwtLafFacade::EMainPaneCompose, screenRect, variety); + newRect = layoutRect.Rect(); iNormalBounds.SetRect(iPosition, iSize); } else @@ -1003,9 +1022,7 @@ newRect = iNormalBounds; } - SetPosition(newRect.iTl); - SetSize(newRect.Size()); - + SetBounds(newRect); iIsMaximized = aMaximized; Redraw(); } @@ -1806,7 +1823,7 @@ TRAP_IGNORE(utils.UpdateStatusPaneL()); } - CCoeControl::SetRect(DefaultBounds()); + DoSetRect(DefaultBounds()); SetRedraw(ETrue); } @@ -2090,6 +2107,42 @@ } // --------------------------------------------------------------------------- +// CSwtShell::DoSetLocation +// From MSwtShell +// --------------------------------------------------------------------------- +// +void CSwtShell::DoSetLocation(const TPoint& aPoint) +{ + if (aPoint == iPosition) + { + return; + } + + // Divert the job to UiUtils if this is the Shell of an editor open for + // split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + MSwtControl* splitInputView = utils.SplitInputView(); + if (splitInputView && (&(splitInputView->GetShell())) == this) + { + utils.SetSplitInputShellPos(aPoint); + return; + } + + iPosition = aPoint; + Window().SetPosition(aPoint); + + // Post the MoveEvent if the location changed. + PositionChanged(); + + // Drawing after everything else. + if (!(iStyle & KSwtStyleNoRedrawResize)) + { + Redraw(); + } +} + + +// --------------------------------------------------------------------------- // CSwtShell::HandleStatusPaneSizeChange // From MEikStatusPaneObserver // --------------------------------------------------------------------------- @@ -2098,7 +2151,7 @@ { if (iIsMaximized && (!iParent)) { - CCoeControl::SetRect(DefaultBounds()); + DoSetRect(DefaultBounds()); } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtslider.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtslider.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtslider.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -589,6 +589,8 @@ iFeedback->InstantFeedback(ETouchFeedbackSlider); } #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK + + PostMouseEventL(aPointerEvent); } TInt CSwtSlider::CalcAlignedValue(const TPoint& aPoint) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtsortedlist.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtsortedlist.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtsortedlist.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -503,6 +503,10 @@ { CSwtListBase::HandlePointerEventL(aPointerEvent); } + else + { + PostMouseEventL(aPointerEvent); + } } #endif //RD_SCALABLE_UI_V2 @@ -531,6 +535,9 @@ TBool isFocused = IsFocused(); if (iList) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + EnableFocusHighlight(isFocused); +#endif //RD_JAVA_S60_RELEASE_9_2 iList->SetFocus(isFocused, aDrawNow); if (iSearchField) { @@ -595,6 +602,22 @@ CSwtListBase::ProcessKeyEventL(aKeyEvent, aType); } +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtSortedList::EnableFocusHighlight +// From MSwtControl +// --------------------------------------------------------------------------- +// +void CSwtSortedList::EnableFocusHighlight(TBool aEnable) +{ + ASSERT(iList); + ASSERT(iList->View()); + + CSwtListBoxLists::EnableFocusHighlight(iList->View()->ItemDrawer(), + aEnable); +} +#endif //RD_JAVA_S60_RELEASE_9_2 + // --------------------------------------------------------------------------- // CSwtSortedList::DoPaint // From MSwtControl @@ -924,8 +947,8 @@ iSearchField->SetComponentsToInheritVisibility(ETrue); // Set search field to use only second column to get - // item text. Items use \t as column separators, see method - // CSwtListBase::CreateItemTextLC() for details. + // item text. Items use \t as column separators, see method + // CSwtListBase::CreateItemTextLC() for details. const int KItemTextColumnFlag = 2; iSearchField->SetListColumnFilterFlags(KItemTextColumnFlag); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttable.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttable.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttable.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -441,7 +441,11 @@ // void CSwtTable::FocusChanged(TDrawNow aDrawNow) { - iTableListBox->SetFocus(IsFocusControl()); + TBool isFocused = IsFocusControl(); +#ifdef RD_JAVA_S60_RELEASE_9_2 + EnableFocusHighlight(isFocused); +#endif //RD_JAVA_S60_RELEASE_9_2 + iTableListBox->SetFocus(isFocused); HandleFocusChanged(aDrawNow); } @@ -1739,9 +1743,9 @@ TRAP_IGNORE ( for (TInt i = 0; i < colCount; ++i) - { - PostColumnResizeEventL(iTableColumns[ i ]->JavaPeer()); - } + { + PostColumnResizeEventL(iTableColumns[ i ]->JavaPeer()); + } ); Redraw(); } @@ -1976,6 +1980,13 @@ // void CSwtTable::ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) { +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (aType == EEventKeyDown) + { + // After panning focus highlight was disabled, so enabling again + EnableFocusHighlight(ETrue); + } +#endif //RD_JAVA_S60_RELEASE_9_2 iTableListBox->ProcessKeyEventL(aKeyEvent, aType); } @@ -2157,6 +2168,36 @@ ); } +#ifdef RD_JAVA_S60_RELEASE_9_2 +// --------------------------------------------------------------------------- +// CSwtTable::EnableFocusHighlight +// From MSwtControl +// --------------------------------------------------------------------------- +// +void CSwtTable::EnableFocusHighlight(TBool aEnable) +{ + ASSERT(iTableListBox); + ASSERT(iTableListBox->View()); + + CListItemDrawer* itemDrawer = iTableListBox->View()->ItemDrawer(); + if (itemDrawer) + { + TInt disabledHighlight = + itemDrawer->Flags() & CListItemDrawer::EDisableHighlight; + + if (aEnable && disabledHighlight) + { + itemDrawer->ClearFlags(CListItemDrawer::EDisableHighlight); + } + else if (!aEnable && !disabledHighlight) + { + itemDrawer->SetFlags(CListItemDrawer::EDisableHighlight); + } + } +} +#endif //RD_JAVA_S60_RELEASE_9_2 + + // --------------------------------------------------------------------------- // From ASwtScrollableBase // Scrollbar frame is created and owned by the listbox component. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttablelistbox.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttablelistbox.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttablelistbox.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -668,8 +668,34 @@ // Deliver event to scrollbar if (iVScrollBarGrabsPointerEvents && vsb) { - vsb->HandlePointerEventL(aPointerEvent); + if (!iFlickScrollingOngoing + && aPointerEvent.iType == TPointerEvent::EButton1Down) + { + // Scrollbar was tapped after scrolling stopped + // by itself, so no need to redirect events + iScrollbarPointerEventToListbox = EFalse; + } + + if (iScrollbarPointerEventToListbox) + { + // Stops kinetic scrolling when scrollbar is tapped + CEikTextListBox::HandlePointerEventL(aPointerEvent); + // Continue delivering events until button up appears to prevent + // some unexpected behavior in both scrollbar and listbox + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Up: + iScrollbarPointerEventToListbox = EFalse; + break; + } + } + else + { + // Handles scrollbar behavior + vsb->HandlePointerEventL(aPointerEvent); + } } + if (iHScrollBarGrabsPointerEvents && hsb) { hsb->HandlePointerEventL(aPointerEvent); @@ -869,6 +895,8 @@ return; } + UpdateFlickScrollingState(aEventType); + switch (aEventType) { // On 5.0, drawing trough Java gives simply a better fps. @@ -1130,7 +1158,9 @@ CSwtTableListBox::CSwtTableListBox(MSwtDisplay& aDisplay, CSwtTable &aTable) : iDisplay(aDisplay), - iTable(aTable) + iTable(aTable), + iFlickScrollingOngoing(EFalse) + { } @@ -1190,3 +1220,22 @@ { return iTable.ClientRect().Width(); } + +// --------------------------------------------------------------------------- +// CSwtTableListBox::UpdateFlickScrollingState +// Updates flick scrolling status based on received listbox event. +// --------------------------------------------------------------------------- +// +void CSwtTableListBox::UpdateFlickScrollingState(TListBoxEvent aEventType) +{ + switch (aEventType) + { + case EEventFlickStarted: + iFlickScrollingOngoing = ETrue; + iScrollbarPointerEventToListbox = ETrue; + break; + case EEventFlickStopped: + iFlickScrollingOngoing = EFalse; + break; + } +} diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttext.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttext.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttext.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -549,7 +549,11 @@ } #ifdef RD_SCALABLE_UI_V2 aknFlags |= EAknEditorFlagDeliverVirtualKeyEventsToApplication; -#endif // RD_SCALABLE_UI_V2 +#endif // RD_SCALABLE_UI_V2 + +#ifdef RD_JAVA_S60_RELEASE_9_2 + aknFlags |= EAknEditorFlagEnablePartialScreen; +#endif editor->SetAknEditorFlags(aknFlags); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextbase.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextbase.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextbase.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -17,6 +17,11 @@ #include #include #include +#ifdef RD_JAVA_S60_RELEASE_9_2 +#include +#endif +#include +#include #include "swtscrollbar.h" #include "swtfont.h" #include "swttextbase.h" @@ -297,6 +302,49 @@ Redraw(); } +void CSwtTextBase::SetBounds(const TRect& aRect) +{ + // Divert the job to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aRect.Size()); + SetLocation(aRect.iTl); + } + else + { + ASwtScrollableBase::SetBounds(aRect); + } +} + +void CSwtTextBase::SetWidgetSize(const TSize& aSize) +{ + // Divert the job to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.SetSplitInputViewSize(aSize); + } + else + { + ASwtScrollableBase::SetWidgetSize(aSize); + } +} + +TSwtPeer CSwtTextBase::Dispose() +{ + // Close VKB. + if (iEditor->IsFocused()) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } + return ASwtScrollableBase::Dispose(); +} + // --------------------------------------------------------------------------- // CSwtTextBase::ComputeDelta // --------------------------------------------------------------------------- @@ -710,6 +758,16 @@ return; } + // Close VKB. Do it here instead of FocusChange to avoid split input flicker. + if (iEditor->IsFocused() && !aVisible) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } + CCoeControl::MakeVisible(aVisible); if (iEditor) { @@ -728,6 +786,7 @@ } } } + FocusabilityChanged(); } @@ -738,6 +797,16 @@ // void CSwtTextBase::SetDimmed(TBool aDimmed) { + // Close VKB. Do it here instead of FocusChange to avoid split input flicker. + if (iEditor->IsFocused() && aDimmed) + { + CCoeFep* fep = iDisplay.CoeEnv()->Fep(); + if (fep) + { + fep->HandleDestructionOfFocusedItem(); + } + } + CCoeControl::SetDimmed(aDimmed); if (iEditor) { @@ -775,6 +844,16 @@ ProcessFontUpdateL(); } } +#ifdef RD_JAVA_S60_RELEASE_9_2 + else if (aType == KAknSplitInputEnabled) + { + const MSwtShell* activeShell = iDisplay.UiUtils().GetActiveShell(); + if (activeShell && activeShell->FocusControl() == this) + { + iDisplay.UiUtils().SetSplitInputEditor(this); + } + } +#endif } // --------------------------------------------------------------------------- @@ -801,6 +880,7 @@ TBool hit = ETrue; #ifdef RD_JAVA_S60_RELEASE_9_2 + TBool isActiveSplitEditor = iDisplay.UiUtils().SplitInputEditor() == this; hit = Rect().Contains(aPointerEvent.iPosition); TBool pressed = iPressed; #endif @@ -815,7 +895,7 @@ #ifdef RD_JAVA_S60_RELEASE_9_2 else { - iPressed = ETrue; + iPressed = !isActiveSplitEditor; } #endif } @@ -883,7 +963,7 @@ #ifdef RD_JAVA_S60_RELEASE_9_2 else if (aPointerEvent.iType == TPointerEvent::EDrag) { - iPressed = hit; + iPressed = hit && !iVScrollBarGrabsPointerEvents && !isActiveSplitEditor; } if (pressed != iPressed) @@ -894,6 +974,8 @@ // We got a pointer event, so any subsequent events should not be ignored. iIgnorePointerDown = EFalse; #endif // RD_JAVA_S60_RELEASE_9_2 + + PostMouseEventL(aPointerEvent); } #else //RD_SCALABLE_UI_V2 void CSwtTextBase::HandlePointerEventL( @@ -921,13 +1003,7 @@ if (!IsFocused()) iIndicator->SetState(EStateNone); } - - // Aparenlty this is the only way of forcing the VKB to close. - if (iEditor->IsFocused() && !IsFocused()) - { - iDisplay.CoeEnv()->Fep()->HandleDestructionOfFocusedItem(); - } - + iEditor->SetFocus(IsFocused()); } @@ -988,6 +1064,13 @@ iEditor->SetRect(editorRect); HandlePositionChanged(); + + // Notify change to UiUtils if this is an editor open for split view editing. + MSwtUiUtils& utils = iDisplay.UiUtils(); + if (utils.SplitInputView() == this) + { + utils.AdjustSplitInputShellPos(); + } } // --------------------------------------------------------------------------- diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextextension.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextextension.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttextextension.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -154,18 +154,19 @@ TInt sct = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG; TUint flags = 0; + CEikEdwin& edwin = Editor(); if (iTypeStyle & EEmailAddress) { iMenu = CSwtControlMenu::NewL(iDisplay, NULL, 0); iMenu->SetObserver(this); iMenuItem = CSwtMenuItem::NewL(iDisplay, NULL, *iMenu, 0, 0, ESwtFetchEmail); // Email style implementation - Editor().SetMaxLength(KSWTTEXTEXTENSION_EMAIL_LENGTH); - Editor().SetAknEditorAllowedInputModes(EAknEditorAllInputModes); - Editor().SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode); - Editor().SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes); - Editor().SetAknEditorCase(EAknEditorLowerCase); - Editor().SetAknEditorCurrentCase(EAknEditorLowerCase); + edwin.SetMaxLength(KSWTTEXTEXTENSION_EMAIL_LENGTH); + edwin.SetAknEditorAllowedInputModes(EAknEditorAllInputModes); + edwin.SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode); + edwin.SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes); + edwin.SetAknEditorCase(EAknEditorLowerCase); + edwin.SetAknEditorCurrentCase(EAknEditorLowerCase); sct = R_AVKON_EMAIL_ADDR_SPECIAL_CHARACTER_TABLE_DIALOG; flags |= EEikEdwinNoLineOrParaBreaks|EAknEditorFlagNoT9; //Adding Non Midlet Commands @@ -180,12 +181,12 @@ iMenu->SetObserver(this); iMenuItem = CSwtMenuItem::NewL(iDisplay, NULL, *iMenu, 0, 0, ESwtFetchUrl); // Url type implementation - Editor().SetMaxLength(KSWTTEXTEXTENSION_URL_LENGTH); - Editor().SetAknEditorAllowedInputModes(EAknEditorAllInputModes); - Editor().SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode); - Editor().SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes); - Editor().SetAknEditorCase(EAknEditorLowerCase); - Editor().SetAknEditorCurrentCase(EAknEditorLowerCase); + edwin.SetMaxLength(KSWTTEXTEXTENSION_URL_LENGTH); + edwin.SetAknEditorAllowedInputModes(EAknEditorAllInputModes); + edwin.SetAknEditorCurrentInputMode(EAknEditorAlphaInputMode); + edwin.SetAknEditorPermittedCaseModes(EAknEditorAllCaseModes); + edwin.SetAknEditorCase(EAknEditorLowerCase); + edwin.SetAknEditorCurrentCase(EAknEditorLowerCase); sct = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG; flags |= EEikEdwinNoLineOrParaBreaks|EAknEditorFlagNoT9; //Adding Non Midlet Commands @@ -206,13 +207,19 @@ //NonPredictive type implementation flags |= EAknEditorFlagNoT9; } + #ifdef RD_SCALABLE_UI_V2 flags |= EAknEditorFlagDeliverVirtualKeyEventsToApplication; #endif // RD_SCALABLE_UI_V2 - Editor().SetAknEditorFlags(flags); - Editor().SetAknEditorSpecialCharacterTable(sct); - // make changes take effect - TRAP_IGNORE(Editor().NotifyEditorStateObserverOfStateChangeL()); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + flags |= EAknEditorFlagEnablePartialScreen; +#endif + + edwin.SetAknEditorFlags(flags); + edwin.SetAknEditorSpecialCharacterTable(sct); + + TRAP_IGNORE(edwin.NotifyEditorStateObserverOfStateChangeL()); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -417,6 +417,8 @@ feedback->EnableFeedbackForControl(iTree, ETrue); } #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK + + // The mouse event is posted to Java from CSwtComposite } MSwtComposite* CSwtTree::Composite() diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtuiutils.cpp --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtuiutils.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtuiutils.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -24,6 +24,10 @@ #include #include #include +#ifdef RD_JAVA_S60_RELEASE_9_2 +#include +#include +#endif #include #include #include "eswtmobileextensions.h" @@ -350,32 +354,6 @@ } } - -// --------------------------------------------------------------------------- -// CSwtUiUtils::SetPointerCaptureControl -// --------------------------------------------------------------------------- -// -void CSwtUiUtils::SetPointerCaptureControl(MSwtControl* aControl) -{ - if (aControl) - { - iPointerCaptureControl = aControl; - } - else - { - iPointerCaptureControl = NULL; - } -} - -// --------------------------------------------------------------------------- -// CSwtUiUtils::PointerCaptureControl -// --------------------------------------------------------------------------- -// -MSwtControl* CSwtUiUtils::PointerCaptureControl() -{ - return iPointerCaptureControl; -} - // --------------------------------------------------------------------------- // CSwtUiUtils::SetNextFocusedControl // --------------------------------------------------------------------------- @@ -559,6 +537,7 @@ } // Title pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidTitle))); if (ctrl) @@ -573,6 +552,7 @@ } // Navi pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidNavi))); if (ctrl) @@ -587,6 +567,7 @@ } // Empty pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidEmpty))); if (ctrl) @@ -601,6 +582,7 @@ } // Indi pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidIndic))); if (ctrl) @@ -615,6 +597,7 @@ } // Clock pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidClock))); if (ctrl) @@ -629,6 +612,7 @@ } // Digital clock pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidDigitalClock))); if (ctrl) @@ -643,6 +627,7 @@ } // Signal pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidSignal))); if (ctrl) @@ -657,6 +642,7 @@ } // Battery pane priority. + ctrl = NULL; TRAP_IGNORE(ctrl = iStatusPane->ContainerControlL( TUid::Uid(EEikStatusPaneUidBattery))); if (ctrl) @@ -847,6 +833,10 @@ return *iInlineFont; } +// --------------------------------------------------------------------------- +// CSwtUiUtils::HideIndicator +// --------------------------------------------------------------------------- +// void CSwtUiUtils::HideIndicator(TInt aId) { TUid uid = TUid::Uid(aId); @@ -862,6 +852,10 @@ } } +// --------------------------------------------------------------------------- +// CSwtUiUtils::HideIndicators +// --------------------------------------------------------------------------- +// void CSwtUiUtils::HideIndicators() { if (!iStatusPane) @@ -876,6 +870,52 @@ } // --------------------------------------------------------------------------- +// CSwtUiUtils::DoSetSplitInputShellPos +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::DoSetSplitInputShellPos(const TPoint& aPos) +{ + MSwtShell& shell = iSplitInputView->GetShell(); + MSwtControl* temp = iSplitInputView; + iSplitInputView = 0; // stop recursion. + shell.DoSetLocation(aPos); + iSplitInputView = temp; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::DoSetSplitInputViewSize +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::DoSetSplitInputViewSize(const TSize& aSize) +{ + MSwtControl* temp = iSplitInputView; + iSplitInputView = 0; // stop recursion. + temp->SetWidgetSize(aSize); + iSplitInputView = temp; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::ScrolledCompositeAncestor +// --------------------------------------------------------------------------- +// +MSwtControl* CSwtUiUtils::ScrolledCompositeAncestor(const MSwtControl& aControl) const +{ + MSwtComposite* parent = aControl.GetParent(); + const MSwtControl* control = &aControl; + while (parent) + { + if (parent->ScrolledCompositeContent() == control) + { + return parent->Control(); + } + control = parent->Control(); + parent = parent->Control()->GetParent(); + } + + return 0; +} + +// --------------------------------------------------------------------------- // CSwtUiUtils::GetSystemColor // From MSwtUiUtils // --------------------------------------------------------------------------- @@ -1149,10 +1189,19 @@ MSwtShell* topShell = TopMostTopShell(); if (!topShell || topShell->FullScreenMode()) { - if (iStatusPane->IsVisible()) + if (iSplitInputEditor) { - iStatusPane->SetObserver(NULL); - iStatusPane->MakeVisible(EFalse); + // Split input editing is ongoing and the status pane is hidden. + // Cache the new status pane visibility for when the split input ends. + iSplitInputSPVisible = EFalse; + } + else + { + if (iStatusPane->IsVisible()) + { + iStatusPane->SetObserver(NULL); + iStatusPane->MakeVisible(EFalse); + } } return; } @@ -1261,7 +1310,16 @@ iStatusPane->SetObserver(NULL); if (!topShell || style == MSwtShell::EStyleNoStatusPane) { - iStatusPane->MakeVisible(EFalse); + if (iSplitInputEditor) + { + // Split input editing is ongoing and the status pane is hidden. + // Cache the new status pane visibility for when the split input ends. + iSplitInputSPVisible = EFalse; + } + else + { + iStatusPane->MakeVisible(EFalse); + } } else { @@ -1273,22 +1331,35 @@ { iStatusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_SMALL_WITH_SIGNAL_PANE); } - iStatusPane->MakeVisible(ETrue); - java::ui::CoreUiAvkonAppUi* appUi = java::ui::CoreUiAvkonEswt::getInstance().getJavaUiAppUi(); - if (appUi && appUi->hidesIndicators()) + if (iSplitInputEditor) + { + // Split input editing is ongoing and the status pane is hidden. + // Cache the new status pane visibility for when the split input ends. + iSplitInputSPVisible = ETrue; + } + else { - HideIndicators(); - } + iStatusPane->MakeVisible(ETrue); - // The above relies on DrawDeferred which is too slow for some cases. - // For instance, the pane must draw immediately when the app draws the - // first time otherwise the startup screenshot will miss the pane. - iStatusPane->DrawNow(); + java::ui::CoreUiAvkonAppUi* appUi = java::ui::CoreUiAvkonEswt::getInstance().getJavaUiAppUi(); + if (appUi && appUi->hidesIndicators()) + { + HideIndicators(); + } + + // The above relies on DrawDeferred which is too slow for some cases. + // For instance, the pane must draw immediately when the app draws the + // first time otherwise the startup screenshot will miss the pane. + iStatusPane->DrawNow(); + } } // This will cause HandleStatusPaneSizeChange notifications again - iStatusPane->SetObserver(this); + if (!iSplitInputEditor) + { + iStatusPane->SetObserver(this); + } // Shells are trusted to have the correct size already. } @@ -1544,6 +1615,12 @@ shell->Control()->CoeControl().HandleResourceChange(aType); } } +#ifdef RD_JAVA_S60_RELEASE_9_2 + if (aType == KAknSplitInputDisabled) + { + SetSplitInputEditor(0); + } +#endif } // --------------------------------------------------------------------------- @@ -1676,6 +1753,215 @@ } // --------------------------------------------------------------------------- +// CSwtUiUtils::SetPointerCaptureControl +// From MSwtUtils +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::SetPointerCaptureControl(MSwtControl* aControl) +{ + if (aControl) + { + iPointerCaptureControl = aControl; + } + else + { + iPointerCaptureControl = NULL; + } +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::PointerCaptureControl +// From MSwtUtils +// --------------------------------------------------------------------------- +// +MSwtControl* CSwtUiUtils::PointerCaptureControl() +{ + return iPointerCaptureControl; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetSplitInputEditor +// From MSwtUtils +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::SetSplitInputEditor(MSwtControl* aEditor) +{ + if (iSplitInputEditor == aEditor) + { + // This can happen when pressing Enter in a multi line editor. + return; + } + + CAknAppUi* appUi = (CAknAppUi*)iDisplay.CoeEnv()->EikAppUi(); + + if (aEditor) + { + MSwtShell& shell = aEditor->GetShell(); + MSwtControl* view = ScrolledCompositeAncestor(*aEditor); + TBool editorSwitch(iSplitInputEditor != 0); + TBool keepView(view && view == iSplitInputView); + TBool keepShell(editorSwitch && ((&iSplitInputEditor->GetShell()) == (&shell))); + + if (editorSwitch) + { + if (!keepShell) + { + // Move back the previous split input Shell keeping the SP hidden. + DoSetSplitInputShellPos(iSplitInputShellPos); + } + // Otherwise no need for the shell to restore its original + // position as it is going to be moved again right after this. + + if (!keepView) + { + // Resize back the previous split input view + DoSetSplitInputViewSize(iSplitInputViewSize); + } + } + + iSplitInputEditor = aEditor; + iSplitInputView = view; + if (!iSplitInputView) + { + iSplitInputView = iSplitInputEditor; + } + + if (!editorSwitch || !keepShell) + { + iSplitInputShellPos = shell.Control()->GetLocation(); + } + + if (!editorSwitch) + { + iSplitInputSPVisible = iStatusPane->IsVisible(); + } + + if (iStatusPane->IsVisible()) + { + // Hide the SP. The observer must be cleared before so that + // HandleStatusPaneSizeChange is not called on the Shell. + iStatusPane->SetObserver(NULL); + iStatusPane->MakeVisible(EFalse); + } + + if (!keepView) + { + iSplitInputViewSize = TSize(0, 0); + SetSplitInputViewSize(iSplitInputView->GetWidgetSize()); + } + + if (!editorSwitch && view) + { + TRAP_IGNORE(iDisplay.PostShowFocusedControlEventL(view->JavaPeer())); + } + } + else + { + ASSERT(iSplitInputEditor); + if (iSplitInputSPVisible) + { + iStatusPane->MakeVisible(ETrue); + iStatusPane->SetObserver(this); + } + DoSetSplitInputShellPos(iSplitInputShellPos); + DoSetSplitInputViewSize(iSplitInputViewSize); + iSplitInputEditor = 0; + iSplitInputView = 0; + } +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetSplitInputEditor +// From MSwtUtils +// --------------------------------------------------------------------------- +// +MSwtControl* CSwtUiUtils::SplitInputEditor() const +{ + return iSplitInputEditor; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetSplitInputEditor +// From MSwtUtils +// --------------------------------------------------------------------------- +// +MSwtControl* CSwtUiUtils::SplitInputView() const +{ + return iSplitInputView; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetSplitInputShellPos +// From MSwtUtils +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::SetSplitInputShellPos(const TPoint& aOriginalPos) +{ + iSplitInputShellPos = aOriginalPos; +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetSplitInputViewSize +// From MSwtUtils +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::SetSplitInputViewSize(const TSize& aOriginalSize) +{ + if (aOriginalSize == iSplitInputViewSize) + { + return; + } + + // Remember the size of the editor and resize it if needed + // to fit into remaining space above the vkb. + iSplitInputViewSize = aOriginalSize; + CAknAppUi* appUi = (CAknAppUi*)iDisplay.CoeEnv()->EikAppUi(); + TRect appUiRect(appUi->ClientRect()); + TSize size(iSplitInputViewSize); + if (size.iHeight > appUiRect.Height()) + { + size.iHeight = appUiRect.Height(); + } + DoSetSplitInputViewSize(size); + AdjustSplitInputShellPos(); +} + +// --------------------------------------------------------------------------- +// CSwtUiUtils::AdjustSplitInputShellPos +// From MSwtUtils +// --------------------------------------------------------------------------- +// +void CSwtUiUtils::AdjustSplitInputShellPos() +{ + if (!iSplitInputView) + { + return; + } + + CAknAppUi *appUi = (CAknAppUi*)(iDisplay.CoeEnv()->EikAppUi()); + TInt appUiHeight(appUi->ClientRect().Height()); + MSwtShell & shell = iSplitInputView->GetShell(); + TInt shellHeight(shell.Control()->GetWidgetSize().iHeight); + TRect rect(iSplitInputView->VisibleRect()); + TInt y(-rect.iTl.iY + (appUiHeight - rect.Height()) / 2); + if (y < (appUiHeight - shellHeight)) + y = appUiHeight - shellHeight; + + if (!shell.GetParentShell()) + { + if (y > 0) + y = 0; + } + else + { + if (y > iSplitInputShellPos.iY) + y = iSplitInputShellPos.iY; + + } + DoSetSplitInputShellPos(TPoint(iSplitInputShellPos.iX, y)); +} + +// --------------------------------------------------------------------------- // CSwtUiUtils::HandleFreeRamEventL // From MSwtUiUtils // --------------------------------------------------------------------------- @@ -1777,6 +2063,10 @@ return NULL; } +// --------------------------------------------------------------------------- +// CSwtUiUtils::SetShellFade +// --------------------------------------------------------------------------- +// void CSwtUiUtils::SetShellFade(MSwtShell* aShell, TBool aStatus) { if (CanBeFaded(aShell)) @@ -1793,7 +2083,12 @@ } } +// --------------------------------------------------------------------------- +// CSwtUiUtils::CanBeFaded +// --------------------------------------------------------------------------- +// TBool CSwtUiUtils::CanBeFaded(MSwtShell* aShell) const { return (aShell && aShell->GetParentShell() && IsApplicationModal(*aShell)); } + diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/eswt_akn/org.eclipse.ercp.swt.s60/src/org/eclipse/swt/custom/ScrolledComposite.java --- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/src/org/eclipse/swt/custom/ScrolledComposite.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/src/org/eclipse/swt/custom/ScrolledComposite.java Wed Jun 09 09:34:07 2010 +0300 @@ -734,7 +734,10 @@ if (control == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); if (control.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); if (!contains(control)) SWT.error(SWT.ERROR_INVALID_ARGUMENT); + doShowControl(control, false); + } + private void doShowControl(Control control, boolean center) { Rectangle itemRect = getDisplay().map(control.getParent(), this, control.getBounds()); Rectangle area = getClientArea(); Point origin = getOrigin(); @@ -746,13 +749,21 @@ { if (area.width < itemRect.x + itemRect.width) origin.x = Math.max(0, origin.x + itemRect.x + Math.min(itemRect.width, area.width) - area.width); } - if (itemRect.y < 0) + + if (center && itemRect.height <= area.height) { - origin.y = Math.max(0, origin.y + itemRect.y); + origin.y = origin.y + itemRect.y - (area.height - itemRect.height) / 2; } else { - if (area.height < itemRect.y + itemRect.height) origin.y = Math.max(0, origin.y + itemRect.y + Math.min(itemRect.height, area.height) - area.height); + if (itemRect.y < 0) + { + origin.y = Math.max(0, origin.y + itemRect.y); + } + else + { + if (area.height < itemRect.y + itemRect.height) origin.y = Math.max(0, origin.y + itemRect.y + Math.min(itemRect.height, area.height) - area.height); + } } setOrigin(origin); } @@ -765,4 +776,10 @@ int vSelection = vBar.getSelection(); content.setLocation(location.x, -vSelection); } + + void handleShowFocusedControlEvent() + { + Control control = getDisplay().getFocusControl(); + if (contains(control)) doShowControl(control, true); + } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java --- a/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitInvoker.java Wed Jun 09 09:34:07 2010 +0300 @@ -88,6 +88,15 @@ */ public abstract boolean isNgaEnabled(); + + /** + * NGA specific change. + * LCDUI's client APIs (e.g M3G) can check are they on foreground or not. + * @return true if MIDlet is on foreground. + * @since S60 9.2 + */ + public abstract boolean isForeground(); + // // Image access // diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitObserverNGAExtension.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/javalegacyutils/javasrc/com/nokia/mj/impl/rt/legacy/ToolkitObserverNGAExtension.java Wed Jun 09 09:34:07 2010 +0300 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2010 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: +* +*/ + + +package com.nokia.mj.impl.rt.legacy; + +public interface ToolkitObserverNGAExtension extends ToolkitObserver +{ + /** + * Notification about MIDlet going to background or coming foreground. + * @param foreground true, when MIDlet came to foreground + * false, when MIDlet was sent to background + */ + void foregroundEvent(boolean foreground); +} \ No newline at end of file diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/Toolkit.java --- a/javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/Toolkit.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/Toolkit.java Wed Jun 09 09:34:07 2010 +0300 @@ -29,6 +29,7 @@ import com.nokia.mj.impl.rt.legacy.MIDEventServer; import com.nokia.mj.impl.rt.legacy.NativeError; import com.nokia.mj.impl.rt.legacy.ToolkitObserver; +import com.nokia.mj.impl.rt.legacy.ToolkitObserverNGAExtension; import com.nokia.mj.impl.rt.support.ApplicationUtils; import com.nokia.mj.impl.rt.support.ApplicationInfo; @@ -553,9 +554,11 @@ break; case EVENT_FOREGROUND: iDisplay.handleForeground(true); + notifyForeground(true); break; case EVENT_BACKGROUND: iDisplay.handleForeground(false); + notifyForeground(false); break; case EVENT_SET_CURRENT: iDisplay.switchCurrent(); @@ -570,6 +573,23 @@ } } + private synchronized void notifyForeground(boolean foreground) + { + if (null != iObservers) + { + final int lastIndex = iObservers.size() - 1; + for (int ii=lastIndex; ii>=0; ii--) + { + if (iObservers.elementAt(ii) instanceof ToolkitObserverNGAExtension) + { + final ToolkitObserverNGAExtension observer = + (ToolkitObserverNGAExtension)iObservers.elementAt(ii); + observer.foregroundEvent(foreground); + } + } + } + } + private void handleCanvasGraphicsItemPainterEvent(CanvasGraphicsItemPainter aSource, int aEvent, int aParam0, int aParam1, int aParam2) { if (resetThread()) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/ToolkitInvoker.java --- a/javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/ToolkitInvoker.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/ToolkitInvoker.java Wed Jun 09 09:34:07 2010 +0300 @@ -287,5 +287,22 @@ } return ((Graphics)aGraphics).iHandle; } + + /* + * @see com.nokia.mj.impl.rt.legacy.ToolkitInvoker#isForeground() + */ + public boolean isForeground() + { + Toolkit toolkit = getCurrentToolkit(); + if (toolkit != null) + { + Display display = toolkit.getDisplay(); + if (display != null) + { + return display.IsForeground(); + } + } + return false; + } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/inc/CMIDCanvas.h --- a/javauis/lcdui_akn/lcdui/inc/CMIDCanvas.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/inc/CMIDCanvas.h Wed Jun 09 09:34:07 2010 +0300 @@ -1040,7 +1040,7 @@ * returns EFalse. */ TBool IsNetworkIndicatorEnabledL() const; - + public: /** * Handles switching from foreground to @@ -1048,7 +1048,7 @@ * context and surfaces need to be relased. */ void HandleForeground(TBool aForeground); - + private: /** States of the first paint */ enum TFirstPainState { @@ -1068,7 +1068,7 @@ EEglWindow, EEglPbuffer } TEglType; - + // from MAlfBufferProvider public: /** @@ -1316,6 +1316,12 @@ */ const TDesC8& GetEglError(EGLint aErr); + /** + * Clears UI surface to transparent color + * @since S60 9.2 + */ + void ClearUiSurface(TBool aDrawing); + #endif // RD_JAVA_NGA_ENABLED private: // data @@ -1560,7 +1566,7 @@ // Stores the control on which was press event generated MMIDCustomComponent* iPressedComponent; - + /** * Flag incdicating the foreground status of canvas. * Set to EFalse when some other displayable is made current @@ -1690,7 +1696,7 @@ * All events, which started outside the canvas have to be ignored. */ TBool iDragEventsStartedInside; - + /** * Switched after any graphics have been sent to screen. * Those graphics should be really drawn on the screen. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/inc/CMIDTextBoxQueryDialog.h --- a/javauis/lcdui_akn/lcdui/inc/CMIDTextBoxQueryDialog.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/inc/CMIDTextBoxQueryDialog.h Wed Jun 09 09:34:07 2010 +0300 @@ -283,6 +283,14 @@ TBool IsNumberConversionNeeded(); void HandleMinusCharEventL(MEikEdwinObserver::TEdwinEvent aEventType); + + /** + * Prevents changes that would result in an illegal string + * + * @param TEdwinEvent aEventType + */ + void HandleTextUpdateL(TEdwinEvent aEventType); + TPtrC Read() const; void CreateNonMidletCommandsL(); @@ -394,6 +402,12 @@ * Rect of Editor */ TRect iEditorRect; + + /** + * Used when ConstraintsValidForText decide + * whatever to test text using stric options or not + */ + TBool iStrict; }; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/inc/CMIDTextEditorEdwinCustomDraw.h --- a/javauis/lcdui_akn/lcdui/inc/CMIDTextEditorEdwinCustomDraw.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/inc/CMIDTextEditorEdwinCustomDraw.h Wed Jun 09 09:34:07 2010 +0300 @@ -112,7 +112,7 @@ const TDesC& aText, const TPoint& aTextOrigin, TInt aExtraPixels) const; - + #ifdef RD_JAVA_S60_RELEASE_9_2 /** * Called by the editor FW in order to draw the the content of @@ -124,8 +124,8 @@ * @param aLineInfo The line information. * @param aFormat The current character format. * @param aText The content to draw. - * @param aStart - * @param aEnd + * @param aStart + * @param aEnd * @param aTextOrigin The origin of the text. * @param aExtraPixels The amount of extra pixels. * @since S60 5.0 @@ -140,7 +140,7 @@ const TPoint& aTextOrigin, TInt aExtraPixels) const; #endif - + /** * Retrieves the system color for the specified color index. * @@ -154,6 +154,16 @@ TUint aColorIndex, TRgb aDefaultColor) const; +private: // Own functions + /** + * Gets proper clipping rect used during scaling. Returned rect is + * intersection of canvas rect and iEditorRect. + * + * @return The proper clipping rect during scaling + * @since S60 5.0 + */ + const TRect GetClippingRectForScaling() const; + private: // Data // Reference to the editor window. Used. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDCanvas.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDCanvas.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDCanvas.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -108,6 +108,7 @@ // mixing 3D & 2D rendering #define KTransparentClearColor TRgb(0x000000, 0x0) #define KOpaqueClearColor TRgb(0xFFFFFF, 0xFF) +#define KOpaqueBlackColor TRgb(0x000000, 255) #ifdef _DEBUG #define ASSERT_GL() AssertGL() @@ -859,7 +860,8 @@ { CreatePBufferSurfaceL(); } - // Draw all framebuffer content to EGL surface. + // Draw the whole framebuffer content (as a texture) on top of + // the EGL window surface. iUpperUpdateRect = TRect(Size()); UpdateEglContent(); } @@ -1068,7 +1070,22 @@ iEnv.ToLcduiObserver().RegisterControl(*this, this); #else iEnv.ToLcduiObserver().RegisterControl(*this); -#endif +#endif // RD_JAVA_NGA_ENABLED + +#ifdef RD_JAVA_NGA_ENABLED + if (iFirstPaintState != EFirstPaintOccurred && + iDirectContents.Count() == 1) + { + // The first canvas paint using NGA might be interrupted + // by addition of the direct content. + // Invoking repaint event to restore the first paint. + TInt posPacked = (iViewRect.iTl.iX << 16) | (iViewRect.iTl.iY); + TSize size = iViewRect.Size(); + TInt sizePacked = (size.iWidth << 16) | (size.iHeight); + + PostEvent(EPaint, posPacked, sizePacked); + } +#endif // RD_JAVA_NGA_ENABLED } @@ -1541,8 +1558,7 @@ { // In case direct content content was removed // from canvas, recreate pixel source here - if (!iAlfCompositionPixelSource && - !IsEglAvailable()) + if (!iAlfCompositionPixelSource && !IsEglAvailable()) { InitPixelSourceL(); } @@ -1559,6 +1575,22 @@ { DrawNow(aRect); } +#ifdef RD_JAVA_NGA_ENABLED + iCoeEnv->WsSession().Finish(); +#endif + + if (iFirstPaintState == EFirstPaintInitiated || + iFirstPaintState == EFirstPaintPrepared) + { + // NGA is not used, StartScreen can be informed now + if (iForeground) + { + // The canvas is current, therefore we can flush + // the graphics and take the start screen snapshot. + iFirstPaintState = EFirstPaintOccurred; + java::ui::CoreUiAvkonLcdui::getInstance().getJavaUiAppUi()->stopStartScreen(); + } + } } // This is needed to avoid artifacting after orientation switch. @@ -1792,50 +1824,44 @@ DEBUG("DrawWindow - Not scaled - BitBlt"); gc.BitBlt(windowRect.iTl, iFrameBuffer, windowRect); } - else -#ifdef RD_JAVA_NGA_ENABLED - if (IsDownScaling(iContentSize, iViewRect, iM3GContent)) -#else - if (IsDownScaling(iContentSize, iViewRect)) -#endif //RD_JAVA_NGA_ENABLED - { - DEBUG("DrawWindow - Downscaling - BitBlt"); - gc.BitBlt(windowRect.iTl, iFrameBuffer, windowRect.Size()); - } - // Upscaling - else if (iScaler) - { - iFrameBuffer->LockHeap(); - TUint32* pixelData = iFrameBuffer->DataAddress(); - - // Scale the framebuffer content. - CFbsBitmap* map = iScaler->Process( - iFrameBuffer->DisplayMode(), - pixelData, - iContentSize.iWidth, - iContentSize.iHeight, - iFrameBuffer->SizeInPixels().iWidth - iContentSize.iWidth, - iViewRect.Width(), - iViewRect.Height()); - - iFrameBuffer->UnlockHeap(); - - if (map) - { - DEBUG("DrawWindow - Upscaling - BitBlt - map ok"); - gc.BitBlt(windowRect.iTl, map, windowRect.Size()); - } - else - { - DEBUG("DrawWindow - Upscaling - DrawBitmap - no map"); - gc.DrawBitmap(windowRect, iFrameBuffer, iContentSize); - } - } #ifdef RD_JAVA_NGA_ENABLED - iCoeEnv->WsSession().Finish(); -#endif - + else if (IsDownScaling(iContentSize, iViewRect, iM3GContent)) +#else + else if (IsDownScaling(iContentSize, iViewRect)) +#endif //RD_JAVA_NGA_ENABLED + { + DEBUG("DrawWindow - Downscaling - BitBlt"); + gc.BitBlt(windowRect.iTl, iFrameBuffer, windowRect.Size()); + } + // Upscaling + else if (iScaler) + { + iFrameBuffer->LockHeap(); + TUint32* pixelData = iFrameBuffer->DataAddress(); + // Scale the framebuffer content. + CFbsBitmap* map = iScaler->Process( + iFrameBuffer->DisplayMode(), + pixelData, + iContentSize.iWidth, + iContentSize.iHeight, + iFrameBuffer->SizeInPixels().iWidth - iContentSize.iWidth, + iViewRect.Width(), + iViewRect.Height()); + + iFrameBuffer->UnlockHeap(); + + if (map) + { + DEBUG("DrawWindow - Upscaling - BitBlt - map ok"); + gc.BitBlt(windowRect.iTl, map, windowRect.Size()); + } + else + { + DEBUG("DrawWindow - Upscaling - DrawBitmap - no map"); + gc.DrawBitmap(windowRect, iFrameBuffer, iContentSize); + } + } DEBUG("CMIDCanvas::DrawWindow --"); } #endif // CANVAS_DOUBLE_BUFFER @@ -2383,8 +2409,6 @@ CustomComponentControl(KComponentMainControl)-> SetFocus(ETrue); } - // Redraw the canvas after unfading - DrawDeferred(); #ifdef RD_JAVA_NGA_ENABLED // To avoid situation when Canvas is redrawn but black area remains @@ -2396,6 +2420,14 @@ DEBUG_INT("CMIDCanvas::FocusChanged - ActivatePixelSourceL error %d", err); } } + else + { + // Redraw the canvas after unfading + DrawDeferred(); + } +#else // !RD_JAVA_NGA_ENABLED + // Redraw the canvas after unfading + DrawDeferred(); #endif // RD_JAVA_NGA_ENABLED } @@ -2539,7 +2571,7 @@ // This is needed to avoid artifacting after orientation switch. TBool landscape = Layout_Meta_Data::IsLandscapeOrientation(); - if (iLandscape != landscape) + if (iLandscape != landscape && !iAlfCompositionPixelSource) { iLandscape = landscape; iWndUpdate = ETrue; @@ -2554,10 +2586,14 @@ { DrawWindow(aRect); } - else if (iAlfCompositionPixelSource) + else { CMIDCanvas* myself = const_cast(this); - TRAP_IGNORE(myself->ActivatePixelSourceL()); + myself->ClearUiSurface(ETrue); + if (iAlfCompositionPixelSource) + { + TRAP_IGNORE(myself->ActivatePixelSourceL()); + } } iWndUpdate = EFalse; } @@ -2659,23 +2695,24 @@ TBool aUpdateRequired #endif // CANVAS_DIRECT_ACCESS ) : - CCoeControl() - ,iEnv(aEnv) + CCoeControl() + ,iEnv(aEnv) #ifdef CANVAS_DOUBLE_BUFFER - ,iFrameBuffer(NULL) + ,iFrameBuffer(NULL) #endif // CANVAS_DOUBLE_BUFFER - ,iIsGameCanvas(( - aComponentType == MMIDComponent::EGameCanvas ? ETrue : EFalse)) - ,iFlags(EPostKeyEvents) - ,iFullScreen(EFalse) - ,iScalingOn(EFalse) - ,iS60SelectionKeyCompatibility(EFalse) - ,iRestoreContentWhenUnfaded(EFalse) - ,iLastFadeMessage(0) + ,iIsGameCanvas(( + aComponentType == MMIDComponent::EGameCanvas ? ETrue : EFalse)) + ,iFlags(EPostKeyEvents) + ,iFullScreen(EFalse) + ,iScalingOn(EFalse) + ,iS60SelectionKeyCompatibility(EFalse) + ,iRestoreContentWhenUnfaded(EFalse) + ,iLastFadeMessage(0) #ifdef CANVAS_DIRECT_ACCESS - ,iDcDsaToStart(EFalse) + ,iDcDsaToStart(EFalse) #endif // CANVAS_DIRECT_ACCESS - ,iDragEventsStartedInside(EFalse) + ,iDragEventsStartedInside(EFalse) + ,iFirstPaintState(EFirstPaintNeverOccurred) { DEBUG("+ CMIDCanvas::CMIDCanvas - EDirectEnabled"); @@ -3552,6 +3589,7 @@ if (iPixelSourceSuspended) { + ClearUiSurface(EFalse); iPixelSourceSuspended = EFalse; if (iFullScreen && iScalingOn) { @@ -3561,13 +3599,35 @@ } // --------------------------------------------------------------------------- +// CMIDCanvas::ClearUiSurface +// --------------------------------------------------------------------------- +// +void CMIDCanvas::ClearUiSurface(TBool aDrawing) +{ + if (!aDrawing) + { + Window().BeginRedraw(); + ActivateGc(); + } + CWindowGc& gc = SystemGc(); + gc.SetBrushColor(KTransparentClearColor); + gc.SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); + gc.Clear(); + if (!aDrawing) + { + DeactivateGc(); + Window().EndRedraw(); + } + iCoeEnv->WsSession().Finish(); +} + // CMIDCanvas::SuspendPixelSource // --------------------------------------------------------------------------- // void CMIDCanvas::SuspendPixelSource() { NotifyMonitor(); - if (iAlfCompositionPixelSource) + if (iAlfCompositionPixelSource && !iPixelSourceSuspended) { iAlfCompositionPixelSource->Suspend(); iPixelSourceSuspended = ETrue; @@ -4151,11 +4211,11 @@ User::Leave(KErrUnknown); } - // Make framebuffer opaque - iFrameContext->SetBrushColor(KOpaqueClearColor); + // Clear with opaque black so that EDrawModeOR can be used in BitBlt() + iFrameContext->SetBrushColor(KOpaqueBlackColor); iFrameContext->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); iFrameContext->Clear(); - + iFrameContext->SetDrawMode(CGraphicsContext::EDrawModeOR); iFrameContext->BitBlt(TPoint(), bitmap); CleanupStack::PopAndDestroy(); SetCurrentEglType(current); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDChoiceGroupControl.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDChoiceGroupControl.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDChoiceGroupControl.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -1170,9 +1170,12 @@ { if (aText.Length()) { + // Get color from skin TRgb rgb = AKN_LAF_COLOR(215); + TInt textColor = IsFocused() ? EAknsCIQsnTextColorsCG8 : EAknsCIQsnTextColorsCG6; + AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), - rgb,KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8); + rgb,KAknsIIDQsnTextColors, textColor); iPopupTextLayout.DrawText(SystemGc(), aText, ETrue, rgb); } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDControlItem.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDControlItem.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDControlItem.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -249,9 +249,14 @@ void CMIDControlItem::SetLabelColor(CMIDItemLabel* aLabelControl) { TRgb color; + + TInt labelColor = (IsFocused() && + Type() != MMIDComponent::ECustomItem && + Type() != MMIDComponent::EImageItem) ? EAknsCIQsnTextColorsCG8 : EAknsCIQsnTextColorsCG6; + // Get color from skin if ((AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), color, - KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8) == KErrNone) && iLabelControl) + KAknsIIDQsnTextColors, labelColor) == KErrNone) && iLabelControl) {//data entry text color TRAP_IGNORE(aLabelControl->SetColorL(color)); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDDateFieldItem.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDDateFieldItem.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDDateFieldItem.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -243,8 +243,9 @@ { iInitialised = EFalse; } + // Text colour from skin - iEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG8); + iEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG6); } void CMIDDateFieldItem::SetInitialized(TInt aSetCurrentTime /* = ETrue */) @@ -813,15 +814,18 @@ { TBool focus = IsFocused(); - iEditor->SetFocus(focus); if (focus) { + // Text colour from skin - focused + iEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG8); TRAP_IGNORE(iUIManager->OpenNaviPaneControllerL()->PauseTickerL( TICKER_PAUSE_INTERVAL, this)); } else { + // Text colour from skin - unfocused + iEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG6); TRAP_IGNORE(iUIManager->OpenNaviPaneControllerL()->PauseTickerL( 0, this)); #ifdef RD_SCALABLE_UI_V2 diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDFormPhysics.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDFormPhysics.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDFormPhysics.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -141,8 +141,7 @@ if (iPhysics) { TPoint drag(aLength); - iPhysics->StartFlick(drag, aDuration); - return ETrue; + return iPhysics->StartFlick(drag, aDuration); } PhysicEmulationEnded(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDItemLabel.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDItemLabel.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDItemLabel.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -472,7 +472,7 @@ if (skin) { AknsUtils::GetCachedColor(skin, iDefaultColor, KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG8); + EAknsCIQsnTextColorsCG6); iColor = iDefaultColor; } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDStringItem.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDStringItem.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDStringItem.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -678,7 +678,7 @@ // Same color - no matter if focused or not AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), color, - KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8); + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6); labelColor = color; contentColor = color; } @@ -717,7 +717,7 @@ // Item is not focused AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), labelColor, - KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8); + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6); AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), contentColor, KAknsIIDQsnHighlightColors, EAknsCIQsnHighlightColorsCG3); @@ -743,7 +743,7 @@ if (iButton) { iButton->SetTextColorIds( - KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8); + KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6); } } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDTextBoxQueryDialog.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDTextBoxQueryDialog.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDTextBoxQueryDialog.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -88,6 +88,8 @@ iConstraints = aConstraints; iLastCountLine = 0; + iStrict = ETrue; + // if text is invalid according to constraints, throw IllegalArgumentException, // except for a PHONENUMBER which only has the invalid characters removed if ((iConstraints & MMIDTextField::EConstraintMask) != MMIDTextField::EPhoneNumber @@ -221,11 +223,11 @@ if ((iConstraints & MMIDTextField::EConstraintMask) == MMIDTextField::EPhoneNumber) { } - else if (!iEdwinUtils->ConstraintsValidForText(aText, iConstraints, ETrue)) + else if (!iEdwinUtils->ConstraintsValidForText(aText, iConstraints, (iStrict ? ETrue : EFalse))) { User::Leave(KErrArgument); } - // + iStrict = ETrue; HBufC* buf = iEdwinUtils->ConvertToLocalizedLC(aText, iConstraints); @@ -290,7 +292,6 @@ temp = iEdwinUtils->ConvertToLocalizedLC(aText, iConstraints); - if (IsNumberConversionNeeded()) { TPtr ptr = temp->Des(); @@ -455,7 +456,6 @@ void CMIDTextBoxQueryDialog::FocusChanged(TDrawNow aDrawNow) { CAknTextQueryDialog::FocusChanged(aDrawNow); - TBool isFocused = IsFocused(); SetRightScrollBarPosition(); } // @@ -604,19 +604,13 @@ // End Enter Key // - // msk: this is needed if MSK is not enabled on the device if ((aType == EEventKey) && (aKeyEvent.iScanCode == EStdKeyDevice3)) { - iDisplayable->ShowOkOptionsMenuL(); - return EKeyWasConsumed; - } - - - // msk: this is needed if MSK is not enabled on the device - if ((aType == EEventKey) && (aKeyEvent.iScanCode == EStdKeyDevice3)) - { - iDisplayable->ShowOkOptionsMenuL(); + if (iDisplayable && iDisplayable->ShowOkOptionsMenuL()) + { + SetFocus(EFalse); + } return EKeyWasConsumed; } @@ -684,11 +678,11 @@ { CPlainText* res = iEditor->Text(); TInt textLength = Size(); - if (scanCode == EStdKeyMinus) + if (scanCode == EStdKeyMinus && textLength < iMaxSize) { res->InsertL(GetCaretPosition(), KMinusChar); } - else if (scanCode == EStdKeyFullStop) + else if (scanCode == EStdKeyFullStop && textLength < iMaxSize) { res->InsertL(GetCaretPosition(), KFullStopChar); } @@ -699,6 +693,8 @@ { SetCursorPositionL(GetCaretPosition() + 1); } + + HandleTextUpdateL(MEikEdwinObserver::EEventTextUpdate); } //Error tone playing case1: //Play error tone if TextBox/TextField is read-only or maximum length has been reached. @@ -767,64 +763,97 @@ TKeyResponse response = EKeyWasNotConsumed; + TBool isFocused = IsFocused(); - //Error tone playing case2: - //Play error tone if TextBox/TextField is read-only or maximum length has been reached. - //Here is handling of full keyboard keys(NOT 0...9) and all virtual keyboard keys. - //(Note: Virtual keyboard sends only EEventKey type events, not up or down events) - //(Note: Error tone is played when there is no text to be replaced i.e. no text has been painted) - if (!iEdwinUtils->IsNavigationKey(aKeyEvent) && !iEdwinUtils->IsHotKeyL(aKeyEvent, iCoeEnv) && !aKeyEvent.iCode == EKeyYes && - (!iKeyEventsPending || (scanCode < KKeyQwerty0 || scanCode > KKeyQwerty9))) + // If there is no focus textbox should not consume keys + if (isFocused) { - if (iEditor->IsReadOnly() || (Size() >= iMaxSize && aKeyEvent.iCode != EKeyBackspace)) + //Error tone playing case2: + //Play error tone if TextBox/TextField is read-only or maximum length has been reached. + //Here is handling of full keyboard keys(NOT 0...9) and all virtual keyboard keys. + //(Note: Virtual keyboard sends only EEventKey type events, not up or down events) + //(Note: Error tone is played when there is no text to be replaced i.e. no text has been painted) + if (!iEdwinUtils->IsNavigationKey(aKeyEvent) && !iEdwinUtils->IsHotKeyL(aKeyEvent, iCoeEnv) && !aKeyEvent.iCode == EKeyYes && + (!iKeyEventsPending || (scanCode < KKeyQwerty0 || scanCode > KKeyQwerty9))) + { + if (iEditor->IsReadOnly() || (Size() >= iMaxSize && aKeyEvent.iCode != EKeyBackspace)) + { + //SelectionLength() > 0 if text has been selected/painted + if (iEditor->SelectionLength() == 0) + { + iAvkonAppUi->KeySounds()->PlaySound(EAvkonSIDErrorTone); + } + response = iEditor->OfferKeyEventL(aKeyEvent,aType); + return response; + } + } + + TBool valid = EFalse; + + if (iEdwinUtils->IsNavigationKey(aKeyEvent) || iEdwinUtils->IsHotKeyL(aKeyEvent, iCoeEnv)) { - //SelectionLength() > 0 if text has been selected/painted - if (iEditor->SelectionLength() == 0) + HBufC* oldText = GetTextL(); + CleanupStack::PushL(oldText); + TCursorSelection sel = iEditor->Selection(); + + response = CAknTextQueryDialog::OfferKeyEventL(aKeyEvent,aType); + valid = iEdwinUtils->ConstraintsValidForText(iEditor->Text()?Read():TPtrC(),iConstraints,EFalse); + + if (!valid) + { + SetTextL(*oldText); + iEditor->HandleTextChangedL(); + iEditor->SetSelectionL(sel.iCursorPos,sel.iAnchorPos); + response = EKeyWasConsumed; + } + CleanupStack::PopAndDestroy(oldText); + + return response; + } + else + { + TBuf<1> key; + key.Append(TChar(aKeyEvent.iCode)); + valid = iEdwinUtils->ConstraintsValidForInsertedTextL(iEditor->Text()?Read():TPtrC(), + key, + GetCaretPosition(), + iConstraints, + EFalse); + if (valid) { - iAvkonAppUi->KeySounds()->PlaySound(EAvkonSIDErrorTone); + response = iEditor->OfferKeyEventL(aKeyEvent,aType); } - response = iEditor->OfferKeyEventL(aKeyEvent,aType); + else + { + // If minus char was entered in full querty editor mode + if (IsConstraintSet(MMIDTextField::EDecimal) && + (aType == EEventKey) && iEditor && !iEditor->IsReadOnly() && + (TChar(aKeyEvent.iCode) == TChar('-') && scanCode != EStdKeyMinus)) + { + CPlainText* res = iEditor->Text(); + + if (res && TChar(aKeyEvent.iCode) == TChar('-') && + Size() < iMaxSize) + { + res->InsertL(GetCaretPosition(), KMinusChar); + // notify editor about the text changes + iEditor->HandleTextChangedL(); + + if (Size() < iMaxSize) + { + SetCursorPositionL(GetCaretPosition() + 1); + } + + //Prevent changes that would result in an illegal string + HandleTextUpdateL(MEikEdwinObserver::EEventTextUpdate); + } + } + + } return response; } } - - TBool valid = EFalse; - - if (iEdwinUtils->IsNavigationKey(aKeyEvent) || iEdwinUtils->IsHotKeyL(aKeyEvent, iCoeEnv)) - { - HBufC* oldText = GetTextL(); - CleanupStack::PushL(oldText); - TCursorSelection sel = iEditor->Selection(); - - response = CAknTextQueryDialog::OfferKeyEventL(aKeyEvent,aType); - valid = iEdwinUtils->ConstraintsValidForText(iEditor->Text()?Read():TPtrC(),iConstraints,EFalse); - - if (!valid) - { - SetTextL(*oldText); - iEditor->HandleTextChangedL(); - iEditor->SetSelectionL(sel.iCursorPos,sel.iAnchorPos); - response = EKeyWasConsumed; - } - CleanupStack::PopAndDestroy(oldText); - - return response; - } - else - { - TBuf<1> key; - key.Append(TChar(aKeyEvent.iCode)); - valid = iEdwinUtils->ConstraintsValidForInsertedTextL(iEditor->Text()?Read():TPtrC(), - key, - GetCaretPosition(), - iConstraints, - EFalse); - if (valid) - { - response = iEditor->OfferKeyEventL(aKeyEvent,aType); - } - return response; - } + return response; } #ifdef RD_SCALABLE_UI_V2 @@ -869,6 +898,23 @@ iLastMultitapKey = 0; } + HandleTextUpdateL(MEikEdwinObserver::EEventTextUpdate); + + if (iEditor && iEditor->TextLayout()) + { + if (iLastCountLine != iEditor->TextLayout()->GetLineNumber(iEditor->TextLength() - 1)) + { + iLastCountLine = iEditor->TextLayout()->GetLineNumber(iEditor->TextLength() - 1); + SetRightScrollBarPosition(); + } + } + } +} + +void CMIDTextBoxQueryDialog::HandleTextUpdateL(TEdwinEvent aEventType) +{ + if (aEventType == MEikEdwinObserver::EEventTextUpdate) + { TBool textChanged = EFalse; HBufC* res = NULL; TRAPD(err, { res = GetTextL();}); @@ -888,6 +934,7 @@ TInt illegalCharPos = -1; TPtr16 ptr = res->Des(); TInt minusPos = ptr.LocateReverse(TChar('-')); + iStrict = EFalse; // check if minus sign is inserted on incorrect place // (not at the beginning) @@ -960,14 +1007,6 @@ { iEditor->HandleTextChangedL(); } - if (iEditor && iEditor->TextLayout()) - { - if (iLastCountLine != iEditor->TextLayout()->GetLineNumber(iEditor->TextLength() - 1)) - { - iLastCountLine = iEditor->TextLayout()->GetLineNumber(iEditor->TextLength() - 1); - SetRightScrollBarPosition(); - } - } } } @@ -1491,7 +1530,8 @@ void CMIDTextBoxQueryDialog::SetRightScrollBarPosition() { - if (iEditor) + // Editor Rect should not be set with empty values + if (iEditor && iEditorRect.Height() != 0 && iEditorRect.Width() != 0) { iEditor->SetRect(iEditorRect); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDTextEditorEdwinCustomDraw.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDTextEditorEdwinCustomDraw.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDTextEditorEdwinCustomDraw.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -31,8 +31,8 @@ const MLafEnv& aLafEnv, const MFormCustomDraw& aParentDraw, const CMIDTextEditorEdwin& aEdwin) : - CLafEdwinCustomDrawBase(aLafEnv, aEdwin), - iEdwin(aEdwin), iParentDraw(aParentDraw) + CLafEdwinCustomDrawBase(aLafEnv, aEdwin), + iEdwin(aEdwin), iParentDraw(aParentDraw) { DEBUG("CMIDTextEditorEdwinCustomDraw::CMIDTextEditorEdwinCustomDraw"); } @@ -76,7 +76,8 @@ // Only drawing otherwise. if (iEdwin.IsScalingOn()) { - aParam.iGc.SetClippingRect(iEdwin.GetOnScreenCanvasRect()); + + aParam.iGc.SetClippingRect(GetClippingRectForScaling()); iParentDraw.DrawBackground(aParam, aBackground, aDrawn); @@ -103,7 +104,8 @@ // Only drawing otherwise. if (iEdwin.IsScalingOn()) { - aParam.iGc.SetClippingRect(iEdwin.GetOnScreenCanvasRect()); + + aParam.iGc.SetClippingRect(GetClippingRectForScaling()); iParentDraw.DrawLineGraphics(aParam, aLineInfo); @@ -146,7 +148,7 @@ // Only drawing otherwise. if (iEdwin.IsScalingOn()) { - aParam.iGc.SetClippingRect(iEdwin.GetOnScreenCanvasRect()); + aParam.iGc.SetClippingRect(GetClippingRectForScaling()); iParentDraw.DrawText( aParam, @@ -204,7 +206,8 @@ // Only drawing otherwise. if (iEdwin.IsScalingOn()) { - aParam.iGc.SetClippingRect(iEdwin.GetOnScreenCanvasRect()); + + aParam.iGc.SetClippingRect(GetClippingRectForScaling()); iParentDraw.DrawText( aParam, @@ -258,4 +261,17 @@ return ret; } +// --------------------------------------------------------------------------- +// CMIDTextEditorEdwinCustomDraw::GetClippingRectForScaling() +// (other items were commented in the header file) +// --------------------------------------------------------------------------- +// +const TRect CMIDTextEditorEdwinCustomDraw::GetClippingRectForScaling() const +{ + // It gets intersection of editor and canvas rectangles. + TRect rect = iEdwin.GetOnScreenCanvasRect(); + rect.Intersection(iEdwin.Rect()); + return rect; +} + // End of file diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDTextFieldEdwin.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDTextFieldEdwin.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDTextFieldEdwin.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -123,7 +123,7 @@ } else { // skinning colour groups for editable text - skinTextColor = EAknsCIQsnTextColorsCG8; + skinTextColor = IsFocused() ? EAknsCIQsnTextColorsCG8 : EAknsCIQsnTextColorsCG6; } TRect parentRect = aRect; diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDTextFieldItem.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDTextFieldItem.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDTextFieldItem.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -342,7 +342,9 @@ iTextField->SetFocus(EFalse); } - CMIDControlItem::FocusChanged(aDrawNow); + CMIDControlItem::FocusChanged(aDrawNow); + // DoLayout and change text color when focused + SizeChanged(); } void CMIDTextFieldItem::HandleCurrentL(TBool aCurrent) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcdui/src/CMIDUtils.cpp --- a/javauis/lcdui_akn/lcdui/src/CMIDUtils.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcdui/src/CMIDUtils.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -838,14 +838,14 @@ // --------------------------------------------------------------------------- // CMIDUtils::CMIDUtils(MMIDEnv& aEnv, CMIDUIManager* aUIManager) - : iEnv(&aEnv) - , iUIManager(aUIManager) - , iScalingData() - , iQwertyMode(EFalse) - , iStickyKey(0) - , iLastScanCode(0) - , iModifier(0) - , iScalingDataInitialized(EFalse) + : iEnv(&aEnv) + , iUIManager(aUIManager) + , iScalingData() + , iQwertyMode(EFalse) + , iStickyKey(0) + , iLastScanCode(0) + , iModifier(0) + , iScalingDataInitialized(EFalse) {} CMIDUtils::~CMIDUtils() @@ -1202,7 +1202,7 @@ CMIDUtils::TScalingData CMIDUtils::GetScalingData() { - UpdateScalingData(); + UpdateScalingData(); return iScalingData; } @@ -1215,7 +1215,13 @@ iScalingDataInitialized = ETrue; // Get actual rect of screen without with eventual OSK. - TRect screenRect =iEnv->Current()->GetCanvasRectFromLaf(); + // Empty rect is OK. + MMIDDisplayable* current = iEnv->Current(); + TRect screenRect; + if (current) + { + screenRect = current->GetCanvasRectFromLaf(); + } // Traslate of rect of screen into size data.iScreenSize = screenRect.Size(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/lcdui_akn/lcduiphysicswrapper/src/CMIDPhysicsWrapper.cpp --- a/javauis/lcdui_akn/lcduiphysicswrapper/src/CMIDPhysicsWrapper.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/lcdui_akn/lcduiphysicswrapper/src/CMIDPhysicsWrapper.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -129,8 +129,7 @@ if (iPhysics) { TPoint drag(aLength); - iPhysics->StartPhysics(drag, aDuration); - return ETrue; + return iPhysics->StartPhysics(drag, aDuration); } PhysicEmulationEnded(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java --- a/javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/m3g_akn/javasrc/javax/microedition/m3g/Graphics3D.java Wed Jun 09 09:34:07 2010 +0300 @@ -107,6 +107,7 @@ private Rect viewport; private Rect clip; private boolean ngaEnabled = false; + private boolean foreground; //------------------------------------------------------------------ @@ -127,7 +128,9 @@ } if (instance.graphics3D == null) { + // graphics3D must be assigned to interface before asking foreground status instance.graphics3D = new Graphics3D(); + instance.graphics3D.foreground = ToolkitInvoker.getToolkitInvoker().isForeground(); } return instance.graphics3D; } @@ -154,8 +157,8 @@ this.viewport = new Rect(); this.clip = new Rect(); // Initializes NGA status - enabled or disabled - this.ngaEnabled = ToolkitInvoker.getToolkitInvoker().isNgaEnabled(); - } + ngaEnabled = invoker.isNgaEnabled(); + } /** * @@ -182,99 +185,102 @@ */ public void bindTarget(java.lang.Object target, boolean depth, int flags) { - integrityCheck(); - int eventSrcHandle = 0; - if (currentTarget != null) - { - throw new IllegalStateException(); - } - - if (target == null) + synchronized (Interface.getInstance()) { - throw new NullPointerException(); - } - try - { - // Bind event source. This need to be released. - eventSrcHandle = Interface.bindEventSource(); - if (target instanceof Graphics) + integrityCheck(); + int eventSrcHandle = 0; + if (currentTarget != null) + { + throw new IllegalStateException(); + } + + if (target == null) + { + throw new NullPointerException(); + } + try { - Graphics g = (Graphics) target; - Platform.sync(g); + // Bind event source. This need to be released. + eventSrcHandle = Interface.bindEventSource(); + if (target instanceof Graphics) + { + Graphics g = (Graphics) target; + Platform.sync(g); + + if (g.getClipWidth() > Defs.MAX_VIEWPORT_WIDTH || + g.getClipHeight() > Defs.MAX_VIEWPORT_HEIGHT) + { + throw new IllegalArgumentException(); + } + + offsetX = g.getTranslateX(); + offsetY = g.getTranslateY(); + + ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker(); + + // NGA specific change. + if (ngaEnabled) + { + // If overwrite is set, there is no need + // to update EGL surface with 2D content + eglContentValid = (flags & OVERWRITE) > 0; + + // Clip and viewport are stored for later + // checks regarding Background clear + clip.x = g.getClipX() + offsetX; + clip.y = g.getClipY() + offsetY; + clip.width = g.getClipWidth(); + clip.height = g.getClipHeight(); - if (g.getClipWidth() > Defs.MAX_VIEWPORT_WIDTH || - g.getClipHeight() > Defs.MAX_VIEWPORT_HEIGHT) + viewport.x = clip.x; + viewport.y = clip.y; + viewport.width = clip.width; + viewport.height = clip.height; + + isImageTarget = _bindGraphics( + eventSrcHandle, + handle, + invoker.graphicsGetHandle(g), + clip.x, clip.y, + clip.width, clip.height, + depth, flags, + isProperRenderer); + } + else + { + isImageTarget = _bindGraphics( + eventSrcHandle, + handle, + invoker.graphicsGetHandle(g), + g.getClipX() + offsetX, g.getClipY() + offsetY, + g.getClipWidth(), g.getClipHeight(), + depth, flags, + isProperRenderer); + } + currentTarget = g; + } + else if (target instanceof Image2D) + { + Image2D img = (Image2D) target; + + offsetX = offsetY = 0; + + _bindImage(eventSrcHandle, handle, img.handle, depth, flags); + currentTarget = img; + } + else { throw new IllegalArgumentException(); } - - offsetX = g.getTranslateX(); - offsetY = g.getTranslateY(); - - ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker(); - - // NGA specific change. - if (ngaEnabled) - { - // If overwrite is set, there is no need - // to update EGL surface with 2D content - eglContentValid = (flags & OVERWRITE) > 0; - - // Clip and viewport are stored for later - // checks regarding Background clear - clip.x = g.getClipX() + offsetX; - clip.y = g.getClipY() + offsetY; - clip.width = g.getClipWidth(); - clip.height = g.getClipHeight(); - - viewport.x = clip.x; - viewport.y = clip.y; - viewport.width = clip.width; - viewport.height = clip.height; - - isImageTarget = _bindGraphics( - eventSrcHandle, - handle, - invoker.graphicsGetHandle(g), - clip.x, clip.y, - clip.width, clip.height, - depth, flags, - isProperRenderer); - } - else - { - isImageTarget = _bindGraphics( - eventSrcHandle, - handle, - invoker.graphicsGetHandle(g), - g.getClipX() + offsetX, g.getClipY() + offsetY, - g.getClipWidth(), g.getClipHeight(), - depth, flags, - isProperRenderer); - } - currentTarget = g; } - else if (target instanceof Image2D) - { - Image2D img = (Image2D) target; - - offsetX = offsetY = 0; - - _bindImage(eventSrcHandle, handle, img.handle, depth, flags); - currentTarget = img; - } - else + finally { - throw new IllegalArgumentException(); + // Release event source + Interface.releaseEventSource(); } + hints = flags; + depthEnabled = depth; } - finally - { - // Release event source - Interface.releaseEventSource(); - } - hints = flags; - depthEnabled = depth; } /** @@ -282,44 +288,56 @@ */ public void releaseTarget() { - integrityCheck(); - if (currentTarget == null) - { - return; - } - try + synchronized (Interface.getInstance()) { - // Bind event source - int eventSrcHandle = Interface.bindEventSource(); - if (currentTarget instanceof Graphics) + integrityCheck(); + if (currentTarget == null) { - Graphics g = (Graphics) currentTarget; - - ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker(); - - // NGA specific change. - if (ngaEnabled) + return; + } + + int eventSrcHandle = 0; + + try + { + // Bind event source + eventSrcHandle = Interface.bindEventSource(); + if (currentTarget instanceof Graphics) { - updateEglContent(); + Graphics g = (Graphics) currentTarget; + + ToolkitInvoker invoker = ToolkitInvoker.getToolkitInvoker(); + + // NGA specific change. + if (ngaEnabled) + { + updateEglContent(); + } + _releaseGraphics(eventSrcHandle, handle, + invoker.graphicsGetHandle(g), isImageTarget, isProperRenderer); } - _releaseGraphics(eventSrcHandle, handle, - invoker.graphicsGetHandle(g), isImageTarget, isProperRenderer); - } - else if (currentTarget instanceof Image2D) - { - _releaseImage(eventSrcHandle, handle); + else if (currentTarget instanceof Image2D) + { + _releaseImage(eventSrcHandle, handle); + } + else + { + throw new Error(); + } } - else + finally { - throw new Error(); + currentTarget = null; + + if (ngaEnabled && !foreground && eventSrcHandle != 0) + { + _freeGLESResources(eventSrcHandle, handle); + } + + // Release event source + Interface.releaseEventSource(); } } - finally - { - currentTarget = null; - // Release event source - Interface.releaseEventSource(); - } } /** @@ -730,6 +748,27 @@ } } + void setForeground(boolean foreground) + { + synchronized (Interface.getInstance()) + { + this.foreground = foreground; + if (ngaEnabled && + !foreground && + currentTarget == null) + { + try + { + _freeGLESResources(Interface.bindEventSource(), handle); + } + finally + { + Interface.releaseEventSource(); + } + } + } + } + private native static int _ctor(int hInterface); private native static void _addRef(int hObject); @@ -811,4 +850,6 @@ private native static int _getTargetWidth(int graphicsHandle); private native static void _updateEglContent(int eventSourceHandle, int graphicsHandle); + private native static void _freeGLESResources(int eventSourceHandle, + int handle); } diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/m3g_akn/javasrc/javax/microedition/m3g/Interface.java --- a/javauis/m3g_akn/javasrc/javax/microedition/m3g/Interface.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/m3g_akn/javasrc/javax/microedition/m3g/Interface.java Wed Jun 09 09:34:07 2010 +0300 @@ -20,7 +20,7 @@ import java.lang.ref.WeakReference; import java.util.Hashtable; import com.nokia.mj.impl.rt.legacy.ToolkitInvoker; -import com.nokia.mj.impl.rt.legacy.ToolkitObserver; +import com.nokia.mj.impl.rt.legacy.ToolkitObserverNGAExtension; import com.nokia.mj.impl.rt.support.Finalizer; import com.nokia.mj.impl.rt.legacy.MemoryUtil; @@ -29,7 +29,7 @@ * each MIDlet using the 3D API to keep track of Java-side object * lifetimes etc. */ -class Interface implements ToolkitObserver +class Interface implements ToolkitObserverNGAExtension { //------------------------------------------------------------------ // Static data @@ -427,6 +427,17 @@ } MemoryUtil.freeNativeMemory(); } + + /* + * @see ToolkitObserverNGAExtension#foregroundEvent(boolean) + */ + public void foregroundEvent(boolean foreground) + { + if (graphics3D != null) + { + graphics3D.setForeground(foreground); + } + } // Native constructor private static native int _ctor(int eventSrcHandle); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/m3g_akn/src/jni/graphics3d.inl --- a/javauis/m3g_akn/src/jni/graphics3d.inl Tue May 25 12:34:19 2010 +0300 +++ b/javauis/m3g_akn/src/jni/graphics3d.inl Wed Jun 09 09:34:07 2010 +0300 @@ -773,6 +773,22 @@ eventSource->ExecuteV(&UpdateEglContent, cmidGraphics); } +static void freeGLESResources(M3GRenderContext aHContext) +{ + m3gFreeGLESResources(aHContext); + eglReleaseThread(); +} + +JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1freeGLESResources +(JNIEnv* aEnv, jclass, jint aEventSourceHandle, jint aHCtx) +{ + M3G_DO_LOCK + CJavaM3GEventSource* eventSource = + JavaUnhand(aEventSourceHandle); + eventSource->ExecuteV(&freeGLESResources, (M3GRenderContext)aHCtx); + M3G_DO_UNLOCK(aEnv) +} + #else // !RD_JAVA_NGA_ENABLED JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Graphics3D__1getTargetHeight @@ -792,4 +808,9 @@ { } +JNIEXPORT void JNICALL Java_javax_microedition_m3g_Graphics3D__1freeGLESResources +(JNIEnv*, jclass, jint, jint) +{ +} + #endif // RD_JAVA_NGA_ENABLED diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/inc.emc/cmmaemcresolver.h --- a/javauis/mmapi_akn/baseline/inc.emc/cmmaemcresolver.h Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/inc.emc/cmmaemcresolver.h Wed Jun 09 09:34:07 2010 +0300 @@ -70,13 +70,6 @@ void SetFileNameL(const TDesC* aFileName); /** - * Sets Mime Type - * @param aFileName File name to be set or NULL - */ - - void SetMimeTypeL(const TDesC* aFileName); - - /** * Returns possible filename or NULL if not set * Ownership is transfered. * @return Content type or NULL if type is not available. @@ -101,6 +94,8 @@ private: ~CMMAEMCResolver(); + void ConstructL(); + private: // Owned. Ownership can be transferred with ContentType method. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerBase.java --- a/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerBase.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerBase.java Wed Jun 09 09:34:07 2010 +0300 @@ -124,7 +124,7 @@ * From Player * @see Player */ - public void realize() throws MediaException + synchronized public void realize() throws MediaException { closeCheck(); int state = getState(); @@ -149,7 +149,7 @@ * From Player * @see Player */ - public void prefetch() throws MediaException + synchronized public void prefetch() throws MediaException { realize(); @@ -170,7 +170,7 @@ * interface Player * @see Player */ - public void deallocate() + synchronized public void deallocate() { try { @@ -197,7 +197,7 @@ * interface Player * @see Player */ - public void stop() throws MediaException + synchronized public void stop() throws MediaException { closeCheck(); if (getState() == STARTED) @@ -215,7 +215,7 @@ * interface Player * @see Player */ - public void close() + synchronized public void close() { /* Releases all resources and cease all activity. diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerImpl.java --- a/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerImpl.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/PlayerImpl.java Wed Jun 09 09:34:07 2010 +0300 @@ -261,7 +261,7 @@ * From Player. * @see Player */ - public void start() throws MediaException + synchronized public void start() throws MediaException { prefetch(); diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/SourcePlayer.java --- a/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/SourcePlayer.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/SourcePlayer.java Wed Jun 09 09:34:07 2010 +0300 @@ -116,7 +116,7 @@ * interface Player * @see Player */ - public void close() + synchronized public void close() { super.close(); // close threads from SourceStreamReaders diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/control/RecordControl.java --- a/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/control/RecordControl.java Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/javasrc/com/nokia/microedition/media/control/RecordControl.java Wed Jun 09 09:34:07 2010 +0300 @@ -158,7 +158,7 @@ * stream is null. * */ - public void setRecordStream(OutputStream aStream) + synchronized public void setRecordStream(OutputStream aStream) { checkState(); if (null == aStream) @@ -236,7 +236,7 @@ * @exception SecurityException Thrown if the caller does not * have security permission to set the record location. */ - public void setRecordLocation(String aLocator) + synchronized public void setRecordLocation(String aLocator) throws IOException, MediaException { checkState(); @@ -307,7 +307,7 @@ * * @return The content type of the media. */ - public String getContentType() + synchronized public String getContentType() { checkState(); return _getContentType(iEventSource, iControlHandle); @@ -346,7 +346,7 @@ * has not been called. * */ - public void startRecord() + synchronized public void startRecord() { checkState(); // Ignore if startRecord is called when the recording has already started @@ -390,7 +390,7 @@ * and a RECORD_STOPPED event will be delivered through the * PlayerListener. */ - public void stopRecord() + synchronized public void stopRecord() { checkState(); // If stopRecord is called when the recording has already stopped, @@ -522,7 +522,7 @@ * @exception MediaException Thrown if setting the record * size limit is not supported. */ - public int setRecordSizeLimit(int aSize) throws MediaException + synchronized public int setRecordSizeLimit(int aSize) throws MediaException { checkState(); if (aSize <= 0) @@ -589,7 +589,7 @@ * setRecordStream must be called. * */ - public void reset() throws IOException + synchronized public void reset() throws IOException { checkState(); if (null == iOutputStreamWriter) diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/src.emc/cmmaemcresolver.cpp --- a/javauis/mmapi_akn/baseline/src.emc/cmmaemcresolver.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/src.emc/cmmaemcresolver.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -34,13 +34,20 @@ CMMAEMCResolver* CMMAEMCResolver::NewLC() { - DEBUG("MMA:CMMAEMCResolver :: NewLC ++"); + DEBUG("MMA:CMMAEMCResolver :: NewLC +"); CMMAEMCResolver* self = new(ELeave)CMMAEMCResolver(); CleanupStack::PushL(self); - DEBUG("MMA:CMMAEMCResolver :: NewLC --"); + self->ConstructL(); + DEBUG("MMA:CMMAEMCResolver :: NewLC -"); return self; } +void CMMAEMCResolver::ConstructL() +{ + iContentType = HBufC::NewL(KContentTypeMaxLength); + iMimeType = HBufC8::NewL(KContentTypeMaxLength); +} + CMMAEMCResolver::~CMMAEMCResolver() { delete iContentType; @@ -52,19 +59,19 @@ HBufC* CMMAEMCResolver::ContentTypeOwnership() { - DEBUG("MMA:CMMAEMCResolver :: ContentTypeOwnership ++"); + DEBUG("MMA:CMMAEMCResolver :: ContentTypeOwnership +"); HBufC* ct = iContentType; iContentType = NULL; - DEBUG("MMA:CMMAEMCResolver :: ContentTypeOwnership --"); + DEBUG("MMA:CMMAEMCResolver :: ContentTypeOwnership -"); return ct; } HBufC8* CMMAEMCResolver::MimeTypeOwnership() { - DEBUG("MMA:CMMAEMCResolver :: MimeTypeOwnership ++"); + DEBUG("MMA:CMMAEMCResolver :: MimeTypeOwnership +"); HBufC8* mt = iMimeType; iMimeType = NULL; - DEBUG("MMA:CMMAEMCResolver :: MimeTypeOwnership --"); + DEBUG("MMA:CMMAEMCResolver :: MimeTypeOwnership -"); return mt; } @@ -75,7 +82,7 @@ void CMMAEMCResolver::SetFileNameL(const TDesC* aFileName) { - DEBUG("MMA:CMMAEMCResolver :: SetFileNameL ++"); + DEBUG("MMA:CMMAEMCResolver :: SetFileNameL +"); HBufC* fn = NULL; if (aFileName) { @@ -83,54 +90,22 @@ } delete iFileName; iFileName = fn; - DEBUG("MMA:CMMAEMCResolver :: SetFileNameL --"); + DEBUG("MMA:CMMAEMCResolver :: SetFileNameL -"); } HBufC* CMMAEMCResolver::FileNameOwnership() { - DEBUG("MMA:CMMAEMCResolver :: FileNameOwnership ++"); + DEBUG("MMA:CMMAEMCResolver :: FileNameOwnership +"); HBufC* fn = iFileName; iFileName = NULL; - DEBUG("MMA:CMMAEMCResolver :: FileNameOwnership --"); + DEBUG("MMA:CMMAEMCResolver :: FileNameOwnership -"); return fn; } -void CMMAEMCResolver::SetMimeTypeL(const TDesC* aFileName) -{ - DEBUG("MMA:CMMAEMCResolver :: SetMimeTypeL +"); - if (iContentType) - { - delete iContentType; - iContentType = NULL; - } - iContentType = HBufC::NewL(KContentTypeMaxLength); - TBuf8 mimeType; - ResolveContentTypeL(*aFileName,mimeType); - iContentType->Des().Copy(mimeType); - iMimeType = HBufC8::NewL(mimeType.Length()); //8 bit Descriptor of iContentType - iMimeType->Des().Copy(mimeType); - - DEBUG("MMA:CMMAEMCResolver :: SetMimeTypeL -"); -} - void CMMAEMCResolver::ResolveContentTypeL() { DEBUG("MMA:CMMAEMCResolver::ResolveContentTypeL +"); - if (iContentType) - { - delete iContentType; - iContentType = NULL; - } - if (iMimeType) - { - delete iMimeType; - iMimeType = NULL; - } - - iContentType = HBufC::NewL(KContentTypeMaxLength); - iMimeType = HBufC8::NewL(KContentTypeMaxLength); - if (iFileName->Right(4).Compare(KAacFileExtension()) == 0) { iContentType->Des().Copy(KMimetypeAAC); @@ -249,7 +224,6 @@ DEBUG("MMA:CMMAEMCResolver :: GetSupportedContentTypesL -"); } -// EMC - II void CMMAEMCResolver::SetSourceInfoL(const HBufC8* aHeaderData) { iHeaderData = aHeaderData; @@ -325,5 +299,5 @@ return match; } -// + // END OF FILE diff -r 9ac0a0a7da70 -r 71c436fe3ce0 javauis/mmapi_akn/baseline/src/cmmaaudioplayer.cpp --- a/javauis/mmapi_akn/baseline/src/cmmaaudioplayer.cpp Tue May 25 12:34:19 2010 +0300 +++ b/javauis/mmapi_akn/baseline/src/cmmaaudioplayer.cpp Wed Jun 09 09:34:07 2010 +0300 @@ -262,7 +262,7 @@ } } - if (err == KErrDied && aEvent.iEventType == KMMFEventCategoryPlaybackComplete) + if (err == KErrDied && aEvent.iEventType == KMMFEventCategoryPlaybackComplete && err == KErrInUse) { // basically pausing the playback @@ -282,7 +282,7 @@ } } - if (err != KErrNone && err != KErrDied) + if (err != KErrNone && err != KErrDied && err != KErrInUse) { ErrorPlaybackComplete(err); }