textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcandidatewnd.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcandidatewnd.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,636 @@
+/*
+* Copyright (c) 2005-2006 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 base control
+*
+*/
+
+
+#include "peninputlayouttimer.h"
+#include "peninputlayoutcandidatewnd.h"
+#include "peninputlayout.h"
+
+const TInt KDefaultBorder = 1 ;
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::CCandidateWnd
+// C++ default constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCandidateWnd::CCandidateWnd(const TRect& aRect,TInt aCandidateRectNum,
+                              CFepUiLayout* aUiLayout,TInt aCtrlId,
+                              TTimeIntervalMicroSeconds32 aHideTimer)
+                              :CFepUiBaseCtrl(aRect,aUiLayout,aCtrlId),
+                              iSelection(-1),
+                              iDelay(aHideTimer),
+                              iBaseline(-1),
+                              iFontOwnership(EFalse)
+    {
+    SetControlType(ECtrlCandidateList);
+
+    if(iDelay.Int()!=0)
+        iAutoHide=ETrue;
+    else
+        iAutoHide=EFalse;
+    
+    if(aCandidateRectNum <=0)
+        iCandidateRectNum = 1;
+    else
+        iCandidateRectNum = aCandidateRectNum;
+    
+    iFontSpec.iHeight = 0;
+    //candidate window is opaque
+    SetMaskBkCol(KRgbBlack);
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::~CCandidateWnd
+// Destructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCandidateWnd::~CCandidateWnd()
+    {
+    //free the candidate buffer
+    for(TInt i = 0; i < iCandidateList.Count(); i++)
+        {
+        HBufC* buf = iCandidateList[i];
+        delete buf;
+        }
+    iCandidateList.Close();
+    iCandidateRectList.Close();    
+    iCandidateTextRectList.Close();
+    delete iHideTimer;
+
+    if(iFontOwnership && iFont)
+        {
+        BitmapDevice()->ReleaseFont(iFont);
+        iFont = NULL;    
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::NewL
+// factory function
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCandidateWnd* CCandidateWnd::NewL(const TRect& aRect,TInt aCandidateRectNum,
+                          CFepUiLayout* aUiLayout,TInt aCtrlId,
+                          TTimeIntervalMicroSeconds32 aHideTime)                            
+    {
+    CCandidateWnd* wnd=new (ELeave)CCandidateWnd(aRect,aCandidateRectNum,
+                                                aUiLayout,aCtrlId,aHideTime);
+    CleanupStack::PushL(wnd);
+    wnd->ConstructL ();
+    CleanupStack::Pop(wnd);
+    return wnd;
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::GetCandidateL
+// Set candidate data
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C const TDesC& CCandidateWnd::GetSelCandidate()
+    {
+    if(iSelection >= 0 && iSelection < iCandidateList.Count()) 
+        {
+        return *(iCandidateList[iSelection]);
+        }
+    return KNullDesC();
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetAutoHideDelay
+// Set auto hide timer delay
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::SetAutoHideDelay(TTimeIntervalMicroSeconds32 aDelay)
+    {
+    iDelay = aDelay;
+    if(iDelay.Int()!=0)
+        {               
+        iAutoHide=ETrue;
+        iHideTimer->SetTimer(iDelay);
+        }
+    else
+        {
+        iAutoHide=EFalse;
+        iHideTimer->Cancel();
+        }
+        
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetCandidateNumL
+// Set the number of candidates in one line
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::SetCandidateNumL(TInt aNumInLine)
+    {
+    if(aNumInLine <=0)
+        iCandidateRectNum = 1;
+    else
+        iCandidateRectNum = aNumInLine;
+    
+    iCandidateRectList.Reset();
+    iCandidateTextRectList.Reset();
+    TRect rect(Rect());
+    
+    TInt w = (rect.Width() - KDefaultBorder * (1+iCandidateRectNum) ) 
+                                            / iCandidateRectNum;
+    for(TInt i=0;i<iCandidateRectNum;i++)
+        {
+        rect.iBr.iX=rect.iTl.iX+w;
+        iCandidateRectList.AppendL(rect);
+        iCandidateTextRectList.AppendL(rect);
+        rect.iTl.iX=rect.iBr.iX+1; 
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetCandidateNumL
+// Set the number of candidates in one line
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::SetCandidateNumL(TInt aNumInLine,
+							const TSize& aCellRectSize, const TRect& aTextRect)
+    {
+    if(aNumInLine <= 0)
+        iCandidateRectNum = 1;
+    else
+        iCandidateRectNum = aNumInLine;
+    
+    iCandidateRectList.Reset();
+	iCandidateTextRectList.Reset();    
+	TRect rect(Rect());
+	TRect textRect; //for text drawing
+	
+	TPoint offset = aTextRect.iTl;
+    for(TInt i = 0;i < iCandidateRectNum;i++)
+        {
+        rect.iBr.iX = rect.iTl.iX + aCellRectSize.iWidth;
+        iCandidateRectList.AppendL(rect);
+        textRect.iTl = rect.iTl + offset;
+        textRect.iBr.iX = textRect.iTl.iX + aTextRect.Width();
+        textRect.iBr.iY = textRect.iTl.iY + aTextRect.Height();
+        iCandidateTextRectList.AppendL(textRect);
+
+        rect.iTl.iX = rect.iBr.iX + 1; 
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetFont
+// Set candidate window font
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CCandidateWnd::SetFont(const TFontSpec& aFontSpec)
+    {
+    
+    iFontSpec = aFontSpec;
+    if(iFontOwnership && iFont) //release the owned font
+        {
+        BitmapDevice()->ReleaseFont(iFont);
+        iFont = NULL;    
+        }    
+    if(BitmapDevice())
+        {
+        if (KErrNone != BitmapDevice()->GetNearestFontInPixels(iFont,iFontSpec))
+            iFont = NULL;            
+        }      
+    iFontOwnership = ETrue;
+    }        
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetFont
+// Set candidate window font
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CCandidateWnd::SetFont(const CFont* aFont)
+    {
+    if(iFontOwnership && iFont)
+        {
+        BitmapDevice()->ReleaseFont(iFont);
+        iFont = NULL;    
+        }    
+    iFont = const_cast<CFont*>(aFont);
+    if(iFont)
+        iFontSpec = iFont->FontSpecInTwips();
+    iFontOwnership = EFalse;
+    }        
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::Draw
+// Draw control
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::Draw()
+    {
+    //do nothing if not ready or hiden or no candidate while in auto hide mode
+    if(!AbleToDraw() || (iAutoHide && iCandidateList.Count() <= 0))
+        return;
+        
+    DrawOpaqueMaskBackground();
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    TRect wndRect = Rect();
+
+    // ----- draw on bitmaps -----
+    DrawBackground();
+    //draw two lines: the up left and up top line    
+    gc->DrawLine(wndRect.iTl,TPoint(wndRect.iTl.iX,wndRect.iBr.iY));
+    gc->DrawLine(wndRect.iTl,TPoint(wndRect.iBr.iX,wndRect.iTl.iY));    
+
+    
+        
+    //draw candidate text        
+    if(iFont)
+        BitGc()->UseFont(iFont);
+    
+    TBuf<1> buf;
+
+    BitGc()->SetBrushStyle( CGraphicsContext::ENullBrush );
+    
+//    __ASSERT_DEBUG(iCandidateRectList.Count(),EUiLayoutCandiateNumIsNotSet);
+    
+    TRect rect=iCandidateRectList[0];
+    BitGc()->DrawLine(TPoint(rect.iTl.iX,rect.iTl.iY),
+                                    TPoint(rect.iTl.iX,rect.iBr.iY));
+
+    TInt baseLine = iBaseline > 0 ? iBaseline : 
+                           iCandidateTextRectList[0].Height()*KDEFAULTBASELINERATIO;
+                                         
+    for(TInt i = 0 ; i < iCandidateRectNum ;i++) 
+        {
+        //draw bottom line and right line
+        TPoint bottom_from(iCandidateRectList[i].iTl.iX,
+                                            iCandidateRectList[i].iBr.iY);
+        TPoint bottom_to(iCandidateRectList[i].iBr.iX,
+                                            iCandidateRectList[i].iBr.iY);
+        BitGc()->DrawLine(bottom_from,bottom_to);
+                                    
+        TPoint right_from(iCandidateRectList[i].iBr.iX,
+                                            iCandidateRectList[i].iTl.iY);
+        TPoint right_to(iCandidateRectList[i].iBr.iX,
+                                            iCandidateRectList[i].iBr.iY);
+        BitGc()->DrawLine(right_from,right_to);
+
+        if(i < iCandidateList.Count() && iFont)
+            {
+            HBufC* data=iCandidateList[i];    
+
+            BitGc()->DrawText(*data,iCandidateTextRectList[i],baseLine,
+                                                CGraphicsContext::ECenter );
+            }             
+        }            
+    if(iFont)
+        BitGc()->DiscardFont();        
+    }
+
+    
+// ---------------------------------------------------------------------------
+// CCandidateWnd::Move
+// Move the candidate window
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//            
+EXPORT_C void CCandidateWnd::Move(const TPoint& aOffset)
+    {
+    CFepUiBaseCtrl::Move(aOffset);
+    //Recal candidate rect after moving
+
+    for(TInt i = 0 ; i < iCandidateTextRectList.Count();i++)
+        {
+        iCandidateTextRectList[i].Move(aOffset);
+        iCandidateRectList[i].Move(aOffset);
+        }
+
+    }
+    
+// ---------------------------------------------------------------------------
+// CCandidateWnd::DrawIndication
+// Draw selection effect
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+void CCandidateWnd::DrawIndication(TInt aSelection,TBool aPressedFlag)
+    {
+    if(aSelection < 0)
+        return;
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());        
+    
+    TRect rect = iCandidateTextRectList[aSelection];        
+
+
+    gc->Activate( BitmapDevice() );
+    const TUint8 blackMap = 128;
+    const TUint8 whiteMap = 240;
+    if(aPressedFlag) //need press effect
+        {        
+        gc->SetFadingParameters(blackMap, whiteMap);
+        gc->SetFaded(ETrue);
+        }
+    else
+        gc->SetFaded(EFalse);
+    
+    TPoint bmpPos = rect.iTl;
+    gc->SetPenColor( PenColor() );    
+    if(BackgroundBmp())
+        gc->BitBlt(bmpPos, BackgroundBmp(), rect);
+    else
+        {
+        gc->SetBrushColor( BkColor());
+        gc->SetBrushStyle( CGraphicsContext::ESolidBrush );        
+        gc->SetPenColor(BkColor());
+        gc->SetPenStyle(CGraphicsContext::ESolidPen);
+        gc->DrawRect(rect);
+        }
+
+    gc->UseFont(iFont);
+    
+    HBufC* data=iCandidateList[aSelection];    
+    gc->SetBrushStyle( CGraphicsContext::ENullBrush );
+    
+    TInt baseLine = iBaseline > 0 ? iBaseline : 
+                           iCandidateTextRectList[0].Height()*KDEFAULTBASELINERATIO;
+    gc->SetPenColor( PenColor());
+    gc->SetPenStyle(CGraphicsContext::ESolidPen);
+    gc->DrawText(*data,rect,baseLine,CGraphicsContext::ECenter );
+
+    gc->DiscardFont();    
+
+    UpdateArea(rect, EFalse);
+    gc->SetFaded(EFalse);    
+    }
+    
+// ---------------------------------------------------------------------------
+// CCandidateWnd::HandlePointerDownEventL
+// handle pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CFepUiBaseCtrl* CCandidateWnd::HandlePointerDownEventL( const TPoint& aPt)
+    {    
+    //call base to set state
+    CFepUiBaseCtrl::HandlePointerDownEventL(aPt);    
+    for(TInt i=0;i < iCandidateRectList.Count() && i<iCandidateList.Count();i++)
+        {        
+        if(iCandidateRectList[i].Contains(aPt))
+            {
+            if(iHideTimer)
+                iHideTimer->Cancel();
+
+            //selected
+            iSelection = i;           
+            DrawIndication(i);
+            iPointerLeft = EFalse;
+            iPointerLeftCandidate = EFalse;
+            return this;
+            }
+        }
+    
+    iSelection = -1; //no selection
+    return this;
+    }
+// ---------------------------------------------------------------------------
+// CCandidateWnd::HandlePointerMoveEventL
+// handle pointer move event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CFepUiBaseCtrl* CCandidateWnd::HandlePointerMoveEventL( const TPoint& aPoint)
+    {    
+    for(TInt i=0;i < iCandidateRectList.Count() && i<iCandidateList.Count();i++)
+        {        
+        if(iCandidateRectList[i].Contains(aPoint))
+            {
+            //selected
+            if(i != iSelection)
+                {
+                if(!iPointerLeftCandidate)
+                    {                    
+                    DrawIndication(iSelection,EFalse);
+                    iPointerLeftCandidate = ETrue; //pointer move to another candidate
+                    }
+                }
+            else
+                {
+                if(iPointerLeftCandidate)
+                    {                    
+                    DrawIndication(iSelection,ETrue);
+                    iPointerLeftCandidate = EFalse;
+                    }
+                }            
+            return this;
+            }
+        }    
+    return this;    
+    }
+// ---------------------------------------------------------------------------
+// CCandidateWnd::HanldePointerUpEventL
+// handle pointer up event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CFepUiBaseCtrl* CCandidateWnd::HandlePointerUpEventL( const TPoint& aPoint)
+    {      
+    TBool bContinue = ETrue;       
+    for(TInt i=0;i < iCandidateRectList.Count() && i < iCandidateList.Count()
+                 && bContinue;i++)
+        {        
+        if(iCandidateRectList[i].Contains(aPoint))
+            {
+            if(iHideTimer)
+                iHideTimer->Cancel();
+
+            //selected
+            if(iSelection != i)
+                {
+                //cancel the selection if pen down and up in different place
+                DrawIndication(iSelection,EFalse);
+                iSelection = -1; 
+                iPointerLeftCandidate = EFalse;
+                iPointerLeft = EFalse;
+                bContinue = EFalse;
+                
+                }
+             else
+                {
+                if(iCandidateList.Count()>0)
+                    {
+                    HBufC* data=iCandidateList[i];
+                    if(data->Length() > 0)
+                        {
+                        //report to observer
+                        ReportEvent(EEventCandidateSelected,*data);
+                        }
+                    }
+                DrawIndication(iSelection,EFalse);
+
+                bContinue = EFalse;
+                }
+            }
+        }
+    //reset the timer
+    if(iHideTimer)
+        iHideTimer->SetTimer(iDelay);
+        
+    return this;
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::SetCandidateL
+// Set candidate data
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::SetCandidateL(const RPointerArray<HBufC>& aCandidateData)
+    {
+    iCandidateList.ResetAndDestroy();
+
+    if(aCandidateData.Count())
+        {
+        for(TInt i = 0; i < aCandidateData.Count(); i++)
+            {
+            HBufC* data = aCandidateData[i]->AllocL();
+            CleanupStack::PushL(data);
+            iCandidateList.AppendL(data);
+            CleanupStack::Pop(data);
+            }
+        Hide(EFalse);
+        Draw();
+        //report event, so as hwr window may redraw the stroke in case of that
+        // hwr window is overlapped with candidate window
+        RootControl()->HandleControlEvent(EEventRegionUpdated,this,KNullDesC);       
+        
+        iSelection = 0;    
+        }
+    else
+        iSelection = -1;    
+    
+    UpdateArea(Rect(),EFalse);
+
+    if(iAutoHide && iCandidateList.Count()>0)
+        iHideTimer->SetTimer(iDelay);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::HandleTimerOut
+// handle hide timer event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CCandidateWnd::HandleTimerOut(TInt /*aTimeType*/)
+    {
+    Hide(ETrue);
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CCandidateWnd::ConstructL
+// Second phrase constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCandidateWnd::ConstructL()
+    {
+    BaseConstructL();
+    if(BitmapDevice() && iFontSpec.iHeight)
+        {        
+        if (KErrNone != BitmapDevice()->GetNearestFontInPixels(iFont,iFontSpec))
+            iFont = NULL;
+        }
+    
+    SetCandidateNumL(iCandidateRectNum);
+    if(iAutoHide)
+        {
+        iHideTimer = CLayoutTimer::NewL(this,CLayoutTimer::ECandidateClearTimer);
+        }               
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::HandlePointerLeave
+// Handle pointer leave event
+// ---------------------------------------------------------------------------
+//           
+EXPORT_C void CCandidateWnd::HandlePointerLeave(const TPoint& aPt)
+    {
+    DrawIndication(iSelection,EFalse);
+    iPointerLeftCandidate = ETrue; //pointer left the cell.
+    CFepUiBaseCtrl::HandlePointerLeave(aPt);
+    }
+
+// ---------------------------------------------------------------------------
+// CCandidateWnd::OnLayoutDraggingStart
+// Response to layout dragging start event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C void CCandidateWnd::OnLayoutDraggingStart()
+    {
+    if(iHideTimer)
+        iHideTimer->Cancel();
+    }
+    
+// ---------------------------------------------------------------------------
+// CCandidateWnd::OnLayoutDraggingEnd
+// Response to layout dragging end event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C void CCandidateWnd::OnLayoutDraggingEnd()
+    {
+    }    
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnDeActivate
+// Response to layout de activation event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C void CCandidateWnd::OnDeActivate()
+    {    
+    CFepUiBaseCtrl::OnDeActivate();
+    if(iAutoHide)
+        iHideTimer->Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// CFepUiBaseCtrl::OnActivate
+// Response to layout activation event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C void CCandidateWnd::OnActivate()
+    {
+    //do nothing    
+    CFepUiBaseCtrl::OnActivate();
+    if(iAutoHide)
+        iHideTimer->SetTimer(iDelay);    
+    }
+    
+//end of file
+