texted.cpp
来自「在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己」· C++ 代码 · 共 1,978 行 · 第 1/5 页
CPP
1,978 行
// right at the very end regardless. The cleanup function calls RFs::Delete which will
// not leave - it simply returns an error if the file does not exist (which we ignore).
CleanupStack::PushL(TCleanupItem(DeleteSendAsTempFile,&fileName));
CFileStore* fileStore=CDirectFileStore::ReplaceLC(process->FsSession(),fileName, EFileStream|EFileWrite|EFileShareExclusive);
fileStore->SetTypeL(REINTERPRET_CAST(CEikProcess*,process)->MainStore()->Type());
CStreamDictionary *streamDic=CStreamDictionary::NewL();
CleanupStack::PushL(streamDic);
// Create buffer of text to send
HBufC* bufferFromFile=NULL;
if (selectionLength)
{
// Send selection contents only
bufferFromFile=HBufC::NewLC(selectionLength);
TPtr fileSelectionPtr=bufferFromFile->Des();
iGlobalEd->GlobalText()->Extract(fileSelectionPtr,selection.LowerPos(),selectionLength);
}
else
{
// Send entire file contents
bufferFromFile=HBufC::NewLC(iGlobalEd->GlobalText()->DocumentLength());
TPtr fileBodyPtr=bufferFromFile->Des();
iGlobalEd->GlobalText()->Extract(fileBodyPtr,0);
}
StorePortionL(*fileStore,*streamDic,*bufferFromFile);
CleanupStack::PopAndDestroy(); // bufferFromFile
// Write root stream
process->WriteRootStreamL(*fileStore,*streamDic,*(this->Application()));
CleanupStack::PopAndDestroy(); // streamDic
fileStore->CommitL();
CleanupStack::PopAndDestroy(); // fileStore
CDesCArrayFlat* attachments=new(ELeave)CDesCArrayFlat(1);
CleanupStack::PushL(attachments);
attachments->AppendL(fileName);
iSendAppUi->CreateAndSendMessageL(aCommand,NULL,attachments);
CleanupStack::PopAndDestroy(); //attachments
CleanupStack::PopAndDestroy(); // TCleanupItem() - ensure any temp file is deleted
}
}
#else
void CTxtedAppUi::HandleSendAsMenuL(const TInt /*aCommand*/)
{
}
#endif
void CTxtedAppUi::StorePortionL(CStreamStore& aStore,CStreamDictionary& aStreamDic,const TDesC& aPortion) const
{
RStoreWriteStream stream;
TStreamId streamId=stream.CreateLC(aStore); // pushes stream
CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL();
CleanupStack::PushL(paraFormatLayer);
CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL();
CleanupStack::PushL(charFormatLayer);
CGlobalText* textModel=CGlobalText::NewL(paraFormatLayer,charFormatLayer);
CleanupStack::PushL(textModel);
textModel->InsertL(0,aPortion);
stream<<*textModel;
stream.CommitL();
CleanupStack::PopAndDestroy(4); // textModel,2xlayers,stream
aStreamDic.AssignL(KUidTextEdApp,streamId);
}
void CTxtedAppUi::HandleAttemptDimmedSelectionL(TInt aCommand)
{
TInt resourceId=0;
if (aCommand==ETextEdCmdTranslateDebug && DebuggerNotPresent())
return;
const TInt documentLength=iGlobalEd->TextLength();
const TInt selectionLength=iGlobalEd->SelectionLength();
if (aCommand==EEikCmdEditUndo && !iGlobalEd->CanUndo())
resourceId=R_EIK_TBUF_NOTHING_TO_UNDO;
else if (aCommand==EEikCmdEditCut && selectionLength==0)
resourceId=R_EIK_TBUF_NOTHING_TO_CUT;
else if (aCommand==EEikCmdEditCopy && selectionLength==0)
resourceId=R_EIK_TBUF_NOTHING_TO_COPY;
if ((aCommand==EEikCmdFileSave || aCommand==EEikCmdFileRevert) && (!iDocument->HasChanged()))
resourceId=R_TXED_FILE_UNCHANGED;
if (aCommand==EEikCmdFileExport && documentLength==0)
resourceId=R_TXED_NOTHING_TO_EXPORT;
if ((aCommand==ETextEdCmdTranslate || aCommand==ETextEdCmdTranslateDebug) && documentLength==0)
resourceId=R_TXED_NOTHING_TO_TRANSLATE;
if (!resourceId && iOplRtLogon->IsActive())
resourceId=R_TXED_NOT_WHILE_RUNNING;
if (!resourceId && !(iDocument->AppFileMode()&EFileWrite))
resourceId=R_TXED_FILE_IS_READ_ONLY;
if (resourceId)
iEikonEnv->InfoMsg(resourceId);
else
CEikAppUi::HandleAttemptDimmedSelectionL(aCommand);
}
void CTxtedAppUi::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
{
TBool readOnly=(!(iDocument->AppFileMode()&EFileWrite));
TBool running=iOplRtLogon->IsActive();
TBool noSelection=iGlobalEd->SelectionLength()==0;
TInt documentLength=iGlobalEd->TextLength();
if (aResourceId==R_TXED_FILE_MENU)
{
#if defined(USE_ADDTODESK)
LinkUtils::AddLinkMenuItemL(*aMenuPane,ETextEdCmdAddToHome);
#endif
#ifdef USE_SENDAS
iSendAppUi->DisplaySendMenuItemL(*aMenuPane, aMenuPane->MenuItemIndex(ETextEdCmdPrintingCascade),
TSendingCapabilities(KSendAsMaxBodySizeNotUsed,KSendAsMaxMessageSizeNotUsed,NULL));
#endif
if (running)
{
aMenuPane->SetItemDimmed(EEikCmdFileNew,ETrue);
aMenuPane->SetItemDimmed(EEikCmdFileOpen,ETrue);
}
else if (running || (!iDocument->HasChanged()))
aMenuPane->SetItemDimmed(EEikCmdFileRevert,ETrue);
}
else if (aResourceId==R_TXED_SAVE_MENU)
{
// if (running)
// aMenuPane->SetItemDimmed(EEikCmdFileSaveAs,ETrue);
if (!(iDocument->AppFileMode()&EFileWrite) || (!iDocument->HasChanged()))
aMenuPane->SetItemDimmed(EEikCmdFileSave,ETrue);
}
else if (aResourceId==R_TXED_FILEOPTIONS_MENU)
{
if (readOnly || running)
aMenuPane->SetItemDimmed(EEikCmdFileImport,ETrue);
if (documentLength==0)
aMenuPane->SetItemDimmed(EEikCmdFileExport,ETrue);
}
#if !defined(__UIQ__)
else if (aResourceId==R_SENDUI_MENU)
{
#ifdef USE_SENDAS
iSendAppUi->DisplaySendCascadeMenuL(*aMenuPane);
#endif
}
else if (aResourceId==R_TXED_VIEW_MENU)
{
if (iIsFullScreenVisible)
aMenuPane->SetItemButtonState(ETextEdCmdFullScreen,EEikMenuItemSymbolOn);
if (iIsTitleBarVisible)
aMenuPane->SetItemButtonState(ETextEdCmdShowTitleBar,EEikMenuItemSymbolOn);
}
#endif
else if (aResourceId==R_TXED_EDIT_MENU)
{
#if defined(__UIQ__)
if (iIsHorizScrollBarVisible)
aMenuPane->SetItemButtonState(ETextEdCmdShowHorizScrollBar,EEikMenuItemSymbolOn);
#endif
if (!iGlobalEd->CanUndo() || running)
aMenuPane->SetItemDimmed(EEikCmdEditUndo,ETrue);
if (noSelection)
aMenuPane->SetItemDimmed(EEikCmdEditCopy,ETrue);
if (noSelection || readOnly || running)
aMenuPane->SetItemDimmed(EEikCmdEditCut,ETrue);
if (readOnly || running)
{
aMenuPane->SetItemDimmed(EEikCmdEditPaste,ETrue);
}
}
else if (aResourceId==R_TXED_BUILD_MENU)
{
if (documentLength==0)
{
aMenuPane->SetItemDimmed(ETextEdCmdTranslate,ETrue);
aMenuPane->SetItemDimmed(ETextEdCmdTranslateDebug,ETrue);
}
if (running)
{
aMenuPane->SetItemDimmed(ETextEdCmdTranslate,ETrue);
aMenuPane->SetItemDimmed(ETextEdCmdTranslateDebug,ETrue);
aMenuPane->SetItemDimmed(ETextEdCmdRun,ETrue);
}
if (DebuggerNotPresent())
aMenuPane->DeleteMenuItem(ETextEdCmdTranslateDebug);
}
#if !defined(__UIQ__)
else if (aResourceId==R_TXED_TOOLS_MENU)
{
#ifdef USE_IRLISTEN
iIrListenAppUi->DisplayIrListenMenuItemL(*aMenuPane, aMenuPane->MenuItemIndex(ETextEdCmdLog)+1);
#endif
}
#endif
}
TInt CTxtedAppUi::ScrollBarState()
{
// only works because the command ids are sequential
CEikScrollBarFrame* scrollFrame=iGlobalEd->ScrollBarFrame();
TInt commandId=ETextEdCmdScrollBarNone;
if (scrollFrame)
{
if (scrollFrame->VScrollBarVisibility()!=CEikScrollBarFrame::EOff)
commandId++; // Vertical
if (scrollFrame->HScrollBarVisibility()!=CEikScrollBarFrame::EOff)
commandId+=2; // Horizontal, or Both, depending on Vertical.
}
return commandId;
}
TBool CTxtedAppUi::DebuggerNotPresent()
{
return iFindFile->FindFirst(DebuggerDllFilename(),KNullDesC,TUidType(KDynamicLibraryUid,KUidOplDebugger,KNullUid))!=KErrNone;
}
void CTxtedAppUi::ZoomL(TInt aZoomCmd)
{
TInt zoomFactor=iAppZoom.ZoomFactor();
switch(zoomFactor)
{
case KZoomStateOne:
zoomFactor=(aZoomCmd==EEikCmdZoomIn)? KZoomStateTwo : KZoomStateFour;
break;
case KZoomStateTwo:
zoomFactor=(aZoomCmd==EEikCmdZoomIn)? KZoomStateThree : KZoomStateOne;
break;
case KZoomStateThree:
zoomFactor=(aZoomCmd==EEikCmdZoomIn)? KZoomStateFour : KZoomStateTwo;
break;
case KZoomStateFour:
zoomFactor=(aZoomCmd==EEikCmdZoomIn)? KZoomStateOne : KZoomStateThree;
break;
default:
zoomFactor=KZoomStateTwo;
}
iAppZoom.SetZoomFactor(zoomFactor);
iGlobalEd->NotifyNewFormatL();
iGlobalEd->UpdateScrollBarsL();
}
void CTxtedAppUi::InitTitleBar()
{
#if !defined(__UIQ__)
CEikToolBar* toolBand=iEikonEnv->AppUiFactory()->ToolBand();
iTitleBar=STATIC_CAST(CCknAppTitle*,toolBand->ControlById(ETextEdTitleBarId));
__ASSERT_DEBUG(iTitleBar,Panic(ETextedPanicTitleBarInvalid));
TSize toolBandSize=toolBand->Size();
toolBandSize.iHeight=iTitleBar->MinimumSize().iHeight;
toolBand->SetSize(toolBandSize);
#endif
}
void CTxtedAppUi::InitFullScreenL()
{
#if !defined(__UIQ__)
CEikStatusPane* statuspane = iEikonEnv->AppUiFactory()->StatusPane();
if (statuspane)
{
statuspane->SwitchLayoutL(R_INDICATOR_LAYOUT_WIDE);
}
#endif
}
void CTxtedAppUi::SetTitleBarVisibilityL(const TBool aVisibility)
{
iIsTitleBarVisible=aVisibility;
#if !defined(__UIQ__)
CEikToolBar* band = iEikonEnv->AppUiFactory()->ToolBand();
band->MakeVisible(iIsTitleBarVisible);
TRect bandRect=band->Rect();
bandRect.iTl.iX=ClientRect().iTl.iX;
bandRect.iBr.iX=ClientRect().iBr.iX;
band->SetBoundingRect(bandRect);
#endif
iGlobalEd->SetRect(ClientRect());
iGlobalEd->DrawDeferred();
}
void CTxtedAppUi::SetFullScreenVisibilityL(const TBool aVisibility)
{
iIsFullScreenVisible=aVisibility;
if(iEikonEnv->AppUiFactory()->ToolBar())
iEikonEnv->AppUiFactory()->ToolBar()->MakeVisible(!iIsFullScreenVisible); // cba
CEikStatusPane* statusPane=iEikonEnv->AppUiFactory()->StatusPane();
if (statusPane)
{
if (iIsFullScreenVisible)
statusPane->MakeVisible(EFalse);
else
statusPane->MakeVisible(ETrue);
}
SetTitleBarVisibilityL(iIsTitleBarVisible);
}
void CTxtedAppUi::SetHorizScrollBarVisibilityL(const TBool aVisibility)
{
iIsHorizScrollBarVisible=aVisibility;
if (iIsHorizScrollBarVisible)
CmdScrollBarL(ETextEdCmdScrollBarBoth);
else
CmdScrollBarL(ETextEdCmdScrollBarVertical);
}
void CTxtedAppUi::CmdScrollBarL(TInt aCommand)
{
CEikScrollBarFrame::TScrollBarVisibility vertical=CEikScrollBarFrame::EAuto;
CEikScrollBarFrame::TScrollBarVisibility horizontal=CEikScrollBarFrame::EOff;
CEikScrollBarFrame* scrollFrame=iGlobalEd->ScrollBarFrame();
switch (aCommand)
{
case ETextEdCmdScrollBarNone:
vertical=CEikScrollBarFrame::EOff;
break;
case ETextEdCmdScrollBarVertical:
break;
case ETextEdCmdScrollBarHorizontal:
vertical=CEikScrollBarFrame::EOff;
horizontal=CEikScrollBarFrame::EOn;
break;
case ETextEdCmdScrollBarBoth:
horizontal=CEikScrollBarFrame::EAuto;
break;
case ETextEdCmdCycleScrollBars:
// Removed. Not used since ER5?
break;
}
if (!scrollFrame && (vertical!=CEikScrollBarFrame::EOff || horizontal!=CEikScrollBarFrame::EOff))
scrollFrame=iGlobalEd->CreateScrollBarFrameL();
if (scrollFrame)
{
scrollFrame->SetScrollBarVisibilityL(horizontal,vertical);
iIsHorizScrollBarVisible=horizontal;
iGlobalEd->UpdateScrollBarsL();
}
}
const TInt KVertMargin=6;
void CTxtedAppUi::CmdGotoL(TInt /*aCommand*/)
{
MDesCArray* array=STATIC_CAST(CTextEdDocument*,iDocument)->ProcNameArrayL();
if (!array)
{
TBuf<40> resNoProcsText;
iCoeEnv->ReadResource(resNoProcsText,R_TXED_TBUF_NO_PROCS);
_LIT(KProc,"PROC"); // Constant text, even for non-English localizations.
TBuf<40> msg;
msg.Format(resNoProcsText,&KProc);
iEikonEnv->InfoMsg(msg);
return;
}
TInt selectedItem=STATIC_CAST(CTextEdDocument*,iDocument)->IndexOfPrevious(iGlobalEd->CursorPos());
CEikDialog* dialog=new(ELeave) CTextEdProcListDialog(array,selectedItem);
if (dialog->ExecuteLD(R_TXED_DIALOG_LIST_PROC))
{
// Set the cursor position to the currently selected procedure in the GotoListBox.
iGlobalEd->SetCursorPosL(STATIC_CAST(CTextEdDocument*,iDocument)->ProcPosition(selectedItem),EFalse);
}
}
void CTxtedAppUi::TabSettingL()
{
TInt tabWidthInChars=iTabWidthInChars;
TBool autoIndent=iGlobalEd->IsAutoIndenting();
CEikDialog* dialog=new(ELeave) CTextEdTabDialog(&tabWidthInChars,&autoIndent);
if (dialog->ExecuteLD(R_TXED_DIALOG_INDENTATION))
{
if (iTabWidthInChars!=tabWidthInChars)
SetTabWidthL(tabWidthInChars);
iGlobalEd->SetAutoIndent(autoIndent);
StorePrefs();
}
}
void CTxtedAppUi::SetTabWidthL(TInt aTabWidthInChars)
{
const CCharFormatLayer* charFormatLayer=(STATIC_CAST(CTextEdDocument*,iDocument)->iGlobalText)->GlobalCharFormatLayer();
TCharFormat charFormat;
charFormatLayer->SenseEffective(charFormat);
TInt height=charFormat.iFontSpec.iHeight;
TInt charWidth=height*3/5; // a default value
CFont *font;
CWsScreenDevice* device=iEikonEnv->ScreenDevice(); // only worried about the screen
if (device->GetNearestFontInTwips(font,charFormat.iFontSpec)==KErrNone)
{
TFontSpec spec=font->FontSpecInTwips();
TInt width=font->MaxNormalCharWidthInPixels();
if (!width)
width=font->MaxCharWidthInPixels();
charWidth=width*spec.iHeight/font->HeightInPixels();
device->ReleaseFont(font);
}
TUint32 tabStop=aTabWidthInChars*charWidth;
CParaFormat* paraFormat=CParaFormat::NewL();
CleanupStack::PushL(paraFormat);
CParaFormatLayer* paraFormatLayer=CONST_CAST(CParaFormatLayer*,(STATIC_CAST(CTextEdDocument*,iDocument)->iGlobalText)->GlobalParaFormatLayer());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?