webengine/wmlengine/src/fbox/src/FBOXImageButtonBoxSkin.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 15 Nov 2010 14:53:34 +0000
branchRCL_3
changeset 105 871af676edac
parent 0 dd21522fd290
child 68 92a765b5b3e7
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2000 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: 
*
*/


#include "nw_fbox_imagebuttonboxskini.h"
#include "nw_fbox_imagebuttonbox.h"
#include "nw_lmgr_rootbox.h"
#include "nw_image_epoc32cannedimage.h"
#include "nwx_settings.h"
#include "GDIDeviceContext.h"
#include "BrsrStatusCodes.h"

const
NW_FBox_ImageButtonBoxSkin_Class_t  NW_FBox_ImageButtonBoxSkin_Class = {
  { /* NW_Object_Core              */
    /* super                       */ &NW_FBox_Skin_Class,
    /* queryInterface              */ _NW_Object_Base_QueryInterface
  },
  { /* NW_Object_Base              */
    /* interfaceList               */ NULL
  },
  { /* NW_Object_Dynamic           */
    /* instanceSize                */ sizeof (NW_FBox_ImageButtonBoxSkin_t),
    /* construct                   */ _NW_FBox_Skin_Construct,
    /* destruct                    */ NULL
  },
  { /* NW_FBox_Skin                */
    /* NW_FBox_Skin_Draw_t         */ _NW_FBox_ImageButtonBoxSkin_Draw,
    /* NW_FBox_Skin_GetSize_t      */ _NW_FBox_ImageButtonBoxSkin_GetSize
  },
  { /* NW_FBox_ButtonBoxSkin */
    /* drawContent                 */ NULL
  }
};


/* ------------------------------------------------------------------------- *
   virtual methods
 * ------------------------------------------------------------------------- */

TBrowserStatusCode
_NW_FBox_ImageButtonBoxSkin_Draw(NW_FBox_Skin_t* skin,
                        NW_LMgr_Box_t* box,
                        CGDIDeviceContext* deviceContext,
                        NW_Uint8 hasFocus)
{
  NW_FBox_ImageButtonBoxSkin_t* thisObj;

  /* for convenience */
  thisObj = NW_FBox_ImageButtonBoxSkinOf(skin);

  /* Let the base class draw the box */
  (void) NW_LMgr_Box_Class.NW_LMgr_Box.draw(box, deviceContext, hasFocus);

  return NW_FBox_ImageButtonBoxSkin_DrawContent(thisObj, box, deviceContext, hasFocus);
}


/* ------------------------------------------------------------------------- */
TBrowserStatusCode
_NW_FBox_ImageButtonBoxSkin_GetSize(NW_FBox_Skin_t* skin,
                                     NW_LMgr_Box_t* box,
                                     NW_GDI_Dimension3D_t* size)
{
  NW_FBox_ImageButtonBox_t* imageButtonBox;
  NW_Text_t* value;
  NW_LMgr_RootBox_t* rootBox;
  CGDIDeviceContext* deviceContext;
  CGDIFont* font;
  TBrowserStatusCode status;
  NW_GDI_Dimension2D_t textExtent;
  NW_GDI_Dimension3D_t imgSize;
  NW_GDI_Dimension3D_t textSize;
  NW_LMgr_Property_t heightVal;
  NW_LMgr_Property_t widthVal;
  NW_LMgr_FrameInfo_t padding;
  NW_LMgr_Box_GetPadding(box, &padding, ELMgrFrameAll );

  /* parameter assertion block */
  NW_ASSERT (NW_Object_IsInstanceOf (box, &NW_FBox_ImageButtonBox_Class));

  /* for convenience */
  imageButtonBox = NW_FBox_ImageButtonBoxOf (box);
  (void)skin;

  /* Get the value */
  value = NW_FBox_ImageButtonBox_GetValue(imageButtonBox);

  /* we're going to need the deviceContext to do text extent calculations */
  rootBox = NW_LMgr_Box_GetRootBox (box);
  deviceContext = NW_LMgr_RootBox_GetDeviceContext (rootBox);

  /* Get the font */
  font = NW_LMgr_Box_GetFont (box);
  NW_ASSERT(font != NULL);

  /* calculate the extents */
  status = deviceContext->GetTextExtent ( value,
                                          font,
                                          0,
                                          NW_GDI_FlowDirection_LeftRight,
                                          &textExtent);
  if (status == KBrsrOutOfMemory) 
    {
    return status;
  }

  if ((value != NULL) && 
      !(NW_Object_IsInstanceOf(imageButtonBox->image, &NW_Image_Epoc32Canned_Class)))
    {
    textExtent.height = 0;
    textExtent.width = 0;
  }

  textSize.height = (NW_GDI_Metric_t)(textExtent.height);
  textSize.width =  (NW_GDI_Metric_t)(textExtent.width);

  if(imageButtonBox->image)
  {
    (void) NW_Image_AbstractImage_GetSize(imageButtonBox->image, &imgSize);
    size->depth = imgSize.depth;
    size->width = imgSize.width;
    size->height = imgSize.height;
    
    if (textSize.width != 0) 
    {
      size->width = (NW_GDI_Metric_t)(size->width + textSize.width); 
      if(imgSize.height > textSize.height) 
        {
        size->height = imgSize.height;
      } 
      else 
        {
        size->height = textSize.height;
      }
    }

	/* If the image button has height and width properties, use those instead */
    heightVal.type = widthVal.type = 0;
    heightVal.value.decimal = widthVal.value.decimal = 0;

	status = NW_LMgr_PropertyList_Get(box->propList, NW_CSS_Prop_width, &widthVal);
    if (status == KBrsrSuccess)
	{
      size->width = widthVal.value.integer;
	}

    status = NW_LMgr_PropertyList_Get(box->propList, NW_CSS_Prop_height, &heightVal);
    if (status == KBrsrSuccess)
	{
      size->height = heightVal.value.integer;
	}

    /* In vertical layout mode, we do not want the size of the image to be bigger than the display,
       so we scale it */
    if( NW_LMgr_RootBox_GetSmallScreenOn( rootBox ) )
    {
      const NW_GDI_Rectangle_t* rectangle;
      NW_GDI_Metric_t maxWidth = 0;
      NW_GDI_Metric_t maxHeight = 0;
      NW_LMgr_FrameInfo_t borderWidth;

      rectangle = deviceContext->DisplayBounds();
      NW_LMgr_Box_GetBorderWidth(box, &borderWidth, ELMgrFrameAll );

      maxWidth = (NW_GDI_Metric_t)(rectangle->dimension.width - padding.left - padding.right - borderWidth.right - borderWidth.left - 6);
      maxHeight = (NW_GDI_Metric_t)(rectangle->dimension.width - padding.top - padding.bottom - borderWidth.top - borderWidth.bottom);

	  if (size->width > maxWidth)
	  {
        size->height = (NW_GDI_Metric_t)((maxWidth*size->height)/size->width);
        size->width = maxWidth;
	  }

	  if (size->height > maxHeight)
	  {
        size->width = (NW_GDI_Metric_t)((maxHeight*size->width)/size->height);
        size->height = maxHeight;
	  }
    }
  }
  else 
    {
    size->height = textSize.height;
    size->width = textSize.width;
  }
  return KBrsrSuccess;
}