--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/consoles/guicons/s60/src/GuiConsAppUi.cpp Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,841 @@
+// GuiConsAppUi.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 <avkon.hrh>
+#include <aknnotewrappers.h>
+#include <stringloader.h>
+#include <GuiCons.rsg>
+#include <f32file.h>
+#include <s32file.h>
+#include <aknnavi.h>
+#include <aknnavilabel.h>
+#include <akntabgrp.h>
+#include <akntitle.h>
+#include <hal.h>
+#include <caknmemoryselectiondialog.h>
+#include <caknfileselectiondialog.h>
+#include <fshell/ltkutils.h>
+
+#include "GuiConsAppUi.h"
+#include "GuiConsAppView.h"
+#include "GuiCons.hrh"
+
+#define EXPAND(L, X) L(X)
+#define PANIC() User::Panic(EXPAND(_L, __FILE__), __LINE__)
+#define GUICONS_ASSERT(x) __ASSERT_ALWAYS(x, PANIC())
+
+_LIT(KServerName, "guicons");
+_LIT(KNoConsole, "no console connected");
+_LIT(KConsoleClosed, "console closed");
+_LIT(KNewProcName, "fshell.exe");
+_LIT(KNewProcArgs, "--console guicons");
+
+_LIT(KIniFile, "\\system\\console\\guicons.ini");
+_LIT(KIdfFile, "\\resource\\guicons.idf");
+_LIT(KIniLongPress, "longpress");
+_LIT(KIniShowNav, "shownav");
+_LIT(KIniBufferSize, "buffersize");
+_LIT(KIniFont, "font");
+
+_LIT(KInvalidFontMsgFmt, "The file '%S' is not a valid font (error %d).\r\n\r\nA font file is a bitmap containing an 8x12 grid "
+ L"of characters with ASCII codes 32 to 127. The width of the bitmap must be a multiple of 8, and the "
+ L"height must be a multiple of 12.");
+_LIT(KFontPreview, "New font:\r\nThe quick brown fox jumps over the lazy dog.");
+
+void CGuiConsAppUi::ConstructL()
+ {
+ BaseConstructL(CAknAppUi::EAknEnableSkin);
+ iTempState = new(ELeave) CConsoleState(NULL);
+ iAppView = CGuiConsAppView::NewL( ClientRect() );
+
+ iIniFile = LtkUtils::CIniFile::NewL(KIniFile, KIdfFile);
+
+ iAppView->Layout();
+ iAppView->ActivateL();
+
+ CEikStatusPane* sp = StatusPane();
+ iNaviPane = (CAknNavigationControlContainer*)sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi));
+ //iNaviDecorator = iNaviPane->CreateNavigationLabelL(_L("guicons"));
+ iNaviDecorator = iNaviPane->CreateTabGroupL(this);
+ iTabGroup = static_cast<CAknTabGroup*>(iNaviDecorator->DecoratedControl());
+ iTabGroup->SetTabFixedWidthL(KTabWidthWithFourTabs);
+ iNaviPane->PushL(*iNaviDecorator);
+
+ SetStateL(ENoConsole);
+ ConsoleTitleChangedL(NULL, KNullDesC);
+
+ SetCapturingLongPressesL(iIniFile->GetBool(KIniLongPress));
+
+ LtkUtils::CSetting* showNavSetting = iIniFile->GetSetting(KIniShowNav);
+ if (!showNavSetting->IsSet())
+ {
+ TBool hasTouchScreen = EFalse;
+ TInt err = HAL::Get(HAL::EPen, hasTouchScreen);
+ if (!err && hasTouchScreen)
+ {
+ iShouldDisplayOnscreenNav = ETrue;
+ }
+ }
+ else
+ {
+ iShouldDisplayOnscreenNav = showNavSetting->AsBool();
+ }
+
+ iConsoleServer = StartGuiConsServerL(KServerName, *this);
+
+ TRAP_IGNORE(LoadCommandsL());
+ }
+
+CGuiConsAppUi::CGuiConsAppUi()
+ {
+ }
+
+void CGuiConsAppUi::SetNaviPaneTextL(const TDesC& aText)
+ {
+ if (iNaviDecorator->ControlType() == CAknNavigationDecorator::ENaviLabel)
+ {
+ CAknNaviLabel* naviLabel = (CAknNaviLabel*)iNaviDecorator->DecoratedControl();
+ naviLabel->SetTextL(aText);
+ iNaviPane->DrawNow();
+ naviLabel->DrawNow();
+ }
+ }
+
+TKeyResponse CGuiConsAppUi::HandleKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+ {
+ if (aType == EEventKey)
+ {
+ switch (iState)
+ {
+ case EEdwinActive:
+ GUICONS_ASSERT(iConsole);
+ // fallthrough
+ case EConsoleClosed:
+ switch (aKeyEvent.iCode)
+ {
+ case EKeyEnter:
+ case EKeyDevice3:
+ if (iState == EEdwinActive)
+ {
+ HBufC* text = iAppView->GetEditorTextL();
+ if (text)
+ {
+ {
+ CleanupStack::PushL(text);
+ iConsole->InjectKeysL(*text);
+ CleanupStack::PopAndDestroy();
+ }
+ iConsole->InjectKeysL(_L("\r"));
+ iAppView->SetEditorTextL(NULL);
+ //iAppView->Editor()->DrawNow();
+ }
+ SetStateL(iState);
+ return EKeyWasConsumed;
+ }
+ case EKeyUpArrow:
+ iConsole->ViewScrollUp();
+ return EKeyWasConsumed;
+ case EKeyDownArrow:
+ iConsole->ViewScrollDown();
+ return EKeyWasConsumed;
+ case EKeyPageDown:
+ iConsole->ViewPageDown();
+ return EKeyWasConsumed;
+ case EKeyPageUp:
+ iConsole->ViewPageUp();
+ return EKeyWasConsumed;
+ case EKeyHome:
+ iConsole->ViewHome();
+ return EKeyWasConsumed;
+ case EKeyEnd:
+ iConsole->ViewEnd();
+ return EKeyWasConsumed;
+ default:
+ break;
+ }
+ case EConsoleActive:
+ case ENoConsole:
+ default:
+ return EKeyWasNotConsumed;
+ }
+ }
+ return EKeyWasNotConsumed;
+ }
+
+
+void CGuiConsAppUi::SetSoftkeysL()
+ {
+ CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+
+ TInt softkeysResourceId;
+ switch (iState)
+ {
+ case EConsoleActive:
+ softkeysResourceId = R_GUICONS_INTERACTIVE_CBA;
+ break;
+ case EEdwinActive:
+ softkeysResourceId = R_GUICONS_LINE_CBA;
+ break;
+ case EConsoleClosed:
+ softkeysResourceId = R_GUICONS_CLOSED_CBA;
+ break;
+ case ENoConsole:
+ default:
+ softkeysResourceId = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
+ break;
+ }
+ cba->SetCommandSetL(softkeysResourceId);
+ cba->DrawNow();
+ }
+
+void CGuiConsAppUi::SetStateL(TState aNewState)
+ {
+ switch (aNewState)
+ {
+ case ENoConsole:
+ GUICONS_ASSERT(!iConsole);
+ CCoeEnv::Static()->RootWin().CancelTextCursor();
+ iAppView->ShowLabelL(KNoConsole);
+ break;
+
+ case EConsoleActive:
+ GUICONS_ASSERT(iConsole);
+ iAppView->FocusEditor(EFalse);
+ iAppView->RemoveEditorFromStack(this);
+
+ RemoveFromStack(iConsole);
+ AddToStackL(iConsole);
+ iConsole->SetFocusing(ETrue);
+ iConsole->SetFocus(ETrue);
+ iAppView->ShowEditor();
+ iEdwinWasLastRunningState = EFalse;
+ break;
+
+ case EEdwinActive:
+ GUICONS_ASSERT(iConsole);
+ iConsole->SetFocus(EFalse);
+ iConsole->SetFocusing(EFalse);
+ RemoveFromStack(iConsole);
+ iAppView->ShowEditor();
+ iAppView->FocusEditor(ETrue);
+
+ iAppView->RemoveEditorFromStack(this);
+ iAppView->AddEditorToStackL(this);
+
+ iAppView->ShowEditor();
+ iEdwinWasLastRunningState = ETrue;
+ break;
+
+ case EConsoleClosed:
+ GUICONS_ASSERT(iConsole);
+ iAppView->FocusEditor(EFalse);
+ iAppView->RemoveEditorFromStack(this);
+ RemoveFromStack(iConsole);
+ iAppView->ShowLabelL(KConsoleClosed);
+ CCoeEnv::Static()->RootWin().CancelTextCursor();
+ break;
+ }
+ iState = aNewState;
+ SetSoftkeysL();
+ }
+
+void CGuiConsAppUi::HandleNewConsoleL(CConsoleControl* aConsole)
+ {
+ CConsoleState* newState = new(ELeave) CConsoleState(aConsole);
+ iTabs.AppendL(newState);
+ if (aConsole == iTempState->iControl)
+ {
+ newState->iTitle.Copy(iTempState->iTitle);
+ iTempState->iControl = NULL;
+ }
+ TBuf<2> text;
+ text.Num(iTabs.Count());
+ iTabGroup->AddTabL(reinterpret_cast<TInt>(newState), text);
+ SwitchTabL(iTabs.Count()-1);
+ SetStateToPreferredL();
+ aConsole->ActivateL();
+ }
+
+void CGuiConsAppUi::HandleConsoleClosed(CConsoleControl* aConsole)
+ {
+ CConsoleState* state = StateForConsole(aConsole);
+ if (state)
+ {
+ state->iConsoleClosed = ETrue;
+ }
+
+ if (aConsole && (aConsole == iConsole))
+ {
+ TRAP_IGNORE(SetStateL(EConsoleClosed));
+ }
+ }
+
+void CGuiConsAppUi::ConsoleTitleChangedL(const CConsoleControl* aConsole, const TDesC& aTitle)
+ {
+ //SetNaviPaneTextL(aTitle);
+
+ // Put it in the title so the navi bar is free for tabs
+ if (aConsole == iConsole)
+ {
+ // If aConsole isn't current, we don't want to update anything
+ CEikStatusPane* sp = StatusPane();
+ CAknTitlePane* titlePane = NULL;
+ if (sp) titlePane = (CAknTitlePane*)sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle));
+ if (titlePane)
+ {
+ if (aTitle.Length())
+ {
+ titlePane->SetTextL(aTitle);
+ }
+ else
+ {
+ titlePane->SetTextL(_L("GuiCons"));
+ }
+ }
+ }
+
+ // And update the state
+ CConsoleState* state = StateForConsole(aConsole);
+ if (state)
+ {
+ state->iTitle = aTitle.Left(state->iTitle.MaxLength());
+ }
+ else
+ {
+ iTempState->iControl = const_cast<CConsoleControl*>(aConsole);
+ iTempState->iTitle = aTitle.Left(iTempState->iTitle.MaxLength());
+ }
+ }
+
+TInt CGuiConsAppUi::GetConsoleBufferSize()
+ {
+ return iIniFile->GetInt(KIniBufferSize);
+ }
+
+const TDesC& CGuiConsAppUi::GetConsoleFont()
+ {
+ return iIniFile->GetString(KIniFont);
+ }
+
+CGuiConsAppUi::~CGuiConsAppUi()
+ {
+ CKeyCapturer::DeleteCapturer();
+
+ iAppView->RemoveEditorFromStack(this);
+ delete iConsoleServer;
+ iTabs.ResetAndDestroy();
+ delete iNaviDecorator;
+ delete iAppView;
+ delete iTempState;
+ iCommands.ResetAndDestroy();
+ delete iIniFile;
+ }
+
+void CGuiConsAppUi::HandleCommandL(TInt aCommand)
+ {
+ if (!CommandValidInCurrentState(aCommand))
+ {
+ _LIT(KNotAvailableNow, "Not available now");
+ iEikonEnv->InfoMsg(KNotAvailableNow);
+ return;
+ }
+
+ switch(aCommand)
+ {
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ Exit();
+ break;
+
+ case EGuiConsFocusConsole:
+ SetStateL(EConsoleActive);
+ break;
+ case EGuiConsFocusEdwin:
+ SetStateL(EEdwinActive);
+ break;
+ case EGuiConsPageUp:
+ iConsole->ViewPageUp();
+ break;
+ case EGuiConsPageDown:
+ iConsole->ViewPageDown();
+ break;
+ case EGuiConsHome:
+ iConsole->ViewHome();
+ break;
+ case EGuiConsEnd:
+ iConsole->ViewEnd();
+ break;
+ case EGuiConsCloseConsole:
+ DeleteCurrentConsoleL();
+ break;
+ case EGuiConsNewConsole:
+ NewFshellProcessL(KNullDesC);
+ break;
+ case EGuiConsCtrlC:
+ {
+ TKeyEvent key;
+ key.iCode = CTRL('c');
+ key.iScanCode = 0;
+ key.iRepeats = 0;
+ key.iModifiers = EModifierLeftCtrl | EModifierCtrl;
+ iConsole->OfferKeyEventL(key, EEventKey);
+ break;
+ }
+ case EGuiConsShow5Way:
+ {
+ iShouldDisplayOnscreenNav = !iShouldDisplayOnscreenNav;
+ if (iConsole) iConsole->SetDisplayFivewayNav(iShouldDisplayOnscreenNav);
+ TRAP_IGNORE(iIniFile->SetL(KIniShowNav, iShouldDisplayOnscreenNav); iIniFile->WriteL());
+ break;
+ }
+ case EGuiConsLongPressSwitchesTabs:
+ {
+ TBool capturing = CKeyCapturer::GetCapturerL()->IsCaptured(EKeyLeftArrow);
+ SetCapturingLongPressesL(!capturing);
+ TRAP_IGNORE(iIniFile->SetL(KIniLongPress, !capturing); iIniFile->WriteL());
+ break;
+ }
+ case EGuiConsChooseFont:
+ {
+ // Note, we have to use the memory and file selection dialogs seperately
+ // so that we can choose things from C: outside of C:\Data
+
+ // choose drive
+ // TODO see if we can do something better here, so we can also choose files from Z: and
+ // other drives
+ CAknMemorySelectionDialog::TMemory memory = CAknMemorySelectionDialog::EPhoneMemory;
+ if (!CAknMemorySelectionDialog::RunDlgLD(memory))
+ {
+ break;
+ }
+ TChar drive = (memory == CAknMemorySelectionDialog::EPhoneMemory) ? 'C' : 'E';
+
+ TFileName* fn = new(ELeave)TFileName;
+ CleanupStack::PushL(fn);
+ fn->Append(drive);
+ fn->Append(_L(":\\"));
+ CAknFileSelectionDialog* fileSel = CAknFileSelectionDialog::NewL(ECFDDialogTypeSelect);
+ CleanupStack::PushL(fileSel);
+ fileSel->SetDefaultFolderL(_L("\\"));
+ if (fileSel->ExecuteL(*fn))
+ {
+
+ // verify that the file chosen is a valid font
+ CConsoleFont* font = NULL;
+ TRAPD(err, font = CConsoleFont::NewL(*fn));
+ if (err!=KErrNone)
+ {
+ DisplayMessageL(KInvalidFontMsgFmt, fn, err);
+ }
+ else
+ {
+ TRAP_IGNORE(iIniFile->SetL(KIniFont, *fn); iIniFile->WriteL());
+ DisplayMessageL(KFontPreview);
+ }
+ delete font;
+ }
+ CleanupStack::PopAndDestroy(2, fn); // fn, fileSel
+ break;
+ }
+
+ case EGuiConsResetFont:
+ iIniFile->RemoveValueL(KIniFont);
+ iIniFile->WriteL();
+ break;
+
+ default:
+ break;
+ }
+
+ if (aCommand >= ETabStart)
+ {
+ TInt tabIdx = aCommand - ETabStart;
+ SwitchTabL(tabIdx);
+ }
+ else if (aCommand >= ECommandStart)
+ {
+ TInt cmdIdx = aCommand - ECommandStart;
+ InputTextL(*iCommands[cmdIdx]->iValue);
+ }
+ }
+
+void CGuiConsAppUi::NewFshellProcessL(const TDesC& aArgs)
+ {
+ RBuf args;
+ args.Create(aArgs.Length()+1+KNewProcArgs().Length());
+ CleanupClosePushL(args);
+ args.Append(KNewProcArgs);
+ args.Append(' ');
+ args.Append(aArgs);
+
+ RProcess proc;
+ User::LeaveIfError(proc.Create(KNewProcName, args));
+ proc.Resume();
+ proc.Close();
+ CleanupStack::PopAndDestroy(&args);
+ }
+
+void CGuiConsAppUi::HandleStatusPaneSizeChange()
+ {
+ iAppView->SetRect( ClientRect() );
+ }
+
+void CGuiConsAppUi::SetMenuItemDimmed(TInt aCommandId, CEikMenuPane* aMenuPane)
+ {
+ aMenuPane->SetItemDimmed(aCommandId, !CommandValidInCurrentState(aCommandId));
+ }
+
+void CGuiConsAppUi::DynInitMenuPaneL(TInt aMenuId, CEikMenuPane* aMenuPane)
+ {
+ if (aMenuId == R_GUICONS_MENU)
+ {
+ SetMenuItemDimmed(EAknSoftkeyExit, aMenuPane);
+ for (TInt i = EGuiConsCommandFirst; i<EGuiConsCommandLast; ++i)
+ {
+ SetMenuItemDimmed(i, aMenuPane);
+ }
+ }
+ else if (aMenuId == R_GUICONS_TABS_SUBMENU)
+ {
+ for (TInt i = 0; i < iTabs.Count(); i++)
+ {
+ CConsoleState* state = iTabs[i];
+ CEikMenuPaneItem::SData menu;
+ menu.iCommandId = ETabStart + i;
+ menu.iCascadeId = 0;
+ menu.iFlags = 0;
+ menu.iText = state->iTitle;
+ aMenuPane->AddMenuItemL(menu);
+ }
+ }
+ else if (aMenuId == R_GUICONS_SETTINGS_SUBMENU)
+ {
+ TBool capturing = CKeyCapturer::GetCapturerL()->IsCaptured(EKeyLeftArrow);
+ aMenuPane->SetItemButtonState(EGuiConsLongPressSwitchesTabs, capturing ? EEikMenuItemSymbolOn : 0);
+ aMenuPane->SetItemButtonState(EGuiConsShow5Way, iShouldDisplayOnscreenNav ? EEikMenuItemSymbolOn : 0);
+ SetMenuItemDimmed(EGuiConsResetFont, aMenuPane);
+ }
+ else if (aMenuId == R_GUICONS_COMMANDS_SUBMENU)
+ {
+ for (TInt i = 0; i < iCommands.Count(); i++)
+ {
+ CCommandText* command = iCommands[i];
+ CEikMenuPaneItem::SData menu;
+ menu.iCommandId = ECommandStart + i;
+ menu.iCascadeId = 0;
+ menu.iFlags = 0;
+ menu.iText = command->iName;
+ aMenuPane->AddMenuItemL(menu);
+ }
+ }
+ }
+
+TBool CGuiConsAppUi::CommandValidInCurrentState(TInt aCommandId)
+ {
+ switch (aCommandId)
+ {
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ return (iState == ENoConsole || iState == EConsoleClosed);
+ case EGuiConsFocusConsole:
+ return (iState == EEdwinActive);
+ case EGuiConsFocusEdwin:
+ return (iState == EConsoleActive);
+ case EGuiConsPageUp:
+ case EGuiConsPageDown:
+ case EGuiConsHome:
+ case EGuiConsEnd:
+ return (iState == EEdwinActive) || (iState == EConsoleActive) || (iState == EConsoleClosed);
+ case EGuiConsCloseConsole:
+ return (iState == EConsoleClosed);
+ case EGuiConsNewConsole:
+ return ETrue; //(iState == ENoConsole);
+ case EGuiConsSwitchTab:
+ return iTabs.Count() > 1;
+ case EGuiConsCtrlC:
+ return (iState == EEdwinActive) || (iState == EConsoleActive);
+ case EGuiConsNavigationSubMenu:
+ return CommandValidInCurrentState(EGuiConsHome) || CommandValidInCurrentState(EGuiConsEnd) || CommandValidInCurrentState(EGuiConsPageUp) || CommandValidInCurrentState(EGuiConsPageDown);
+ case EGuiConsCommandsSubMenu:
+ return (iState == EEdwinActive) || (iState == EConsoleActive);
+ case EGuiConsResetFont:
+ return iIniFile->GetSetting(KIniFont)->IsSet();
+ default:
+ return ETrue;
+ }
+ }
+
+
+void CBlankControl::Draw(const TRect& aRect) const
+ {
+ CWindowGc& gc = SystemGc();
+ gc.SetPenStyle(CGraphicsContext::ENullPen);
+ gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+ gc.SetBrushColor(TRgb(0x80, 0x80, 0x80));
+ gc.DrawRect(aRect);
+ }
+
+void CGuiConsAppUi::TabChangedL(TInt aIndex)
+ {
+ //__DEBUGGER();
+ CConsoleState* newTabState = (CConsoleState*)(TAny*)iTabGroup->TabIdFromIndex(aIndex);
+ CConsoleControl* newTab = newTabState->iControl;
+ CConsoleControl* oldTab = iConsole;
+ iConsole = newTab;
+
+ // Update what's on screen, and what has keyboard focus
+ if (oldTab)
+ {
+ // Could be null, maybe
+ RemoveFromStack(oldTab);
+ oldTab->MakeVisible(EFalse);
+ }
+ if (newTab)
+ {
+ // Could be null if we haven't implemented this tab yet
+ //AppUi()->AddToStackL(*this, newTab, ECoeStackPriorityDefault-1); // One less than the tab bar to ensure we don't unintentionally consume left and right arrows
+ AddToStackL(newTab);
+ newTab->MakeVisible(ETrue);
+ newTab->SetDisplayFivewayNav(iShouldDisplayOnscreenNav); // Make sure this is sync'd
+ }
+ iAppView->ClearLargeControl();
+ iAppView->SetLargeControlL(iConsole);
+ if (newTabState->iConsoleClosed)
+ {
+ SetStateL(EConsoleClosed);
+ }
+ else
+ {
+ SetStateToPreferredL();
+ }
+ ConsoleTitleChangedL(iConsole, newTabState->iTitle);
+ }
+
+CConsoleState* CGuiConsAppUi::StateForConsole(const CConsoleControl* aControl)
+ {
+ for (TInt i = 0; i < iTabs.Count(); i++)
+ {
+ if (iTabs[i]->iControl == aControl) return iTabs[i];
+ }
+ return NULL;
+ }
+
+void CGuiConsAppUi::SetStateToPreferredL()
+ {
+ if (iEdwinWasLastRunningState)
+ {
+ SetStateL(EEdwinActive);
+ }
+ else
+ {
+ SetStateL(EConsoleActive);
+ }
+ }
+
+void CGuiConsAppUi::DeleteCurrentConsoleL()
+ {
+ TInt found = KErrNotFound;
+ for (TInt i = 0; i < iTabs.Count(); i++)
+ {
+ if (iTabs[i]->iControl == iConsole)
+ {
+ found = i;
+ break;
+ }
+ }
+ GUICONS_ASSERT(found >= 0);
+
+ CConsoleState* state = iTabs[found];
+ iTabs.Remove(found);
+ CleanupStack::PushL(state); // Keep the state around until we've finished switching, just in case
+ iTabGroup->DeleteTabL((TInt)state);
+ if (found >= iTabs.Count()) found = iTabs.Count()-1;
+ if (found >= 0)
+ {
+ SwitchTabL(found);
+ }
+ else
+ {
+ iConsole = NULL;
+ iAppView->ClearLargeControl();
+ SetStateL(ENoConsole);
+ ConsoleTitleChangedL(NULL, KNullDesC);
+ }
+ CleanupStack::PopAndDestroy(state);
+ }
+
+void CGuiConsAppUi::CapturedKeyPressedL(TInt aIdentifier)
+ {
+ TKeyEvent key;
+ key.iCode = aIdentifier;
+ key.iRepeats = 0;
+ key.iModifiers = 0;
+ switch (aIdentifier)
+ {
+ case EKeyLeftArrow:
+ key.iScanCode = EStdKeyLeftArrow;
+ iTabGroup->OfferKeyEventL(key, EEventKey);
+ break;
+ case EKeyRightArrow:
+ key.iScanCode = EStdKeyRightArrow;
+ iTabGroup->OfferKeyEventL(key, EEventKey);
+ break;
+ default:
+ break;
+ }
+ }
+
+void CGuiConsAppUi::SwitchTabL(TInt aTabIdx)
+ {
+ iTabGroup->SetActiveTabByIndex(aTabIdx);
+ TabChangedL(aTabIdx);
+ }
+
+void CGuiConsAppUi::SetCapturingLongPressesL(TBool aEnable)
+ {
+ CKeyCapturer::GetCapturerL()->RemoveCapture(this, EKeyLeftArrow);
+ CKeyCapturer::GetCapturerL()->RemoveCapture(this, EKeyRightArrow);
+ if (aEnable)
+ {
+ CKeyCapturer::GetCapturerL()->AddLongCaptureL(this, EKeyLeftArrow, EKeyLeftArrow, EStdKeyLeftArrow);
+ CKeyCapturer::GetCapturerL()->AddLongCaptureL(this, EKeyRightArrow, EKeyRightArrow, EStdKeyRightArrow);
+ }
+ }
+
+void CGuiConsAppUi::InputTextL(const TDesC& aText)
+ {
+ if (iState == EEdwinActive)
+ {
+ iAppView->SetEditorTextL(&aText);
+ }
+ else
+ {
+ iConsole->InjectKeysL(aText);
+ }
+ }
+
+void CGuiConsAppUi::LoadCommandsL()
+ {
+ _LIT(KCommandsDir, "\\system\\console\\commands\\");
+ _LIT(KCommandNameMatch, "*.txt");
+ TFindFile findfile(iEikonEnv->FsSession());
+ CDir* list = NULL;
+ TInt found = findfile.FindWildByDir(KCommandsDir, KCommandNameMatch, list);
+ TFileName filename;
+ while (found == KErrNone)
+ {
+ filename = TParsePtrC(findfile.File()).DriveAndPath();
+ TInt dirLen = filename.Length();
+ CleanupStack::PushL(list);
+ for (TInt i = 0; i < list->Count(); i++)
+ {
+ const TEntry& entry = (*list)[i];
+ const TDesC& name = entry.iName;
+ filename.SetLength(dirLen);
+ filename.Append(name);
+ TLex lex(name);
+ TInt order = 0;
+ lex.Val(order);
+ if (lex.Peek() == '-') lex.Inc();
+ CCommandText* cmd = new(ELeave) CCommandText(order);
+ CleanupStack::PushL(cmd);
+ cmd->iName = TParsePtrC(lex.Remainder()).Name().Left(cmd->iName.MaxLength());
+ LtkUtils::ReplaceText(cmd->iName, _L("_"), _L(" "));
+ cmd->iValue = HBufC::NewMaxL(entry.iSize);
+ TPtr8 narrow((TUint8*)cmd->iValue->Ptr(), 0, entry.iSize*2);
+ User::LeaveIfError(iEikonEnv->FsSession().ReadFileSection(filename, 0, narrow, entry.iSize));
+ narrow.Expand();
+ iCommands.InsertInOrderAllowRepeatsL(cmd, TLinearOrder<CCommandText>(&CCommandText::Order));
+ CleanupStack::Pop(cmd);
+ }
+ CleanupStack::PopAndDestroy(list);
+ found = findfile.FindWild(list);
+ }
+ }
+
+_LIT(KShellEchoArgsStart, "--exec \"echo --wrap ^\"");
+_LIT(KShellEchoArgsEnd, "^\"\"");
+_LIT(KEsc, "^^");
+
+TBool NeedsEscape(TChar aChar)
+ {
+ return (aChar == '"');
+ }
+
+void CGuiConsAppUi::DisplayMessageL(TRefByValue<const TDesC> aFmt, ...)
+ {
+ VA_LIST list;
+ VA_START(list, aFmt);
+
+ IoUtils::CTextBuffer* msgBuf = IoUtils::CTextBuffer::NewLC(0x20);
+ msgBuf->AppendFormatListL(aFmt, list);
+
+ IoUtils::CTextBuffer* buf = IoUtils::CTextBuffer::NewLC(0x20);
+
+ buf->AppendL(KShellEchoArgsStart);
+ const TDesC& msg(msgBuf->Descriptor());
+
+ for (TInt i=0; i<msg.Length(); ++i)
+ {
+ if (msg[i] == '\n')
+ {
+ buf->AppendL(KEsc);
+ buf->AppendL('n');
+ }
+ else if (msg[i] == '\r')
+ {
+ buf->AppendL(KEsc);
+ buf->AppendL('r');
+ }
+ else if (NeedsEscape(msg[i]))
+ {
+ buf->AppendL(KEsc);
+ buf->AppendL(msg[i]);
+ }
+ else
+ {
+ buf->AppendL(msg[i]);
+ }
+ }
+ buf->AppendL(KShellEchoArgsEnd);
+
+ NewFshellProcessL(buf->Descriptor());
+ CleanupStack::PopAndDestroy(2, msgBuf);
+ }
+
+// CConsoleState
+
+CConsoleState::CConsoleState(CConsoleControl* aControl)
+: iControl(aControl), iConsoleClosed(EFalse)
+ {
+ }
+
+CConsoleState::~CConsoleState()
+ {
+ delete iControl;
+ }
+
+// CCommandText
+
+CCommandText::CCommandText(TInt aOrder)
+ : iOrder(aOrder)
+ {}
+
+TInt CCommandText::Order(const CCommandText& aLeft, const CCommandText& aRight)
+ {
+ return aLeft.iOrder - aRight.iOrder;
+ }
+
+CCommandText::~CCommandText()
+ {
+ delete iValue;
+ }