launcher/src/launchercontaineroutput.cpp
branchRCL_3
changeset 22 fad26422216a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/launcher/src/launchercontaineroutput.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,348 @@
+/*
+* 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 "launchercontaineroutput.h"
+#include "launcherengine.h"
+
+
+#include <AknBidiTextUtils.h>
+#include <AknUtils.h>
+#include <aknnotewrappers.h>
+#include <eiksbfrm.h>
+#include <AknDef.h>
+
+const TUint KLeftMargin = 2;
+const TUint KRightMargin = 2;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+void CLauncherContainerOutput::ConstructL(const TRect& aRect, CLauncherEngine* aEngine)
+    {
+    iEngine = aEngine;
+
+    CreateWindowL();
+    Window().SetShadowDisabled(EFalse);
+    
+    SetBlank();
+
+    iText = HBufC::NewL(200000);
+    iCurrentLine = 0;
+    iLineCount = 0;
+    iNumberOfLinesFitsScreen = 0;
+    iX_factor = 1;
+    iY_factor = 1;
+    iLeftDrawingPosition = KLeftMargin;
+
+    iFont = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont);
+
+    iWrappedArray = new(ELeave) CArrayFixFlat<TPtrC>(500);
+
+    
+    SetRect(aRect);
+    //ActivateL(); 
+
+
+    PrintTextL(_L("Ready.\n\n"));
+
+    }
+
+CLauncherContainerOutput::~CLauncherContainerOutput()
+    {
+    if (iWrappedArray)
+        {
+        iWrappedArray->Reset();
+        delete iWrappedArray;
+        }
+
+    if (iText)
+        delete iText;
+
+    if (iScrollBarFrame)
+        delete iScrollBarFrame;
+
+    if (iWrapperString)
+        delete iWrapperString;
+    }
+
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::UpdateVisualContentL()
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::UpdateVisualContentL(TBool aScrollToBottom, TBool aScrollToTop)
+    {
+    TSize rectSize;
+    AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, rectSize);
+    TRect rect(rectSize);
+
+    // 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 )
+        {
+        if( iCurrentLine < iLineCount - iNumberOfLinesFitsScreen)
+            {
+            iCurrentLine = iLineCount-iNumberOfLinesFitsScreen;
+            }
+        }
+    else if( aScrollToTop )
+        {
+        iCurrentLine = 0;
+        }
+
+    // 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();
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::Draw(const TRect& aRect) const
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::Draw(const TRect& aRect) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.Clear(aRect);
+    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))));
+        }
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::HandleControlEventL(
+//     CCoeControl* aControl,TCoeEvent aEventType)
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::HandleControlEventL(
+    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::PrintTextL(const TDesC& aDes)
+// Print text into output window.
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::PrintTextL(const TDesC& aDes)
+    {
+    iText->Des().Append( aDes );
+    UpdateVisualContentL(ETrue);
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::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 CLauncherContainerOutput::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;
+    }
+
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::ClearOutputWindowL()
+// Clear the output window.
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::ClearOutputWindowL()
+    {
+    iText->Des() = _L("");
+    UpdateVisualContentL(EFalse, ETrue);
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::HandleResourceChange(TInt aType)
+// Handle layout change of the screen
+// ---------------------------------------------------------
+//
+
+void CLauncherContainerOutput::HandleResourceChange(TInt aType)
+    {
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        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;
+            }
+        TRAP_IGNORE(UpdateVisualContentL(EFalse));
+        }
+    else
+        {
+        CCoeControl::HandleResourceChange(aType);
+        }
+    }
+
+// ---------------------------------------------------------
+// CLauncherContainerOutput::HandleScrollEventL()
+// Capture touch events on the scroll bar
+// ---------------------------------------------------------
+//
+void CLauncherContainerOutput::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