textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbubblectrl.cpp
changeset 0 eb1f2e154e89
child 5 a47de9135b21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutbubblectrl.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,419 @@
+/*
+* 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 PeninputLayoutControl
+*
+*/
+
+
+#include <AknIconUtils.h>
+#include <AknsUtils.h>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h> 
+
+#include "peninputlayoutbubblectrl.h"
+#include "peninputlayout.h"
+#include <peninputpluginutils.h>
+
+const TInt KShrinkSize = 10;
+const TInt KDefaultTextColorIndex = EAknsCIQsnTextColorsCG60;
+// ======== MEMBER FUNCTIONS ========
+
+// Implementation of Class CBubbleCtrl
+
+// ---------------------------------------------------------------------------
+// CBubbleCtrl::NewL
+// Factory function
+// ---------------------------------------------------------------------------
+//
+               
+EXPORT_C CBubbleCtrl* CBubbleCtrl::NewL(const TRect& aRect,
+                               CFepUiLayout* aUiLayout,
+                               TInt aCtrlId)
+    {
+    CBubbleCtrl* ctrl = new (ELeave)CBubbleCtrl(aRect,aUiLayout,aCtrlId);
+    CleanupStack::PushL(ctrl);
+    ctrl->BaseConstructL();
+    CleanupStack::Pop(ctrl);
+    return ctrl;
+    }
+
+EXPORT_C CBubbleCtrl::CBubbleCtrl(const TRect& aRect,
+                         CFepUiLayout* aUiLayout,
+                         TInt aCtrlId)
+    :CFepUiBaseCtrl(aRect,aUiLayout,aCtrlId),
+     iForgroundBmp(NULL),
+     iForgroundBmpMask(NULL),
+     iShowing(EFalse),
+     iTextColorIndex(KDefaultTextColorIndex)
+    {
+    SetControlType(ECtrlButton);
+    SetHidenFlag(ETrue);
+    }
+        
+EXPORT_C CBubbleCtrl::~CBubbleCtrl()
+    {
+    if ( iText )
+        delete iText;
+    
+    if( iForgroundBmp )
+		{
+		delete iForgroundBmp;
+		iForgroundBmp = NULL;
+		}
+	if( iForgroundBmpMask )
+		{
+		delete iForgroundBmpMask;
+		iForgroundBmpMask = NULL;
+		}    
+    }
+
+EXPORT_C void CBubbleCtrl::SetBitmapParam(CFbsBitmap* aBmpId,
+                                 CFbsBitmap* aMaskBmpId,
+                                 TAknsItemID aBgSkinId)
+    {
+    if( iForgroundBmp )
+		{
+		delete iForgroundBmp;
+		iForgroundBmp = NULL;
+		}
+	if( iForgroundBmpMask )
+		{
+		delete iForgroundBmpMask;
+		iForgroundBmpMask = NULL;
+		}    
+		
+    iForgroundBmp = aBmpId;
+    iForgroundBmpMask = aMaskBmpId;
+    iBgSkinId = aBgSkinId;    
+    }
+
+EXPORT_C void CBubbleCtrl::Popup(const TRect& aRect)
+    {
+    SetRect(aRect);
+
+    if(iFreeze)
+        {
+        iShowing = ETrue;              
+        SetHidenFlag(EFalse);        
+        return;
+        }
+    if(!iShowing || aRect != Rect() || iNeedRedraw)
+        {
+        iShowing = ETrue;  
+        TRect rect = Rect();
+        SetRect(aRect);
+        SetHidenFlag(EFalse);        
+        BringToTop();
+        //redraw the control under bubble control
+        if(aRect != rect)        
+            RootControl()->ReDrawRect(rect);    
+
+        Draw();
+        
+        rect.BoundingRect(aRect);
+        UpdateAreaImmed(rect,ETrue);     
+        
+        iNeedRedraw = EFalse;
+        }
+    }
+EXPORT_C void CBubbleCtrl::SetBitmapParam(CFbsBitmap* aBmpId,
+                                 CFbsBitmap* aMaskBmpId,
+                                 TAknsItemID aFirstBmpId,
+		                         TAknsItemID aMiddleBmpId,
+		                         TAknsItemID aLastBmpId)
+    {
+    if( iForgroundBmp )
+		{
+		delete iForgroundBmp;
+		iForgroundBmp = NULL;
+		}
+	if( iForgroundBmpMask )
+		{
+		delete iForgroundBmpMask;
+		iForgroundBmpMask = NULL;
+		}    
+		
+    iForgroundBmp = aBmpId;
+    iForgroundBmpMask = aMaskBmpId;
+    iFirstBmpId = aFirstBmpId;
+    iMiddleBmpId =  aMiddleBmpId;
+    iLastBmpId = aLastBmpId;    
+    }
+
+EXPORT_C void CBubbleCtrl::Close()
+    {
+    TRect rect = Rect();
+    
+    iShowing = EFalse;  
+    
+    if( iFreeze )
+        {
+        if(iInvalidRect.IsEmpty() )
+            {
+            iInvalidRect = rect;
+            }
+        else
+            {
+            iInvalidRect.BoundingRect( rect );
+            }            
+        }
+    else
+        {
+        Clear();
+        SetHidenFlag(ETrue);    
+        BringToBack();
+
+        RootControl()->ReDrawRect(rect);
+        UpdateAreaImmed(rect); 
+        }
+    }
+
+EXPORT_C void CBubbleCtrl::Hide(TBool aFlag)
+    {
+    if(aFlag) //hide bubble
+        {
+        Close();            
+
+        }
+    else
+        {
+        Popup(Rect());        
+        }
+    }
+
+
+EXPORT_C TBool CBubbleCtrl::IsShowing()
+    {
+    return iShowing;   
+    }
+            
+EXPORT_C void CBubbleCtrl::Draw()
+    {
+    if(!AbleToDraw() || iFreeze ) //|| !iShowing )
+	    {
+	    return;
+	    }
+    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    
+    //mask bitmaps
+  	DrawOpaqueMaskBackground();  
+  	
+    TRect rect = Rect();        
+    TRect innerRect = rect;
+    
+    if ( ( iLeftDiff == 0 ) && ( iTopDiff == 0 )
+         && ( iRightDiff == 0 ) && ( iBottomDiff == 0 ) )
+        {
+        innerRect.Shrink( KShrinkSize, 0 );
+        }
+    else
+        {
+        innerRect.iTl.iX = innerRect.iTl.iX + iLeftDiff;
+        innerRect.iTl.iY = innerRect.iTl.iY + iTopDiff;
+        innerRect.iBr.iX = innerRect.iBr.iX - iRightDiff;
+        innerRect.iBr.iY = innerRect.iBr.iY - iBottomDiff;
+        
+        }
+    
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );                
+    //gc->Clear(rect);
+    		
+	// Draw background
+	if ( iBgSkinId.iMajor )
+	    {
+    	AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), 
+                         *gc,
+                         rect,
+                         innerRect,
+                         iBgSkinId,
+                         KAknsIIDDefault ); 	        
+	    }
+	else if( iFirstBmpId.iMajor && iMiddleBmpId.iMajor && iLastBmpId.iMajor )
+		{
+		AknPenInputDrawUtils::Draw3PiecesFrame( AknsUtils::SkinInstance(),
+						 *gc,
+						 rect,
+						 innerRect,
+						 iFirstBmpId,
+						 iMiddleBmpId,
+						 iLastBmpId);	
+		}
+	else
+	    {
+	    DrawBackground();    
+	    }
+                     
+    if ( iForgroundBmp )
+        {
+        if( iForgroundBmp->SizeInPixels() != innerRect.Size() )
+        	{
+        	AknIconUtils::SetSize( iForgroundBmp, innerRect.Size(), EAspectRatioNotPreserved );
+        	}
+        	
+    	TRect srcRect( TPoint( 0, 0 ), iForgroundBmp->SizeInPixels() );
+    	
+    	if( iForgroundBmpMask )
+    		{
+            if( iForgroundBmpMask->SizeInPixels() != innerRect.Size() )
+            	{
+            	AknIconUtils::SetSize( iForgroundBmpMask, innerRect.Size(), EAspectRatioNotPreserved);
+            	}
+            	        
+
+    		gc->BitBltMasked( innerRect.iTl, 
+    						  iForgroundBmp, 
+    						  srcRect,
+    						  iForgroundBmpMask,
+    						  EFalse);
+    		}
+        else
+            {
+    		gc->BitBlt( innerRect.iTl,
+    					iForgroundBmp,
+    					srcRect );
+            }            
+        }
+        
+    if ( iText )
+        {
+        gc->SetBrushStyle( CGraphicsContext::ENullBrush );
+        TAknLayoutText textLayout;
+        textLayout.LayoutText(Rect(), iTextFormat);
+        TRgb color( KRgbBlack );  // sane default for nonskinned case
+	    if ( AknsUtils::AvkonSkinEnabled() )
+	        {
+	        AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+	                               color, KAknsIIDQsnTextColors, iTextColorIndex );
+	        }
+	     textLayout.DrawText(*gc, *iText, EFalse, color);
+        }
+    }
+           	
+EXPORT_C void CBubbleCtrl::SetTextFormat(TAknTextLineLayout aTextFormat)
+    {
+    iTextFormat = aTextFormat;                
+    }
+    
+EXPORT_C void CBubbleCtrl::SetTextL(const TDesC& aText)
+    {
+    delete iText;
+    iText = NULL;
+    iText = aText.AllocL();           
+    iNeedRedraw = ETrue;
+    }
+
+EXPORT_C void CBubbleCtrl::SetFrameDiff(TInt aLeftDiff, TInt aTopDiff,
+                                        TInt aRightDiff,TInt aBottomDiff)
+    {
+    iLeftDiff = aLeftDiff;
+    iTopDiff  = aTopDiff;
+    iRightDiff = aRightDiff;
+    iBottomDiff = aBottomDiff;      
+    }
+
+void CBubbleCtrl::Freeze()
+    {
+    iFreeze = ETrue;
+    iInvalidRect = TRect();
+    }
+
+void CBubbleCtrl::UnFreeze( TBool aUpdate )
+    {
+    iFreeze = EFalse;
+    if( aUpdate )
+        {
+        if( !iInvalidRect.IsEmpty() )
+            {
+            RootControl()->ReDrawRect( iInvalidRect );
+            }
+        Draw();
+        
+        if(iInvalidRect.IsEmpty() )
+            {
+            iInvalidRect = Rect();
+            }
+        else
+            {
+            iInvalidRect.BoundingRect( Rect() );
+            }      
+                  
+        UpdateArea(iInvalidRect); 
+        }
+    
+    iInvalidRect = TRect();
+    }
+
+// ---------------------------------------------------------------------------
+// CTooltipBubbleCtrl::NewL
+// factory function
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTooltipBubbleCtrl* CTooltipBubbleCtrl::NewL( const TRect& aRect, 
+		                                            CFepUiLayout* aUiLayout, 
+		                                            TInt aCtrlId )
+    {
+    CTooltipBubbleCtrl* self = new (ELeave) CTooltipBubbleCtrl( aRect, 
+    		                                                    aUiLayout, 
+    		                                                    aCtrlId );
+    CleanupStack::PushL( self );
+    self->BaseConstructL();
+    CleanupStack::Pop( self );
+    return self;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CTooltipBubbleCtrl::CTooltipBubbleCtrl
+// C++ default constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTooltipBubbleCtrl::CTooltipBubbleCtrl( const TRect& aRect,
+		                                      CFepUiLayout* aUiLayout, 
+		                                      TInt aCtrlId )
+    :CBubbleCtrl( aRect, aUiLayout, aCtrlId )
+    {
+#ifdef RD_TACTILE_FEEDBACK
+    if(IsKindOfControl(ECtrlTactileFeedback) && !Hiden() && UiLayout())
+        {
+		SetTactileFeedbackType(ETouchFeedbackSensitiveInput);
+        UiLayout()->RegisterFeedbackArea(reinterpret_cast<TInt>(this),aRect,ETouchFeedbackSensitiveInput);
+        }  
+#endif // RD_TACTILE_FEEDBACK 
+    }
+
+// ---------------------------------------------------------------------------
+// CTooltipBubbleCtrl::~CTooltipBubbleCtrl
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CTooltipBubbleCtrl::~CTooltipBubbleCtrl()
+    {  
+    }
+                 
+
+// ---------------------------------------------------------------------------
+// Handle pointer up event
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl* CTooltipBubbleCtrl::HandlePointerUpEventL
+                                                  ( const TPoint& /*aPoint*/ )
+	{
+	ReportEvent( EEventTooltipPointerUp );
+	return this;
+	}
+
+//end of implementation of class CVirtualKeyboard