--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/screengrabber/src/SGMainContainer.cpp Tue Feb 02 00:17:27 2010 +0200
@@ -0,0 +1,399 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "SGMainContainer.h"
+
+
+#include <AknBidiTextUtils.h>
+#include <AknUtils.h>
+#include <aknnotewrappers.h>
+#include <eiksbfrm.h>
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <akntitle.h>
+#include <eikspane.h>
+#include <AknDef.h>
+
+const TUint KLeftMargin = 2;
+const TUint KRightMargin = 2;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+void CScreenGrabberMainContainer::ConstructL(const TRect& aRect)
+ {
+ iSkinContext = NULL;
+
+ CreateWindowL();
+ Window().SetShadowDisabled(EFalse);
+
+ SetBlank();
+
+ // set title of the app
+ CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ CAknTitlePane* title = static_cast<CAknTitlePane*>( statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+ title->SetTextL( _L("Screen Grabber") );
+
+ iText = HBufC::NewL(200000);
+ iCurrentLine = 0;
+ iLineCount = 0;
+ iNumberOfLinesFitsScreen = 0;
+ iX_factor = 1;
+ iY_factor = 1;
+ iLeftDrawingPosition = KLeftMargin;
+
+ // get font
+ iFont = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont);
+
+ iWrappedArray = new(ELeave) CArrayFixFlat<TPtrC>(500);
+
+ SetRect(aRect);
+ ActivateL();
+
+ PrintText(_L("Please use the settings screen to define the capture mode and any other related settings such capture hotkey and saving format. Using the PNG format for screen shots is recommended, since it is compressed but lossless. The captures can be managed with the Media Gallery application.\n\nYou may start taking screenshots or capturing video now. Please press the Applications key to go back to the Application menu or send this application to the background via the Options menu. To be able to take screenshots or capture video, this applications needs to stay running in the background.\n"));
+ }
+
+CScreenGrabberMainContainer::~CScreenGrabberMainContainer()
+ {
+ if (iSkinContext)
+ delete iSkinContext;
+
+ if (iWrappedArray)
+ {
+ iWrappedArray->Reset();
+ delete iWrappedArray;
+ }
+
+ if (iText)
+ delete iText;
+
+ if (iScrollBarFrame)
+ delete iScrollBarFrame;
+
+ if (iWrapperString)
+ delete iWrapperString;
+ }
+
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::UpdateVisualContentL()
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::UpdateVisualContentL(TBool aScrollToBottom)
+ {
+ TSize rectSize;
+ AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, rectSize);
+ TRect rect(rectSize);
+
+ // set the correct drawing area for the skin background
+ if(iSkinContext)
+ {
+ delete iSkinContext;
+ iSkinContext = NULL;
+ }
+ iSkinContext = CAknsBasicBackgroundControlContext::NewL(KAknsIIDQsnBgAreaMain, rectSize, EFalse);
+
+ // init scroll bar if not yet done
+ if (!iScrollBarFrame)
+ {
+ iScrollBarFrame = new(ELeave) CEikScrollBarFrame(this, this, ETrue);
+
+ CAknAppUi* appUi = iAvkonAppUi;
+
+ if (AknLayoutUtils::DefaultScrollBarType(appUi) == CEikScrollBarFrame::EDoubleSpan)
+ {
+ iScrollBarFrame->CreateDoubleSpanScrollBarsL(ETrue, EFalse);
+ iScrollBarFrame->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan);
+ }
+ else
+ {
+ iScrollBarFrame->SetTypeOfVScrollBar(CEikScrollBarFrame::EArrowHead);
+ }
+ iScrollBarFrame->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+ }
+
+ // drawing positions, needed for scalable ui
+ iX_factor = TReal(rect.Width()) / 176;
+ iY_factor = TReal(rect.Height()) / 144;
+
+ iWrappedArray->Reset();
+
+ if (iWrapperString)
+ {
+ delete iWrapperString;
+ iWrapperString = NULL;
+ }
+
+ // define drawing width, some extra space needed if using double span scrolling bar
+ TUint drawingWidth(0);
+ if (iScrollBarFrame->TypeOfVScrollBar() == CEikScrollBarFrame::EDoubleSpan)
+ {
+ if (AknLayoutUtils::LayoutMirrored()) // scroll bar on 'left'
+ {
+ iLeftDrawingPosition = KLeftMargin + 12;
+ drawingWidth = TInt( rect.Width() - iLeftDrawingPosition*iX_factor - (KRightMargin*iX_factor));
+ }
+ else // scroll bar on 'right'
+ {
+ iLeftDrawingPosition = KLeftMargin;
+ drawingWidth = TInt( rect.Width() - iLeftDrawingPosition*iX_factor - (KRightMargin*iX_factor + 7*iX_factor));
+ }
+ }
+ else
+ drawingWidth = TInt( rect.Width() - KLeftMargin*iX_factor - KRightMargin*iX_factor);
+
+ // wrap the text
+ iWrapperString = AknBidiTextUtils::ConvertToVisualAndWrapToArrayL(
+ iText->Des(),
+ drawingWidth,
+ *iFont,
+ *iWrappedArray
+ );
+
+ iLineCount = iWrappedArray->Count();
+
+ // count amount of lines fits to screen
+ iNumberOfLinesFitsScreen = TInt(rect.Height() / (iFont->HeightInPixels()));
+
+ // check if needed to scroll to the bottom
+ if (aScrollToBottom && iCurrentLine < iLineCount - iNumberOfLinesFitsScreen)
+ {
+ iCurrentLine = iLineCount-iNumberOfLinesFitsScreen;
+ }
+
+ // update the scroll bars
+ TEikScrollBarModel horizontalBar;
+ TEikScrollBarModel verticalBar;
+ verticalBar.iThumbPosition = iCurrentLine;
+ verticalBar.iScrollSpan = iLineCount - iNumberOfLinesFitsScreen + 1;
+ verticalBar.iThumbSpan = 1;
+
+ TEikScrollBarFrameLayout layout;
+ layout.iTilingMode = TEikScrollBarFrameLayout::EInclusiveRectConstant;
+
+ if (iScrollBarFrame->TypeOfVScrollBar() == CEikScrollBarFrame::EDoubleSpan)
+ {
+ // do not let scrollbar values overflow
+ if (verticalBar.iThumbPosition + verticalBar.iThumbSpan > verticalBar.iScrollSpan)
+ verticalBar.iThumbPosition = verticalBar.iScrollSpan - verticalBar.iThumbSpan;
+
+ TAknDoubleSpanScrollBarModel horizontalDSBar(horizontalBar);
+ TAknDoubleSpanScrollBarModel verticalDSBar(verticalBar);
+
+ iScrollBarFrame->TileL(&horizontalDSBar, &verticalDSBar, rect, rect, layout);
+ iScrollBarFrame->SetVFocusPosToThumbPos(verticalDSBar.FocusPosition());
+ }
+ else
+ {
+ iScrollBarFrame->TileL( &horizontalBar, &verticalBar, rect, rect, layout );
+ iScrollBarFrame->SetVFocusPosToThumbPos( verticalBar.iThumbPosition );
+ }
+
+
+ // update the screen
+ DrawNow();
+ }
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::Draw(const TRect& aRect) const
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::Draw(const TRect& aRect) const
+ {
+ CWindowGc& gc = SystemGc();
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ if (iSkinContext)
+ {
+ // draws the skin background
+ AknsDrawUtils::Background(skin, iSkinContext, this, gc, aRect);
+ }
+ else
+ {
+ gc.Clear(aRect);
+ }
+
+
+ // get the text color from the skin
+ TRgb skinPenColor;
+ if (AknsUtils::GetCachedColor( skin, skinPenColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ) == KErrNone)
+ {
+ gc.SetPenColor(skinPenColor);
+ }
+ else
+ {
+ gc.SetPenColor(KRgbBlack);
+ }
+
+ gc.UseFont(iFont);
+
+ // draw the text
+ for (TInt i=0; i<iNumberOfLinesFitsScreen; i++)
+ {
+ // index out of bounds check and then draw text
+ if (i+iCurrentLine < iWrappedArray->Count())
+ gc.DrawText(iWrappedArray->At(i+iCurrentLine), TPoint(TInt(iLeftDrawingPosition*iX_factor), TInt(iFont->HeightInPixels()*(i+1))));
+ }
+
+ gc.DiscardFont();
+ }
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::HandleControlEventL(
+// CCoeControl* aControl,TCoeEvent aEventType)
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::HandleControlEventL(
+ CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
+ {
+ }
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::PrintText(const TDesC& aDes)
+// Print text into output window.
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::PrintText(const TDesC& aDes)
+ {
+ iText->Des().Append( aDes );
+ UpdateVisualContentL(EFalse); // do not automatically scroll to the bottom
+ }
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,
+// TEventCode aType)
+// Handle key event. Only up and down key arrow events are
+// consumed in order to enable scrolling in output window.
+// ---------------------------------------------------------
+//
+TKeyResponse CScreenGrabberMainContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+ {
+ if(aType != EEventKey)
+ return EKeyWasNotConsumed;
+
+ if(aKeyEvent.iCode == EKeyUpArrow)
+ {
+ if (iCurrentLine > 0)
+ {
+ iCurrentLine--;
+ UpdateVisualContentL(EFalse);
+ }
+
+ return EKeyWasConsumed;
+ }
+
+ else if(aKeyEvent.iCode == EKeyDownArrow)
+ {
+ if (iCurrentLine < iLineCount - iNumberOfLinesFitsScreen)
+ {
+ iCurrentLine++;
+ UpdateVisualContentL(EFalse);
+ }
+
+ return EKeyWasConsumed;
+ }
+
+ return EKeyWasNotConsumed;
+ }
+
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::ClearOutputWindow()
+// Clear the output window.
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::ClearOutputWindow()
+ {
+ iText->Des() = _L("");
+ UpdateVisualContentL(ETrue);
+ }
+
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::HandleResourceChange(TInt aType)
+// Handle layout change of the screen
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::HandleResourceChange(TInt aType)
+ {
+ if (aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange)
+ {
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ SetRect(mainPaneRect);
+
+ iCurrentLine = 0; // scroll to top
+
+ // update font
+ iFont = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont);
+
+ // delete the scroll and update screen
+ if (iScrollBarFrame)
+ {
+ delete iScrollBarFrame;
+ iScrollBarFrame = NULL;
+ }
+ UpdateVisualContentL(EFalse);
+ }
+ else
+ {
+ CCoeControl::HandleResourceChange(aType);
+ }
+ }
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::MopSupplyObject(TTypeUid aId)
+// Pass skin information if needed
+// ---------------------------------------------------------
+//
+TTypeUid::Ptr CScreenGrabberMainContainer::MopSupplyObject(TTypeUid aId)
+ {
+ if (aId.iUid == MAknsControlContext::ETypeId && iSkinContext)
+ {
+ return MAknsControlContext::SupplyMopObject(aId, iSkinContext);
+ }
+
+ return CCoeControl::MopSupplyObject(aId);
+ }
+
+
+// ---------------------------------------------------------
+// CScreenGrabberMainContainer::HandleScrollEventL()
+// Capture touch events on the scroll bar
+// ---------------------------------------------------------
+//
+void CScreenGrabberMainContainer::HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType)
+ {
+ // only on page up/down,scroll up/down and drag events
+ if ((aEventType == EEikScrollPageDown) || (aEventType == EEikScrollPageUp) ||
+ (aEventType == EEikScrollThumbDragVert) || (aEventType == EEikScrollUp) ||
+ (aEventType == EEikScrollDown))
+ {
+ // get the current position from the scroll bar
+ iCurrentLine = aScrollBar->ThumbPosition();
+
+ // refresh now
+ UpdateVisualContentL(EFalse);
+ }
+ }
+
+
+// End of File