diff -r 000000000000 -r 7f656887cf89 plugins/consoles/guicons/s60/src/GuiConsAppView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/consoles/guicons/s60/src/GuiConsAppView.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,311 @@ +// GuiConsAppView.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 +#include +#include +#include +#include +#include +#include "GuiConsAppView.h" +#include "guicons.rsg" + + +class CEdwinThatDoesntConsumeEnter : public CEikEdwin + { + TKeyResponse OfferKeyEventL(const TKeyEvent& aEvent, TEventCode aType); + }; + +TKeyResponse CEdwinThatDoesntConsumeEnter::OfferKeyEventL(const TKeyEvent& aEvent, TEventCode aType) + { + if (aEvent.iCode == EKeyEnter) + { + return EKeyWasNotConsumed; + } + return CEikEdwin::OfferKeyEventL(aEvent, aType); + } + +_LIT(KGuiConsViewPanic, "GuiConsView"); + +void Panic(TGuiConsViewPanic aReason) + { + User::Panic(KGuiConsViewPanic, aReason); + } + +CGuiConsAppView* CGuiConsAppView::NewL(const TRect& aRect) + { + CGuiConsAppView* self = CGuiConsAppView::NewLC(aRect); + CleanupStack::Pop(self); + return self; + } + +CGuiConsAppView* CGuiConsAppView::NewLC(const TRect& aRect) + { + CGuiConsAppView* self = new(ELeave)CGuiConsAppView; + CleanupStack::PushL(self); + self->ConstructL(aRect); + return self; + } + +_LIT(KBgImage, "\\resource\\guiconsbg.png"); + +void CGuiConsAppView::ConstructL(const TRect& aRect) + { + CreateWindowL(); + + iEditor = new(ELeave) CEdwinThatDoesntConsumeEnter; + + iEditor->ConstructL( + CEikEdwin::EAvkonEditor | CEikEdwin::ENoWrap | CEikEdwin::ELineCursor | CEikEdwin::ENoLineOrParaBreaks, + 20, // width in chars + 0, + 1); // number of lines +/* TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, R_GUICONS_LINEEDITOR_EDWIN); + + iEditor->ConstructFromResourceL(reader); + CleanupStack::PopAndDestroy();*/ + + iEditor->SetBorder(TGulBorder::ESingleDotted); + iEditor->SetContainerWindowL(*this); + + iLabel = new(ELeave)CEikLabel(); + iLabel->SetContainerWindowL(*this); + iLabel->SetFont(CEikonEnv::Static()->DenseFont()); + iLabel->SetAlignment(EHCenterVCenter); + iLabel->OverrideColorL(EColorLabelText, 0x808080); + + TRAP_IGNORE(iBgImage = CImageDecodeAo::NewL(*this, KBgImage)); + + SetRect(aRect); + } + +void CGuiConsAppView::SetLargeControlL(CCoeControl* aControl) + { + __ASSERT_ALWAYS(!iLargeControl, Panic(EGuiConsControlAlreadyExists)); + if (!aControl->DrawableWindow()) + { + aControl->SetContainerWindowL(*this); + } + iLargeControl = aControl; + Layout(); + //DrawNow(); + DrawDeferred(); + } + +void CGuiConsAppView::ClearLargeControl() + { + iLargeControl = NULL; + //DrawNow(); + DrawDeferred(); + } + +void CGuiConsAppView::ShowLabelL(const TDesC& aText) + { + iLabel->SetTextL(aText); + iLabel->MakeVisible(ETrue); + iEditor->MakeVisible(EFalse); + DrawNow(); + } + +void CGuiConsAppView::ShowEditor() + { + iLabel->MakeVisible(EFalse); + iEditor->MakeVisible(ETrue); + DrawNow(); + } + +void CGuiConsAppView::FocusEditor(TBool aFocus) + { + iEditor->SetDimmed(!aFocus); + iEditor->SetFocusing(aFocus); + iEditor->SetFocus(aFocus); + iEditor->SetReadOnly(!aFocus); + } + +void CGuiConsAppView::AddEditorToStackL(CCoeAppUi* aAppUi) + { + aAppUi->AddToStackL(iEditor); + } + +void CGuiConsAppView::RemoveEditorFromStack(CCoeAppUi* aAppUi) + { + aAppUi->RemoveFromStack(iEditor); + } + +HBufC* CGuiConsAppView::GetEditorTextL() + { + return iEditor->GetTextInHBufL(); + } + +void CGuiConsAppView::SetEditorTextL(const TDesC* aText) + { + iEditor->SetTextL(aText); + } + +CGuiConsAppView::CGuiConsAppView() + { + } + +CGuiConsAppView::~CGuiConsAppView() + { + delete iEditor; + delete iLabel; + delete iBgImage; + } + +void CGuiConsAppView::Draw(const TRect& aRect) const + { + CWindowGc& gc = SystemGc(); + gc.Clear( aRect ); + + // JB - This doesn't seem to work reliably and it messes up scrolling. +/* TGulBorder border = iEditor->Border(); + TRect editorRect = iEditor->Rect(); + border.Draw(gc, border.OuterRect(editorRect)); + */ + if ((!iLargeControl) && (iBgImage) && (iBgImage->Bitmap())) + { + CFbsBitmap* bg = iBgImage->Bitmap(); + TSize bgSize = bg->SizeInPixels(); + TPoint myCentre = Rect().iTl + TPoint(Size().iWidth / 2, Size().iHeight/2); + TPoint imgTl = myCentre - TPoint(bgSize.iWidth / 2, bgSize.iHeight / 2); + iBgImage->Bitblt(gc, imgTl); + } + } + +void CGuiConsAppView::BgImageReady() + { + if (!iLargeControl) DrawNow(); + } + +void CGuiConsAppView::SizeChanged() + { + Layout(); + DrawNow(); + } + +TInt CGuiConsAppView::CountComponentControls() const + { + TInt count = 2; + if (iLargeControl) count++; + return count; + } + +CCoeControl* CGuiConsAppView::ComponentControl(TInt aIndex) const + { + switch (aIndex) + { + case 0: + return iLabel; + case 1: + return iEditor; + case 2: + if (iLargeControl) + { + return iLargeControl; + } + // fallthrough + default: + Panic(EGuiConsBadControlIndex); + return NULL; // keep compiler quiet + } + } + +void CGuiConsAppView::Layout() + { + TRect myRect = Rect(); + TSize largeSize(myRect.Size()); + + + TSize editorSize(myRect.Width(), iEditor->MinimumSize().iHeight); + TRect editorRect(myRect.iBr - editorSize.AsPoint(), editorSize); + iEditor->SetRect(editorRect); + iLabel->SetRect(editorRect); + + + largeSize.iHeight -= editorSize.iHeight; + + if (iLargeControl) + { + TRect largeRect(myRect.iTl, largeSize); + iLargeControl->SetRect(largeRect); + } + } + +//______________________________________________________________________________ +// CImageDecodeAo +CImageDecodeAo* CImageDecodeAo::NewL(CGuiConsAppView& aOwner, const TDesC& aFileName) + { + CImageDecodeAo* self = new(ELeave)CImageDecodeAo(aOwner); + CleanupStack::PushL(self); + self->ConstructL(aFileName); + CleanupStack::Pop(self); + return self; + } + +CImageDecodeAo::~CImageDecodeAo() + { + Cancel(); + delete iDecoder; + delete iBitmap; + delete iMask; + iFs.Close(); + } + +CFbsBitmap* CImageDecodeAo::Bitmap() + { + return iBitmapReady ? iBitmap : NULL; + } + +void CImageDecodeAo::Bitblt(CWindowGc& aGc, TPoint aPosition) + { + if (!Bitmap()) return; + aGc.BitBltMasked(aPosition, iBitmap, iBitmap->SizeInPixels(), iMask, EFalse); + } + +CImageDecodeAo::CImageDecodeAo(CGuiConsAppView& aOwner) + : CActive(CActive::EPriorityLow), iOwner(aOwner) + { + CActiveScheduler::Add(this); + } + +void CImageDecodeAo::ConstructL(const TDesC& aFileName) + { + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError(iFs.ShareAuto()); + TFindFile ff(iFs); + User::LeaveIfError(ff.FindByDir(aFileName, KNullDesC)); + + iDecoder = CImageDecoder::FileNewL(iFs, ff.File()); + iBitmap = new(ELeave)CFbsBitmap; + iMask = new(ELeave)CFbsBitmap; + User::LeaveIfError(iBitmap->Create(iDecoder->FrameInfo().iOverallSizeInPixels, iDecoder->FrameInfo().iFrameDisplayMode)); + User::LeaveIfError(iMask->Create(iDecoder->FrameInfo().iOverallSizeInPixels, EGray2)); + iDecoder->Convert(&iStatus, *iBitmap, *iMask); + SetActive(); + } + +void CImageDecodeAo::RunL() + { + if (iStatus.Int()==0) + { + iBitmapReady = ETrue; + iOwner.BgImageReady(); + } + } + +void CImageDecodeAo::DoCancel() + { + iDecoder->Cancel(); + }