webengine/wmlengine/src/xhtml/src/Image/ImageMapPopup.cpp
changeset 0 dd21522fd290
child 42 d39add9822e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/xhtml/src/Image/ImageMapPopup.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,352 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*      View images popup box
+*      
+*
+*/
+
+
+#include "ImageMapPopup.h"
+
+#include <e32math.h>
+#include <apmstd.h>
+#include <bitdev.h>
+#include <gulicon.h>
+#include <akniconarray.h>
+
+#include <avkon.mbg>
+#include <avkon.rsg>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KImageMapBitmapMaxWidth = 43;
+const TInt KImageMapBitmapMaxHeight = 32;
+const TInt KImageMapPopupWidth = 176;
+const TInt KImageMapPopupHeight = 144;
+const TInt KImageMapPopupWidth2 = 20;
+const TInt KImageMapMaxAreaNum = 6;
+_LIT( KImageMapAltTextTab, "\t" );
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+   
+// ============================= LOCAL FUNCTIONS ===============================
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CImageMapListBox::CImageMapListBox
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CImageMapListBox::CImageMapListBox() : CAknDoubleLargeGraphicPopupMenuStyleListBox()
+  {
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapListBox::~CImageMapListBox
+// destructor.
+// -----------------------------------------------------------------------------
+//
+CImageMapListBox::~CImageMapListBox()
+  {
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapListBox::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CImageMapListBox::ConstructL( CCoeControl& aParent, CArrayPtrFlat<CFbsBitmap>& aBitmapList, 
+                                   CArrayPtrFlat<HBufC>& aAltTextList )
+  {
+  // call base class
+  CAknDoubleLargeGraphicPopupMenuStyleListBox::ConstructL( &aParent, 0 );
+  // create icon array which shows up in the left column
+  CArrayPtrFlat<CGulIcon>* iconList = new( ELeave) CAknIconArray( 5 );       
+  CleanupStack::PushL( iconList );
+
+  CDesCArray* itemList = STATIC_CAST( CDesCArray*, Model()->ItemTextArray() );     
+
+  // create icons out of bitmaps
+  HBufC* tempBuf;
+  TSize bitmapSize;
+  CGulIcon* icon;
+  CFbsBitmap* bitmap;
+
+  TInt bitmapCount( aBitmapList.Count() );
+  for( TInt i = 0; i < bitmapCount; i++ )
+    {
+    // create icons
+    bitmap = aBitmapList.At( i );
+    bitmapSize = bitmap->SizeInPixels();
+    // check if the bitmap needs to be squeezed
+    if( bitmapSize.iWidth > KImageMapBitmapMaxWidth || bitmapSize.iHeight > KImageMapBitmapMaxHeight )
+      {
+      CFbsBitmap* modifiedBitmap = new( ELeave )CFbsBitmap();
+      CleanupStack::PushL( modifiedBitmap );
+
+      User::LeaveIfError( modifiedBitmap->Create( TSize( KImageMapBitmapMaxWidth, KImageMapBitmapMaxHeight ), EColor4K ) );
+      // create bitmap device
+      CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( modifiedBitmap );
+      CleanupStack::PushL( bitmapDevice );
+
+      // create graphics context for bitmap device
+      CGraphicsContext* bitmapContext;
+      User::LeaveIfError( bitmapDevice->CreateContext( bitmapContext ) );
+      CleanupStack::PushL( bitmapContext );
+
+      // squeze it
+      TSize targetSize = Fit( bitmapSize, modifiedBitmap->SizeInPixels() );
+
+      // copy bitmap to modified bitmap
+      bitmapContext->DrawBitmap( TRect( TPoint( 0,0 ), targetSize ), bitmap, TRect( TPoint( 0,0 ), bitmapSize ) );
+
+      CleanupStack::PopAndDestroy( 2 );   // bitmapContext, bitmapDevice
+      
+      // replace bitmap in the array
+      delete  bitmap;
+      aBitmapList.At( i ) = modifiedBitmap;
+      // bitmap array takes ownership
+      CleanupStack::Pop(); // modifiedBitmap
+
+      bitmap = modifiedBitmap;
+      }
+    // create icon. CGulIcon takes bitmap ownership
+    icon = CGulIcon::NewL( bitmap, bitmap );
+    // remove bitmap array ownership
+    aBitmapList.At( i ) = NULL;
+    CleanupStack::PushL( icon );
+    
+    // iconlist takes icon ownership
+    iconList->AppendL( icon );
+    CleanupStack::Pop();    // icon
+
+    // add alt text too    
+    // alt text build up as follows
+    // 0/talt text1
+    // 1/talt text2
+    // 2/talt text3
+    tempBuf = HBufC::NewLC( 
+      // max num is 999999
+      KImageMapMaxAreaNum +
+      aAltTextList.At( i )->Des().Length() + 
+      KImageMapAltTextTab().Length() );
+
+    tempBuf->Des().AppendNum( i );
+    tempBuf->Des().Append( KImageMapAltTextTab );
+		tempBuf->Des().Append( aAltTextList.At( i )->Des() );
+    itemList->AppendL( tempBuf->Des() );
+    CleanupStack::PopAndDestroy(); // tempBuf   
+    }
+  // pass iconList ownership
+  ItemDrawer()->ColumnData()->SetIconArray( iconList );
+  CleanupStack::Pop(); // iconList 
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapListBox::Fit
+// Checks if the source bitmap can fit into the target bitmap
+// -----------------------------------------------------------------------------
+//
+TSize CImageMapListBox::Fit( const TSize& aSource, const TSize& aTarget )
+  {
+  TSize result1( aTarget );
+  TSize result2( aTarget );
+
+  TInt dA( aTarget.iWidth - aSource.iWidth );
+  TInt dB( aTarget.iHeight - aSource.iHeight );
+  //lint -e{790} Suspicious truncation, integral to float)
+  TReal tmp = aSource.iHeight + ((TReal)(aSource.iHeight * dA) / (TReal)aSource.iWidth);
+  TReal res;
+  Math::Round( res, tmp, 0);
+  result1.iHeight = (TInt)res;
+  //lint -e{790} Suspicious truncation, integral to float)
+  tmp = aSource.iWidth + ((TReal)(aSource.iWidth * dB) / (TReal)aSource.iHeight);
+  Math::Round( res, tmp, 0);
+  result2.iWidth = (TInt)res;
+
+  TSize result;
+  if(result1.iWidth <= aTarget.iWidth && result1.iHeight <= aTarget.iHeight)
+    {
+    result = result1;
+    }
+  else
+    {
+    result = result2;
+    }
+  return result;
+  }
+
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::CImageMapPopup
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CImageMapPopup::CImageMapPopup()
+  {
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::~CImageMapPopup
+// destructor.
+// -----------------------------------------------------------------------------
+//
+CImageMapPopup::~CImageMapPopup()
+  {
+  delete iSkinContext;
+  // delete lists.
+  if(iBitmapList)
+    {
+      iBitmapList->ResetAndDestroy();
+    }
+  delete iBitmapList;
+  // iAltTextList->ResetAndDestroy();
+  // delete iAltTextList;
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CImageMapPopup::ConstructL( CEikListBox *aListBox, TInt aCbaResource,
+                                 AknPopupLayouts::TAknPopupLayouts aType )
+  {
+  // call base class construct
+  CAknPopupList::ConstructL( aListBox, aCbaResource, aType );
+  
+  TAknsItemID tileIID = KAknsIIDSkinBmpListPaneNarrowA;
+  // these values should come as consts (from LAF).
+  AknLayoutUtils::SAknLayoutRect tile = { 0, 0, 0, ELayoutEmpty, ELayoutEmpty, KImageMapPopupWidth2, KImageMapPopupHeight };
+	AknLayoutUtils::SAknLayoutRect bg = { 0, 0, 0, ELayoutEmpty, ELayoutEmpty, KImageMapPopupWidth, KImageMapPopupHeight };
+
+  if( AknLayoutUtils::LayoutMirrored( ) )
+    {
+    tile.iL = ELayoutEmpty;
+    tile.iR = 0;
+    }
+  
+  // these values should come as consts (from LAF)
+  TRect clientRect( 0, 0, KImageMapPopupWidth, KImageMapPopupHeight );
+  TAknLayoutRect tileRect;
+  TAknLayoutRect bgRect;
+  
+  tileRect.LayoutRect( clientRect, tile );	
+  bgRect.LayoutRect( clientRect, bg );
+  
+  iSkinContext = CAknsListBoxBackgroundControlContext::NewL(
+    KAknsIIDSkinBmpMainPaneUsual, 
+    bgRect.Rect(), 
+    EFalse, tileIID,
+    tileRect.Rect() ); 
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::CreateAndRunL
+// Executes the popup dialog
+// -----------------------------------------------------------------------------
+//
+TInt CImageMapPopup::CreateAndRunL( CArrayPtrFlat<CFbsBitmap>& aBitmapList, CArrayPtrFlat<HBufC>& aAltTextList )
+  {
+  TInt selectedItem( KErrNotFound );
+  // construct dialog
+  CImageMapPopup* self = new( ELeave )CImageMapPopup();
+  CleanupStack::PushL( self );
+  // take lists ownership
+  self->iBitmapList = &aBitmapList;
+  self->iAltTextList = &aAltTextList;
+                       
+  // construct image listboxs
+  CImageMapListBox* listBox = new( ELeave )CImageMapListBox();
+  CleanupStack::PushL( listBox );
+
+  // construct dialog
+  self->ConstructL( listBox, R_AVKON_SOFTKEYS_OK_BACK__OK, AknPopupLayouts::EMenuDoubleLargeGraphicWindow );
+  
+  // construct listbox
+  listBox->ConstructL( *self, aBitmapList, aAltTextList );
+  listBox->CreateScrollBarFrameL( ETrue );
+  listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+  listBox->SetObserver( self );
+
+  HBufC* title = HBufC::NewLC( 200 ); // must come from resource CEikonEnv::Static()->AllocReadResourceL(  );
+  title->Des().Copy( _L("Image map areas") );
+  self->SetTitleL( *title );
+  CleanupStack::PopAndDestroy(); // title
+  
+  // launch dialog
+  if( self->ExecuteLD() )
+    {
+    selectedItem = listBox->CurrentItemIndex();
+    }
+  CleanupStack::PopAndDestroy(); // listbox
+  CleanupStack::Pop(); // self
+  return selectedItem;
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::HandleListBoxEventL
+// 
+// -----------------------------------------------------------------------------
+//
+void CImageMapPopup::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+  {
+  if(aEventType == MEikListBoxObserver::EEventItemDoubleClicked || 
+     aEventType == MEikListBoxObserver::EEventEnterKeyPressed)
+    {
+    AttemptExitL( ETrue );
+    }
+  return;
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::HandleControlEventL
+// 
+// -----------------------------------------------------------------------------
+//
+void CImageMapPopup::HandleControlEventL( CCoeControl* /*aControl*/, TCoeEvent /*aEventType*/ )
+  {
+  // overwrite base implementation as it does change CBAs to Mark and Cancel
+  }
+
+// -----------------------------------------------------------------------------
+// CImageMapPopup::MopSupplyObject
+// 
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CImageMapPopup::MopSupplyObject( TTypeUid aId )
+  {
+  if( aId.iUid == MAknsControlContext::ETypeId /*&& iUseSkinContext*/ )
+    {
+    return MAknsControlContext::SupplyMopObject( aId, iSkinContext );
+    }
+  return SupplyMopObject( aId, (MAknEditingStateIndicator*)NULL );
+  }
+
+// End of File