📄 eik_key.cpp
字号:
if (init<aMinTime)
init=aMinTime;
else if (init>aMaxTime)
init=aMaxTime;
timeEd->ConstructL(aMinTime,aMaxTime,init,flags);
}
}
void COplDialog::AddDateEditorL(const TDesC& aPrompt,TInt32 aMinDate,TInt32 aMaxDate,TAny* aReturn)
{
TDateTime baseDateTime(1900,TMonth(0),0,0,0,0,0);
TTime baseTime(baseDateTime);
#if defined(__UIQ__)
CQikDateEditor* dateEd=(CQikDateEditor*)CreateLineByTypeL(aPrompt,++iNextId,KOplDateEditor,aReturn);
#else
#if defined(__S80_DP2_0__)
TBool realClipboardButtonSetting = Title().HasClipboardButton();
Title().SetHasClipboardButton(ETrue);
CEikDateEditor* dateEd=(CEikDateEditor*)CreateLineByTypeL(aPrompt,++iNextId,KOplDateEditor,aReturn);
Title().SetHasClipboardButton(realClipboardButtonSetting);
#else
CEikDateEditor* dateEd=(CEikDateEditor*)CreateLineByTypeL(aPrompt,++iNextId,KOplDateEditor,aReturn);
#endif
#endif
TInt32 init=OplUtil::GetLong(aReturn);
if (init<aMinDate)
init=aMinDate;
else if (init>aMaxDate)
init=aMaxDate;
dateEd->ConstructL(baseTime+TTimeIntervalDays(aMinDate),baseTime+TTimeIntervalDays(aMaxDate),baseTime+TTimeIntervalDays(init),EFalse);
// with popout calendar
}
#if !defined(__SERIES60__)
void COplDialog::AddFileSelectorL(const TDesC& aPrompt1,const TDesC& aPrompt2,const TDesC& aPrompt3,TInt aFlags,const TUidType& aUidType,TText* aReturn)
{
COplFileNameSelector* fileNameSelector = (COplFileNameSelector*)CreateLineByTypeL(aPrompt1,++iNextId,KOplFileSelector,aReturn);
fileNameSelector->ConstructL(fileNameSelector,aFlags);
fileNameSelector->SetUidType(aUidType);
AddValidatedItemL(fileNameSelector,iNextId);
COplFolderNameSelector* folderNameSelector = (COplFolderNameSelector*)CreateLineByTypeL(aPrompt2,++iNextId,KOplFolderNameSel,NULL);
folderNameSelector->ConstructL(folderNameSelector,aFlags);
COplDriveNameSelector* driveNameSelector = (COplDriveNameSelector*)CreateLineByTypeL(aPrompt3,++iNextId,KOplDriveNameSel,NULL);
driveNameSelector->ConstructL(driveNameSelector,EEikChlistIncrementalMatching,0);
driveNameSelector->BuildDriveArrayL();
folderNameSelector->SetCorrespondingDriveSelector(driveNameSelector);
TParse parse;
TUint8* ptr8=(TUint8*)aReturn;
TPtrC ptr((TText*)(ptr8+1+KOplAlignment),*(ptr8));
User::LeaveIfError(iCoeEnv->FsSession().Parse(ptr, parse));
if (aFlags&KFileSelectorFlagShowSystem)
folderNameSelector->SetShowSystem(ETrue);
folderNameSelector->SetRootL(parse.Drive());
if (parse.ExtPresent()&&(!parse.IsExtWild())&&(aFlags&KFileSelectorFlagDisallowExisting))
fileNameSelector->SetExtensionL(parse.Ext());
if (aFlags&KFileSelectorFlagAllowWildcards)
fileNameSelector->SetMultipleSelectionAllowed(ETrue);
if (aFlags&KFileSelectorFlagShowRom)
driveNameSelector->ShowRom(ETrue);
folderNameSelector->SetFileSelectionObserver(fileNameSelector);
driveNameSelector->SetFileSelectionObserver(folderNameSelector);
driveNameSelector->SetFullNameL(parse.FullName());
}
void COplDialog::AddFileEditorL(const TDesC& aPrompt1,const TDesC& aPrompt2,const TDesC& aPrompt3,TInt aFlags,TText* aReturn)
{
COplFileNameEditor* fileNameEditor = (COplFileNameEditor*)CreateLineByTypeL(aPrompt1,++iNextId,KOplFileEditor,aReturn);
fileNameEditor->ConstructL(aFlags);
AddValidatedItemL(fileNameEditor,iNextId);
COplFolderNameSelector* folderNameSelector = (COplFolderNameSelector*)CreateLineByTypeL(aPrompt2,++iNextId,KOplFolderNameSel,NULL);
folderNameSelector->ConstructL(folderNameSelector,aFlags);
COplDriveNameSelector* driveNameSelector = (COplDriveNameSelector*)CreateLineByTypeL(aPrompt3,++iNextId,KOplDriveNameSel,NULL);
driveNameSelector->ConstructL(driveNameSelector,EEikChlistIncrementalMatching,0);
driveNameSelector->BuildDriveArrayL();
folderNameSelector->SetCorrespondingDriveSelector(driveNameSelector);
TParse parse;
TUint8* ptr8=(TUint8*)aReturn;
TPtrC ptr((TText*)(ptr8+1+KOplAlignment),*(ptr8));
User::LeaveIfError(iCoeEnv->FsSession().Parse(ptr, parse));
if (aFlags&KFileSelectorFlagShowSystem)
folderNameSelector->SetShowSystem(ETrue);
folderNameSelector->SetRootL(parse.Drive());
folderNameSelector->SetFileSelectionObserver(fileNameEditor);
if (aFlags&KFileSelectorFlagShowRom)
driveNameSelector->ShowRom(ETrue);
driveNameSelector->SetFileSelectionObserver(folderNameSelector);
driveNameSelector->SetFullNameL(parse.FullName());
}
void COplDialog::AddFolderSelectorL(const TDesC& aPrompt1,const TDesC& aPrompt2,TInt aFlags,TText* aReturn)
{
COplFolderNameSelector* folderNameSelector = (COplFolderNameSelector*)CreateLineByTypeL(aPrompt1,++iNextId,KOplFolderNameSel,aReturn);
folderNameSelector->ConstructL(folderNameSelector,aFlags);
COplDriveNameSelector* driveNameSelector = (COplDriveNameSelector*)CreateLineByTypeL(aPrompt2,++iNextId,KOplDriveNameSel,NULL);
driveNameSelector->ConstructL(driveNameSelector,EEikChlistIncrementalMatching,0);
driveNameSelector->BuildDriveArrayL();
folderNameSelector->SetCorrespondingDriveSelector(driveNameSelector);
TParse parse;
TUint8* ptr8=(TUint8*)aReturn;
TPtrC ptr((TText*)(ptr8+1+KOplAlignment),*(ptr8));
User::LeaveIfError(iCoeEnv->FsSession().Parse(ptr, parse));
if (aFlags&KFileSelectorFlagShowSystem)
folderNameSelector->SetShowSystem(ETrue);
folderNameSelector->SetRootL(parse.Drive());
if (aFlags&KFileSelectorFlagShowRom)
driveNameSelector->ShowRom(ETrue);
driveNameSelector->SetFileSelectionObserver(folderNameSelector);
driveNameSelector->SetFullNameL(parse.DriveAndPath());
}
void COplDialog::AddFolderEditorL(const TDesC& aPrompt1,const TDesC& aPrompt2,const TDesC& aPrompt3,TInt aFlags,TText* aReturn)
{
COplFolderNameEditor* folderNameEditor = (COplFolderNameEditor*)CreateLineByTypeL(aPrompt1,++iNextId,KOplFolderNameEd,aReturn);
folderNameEditor->ConstructL(aFlags);
AddValidatedItemL(folderNameEditor,iNextId);
COplFolderNameSelector* folderNameSelector = (COplFolderNameSelector*)CreateLineByTypeL(aPrompt2,++iNextId,KOplFolderNameSel,NULL);
folderNameSelector->ConstructL(folderNameSelector,aFlags);
COplDriveNameSelector* driveNameSelector = (COplDriveNameSelector*)CreateLineByTypeL(aPrompt3,++iNextId,KOplDriveNameSel,NULL);
driveNameSelector->ConstructL(driveNameSelector,EEikChlistIncrementalMatching,0);
driveNameSelector->BuildDriveArrayL();
folderNameSelector->SetCorrespondingDriveSelector(driveNameSelector);
TParse parse;
TUint8* ptr8=(TUint8*)aReturn;
TPtrC ptr((TText*)(ptr8+1+KOplAlignment),*(ptr8));
User::LeaveIfError(iCoeEnv->FsSession().Parse(ptr, parse));
if (aFlags&KFileSelectorFlagShowSystem)
folderNameSelector->SetShowSystem(ETrue);
folderNameSelector->SetRootL(parse.Drive());
folderNameSelector->SetFileSelectionObserver(folderNameEditor);
if (aFlags&KFileSelectorFlagShowRom)
driveNameSelector->ShowRom(ETrue);
driveNameSelector->SetFileSelectionObserver(folderNameSelector);
driveNameSelector->SetFullNameL(parse.DriveAndPath());
}
#else
void COplDialog::AddFileSelectorL(const TDesC&, const TDesC&, const TDesC&, TInt, const TUidType&, TText*) {}
void COplDialog::AddFileEditorL(const TDesC&, const TDesC&, const TDesC&, TInt, TText*) {}
void COplDialog::AddFolderSelectorL(const TDesC&, const TDesC&, TInt, TText*) {}
void COplDialog::AddFolderEditorL(const TDesC&, const TDesC&, const TDesC&, TInt, TText*) {}
#endif
/*
void COplDialog::AddCheckBoxL(const TDesC& aPrompt,TInt16* aReturn)
{
CEikCheckBox* checkBox=(CEikCheckBox*)CreateLineByTypeL(aPrompt,++iNextId,KOplCheckBox,aReturn);
TInt init=*(aReturn);
checkBox->SetState(init?CEikButtonBase::ESet:CEikButtonBase::EClear);
}
*/
void COplDialog::AddMultiLineEditorL(const TDesC& aPrompt,TInt aNumOfLines,TInt aWidthInChars,TInt aMaxLength,TInt32* aReturn, TBool aReadOnly)
{
TInt length=OplUtil::GetLong(aReturn);
if (length<0 || length>aMaxLength)
User::Leave(KErrArgument);
CEikEdwin* edwin=(CEikEdwin*)CreateLineByTypeL(aPrompt,++iNextId,KOplMultiLineTextEditor,aReturn);
Line(iNextId)->SetTakesEnterKey(ETrue);
edwin->ConstructL(CEikEdwin::EInclusiveSizeFixed,aWidthInChars,aMaxLength,aNumOfLines);
edwin->CreateScrollBarFrameL()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto);
TPtr ptr((TText*)(aReturn+1),length,aMaxLength); // KOplAlignment not needed
edwin->SetTextL(&ptr);
edwin->SetReadOnly(aReadOnly);
}
void COplDialog::GetHelpContext(TCoeHelpContext& aContext) const
{
/* If this dialog is being displayed by Uikon and the user hits the Help key then
* Cone's CCoeAppUi calls GetHelpContext() for each control on the control stack.
* So, have to return the help context for this control (if the OPL author has
* set one using SetHelp control%,context$) or null.
*
* If the author has set one, it'll be in the dialog'th element of the help context
* array iHelpContextNamesArray.
*/
COplRuntime* rt=TheRuntime(); // expensive call, so cache it here.
TFixedArray<TCoeContextName,KOplLenContextNamesArray>* helpContext=rt->HelpContextNamesArray();
if (helpContext)
{
TCoeContextName dialogContext=helpContext->At(EOplHelpDialog);
TUid helpUid=rt->HelpUid();
if (dialogContext.Length() && helpUid!=KNullUid)
{
aContext=TCoeHelpContext(helpUid,dialogContext);
}
}
}
//
// Dialog OpCodes
//
void FuncOpCode::Dialog(CStack& aStack, COplRuntime& aRuntime, CFrame* aFramePtr)
{
COplDialog* dialog=aRuntime.Dialog();
if ((dialog==NULL)||(dialog->InitFrame()!=aFramePtr))
User::Leave(KOplStructure);
aRuntime.SetDialog(NULL);
CleanupStack::PushL(dialog);
TInt16 ret;
dialog->RunLD(&ret);
aStack.Push(ret);
}
void OpCode::dInit(CStack& aStack, COplRuntime& aRuntime, CFrame* aFramePtr)
{
// MUST for real code have one dialog ptr in aRuntime
// Must save frame pointer in aRuntime
// Must save item ID in aRuntime
delete aRuntime.Dialog();
aRuntime.SetDialog(NULL); //set to NULL incase the new leaves
TInt noOfParams=aRuntime.IP8();
TInt flags=EEikDialogFlagWait|EEikDialogFlagAllKeysToButtons /*|EEikDialogFlagNoBackup*/;
TPtrC title;
if (noOfParams==2)
{
TInt f=aStack.PopInt16();
flags|=((f&EOplDialogFlagsButtonsRight)?EEikDialogFlagButtonsRight:EEikDialogFlagButtonsBelow);
if (f&EOplDialogFlagsNoTitleBar)
flags|=EEikDialogFlagNoTitleBar;
if (f&EOplDialogFlagsFillScreen)
flags|=EEikDialogFlagFillScreen;
if (f&EOplDialogFlagsNoDrag)
flags|=EEikDialogFlagNoDrag;
if (f&EOplDialogFlagsDensePacking)
flags|=EEikDialogFlagDensePacking;
}
if (noOfParams>0)
{
title.Set(aStack.PopString());
}
COplDialog* dialog=new(ELeave) COplDialog();
#if defined(__UIQ__)
dialog->ConstructLC(aFramePtr);
#else
dialog->ConstructLC(aFramePtr,flags);
#endif
if (title.Length()!=0)
dialog->AddTitleL(title);
aRuntime.SetDialog(dialog);
CleanupStack::Pop();
}
LOCAL_C void ParseForPromptsL(const TDesC& aString,TPtrC& aP1,TPtrC& aP2,TPtrC& aP3)
{
TInt pos=aString.Locate(',');
if (pos==KErrNotFound)
{
aP1.Set(aString);
return;
}
aP1.Set(aString.Ptr(),pos);
if (pos>=aString.Length())
return;
TPtrC rest=aString.Mid(pos+1);
pos=rest.Locate(',');
if (pos==KErrNotFound)
{
aP2.Set(rest);
return;
}
aP2.Set(rest.Ptr(),pos);
if (pos<rest.Length())
{
aP3.Set(rest.Mid(pos+1));
if (aP3.Locate(',')!=KErrNotFound)
User::Leave(KErrArgument);
}
}
struct SOplButton
{
TInt iId;
TBool iDefaultCommand;
TPtrC iButtonText;
CEikButtonGroupContainer::THotKeyFlags iHotkeyFlags;
};
const TInt KMaxSupportedButtons=4;
void OpCode::dItem(CStack& aStack, COplRuntime& aRuntime, CFrame* aFramePtr)
// Handle a control item in a dialog
{
COplDialog* dialog=aRuntime.Dialog();
aRuntime.SetDialog(NULL); // temporarily take ownership
CleanupStack::PushL(dialog);
if ((dialog==NULL)||(dialog->InitFrame()!=aFramePtr))
User::Leave(KOplStructure);
TInt itemType=aRuntime.IP8();
switch (itemType)
{
case 0:
{
// dTEXT
TInt flags=(aRuntime.IP8()?aStack.PopInt16():0);
TPtrC body=aStack.PopString();
TPtrC prompt=aStack.PopString();
dialog->AddTextLabelL(prompt,body,flags);
break;
}
case 1:
{
// dCHOICE
TInt numOptionalArgs = aRuntime.IP8();
TBool incrementalMatching=EFalse;
if (numOptionalArgs==1)
incrementalMatching = (TBool)(aStack.PopInt16());
TPtrC list=aStack.PopString();
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
TInt16* ptr=&aStack.PopRefInt16();
CDesCArray* array=dialog->AddChoiceListL(prompt,ptr,incrementalMatching);
TChar comma(',');
TInt remainder=list.Length();
TInt pos=list.Locate(comma);
while (pos>0)
{
array->AppendL(list.Left(pos));
remainder-=(pos+1);
list.Set(list.Right(remainder));
pos=list.Locate(comma);
}
if (pos==0||list.Length()==0)
User::Leave(KErrArgument);
_LIT(KEllipses,"...");
if (list!=KEllipses)
{
array->AppendL(list);
dialog->ChoiceListFinishedL();
}
break;
}
case 2:
{
// dLONG
// Stack (tos 1st)= {max&,min&,prompt$,leftSideVar}
TInt max=aStack.PopInt32();
TInt min=aStack.PopInt32();
if (min>max)
User::Leave(KErrArgument);
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
TInt32* pLive=&(aStack.PopRefInt32());
dialog->AddLongEditorL(prompt,min,max,pLive);
break;
}
case 3:
{
// dFLOAT
TReal64 max=aStack.PopReal64();
TReal64 min=aStack.PopReal64();
if (min>max)
User::Leave(KErrArgument);
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
dialog->AddFloatEditorL(prompt,min,max,&aStack.PopRefReal64());
break;
}
case 4:
{
// dTIME
TUint max=aStack.PopInt32();
TUint min=Abs(aStack.PopInt32());
TInt16 flags=aStack.PopInt16();
if (flags<0||flags>0xf||min>max||max>=86400)
User::Leave(KErrArgument);
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
dialog->AddTimeEditorL(prompt,min,max,flags,&aStack.PopRefInt32());
break;
}
case 5:
{
// dDATE
TInt32 max=aStack.PopInt32();
TInt32 min=Abs(aStack.PopInt32());
if (min>max)
User::Leave(KErrArgument);
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
dialog->AddDateEditorL(prompt,min,max,&aStack.PopRefInt32());
break;
}
case 6:
case 7:
{
// case 7 is dEDIT with len%
// case 6 is dEDIT without len%
TInt widthInChars=((itemType==6)?0:aStack.PopInt16());
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
TText* ptr=aStack.PopRefString();
TInt maxLen=aStack.PopInt16();
if (itemType==6)
widthInChars=maxLen;
dialog->AddTextEditorL(prompt,widthInChars,maxLen,ptr);
break;
}
case 8:
{
// dXINPUT
TInt numOptionalArgs = aRuntime.IP8();
TBool seedTextContents=EFalse;
if (numOptionalArgs==1)
seedTextContents = (TBool)(aStack.PopInt16());
TPtrC prompt=aStack.PopString();
aStack.PopInt16(); // field flag
TText* ptr=aStack.PopRefString();
TInt maxLen=aStack.PopInt16();
dialog->AddSecretEditorL(prompt,maxLen,ptr,seedTextContents);
break;
}
case 9:
{
// dFILE
TUid uid3=TUid::Uid(aStack.PopInt32());
TUid uid2=TUid::Uid(aStack.PopInt32());
TUid uid1=TUid::Uid(aStack.PopInt32());
TUidType uidType(uid1,uid2,uid3);
TInt16 flags=aStack.PopInt16();
TPtrC prompt=aStack.PopString();
TPtrC p1;
TPtrC p2;
TPtrC p3;
ParseForPromptsL(prompt,p1,p2,p3);
aStack.PopInt16(); // field flag
TText* ptr=aStack.PopRefString();
if (aStack.PopInt16()<255) // used to be 128
User::Leave(KErrArgument);
if (flags&KFileSelectorFlagAllowDirsOnly) // folders only
{
if (flags&KFileSelectorFlagEditor) //editor
dialog->AddFolderEditorL(p1,p2,p3,flags,ptr);
else //selector
{
if (p3.Length()!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -