commands/fed/src/mainfshell.cpp
changeset 0 7f656887cf89
child 78 b3ffff030d5c
--- /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 <fshell/ioutils.h>
+#include "fed.h"
+#include <e32cons.h>
+#include <BADESCA.H>
+#include <fshell/descriptorutils.h>
+
+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<TFileName2> 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<CTextBuffer*>(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
+	}