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 + -
显示快捷键?