--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smartmessaging/msgeditorutils/src/MsgBioControl.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,383 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Base class for bio controls
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <msvapi.h> // MTM server API
+#include <AknQueryDialog.h>
+#include <eikmenup.h>
+#include <bautils.h> // for BaflUtils
+#include <MsgEditorUtils.rsg> // resouce identifiers
+#include <StringLoader.h> // StringLoader
+#include <msgbiocontrolObserver.h>
+#include "msgbiocontrol.h" // for CMsgBioControl
+#include "MMsgBioControlExtension.h" // MMsgBioControlExtension
+#include "MsgEditorUtils.pan" // for MsgEditorUtils panics
+#include <data_caging_path_literals.hrh>
+
+// CONSTANTS
+_LIT(KMsgEditorUtilsResource, "msgeditorutils.rsc");
+enum TStatusFlags
+ {
+ EFileBased = KBit0
+ };
+
+// ================= MEMBER FUNCTIONS =======================
+
+EXPORT_C CMsgBioControl::CMsgBioControl(MMsgBioControlObserver& aObserver,
+ CMsvSession* aSession, //no ownership
+ TMsvId aId,
+ TMsgBioMode aEditorOrViewerMode,
+ const RFile* aFile):
+ iBioControlObserver(aObserver),
+ iId(aId),
+ iMsvSession(aSession),
+ iMode(aEditorOrViewerMode),
+ iFile(aFile),
+ iBCStatusFlags(0)
+ {
+ // If aFile presents real file, subsession handle > 0
+ // If aFile is dummy file handle ==> subsession handle == 0
+ if (aFile)
+ {
+ if( aFile->SubSessionHandle() == 0)
+ {
+ iFile = NULL;
+ }
+ else
+ {
+ iFile = aFile;
+ iBCStatusFlags |= EFileBased;
+ }
+ }
+ __ASSERT_ALWAYS(
+ ( ( (aEditorOrViewerMode==EMsgBioEditorMode) ||
+ (aEditorOrViewerMode==EMsgBioViewerMode) )
+ &&
+ ( (aSession && aId) ^ (IsFileBased()) )
+ ),
+ Panic( EMEUErrArgument ) );
+ }
+
+EXPORT_C CMsgBioControl::~CMsgBioControl()
+ {
+ if (iResourceOffsets)
+ {
+ for (TInt n(0); n < iResourceOffsets->Count(); n++)
+ {
+ iCoeEnv->DeleteResourceFile(iResourceOffsets->At(n));
+ }
+ delete iResourceOffsets;
+ }
+ }
+
+EXPORT_C TBool CMsgBioControl::ConfirmationQueryL(const TDesC& aText)
+ {
+ //This temporary descriptor is needed because the query wants a non const
+ HBufC* text = aText.AllocL();
+ CleanupStack::PushL(text);
+ CAknQueryDialog* qDlg = new (ELeave) CAknQueryDialog(*text);
+ TInt response =
+ qDlg->ExecuteLD(R_MSGEDITORUTILS_GENERAL_CONFIRMATION_QUERY);
+ CleanupStack::PopAndDestroy(text); // text
+ if (response)
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+EXPORT_C TBool CMsgBioControl::ConfirmationQueryL(TInt aStringResource)
+ {
+ HBufC* buf = StringLoader::LoadLC(aStringResource);
+ TBool result(ConfirmationQueryL(*buf));
+ CleanupStack::PopAndDestroy(buf); //buf
+ return result;
+ }
+
+EXPORT_C void CMsgBioControl::LoadResourceL(const TDesC& aFile)
+ {
+
+ TDriveList driveList;
+
+ TFileName searchPath(NULL);
+
+ // get a list of available drives
+ TInt ret = iCoeEnv->FsSession().DriveList(driveList);
+ if (ret != KErrNone)
+ {
+ // cannot continue
+ Panic( EMEUResourceFileNotFound );
+ }
+
+ // scan all drives
+ for ( TInt n=0 ; n < KMaxDrives ; n++ )
+ {
+ // does the drive exis
+ if (driveList[n] != 0)
+ {
+ TDriveInfo driveInfo;
+
+ ret = iCoeEnv->FsSession().Drive(driveInfo,n);
+ if ((ret == KErrNone)
+ && (driveInfo.iType != EMediaNotPresent)
+ && (driveInfo.iType != EMediaRemote))
+ {
+ // drive exists..
+ TDriveUnit drive(n);
+
+ // append the data.
+ searchPath.CopyF(drive.Name());
+ searchPath.Append(KDC_RESOURCE_FILES_DIR());
+ searchPath.Append(aFile);
+
+ // check does the non-localized file exist
+ TBool res = BaflUtils::FileExists( iCoeEnv->FsSession(), searchPath );
+ if (res) //found
+ {
+ // Complete searchpath without filename.
+ searchPath.CopyF( drive.Name() );
+ searchPath.Append( KDC_RESOURCE_FILES_DIR() );
+ // no need to scan other drives:
+ break;
+ }
+ else
+ {
+ HBufC* originalPath = searchPath.AllocLC();
+ // check is there localized version of resource file
+ BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), searchPath );
+
+ // if the original path differs from search path, the
+ // localized resource file is found
+ res = originalPath->Compare(searchPath);
+
+ CleanupStack::PopAndDestroy(originalPath);
+ if ( res != KErrNone ) // found
+ {
+ // Complete searchpath without filename.
+ searchPath.CopyF(drive.Name());
+ searchPath.Append( KDC_RESOURCE_FILES_DIR() );
+ // no need to scan other drives:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // load the resource file from scanned path.
+ LoadResourceL(aFile, searchPath);
+ }
+
+EXPORT_C void CMsgBioControl::LoadResourceL(const TDesC& aFile, const TDesC& aSearchPath)
+ {
+ if (!iResourceOffsets)
+ {
+ iResourceOffsets = new (ELeave) CArrayFixFlat<TInt>(1); // granularity
+ }
+
+ // Find the resource file for the nearest language
+ TFileName fileName(aSearchPath);
+ fileName.Append(aFile);
+ BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), fileName);
+
+ // Check does the resource file exist in given path.
+ TBool fileExists( BaflUtils::FileExists(iCoeEnv->FsSession(), fileName) );
+ if (fileExists)
+ {
+ // Add the resource file to the CONE environment, and keep the offset
+ iResourceOffsets->SetReserveL(iResourceOffsets->Count() + 1);
+ const TInt offset = iCoeEnv->AddResourceFileL(fileName);
+ iResourceOffsets->AppendL(offset);
+ }
+ else
+ {
+ TParse* fp = new(ELeave) TParse();
+ fp->Set(aFile, &KDC_RESOURCE_FILES_DIR, NULL);
+
+ TFileName fileName(fp->FullName());
+ delete fp;
+
+ iResourceOffsets->SetReserveL(iResourceOffsets->Count() + 1);
+ const TInt offset = iCoeEnv->AddResourceFileL(fileName);
+ User::LeaveIfError( offset);
+ iResourceOffsets->AppendL(offset);
+ }
+ }
+
+EXPORT_C void CMsgBioControl::LoadStandardBioResourceL()
+ {
+ LoadResourceL(KMsgEditorUtilsResource);
+ }
+
+EXPORT_C TBool CMsgBioControl::IsEditor() const
+ {
+ return (iMode == EMsgBioEditorMode);
+ }
+
+EXPORT_C TBool CMsgBioControl::IsFileBased() const
+ {
+ return (iBCStatusFlags & EFileBased);
+ }
+
+EXPORT_C CMsvSession& CMsgBioControl::MsvSession() const
+ {
+ __ASSERT_ALWAYS(iMsvSession, Panic(EMEUMsvSessionIsNull));
+ return *iMsvSession;
+ }
+
+EXPORT_C const TFileName& CMsgBioControl::FileName() const
+ {
+ // deprecated
+ __ASSERT_ALWAYS(/*IsFileBased()*/ 0, Panic(EMEUNotFileBase));
+ return TFileName(); // should never ever come to this point
+ }
+
+EXPORT_C const RFile& CMsgBioControl::FileHandle() const
+ {
+ __ASSERT_ALWAYS(IsFileBased(), Panic(EMEUNotFileBase));
+ return *iFile;
+ }
+
+EXPORT_C TUint32 CMsgBioControl::OptionMenuPermissionsL() const
+ {
+ // This is the default because most of the Bio Controls need these.
+ return EMsgBioCallBack
+ | EMsgBioDelete
+ | EMsgBioMessInfo
+ | EMsgBioMove
+ | EMsgBioCreateCC
+ | EMsgBioSend
+ | EMsgBioAddRecipient
+ | EMsgBioSave
+ | EMsgBioSendingOpt
+ | EMsgBioHelp
+ | EMsgBioExit;
+ }
+
+
+// default implementation returns height of the control.
+EXPORT_C TInt CMsgBioControl::VirtualHeight()
+{
+ return iSize.iHeight;
+}
+
+// default implementation returns 0.
+EXPORT_C TInt CMsgBioControl::VirtualVisibleTop()
+{
+ return 0;
+}
+
+// default implementation returns EFalse.
+EXPORT_C TBool CMsgBioControl::IsCursorLocation(TMsgCursorLocation /*aLocation*/) const
+{
+ return EFalse;
+}
+
+EXPORT_C void CMsgBioControl::AddMenuItemL(CEikMenuPane& aMenuPane,
+ TInt aStringRes, TInt aCommandOffset, TInt aPosition)
+ {
+ CEikMenuPaneItem::SData menuItem;
+ menuItem.iCascadeId = NULL;
+ menuItem.iFlags = NULL;
+ menuItem.iText.Format(*StringLoader::LoadLC(aStringRes));
+ CleanupStack::PopAndDestroy(); // (string)
+ menuItem.iCommandId = iBioControlObserver.FirstFreeCommand()
+ + aCommandOffset;
+ aMenuPane.InsertMenuItemL(menuItem, aPosition);
+ }
+
+void CMsgBioControl::SetBioBodyControl( MMsgBioBodyControl* aBioBodyControl )
+ {
+ iBioBodyControl = aBioBodyControl;
+ }
+
+EXPORT_C TBool CMsgBioControl::NotifyEditorViewL(
+ TMsgBioControlEventRequest aRequest,
+ TInt aDelta)
+ {
+ if (iBioBodyControl)
+ {
+ return iBioBodyControl->HandleBaseControlEventRequestL(
+ aRequest, aDelta);
+ }
+ return ETrue;
+ }
+
+EXPORT_C void CMsgBioControl::SetExtension(MMsgBioControlExtension* aExt)
+ {
+ iExt = aExt;
+ }
+
+#ifdef RD_SCALABLE_UI_V2
+EXPORT_C TInt CMsgBioControl::ScrollL( TInt aPixelsToScroll,
+ TMsgScrollDirection aDirection )
+ {
+ TInt retval(0);
+
+ if(!iExt)
+ {
+ return retval;
+ }
+
+ MMsgBioControlScrollExtension* extension =
+ static_cast<MMsgBioControlScrollExtension*>
+ ( iExt->BioControlExtension( KMsgBioControlScrollExtension ) );
+
+ if(extension != NULL)
+ {
+ //call the extension method
+ retval = extension->ExtScrollL( aPixelsToScroll, aDirection );
+ }
+
+ return retval;
+ }
+
+EXPORT_C void CMsgBioControl::NotifyViewEvent( TMsgViewEvent aEvent, TInt aParam )
+ {
+ if(!iExt)
+ {
+ return;
+ }
+
+ MMsgBioControlScrollExtension* extension =
+ static_cast<MMsgBioControlScrollExtension*>
+ ( iExt->BioControlExtension( KMsgBioControlScrollExtension ) );
+
+ if(extension != NULL)
+ {
+ extension->ExtNotifyViewEvent( aEvent, aParam );
+ }
+ }
+#else
+EXPORT_C TInt CMsgBioControl::ScrollL( TInt /*aPixelsToScroll*/,
+ TMsgScrollDirection /*aDirection*/ )
+ {
+ //no op
+ return 0;
+ }
+
+EXPORT_C void CMsgBioControl::NotifyViewEvent( TMsgViewEvent /*aEvent*/, TInt /*aParam*/ )
+ {
+ //no op
+ }
+#endif
+
+//end of file