# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1265065005 -7200 # Node ID d39add9822e2674121a07a65c08e60cb3e7e5d0f # Parent 6297cdf663322e81c911e21e3f2e8afc35dd6cec Revision: 201003 Kit: 201005 diff -r 6297cdf66332 -r d39add9822e2 brdo.layers.sysdef.xml --- a/brdo.layers.sysdef.xml Mon Jan 18 21:20:18 2010 +0200 +++ b/brdo.layers.sysdef.xml Tue Feb 02 00:56:45 2010 +0200 @@ -17,7 +17,7 @@ - + diff -r 6297cdf66332 -r d39add9822e2 browserutilities/browserdialogsprovider/Src/BrowserSelectElementDlg.cpp --- a/browserutilities/browserdialogsprovider/Src/BrowserSelectElementDlg.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/browserdialogsprovider/Src/BrowserSelectElementDlg.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -18,6 +18,7 @@ // INCLUDE FILES +#include #include "BrowserSelectElementDlg.h" #include "BrowserSelectElementListBox.h" #include "BrowserSelectElementModel.h" @@ -185,7 +186,11 @@ if(AknLayoutUtils::PenEnabled()) { +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if((aEventType == EEventItemDoubleClicked) || (aEventType == EEventItemSingleClicked)) +#else if(aEventType == EEventItemDoubleClicked) +#endif { penSelect = ETrue; } diff -r 6297cdf66332 -r d39add9822e2 browserutilities/browserdialogsprovider/Src/BrowserViewImagesPopup.cpp --- a/browserutilities/browserdialogsprovider/Src/BrowserViewImagesPopup.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/browserdialogsprovider/Src/BrowserViewImagesPopup.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -19,6 +19,7 @@ // USER INCLUDES +#include #include #include "BrowserDialogsProvider.hrh" #include "BrowserViewImagesPopup.h" @@ -140,7 +141,11 @@ void CBrowserViewImagesPopup::HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType ) { - if((aEventType==EEventEnterKeyPressed || aEventType==EEventItemDoubleClicked) && aListBox==ListBox()) +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if((aEventType==EEventEnterKeyPressed || aEventType==EEventItemDoubleClicked || aEventType==EEventItemSingleClicked) && aListBox==ListBox()) +#else + if((aEventType==EEventEnterKeyPressed || aEventType==EEventItemDoubleClicked ) && aListBox==ListBox()) +#endif { ProcessCommandL( EDialogsProviderCmdViewImagesView ); } diff -r 6297cdf66332 -r d39add9822e2 browserutilities/connectionmanager/Group/ConnectionManager.mmp --- a/browserutilities/connectionmanager/Group/ConnectionManager.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/connectionmanager/Group/ConnectionManager.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -79,6 +79,12 @@ LIBRARY cmmanager.lib DEBUGLIBRARY flogger.lib +//Below libs are required for One-Click-Connectivity feature +#ifdef BRDO_OCC_ENABLED_FF +LIBRARY extendedconnpref.lib +LIBRARY netmeta.lib +#endif + #if defined(ARMCC) DEFFILE ../EABI/CONNECTIONMANAGERU_EKA2.def #else diff -r 6297cdf66332 -r d39add9822e2 browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp --- a/browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -19,13 +19,17 @@ */ - +#include #include "ConnManActiveConnector.h" #include "ConnectionManagerLogger.h" #include #include +#ifdef BRDO_OCC_ENABLED_FF +#include +#endif + //-------------------------------------------------------------------------- //CConnManActiveConnector::CConnManActiveConnector() //-------------------------------------------------------------------------- @@ -34,7 +38,7 @@ : CActive( aPriority ) , iConnection( aConnection ) { - iWait = EFalse; + CLOG_CREATE; CActiveScheduler::Add( this );//inserting this into the queue } @@ -44,7 +48,7 @@ //-------------------------------------------------------------------------- CConnManActiveConnector::~CConnManActiveConnector() { - iWait = EFalse; + Cancel();//The standard way of destroying an Active object CLOG_CLOSE; } @@ -53,18 +57,55 @@ //CConnManActiveConnector::StartConnection() //-------------------------------------------------------------------------- void CConnManActiveConnector::StartConnection( TCommDbConnPref* aSettings, TRequestStatus& aStatus) - { - CLOG_WRITE( "CConnManActiveConnector:StartConnection is called"); - iExternalRequestStatus = &aStatus; - +{ + CLOG_WRITE( "CConnManActiveConnector:StartConnection AlwaysAsk/Ap is called"); + iExternalRequestStatus = &aStatus; + +#ifdef BRDO_OCC_ENABLED_FF + + TExtendedConnPref extPref; + CLOG_WRITE( "CConnManActiveConnector:StartConnection Setting OCC parameters"); + +#ifdef __WINS__ //This is only for emulator testing purpose + + //For emulator + CLOG_WRITE( "CConnManActiveConnector:StartConnection Emulator OCC settings " ); + extPref.SetSnapPurpose(CMManager::ESnapPurposeUnknown); + extPref.SetConnSelectionDialog(ETrue); + extPref.SetForcedRoaming(EFalse); + +#else + + //For hardware + TUint32 bookmarkIap = aSettings->IapId(); + CLOG_WRITE_1( "CConnManActiveConnector:StartConnection Active Bookmark Iap: %d", bookmarkIap ); + if (bookmarkIap) + { + CLOG_WRITE( "CConnManActiveConnector:StartConnection Iap is found for this bookmark"); + extPref.SetSnapPurpose(CMManager::ESnapPurposeUnknown); + extPref.SetIapId(bookmarkIap); + } + else + { + CLOG_WRITE( "CConnManActiveConnector:StartConnection Using Internet Snap"); + extPref.SetSnapPurpose(CMManager::ESnapPurposeInternet); + } + +#endif //__WINS__ + + extPref.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourDefault); + TConnPrefList prefList; + TRAP_IGNORE(prefList.AppendL(&extPref)); +#endif //BRDO_OCC_ENABLED_FF + if( aSettings ) - { -#ifdef __WINS__ - // aSettings->SetDialogPreference( ECommDbDialogPrefPrompt ); -#endif - - iConnection.Start( *aSettings, iStatus ); - } + { + #ifdef BRDO_OCC_ENABLED_FF + iConnection.Start( prefList, iStatus ); + #else + iConnection.Start( *aSettings, iStatus ); + #endif + } else { iConnection.Start( iStatus ); @@ -79,14 +120,45 @@ //CConnManActiveConnector::StartConnection() //-------------------------------------------------------------------------- void CConnManActiveConnector::StartConnection( TConnSnapPref* aSettings, TRequestStatus& aStatus) - { - CLOG_WRITE( "CConnManActiveConnector:StartConnection is called"); - iExternalRequestStatus = &aStatus; - +{ + CLOG_WRITE( "CConnManActiveConnector:StartConnection SNAP is called"); + iExternalRequestStatus = &aStatus; + +#ifdef BRDO_OCC_ENABLED_FF + + CLOG_WRITE( "CConnManActiveConnector:StartConnection Setting OCC parameters"); + TExtendedConnPref extPref; + +#ifdef __WINS__ + + //For emulator + CLOG_WRITE( "CConnManActiveConnector:StartConnection Emulator OCC settings " ); + extPref.SetSnapPurpose(CMManager::ESnapPurposeUnknown); + extPref.SetConnSelectionDialog(ETrue); + extPref.SetForcedRoaming(EFalse); + +#else + + //For hardware + CLOG_WRITE( "CConnManActiveConnector:StartConnection Using Internet Snap"); + extPref.SetSnapPurpose(CMManager::ESnapPurposeInternet); + +#endif //__WINS__ + + extPref.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourDefault); + TConnPrefList prefList; + TRAP_IGNORE(prefList.AppendL(&extPref)); + +#endif + if( aSettings ) - { - iConnection.Start( *aSettings, iStatus ); - } + { + #ifdef BRDO_OCC_ENABLED_FF + iConnection.Start( prefList, iStatus ); + #else + iConnection.Start( *aSettings, iStatus ); + #endif + } else { iConnection.Start( iStatus ); @@ -103,11 +175,10 @@ void CConnManActiveConnector::DoCancel() { CLOG_WRITE( "CConnManActiveConnector: DoCancel called"); - if(iWait) - { - iConnection.Close(); - User::RequestComplete( iExternalRequestStatus, KErrCancel );//completing user req - } + + iConnection.Close(); + User::RequestComplete( iExternalRequestStatus, KErrCancel );//completing user req + CLOG_WRITE( "CConnManActiveConnector: DoCancel returned"); } @@ -116,7 +187,7 @@ //-------------------------------------------------------------------------- void CConnManActiveConnector::RunL() { - iWait = ETrue; + CLOG_WRITE_1( "CConnManAct::RunL(): %d", iStatus.Int() ); User::RequestComplete( iExternalRequestStatus, iStatus.Int() ); } @@ -200,14 +271,12 @@ //-------------------------------------------------------------------------- void CActiveConnectorSyncWrapper::DoCancel() { - if(iActiveConnector->IsActive()) - { - iActiveConnector->Cancel(); - } - if(iWait.IsStarted()) - { - iWait.AsyncStop(); - } + + iActiveConnector->Cancel(); + if(iWait.IsStarted()) + { + iWait.AsyncStop(); + } } diff -r 6297cdf66332 -r d39add9822e2 browserutilities/connectionmanager/Src/InternetConnectionManager.cpp --- a/browserutilities/connectionmanager/Src/InternetConnectionManager.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/connectionmanager/Src/InternetConnectionManager.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -641,7 +641,7 @@ EXPORT_C void CInternetConnectionManager::StopConnectionL() { CLOG_ENTERFN( "StopConnectionL()" ); - CancelConnection(); + StopConnectionObserving(); iConnection.Close(); // iServ.Close(); diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrServEng/Group/HttpDMServEng.mmp --- a/browserutilities/downloadmgr/DownloadMgrServEng/Group/HttpDMServEng.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrServEng/Group/HttpDMServEng.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -97,4 +97,9 @@ LIBRARY DcfRep.lib LIBRARY FeatMgr.lib +#ifdef BRDO_OCC_ENABLED_FF +LIBRARY extendedconnpref.lib +LIBRARY netmeta.lib +#endif + // End of File diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp --- a/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpConnHandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -32,6 +32,10 @@ #include //#include #include +#include +#ifdef BRDO_OCC_ENABLED_FF +#include +#endif // EXTERNAL DATA STRUCTURES //extern ?external_data; @@ -286,6 +290,9 @@ iHttpSession.OpenL(); CLOG_WRITE8( "Session open" ); InitSessionL(); + + //Set it to zero + iIapId = 0; } // ----------------------------------------------------------------------------- @@ -378,7 +385,29 @@ iPref.SetDialogPreference( ECommDbDialogPrefPrompt ); } + #ifdef BRDO_OCC_ENABLED_FF + TExtendedConnPref extPref; + CLOG_WRITE( "Setting OCC parameters"); + CLOG_WRITE_1( "Iap: %d", iIapId ); + if (iIapId) + { + CLOG_WRITE( "Iap is found"); + extPref.SetSnapPurpose(CMManager::ESnapPurposeUnknown); + extPref.SetIapId(iIapId); + } + else + { + CLOG_WRITE( "Using Internet Snap"); + extPref.SetSnapPurpose(CMManager::ESnapPurposeInternet); + } + + extPref.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourConnSilent); + TConnPrefList prefList; + prefList.AppendL(&extPref); + iConnection.Start( prefList, iStatus ); + #else iConnection.Start( iPref, iStatus ); + #endif //BRDO_OCC_ENABLED_FF // RConnection will complete us. doComplete = EFalse; diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpStorage.cpp --- a/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpStorage.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpStorage.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -729,7 +729,7 @@ ( &fs, bytesToWrite ); ) if(!mmcOk) { - iRemovableStatus = TDownloadUiData::EDriveInternal ; + iRemovableStatus = KDriveAttInternal ; CLOG_WRITE( "no MMC present" ); return EDriveC; } @@ -740,8 +740,8 @@ fs.Volume(volInfoE,EDriveE); TInt64 freeC = volInfoC.iFree;//free memory available in that drive TInt64 freeE = volInfoE.iFree; - freeC>=freeE?EDriveC:EDriveE;//put the file in which ever drive has more memory - iRemovableStatus = (EDriveC == freeC) ? TDownloadUiData::EDriveInternal : ( TDownloadUiData::EDriveExternallyMountable | TDownloadUiData::EDriveRemovable ) ; + freeC = freeE?EDriveC:EDriveE;//put the file in which ever drive has more memory + iRemovableStatus = (EDriveC == freeC) ? KDriveAttInternal : KDriveAttRemovable ; return freeC; #endif } @@ -861,9 +861,9 @@ if( !iDownload->ClientApp()->Engine()->Fs().Drive( driveInfo, drive) ) { if (driveInfo.iDriveAtt & KDriveAttRemovable) - iRemovableStatus = ( TDownloadUiData::EDriveExternallyMountable | TDownloadUiData::EDriveRemovable ) ; + iRemovableStatus = KDriveAttRemovable ; else - iRemovableStatus = TDownloadUiData::EDriveInternal ; + iRemovableStatus = KDriveAttInternal ; CLOG_WRITE_1( "Removable: [%d]", iRemovableStatus ); } else @@ -1072,9 +1072,9 @@ if( !iDownload->ClientApp()->Engine()->Fs().Drive( driveInfo, drive) ) { if (driveInfo.iDriveAtt & KDriveAttRemovable) - iRemovableStatus = ( TDownloadUiData::EDriveExternallyMountable | TDownloadUiData::EDriveRemovable ) ; + iRemovableStatus = KDriveAttRemovable ; else - iRemovableStatus = TDownloadUiData::EDriveInternal ; + iRemovableStatus = KDriveAttInternal ; CLOG_WRITE_1( "Removable: [%d]", iRemovableStatus ); } else diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Data/DownloadMgrUiLib.rss --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Data/DownloadMgrUiLib.rss Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Data/DownloadMgrUiLib.rss Tue Feb 02 00:56:45 2010 +0200 @@ -20,6 +20,7 @@ NAME DMUL // INCLUDES +#include #include "DownloadMgrUiLib.hrh" #include #include @@ -319,7 +320,7 @@ MENU_TITLE { menu_pane = r_dmul_downloadslist_menu; txt = ""; } }; } - +#ifndef BRDO_SINGLE_CLICK_ENABLED_FF RESOURCE MENU_PANE r_dmul_downloadslist_menu { items = @@ -339,7 +340,25 @@ MENU_ITEM { command = EDownloadsListCmdCancelAll; txt = qtn_browser_downloads_cancel_all; } }; } +#else +RESOURCE MENU_PANE r_dmul_downloadslist_menu + { + items = + { + MENU_ITEM { command = EDownloadsListCmdResumeAll; txt = qtn_browser_downloads_resume_all; }, + MENU_ITEM { command = EDownloadsListCmdCancelAll; txt = qtn_browser_downloads_cancel_all; } + }; + } +RESOURCE MENU_PANE r_dmul_aiw_popup + { + items = + { + MENU_ITEM { command = EAiwCmdContact; txt = qtn_mg_options_assign_to_contact ; }, + MENU_ITEM {command = EAiwCmdRingtone;txt = qtn_mg_options_set_as_rt; } + }; + } +#endif STRUCT DMUL_AIW_INTEREST_MENUPANE_MAPPING_LIST { STRUCT pairs[]; @@ -363,6 +382,22 @@ { items= { +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + AIW_CRITERIA_ITEM + { + id = EAiwCmdRingtone; + serviceCmd = KAiwCmdAssign; + contentType = "*"; + serviceClass = KAiwClassMenu; + }, + AIW_CRITERIA_ITEM + { + id = EAiwCmdContact; + serviceCmd = KAiwCmdAssign; + contentType = "*"; + serviceClass = KAiwClassMenu; + } +#else AIW_CRITERIA_ITEM { id = EDownloadsListCmdUseAs; @@ -370,6 +405,7 @@ contentType = "*"; serviceClass = KAiwClassMenu; } +#endif }; } @@ -380,7 +416,11 @@ DMUL_AIW_INTEREST_MENUPANE_PAIR { interest = r_dmul_aiw_use_as_interest; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + menupane = r_dmul_aiw_popup; +#else menupane = r_dmul_downloadslist_menu; +#endif } }; } @@ -490,6 +530,20 @@ }; } +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +RESOURCE STYLUS_POPUP_MENU r_stylus_long_tap_popup_dl_menu + { + items = + { + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_delete; command = EDownloadsListCmdDelete;}, + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_set_as_rt; command = EAiwCmdRingtone; }, + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_assign_to_contact ; command = EAiwCmdContact ; }, + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_open_file_manager; command = EDownloadsListCmdFileManager;}, + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_cancel_download; command = EDownloadsListCmdCancel;}, + STYLUS_POPUP_MENU_ITEM { txt = qtn_browser_downloads_resume; command = EDownloadsListCmdResume;} + }; + } +#endif // End of File diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Group/DownloadMgrUiLib.mmp --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Group/DownloadMgrUiLib.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Group/DownloadMgrUiLib.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -62,6 +62,7 @@ USERINCLUDE ../../DownloadMgrClntSrv/inc MW_LAYER_SYSTEMINCLUDE + #if defined(__PLATFORM_VERSION_50_TUBE__) || defined( __PLATFORM_VERSION_50__) APP_LAYER_SYSTEMINCLUDE #endif @@ -81,6 +82,9 @@ SOURCE DMgrUiLibPanic.cpp SOURCE ProgressInfoCreator.cpp SOURCE UserInteractionsEventHandler.cpp +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +SOURCE CDownloadsStylusPopupMenu.cpp +#endif LIBRARY AKNNOTIFY.lib LIBRARY AknNotifyPlugin.lib diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Inc/CDownloadsListDlg.h --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Inc/CDownloadsListDlg.h Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Inc/CDownloadsListDlg.h Tue Feb 02 00:56:45 2010 +0200 @@ -24,7 +24,7 @@ #include #include #include - +#include // DATA TYPES enum TDownloadsListDlgEvent { @@ -41,6 +41,9 @@ class MDownloadsListDlgObserver; class RHttpDownload; class CDownloadUtils; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +class CDlStylusPopupMenu; +#endif // CONSTANTS /// Refresh timer setting. If this is zero, no timer is used! (Micro is 10^(-6)) @@ -132,7 +135,10 @@ void ProcessCommandL( TInt aCommandId ); void SetEmphasis( CCoeControl* aMenuControl, TBool aEmphasis ); void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ); - +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + CDownloadsListArray* DownloadsListArray(){ return iDownloadsListArray;} + void AddAiwItemsL(); +#endif public: // from MEikListBoxObserver void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType); @@ -201,6 +207,10 @@ CDownloadUtils* iDownloadUtils; ///< Owned. TBool iIsMSKChangeHandled; TBool iProgressiveDownload; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + CDlStylusPopupMenu *iStylusMenu; + TPointerEvent iPointerEvent; +#endif }; #endif /* CDOWNLOADSLISTDLG_H */ diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Inc/DownloadMgrUiLib.hrh --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Inc/DownloadMgrUiLib.hrh Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Inc/DownloadMgrUiLib.hrh Tue Feb 02 00:56:45 2010 +0200 @@ -54,6 +54,14 @@ EAIWPluginSubMenu = 0x7000 }; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +enum TAiwCommandId // pls dont modify these values. + { + EAiwCmdRingtone = 0x6025, + EAiwCmdContact = 0x6026 + }; +#endif + #endif /* DOWNLOADMGRUILIB_HRH */ // End of File diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiDownloadsList.cpp --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiDownloadsList.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadMgrUiDownloadsList.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1999,7 +1999,27 @@ if ( cancelled ) { - DeleteDownloadL( currDownload ); + DeleteDownloadL( currDownload ); + +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + TInt currentItemIndex = aDialog.CurrentItemIndex(); + if (currentItemIndex != -1) + { + TInt Inprogress = iListModel->DownloadsCount + ( MASKED_DL_STATE(EHttpDlCreated) | + MASKED_DL_STATE(EHttpDlPaused) | + MASKED_DL_STATE(EHttpDlInprogress) | + MASKED_DL_STATE(EHttpDlMultipleMOFailed)); + if ( Inprogress > 1 ) + { + aDialog.ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeyOptions, ETrue ); + } + else + { + aDialog.ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeyOptions, EFalse ); + } + } +#endif } iIsCancelInProgress = EFalse; } @@ -2251,7 +2271,8 @@ CDocumentHandler* docHandler = CDocumentHandler::NewLC(); canProgHandled = docHandler->CanHandleProgressivelyL( dataType, pdPlayerUid ); CleanupStack::PopAndDestroy( docHandler ); // docHandler - + +#ifndef BRDO_SINGLE_CLICK_ENABLED_FF //delete open file manager when download is not complete if( !(isCompleted)) { @@ -2386,9 +2407,33 @@ { aMenuPane->DeleteMenuItem( EDownloadsListCmdFileManager ); } - } + } +#else + // Count paused downloads. Note that Creates and Failed downloads + // are also considered as Paused, and they can be resumed. + TInt pausedCount = iListModel->DownloadsCount + ( MASKED_DL_STATE(EHttpDlCreated) | + MASKED_DL_STATE(EHttpDlPaused) | + MASKED_DL_STATE(EHttpDlMultipleMOFailed) ); + CLOG_WRITE_FORMAT(" paused count: %d",pausedCount); + // + if ( !( 1 < pausedCount ) ) + { + aMenuPane->DeleteMenuItem( EDownloadsListCmdResumeAll ); + } + + TInt downloadCount = iListModel->DownloadsCount + ( MASKED_DL_STATE(EHttpDlCreated) | + MASKED_DL_STATE(EHttpDlInprogress)| + MASKED_DL_STATE(EHttpDlPaused) ); + CLOG_WRITE_FORMAT(" download count: %d",downloadCount); + + if ( !( 1 < downloadCount ) ) + { + aMenuPane->DeleteMenuItem( EDownloadsListCmdCancelAll ); + } +#endif } - if ( wasCompleted && !isThemeType ) { InitializeAIWPlugInMenusL( aResourceId, aMenuPane, currDownload ); @@ -2396,6 +2441,17 @@ CLOG_LEAVEFN("CDownloadMgrUiDownloadsList::DynInitMenuPaneL"); } +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +void CDownloadMgrUiDownloadsList::AIWPlugInMenusL(TInt aResourceId,CEikMenuPane* aMenuPane) + { + if( !iAIWServiceHandler ) + { + AttachAIWInterestL(); + } + RHttpDownload& currDownload = iListModel->Download( 0 ); + InitializeAIWPlugInMenusL( aResourceId, aMenuPane, currDownload ); + } +#endif // ----------------------------------------------------------------------------- // CDownloadMgrUiDownloadsList::OfferKeyEventL // ----------------------------------------------------------------------------- diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadsListDlg.cpp --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadsListDlg.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadsListDlg.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -33,7 +33,10 @@ #include #include #include - +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +#include "CDownloadsStylusPopupMenu.h" +#define pixelOffset 36 +#endif #include "eikon.hrh" // ============================ MEMBER FUNCTIONS =============================== @@ -107,6 +110,9 @@ iDownloadUtils = CDownloadUtils::NewL(); +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + iStylusMenu = CDlStylusPopupMenu::NewL(); +#endif CLOG_LEAVEFN("CDownloadsListDlg::ConstructL"); } @@ -155,7 +161,13 @@ iListBox = NULL; delete iDownloadUtils; iDownloadUtils = NULL; - +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if (iStylusMenu) + { + delete iStylusMenu; + iStylusMenu = NULL; + } +#endif CLOG_LEAVEFN("CDownloadsListDlg::~CDownloadsListDlg"); } @@ -195,6 +207,23 @@ CLOG_WRITE(" aModel.Count() == 0"); } +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + TInt Inprogress = iDownloadsListArray->DownloadsCount + ( MASKED_DL_STATE(EHttpDlCreated) | + MASKED_DL_STATE(EHttpDlPaused) | + MASKED_DL_STATE(EHttpDlInprogress) | + MASKED_DL_STATE(EHttpDlMultipleMOFailed)); + + if ( Inprogress > 1 ) + { + ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeyOptions, ETrue ); + } + else + { + ButtonGroupContainer()->MakeCommandVisible( EAknSoftkeyOptions, EFalse ); + } +#endif + CLOG_LEAVEFN("CDownloadsListDlg::SetModelL"); } @@ -614,6 +643,9 @@ break; } case MEikListBoxObserver::EEventItemDoubleClicked: +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + case MEikListBoxObserver::EEventItemSingleClicked: +#endif { // If EAknSoftkeyOpen is visible, then we can activate the selected download if (ButtonGroupContainer()->IsCommandVisible(EAknSoftkeyOpen)) @@ -680,6 +712,36 @@ // void CDownloadsListDlg::HandlePointerEventL(const TPointerEvent& aPointerEvent) { +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if ( aPointerEvent.iType == TPointerEvent::EButton1Down) + { + iPointerEvent = aPointerEvent; + iStylusMenu->HandlePointerEventL(aPointerEvent, this); + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + iStylusMenu->cancelLongTapL(); + if(iStylusMenu->islongtapRunning()) + { + iStylusMenu->reSetLongTapFlag(); + return; + } + } + else if ( aPointerEvent.iType == TPointerEvent::EDrag ) + { + if((Abs(iPointerEvent.iPosition.iX - aPointerEvent.iPosition.iX) > pixelOffset ) || + (Abs(iPointerEvent.iPosition.iY - aPointerEvent.iPosition.iY) > pixelOffset )) + { + iStylusMenu->cancelLongTapL(); + if(iStylusMenu->islongtapRunning()) + { + iStylusMenu->reSetLongTapFlag(); + return; + } + } + } +#endif + CAknPopupList::HandlePointerEventL(aPointerEvent); } @@ -915,4 +977,21 @@ return KErrNone; } +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF +void CDownloadsListDlg::AddAiwItemsL() + { + iMenuBar->MenuPane()->AddMenuItemsL(R_DMUL_AIW_POPUP); + iDlgObserver.AIWPlugInMenusL(R_DMUL_AIW_POPUP,iMenuBar->MenuPane()); + TInt pos(0); + if (iMenuBar->MenuPane()->MenuItemExists(EAiwCmdContact,pos)) + { + iMenuBar->MenuPane()->DeleteMenuItem(EAiwCmdContact); + } + if (iMenuBar->MenuPane()->MenuItemExists(EAiwCmdRingtone,pos)) + { + iMenuBar->MenuPane()->DeleteMenuItem(EAiwCmdRingtone); + } + + } +#endif /* End of file. */ diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/DownloadMgrUiLib/loc/DownloadMgrUiLib.loc --- a/browserutilities/downloadmgr/DownloadMgrUiLib/loc/DownloadMgrUiLib.loc Mon Jan 18 21:20:18 2010 +0200 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/loc/DownloadMgrUiLib.loc Tue Feb 02 00:56:45 2010 +0200 @@ -402,4 +402,10 @@ // #define qtn_browser_downloads_files_saved "Files Saved" +#define qtn_browser_downloads_set_as_rt "Set as ringing tone" + +#define qtn_browser_downloads_assign_to_contact "Assign to contact" + + + // End of File diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/downloadmgruilib/Inc/CDownloadsStylusPopupMenu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/downloadmgr/downloadmgruilib/Inc/CDownloadsStylusPopupMenu.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Hari and Billa +* +* Description: Stylus Popup Menu Containing Download UI Options +* +*/ + +#ifndef CDlTYLUSPOPUPMENU_H_ +#define CDlTYLUSPOPUPMENU_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +class CDownloadsListDlg; + +_LIT8(KAudio, "audio/"); +_LIT8(KVideo, "video/"); +_LIT8(KImage, "image/"); +_LIT8(KFlash, "application/x-shockwave-flash"); +_LIT8(Ksdp, "application/sdp"); +_LIT8(Krng, "application/vnd.nokia.ringing-tone"); +_LIT8(Krn, "application/vnd.rn-realmedia"); +_LIT8(Kpn, "application/x-pn-realmedia"); +_LIT8(KSisxContentType, "x-epoc/x-sisx-app"); + +#define KLONG_TAP_TIMER_DELAY 0.4000000 //0.4 seconds + +// CLASS DECLARATION +class CDlStylusPopupMenu : public CCoeControl, public MAknLongTapDetectorCallBack, public MEikMenuObserver +{ + public: + static CDlStylusPopupMenu* NewL(); + void ConstructL(); + void HandlePointerEventL(const TPointerEvent& aPointerEvent,CDownloadsListDlg* view); + virtual void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation ); + void ProcessCommandL(TInt aCommandId); + void SetEmphasis(CCoeControl* /*aMenuControl*/,TBool /*aEmphasis*/) { } + void cancelLongTapL(); + TBool islongtapRunning(); + void reSetLongTapFlag(); + ~CDlStylusPopupMenu(); + + private: + CAknLongTapDetector* iLongTapDetector; + CAknStylusPopUpMenu* iStylusPopupMenu; + TInt iCount; + TBool ilongtapRunning; + CDownloadsListDlg *iDlView; +}; +#endif /* CDlTYLUSPOPUPMENU_H_ */ diff -r 6297cdf66332 -r d39add9822e2 browserutilities/downloadmgr/downloadmgruilib/Src/CDownloadsStylusPopupMenu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/downloadmgr/downloadmgruilib/Src/CDownloadsStylusPopupMenu.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,155 @@ +/* + * CDlStylusPopupMenu.cpp + * + * Created on: Dec 24, 2009 + * Author: hari and billa + */ + +#include "CDownloadsStylusPopupMenu.h" +#include "CDownloadsListDlg.h" +#include "DownloadMgrUiLib.rsg" +#include "CDownloadsListArray.h" +#include "DownloadMgrUilib.hrh" + + +// ----------------------------------------------------------------------------- +// BrowserStylusPopupMenu::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CDlStylusPopupMenu* CDlStylusPopupMenu::NewL() +{ + CDlStylusPopupMenu* container = + new (ELeave) CDlStylusPopupMenu; + container->ConstructL(); + return container; +} + +void CDlStylusPopupMenu::ConstructL() +{ + ilongtapRunning = EFalse; + iLongTapDetector = CAknLongTapDetector::NewL(this); + TResourceReader readerFolder; + TResourceReader readerItem; +} + +// ----------------------------------------------------------------------------- +// BrowserStylusPopupMenu::HandlePointerEventL() +// Called by framework to handle pointer touch events. +// ----------------------------------------------------------------------------- +// +void CDlStylusPopupMenu::HandlePointerEventL(const TPointerEvent& aPointerEvent, CDownloadsListDlg *view) +{ + ilongtapRunning = EFalse; + iLongTapDetector->SetLongTapDelay(KLONG_TAP_TIMER_DELAY); + iLongTapDetector->PointerEventL(aPointerEvent); + iLongTapDetector->EnableLongTapAnimation(ETrue); + iDlView = view; + CCoeControl::HandlePointerEventL(aPointerEvent); +} + +void CDlStylusPopupMenu::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation ) +{ + ilongtapRunning = ETrue; + TBool isAiwcall = EFalse; + if (iStylusPopupMenu) + { + delete iStylusPopupMenu; + iStylusPopupMenu = NULL; + iStylusPopupMenu = CAknStylusPopUpMenu::NewL( this , aPenEventScreenLocation); + } + else + { + iStylusPopupMenu = CAknStylusPopUpMenu::NewL( this , aPenEventScreenLocation); + } + + iStylusPopupMenu->SetPosition(aPenEventScreenLocation, CAknStylusPopUpMenu::EPositionTypeLeftBottom); + + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC(reader,R_STYLUS_LONG_TAP_POPUP_DL_MENU); + iStylusPopupMenu->ConstructFromResourceL(reader); + TInt currentItemIndex = iDlView->CurrentItemIndex(); + CDownloadsListArray* DownloadsListArray = iDlView->DownloadsListArray(); + RHttpDownload& currDownload = DownloadsListArray->Download( currentItemIndex ); + + // Get the UI data for the current download + TDownloadUiData& dlData = DownloadsListArray->DlUiData( iDlView->CurrentItemIndex() ); + TInt32 state( dlData.iDownloadState ); + HBufC8* contentType = HBufC8::NewLC(KMaxContentTypeLength); + TPtr8 contentTypePtr = contentType->Des(); + User::LeaveIfError + ( currDownload.GetStringAttribute( EDlAttrContentType, contentTypePtr ) ); + TInt typeAudio = !contentType->Find(KAudio); + CleanupStack::PopAndDestroy( contentType ); + + if (state == EHttpDlInprogress) + { + isAiwcall = ETrue; + iStylusPopupMenu->SetItemDimmed(EAiwCmdContact,ETrue); + iStylusPopupMenu->SetItemDimmed(EAiwCmdRingtone,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdDelete,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdFileManager,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdResume,ETrue); + } + + if ((state == EHttpDlCompleted) || (state ==EHttpDlMultipleMOCompleted)) + { + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdCancel,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdResume,ETrue); + } + if (state == EHttpDlPaused) + { + isAiwcall = ETrue; + iStylusPopupMenu->SetItemDimmed(EAiwCmdContact,ETrue); + iStylusPopupMenu->SetItemDimmed(EAiwCmdRingtone,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdDelete,ETrue); + iStylusPopupMenu->SetItemDimmed(EDownloadsListCmdFileManager,ETrue); + } + + if(typeAudio != 1) //Not an audio type + { + isAiwcall = ETrue; + iStylusPopupMenu->SetItemDimmed(EAiwCmdContact,ETrue); + iStylusPopupMenu->SetItemDimmed(EAiwCmdRingtone,ETrue); + } + + CleanupStack::PopAndDestroy(); + if (!isAiwcall) + iDlView->AddAiwItemsL(); + iStylusPopupMenu->ShowMenu(); +} + +void CDlStylusPopupMenu::ProcessCommandL(TInt aCommand) +{ + iDlView->ProcessCommandL(aCommand); +} + +CDlStylusPopupMenu::~CDlStylusPopupMenu() +{ + if(iLongTapDetector) + { + delete iLongTapDetector; + iLongTapDetector = NULL; + } + if(iStylusPopupMenu) + { + delete iStylusPopupMenu; + iStylusPopupMenu = NULL; + } +} + +void CDlStylusPopupMenu::cancelLongTapL() +{ + iLongTapDetector->CancelAnimationL(); +} + +TBool CDlStylusPopupMenu::islongtapRunning() +{ + return ilongtapRunning; +} + +void CDlStylusPopupMenu::reSetLongTapFlag() +{ + ilongtapRunning = EFalse; +} + diff -r 6297cdf66332 -r d39add9822e2 browserutilities/webutils/conf/webutils.confml Binary file browserutilities/webutils/conf/webutils.confml has changed diff -r 6297cdf66332 -r d39add9822e2 codhandler/codeng/group/CodEng.mmp --- a/codhandler/codeng/group/CodEng.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/codhandler/codeng/group/CodEng.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -118,3 +118,7 @@ DEBUGLIBRARY flogger.lib //LIBRARY flogger.lib +#ifdef BRDO_OCC_ENABLED_FF +LIBRARY extendedconnpref.lib +LIBRARY netmeta.lib +#endif \ No newline at end of file diff -r 6297cdf66332 -r d39add9822e2 codhandler/codeng/src/Connection.cpp --- a/codhandler/codeng/src/Connection.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/codhandler/codeng/src/Connection.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -28,6 +28,10 @@ #include #include #include +#include +#ifdef BRDO_OCC_ENABLED_FF +#include +#endif // ================= MEMBER FUNCTIONS ======================= @@ -94,7 +98,31 @@ // aIap == 0 -> user select. iConnPref.SetDialogPreference( ECommDbDialogPrefPrompt ); } - iConn.Start( iConnPref, iStatus ); + #ifdef BRDO_OCC_ENABLED_FF + TExtendedConnPref extPref; + CLOG(( EConn, 4, _L("CodHalder Setting OCC parameters") )); + + CLOG(( EConn, 4, _L("Iap: %d"), aIap )); + if (aIap) + { + CLOG(( EConn, 4, _L("Iap is found") )); + extPref.SetSnapPurpose(CMManager::ESnapPurposeUnknown); + extPref.SetIapId(aIap); + } + else + { + CLOG(( EConn, 4, _L("Using Internet Snap") )); + extPref.SetSnapPurpose(CMManager::ESnapPurposeInternet); + } + + extPref.SetNoteBehaviour(TExtendedConnPref::ENoteBehaviourConnSilent); + TConnPrefList prefList; + prefList.AppendL(&extPref); + iConn.Start( prefList, iStatus ); + #else + iConn.Start( iConnPref, iStatus ); + #endif //BRDO_OCC_ENABLED_FF + iState = EConnecting; SetActive(); CleanupStack::Pop( 2 ); // closing iConn and iSockServ diff -r 6297cdf66332 -r d39add9822e2 web_plat/browser_platform_api/inc/Browser_platform_variant.hrh --- a/web_plat/browser_platform_api/inc/Browser_platform_variant.hrh Mon Jan 18 21:20:18 2010 +0200 +++ b/web_plat/browser_platform_api/inc/Browser_platform_variant.hrh Tue Feb 02 00:56:45 2010 +0200 @@ -158,21 +158,38 @@ // Flag for Multiple Font Support(Times New Roman,Arial and Courier).This feature is available only for TB9.2 #define BRDO_BROWSER_MULTIPLE_FONT_SUPPORT +// Flag for Multi touch enable +#define BRDO_MULTITOUCH_ENABLED_FF //To provide WidgetSIDChecker support #define APP_SID_CHECK_SUPPORT_FF +// One Click Connectivity support flag +#define BRDO_OCC_ENABLED_FF + +//Single click flag +#define BRDO_SINGLE_CLICK_ENABLED_FF /* * =================== * S60 3.23 * =================== */ #if defined(__PLATFORM_VERSION_32__) + +//OCC support +#undef BRDO_OCC_ENABLED_FF + +//Single click support +#undef BRDO_SINGLE_CLICK_ENABLED_FF + //To provide WidgetSIDChecker support #undef APP_SID_CHECK_SUPPORT_FF // Flag for Multiple Font Support(Times New Roman,Arial and Courier).This feature is available only for TB9.2 #undef BRDO_BROWSER_MULTIPLE_FONT_SUPPORT +// Flag for Multi touch enable +#undef BRDO_MULTITOUCH_ENABLED_FF + // Defines touch screen capability #undef BRDO_TOUCH_ENABLED_FF @@ -234,6 +251,13 @@ */ #elif defined(__PLATFORM_VERSION_50_TUBE__) +//OCC support +#undef BRDO_OCC_ENABLED_FF +//Single click support +#undef BRDO_SINGLE_CLICK_ENABLED_FF + +// Flag for Multi touch enable +#undef BRDO_MULTITOUCH_ENABLED_FF //To provide WidgetSIDChecker support #undef APP_SID_CHECK_SUPPORT_FF @@ -286,6 +310,14 @@ */ #elif defined(__PLATFORM_VERSION_50__) +//OCC support +#undef BRDO_OCC_ENABLED_FF +//Single click support +#undef BRDO_SINGLE_CLICK_ENABLED_FF + +// Flag for Multi touch enable +#undef BRDO_MULTITOUCH_ENABLED_FF + //To provide WidgetSIDChecker support #undef APP_SID_CHECK_SUPPORT_FF @@ -321,6 +353,14 @@ */ #elif defined(__PLATFORM_VERSION_51__) +//OCC support +#undef BRDO_OCC_ENABLED_FF +//Single click support +#undef BRDO_SINGLE_CLICK_ENABLED_FF + +// Flag for Multi touch enable +#undef BRDO_MULTITOUCH_ENABLED_FF + //To provide WidgetSIDChecker support #undef APP_SID_CHECK_SUPPORT_FF @@ -352,6 +392,12 @@ // Defines whether SAPI Security Manager Prompt Enhancement is available #undef BRDO_SEC_MGR_PROMPT_ENHANCEMENT_FF +//Defines One Click Connectivity support +#define BRDO_OCC_ENABLED_FF + +//Single click support +#define BRDO_SINGLE_CLICK_ENABLED_FF + #define BRDO_BROWSER_50_FF #define BRDO_BROWSER_51_FF #define BRDO_BROWSER_52_FF diff -r 6297cdf66332 -r d39add9822e2 web_plat/group/bld.inf --- a/web_plat/group/bld.inf Mon Jan 18 21:20:18 2010 +0200 +++ b/web_plat/group/bld.inf Tue Feb 02 00:56:45 2010 +0200 @@ -31,12 +31,12 @@ #include "../multipart_parser_api/group/bld.inf" #endif #include "../recent_url_store_api/group/bld.inf" -#include "../rt_gesturehelper_api/group/bld.inf" #include "../scheme_handler_plugin_api/group/bld.inf" #include "../scriptable_plugin_api/group/bld.inf" #include "../webutils_api/group/bld.inf" #include "../widget_registry_api/group/bld.inf" #include "../xml_parser_api/group/bld.inf" +#include "../stmgesturefw_api/group/bld.inf" PRJ_PLATFORMS DEFAULT diff -r 6297cdf66332 -r d39add9822e2 web_plat/rt_gesturehelper_api/group/bld.inf --- a/web_plat/rt_gesturehelper_api/group/bld.inf Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Build information -* -*/ -#include -#include "../../browser_platform_api/inc/browser_platform_variant.hrh" - -PRJ_PLATFORMS -DEFAULT - -PRJ_EXPORTS -../inc/rt_gesturehelper.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gesturehelper.h) -../inc/rt_gestureobserver.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gestureobserver.h) - -PRJ_MMPFILES diff -r 6297cdf66332 -r d39add9822e2 web_plat/rt_gesturehelper_api/inc/rt_gesturehelper.h --- a/web_plat/rt_gesturehelper_api/inc/rt_gesturehelper.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: RT Gesture helper interface -* -*/ - - -#ifndef _RT_GESTUREHELPER_H_ -#define _RT_GESTUREHELPER_H_ - -#include -#include - -class CAlfEnv; -class CAlfDisplay; -class TAlfEvent; -struct TPointerEvent; - -namespace RT_GestureHelper -{ - -class CGestureHelperImpl; - -/** - * Gesture helper provides functionality to convert a stream of pointer events - * into a logical gesture, and to assist clients in calculation of gesture - * speed and distance. - * - * Interfaces - * - CGestureHelper is a parser of pointer events. Recognises gestures from - * a sequence of pointer events, and converts them to gesture commands. - * For documentation of callbacks, see @ref MGestureObserver. - * - MGestureObserver allows clients to get notified of gestures - * - MGestureEvent represents the gesture (event) - */ -NONSHARABLE_CLASS( CGestureHelper ) : public CBase - { -public: - /** - * The helper is expected to be a member variable, hence NewLC is not provided - */ - IMPORT_C static CGestureHelper* NewL( MGestureObserver& aObserver ); - - /** Destructor */ - IMPORT_C ~CGestureHelper(); - - /** - * Specify whether the helper will send hold events. By default, holding is enabled. - * "Hold" means user has held stylus/finger on the same position for a longer duration. - * - * Clients that require holding to be treated with no special meaning should disable - * holding to simplify their event handling. - * For example, assume the client uses swipe left/right to control navigation, and - * holding is enabled. If user holds, the client gets hold left/right - * event, and no swipe event. If user now drags left or right while still pressing - * stylus down, the client will not get a swipe event (since it already received a hold - * event). Upon release event, the client no reliable way of knowing whether the - * user swiped left/right or cancelled the swipe. This problem is removed if the - * client simply disables holding. In the above scenario while holding disabled, - * the client would get only swipe events (and released event). - * (Swipe can be cancelled by dragging towards, but not beyond, the starting position.) - */ - IMPORT_C void SetHoldingEnabled( TBool aEnabled ); - - /** - * @return whether sending hold events is currently enabled - * ("Hold" means user has held stylus/finger on the same position for a longer duration.) - */ - IMPORT_C TBool IsHoldingEnabled() const; - - /** - * Enables/disables double tap support. Double tap is disabled by default. - * When double tap is disabled, gesture helper emits tap events immediately when - * user lifts stylus/finger. - * When double tap is enabled, tap events are emitted after the double tap timeout passes. - * The timeout is the maximum time within which the second tap will be treated - * as a double tap. That is, there is a delay (sluggishness) before client receives - * the tap event when double tap is enabled. - * tap + timeout => tap event emitted after timeout - * tap + tap before timeout => double tap event emitted immediately after the second tap - * tap + swipe => tap + swipe events - * (tap + timeout + tap + timeout => two tap events) - */ - IMPORT_C void SetDoubleTapEnabled( TBool aEnabled ); - - /** - * @return whether double tap is currently enabled. See SetDoubleTapEnabled - */ - IMPORT_C TBool IsDoubleTapEnabled() const; - - /** - * Initialise pointer capture for Alfred - * This means that helper will receive drag events and pointer events that - * go outside the original visual area - */ - IMPORT_C void InitAlfredPointerCaptureL( CAlfEnv& aEnv, CAlfDisplay& aDisplay, - TInt aFreeControlGroupId ); - - /** - * Give a pointer event to the helper, to form a part of a gesture - * For AVKON-based client, this interface is the only option. - * Alfred-based client should use OfferEventL, as it allows gesture events to - * provider the visual on which the pointer event started. - * @param aEvent pointer event - * @return whether event was consumed or not - * EFalse the event is not a pointer events and if pointer up/drag - * event received without pointer down event - * ETrue in all the other cases of pointer event - */ - IMPORT_C TBool HandlePointerEventL( const TPointerEvent& aEvent ); - - /** - * Offer an Alf event. See HandlePointerEventL. - * @return whether event was consumed or not - * EFalse the event is not a pointer events and if pointer up/drag - * event received without pointer down event - * ETrue in all the other cases of pointer event - */ - IMPORT_C TBool OfferEventL( const TAlfEvent& aEvent ); - - /** - * Cancel ongoing recognision. Purges all pointer events given earlier, and - * starts afresh. It is not necessary to call Cancel before deleting the object. - */ - IMPORT_C void Cancel(); - -private: - /// interface implementation - CGestureHelperImpl* iImpl; - }; - -} // namespace RT_GestureHelper - -#endif // _RT_GESTUREHELPER_H_ diff -r 6297cdf66332 -r d39add9822e2 web_plat/rt_gesturehelper_api/inc/rt_gestureobserver.h --- a/web_plat/rt_gesturehelper_api/inc/rt_gestureobserver.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: RT Gesture helper interface -* -*/ - -#ifndef _RT_GESTUREOBSERVER_H_ -#define _RT_GESTUREOBSERVER_H_ - -#include - -namespace RT_GestureHelper -{ - -/// flag that indicates gesture code is a holding code -/// clients should use MGestureEvent::IsHolding -const TInt EFlagHold = 0x10000000; - -enum TGestureCode - { - // states - EGestureStart = 0x00000001, // gesture just started (user pressed stylus down) - EGestureDrag = 0x00000002, // user moved stylus (may be holding or not holding) - EGestureReleased = 0x00000003, // user lifted stylus while user was holding - // gestures - EGestureUnknown = 0x00000005, // gesture was not recognised - // these codes are sent when user lifts stylus (if holding not started) - EGestureTap = 0x00000006, - EGestureDoubleTap = 0x00000007, // only if double tap is enabled - // (via CGestureHelper::SetDoubleTapEnabled or - // CGestureControl::SetDoubleTapEnabled) - EGestureSwipeLeft = 0x00000008, - EGestureSwipeRight = 0x00000009, - EGestureSwipeUp = 0x0000000A, - EGestureSwipeDown = 0x0000000B, - - EGestureFlick = 0x0000000C, - EGestureLongTap = 0x0000000D, - EGestureDrop = 0x0000000E, - - // these codes are sent when user initiates holding by keeping stylus in - // same place for a longer duration - EGestureHoldLeft = EGestureSwipeLeft | EFlagHold, - EGestureHoldRight = EGestureSwipeRight | EFlagHold, - EGestureHoldUp = EGestureSwipeUp | EFlagHold, - EGestureHoldDown = EGestureSwipeDown | EFlagHold - }; - -/** - * Point of float accuracy - */ -NONSHARABLE_STRUCT( TRealPoint ) - { - inline TRealPoint(); - inline TRealPoint( const TRealPoint& aPoint ); - inline TRealPoint( TReal aX, TReal aY ); - inline TBool operator==( const TRealPoint& aPoint ) const; - - TReal32 iX; - TReal32 iY; - }; - -/** - * a gesture event - */ - -enum TAxis - { - EAxisBoth, - EAxisHorizontal, - EAxisVertical - }; - - -class TGestureEvent -{ -public: - inline TGestureCode Code( TAxis /*aRelevantAxis*/ ) const { return iCode; }; - inline TBool IsHolding() const { return iIsHolding; }; - inline TPoint StartPos() const { return iStartPos; }; - inline TPoint CurrentPos() const { return iCurrPos; }; - inline TRealPoint Speed() const { return iSpeed; }; - inline TRealPoint SpeedPercent ( const TRect& /*aEdges*/ ) const { return iSpeedPercent; }; - inline TPoint Distance() const { return iDistance; }; - - inline void SetCurrentPos(TPoint aPos) { iCurrPos = aPos; }; - inline void SetStartPos(TPoint aPos) {iStartPos = aPos; }; - inline void SetCode(TGestureCode aCode) {iCode = aCode; }; - inline void SetSpeed(TRealPoint aSpeed) { iSpeed = aSpeed; }; - inline void SetDistance(TPoint aDistance) { iDistance = aDistance; }; - inline void SetSpeedPercent(TRealPoint aSpeedPercent) { iSpeedPercent = aSpeedPercent; }; - - inline void SetIsHolding(TBool aIsHolding) { iIsHolding = aIsHolding; }; - -private: - TGestureCode iCode; - TBool iIsHolding; - TPoint iStartPos; - TPoint iCurrPos; - TRealPoint iSpeed; - TRealPoint iSpeedPercent; - TPoint iDistance; -}; - - -/** - * Observer that will be notified when user makes gestures - */ -class MGestureObserver - { -public: - /** - * Handle the gesture event - * @param aEvent event describing the gesture - */ - virtual void HandleGestureL( const TGestureEvent& aEvent ) = 0; - }; - -// ---------------------------------------------------------------------------- -// Default constructor for real point -// ---------------------------------------------------------------------------- -// -inline TRealPoint::TRealPoint() - : iX( 0 ), iY( 0 ) - { - } - -// ---------------------------------------------------------------------------- -// Copy constructor for real point -// ---------------------------------------------------------------------------- -// -inline TRealPoint::TRealPoint( const TRealPoint& aPoint ) - : iX( aPoint.iX ), iY( aPoint.iY ) - { - } - -// ---------------------------------------------------------------------------- -// Copy constructor for real point -// ---------------------------------------------------------------------------- -// -inline TRealPoint::TRealPoint( TReal aX, TReal aY ) - : iX( aX ), iY( aY ) - { - } - -// ---------------------------------------------------------------------------- -// Default constructor for real point -// ---------------------------------------------------------------------------- -// -inline TBool TRealPoint::operator==( const TRealPoint& aPoint ) const - { - return iX == aPoint.iX && iY == aPoint.iY; - } - - -} // namespace RT_GestureHelper - -#endif // _RT_GESTUREOBSERVER_H_ diff -r 6297cdf66332 -r d39add9822e2 web_plat/rt_gesturehelper_api/rt_gesturehelper_api.metaxml --- a/web_plat/rt_gesturehelper_api/rt_gesturehelper_api.metaxml Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - RT Gesture Helper API - Interface to the RT GestureHelper library. - c++ - WebKitUtils - - - - - no - no - - diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/group/bld.inf Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Build information +* +*/ +#include +#include "../../browser_platform_api/inc/browser_platform_variant.hrh" + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/rt_gesturehelper.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gesturehelper.h) +../inc/rt_gestureobserver.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gestureobserver.h) +../inc/rt_gestureif.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gestureif.h) +../inc/rt_gesturelistener.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_gesturelistener.h) +../inc/rt_uievent.h MW_LAYER_PLATFORM_EXPORT_PATH(rt_uievent.h) +../inc/stmgestureinterface.h MW_LAYER_PLATFORM_EXPORT_PATH(stmgestureinterface.h) +../inc/stmgesturelistener.h MW_LAYER_PLATFORM_EXPORT_PATH(stmgesturelistener.h) + +PRJ_MMPFILES + + diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/rt_gesturehelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/rt_gesturehelper.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: RT Gesture helper interface +* +*/ + + +#ifndef _RT_GESTUREHELPER_H_ +#define _RT_GESTUREHELPER_H_ + +#include +#include + +#endif // _RT_GESTUREHELPER_H_ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/rt_gestureif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/rt_gestureif.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#ifndef RT_GESTUREIF_H_ +#define RT_GESTUREIF_H_ +// INCLUDES +#include +#include +#include +#include +#include +#include + +namespace stmGesture +{ + +/** + * UIDs for supported Gestures + */ +enum TGestureUid +{ + EGestureUidUnknown = 0, + EGestureUidTouch, + EGestureUidTap, + EGestureUidDoubleTap = EGestureUidTap, + EGestureUidLongPress, + EGestureUidHover, + EGestureUidPan, + EGestureUidRelease, + EGestureUidLeftRight, + EGestureUidUpDown, + EGestureUidFlick, + EGestureUidEdgeScroll, + EGestureUidPinch, + EGestureUidCornerZoom, + // + EStmGestureUid_Count +}; + +/** + * Area Settings + */ +enum TGestureAreaSettings +{ + ETouchTimeArea, + ETouchArea, + EHoldArea, + // + EGestureAreaSettingsCount +}; + +/** + * Gesture Specific Settings + */ +enum TGestureSettings +{ + //ETouchTimeout, + EDoubleTapTimeout, + ESuppressTimeout, + EMoveSuppressTimeout, + EHoverSpeed, + EPanSpeedLow, + EPanSpeedHigh, + EFlickSpeed = EPanSpeedHigh, + EPinchSpeed, + EZoomCornerSize, + EEdgeScrollRange, + ECapacitiveUpUsed, + EPanDisabledWhileHovering, + EHoverDisabledWhilePanning, + EAdjustYPos, + EEnableFiltering, + EWServMessageInterception, + // + EGestureSettingsCount +}; + +struct TGestureArea +{ +public: + enum TShape + { + /// Use GestureArea settings from globally defined default + EDefaultSettings = -1, + ERectangle = 1, // == stmUiEventEngine::ERectangle, + ECircle = 2, // == stmUiEventEngine::ECircle, + EEllipse = 3 // == stmUiEventEngine::EEllipse + }; + + TShape iShape; + TInt iTimeout; + // At the moment iWidth is only used + TSize iSize; +}; + +/** + * Edge Scroll Type + */ +enum TEdgeScroll +{ + EEdgeScrollUp = 1, + EEdgeScrollDown, + EEdgeScrollLeft, + EEdgeScrollRight, + EEdgeScrollUnknown +}; + +/** + * Tap Type + */ +enum TTapType +{ + ETapTypeSingle = 1, + ETapTypeDouble +}; + +/** + * Zoom Type + */ +enum TZoomType +{ + EZoomUndefined = 0, + EZoomIn = 1, + EZoomOut = 2 +}; + +/** + * Direction Definition + */ +enum TGestureDirection +{ + ENoDirection = 0, + // + ENorth = 1, + ENorthEast, + EEast, + ESouthEast, + ESouth, + ESouthWest, + EWest, + ENorthWest, +}; + +/*! + * Generic gesture interface. The gestures + * contain a generic part and a gesture specific part + * is obtained using the getDetails() method. + * + */ +class MGestureIf +{ +public: + virtual TGestureUid gestureUid() const = 0; // Identifier of recognizer type that issues the gesture + virtual TPoint getLocation() const = 0 ; // Location where the gesture happened (if applicable) + virtual int getType() const = 0 ; // If the gesture can have different types (like tap or double tap) + virtual float getSpeedX() const __SOFTFP = 0 ; // px/msec, as calculated in the UI state machine, not valid in all cases + virtual float getSpeedY() const __SOFTFP = 0 ; // px/msec, as calculated in the UI state machine, not valid in all cases + virtual int getDetails() const = 0 ; // Other possible details.... + virtual TPtrC8 getGestureName() = 0 ; // String name for gesture, makes possible to use single callback for gestures + virtual TPoint getLengthAndDirection() const { return TPoint(0,0); } // very simple vector + virtual TGestureDirection getDirection() const { return stmGesture::ENoDirection; } + virtual TPoint getPinchEndPos() const { return TPoint(0,0); } +}; + +} // namespace + +#endif /* RT_GESTUREIF_H_ */ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/rt_gesturelistener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/rt_gesturelistener.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#ifndef RT_GESTURELISTENER_H_ +#define RT_GESTURELISTENER_H_ + +#include + +namespace stmGesture +{ +/*! + * The gesture listener interface. This interface needs to be implemented by the + * listener of the standard gestures implemented in the gesture framework. + */ +class MGestureListener +{ +public: + /*! + * The method that will be called by the gesture framework + * to inform about a gesture being recognised. + * \param theGesture: contains the recognised gesture. + * The MGestureIf contains generic part and gesture specific part + * so the listener needs to know how to handle specific gestures. + */ + virtual void gestureEnter(MGestureIf& theGesture) = 0 ; + /*! + * The method to inform the listener that the gesture has ended. + * This happens if another gesture is recognised or e.g. the Release UI + * event is handled. + * \note Some gestures produce only gestureEnter() callback and no gestureExit(). + */ + virtual void gestureExit(TGestureUid gestureUid) = 0 ; + /*! + * The listener needs to provide the target control (CCoeControl*) to the + * standard gestures. Since the gesture framework processes all events in the + * application, the gesture recognisers check whether the events are targeted + * to the listener owning control. + * Not all gesture recognisers need to perform this check. + * \return the owning CCoeControl of the gesture listener. + */ + virtual CCoeControl* getOwner() = 0 ; +}; + +} +#endif /* RT_GESTURELISTENER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/rt_gestureobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/rt_gestureobserver.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: RT Gesture helper interface +* +*/ + +#ifndef _RT_GESTUREOBSERVER_H_ +#define _RT_GESTUREOBSERVER_H_ + +#include + +namespace RT_GestureHelper +{ + +/// flag that indicates gesture code is a holding code +/// clients should use MGestureEvent::IsHolding +const TInt EFlagHold = 0x10000000; + +enum TGestureCode + { + // states + EGestureStart = 0x00000001, // gesture just started (user pressed stylus down) + EGestureDrag = 0x00000002, // user moved stylus (may be holding or not holding) + EGestureReleased = 0x00000003, // user lifted stylus while user was holding + // gestures + EGestureUnknown = 0x00000005, // gesture was not recognised + // these codes are sent when user lifts stylus (if holding not started) + EGestureTap = 0x00000006, + EGestureDoubleTap = 0x00000007, // only if double tap is enabled + // (via CGestureHelper::SetDoubleTapEnabled or + // CGestureControl::SetDoubleTapEnabled) + EGestureSwipeLeft = 0x00000008, + EGestureSwipeRight = 0x00000009, + EGestureSwipeUp = 0x0000000A, + EGestureSwipeDown = 0x0000000B, + + EGestureFlick = 0x0000000C, + EGestureLongTap = 0x0000000D, + EGestureDrop = 0x0000000E, + + // these codes are sent when user initiates holding by keeping stylus in + // same place for a longer duration + EGestureHoldLeft = EGestureSwipeLeft | EFlagHold, + EGestureHoldRight = EGestureSwipeRight | EFlagHold, + EGestureHoldUp = EGestureSwipeUp | EFlagHold, + EGestureHoldDown = EGestureSwipeDown | EFlagHold, + EGesturePinch + }; + +/** + * Point of float accuracy + */ +NONSHARABLE_STRUCT( TRealPoint ) + { + inline TRealPoint(); + inline TRealPoint( const TRealPoint& aPoint ); + inline TRealPoint( TReal aX, TReal aY ); + inline TBool operator==( const TRealPoint& aPoint ) const; + + TReal32 iX; + TReal32 iY; + }; + +/** + * a gesture event + */ + +enum TAxis + { + EAxisBoth, + EAxisHorizontal, + EAxisVertical + }; + + +class TGestureEvent +{ +public: + inline TGestureCode Code( TAxis /*aRelevantAxis*/ ) const { return iCode; }; + inline TBool IsHolding() const { return iIsHolding; }; + inline TPoint StartPos() const { return iStartPos; }; + inline TPoint CurrentPos() const { return iCurrPos; }; + inline TRealPoint Speed() const { return iSpeed; }; + inline TRealPoint SpeedPercent ( const TRect& /*aEdges*/ ) const { return iSpeedPercent; }; + inline TPoint Distance() const { return iDistance; }; + + inline void SetCurrentPos(TPoint aPos) { iCurrPos = aPos; }; + inline void SetStartPos(TPoint aPos) {iStartPos = aPos; }; + inline void SetCode(TGestureCode aCode) {iCode = aCode; }; + inline void SetSpeed(TRealPoint aSpeed) { iSpeed = aSpeed; }; + inline void SetDistance(TPoint aDistance) { iDistance = aDistance; }; + inline void SetSpeedPercent(TRealPoint aSpeedPercent) { iSpeedPercent = aSpeedPercent; }; + + inline void SetIsHolding(TBool aIsHolding) { iIsHolding = aIsHolding; }; + +private: + TGestureCode iCode; + TBool iIsHolding; + TPoint iStartPos; + TPoint iCurrPos; + TRealPoint iSpeed; + TRealPoint iSpeedPercent; + TPoint iDistance; +}; + + +// ---------------------------------------------------------------------------- +// Default constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint() + : iX( 0 ), iY( 0 ) + { + } + +// ---------------------------------------------------------------------------- +// Copy constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint( const TRealPoint& aPoint ) + : iX( aPoint.iX ), iY( aPoint.iY ) + { + } + +// ---------------------------------------------------------------------------- +// Copy constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint( TReal aX, TReal aY ) + : iX( aX ), iY( aY ) + { + } + +// ---------------------------------------------------------------------------- +// Default constructor for real point +// ---------------------------------------------------------------------------- +// +inline TBool TRealPoint::operator==( const TRealPoint& aPoint ) const + { + return iX == aPoint.iX && iY == aPoint.iY; + } + + +} // namespace RT_GestureHelper + +#endif // _RT_GESTUREOBSERVER_H_ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/rt_uievent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/rt_uievent.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,309 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef RT_UIEVENT_H_ +#define RT_UIEVENT_H_ + +// INCLUDES +#include +#include +#include +#include +#include + +#if defined(BRDO_MULTITOUCH_ENABLED_FF) +#define ADVANCED_POINTER_EVENTS +#endif + +namespace stmUiEventEngine +{ + +#if defined(ADVANCED_POINTER_EVENTS) +static const TInt KMaxNumberOfPointers(2) ; // How many pointer we have in multi-touch case +#else +static const TInt KMaxNumberOfPointers(1) ; // How many pointer we have in single touch case +#endif + +/*! + * Event code generated from the state machine + */ +enum TUiEventCode +{ + ETouch = 0x01, + EHold = 0x02, + EMove = 0x03, + ERelease= 0x04, + ENull = 0x05 +}; + +/*! + * Shape of the Area + */ +enum TAreaShape +{ + ERectangle = 1, + ECircle, + EEllipse +}; + +// for testingg/debugging purposes - string name og the code +const char* EventName(TUiEventCode aCode); + +/*! + * Interface class for Speed in X-Y direction + */ +class MUiEventSpeed +{ +public: + virtual float speedX() const __SOFTFP = 0; + virtual float speedY() const __SOFTFP = 0; +}; + +/*! + * Utility class to wrap number for (already evaluated) speed values. + */ +NONSHARABLE_CLASS(TUiEventSpeed): public MUiEventSpeed +{ +public: + TUiEventSpeed(float speedX, float speedY): m_speedX(speedX),m_speedY(speedY) {} + virtual float speedX() const __SOFTFP { return m_speedX; } + virtual float speedY() const __SOFTFP { return m_speedY; } + float m_speedX; + float m_speedY; +}; + +/*! + * The UI event interface, UI events are touch, hold, move and release. + * Note that currently the interface is not OS agnostic enough. It is using + * TPoint, TTimeIntervalMicroSeconds etc. types which should be replaced + * with some standard types/classes. + */ +class MUiEvent: public MUiEventSpeed +{ +public: + /*! + * The starting position of the gesture in _screen_ coordinates + */ + virtual const TPoint& StartPos() const = 0; + /*! + * Current position in _screen_ coordinates + */ + virtual const TPoint& CurrentXY() const = 0 ; + /*! + * Previous position in _screen_ coordinates + */ + virtual const TPoint& PreviousXY() const = 0 ; + /*! + * Time difference between this and previous UI event + */ + virtual TTimeIntervalMicroSeconds StateTransition() const = 0 ; + /*! + * true, if the UI event was generated because of timer expiration + */ + virtual bool TimerExpired() const = 0; + /*! + * The UI event code + */ + virtual TUiEventCode Code()const = 0 ; + /*! + * Target identifier (in practice the CCoeControl* of the window) + */ + virtual void* Target() const = 0 ; + /*! + * The index of the UI event. In single touch this is always 0 + */ + virtual int Index() const = 0 ; + /*! + * Next event in the gesture (with the same index) + */ + virtual MUiEvent* previousEvent() const = 0 ; + /*! + * Count of events in gesture + */ + virtual int countOfEvents() const = 0 ; + /*! + * Timestamp + */ + virtual TInt64 timestamp() const = 0 ; + /*! + * Speed. Speed is calculated based on the previous event. + */ + virtual float speedX() const __SOFTFP = 0 ; + /*! + * Speed. Speed is calculated based on the previous event. + */ + virtual float speedY() const __SOFTFP = 0 ; +}; + +/** + * Observer that will be notified when UI events have been recognised + */ +class MUiEventObserver +{ +public: + /** + * Handle the UI event + * \param aEvent event describing the event + */ + virtual void HandleUiEventL( const MUiEvent& aEvent ) = 0; +}; + +/*! The state machine interface. + * + * To be OS agnostic TPointerEvent, TRect etc. should be replaced with + * something else. + */ +class MStateMachine +{ +public: + /*! + * \return the rectangle containing the touch area. + * The shape of the touch area can be either rectangle, circle or ellipse. + * getTouchArea returns the current touch area, so it may be of zero size. + * During touch timer the method will return the TouchTimeArea, after that it + * will return the TouchArea. + */ + virtual TRect getTouchArea(TInt aPointerNumber = 0) = 0 ; + /*! + * \param fingersize_mm defines the width of the rectangle or the diameter of the circle/ellipse + * used for the touch area during touch timer running. If the initial touch is a "sloppy" one, + * there is very easily an extra move event detected during touch time. On the other hand + * after touch has been detected, the touch area should not be too big, just something suitable to + * filter minor movements out. The proposed solution is to define two touch areas: one to be used + * while touch timer is running, and another used after touch has been detected. + * The TouchTimeArea can be a bit larger to allow sloppy touch, then the TouchArea can be smaller to + * filter minor movements out. + */ + virtual void setTouchTimeArea(long fingersize_mm) = 0 ; + /*! + * \param fingersize_mm defines the width of the rectangle or the diameter of the circle/ellipse + * used for the touch area. + */ + virtual void setTouchArea(long fingersize_mm) = 0 ; + /*! + * get the touch area shape, either rectangle, circle or ellipse + */ + virtual TAreaShape getTouchAreaShape() = 0 ; + /*! + * set the touch area shape, either rectangle, circle or ellipse. This is the same for both of + * the touch areas. + */ + virtual void setTouchAreaShape(const TAreaShape shape) = 0 ; + /*! + * get the touch timeout. Touch timeout is the time after the first down event + * until the Touch UI event is generated. Touch timeout makes it possible to + * calculate an average of the first few points detected before generating the Touch UI event. + */ + virtual unsigned int getTouchTimeout() = 0 ; + /*! + * Set the touch timeout. + */ + virtual void setTouchTimeout(unsigned int) = 0 ; + /*! + * \return the rectangle containing the hold area. + * The shape of the hold area can be either rectangle, circle or ellipse. + * getholdArea returns the current hold area, so it may be of zero size. + */ + virtual TRect getHoldArea(TInt aPointerNumber = 0) = 0 ; + /*! + * \param fingersize_mm defines the width of the rectangle or the diameter of the circle/ellipse + * used for the hold area. Hold area defines an area so that if the touch coordinates stay + * inside that area for the duration of hold timeout the Hold UI event is generated. + */ + virtual void setHoldArea(long fingersize_mm) = 0 ; + /*! + * get the hold area shape, either rectangle, circle or ellipse + */ + virtual TAreaShape getHoldAreaShape() = 0 ; + /*! + * set the hold area shape, either rectangle, circle or ellipse + */ + virtual void setHoldAreaShape(const TAreaShape shape) = 0 ; + /*! + * get the hold timeout. The timeout defines how long the touch coordinates need to stay + * inside hold area before Hold UI event is generated. + */ + virtual unsigned int getHoldTimeout() = 0 ; + /*! + * Set the hold timeout. + */ + virtual void setHoldTimeout(unsigned int a) = 0 ; + /*! + * get the touch suppress timeout. This timeout defines how long it will take to generate + * the Release UI event after UP event during the touch timeout. This timeout is rather short + * but will cause the filtering of accidental UP/DOWN events during if they are close together. + */ + virtual unsigned int getTouchSuppressTimeout() = 0 ; + /*! + * Set the touch suppress timeout. + */ + virtual void setTouchSuppressTimeout(unsigned int a) = 0 ; + /*! + * get the move suppress timeout. This timeout is used after Move UI event has been generated to + * filter accidental UP/DOWN events. Using light touch it is possible to cause accidental UP/DOWN + * events with the timespan can be over 120 ms when the direction of movement changes. + */ + virtual unsigned int getMoveSuppressTimeout() = 0 ; + /*! + * set the move suppress timeout. + */ + virtual void setMoveSuppressTimeout(unsigned int a) = 0 ; + /*! + * add UI event observer. The generated UI events will be sent to the observers. + * \return false, if the max number of observers (=5) has been reached. + */ + virtual bool addUiEventObserver(MUiEventObserver* observer) = 0 ; + /*! + * remove the UI event observer. + */ + virtual bool removeUiEventObserver(MUiEventObserver* observer) = 0 ; + /*! + * \return true, of the message being processed did not generate UI event + */ + virtual bool wasLastMessageFiltered(TInt aPointerNumber = 0) = 0 ; + /*! + * enable capacitive UP message. If it is enabled, UP suppression is not used + * but the UP event causes immediate Release UI event. + */ + virtual void enableCapacitiveUp(bool enable) = 0 ; + /*! + * enable or disable debug logging of the state machine + * \param aEnable : logging enabled + */ + virtual void enableLogging(bool aEnable) = 0 ; + /*! + * add "window handles" to the list of targets which should be included + * in the gesture recognition. This way it is possible to drop the messges + * which are not of interest from the gesture recognition point of view. + * This is used when only the gesture recognition is used so that the UI events are + * not passed to the application. + */ + // virtual void addGestureTarget(void* aTarget) = 0 ; + + /*! + * Setting the Y adjustment useful in capacitive touch + * Note that there are problems with the adjustment if done at this level, + * the most proper place would be the window server. + */ + virtual void enableYadjustment(bool aEnable) = 0 ; + + /// Get the number of supported touch pointers + virtual int getNumberOfPointers() = 0; +}; + +} // namespace +#endif /* RT_UIEVENT_H_ */ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/stmgestureinterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/stmgestureinterface.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,300 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + + +#ifndef __STMGESTUREINTERFACE_H__ +#define __STMGESTUREINTERFACE_H__ + +#include +#include +#include +#include +#include + +// FORWARD DECLARATION +namespace stmGesture +{ + class CGestureFramework; + class MGestureRecogniserIf; +} + +class CStmGestureContext; +class MStmGestureListener; + +typedef stmGesture::MGestureIf MStmGesture; +typedef stmGesture::TGestureUid TStmGestureUid; +typedef stmGesture::MGestureListener MStmGestureEngineListener; +typedef stmGesture::MGestureRecogniserIf MStmGestureRecogniser; +typedef stmGesture::TGestureSettings TStmGestureSettings; +typedef stmGesture::TGestureAreaSettings TStmGestureAreaSettings; +typedef stmGesture::TGestureArea TStmGestureArea; + +///================================================================== + +/** + * Interface class for defining gesture settings parameters + */ +class MStmGestureParameters + { +public: + virtual TStmGestureArea* Area(TStmGestureAreaSettings aArea) = 0; + virtual TInt Param(TStmGestureSettings aParam) const = 0; + virtual TUint8 Enabled(TStmGestureUid aGesture) const = 0; + }; + +///================================================================== + +/** + * Class definition for gesture settings parameters + */ +NONSHARABLE_CLASS( CStmGestureParameters ): public CBase, public MStmGestureParameters + { +public: + /*! + * Constructors + */ + IMPORT_C CStmGestureParameters(); + IMPORT_C CStmGestureParameters(const CStmGestureParameters& aParams); + +public: //getter methods + + /*! + * To get the area settings + */ + TStmGestureArea* Area(TStmGestureAreaSettings aArea) { return &iAreaSettings[aArea]; } + + /*! + * To get Gesture params + */ + TInt Param(TStmGestureSettings aParam) const { return iParam[aParam]; } + + /*! + * Gesture enabled or not + */ + TUint8 Enabled(TStmGestureUid aGesture) const { return iEnabled[aGesture] != 0; } + +public: // setter methods + + /*! + * To set the parameters + */ + void SetParam(TStmGestureSettings aParam, TInt aValue) { iParam[aParam] = aValue; } + + /*! + * To enable or disble the gestures + */ + void SetEnabled(TStmGestureUid aGesture, TUint8 aParam) { iEnabled[aGesture] = aParam; } + + /*! + * Gesture settings + */ + TInt& operator[](TStmGestureSettings aParam) { return iParam[aParam]; } + +private: + TInt iParam[stmGesture::EGestureSettingsCount]; + TStmGestureArea iAreaSettings[stmGesture::EGestureAreaSettingsCount]; + TInt iModified; + TUint8 iEnabled[stmGesture::EStmGestureUid_Count]; + }; + +///================================================================== + +/** + * CStmGestureEngine Class Declaration + */ +NONSHARABLE_CLASS( CStmGestureEngine ): public CBase + { +public: + + /*! + * Gesture Engine Creation + */ + IMPORT_C static CStmGestureEngine* NewL(); + ~CStmGestureEngine(); + +public: + + /*! + * To Create a context in gesture engine + */ + IMPORT_C CStmGestureContext* CreateContextL(TInt aId); + + /*! + * To get the context + */ + IMPORT_C CStmGestureContext* Context(TInt aId); + + /*! + * Application use HandlePointerEventL API to pass the raw hardware events to the gesture library + */ + IMPORT_C void HandlePointerEventL(const TPointerEvent& aPointerEvent, void* target); + +private: + + /*! + * default constructor + */ + CStmGestureEngine(); + + /*! + * Two-phase constructor + */ + void ConstructL(); + +private: // used by friend class CStmGestureContext + + void EnableContextL(CStmGestureContext& aCtxt); + void DisableContextL(CStmGestureContext& aCtxt); + + template + void InitRecognizerL( T*& aGesture, CStmGestureContext& aContext, TBool aNewCOntext); + + void SetupRecognizersL(CStmGestureContext& aCtxt, TBool aNewContext); + +private: + friend class CStmGestureContext; + stmGesture::CGestureFramework* iGf; + // Registered/owned contexts + RPointerArray iContexts; + // Active set of contexts; latest added defines parameters + RPointerArray iCtxtStack; + // Global/default parameters + CStmGestureParameters* iConfig; + TBool iDtorPhase; + }; + +///================================================================== + +//Forward declaration +class CGestureEventSender; + +/** + * Gesture context represents a certain configuration of gesture parameters + * (including what gestures are enabled) and gesture listeners. + * Context can be created beforehand and reused later. + * The assumed use of a context is to have rough correspondence between + * UI view and enabled gestures. + * + * @note Gesture contexts are created by an instance of CStmGestureEngine. + */ + +class CStmGestureContext: public CBase, public MStmGestureEngineListener + { +public: + /*! + * Constructor + */ + CStmGestureContext(CStmGestureEngine& aEngine); + + ~CStmGestureContext(); + +public: /// Gesture listeners + + /*! + * Add listener to the gesture processing context. + * @param aListener Listener object + * @param aPos Position of inserted listener which determines order in which it receives gesture events (0 == first, before existing) + */ + IMPORT_C void AddListenerL(MStmGestureListener* aListener, TInt aPos = 0); + + /*! + * Remove listener from the gesture processing context. + * @param aListener Listener object + */ + IMPORT_C TInt RemoveListener(MStmGestureListener* aListener); + + /*! + * To get the list of listeners + */ + const RPointerArray& Listeners() const { return iListeners; } + +public: /// Context activation + + /*! + * To set the context configuration in Gesture Engine. + */ + IMPORT_C void SetContext(CCoeControl* aControl); + + /*! + * Initialize context configuration on the Gesture Engine. + */ + IMPORT_C void ActivateL(); + + /*! + * deactivate context configuration on the Gesture Engine. + */ + IMPORT_C void Deactivate(); + + /*! + * gesture configuration + */ + CStmGestureParameters& Config() { return *iConfig; } + + /*! + * Enable Logging + */ + void SetLogging(TInt aEnabled) { iLogging = aEnabled; } + + /*! + * Context control + */ + CCoeControl* ContextControl() { return iOwnerControl; } + + /*! + * is gesture context is active ? + */ + TBool IsActive() { return iActivated; } + + /*! + * Context id + */ + TInt Id() const { return iCtxtId; } + +public: // from MStmGestureEngineListener + + void gestureEnter(MStmGesture& aGesture); + void gestureExit(TStmGestureUid aGestureUid); + CCoeControl* getOwner(); + +private: + friend class CStmGestureEngine; + + void ConstructL(); + void DispatchGestureEventL(TStmGestureUid aUid, MStmGesture* aGesture); + void SuspendRecognizer(TStmGestureUid aUid); + void EnableRecognizersL(); + void EnableRecognizerL(TStmGestureUid aUid); + +private: + CStmGestureEngine& iEngine; + // Application-specific ID for finding context + TInt iCtxtId; + TBool iActivated; + CStmGestureParameters* iConfig; + CCoeControl* iOwnerControl; + //TBool iPinchUsed; + RPointerArray iListeners; + // for simplicity of addressing recognizers, we'll use fixed array + // with UID-based index (range 0..N is assumed for UIDs) + // @note Tap recognizer actually produces Tap and DoubleTap gesture, + // so should be handled carefully -- only Tap position is set + MStmGestureRecogniser* iRecognizers[stmGesture::EStmGestureUid_Count]; + TBool iLogging; + CGestureEventSender* iEventSender; + }; + +#endif diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/inc/stmgesturelistener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/inc/stmgesturelistener.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef __STMGESTURELISTENER_H__ +#define __STMGESTURELISTENER_H__ + +#include +#include + + +typedef stmGesture::MGestureIf MStmGesture; +typedef stmGesture::TGestureUid TStmGestureUid; +typedef stmGesture::TTapType TStmTapType; +typedef stmGesture::TGestureDirection TStmGestureDirection; + +/** + * Point of float accuracy + */ +NONSHARABLE_STRUCT( TRealPoint ) + { + inline TRealPoint(); + inline TRealPoint( const TRealPoint& aPoint ); + inline TRealPoint( TReal aX, TReal aY ); + inline TBool operator==( const TRealPoint& aPoint ) const; + + TReal32 iX; + TReal32 iY; + }; + +/** + * Enum to distinguish between Gesture Entry and Exit. + * Currently supported only for Pinch + */ +enum TStmGestureState { + EGestureEnter = 0, + EGestureExit + +}; + +/** + * Interface Class to the Application + */ + +class TStmGestureEvent +{ +public: + inline TStmGestureUid Code() const { return iGestureUid; }; + inline TPoint CurrentPos() const { return iCurrPos; }; + inline TRealPoint Speed() const { return iSpeed; }; + inline TStmTapType Type() const { return iType; }; + inline int Details() const { return iDetails; }; + inline TStmGestureDirection GestureDirection() const { return iDirection; }; + inline TPoint PinchEndPos() const { return iPinchEndPos; }; + inline TStmGestureState GestureState() const { return iGestureState; }; + + inline void SetCode(TStmGestureUid aGestureUid) { iGestureUid = aGestureUid; }; + inline void SetCurrentPos(TPoint aPos) { iCurrPos = aPos; }; + inline void SetSpeed(TRealPoint aSpeed) { iSpeed = aSpeed; }; + inline void SetType(TStmTapType aType) { iType = aType; }; + inline void SetDetails(int aDetails) { iDetails = aDetails; }; + inline void SetGestureDirection(TStmGestureDirection aDirection) { iDirection = aDirection; }; + inline void SetPinchEndPos(TPoint aPinchEndPos) { iPinchEndPos = aPinchEndPos; }; + inline void SetGestureState(TStmGestureState aGestureState) { iGestureState = aGestureState; }; + +private: + TStmGestureUid iGestureUid; // Code of the gesture + TPoint iCurrPos; // Current position where gesture occured + TRealPoint iSpeed; // speed X and speed Y + TStmTapType iType; // single-tap or double-tap + int iDetails; // details like pinch factor + TStmGestureDirection iDirection; // Gesture Direction + TPoint iPinchEndPos; // End of pinching position + TStmGestureState iGestureState; // Gesture State. currently supports only for pinch + +}; + +class MStmGestureListener + { +public: + /** + * Handle the gesture event + * @param aEvent event describing the gesture + */ + virtual void HandleGestureEventL(const TStmGestureEvent& aGesture) = 0; + }; + +// ---------------------------------------------------------------------------- +// Default constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint() + : iX( 0 ), iY( 0 ) + { + } + +// ---------------------------------------------------------------------------- +// Copy constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint( const TRealPoint& aPoint ) + : iX( aPoint.iX ), iY( aPoint.iY ) + { + } + +// ---------------------------------------------------------------------------- +// Copy constructor for real point +// ---------------------------------------------------------------------------- +// +inline TRealPoint::TRealPoint( TReal aX, TReal aY ) + : iX( aX ), iY( aY ) + { + } + +// ---------------------------------------------------------------------------- +// Default constructor for real point +// ---------------------------------------------------------------------------- +// +inline TBool TRealPoint::operator==( const TRealPoint& aPoint ) const + { + return iX == aPoint.iX && iY == aPoint.iY; + } + + +#endif // __ICS_GESTURELISTENER_H__ diff -r 6297cdf66332 -r d39add9822e2 web_plat/stmgesturefw_api/stmgesturefw_api.metaxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web_plat/stmgesturefw_api/stmgesturefw_api.metaxml Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,14 @@ + + + State Machine Gesture Framework API + Interface to State Machine Gesture Framework API + c++ + WebKitUtils + + + + + no + no + + diff -r 6297cdf66332 -r d39add9822e2 web_pub/download_mgr_ui_api/inc/CDownloadMgrUiDownloadsList.h --- a/web_pub/download_mgr_ui_api/inc/CDownloadMgrUiDownloadsList.h Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/download_mgr_ui_api/inc/CDownloadMgrUiDownloadsList.h Tue Feb 02 00:56:45 2010 +0200 @@ -149,6 +149,12 @@ * @return TBool */ inline TBool GetDownloadHide() { return iDownloadListHide; } +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + /** + * Adding Aiw Commands to the given MenuPane + */ + void AIWPlugInMenusL(TInt aResourceId,CEikMenuPane* aMenuPane); +#endif public: // Functions from CDownloadMgrUiBase diff -r 6297cdf66332 -r d39add9822e2 web_pub/download_mgr_ui_api/inc/DownloadsListDlgObserver.h --- a/web_pub/download_mgr_ui_api/inc/DownloadsListDlgObserver.h Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/download_mgr_ui_api/inc/DownloadsListDlgObserver.h Tue Feb 02 00:56:45 2010 +0200 @@ -65,6 +65,12 @@ * setting the downloadlist hide to the observer. */ virtual void SetDownloadListHide( TBool aHide ) = 0; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + /** + * Adding Aiw Commands for the given MenuPane to the observer. + */ + virtual void AIWPlugInMenusL(TInt aResourceId,CEikMenuPane* aMenuPane) = 0; +#endif }; #endif /* DOWNLOADSLISTDLGOBSERVER_H */ diff -r 6297cdf66332 -r d39add9822e2 web_pub/favourites_engine_api/tsrc/inc/FavouritesEngineTest.h --- a/web_pub/favourites_engine_api/tsrc/inc/FavouritesEngineTest.h Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/favourites_engine_api/tsrc/inc/FavouritesEngineTest.h Tue Feb 02 00:56:45 2010 +0200 @@ -1,25 +1,22 @@ /* -* ============================================================================== -* Name : favouritesenginetest.h -* Part of : ?Subsystem_name / FavouritesEngineTest -* -* Description : FavouritesEngineTest test module. -* Version: 0.5 +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * -* Copyright (C) 2002 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: * -* ============================================================================ +* Description: FavouritesEngineTest test module. +* */ + #ifndef FAVOURITESENGINETEST_H #define FAVOURITESENGINETEST_H diff -r 6297cdf66332 -r d39add9822e2 web_pub/favourites_engine_api/tsrc/src/FavouritesEngineTest.cpp --- a/web_pub/favourites_engine_api/tsrc/src/FavouritesEngineTest.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/favourites_engine_api/tsrc/src/FavouritesEngineTest.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,25 +1,22 @@ /* -* ============================================================================== -* Name : FavouritesEngineTest.cpp -* Part of : ?Subsystem_name / FavouritesEngineTest -* -* Description : FavouritesBCTest class member functions -* Version: 0.5 +* Copyright (c) 2006 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". * -* Copyright (C) 2006 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: * -* ============================================================================ +* Description: FavouritesBCTest class member functions +* */ + // INCLUDE FILES #include #include "favouritesenginetest.h" diff -r 6297cdf66332 -r d39add9822e2 web_pub/favourites_engine_api/tsrc/src/FavouritesItemTestCases.cpp --- a/web_pub/favourites_engine_api/tsrc/src/FavouritesItemTestCases.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/favourites_engine_api/tsrc/src/FavouritesItemTestCases.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,26 +1,23 @@ /* -* ============================================================================ -* Name: FavouritesItemTestCases.cpp -* Part of: FavouritesEngineTest class member functions -* -* Description: -* -* Version: 1.0 +* Copyright (c) 2008 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". * -* Copyright (C) 2008 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: * -* ============================================================================ +* Description: +* +* */ + // INCLUDE FILES #include #include "favouritesenginetest.h" diff -r 6297cdf66332 -r d39add9822e2 web_pub/favourites_engine_api/tsrc/src/FavouritesWapApTestCases.cpp --- a/web_pub/favourites_engine_api/tsrc/src/FavouritesWapApTestCases.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/web_pub/favourites_engine_api/tsrc/src/FavouritesWapApTestCases.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,26 +1,23 @@ /* -* ============================================================================ -* Name: FavouritesWapApTestCases.cpp -* Part of: FavouritesEngineTest class member functions -* -* Description: -* -* Version: 0.5 +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * -* Copyright (C) 2002 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: * -* ============================================================================ +* Description: +* +* */ + // INCLUDE FILES #include #include "favouritesenginetest.h" diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp --- a/webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/MemoryManager/Src/MemoryPool.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -633,7 +633,7 @@ } #ifdef __WINSCW__ -const TInt KMaxHeapSize = 0x2000000; // 32MB, on emulator +const TInt KMaxHeapSize = 0x1000000; // 32MB, on emulator #else const TInt KMaxHeapSize = 0x4000000; // 64MB, on hardware #endif diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebCore/platform/network/symbian/ResourceHandleManagerSymbian.cpp --- a/webengine/osswebengine/WebCore/platform/network/symbian/ResourceHandleManagerSymbian.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebCore/platform/network/symbian/ResourceHandleManagerSymbian.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -155,7 +155,7 @@ return; } if (errorCode) { - client->didFail(resource, ResourceError(String(), errorCode, String(), String())); + client->didFail(resource, ResourceError(String(), errorCode, resource->request().url().url(), String())); } else { client->didFinishLoading(resource); } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/formcontrols/WebFormFillPopup.cpp --- a/webengine/osswebengine/WebKit/s60/formcontrols/WebFormFillPopup.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/formcontrols/WebFormFillPopup.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -16,6 +16,7 @@ */ // INCLUDE FILES +#include #include <../bidi.h> #include @@ -271,8 +272,11 @@ { if (aListBox != m_listBox) return; - +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if (aEventType == EEventItemDoubleClicked || aEventType == EEventEnterKeyPressed || aEventType == EEventItemSingleClicked || aEventType == EEventEmptyAreaClicked) +#else if (aEventType == EEventItemDoubleClicked || aEventType == EEventEnterKeyPressed) +#endif { // get the selected item from listbox m_listBox->View()->UpdateSelectionL(CListBoxView::ESingleSelection); @@ -280,7 +284,8 @@ if (m_listBox->IsFocused()) { MakeVisible(EFalse); - m_callback->autoComplete(m_data[selected->At(0)]->Text()); + if(selected != NULL && m_data[selected->At(0)] ) + m_callback->autoComplete(m_data[selected->At(0)]->Text()); } } else if (aEventType == EEventPenDownOnItem) { diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/group/browserengine/browserengine.mmp --- a/webengine/osswebengine/WebKit/s60/group/browserengine/browserengine.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/group/browserengine/browserengine.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -134,7 +134,7 @@ #endif // BRDO_TOUCH_ENABLED_FF #ifdef BRDO_USE_GESTURE_HELPER -LIBRARY rt_gesturehelper.lib +LIBRARY stmgesturefw.lib #endif // BRDO_USE_GESTURE_HELPER #if defined(GCCE) STATICLIBRARY edllstub.lib diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/group/webkit/webkit.mmp --- a/webengine/osswebengine/WebKit/s60/group/webkit/webkit.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/group/webkit/webkit.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -41,6 +41,8 @@ SOURCE BrCtlDialogsProviderUtils.cpp SOURCE WebToolBarInterface.cpp SOURCE WebDataLoadConsumer.cpp +SOURCE WebGestureInterface.cpp +SOURCE WebPagePinchZoomHandler.cpp SOURCE WebPageFullScreenHandler.cpp SOURCE WebPageScrollHandler.cpp diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -831,17 +831,9 @@ if (m_instance && m_pluginfuncs) { - NetscapePlugInStreamLoaderClient* pluginloader = NetscapePlugInStreamLoaderClient::NewL(url, this, core(m_frame), notifydata); + NetscapePlugInStreamLoaderClient* pluginloader = NetscapePlugInStreamLoaderClient::NewL(url, this, core(m_frame), notifydata, notify); if (pluginloader) { - pluginloader->start(); - - if ( notify ) { - HBufC* url16 = HBufC::NewLC( url.Length() ); - url16->Des().Copy( url ); - m_pluginfuncs->urlnotify( m_instance, *url16, NPRES_DONE, notifydata ); - CleanupStack::PopAndDestroy(url16); - } - + pluginloader->start(); } } } @@ -923,17 +915,9 @@ if (loadmode == ELoadModePlugin ) { if (m_instance && m_pluginfuncs) { - NetscapePlugInStreamLoaderClient* pluginloader = NetscapePlugInStreamLoaderClient::NewL(request, this, core(m_frame), notifydata); + NetscapePlugInStreamLoaderClient* pluginloader = NetscapePlugInStreamLoaderClient::NewL(request, this, core(m_frame), notifydata, notify); if (pluginloader) { - pluginloader->start(); - - if ( notify ) { - HBufC* url16 = HBufC::NewLC( url.Length() ); - url16->Des().Copy( url ); - m_pluginfuncs->urlnotify( m_instance, *url16, NPRES_DONE, notifydata ); - CleanupStack::PopAndDestroy(url16); - } - + pluginloader->start(); } } } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginStream.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginStream.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginStream.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -203,7 +203,7 @@ } -void PluginStream::destroyStream(int reason) +void PluginStream::destroyStream(int reason, TDesC* failedUrl) { if (m_streamDestroyed) return; m_streamDestroyed = true; @@ -235,8 +235,17 @@ } - if ( m_pluginskin->getNPPluginFucs() && m_pluginskin->getNPPluginFucs()->destroystream ) { - m_pluginskin->getNPPluginFucs()->destroystream( m_pluginskin->getNPP(), m_stream, npreason); + if ( m_pluginskin->getNPPluginFucs() ) { + + if (m_stream && m_pluginskin->getNPPluginFucs()->destroystream){ + m_pluginskin->getNPPluginFucs()->destroystream( m_pluginskin->getNPP(), m_stream, npreason); + if (m_loaderclient->notify() && m_pluginskin->getNPPluginFucs()->urlnotify) + m_pluginskin->getNPPluginFucs()->urlnotify( m_pluginskin->getNPP(), m_stream->url->Des(), npreason, m_notifydata); + } + + if(!m_stream && m_loaderclient->notify() && failedUrl && m_pluginskin->getNPPluginFucs()->urlnotify){ + m_pluginskin->getNPPluginFucs()->urlnotify( m_pluginskin->getNPP(), *failedUrl, npreason, m_notifydata); + } } if (reason == KErrNone) { diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginStream.h --- a/webengine/osswebengine/WebKit/s60/plugins/PluginStream.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginStream.h Tue Feb 02 00:56:45 2010 +0200 @@ -39,7 +39,7 @@ public: void createNPStreamL(TPtrC8 url, TPtrC16 mimetype, long long length); void writeStreamL(const char* data, int length); - void destroyStream(int reason); + void destroyStream(int reason, TDesC* failedUrl=NULL); void close(); private: diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -36,28 +36,28 @@ using namespace WebCore; -NetscapePlugInStreamLoaderClient* NetscapePlugInStreamLoaderClient::NewL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata) +NetscapePlugInStreamLoaderClient* NetscapePlugInStreamLoaderClient::NewL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata, TBool notify/*=EFalse*/) { NetscapePlugInStreamLoaderClient* self = new (ELeave) NetscapePlugInStreamLoaderClient(); CleanupStack::PushL( self ); - self->ConstructL( url, pluginskin, frame, notifydata ); + self->ConstructL( url, pluginskin, frame, notifydata, notify ); CleanupStack::Pop(); return self; } -NetscapePlugInStreamLoaderClient* NetscapePlugInStreamLoaderClient::NewL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata) +NetscapePlugInStreamLoaderClient* NetscapePlugInStreamLoaderClient::NewL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata, TBool notify/*=EFalse*/) { NetscapePlugInStreamLoaderClient* self = new (ELeave) NetscapePlugInStreamLoaderClient(); CleanupStack::PushL( self ); - self->ConstructL( request, pluginskin, frame, notifydata ); + self->ConstructL( request, pluginskin, frame, notifydata, notify ); CleanupStack::Pop(); return self; } -void NetscapePlugInStreamLoaderClient::ConstructL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata) +void NetscapePlugInStreamLoaderClient::ConstructL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata, TBool notify/*=EFalse*/) { m_loader = 0; m_request = 0; @@ -65,6 +65,7 @@ m_pluginskin = pluginskin; m_notifydata = notifydata; m_frame = frame; + m_notify = notify; m_pluginstream = new (ELeave) PluginStream(pluginskin, this, notifydata); m_request = new (ELeave) ResourceRequest(m_frame->loader()->completeURL(url)); @@ -80,7 +81,7 @@ m_loader->setShouldBufferData(false); } -void NetscapePlugInStreamLoaderClient::ConstructL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata) +void NetscapePlugInStreamLoaderClient::ConstructL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata, TBool notify/*=EFalse*/) { m_loader = 0; @@ -89,6 +90,7 @@ m_pluginskin = pluginskin; m_notifydata = notifydata; m_frame = frame; + m_notify = notify; m_pluginstream = new (ELeave) PluginStream(pluginskin, this, notifydata); m_request = new (ELeave) ResourceRequest(request.url()); @@ -154,8 +156,6 @@ void NetscapePlugInStreamLoaderClient::cancelWithError(const ResourceError& error) { if (m_loader && !m_loader->isDone()){ - if(m_pluginskin && m_pluginskin->getNPPluginFucs()) - m_pluginskin->getNPPluginFucs()->urlnotify(m_pluginskin->m_instance, error.failingURL(), NPRES_NETWORK_ERR, m_notifydata); m_loader->cancel(error); } } @@ -200,14 +200,22 @@ void NetscapePlugInStreamLoaderClient::didFail(const ResourceError& error) { if (m_pluginstream) { - m_pluginstream->destroyStream(error.errorCode() ? error.errorCode() : KErrCancel); + int err = error.errorCode() ? error.errorCode() : KErrCancel; + HBufC* failedURL = HBufC::NewLC(error.failingURL().length()); + failedURL->Des().Copy(error.failingURL()); + m_pluginstream->destroyStream(err, failedURL); + CleanupStack::PopAndDestroy(failedURL); } } void NetscapePlugInStreamLoaderClient::didCancel(const ResourceError& error) { if (m_pluginstream) { - m_pluginstream->destroyStream(error.errorCode() ? error.errorCode() : KErrCancel); + int err = error.errorCode() ? error.errorCode() : KErrCancel; + HBufC* failedURL = HBufC::NewLC(error.failingURL().length()); + failedURL->Des().Copy(error.failingURL()); + m_pluginstream->destroyStream(err, failedURL); + CleanupStack::PopAndDestroy(failedURL); } } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.h --- a/webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginStreamLoaderClient.h Tue Feb 02 00:56:45 2010 +0200 @@ -51,8 +51,8 @@ { public: - static NetscapePlugInStreamLoaderClient* NewL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata = 0); - static NetscapePlugInStreamLoaderClient* NewL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata=0); + static NetscapePlugInStreamLoaderClient* NewL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata = 0, TBool notify = EFalse); + static NetscapePlugInStreamLoaderClient* NewL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata=0, TBool notify = EFalse); virtual ~NetscapePlugInStreamLoaderClient(); void start(); @@ -65,10 +65,11 @@ void didFinishLoading(); void didFail(const ResourceError& error); void didCancel(const ResourceError& error); + TBool notify() { return m_notify; } private: - void ConstructL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata = 0); - void ConstructL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata=0); + void ConstructL(const String& url, PluginSkin* pluginskin, Frame* frame, void* notifydata = 0, TBool notify = EFalse); + void ConstructL(const ResourceRequest& request, PluginSkin* pluginskin, Frame* frame, void* notifydata=0, TBool notify = EFalse); NetscapePlugInStreamLoaderClient(); @@ -80,6 +81,7 @@ PluginSkin* m_pluginskin; // not owned void* m_notifydata; // not owned int m_error; + TBool m_notify; }; diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -45,8 +45,11 @@ #include "WebPageScrollHandler.h" #include "WebKitLogger.h" +#include + using namespace WebCore; using namespace RT_GestureHelper; +using namespace stmGesture; // CONSTANTS const TInt KPluginGranularity = 3; _LIT(KPath,"c:\\system\\temp\\"); @@ -716,24 +719,74 @@ { CBrCtl* brCtl = control(m_pluginskin->frame()); WebView* view = brCtl->webView(); - TPointerEvent event(aEvent); - - if (!StaticObjectsContainer::instance()->isPluginFullscreen()) { - event.iPosition = aEvent.iPosition - view->PositionRelativeToScreen(); +#ifdef BRDO_MULTITOUCH_ENABLED_FF + if (aEvent.IsAdvancedPointerEvent()) { + TAdvancedPointerEvent tadvp = *(static_cast(&aEvent)); + if (!StaticObjectsContainer::instance()->isPluginFullscreen()) { + tadvp.iPosition = aEvent.iPosition - view->PositionRelativeToScreen(); + } + view->pointerEventHandler()->HandlePointerEventL(tadvp); } - view->pointerEventHandler()->HandlePointerEventL(event); + else { +#endif + TPointerEvent event(aEvent); + if (!StaticObjectsContainer::instance()->isPluginFullscreen()) { + event.iPosition = aEvent.iPosition - view->PositionRelativeToScreen(); + } + view->pointerEventHandler()->HandlePointerEventL(event); +#ifdef BRDO_MULTITOUCH_ENABLED_FF + } +#endif } -TBool PluginWin::HandleGesture(const TGestureEvent& aEvent) +TBool PluginWin::HandleGesture(const TStmGestureEvent& aEvent) { TBool ret = EFalse; + + TGestureEvent eventForPlugin; + switch(aEvent.Code()) + { + case EGestureUidUnknown : + eventForPlugin.SetCode(EGestureUnknown); + break; + case EGestureUidTouch : + eventForPlugin.SetCode(EGestureStart); + break; + case EGestureUidTap : + if(aEvent.Type() == ETapTypeSingle) + eventForPlugin.SetCode(EGestureTap); + else + eventForPlugin.SetCode(EGestureDoubleTap); + break; + case EGestureUidLongPress : + eventForPlugin.SetCode(EGestureLongTap); + break; + case EGestureUidPan : + eventForPlugin.SetCode(EGestureDrag); + break; + case EGestureUidRelease : + eventForPlugin.SetCode(EGestureReleased); + break; + case EGestureUidFlick : + eventForPlugin.SetCode(EGestureFlick); + break; + case EGestureUidPinch : + eventForPlugin.SetCode(EGesturePinch); + break; + default : + break; + + } + + + if (m_control) { - TGestureEvent gestEvent(aEvent); CBrCtl* brCtl = control(m_pluginskin->frame()); WebView* view = brCtl->webView(); TPoint newPos = aEvent.CurrentPos(); - TPoint startPos = aEvent.StartPos(); + // Not sure plugins need the start position of the gesture. Not inlcuded in the new struct + TPoint startPos = aEvent.CurrentPos(); TPoint viewPos = view->PositionRelativeToScreen(); TPoint ctrlPos = m_control->PositionRelativeToScreen(); @@ -741,35 +794,50 @@ // adjust the position to make it relative to top left corner of newPos += viewPos; startPos += viewPos; - gestEvent.SetCurrentPos(newPos); - gestEvent.SetStartPos(startPos); } - - if (StaticObjectsContainer::instance()->isPluginFullscreen() || + eventForPlugin.SetCurrentPos(newPos); + eventForPlugin.SetStartPos(startPos); + if (StaticObjectsContainer::instance()->isPluginFullscreen() || m_control->Rect().Contains(newPos - ctrlPos)) { NPEvent event; NPEventPointer ev; event.event = ENppEventPointer; - ev.reserved = &gestEvent; + ev.reserved = &eventForPlugin; ev.pointerEvent = NULL; event.param = &ev; ret = m_pluginskin->getNPPluginFucs()->event(m_pluginskin->getNPP(), static_cast(&event)); + + if (eventForPlugin.Code(EAxisBoth) == EGestureTap) { + eventForPlugin.SetCode(EGestureReleased); + ret = m_pluginskin->getNPPluginFucs()->event(m_pluginskin->getNPP(), + static_cast(&event)); + + } } } else if(!m_windowedPlugin && m_pluginskin->getNPPluginFucs() && m_pluginskin->getNPPluginFucs()->event){ TRect cliprect = m_pluginskin->getClipRect(); - TPoint newpos = aEvent.CurrentPos(); - if(cliprect.Contains(newpos)){ - TGestureEvent gestEvent(aEvent); + TPoint newPos = aEvent.CurrentPos(); + eventForPlugin.SetCurrentPos(newPos); + eventForPlugin.SetCurrentPos(newPos); + + if(cliprect.Contains(newPos)){ NPEvent event; NPEventPointer ev; event.event = ENppEventPointer; - ev.reserved = &gestEvent; + ev.reserved = &eventForPlugin; ev.pointerEvent = NULL; event.param = &ev; ret = m_pluginskin->getNPPluginFucs()->event(m_pluginskin->getNPP(), static_cast(&event)); + + if (eventForPlugin.Code(EAxisBoth) == EGestureTap) { + eventForPlugin.SetCode(EGestureReleased); + ret = m_pluginskin->getNPPluginFucs()->event(m_pluginskin->getNPP(), + static_cast(&event)); + + } } } return ret; diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/plugins/PluginWin.h --- a/webengine/osswebengine/WebKit/s60/plugins/PluginWin.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginWin.h Tue Feb 02 00:56:45 2010 +0200 @@ -26,6 +26,7 @@ #include #include #include +#include // FORWARD DECLARATIONS class PluginSkin; @@ -478,7 +479,7 @@ void ToggleScreenMode(bool aFullScreen); void PlayPausePluginL (); void HandlePointerEventFromPluginL(const TPointerEvent& aEvent); - TBool HandleGesture(const RT_GestureHelper::TGestureEvent& aEvent); + TBool HandleGesture(const TStmGestureEvent& aEvent); TBool Windowed() { return m_windowedPlugin;} protected: // New functions diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp --- a/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -2467,9 +2467,3 @@ -void CBrCtl::HandlePointerBufferReadyL() -{ - m_webView->HandlePointerBufferReadyL(); -} - - diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/BrCtl.h --- a/webengine/osswebengine/WebKit/s60/webview/BrCtl.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/BrCtl.h Tue Feb 02 00:56:45 2010 +0200 @@ -589,7 +589,6 @@ /** * From CCoeControl */ - void HandlePointerBufferReadyL(); MBrCtlSpecialLoadObserver* brCtlSpecialLoadObserver() const { return m_brCtlSpecialLoadObserver; } MBrCtlDownloadObserver* brCtlDownloadObserver(); MBrCtlLinkResolver* brCtlLinkResolver() const { return m_brCtlLinkResolver; } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/PageView.cpp --- a/webengine/osswebengine/WebKit/s60/webview/PageView.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/PageView.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -18,6 +18,7 @@ // INCLUDE FILES +#include #include <../bidi.h> #include "PageView.h" #include @@ -88,8 +89,15 @@ // Destructor CPageView::~CPageView() { - m_webView->pageScaler()->SetVisible(EFalse); - m_webView->pageScaler()->SetFullScreenMode(EFalse); +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + if (m_webView && m_webView->pageScaler()) + { +#endif + m_webView->pageScaler()->SetVisible(EFalse); + m_webView->pageScaler()->SetFullScreenMode(EFalse); +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + } +#endif } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.h --- a/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.h Tue Feb 02 00:56:45 2010 +0200 @@ -132,12 +132,12 @@ void HandleMaskedDeleteText(WebCore::Frame* frame); bool IsWapMaskedModeInput(WebCore::Frame* frame); void FocusChanging(); + void EnableCcpuL(); private: void findPrevSiblingTextLen(Node*, TInt&) const; Node* findTextNodeForCurPos(Node* aNode, TInt& aPos) const; void setSCTAvailability(bool aAvailable); - void EnableCcpuL(); private: CState* m_state; diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -37,7 +37,6 @@ #include "WebKitLogger.h" using namespace WebCore; -using namespace RT_GestureHelper; // constants const int KPageOverviewScrollPeriodic = 20 * 1000; // Update frequently for faster, smoother scrolling const int KMicroInterval = 300000; @@ -605,9 +604,9 @@ } -void WebPageScrollHandler::handleScrollingGH(const TGestureEvent& aEvent) +void WebPageScrollHandler::handleScrollingGH(const TStmGestureEvent& aGesture) { - TPoint newPos = aEvent.CurrentPos(); + TPoint newPos = aGesture.CurrentPos(); m_currentPosition = newPos; if (m_webView->inPageViewMode()) { if (!m_pageOverviewScrollPeriodic->IsActive()){ @@ -623,9 +622,9 @@ } -void WebPageScrollHandler::handleTouchDownGH(const TGestureEvent& aEvent) +void WebPageScrollHandler::handleTouchDownGH(const TStmGestureEvent& aGesture) { - TPoint newPos = aEvent.CurrentPos(); + TPoint newPos = aGesture.CurrentPos(); m_lastMoveEventTime = 0; m_lastPosition = newPos; m_currentPosition = newPos; @@ -640,10 +639,10 @@ } -void WebPageScrollHandler::handleTouchUpGH(const TGestureEvent& aEvent) +void WebPageScrollHandler::handleTouchUpGH(const TStmGestureEvent& aGesture) { bool decelDoesScrollbars = false; - TPoint newPos = aEvent.CurrentPos(); + TPoint newPos = aGesture.CurrentPos(); if (m_webView->inPageViewMode()) { if (m_pageOverviewScrollPeriodic->IsActive()){ @@ -657,7 +656,7 @@ else { m_scrollTimer->Cancel(); m_lastPosition = TPoint(0, 0); - decelDoesScrollbars = startDeceleration(aEvent); + decelDoesScrollbars = startDeceleration(aGesture); if (m_webView->viewIsScrolling()) { Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame(); @@ -675,10 +674,10 @@ } -bool WebPageScrollHandler::startDeceleration(const TGestureEvent& aEvent) +bool WebPageScrollHandler::startDeceleration(const TStmGestureEvent& aGesture) { bool started = false; - TRealPoint gstSpeed = aEvent.Speed(); + TRealPoint gstSpeed = aGesture.Speed(); if (Abs(gstSpeed.iX / gstSpeed.iY) <= KTanOfThresholdAngle) { gstSpeed.iX = 0; } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.h --- a/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.h Tue Feb 02 00:56:45 2010 +0200 @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "WebScrollingDecelerator.h" @@ -180,9 +180,9 @@ static int pageOverviewScrollCallback( TAny* aPtr ); //static int handleScrollTimerEventCallback( TAny* ptr); void scrollPageOverviewGH(); - void handleScrollingGH(const RT_GestureHelper::TGestureEvent& aEvent); - void handleTouchDownGH(const RT_GestureHelper::TGestureEvent& aEvent); - void handleTouchUpGH(const RT_GestureHelper::TGestureEvent& aEvent); + void handleScrollingGH(const TStmGestureEvent& aGesture); + void handleTouchDownGH(const TStmGestureEvent& aGesture); + void handleTouchUpGH(const TStmGestureEvent& aGesture); void updateScrollbars(const TPoint& scrollPos, TPoint& newscrollDelta); public: @@ -193,7 +193,7 @@ bool calculateScrollableElement(const TPoint& aNewPosition); void scrollPageOverview(const TPointerEvent& pointerEvent); - bool startDeceleration(const RT_GestureHelper::TGestureEvent& aEvent); + bool startDeceleration(const TStmGestureEvent& aGesture); private: // Pointer to owning view diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: +* Description: * */ @@ -64,11 +64,12 @@ #include "CSSStyleSelector.h" #include "CSSValueKeywords.h" #include "Settings.h" +#include "WebGestureInterface.h" +#include "WebPagePinchZoomHandler.h" #include "WebKitLogger.h" using namespace WebCore; using namespace EventNames; -using namespace RT_GestureHelper; static const int KMinScrollAndTapInterval = 200000; // 200 ms static const int KDoubleTapMinActivationInterval = 100000; // 100 ms @@ -97,7 +98,8 @@ m_isHighlighted(false), m_highlightedNode(NULL), m_buttonDownTimer( this, &WebPointerEventHandler::buttonDownTimerCB ), - m_ignoreTap(false) + m_ignoreTap(false), + m_gestureInterface(NULL) { } @@ -106,7 +108,7 @@ //----------------------------------------------------------------------------- WebPointerEventHandler::~WebPointerEventHandler() { - delete m_gestureHelper; + delete m_gestureInterface; delete m_waiter; } @@ -115,130 +117,115 @@ //----------------------------------------------------------------------------- void WebPointerEventHandler::ConstructL() { -#ifdef BRDO_USE_GESTURE_HELPER - m_gestureHelper = CGestureHelper::NewL( *this ); - m_gestureHelper->SetDoubleTapEnabled(true); - m_gestureHelper->SetHoldingEnabled(false); +#ifdef BRDO_USE_GESTURE_HELPER + m_gestureInterface = WebGestureInterface::NewL(m_webview); #else - m_gestureHelper = NULL; -#endif + m_gestureInterface = NULL; +#endif m_waiter = new(ELeave) CActiveSchedulerWait(); } -/** - * EGestureStart is sent on touch down - * EGestureReleased is sent on touch up - * EGestureTap = touch down + touch up - events sent: EGestureStart, EGestureTap - * EGestureReleased - * EGestureDrag = touch down + "move" - events sent: EGestureStart, EGestureDrag - * EGestureDoubleTap = 2 * (touch down + touch up) - events sent EGestureStart, - * EGestureDoubleTap, EGestureReleased - * EGestureLongTap = touch down + "long touch" - events sent: EGestureStart, - * EGestureLongTap - * EGestureSwipe - drag + touch up, where movements is - * close to particular direction - event sent: EGestureSwipe, - * EGestureReleased - * EGestureFlick - "fast" drag + touch up - events sent: EGestureFlick, - * EGestureReleased - * EGestureDrop - drag + touch up, !(EGestureSwipe || EGestureFlick) - events - * sent: EGestureDrop, EGestureReleased - */ -void WebPointerEventHandler::HandleGestureL( const TGestureEvent& aEvent ) + + +// ====================================================================== +// WebPointerEventHandler::HandleGestureEventL +// ====================================================================== +void WebPointerEventHandler::HandleGestureEventL(const TStmGestureEvent& aGesture) { - TGestureCode gtype = aEvent.Code(EAxisBoth); - + TStmGestureUid uid = aGesture.Code(); + + if (m_webview->pinchZoomHandler()->isPinchActive() && uid != stmGesture::EGestureUidPinch) + return; + TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); - + PluginSkin* plugin = m_webview->mainFrame()->focusedPlugin(); if (plugin && plugin->pluginWin()) { - if (plugin->pluginWin()->HandleGesture(aEvent)) { + if (plugin->pluginWin()->HandleGesture(aGesture)) { if(!plugin->isActive()) plugin->activate(); - return; - } + return; + } } - updateCursor(aEvent.CurrentPos()); + + updateCursor(aGesture.CurrentPos()); if (IS_TABBED_NAVIGATION) { - m_webview->tabbedNavigation()->updateCursorPosition(aEvent.CurrentPos()); + m_webview->tabbedNavigation()->updateCursorPosition(aGesture.CurrentPos()); } - switch (gtype) { - // sent on touch down - case EGestureStart: - { - if (m_webview->viewIsScrolling()) { - m_ignoreTap = true; - m_webview->pageScrollHandler()->handleTouchDownGH(aEvent); - } - else { - handleTouchDownL(aEvent); - } - break; - } - - // sent on tap - case EGestureTap: - { - if (!m_ignoreTap) { - handleTapL(aEvent); - } - break; - } - - // sent on double tap - case EGestureDoubleTap: - { - handleDoubleTap(aEvent); - break; - } - - // sent on long tap - case EGestureLongTap: - { - break; - } + + + switch(uid) { + case stmGesture::EGestureUidTouch: + { + if (m_webview->viewIsScrolling()) { + m_ignoreTap = true; + m_webview->pageScrollHandler()->handleTouchDownGH(aGesture); + } + else { + handleTouchDownL(aGesture); + } + break; + } + + + case stmGesture::EGestureUidTap: + { + if (aGesture.Type() == stmGesture::ETapTypeSingle) { + if (!m_ignoreTap) { + handleTapL(aGesture); + } + } + else { + handleDoubleTap(aGesture); + } + + break; + } - // sent on touch up after drag - case EGestureDrop: - case EGestureFlick: - case EGestureSwipeLeft: - case EGestureSwipeRight: - case EGestureSwipeUp: - case EGestureSwipeDown: - { - m_ignoreTap = false; - if (!IS_NAVIGATION_NONE) { - handleTouchUp(aEvent); - } - else { - Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame(); - m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Up, m_highlightPos, frm); - } - break; - } - // sent on move - case EGestureDrag: - { - handleMove(aEvent); - break; - } - - // sent on touch up after tap double tap and long tap - case EGestureReleased: - { - m_ignoreTap = false; - handleTouchUp(aEvent); - break; - } + case stmGesture::EGestureUidRelease: + { + m_ignoreTap = false; + handleTouchUp(aGesture); + break; + } + + case stmGesture::EGestureUidPan: + { + handleMove(aGesture); + break; + } + case stmGesture::EGestureUidFlick: + { + m_ignoreTap = false; + if (!IS_NAVIGATION_NONE) { + handleTouchUp(aGesture); + } + else { + Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame(); + m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Up, m_highlightPos, frm); + } + break; + } + + case stmGesture::EGestureUidPinch: + { + handlePinchZoomL(aGesture); + break; + } + default: + break; + } + return; } // ====================================================================== // WebPointerEventHandler::handleTap // ====================================================================== -void WebPointerEventHandler::handleTapL(const TGestureEvent& aEvent) +void WebPointerEventHandler::handleTapL(const TStmGestureEvent& aGesture) { m_buttonDownTimer.stop(); - m_lastTapEvent = m_currentEvent; + m_lastTapEvent = m_currentEvent; if(!m_webview->inPageViewMode()){ doTapL(); } @@ -246,12 +233,12 @@ // ====================================================================== // WebPointerEventHandler::handleDoubleTap //====================================================================== -void WebPointerEventHandler::handleDoubleTap(const TGestureEvent& aEvent) +void WebPointerEventHandler::handleDoubleTap(const TStmGestureEvent& aGesture) { if ( !m_webview->viewIsScrolling() && (m_webview->brCtl()->capabilities() & TBrCtlDefs::ECapabilityFitToScreen)) { if (m_isHighlighted){ - dehighlight(); + dehighlight(); } m_webview->setZoomLevelAdaptively(); } @@ -263,20 +250,20 @@ // ====================================================================== // WebPointerEventHandler::handleTouchDownL //====================================================================== -void WebPointerEventHandler::handleTouchDownL(const TGestureEvent& aEvent) +void WebPointerEventHandler::handleTouchDownL(const TStmGestureEvent& aGesture) { TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); PluginSkin* pluginToActivate = pluginHandler->pluginToActivate(); m_buttonDownEvent = m_currentEvent; - m_highlightPos = aEvent.CurrentPos(); - + m_highlightPos = aGesture.CurrentPos(); + if ( !m_buttonDownTimer.isActive() && !m_webview->inPageViewMode()){ - m_buttonDownTimer.startOneShot(0.1f); + m_buttonDownTimer.startOneShot(0.1f); } if (!IS_NAVIGATION_NONE) { - m_webview->pageScrollHandler()->handleTouchDownGH(aEvent); + m_webview->pageScrollHandler()->handleTouchDownGH(aGesture); } if ( TBrCtlDefs::EElementActivatedObjectBox == elType) { @@ -290,43 +277,43 @@ } } } - + /* - * After introducing "link selection" pointer down action is done in - * buttondown timer callback. When "down" gesture event is arrived we start - * timer end exit, so gesture helper is ready to deliver next gesture event. - * Meanwhile the processing of the first gesture event hasn't been finished yet. - * The gesture helper doesn't "know" about our plans to handle the event inside - * timer callback and only way for us to "tell" about this is to stop RunL() - * of CGestureEventSender (HandleGestureL() is inside it) and finish buttondown - * timer callback first. - */ + * After introducing "link selection" pointer down action is done in + * buttondown timer callback. When "down" gesture event is arrived we start + * timer end exit, so gesture helper is ready to deliver next gesture event. + * Meanwhile the processing of the first gesture event hasn't been finished yet. + * The gesture helper doesn't "know" about our plans to handle the event inside + * timer callback and only way for us to "tell" about this is to stop RunL() + * of CGestureEventSender (HandleGestureL() is inside it) and finish buttondown + * timer callback first. + */ if ( m_buttonDownTimer.isActive()){ - m_waiter->Start(); + m_waiter->Start(); } } // ====================================================================== -// WebPointerEventHandler::handleTouchUp +// WebPointerEventHandler::handleTouchUp // ====================================================================== -void WebPointerEventHandler::handleTouchUp(const TGestureEvent& aEvent) +void WebPointerEventHandler::handleTouchUp(const TStmGestureEvent& aGesture) { m_highlightPos = TPoint(-1,-1); m_highlightedNode = NULL; PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); pluginHandler->setPluginToActivate(NULL); if (!IS_NAVIGATION_NONE) { - m_webview->pageScrollHandler()->handleTouchUpGH(aEvent); + m_webview->pageScrollHandler()->handleTouchUpGH(aGesture); } } // ====================================================================== // WebPointerEventHandler::handleMoveL // ====================================================================== -void WebPointerEventHandler::handleMove(const TGestureEvent& aEvent) +void WebPointerEventHandler::handleMove(const TStmGestureEvent& aGesture) { TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); - TPoint curPos = aEvent.CurrentPos(); + TPoint curPos = aGesture.CurrentPos(); PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler(); pluginHandler->setPluginToActivate(NULL); m_buttonDownTimer.stop(); @@ -336,8 +323,8 @@ } else { HandleHighlightChange(curPos); - - m_webview->pageScrollHandler()->handleScrollingGH(aEvent); + + m_webview->pageScrollHandler()->handleScrollingGH(aGesture); } } @@ -348,11 +335,11 @@ void WebPointerEventHandler::HandlePointerEventL(const TPointerEvent& aPointerEvent) { m_currentEvent = aPointerEvent; - - if (m_webview->isSynchRequestPending()) { + + if (m_webview->isSynchRequestPending()) { return; } - + // Handle graphical history - should never happen, as HistoryView handles this event by itself if ( m_webview->brCtl()->historyHandler()->historyController()->historyView()) { return; @@ -363,19 +350,10 @@ m_webview->formFillPopup()->HandlePointerEventL(aPointerEvent); return; } - - if (!m_webview->inPageViewMode()) { - if (aPointerEvent.iType == TPointerEvent::EButton1Down) { - m_webview->GetContainerWindow().EnablePointerMoveBuffer(); - } - else if (aPointerEvent.iType == TPointerEvent::EButton1Up) { - m_webview->GetContainerWindow().DisablePointerMoveBuffer(); - } - } #ifdef BRDO_USE_GESTURE_HELPER - m_gestureHelper->HandlePointerEventL(aPointerEvent); -#endif + m_gestureInterface->HandlePointerEventL(aPointerEvent); +#endif } //----------------------------------------------------------------------------- @@ -417,20 +395,20 @@ TBrCtlDefs::TBrCtlElementType elType = TBrCtlDefs::EElementNone; Frame* coreFrame = core(m_webview->mainFrame()); WebCursor* cursor = StaticObjectsContainer::instance()->webCursor(); - + TPointerEvent event; TPoint pos = cursor->position(); WebFrame* wfrm = cursor->getFrameAtPoint(pos); Frame* frm = core(wfrm); TPoint pt(wfrm->frameView()->viewCoordsInFrameCoords(pos)); TPoint nodePoint; - + Element* eventNode = frm->document()->elementFromPoint(pt.iX, pt.iY); - + if (m_isHighlighted){ - dehighlight(); + dehighlight(); } - + m_highlightedNode = NULL; Node* retNode = 0; @@ -438,10 +416,12 @@ if (elType == TBrCtlDefs::EElementNone) { Node* n = wfrm->getClosestAnchorElement(cursor->position(), pos); - if (n) { + if (n) { wfrm = cursor->getFrameAtPoint(pos); frm = core(wfrm); - eventNode = frm->document()->elementFromPoint(pos.iX, pos.iY); + //eventNode = frm->document()->elementFromPoint(pos.iX, pos.iY); + TPoint newPos(wfrm->frameView()->viewCoordsInFrameCoords(pos)); + eventNode = frm->document()->elementFromPoint(newPos.iX, newPos.iY); frm->bridge()->getTypeFromElement(eventNode, elType, elRect, retNode); TPoint nodePoint = n->getRect().Rect().Center(); m_offset = (pt.iX- nodePoint.iX)*(pt.iX- nodePoint.iX) + @@ -486,7 +466,7 @@ { TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType(); Frame* coreFrame = core(m_webview->mainFrame()); - + #ifdef BRDO_TOUCH_ENABLED_FF if (m_isHighlighted) { @@ -497,25 +477,25 @@ } } #endif // BRDO_TOUCH_ENABLED_FF - + if (!IS_NAVIGATION_NONE) { m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, coreFrame); } - + /* - * We assume that if element visibility has been changed - * between "up" and "down" that means that some node event - * listener (onMouseOver etc) handling happened and we don't + * We assume that if element visibility has been changed + * between "up" and "down" that means that some node event + * listener (onMouseOver etc) handling happened and we don't * want to send a click (mouse press + mouse release) event. * The exception is editable element, since we want VKB anyway */ if (!IS_NAVIGATION_NONE && - elType != TBrCtlDefs::EElementActivatedInputBox && - elType != TBrCtlDefs::EElementTextAreaBox && + elType != TBrCtlDefs::EElementActivatedInputBox && + elType != TBrCtlDefs::EElementTextAreaBox && m_webview->page()->chrome()->client()->elementVisibilityChangedByMouse()) { return; } - + m_lastTapEvent.iPosition = m_buttonDownEvent.iPosition; m_lastTapEvent.iType = TPointerEvent::EButton1Up; m_lastTapEvent.iModifiers = 0; @@ -558,10 +538,10 @@ Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame(); m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, frm); - + m_highlightedNode = NULL; - - m_webview->syncRepaint(); + + m_webview->syncRepaint(); } @@ -605,17 +585,17 @@ void WebPointerEventHandler::buttonDownTimerCB(Timer* t) { m_buttonDownTimer.stop(); - + Frame* coreFrame = core(m_webview->mainFrame()); TPointerEvent event; - + TBrCtlDefs::TBrCtlElementType elType = highlitableElement(); - + if (!isHighlitableElement(elType)) { elType = TBrCtlDefs::EElementNone; } m_isHighlighted = (m_highlightedNode != NULL) && (elType != TBrCtlDefs::EElementNone) ; - + /* * Tabbed navigation might already set the focused node. * If it's the same as m_highlightedNode FocuseController::setFocusedNode() @@ -624,24 +604,24 @@ * set it through FocuseController::setFocusedNode() */ if (IS_TABBED_NAVIGATION && - elType == TBrCtlDefs::EElementInputBox || + elType == TBrCtlDefs::EElementInputBox || elType == TBrCtlDefs::EElementTextAreaBox) { coreFrame->document()->setFocusedNode(NULL); } - + if (!IS_NAVIGATION_NONE) { m_webview->page()->chrome()->client()->setElementVisibilityChanged(false); - //to initiate hover + //to initiate hover if (m_isHighlighted) { setFocusRing(); } - + } else { m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Down, m_highlightPos, coreFrame); } - - if (m_waiter->IsStarted()) { + + if (m_waiter->IsStarted()) { m_waiter->AsyncStop(); } } @@ -660,7 +640,7 @@ if (m_webview->showCursor()) { cursor->resetTransparency(); m_webview->setShowCursor(false); - cursor->cursorUpdate(false); + cursor->cursorUpdate(false); } } } @@ -675,7 +655,7 @@ RenderStyle* style = new (e->document()->renderArena()) RenderStyle(*rs); Color col(0xffaaaaff); - style->ref(); + style->ref(); style->setOutlineColor(col); style->setOutlineStyle(DOTTED, true); style->setOutlineWidth(4); @@ -684,3 +664,15 @@ style->deref(e->document()->renderArena()); e->setChanged(); } + +//----------------------------------------------------------------------------- +// WebPointerEventHandler::handlePinchZoom +//---------------------------------------------------------------------------- +void WebPointerEventHandler::handlePinchZoomL(const TStmGestureEvent& aGesture) +{ + //dehighlight anything which is highlighted already + if (m_isHighlighted){ + dehighlight(); + } + m_webview->pinchZoomHandler()->handlePinchGestureEventL(aGesture); +} diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.h --- a/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.h Tue Feb 02 00:56:45 2010 +0200 @@ -20,8 +20,9 @@ #include #include +#include #include "Timer.h" -#include + namespace WebCore { @@ -31,8 +32,9 @@ class WebView; class CActiveSchedulerWait; +class WebGestureInterface; -class WebPointerEventHandler : public CBase, public RT_GestureHelper::MGestureObserver +class WebPointerEventHandler : public CBase { public: static WebPointerEventHandler* NewL(WebView* view); @@ -42,9 +44,7 @@ public: void HandlePointerEventL(const TPointerEvent& aPointerEvent); void HandleHighlightChange(const TPoint &aPoint); - - virtual void HandleGestureL( const RT_GestureHelper::TGestureEvent& aEvent ); - + void HandleGestureEventL(const TStmGestureEvent& aGesture); private: bool checkForEventListener(WebCore::Node* node); @@ -54,14 +54,15 @@ bool isHighlitableElement(TBrCtlDefs::TBrCtlElementType& elType); TBrCtlDefs::TBrCtlElementType highlitableElement(); void buttonDownTimerCB(WebCore::Timer* t); - void handleTouchDownL(const RT_GestureHelper::TGestureEvent& aEvent); - void handleTouchUp(const RT_GestureHelper::TGestureEvent& aEvent); - void handleTapL(const RT_GestureHelper::TGestureEvent& aEvent); - void handleDoubleTap(const RT_GestureHelper::TGestureEvent& aEvent); - void handleMove(const RT_GestureHelper::TGestureEvent& aEvent); + void handleTouchDownL(const TStmGestureEvent& aGesture); + void handleTouchUp(const TStmGestureEvent& aGesture); + void handleTapL(const TStmGestureEvent& aGesture); + void handleDoubleTap(const TStmGestureEvent& aGesture); + void handleMove(const TStmGestureEvent& aGesture); void doTapL(); void updateCursor(const TPoint& pos); void setFocusRing(); + void handlePinchZoomL(const TStmGestureEvent& aGesture); private: WebPointerEventHandler(WebView* view); WebView* m_webview; @@ -78,10 +79,10 @@ TPointerEvent m_currentEvent; WebCore::Timer m_buttonDownTimer; - RT_GestureHelper::CGestureHelper* m_gestureHelper; TPointerEvent m_lastPointerEvent; bool m_ignoreTap; CActiveSchedulerWait* m_waiter; + WebGestureInterface* m_gestureInterface; }; diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -28,7 +28,6 @@ #include "WebKitLogger.h" -using namespace RT_GestureHelper; // constants const int KRecordSize = 4; @@ -38,7 +37,9 @@ const int KScrollIntervalTimeout = 60000; // scroll timer interval in microseconds -const float KDecceleration = -700.0; +const float KDeccelerationLow = -350.0; +const float KDeccelerationHigh = -600.0; +const float KSpeedHigh = 2000.0; int decelTimerCB(TAny* ptr); @@ -78,6 +79,7 @@ void WebScrollingDeceleratorGH::ConstructL() { m_decelTimer = CPeriodic::NewL(CActive::EPriorityStandard); + m_deceleration = KDeccelerationHigh; } // ----------------------------------------------------------------------------- @@ -91,7 +93,7 @@ int WebScrollingDeceleratorGH::getDecceleration() { - return KDecceleration; + return m_deceleration; } @@ -114,8 +116,22 @@ { m_decelelatorSwitch = true; m_scrollbarDrawer = scrollbarDrawer; - m_initSpeed.iX = (-1) * speed.iX; - m_initSpeed.iY = (-1) * speed.iY; + float speedX = speed.iX; + float speedY = speed.iY; + float absSpeedX = abs(speedX); + float absSpeedY = abs(speedY); + + if (absSpeedX > KSpeedHigh) { + speedX = KSpeedHigh * speedX/absSpeedX ; + m_deceleration = KDeccelerationLow; + } + if (absSpeedY > KSpeedHigh) { + speedY = KSpeedHigh * speedY/absSpeedY; + m_deceleration = KDeccelerationLow; + } + + m_initSpeed.iX = (-1) * speedX; + m_initSpeed.iY = (-1) * speedY; m_numscrollsteps = 0; if (m_decelTimer->IsActive()) { @@ -145,14 +161,16 @@ TReal32 accelX = 0.0; TReal32 accelY = 0.0; + TReal32 deceleration = getDecceleration(); + if (m_initSpeed.iX) { - accelX = (m_initSpeed.iX > 0) ? KDecceleration : (-1) * KDecceleration; + accelX = (m_initSpeed.iX > 0) ? deceleration : (-1) * deceleration; vx = m_initSpeed.iX + accelX * t; dx = m_initSpeed.iX * t + 0.5 * accelX * (t * t); } if (m_initSpeed.iY) { - accelY = (m_initSpeed.iY > 0) ? KDecceleration : (-1) * KDecceleration; + accelY = (m_initSpeed.iY > 0) ? deceleration : (-1) * deceleration; vy = m_initSpeed.iY + accelY * t; dy = m_initSpeed.iY * t + 0.5 * accelY * (t * t); } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.h --- a/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.h Tue Feb 02 00:56:45 2010 +0200 @@ -23,7 +23,7 @@ #include #include #include -#include +#include // MACROS @@ -60,7 +60,7 @@ public: // Main functions - void startDecel(RT_GestureHelper::TRealPoint& speed, WebScrollbarDrawer* scrollbarDrawer); + void startDecel(TRealPoint& speed, WebScrollbarDrawer* scrollbarDrawer); void cancelDecel(); @@ -85,7 +85,7 @@ //normalized current position to minimize rounding error TPoint m_normalizedCurrentPosition; - RT_GestureHelper::TRealPoint m_initSpeed; + TRealPoint m_initSpeed; CPeriodic* m_decelTimer; @@ -94,6 +94,8 @@ TPoint m_startPos; WebScrollbarDrawer* m_scrollbarDrawer; + + TReal32 m_deceleration; }; diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebTextFormatMask.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebTextFormatMask.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebTextFormatMask.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -192,9 +192,15 @@ m_currentMask = m_currentMask->nextMask(); } - // did we use up all the masks? - if(m_currentMask && m_currentMask->multitude() != kInfinite) - return false; + // this check doesn't seem to be proper as the check is done for + // the partial text.Because the checkText() is called for every character input by user, + // there are remaining masks after complete text length has been checked, + // that is valid case and it should not return false. + // If text length is bigger than mask length then that case is handled within for loop + //before this condition check. So it is redundant in current implementation + // did we use up all the masks? + /* if(m_currentMask && m_currentMask->multitude() != kInfinite) + return false;*/ return (eb.m_start == -1); } diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebView.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -60,7 +60,7 @@ #include "PluginWin.h" #include "PluginPlayer.h" #include "WebKitLogger.h" - +#include "WebPagePinchZoomHandler.h" #include "Page.h" #include "Settings.h" @@ -201,6 +201,8 @@ , m_prevEditMode(false) , m_firedEvent(0) , m_waitTimer(0) +, m_pinchZoomHandler(NULL) +, m_isPinchZoom(false) { } @@ -227,12 +229,16 @@ delete m_fastScrollTimer; delete [] m_ptrbuffer; + delete m_pinchZoomHandler; delete m_repainttimer; delete m_webfeptexteditor; delete m_webcorecontext; delete m_bitmapdevice; delete m_page; delete m_pageScaler; +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF + m_pageScaler = NULL; +#endif delete m_pageView; delete m_webFormFill; delete m_toolbar; @@ -337,7 +343,10 @@ if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAutoFormFill) { m_webFormFill = new WebFormFill(this); } - + + //Creates the Pinch Zoom Handler + m_pinchZoomHandler = WebPagePinchZoomHandler::NewL(this); + // Create the PointerEventHandler m_ptrbuffer = new TPoint[256]; m_webpointerEventHandler = WebPointerEventHandler::NewL(this); @@ -360,7 +369,10 @@ MakeViewVisible(ETrue); m_isPluginsVisible=ETrue; CCoeControl::SetFocus(ETrue); - +#ifdef BRDO_MULTITOUCH_ENABLED_FF + //To enable advance pointer info for multi-touch + Window().EnableAdvancedPointers(); +#endif cache()->setCapacities(0, 0, defaultCacheCapacity); m_waiter = new(ELeave) CActiveSchedulerWait(); @@ -404,13 +416,27 @@ gc.DrawBitmap( m_destRectForZooming, StaticObjectsContainer::instance()->webSurface()->offscreenBitmap(), m_srcRectForZooming ); if ( m_startZoomLevel > m_currentZoomLevel) { - +#ifdef BRDO_MULTITOUCH_ENABLED_FF + TInt destRectWidth = m_destRectForZooming.Width(); + TInt destRectHeight = m_destRectForZooming.Height(); + TRect rectLeft(TPoint(rect.iTl), + TPoint(rect.iTl.iX + m_destRectForZooming.iTl.iX, rect.iBr.iY)); + + TRect rectRight(TPoint(rect.iTl.iX + destRectWidth + m_destRectForZooming.iTl.iX, rect.iTl.iY), + TPoint(rect.iBr)); + + TRect rectTop(TPoint(rect.iTl.iX + m_destRectForZooming.iTl.iX, rect.iTl.iY), + TPoint(rect.iTl.iX + m_destRectForZooming.iTl.iX + destRectWidth, rect.iTl.iY + m_destRectForZooming.iTl.iY)); + + TRect rectBottom(TPoint(rect.iTl.iX + m_destRectForZooming.iTl.iX, rect.iTl.iY + m_destRectForZooming.iTl.iY + destRectHeight), + TPoint(rect.iTl.iX + destRectWidth + m_destRectForZooming.iTl.iX, rect.iBr.iY)); +#else TRect rectLeft( TPoint( rect.iTl.iX + m_destRectForZooming.Width() - 2, rect.iTl.iY ), TPoint( rect.iBr )); TRect rectBottom( TPoint( rect.iTl.iX, rect.iTl.iY + m_destRectForZooming.Height() - 2 ), TPoint( rect.iBr.iX + m_destRectForZooming.Width(), rect.iBr.iY )); - +#endif const TRgb colorTest(KZoomBgRectColor,KZoomBgRectColor,KZoomBgRectColor); gc.SetPenColor(colorTest); @@ -418,6 +444,10 @@ gc.SetBrushColor(colorTest); gc.DrawRect( rectLeft ); gc.DrawRect( rectBottom ); +#ifdef BRDO_MULTITOUCH_ENABLED_FF + gc.DrawRect( rectRight ); + gc.DrawRect( rectTop ); +#endif } @@ -525,6 +555,7 @@ clearOffScreenBitmap(); m_tabbedNavigation->initializeForPage(); syncRepaint( mainFrame()->frameView()->visibleRect() ); + TRAP_IGNORE( m_webfeptexteditor->EnableCcpuL() ); } } @@ -1073,6 +1104,9 @@ m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) && keyevent.iRepeats && !m_brctl->wmlMode() ) { launchToolBarL(); + if(m_toolbar) { + sendMouseEventToEngineIfNeeded(TPointerEvent::EButton1Up, cursor->position(), frame); + } } return true; @@ -2015,6 +2049,7 @@ m_findKeyword = NULL; WebFrame* selectedFrame = mainFrame()->findFrameWithSelection(); selectedFrame->clearSelection(); + setFocusNone(); } bool WebView::isSmallPage() @@ -2031,26 +2066,6 @@ } } - -//------------------------------------------------------------------------------- -// WebView::HandlePointerBufferReadyL -// Handles pointer move events -//------------------------------------------------------------------------------- -void WebView::HandlePointerBufferReadyL() -{ - memset(m_ptrbuffer,0,256*sizeof(TPoint)); - TPtr8 ptr((TUint8 *)m_ptrbuffer,256*sizeof(TPoint)); - - TInt numPnts = Window().RetrievePointerMoveBuffer(ptr); - int i = 0; - for (; i < numPnts; i++) { - TPointerEvent pe; - pe.iType = TPointerEvent::EDrag; - pe.iPosition = m_ptrbuffer[i]; - m_webpointerEventHandler->HandlePointerEventL(pe); - } -} - //------------------------------------------------------------------------------- // WebView::HandlePointerEventL // Handles pointer events @@ -2404,6 +2419,25 @@ mainFrame()->scalingFactorChanged(z); view->checkScrollbarVisibility(); + if (m_isPinchZoom) { + if (newZoomLevel > m_startZoomLevel) { + TPoint cpos( mainFrame()->frameView()->contentPos()); + cpos.iX = cpos.iX + m_pinchDocDelta.iX +.5; + cpos.iY = cpos.iY + m_pinchDocDelta.iY +.5; + mainFrame()->frameView()->setContentPos(cpos); + } + if (m_startZoomLevel > newZoomLevel) { + TPoint cpos( mainFrame()->frameView()->contentPos()); + cpos.iX = cpos.iX - m_pinchDocDelta.iX +.5; + cpos.iY = cpos.iY - m_pinchDocDelta.iY +.5; + + if (cpos.iX < 0) cpos.iX = 0; + if (cpos.iY < 0) cpos.iY = 0; + mainFrame()->frameView()->setContentPos(cpos); + } + m_isPinchZoom = false; + } + TRect rect = view->rect(); TInt tlx = (rect.iTl.iX * currZoomLevel) / m_currentZoomLevel; @@ -2943,5 +2977,96 @@ } } +//------------------------------------------------------------------------------- +// WebView::setPinchBitmapZoomLevel +//------------------------------------------------------------------------------- +void WebView::setPinchBitmapZoomLevel(int zoomLevel) +{ + m_zoomLevelChangedByUser = true; + m_dirtyZoomMode = true; + m_isPluginsVisible = false; + mainFrame()->makeVisiblePlugins(false); + m_isPinchZoom = true; + + if (zoomLevel > m_startZoomLevel) { + setPinchBitmapZoomIn(zoomLevel); + } + else { + setPinchBitmapZoomOut(zoomLevel); + } + m_currentZoomLevel = zoomLevel; + DrawNow(); +} + +//------------------------------------------------------------------------------- +// WebView::setPinchBitmapZoomIn +//------------------------------------------------------------------------------- +void WebView::setPinchBitmapZoomIn(int zoomLevel) +{ + TPoint pinchCenter = m_pinchZoomHandler->pinchCenter(); + + // cut m_srcRectForZooming from m_offscreenrect and enlarge it to fit the view rect + TRealPoint centerAfterZoom; + //find out the new position of Pinch Center after applying zoom + centerAfterZoom.iX = (float)pinchCenter.iX * zoomLevel/m_startZoomLevel; + centerAfterZoom.iY = (float)pinchCenter.iY * zoomLevel/m_startZoomLevel; + TRealPoint centerDelta; + //get the shift in the Pinch Center + centerDelta.iX = centerAfterZoom.iX - pinchCenter.iX; + centerDelta.iY = centerAfterZoom.iY - pinchCenter.iY; + TPoint shiftInView; + //find out how much shift needs to be applied to the current zoom, w.r.t. the new view + shiftInView.iX = centerDelta.iX * m_startZoomLevel / zoomLevel; + shiftInView.iY = centerDelta.iY * m_startZoomLevel / zoomLevel; + //width and height of the rectangle that should be used for bitmap stretching + float newWidth = (float)m_offscreenrect.Width() * m_startZoomLevel / zoomLevel; + float newHeight = (float)m_offscreenrect.Height() * m_startZoomLevel /zoomLevel; + //defining the source rectangle which needs to be bitmap stretched + m_srcRectForZooming.iTl.iX = shiftInView.iX; + m_srcRectForZooming.iTl.iY = shiftInView.iY; + m_srcRectForZooming.iBr.iX = newWidth + shiftInView.iX; + m_srcRectForZooming.iBr.iY = newHeight + shiftInView.iY; + //destRectForZooming is the Coecontrol Rect itself + m_destRectForZooming = Rect(); + //get the shift in the document so that during the next engine re-draw, the origin needs to be updated based on that + m_pinchDocDelta.iX = (float)shiftInView.iX * 100 / m_startZoomLevel; + m_pinchDocDelta.iY = (float)shiftInView.iY * 100 / m_startZoomLevel; +} + + +//------------------------------------------------------------------------------- +// WebView::setPinchBitmapZoomOut +//------------------------------------------------------------------------------- +void WebView::setPinchBitmapZoomOut(int zoomLevel) +{ + TPoint pinchCenter = m_pinchZoomHandler->pinchCenter(); + + // take the whole rect and calculate new rect to fit it the rest of view rect paint gray colour + TRealPoint centerAfterZoom; + //find out the new position of Pinch Center after applying zoom + centerAfterZoom.iX = (float)pinchCenter.iX * m_startZoomLevel / zoomLevel; + centerAfterZoom.iY = (float)pinchCenter.iY * m_startZoomLevel / zoomLevel; + TRealPoint centerDelta; + //get the shift in the Pinch Center + centerDelta.iX = centerAfterZoom.iX - pinchCenter.iX; + centerDelta.iY = centerAfterZoom.iY - pinchCenter.iY; + TPoint shiftInView; + //find out how much shift needs to be applied to the current zoom, w.r.t. the new view + shiftInView.iX = centerDelta.iX * zoomLevel / m_startZoomLevel; + shiftInView.iY = centerDelta.iY * zoomLevel / m_startZoomLevel; + //width and height of the rectangle + float newWidth = (float)m_offscreenrect.Width() * zoomLevel / m_startZoomLevel; + float newHeight = (float)m_offscreenrect.Height() * zoomLevel / m_startZoomLevel; + //defining the co-ordinates of the destination rectangle. + m_destRectForZooming.iTl.iX = shiftInView.iX; + m_destRectForZooming.iTl.iY = shiftInView.iY; + m_destRectForZooming.iBr.iX = newWidth + shiftInView.iX; + m_destRectForZooming.iBr.iY = newHeight + shiftInView.iY; + //srcRectForZooming is the Coecontrol Rect itself + m_srcRectForZooming = Rect(); + //get the shift in the document so that during the next engine re-draw, the origin needs to be updated based on that + m_pinchDocDelta.iX = (float)shiftInView.iX * 100 / zoomLevel; + m_pinchDocDelta.iY = (float)shiftInView.iY * 100 / zoomLevel; +} // END OF FILE diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/WebKit/s60/webview/WebView.h --- a/webengine/osswebengine/WebKit/s60/webview/WebView.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/osswebengine/WebKit/s60/webview/WebView.h Tue Feb 02 00:56:45 2010 +0200 @@ -27,6 +27,7 @@ #include "PageScaler.h" #include "Timer.h" #include +#include namespace WebCore { @@ -66,6 +67,7 @@ class WebPageFullScreenHandler; class WebFrameView; class WebFrameBridge; +class WebPagePinchZoomHandler; const TUint KMouseEventFired = 0x00000001; @@ -294,13 +296,6 @@ void closeToolBarL(); /** - * HandlePointerBufferReadyL - * From CCoeControl - * - */ - void HandlePointerBufferReadyL(); - - /** * HandlePointerEventL * From CCoeControl * @@ -349,6 +344,26 @@ * Collects offscreen bitmap */ void collectOffscreenbitmapL(CFbsBitmap& snapshot); + + /** + * To get the pinch zoom handler + */ + WebPagePinchZoomHandler* pinchZoomHandler() { return m_pinchZoomHandler; } + + /** + * To set the Bitmap zooming for Pinch + */ + void setPinchBitmapZoomLevel(int zoomLevel); + + /** + * To set the Bitmap zooming In for Pinch + */ + void setPinchBitmapZoomIn(int zoomLevel); + + /** + * To set the Bitmap zooming Out for Pinch + */ + void setPinchBitmapZoomOut(int zoomLevel); public: // from MPageScalerCallback /** @@ -581,6 +596,11 @@ CActiveSchedulerWait* m_waiter; WebCore::Timer* m_waitTimer; + + //Pinch Zoom Handler + WebPagePinchZoomHandler* m_pinchZoomHandler; + TBool m_isPinchZoom; + TRealPoint m_pinchDocDelta; }; #endif diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/webkit/s60/webview/WebGestureInterface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/webkit/s60/webview/WebGestureInterface.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDE FILES +#include +#include "config.h" +#include "../../bidi.h" +#include +#include "WebGestureInterface.h" +#include "WebView.h" +#include "WebPointerEventHandler.h" + +const TInt TOUCH_AREA_TIMEOUT = 200; +const TInt TOUCH_TIME_AREA_TIMEOUT = 0; +const TInt HOLD_AREA_TIMEOUT = 2000; +const TInt DOUBLE_TAP_TIMEOUT = 400; +const TInt SUPPRESS_TIMEOUT = 0; +const TInt MOVE_SUPPRESS_TIMEOUT = 0; + +const TInt TOUCH_TIME_AREA_WIDTH = 4; +const TInt TOUCH_AREA_WIDTH = 4; +const TInt HOLD_AREA_WIDTH = 4; + +const TInt PAN_SPEED_LOW = 0; +const TInt PAN_SPEED_HIGH = 400; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CgesturetestAppView::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +WebGestureInterface* WebGestureInterface::NewL(WebView* view) +{ + WebGestureInterface* self = WebGestureInterface::NewLC(view); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CgesturetestAppView::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +WebGestureInterface* WebGestureInterface::NewLC(WebView* view) +{ + WebGestureInterface* self = new (ELeave) WebGestureInterface(view); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +// ----------------------------------------------------------------------------- +// WebGestureInterface::WebGestureInterface +// C++ default constructor +// +// ----------------------------------------------------------------------------- +// +WebGestureInterface::WebGestureInterface(WebView* view) +: m_webview(view) +{ +} + +// ----------------------------------------------------------------------------- +// WebGestureInterface::~WebGestureInterface +// ----------------------------------------------------------------------------- +WebGestureInterface::~WebGestureInterface() +{ + iGestureContext->Deactivate(); + iGestureContext->RemoveListener(this); + delete iGestureEngine; +} +// ----------------------------------------------------------------------------- +// WebGestureInterface::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void WebGestureInterface::ConstructL() +{ + iGestureEngine = CStmGestureEngine::NewL(); + iGestureContext = iGestureEngine->CreateContextL(TInt(this)); + iGestureContext->SetContext(m_webview); + iGestureContext->AddListenerL(this); + + CStmGestureParameters& gestureParams = iGestureContext->Config(); + //Enable the Gestures needed + gestureParams.SetEnabled(stmGesture::EGestureUidTouch, ETrue); + gestureParams.SetEnabled(stmGesture::EGestureUidTap, ETrue); + gestureParams.SetEnabled(stmGesture::EGestureUidRelease, ETrue); + gestureParams.SetEnabled(stmGesture::EGestureUidPan, ETrue); + gestureParams.SetEnabled(stmGesture::EGestureUidFlick, ETrue); + gestureParams.SetEnabled(stmGesture::EGestureUidLongPress, ETrue); +#ifdef BRDO_MULTITOUCH_ENABLED_FF + gestureParams.SetEnabled(stmGesture::EGestureUidPinch, ETrue); +#else + gestureParams.SetEnabled(stmGesture::EGestureUidPinch, EFalse); +#endif + + //Set other parameters + + TStmGestureArea& touchTimeArea = *gestureParams.Area(stmGesture::ETouchTimeArea); + TStmGestureArea& touchArea = *gestureParams.Area(stmGesture::ETouchArea); + TStmGestureArea& holdArea = *gestureParams.Area(stmGesture::EHoldArea); + + touchTimeArea.iShape = TStmGestureArea::ERectangle; + touchTimeArea.iTimeout = TOUCH_TIME_AREA_TIMEOUT; + touchTimeArea.iSize.iWidth = TOUCH_TIME_AREA_WIDTH; + + touchArea.iShape = TStmGestureArea::ERectangle; + touchArea.iTimeout = TOUCH_AREA_TIMEOUT; + touchArea.iSize.iWidth = TOUCH_AREA_WIDTH; + + holdArea.iShape = TStmGestureArea::ERectangle; + holdArea.iTimeout = HOLD_AREA_TIMEOUT; + holdArea.iSize.iWidth = HOLD_AREA_WIDTH; + + gestureParams[stmGesture::EDoubleTapTimeout ] = DOUBLE_TAP_TIMEOUT; + gestureParams[stmGesture::ESuppressTimeout ] = SUPPRESS_TIMEOUT; + gestureParams[stmGesture::EMoveSuppressTimeout] = MOVE_SUPPRESS_TIMEOUT; + gestureParams[stmGesture::EPanSpeedLow ] = PAN_SPEED_LOW; + gestureParams[stmGesture::EPanSpeedHigh ] = PAN_SPEED_HIGH; + + gestureParams[stmGesture::EEnableFiltering ] = ETrue; +#ifdef BRDO_MULTITOUCH_ENABLED_FF + gestureParams[stmGesture::ECapacitiveUpUsed ] = ETrue; + gestureParams[stmGesture::EAdjustYPos ] = ETrue; +#else + gestureParams[stmGesture::ECapacitiveUpUsed ] = EFalse; + gestureParams[stmGesture::EAdjustYPos ] = EFalse; +#endif + iGestureContext->ActivateL(); + +} + +// ----------------------------------------------------------------------------- +// HandlePointerEventL +// ----------------------------------------------------------------------------- +void WebGestureInterface::HandlePointerEventL(const TPointerEvent& aPointerEvent) +{ + iGestureEngine->HandlePointerEventL(aPointerEvent, m_webview); +} + +// ----------------------------------------------------------------------------- +// HandleGestureEventL +// ----------------------------------------------------------------------------- +void WebGestureInterface::HandleGestureEventL(const TStmGestureEvent& aGesture) +{ + m_webview->pointerEventHandler()->HandleGestureEventL(aGesture); +} + + diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/webkit/s60/webview/WebGestureInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/webkit/s60/webview/WebGestureInterface.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implements gesture interface functionality +* +*/ + +#ifndef WEBGESTUREINTERFACE_H +#define WEBGESTUREINTERFACE_H + +// INCLUDES +#include + +// MACROS + +// FORWARD DECLARATIONS +class WebView; + +// CLASS DECLARATION +class WebGestureInterface : public CBase, public MStmGestureListener + { +public: + // New methods + + /** + * NewL. + * Two-phased constructor. + * Create a WebGestureInterface object + * @return a pointer to the created instance of WebGestureInterface. + */ + static WebGestureInterface* NewL(WebView* view); + + static WebGestureInterface* NewLC(WebView* view); + + /** + * ~CgestureInterface + * Virtual Destructor. + */ + ~WebGestureInterface(); + +public: //member functions + + void HandlePointerEventL(const TPointerEvent& aPointerEvent); + +public: //from MStmGestureListener + + void HandleGestureEventL(const TStmGestureEvent& aGesture); + +private: + // Constructors + + void ConstructL(); + + /** + * WebGestureInterface. + * C++ default constructor. + */ + WebGestureInterface(WebView* view); + +private: + CStmGestureEngine *iGestureEngine; // <> + CStmGestureContext *iGestureContext; // <> + WebView* m_webview; // <> + }; + +#endif // WEBGESTUREINTERFACE_H +// End of File diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDE FILES +#include <../bidi.h> +#include "WebPagePinchZoomHandler.h" +#include "WebView.h" + + +const int KBitmapUpdateTimeout = 100*1000; +const int KPinchExitWaitTimeout = 300*1000; + +const int KPinchZoomStepSizeSmall = 3; +const int KPinchZoomStepSizeMedium = 4; +const int KPinchZoomStepSizeLarge = 5; +const int KMinPinchFactor = 1; + +int pinchBitmapUpdateTimerCb( void* ptr ); +int pinchExitWaitTimerCb( void* ptr ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// WebPagePinchZoomHandler::NewL +// The two-phase Symbian constructor +// ----------------------------------------------------------------------------- +// +WebPagePinchZoomHandler* WebPagePinchZoomHandler::NewL(WebView* webView) +{ + WebPagePinchZoomHandler* self = new (ELeave) WebPagePinchZoomHandler(webView); + CleanupStack::PushL(self); + self->constructL(); + CleanupStack::Pop(); //self + return self; +} + +// ----------------------------------------------------------------------------- +// WebPagePinchZoomHandler::WebPointerEventHandler +// C++ default constructor +// +// ----------------------------------------------------------------------------- +// +WebPagePinchZoomHandler::WebPagePinchZoomHandler(WebView* webView) +: m_webView(webView) +, m_zoomOutBaseLevel(0) +, m_pinchCenterSet(false) +, m_zoomStepSize(0) +, m_pinchActive(false) +, m_pinchCenter(0,0) +{ +} + +// ----------------------------------------------------------------------------- +// WebPagePinchZoomHandler::constructL +// The constructor that can contain code that might leave. +// ----------------------------------------------------------------------------- +// +void WebPagePinchZoomHandler::constructL() +{ + m_bitmapUpdateTimer = CPeriodic::NewL(CActive::EPriorityHigh); + m_pinchExitWaitTimer = CPeriodic::NewL(CActive::EPriorityHigh); +} + +// ----------------------------------------------------------------------------- +// WebPagePinchZoomHandler::~WebPagePinchZoomHandler +// ----------------------------------------------------------------------------- +WebPagePinchZoomHandler::~WebPagePinchZoomHandler() +{ + if (m_bitmapUpdateTimer->IsActive()) + m_bitmapUpdateTimer->Cancel(); + delete m_bitmapUpdateTimer; + + if (m_pinchExitWaitTimer->IsActive()) + m_pinchExitWaitTimer->Cancel(); + delete m_pinchExitWaitTimer; + +} + +// ----------------------------------------------------------------------------- +// getPinchZoomStepSize +// ----------------------------------------------------------------------------- +TInt WebPagePinchZoomHandler::getPinchZoomStepSize() +{ + TInt zoomStepSize = 0; + + TInt absPinchFactor = Abs (m_pinchFactor); + if (absPinchFactor == 0) + return zoomStepSize; + + if ( absPinchFactor >= KMinPinchFactor && absPinchFactor <= 10 ) { + zoomStepSize = KPinchZoomStepSizeSmall; + } + else if ( absPinchFactor > 10 && absPinchFactor <= 20 ) { + zoomStepSize = KPinchZoomStepSizeMedium; + } + else if ( absPinchFactor > 20 ) { + zoomStepSize = KPinchZoomStepSizeLarge; + } + + return (m_pinchFactor/absPinchFactor) * zoomStepSize; +} + +// ----------------------------------------------------------------------------- +// handlePinchGestureEventL +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::handlePinchGestureEventL(const TStmGestureEvent& aGesture) +{ + if(aGesture.GestureState() == EGestureEnter) { + m_pinchActive = true; + handlePinchGestureL(aGesture); + } + else { + m_pinchActive = false; + handlePinchGestureExitL(aGesture); + } + +} + +// ----------------------------------------------------------------------------- +// handlePinchGestureL +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::handlePinchGestureL(const TStmGestureEvent& aGesture) +{ + + m_pinchFactor = aGesture.Details(); + TInt zoomValue = 0; + TInt currentZoom = m_webView->zoomLevel(); + TInt zoomStepSize = getPinchZoomStepSize(); + + if (zoomStepSize == 0) + return; + + zoomValue = currentZoom + zoomStepSize; + if (m_zoomStepSize > 0 && zoomStepSize < 0) m_zoomOutBaseLevel = currentZoom / 2; + + m_zoomStepSize = zoomStepSize; + + if(zoomValue >= m_webView->minZoomLevel() && zoomValue <= m_webView->maxZoomLevel()) { + if (!m_pinchCenterSet) { + TPoint pinchCenter = aGesture.PinchEndPos() + aGesture.CurrentPos(); + m_pinchCenter.iX = pinchCenter.iX / 2; + m_pinchCenter.iY = pinchCenter.iY / 2; + m_pinchCenterSet = true; + if (zoomStepSize < 0) m_zoomOutBaseLevel = currentZoom / 2; + } + if (!(zoomStepSize < 0 && zoomValue < m_zoomOutBaseLevel)) + setZoomLevel(zoomValue); + + } +} + +// ----------------------------------------------------------------------------- +// handlePinchGestureExitL +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::handlePinchGestureExitL(const TStmGestureEvent& aGesture) +{ + m_zoomOutBaseLevel = 0; + m_zoomStepSize = 0; + m_pinchCenterSet = false; + if (!m_bitmapUpdateTimer->IsActive()) + m_bitmapUpdateTimer->Start( KBitmapUpdateTimeout,KBitmapUpdateTimeout,TCallBack(&pinchBitmapUpdateTimerCb,this)); + + if (!m_pinchExitWaitTimer->IsActive()) + m_pinchExitWaitTimer->Start( KPinchExitWaitTimeout,0,TCallBack(&pinchExitWaitTimerCb,this)); + +} + +// ----------------------------------------------------------------------------- +// setZoomLevel +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::setZoomLevel(int zoomLevel) +{ + m_webView->setPinchBitmapZoomLevel(zoomLevel); +} + +// ----------------------------------------------------------------------------- +// isPinchActive +// ----------------------------------------------------------------------------- +TBool WebPagePinchZoomHandler::isPinchActive() +{ + bool pinchActive = false; + if (m_pinchActive == true || m_pinchExitWaitTimer->IsActive()) + pinchActive = true; + + return pinchActive; + +} + +// ----------------------------------------------------------------------------- +// updateBitmap +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::updateBitmap(void) +{ + m_bitmapUpdateTimer->Cancel(); + m_webView->restoreZoomLevel(m_webView->scalingFactor()); +} + +// ----------------------------------------------------------------------------- +// handlepinchExitWaitTimer +// ----------------------------------------------------------------------------- +void WebPagePinchZoomHandler::handlepinchExitWaitTimer(void) +{ + m_pinchExitWaitTimer->Cancel(); +} + +// ----------------------------------------------------------------------------- +// pinchBitmapUpdateTimerCb +// ----------------------------------------------------------------------------- +int pinchBitmapUpdateTimerCb(void* ptr) +{ + ((WebPagePinchZoomHandler*)ptr)->updateBitmap(); + return 0; +} + +// ----------------------------------------------------------------------------- +// pinchExitWaitTimerCb +// ----------------------------------------------------------------------------- +int pinchExitWaitTimerCb(void* ptr) +{ + ((WebPagePinchZoomHandler*)ptr)->handlepinchExitWaitTimer(); + return 0; +} + +// End of File + + diff -r 6297cdf66332 -r d39add9822e2 webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,125 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implements pinch functionality +* +*/ + + + +#ifndef WEBPAGEPINCHZOOMHANDLER_H +#define WEBPAGEPINCHZOOMHANDLER_H + +// INCLUDES +#include +#include +#include +#include + +// MACROS + +// FORWARD DECLARATIONS +class WebView; + + +// CLASS DECLARATION +class WebPagePinchZoomHandler: public CBase { +public: // Constructor and destructor + + /** + * Two-phased constructor. + **/ + static WebPagePinchZoomHandler* NewL(WebView* webView); + + /** + * Destructor. + **/ + virtual ~WebPagePinchZoomHandler(); + +private: // Constructors + + /** + * C++ default constructor. + **/ + WebPagePinchZoomHandler(WebView* webView); + + /** + * By default Symbian 2nd phase constructor is private. + **/ + void constructL(); + +public: // New functions + + /** + * Handler for Pinch event + **/ + void handlePinchGestureEventL(const TStmGestureEvent& aGesture); + + /** + * Handler for PinchEnter event + **/ + void handlePinchGestureL(const TStmGestureEvent& aGesture); + + /** + * Handler for PinchExit event + **/ + void handlePinchGestureExitL(const TStmGestureEvent& aGesture); + + /** + * to set the zoom level for bitmap zooming + **/ + void setZoomLevel(TInt zoomLevel); + + /** + * to update the bitmap + **/ + void updateBitmap(); + + /** + * to get the pinch step size corresponding to a pinch gesture + **/ + TInt getPinchZoomStepSize(); + + /** + * to query whether pinch is active: + * pinch is active once GestureEnter for pinch is received. And it is active until the pinch expiry timer gets expired + **/ + TBool isPinchActive(); + + /** + * handler for pinch exit timer expiry + **/ + void handlepinchExitWaitTimer(); + + /** + * To get the pinch center + **/ + TPoint pinchCenter() {return m_pinchCenter;}; + +private: + + WebView* m_webView; // <> + CPeriodic* m_bitmapUpdateTimer; // <> + CPeriodic* m_pinchExitWaitTimer; // <> + TInt m_pinchFactor; + int m_zoomOutBaseLevel; + bool m_pinchCenterSet; + TInt m_zoomStepSize; + bool m_pinchActive; + TPoint m_pinchCenter; + +}; + +#endif //WEBPAGEPINCHZOOMHANDLER_H + +// End of File diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/group/bld.inf --- a/webengine/webkitutils/group/bld.inf Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/webkitutils/group/bld.inf Tue Feb 02 00:56:45 2010 +0200 @@ -19,7 +19,7 @@ #include "../../../web_plat/browser_platform_api/inc/browser_platform_variant.hrh" #ifdef BRDO_USE_GESTURE_HELPER -#include "../rt_gesturehelper/group/bld.inf" +#include "../stmgesturefw/group/bld.inf" #endif PRJ_PLATFORMS diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/bwins/rt_gesturehelperu.def --- a/webengine/webkitutils/rt_gesturehelper/bwins/rt_gesturehelperu.def Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -EXPORTS - ??1CGestureHelper@RT_GestureHelper@@UAE@XZ @ 1 NONAME ; RT_GestureHelper::CGestureHelper::~CGestureHelper(void) - ?Cancel@CGestureHelper@RT_GestureHelper@@QAEXXZ @ 2 NONAME ; void RT_GestureHelper::CGestureHelper::Cancel(void) - ?HandlePointerEventL@CGestureHelper@RT_GestureHelper@@QAEHABUTPointerEvent@@@Z @ 3 NONAME ; int RT_GestureHelper::CGestureHelper::HandlePointerEventL(struct TPointerEvent const &) - ?IsDoubleTapEnabled@CGestureHelper@RT_GestureHelper@@QBEHXZ @ 4 NONAME ; int RT_GestureHelper::CGestureHelper::IsDoubleTapEnabled(void) const - ?IsHoldingEnabled@CGestureHelper@RT_GestureHelper@@QBEHXZ @ 5 NONAME ; int RT_GestureHelper::CGestureHelper::IsHoldingEnabled(void) const - ?NewL@CGestureHelper@RT_GestureHelper@@SAPAV12@AAVMGestureObserver@2@@Z @ 6 NONAME ; class RT_GestureHelper::CGestureHelper * RT_GestureHelper::CGestureHelper::NewL(class RT_GestureHelper::MGestureObserver &) - ?SetDoubleTapEnabled@CGestureHelper@RT_GestureHelper@@QAEXH@Z @ 7 NONAME ; void RT_GestureHelper::CGestureHelper::SetDoubleTapEnabled(int) - ?SetHoldingEnabled@CGestureHelper@RT_GestureHelper@@QAEXH@Z @ 8 NONAME ; void RT_GestureHelper::CGestureHelper::SetHoldingEnabled(int) - diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/eabi/rt_gesturehelperu.def --- a/webengine/webkitutils/rt_gesturehelper/eabi/rt_gesturehelperu.def Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -EXPORTS - _ZN16RT_GestureHelper14CGestureHelper17SetHoldingEnabledEi @ 1 NONAME - _ZN16RT_GestureHelper14CGestureHelper19HandlePointerEventLERK13TPointerEvent @ 2 NONAME - _ZN16RT_GestureHelper14CGestureHelper19SetDoubleTapEnabledEi @ 3 NONAME - _ZN16RT_GestureHelper14CGestureHelper4NewLERNS_16MGestureObserverE @ 4 NONAME - _ZN16RT_GestureHelper14CGestureHelper6CancelEv @ 5 NONAME - _ZN16RT_GestureHelper14CGestureHelperD0Ev @ 6 NONAME - _ZN16RT_GestureHelper14CGestureHelperD1Ev @ 7 NONAME - _ZN16RT_GestureHelper14CGestureHelperD2Ev @ 8 NONAME - _ZNK16RT_GestureHelper14CGestureHelper16IsHoldingEnabledEv @ 9 NONAME - _ZNK16RT_GestureHelper14CGestureHelper18IsDoubleTapEnabledEv @ 10 NONAME - diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/group/bld.inf --- a/webengine/webkitutils/rt_gesturehelper/group/bld.inf Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Build information -* -*/ - - - -#include -#include "../../../../web_plat/browser_platform_api/inc/browser_platform_variant.hrh" - -PRJ_PLATFORMS -DEFAULT - -PRJ_EXPORTS - -../rom/rt_gesturehelper.iby CORE_MW_LAYER_IBY_EXPORT_PATH(rt_gesturehelper.iby) - -PRJ_MMPFILES - -#ifndef __S60_32__ -rt_gesturehelper.mmp -#endif - -PRJ_TESTMMPFILES -#ifndef __S60_32__ -//#include "../test/group/bld.inf" -#endif diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/group/rt_gesturehelper.mmp --- a/webengine/webkitutils/rt_gesturehelper/group/rt_gesturehelper.mmp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Project definition file -* -*/ - - - -#include - -TARGET rt_gesturehelper.dll -TARGETTYPE dll -UID 0x1000008D 0x200212EA - -CAPABILITY CAP_CLIENT_DLL -VENDORID VID_DEFAULT - -USERINCLUDE ../inc -MW_LAYER_SYSTEMINCLUDE - -SOURCEPATH ../src - -SOURCE gesture.cpp -SOURCE gesturehelper.cpp -SOURCE gesturehelperimpl.cpp -SOURCE gesturerecogniser.cpp -SOURCE pointarray.cpp -SOURCE utils.cpp -SOURCE gestureeventfilter.cpp -SOURCE gesturehelpereventsender.cpp - -LIBRARY avkon.lib -LIBRARY cone.lib -LIBRARY euser.lib -LIBRARY gdi.lib -LIBRARY flogger.lib diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/rom/rt_gesturehelper.iby --- a/webengine/webkitutils/rt_gesturehelper/rom/rt_gesturehelper.iby Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: RT Gesture helper iby file -* -*/ - - -#ifndef _RT_GESTUREHELPER_IBY_ -#define _RT_GESTUREHELPER_IBY_ - -#ifdef __S60_32__ -#include -#else -#include -#endif - -#ifdef BRDO_USE_GESTURE_HELPER - -#include - -file=ABI_DIR\BUILD_DIR\rt_gesturehelper.dll SHARED_LIB_DIR\rt_gesturehelper.dll - -#endif // BRDO_USE_GESTURE_HELPER - -#endif // _RT_GESTUREHELPER_IBY_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesture.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gesture.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,726 +0,0 @@ -/* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture class -* -*/ - - -#include "gesture.h" - -#include -#include - -#include "gesturedefs.h" -#include "utils.h" - -using namespace RT_GestureHelper; - -/** - * Point array for which only x axis is relevant - */ -class TXAxisPointArray : public TPointArray - { -public: - TXAxisPointArray( const RArray< TPointEntry >& aPoints ) - : TPointArray( aPoints ) {} - - // from TPointArray - TPoint operator[]( TInt aIndex ) const - { - return TPoint( Raw( aIndex ).iX, 0 ); - } - }; - -/** - * Point array for which only y axis is relevant - */ -class TYAxisPointArray : public TPointArray - { -public: - TYAxisPointArray( const RArray< TPointEntry >& aPoints ) - : TPointArray( aPoints ) {} - - // from TPointArray - TPoint operator[]( TInt aIndex ) const - { - return TPoint( 0, Raw( aIndex ).iY ); - } - }; - -namespace - { - /** @return the current time */ - TTime CurrentTime() - { - TTime time; - time.HomeTime(); - return time; - } - - /** - * @param aRelevantAxis See @ref MGestureEvent::Code - * @return gesture code by analysing the sequence of points - */ - TGestureCode CodeFromPoints( const RArray< TPointEntry >& aPoints, - TAxis aRelevantAxis ) - { - // select the correct filter based on aRelevantAxis - // these filter_ objects are array decorators that will eliminate either - // x, y or neither coordinate of each point - TXAxisPointArray filterY( aPoints ); - TYAxisPointArray filterX( aPoints ); - TPointArray filterNone( aPoints ); - TPointArray& filter = - aRelevantAxis == EAxisHorizontal ? static_cast< TPointArray& >( filterY ) : - aRelevantAxis == EAxisVertical ? static_cast< TPointArray& >( filterX ) : - /* otherwise EAxisBoth */ filterNone; - - // currently the gesture recogniser does not have any state, so it is fast - // to instantiate. The call is not static however, to allow the recogniser - // to be replaced by a more complicated implementation that has state. - // then it may make sense to make the recogniser a member variable. - return TGestureRecogniser().GestureCode( filter ); - } - } // unnamed namespace - -// ---------------------------------------------------------------------------- -// destructor -// ---------------------------------------------------------------------------- -// -CGesture::~CGesture() - { - iPoints.Close(); - } - -// ---------------------------------------------------------------------------- -// AsStartEventL -// ---------------------------------------------------------------------------- -// -CGesture* CGesture::AsStartEventLC() const - { - __ASSERT_DEBUG( 0 < iPoints.Count(), Panic( EGesturePanicIllegalLogic ) ); - CGesture* gesture = new ( ELeave ) CGesture; - CleanupStack::PushL( gesture ); - User::LeaveIfError( gesture->AddPoint( iPoints[0].iPos, CCoeEnv::Static()->LastEvent().Time())); - return gesture; - } - -// ---------------------------------------------------------------------------- -// Reset -// ---------------------------------------------------------------------------- -// -void CGesture::Reset() - { - iPoints.Reset(); - iHoldingState = ENotHolding; - iState = ENotComplete; - iHoldingPointIndex = 0; - iIsDoubleTap = EFalse; - iIsLongTap = EFalse; - } - -// ---------------------------------------------------------------------------- -// Reset -// ---------------------------------------------------------------------------- -// -TBool CGesture::IsEmpty() const - { - return iPoints.Count() == 0; - } - -// ---------------------------------------------------------------------------- -// Add a point to the sequence of points that together make up the gesture -// ---------------------------------------------------------------------------- -// -TInt CGesture::AddPoint( const TPoint& aPoint, const TTime& aEventTime ) - { - if ( !IsLatestPoint( aPoint ) ) - { - return iPoints.Append( TPointEntry( aPoint, aEventTime ) ); - } - return KErrNone; - } - -// ---------------------------------------------------------------------------- -// SetVisual -// ---------------------------------------------------------------------------- -// - - -// ---------------------------------------------------------------------------- -// IsNearHoldingPoint -// ---------------------------------------------------------------------------- -// -TBool CGesture::IsNearHoldingPoint( const TPoint& aPoint ) const - { - return ToleranceRect( iPoints[ iHoldingPointIndex ].iPos ).Contains( aPoint ); - } - -// ---------------------------------------------------------------------------- -// IsLatestPoint -// ---------------------------------------------------------------------------- -// -TBool CGesture::IsLatestPoint( const TPoint& aPoint ) const - { - if ( iPoints.Count() > 0 ) - { - return aPoint == CurrentPos(); - } - return EFalse; - } - -// ---------------------------------------------------------------------------- -// StartHolding -// ---------------------------------------------------------------------------- -// -void CGesture::StartHolding() - { - iHoldingState = EHoldStarting; - - // remove all points that were introduced after holding started - for ( TInt i = iPoints.Count() - 1; i > iHoldingPointIndex; i-- ) - { - iPoints.Remove( i ); - } - } - -// ---------------------------------------------------------------------------- -// SetHoldingPoint -// ---------------------------------------------------------------------------- -// -void CGesture::SetHoldingPoint() - { - iHoldingPointIndex = iPoints.Count() - 1; - } - -// ---------------------------------------------------------------------------- -// ContinueHolding -// ---------------------------------------------------------------------------- -// -void CGesture::ContinueHolding() - { - iHoldingState = EHolding; - } - -// ---------------------------------------------------------------------------- -// SetReleased -// ---------------------------------------------------------------------------- -// -void CGesture::SetReleased() - { - // IsMovementStopped expects SetComplete to be called before SetRelea - __ASSERT_DEBUG( EComplete == iState, Panic( EGesturePanicIllegalLogic ) ); - iState = EReleased; - } - -/** - * @return elapsed time between aStartTime and aEndTime - */ -inline TTimeIntervalMicroSeconds32 Elapsed( const TTime& aStartTime, - const TTime& aEndTime ) - { - return aEndTime.MicroSecondsFrom( aStartTime ).Int64(); - } - -// ---------------------------------------------------------------------------- -// SetComplete -// ---------------------------------------------------------------------------- -// -void CGesture::SetComplete() - { - __ASSERT_DEBUG( iPoints.Count() > 0, Panic( EGesturePanicIllegalLogic ) ); - iState = EComplete; - iCompletionTime = CurrentTime(); - } - -// ---------------------------------------------------------------------------- -// SetComplete -// ---------------------------------------------------------------------------- -// -void CGesture::SetCancelled() - { - iState = ECancelled; - } - -void CGesture::SetDoubleTap() - { - iIsDoubleTap = ETrue; - } - -void CGesture::SetLongTap(TBool aLongTap) - { - iIsLongTap = aLongTap; - } - -// ---------------------------------------------------------------------------- -// IsTap -// ---------------------------------------------------------------------------- -// -TBool CGesture::IsTap() const - { - return CodeFromPoints( iPoints, EAxisBoth ) == EGestureTap; - } - -/** - * Translates a non-holding code into a holding code - * @param aCode original gesture code - * @return a gesture code with hold flag applied - */ -inline TGestureCode Hold( TGestureCode aCode ) - { - if ( aCode != EGestureStart && - aCode != EGestureDrag && - aCode != EGestureReleased && - aCode != EGestureUnknown ) - { - return static_cast< TGestureCode >( aCode | EFlagHold ); - } - return aCode; - } - -// ---------------------------------------------------------------------------- -// Code -// ---------------------------------------------------------------------------- -// -TGestureCode CGesture::Code( TAxis aRelevantAxis ) /* const */ - { - TGestureCode code; - - switch ( iState ) - { - case ENotComplete: - { - // "start" event if only first point received - // need to check that not holding, in case user pressed stylus - // down, and activated holding without moving the stylus - if ( iPoints.Count() == 1 && !IsHolding() ) - { - code = EGestureStart; - } - // "drag" event if holding not started or holding started earlier - else if ( iHoldingState != EHoldStarting ) - { - code = EGestureDrag; - } - // holding was just started - else - { - code = Hold( CodeFromPoints( iPoints, aRelevantAxis ) ); - } - iPrevGestureCode = code; - break; - } - case EComplete: - { - if ( iIsDoubleTap ) - { - code = EGestureDoubleTap; - } - else if ( iIsLongTap ) - { - code = EGestureLongTap; - } - - else if (iPrevGestureCode == EGestureDrag) - { - //code = IsFlick() ? EGestureFlick : EGestureDrop; - if (IsFlick()) - { - code = EGestureFlick ; - } - else - { - // Check if it is a swipe. In this case a swipe is a gesture where - // - the direction is close to the axes (up, down, left, right) - // - speed is slower than flick - code = CodeFromPoints( iPoints, aRelevantAxis ); - if (code == EGestureUnknown) - { - code = EGestureDrop ; // It was not a swipe, so then it is the drop gesture - } - } - } - else - { - code = CodeFromPoints( iPoints, aRelevantAxis ); - } - iPrevGestureCode = code; - break; - } - - case EReleased: - { - code = EGestureReleased; - break; - } - - case ECancelled: // fallthrough - default: - code = EGestureUnknown; - } - return code; - } - - -TBool CGesture::IsFlick() const - { - bool flick = EFalse; - TRealPoint speed = Speed(); - TReal32 xSpeed = speed.iX; - TReal32 ySpeed = speed.iY; - - flick = (Abs(xSpeed) > KFlickSpeed || - Abs(ySpeed) > KFlickSpeed); - - return flick; - } - -// ---------------------------------------------------------------------------- -// IsHolding -// ---------------------------------------------------------------------------- -// -TBool CGesture::IsHolding() const - { - return iHoldingState >= EHoldStarting; - } - -// ---------------------------------------------------------------------------- -// StartPos -// ---------------------------------------------------------------------------- -// -TPoint CGesture::StartPos() const - { - // at least one point will be in the array during callback (pointer down pos) - return iPoints[ 0 ].iPos; - } - -// ---------------------------------------------------------------------------- -// CurrentPos -// ---------------------------------------------------------------------------- -// -TPoint CGesture::CurrentPos() const - { - // at least on point will be in the array during callback (pointer down pos) - return iPoints.Count() > 0 ? iPoints[ iPoints.Count() - 1 ].iPos : TPoint(-1, -1); - } - -// ---------------------------------------------------------------------------- -// IsMovementStopped -// ---------------------------------------------------------------------------- -// -inline TBool CGesture::IsMovementStopped() const - { - // iCompletionTime is only only valid if client has called SetComplete - if ( iState >= EComplete ) - { - TInt el = Elapsed( NthLastEntry( 1 ).iTime, iCompletionTime ).Int(); - return el > KSpeedStopTime; - } - return EFalse; - } - -namespace - { - const TInt KFloatingPointAccuracy = 0.000001; - - /** @return percentage (0.0-1.0) how far aPos is from aEdge1 towards aEdge2 */ - inline TReal32 Proportion( TReal32 aPos, TReal32 aEdge1, TReal32 aEdge2 ) - { - if ( Abs( aEdge2 - aEdge1 ) > KFloatingPointAccuracy ) - { - return ( aPos - aEdge1 ) / ( aEdge2 - aEdge1 ); - } - return 0; // avoid division by zero - } - - /** Edges (pixels) at which speed should be -100% or 100% */ - NONSHARABLE_STRUCT( TEdges ) - { - TReal32 iMin; - TReal32 iMax; - }; - - /** - * scale which allows different (coordinate -> percentage) mapping - * between -100% to 0% and 0 and 100% - */ - NONSHARABLE_STRUCT( TScale ) - { - TScale( TInt aZero, const TEdges& aEdges ) - : iMin( aEdges.iMin ), iZero( aZero ), iMax( aEdges.iMax ) - { - } - - /** @return aPos as a percentage between -100% and 100% in aScale */ - TReal32 Percent( TReal32 aPos ) const; - - /// coordinate where speed is -100% - TReal32 iMin; - /// coordinate where speed is 0% - TReal32 iZero; - /// coordinate where speed is 100% - TReal32 iMax; - }; - - /** @convert aPos into a percentage between -100% and 100% in aScale */ - TReal32 TScale::Percent( TReal32 aPos ) const - { - TReal32 percent; - if ( aPos < iZero ) - { - // return negative percentages on the lower side of zero point - percent = -1 * Proportion( aPos, iZero, iMin ); - } - else - { - percent = Proportion( aPos, iZero, iMax ); - } - // constrain between -100% and 100% - return Min( Max( percent, -1.0F ), 1.0F ); - } - - /** Scale in x and y dimensions */ - NONSHARABLE_STRUCT( TScale2D ) - { - TRealPoint Percent( const TPoint& aPos ) const - { - return TRealPoint( iX.Percent( aPos.iX ), - iY.Percent( aPos.iY ) ); - } - - TScale iX; - TScale iY; - }; - - enum TDirection { ESmaller, ELarger }; - - /** @return the direction of pos compared to the previous pos */ - inline TDirection Direction( TInt aPos, TInt aPreviousPos ) - { - return aPos < aPreviousPos ? ESmaller : ELarger; - } - - /** Direction in x and y dimensions */ - NONSHARABLE_STRUCT( TDirection2D ) - { - TDirection iX; - TDirection iY; - }; - - /** Return the direction (up/down) of signal at aIndex */ - inline TDirection2D Direction( TInt aIndex, const RArray< TPointEntry >& aPoints ) - { - const TPoint& pos = aPoints[ aIndex ].iPos; - const TPoint& prevPos = aPoints[ aIndex - 1 ].iPos; - TDirection2D dir = { Direction( pos.iX, prevPos.iX ), - Direction( pos.iY, prevPos.iY ) }; - return dir; - } - /** - * @return a position in the aLow and aHigh, so that it aProportion of - * of length is above the pos - */ - TReal32 ProportionalLength( TReal32 aLow, TReal32 aHigh, TReal32 aProportion ) - { - return ( aHigh - aLow ) * aProportion / ( 1 + aProportion ); - } - - /** - * @return aVariableEdge scaled to new position, when the other edge changes - * from aOldEdge to aNewEdge, so that aOrigin maintains the *same relative - * position* between aVariableEdge and the other edge - */ - inline TReal32 ScaledEdge( TReal32 aOrigin, TReal32 aVariableEdge, - TReal32 aOldEdge, TReal aNewEdge ) - { - TReal32 proportion = Proportion( aOrigin, aVariableEdge, aOldEdge ); - return ( proportion * aNewEdge - aOrigin ) / ( proportion - 1 ); - } - - TScale Rescale( TReal32 aPos, TDirection aDir, TDirection aPrevDir, - const TScale& aPrevScale, const TEdges& aEdges ) - { - TScale scale( aPrevScale ); - if ( aPrevDir != aDir ) - { - // the code duplication is accepted here, since it is difficult to factor out - // while maintaining the understandability of this anyway complex algorithm - if ( aDir == ESmaller ) - { - scale.iMin = aEdges.iMin; - if ( aPrevScale.iZero < aPos ) - { - TReal32 proportionAboveZero = Proportion( aPos, aPrevScale.iZero, aPrevScale.iMax ); - scale.iZero = aPos - ProportionalLength( aEdges.iMin, aPos, proportionAboveZero ); - } - else - { - // adjust zero pos so that proportion between aPos, Min, and Zero pos - // stay the same (Min will move to 0, aPos stays the same) - scale.iZero = ScaledEdge( aPos, aPrevScale.iZero, - aPrevScale.iMin, aEdges.iMin ); - } - // adjust the upper edge to take into account the movement of zero pos - scale.iMax = ScaledEdge( aPos, aPrevScale.iMax, - aPrevScale.iZero, scale.iZero ); - } - else // ELarger - { - scale.iMax = aEdges.iMax; - if ( aPos < aPrevScale.iZero ) - { - TReal32 proportionBelowZero = Proportion( aPos, aPrevScale.iZero, aPrevScale.iMin ); - scale.iZero = aPos + ProportionalLength( aPos, aEdges.iMax, proportionBelowZero ); - } - else - { - // adjust zero pos so that proportion between aPos, Max, and Zero pos - // stay the same (Max will move edge, aPos stays the same) - scale.iZero = ScaledEdge( aPos, aPrevScale.iZero, - aPrevScale.iMax, aEdges.iMax ); - } - // adjust the lower edge to take into account the movement of zero pos - scale.iMin = ScaledEdge( aPos, aPrevScale.iMin, - aPrevScale.iZero, scale.iZero ); - } - } - return scale; - } - - /** Edges in x and y dimensions */ - NONSHARABLE_STRUCT( TEdges2D ) - { - TEdges iX; - TEdges iY; - }; - - /** - * @param aEdges edges of the area in which gesture points are accepted - * @return the scale of latest point in the list of points - */ - TScale2D Scale( const RArray< TPointEntry >& aPoints, const TEdges2D& aEdges ) - { - TScale2D scale = { TScale( aPoints[0].iPos.iX, aEdges.iX ), - TScale( aPoints[0].iPos.iY, aEdges.iY ) }; - TInt count = aPoints.Count(); - if ( count > 1 ) - { - // iterate the whole point list to arrive to the current scale - TDirection2D dir( Direction( 1, aPoints ) ); - for ( TInt i = 1; i < count; i++ ) - { - // get direction at i - TDirection2D newDir( Direction( i, aPoints ) ); - // get new scale at i - scale.iX = Rescale( aPoints[i - 1].iPos.iX, newDir.iX, dir.iX, scale.iX, aEdges.iX ); - scale.iY = Rescale( aPoints[i - 1].iPos.iY, newDir.iY, dir.iY, scale.iY, aEdges.iY ); - dir = newDir; - } - } - return scale; - } - } // unnamed namespace - -TRealPoint CGesture::SpeedPercent( const TRect& aEdges ) const - { - // x and y coordinates are easier to handle separately, extract from TRect: - // ((iMinX, iMinY), (iMaxX, iMaxY)) -> ((iMinX, iMaxX), (iMinY, iMaxY)) - TEdges2D edges = { { aEdges.iTl.iX, aEdges.iBr.iX }, - { aEdges.iTl.iY, aEdges.iBr.iY } }; - // work out the current scale (coordinate -> percentage mapping) from - // the history of points (i.e., points of current gesture). Then - // calculate the percentage of the current position. - return Scale( iPoints, edges ).Percent( CurrentPos() ); - } - -// ---------------------------------------------------------------------------- -// Speed -// ---------------------------------------------------------------------------- -// -TRealPoint CGesture::Speed() const - { - const TReal32 KMicroSecondsInSecond = 1000000; - - // Speed is only evaluated at the end of the swipe - // if user stops at the end of the swipe before lifting stylus, - // speed is zero. If time is zero, return 0 speed (infinite does - // not make sense either). Will need to consider also earlier points - // and their times or start time, if this zero-speed behavior is a problem - TRealPoint speed; - TReal32 time = static_cast( TimeFromPreviousPoint().Int() ) - / KMicroSecondsInSecond; - if ( !IsMovementStopped() && time > 0 ) - { - TPoint distance = CurrentPos() - PreviousPos(); - speed.iX = static_cast( distance.iX ) / time; - speed.iY = static_cast( distance.iY ) / time; - } - return speed; - } - -// ---------------------------------------------------------------------------- -// Distance -// ---------------------------------------------------------------------------- -// -TPoint CGesture::Distance() const - { - return CurrentPos() - StartPos(); - } - -// ---------------------------------------------------------------------------- -// Visual -// ---------------------------------------------------------------------------- -// - -// ---------------------------------------------------------------------------- -// TimeFromPreviousPoint -// ---------------------------------------------------------------------------- -// -inline TTimeIntervalMicroSeconds32 CGesture::TimeFromPreviousPoint() const - { - const TInt KLatestEntryOffset = 1; - return Elapsed( PreviousEntry().iTime, NthLastEntry( KLatestEntryOffset ).iTime ); - } - -// ---------------------------------------------------------------------------- -// return nth point from the end of the points array -// ---------------------------------------------------------------------------- -// -inline const TPointEntry& CGesture::NthLastEntry( TInt aOffset ) const - { - return iPoints[ Max( iPoints.Count() - aOffset, 0 ) ]; - } - -// ---------------------------------------------------------------------------- -// PreviousEntry -// ---------------------------------------------------------------------------- -// -inline const TPointEntry& CGesture::PreviousEntry() const - { - return NthLastEntry( KPreviousPointOffset ); - } - -// ---------------------------------------------------------------------------- -// PreviousPos -// ---------------------------------------------------------------------------- -// -inline TPoint CGesture::PreviousPos() const - { - return PreviousEntry().iPos; - } - -inline TTime CGesture::TimeOfLastEntry() const - { - return NthLastEntry( 1 ).iTime; - } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesture.h --- a/webengine/webkitutils/rt_gesturehelper/src/gesture.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -/* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture class -* -*/ - -#ifndef _GESTURE_H_ -#define _GESTURE_H_ - -#include - -#include -#include "gesturerecogniser.h" -#include "pointarray.h" - -namespace RT_GestureHelper -{ - -enum TEventState - { - ENoEvent = 0, - ETouchDown, - ETouchUp, - EMove, - ELongTouchDown - }; - -/** - * TGesture represents the gesture that the user has made. - * Implements MGestureEvent interface to allow clients to - * inspect the gesture - */ -NONSHARABLE_CLASS( CGesture ) : public CBase - { -public: - /** destructor */ - ~CGesture(); - - /** - * @return a new gesture that will have only the first point - * of this gesture. Can be used to create gesture's a "start" event - * after some other points have been received. - */ - CGesture* AsStartEventLC() const; - - /** - * Sets the gesture as empty. resets timers to receive points - * immediately - */ - void Reset(); - - /** @return ETrue if the gesture has no points */ - TBool IsEmpty() const; - - /** - * Add a point to the sequence of points that forms the gesture - * Call Reset() just before adding the first point - * @param aPoint the point to add - * @return error code - */ - TInt AddPoint( const TPoint& aPoint, const TTime& eventtime); - - /** Set the visual of this gesture. Should be called when gesture starts */ - - /** @return ETrue if the point is very near the holding point */ - TBool IsNearHoldingPoint( const TPoint& aPoint ) const; - /** Set the latest point as the holding point */ - void SetHoldingPoint(); - /** @return ETrue if aPoint is the same as point added last */ - TBool IsLatestPoint( const TPoint& aPoint ) const; - - /** - * After call, Code(...) will return appropriate holding gesture code. - */ - void StartHolding(); - /** - * After call, Code(...) will return a "hold released" gesture code when - * the gesture is completed. Meanwhile, code will be drag. - */ - void ContinueHolding(); - /** Set as stylus released */ - void SetReleased(); - /** Set the gesture as complete. Gesture is completed at pointer up */ - void SetComplete(); - /** After call, Code(...) will return a "cancelled" gesture code */ - void SetCancelled(); - - /** force returning a code as double tap when gesture is complete */ - void SetDoubleTap(); - - /** - * @return Whether the current gesture is a tap (and hence not a swipe) - * Does not consider holding or other state information (such as - * whether the gesture was just started or is dragging). - * Results are based purely on the current stream of points. - */ - TBool IsTap() const; - - void SetLongTap(TBool aLongTap); - -// From MGestureEvent - TTime TimeOfLastEntry() const; - inline TGestureCode PreviousGestureCode() { return iPrevGestureCode; }; - TGestureCode Code( TAxis aRelevantAxis ); - TBool IsHolding() const; - TPoint StartPos() const; - TPoint CurrentPos() const; - TRealPoint Speed() const; - TRealPoint SpeedPercent( const TRect& aEdges ) const; - TPoint Distance() const; - - - - -private: - /** @return elapsed time between the latest and previous points */ - inline TTimeIntervalMicroSeconds32 TimeFromPreviousPoint() const; - - /** @return elapsed time between the latest and first points */ - inline TTimeIntervalMicroSeconds32 TimeFromStart() const; - - /** @return ETrue if user has stopped moving the stylus before lifting it */ - inline TBool IsMovementStopped() const; - - /** @return aOffset'th last entry in the list of points */ - inline const TPointEntry& NthLastEntry( TInt aOffset ) const; - - /** @return previous point (may not be exactly the point before last) */ - inline const TPointEntry& PreviousEntry() const; - - /** @return position of point received just before the latest point */ - inline TPoint PreviousPos() const; - - - - TBool IsFlick() const; -private: - /// sequence of points that make up the gesture. own. - RArray< TPointEntry > iPoints; - /// index in iPoints of the point in which user started holding - TInt iHoldingPointIndex; - - /// the different states that indicate whether user has made a holding gesture - enum THoldingState - { - ENotHolding = 0, // before holding activated (i.e., holding not activated) - EHoldStarting, // holding activated just now (lasts just one callback round) - EHolding // holding activated earlier - }; - - /// state that indicates is user has held the pointer down in one position - /// for long time to indicate a holding gesture - THoldingState iHoldingState; - - /// Whether the gesture completion code will be forcefully overridden to be double tap, - /// regardless of what the points are - TBool iIsDoubleTap; - - enum TCompletionState - { - // Note: implementation assumes this order of enums - ENotComplete = 0, - ECancelled, - EComplete, - EReleased - }; - /// gesture only becomes complete when user lifts the pointer - TCompletionState iState; - - /// time when the stylus was lifted. - TTime iCompletionTime; - - /// visual relevant to this gesture. null if not known. - - TGestureCode iPrevGestureCode; - - TBool iIsLongTap; - TBool iIsStopFlick; - }; - -} // namespace GestureHelper - -#endif // _GESTURE_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturedefs.h --- a/webengine/webkitutils/rt_gesturehelper/src/gesturedefs.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper constant definitions -* -*/ - - -#ifndef _GESTUREDEFS_H_ -#define _GESTUREDEFS_H - -#include /// @todo check this is correct - -namespace RT_GestureHelper -{ - -/// time to hold the stylus in the same position to activate holding -const TInt KHoldDuration = 500000; // microseconds - -/// time to tap again for the second tap to be a double tap -const TInt KMaxDoubleTapDuration = 400000; // microseconds - -/// time in which speed becomes zero if user stops stylus movement before -/// lifting the pointer -const TInt KSpeedStopTime = 150000; // microseconds - -/// tolerance in degrees to either side of an angle, for direction to be the -/// same as reference angle -const TReal KAngleTolerance = 25; - -/// Nth pointer event before the latest point -const TInt KPreviousPointOffset = 3; - -/// Tolerance for ignoring small movements, percent of longer screen edge -const TInt KGestureTolerancePercent = 2; // of 100 - -const TInt KFingerSize_mm = 8; - -const TInt KTwipsInInch = 1440; - -const TReal KTwipsInMm = 56.7; - -const TInt KMaxTapDuration = 300000; //microseconds - -const TInt KFlickSpeed = 500; - -const TInt KDoubleTapMaxActivationInterval = 500000; // 500 ms - -const TInt KDoubleTapMinActivationInterval = 40000; // 40 ms - -const TInt KDoubleTapIdleInterval = 700000; // 700 ms, to prevent triple-tap effects - -const TInt KLongTapDuration = 2000000; //2 sec - -const TInt KMinTimeBetweenDrags = 20000; // 20 ms -/** - * Panic codes - */ -enum TGesturePanic - { - EGesturePanicIllegalLogic - }; - -/** Panics the thread */ -inline void Panic( TGesturePanic aReason ) - { - _LIT( KComponentName, "GestureHelper" ); - User::Panic( KComponentName, aReason ); - } - -} // namespace GestureHelper - -#endif // _GESTUREDEFS_H diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gestureevent.h --- a/webengine/webkitutils/rt_gesturehelper/src/gestureevent.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - -#ifndef GESTUREEVENT_H_ -#define GESTUREEVENT_H_ - -#include -#include -#include "pointarray.h" - -namespace RT_GestureHelper -{ -NONSHARABLE_CLASS( CGestureEvent ) : public CBase, public MGestureEvent - { -public: - // From MGestureEvent - TGestureCode Code( TAxis /*aRelevantAxis*/ ) { return iCode; }; - TBool IsHolding() const { return iIsHolding; }; - TPoint StartPos() const { return iStartPos; }; - TPoint CurrentPos() const { return iCurrPos; }; - TRealPoint Speed() const { return iSpeed; }; - TRealPoint SpeedPercent( const TRect& /*aEdges*/ ) const { return iSpeedPercent; }; - TPoint Distance() const { return iDistance; }; - CAlfVisual* Visual() const { return iVisual; }; - - - TGestureCode iCode; - TBool iIsHolding; - TPoint iStartPos; - TPoint iCurrPos; - TRealPoint iSpeed; - TRealPoint iSpeedPercent; - TPoint iDistance; - CAlfVisual* iVisual; - }; -} - - -#endif /* GESTUREEVENT_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gestureeventfilter.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gestureeventfilter.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/* -* 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 the License "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: -* -*/ -/* - * gestureeventfilter.cpp - * - * Created on: Jan 22, 2009 - * Author: tyutyuni - */ - -#include "gesturedefs.h" -#include "gestureeventfilter.h" - - -using namespace RT_GestureHelper; - -CGestureEventFilter::CGestureEventFilter(TInt aTapSize):iTapSize(aTapSize) - { - - } - -CGestureEventFilter::~CGestureEventFilter() - { - - } - - -TBool CGestureEventFilter::FilterDrag(const TPointerEvent& aPointerEvent, TInt& aReason) - { - TTime now; - now.HomeTime(); - return FilterDrag(aPointerEvent, now, aReason); - } - -TBool CGestureEventFilter::FilterDrag(const TPointerEvent& aPointerEvent, TTime& eventTime, TInt& aReason) - { - TBool filtered = EFalse; - - aReason = EFilteredNoReason; - - switch (aPointerEvent.iType) - { - case TPointerEvent::EButton1Down: - { - iIsTouchDown = ETrue; - iTouchDownTime = iLastEventTime; - iTouchDownPos = aPointerEvent.iPosition; - break; - } - case TPointerEvent::EDrag: - { - if (iIsTouchDown) - { - TPoint delta = aPointerEvent.iPosition - iTouchDownPos; - filtered = (Abs(delta.iX) <= iTapSize && Abs(delta.iY) <= iTapSize); - aReason = (filtered) ? EFilteredBySize : EFilteredNoReason; - } - - if (!filtered) - { - filtered = (eventTime.MicroSecondsFrom(iLastEventTime) < KMinTimeBetweenDrags); - aReason = (filtered) ? EFilteredByTime : EFilteredNoReason; - } - - if (!filtered) - { - iLastEventTime = eventTime; - } - iIsTouchDown = filtered; - - break; - } - case TPointerEvent::EButton1Up: - { - iIsTouchDown = EFalse; - break; - } - } - - - return filtered; - } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gestureeventfilter.h --- a/webengine/webkitutils/rt_gesturehelper/src/gestureeventfilter.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* -* 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 the License "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: -* -*/ -/* - * gestureeventfilter.h - * - * Created on: Jan 22, 2009 - * Author: tyutyuni - */ - -#include -#include -#include - - -#ifndef GESTUREEVENTFILTER_H_ -#define GESTUREEVENTFILTER_H_ - - - - -namespace RT_GestureHelper -{ - -enum TFilterReason - { - EFilteredNoReason, - EFilteredBySize, - EFilteredByTime - }; - -NONSHARABLE_CLASS(CGestureEventFilter) : public CBase - { - public: - CGestureEventFilter(TInt aTapSize); - ~CGestureEventFilter(); - TBool FilterDrag(const TPointerEvent& aPointerEvent, TTime& eventTime, TInt& aReason); - TBool FilterDrag(const TPointerEvent& aPointerEvent, TInt& aReason); - private: - TTime iTouchDownTime; - TPoint iTouchDownPos; - TBool iIsTouchDown; - TTime iLastEventTime; - TInt iTapSize; - }; - -} -#endif /* GESTUREEVENTFILTER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturehelper.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gesturehelper.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper interface -* -*/ - -// class include -#include - -// local includes -#include "gesturehelperimpl.h" - -using namespace RT_GestureHelper; - -// ---------------------------------------------------------------------------- -// Two-phase constructor -// ---------------------------------------------------------------------------- -// -EXPORT_C CGestureHelper* CGestureHelper::NewL( MGestureObserver& aObserver ) - { - CGestureHelper* self = new ( ELeave ) CGestureHelper; - CleanupStack::PushL( self ); - self->iImpl = CGestureHelperImpl::NewL( aObserver ); - CleanupStack::Pop( self ); - return self; - } - -// ---------------------------------------------------------------------------- -// Destructor -// ---------------------------------------------------------------------------- -// -EXPORT_C CGestureHelper::~CGestureHelper() - { - delete iImpl; - } - -// ---------------------------------------------------------------------------- -// SetHoldingEnabled -// ---------------------------------------------------------------------------- -// -EXPORT_C void CGestureHelper::SetHoldingEnabled( TBool aEnabled ) - { - iImpl->SetHoldingEnabled( aEnabled ); - } - -// ---------------------------------------------------------------------------- -// IsHoldingEnabled -// ---------------------------------------------------------------------------- -// -EXPORT_C TBool CGestureHelper::IsHoldingEnabled() const - { - return iImpl->IsHoldingEnabled(); - } - -// ---------------------------------------------------------------------------- -// SetDoubleTapEnabled -// ---------------------------------------------------------------------------- -// -EXPORT_C void CGestureHelper::SetDoubleTapEnabled( TBool aEnabled ) - { - iImpl->SetDoubleTapEnabled( aEnabled ); - } - -// ---------------------------------------------------------------------------- -// IsDoubleTapEnabled -// ---------------------------------------------------------------------------- -// -EXPORT_C TBool CGestureHelper::IsDoubleTapEnabled() const - { - return iImpl->IsDoubleTapEnabled(); - } - - - - -// ---------------------------------------------------------------------------- -// HandlePointerEventL -// ---------------------------------------------------------------------------- -// -EXPORT_C TBool CGestureHelper::HandlePointerEventL( const TPointerEvent& aEvent ) - { - return iImpl->HandlePointerEventL( aEvent ); - } - - - - - -// ---------------------------------------------------------------------------- -// Cancel -// ---------------------------------------------------------------------------- -// -EXPORT_C void CGestureHelper::Cancel() - { - iImpl->Reset(); - } - diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturehelpereventsender.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gesturehelpereventsender.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - -#include "gesturehelpereventsender.h" -#include "gesture.h" - -using namespace RT_GestureHelper; - -const TInt KEventsQueueGranularity = 4; - -CGestureEventSender* CGestureEventSender::NewL( MGestureObserver& aObserver ) - { - CGestureEventSender* self = new (ELeave) CGestureEventSender(aObserver); - - return self; - } - -CGestureEventSender::CGestureEventSender( MGestureObserver& aObserver ) : - CActive(EPriorityUserInput - 1), - iObserver(aObserver), iEvents(KEventsQueueGranularity) - { - CActiveScheduler::Add(this); - } - -CGestureEventSender::~CGestureEventSender() - { - if (IsActive()) - { - Cancel(); - } - - iEvents.Close(); - } - -TInt CGestureEventSender::AddEvent(const TGestureEvent& aGestureEvent) - { - iEvents.Append(aGestureEvent); - if (iState != EBusy) - { - iState = EEventsReady; - } - - if (!IsActive()) - { - Complete(); - } - return iEvents.Count(); - } - -void CGestureEventSender::Complete() - { - TRequestStatus* status = &iStatus; - User::RequestComplete(status, KErrNone); - SetActive(); - } - -void CGestureEventSender::RunL() - { - switch (iState) - { - case EEventsReady: - { - if (iEvents.Count() > 0) - { - TInt count = iEvents.Count(); - for (int i = 0; i < count; i++) - { - TGestureEvent& gst = iEvents[i]; - EmitEventL(gst); - } - } - iEvents.Reset(); - iState = ENoEvents; - Complete(); - break; - } - } - } - -void CGestureEventSender::EmitEventL( const TGestureEvent& aGesture ) - { - iState = EBusy; - iObserver.HandleGestureL(aGesture); - iState = EEventsReady; - } - -TInt CGestureEventSender::RunError(TInt aError) - { - iEvents.Reset(); - return aError; - } - -void CGestureEventSender::DoCancel() - { - iEvents.Reset(); - iState = ENoEvents; - } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturehelpereventsender.h --- a/webengine/webkitutils/rt_gesturehelper/src/gesturehelpereventsender.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - -#ifndef GESTUREHELPEREVENTSENDER_H_ -#define GESTUREHELPEREVENTSENDER_H_ - -#include -#include -#include - -namespace RT_GestureHelper -{ -class MGestureObserver; -class CGestureEvent; - -NONSHARABLE_CLASS(CGestureEventSender) : public CActive - { -public: - enum TEventSenderState - { - ENoEvents, - EEventsReady, - EBusy - }; - static CGestureEventSender* NewL( MGestureObserver& aObserver ); - ~CGestureEventSender(); - TInt AddEvent(const TGestureEvent& aGestureEvent); -protected: - void RunL(); - void DoCancel(); - TInt RunError(TInt aError); -private: - CGestureEventSender(MGestureObserver& aObserver); - void Complete(); - void EmitEventL( const TGestureEvent& aGestureEvent ); - - RArray< TGestureEvent > iEvents; - MGestureObserver& iObserver; - TEventSenderState iState; - }; -} -#endif /* GESTUREHELPEREVENTSENDER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturehelperimpl.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gesturehelperimpl.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,631 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - - -#include "gesturehelperimpl.h" - -#include -#include - -#include "gesture.h" -#include "gesturedefs.h" -#include "utils.h" -#include "gestureeventfilter.h" -#include "gesturehelpereventsender.h" -#include "flogger.h" - -using namespace RT_GestureHelper; - -namespace RT_GestureHelper -{ - -/// type of function in gesture helper to be called by the timer -/// when timer triggers -typedef void (CGestureHelperImpl::*CallbackFunctionL)(); - -NONSHARABLE_CLASS( CCallbackTimer ) : public CTimer - { -public: - /** Two-phase constructor */ - static CCallbackTimer* NewL( CGestureHelperImpl& aHelper, - CallbackFunctionL aCallbackFunctionL, TInt aDelay, TBool aIsEnabled ) - { - CCallbackTimer* self = new ( ELeave ) CCallbackTimer( aHelper, - aCallbackFunctionL, aDelay, aIsEnabled ); - CleanupStack::PushL( self ); - self->ConstructL(); // construct base class - CActiveScheduler::Add( self ); - CleanupStack::Pop( self ); - return self; - } - - /** Destructor */ - ~CCallbackTimer() - { - Cancel(); - } - - /** Set whether sending holding events is currently enabled */ - void SetEnabled( TBool aEnabled ) - { - iIsEnabled = aEnabled; - // cancel in case hold timer is already running - Cancel(); - } - - /** @return whether sending holding events is currently enabled */ - TBool IsEnabled() const - { - return iIsEnabled; - } - - /** Start the timer. Calls CGestureHelperImpl::StartHoldingL upon completion */ - void Start() - { - // if sending hold events is disabled, do not ever start the hold timer, and - // hence hold events will never be triggered - if ( iIsEnabled ) - { - Cancel(); - After( iDelay ); - } - } - void SetDelay(TInt aDelay) { iDelay = aDelay; } - TInt GetDelay() { return iDelay; } - -private: - /** Constructor */ - CCallbackTimer( CGestureHelperImpl& aHelper, - CallbackFunctionL aCallbackFunctionL, TInt aDelay, TBool aIsEnabled ) - : CTimer( EPriorityUserInput - 1 ), // give higher priority to new pointer events with - 1 - iHelper( aHelper ), iCallbackFunctionL( aCallbackFunctionL ), - iDelay( aDelay ), iIsEnabled( aIsEnabled ) - { - } - - void RunL() // From CActive - { - (iHelper.*iCallbackFunctionL)(); - } - -private: - /// helper object that will be called back when timer is triggered - CGestureHelperImpl& iHelper; - /// Function in the iHelper object call - CallbackFunctionL iCallbackFunctionL; - /// How long a time to wait befor calling back after Start() - TInt iDelay; - /// whether sending holding events is currently enabled - TBool iIsEnabled; - }; - -} // namespace GestureHelper - -/** - * @return position from event. Use this instead of using aEvent direction to - * avoid accidentally using TPointerEvent::iPosition - */ -inline TPoint Position( const TPointerEvent& aEvent ) - { - // use parent position, since the capturer is using full screen area, - // and because the (Alfred) drag events are not local to visual even when - // coming from the client - - return aEvent.iPosition; - } - -// ---------------------------------------------------------------------------- -// Two-phase constructor -// ---------------------------------------------------------------------------- -// -CGestureHelperImpl* CGestureHelperImpl::NewL( MGestureObserver& aObserver ) - { - CGestureHelperImpl* self = new ( ELeave ) CGestureHelperImpl( aObserver ); - CleanupStack::PushL( self ); - self->iEventSender = CGestureEventSender::NewL( aObserver ); - self->iDoubleTapTimer = CCallbackTimer::NewL( *self, EmitFirstTapEvent, - KMaxTapDuration, EFalse ); // double tap is disabled by default - self->iHoldingTimer = CCallbackTimer::NewL( *self, StartHoldingL, - KHoldDuration, EFalse ); // holding is enabled by default - - self->iLongTouchTimer = CCallbackTimer::NewL( *self, HandleLongTouch, - KLongTapDuration, ETrue ); // holding is enabled by default - - self->iGesture = new ( ELeave ) CGesture(); - self->iUnusedGesture = new ( ELeave ) CGesture(); - TInt tapLimit = Mm2Pixels(KFingerSize_mm) / 2; - self->iEventFilter = new (ELeave) CGestureEventFilter(tapLimit); - CleanupStack::Pop( self ); - return self; - } - -// ---------------------------------------------------------------------------- -// Constructor -// ---------------------------------------------------------------------------- -// -CGestureHelperImpl::CGestureHelperImpl( MGestureObserver& aObserver ) - : iObserver( aObserver ) - { - } - -// ---------------------------------------------------------------------------- -// Destructor -// ---------------------------------------------------------------------------- -// -CGestureHelperImpl::~CGestureHelperImpl() - { - delete iDoubleTapTimer; - delete iHoldingTimer; - delete iGesture; - delete iPreviousTapGesture; - delete iUnusedGesture; - delete iLongTouchTimer; - delete iEventFilter; - delete iEventSender; - } - - -// ---------------------------------------------------------------------------- -// SetHoldingEnabled -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::SetHoldingEnabled( TBool aEnabled ) - { - iHoldingTimer->SetEnabled( aEnabled ); - } - -// ---------------------------------------------------------------------------- -// IsHoldingEnabled -// ---------------------------------------------------------------------------- -// -TBool CGestureHelperImpl::IsHoldingEnabled() const - { - return iHoldingTimer->IsEnabled(); - } - -// ---------------------------------------------------------------------------- -// SetHoldingEnabled -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::SetDoubleTapEnabled( TBool aEnabled ) - { - iDoubleTapTimer->SetEnabled( aEnabled ); - } - -// ---------------------------------------------------------------------------- -// IsHoldingEnabled -// ---------------------------------------------------------------------------- -// -TBool CGestureHelperImpl::IsDoubleTapEnabled() const - { - return iDoubleTapTimer->IsEnabled(); - } - - - -// ---------------------------------------------------------------------------- -// Reset state -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::Reset() - { - iHoldingTimer->Cancel(); - iLongTouchTimer->Cancel(); - iGesture->Reset(); - } - -/** - * Helper function that calls Reset on the pointer to CGestureHelperImpl - */ -static void ResetHelper( TAny* aHelper ) - { - static_cast< CGestureHelperImpl* >( aHelper )->Reset(); - } - -// ---------------------------------------------------------------------------- -// Handle a pointer event -// ---------------------------------------------------------------------------- -// -TBool CGestureHelperImpl::HandlePointerEventL( const TPointerEvent& aEvent ) - { - TInt filterReason; - SetLastEventTime(); - if (!iEventFilter->FilterDrag(aEvent, iLastEventTime, filterReason)) - { - return noneAlf_HandlePointerEventL( aEvent ); - } - else - { - /* - TBuf<10> num; - num.Num( filterReason ); - TBuf<128> str; - str.AppendFormat(_L("Filter reason: %d"), filterReason); - RFileLogger::Write( _L("gh"), _L("gh.txt"), EFileLoggingModeAppend, str); - */ - return EFalse; - } - } - - -TBool CGestureHelperImpl::noneAlf_HandlePointerEventL( const TPointerEvent& aEvent) - { - switch ( aEvent.iType ) - { - case TPointerEvent::EButton1Down: - { - HandleTouchDownL(aEvent); - break; - } - case TPointerEvent::EDrag: - { - HandleMoveL(aEvent); - break; - } - case TPointerEvent::EButton1Up: - { - if (KErrNone == AddPoint( aEvent )) - { - HandleTouchUp(aEvent); - } - else - { - EmitCancelEvent(); - } - Reset(); - break; - } - default: - break; - } - return ETrue; - } - -TBool CGestureHelperImpl::IsMovementGesture(TGestureCode aCode) - { - return (aCode == EGestureDrag || aCode == EGestureFlick || aCode == EGestureSwipeUp || - aCode == EGestureSwipeDown || aCode == EGestureSwipeRight || aCode == EGestureSwipeLeft); - } - -void CGestureHelperImpl::HandleLongTouch() - { - iDoubleTapTimer->Cancel(); - iGesture->SetLongTap(ETrue); - iGesture->SetComplete(); - TPoint startPos = iGesture->StartPos(); - EmitEvent(*iGesture); - iGesture->Reset(); - iGesture->AddPoint( startPos, GetLastEventTime() ); - } - -void CGestureHelperImpl::HandleTouchDownL(const TPointerEvent& aEvent) - { - TGestureCode prevCode = iGesture->PreviousGestureCode(); - if (prevCode == EGestureStart) return; - if (prevCode == EGestureDrag) - { - iGesture->Reset(); - } - AddPointL( aEvent ); - - if (!iLongTouchTimer->IsActive()) - { - iLongTouchTimer->Start(); - } - if (!iDoubleTapTimer->IsActive()) - { - EmitEvent( *iGesture ); - } - } - -void CGestureHelperImpl::HandleMoveL(const TPointerEvent& aEvent) - { - if (iGesture->IsLatestPoint( Position(aEvent))) return; // I'm not sure we need this - //Cancel double tap time - it's neither tap nor double tap - iDoubleTapTimer->Cancel(); - iLongTouchTimer->Cancel(); - - TBool isFirstPoint = IsIdle(); - - AddPointL( aEvent ); - - if (iPreviousTapGesture) - { - RecycleGesture(iPreviousTapGesture); - } - - if (!isFirstPoint) - { - EmitEvent( *iGesture ); - } - } - -void CGestureHelperImpl::HandleTouchUp(const TPointerEvent& /*aEvent*/) - { - TGestureCode prevCode = iGesture->PreviousGestureCode(); - iLongTouchTimer->Cancel(); - iDoubleTapTimer->Cancel(); - TInt64 fromLastTouchUp = iLastEventTime.MicroSecondsFrom(iLastTouchUpTime).Int64(); - TInt64 fromLastDoubleTap = iLastEventTime.MicroSecondsFrom(iLastDoubleTapTime).Int64(); - /* - TBuf<1024> str; - str.AppendFormat(_L("fromLastTouchUp: %d, "), fromLastTouchUp); - str.AppendFormat(_L("fromLastDoubleTap: %d, "), fromLastTouchUp); - str.AppendFormat(_L("iPreviousTapGesture: %d, "), iPreviousTapGesture); - RFileLogger::Write( _L("gh"), _L("gh.txt"), EFileLoggingModeAppend, str); - */ - if ( prevCode == EGestureLongTap ) - { - EmitReleasedEvent(); - } - else if (IsMovementGesture(prevCode) || - !iDoubleTapTimer->IsEnabled() /* || !iGesture->IsTap()*/ ) - { - iGesture->SetComplete(); - EmitEvent(*iGesture); - } - - else - { - if ( iPreviousTapGesture && - (fromLastTouchUp > KDoubleTapMinActivationInterval) && - (fromLastTouchUp < KDoubleTapMaxActivationInterval) && - (fromLastDoubleTap > KDoubleTapIdleInterval)) - { - // it's a double tap - iLastTouchUpTime = iLastEventTime; - iLastDoubleTapTime = iLastEventTime; - EmitDoubleTapEvent(); - } - else - { - // it's a first tap - iLastTouchUpTime = iLastEventTime; - if (iPreviousTapGesture) - { - RecycleGesture(iPreviousTapGesture); - } - - iPreviousTapGesture = iGesture; - iGesture = NewGesture(); - iDoubleTapTimer->Start(); - } - } - } - - - -void CGestureHelperImpl::EmitDoubleTapEvent() - { - iPreviousTapGesture->SetDoubleTap(); - EmitFirstTapEvent(); - } - - -void CGestureHelperImpl::EmitReleasedEvent() - { - iGesture->SetComplete(); - iGesture->SetReleased(); - EmitEvent(*iGesture); - } - - -// ---------------------------------------------------------------------------- -// Is the helper idle? -// inline ok in cpp file for a private member function -// ---------------------------------------------------------------------------- -// -inline TBool CGestureHelperImpl::IsIdle() const - { - return iGesture->IsEmpty(); - } - -// ---------------------------------------------------------------------------- -// Add a point to the sequence of points that together make up the gesture -// inline ok in cpp file for a private member function -// ---------------------------------------------------------------------------- -// -inline void CGestureHelperImpl::AddPointL( const TPointerEvent& aEvent ) - { - User::LeaveIfError( AddPoint( aEvent ) ); - } - -// ---------------------------------------------------------------------------- -// Add a point to the sequence of points that together make up the gesture -// inline ok in cpp file for a private member function -// ---------------------------------------------------------------------------- -// -inline TInt CGestureHelperImpl::AddPoint( const TPointerEvent& aEvent ) - { - TPoint pos = Position ( aEvent ); - return iGesture->AddPoint( pos, GetLastEventTime() ); - } - -// ---------------------------------------------------------------------------- -// StartHoldingTimer -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::StartHoldingTimer( const TPointerEvent& aNewEvent ) - { - if ( !( iGesture->IsHolding() || - iGesture->IsNearHoldingPoint( Position( aNewEvent ) ) ) ) - { - // restart hold timer, since pointer has moved - iHoldingTimer->Start(); - // Remember the point in which holding was started - iGesture->SetHoldingPoint(); - } - } - -/** - * Helper function that calls ContinueHolding on the pointer to TGesture - */ -static void ContinueHolding( TAny* aGesture ) - { - static_cast< CGesture* >( aGesture )->ContinueHolding(); - } - -// ---------------------------------------------------------------------------- -// Add a point to the sequence of points that together make up the gesture -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::StartHoldingL() - { - // hold & tap event is specifically filtered out. Use case: in list fast - // scrolling activation (e.g. enhanced coverflow), tap & hold should not - // start fast scroll. In addition, after long tap on start position, - // drag and drag & hold swiping should emit normal swipe and swipe&hold - // events. Therefore, tap & hold is not supported. - __ASSERT_DEBUG( !iGesture->IsTap() && !iPreviousTapGesture, Panic( EGesturePanicIllegalLogic ) ); - - // holding has just started, and gesture code should be provided to client. - // set gesture state so that it produces a gesture code (other than drag) - iGesture->StartHolding(); - - // create an item in the cleanup stack that will set the gesture state - // to holding-was-started-earlier state. NotifyL may leave, but the - // holding-was-started-earlier state must still be successfully set, - // otherwise, the holding gesture code will be sent twice - CleanupStack::PushL( TCleanupItem( &ContinueHolding, iGesture ) ); - - EmitEvent( *iGesture ); - - // set holding state to "post holding" - CleanupStack::PopAndDestroy( iGesture ); - } - -// ---------------------------------------------------------------------------- -// RecyclePreviousTapGesture -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::RecyclePreviousTapGesture( TAny* aSelf ) - { - CGestureHelperImpl& self = *reinterpret_cast( aSelf ); - self.RecycleGesture( self.iPreviousTapGesture ); - } - -// ---------------------------------------------------------------------------- -// Emit the remainder of the previous tap event (tap + released) -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::EmitFirstTapEvent() - { - // when this function is called, a tap has turned out to _not_ be a double tap - __ASSERT_DEBUG( IsDoubleTapEnabled(), Panic( EGesturePanicIllegalLogic ) ); - __ASSERT_DEBUG( iPreviousTapGesture, Panic( EGesturePanicIllegalLogic ) ); - - iDoubleTapTimer->Cancel(); - CompleteAndEmit( *iPreviousTapGesture ); - RecycleGesture(iPreviousTapGesture); - - } - -// ---------------------------------------------------------------------------- -// EmitStartEventL -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::EmitStartEventL( const CGesture& aGesture ) - { - CGesture* startGesture = aGesture.AsStartEventLC(); - EmitEvent( *startGesture ); - CleanupStack::PopAndDestroy( startGesture ); - } - -// ---------------------------------------------------------------------------- -// EmitCompletionEventsL -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::CompleteAndEmit( CGesture& aGesture ) - { - aGesture.SetComplete(); - // send gesture code if holding has not been started. If holding has - // been started, client has already received a "hold swipe left" e.g. event, in which - // case don't another "swipe left" event - if ( !aGesture.IsHolding() ) - { - // if client leaves, the state is automatically reset. - // In this case the client will not get the released event - EmitEvent( aGesture ); - } - - // send an event that stylus was lifted - aGesture.SetReleased(); - EmitEvent( aGesture ); - } - -// ---------------------------------------------------------------------------- -// EmitCancelEventL -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::EmitCancelEvent() - { - iDoubleTapTimer->Cancel(); - - - CGesture& gestureToCancel = iPreviousTapGesture ? *iPreviousTapGesture : *iGesture; - gestureToCancel.SetCancelled(); - EmitEvent( gestureToCancel ); - RecycleGesture(iPreviousTapGesture); - - } - -// ---------------------------------------------------------------------------- -// Notify observer -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::EmitEvent( const CGesture& aGesture ) - { - // deallocation of the event is happening in CGestureEventSender::RunL() - TGestureEvent event; - event.SetCode(const_cast(aGesture).Code(EAxisBoth)); - event.SetCurrentPos(aGesture.CurrentPos()); - event.SetDistance(aGesture.Distance()); - event.SetStartPos(aGesture.StartPos()); - event.SetIsHolding(aGesture.IsHolding()); - event.SetSpeed(aGesture.Speed()); - iEventSender->AddEvent(event); - } - -// ---------------------------------------------------------------------------- -// Return a fresh gesture from the gesture pool (pool of one gesture) -// ---------------------------------------------------------------------------- -// -CGesture* CGestureHelperImpl::NewGesture() - { - __ASSERT_DEBUG( iUnusedGesture, Panic( EGesturePanicIllegalLogic ) ); // pool should no be empty - - iUnusedGesture->Reset(); - CGesture* freshGesture = iUnusedGesture; - iUnusedGesture = NULL; - return freshGesture; - } - -// ---------------------------------------------------------------------------- -// Return a fresh gesture from the gesture pool (pool of one gesture) -// ---------------------------------------------------------------------------- -// -void CGestureHelperImpl::RecycleGesture( CGesture*& aGesturePointer ) - { - // only one object fits into the pool, and that should currently be enough - // one pointer must be null, one non-null - __ASSERT_DEBUG( !iUnusedGesture != !aGesturePointer, Panic( EGesturePanicIllegalLogic ) ); - if ( aGesturePointer ) - { - iUnusedGesture = aGesturePointer; - aGesturePointer = NULL; - } - } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturehelperimpl.h --- a/webengine/webkitutils/rt_gesturehelper/src/gesturehelperimpl.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,196 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - - -#ifndef _GESTUREHELPERIMPL_H_ -#define _GESTUREHELPERIMPL_H_ - -#include -#include -#include - - -struct TPointerEvent; - -namespace RT_GestureHelper -{ - -class CCallbackTimer; -class CGesture; -class CPointerCapturer; -class MGestureObserver; -class CGestureEventFilter; -class CGestureEventSender; - -/** - * Implementation of CGestureHelper interface - */ -NONSHARABLE_CLASS( CGestureHelperImpl ) : public CBase - { -public: - /** 2-phase constructor */ - static CGestureHelperImpl* NewL( MGestureObserver& aObserver ); - - /** Destructor */ - ~CGestureHelperImpl(); - - - /** See @ref CGestureHelper::SetHoldingEnabled */ - void SetHoldingEnabled( TBool aEnabled ); - /** See @ref CGestureHelper::IsHoldingEnabled */ - TBool IsHoldingEnabled() const; - /** See @ref CGestureHelper::SetDoubleTapEnabled */ - void SetDoubleTapEnabled( TBool aEnabled ); - /** See @ref CGestureHelper::IsDoubleTapEnabled */ - TBool IsDoubleTapEnabled() const; - /** See @ref CGestureHelper::HandlePointerEventL */ - TBool HandlePointerEventL( const TPointerEvent& aEvent ); - - /** Reset helper state */ - void Reset(); - - void SetLastEventTime() {iLastEventTime.HomeTime(); } /*CCoeEnv::Static()->LastEvent().Time();*/ - - - TTime GetLastEventTime() const { return iLastEventTime; } -private: - /** Constructor */ - CGestureHelperImpl( MGestureObserver& aObserver ); - - - - TBool noneAlf_HandlePointerEventL( const TPointerEvent& aEvent); - - /** @return ETrue if the helper has not started processing a gesture */ - inline TBool IsIdle() const; - /** Add a point to the sequence of points that make up the gesture */ - inline void AddPointL( const TPointerEvent& aEvent ); - /** Add a point to the sequence of points that make up the gesture */ - inline TInt AddPoint( const TPointerEvent& aEvent ); - /** Activates holding and notifies observer that holding has been started */ - void StartHoldingL(); - /* Set previous tag gesture to null (and recycle the gesture object) */ - static void RecyclePreviousTapGesture( TAny* aSelf ); - /** Emits a tap event since second tap of a double tap was not received within timeout */ - void EmitFirstTapEvent(); - /** Emit the start gesture event that aGesture would have produced */ - void EmitStartEventL( const CGesture& aGesture ); - /** - * Send code event if not holding. Also sets the event to released and emits again. - * Modifies aGesture! - */ - void CompleteAndEmit( CGesture& aGesture ); - /** - * Send cancel event about the latest gesture client was notified about - * Sets the latest gesture to Cancelled. - */ - void EmitCancelEvent(); - - /** - * Send Released event - */ - void EmitReleasedEvent(); - - /** Notify observer of the gesture */ - void EmitEvent( const CGesture& aGesture ); - /** - * (re)start holding timer at the current point. - * Does not restart holding if the point (in aEvent) is near enough to where holding - * was started earlier. (Allows small movement but still starting holding. - */ - void StartHoldingTimer( const TPointerEvent& aNewEvent ); - - /** - * @return a gesture object from the gesture pool - * Getting gestures from the gesture pool avoids the need to create gestures - * after construction. There is max only one gesture object in the pool, - * but no more is needed - */ - CGesture* NewGesture(); - /** Move the gesture into the gesture pool, and set aGesturePointer to null */ - void RecycleGesture( CGesture*& aGesturePointer ); - - - void HandleTouchUp(const TPointerEvent& aEvent); - void HandleTouchDownL(const TPointerEvent& aEvent); - void HandleMoveL(const TPointerEvent& aEvent); - void HandleLongTouch(); - void EmitDoubleTapEvent(); - TBool IsMovementGesture(TGestureCode aCode); - -private: - /// Gesture is the logical representation of a sequence of points arriving - /// at certain times - /// This is the current gesture - CGesture* iGesture; - - /// Tap gesture of the previous gesture. Used when double tap is enabled. - /// The gesture is cached, since it cannot be emitted until gesture helper - /// knows whether the next gesture forms a double tap - /// @see CGestureHelperImpl::iDoubleTapTimer - CGesture* iPreviousTapGesture; - - /// This is a recyclable object pool with just one object. - /// This class needs one or two gesture objects at any one time. There is one - /// less error condition to handle if gesture objects are not created after - /// construction. Therefore, if only one gesture object is needed at a specific, - /// point in time, the unused gesture object is stored here. - CGesture* iUnusedGesture; - - /// When double tap is enabled, a tap - /// event (and it's released event) is only emitted after the double tap timeout - /// passes. If user taps again before the timeout (in the same position), - /// this gesture is emitted as a double tap (followed by the released event, - /// and the second tap is not emitted at all. - /// If user taps, and then swipes before the double tap timeout, this tap - /// event (and it's released event) event is emitted, and only then the swipe's - /// down and drag events are emitted. In other words, if user presses down - /// during the timeout, the down event it not emitted until the gesture - /// helper knows that the gesture is not another tap. - /// Behavior while double tap enabled: - /// Swipe: Down + drag + up => emits down + swipe/cancel + released - /// Tap: Down + up => emits down ... timeout ... + tap + released - /// Double tap: Down + up + down + up => emits down ... double tap + released - /// Tap + quick swipe: Down + up + down + drag + ... => emits down ... tap + up (for tap) + down (for swipe ) + drag + ... - /// Double tap timer is cancelled when the second pointer down event is received, - /// i.e., it does not matter if user does this: - /// down + up + down ... long wait ... + up. It's still a double tap. - CCallbackTimer* iDoubleTapTimer; - - /// holding is activated when user keeps pointer down in the same place for - /// a longer period. the holding timer activates off when enough time has passed. - CCallbackTimer* iHoldingTimer; - - /// observer for gesture events - MGestureObserver& iObserver; - - /// captures subsequent pointer events after pointer down received, - /// until pointer up - CPointerCapturer* iPointerCapturer; - - TTime iLastEventTime; - TTime iLastTouchUpTime; - TTime iLastDoubleTapTime; - - CCallbackTimer* iLongTouchTimer; - CGestureEventFilter* iEventFilter; - CGestureEventSender* iEventSender; - }; - -} // GestureHelper - -#endif // _GESTUREHELPERIMPL_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturerecogniser.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/gesturerecogniser.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture helper implementation -* -*/ - -#include "gesturerecogniser.h" - -#include - -#include "gesturedefs.h" -#include -#include "pointarray.h" -#include "utils.h" - -using namespace RT_GestureHelper; - -/** - * Vector class (math) - */ -NONSHARABLE_CLASS( TVector ) - { -public: - /** - * Constructor - * @param aFrom starting point of the vector - * @param aTo ending point of the vector - */ - TVector( const TPoint& aFrom, const TPoint& aTo ) - : iX( aTo.iX - aFrom.iX ), - iY( aTo.iY - aFrom.iY ) - { - } - - /** @return angle of the vector */ - TReal Angle() const - { - TReal angle = 0; - TReal length = Length(); - if ( length != 0 ) - { - Math::ACos( angle, iX / Length() ); - if ( iY < 0 ) - { - angle = 2 * KPi - angle; - } - } - return Degrees( angle ); - } - - /** @return length of the vector */ - TReal Length() const - { - TReal length = 0; - Math::Sqrt( length, iX * iX + iY * iY ); - return length; - } - -private: - /** @return radians in degrees */ - inline TReal Degrees( TReal aRadians ) const - { - return aRadians * 180 / KPi; - } - -public: - /// x coordinate that represent the vector - TReal iX; - /// y coordinate that represent the vector - TReal iY; - }; - -inline TPoint LastPoint( const TPointArray& aPoints ) - { - __ASSERT_DEBUG( aPoints.Count() > 0, Panic( EGesturePanicIllegalLogic ) ); - return aPoints[ aPoints.Count() - 1 ] ; - } - -/** - * @return Length of the gesture in points - */ -inline TReal GestureLength( const TPointArray& aPoints ) - { - return TVector( aPoints[0], LastPoint( aPoints ) ).Length(); - } - -/** - * @return ETrue if aAngleUnderTest is almost aAngle - * Closeness of the angles is controlled by KAngleTolerance - */ -static TBool IsNear( TReal aAngleUnderTest, TReal aAngle ) - { - return aAngle - KAngleTolerance <= aAngleUnderTest && - aAngleUnderTest <= aAngle + KAngleTolerance; - } - -/** - * @return the angle as a direction flags of TGesture - */ -inline TGestureCode Direction( TReal aAngle ) - { - TGestureCode direction = EGestureUnknown; - - if ( IsNear( aAngle, 90.0 ) ) - { - direction = EGestureSwipeDown; - } - else if ( IsNear( aAngle, 180.0 ) ) - { - direction = EGestureSwipeLeft; - } - else if ( IsNear( aAngle, 270.0 ) ) - { - direction = EGestureSwipeUp; - } - else if ( 360.0 - KAngleTolerance <= aAngle || aAngle <= KAngleTolerance ) - { - direction = EGestureSwipeRight; - } - else // for lint warning - { - // unknown angle - } - - return direction; - } - -/** @return direction between points */ -inline TGestureCode Direction( const TPoint& aFromPoint, const TPoint& aToPoint ) - { - return Direction( TVector( aFromPoint, aToPoint ).Angle() ); - } - -/** @return overall direction between points */ -static TGestureCode GeneralDirection( const TPointArray& aPoints ) - { - // If the start and end points are too close to each other, direction - // is undefined - if ( ToleranceRect( aPoints[0] ).Contains( LastPoint( aPoints ) ) ) - { - return EGestureUnknown; - } - return Direction( aPoints[0], LastPoint( aPoints ) ); - } - -// function type to get a point in the point array -typedef TPoint (TPointArray::*PointByIndexFunc)( TInt aIndex ) const; - -/// @return latest point outside tolerance area or KErrNotFound if not point outside it -TInt LatestCertainPointIndex( const TPointArray& aPoints, PointByIndexFunc aPointByIndex ) - { - __ASSERT_DEBUG( aPoints.Count() > 0, Panic( EGesturePanicIllegalLogic ) ); - - int i = aPoints.Count(); - TRect toleranceRect = ToleranceRect( (aPoints.*aPointByIndex)( aPoints.Count() - 1 ) ); - // Find out the first point from the end of the array - // that is not contained in the tolerance rect. - while( 0 <= --i ) - { - // if the point does not belong inside tolerance rect, it is the first point - // outside the rect - if( !toleranceRect.Contains( (aPoints.*aPointByIndex)(i) ) ) - { - break; - } - } - return i; - } - -/** @return last direction of dragging */ -inline TGestureCode LastDirection( const TPointArray& aPoints ) - { - TInt latestPointIndex = LatestCertainPointIndex( aPoints, TPointArray::operator[] ); - if ( KErrNotFound != latestPointIndex ) - { - return Direction( aPoints[latestPointIndex], LastPoint( aPoints ) ); - } - // no points were outside the rect, and hence the direction is unknown - return EGestureUnknown; - } - -/** - * @return ETrue if points for a tap event - */ -inline TBool IsTap( const TPointArray& aPoints ) - { - return KErrNotFound == LatestCertainPointIndex( aPoints, TPointArray::Raw ); - } - -// ---------------------------------------------------------------------------- -// Return gesture code of a gesture formed by a sequence of points -// ---------------------------------------------------------------------------- -// -TGestureCode TGestureRecogniser::GestureCode( const TPointArray& aPoints ) const - { - __ASSERT_DEBUG( aPoints.Count() > 0, Panic( EGesturePanicIllegalLogic ) ); - - // tap needs to be treated separately, because recognising that needs to consider - // raw points (and not points in which x or y axis has been filtered out) - if ( IsTap( aPoints ) ) - { - return EGestureTap; - } - - TGestureCode direction = GeneralDirection( aPoints ); - // if last direction is opposite of the general one, user has cancelled a swipe - if ( direction != LastDirection( aPoints ) ) - { - direction = EGestureUnknown; - } - return direction; - } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/gesturerecogniser.h --- a/webengine/webkitutils/rt_gesturehelper/src/gesturerecogniser.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Algorithm to recognise gesture from a stream of points -* -*/ - -#ifndef _GESTURERECOGNISER_H_ -#define _GESTURERECOGNISER_H_ - -#include -#include - -namespace RT_GestureHelper -{ - -class TPointArray; - -/** - * Note: Not a static class or a function pointer, just to make it sligthly - * easier to replace it with a heavier implementation - */ -NONSHARABLE_CLASS( TGestureRecogniser ) - { -public: - /** - * Translates points into a gesture code - * @param aPoints Points that form the gestures. Client is not required - * to pass in repeated points (sequential points that are - * almost in the same place) - * @param aIsHolding ETrue if gesture was ended at pointer being held down at same position - * EFalse if gesture ended at pointer being released - * @return recognised gesture id or EUnknownGesture - */ - TGestureCode GestureCode( const TPointArray& aPoints ) const; - }; - -} // namespace GestureHelper - -#endif // _GESTURERECOGNISER_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/pointarray.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/pointarray.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Array of points -* -*/ - - -#include "pointarray.h" - -using namespace RT_GestureHelper; - -// ---------------------------------------------------------------------------- -// TPointArray constructor -// ---------------------------------------------------------------------------- -// -TPointArray::TPointArray( const RArray< TPointEntry >& aPoints ) - : iPoints( aPoints ) - {} - -// ---------------------------------------------------------------------------- -// TPointArray length -// ---------------------------------------------------------------------------- -// -TInt TPointArray::Count() const - { - return iPoints.Count(); - } - -// ---------------------------------------------------------------------------- -// point at index, no filtering -// ---------------------------------------------------------------------------- -// -TPoint TPointArray::operator[]( TInt aIndex ) const - { - return iPoints[aIndex].iPos; - } - -// ---------------------------------------------------------------------------- -// Unfiltered point at index -// ---------------------------------------------------------------------------- -// -TPoint TPointArray::Raw( TInt aIndex ) const - { - return iPoints[aIndex].iPos; - } - diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/pointarray.h --- a/webengine/webkitutils/rt_gesturehelper/src/pointarray.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Array of points -* -*/ - - -#ifndef _POINTARRAY_H_ -#define _POINTARRAY_H_ - -#include - -namespace RT_GestureHelper -{ - -/** - * Represents a single point given at certain time - */ -struct TPointEntry - { - /** constructor */ - inline TPointEntry( const TPoint& aPos, const TTime& aTime ) - : iPos( aPos ), iTime( aTime ) - { - } - - TPoint iPos; - TTime iTime; - }; - -/** - * Array of points that wraps another point array - * The purpose of this class is to allow deriving classes to override [] - * and in that member function adjust the point, e.g., by setting one - * axis to always a constant value. This allows providing a sequence of - * points to the recogniser in which the other axis is ignored. - */ -NONSHARABLE_CLASS( TPointArray ) - { -public: - /** - * @param aPoints points array to wrap (and filter) - */ - TPointArray( const RArray< TPointEntry >& aPoints ); - /** @returns length of the array */ - TInt Count() const; - /** - * @returns a filtered point at aIndex. Default implementation same - * as Raw(...) - * virtual so deriving classes can modify the point (e.g., filter one axis) - */ - virtual TPoint operator[]( TInt aIndex ) const; - /** @returns an raw, non-filtered point at aIndex */ - TPoint Raw( TInt aIndex ) const; - -private: - const RArray< TPointEntry >& iPoints; - }; - -} // namespace GestureHelper - -#endif // _POINTARRAY_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/utils.cpp --- a/webengine/webkitutils/rt_gesturehelper/src/utils.cpp Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture recognition utilities -* -*/ - - -#include "utils.h" - -#include // for CCoeEnv -#include // for CEikAppUi - -#include "gesturedefs.h" - -namespace RT_GestureHelper - { - /** @return the longer edge of the size */ - inline TInt LongerEdge( const TSize& aSize ) - { - return Max( aSize.iHeight, aSize.iWidth ); - } - - // for documentation, see header file - TRect ToleranceRect( const TPoint& aCenterPoint ) - { - /* - TSize screenSize = static_cast( CCoeEnv::Static()->AppUi() ) - ->ApplicationRect().Size(); - // multiplication has to be done first, to avoid rounding integer to 0 with division - int toleranceLength = ( KGestureTolerancePercent * LongerEdge( screenSize ) ) / 100; - */ - long toleranceLength = Mm2Pixels(KFingerSize_mm) / 2; - TRect toleranceRect( aCenterPoint, TSize() ); - // grow by the tolerance length, while keeping the center point - toleranceRect.Shrink( -toleranceLength, -toleranceLength ); - return toleranceRect; - } - - long Twips2Pixels(long twips) - { - CWsScreenDevice* screen = CCoeEnv::Static()->ScreenDevice(); - TZoomFactor deviceMap(screen); - deviceMap.SetZoomFactor(TZoomFactor::EZoomOneToOne); - long px = deviceMap.VerticalTwipsToPixels(twips); //assuming that vertical - return px; //the same as horizontal - - } - - long Mm2Pixels(long mm) - { - return Twips2Pixels(mm * KTwipsInMm); - } - - long Inches2Pixels(double inches) - { - return Twips2Pixels(inches * KTwipsInInch); - } - - - } // namespace GestureHelper diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/rt_gesturehelper/src/utils.h --- a/webengine/webkitutils/rt_gesturehelper/src/utils.h Mon Jan 18 21:20:18 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "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: Gesture recognition utilities -* -*/ - - -#ifndef _GESTURE_UTILS_H_ -#define _GESTURE_UTILS_H_ - -#include - -namespace RT_GestureHelper - { - - /** - * @return the a rectange in which dragging will be ignored. Tolerance rect - * represents a rectange within which any movement will not be considered - * intentional, but as accidental stylus movement. - */ - TRect ToleranceRect( const TPoint& aCenterPoint ); - - long Twips2Pixels(long twips); - long Mm2Pixels(long mm); - long Inches2Pixels(double inches); - - } // namespace GestureHelper - -#endif // _GESTURE_UTILS_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/bwins/stmgesturefwu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/bwins/stmgesturefwu.def Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,13 @@ +EXPORTS + ?RemoveListener@CStmGestureContext@@QAEHPAVMStmGestureListener@@@Z @ 1 NONAME ; int CStmGestureContext::RemoveListener(class MStmGestureListener *) + ?SetContext@CStmGestureContext@@QAEXPAVCCoeControl@@@Z @ 2 NONAME ; void CStmGestureContext::SetContext(class CCoeControl *) + ?Deactivate@CStmGestureContext@@QAEXXZ @ 3 NONAME ; void CStmGestureContext::Deactivate(void) + ?NewL@CStmGestureEngine@@SAPAV1@XZ @ 4 NONAME ; class CStmGestureEngine * CStmGestureEngine::NewL(void) + ?HandlePointerEventL@CStmGestureEngine@@QAEXABUTPointerEvent@@PAX@Z @ 5 NONAME ; void CStmGestureEngine::HandlePointerEventL(struct TPointerEvent const &, void *) + ?CreateContextL@CStmGestureEngine@@QAEPAVCStmGestureContext@@H@Z @ 6 NONAME ; class CStmGestureContext * CStmGestureEngine::CreateContextL(int) + ??0CStmGestureParameters@@QAE@ABV0@@Z @ 7 NONAME ; CStmGestureParameters::CStmGestureParameters(class CStmGestureParameters const &) + ?Context@CStmGestureEngine@@QAEPAVCStmGestureContext@@H@Z @ 8 NONAME ; class CStmGestureContext * CStmGestureEngine::Context(int) + ?AddListenerL@CStmGestureContext@@QAEXPAVMStmGestureListener@@H@Z @ 9 NONAME ; void CStmGestureContext::AddListenerL(class MStmGestureListener *, int) + ?ActivateL@CStmGestureContext@@QAEXXZ @ 10 NONAME ; void CStmGestureContext::ActivateL(void) + ??0CStmGestureParameters@@QAE@XZ @ 11 NONAME ; CStmGestureParameters::CStmGestureParameters(void) + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/eabi/stmgesturefwu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/eabi/stmgesturefwu.def Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,17 @@ +EXPORTS + _ZN17CStmGestureEngine14CreateContextLEi @ 1 NONAME + _ZN17CStmGestureEngine19HandlePointerEventLERK13TPointerEventPv @ 2 NONAME + _ZN17CStmGestureEngine4NewLEv @ 3 NONAME + _ZN17CStmGestureEngine7ContextEi @ 4 NONAME + _ZN18CStmGestureContext10DeactivateEv @ 5 NONAME + _ZN18CStmGestureContext10SetContextEP11CCoeControl @ 6 NONAME + _ZN18CStmGestureContext12AddListenerLEP19MStmGestureListeneri @ 7 NONAME + _ZN18CStmGestureContext14RemoveListenerEP19MStmGestureListener @ 8 NONAME + _ZN18CStmGestureContext9ActivateLEv @ 9 NONAME + _ZN21CStmGestureParametersC1ERKS_ @ 10 NONAME + _ZN21CStmGestureParametersC1Ev @ 11 NONAME + _ZN21CStmGestureParametersC2ERKS_ @ 12 NONAME + _ZN21CStmGestureParametersC2Ev @ 13 NONAME + _ZTI18CStmGestureContext @ 14 NONAME + _ZTV18CStmGestureContext @ 15 NONAME + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/group/bld.inf Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Build information +* +*/ + +#include +#include "../../../../web_plat/browser_platform_api/inc/Browser_platform_variant.hrh" + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +../rom/stmgesturefw.iby CORE_MW_LAYER_IBY_EXPORT_PATH(stmgesturefw.iby) + +PRJ_MMPFILES +#ifndef __S60_32__ +stmgesturefw.mmp +#endif + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/group/stmgesturefw.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/group/stmgesturefw.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Project definition file +* +*/ + +#include +#include + +TARGET stmgesturefw.dll +TARGETTYPE dll +UID 0x1000008d 0x200212EA + +CAPABILITY CAP_CLIENT_DLL +VENDORID VID_DEFAULT + +USERINCLUDE ../inc +MW_LAYER_SYSTEMINCLUDE + + +#if defined(WINSCW) +deffile ../BWINS/stmgesturefw.def +#elif defined(ARMCC) +deffile ../EABI/stmgesturefw.def +#endif + +SOURCEPATH ../src +SOURCE gestureengine.cpp +SOURCE gestureframework.cpp +SOURCE gestureframeworkimpl.cpp +SOURCE genericsimplegesture.cpp +SOURCE tapgesturerecogniser.cpp +SOURCE pangesturerecogniser.cpp +SOURCE longpressgesturerecogniser.cpp +SOURCE pinchgesturerecogniser.cpp +SOURCE touchgesturerecogniser.cpp +SOURCE releasegesturerecogniser.cpp +SOURCE flickgesturerecogniser.cpp +SOURCE UiEvent.cpp +SOURCE stateengine.cpp +SOURCE statemachine.cpp +SOURCE uieventsender.cpp +SOURCE stateengineconfiguration.cpp +SOURCE utils.cpp +SOURCE stmgestureinterface.cpp +SOURCE gesturehelpereventsender.cpp +#ifdef GESTURE_LOGGING +SOURCE filelogger.cpp +#endif + +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY cone.lib +LIBRARY PlatformEnv.lib +LIBRARY bafl.lib +LIBRARY eikcore.lib +LIBRARY avkon.lib +LIBRARY gdi.lib +LIBRARY ws32.lib +LIBRARY flogger.lib diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/callbacktimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/callbacktimer.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Timer implementation +* +*/ + +#ifndef CALLBACKTIMER_H_ +#define CALLBACKTIMER_H_ +// INCLUDES +#include +#include +#include +#include +#include +#include + +namespace stmUiEventEngine +{ +/** + * define the method to be called by the timer; this includes the pointer number + * the timer is associated with (maybe some other solution could do this, but...) + */ +class CStateMachine ; +typedef void (CStateMachine::*CallbackFunctionL)(TInt aPointerNumber); + + +/** + * CCallbackTimer to implement the timers. This needs to be replaced + * with something else if cross platform is needed. + */ +NONSHARABLE_CLASS( CCallbackTimer ): public CTimer +{ +public: + /** Two-phase constructor */ + static CCallbackTimer* NewL(CStateMachine& aHelper, + CallbackFunctionL aCallbackFunctionL, + TInt aDelay, + TInt aPointerNumber, + TBool aIsEnabled) + { + CCallbackTimer* self = new (ELeave) CCallbackTimer(aHelper, + aCallbackFunctionL, aDelay, aPointerNumber, aIsEnabled); + CleanupStack::PushL(self); + self->ConstructL(); // construct base class + CActiveScheduler::Add(self); + CleanupStack::Pop(self); + return self; + } + + /** Destructor */ + ~CCallbackTimer() + { + Cancel(); + } + + /** Set whether sending events is currently enabled */ + void SetEnabled(TBool aEnabled) + { + iIsEnabled = aEnabled; + // cancel in case timer is already running + Cancel(); + } + + /** @return whether sending events is currently enabled */ + TBool IsEnabled() const + { + return iIsEnabled; + } + + /** Start the timer. Calls callback upon completion. It is possible to give temporary delay if needed, + * otherwise use the defined delay. + */ + void Start(TInt aNewDelay = 0) + { + if (iIsEnabled) + { + Cancel(); + if (aNewDelay != 0) + { + After(aNewDelay); + } + else + { + After(iDelay); + } + } + } + void SetDelay(TInt aDelay) + { + iDelay = aDelay; + } + TInt GetDelay() + { + return iDelay; + } + /** + * method for checking are we inside the RunL method... + */ + TBool isTriggered() + { + return iIsTriggered; + } + +private: + /** Constructor */ + CCallbackTimer(CStateMachine& aHelper, CallbackFunctionL aCallbackFunctionL, + TInt aDelay, TInt aPointerNumber, TBool aIsEnabled) + : + CTimer(EPriorityRealTime - 1), // handle the timers always first before anything else + iHelper(aHelper), iCallbackFunctionL(aCallbackFunctionL), + iDelay(aDelay), iIsEnabled(aIsEnabled), iPointerNumber(aPointerNumber) + { + iIsTriggered = EFalse; + } + + void RunL() // From CActive + { + iIsTriggered = ETrue ; + (iHelper .*iCallbackFunctionL)(iPointerNumber); + iIsTriggered = EFalse ; + } + +private: + /// helper object that will be called back when timer is triggered + CStateMachine& iHelper; + /// Function in the iHelper object call + CallbackFunctionL iCallbackFunctionL; + /// How long a time to wait before calling back after Start() + TInt iDelay; + /// whether sending holding events is currently enabled + TBool iIsEnabled; + /** + * while we are inside RunL iIsTriggered = ETrue + */ + TBool iIsTriggered; + /* + * in multitouch now we need timers for each pointer + * could this be handled in some other way? + */ + TInt iPointerNumber ; +}; +} // namespace + +#endif /* CALLBACKTIMER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/edgescrollgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/edgescrollgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Edge Scroll Recognizer +* +*/ + +#ifndef EDGESCROLLGESTURERECOGNISER_H_ +#define EDGESCROLLGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CEdgeScrollGestureRecogniser handles edge scroll gesture: Hold event near the edges of the window + * + */ +NONSHARABLE_CLASS( CEdgeScrollGestureRecogniser ): public CPeriodic, + public MGestureRecogniserIf +{ +public: + static const TGestureUid KUid = EGestureUidEdgeScroll; + + /** Two-phase constructor */ + static CEdgeScrollGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CEdgeScrollGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + virtual void enable(bool enabled) ; + virtual bool isEnabled() ; + virtual void setOwner(CCoeControl* owner) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up edge scroll gesture recogniser: + * define the rectangle where the edges would be watched. + * \param theArea + */ + void setArea(const TRect& theArea) ; + + /*! + * Additional methods to set up edge scroll gesture recogniser: + * Define how close to the border the Hold UI event must be + * \param rangeInPixels + */ + void setScrollRange(int rangeInPixels) ; + /*! + * for testing purposes we need to log the stuff somewhere... + */ +public: + virtual void enableLogging(bool loggingOn) ; + /*! + * The timer function to handle timeout for generating scroll events + */ + virtual void RunL() ; + + +private: + CEdgeScrollGestureRecogniser(MGestureListener* aListener) ; + bool m_loggingenabled ; +private: + CCoeControl* m_powner ; // The owning control for this gesture + MGestureListener* m_listener ; + bool m_waitingforsecondtap ; + TRect m_area ; + bool m_gestureEnabled ; + int m_rangesizeInPixels ; +}; + +} // namespace + +#endif /* EDGESCROLLGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/filelogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/filelogger.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: API for FileLogger.dll +* +*/ +// This file defines the API for FileLogger.dll +#ifndef __FILELOGGER_H__ +#define __FILELOGGER_H__ + +#include +const TInt KMaxLogEntrySize = 400; + +#ifdef GESTURE_LOGGING +#if defined(__WINS__) && !defined(__SERIES60_30__) +#define RDEBUG(args...) RDebug::Printf(args) +#define RDEBUG8(args) RDebug::RawPrint(args) +#define RDEBUG16(args...) RDebug::Print(args...) +#else +#define RDEBUG(args...) +#define RDEBUG8(args) +#define RDEBUG16(args...) +#endif + +#define LOGFLUSH CFileLogger::Flush() +#define LOGCLOSE CFileLogger::Close() +#define LOGARG(txt,parm...) {_LIT8(KTxt, txt); CFileLogger::Write(KTxt, parm); RDEBUG(txt, parm);} +#define LOGTXT(txt) {_LIT8(KTxt, txt); CFileLogger::Write((const TDesC8&)KTxt); RDEBUG8(KTxt);} +#define LOGDES8(des) {CFileLogger::Write(des); RDEBUG8(des);} +#define LOGDES16(des) {CFileLogger::Write(des); RDEBUG16(des);} +#define LOGERR(txt,err) if (!err) {} else {LOGARG(txt, err);} +#define LOGCALL(exp) {LOGARG("Calling \"%s\"", #exp); exp; LOGARG("Call to \"%s\" passed.", #exp);} +#define LOGENTER LOGARG("%s start", __PRETTY_FUNCTION__) +#define LOGEXIT LOGARG("%s end", __PRETTY_FUNCTION__) +#define LOGMEM(ptr) LOGARG("%s [0x%x]", #ptr, (TUint)ptr) + +NONSHARABLE_CLASS( CFileLogger ): public CBase +{ +public: + static void Write(const TDesC8& aText); + static void Write(const TDesC16& aText); + static void Write(TRefByValue aFmt,...); + static void Close(); + static void Flush(); + +private: + CFileLogger(); + ~CFileLogger(); + TBool Construct(); + static CFileLogger* Logger(); + void DoWrite(); + TBool GetLogFileNameWithoutExt(TDes& aFileName); + void DoFlush() ; + +private: + RFs iFs; + RFile iFile; + TBuf8 iLogBuffer; +}; + +#else +#define LOGFLUSH +#define LOGCLOSE +#define LOGARG(txt,parm...) +#define LOGTXT(txt) +#define LOGDES8(des) +#define LOGDES16(des) +#define LOGERR(txt,err) +#define LOGCALL(exp) +#define LOGENTER +#define LOGEXIT +#define LOGMEM(ptr) +#endif + + + + +#endif // __FILELOGGER_H__ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/flickgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/flickgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Flick Recognizer +* +*/ + +#ifndef FLICKGESTURERECOGNISER_H_ +#define FLICKGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CFlickGestureRecogniser handles release "gesture" + * This is countarpart to touch gesture recogniser, just + * informing the app that ERelease has been seen. + * This should be placed towards the end of the list of gesture + * recognisers, all other recognisers which handle ERelease with + * some other events preceding the ERelease must be before this one. + * + */ +NONSHARABLE_CLASS( CFlickGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidFlick; + + /** Two-phase constructor */ + static CFlickGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CFlickGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + +public: + void setFlickingSpeed(float aSpeed) __SOFTFP; + +private: + CFlickGestureRecogniser(MGestureListener* aListener) ; + +private: + float m_speed ; +}; + +} // namespace + +#endif /* FLICKGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/genericsimplegesture.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/genericsimplegesture.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture Definitions +* +*/ + +#ifndef GENERICSIMPLEGESTURE_H_ +#define GENERICSIMPLEGESTURE_H_ +#include +#include + + +namespace stmGesture +{ + +/*! + * Class for creating a simple gesture for notifying the listener. + * If the basic features are enough for the gesture, then this class + * is enough to be instantiated; there is the location and speed + * determined from the UI event; also type can be specified as well + * as integer detail data. + */ +NONSHARABLE_CLASS( TGenericSimpleGesture ): public MGestureIf +{ +public: + TGenericSimpleGesture( + TGestureUid uid, const TPoint& loc, int type = 0, + const stmUiEventEngine::MUiEventSpeed* speedIf = NULL); + +public: // implementation of MGestureIf + + TGestureUid gestureUid() const { return m_uid; } + void setDetails(int aDetails) { m_details = aDetails;} // additional info can be passed here. + /*! + * MGestureIf methods + */ + virtual TPoint getLocation() const ; // Location where the gesture happened (if applicable) + virtual int getType() const ; // If the gesture can have different types + virtual float getSpeedX() const __SOFTFP + { + return m_speed ? m_speed->speedX() : 0.f; + } + virtual float getSpeedY() const __SOFTFP + { + return m_speed ? m_speed->speedY() : 0.f; + } + virtual int getDetails() const ; // Other possible details.... + + virtual void setName(const TDesC8& aName) ; + virtual TPtrC8 getGestureName() ; // String name for gesture + +public: + void setType(int aType) + { + m_type = aType; + } + +protected: + TPoint m_location ; + TGestureUid m_uid; + int m_type ; + // What would be the other details? + int m_details ; + const stmUiEventEngine::MUiEventSpeed* m_speed ; + TPtrC8 m_name ; +}; + +NONSHARABLE_CLASS( TDirectionalGesture ): public TGenericSimpleGesture +{ +public: + TDirectionalGesture( + TGestureUid uid, const TPoint& loc, const TPoint& prevLoc, + const stmUiEventEngine::MUiEventSpeed* speedIf = NULL, bool logging = false); + + void setVector(const TPoint& last, const TPoint& previous) ; + void setLogging(bool enabled) { m_loggingEnabled = enabled; } + + TPoint getLengthAndDirection() const {return m_vector;} + TGestureDirection getDirection() const ; + TInt getLength() const + { + return ((m_vector.iX*m_vector.iX)+(m_vector.iY*m_vector.iY)) ; + } + +protected: + TPoint m_vector ; + bool m_loggingEnabled ; +}; + +NONSHARABLE_CLASS( TTwoPointGesture ): public TDirectionalGesture +{ +public: + TTwoPointGesture(TGestureUid uid, const TPoint& pos1, const TPoint& pos2); + TPoint getPinchEndPos() const { return m_location2; } + +private: + TPoint m_location2 ; +}; + +} // namespace + +#endif /* GENERICSIMPLEGESTURE_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/gesturedefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/gesturedefs.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef _GESTUREDEFS_H_ +#define _GESTUREDEFS_H + +#include + +namespace stmUiEventEngine +{ + +/// time to hold the stylus in the same position to activate holding +const TInt KHoldDuration = 500000; // microseconds + +/// time to tap again for the second tap to be a double tap +const TInt KMaxDoubleTapDuration = 400000; // microseconds + +/// time in which speed becomes zero if user stops stylus movement before +/// lifting the pointer +const TInt KSpeedStopTime = 150000; // microseconds + +/// tolerance in degrees to either side of an angle, for direction to be the +/// same as reference angle +const TReal KAngleTolerance = 25; + +/// Nth pointer event before the latest point +const TInt KPreviousPointOffset = 3; + +/// Tolerance for ignoring small movements, percent of longer screen edge +const TInt KGestureTolerancePercent = 2; // of 100 + +const TInt KFingerSize_mm = 8; + +const TInt KTwipsInInch = 1440; + +const TReal KTwipsInMm = 56.7; + +const TInt KMaxTapDuration = 300000; //microseconds + +const TInt KFlickSpeed = 500; + +const TInt KDoubleTapMaxActivationInterval = 500000; // 500 ms + +const TInt KDoubleTapMinActivationInterval = 40000; // 40 ms + +const TInt KDoubleTapIdleInterval = 700000; // 700 ms, to prevent triple-tap effects + +const TInt KLongTapDuration = 2000000; //2 sec + +const TInt KMinTimeBetweenDrags = 20000; // 20 ms +/** + * Panic codes + */ +enum TGesturePanic + { + EGesturePanicIllegalLogic + }; + +/** Panics the thread */ +inline void Panic( TGesturePanic aReason ) + { + _LIT( KComponentName, "GestureHelper" ); + User::Panic( KComponentName, aReason ); + } + +} + +#endif // _GESTUREDEFS_H diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/gestureengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/gestureengine.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,111 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef GESTUREENGINE_H_ +#define GESTUREENGINE_H_ + +#include +#include +#include + +#include "rt_gestureengineif.h" +#include "rt_uievent.h" + +namespace stmGesture +{ + +/*! + * CGEstureEngine handles the processing of the UI events. + * It acts as a stmUiEventEngine::MUiEventObserver to receive the UI events. + * The gesture recognisers are stored in a list, and at each HandleUiEventL the + * list of gesture recognisers is processed. The first one to return EGestureActive + * from the recognise method "owns" the gesture. If some other recogniser owned it + * previously, its release method is called. Gesture recogniser can also lock the gesture + * by returning ELockToThisGesture. Then only that gesture recogniser will be called + * until release is detected or the recogniser returns something else than ELockToThisGesture. + */ +NONSHARABLE_CLASS( CGestureEngine ): public CBase, + public MGestureEngineIf, + public stmUiEventEngine::MUiEventObserver +{ +public: + CGestureEngine(); + virtual ~CGestureEngine(); + + /*! + * add gesture to the end of the list of gestures + */ + virtual bool addGesture(const MGestureRecogniserIf* aNewGesture) ; + /*! + * inset a gesture to the beginning of the list of gestures + */ + virtual bool insertGesture(const MGestureRecogniserIf* aNewGesture) ; + /*! + * inset a gesture to the specific position + */ + virtual bool insertGestureAt(const MGestureRecogniserIf* aNewGesture, int position) ; + /*! + * remove a gesture from the list + */ + virtual bool removeGesture(const MGestureRecogniserIf* aOldGesture) ; + /*! + * get the number of non-empty event streams. + * Event streams correspond UI events generated by one touch pointer (=finger). + * The low level state machine handles the necessary filtering etc. + * so that it is safe to remove the event stream after UI Release event has been processed. + */ + virtual int activeStreamCount() const ; + /*! + * get the UI events of stream X + * \param indexOfActiveStream defines which active stream is used. + * Note that MUiEvent contains all the events from down up to the current event. + * Assumption: the UI events contain the target "window handle", i.e. + * the gesture recognition needs to be aware of all possible windows of the application. + */ + virtual const stmUiEventEngine::MUiEvent* getUiEvents(int indexOfActiveStream) const ; + /*! + * enable/disable logging + */ + virtual void enableLogging(bool aLoggingEnabled) {m_loggingEnabled = aLoggingEnabled;} ; + /*! + * The stmUiEventEngine::MUiEventObserver interface + */ + virtual void HandleUiEventL( const stmUiEventEngine::MUiEvent& aEvent ) ; +private: + /*! + * The list of available gesture recognisers + */ + RPointerArray< MGestureRecogniserIf > m_gestures; + /*! + * Is 5 UI event streams enough? Jos tulee Torvisen voittaja? + * We need to store only the latest event since the interface has + * methods to walk trough the events. The current (sept 2009) 9.2 seems to have dual-touch support + */ + const stmUiEventEngine::MUiEvent* m_uiEventStream[stmUiEventEngine::KMaxNumberOfPointers] ; + + void storeUiEvent(const stmUiEventEngine::MUiEvent& aEvent) ; + void walkTroughGestures() ; + void updateUiEvents() ; + int m_numOfActiveStreams ; + int m_currentGestureOwner ; + int m_currentLockedGesture ; + bool m_loggingEnabled ; +}; + +} + +#endif /* GESTUREENGINE_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/gestureframework.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/gestureframework.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef GESTUREFRAMEWORK_H +#define GESTUREFRAMEWORK_H + +// INCLUDES +#include +#include +#include "rt_gestureengineif.h" +#include +#include + +// external classes +namespace stmUiEventEngine +{ + class CStateMachine ; +} + +// CLASS DECLARATION +namespace stmGesture +{ +// Forward declarations +class CGestureFrameworkImpl ; + +/*! + * Gesture framework contains the following elements + * \li UI State Machine. This is the lower level driver handling the events and generating UI events. + * Gesture framework creates an instance of the UI state machine and adds itself to be the UI event listener. + * \li Gesture Engine. The gesture engine processes the UI events received via MUiEventObserver + * and calls gesture recogniser interface MGestureRecogniserIf of all the gestures in the list. + * \li Gesture Recognisers. Gesture recognisers scan the list of UI events and if they recognise + * a gesture, they call the MGestureListener. + */ +NONSHARABLE_CLASS( CGestureFramework ): public CBase +{ +public: + // Constructors and destructor + + /** + * Destructor. + */ + virtual ~CGestureFramework(); + + /** + * Two-phased constructor. + */ + static CGestureFramework* NewL(); + + /** + * Two-phased constructor. + */ + static CGestureFramework* NewLC(); +public: + // new functions, + static TVersion Version(); + /*! + * Get the gesture engine interface + */ + MGestureEngineIf* getGestureEngine() ; + /*! + * Get the underlying low level UI event interface + */ + stmUiEventEngine::CStateMachine* getUiStateMachine() ; + /*! + * logging on or off + */ + void enableLogging(bool loggingEnabled); + +private: + + /*! + * Constructor for performing 1st stage construction + */ + CGestureFramework(); + + /*! + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + +private: + CGestureFrameworkImpl* m_impl ; + + bool m_loggingenabled ; + +}; + +} // namespace +#endif // GESTUREFRAMEWORK_H diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/gestureframeworkimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/gestureframeworkimpl.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef GESTUREENGINEIMPL_H +#define GESTUREENGINEIMPL_H + +// INCLUDES +#include +#include + +// forward declarations +namespace stmUiEventEngine +{ + class CStateMachine ; + class MStateMachine ; +} + +// CLASS DECLARATION +namespace stmGesture +{ +// Forward declarations +class CGestureEngine ; +class MGestureEngineIf ; + +/** + * CGestureFrameworkImpl + * + */ +NONSHARABLE_CLASS( CGestureFrameworkImpl ): public CBase +{ +public: + // Constructors and destructor + + /** + * Destructor. + */ + ~CGestureFrameworkImpl(); + + /** + * Two-phased constructor. + */ + static CGestureFrameworkImpl* NewL(); + + /** + * Two-phased constructor. + */ + static CGestureFrameworkImpl* NewLC(); + /*! + * + */ + MGestureEngineIf* getGestureEngine() ; + /*! + * + */ + stmUiEventEngine::CStateMachine* getUiStateMachine() {return m_statemachine; } + + void enableLogging(bool loggingEnabled) ; +private: + + /** + * Constructor for performing 1st stage construction + */ + CGestureFrameworkImpl(); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + + CGestureEngine* m_gestureEngine ; + stmUiEventEngine::CStateMachine* m_statemachine ; + bool m_loggingenabled ; + +}; +} // namespace +#endif // GESTUREENGINEIMPL_H diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/gesturehelpereventsender.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/gesturehelpereventsender.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#ifndef GESTUREHELPEREVENTSENDER_H_ +#define GESTUREHELPEREVENTSENDER_H_ + +#include +#include +#include "stmgestureinterface.h" + +NONSHARABLE_CLASS(CGestureEventSender) : public CActive + { +public: + enum TEventSenderState + { + ENoEvents, + EEventsReady, + EBusy + }; + static CGestureEventSender* NewL( MStmGestureListener& aObserver ); + ~CGestureEventSender(); + TInt AddEvent(TStmGestureUid aUid, const MStmGesture* aGestureEvent); +protected: + void RunL(); + void DoCancel(); + TInt RunError(TInt aError); +private: + CGestureEventSender(MStmGestureListener& aObserver); + void Complete(); + void EmitEventL( const TStmGestureEvent& aGestureEvent ); + + MStmGestureListener& iObserver; + RArray< TStmGestureEvent > iEvents; + TEventSenderState iState; + }; + +#endif /* GESTUREHELPEREVENTSENDER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/hoveringgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/hoveringgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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:Hover Gesture Recognizer +* +*/ + +#ifndef HOVERINGGESTURERECOGNISER_H_ +#define HOVERINGGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ +/*! + * Recognise hovering gesture. + * If the EMove distance from previous is short enough, then + * we assume hovering gesture. If the previous UI event is ETouch, EHold or EMove + * and the distance is short enough the gesture takes control. + */ +NONSHARABLE_CLASS( CHoveringGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidHover; + + static CHoveringGestureRecogniser* NewL(MGestureListener* aListener); + + virtual ~CHoveringGestureRecogniser(); + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + void setHoveringSpeed(float aSpeed) __SOFTFP ; + +private: + CHoveringGestureRecogniser(MGestureListener* aListener) ; + bool m_hovering ; + float m_hoveringspeed ; +}; + +} + +#endif /* HOVERINGGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/leftrightgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/leftrightgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: LeftRight Gesture Recognizer +* +*/ + +#ifndef LEFTRIGHTGESTURERECOGNISER_H_ +#define LEFTRIGHTGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +NONSHARABLE_CLASS( CLeftrightGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidLeftRight; + + static CLeftrightGestureRecogniser* NewL(MGestureListener* aListener); + + virtual ~CLeftrightGestureRecogniser(); + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + +private: + CLeftrightGestureRecogniser(MGestureListener* aListener) ; +}; + +} + +#endif /* LEFTRIGHTGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/longpressgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/longpressgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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:LongPress Gesture Recognizer +* +*/ + +#ifndef LONGPRESSGESTURERECOGNISER_H_ +#define LONGPRESSGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CLongPressGestureRecogniser handles long press gesture (generated from Hold UI event) + * + */ +NONSHARABLE_CLASS( CLongPressGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidLongPress; + + /** Two-phase constructor */ + static CLongPressGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CLongPressGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up edge scroll gesture recogniser: + * define the rectangle + * \param theArea + */ + void setArea(const TRect& theArea) ; + +private: + CLongPressGestureRecogniser(MGestureListener* aListener) ; + +private: + bool m_waitingforsecondtap ; + TRect m_area ; +}; + +} // namespace + +#endif /* LONGPRESSGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/pangesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/pangesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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:Pan Gesture Recognizer +* +*/ + +#ifndef PANGESTURERECOGNISER_H_ +#define PANGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +NONSHARABLE_CLASS( CPanGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidPan; + + static CPanGestureRecogniser* NewL(MGestureListener* aListener); + + virtual ~CPanGestureRecogniser(); + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + virtual void setPanningSpeedLow(float aSpeed) __SOFTFP ; + virtual void setPanningSpeedHigh(float aSpeed) __SOFTFP ; // speeds above this are flicks + +private: + CPanGestureRecogniser(MGestureListener* aListener) ; + +private: + float m_panningspeedlow ; + float m_panningspeedhigh ; +}; + +} + +#endif /* PANGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/pinchgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/pinchgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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:Pinch Gesture Recognizer +* +*/ + +#ifndef PINCHGESTURERECOGNISER_H_ +#define PINCHGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ +/*! + * Recognise pinching gesture. !!! very experimental !!! + * It seems that in capacitive touch in Symbian 9.4 touching with two + * fingers causes fast EDrag events which are far from each other. + * This gesture recogniser tries to use that feature + * to determine when the gestures looks like a pinch. + * Would requires a lot of tuning to be really useful, if at all possible. + * With current implementation it is easy to zoom in but + * almost impossible to zoom out. + */ +NONSHARABLE_CLASS( CPinchGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidPinch; + + static CPinchGestureRecogniser* NewL(MGestureListener* aListener); + + virtual ~CPinchGestureRecogniser(); + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /* define the pinch triggering as speed value */ + /* after EHold has been seen, then any move which is faster than this will enter pinch gesture */ + /* note that the value varies depending on techology, speed is measured as pixels / ms */ + void setPinchingSpeed(float aSpeed) __SOFTFP; + +private: + CPinchGestureRecogniser(MGestureListener* aListener) ; + + void calculateZoomingLine() ; + float calculateDistance() ; + int adjustPinchMove(float& aPreviousDistance, float aNewDistance) ; + +private: + bool m_pinching ; + float m_pinchingspeed ; + TPoint m_pinchstart ; + TPoint m_pinchend ; + + float m_m ; + float m_b ; + + float m_ddistance ; + bool m_holdseen ; + TPoint m_holdseenAtPos ; + TTime m_holdseenAtTime ; +}; + +} + +#endif /* PINCHGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/releasegesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/releasegesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: release Gesture Recognizer +* +*/ + +#ifndef RELEASEGESTURERECOGNISER_H_ +#define RELEASEGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CReleaseGestureRecogniser handles release "gesture" + * This is countarpart to touch gesture recogniser, just + * informing the app that ERelease has been seen. + * This should be placed towards the end of the list of gesture + * recognisers, all other recognisers which handle ERelease with + * some other events preceding the ERelease must be before this one. + * + */ +NONSHARABLE_CLASS( CReleaseGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidRelease; + + /** Two-phase constructor */ + static CReleaseGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CReleaseGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up edge scroll gesture recogniser: + * define the rectangle where the touch is watched + * \param theArea + */ + void setArea(const TRect& theArea) ; + +private: + CReleaseGestureRecogniser(MGestureListener* aListener) ; + +private: + TRect m_area ; +}; + +} // namespace + +#endif /* RELEASEGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/rt_gestureengineif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/rt_gestureengineif.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,256 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef RT_GESTUREENGINEIF_H_ +#define RT_GESTUREENGINEIF_H_ + +#include +#include + +// Forward declarations +class CCoeControl; + +namespace stmUiEventEngine +{ + class MUiEvent ; +} + +namespace stmGesture +{ + +// Forward declarations +class MGestureRecogniserIf ; + +/*! + * MGestureEngineIf defines the methods for the gesture recognisers + * to be added to the gesture engine. + * TODO: add rule based settings to position the gesture recognisers to the list. + * The gesture recogniser order rules would be defined how? + * - defining the order inside the application + * - defining the order in some configuration file (maybe not) + * + * This requires: + * - the gesture recognisers need to have an ID + * - a type can also be defined if the rules can be set based on types. + * + * The gesture recognisers are arranged in a list so that the correct gesture recogniser + * gets the opportunity to detect the gesture in time. An axample of a set of gesture recognisers + * could be e.g. + * + * |---------------------------------------------| + * | scrolling stop by tap -gesture recogniser | A is enabled only when needed, when enabled must precede all others + * | | (note that locking partly can be used to achieve the same) + * |---------------------------------------------| + * | location specific: zoom + button tap gesture| B these must detect the location first + * |---------------------------------------------| + * | location specific: zoom - button tap gesture| B these must detect the location first + * |---------------------------------------------| + * | location specific: edge scroll gesture | B these must detect the location first + * |---------------------------------------------| + * | pinch zoom gesture | standard gesture, but application wide (spans windows) + * | | C another requirement: disable all but me/restore state + * | | so that other gestures will not meddle in while pinching + * |---------------------------------------------| + * | hover gesture | C standard gesture, needs to detect the EMove speed + * |---------------------------------------------| + * | pan gesture | C standard gesture, but must be after hover + * |---------------------------------------------| + * | tap/doubletap gesture | C standard gesture, order not that important, since + * | | needs just to see certain events in history: touch/release + * |---------------------------------------------| + * + * The order of gesture recognisers determine how the system behaves, so there must be an easy way + * to define the order. The order could be defined either by specifying the IDs or just their types, if then the + * order is not that important. TODO to study whether it would be a good idea to implement this so that + * there are separate lists for the three different classes of gesture recognisers A, B and C; this might + * make the implementation simpler. + */ +class MGestureEngineIf +{ +public: + /*! + * add gesture to the end of the list of gestures + */ + virtual bool addGesture(const MGestureRecogniserIf* aNewGesture) = 0 ; + /*! + * inset a gesture to the beginning of the list of gestures + */ + virtual bool insertGesture(const MGestureRecogniserIf* aNewGesture) = 0 ; + /*! + * inset a gesture to specific position + */ + virtual bool insertGestureAt(const MGestureRecogniserIf* aNewGesture, int position) = 0 ; + + /*! + * remove a gesture from the list + */ + virtual bool removeGesture(const MGestureRecogniserIf* aOldGesture) = 0 ; + /*! + * get the number of non-empty event streams. + * Event streams correspond UI events generated by one touch pointer (=finger). + * The low level state machine handles the necessary filtering etc. + * so that it is safe to remove the event stream after UI Release event has been processed. + */ + virtual int activeStreamCount() const = 0 ; + /*! + * get the UI events of stream X + * \param indexOfActiveStream defines which active stream is used. + * Note that MUiEvent contains all the events from down up to the current event. + * Assumption: the UI events contain the target "window handle", i.e. + * the gesture recognition needs to be aware of all possible windows of the application. + */ + virtual const stmUiEventEngine::MUiEvent* getUiEvents(int indexOfActiveStream) const = 0 ; + /*! + * Enable/disable logging + */ + virtual void enableLogging(bool aLoggingEnabled) = 0 ; +}; + +/*! + * Enumerated values for the gesture recogniser + */ +enum TGestureRecognitionState +{ + EGestureActive, /*! < gesture recognised and gesture notification sent */ + ELockToThisGesture, /*! < gesture recognised, and only this recogniser called until release/this returns something else */ + ENotMyGesture /*! < not this gesture, try the next one in the list */ +}; + +/*! + * The types of gesture recognisers. TODO to implement rule based gesture engine + * where the recognisers can be added in any order, and the rules define the order of them. + * The rules may define + */ +enum TGestureRecogniserType +{ + ECriticalGestureRecogniser, /*! < This kind of gestures should be at the beginning of the list */ + ELocationSpecificGestureRecogniser, /*! < This kind of gestures should be at the next in the list */ + EGenericGestureRecogniser /*! < This kind of gestures should be at the next in the list */ +}; + +/*! + * MGestureRecogniserIf defines the interface needed to be implemented by every gesture recognition element. + * The gesture recogniser gets the UI events and needs to determine whether they define the expected gesture. + * + */ +class MGestureRecogniserIf +{ +public: + /*! + * Virtual destuructor. + */ + virtual ~MGestureRecogniserIf() {} + /*! + * Process the UI event. + * \param numOfActiveStreams : indicates how many pointers are currently active. + * \param ge the gesture engine. The Gesture recogniser uses this to get the current active events. + * + * \return EMaybeGesture if gesture was not yet recognised but can be possible (e.g. after first touch everyone returns this) + * \return EGestureActive if gesture was recognised and a gesture notification was sent; this is then the active gesture + * \return ENotMygesture if gesture can not be this one, e.g. TAP gesture after receiving Move UI event. + * + * Note that a gesture may take control only if it sends out a gesture notification. (or is it so?) + * Until no gesture recogniser has sent a gesture notification, all recognisers who have not returned + * ENotMyGesture are eligible, based on the order they are in the list. + * + * The gesture engine may be either in dynamic gestures mode or fixed gestures mode. + * In dynamic gestures mode each time an UI event is processed, engine will call each + * gesture recogniser until one of the recognisers returns EGestureActive. + * + * In fixed gestures mode the index of the gesture recogniser first returning EGestureActive is stored + * and the subsequent UI events are processed so that only that recogniser is allowed to send gesture + * notification. If it returns !=EGestureActive, it relinguishes the control. + * + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) = 0 ; + /*! + * In dynamic gestures mode the gesture engine will call release of the recogniser + * who lost activation status because a preceding recogniser in the list took control. + * + * Note that the recogniser must then do whatever (if anything) is needed to cancel the gesture. + */ + virtual void release(MGestureEngineIf* ge) = 0 ; + /*! + * Enable or disable recogniser. E.g. if two gestures are related so that + * a gesture ending recogniser needs to be activated to stop a t5imer driven + * behaviour it is useful to add the recogniser to the top of the list + * and then disable it until needed. + */ + virtual void enable(bool enableRecogniser) = 0 ; + /*! + * Get the state of the gesture recogniser, whether it is enabled or not + * \return true, if the recogniser is enabled. + */ + virtual bool isEnabled() = 0 ; + /*! + * Return the type of the gesture recogniser + */ + virtual TGestureUid gestureUid() const = 0; + + /*! + * for testing purposes + */ + virtual void enableLogging(bool loggingEnabled) = 0 ; + + virtual void setOwner(CCoeControl* owner) = 0; +}; + +NONSHARABLE_CLASS( CGestureRecogniser ): public CBase, public MGestureRecogniserIf +{ +public: + virtual ~CGestureRecogniser() + { + + } + /*! + * MGestureRecogniserIf methods; partial implementation + */ + virtual void enable(bool enabled) + { + m_gestureEnabled = enabled ; + } + virtual bool isEnabled() + { + return m_gestureEnabled ; + } + virtual void enableLogging(bool loggingOn) + { + m_loggingenabled = loggingOn; + } + virtual void setOwner(CCoeControl* owner) + { + m_powner = owner; + } +protected: + CGestureRecogniser(MGestureListener* aListener) : + m_powner(aListener->getOwner()), + m_listener(aListener), + m_gestureEnabled(true), + m_loggingenabled(false) + { + + } + +protected: + CCoeControl* m_powner ; // The owning control for this gesture + MGestureListener* m_listener ; + bool m_gestureEnabled ; + bool m_loggingenabled ; +}; + +} // namespace +#endif /* RT_GESTUREENGINEIF_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/rt_gesturelistener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/rt_gesturelistener.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: MGestureListener +* +*/ + +#ifndef RT_GESTURELISTENER_H_ +#define RT_GESTURELISTENER_H_ + +#include + +namespace stmGesture +{ +/*! + * The gesture listener interface. This interface needs to be implemented by the + * listener of the standard gestures implemented in the gesture framework. + */ +class MGestureListener +{ +public: + /*! + * The method that will be called by the gesture framework + * to inform about a gesture being recognised. + * \param theGesture: contains the recognised gesture. + * The MGestureIf contains generic part and gesture specific part + * so the listener needs to know how to handle specific gestures. + */ + virtual void gestureEnter(MGestureIf& theGesture) = 0 ; + /*! + * The method to inform the listener that the gesture has ended. + * This happens if another gesture is recognised or e.g. the Release UI + * event is handled. + * \note Some gestures produce only gestureEnter() callback and no gestureExit(). + */ + virtual void gestureExit(TGestureUid gestureUid) = 0 ; + /*! + * The listener needs to provide the target control (CCoeControl*) to the + * standard gestures. Since the gesture framework processes all events in the + * application, the gesture recognisers check whether the events are targeted + * to the listener owning control. + * Not all gesture recognisers need to perform this check. + * \return the owning CCoeControl of the gesture listener. + */ + virtual CCoeControl* getOwner() = 0 ; +}; + +} +#endif /* RT_GESTURELISTENER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/stateengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/stateengine.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: State Engine +* +*/ +#ifndef STATEENGINE_H_ +#define STATEENGINE_H_ + +#include "rt_uievent.h" +#include "timerinterface.h" +#include "statemachine_v2.h" +#include "uieventsender.h" +#include "stateengineconfiguration.h" + +namespace stmUiEventEngine +{ + +/*! + * Define THwEvent since we need the point, the type and timestamp to be stored. + * The HW event is used also to handle the timer events so that the wrapper class calling the + * state machine will handle the starting, canceling etc. of the timers and the state machine + * sees the timers as messages. This hopefully makes it easier to keep the core state machine as + * OS agnostic as possible. + */ +class THwEvent +{ +public: + THwEvent() {} ; + THwEvent(const THwEvent& ev): + iType(ev.iType), iPosition(ev.iPosition), + iTime(ev.iTime), iTarget(ev.iTarget), iPointerNumber(ev.iPointerNumber) {} + THwEvent(TStateMachineEvent code, + const TPoint& pos, + TTime time, + void* aTarget, + TInt aPointerNr): + iType(code), iPosition(pos), + iTime(time), iTarget(aTarget), iPointerNumber(aPointerNr) + { + } + + TStateMachineEvent iType ; + TPoint iPosition ; + TTime iTime ; + void* iTarget ; + TInt iPointerNumber ; +}; + + +NONSHARABLE_CLASS( CStateEngine ) : public CBase +{ +public: + /** + * constructor and destructor + */ + CStateEngine(CStateEngineConfiguration* aConfig, MTimerInterface* timerif, int index) ; + + ~CStateEngine() ; + /** + * The methods needed for state machine + */ + void ConsumeEvent() ; + bool IsTouchTimer() ; + bool IsHoldTimer() ; + bool IsSuppressTimer() ; + bool IsTouchTimeArea() ; + bool IsTouchArea() ; + bool IsHoldArea() ; + bool InsideTouchTimeArea() ; + bool InsideTouchArea() ; + bool InsideHoldArea() ; + bool LooksLikeHold() ; + void ErrorEvent() ; + void InitTouchTimer() ; + void InitHoldTimer() ; + void RestartHoldTimer() ; + void InitTouchSuppressTimer() ; + void InitMoveSuppressTimer() ; + void ClearTouchTimer() ; + void ClearHoldTimer() ; + void ClearSuppressTimer() ; + void ProduceTouch() ; + void ProduceMove() ; + void ProduceRelease() ; + void ProduceHold() ; + void RenameToDrag() ; + void PrepareTouchTimeArea() ; + void PrepareTouchArea() ; + void PrepareHoldArea() ; + void SetCurrentPos() ; + void SetGestureStart() ; + void AddToTouch() ; + void AddDraggingPos() ; + void StoreMovePos() ; + + /** + * The event interface + */ + + THwEvent& initEvent() + { + m_hwe.iPointerNumber = m_index; + return m_hwe; + } + + // event returned by initEvent() must initialized first + bool handleStateEvent() ; + + TRect getTouchArea() ; + TRect getHoldArea() ; + bool wasLastMessageFiltered() ; + +private: + bool m_eventConsumed ; + THwEvent m_hwe ; + + bool isNewHoldingPoint() ; + RPointerArray iDragPoints; + MTimerInterface* m_timerif ; + + RArray iTouchPoints; + + // Variables for running the state machine + TStateMachineState m_currentState ; + bool m_isTimerEvent ; // We need to separate the pointer events and the timer events + TPoint m_currentTouchXY ; // This is the touching point + TPoint m_gestureStartXY ; // gesture started at this point + TPoint m_uiEventXY ; // The UI event XY point. + TPoint m_previousPointerEventPosition ; + TPoint m_deltaVector ; + TRect m_touchRect ; + TRect m_holdRect ; + + bool m_wasFiltered ; + void CalculateDelta() ; + void CalculateTouchAverage() ; + void CalculateCurrentVector() ; + TPoint calculateTouchAverageFromPoints() ; + bool InsideArea(const TPoint& point, + const TRect& rect, + TAreaShape shape, + const TPoint& tolerance); + void setTolerance(long fingersize_mm, TPoint& tolerance, TAreaShape shape) ; + + void DebugPrintState(TStateMachineState anextstate) ; + inline static TRect ToleranceRect( const TPoint& aCenterPoint, const TPoint& tolerance) ; + void turnStateMachine() ; + + TPoint m_touchCentre ; + TPoint m_holdCentre ; + + void* m_gestureTarget ; + TTimeIntervalMicroSeconds getInterval() ; + TTime m_lastMessageTime ; + CUiEvent* createUIEventL(TUiEventCode code, const TPoint& aPos) ; + TPoint getPreviousXY(const TPoint& aXY) ; + TPoint m_previousXY ; + bool isTimerMessage() ; + int m_index ; + TUiEventCode m_previousUiGenerated ; + TPoint m_lastFilteredPosition ; + TTime m_lastFilteredMessageTime ; + + CStateEngineConfiguration* m_config ; + +}; +} // namespace + +#endif /* STATEENGINE_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/stateengineconfiguration.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/stateengineconfiguration.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: State Engine Configuration +* +*/ + +#ifndef STATEENGINECONFIGURATION_H_ +#define STATEENGINECONFIGURATION_H_ + +#include "rt_uievent.h" +#include "timerinterface.h" +#include "statemachine_v2.h" + + +namespace stmUiEventEngine +{ +class CUiEventSender; + + +NONSHARABLE_CLASS( CStateEngineConfiguration ): public CBase +{ +public: + CStateEngineConfiguration() ; + void ConstructL(); + ~CStateEngineConfiguration() ; + + void setTouchTimeArea(const long fingersize_mm) ; + void setTouchArea(const long fingersize_mm) ; + TAreaShape getTouchAreaShape() ; + void setTouchAreaShape(const TAreaShape shape) ; + unsigned int getTouchTimeout() ; + void setTouchTimeout(unsigned int) ; + void setHoldArea(const long fingersize_mm) ; + TAreaShape getHoldAreaShape() ; + void setHoldAreaShape(const TAreaShape shape) ; + unsigned int getHoldTimeout() ; + void setHoldTimeout(unsigned int a) ; + unsigned int getTouchSuppressTimeout() ; + void setTouchSuppressTimeout(unsigned int a) ; + unsigned int getMoveSuppressTimeout() ; + void setMoveSuppressTimeout(unsigned int a) ; + bool addUiEventObserver(MUiEventObserver* observer) ; + bool removeUiEventObserver(MUiEventObserver* observer) ; + void enableLogging(bool a) ; + +private: + void setTolerance(long fingersize_mm, TPoint& tolerance, TAreaShape shape) ; + +public: + CUiEventSender* m_uiEventSender ; + + TAreaShape m_touchAreaShape ; + TAreaShape m_holdAreaShape ; + bool m_enableLogging ; + TPoint m_touchTimeTolerance ; + TPoint m_touchTolerance ; + TPoint m_holdTolerance ; + int m_touchTimerLimit ; + int m_holdTimerLimit ; + int m_suppressTimerLimit ; + int m_moveSuppressTimerLimit ; + + +}; + +} // namespace stmUiEventEngine + +#endif /* STATEENGINECONFIGURATION_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/statemachine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/statemachine.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: State Machine implementation +* +*/ + +#ifndef STATEMACHINE_H +#define STATEMACHINE_H + +// INCLUDES +#include +#include + +#include +#include "timerinterface.h" +#include "statemachine_v2.h" + +class CCoeEnv; + +namespace stmUiEventEngine +{ + +class CCallbackTimer; +class CStateEngine; +class THwEvent; +class CStateEngineConfiguration; + + +int Distance(int dx, int dy); + +inline int Distance(const TPoint& aP1, const TPoint& aP2) +{ + return Distance(aP1.iX - aP2.iX, aP1.iY - aP2.iY); +} + +// CLASS DECLARATION +/** + * CStateMachine + * + */ +NONSHARABLE_CLASS( CStateMachine ): public CBase, + public MTimerInterface, + public MAknWsEventObserver, + public MStateMachine +{ +public: + /** + * The MStateMachine interface methods + */ + virtual TRect getTouchArea(TInt aPointerNumber) ; + virtual void setTouchTimeArea(long fingersize_mm) ; + virtual void setTouchArea(long fingersize_mm) ; + virtual TAreaShape getTouchAreaShape() ; + virtual void setTouchAreaShape(const TAreaShape shape) ; + virtual unsigned int getTouchTimeout() ; + virtual void setTouchTimeout(unsigned int) ; + virtual TRect getHoldArea(TInt aPointerNumber) ; + virtual void setHoldArea(long fingersize_mm) ; + virtual TAreaShape getHoldAreaShape() ; + virtual void setHoldAreaShape(const TAreaShape shape) ; + virtual unsigned int getHoldTimeout(); + virtual void setHoldTimeout(unsigned int a); + virtual unsigned int getTouchSuppressTimeout() ; + virtual void setTouchSuppressTimeout(unsigned int a) ; + virtual unsigned int getMoveSuppressTimeout() ; + virtual void setMoveSuppressTimeout(unsigned int a) ; + virtual bool addUiEventObserver(MUiEventObserver* observer) ; + virtual bool removeUiEventObserver(MUiEventObserver* observer) ; + virtual bool wasLastMessageFiltered(TInt aPointerNumber) ; + virtual void enableCapacitiveUp(bool enable) ; + virtual void enableLogging(bool aEnable) ; + virtual void enableYadjustment(bool aEnable) ; + virtual int getNumberOfPointers() ; + + /** + * MAknWsEventObserver methods + */ + virtual void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination) ; + + /* other methods */ + /** + * Pointer event handling in case the messaging should be handled that way, note that the target CCoeControl needs to be givem + */ + void HandlePointerEventL(const TPointerEvent& aPointerEvent, void* target) ; + /** + * Simple toggle changes from handling the messages using ...WsEventL or ...PointerEventL + */ + void EnableWsEventMonitoring(bool aEnable) ; + /** + * Method to handle the TPointerEvent + */ + bool HandleStateEvent(const TPointerEvent& aPointerEvent, void* aTarget, const TTime& aTime) ; + /*! + * Setting the Y adjustment useful in capacitive touch + * Note that there are problems with the adjustment if done at this level, + * the most proper place would be the window server. + */ + + /** + * MTimerInterface methods, these are internal and do not need to be exported + */ + virtual void startTouchTimer(TInt aDelay, TInt aPointerNumber) ; + virtual void cancelTouchTimer(TInt aPointerNumber) ; + virtual void startHoldTimer(TInt aDelay, TInt aPointerNumber) ; + virtual void cancelHoldTimer(TInt aPointerNumber) ; + virtual void startSuppressTimer(TInt aDelay, TInt aPointerNumber) ; + virtual void cancelSuppressTimer(TInt aPointerNumber) ; + +public: + ~CStateMachine(); + static CStateMachine* NewL(); + static CStateMachine* NewLC(); + +private: + CStateMachine(); + void ConstructL(); + + inline static TInt PointerIndex(const TPointerEvent& aPointerEvent); + + /** + * Convert pointer event into our own event format (including timestamp) + */ + void CreateHwEvent(THwEvent& aEvent, + const TPointerEvent& aPointerEvent, + void* aTarget, + const TTime& aTime) ; + + void CreateTimerEvent(THwEvent& aEvent, TStateMachineEvent aEventCode) ; + + /** + * the actual state machines implementing the transitions etc. + */ + CStateEngine* m_impl[KMaxNumberOfPointers] ; + /* + * The configuration for state machines + */ + CStateEngineConfiguration* m_config ; + /*! + * convert window coordinates to screen coordinates. + */ + TPoint screenCoordinates(const TPoint& aPos, void* aGestureTarget) ; + + CCoeEnv* m_coeEnv; + + bool m_WasMessageFiltered ; + bool m_wseventmonitoringenabled ; + bool m_loggingenabled ; + bool m_capacitiveup ; + + int m_3mminpixels ; + bool m_adjustYposition ; + // Use same naming scheme with the timers, and variables and methods + // using macro expansion tricks (with multitouch support starts to look quite ugly): +#define DECLARE_TIMER(x) \ + void start##x##Timer(TInt aPointerNumber) ;\ + CCallbackTimer* m_##x##Timer[KMaxNumberOfPointers] ;\ + void handle##x##Timer(TInt aPointerNumber) ;\ + void cancel##x##Timer(TInt aPointerNumber) + + DECLARE_TIMER(touch) ; + DECLARE_TIMER(hold) ; + DECLARE_TIMER(suppress) ; + +}; +} // namespace +#endif // STATEMACHINE_H diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/statemachine_v2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/statemachine_v2.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + +#ifndef STATEMACHINE_V2_H_ +#define STATEMACHINE_V2_H_ + +namespace stmUiEventEngine +{ +/** + * the next templates define the static callbacks required to pass the this object to the member function + * There are two definitions, one for the TBool is*() method checking the message, + * the other one returning void for entry, event and action methods. + */ +template +bool isF(void *p) +{ + return ((reinterpret_cast(p))->*F)(); +} + +template +void aF(void *p) +{ + ((reinterpret_cast(p))->*F)(); +} + +///////////////////////////////////////////////////////////////////////////////////// +// We define the state machine in C fashion so that we get the initialized state table +// already at compilation phase. The message checking methods, event methods and action methods are +// then passed to the C++ object to be processed. +// The currently defined states are the following, at the same time they are used as the index to the array of states. +enum TStateMachineState { + Eignore, + EInit, + EDispatch, + EInTouchTime, + EInHoldTime_U, + EInHoldTime_D, + EInTouchArea, + ESuppress_D + } ; +// Using these kind of functions the state machine is of course single threaded +// the necessary parameters need to be passed in the member variables +typedef bool (*condition_t)(void* ) ; +typedef void (*action_t)(void*) ; + +/* + * The possible events to the state machine. The pointer and timer events are possible. + */ +enum TStateMachineEvent { + EDown, + EDrag, + ECapacitiveUP, + EResistiveUP, + ETouchTimer, + EHoldTimer, + ESuppressTimer + } ; +/*! + * STATE_ELEMENT defines one line in the state/event instance. + * It contains three fields: ConditionFunction, ActionFunction and NextState. + * The generic state machine will call the ConditionFunction (if it is != NULL) + * and if the result is true, it will call ActionFunction (if it is != NULL). + * Then it will continue to NextState. + * If NextState is Eignore, it will try the next line of state/event. + */ +typedef struct _STATE_ELEMENT { + /*! + * Condition function contains the pointer to the method used to check some condition. + * If the pointer is non-NULL the state machine will call the function and based on the result + * (if true) calls the ActionFunction. + */ + const condition_t conditionFunction ; + /*! + * ActionFunction contains a pointer to a method performing some action. The state machine + * will call the method if the pointer is non-NULL. + */ + const action_t actionFunction ; + /*! + * NextState contains either the next state or Eignore. The state machine will process state elements + * until the NextState != Eignroe is found. + */ + const TStateMachineState nextState ; +} STATE_ELEMENT ; + +/*! + * Each state contains an array defining the possible event and the state elements + * that are processed if the event happens. + */ +typedef struct _STATE { + /*! + * The event defines the pointer event or timer event being processed + */ + const TStateMachineEvent theEvent ; // + /*! + * StateElements points to the array of STATE_ELEMENT entries which define the + * condition and action functions to be processed and the resulting nesxt state. + */ + const STATE_ELEMENT* const stateElements ; +} STATE ; + +} // namespace + +#endif /* STATEMACHINE_V2_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/tapgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/tapgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,145 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Tap Gesture Recognizer +* +*/ + +#ifndef TAPGESTURERECOGNISER_H_ +#define TAPGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CTapGestureRecogniser handles both tap and double tap recognition. + * Doubletap needs to work even if it crosses window boundaries, so + * CTapGestureRecogniser is a "global" recogniser. The application + * creates only one instance of it (TODO later: how to use Singleton + * pattern in Symbian, seems to be tricky since we would need to have + * writable static variable to hold the one instance, so currently + * we need well-behaving app to handle this: the application must known + * the nature of this gesture recogniser). + * The different windows can add their callbacks, and when recognising tap + * the target window is stored so that proper callback can be called. + * Doubletap is reported either to the target of second tap, or if that windows parent + * has a doubletap listener, to that. + * Use separate listeners for tap and doubletap. + */ +NONSHARABLE_CLASS( CTapGestureRecogniser ): public CTimer, public MGestureRecogniserIf +{ +public: + static const TGestureUid KUid = EGestureUidTap; + + /** Two-phase constructor */ + static CTapGestureRecogniser* NewL(MGestureListener* aListener) ; + + virtual ~CTapGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + virtual void enable(bool enabled) ; + virtual bool isEnabled() ; + virtual void setOwner(CCoeControl* owner) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up tap gesture recogniser: + * define the double tap timeout in microseconds. + * \param timeoutInMicroseconds + */ + void setDoubleTapTimeout(int timeoutInMicroseconds) ; + + /*! + * Additional methods to set up tap gesture recogniser: + * define how close the two taps need to be to be recognised + * as a double tap. + * \param rangeInMillimetres + */ + void setDoubleTapRange(int rangeInMillimetres) ; + /*! + * Additional methods to set up tap gesture recogniser: + * Produce two separate taps or just ignore the first one + * if the second tap is outside range. + */ + void ignoreFirstTap(bool ignore) ; + + /*! + * Method to add a listener to tap gestures + */ + void addTapListener(MGestureListener* aListener, CCoeControl* listenerOwner) ; + /*! + * Method to remove a listener from tap gestures + */ + void removeTapListener(MGestureListener* aListener, CCoeControl* listenerOwner) ; + /*! + * Method to add a listener to doubletap gestures + */ + void addDoubleTapListener(MGestureListener* aListener, CCoeControl* listenerOwner) ; + /*! + * Method to remove a listener from doubletap gestures + */ + void removeDoubleTapListener(MGestureListener* aListener, CCoeControl* listenerOwner) ; + + /*! + * for testing purposes we need to log the stuff somewhere... + */ +public: + virtual void enableLogging(bool loggingOn) ; + + /*! + * The timer function to handle timeout for tap + */ + virtual void RunL() ; + + +private: + CTapGestureRecogniser(MGestureListener* aListener) ; + bool m_loggingenabled ; + bool isSecondTapClose(const TPoint& secondPoint, const TPoint& firstPoint) ; +private: + CCoeControl* m_powner ; // The owning control for this gesture + bool m_waitingforsecondtap ; + TPoint m_firstTapXY ; + CCoeControl* m_firstTapTarget ; + float m_firstTapSpeedX ; + float m_firstTapSpeedY ; + int m_doubleTapTimeout ; + bool m_gestureEnabled ; + bool m_ignorefirst ; + int m_rangesizeInPixels ; + // use simple arrays to store the listeners and corresponding windows + RPointerArray m_tapListeners ; + RPointerArray m_tapListenerWindows ; + RPointerArray m_doubleTapListeners ; + RPointerArray m_doubleTapListenerWindows ; + + +}; + +} // namespace + +#endif /* TAPGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/timerinterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/timerinterface.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Interface for Timer +* +*/ + +#ifndef TIMERINTERFACE_H_ +#define TIMERINTERFACE_H_ + +class MTimerInterface +{ +public: + virtual void startTouchTimer(TInt aDelay, TInt aPointerNumber) = 0 ; + virtual void cancelTouchTimer(TInt aPointerNumber) = 0 ; + virtual void startHoldTimer(TInt aDelay, TInt aPointerNumber) = 0 ; + virtual void cancelHoldTimer(TInt aPointerNumber) = 0 ; + virtual void startSuppressTimer(TInt aDelay, TInt aPointerNumber) = 0 ; + virtual void cancelSuppressTimer(TInt aPointerNumber) = 0 ; +}; +#endif /* TIMERINTERFACE_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/touchgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/touchgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Touch Gesture Recogniser +* +*/ + +#ifndef TOUCHGESTURERECOGNISER_H_ +#define TOUCHGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CTouchGestureRecogniser handles touch "gesture". The purpose is to inform the app + * that a touch has happened. The gesture is never owned, since most of the gestures start with touch. + * The app may define the area where to watch the gestures, or it can define empty area: + * then the touch is recognised inside the window. + * + */ +NONSHARABLE_CLASS( CTouchGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidTouch; + + /** Two-phase constructor */ + static CTouchGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CTouchGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up edge scroll gesture recogniser: + * define the rectangle where the touch is watched + * \param theArea + */ + void setArea(const TRect& theArea) ; + +private: + CTouchGestureRecogniser(MGestureListener* aListener) ; + +private: + TRect m_area ; +}; + +} // namespace + +#endif /* TOUCHGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/uievent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/uievent.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: UI Event +* +*/ + +#ifndef UIEVENT_H_ +#define UIEVENT_H_ +#include "rt_uievent.h" + +namespace stmUiEventEngine +{ + +NONSHARABLE_CLASS( CUiEvent ): public MUiEvent +{ +public: + virtual const TPoint& StartPos() const ; + virtual const TPoint& CurrentXY() const ; // current yx-coordinate + virtual const TPoint& PreviousXY() const ; // Past yx coordinate + virtual TTimeIntervalMicroSeconds StateTransition() const ; // Time taken for state transition + virtual bool TimerExpired() const; // if timer expired + virtual TUiEventCode Code()const ; + virtual void* Target() const ; + virtual int Index() const ; + MUiEvent* previousEvent() const ; + virtual int countOfEvents() const ; + virtual TInt64 timestamp() const ; + virtual float speedX() const __SOFTFP; // pixels / millisecond + virtual float speedY() const __SOFTFP; // pixels / millisecond + + static CUiEvent* NewL(TUiEventCode aCode, const TPoint& aStart, const TPoint& aXY, + const TPoint& aPreviousXY, bool aTimerExpired, void* aTarget, + TTimeIntervalMicroSeconds aInterval, int aIndex, TInt64 aTimestamp) ; + ~CUiEvent() ; + /*! + * Chain the UI events ; the whole chain is deleted after release has been handled + * in UI sender + */ + virtual void setPrevious(CUiEvent* aEvent) ; +private: + CUiEvent( + TUiEventCode aCode, + const TPoint& aStart, const TPoint& aXY, const TPoint& aPreviousXY, + bool aTimerExpired, void* aTarget, TTimeIntervalMicroSeconds aInterval, + int aIndex, TInt64 aTimestamp) ; + + TUiEventCode m_code ; + TPoint m_start ; + TPoint m_XY ; + TPoint m_previousXY ; + TTimeIntervalMicroSeconds m_statetransition ; + void* m_target ; + bool m_timerExpired ; + int m_index ; + CUiEvent* m_previousEvent ; + TInt64 m_timestamp ; +}; +} +#endif /* UIEVENT_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/uieventsender.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/uieventsender.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Ui Event Sender Class +* +*/ + +#ifndef UIEVENTSENDER_H_ +#define UIEVENTSENDER_H_ + +#include +#include +#include + +namespace stmUiEventEngine +{ + +class CUiEvent; +/** + * CUiEventSender class for handling the sending of events to the UI event listener + */ +NONSHARABLE_CLASS(CUiEventSender): public CBase + { +public: + enum TEventSenderState + { + ENoEvents, + EEventsReady, + EBusy + }; + + static CUiEventSender* NewL( ); + ~CUiEventSender(); + + TInt AddEvent(CUiEvent* aGestureEvent); + bool addObserver(MUiEventObserver* aObserver ); + bool removeObserver(MUiEventObserver* aObserver ); + void setLogging(bool a) {m_loggingenabled = a;} ; + +private: + CUiEventSender(); + void EmitEventL( const CUiEvent& aGestureEvent ); + + /*! + * Should we be prepared for more than 5 pointers ? Jos tulee Torvisen voittaja + */ + CUiEvent* iEvents[stmUiEventEngine::KMaxNumberOfPointers]; + void compressStack(CUiEvent* aUiEvent) ; + + /* + * Let's be prepared for more than one observer, + * although usually there is only the gesture engine + */ + RPointerArray iObserver; + bool m_loggingenabled ; + + }; +} +#endif /* UIEVENTSENDER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/unknowngesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/unknowngesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Unknown gesture recognizer +* +*/ + +#ifndef UNKNOWNGESTURERECOGNISER_H_ +#define UNKNOWNGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CUnknownGestureRecogniser handles unknown gestures at ERelease + * I.e. if no-one else has recognised a gesture when ERelease arrives, + * This recogniser can be at the end of the list to inform the app + * that something weird is happening... + * + */ +NONSHARABLE_CLASS( CUnknownGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidUnknown; + + /** Two-phase constructor */ + static CUnknownGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CUnknownGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + +private: + CUnknownGestureRecogniser(MGestureListener* aListener) ; + +}; + +} // namespace + +#endif /* UNKNOWNGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/updowngesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/updowngesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Updown Gesture Recognizer +* +*/ + +#ifndef UPDOWNGESTURERECOGNISER_H_ +#define UPDOWNGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +NONSHARABLE_CLASS( CUpdownGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidUpDown; + + static CUpdownGestureRecogniser* NewL(MGestureListener* aListener); + + virtual ~CUpdownGestureRecogniser(); + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + + virtual TGestureUid gestureUid() const + { + return KUid; + } + +private: + CUpdownGestureRecogniser(MGestureListener* aListener) ; +}; + +} + +#endif /* UPDOWNGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/utils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/utils.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Utility funtions +* +*/ + +#ifndef _GESTURE_UTILS_H_ +#define _GESTURE_UTILS_H_ + +#include + +namespace stmUiEventEngine +{ + + /** + * @return the rectange in which dragging will be ignored. Tolerance rect + * represents a rectange within which any movement will not be considered + * intentional, but as accidental stylus movement. + */ + TRect ToleranceRect( const TPoint& aCenterPoint ); + + long Twips2Pixels(long twips); + long Mm2Pixels(long mm); + long Inches2Pixels(double inches); + +} // namespace stmProto04 + +#endif // _GESTURE_UTILS_H_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/inc/zoomgesturerecogniser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/inc/zoomgesturerecogniser.h Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Zoom Gesture Recognizer +* +*/ + +#ifndef ZOOMGESTURERECOGNISER_H_ +#define ZOOMGESTURERECOGNISER_H_ + +#include "rt_gestureengineif.h" +#include +#include + +class CCoeControl ; + +namespace stmGesture +{ + +/*! + * CZoomGestureRecogniser handles zoomin gesture: start from near lower left / upper right corner and drag + * This is useful if one wants to implement single handed zooming so can be done using thumb + * (no need to use pinch i.e. hold device in one hand and use two fingers of the other) + * Current spec is: + * - touch lower left corner and start dragging => initialize ZOOM IN + * - touch upper right corner and start dragging => initialize ZOOM OUT + * store the touch point and then calculate the distance until release + * The distance is the zoom factor (probably needs some adjustment, not just the pixels...) + */ +NONSHARABLE_CLASS( CZoomGestureRecogniser ): public CGestureRecogniser +{ +public: + static const TGestureUid KUid = EGestureUidCornerZoom; + + /** Two-phase constructor */ + static CZoomGestureRecogniser* NewL(MGestureListener* aListener); + virtual ~CZoomGestureRecogniser(); + + /*! + * MGestureRecogniserIf methods + */ + virtual TGestureRecognitionState recognise(int numOfActiveStreams, MGestureEngineIf* ge) ; + virtual void release(MGestureEngineIf* ge) ; + virtual TGestureUid gestureUid() const + { + return KUid; + } + + /*! + * Additional methods to set up zoom in gesture recogniser: + * define the rectangle where the lower left corner is + * \param theArea + */ + void setArea(const TRect& theArea) ; + + /*! + * Additional methods to set up zoom in gesture recogniser: + * Define how close to the lower left corner the touch must happen + * \param rangeInPixels + */ + void setRange(int rangeInPixels) ; + +private: + CZoomGestureRecogniser(MGestureListener* aListener) ; + + float calculateDistance(const TPoint& aTp) ; + int adjustZoom(float& aPreviousDistance, float aNewDistance) ; + +private: + TRect m_area ; + int m_rangesizeInPixels ; + TZoomType m_zoomtype ; + bool m_zooming ; + TPoint m_startingtouch ; + TPoint m_previoustouch ; + int m_delta ; + +}; + +} // namespace + +#endif /* ZOOMGESTURERECOGNISER_H_ */ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/rom/stmgesturefw.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/rom/stmgesturefw.iby Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: STM Gesture Fw iby file +* +*/ + + +#ifndef _STMGESTUREFW_IBY_ +#define _STMGESTUREFW_IBY_ + +#include + +#ifdef BRDO_USE_GESTURE_HELPER + +#include + +file=ABI_DIR\BUILD_DIR\stmgesturefw.dll SHARED_LIB_DIR\stmgesturefw.dll + +#endif // BRDO_USE_GESTURE_HELPER + +#endif // _STMGESTUREFW_IBY_ diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/sis/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/sis/backup_registration.xml Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,5 @@ + + + + + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/UiEvent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/UiEvent.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,147 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include "UiEvent.h" +#include "filelogger.h" +#include "statemachine.h" // for stmUiEventEngine::Distance(dx,dy) +//#include "flogger.h" + +using namespace stmUiEventEngine ; + +static const char* const eventNames[] = { // for debugging purposes define the names of the UI events + "noEvent", + "ETouch", + "EHold", + "EDrag", + "ERelease", + "ENull" +} ; + +const char* stmUiEventEngine::EventName(stmUiEventEngine::TUiEventCode aCode) +{ + return eventNames[aCode]; +} + +CUiEvent* CUiEvent::NewL( + TUiEventCode aCode, + const TPoint& aStart, const TPoint& aXY, const TPoint& aPreviousXY, + bool aTimerExpired, void* aTarget, TTimeIntervalMicroSeconds aInterval, + int aIndex, TInt64 aTimestamp) +{ + CUiEvent* self = new (ELeave) CUiEvent(aCode, aStart, aXY, aPreviousXY, + aTimerExpired, aTarget, aInterval, aIndex, aTimestamp) ; + return self; +} + +CUiEvent::CUiEvent( + TUiEventCode aCode, + const TPoint& aStart, const TPoint& aXY, const TPoint& aPreviousXY, + bool aTimerExpired, void* aTarget, TTimeIntervalMicroSeconds aInterval, + int aIndex, TInt64 aTimestamp) : + m_code(aCode), m_start(aStart), m_XY(aXY), m_previousXY(aPreviousXY), + m_statetransition(aInterval), m_target(aTarget), m_timerExpired(aTimerExpired), + m_index(aIndex), m_previousEvent(NULL), m_timestamp(aTimestamp) +{ +} + +CUiEvent::~CUiEvent() +{ + delete m_previousEvent ; + m_previousEvent = NULL ; +} +const TPoint& CUiEvent::StartPos() const +{ + return m_start ; +} +const TPoint& CUiEvent::CurrentXY() const +{ + return m_XY ; +} +TUiEventCode CUiEvent::Code()const +{ + return m_code ; +} +const TPoint& CUiEvent::PreviousXY() const +{ + return m_previousXY ; +} +TTimeIntervalMicroSeconds CUiEvent::StateTransition() const +{ + return m_statetransition ; +} +bool CUiEvent::TimerExpired() const +{ + return m_timerExpired ; +} +void * CUiEvent::Target() const +{ + return m_target ; +} +int CUiEvent::Index() const +{ + return m_index ; +} +void CUiEvent::setPrevious(CUiEvent* aEvent) +{ + m_previousEvent = aEvent ; +} +MUiEvent* CUiEvent::previousEvent() const +{ + return m_previousEvent ; +} +int CUiEvent::countOfEvents() const +{ + int count = 1 ; + for(CUiEvent* prev = m_previousEvent; prev; prev = prev->m_previousEvent) + { + ++count; + } + return count ; +} +TInt64 CUiEvent::timestamp() const +{ + return m_timestamp ; +} + +float CUiEvent::speedX() const __SOFTFP +{ + int distX = m_XY.iX - m_previousXY.iX; + // now calculate speed + float elapsed = float (m_statetransition.Int64()/1000) ; // use ms as time unit + + float speed = 0; + if (elapsed == 0) { + elapsed = 5.0; // if time is 0, take 5ms + } + speed = float(distX)/elapsed ; + return speed ; +} + +float CUiEvent::speedY() const __SOFTFP +{ + int distY = m_XY.iY - m_previousXY.iY; + // now calculate speed + float elapsed = float (m_statetransition.Int64()/1000) ; // use ms as time unit + float speed = 0; + if (elapsed == 0) { + elapsed = 5.0; // if time is 0, take 5ms + } + speed = float(distY)/elapsed ; + return speed ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/edgescrollgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/edgescrollgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,166 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "edgescrollgesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +CEdgeScrollGestureRecogniser::CEdgeScrollGestureRecogniser(MGestureListener* aListener) : + CPeriodic(0), m_listener(aListener) , m_area() +{ + m_powner = aListener->getOwner() ; + m_gestureEnabled = true ; + m_rangesizeInPixels = 10 ; // by default 10 pixels from the edges is the area +} + +CEdgeScrollGestureRecogniser* CEdgeScrollGestureRecogniser::NewL(MGestureListener* aListener) +{ + CEdgeScrollGestureRecogniser* self = new (ELeave) CEdgeScrollGestureRecogniser(aListener) ; + CleanupStack::PushL(self); + self->ConstructL(); // construct base class + CActiveScheduler::Add(self); + CleanupStack::Pop(self); + return self; +} + +CEdgeScrollGestureRecogniser::~CEdgeScrollGestureRecogniser() +{ + Cancel(); +} + +TGestureRecognitionState CEdgeScrollGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like edge scroll with one pointer + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be EHold + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: %d num %d code %d", + eventCode, countOfEvents, eventCode); + } + + if (eventCode == stmUiEventEngine::EHold) // The last one is EHold, look if it is near the area defined + { + const TPoint& p = puie->CurrentXY(); + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: 0x%x EHold: num %d code %d, %d", + this, countOfEvents, p.iX, p.iY); + LOGARG("CEdgeScrollGestureRecogniser: area, %d,%d %d,%d, range: %d", + m_area.iTl.iX, + m_area.iTl.iY, + m_area.iBr.iX, + m_area.iBr.iY, + m_rangesizeInPixels); + } + // check where the point is inside the area defined but outside of the area shrinked by m_rangesizeInPixels. + TRect rcInner = m_area ; + rcInner.Shrink(m_rangesizeInPixels, m_rangesizeInPixels) ; + if (m_area.Contains(p) && !rcInner.Contains(p)) + { + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: HIT, (%d,%d) in %d,%d %d,%d, range: %d", + p.iX, p.iY, m_area.iTl.iX, m_area.iTl.iY, + m_area.iBr.iX, m_area.iBr.iY, + m_rangesizeInPixels); + } + + state = EGestureActive ; + // this is edge scroll, check where it is about... + TEdgeScroll scrolltype = EEdgeScrollUnknown ; + if (p.iY < m_area.iTl.iY + m_rangesizeInPixels) + scrolltype = EEdgeScrollUp ; // if Y is small enough, it is always up + else if (p.iY > m_area.iBr.iY - m_rangesizeInPixels) + scrolltype = EEdgeScrollDown ; // if Y is big enough, it is always down + else if (p.iX < m_area.iTl.iX + m_rangesizeInPixels) + scrolltype = EEdgeScrollLeft ; // if X is small enough, it is always left + else if (p.iX > m_area.iBr.iX - m_rangesizeInPixels) + scrolltype = EEdgeScrollRight ; // if X is big enough, it is always right + // issue the edge scroll gesture + stmGesture::TGenericSimpleGesture pgest(KUid, p, scrolltype, puie) ; + // Call the listener to inform that a Tap has occurred... + m_listener->gestureEnter(pgest) ; + } + } + } + return state; +} + +void CEdgeScrollGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + Cancel() ; // some other gesture took hold of the thing, do not send gesture + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: 0x%x release", this); + } +} + +void CEdgeScrollGestureRecogniser::RunL() +{ + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: 0x%x timer", this); + } +} + +void CEdgeScrollGestureRecogniser::enableLogging(bool loggingOn) +{ + m_loggingenabled = loggingOn; +} + +void CEdgeScrollGestureRecogniser::enable(bool enabled) +{ + m_gestureEnabled = enabled ; +} + +bool CEdgeScrollGestureRecogniser::isEnabled() +{ + return m_gestureEnabled ; +} + +void CEdgeScrollGestureRecogniser::setOwner(CCoeControl* owner) +{ + m_powner = owner; +} + +void CEdgeScrollGestureRecogniser::setScrollRange(int rangeInPixels) +{ + m_rangesizeInPixels = rangeInPixels ; +} + +void CEdgeScrollGestureRecogniser::setArea(const TRect& theArea) +{ + m_area = theArea ; + if (m_loggingenabled) + { + LOGARG("CEdgeScrollGestureRecogniser: set area, %d,%d %d,%d", m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/filelogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/filelogger.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,187 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ +#include "filelogger.h" + +#include +#include + +_LIT(KLogFolder, "logs\\"); +_LIT(KLogFileExt, ".log"); +_LIT8(KLineEnd, "\r\n"); + +const TInt KTimeRecordSize = 25; + +_LIT8(KTimeFormat,"%04d-%02d-%02d %02d:%02d:%02d.%03d "); +_LIT8(KLogStart, "--== New %S log ==--\r\n"); + +CFileLogger::CFileLogger() +{ +} + +TBool CFileLogger::Construct() +{ + TInt err = iFs.Connect(); + if (!err) + { + TFileName logFileName; + err = !GetLogFileNameWithoutExt(logFileName); + if(!err) + { + logFileName.Append(KLogFileExt); + err = iFile.Create(iFs, logFileName, EFileShareAny | EFileWrite); + if(!err) + { + TInt pos(0); + iFile.Seek(ESeekEnd, pos); + TBuf8 appName; + appName.Copy(BaflUtils::ExtractAppNameFromFullName(RThread().FullName())); + iLogBuffer.AppendFormat(KLogStart, &appName); + err = iFile.Write(iLogBuffer); + } + } + } + return (!err); +} + +CFileLogger* CFileLogger::Logger() +{ + CFileLogger* logger = (CFileLogger*)Dll::Tls(); + if (!logger) + { + logger = new CFileLogger; + if (logger) + { + if (logger->Construct()) + { + Dll::SetTls(logger); + } + else + { + delete logger; + logger = NULL; + } + } + } + return logger; +} + +void CFileLogger::Close() +{ + delete (CFileLogger*)Dll::Tls(); + Dll::FreeTls(); +} + +CFileLogger::~CFileLogger() +{ + iFile.Close(); + iFs.Close(); +} + +TBool CFileLogger::GetLogFileNameWithoutExt(TDes& aFileName) +{ + TFileName path = PathInfo::MemoryCardRootPath() ; + path.Append(PathInfo::OthersPath()) ; // Put the log in the "Others" directory + aFileName.Append(path); + aFileName.Append(KLogFolder); + TBool res = BaflUtils::FolderExists(iFs, aFileName); + if (!res) + { + aFileName.Zero(); + aFileName.Append(path) ; // put it then directly to Others folder + res = ETrue ; + } + TPtrC fileName(BaflUtils::ExtractAppNameFromFullName(RThread().FullName())); + aFileName.Append(fileName); + TTime time; + time.HomeTime(); + TDateTime dateTime; + dateTime = time.DateTime(); + // add timestamp to the name (then one has to clear them manually) + aFileName.AppendNum(dateTime.Month()+1) ; + aFileName.AppendNum(dateTime.Day()+1) ; + aFileName.AppendNum(dateTime.Hour()) ; + aFileName.AppendNum(dateTime.Minute()) ; + aFileName.AppendNum(dateTime.Second()) ; + return res; +} + +void CFileLogger::Write(const TDesC8& aText) +{ + CFileLogger* logger = Logger(); + if(logger) + { + logger->iLogBuffer.Copy(aText); + logger->DoWrite(); + } +} + +void CFileLogger::Write(const TDesC16& aText) +{ + CFileLogger* logger = Logger(); + if(logger) + { + logger->iLogBuffer.Copy(aText); + logger->DoWrite(); + } +} + +void CFileLogger::Write(TRefByValue aFmt,...) +{ + CFileLogger* logger = Logger(); + if (logger) + { + VA_LIST list; + VA_START(list, aFmt); + logger->iLogBuffer.FormatList(aFmt, list); + logger->DoWrite(); + VA_END(list); + } +} + +void CFileLogger::DoWrite() +{ + if(iFile.SubSessionHandle()) + { + TTime time; + time.HomeTime(); + TDateTime dateTime; + dateTime = time.DateTime(); + TBuf8 timeRecord; + timeRecord.Format(KTimeFormat, dateTime.Year(), dateTime.Month()+1, dateTime.Day()+1, + dateTime.Hour(), dateTime.Minute(), dateTime.Second(), + dateTime.MicroSecond()/1000); + iLogBuffer.Insert(0, timeRecord); + iLogBuffer.Append(KLineEnd); + iFile.Write(iLogBuffer); + } +} +void CFileLogger::DoFlush() +{ + if(iFile.SubSessionHandle()) + { + iFile.Flush(); + } + +} +void CFileLogger::Flush() +{ + CFileLogger* logger = Logger(); + if (logger) + { + logger->DoFlush() ; + } +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/flickgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/flickgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "flickgesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" +//#include "flogger.h" + +using namespace stmGesture ; + +CFlickGestureRecogniser::CFlickGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CFlickGestureRecogniser* CFlickGestureRecogniser::NewL(MGestureListener* aListener) +{ + CFlickGestureRecogniser* self = new (ELeave) CFlickGestureRecogniser(aListener) ; + return self; +} + +CFlickGestureRecogniser::~CFlickGestureRecogniser() +{ +} +/*! + * Release gesture recogniser. Note that this one never owns the gesture, it just calls + * the callback if it detects ERelease inside the area being watched. + * There could be also check for the target window? + */ +TGestureRecognitionState CFlickGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like flick with one pointer + if (numOfActiveStreams == 1) + { + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + if (m_loggingenabled) + { + LOGARG("CFlickGestureRecogniser: %d num %d code %d", eventCode, countOfEvents, eventCode); + + } + if (m_powner == puie->Target() && eventCode == stmUiEventEngine::ERelease) + { + if (m_loggingenabled) + { + LOGARG("CFlickGestureRecogniser: 0x%x ERelease: num %d code %d, %d", this, countOfEvents, puie->CurrentXY().iX, puie->CurrentXY().iY); + } + // Check if the speed before release was fast enough for flick + const stmUiEventEngine::MUiEvent* puieprev = puie->previousEvent() ; + if (puieprev && puieprev->Code() == stmUiEventEngine::EMove) + { + using stmUiEventEngine::TUiEventSpeed; + + float thespeedX = puieprev->speedX() ; + float thespeedY = puieprev->speedY() ; + if (m_loggingenabled) + { + LOGARG("CFlickGestureRecogniser: prev speed: %f (limit: %f)", double(thespeedX), double(m_speed)) ; + } + if (Abs( thespeedX) >= m_speed || Abs( thespeedY) >= m_speed ) + { + state = EGestureActive ; + + TUiEventSpeed speedIf(thespeedX, thespeedY); + + // issue the flick gesture using the TDirectionalGesture (it has the speed and direction) + stmGesture::TDirectionalGesture pgest( + KUid, + puieprev->CurrentXY(), + puieprev->PreviousXY(), + &speedIf, + m_loggingenabled); + + // Call the listener to inform that a flick has occurred... + m_listener->gestureEnter(pgest); + } + } + } + } + return state; +} +void CFlickGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + if (m_loggingenabled) + { + LOGARG("CFlickGestureRecogniser: 0x%x flick", this); + } +} +void CFlickGestureRecogniser::setFlickingSpeed(float aSpeed) __SOFTFP +{ + m_speed = aSpeed ; +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/genericsimplegesture.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/genericsimplegesture.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,121 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "filelogger.h" + +using namespace stmGesture ; +using stmUiEventEngine::MUiEventSpeed; + + +TGenericSimpleGesture::TGenericSimpleGesture( + TGestureUid uid, const TPoint& loc, int type, const MUiEventSpeed* speedIf) : + m_location(loc), m_uid(uid), m_type(type), m_details(0), m_speed(speedIf) +{ +} + +TPoint TGenericSimpleGesture::getLocation() const +{ + return m_location ; +} + +int TGenericSimpleGesture::getType() const +{ + return m_type ; +} + +int TGenericSimpleGesture::getDetails() const +{ + return m_details ; +} + +void TGenericSimpleGesture::setName(const TDesC8& aName) +{ + m_name.Set(aName) ; +} + +TPtrC8 TGenericSimpleGesture::getGestureName() +{ + return m_name ; +} + +TDirectionalGesture::TDirectionalGesture( + TGestureUid uid, const TPoint& loc, const TPoint& prevLoc, + const MUiEventSpeed* speedIf, bool logging) : + TGenericSimpleGesture(uid, loc, 0, speedIf), m_loggingEnabled(logging) +{ + setVector(loc, prevLoc); +} + +void TDirectionalGesture::setVector(const TPoint& last, const TPoint& previous) +{ + m_vector = TPoint(last.iX-previous.iX, previous.iY-last.iY) ; // x > 0 => east, y > 0 => north + if (m_loggingEnabled) + { + LOGARG("CHoveringGesture: x: %d , %d prev: %d, %d", last.iX, last.iY, previous.iX, previous.iY) ; + } +} + +TGestureDirection TDirectionalGesture::getDirection() const +{ + TGestureDirection dir = ENorth ; + int x = Abs(m_vector.iX) ; + int y = Abs(m_vector.iY) ; + if (y <= x/2) + { + if (m_vector.iX < 0) + dir = EWest ; + else + dir = EEast ; + } + else if (y > x/2 && y <= (x+x/2)) + { + if (m_vector.iX < 0) + { + if (m_vector.iY < 0 ) + dir = ESouthWest ; + else + dir = ENorthWest ; + } + else + { + if (m_vector.iY < 0 ) + dir = ESouthEast ; + else + dir = ENorthEast ; + } + } + else if (y > x+x/2) + { + if (m_vector.iY < 0) + dir = ESouth ; + else + dir = ENorth ; + } + if (m_loggingEnabled) + { + LOGARG("CHoveringGesture: x: %d y: %d direction: %d", m_vector.iX, m_vector.iY, dir) ; + } + return dir ; +} + +TTwoPointGesture::TTwoPointGesture(TGestureUid uid, const TPoint& loc, const TPoint& prevLoc) : + TDirectionalGesture(uid, loc, prevLoc, NULL), + m_location2(prevLoc) +{ +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/gestureengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/gestureengine.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,275 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GestureEngine.h" + +#include "filelogger.h" + + +using namespace stmGesture ; + +CGestureEngine::CGestureEngine() +{ + m_numOfActiveStreams = 0 ; + m_currentGestureOwner = -1 ; + m_currentLockedGesture = -1 ; + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + m_uiEventStream[i] = NULL ; + } +} + +CGestureEngine::~CGestureEngine() +{ + m_gestures.Reset() ; +} + +bool CGestureEngine::addGesture(const MGestureRecogniserIf* aNewGesture) +{ + // Add the new gesture recogniser to our list of recognisers + return m_gestures.Append(aNewGesture) == 0; +} + +bool CGestureEngine::insertGesture(const MGestureRecogniserIf* aNewGesture) +{ + return insertGestureAt(aNewGesture, 0) == 0; +} + +bool CGestureEngine::insertGestureAt(const MGestureRecogniserIf* aNewGesture, int position) +{ + return m_gestures.Insert(aNewGesture, position) == 0 ; +} + +bool CGestureEngine::removeGesture(const MGestureRecogniserIf* aOldGesture) +{ + // If gestures are removed, there cannot be current gesture owner... + if (m_currentGestureOwner != -1) + { + MGestureRecogniserIf* pgrif = m_gestures[m_currentGestureOwner] ; + pgrif->release(this) ; + m_currentGestureOwner = -1 ; // no more gesture owners... + } + TInt ix = m_gestures.Find(aOldGesture) ; + bool found = (ix != -1); + if (found) + { + m_gestures.Remove(ix) ; + } + return found ; +} + +int CGestureEngine::activeStreamCount() const +{ + return m_numOfActiveStreams ; +} + +const stmUiEventEngine::MUiEvent* CGestureEngine::getUiEvents(int indexOfActiveStream) const +{ +#if defined(ADVANCED_POINTER_EVENTS) + // create temporary array of active event streams and initialize with zero + const stmUiEventEngine::MUiEvent* activeEventPointers[stmUiEventEngine::KMaxNumberOfPointers] ; + for (int x = 0; x < stmUiEventEngine::KMaxNumberOfPointers; x++) activeEventPointers[x] = 0 ; + // then fill from currently active event streams + int indextoactiveEventPointers = 0 ; + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + if (m_uiEventStream[i]) + activeEventPointers[indextoactiveEventPointers++] = m_uiEventStream[i] ; + } + // then return the active event stream asked + return activeEventPointers[indexOfActiveStream] ; +#else + // in single touch it is enough to return the only possible pointer + return m_uiEventStream[indexOfActiveStream] ; +#endif +} + +/*! + * Process the UI events + */ +void CGestureEngine::HandleUiEventL(const stmUiEventEngine::MUiEvent& aEvent ) +{ + // process one incoming UI event + storeUiEvent(aEvent) ; // store the event to the "stream" based on the index of pointer + walkTroughGestures() ; // and walk trough the gestures to process the UI event + updateUiEvents() ; + // If it was last release event, make sure no-one has the gestures locked + m_numOfActiveStreams = 0 ; + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + if (m_uiEventStream[i]) m_numOfActiveStreams++ ; + } + if (m_numOfActiveStreams == 0) + { + if (m_currentLockedGesture != -1) + { + MGestureRecogniserIf* pgrif = m_gestures[m_currentLockedGesture] ; + pgrif->release(this) ; + } + m_currentLockedGesture = -1 ; + } +} + +/*! + * Store the UI event. There are max X "streams" of events, one for each + * pointer. The streams are actually just pointers to the latest event, since the + * MUiEvent interface has methods to walk trough the chain of events. + */ +void CGestureEngine::storeUiEvent(const stmUiEventEngine::MUiEvent& aEvent) +{ + m_uiEventStream[aEvent.Index()] = &aEvent ; + m_numOfActiveStreams = 0 ; + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + if (m_uiEventStream[i]) m_numOfActiveStreams++ ; + } +} + +/*! + * Call each gesture handler in turn until one claims to be in control of the gesture. + */ +void CGestureEngine::walkTroughGestures() +{ + int newowner = -1 ; + int newlocker = m_currentLockedGesture ; + // check if someone has locked the gesture + TGestureRecognitionState thestate = ENotMyGesture ; + if (m_currentLockedGesture != -1) + { + MGestureRecogniserIf* pgrif = m_gestures[m_currentLockedGesture] ; + if (pgrif) + { + if (m_loggingEnabled) + { + // log entry about locked gesture (hmm.. should have added names to the MGestureRecogniserIf + LOGARG("locked gesture recognizer %d (addr %d), active streams %d", + m_currentLockedGesture, pgrif, m_numOfActiveStreams); + } + + thestate = pgrif->recognise(m_numOfActiveStreams, this) ; + switch (thestate) + { + case EGestureActive: + { + // This gesture recogniser owns the gesture, so release the lock + newlocker = -1 ; + newowner = m_currentLockedGesture ; + if (m_loggingEnabled) + { + LOGARG("new owner %d lock release", m_currentLockedGesture); + } + break; + } + case ELockToThisGesture: + { + // this gesture recogniser wants to keep the lock + newowner = m_currentLockedGesture ; + newlocker = m_currentLockedGesture ; + if (m_loggingEnabled) + { + LOGARG("new owner %d keep lock", m_currentLockedGesture); + } + break; + + } + case ENotMyGesture: + { + break; + } + } + } + else + { + if (m_loggingEnabled) + { + LOGARG("NULL recogniser for %d", m_currentLockedGesture); + } + } + } + + if (thestate == ENotMyGesture) + { + if (m_loggingEnabled) + { + LOGARG("walk trough recognizers active streams %d", m_numOfActiveStreams); + } + // No locking gesture, walk trough the list until someone handles this + for (int i = 0; i < m_gestures.Count(); i++) + { + bool controlObtained = false; + MGestureRecogniserIf* pgrif = m_gestures[i]; + if (pgrif) + { + switch (pgrif->recognise(m_numOfActiveStreams, this)) + { + case EGestureActive: + { + // This gesture recogniser owns the gesture, stop looping... + controlObtained = true; + newowner = i; + break; + } + case ELockToThisGesture: + { + // this gesture recogniser wants to take ownership + controlObtained = true; + newowner = i; + newlocker = i; + break; + + } + case ENotMyGesture: + { + break; + } + } + } + if (controlObtained) + { + break; // do not process rest of the gestures + } + + } + } + if (newowner != -1 && newowner != m_currentGestureOwner) + { + if (m_currentGestureOwner != -1) + { + MGestureRecogniserIf* pgrif = m_gestures[m_currentGestureOwner] ; + pgrif->release(this) ; + } + m_currentGestureOwner = newowner ; + } + m_currentLockedGesture = newlocker ; // if someone locked it or released the lock +} + +void CGestureEngine::updateUiEvents() +{ + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + if (m_uiEventStream[i]) + { + if (m_uiEventStream[i]->Code() == stmUiEventEngine::ERelease) + { + // Event can be removed since Release is the last event + // note that it is the lower layer event engine + // which actually deletes the object + m_uiEventStream[i] = NULL ; + } + } + } +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/gestureframework.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/gestureframework.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "statemachine.h" +#include "gestureframework.h" +#include "gestureframeworkimpl.h" +#include "GestureEngine.h" +#include "rt_gestureengineif.h" +#include "rt_gesturelistener.h" +#include "tapgesturerecogniser.h" +#include "pangesturerecogniser.h" + +using namespace stmGesture ; + +CGestureFramework::CGestureFramework() +{ + // No implementation required +} + +CGestureFramework::~CGestureFramework() +{ + delete m_impl ; +} + +CGestureFramework* CGestureFramework::NewLC() +{ + CGestureFramework* self = new (ELeave) CGestureFramework(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +CGestureFramework* CGestureFramework::NewL() +{ + CGestureFramework* self = CGestureFramework::NewLC(); + CleanupStack::Pop(self); + return self; +} + +void CGestureFramework::ConstructL() +{ + m_impl = CGestureFrameworkImpl::NewL() ; +} + +TVersion CGestureFramework::Version() +{ + // Version number of example API + const TInt KMajor = 1; + const TInt KMinor = 0; + const TInt KBuild = 1; + return TVersion(KMajor, KMinor, KBuild); +} + +/*! + * Create new gesture engine if not already existing and return the interface + */ +MGestureEngineIf* CGestureFramework::getGestureEngine() +{ + return m_impl->getGestureEngine() ; +} + +stmUiEventEngine::CStateMachine* CGestureFramework::getUiStateMachine() +{ + return m_impl->getUiStateMachine() ; +} + +void CGestureFramework::enableLogging(bool loggingEnabled) +{ + m_loggingenabled = loggingEnabled; + if (m_impl) m_impl->enableLogging(loggingEnabled) ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/gestureframeworkimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/gestureframeworkimpl.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + + +#include "gestureframeworkimpl.h" +#include "GestureEngine.h" +#include "statemachine.h" + +using namespace stmGesture ; + +CGestureFrameworkImpl::CGestureFrameworkImpl() +{ + // No implementation required +} + +CGestureFrameworkImpl::~CGestureFrameworkImpl() +{ + m_statemachine->removeUiEventObserver(m_gestureEngine) ; + delete m_gestureEngine ; + delete m_statemachine ; +} + +CGestureFrameworkImpl* CGestureFrameworkImpl::NewLC() +{ + CGestureFrameworkImpl* self = new (ELeave) CGestureFrameworkImpl(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +CGestureFrameworkImpl* CGestureFrameworkImpl::NewL() +{ + CGestureFrameworkImpl* self = CGestureFrameworkImpl::NewLC(); + CleanupStack::Pop(self); + return self; +} + +void CGestureFrameworkImpl::ConstructL() +{ + /*! + * create the gesture engine and the low level UI event engine + */ + m_gestureEngine = new (ELeave)CGestureEngine() ; + m_statemachine = stmUiEventEngine::CStateMachine::NewL() ; + // TODO: all kinds of default settings for the lower layer, but in the test app + // they are set from the settings menu so no need now... + // Add the gesture engine to be the observer of UI events... + m_statemachine->addUiEventObserver(m_gestureEngine) ; +} +MGestureEngineIf* CGestureFrameworkImpl::getGestureEngine() +{ + return m_gestureEngine ; +} + +void CGestureFrameworkImpl::enableLogging(bool loggingEnabled) +{ + m_loggingenabled = loggingEnabled; + if (m_gestureEngine) + { + m_gestureEngine->enableLogging(loggingEnabled) ; + } +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/gesturehelpereventsender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/gesturehelpereventsender.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "gesturehelpereventsender.h" + +const TInt KEventsQueueGranularity = 4; + +CGestureEventSender* CGestureEventSender::NewL( MStmGestureListener& aObserver ) + { + CGestureEventSender* self = new (ELeave) CGestureEventSender(aObserver); + + return self; + } + +CGestureEventSender::CGestureEventSender( MStmGestureListener& aObserver ) : + CActive(EPriorityUserInput - 1), + iObserver(aObserver), iEvents(KEventsQueueGranularity) + { + CActiveScheduler::Add(this); + } + +CGestureEventSender::~CGestureEventSender() + { + if (IsActive()) + { + Cancel(); + } + + iEvents.Close(); + } + +TInt CGestureEventSender::AddEvent(TStmGestureUid aUid, const MStmGesture* aGestureEvent) + { + TStmGestureEvent event; + if (aGestureEvent) { + event.SetCode(aGestureEvent->gestureUid()); + event.SetCurrentPos(aGestureEvent->getLocation()); + event.SetSpeed(TRealPoint(aGestureEvent->getSpeedX()*1000,aGestureEvent->getSpeedY()*1000));//App needs the speed in pixels/sec + event.SetType(TStmTapType(aGestureEvent->getType())); + event.SetDetails(aGestureEvent->getDetails()); + event.SetGestureDirection(aGestureEvent->getDirection()); + event.SetPinchEndPos(aGestureEvent->getPinchEndPos()); + event.SetGestureState(EGestureEnter); + } + else { + if (aUid != stmGesture::EGestureUidPinch) { + return iEvents.Count(); + } + event.SetCode(aUid); + event.SetGestureState(EGestureExit); + } + + iEvents.Append(event); + if (iState != EBusy) + { + iState = EEventsReady; + } + + if (!IsActive()) + { + Complete(); + } + return iEvents.Count(); + } + +void CGestureEventSender::Complete() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +void CGestureEventSender::RunL() + { + switch (iState) + { + case EEventsReady: + { + if (iEvents.Count() > 0) + { + TInt count = iEvents.Count(); + for (int i = 0; i < count; i++) + { + TStmGestureEvent& gst = iEvents[i]; + EmitEventL(gst); + } + } + iEvents.Reset(); + iState = ENoEvents; + Complete(); + break; + } + } + } + +void CGestureEventSender::EmitEventL( const TStmGestureEvent& aGesture ) + { + iState = EBusy; + iObserver.HandleGestureEventL(aGesture); + iState = EEventsReady; + } + +TInt CGestureEventSender::RunError(TInt aError) + { + iEvents.Reset(); + return aError; + } + +void CGestureEventSender::DoCancel() + { + iEvents.Reset(); + iState = ENoEvents; + } diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/hoveringgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/hoveringgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "hoveringgesturerecogniser.h" +#include "GenericSimpleGesture.h" +#include "rt_uievent.h" + +#include "filelogger.h" + +using namespace stmGesture ; + +extern long Mm2Pixels(long mm) ; + + +CHoveringGestureRecogniser::CHoveringGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ + m_hovering = false ; + m_hoveringspeed = 0.9f ; +} + +CHoveringGestureRecogniser* CHoveringGestureRecogniser::NewL(MGestureListener* aListener) +{ + CHoveringGestureRecogniser* self = new (ELeave) CHoveringGestureRecogniser(aListener) ; + return self; +} + +CHoveringGestureRecogniser::~CHoveringGestureRecogniser() +{ +} + +TGestureRecognitionState CHoveringGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like hovering + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be tap and release + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + if (countOfEvents > 1) // do we have more than one event in the stream? + { + // Then look at the events to see if they are suitable for us + // should we check that all of the events are targeted to our window? + // currently we only check if the last one is for us and is EMove, then we pan... + if (puie->Target() == m_powner && + eventCode == stmUiEventEngine::EMove) // The last one is move in our window + { + float speedX = puie->speedX() ; + float speedY = puie->speedY() ; + if (m_loggingenabled) + { + LOGARG("CHoveringGestureRecogniser: %d: num %d code %d, speed %f, limit %f", + m_hovering, countOfEvents, eventCode, + double(speedX), double(m_hoveringspeed)); + } + // It might be hovering gesture in our window, handle it + if (!m_hovering) + { + // we are not yet hovering, so lets see if it is slow movement + // but it must be movement; if it is 0.0 do not hover + if ( ((speedX > 0.01f) ||(speedY > 0.01f)) && + ((speedX < m_hoveringspeed) || (speedY < m_hoveringspeed)) + ) + { + state = EGestureActive; + m_hovering = true; + } + } + if (m_hovering) + { + // after we've started hovering, the speed could be increased a little before we loose hovering + // but this adjustment is not implemented now... + if (speedX < m_hoveringspeed || speedY < m_hoveringspeed) + + { + using stmUiEventEngine::TUiEventSpeed; + + state = EGestureActive; + TUiEventSpeed speedIf(speedX, speedY); + stmGesture::TDirectionalGesture pgest( + KUid, + puie->CurrentXY(), + puie->PreviousXY(), + &speedIf, + m_loggingenabled); + + // Call the listener to inform that a Hover has occurred... + m_listener->gestureEnter(pgest); + } + } + } + else if (m_hovering) + { + if (eventCode == stmUiEventEngine::ERelease) // The last one is release in any window + { + m_hovering = false ; + // release will handle informing of the listener + } + } + } + else + { + // count of events == 1, lets see if it is EMove, then we take it and start hovering + if (puie->Target() == m_powner && + eventCode == stmUiEventEngine::EMove) // The only one is move in our window + { + if (m_loggingenabled) + { + LOGARG("CHoveringGestureRecogniser: move: num %d code %d", countOfEvents, eventCode); + } + state = EGestureActive; + stmGesture::TDirectionalGesture pgest( + KUid, + puie->CurrentXY(), + puie->PreviousXY(), + puie, + m_loggingenabled); + + // Call the listener to inform that a Hover has occurred... + m_listener->gestureEnter(pgest); + } + } + } + if (state == ENotMyGesture) + { + // if it was not our gesture, then the state can not be hovering... + m_hovering = false ; + } + return state; +} + +void CHoveringGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + m_hovering = false ; + m_listener->gestureExit(KUid) ; +} + +void CHoveringGestureRecogniser::setHoveringSpeed(float aSpeed) __SOFTFP +{ + m_hoveringspeed = aSpeed ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/leftrightgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/leftrightgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "leftrightgesturerecogniser.h" +#include "GenericSimpleGesture.h" +#include "rt_uievent.h" + +#include "filelogger.h" + +using namespace stmGesture ; + +_LIT8(KLeftrightName, "Leftlight"); + +CLeftrightGestureRecogniser::CLeftrightGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CLeftrightGestureRecogniser* CLeftrightGestureRecogniser::NewL(MGestureListener* aListener) +{ + CLeftrightGestureRecogniser* self = new (ELeave) CLeftrightGestureRecogniser(aListener) ; + return self; +} + +CLeftrightGestureRecogniser::~CLeftrightGestureRecogniser() +{ +} + +TGestureRecognitionState CLeftrightGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like a tap or double tap + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be tap and release + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + if (countOfEvents > 1) // do we have more than one event in the stream? + { + // Then look at the events to see if they are suitable for us + // should we check that all of the events are targeted to our window? + // currently we only check if the last one is for us and is EMove, then check if |x| > |y| + if (puie->Target() == m_powner && + eventCode == stmUiEventEngine::EMove) // The last one is move in our window + + { + if (m_loggingenabled) + { + LOGARG("CLeftrightGestureRecogniser: Leftright: num %d code %d", + countOfEvents, eventCode); + } + // Is it leftright gesture in our window? + const TPoint& p = puie->CurrentXY(); + TPoint dp = p - puie->PreviousXY(); + if (Abs(dp.iX) > Abs(dp.iY)) + { + state = EGestureActive; + stmGesture::TGenericSimpleGesture pgest(KUid, p, dp.iX, puie) ; + pgest.setName(KLeftrightName) ; + // Call the listener to inform that a Leftright has occurred... + m_listener->gestureEnter(pgest) ; + } + } + } + } + return state; +} + +void CLeftrightGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + m_listener->gestureExit(KUid) ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/longpressgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/longpressgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,93 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "longpressgesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +CLongPressGestureRecogniser::CLongPressGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CLongPressGestureRecogniser* CLongPressGestureRecogniser::NewL(MGestureListener* aListener) +{ + CLongPressGestureRecogniser* self = new (ELeave) CLongPressGestureRecogniser(aListener) ; + return self; +} + +CLongPressGestureRecogniser::~CLongPressGestureRecogniser() +{ +} + +/*! + * recognise the long press; basically it is just the EHold UI event + */ +TGestureRecognitionState CLongPressGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + + // Look at the events to see if it looks like long press with one pointer + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be EHold + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CLongPressGestureRecogniser: %d num %d code %d", eventCode, countOfEvents, eventCode); + } + if (puie->Target() == m_powner && eventCode == stmUiEventEngine::EHold) // The last one is EHold, look if it is near our borders + { + const TPoint& p = puie->CurrentXY() ; + if (m_loggingenabled) + { + LOGARG("CLongPressGestureRecogniser: (%d, %d) in (%d,%d)(%d,%d)", p.iX, p.iY, + m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } + state = EGestureActive ; + // issue the long press gesture + stmGesture::TGenericSimpleGesture pgest(KUid, p, 0, puie) ; // TODO: speed is 0? + // Call the listener to inform that the gesture has occurred... + m_listener->gestureEnter(pgest) ; + } + } + return state; +} + +void CLongPressGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + if (m_loggingenabled) + { + LOGARG("CLongPressGestureRecogniser: 0x%x release", this); + } +} + +void CLongPressGestureRecogniser::setArea(const TRect& theArea) +{ + m_area = theArea ; +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/pangesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/pangesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "pangesturerecogniser.h" +#include "GenericSimpleGesture.h" +#include "rt_uievent.h" + +#include "filelogger.h" + +using namespace stmGesture ; + +CPanGestureRecogniser::CPanGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CPanGestureRecogniser* CPanGestureRecogniser::NewL(MGestureListener* aListener) +{ + CPanGestureRecogniser* self = new (ELeave) CPanGestureRecogniser(aListener) ; + return self; +} + +CPanGestureRecogniser::~CPanGestureRecogniser() +{ +} + +TGestureRecognitionState CPanGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like a tap or double tap + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be tap and release + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + if (countOfEvents > 1) // do we have more than one event in the stream? + { + // Then look at the events to see if they are suitable for us + // should we check that all of the events are targeted to our window? + // currently we only check if the last one is for us and is EMove, then we pan if the speed is OK + if (puie->Target() == m_powner && + eventCode == stmUiEventEngine::EMove) // The last one is move in our window + + { + if (m_loggingenabled) + { + LOGARG("CPanGestureRecogniser: Pan: num %d code %d", countOfEvents, eventCode); + } + float speedX = puie->speedX(); + float speedY = puie->speedY(); + + using stmUiEventEngine::TUiEventSpeed; + + state = EGestureActive; + TUiEventSpeed speedIf(speedX, speedY); + // Panning gesture + stmGesture::TDirectionalGesture pgest( + KUid, + puie->CurrentXY(), + puie->PreviousXY(), + &speedIf, + m_loggingenabled); + + // Call the listener to inform that a Pan has occurred... + m_listener->gestureEnter(pgest); + } + } + } + return state; +} + +void CPanGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + m_listener->gestureExit(KUid) ; +} + +void CPanGestureRecogniser::setPanningSpeedLow(float aSpeed) __SOFTFP +{ + m_panningspeedlow = aSpeed ; +} + +void CPanGestureRecogniser::setPanningSpeedHigh(float aSpeed) __SOFTFP +{ + m_panningspeedhigh = aSpeed ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/pinchgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/pinchgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,440 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ +#include +#include "pinchgesturerecogniser.h" +#include "GenericSimpleGesture.h" +#include +#include "filelogger.h" +#include "statemachine.h" // for stmUiEventEngine::Distance(dx,dy) + +using namespace stmGesture ; + +extern long Mm2Pixels(long mm) ; + + +CPinchGestureRecogniser::CPinchGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ + m_pinching = false ; + m_pinchingspeed = 3.5 ; // by default something suitable for capacitive + m_holdseen = false ; +} + +CPinchGestureRecogniser* CPinchGestureRecogniser::NewL(MGestureListener* aListener) +{ + CPinchGestureRecogniser* self = new (ELeave) CPinchGestureRecogniser(aListener) ; + return self; +} + +CPinchGestureRecogniser::~CPinchGestureRecogniser() +{ +} + +TGestureRecognitionState CPinchGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: %d %d %d ", m_pinching, m_holdseen, numOfActiveStreams) ; + } +#if !defined(ADVANCED_POINTER_EVENTS) + // Look at the events to see if it looks like pinch in single touch + // WARNING: this code is a hack : in single touch capacitive touch device (like Alvin with 52.50) it works so-and-so, + // because the pointer events were reported from the corners of the rectangle formed by two fingers pressing. + // In resistive touch device like Tube or Ivalo the reported points are somewhere int he middle between the fingers + // and jumping a lot, so it is very difficult to get it right. + if (numOfActiveStreams == 1) + { + // Then look at the event stream, first we need to see a hold and then a fast jump + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + + if (countOfEvents > 0 ) // how many events + { + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: %d %d %d %d %d, m: %d b: %d", + m_pinching, m_holdseen, numOfActiveStreams, countOfEvents, eventCode, + int(m_m), int(m_b)) ; + } + + if (m_pinching) + { + // We have entered pinching state, lets move one of the points unless it is a release + if (eventCode == stmUiEventEngine::ERelease) + { + m_pinching = false ; + m_holdseen = false ; + } + else + { + bool pointIgnored = true ; // for logging purposes + int currentLength = m_loggingenabled ? + stmUiEventEngine::Distance(m_pinchstart, m_pinchend) : 0; + + TPoint oStart(m_pinchstart) ; + TPoint oEnd(m_pinchend) ; + int difference = 0 ; + state = ELockToThisGesture ; + const TPoint& tp = puie->CurrentXY(); + // calculate the distance of the new point from the stored vector + int d1 = ((m_pinchstart.iX-tp.iX)*(m_pinchstart.iX-tp.iX)) + + ((m_pinchstart.iY-tp.iY)*(m_pinchstart.iY-tp.iY)) ; + int d2 = ((m_pinchend.iX-tp.iX)*(m_pinchend.iX-tp.iX)) + + ((m_pinchend.iY-tp.iY)*(m_pinchend.iY-tp.iY)) ; + // check also if the Y coordinate happens to be near the hold point, + // this seems to be the case at least with alvin, we keep getting two points, + // where one is near the Y coordinate of the hold point + int diffY = Abs(tp.iY-m_pinchstart.iY) ; + + if (d1 < d2 || diffY < 12) + { + // the detected point is near the first point, + // or the detected point is about on the same horizontal line with the hold point + // do not do anything, but keep the gesture + } + else + { + pointIgnored = false ; + // the detected point is close to the other end, then adjust the stored vector + int xd = m_pinchend.iX-tp.iX ; + int yd = m_pinchend.iY-tp.iY ; + if (xd < 0 ) xd = - xd ; + if (yd < 0 ) yd = - yd ; + // look which coordinate is closer to the original and use that + if (xd < yd) + { + // calculate new point based on the X value + m_pinchend.iX = tp.iX ; + m_pinchend.iY = m_m*m_pinchend.iX + m_b ; + if (m_pinchend.iY < 0) m_pinchend.iY = 0 ; + } + else + { + if (m_m != 0) + { + m_pinchend.iY = tp.iY ; + m_pinchend.iX = (m_pinchend.iY - m_b)/m_m ; + if (m_pinchend.iX <0 ) m_pinchend.iX = 0 ; + } + else + { + m_pinchend.iX = tp.iX ; + m_pinchend.iY = m_m*m_pinchend.iX + m_b ; + if (m_pinchend.iY < 0) m_pinchend.iY = 0 ; + } + } + float newd = calculateDistance() ; + // check if the difference is too big and adjust accordingly + // the method also updates the m_ddistance + difference = adjustPinchMove(m_ddistance, newd) ; + // Now we have a pinch gesture with size as details + stmGesture::TTwoPointGesture pgest(KUid, m_pinchstart, m_pinchend); + pgest.setLogging(m_loggingenabled); + pgest.setDetails(difference) ; + // inform the listener + m_listener->gestureEnter(pgest); + } + if (m_loggingenabled) + { + int newLength = stmUiEventEngine::Distance(m_pinchstart, m_pinchend); + float speedX = puie->speedX() ; + float speedY = puie->speedY() ; + + LOGARG("CPinchGestureRecogniser: %d: o: %d, n: %d, d: %d (%d,%d) " \ + "speed %f (%d,%d : %d,%d) (from: (%d,%d : %d,%d) (m: %f b: %f)", + pointIgnored, + currentLength, newLength, difference, + tp.iX, tp.iY, double(speedX), + m_pinchstart.iX, m_pinchstart.iY, m_pinchend.iX, m_pinchend.iY, + oStart.iX, oStart.iY, oEnd.iX, oEnd.iY, + double(m_m), double(m_b)) ; + + } + + } + } + else if (eventCode == stmUiEventEngine::EMove) // The last one is move and we were not pinching + { + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: %d: num %d code %d", m_pinching, countOfEvents, eventCode); + } + stmUiEventEngine::MUiEvent* puieFirst = puie->previousEvent(); + + // check if we have seen hold + if (m_holdseen) + { + const TPoint& tp1 = puie->CurrentXY() ; + float speedX = puie->speedX() ; + float speedY = puie->speedY() ; + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: tp1: %d %d hold %d %d, speed %f", + tp1.iX, tp1.iY, + m_holdseenAtPos.iX, m_holdseenAtPos.iY, double(speedX) ); + } + // is the speed extremely high so that it looks like other finger pressing in different location? + if ( (speedX > m_pinchingspeed) || (speedY > m_pinchingspeed) ) + { + TInt64 tstamp = puie->timestamp() ; + TTime now(tstamp) ; + TTimeIntervalMicroSeconds tim = now.MicroSecondsFrom(m_holdseenAtTime) ; + m_pinching = true; + m_pinchstart = m_holdseenAtPos; + m_pinchend = tp1; + calculateZoomingLine(); + m_ddistance = calculateDistance(); + state = ELockToThisGesture ; // NOTE: once pinch is started, it will stay until release + // create the first pich gesture which does not yet resize anything + stmGesture::TTwoPointGesture pgest(KUid, m_pinchstart, m_pinchend); + pgest.setLogging(m_loggingenabled); + pgest.setDetails(0) ; + // inform the listener + m_listener->gestureEnter(pgest); + } + } + } + } + if (!m_pinching) + { + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: not pinching %d", puie); + } + if (puie && puie->Code() == stmUiEventEngine::EHold) // The last one is hold and we were not pinching + { + m_holdseen = true; + m_holdseenAtPos = puie->CurrentXY(); + m_holdseenAtTime = puie->timestamp() ; + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: hold seen at(%d, %d) at %Ld", + m_holdseenAtPos.iX, m_holdseenAtPos.iY, m_holdseenAtTime.Int64()); + } + } + } + if (puie && puie->Code() == stmUiEventEngine::ETouch) // The last one is touch + { + m_holdseen = false; + } + else if (puie && puie->Code() == stmUiEventEngine::ERelease) // The last one is release + { + m_holdseen = false; + } + } +#else + // This is the multi touch case: two event streams needs to be there; this is the real pinch zoom + if (numOfActiveStreams == 2) + { + const stmUiEventEngine::MUiEvent* puie1 = pge->getUiEvents(0); + const stmUiEventEngine::MUiEvent* puie2 = pge->getUiEvents(1); + stmUiEventEngine::TUiEventCode eventCode1 = puie1->Code() ; + stmUiEventEngine::TUiEventCode eventCode2 = puie2->Code() ; + + if (m_loggingenabled) + { + TPoint p1 = puie1->CurrentXY() ; + TPoint p2 = puie2->CurrentXY() ; + LOGARG("CPinchGestureRecogniser: two streams: %s at [%d,%d], %s at [%d,%d]", + stmUiEventEngine::EventName(eventCode1), p1.iX, p1.iY, + stmUiEventEngine::EventName(eventCode1), p2.iX, p2.iY + ) ; + + } + + + if (!m_pinching) + { + // This means we start pinching, the events can be any combination of ETouch, EMove, EHold + if ( ( eventCode1 == stmUiEventEngine::ETouch || + eventCode1 == stmUiEventEngine::EMove || + eventCode1 == stmUiEventEngine::EHold + ) && + ( eventCode2 == stmUiEventEngine::ETouch || + eventCode2 == stmUiEventEngine::EMove || + eventCode2 == stmUiEventEngine::EHold ) + ) + { + // This is valid pinching start + m_pinching = true ; + // get the start and end position for the picnhing vector + m_pinchstart = puie1->CurrentXY() ; + m_pinchend = puie2->CurrentXY() ; + calculateZoomingLine(); + m_ddistance = calculateDistance(); + state = ELockToThisGesture ; // NOTE: once pich is started, it will stay until release + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: pinch start: [%d,%d][%d,%d]", + m_pinchstart.iX, m_pinchstart.iY, m_pinchend.iX, m_pinchend.iY) ; + + } + // create the first pich gesture which does not yet resize anything + stmGesture::TTwoPointGesture pgest(KUid, m_pinchstart, m_pinchend); + pgest.setLogging(m_loggingenabled); + pgest.setDetails(0) ; + // inform the listener + m_listener->gestureEnter(pgest); + } + else + { + // Not a valid pinching start, do nothing (maybe it were easier to just check if one of the events is ERelease) + } + } + else + { + // We have entered pinching state, lets move one of the points unless it is a release + if (eventCode1 == stmUiEventEngine::ERelease || eventCode2 == stmUiEventEngine::ERelease) + { + release(pge); + } + else + { + state = ELockToThisGesture ; + + // get the start and end position for the picnhing vector + m_pinchstart = puie1->CurrentXY() ; + m_pinchend = puie2->CurrentXY() ; + float newd = calculateDistance() ; + // check if the difference is too big and adjust accordingly + // the method also updates the m_ddistance + int difference = adjustPinchMove(m_ddistance, newd) ; + // Now we have a pinch gesture with size + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: pinch: [%d,%d][%d,%d], diff %d", + m_pinchstart.iX, m_pinchstart.iY, m_pinchend.iX, m_pinchend.iY, difference) ; + + } + + stmGesture::TTwoPointGesture pgest(KUid, m_pinchstart, m_pinchend); + pgest.setLogging(m_loggingenabled); + pgest.setDetails(difference) ; + // inform the listener + m_listener->gestureEnter(pgest); + } + } + + } +#endif + + if (state == ENotMyGesture) + { + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: NotMyGesture %d %d %d ", + m_pinching, m_holdseen, numOfActiveStreams) ; + } + // if it was not our gesture, then the state can not be pinching... + m_pinching = false ; + } + return state; +} + +void CPinchGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + m_pinching = false ; + m_listener->gestureExit(KUid) ; +} + +/*! + * Now that we know the two points where the zooming started, we move those points only along + * the same line y = mx + b, so lets calculate m and b. + */ +void CPinchGestureRecogniser::calculateZoomingLine() +{ + int sX = m_pinchstart.iX ; + int sY = m_pinchstart.iY ; + int eX = m_pinchend.iX ; + int eY = m_pinchend.iY ; + + if (eX == sX) + { + m_m = 0.f ; + } + else + { + m_m = float(eY-sY)/(eX-sX) ; + } + m_b = sY-(m_m*sX) ; +} + +/*! + * calculate the distance, return as float + */ +float CPinchGestureRecogniser::calculateDistance() +{ + double x = ((m_pinchstart.iX-m_pinchend.iX)*(m_pinchstart.iX-m_pinchend.iX))+ + ((m_pinchstart.iY-m_pinchend.iY)*(m_pinchstart.iY-m_pinchend.iY)) ; + double ddist ; + Math::Sqrt(ddist, x) ; + return float(ddist) ; +} + +/*! + * Set the pinching speed as pixels / ms (meaning that in case of singletouch device + * the other finger looks like the EMove UI event suddenly jumps to new location; + * in resistive the new location is somewhere in the middle of the touches, in capacitive + * the driver seems to report three or four points: + * original (x,y), new (a,b) and also (a,y), sometimes (x,b) + */ +void CPinchGestureRecogniser::setPinchingSpeed(float aSpeed) __SOFTFP +{ + m_pinchingspeed = aSpeed ; +} + +/*! + * Adjust the pinch move so that it will not be too jumpy + */ +int CPinchGestureRecogniser::adjustPinchMove(float& aPreviousDistance, float aNewDistance) +{ + float diff = aNewDistance - aPreviousDistance ; + float logdiff = diff ; + if (diff < 0) diff = -diff ; // Note that the next calculations need the positive diff value, but keep the original in logdiff + float changePercentage = (diff/aPreviousDistance)*100.f ; + if (changePercentage > 10.f) + { + // change more than 10%, make at most 10% + float newdiff = aPreviousDistance*0.1f ; + if (aPreviousDistance > aNewDistance) newdiff = -newdiff ; + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f", + double(logdiff), double(newdiff), double(aPreviousDistance), double(aNewDistance)); + } + + aPreviousDistance = aPreviousDistance + newdiff ; + diff = newdiff ; + } + else + { + if (m_loggingenabled) + { + LOGARG("CPinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f", + double(logdiff), double(diff), double(aPreviousDistance), double(aNewDistance)); + } + aPreviousDistance = aNewDistance ; // accept the new value and update the new length + diff = logdiff ; // put the original back (this is why the logdiff can not be Abs(diff)! + } + return (int)diff ; +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/releasegesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/releasegesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "releasegesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +_LIT8(KReleaseName, "Release"); + +CReleaseGestureRecogniser::CReleaseGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CReleaseGestureRecogniser* CReleaseGestureRecogniser::NewL(MGestureListener* aListener) +{ + CReleaseGestureRecogniser* self = new (ELeave) CReleaseGestureRecogniser(aListener) ; + return self; +} + +CReleaseGestureRecogniser::~CReleaseGestureRecogniser() +{ +} + +/*! + * Release gesture recogniser. Note that this one never owns the gesture, it just calls + * the callback if it detects ERelease inside the area being watched. + * There could be also check for the target window? + */ +TGestureRecognitionState CReleaseGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like edge scroll with one pointer + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be EHold + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CReleaseGestureRecogniser: %d num %d code %d", eventCode, countOfEvents, eventCode); + } + if (eventCode == stmUiEventEngine::ERelease) + { + if (m_loggingenabled) + { + LOGARG("CReleaseGestureRecogniser: 0x%x ERelease: num %d code %d, %d", + this, countOfEvents, puie->CurrentXY().iX, puie->CurrentXY().iY); + LOGARG("CReleaseGestureRecogniser: area, %d,%d %d,%d", + m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } + bool produceGesture ; + if(!m_area.IsEmpty()) + { + produceGesture = m_area.Contains(puie->CurrentXY()) ; + if(produceGesture && m_loggingenabled) + { + LOGARG("CReleaseGestureRecogniser: HIT area (%d,%d) in %d,%d %d,%d", + puie->CurrentXY().iX, puie->CurrentXY().iY, + m_area.iTl.iX, m_area.iTl.iY, + m_area.iBr.iX, m_area.iBr.iY); + } + } + else + { + produceGesture = (m_powner == puie->Target()) ; // no area defined, touch detected in the window + } + if (produceGesture) + { + state = EGestureActive ; + // issue the release gesture using the GenericSimpleGesture + stmGesture::TGenericSimpleGesture pgest(KUid, puie->CurrentXY()); + // Give the gesture a name + pgest.setName(KReleaseName) ; + // Call the listener to inform that a release has occurred... + m_listener->gestureEnter(pgest); + } + } + } + return state; +} + +void CReleaseGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + if (m_loggingenabled) + { + LOGARG("CReleaseGestureRecogniser: 0x%x release", this); + } +} + +void CReleaseGestureRecogniser::setArea(const TRect& theArea) +{ + m_area = theArea ; + if (m_loggingenabled) + { + LOGARG("CReleaseGestureRecogniser: area, %d,%d %d,%d", + m_area.iTl.iX, m_area.iTl.iY, + m_area.iBr.iX, m_area.iBr.iY); + } +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/stateengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/stateengine.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,1159 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "stateengine.h" +#include "utils.h" +#include "uievent.h" +#include "uieventsender.h" +#include "filelogger.h" +//#include "flogger.h" + +using namespace stmUiEventEngine ; + +/*! + State definitions glue together the methods of the stateengine.cpp + so that it will behave as defined in the state machine specification. + First define the separate elements for each possible event and then tie them together + to create one state entry. The state entries then are put to array + where the index is at the same time also the state ID. + + STATE_ELEMENT arrays define the methods called when handling a message. + \sa STATE_ELEMENT. + Note that the last row of STATE_ELEMENT array must NOT have a ConditionFunction entry + and it must have a NextState entry != Eignore. Otherwise the state machine will + not behave correctly. + + */ +/*! Add macro with token pasting to make creation of the state machine tables easier + and removing the necessity to write the classname twice. + Maybe there would be some better way to do this using templates and typedefs? + */ +#define CND(x) isF +#define ACT(x) aF + +/********************************************************************************* + * empty statedef as a dummy entry + * */ +const STATE_ELEMENT __ErrorEvent[1] = { + 0, + ACT(ErrorEvent), + EInit +}; + +const STATE Ignore__[1] = { + EDown, __ErrorEvent +} ; + +/*! + :INIT state and its event specific elements + See the spec in http://wikis.in.nokia.com/Runtimes/NewGestureLibrary + Down is only valid event in :INIT state + The event is consumed immediately, so that the state machine will process only these + methods when processing the message. + If touch timer has been set, the next state is InTouchTime. + If no touch timer, but if hold timer has been defined, the next state is InHoldTime_U + If no touch or hold timer have been defined, but touch area has been defined, next state is InTouchArea. + 11-May-2009: addition: add another touch area: one for touch time and one for touch area after touch time + has elapsed. This allows "sloppy" touch to be handled properly without extra move if touchtimearea is larger, + but after touch has been detected a smaller movement is allowed. + */ +const STATE_ELEMENT Init__Down[12] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(SetGestureStart), Eignore, + 0, ACT(SetCurrentPos), Eignore, + CND(IsTouchTimer), ACT(InitTouchTimer), Eignore, + CND(IsHoldTimer), ACT(InitHoldTimer), Eignore, + CND(IsTouchTimeArea), ACT(PrepareTouchTimeArea),Eignore, + CND(IsHoldArea), ACT(PrepareHoldArea) ,Eignore, + CND(IsTouchTimer), 0, EInTouchTime, + 0, ACT(ProduceTouch), Eignore, + CND(IsHoldTimer), 0, EInHoldTime_U, + CND(IsTouchArea), ACT(PrepareTouchArea),EInTouchArea, + 0, 0, EDispatch // If nothing else happens, goto to Dispatch state +}; +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the Init state + */ +const STATE_ELEMENT Init__ErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInit +}; + +/*! + * :INIT + * note that only valid event is DOWN, all the rest can be handled as errors + */ +const STATE Init__[7] = { + EDown, Init__Down, + EDrag, Init__ErrorEvent, + ECapacitiveUP, Init__ErrorEvent, + EResistiveUP, Init__ErrorEvent, + ETouchTimer, Init__ErrorEvent, + EHoldTimer, Init__ErrorEvent, + ESuppressTimer, Init__ErrorEvent +}; + +/*! + * :Dispatch state end its elements + * Here the valid events are DRAG and the UP events. + */ +const STATE_ELEMENT Dispatch__Drag[7] = { + 0, ACT(StoreMovePos), Eignore, + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(SetCurrentPos), Eignore, + 0, ACT(AddDraggingPos), Eignore, + 0, ACT(ProduceMove), Eignore, + CND(LooksLikeHold), ACT(InitHoldTimer),EInHoldTime_U, + 0, 0, EDispatch +} ; + +const STATE_ELEMENT Dispatch__CapacitiveUp[3] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(SetCurrentPos), Eignore, + 0, ACT(ProduceRelease), EInit +} ; + +const STATE_ELEMENT Dispatch__ResistiveUp[4] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(SetCurrentPos), Eignore, + CND(IsSuppressTimer),ACT(InitMoveSuppressTimer), ESuppress_D, + 0, ACT(ProduceRelease), EInit +} ; + +/*! + * All the rest of the events are errors so produce error entry to log and + * stay in the Dispatch state + * (TODO: note that in the future we may further + * define the error cases so that they may change state; ) + */ +const STATE_ELEMENT DispatchErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EDispatch +}; + +const STATE Dispatch__[7] = { + EDown, DispatchErrorEvent, + EDrag, Dispatch__Drag, + ECapacitiveUP, Dispatch__CapacitiveUp, + EResistiveUP, Dispatch__ResistiveUp, + ETouchTimer, DispatchErrorEvent, + EHoldTimer, DispatchErrorEvent, + ESuppressTimer, DispatchErrorEvent +}; + +/*! + * :InTouchTime state end its elements + * Here the valid events are DRAG and the UP events and the TouchTimer + */ +const STATE_ELEMENT InTouchTime__Drag[6] = { + 0, ACT(StoreMovePos), Eignore, + CND(InsideTouchTimeArea), ACT(ConsumeEvent), Eignore, + CND(InsideTouchTimeArea), ACT(AddToTouch), EInTouchTime, // Calculate touch XY as average of the touches + 0, ACT(ClearTouchTimer), Eignore, // These lines are done only if InsideTouchArea returns false + 0, ACT(ClearHoldTimer), Eignore, + 0, ACT(ProduceTouch), EDispatch + +} ; +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do EDispatch + */ +const STATE_ELEMENT InTouchTime__CapacitiveUp[4] = { + 0, ACT(SetCurrentPos), Eignore, + 0, ACT(ClearTouchTimer), Eignore, + 0, ACT(ClearHoldTimer), Eignore, + 0, ACT(ProduceTouch), EDispatch +} ; +/** + * Note that ConsumeEvent is not called if IsHoldTimer returns false, so the Dispatch will be done + * by the state machine. + */ +const STATE_ELEMENT InTouchTime__ResistiveUp[5] = { + 0, ACT(SetCurrentPos), Eignore, + 0, ACT(ClearTouchTimer), Eignore, + 0, ACT(ProduceTouch), Eignore, + CND(IsHoldTimer), 0, /*ACT(ConsumeEvent),*/EInHoldTime_U, // Note that otherwise immediate UP is handled improperly + 0, 0, EDispatch +} ; + +const STATE_ELEMENT InTouchTime__TouchTimer[6] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(ClearTouchTimer), Eignore, + 0, ACT(ProduceTouch), Eignore, + CND(IsTouchArea), ACT(PrepareTouchArea),Eignore, // prepare the other touch area + CND(IsHoldTimer), 0, EInHoldTime_U, + 0, 0, EInTouchArea +} ; + + +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the InTouchTime state + */ +const STATE_ELEMENT InTouchTimeErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInTouchTime +}; + +const STATE InTouchTime__[7] = { + EDown, InTouchTimeErrorEvent, + EDrag, InTouchTime__Drag, + ECapacitiveUP, InTouchTime__CapacitiveUp, + EResistiveUP, InTouchTime__ResistiveUp, + ETouchTimer, InTouchTime__TouchTimer, + EHoldTimer, InTouchTimeErrorEvent, + ESuppressTimer, InTouchTimeErrorEvent +}; + +/*! + * :InHoldTime_U state end its elements + * Here only touch timer event is invalid + */ + +const STATE_ELEMENT InHoldTime_U__Down[1] = { + 0, 0, EInHoldTime_D // Note that ConsumeEvent is not called +} ; + +const STATE_ELEMENT InHoldTime_U__Drag[3] = { + 0, ACT(StoreMovePos), Eignore, + CND(InsideHoldArea), ACT(ConsumeEvent), EInHoldTime_U, + 0, ACT(ClearHoldTimer), EDispatch // Note that in this case ConsumeEvent is not called +} ; +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do EDispatch + */ +const STATE_ELEMENT InHoldTime_U__CapacitiveUp[1] = { + 0, ACT(ClearHoldTimer), EDispatch // Note that ConsumeEvent not called +} ; +/** + * + */ +const STATE_ELEMENT InHoldTime_U__ResistiveUp[5] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(SetCurrentPos), Eignore, + CND(IsSuppressTimer),ACT(InitTouchSuppressTimer), EInHoldTime_D, // If suppression, start timer and wait for down or timer + 0, ACT(ClearHoldTimer), Eignore, // remember to do this + 0, ACT(ProduceRelease), EInit // No suppression, then this is immediate release +} ; + +const STATE_ELEMENT InHoldTime_U__HoldTimer[3] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(ProduceHold), Eignore, + 0, ACT(RestartHoldTimer), EInHoldTime_U, +} ; + +const STATE_ELEMENT InHoldTime_U__SuppressTimer[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInHoldTime_U +} ; + + +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the InHoldTime_U state + */ +const STATE_ELEMENT InHoldTime_UErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInHoldTime_U +}; + +const STATE InHoldTime_U__[7] = { + EDown, InHoldTime_U__Down, + EDrag, InHoldTime_U__Drag, + ECapacitiveUP, InHoldTime_U__CapacitiveUp, + EResistiveUP, InHoldTime_U__ResistiveUp, + ETouchTimer, InHoldTime_UErrorEvent, + EHoldTimer, InHoldTime_U__HoldTimer, + ESuppressTimer, InHoldTime_U__SuppressTimer +}; + + +/*! + * :InHoldTime_D state end its elements + * Here drag, touch timer and suppress timer events are invalid + */ + +const STATE_ELEMENT InHoldTime_D__Down[5] = { + 0, ACT(ClearSuppressTimer), Eignore, + 0, ACT(ConsumeEvent), Eignore, + CND(InsideHoldArea), 0, EInHoldTime_U, + 0, ACT(ClearHoldTimer), Eignore, + 0, ACT(ProduceMove), EDispatch +} ; + +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do InHoldTime_U + */ +const STATE_ELEMENT InHoldTime_D__CapacitiveUp[1] = { + 0, 0, EInHoldTime_U +} ; +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do InHoldTime_U + */ +const STATE_ELEMENT InHoldTime_D__ResistiveUp[1] = { + 0, 0, EInHoldTime_U // InHoldTime_U initialises timers etc. if needed +} ; +/*! + * In case of hold timer has been elapsed stop the timers, generate Release UI event. + */ +const STATE_ELEMENT InHoldTime_D__HoldTimer[4] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(ClearSuppressTimer), Eignore, + 0, ACT(ClearHoldTimer), Eignore, + 0, ACT(ProduceRelease), EInit, +} ; +/*! + * If suppress timer hits, stop the timers and generate Release UI event. + */ +const STATE_ELEMENT InHoldTime_D__SuppressTimer[4] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(ClearSuppressTimer), Eignore, + 0, ACT(ClearHoldTimer), Eignore, + 0, ACT(ProduceRelease), EInit, +} ; + +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the InHoldTime_D state + */ +const STATE_ELEMENT InHoldTime_DErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInHoldTime_D +}; + +const STATE InHoldTime_D__[7] = { + EDown, InHoldTime_D__Down, + EDrag, InHoldTime_DErrorEvent, + ECapacitiveUP, InHoldTime_D__CapacitiveUp, + EResistiveUP, InHoldTime_D__ResistiveUp, + ETouchTimer, InHoldTime_DErrorEvent, + EHoldTimer, InHoldTime_D__HoldTimer, + ESuppressTimer, InHoldTime_D__SuppressTimer +}; + + +/*! + * :InTouchArea state end its elements + * Here Drag and Up events are valid. + * If drag is inside touch are it is ignored, otherwise + * the Dispatch state will handle the event. + */ + +const STATE_ELEMENT InTouchArea__Drag[3] = { + 0, ACT(StoreMovePos), Eignore, + CND(InsideTouchArea), ACT(ConsumeEvent), EInTouchArea, + 0, 0, EDispatch // Note that in this case ConsumeEvent has not been called so Dispatch state processes the message +} ; + +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do Dispatch + */ +const STATE_ELEMENT InTouchArea__CapacitiveUp[1] = { + 0, 0, EDispatch +} ; +/** + * Note that ConsumeEvent is missing so after doing this the state engine will do Dispatch + */ +const STATE_ELEMENT InTouchArea__ResistiveUp[1] = { + 0, 0, EDispatch +} ; + +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the InTouchArea state + */ +const STATE_ELEMENT InTouchAreaErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), EInTouchArea +}; + +const STATE InTouchArea__[7] = { + EDown, InTouchAreaErrorEvent, + EDrag, InTouchArea__Drag, + ECapacitiveUP, InTouchArea__CapacitiveUp, + EResistiveUP, InTouchArea__ResistiveUp, + ETouchTimer, InTouchAreaErrorEvent, + EHoldTimer, InTouchAreaErrorEvent, + ESuppressTimer, InTouchAreaErrorEvent +}; + + +/*! + * :Suppress_D state end its elements + * Here Down and suppress timers are OK. + */ + +/*! + * Down will be handled as a Drag event in the Dispatch state. + */ +const STATE_ELEMENT Suppress_D__Down[4] = { + 0, ACT(ClearSuppressTimer), Eignore, + 0, ACT(RenameToDrag), EDispatch +} ; +/*! + * Suppress timer will generate Release UI event. + */ +const STATE_ELEMENT Suppress_D__SuppressTimer[3] = { + 0, ACT(ConsumeEvent), Eignore, + 0, ACT(ClearSuppressTimer), Eignore, + 0, ACT(ProduceRelease), EInit, +} ; + +/** + * All the rest of the events are errors so produce error entry to log and + * stay in the Suppress_D state + */ +const STATE_ELEMENT Suppress_DErrorEvent[2] = { + 0, ACT(ConsumeEvent), Eignore, // remember to consume event, otherwise state machine will loop... + 0, ACT(ErrorEvent), ESuppress_D +}; + +const STATE Suppress_D__[7] = { + EDown, Suppress_D__Down, + EDrag, Suppress_DErrorEvent, + ECapacitiveUP, Suppress_DErrorEvent, + EResistiveUP, Suppress_DErrorEvent, + ETouchTimer, Suppress_DErrorEvent, + EHoldTimer, Suppress_DErrorEvent, + ESuppressTimer, Suppress_D__SuppressTimer +}; +/*! + * The allStates array contains all the possible states of the state machine. + */ +const STATE* const allStates[8] = +{ + Ignore__, + Init__, + Dispatch__, + InTouchTime__, + InHoldTime_U__, + InHoldTime_D__, + InTouchArea__, + Suppress_D__ +}; +/*! + * stateNames are used in the logging + */ +const char* const stateNames[8] = +{ + "Ignore", + "Init", + "Dispatch", + "InTouchTime", + "InHoldTime_U", + "InHoldTime_D", + "InTouchArea", + "Suppress" +}; + +// event names are also used in logging +const char* const hweventNames[] = { + "EDown", + "EDrag", + "ECapacitiveUP", + "EResistiveUP", + "ETouchTimer", + "EHoldTimer", + "ESuppressTimer" +} ; + +/*! CStateEngine contains the methods used in the state machine implementation. + * + * The methods in CStateEngine used in the state machine definition are + * either condition methods or action methods. + * + * Constructor + * \param[in]: MTimerInterface atimerif. An attempt to make this more OS agnostic the actual + * timers are accessed using a separate interface. + */ +CStateEngine::CStateEngine(CStateEngineConfiguration* aConfig, MTimerInterface* atimerif, int aIndex) +{ + m_config = aConfig ; + m_timerif = atimerif ; + m_currentState = EInit ; + m_index = aIndex ; +} + +CStateEngine::~CStateEngine() +{ + // Just to be sure... + iTouchPoints.Reset() ; + iDragPoints.ResetAndDestroy() ; +} +/*! + * ConsumeEvent: the method defines that the turnStateMachine will stop the processing + * of the state methods after it has reached the next state. + * + */ +void CStateEngine::ConsumeEvent() +{ + m_eventConsumed = true ; +} +/*! + * Condition method + * \return true, if the touch timer limit > 0 + */ +bool CStateEngine::IsTouchTimer() +{ + bool isit = (m_config->m_touchTimerLimit > 0) ; + + return isit ; +} +/*! + * Condition method + * \return true, if the hold timer limit > 0 + */ +bool CStateEngine::IsHoldTimer() +{ + bool isit = (m_config->m_holdTimerLimit > 0) ; + + return isit ; +} +/*! + * Condition method + * \return true, if the suppress timer limit > 0 + */ +bool CStateEngine::IsSuppressTimer() +{ + bool isit = (m_config->m_suppressTimerLimit > 0) ; + + return isit ; +} +/*! + * Condition method + * \return true, if the touch area has been defined (the touch tolerancelength > 0) + */ +bool CStateEngine::IsTouchTimeArea() +{ + bool isit = (m_config->m_touchTimeTolerance.iX > 0) ; + return isit ; +} +/*! + * Condition method + * \return true, if the touch area has been defined (the touch tolerancelength > 0) + */ +bool CStateEngine::IsTouchArea() +{ + bool isit = (m_config->m_touchTolerance.iX > 0) ; + return isit ; +} +/*! + * Condition method + * \return true, if the hold area has been defined (the hold tolerancelength > 0) + */ +bool CStateEngine::IsHoldArea() +{ + bool isit = (m_config->m_holdTolerance.iX > 0) ; + return isit ; +} + +bool CStateEngine::InsideArea(const TPoint& point, + const TRect& rect, + TAreaShape shape, + const TPoint& tolerance) +{ + bool isit; + switch(shape) + { + default: // pass trough + case ERectangle: + { + isit = rect.Contains(m_hwe.iPosition) ; + break ; + } + case ECircle: + { + TPoint delta = m_hwe.iPosition - point; + long circlepoint = delta.iX * delta.iX + delta.iY * delta.iY; + isit = (circlepoint < tolerance.iX * tolerance.iX); + break ; + } + case EEllipse: + { + int asquare = tolerance.iX * tolerance.iX ; + int bsquare = tolerance.iY * tolerance.iY ; + TPoint delta = m_hwe.iPosition - point; + int result = (delta.iX * delta.iX) * bsquare + (delta.iY * delta.iY) * asquare; + + isit = (result < asquare * bsquare); + break ; + } + } + return isit ; +} + +/*! + * Condition method + * Check if the current event is positioned inside the touch area. + * Touch area can be a rectangle, a circle or an ellipse, so different + * calculation needs to be done based on the shape of the area. + */ +bool CStateEngine::InsideTouchTimeArea() +{ + return InsideArea(m_touchCentre, m_touchRect, + m_config->m_touchAreaShape, m_config->m_touchTimeTolerance); +} +/*! + * Condition method + * Check if the current event is positioned inside the touch area. + * Touch area can be a rectangle, a circle or an ellipse, so different + * calculation needs to be done based on the shape of the area. + */ +bool CStateEngine::InsideTouchArea() +{ + return InsideArea(m_touchCentre, m_touchRect, + m_config->m_touchAreaShape, m_config->m_touchTolerance); +} +/*! + * Condition method + * Check if the current event is positioned inside the hold area. + * Hold area can be a rectangle, a circle or an ellipse, so different + * calculation needs to be done based on the shape of the area. + */ +bool CStateEngine::InsideHoldArea() +{ + return InsideArea(m_holdCentre, m_holdRect, + m_config->m_holdAreaShape, m_config->m_holdTolerance); +} +/*! + * Condition method + * Check if the gesture looks like a hold, i.e. the movement has stopped. + * \sa isNewHoldingPoint + */ +bool CStateEngine::LooksLikeHold() +{ + bool isit = isNewHoldingPoint() ; + return isit ; +} +/*! + * Action method + * Error logging. + */ +void CStateEngine::ErrorEvent() +{ + // Log the error + if (m_config->m_enableLogging) + { + LOGARG("ErrorEvent: %s %s", stateNames[m_currentState], hweventNames[m_hwe.iType]) ; + } +} +/*! + * Action method + * Initialize touch timer. At the same time calculate also the touch rectangle. + */ +void CStateEngine::InitTouchTimer() +{ + m_touchRect = ToleranceRect(m_hwe.iPosition, m_config->m_touchTolerance) ; + m_touchCentre = m_hwe.iPosition ; + m_timerif->startTouchTimer(m_config->m_touchTimerLimit, m_index) ; +} +/*! + * Action method. + * Initialize hold timer. At the same time calculate also the hold rectangle. + */ +void CStateEngine::InitHoldTimer() +{ + m_holdRect = ToleranceRect(m_hwe.iPosition, m_config->m_holdTolerance) ; + m_holdCentre = m_hwe.iPosition ; + m_timerif->startHoldTimer(m_config->m_holdTimerLimit, m_index) ; +} +/*! + * Action method + * Restart the hold timer using the hold timer limit. + */ +void CStateEngine::RestartHoldTimer() +{ + m_timerif->startHoldTimer(m_config->m_holdTimerLimit, m_index) ; +} +/*! + * Action method + * Initialize suppression timer. This timer is used during touch detection when + * resistive UP has been detected. If new DOWN comes while timer is running, it is ignored. + */ +void CStateEngine::InitTouchSuppressTimer() +{ + m_timerif->startSuppressTimer(m_config->m_suppressTimerLimit, m_index) ; +} +/*! + * Action method. + * Initialize suppression timer after move. Tests show that when user is using light touch and + * moving finger to opposite directions there may be accidental ups and downs where the time between + * up and down may be well over 120 ms. + */ +void CStateEngine::InitMoveSuppressTimer() +{ + m_timerif->startSuppressTimer(m_config->m_moveSuppressTimerLimit, m_index) ; +} +/*! + * Action method + * Stop the touch timer. + */ +void CStateEngine::ClearTouchTimer() +{ + m_timerif->cancelTouchTimer(m_index) ; +} +/*! + * Action method + * Stop the hold timer. + */ +void CStateEngine::ClearHoldTimer() +{ + m_timerif->cancelHoldTimer(m_index) ; +} +/*! + * Action method + * Stop the suppress timer. + */ +void CStateEngine::ClearSuppressTimer() +{ + m_timerif->cancelSuppressTimer(m_index) ; +} +/*!Helper method. + * Create UI event + * \param code The new UI event type (Touch, Release, Move, Hold) + */ +CUiEvent* CStateEngine::createUIEventL(TUiEventCode code, const TPoint& aPos) +{ + + m_previousUiGenerated = code ; + return CUiEvent::NewL(code, m_gestureStartXY, aPos, getPreviousXY(aPos), + isTimerMessage(), m_hwe.iTarget, getInterval(), m_index, m_hwe.iTime.Int64()) ; +} +/*! + * Return the previous XY position and store the current for next round + */ +TPoint CStateEngine::getPreviousXY(const TPoint& aCurrentXY) +{ + TPoint p = m_previousXY ; + m_previousXY = aCurrentXY ; + return p ; +} +/*! + * \return true, if the current event was timer triggered + */ +bool CStateEngine::isTimerMessage() +{ + return (m_hwe.iType >= ETouchTimer); // NOTE: if new events are added at the end of the list this needs to be changed +} +/*! + * Action method. + * Generate the Touch UI event. + * If there are a set of touch points collected, calculate the position to the + * Touch UI event to be the average of the collected points. + */ +void CStateEngine::ProduceTouch() +{ + m_wasFiltered = false ; + CUiEvent* cue = NULL; + getInterval() ; // dummy call to initialize the variable.... + TInt err(KErrNone); + if (iTouchPoints.Count()>0) + { + // calculate average of the touch points + m_currentTouchXY = calculateTouchAverageFromPoints() ; + TRAP(err, cue = createUIEventL(stmUiEventEngine::ETouch, m_currentTouchXY)) ; + } + else + { + TRAP(err, cue = createUIEventL(stmUiEventEngine::ETouch, m_uiEventXY)) ; + } + if(!err) + m_config->m_uiEventSender->AddEvent(cue) ; +} +/*! + * Action method + * Generate the Move UI event. The position of the event has been set in the SetCurrentPos + * The previous position needs some special handling, if filtering has been used. + * \sa SetCurrentPos + */ +void CStateEngine::ProduceMove() +{ + m_wasFiltered = false ; + if (m_uiEventXY == m_previousXY) { + return; + } + CUiEvent* cue = NULL; + TRAPD(err, cue = createUIEventL(stmUiEventEngine::EMove, m_uiEventXY)) ; + + if(!err) + m_config->m_uiEventSender->AddEvent(cue) ; +} +/*! + * Action method + * Generate the Release UI event. + */ +void CStateEngine::ProduceRelease() +{ + m_wasFiltered = false ; + CUiEvent* cue = NULL; + TRAPD(err, cue = createUIEventL(stmUiEventEngine::ERelease, m_uiEventXY)) ; + if(!err) + m_config->m_uiEventSender->AddEvent(cue) ; + + if (m_config->m_enableLogging) + { + LOGFLUSH ; + } +} +/*! + * Action method + * Generate the Hold UI event. + */ +void CStateEngine::ProduceHold() +{ + m_wasFiltered = false ; + CUiEvent* cue = NULL; + TRAPD(err, cue = createUIEventL(stmUiEventEngine::EHold, m_holdCentre)) ; + if(!err) + m_config->m_uiEventSender->AddEvent(cue) ; + +} +/*! + * Action method + * Rename the current event to drag. This is used when the accidental up/down message pair + * has been detected, the DOWN event is handled as it were a move event. + */ +void CStateEngine::RenameToDrag() +{ + m_hwe.iType = stmUiEventEngine::EDrag ; +} +/*! + * Action method + * Initialize the touch time area. Clear the array for collected touch points and + * calculate the touch rectangle. + */ +void CStateEngine::PrepareTouchTimeArea() +{ + if (iTouchPoints.Count()>0) iTouchPoints.Reset() ; + m_touchRect = ToleranceRect(m_hwe.iPosition, m_config->m_touchTimeTolerance) ; +} + +/*! + * Action method + * Initialize the touch area. Clear the array for collected touch points and + * calculate the touch rectangle. + */ +void CStateEngine::PrepareTouchArea() +{ + if (iTouchPoints.Count()>0) iTouchPoints.Reset() ; + m_touchRect = ToleranceRect(m_hwe.iPosition, m_config->m_touchTolerance) ; +} +/*! + * Action method + * Initialize the hold area rectangle. + */ +void CStateEngine::PrepareHoldArea() +{ + m_holdRect = ToleranceRect(m_hwe.iPosition, m_config->m_holdTolerance) ; +} +/*! + * Action method + * Store the current position and time always when we see EDrag. The stored value is used + * to calculate correct speed after filtered messages. + */ +void CStateEngine::StoreMovePos() +{ + if (m_config->m_enableLogging) + { + LOGARG("store move pos from (%d, %d) to (%d, %d)", + m_lastFilteredPosition.iX, m_lastFilteredPosition.iY,m_hwe.iPosition.iX, + m_hwe.iPosition.iY ) ; + } + m_lastFilteredPosition = m_hwe.iPosition ; + m_lastFilteredMessageTime = m_hwe.iTime ; + +} +/*! + * Action method + * Store the current position and time. + */ +void CStateEngine::SetCurrentPos() +{ + m_uiEventXY = m_hwe.iPosition ; +} +/*! + * Action method + * Initialize the gesture starting. + */ +void CStateEngine::SetGestureStart() +{ + m_gestureStartXY = m_hwe.iPosition ; + m_previousXY = m_hwe.iPosition ; + m_gestureTarget = m_hwe.iTarget ; + iDragPoints.ResetAndDestroy() ; + iTouchPoints.Reset() ; +} +/*! + * Action method + * Add current point to the set of touch points. + */ +void CStateEngine::AddToTouch() +{ + iTouchPoints.Append(THwEvent(m_hwe.iType, + m_hwe.iPosition, + m_hwe.iTime, + m_hwe.iTarget, + m_index) + ) ; + // calculate the average of touch points and move the touch area accordingly + // this allows slight movement of the figertip while inside touch time + if (iTouchPoints.Count()>2) + { + TPoint newtp = calculateTouchAverageFromPoints() ; + m_touchRect = ToleranceRect(newtp, m_config->m_touchTolerance) ; + m_holdRect = ToleranceRect(newtp, m_config->m_holdTolerance) ; + } +} +/*! + * Action method + * Add the current point to the set of dragging points. + * The set of dragging points is examined to determine if a enw hold has been started. + */ +void CStateEngine::AddDraggingPos() +{ + iDragPoints.Append(new THwEvent(m_hwe.iType, + m_hwe.iPosition, + m_hwe.iTime, + m_hwe.iTarget, + m_index) + ) ; +} +/*! + * HandleStateEvent processes one event, which can be either pointer event or timer event. + * The event is handled by calling the turnStateMachine method. + */ +bool CStateEngine::handleStateEvent() +{ + // We get an event into m_hwe by this moment, lets kick the state machine + m_wasFiltered = ETrue ; + + CalculateDelta() ; + turnStateMachine() ; + + m_previousPointerEventPosition = m_hwe.iPosition ; + return m_wasFiltered ; +} + +/*! + * Get the current touch rectangle. If touch state not currently on, returns TRect(TPoint(0,0),TPoint(0,0)) + * (touch state meaning that the touch timer is still running and the points have been kept inside the area) + */ +TRect CStateEngine::getTouchArea() +{ + return m_touchRect ; +} +/*! + * get the hold area rectangle + */ +TRect CStateEngine::getHoldArea() +{ + return m_holdRect ; +} +/*! + * MStateMachine method. + */ +bool CStateEngine::wasLastMessageFiltered() +{ + return m_wasFiltered ; +} + +/*! + * Check if the last X points in the stored points look like the movement has stopped + */ +bool CStateEngine::isNewHoldingPoint() +{ + int x = iDragPoints.Count(); + if (x > 2) // are there any points to be checked? + { + THwEvent* phwe = iDragPoints[x-1] ; + THwEvent* phweinsidehold = phwe ; + TRect recth = ToleranceRect(phwe->iPosition, m_config->m_holdTolerance) ; + // Look backwards from the last point to see if there are enought points (enough in time) to look like a hold + x -= 2 ; + while (x > 0 && recth.Contains(iDragPoints[x]->iPosition)) + { + phweinsidehold = iDragPoints[x]; + --x; + } + TTimeIntervalMicroSeconds tival = phwe->iTime.MicroSecondsFrom(phweinsidehold->iTime) ; + + /** + * remove the extra points from the list if they are outside of holding area + */ + while (x > 0) + { + THwEvent* p = iDragPoints[x] ; + delete p ; + iDragPoints.Remove(x) ; + --x ; + } + + // See the time difference of the two points which still are inside the hold area + TTimeIntervalMicroSeconds limit = m_config->m_holdTimerLimit/2 ; + if (tival > limit) + { + if (m_config->m_enableLogging) + { + LOGARG("isNewHoldingPoint: %s, dragpoints count %d", + stateNames[m_currentState], iDragPoints.Count()) ; + } + return true ; + } + } + else + { + // one or 0 points does not look like hold + + } + return false ; +} +/*! + * calculate simple average of the touch points, i.e. calculate the average of the previous and current + * position. Note that the touch point remains the same, this just calculates new value for the UI position + */ +void CStateEngine::CalculateTouchAverage() +{ + m_uiEventXY.iX = (m_uiEventXY.iX+m_hwe.iPosition.iX)/2 ; + m_uiEventXY.iY = (m_uiEventXY.iY+m_hwe.iPosition.iY)/2 ; +} +/*! + * Calculate the movement vector. + */ +void CStateEngine::CalculateDelta() +{ + m_deltaVector.iX = m_hwe.iPosition.iX-m_previousPointerEventPosition.iX ; + m_deltaVector.iY = m_hwe.iPosition.iY-m_previousPointerEventPosition.iY ; +} +/*!internal + * Debug logging method + */ +void CStateEngine::DebugPrintState(TStateMachineState anextstate) +{ + if (m_config->m_enableLogging) + { + LOGARG("%s: cuiev(%d,%d) cTxy ((%d,%d)(%d,%d)) cHxy ((%d,%d)(%d,%d)) gsXY(%d,%d) dV(%d,%d) EVNT(%d,%d (%s)) going to %s", + stateNames[m_currentState], + m_uiEventXY.iX, m_uiEventXY.iY, + m_touchRect.iTl.iX, m_touchRect.iTl.iY,m_touchRect.iBr.iX, m_touchRect.iBr.iY, + m_holdRect.iTl.iX, m_holdRect.iTl.iY,m_holdRect.iBr.iX, m_holdRect.iBr.iY, + m_gestureStartXY.iX, m_gestureStartXY.iY, + m_deltaVector.iX, m_deltaVector.iY, + m_hwe.iPosition.iX, m_hwe.iPosition.iY, hweventNames[m_hwe.iType], + stateNames[anextstate] + ); + } +} + +/*! + * calculate the rectangle for touch or hold + */ +TRect CStateEngine::ToleranceRect(const TPoint& aCenterPoint, const TPoint& tolerance) +{ + // grow by the tolerance length, while keeping the center point + TRect toleranceRect( + aCenterPoint - tolerance, + aCenterPoint + tolerance); + return toleranceRect; +} +/*! + * turnStateMachine. Go trough the state elements found for the current event + * until the event has been consumed. + * + * \pre m_currentState defines the current state and the index to the allStates array. + * \pre m_hwe is the message being handled. The corresponding STATE_ELEMENT array must be found and processed. + * + */ +void CStateEngine::turnStateMachine() +{ + + const STATE_ELEMENT* pelement ; + m_eventConsumed = false ; // run the loop until the event has been consumed + // Now run trough the motions of the state elements, and prepare to change to next state while doing so. + // If the state elements set the m_eventConsumed then all is done + while (!m_eventConsumed) + { + int i = 0 ; + const STATE* const pcurrentstate = allStates[m_currentState] ; + // Since each state definition must contain entries for all possible events the following loop cannot fail ;-) + while (pcurrentstate[i].theEvent != m_hwe.iType ) ++i ; + pelement = pcurrentstate[i].stateElements ; + TStateMachineState nextState = Eignore ; + /* + * Handle the individual state elements. If there is a condition function, + * call the function and if it returns true, handle the action function and possible next state + * if the condition returns false, continue to next element + * if there is no condition, run the action function if it exists. + * if the next state is defined (i.e it is != Eignore), go to that state + */ + while (nextState == Eignore) + { + condition_t cndfunc = pelement->conditionFunction ; + action_t actfunc = pelement->actionFunction ; + if (cndfunc != 0) + { + /* + * There was a condition function, call it to see whether the action needs to performed and/or the next satte defined + */ + if (cndfunc(this)) + { + // Condition was true, handle it + // call the action if it exists + if (actfunc != 0) actfunc(this) ; + // and now get to the next state + nextState = pelement->nextState ; // Note that while this remains Eignore there are elements to be run + } + } + else + { + /** + * No condition function, call the possible action function and get the next state + */ + if (actfunc != 0) actfunc(this) ; + nextState = pelement->nextState ; // Note that while this remains Eignore there are elements to be run + } + ++pelement ; // next entry in the elements + } + if (m_config->m_enableLogging) DebugPrintState(nextState) ; + m_currentState = nextState ; // Change to the next state + } +} +TTimeIntervalMicroSeconds CStateEngine::getInterval() +{ + TTime now ; + now.HomeTime() ; + TTimeIntervalMicroSeconds interval = now.MicroSecondsFrom(m_lastMessageTime) ; + m_lastMessageTime = now ; + return interval ; +} + +TPoint CStateEngine::calculateTouchAverageFromPoints() +{ + TPoint tp ; + int count = iTouchPoints.Count() ; + for (int i = 0; i < count; i++) + { + tp += iTouchPoints[i].iPosition; + } + if(count) + { + tp.iX /= count ; + tp.iY /= count ; + } + return tp ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/stateengineconfiguration.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/stateengineconfiguration.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,212 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "stateengineconfiguration.h" +#include "uieventsender.h" +#include "utils.h" + +using namespace stmUiEventEngine ; + +CStateEngineConfiguration::CStateEngineConfiguration() : + m_touchAreaShape(ERectangle), + m_holdAreaShape(ERectangle) +{ +} + +void CStateEngineConfiguration::ConstructL() +{ + m_uiEventSender = CUiEventSender::NewL() ; +} + +CStateEngineConfiguration::~CStateEngineConfiguration() +{ + delete m_uiEventSender ; +} + +void CStateEngineConfiguration::setTolerance(long fingersize_mm, + TPoint& tolerance, + TAreaShape shape) +{ + long s = Mm2Pixels(fingersize_mm) / 2; + switch(shape) + { + case EEllipse: + tolerance.iX = (s * 2) / 3; + tolerance.iY = s; + break ; + case ERectangle: + case ECircle: + default: + tolerance.iX = s; + tolerance.iY = s; + break ; + } +} + +/*! + * Set the new touch limits for calculating the touch area. + * The size is given in millimetres. The shape of the touch area + * defines how the parameter is used. + * Rectangle: each side of the rectangle has length of fingersize_mm. + * Circle: the parameter defines the diameter of the cicle. + * Ellipse: the parameter defines the vertical diameter of the ellipse, + * horizontal diameter is half of it. + */ +void CStateEngineConfiguration::setTouchTimeArea(long fingersize_mm) +{ + setTolerance(fingersize_mm, m_touchTimeTolerance, m_touchAreaShape); + + // make sure that both touch areas are defined, so if the touch area is not yet set, + // use the same as for touch time area. + if (m_touchTolerance.iX == 0) + { + setTouchArea(fingersize_mm) ; + } +} +/*! + * Set the new touch limits for calculating the touch area. + * The size is given in millimetres. The shape of the touch area + * defines how the parameter is used. + * Rectangle: each side of the rectangle has length of fingersize_mm. + * Circle: the parameter defines the diameter of the cicle. + * Ellipse: the parameter defines the vertical diameter of the ellipse, + * horizontal diameter is half of it. + */ +void CStateEngineConfiguration::setTouchArea(long fingersize_mm) +{ + setTolerance(fingersize_mm, m_touchTolerance, m_touchAreaShape); +} +/*! + * \return the touch are shape + */ +TAreaShape CStateEngineConfiguration::getTouchAreaShape() +{ + return m_touchAreaShape ; +} +/*! + * \parameter the touch are shape + */ +void CStateEngineConfiguration::setTouchAreaShape(TAreaShape aShape) +{ + this->m_touchAreaShape = aShape ; +} +/*! + * \return the touch timeout in microseconds. + */ +unsigned int CStateEngineConfiguration::getTouchTimeout() +{ + return m_touchTimerLimit ; +} +/*! + * set the touch timeout in microseconds. + */ +void CStateEngineConfiguration::setTouchTimeout(unsigned int a) +{ + m_touchTimerLimit = a ; +} +/*! + * Set the hold area. Hold are shape determines how exactly the area is handled. + * \sa setTouchArea + */ +void CStateEngineConfiguration::setHoldArea(long fingersize_mm) +{ + setTolerance(fingersize_mm, m_holdTolerance, m_holdAreaShape); +} +/*! + * Get the shape of the hold area: Rectangle, Circle or Ellipse, + */ +TAreaShape CStateEngineConfiguration::getHoldAreaShape() +{ + return m_holdAreaShape ; +} +/*! + * Set the shape of the hold area: Rectangle, Circle or Ellipse, + */ +void CStateEngineConfiguration::setHoldAreaShape(TAreaShape aShape) +{ + m_holdAreaShape = aShape ; +} +/*! + * \return the hold timeout in microseconds. + */ +unsigned int CStateEngineConfiguration::getHoldTimeout() +{ + return m_holdTimerLimit ; +} +/*! + * set the hold timeout value in microseconds. + */ +void CStateEngineConfiguration::setHoldTimeout(unsigned int a) +{ + m_holdTimerLimit = a ; +} +/*! + * get the touch suppress timeout value in microseconds. + */ +unsigned int CStateEngineConfiguration::getTouchSuppressTimeout() +{ + return m_suppressTimerLimit ; +} +/*! + * set the touch suppress timeout. + * \param the timeout value in microseconds. + */ +void CStateEngineConfiguration::setTouchSuppressTimeout(unsigned int a) +{ + m_suppressTimerLimit = a ; +} +/*! + * MStateMachine method. + */ +unsigned int CStateEngineConfiguration::getMoveSuppressTimeout() +{ + return m_moveSuppressTimerLimit ; +} +/*! + * MStateMachine method. + */ +void CStateEngineConfiguration::setMoveSuppressTimeout(unsigned int a) +{ + m_moveSuppressTimerLimit = a ; +} +/*! + * MStateMachine method. + * Sets logging on or off. + */ +void CStateEngineConfiguration::enableLogging(bool a) +{ + m_enableLogging = a ; + m_uiEventSender->setLogging(a) ; +} + +/*! + * \param a new UI event observer + */ +bool CStateEngineConfiguration::addUiEventObserver(MUiEventObserver* observer) +{ + // The event sender handles the observers + return m_uiEventSender->addObserver(observer) ; +} +/*! + * MStateMachine method. + */ +bool CStateEngineConfiguration::removeUiEventObserver(MUiEventObserver* observer) +{ + // The event sender handles the observers + return m_uiEventSender->removeObserver(observer) ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/statemachine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/statemachine.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,789 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include + +#include "statemachine.h" +#include "stateengine.h" +#include "rt_uievent.h" +#include "callbacktimer.h" +#include "stateengineconfiguration.h" + +#include "filelogger.h" +#include "utils.h" + +using namespace stmUiEventEngine ; + +GLREF_D const char* stateNames[8] ; + +const char* const ttypeNames[] = { // for debugging purposes define the names of the pointer events + "EButton1Down ", + "EButton1Up ", + "EButton2Down ", + "EButton2Up ", + "EButton3Down ", + "EButton3Up ", + "EDrag ", + "EMove ", + "EButtonRepeat ", + "ESwitchOn ", + "EOutOfRange ", + "EEnterCloseProximity ", + "EExitCloseProximity ", + "EEnterHighPressure ", + "EExitHighPressure " + }; + +/// Fast integer distance +int stmUiEventEngine::Distance(int x, int y) +{ +/* + double d = dx * dx + dy * dy; + double dist ; + Math::Sqrt(dist, d) ; + return dist; +*/ + if(x<0) x=-x; + if(y<0) y=-y; + if(x < y) + { + int t = x; + x = y; + y = t; // ensures that x >= y + } + int dist = (y < ((13107 * x)>>15)) ? // * (.4) + (x + ((y * 6310)>>15)) : // * (.192582403) + (((x * 27926)>>15) // * (.852245894) + + ((y * 18414)>>15)); // * (.561967668) + return dist; +} + + +/*! + CStateMachine implements the state machine and the integration fo the + state machine to the OS. The CStateEngine handles the actual processing of the + finite state machine but CStateMachine provides the OS specific things like timers + and message conversion. + + The CStateMachine implements the MAknWsEventObserver interface so it adds + itself to be the observer to the event monitor of the application UI. + + It handles the pointer events either by using the monitoring interface or + lets the application call the HandlePointerEventL method. + + If MAknWsEventObserver interface is used then all the events passed to the + application are seen. The target of the gesture starting event is stored + so that the generated UI event contains the target as a void pointer. (should it just be CoeControl*?) + + There is possibility to adjust the Y coordinate of the touch point. + In capacitive touch (Alvin) it seems that the perceived touch point is + below the middle part of the fingertip. The user however tries to use the + finger to point so that the touch point should correspond to the tip of the finger. + It seems that this illusion can be achieved by adjusting the Y position about 3 mm up. + However, this adjustment can properly be done only when the touch point is far enough + from the window borders up or down. When close to top or bottom of window, the adjustment + makes it impossible touch points near the edge, unless adjustment depends on the distance from + window border. + So in practice it should be the window server doing the adjustment, and after adjustment + deciding the target window. At application level the adjustment can only be done properly + if window borders do not need to be crossed. + + */ +CStateMachine::CStateMachine() +{ + m_WasMessageFiltered = false ; + m_wseventmonitoringenabled = false ; // NB: enabled only if really used by application + m_loggingenabled = false ; + m_capacitiveup = false ; + m_adjustYposition = false ; +} +/*!Destructor + */ +CStateMachine::~CStateMachine() +{ + for (int i = 0; i < KMaxNumberOfPointers; i++) + { + delete m_holdTimer[i] ; + delete m_touchTimer[i] ; + delete m_suppressTimer[i] ; + delete m_impl[i] ; + } + delete m_config ; +} + +CStateMachine* CStateMachine::NewLC() +{ + CStateMachine* self = new (ELeave) CStateMachine(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +CStateMachine* CStateMachine::NewL() +{ + CStateMachine* self = CStateMachine::NewLC(); + CleanupStack::Pop(self); + return self; +} +/*! + Construct the actual state machine implemented in CStateEngine and + creates the timers. It also adds itself to the observer list of + CAknWsEventMonitor of the application. + + */ +void CStateMachine::ConstructL() +{ + m_config = new(ELeave)CStateEngineConfiguration() ; + m_config->ConstructL(); + + for (int i = 0; i < KMaxNumberOfPointers; i++) + { + m_impl[i] = new(ELeave) CStateEngine(m_config, this, i) ; + m_holdTimer[i] = CCallbackTimer::NewL(*this, handleholdTimer, 0, i, ETrue); + m_touchTimer[i] = CCallbackTimer::NewL(*this, handletouchTimer, 0, i, ETrue); + m_suppressTimer[i] = CCallbackTimer::NewL(*this, handlesuppressTimer, 0, i, ETrue); + } + + m_coeEnv = CCoeEnv::Static(); + + /* IMEX: monitor added only if enabled + add us to see the WsEvents so that we are able to interpret them; + + CAknAppUi* pui = (CAknAppUi*)m_coeEnv->AppUi() ; + pui->EventMonitor()->AddObserverL(this) ; + pui->EventMonitor()->Enable(ETrue) ; + */ + + m_3mminpixels = Mm2Pixels(1.5) ; +} +/*! + * Process one pointer event in the state machine. + * \return true, if the event did not generate a UI event immediately. + */ +bool CStateMachine::HandleStateEvent(const TPointerEvent& aPointerEvent, + void* aTarget, + const TTime& aTime) +{ + TInt index = PointerIndex(aPointerEvent); + CStateEngine* engine = m_impl[index]; + CreateHwEvent(engine->initEvent(), aPointerEvent, aTarget, aTime) ; + if (m_loggingenabled) + { + LOGARG("HandleStateEvent: ptr %d", index) ; + } + m_WasMessageFiltered = engine->handleStateEvent() ; + return m_WasMessageFiltered ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +bool CStateMachine::wasLastMessageFiltered(TInt aPointerNumber) +{ + return m_impl[aPointerNumber]->wasLastMessageFiltered() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +TRect CStateMachine::getTouchArea(TInt aPointerNumber) +{ + return m_impl[aPointerNumber]->getTouchArea() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setTouchTimeArea(long fingersize_mm) +{ + m_config->setTouchTimeArea(fingersize_mm) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setTouchArea(long fingersize_mm) +{ + m_config->setTouchArea(fingersize_mm) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +TAreaShape CStateMachine::getTouchAreaShape() +{ + return m_config->getTouchAreaShape() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setTouchAreaShape(const TAreaShape aShape) +{ + m_config->setTouchAreaShape(aShape) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +unsigned int CStateMachine::getTouchTimeout() +{ + return m_config->getTouchTimeout() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setTouchTimeout(unsigned int aDelay) +{ + m_config->setTouchTimeout(aDelay) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +TRect CStateMachine::getHoldArea(TInt aPointerNumber) +{ + return m_impl[aPointerNumber]->getHoldArea() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setHoldArea(long fingersize_mm) +{ + m_config->setHoldArea(fingersize_mm) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +TAreaShape CStateMachine::getHoldAreaShape() +{ + return m_config->getHoldAreaShape() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setHoldAreaShape(const TAreaShape aShape) +{ + m_config->setHoldAreaShape(aShape) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +unsigned int CStateMachine::getHoldTimeout() +{ + return m_config->getHoldTimeout() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setHoldTimeout(unsigned int a) +{ + m_config->setHoldTimeout(a) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +unsigned int CStateMachine::getTouchSuppressTimeout() +{ + return m_config->getTouchSuppressTimeout() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setTouchSuppressTimeout(unsigned int a) +{ + m_config->setTouchSuppressTimeout(a) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +unsigned int CStateMachine::getMoveSuppressTimeout() +{ + return m_config->getMoveSuppressTimeout() ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::setMoveSuppressTimeout(unsigned int a) +{ + m_config->setMoveSuppressTimeout(a) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +bool CStateMachine::addUiEventObserver(MUiEventObserver* observer) +{ + return m_config->addUiEventObserver(observer) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +bool CStateMachine::removeUiEventObserver(MUiEventObserver* observer) +{ + return m_config->removeUiEventObserver(observer) ; +} +/*! + * wrapper method for the actual implementation in the CStateEngine. + */ +void CStateMachine::enableLogging(bool aEnable) +{ + m_loggingenabled = aEnable ; + m_config->enableLogging(aEnable) ; +} + +TInt CStateMachine::PointerIndex(const TPointerEvent& aPointerEvent) +{ + TInt index = 0; +#if defined(ADVANCED_POINTER_EVENTS) + if (aPointerEvent.IsAdvancedPointerEvent()) + { + const TAdvancedPointerEvent* tadvp = aPointerEvent.AdvancedPointerEvent() ; + index = tadvp->PointerNumber() ; + } +#endif + return index; +} + +/*! + * Convert pointer event (TPointerEvent) into THwEvent into the variable m_hwe. + * THwEvent contains the position and simplified event type + * but also has the target window and timestamp included. + */ +void CStateMachine::CreateHwEvent(THwEvent& aEvent, + const TPointerEvent& aPointerEvent, + void* aTarget, + const TTime& aTime) +{ +/* should be set by this moment by CStateEngine with that index in CStateEngine::initEvent() + aEvent.iPointerNumber = PointerIndex(aPointerEvent); +*/ + aEvent.iTarget = aTarget ; + aEvent.iTime = aTime; + // Change to screen coordinates here while the window is still existing.... + aEvent.iPosition = screenCoordinates(aPointerEvent.iPosition, aTarget) ; + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Down: + case TPointerEvent::EButton2Down: + case TPointerEvent::EButton3Down: + { + aEvent.iType = stmUiEventEngine::EDown ; + break ; + } + case TPointerEvent::EButton1Up: + case TPointerEvent::EButton2Up: + case TPointerEvent::EButton3Up: + { + if (m_capacitiveup) + { + aEvent.iType = stmUiEventEngine::ECapacitiveUP ; // How could this be checked automagically? + } + else + { + aEvent.iType = stmUiEventEngine::EResistiveUP ; // How could this be checked automagically? + } + + break ; + } + case TPointerEvent::EDrag: + { + aEvent.iType = stmUiEventEngine::EDrag ; + break ; + } + } +} +//////////////////////////////////////////////////////////////////////////////////////////// +/*! + * Start the hold timer if it is not already active. + */ +void CStateMachine::startholdTimer(TInt aPointerNumber) +{ + if (!m_holdTimer[aPointerNumber]->IsActive()) + { + m_holdTimer[aPointerNumber]->Start(); + } +} + +/*! + * The hold timer expiration: create a timer event and call the state machine + */ +void CStateMachine::handleholdTimer(TInt aPointerNumber) +{ + // We get an event, lets kick the state machine + CStateEngine* engine = m_impl[aPointerNumber]; + CreateTimerEvent(engine->initEvent(), stmUiEventEngine::EHoldTimer) ; + engine->handleStateEvent() ; +} +/*! + * Stop the hold timer + */ +void CStateMachine::cancelholdTimer(TInt aPointerNumber) +{ + m_holdTimer[aPointerNumber]->Cancel(); +} +/*! + * Start suppress timer. The timeout has been set beforehand. + */ +void CStateMachine::startsuppressTimer(TInt aPointerNumber) +{ + m_suppressTimer[aPointerNumber]->Start(); +} +/*! + * The suppress timer expiration, create a timer event and call the state machine. + */ +void CStateMachine::handlesuppressTimer(TInt aPointerNumber) +{ + // We get an event, lets kick the state machine + CStateEngine* engine = m_impl[aPointerNumber]; + CreateTimerEvent(engine->initEvent(), stmUiEventEngine::ESuppressTimer) ; + engine->handleStateEvent() ; +} +/*! + * stop the suppress timer + */ +void CStateMachine::cancelsuppressTimer(TInt aPointerNumber) +{ + m_suppressTimer[aPointerNumber]->Cancel(); +} +/*! + * start the touch timer if it is not already active. + */ +void CStateMachine::starttouchTimer(TInt aPointerNumber) +{ + if (!m_touchTimer[aPointerNumber]->IsActive()) + { + m_touchTimer[aPointerNumber]->Start(); + } +} + +/*! + * The touch timer expiration, create timer event and call the state machine. + */ +void CStateMachine::handletouchTimer(TInt aPointerNumber) +{ + // We get an event, lets kick the state machine + CStateEngine* engine = m_impl[aPointerNumber]; + CreateTimerEvent(engine->initEvent(), stmUiEventEngine::ETouchTimer) ; + engine->handleStateEvent() ; +} +/*! + * stop the touch timer + */ +void CStateMachine::canceltouchTimer(TInt aPointerNumber) +{ + if (m_touchTimer[aPointerNumber]->IsActive()) // we were waiting for additional events + { + m_touchTimer[aPointerNumber]->Cancel(); + } +} +/*! + * CreateTimerEvent creates a timer event to the m_hwe variable. + */ +void CStateMachine::CreateTimerEvent(THwEvent& aEvent, TStateMachineEvent aEventCode) +{ + aEvent.iType = aEventCode ; + // m_hwe.iPosition = TPos(0, 0) ; should we just leave the previous pos + TTime now ; + now.HomeTime() ; + aEvent.iTime = now ; +} +/*! + * Events are processed either using the MAknWsEventObserver interface + * or letting the view/container pass the pointer events to the state machine. + * The member variable m_wseventmonitoringenabled defines which method is used. + * If handlePoingterEventL is called, the calling CCoeCOntrol must provide itself + * as the target. + */ +void CStateMachine::HandlePointerEventL(const TPointerEvent& aPointerEvent, void *target) +{ + if (m_wseventmonitoringenabled) return ; // events are handled in the event monitor + if (m_loggingenabled) + { +#if defined(ADVANCED_POINTER_EVENTS) + TInt pointerNumber = PointerIndex(aPointerEvent) ; + LOGARG("Pointer %d event %s at (%d %d)", pointerNumber, + ttypeNames[aPointerEvent.iType], aPointerEvent.iPosition.iX, aPointerEvent.iPosition.iY) ; +#else + LOGARG("Pointer event %s at (%d %d)", + ttypeNames[aPointerEvent.iType], aPointerEvent.iPosition.iX, aPointerEvent.iPosition.iY) ; +#endif + } + TTime time = m_coeEnv->LastEvent().Time(); + HandleStateEvent(aPointerEvent, target, time) ; // target needs to be there to convert from window to screen coordinates +} +/** + * One possibility to implement gesture recognition is to intercept the events + * using the event monitoring interface. The HandleWsEventL method will get all events + * passed to the application. The aDestination parameter defines the window where the event + * was targeted to. The gesture recognition should use the target information + * to determine how the gesture should be interpreted. + * In the current implementation the aDestination needs to be one of the UI event observers + * in order to process the message, but later when gesture recognition is added, this check + * needs to be removed and the gesture recognition should handle the target of the gesture. + */ +void CStateMachine::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination) +{ + // Check which processing type we have for events. + // If WsEvent monitoring, then process the message, otherwise return + if (!m_wseventmonitoringenabled) return ; + + // Log the events passing trough to see what kind of stuff there goes... + // and could the gesture recogniser grab them from here? + TInt type=aEvent.Type(); + switch (type) + { + case EEventKey: + case EEventKeyUp: + case EEventKeyDown: + { + if (m_loggingenabled) + { + TKeyEvent* tke = aEvent.Key() ; + LOGARG("Key event %d %d to %u", tke->iCode, tke->iScanCode, aDestination) ; + } + break; + } + case EEventPointer: + { + TPointerEvent* tpe = aEvent.Pointer() ; + if (m_loggingenabled) + { + TRect rcd = aDestination->Rect() ; + TPoint org = aDestination->PositionRelativeToScreen() ; + TRect rcd2 = rcd ; + rcd2.Move(org) ; + TPoint screenpos = tpe->iPosition ; + screenpos += org ; + +#if defined(ADVANCED_POINTER_EVENTS) + TInt pointerNumber = PointerIndex(*tpe) ; + LOGARG("Pointer %d event %s at (%d %d)[%d,%d] to 0x%x ((%d,%d)(%d,%d)): screen: ((%d,%d)(%d,%d))", + pointerNumber, + ttypeNames[tpe->iType], + tpe->iPosition.iX, tpe->iPosition.iY, + screenpos.iX, screenpos.iY, + aDestination, + rcd.iTl.iX, rcd.iTl.iY, rcd.iBr.iX, rcd.iBr.iY, + rcd2.iTl.iX, rcd2.iTl.iY, rcd2.iBr.iX, rcd2.iBr.iY) ; +#else + LOGARG("Pointer event %s at (%d %d)[%d,%d] to 0x%x ((%d,%d)(%d,%d)): screen: ((%d,%d)(%d,%d))", + ttypeNames[tpe->iType], tpe->iPosition.iX, tpe->iPosition.iY, + screenpos.iX, screenpos.iY, + aDestination, + rcd.iTl.iX, rcd.iTl.iY, rcd.iBr.iX, rcd.iBr.iY, + rcd2.iTl.iX, rcd2.iTl.iY, rcd2.iBr.iX, rcd2.iBr.iY) ; +#endif + } + HandleStateEvent(*tpe, aDestination, aEvent.Time()) ; + break; + } + case EEventPointerBufferReady: + if (m_loggingenabled) + { + LOGARG("Pointer buffer ready event to %u", aDestination) ; + } + break; + case EEventFocusLost: + case EEventFocusGained: + if (m_loggingenabled) + { + LOGARG("Focus message event to %u", aDestination) ; + } + break; + case EEventSwitchOn: + if (m_loggingenabled) + { + LOGARG("Switch On event to %u", aDestination) ; + } + break; + case EEventUser: + if (m_loggingenabled) + { + LOGARG("User event to %u", aDestination) ; + } + break; + case EEventPowerMgmt: + if (m_loggingenabled) + { + LOGARG("Power Mgmnt event to %u", aDestination) ; + } + break; + case EEventMessageReady: + if (m_loggingenabled) + { + LOGARG("Message Ready event to %u", aDestination) ; + } + break; + case EEventScreenDeviceChanged: + if (m_loggingenabled) + { + LOGARG("Screen device changed event to %u", aDestination) ; + } + break; + + default: + if (m_loggingenabled) + { + LOGARG("default changed event %d to %u", type, aDestination) ; + } + break; + } +} +/*! + * Start the touch timer using a specified delay + */ +void CStateMachine::startTouchTimer(TInt aDelay, TInt aPointerNumber) +{ + m_touchTimer[aPointerNumber]->SetDelay(aDelay) ; + starttouchTimer(aPointerNumber) ; +} +/*! + * Stop the touch timer. + */ +void CStateMachine::cancelTouchTimer(TInt aPointerNumber) +{ + canceltouchTimer(aPointerNumber) ; +} +/*! + * Start hold timer using specified delay + */ +void CStateMachine::startHoldTimer(TInt aDelay, TInt aPointerNumber) +{ + m_holdTimer[aPointerNumber]->SetDelay(aDelay) ; + startholdTimer(aPointerNumber) ; +} +/*! + * Stop the hold timer + */ +void CStateMachine::cancelHoldTimer(TInt aPointerNumber) +{ + cancelholdTimer(aPointerNumber) ; +} +/*! + * Start suppress timer using specified delay. + */ +void CStateMachine::startSuppressTimer(TInt aDelay, TInt aPointerNumber) +{ + m_suppressTimer[aPointerNumber]->SetDelay(aDelay) ; + startsuppressTimer(aPointerNumber) ; +} +/*! + * Stop the suppress timer. + */ +void CStateMachine::cancelSuppressTimer(TInt aPointerNumber) +{ + cancelsuppressTimer(aPointerNumber) ; +} + +/*! + * Method sets the m_wseventmonitoringenabled. If it is true, + * then the state machine will be called from the HandleWsEventL method which + * sees all the events passed to the application. + * + * Otherwise the HandlePointerEventL method call will cause the call to + * state machine so the view/container needs to pass the pointer events to the state machine + * in its own HandlePointerEventL -method. + * + */ +void CStateMachine::EnableWsEventMonitoring(bool aEnable) +{ + if( !m_wseventmonitoringenabled && aEnable ) + { + CAknAppUi* pui = (CAknAppUi*)m_coeEnv->AppUi() ; + TRAPD(err, pui->EventMonitor()->AddObserverL(this)) ; + if(!err) + pui->EventMonitor()->Enable(ETrue) ; + } + else if( m_wseventmonitoringenabled && !aEnable ) + { + CAknAppUi* pui = (CAknAppUi*)m_coeEnv->AppUi() ; + pui->EventMonitor()->RemoveObserver(this) ; + // Should not disable since it may be not the only user + //pui->EventMonitor()->Enable(EFalse) ; + } + + m_wseventmonitoringenabled = aEnable ; +} +TPoint CStateMachine::screenCoordinates(const TPoint& aPos, void* aGestureTarget) +{ + TPoint newPos = aPos ; + if (aGestureTarget) + { + CCoeControl* pcc = (CCoeControl*) aGestureTarget ; + TPoint tp(TPoint(0,0)); + if (m_adjustYposition) + { + TSize sz = pcc->Size() ; + + // If we are running in capacitive touch device, + // adjust the point up about 3 mm unless we are + // near top or bottom of the window + + // Y position in the window + int wY = newPos.iY - tp.iY; + int edge = 2*m_3mminpixels; + + if (Rng(0, wY, edge - 1)) + { + // close to the top we adjust suitably so that immediately at the top adjust is 0 + int adjust = wY / 2 ; + newPos.iY -= adjust ; + if (m_loggingenabled) + { + LOGARG("adjustment: nY %d tY %d [3mm: %d adj: %d]", + newPos.iY, tp.iY, m_3mminpixels, adjust) ; + } + + } + else if (Rng(edge, wY, sz.iHeight - edge)) + { + int from = newPos.iY ; + newPos.iY -= m_3mminpixels ; + if (m_loggingenabled) + { + LOGARG("adjustment: %d to %d [3mm: %d middle]", + from, newPos.iY, m_3mminpixels) ; + } + + } + else + { + // similarly at the bottom we adjust less the closer we get to the edge + int adjust = (sz.iHeight - wY) / 2 ; + newPos.iY -= adjust ; + if (m_loggingenabled) + { + LOGARG("adjustment: nY %d tY %d sH %d [3mm: %d adj: %d]", + newPos.iY, tp.iY, sz.iHeight, m_3mminpixels, adjust) ; + } + + } + } + else + { + // if the target does not own a window how can we adjust to the screen? + } + } + return newPos ; +} +void CStateMachine::enableCapacitiveUp(bool aEnable) +{ + m_capacitiveup = aEnable ; +} +void CStateMachine::enableYadjustment(bool aEnable) +{ + m_adjustYposition = aEnable ; +} +int CStateMachine::getNumberOfPointers() +{ + return KMaxNumberOfPointers ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/stmgestureinterface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/stmgestureinterface.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,618 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + + +// Gesture UI Engine +#include "statemachine.h" + +// Gesture Library: Framework +#include "gestureframework.h" +#include "rt_gestureengineif.h" + +// Gesture Library: Recognizers +#include "tapgesturerecogniser.h" +#include "pangesturerecogniser.h" +#include "edgescrollgesturerecogniser.h" +#include "longpressgesturerecogniser.h" +#include "pinchgesturerecogniser.h" +#include "touchgesturerecogniser.h" +#include "releasegesturerecogniser.h" +#include "flickgesturerecogniser.h" +#include "zoomgesturerecogniser.h" + +#include "stmgestureinterface.h" +#include "gesturehelpereventsender.h" + +#ifndef ICS_DCHECK +#define ICS_DCHECK(test) +#endif + +#define LOG(args...) + + +EXPORT_C CStmGestureParameters::CStmGestureParameters() + { + + } + +EXPORT_C CStmGestureParameters::CStmGestureParameters( + const CStmGestureParameters& aParams ) + { + Mem::Copy(&iParam[0], &aParams.iParam[0], sizeof(iParam)); + Mem::Copy(&iAreaSettings[0], &aParams.iAreaSettings[0], sizeof(iAreaSettings)); + Mem::Copy(&iEnabled[0], &aParams.iEnabled[0], sizeof(iEnabled)); + } + +EXPORT_C CStmGestureEngine* CStmGestureEngine::NewL() + { + CStmGestureEngine* eng = new(ELeave) CStmGestureEngine(); + CleanupStack::PushL(eng); + eng->ConstructL(); + CleanupStack::Pop(eng); + return eng; + } + +CStmGestureEngine::CStmGestureEngine() + { + + } + +void CStmGestureEngine::ConstructL() + { + iGf = stmGesture::CGestureFramework::NewL(); + } + +CStmGestureEngine::~CStmGestureEngine() + { + // Prevent reactivation of contexts as they remove themselves + iDtorPhase = ETrue; + + iContexts.ResetAndDestroy(); + iCtxtStack.Reset(); + delete iGf; + } + +EXPORT_C CStmGestureContext* CStmGestureEngine::CreateContextL( + TInt /*aId*/ ) + { + CStmGestureContext* ctxt = new(ELeave) CStmGestureContext(*this); + CleanupStack::PushL(ctxt); + ctxt->ConstructL(); + CleanupStack::Pop(ctxt); + return ctxt; + } + +EXPORT_C CStmGestureContext* CStmGestureEngine::Context( + TInt /*aId*/ ) + { + return NULL; + } + +void CStmGestureEngine::EnableContextL( + CStmGestureContext& aContext ) + { + // NB: enabling context puts it on top of the Context Stack + TInt idx = iCtxtStack.Find(&aContext); + if(idx >= 0) + { + iCtxtStack.Remove(idx); + } + + SetupRecognizersL(aContext, ETrue); + + iCtxtStack.AppendL(&aContext); + } + +void CStmGestureEngine::DisableContextL( + CStmGestureContext& aContext ) + { + TInt idx = iCtxtStack.Find(&aContext); + ICS_DCHECK(idx >= 0); + if(idx == KErrNotFound) + { + return; + } + + iCtxtStack.Remove(idx); + + stmGesture::MGestureEngineIf* ge = iGf->getGestureEngine(); + + for(TInt i = 0; i < stmGesture::EStmGestureUid_Count; ++i) + { + MStmGestureRecogniser* rec = aContext.iRecognizers[i]; + if(rec) + { + ge->removeGesture(rec); + } + } + + // re-activate previous (new top-most) context + // NB: if deleted context is not top-most (active) one, no updates done + TInt count = iCtxtStack.Count(); + if(idx == count && count > 0 && !iDtorPhase) + { + CStmGestureContext* previous = iCtxtStack[count - 1]; + SetupRecognizersL(*previous, EFalse); + } + } + +template +void CStmGestureEngine::InitRecognizerL( + T*& aGesture, + CStmGestureContext& aContext, + TBool aNewContext ) + { + stmGesture::MGestureRecogniserIf*& recognizer = aContext.iRecognizers[T::KUid]; + aGesture = static_cast(recognizer); + if(!aGesture && aNewContext) + { + recognizer = aGesture = T::NewL(&aContext); + recognizer->enableLogging((aContext.iLogging & (1<getGestureEngine()->addGesture(aGesture); + if(!added) + { + User::Leave(KErrNoMemory); + } + } + +void CStmGestureEngine::SetupRecognizersL( + CStmGestureContext& aContext, + TBool aNewContext ) + { + LOG("Setup recognizers"); + // Order of recognizers in the Gesture Engine (upper ones receive input before lower ones) + // + // PINCH + // CORNER_ZOOM + // EDGE_SCROLL + // LONGPRESS + // TOUCH + // UP_DOWN + // LEFT_RIGHT + // HOVER + // PAN + // TAP / DOUBLE_TAP + // FLICK + // RELEASE + // UNKNOWN + + stmUiEventEngine::CStateMachine* stateMachine = iGf->getUiStateMachine(); + stmGesture::MGestureEngineIf* gestureEngine = iGf->getGestureEngine(); + + MStmGestureParameters& conf = aContext.Config(); + + TBool filter = conf.Param(stmGesture::EEnableFiltering) != 0; + + // TOUCH AREA + TStmGestureArea& touchArea = *conf.Area(stmGesture::ETouchArea); + TInt touchAreaSizeInMm = touchArea.iSize.iWidth; + stateMachine->setTouchAreaShape ( stmUiEventEngine::TAreaShape(touchArea.iShape) ); + stateMachine->setTouchArea ( !filter ? 0 : touchAreaSizeInMm ); + stateMachine->setTouchTimeout ( !filter ? 0 : touchArea.iTimeout * 1000); + CCoeControl* gestureContext = aContext.getOwner(); + TRect ctxtRect = gestureContext->Rect(); + + // ===================================================== PINCH + using stmGesture::CPinchGestureRecogniser; + + if (conf.Enabled(CPinchGestureRecogniser::KUid)) + { + CPinchGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + TReal32 pspeed = conf.Param(stmGesture::EPinchSpeed) / 1000.f; + gesture->setPinchingSpeed(pspeed); + } + } + + // ===================================================== LONG PRESS + using stmGesture::CLongPressGestureRecogniser; + + if (conf.Enabled(CLongPressGestureRecogniser::KUid)) + { + CLongPressGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setArea(ctxtRect); + } + } + + // ===================================================== TOUCH + using stmGesture::CTouchGestureRecogniser; + + if (conf.Enabled(CTouchGestureRecogniser::KUid)) + { + CTouchGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + // define empty area so that touch is reported only inside + // our window (touch recogniser handles either an area or the target window) + gesture->setArea(TRect()); + } + } + + + // ===================================================== PAN + using stmGesture::CPanGestureRecogniser; + + if (conf.Enabled(CPanGestureRecogniser::KUid)) + { + CPanGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setPanningSpeedLow ( conf.Param(stmGesture::EPanSpeedLow) / 1000.f ); + gesture->setPanningSpeedHigh( conf.Param(stmGesture::EPanSpeedHigh) / 1000.f ); + } + } + + // ===================================================== TAP / DOUBLE TAP + /// Add recognizer before any existing Flick, Release, Unknown + // Add the gesture to the gesture engine + // TODO: Tap recognizer is special - it can combine multiple listeners, + // so no need to create new one if it already exists, just add new listeners to it + + using stmGesture::CTapGestureRecogniser; + + if (conf.Enabled(CTapGestureRecogniser::KUid)) + { + CTapGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setDoubleTapTimeout(conf.Param(stmGesture::EDoubleTapTimeout) * 1000); + gesture->setDoubleTapRange( touchAreaSizeInMm ); + gesture->ignoreFirstTap(EFalse); + + aContext.iLogging |= 1<setFlickingSpeed(flickSpeed); + } + } + + // ===================================================== RELEASE + using stmGesture::CReleaseGestureRecogniser; + + if (conf.Enabled(CReleaseGestureRecogniser::KUid)) + { + CReleaseGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setArea(TRect()); + } + } + +#if 0 // use in future depending upon browser requirement + // ===================================================== CORNER ZOOM + using stmGesture::CZoomGestureRecogniser; + + if (conf.Enabled(CZoomGestureRecogniser::KUid)) + { + CZoomGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setArea(ctxtRect); + gesture->setRange(conf.Param(stmGesture::EZoomCornerSize)); + } + } + + // ===================================================== EDGE SCROLL + using stmGesture::CEdgeScrollGestureRecogniser; + + if (conf.Enabled(CEdgeScrollGestureRecogniser::KUid)) + { + CEdgeScrollGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + + if(gesture) + { + gesture->setArea(ctxtRect); + gesture->setScrollRange(conf.Param(stmGesture::EEdgeScrollRange)); // range is 20 pixels from the edge TODO: add this to settings... + } + } + + // ===================================================== LEFT-RIGHT + using stmGesture::CLeftrightGestureRecogniser; + + if (conf.Enabled(CLeftrightGestureRecogniser::KUid)) + { + CLeftrightGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + } + + // ===================================================== UP-DOWN + using stmGesture::CUpdownGestureRecogniser; + + if (conf.Enabled(CUpdownGestureRecogniser::KUid)) + { + CUpdownGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + } + + // ===================================================== HOVER + using stmGesture::CHoveringGestureRecogniser; + + if (conf.Enabled(CHoveringGestureRecogniser::KUid)) + { + CHoveringGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + if(gesture) + { + gesture->setHoveringSpeed(conf.Param(stmGesture::EHoverSpeed) / 1000.f); + } + } + + // ===================================================== UNKNOWN + using stmGesture::CUnknownGestureRecogniser; + + if (conf.Enabled(CUnknownGestureRecogniser::KUid)) + { + CUnknownGestureRecogniser* gesture = NULL; + InitRecognizerL(gesture, aContext, aNewContext); + } +#endif + + // =========================================================== + if(aNewContext) + { + for(TInt i = 0; i < stmGesture::EStmGestureUid_Count; ++i) + { + MStmGestureRecogniser* rec = aContext.iRecognizers[i]; + if(rec) + { + rec->enableLogging(aContext.iLogging & (1<setHoldAreaShape ( stmUiEventEngine::TAreaShape(holdArea.iShape) ); + stateMachine->setHoldArea ( !filter ? 0 : holdAreaSizeInMm ); + stateMachine->setHoldTimeout ( !filter ? 0 : holdArea.iTimeout * 1000); + + // TOUCH-TIME AREA + TStmGestureArea& tTimeArea = *conf.Area(stmGesture::ETouchTimeArea); + TInt tTimeAreaSizeInMm = tTimeArea.iSize.iWidth; + // NB: shape <-- TouchAreaShape + stateMachine->setTouchTimeArea ( !filter ? 0 : tTimeAreaSizeInMm ); + + // Timeouts, Adjustments, etc. + stateMachine->setTouchSuppressTimeout(!filter ? 0 : + conf.Param(stmGesture::ESuppressTimeout)*1000) ; + stateMachine->setMoveSuppressTimeout(!filter ? 0 : + conf.Param(stmGesture::EMoveSuppressTimeout)*1000) ; + stateMachine->enableCapacitiveUp (!filter ? 0 : + conf.Param(stmGesture::ECapacitiveUpUsed)); + stateMachine->enableYadjustment (!filter ? 0 : conf.Param(stmGesture::EAdjustYPos)); + stateMachine->enableLogging(false); + + stateMachine->EnableWsEventMonitoring(false); + LOG("Setup recognizers -- DONE"); + } + +EXPORT_C void CStmGestureEngine::HandlePointerEventL( + const TPointerEvent& aPointerEvent, + void* target) + { + iGf->getUiStateMachine()->HandlePointerEventL(aPointerEvent,target); + } + +// ============================================================= + +CStmGestureContext::CStmGestureContext( + CStmGestureEngine& aEngine ) : + iEngine(aEngine), + iEventSender(NULL) + { + + } + +void CStmGestureContext::ConstructL() + { + iEngine.iContexts.AppendL(this); + iConfig = new(ELeave) CStmGestureParameters(); + } + +CStmGestureContext::~CStmGestureContext() + { + // Remove all gesture listeners + for(TInt i = iListeners.Count() - 1; i >= 0; --i) + { + MStmGestureListener* listener = iListeners[i]; + iListeners.Remove(i); + } + + iListeners.Reset(); + + // Remove all context's recognizers from the Gesture Engine + Deactivate(); + + if (iEventSender) + delete iEventSender; + + // Destroy all recognizers + for(TInt r = 0; r < stmGesture::EStmGestureUid_Count; ++r) + { + MStmGestureRecogniser*& rec = iRecognizers[r]; + if(rec) + { + delete rec; + rec = NULL; + } + } + + // Remove context from the Gesture Engine + TInt idx = iEngine.iContexts.Find(this); + if(idx != -1) + { + iEngine.iContexts.Remove(idx); + } + delete iConfig; + } + +EXPORT_C void CStmGestureContext::AddListenerL( + MStmGestureListener* aListener, + TInt aPos ) + { + iEventSender = CGestureEventSender::NewL(*aListener); + iListeners.InsertL(aListener, aPos); + } + +EXPORT_C TInt CStmGestureContext::RemoveListener( + MStmGestureListener* aListener ) + { + TInt ind = iListeners.Find(aListener); + if(ind >= 0) + { + iListeners.Remove(ind); + } + return ind; + } + +EXPORT_C void CStmGestureContext::SetContext( + CCoeControl* aControl ) + { + iOwnerControl = aControl; + + for(TInt i = 0; i < stmGesture::EStmGestureUid_Count; ++i) + { + MStmGestureRecogniser* rec = iRecognizers[i]; + if(rec) + { + rec->setOwner(aControl); + } + } + } + +EXPORT_C void CStmGestureContext::ActivateL() + { + if(IsActive()) + { + // re-enable all recognizers + EnableRecognizersL(); + return; + } + /// 1. Tell Engine to deactivate active context + + /// 2. Setup all gesture recognizers + iEngine.EnableContextL(*this); + + /// 3. Notify listeners + + // + EnableRecognizersL(); + + /// + iActivated = ETrue; + } + +EXPORT_C void CStmGestureContext::Deactivate() + { + // NB: reactivation of previous context may leave + TRAP_IGNORE(iEngine.DisableContextL(*this)); + iActivated = EFalse; + } + +void CStmGestureContext::gestureEnter( + MStmGesture& aGesture ) + { + TRAP_IGNORE(DispatchGestureEventL(aGesture.gestureUid(), &aGesture)); + } + +void CStmGestureContext::gestureExit( + TStmGestureUid aGestureUid ) + { + TRAP_IGNORE(DispatchGestureEventL(aGestureUid, NULL)); + } + +CCoeControl* CStmGestureContext::getOwner() + { + return iOwnerControl; + } + +void CStmGestureContext::DispatchGestureEventL( + TStmGestureUid aUid, + MStmGesture* aGesture ) + { + iEventSender->AddEvent(aUid, aGesture); + } + +void CStmGestureContext::SuspendRecognizer( + TStmGestureUid aUid ) + { + MStmGestureRecogniser* rec = iRecognizers[aUid]; + if(rec && !rec->isEnabled()) + { + rec->enable(EFalse); + // TODO: Notify listener + } + } + +void CStmGestureContext::EnableRecognizersL() + { + for(TInt i = 0; i < stmGesture::EStmGestureUid_Count; ++i) + { + EnableRecognizerL(TStmGestureUid(i)); + } + } + +void CStmGestureContext::EnableRecognizerL( + TStmGestureUid aUid ) + { + MStmGestureRecogniser* rec = iRecognizers[aUid]; + if(rec && !rec->isEnabled()) + { + rec->enable(ETrue); + // TODO: Notify listener + } + } + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/tapgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/tapgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,352 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "TapGestureRecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +/* some utility functions, are these things not provided by the OS? */ +const TInt KFingerSize_mm = 8; +const TInt KTwipsInInch = 1440; +const TReal KTwipsInMm = 56.7; + +long Twips2Pixels(long twips) +{ + CWsScreenDevice* screen = CCoeEnv::Static()->ScreenDevice(); + TZoomFactor deviceMap(screen); + deviceMap.SetZoomFactor(TZoomFactor::EZoomOneToOne); + long px = deviceMap.VerticalTwipsToPixels(twips); //assuming that vertical + return px; //the same as horizontal +} + +long Mm2Pixels(long mm) +{ + return Twips2Pixels(mm * KTwipsInMm); +} + +long Inches2Pixels(double inches) +{ + return Twips2Pixels(inches * KTwipsInInch); +} + +TRect ToleranceRect(const TPoint& aCenterPoint, int size) +{ + long toleranceLength = Mm2Pixels(KFingerSize_mm) / 2; + TRect toleranceRect(aCenterPoint, TSize()); + toleranceRect.Shrink(-size, -size); + return toleranceRect; +} + +CTapGestureRecogniser* CTapGestureRecogniser::NewL(MGestureListener* aListener) +{ + CTapGestureRecogniser* self = new (ELeave) CTapGestureRecogniser(aListener) ; + CleanupStack::PushL(self); + self->ConstructL(); // construct base class + CActiveScheduler::Add(self); + CleanupStack::Pop(self); + return self; +} + +CTapGestureRecogniser::CTapGestureRecogniser(MGestureListener* aListener) : + CTimer(EPriorityRealTime - 1) +{ + m_powner = aListener->getOwner() ; + // if a listener is given here, then it is both tap and doubletap listener + if (aListener) + { + addTapListener(aListener, m_powner) ; + addDoubleTapListener(aListener, m_powner) ; + } + m_waitingforsecondtap = false ; + m_gestureEnabled = true ; + m_ignorefirst = true ; // by default ignore the first tap +} + +CTapGestureRecogniser::~CTapGestureRecogniser() +{ + Cancel(); + m_tapListeners.Reset() ; + m_tapListenerWindows.Reset() ; + m_doubleTapListeners.Reset() ; + m_doubleTapListenerWindows.Reset() ; + +} + +TGestureRecognitionState CTapGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like a tap or double tap + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be tap and release + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: %d num %d code %d", eventCode, countOfEvents, eventCode); + } + if (countOfEvents == 2) // Do we have touch and release in the stream, check if there are two events + { + // Then look at the events to see if they are suitable for us + if (eventCode == stmUiEventEngine::ERelease) // The last one is release + { + stmUiEventEngine::MUiEvent* puieFirst = puie->previousEvent(); + + if(puieFirst) + eventCode = puieFirst->Code(); + else + return state; + + if (eventCode == stmUiEventEngine::ETouch) // is the first one ETouch + { + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: 0x%x TAP: num %d code %d", + this, countOfEvents, eventCode); + } + // It is tap gesture in our window, handle it + state = EGestureActive; + + CCoeControl* target = (CCoeControl*)puie->Target(); + + if (m_waitingforsecondtap) + { + m_waitingforsecondtap = false ; + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: 0x%x second tap: num %d code %d", + this, countOfEvents, eventCode); + } + + Cancel() ; // The timer + + const TPoint& secondPoint = puieFirst->CurrentXY() ; + if (isSecondTapClose(secondPoint, m_firstTapXY)) + { + // Taps were close enough together, so issue a doubletap + + // Call the listener of the current window to inform that a doubletap has occurred... + TInt inx = m_doubleTapListenerWindows.Find(target) ; + if (inx == KErrNotFound) + { + // the second tap hit a window with no listener, + // check if the first one has a listener + inx = m_doubleTapListenerWindows.Find(m_firstTapTarget) ; + } + // not found, check if the parent is in the listener list + if (inx == KErrNotFound) + { + CCoeControl* pc = target ; + while (pc) + { + pc = pc->Parent() ; + inx = m_doubleTapListenerWindows.Find(pc) ; + if (inx != KErrNotFound) break ; + } + } + if (inx != KErrNotFound) + { + // Tap gesture + stmGesture::TGenericSimpleGesture pgest( + stmGesture::EGestureUidDoubleTap, + secondPoint, stmGesture::ETapTypeDouble, puie) ; + MGestureListener* plistener = m_doubleTapListeners[inx] ; + plistener->gestureEnter(pgest) ; + } + } + else + { + // Second tap is too far away, generate just tap + // and if configured, also the fist tap is generated + if (!m_ignorefirst) + { + // do not ignore the first tap, so issue it now using the stored location + // Call the listener to inform that a Tap has occurred, if there was a listener in that window + TInt inx = m_tapListenerWindows.Find(m_firstTapTarget) ; + if (inx != KErrNotFound) // check if the listener exists + { + stmGesture::TGenericSimpleGesture pgest( + stmGesture::EGestureUidTap, puieFirst->CurrentXY(), + stmGesture::ETapTypeSingle, puieFirst) ; // TODO: speed is 0? + MGestureListener* plistener = m_tapListeners[inx] ; + plistener->gestureEnter(pgest) ; + } + } + // generate a tap at the current location, if there is a listener for it + TInt inx = m_tapListenerWindows.Find(target) ; + if (inx != KErrNotFound) + { + stmGesture::TGenericSimpleGesture pgest( + stmGesture::EGestureUidTap, puie->CurrentXY(), + stmGesture::ETapTypeSingle, puie) ; // TODO: speed is 0? + MGestureListener* plistener = m_tapListeners[inx] ; + plistener->gestureEnter(pgest) ; + } + } + } + else + { + m_firstTapXY = puieFirst->CurrentXY() ; + m_firstTapTarget = target ; + m_firstTapSpeedX = puie->speedX() ; + m_firstTapSpeedY = puie->speedY() ; + // This was the first tap, start the timer... + m_waitingforsecondtap = true ; + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: 0x%x first tap: num %d code %d", + this, countOfEvents, eventCode); + } + Cancel() ; // Just to be sure... + After(m_doubleTapTimeout) ; + } + + } + } + } + } + return state; +} + +void CTapGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + Cancel() ; // some other gesture took hold of the thing, do not send tap gesture + m_waitingforsecondtap = false ; + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: 0x%x release, %d %d", + this, m_firstTapXY.iX, m_firstTapXY.iY); + } +} + +void CTapGestureRecogniser::RunL() +{ + m_waitingforsecondtap = false ; + if (m_loggingenabled) + { + LOGARG("CTapGestureRecogniser: 0x%x timer, %d %d", this, m_firstTapXY.iX, m_firstTapXY.iY); + } + // Double tap timer has been elapsed without new Touch/Release, generate the tap if there is a listener + TInt inx = m_tapListenerWindows.Find(m_firstTapTarget) ; + if (inx != KErrNotFound) + { + using stmUiEventEngine::TUiEventSpeed; + + TUiEventSpeed speedIf(m_firstTapSpeedX,m_firstTapSpeedY); + + stmGesture::TGenericSimpleGesture pgest( + stmGesture::EGestureUidTap, + m_firstTapXY, + stmGesture::ETapTypeSingle, + &speedIf) ; + + MGestureListener* plistener = m_tapListeners[inx] ; + plistener->gestureEnter(pgest) ; + } +} + +void CTapGestureRecogniser::enableLogging(bool loggingOn) +{ + m_loggingenabled = loggingOn; +} + +void CTapGestureRecogniser::setOwner(CCoeControl* owner) +{ + m_powner = owner; +} + +void CTapGestureRecogniser::setDoubleTapTimeout(int newtimeout) +{ + m_doubleTapTimeout = newtimeout; +} + +void CTapGestureRecogniser::enable(bool enabled) +{ + m_gestureEnabled = enabled ; +} + +bool CTapGestureRecogniser::isEnabled() +{ + return m_gestureEnabled ; +} + +void CTapGestureRecogniser::setDoubleTapRange(int rangeInMillimetres) +{ + m_rangesizeInPixels = Mm2Pixels(rangeInMillimetres) ; +} + +void CTapGestureRecogniser::ignoreFirstTap(bool ignore) +{ + m_ignorefirst = ignore ; +} + +/*! + * Check whether the two taps are close enough to each other + */ +bool CTapGestureRecogniser::isSecondTapClose(const TPoint& secondPoint, const TPoint& firstTapXY) +{ + TRect tolerance = ToleranceRect(secondPoint, m_rangesizeInPixels) ; + bool aretheyclose = tolerance.Contains(firstTapXY); + return aretheyclose ; +} + +void CTapGestureRecogniser::addTapListener(MGestureListener* aListener, CCoeControl* listenerOwner) +{ + m_tapListeners.Append(aListener) ; + m_tapListenerWindows.Append(listenerOwner) ; +} + +void CTapGestureRecogniser::removeTapListener(MGestureListener* aListener, + CCoeControl* /*listenerOwner*/) +{ + TInt inx = m_tapListeners.Find(aListener) ; + if(inx != KErrNotFound) + { + m_tapListeners.Remove(inx) ; + m_tapListenerWindows.Remove(inx) ; + } +} + +void CTapGestureRecogniser::addDoubleTapListener(MGestureListener* aListener, + CCoeControl* listenerOwner) +{ + m_doubleTapListeners.Append(aListener) ; + m_doubleTapListenerWindows.Append(listenerOwner) ; +} + +void CTapGestureRecogniser::removeDoubleTapListener(MGestureListener* aListener, + CCoeControl* /*listenerOwner*/) +{ + TInt inx = m_doubleTapListeners.Find(aListener) ; + if(inx != KErrNotFound) + { + m_doubleTapListeners.Remove(inx) ; + m_doubleTapListenerWindows.Remove(inx) ; + } +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/touchgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/touchgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "touchgesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +CTouchGestureRecogniser::CTouchGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CTouchGestureRecogniser* CTouchGestureRecogniser::NewL(MGestureListener* aListener) +{ + CTouchGestureRecogniser* self = new (ELeave) CTouchGestureRecogniser(aListener) ; + return self; +} + +CTouchGestureRecogniser::~CTouchGestureRecogniser() +{ +} + +/*! + * Touch gesture recogniser. Note that this one never owns the gesture, it just calls + * the callback if it detects ETouch inside the area being watched. + * There could be also check for the target window? + */ +TGestureRecognitionState CTouchGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like edge scroll with one pointer + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be EHold + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + if (!puie) return state; + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CTouchGestureRecogniser: 0x%x num %d code %d", this, puie->countOfEvents(), eventCode); + + } + if (eventCode == stmUiEventEngine::ETouch) + { + const TPoint& tapPoint = puie->CurrentXY(); + if (m_loggingenabled) + { + LOGARG("CTouchGestureRecogniser: 0x%x ETouch: num %d at %d, %d", this, puie->countOfEvents(), tapPoint.iX, tapPoint.iY); + LOGARG("CTouchGestureRecogniser: area, %d,%d %d,%d", m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } + bool produceGesture ; + if(!m_area.IsEmpty()) + { + produceGesture = m_area.Contains(tapPoint); + if(produceGesture && m_loggingenabled) + { + LOGARG("CTouchGestureRecogniser: HIT area (%d,%d) in %d,%d %d,%d", tapPoint.iX, tapPoint.iY, m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } + } + else + { + produceGesture = (m_powner == puie->Target()); // no area defined, touch detected in the window + } + if (produceGesture) + { + // state = EGestureActive ; do not take ownership, all gestures anyway start with ETouch + // issue the touch gesture + stmGesture::TGenericSimpleGesture pgest(KUid, tapPoint); + // Call the listener to inform that a touch has occurred... + m_listener->gestureEnter(pgest); + } + } + } + return state; +} + +void CTouchGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + if (m_loggingenabled) + { + LOGARG("CTouchGestureRecogniser: 0x%x release", this); + } +} + +void CTouchGestureRecogniser::setArea(const TRect& theArea) +{ + m_area = theArea ; + if (m_loggingenabled) + { + LOGARG("CTouchGestureRecogniser: area, %d,%d %d,%d", m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } + +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/uieventsender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/uieventsender.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "uieventsender.h" +#include "UiEvent.h" + +#include "filelogger.h" + +using namespace stmUiEventEngine; + + +CUiEventSender* CUiEventSender::NewL() +{ + CUiEventSender* self = new (ELeave) CUiEventSender(); + + return self; +} + +/*! + * An active object for sending the UI events to the observers. + * Depending on the m_directsending the asynchronous method is not + * used but instead the observers will be called immediately. + */ +CUiEventSender::CUiEventSender() +{ + m_loggingenabled = false ; + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + iEvents[i] = NULL ; + } +} + +CUiEventSender::~CUiEventSender() +{ + // remove the possible events from the buffers if release was missed + for (int i = 0; i < stmUiEventEngine::KMaxNumberOfPointers; i++) + { + if (iEvents[i]) delete iEvents[i] ; + } + iObserver.Reset() ; +} + +/*! + * Add new UI event to the list or send it directly to the observers + * depending on the m_directsending flag. + * \param aUiEvent the new UI event to be sent to the observers. + */ +TInt CUiEventSender::AddEvent(CUiEvent* aUiEvent) +{ + int pointerIndex = aUiEvent->Index() ; + // Store the new UI event. Check what kind of event it is and compress the set of events + // stored so far if possible + compressStack(aUiEvent) ; + aUiEvent->setPrevious(iEvents[pointerIndex]) ; + iEvents[pointerIndex] = aUiEvent ; // Store the new event + TRAPD(err, EmitEventL(*aUiEvent)); + if(err) + return err; + + if (m_loggingenabled) + { + LOGARG("Sent event: %s: (ptr %d) (%d,%d)", + stmUiEventEngine::EventName(aUiEvent->Code()), pointerIndex, + aUiEvent->CurrentXY().iX, aUiEvent->CurrentXY().iY); + } + // If this was release event, then the chain can be removed + if (aUiEvent->Code() == stmUiEventEngine::ERelease) + { + delete aUiEvent; // This will delete the whole chain + iEvents[pointerIndex] = NULL ; + } + return KErrNone; +} +/*! + * Call each observer with the event + */ +void CUiEventSender::EmitEventL(const CUiEvent& aEvent) +{ + for (TInt i = 0; i < iObserver.Count(); i++) + { + iObserver[i]->HandleUiEventL(aEvent); + } +} + +/*! + * Add a new observer. Note that current implementation is very rude: + * max 5 observers in a simple array. + */ +bool CUiEventSender::addObserver(MUiEventObserver* aObserver ) +{ + iObserver.Append(aObserver) ; + return true ; +} + +/* + * remove observer from list + */ +bool CUiEventSender::removeObserver(MUiEventObserver* aObserver ) +{ + int x = iObserver.Find(aObserver) ; + if (x != -1) + { + iObserver.Remove(x) ; + return true ; + + } + return EFalse ; // Could not find observer +} +void CUiEventSender::compressStack(CUiEvent* aUiEvent) +{ + int pointerIndex = aUiEvent->Index() ; + CUiEvent*& top = iEvents[pointerIndex] ; + if(!top) + { + return; + } + if (aUiEvent->Code() == stmUiEventEngine::EHold) + { + // assumption: in case of hold, we can discard all previous messages + delete top ; + top = NULL ; + } + else + { + // Check if there would too many moves + CUiEvent* next = dynamic_cast(top->previousEvent()) ; + if (next != 0 && next->Code() == stmUiEventEngine::EMove) + { + // leave only the topmost to the stack + top->setPrevious(0) ; + delete next ; + } + } + +} diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/unknowngesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/unknowngesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "GenericSimpleGesture.h" +#include "unknowngesturerecogniser.h" +#include "rt_uievent.h" +#include "filelogger.h" + +using namespace stmGesture ; + +CUnknownGestureRecogniser::CUnknownGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CUnknownGestureRecogniser* CUnknownGestureRecogniser::NewL(MGestureListener* aListener) +{ + CUnknownGestureRecogniser* self = new (ELeave) CUnknownGestureRecogniser(aListener) ; + return self; +} + +CUnknownGestureRecogniser::~CUnknownGestureRecogniser() +{ +} + +/*! + * recognise the long press; basically it is just the EHold UI event + */ +TGestureRecognitionState CUnknownGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + + // Look at the events to see if it looks like long press with one pointer + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be EHold + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CUnknownGestureRecogniser: %d num %d code %d", eventCode, countOfEvents, eventCode); + } + if (puie->Target() == m_powner && eventCode == stmUiEventEngine::ERelease) // The last one is ERelease + { + const TPoint& currentXY = puie->CurrentXY() ; + if (m_loggingenabled) + { + LOGARG("CUnknownGestureRecogniser: (%d, %d) ", currentXY.iX, currentXY.iY) ; + } + state = EGestureActive ; + // issue the gesture + stmGesture::TGenericSimpleGesture pgest(KUid, currentXY, 0, puie) ; + // Call the listener to inform that a gesture has occurred... + m_listener->gestureEnter(pgest) ; + } + } + return state; +} + +void CUnknownGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + if (m_loggingenabled) + { + LOGARG("CUnknownGestureRecogniser: 0x%x release", this); + } +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/updowngesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/updowngesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include "updowngesturerecogniser.h" +#include "GenericSimpleGesture.h" +#include "rt_uievent.h" + +#include "filelogger.h" + +using namespace stmGesture ; + +_LIT8(KUpdownName, "Updown") ; + +CUpdownGestureRecogniser::CUpdownGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener) +{ +} + +CUpdownGestureRecogniser* CUpdownGestureRecogniser::NewL(MGestureListener* aListener) +{ + CUpdownGestureRecogniser* self = new (ELeave) CUpdownGestureRecogniser(aListener) ; + return self; +} + +CUpdownGestureRecogniser::~CUpdownGestureRecogniser() +{ +} + +TGestureRecognitionState CUpdownGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like a tap or double tap + if (numOfActiveStreams == 1) + { + // Then look at the event stream, it has to be tap and release + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents() ; + stmUiEventEngine::TUiEventCode eventCode = puie->Code() ; + if (countOfEvents > 1) // do we have more than one event in the stream? + { + // Then look at the events to see if they are suitable for us + // should we check that all of the events are targeted to our window? + // currently we only check if the last one is for us and is EMove, then check if |x| > |y| + if (puie->Target() == m_powner && + eventCode == stmUiEventEngine::EMove) // The last one is move in our window + + { + if (m_loggingenabled) + { + LOGARG("CUpdownGestureRecogniser: UpDown: num %d code %d", + countOfEvents, eventCode); + } + // Is it leftright gesture in our window? + const TPoint& p = puie->CurrentXY() ; + TPoint dp = p - puie->PreviousXY() ; + // check that the Y movement is bigger + if (Abs(dp.iX) < Abs(dp.iY)) + { + state = EGestureActive; + stmGesture::TGenericSimpleGesture pgest(KUid, p, dp.iY, puie) ; + // Give the gesture a name + pgest.setName(KUpdownName) ; + // Call the listener to inform that a UpDown has occurred... + m_listener->gestureEnter(pgest) ; + } + } + } + } + return state; +} + +void CUpdownGestureRecogniser::release(MGestureEngineIf* /*ge*/) +{ + m_listener->gestureExit(KUid) ; +} + diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/utils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/utils.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "utils.h" + +#include // for CCoeEnv +#include // for CEikAppUi + +#include "gesturedefs.h" + +namespace stmUiEventEngine +{ + /** @return the longer edge of the size */ + inline TInt LongerEdge( const TSize& aSize ) + { + return Max( aSize.iHeight, aSize.iWidth ); + } + + // for documentation, see header file + TRect ToleranceRect( const TPoint& aCenterPoint ) + { + long toleranceLength = Mm2Pixels(KFingerSize_mm) / 2; + TRect toleranceRect( aCenterPoint, TSize() ); + // grow by the tolerance length, while keeping the center point + toleranceRect.Grow( toleranceLength, toleranceLength ); + return toleranceRect; + } + + long Twips2Pixels(long twips) + { + CWsScreenDevice* screen = CCoeEnv::Static()->ScreenDevice(); + TZoomFactor deviceMap(screen); + deviceMap.SetZoomFactor(TZoomFactor::EZoomOneToOne); + long px = deviceMap.VerticalTwipsToPixels(twips); //assuming that vertical + return px; //the same as horizontal + + } + + long Mm2Pixels(long mm) + { + return Twips2Pixels(mm * KTwipsInMm); + } + + long Inches2Pixels(float inches) + { + return Twips2Pixels(inches * KTwipsInInch); + } + + +} // namespace diff -r 6297cdf66332 -r d39add9822e2 webengine/webkitutils/stmgesturefw/src/zoomgesturerecogniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/webkitutils/stmgesturefw/src/zoomgesturerecogniser.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Gesture helper implementation +* +*/ + +#include +#include +#include "filelogger.h" +#include "zoomgesturerecogniser.h" +#include "GenericSimpleGesture.h" + +using namespace stmGesture ; + +_LIT8(KZoomInName, "ZoomIn") ; +_LIT8(KZoomOutName, "ZoomOut") ; + +CZoomGestureRecogniser* CZoomGestureRecogniser::NewL(MGestureListener* aListener) +{ + CZoomGestureRecogniser* self = new (ELeave) CZoomGestureRecogniser(aListener) ; + return self; +} + +CZoomGestureRecogniser::CZoomGestureRecogniser(MGestureListener* aListener) : + CGestureRecogniser(aListener), m_area(TRect::EUninitialized) +{ + m_rangesizeInPixels = 20 ; // by default 20 pixels from the edges is the area + m_zooming = false ; +} + +CZoomGestureRecogniser::~CZoomGestureRecogniser() +{ +} + +TGestureRecognitionState CZoomGestureRecogniser::recognise(int numOfActiveStreams, + MGestureEngineIf* pge) +{ + TGestureRecognitionState state = ENotMyGesture; + // Check if we are enabled or not + if (!m_gestureEnabled) return state ; + + // Look at the events to see if it looks like zoom with one pointer + if (numOfActiveStreams == 1) + { + const stmUiEventEngine::MUiEvent* puie = pge->getUiEvents(0); + int countOfEvents = puie->countOfEvents(); + stmUiEventEngine::TUiEventCode eventCode = puie->Code(); + + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: %d num %d code %d", + eventCode, countOfEvents, eventCode); + + } + if (!m_zooming) + { + // We are not yet zoomin, check if we should start, i.e. whether we are + // inside the zoom trigger areas near the corners when touch is done... + if (eventCode == stmUiEventEngine::ETouch) // It must be ETouch inside the corner + { + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: 0x%x ETouch: num %d code %d, %d", + this, countOfEvents, puie->CurrentXY().iX, puie->CurrentXY().iY); + LOGARG("CZoomGestureRecogniser: area, %d,%d %d,%d, range: %d", m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY, m_rangesizeInPixels); + } + + // the lower left rectangle is m_rangesizeIPixels from the corner + TRect lowerleft(m_area.iTl.iX, m_area.iBr.iY-m_rangesizeInPixels, + m_area.iTl.iX+m_rangesizeInPixels, m_area.iBr.iY) ; + TRect upperright(m_area.iBr.iX-m_rangesizeInPixels, m_area.iTl.iY, + m_area.iBr.iX, m_area.iTl.iY+m_rangesizeInPixels) ; + + m_previoustouch = m_startingtouch = puie->CurrentXY() ; + m_delta = 0 ; + if (lowerleft.Contains(m_startingtouch) || upperright.Contains(m_startingtouch)) + { + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: ZOOM IN/OUT, (%d,%d) in %d,%d %d,%d, range: %d", + m_startingtouch.iX, m_startingtouch.iY, + m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY, + m_rangesizeInPixels); + } + m_zooming = true ; + if (lowerleft.Contains(m_startingtouch)) + { + m_zoomtype = EZoomIn ; + } + else + { + m_zoomtype = EZoomOut ; + } + state = ELockToThisGesture ; // keep zooming until release + TTwoPointGesture pgest(KUid, m_startingtouch, m_startingtouch); + pgest.setLogging(m_loggingenabled) ; + pgest.setDetails(m_delta) ; + pgest.setName(m_zoomtype == EZoomIn ? KZoomInName() : KZoomOutName()) ; + pgest.setType(m_zoomtype); + + // Call the listener to inform that a gesture has happened + m_listener->gestureEnter(pgest) ; + } + else + { + // It is not our gesture so do nothing... + } + } + else + { + // It is not touch, so not our initiating UI event.. do nothing + } + } + else + { + // We are already zooming, calculate the changes in zooming factor if it looks we are still zooming + if (eventCode == stmUiEventEngine::ERelease) // ERelease stops zooming + { + // We were zooming, but if there are multiple touches we are not any more + m_listener->gestureExit(KUid) ; // should we call this or not? + } + else // all other UI events will keep on zooming + { + state = ELockToThisGesture ; // Keep the gesture + const TPoint& p = puie->CurrentXY() ; + float newdist = calculateDistance(p) ; + float olddist = calculateDistance(m_previoustouch) ; + m_previoustouch = p ; + m_delta = adjustZoom(olddist, newdist) ; + state = EGestureActive ; + + // Inform listener only if there is something to say + if (m_delta != 0) + { + TTwoPointGesture pgest = TTwoPointGesture(KUid, p, m_startingtouch); + pgest.setLogging(m_loggingenabled) ; + pgest.setDetails(m_delta) ; + pgest.setName(m_zoomtype == EZoomIn ? KZoomInName() : KZoomOutName()) ; + pgest.setType(m_zoomtype); + + // Call the listener to inform that a gesture has happened + m_listener->gestureEnter(pgest) ; + } + } + } + } + else + { + if (m_zooming) + { + // We were zooming, but if there are multiple touches we are not any more + m_listener->gestureExit(KUid) ; // should we call this or not? + } + m_zooming = false ; + } + return state; +} + +void CZoomGestureRecogniser::release(MGestureEngineIf*) +{ + if (m_zooming) + { + m_zooming = false ; + m_listener->gestureExit(KUid) ; // should we call this or not? + } + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: 0x%x release", this); + } +} + +void CZoomGestureRecogniser::setRange(int rangeInPixels) +{ + m_rangesizeInPixels = rangeInPixels ; +} + +void CZoomGestureRecogniser::setArea(const TRect& theArea) +{ + m_area = theArea ; + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: set area, %d,%d %d,%d", + m_area.iTl.iX, m_area.iTl.iY, m_area.iBr.iX, m_area.iBr.iY); + } +} + +/*! + * calculate the distance, return as as float + */ +float CZoomGestureRecogniser::calculateDistance(const TPoint& tp) +{ + double x = ((m_startingtouch.iX-tp.iX)*(m_startingtouch.iX-tp.iX)) + + ((m_startingtouch.iY-tp.iY)*(m_startingtouch.iY-tp.iY)) ; + double ddist ; + Math::Sqrt(ddist, x) ; + return ddist ; +} + +int CZoomGestureRecogniser::adjustZoom(float& aPreviousDistance, float aNewDistance) +{ + float diff = aNewDistance - aPreviousDistance ; + float logdiff = diff ; + if (diff < 0) diff = -diff ; + float changePercentage = (diff/aPreviousDistance)*100.f ; + if (changePercentage > 10.f) + { + // change more than 10%, make at most 10% + float newdiff = aPreviousDistance*0.1f; + if (aPreviousDistance > aNewDistance) newdiff = -newdiff ; + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: adjust zoom from %f to %f : was, now %f %f", + double(logdiff), double(newdiff), double(aPreviousDistance), double(aNewDistance)); + } + + aPreviousDistance = aPreviousDistance + newdiff ; + diff = newdiff ; + + } + else + { + if (m_loggingenabled) + { + LOGARG("CZoomGestureRecogniser: adjust zoom from %f to %f : was, now %f %f", + double(logdiff), double(diff), double(aPreviousDistance), double(aNewDistance)); + } + aPreviousDistance = aNewDistance ; // accept the new value and update the new length + diff = logdiff ; // put the original back + } + return (int)diff ; +} diff -r 6297cdf66332 -r d39add9822e2 webengine/widgetinstaller/Inc/WidgetBackupRegistryXml.h --- a/webengine/widgetinstaller/Inc/WidgetBackupRegistryXml.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/widgetinstaller/Inc/WidgetBackupRegistryXml.h Tue Feb 02 00:56:45 2010 +0200 @@ -1,25 +1,23 @@ /* -* ============================================================================== -* Name : WidgetRegistryXml.h -* Part of : Widget Registry -* Interface : Widget Registry API -* Description : This file contains the header file of the CWidgetBackupRegistryXml class. +* Copyright (c) 2008 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: This file contains the header file of the CWidgetBackupRegistryXml class. * * This class processes persistent registry data in XML. -* Version : %version: % * -* Copyright © 2008 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. -* ============================================================================== */ + #ifndef WIDGETBACKUPREGISTRYXML_H #define WIDGETBACKUPREGISTRYXML_H diff -r 6297cdf66332 -r d39add9822e2 webengine/widgetinstaller/Src/WidgetBackupRegistryXml.cpp --- a/webengine/widgetinstaller/Src/WidgetBackupRegistryXml.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/widgetinstaller/Src/WidgetBackupRegistryXml.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,24 +1,20 @@ -// -// ============================================================================== -// Name : WidgetBackupRegistryXml.cpp -// Part of : WidgetRegistry -// Interface : -// Description : Processes registry persistent data in XML. -// Version : 5.0 -// -// Copyright © 2008 Nokia Corporation. -// This material, including documentation and any related -// computer programs, is protected by copyright controlled by -// Nokia Corporation. All rights are reserved. Copying, -// including reproducing, storing, adapting or translating, any -// or all of this material requires the prior written consent of -// Nokia Corporation. This material also contains confidential -// information which may not be disclosed to others without the -// prior written consent of Nokia Corporation. -// ============================================================================== -/// +/* +* Copyright (c) 2008 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: Processes registry persistent data in XML. +* +*/ -// INCLUDE FILES #include #include diff -r 6297cdf66332 -r d39add9822e2 webengine/widgetregistry/Server/inc/WidgetMMCHandler.h --- a/webengine/widgetregistry/Server/inc/WidgetMMCHandler.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/widgetregistry/Server/inc/WidgetMMCHandler.h Tue Feb 02 00:56:45 2010 +0200 @@ -1,22 +1,21 @@ /* -* ============================================================================ -* Name : WidgetMMCHandler.h -* Part of : Widget Registry -* Description : Acts on MMC card insertion/removal -* Version : 3.1 +* Copyright (c) 2008 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". * -* Copyright © 2008 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. -* ============================================================================= +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Acts on MMC card insertion/removal +* */ + #ifndef WIDGETMMCHANDLER_H #define WIDGETMMCHANDLER_H diff -r 6297cdf66332 -r d39add9822e2 webengine/widgetregistry/Server/src/WidgetMMCHandler.cpp --- a/webengine/widgetregistry/Server/src/WidgetMMCHandler.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/widgetregistry/Server/src/WidgetMMCHandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,26 +1,22 @@ -// -// ============================================================================ -// Name : WidgetMMCHandler.cpp -// Part of : SW Installer UIs / WidgetInstallerUI -// -// Description: Handle notifications of MMC events. -// -// -// Version : 3.1 -// -// Copyright © 2006 Nokia Corporation. -// This material, including documentation and any related -// computer programs, is protected by copyright controlled by -// Nokia Corporation. All rights are reserved. Copying, -// including reproducing, storing, adapting or translating, any -// or all of this material requires the prior written consent of -// Nokia Corporation. This material also contains confidential -// information which may not be disclosed to others without the -// prior written consent of Nokia Corporation. -// ============================================================================== -/// +/* +* Copyright (c) 2006 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: Handle notifications of MMC events. +* +* +* +*/ -// INCLUDE FILES #include "WidgetMMCHandler.h" #include "WidgetRegistry.h" @@ -134,7 +130,7 @@ LOG1( " iDriveFlags 0x%x", iDriveFlags ); LOG1( " driveFlags 0x%x", driveFlags ); deltaDriveFlags = iDriveFlags ^ driveFlags; - iDeltaDriveFlags = deltaDriveFlags; + iDeltaDriveFlags |= deltaDriveFlags; LOG1( " deltaDriveFlags 0x%x", deltaDriveFlags ); iDriveFlags = driveFlags; } diff -r 6297cdf66332 -r d39add9822e2 webengine/wmlengine/src/xhtml/src/Image/ImageMapPopup.cpp --- a/webengine/wmlengine/src/xhtml/src/Image/ImageMapPopup.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/wmlengine/src/xhtml/src/Image/ImageMapPopup.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -19,7 +19,7 @@ #include "ImageMapPopup.h" - +#include #include #include #include @@ -317,8 +317,13 @@ // void CImageMapPopup::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType ) { +#ifdef BRDO_SINGLE_CLICK_ENABLED_FF if(aEventType == MEikListBoxObserver::EEventItemDoubleClicked || + aEventType == MEikListBoxObserver::EEventEnterKeyPressed || aEventType == EEventItemSingleClicked) +#else + if(aEventType == MEikListBoxObserver::EEventItemDoubleClicked || aEventType == MEikListBoxObserver::EEventEnterKeyPressed) +#endif { AttemptExitL( ETrue ); } diff -r 6297cdf66332 -r d39add9822e2 webengine/wrtharvester/inc/wrtusbhandler.h --- a/webengine/wrtharvester/inc/wrtusbhandler.h Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/wrtharvester/inc/wrtusbhandler.h Tue Feb 02 00:56:45 2010 +0200 @@ -1,22 +1,21 @@ /* -* ============================================================================ -* Name : WrtUsbHandler.h -* Part of : Widget Registry -* Description : Acts on MMC card insertion/removal -* Version : 3.1 +* Copyright (c) 2008 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". * -* Copyright © 2008 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. -* ============================================================================= +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Acts on MMC card insertion/removal +* */ + #ifndef WIDGETMMCHANDLER_H #define WIDGETMMCHANDLER_H diff -r 6297cdf66332 -r d39add9822e2 webengine/wrtharvester/rom/wrtharvesterResources.iby --- a/webengine/wrtharvester/rom/wrtharvesterResources.iby Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/wrtharvester/rom/wrtharvesterResources.iby Tue Feb 02 00:56:45 2010 +0200 @@ -1,22 +1,22 @@ /* -* ============================================================================= -* Name : wrtharvesterResources.iby -* Part of : -* Description : The resource iby file contains resource that needs to be -* localized for wrtharvester -* Version : %version: 1 % +* 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". * -* Copyright (c) 2009 Nokia. All rights reserved. -* This material, including documentation and any related computer -* programs, is protected by copyright controlled by Nokia. All -* rights are reserved. Copying, including reproducing, storing, -* adapting or translating, any or all of this material requires the -* prior written consent of Nokia. This material also contains -* confidential information which may not be disclosed to others -* without the prior written consent of Nokia. -* ============================================================================ +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The resource iby file contains resource that needs to be +* localized for wrtharvester +* */ + #ifndef WRTHARVESTERRESOURCES_IBY #define WRTHARVESTERRESOURCES_IBY diff -r 6297cdf66332 -r d39add9822e2 webengine/wrtharvester/src/wrtharvesterpsnotifier.cpp --- a/webengine/wrtharvester/src/wrtharvesterpsnotifier.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/wrtharvester/src/wrtharvesterpsnotifier.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -154,12 +154,15 @@ } else if( iKey == EWidgetRegAltered && value == 1 ) { - if(!iHarvester->CanAccessRegistry()) - { - iHarvester->SetMSMode(0); - iHarvester->SetRegistryAccess(ETrue); + if(iHarvester->IsInMSMode()) + { + iHarvester->SetRegistryAccess(EFalse); } - iHarvester->UpdateL(); + else + { + iHarvester->SetRegistryAccess(ETrue); + } + iHarvester->UpdateL(); } } } diff -r 6297cdf66332 -r d39add9822e2 webengine/wrtharvester/src/wrtusbhandler.cpp --- a/webengine/wrtharvester/src/wrtusbhandler.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/webengine/wrtharvester/src/wrtusbhandler.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,26 +1,22 @@ -// -// ============================================================================ -// Name : WidgetMMCHandler.cpp -// Part of : SW Installer UIs / WidgetInstallerUI -// -// Description: Handle notifications of MMC events. -// -// -// Version : 3.1 -// -// Copyright © 2006 Nokia Corporation. -// This material, including documentation and any related -// computer programs, is protected by copyright controlled by -// Nokia Corporation. All rights are reserved. Copying, -// including reproducing, storing, adapting or translating, any -// or all of this material requires the prior written consent of -// Nokia Corporation. This material also contains confidential -// information which may not be disclosed to others without the -// prior written consent of Nokia Corporation. -// ============================================================================== -/// +/* +* Copyright (c) 2006 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: Handle notifications of MMC events. +* +* +* +*/ -// INCLUDE FILES #include "wrtusbhandler.h" #include "wrtharvester.h" #include "wrtusbhandler.h" @@ -170,9 +166,9 @@ { // Mass storage was unplugged if(iHarvester->IsInMSMode() == 1) - { - iHarvester->ClearAllOperations(); - iHarvester->SetRegistryAccess(EFalse); + { + iHarvester->SetMSMode(0); + iHarvester->ClearAllOperations(); } } } diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetapp/group/WidgetUi.mmp --- a/widgets/widgetapp/group/WidgetUi.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetapp/group/WidgetUi.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -134,4 +134,9 @@ #if defined( RD_PF_SEC_APPARC ) LIBRARY ServiceHandler.lib #endif + +#ifdef BRDO_OCC_ENABLED_FF +LIBRARY extendedconnpref.lib +LIBRARY netmeta.lib +#endif // End of File diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetapp/inc/WidgetUiNetworkListener.h --- a/widgets/widgetapp/inc/WidgetUiNetworkListener.h Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetapp/inc/WidgetUiNetworkListener.h Tue Feb 02 00:56:45 2010 +0200 @@ -1,22 +1,20 @@ -// -//============================================================================== -// Name : WidgetUiNetworkListener.h -// Part of : WidgetUI -// Interface : -// Description : -// Version : %version: 5.1.1.3.3 % -// -// Copyright 2008, 2009 Nokia Corporation. -// This material, including documentation and any related -// computer programs, is protected by copyright controlled by -// Nokia Corporation. All rights are reserved. Copying, -// including reproducing, storing, adapting or translating, any -// or all of this material requires the prior written consent of -// Nokia Corporation. This material also contains confidential -// information which may not be disclosed to others without the -// prior written consent of Nokia Corporation. -//============================================================================== -// +/* +* Copyright (c) 2008, 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: +* +*/ + #ifndef WIDGETUINETWORKLISTENER_H_ #define WIDGETUINETWORKLISTENER_H_ diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetapp/src/WidgetUiNetworkListener.cpp --- a/widgets/widgetapp/src/WidgetUiNetworkListener.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetapp/src/WidgetUiNetworkListener.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -1,22 +1,20 @@ -// -//============================================================================== -// Name : WidgetUiNetworkListener.cpp -// Part of : WidgetUI -// Interface : -// Description : -// Version : %version: 5.1.1.3.3 % -// -// Copyright 2008, 2009 Nokia Corporation. -// This material, including documentation and any related -// computer programs, is protected by copyright controlled by -// Nokia Corporation. All rights are reserved. Copying, -// including reproducing, storing, adapting or translating, any -// or all of this material requires the prior written consent of -// Nokia Corporation. This material also contains confidential -// information which may not be disclosed to others without the -// prior written consent of Nokia Corporation. -//============================================================================== -// +/* +* Copyright (c) 2008, 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: +* +*/ + #include "WidgetUiNetworkListener.h" diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetapp/src/WidgetUiWindowManager.cpp --- a/widgets/widgetapp/src/WidgetUiWindowManager.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetapp/src/WidgetUiWindowManager.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -46,6 +46,10 @@ #include #include +#ifdef BRDO_OCC_ENABLED_FF +#include +#endif + // LOCAL FUNCTION PROTOTYPES TInt doDestructOOMNotifyTimer( TAny* ptr ); TInt doNotifyHarvester( TAny* ptr ); @@ -169,7 +173,12 @@ iHandler = CDocumentHandler::NewL(CEikonEnv::Static()->Process()); iDb = CActiveApDb::NewL( EDatabaseTypeIAP ); + #ifdef BRDO_OCC_ENABLED_FF + iConnection = CInternetConnectionManager::NewL( iDb->Database(), ETrue ); + #else iConnection = CInternetConnectionManager::NewL( iDb->Database(), EFalse ); + #endif + #ifdef BRDO_WRT_HS_FF iCpsPublisher = CCpsPublisher::NewL(); #endif @@ -248,7 +257,7 @@ wdgt_window->SetWindowStateMiniViewL( EMiniViewEnabled ); // TODO also other states are possible when we should react? - + // Removing . Miniview, shall remove full view as well. For blanket permissions // will be revoked for miniview diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetsidchecker/data/10281FC0.rss --- a/widgets/widgetsidchecker/data/10281FC0.rss Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetsidchecker/data/10281FC0.rss Tue Feb 02 00:56:45 2010 +0200 @@ -15,7 +15,7 @@ * */ -#include "registryinfo.rh" +#include RESOURCE REGISTRY_INFO r_registry { diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetsidchecker/group/widgetsidchecker.mmp --- a/widgets/widgetsidchecker/group/widgetsidchecker.mmp Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetsidchecker/group/widgetsidchecker.mmp Tue Feb 02 00:56:45 2010 +0200 @@ -14,6 +14,9 @@ * Description: build for widgetsidchecker * */ + +#include + TARGET widgetsidchecker.dll CAPABILITY All -Tcb TARGETTYPE plugin @@ -26,7 +29,8 @@ USERINCLUDE ../inc -SYSTEMINCLUDE /epoc32/include /epoc32/include/ecom /epoc32/include/platform/mw +MW_LAYER_SYSTEMINCLUDE + START RESOURCE ../data/10281FC0.rss target widgetsidchecker.rsc end diff -r 6297cdf66332 -r d39add9822e2 widgets/widgetsidchecker/src/widgetsidchecker.cpp --- a/widgets/widgetsidchecker/src/widgetsidchecker.cpp Mon Jan 18 21:20:18 2010 +0200 +++ b/widgets/widgetsidchecker/src/widgetsidchecker.cpp Tue Feb 02 00:56:45 2010 +0200 @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include