diff -r 000000000000 -r 7f656887cf89 commands/fed/src/mainfshell.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commands/fed/src/mainfshell.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,162 @@ +// mainfshell.cpp +// +// Copyright (c) 2009 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// +#include +#include "fed.h" +#include +#include +#include + +using namespace IoUtils; + +class CCmdFed : public CCommandBase + { +public: + static CCommandBase* NewLC(); + ~CCmdFed(); + CConsoleBase* Console() { return iConsole; } + TInt TabWidth() const { return iTabWidth; } + void ShowHelpL(); +private: + CCmdFed(); + +private: // From CCommandBase. + virtual const TDesC& Name() const; + virtual void DoRunL(); + virtual void ArgumentsL(RCommandArgumentList& aArguments); + virtual void OptionsL(RCommandOptionList& aOptions); + virtual void StdinChange(TUint aChange); +private: + RArray iFiles; + CColorConsoleBase* iConsole; + CFed* iFed; + TInt iTabWidth; + }; + +CCmdFed* gCmd = NULL; // Only used for the assertion handler and tab fns + +CCommandBase* CCmdFed::NewLC() + { + CCmdFed* self = new(ELeave) CCmdFed(); + CleanupStack::PushL(self); + self->BaseConstructL(); + return self; + } + +CCmdFed::~CCmdFed() + { + iFiles.Close(); + delete iFed; + delete iConsole; + } + +CCmdFed::CCmdFed() + : CCommandBase(EManualComplete | ENotifyStdinChanges), iTabWidth(4) + { + } + +const TDesC& CCmdFed::Name() const + { + _LIT(KName, "fed"); + return KName; + } + +void CCmdFed::ArgumentsL(RCommandArgumentList& aArguments) + { + aArguments.AppendFileNameL(iFiles, _L("file")); + } + +void CCmdFed::OptionsL(RCommandOptionList& aOptions) + { + aOptions.AppendIntL(iTabWidth, _L("tab-width")); + } + +EXE_BOILER_PLATE(CCmdFed) + +void CCmdFed::DoRunL() + { + iConsole = GetColorConsoleBaseL(); + gCmd = this; + + // Set the console title - nice for when using win32cons + // Not so nice - fshell doesn't reset it when fed exits... -TomS + /* + _LIT(KFed, "fed "); + RBuf cmdLine; + cmdLine.CreateL(User::CommandLineLength() + KFed().Length()); + User::CommandLine(cmdLine); + cmdLine.Insert(0, KFed); + iConsole->SetTitle(cmdLine); + cmdLine.Close(); + */ + + // Capture CTRL-C so we can (a) use it and (b) prevent users from accidentally nuking their work + User::LeaveIfError(Stdin().CaptureKey(CTRL('c'), 0, 0)); + + iFed = CFed::NewL(*iConsole, FsL()); + CDesC16ArrayFlat* argsBuf = new(ELeave) CDesC16ArrayFlat(Max(1, iFiles.Count())); + CleanupStack::PushL(argsBuf); + for (TInt i = 0; i < iFiles.Count(); i++) + { + argsBuf->AppendL(iFiles[i]); + } + CleanupStack::Pop(argsBuf); + iFed->StartL(argsBuf); + } + +void CCmdFed::StdinChange(TUint aChange) + { + if (aChange & RIoReadHandle::EGainedForeground) + { + iFed->RedrawEverythingL(); + } + } + +void AssertionFail(const char* aAssertion, const char* aFile, TInt aLine) + { + __DEBUGGER(); + TBuf8<256> buf; + TOverflowTruncate8 o; + buf.AppendFormat(_L8("Assertion failed: \"%s\" in %s:%i\n"), &o, aAssertion, aFile, aLine); + if (buf.Length()*2>buf.MaxLength()) buf.SetLength(buf.MaxLength()/2); + gCmd->Console()->Write(buf.Expand()); + User::Panic(_L("Fed"), aLine); + } + +TInt KConsoleWidthCorrection = 0; +TInt KConsoleHeightCorrection = 0; + +TInt TabWidth() + { + return gCmd->TabWidth(); + } + +void ShowHelpL() + { + gCmd->ShowHelpL(); + } + +void CCmdFed::ShowHelpL() + { + LtkUtils::RLtkBuf helpText; + CleanupClosePushL(helpText); + helpText.AppendL(_L("\ +Fed Help\r\n\ +========\ +")); + _LIT(KStart, "Console text editor."); + CTextBuffer* helpBuf = const_cast(GetHelpTextL()); // nasty cast... GetHelpTextL shouldn't return a const obj... + CleanupStack::PushL(helpBuf); + TInt found = helpBuf->Descriptor().Find(KStart); + helpText.AppendL(helpBuf->Descriptor().Mid(found + KStart().Length())); + iFed->ShowHelpL(helpText.ToHBuf()); + CleanupStack::PopAndDestroy(2, &helpText); // helpBuf, helpText + }