textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutaknchoicelist.cpp
changeset 0 eb1f2e154e89
child 9 e6a39382bb9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutaknchoicelist.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,524 @@
+/*
+* Copyright (c) 2005-2007 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:  Implementation for avkon based choice list control
+*
+*/
+
+
+#include "peninputlayoutaknchoicelist.h"
+#include "peninputlayout.h"
+
+#include <avkon.hrh> // AknButton flags
+#include <AknsConstants.h>
+//#include <avkon.mbg>
+
+#include <eikclbd.h>
+#include <eiklbx.h>
+#include <eikscrlb.h>
+
+#include <AknLayout2ScalableDef.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include <AknsFrameBackgroundControlContext.h> 
+
+
+
+const TInt KMaxTxtLen = 256;
+
+NONSHARABLE_CLASS(CPenUiScrolbarCtrl) : public CFepUiBaseCtrl
+    {
+    public:
+        CPenUiScrolbarCtrl(CCoeControl* aCtrl, CFepUiLayout* aLayout);
+        void ConstructL();         
+    };
+
+CPenUiScrolbarCtrl::CPenUiScrolbarCtrl(CCoeControl* aCtrl, CFepUiLayout* aLayout)
+                : CFepUiBaseCtrl(aCtrl,aLayout,EFalse)
+    {
+    }
+
+void CPenUiScrolbarCtrl::ConstructL()
+    {
+    BaseConstructL();
+    }
+    
+// implementation for class     CFepLayoutAknChoiceList
+EXPORT_C  CFepLayoutAknChoiceList* CFepLayoutAknChoiceList::NewL(CFepUiLayout* aUiLayout,
+                    TInt aControlId,CCoeControl* aParent)
+    {
+    CFepLayoutAknChoiceList* self = new (ELeave) CFepLayoutAknChoiceList(aUiLayout,
+                                                                         aControlId,aParent);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;        
+    }
+
+EXPORT_C CFepLayoutAknChoiceList::CFepLayoutAknChoiceList(CFepUiLayout* aUiLayout, 
+                                  TInt aControlId,CCoeControl* aParent)
+                                  : CFepLayoutChoiceList(aUiLayout,aControlId)
+    {
+    iParent = aParent;
+    }
+
+EXPORT_C CFepLayoutAknChoiceList::~CFepLayoutAknChoiceList()
+    {
+    delete iScrollbarCtrl;
+    delete iTxtTransferBuf;
+    delete iBgContext;
+    }
+    
+EXPORT_C void CFepLayoutAknChoiceList::ConstructL()
+    {    
+    CFepLayoutChoiceList::ConstructL();
+
+    iListBox = new(ELeave) CAknSinglePopupMenuStyleListBox ;//CAknSingleStyleListBox;
+    
+    iListBox->ConstructL(iParent,EAknListBoxMenuList); 
+    iListBox->MakeVisible(EFalse);
+
+   	      
+    CWindowGc* gc = RootControl()->GetRWindowGcL();//(static_cast<CGenericItutUiLayout*>(UiLayout()))->WindowGc();
+    iListBox->SetGc(gc);
+    
+    iListBox->SetGc(gc);
+    iListBox->ItemDrawer()->SetGc(gc);    
+
+    iListBox->CreateScrollBarFrameL(ETrue,EFalse,EFalse);    
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, 
+                                                        CEikScrollBarFrame::EAuto);
+    
+    CEikScrollBar* scrbar = iListBox->ScrollBarFrame()->VerticalScrollBar();
+    iScrollbarCtrl = new(ELeave) CPenUiScrolbarCtrl(scrbar, UiLayout());
+    static_cast<CPenUiScrolbarCtrl*>(iScrollbarCtrl)->ConstructL();
+    UpdateTextColors();
+    
+    CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData();
+    TBool b = d->SubCellIsTransparent(0);
+    TMargins m = d->SubCellMargins(0);
+    //UseSubCellColors
+    
+    
+    iWndControl = iListBox;
+    
+    iTxtTransferBuf = HBufC::NewL(KMaxTxtLen);    
+    
+    TRect nullRect( 0, 0, 0, 0 );
+
+    iBgContext = CAknsFrameBackgroundControlContext::NewL(
+        KAknsIIDQsnFrPopupSub, nullRect, nullRect, EFalse );        
+        
+    
+    }
+    
+EXPORT_C void CFepLayoutAknChoiceList::SetItemsL(const RPointerArray<CFepLayoutChoiceList::SItem>& 
+                                                 aItemList)
+    {
+    TRect r = iRect;
+    CFepLayoutChoiceList::SetItemsL(aItemList);
+    //
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());
+      //= (CDesCArray*) itemList;
+
+    for(int ii = 0; ii < aItemList.Count(); ++ii)
+        {
+        itemArray->AppendL(aItemList[ii]->iText);
+        }    
+    iListBox->HandleItemAdditionL();        
+    SetRect(r);
+    }
+
+
+EXPORT_C void CFepLayoutAknChoiceList::AddItemL(const CFepLayoutChoiceList::SItem& aItem)
+    {
+    TRect r = iRect;
+    CFepLayoutChoiceList::AddItemL(aItem);
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());    
+    itemArray->AppendL(AdjustColumnText(aItem.iText));
+    iListBox->HandleItemAdditionL();    
+    SetRect(r);
+    }
+    
+    
+EXPORT_C void CFepLayoutAknChoiceList::InsertItemL(TInt aPostion, 
+                                                   const CFepLayoutChoiceList::SItem& aItem)
+    {
+    TRect r = iRect;
+    CFepLayoutChoiceList::InsertItemL(aPostion,aItem);
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());     
+    itemArray->InsertL(aPostion,AdjustColumnText(aItem.iText));   
+    iListBox->HandleItemAdditionL();    
+    SetRect(r);
+    }
+
+EXPORT_C void CFepLayoutAknChoiceList::RemoveItemByCommand(TInt aCommand)
+    {
+    TInt idx = FindCommand(aCommand);
+    if(idx > 0)
+        {        
+        RemoveItemByIndex(idx);
+        }
+    }
+    
+void CFepLayoutAknChoiceList::RemoveItemByIndexL(TInt aIndex)
+    {
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());    
+    __ASSERT_DEBUG(aIndex >= 0 && aIndex < itemArray->Count(),User::Leave(EUiGeneralIndexError));
+    CFepLayoutChoiceList::RemoveItemByIndex(aIndex);
+    itemArray->Delete(aIndex);
+    TRAP_IGNORE(iListBox->HandleItemRemovalL());
+    }
+
+EXPORT_C void CFepLayoutAknChoiceList::RemoveItemByIndex(TInt aIndex)
+    {
+    TRAP_IGNORE(RemoveItemByIndexL(aIndex));
+    }
+    
+EXPORT_C void CFepLayoutAknChoiceList::ClearItemsL()
+    {
+    CFepLayoutChoiceList::ClearItemsL();    
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());    
+    itemArray->Reset();
+    }
+    
+EXPORT_C TInt CFepLayoutAknChoiceList::ItemsCount()
+    {
+    CDesCArray* itemArray = static_cast<CDesCArray*>(FormatedCellListBox()->Model()->ItemTextArray());    
+    return itemArray->Count();
+    }
+    
+EXPORT_C void CFepLayoutAknChoiceList::Draw()
+    {
+    
+    if(iWndControl && AbleToDraw())
+        {
+  		DrawOpaqueMaskBackground();              
+        CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+        gc->Activate( BitmapDevice() );
+
+        const TRect& r = Rect();
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        TRAP_IGNORE(CWindowGc& sysgc = *(RootControl()->GetRWindowGcL()));
+        //if ( !AknsDrawUtils::Background( skin, iBgContext, sysgc, r ) )
+            {
+            gc->Clear( Rect());
+            }
+        
+        iWndControl->DrawNow();
+        UpdateArea(iRect, EFalse);        
+        }
+
+    }
+    
+EXPORT_C void CFepLayoutAknChoiceList::SetItemRect(const TRect& , const TRect& )
+    {
+    //do nothing
+    }
+
+// CFepLayoutChoiceList::OnDisplay
+// Prepare display.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutAknChoiceList::OnDisplay(const TPoint& /*aOffset*/)
+    {
+    //set window position
+    //iListBox->ActivateL();	
+    //TBool b = iListBox->IsVisible();    
+    TPoint layoutPos = UiLayout()->LayoutOwner()->LayoutRect().iTl;
+    layoutPos = TPoint(0,0);
+    //CFepLayoutChoiceList::OnDisplay(aOffset);
+ //   iListBox->SetExtent(layoutPos + aOffset,Rect().Size());    
+    
+    CListBoxView* view = iListBox->View();
+    TRect r = view->ViewRect();
+    r.iBr.iY -= 50; 
+    view->SetViewRect(r);
+
+    TSize is = view->ItemSize(0);    
+    TInt w = MinItemWidthInPixels();
+    TSize s = iListBox->ItemDrawer()->MinimumCellSize();
+    TSize ls = iListBox->ItemDrawer()->LafItemSize ();
+    
+    UpdateControlContext();
+    UpdateTextColors();
+    iListBox->MakeVisible(ETrue);
+    TRAP_IGNORE(iListBox->ActivateL());	    
+//    iListBox->ItemDrawer()->FormattedCellData()->SetSkinEnabledL( EFalse );
+    // Marquee can be requested.. ;) 
+  //  iListBox->ItemDrawer()->FormattedCellData()->EnableMarqueeL( EFalse );
+    
+    }
+
+
+
+EXPORT_C CEikColumnListBox* CFepLayoutAknChoiceList::ListBox()
+    {
+    return 0;//iListBox;
+    }
+EXPORT_C CEikFormattedCellListBox* CFepLayoutAknChoiceList::FormatedCellListBox()
+    {
+    return iListBox;
+    }
+
+void CFepLayoutAknChoiceList::UpdateTextColors()
+    {
+    TRgb color( KRgbBlack );  // sane default for nonskinned case
+    if ( AknsUtils::AvkonSkinEnabled() )
+        {
+        AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+                               color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8 );
+        }
+
+    iListBox->ItemDrawer()->SetTextColor( color );
+    iListBox->ItemDrawer()->SetBackColor( AKN_LAF_COLOR( 0 ) );
+
+    if ( AknsUtils::AvkonSkinEnabled() )
+        {
+        AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+                               color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8 );
+        }
+
+    CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData();
+
+    iListBox->ItemDrawer()->SetHighlightedTextColor( color );
+    iListBox->ItemDrawer()->SetHighlightedBackColor( AKN_LAF_COLOR( 0 ) );    
+    }
+    
+void CFepLayoutAknChoiceList::UpdateControlContext()
+    {
+    
+        CFormattedCellListBoxItemDrawer* itemDrawer = iListBox->ItemDrawer();
+        CFormattedCellListBoxData* d = itemDrawer->FormattedCellData();        
+
+        TAknLayoutRect cellRect;
+        cellRect.LayoutRect( Rect(), 
+            AknLayoutScalable_Avkon::list_single_choice_list_pane(0) );
+        
+        TRect cell( cellRect.Rect() );
+
+        TRAP_IGNORE(iListBox->SetItemHeightL( cell.Height() ));
+
+        //d->SetTextSubCellL( 0, AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(0) );    
+    {
+    
+    const TAknTextLineLayout& aTextLayout =  
+                                       AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(0);
+            
+    TAknLayoutText t;
+    TInt subCell = 0;
+    t.LayoutText( iListBox->View()->ItemDrawer()->ItemCellSize(), aTextLayout );
+    CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData();
+    TRAP_IGNORE(d->SetSubCellSizeL( subCell, t.TextRect().Size() ));
+    TRAP_IGNORE(d->SetSubCellPositionL( subCell, t.TextRect().iTl ));
+    TRAP_IGNORE(d->SetSubCellFontL( subCell, t.Font() ));
+    TRAP_IGNORE(d->SetSubCellAlignmentL( subCell, 
+                                         AknLayoutUtils::TextAlignFromId( aTextLayout.iJ ) ));
+    TInt B = 22;//AknLayoutUtils::CorrectBaseline( iListBox->View()->ItemDrawer()->ItemCellSize().iHeight, aTextLayout.iB, aTextLayout.FontId() );
+    TRAP_IGNORE(d->SetSubCellBaselinePosL( subCell, B ));
+    }
+    
+    
+    {
+        TAknLayoutRect cellRect;
+        cellRect.LayoutRect( Rect(), 
+            AknLayoutScalable_Avkon::list_single_choice_list_pane(0) );
+            
+        iListBox->View()->ItemDrawer()->SetItemCellSize( cellRect.Rect().Size() );
+            
+        TRAP_IGNORE(iListBox->SetItemHeightL( cell.Height()*2 ));            
+    
+    }
+/*    TRect rectParent( Rect() );
+                      
+    TAknLayoutRect layoutRect;
+    TInt variety = 0;
+
+    // check if scrollbar-layout should be selected
+    if ( ScrollbarVisible() )
+        {
+        variety = 1;
+
+        iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn);            
+        
+        AknLayoutUtils::LayoutVerticalScrollBar( iListBox->ScrollBarFrame(), 
+            rectParent, 
+            AknLayoutScalable_Avkon::scroll_pane_cp23().LayoutLine()
+        );                    
+        }
+    else
+        {
+        iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff);
+        }
+        
+    layoutRect.LayoutRect( rectParent, 
+        AknLayoutScalable_Avkon::list_choice_list_pane( variety ).LayoutLine() );        
+    iListBox->SetRect( layoutRect.Rect() );
+            
+    TAknLayoutRect innerRect;
+    innerRect.LayoutRect( 
+        rectParent, 
+        AknLayoutScalable_Avkon::list_choice_list_pane(0).LayoutLine() 
+        );
+    
+    iBgContext->SetFrameRects(rectParent, innerRect.Rect());        */
+    }    
+// ---------------------------------------------------------------------------
+// CFepLayoutPopupWnd::SetRect
+// Set the pop up window's rect
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CFepLayoutAknChoiceList::SetRect(const TRect& aRect)
+    {    
+    
+    //Ensure that the top left of pop up window is always (0,0)
+    //iRect.Move(-aRect.iTl.iX,-aRect.iTl.iY);    
+    if(iRect == aRect)
+        return;
+    
+    iRect = aRect;  
+    /*      
+    if(iWndControl)
+        iWndControl->SetRect(iRect); 
+        */       
+    iListBox->SetRect( aRect);        
+    UpdateControlContext();        
+    if(iScrollbarCtrl)
+        {        
+        //set the rect of the scroll bar    
+        TRect rect = iScrollbarCtrl->WndControl()->Rect();
+        iScrollbarCtrl->SetRect(rect);
+        }
+    
+    }
+
+EXPORT_C TBool CFepLayoutAknChoiceList::ScrollbarVisible()
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutAknChoiceList::HandlePointerDownEventL
+// Handle pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//      
+EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerDownEventL(const TPoint& aPoint)
+    {
+    if(ScrollbarVisible())
+        {
+        if(iScrollbarCtrl->Rect().Contains(aPoint))
+            {
+            iScrollbarCaptured = ETrue;
+            return iScrollbarCtrl->HandlePointerDownEventL(aPoint);
+            }
+        }
+    CFepUiBaseCtrl::HandlePointerDownEventL(aPoint);
+    //CFepLayoutChoiceList::HandlePointerDownEventL(aPoint);
+    return this;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutAknChoiceList::HandlePointerUpEventL
+// Handle pointer up event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerUpEventL(
+                                                         const TPoint& aPoint)
+    {
+    if(iScrollbarCaptured)
+        {
+        iScrollbarCaptured = EFalse;
+        return iScrollbarCtrl->HandlePointerUpEventL(aPoint);
+        }
+    //CFepUiBaseCtrl::HandlePointerUpEventL(aPoint);
+    CFepLayoutChoiceList::HandlePointerUpEventL(aPoint);
+    return this;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutAknChoiceList::HandlePointerMoveEventL
+// Handle pointer move event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerMoveEventL(
+                                                        const TPoint& aPoint)
+    {
+    if(iScrollbarCaptured)
+        {
+        iScrollbarCtrl->HandlePointerMoveEventL(aPoint);
+        }
+    if(PointerDown()) //only handle move event after pointer down
+        CFepUiBaseCtrl::HandlePointerMoveEventL(aPoint);
+    //CFepLayoutChoiceList::HandlePointerMoveEventL(aPoint);
+    return this;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutAknChoiceList::AdjustColumnText
+// Adjust the txt which is added to column list.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+const TDesC& CFepLayoutAknChoiceList::AdjustColumnText(const TDesC& aTxt)
+    {
+    return aTxt;
+    /*_LIT(KLitTabulate,"\t");
+    if(aTxt.Find(KLitTabulate) >=0)
+        return aTxt;
+    if(KMaxTxtLen < aTxt.Length() + KLitTabulate().Length())
+        {
+        delete iTxtTransferBuf;
+        iTxtTransferBuf = 0;
+        iTxtTransferBuf = HBufC::NewL(aTxt.Length() + KLitTabulate().Length());        
+        }
+    TPtr ptr = iTxtTransferBuf->Des();    
+    ptr.Zero();
+    ptr.Append(KLitTabulate);
+    ptr.Append(aTxt);
+    return *iTxtTransferBuf;*/
+    }
+
+// CFepLayoutAknChoiceList::ReCalcLayout
+// Calculates the displaying rect.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutAknChoiceList::ReCalcLayout()
+    {
+    //do nothing
+    }
+    								       
+EXPORT_C TInt CFepLayoutAknChoiceList::MinItemWidthInPixels()
+    {
+    
+    TInt minWidth = 0;
+    for(TInt i = 0; i < ItemsCount(); ++i)
+        {
+        TInt itemWidth = iListBox->ItemDrawer()->ItemWidthInPixels (i);
+        minWidth = itemWidth > minWidth ? itemWidth : minWidth;
+        }
+        
+      
+    CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData();
+    TSize s1 = d->SubCellSize(0);
+    TSize s2 = d->SubCellSize(1);
+    return minWidth;	      
+    }
+
+//END OF FILE
+