webengine/wmlengine/src/fbox/src/Epoc32ButtonBoxSkin.cpp
changeset 0 dd21522fd290
child 68 92a765b5b3e7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/fbox/src/Epoc32ButtonBoxSkin.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,348 @@
+/*
+* 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_epoc32buttonboxskini.h"
+
+#include "nw_lmgr_rootbox.h"
+#include "nw_fbox_buttonbox.h"
+#include "nw_fbox_epoc32formimages.h"
+#include "GDIDeviceContext.h"
+#include "nw_fbox_formboxutils.h"
+#include "BrsrStatusCodes.h"
+
+/* ------------------------------------------------------------------------- *
+   private methods
+ * ------------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
+/* Get the dir attribute */
+static
+void
+NW_FBox_Epoc32ButtonBoxSkin_GetDirection(NW_LMgr_Box_t *box,
+                                         NW_GDI_FlowDirection_t* dir)
+{
+  NW_LMgr_Property_t dirProp;
+  NW_ASSERT(box != NULL);
+
+  dirProp.type = NW_CSS_ValueType_Token;
+  dirProp.value.token = NW_CSS_PropValue_ltr;
+  NW_LMgr_Box_GetProperty(box, NW_CSS_Prop_textDirection, &dirProp);
+  if (dirProp.value.token == NW_CSS_PropValue_ltr) {
+    *dir = NW_GDI_FlowDirection_LeftRight;
+  }
+  else {
+    *dir = NW_GDI_FlowDirection_RightLeft;
+  }
+}
+
+static
+TBrowserStatusCode
+NW_FBox_Epoc32ButtonBoxSkin_DisplayText(NW_LMgr_Box_t* box,
+                                        CGDIDeviceContext* deviceContext,
+                                        NW_GDI_Point2D_t textStart,
+                                        NW_Text_t* value,
+                                        NW_Uint16 width)
+  {
+  NW_Text_Length_t  displayLength = 0;
+  NW_Text_UCS2_t*		displayText;
+  NW_Ucs2*					displayStorage;
+  NW_Ucs2*					bufferStorage;
+  NW_Text_Length_t  totalLength = 0;
+  TBrowserStatusCode       status;
+  NW_GDI_FlowDirection_t dir = NW_GDI_FlowDirection_LeftRight;
+  NW_GDI_Dimension2D_t extent;
+  CGDIFont* font;
+
+  bufferStorage = NW_Text_GetUCS2Buffer(value, 0, &totalLength, NULL);
+  
+  font = NW_LMgr_Box_GetFont(box);
+
+  if (totalLength == 0)
+    {
+    return KBrsrSuccess;
+    }
+  
+  if(width >= 255)
+    {
+    width = 254;
+    }
+  
+  status = NW_FBox_FormBoxUtils_GetDisplayLength(deviceContext,
+                                                 value,
+                                                 font,
+                                                 totalLength,
+                                                 width,
+                                                 &displayLength,
+                                                 NW_FALSE
+                                                 );
+  NW_ASSERT (status == KBrsrSuccess);
+  
+  if(displayLength != value->characterCount)
+    {
+    displayStorage = NW_Str_New(displayLength + NW_FBox_FormBoxUtils_Truncate_len);
+    if (displayStorage == NULL)
+      {      
+      return KBrsrOutOfMemory;
+      }
+
+    displayText = NW_Text_UCS2_New(NULL, 0, NW_Text_Flags_TakeOwnership);
+    if (displayText == NULL)
+      {       
+      return KBrsrOutOfMemory;
+      }
+
+    NW_Mem_memcpy(displayStorage, 
+                 (bufferStorage),
+                 displayLength*sizeof(NW_Ucs2)
+                 );
+    
+    NW_Mem_memcpy(displayStorage + displayLength, 
+                  NW_FBox_FormBoxUtils_Truncate, 
+                  NW_FBox_FormBoxUtils_Truncate_len*sizeof(NW_Ucs2));
+
+    displayLength += NW_FBox_FormBoxUtils_Truncate_len;
+    status = NW_Text_SetStorage(NW_TextOf(displayText), displayStorage, 
+                       displayLength, NW_TRUE);
+    NW_ASSERT (status == KBrsrSuccess);
+
+    NW_FBox_Epoc32ButtonBoxSkin_GetDirection(box, &dir);
+    status = deviceContext->GetTextExtent( NW_TextOf(displayText),
+                                           font,
+                                           0, 
+                                           dir, 
+                                           &extent);
+
+    textStart.x += ((width - extent.width) / 2);
+    status = deviceContext->DrawText( &textStart, 
+                                      NW_TextOf(displayText), 
+                                      font, 
+                                      0, 
+                                      NW_GDI_TextDecoration_None, 
+                                      dir, 
+                                      extent.width );
+    
+    NW_Object_Delete(displayText);
+    }
+  else
+    {
+    NW_FBox_Epoc32ButtonBoxSkin_GetDirection(box, &dir);
+    status = deviceContext->DrawText( &textStart, value, font, 0, NW_GDI_TextDecoration_None, dir, width);
+    }
+  return status;
+  }
+
+/* ------------------------------------------------------------------------- */
+const
+NW_FBox_Epoc32ButtonBoxSkin_Class_t  NW_FBox_Epoc32ButtonBoxSkin_Class = {
+  { /* NW_Object_Core           */
+    /* super                    */ &NW_FBox_ButtonBoxSkin_Class,
+    /* queryInterface           */ _NW_Object_Base_QueryInterface
+  },
+  { /* NW_Object_Base           */
+    /* interfaceList            */ NULL
+  },
+  { /* NW_Object_Dynamic        */
+    /* instanceSize             */ sizeof (NW_FBox_Epoc32ButtonBoxSkin_t),
+    /* construct                */ _NW_FBox_Skin_Construct,
+    /* destruct                 */ NULL
+  },
+  { /* NW_FBox_Skin             */
+    /* draw                     */ _NW_FBox_ButtonBoxSkin_Draw,
+    /* getSize                  */ _NW_FBox_ButtonBoxSkin_GetSize
+  },
+  { /* NW_FBox_ButtonBoxSkin    */
+    /* drawContent              */ _NW_FBox_Epoc32ButtonBoxSkin_DrawContent
+  },
+  { /* NW_FBox_Epoc32ButtonBoxSkin */
+    /* unused                   */ NW_Object_Unused
+  }
+};
+
+
+/* ------------------------------------------------------------------------- *
+   virtual methods
+ * ------------------------------------------------------------------------- */
+
+TBrowserStatusCode
+_NW_FBox_Epoc32ButtonBoxSkin_DrawContent(NW_FBox_ButtonBoxSkin_t* skin,
+                                   NW_LMgr_Box_t* box,
+                                   CGDIDeviceContext* deviceContext,
+                                   NW_Uint8 hasFocus)
+  { 
+  NW_FBox_ButtonBox_t* ButtonBox;
+  NW_GDI_Point2D_t textStart;
+  NW_GDI_Rectangle_t innerRect;
+  NW_Text_t* value;
+  NW_Uint16 width;
+  NW_GDI_Point2D_t shadow[3];
+  NW_GDI_Color_t initialColor = 0;
+  NW_GDI_Color_t initialBgColor = 0;
+  NW_GDI_FlowDirection_t dir;
+
+  NW_TRY(status)
+    {
+    NW_REQUIRED_PARAM(skin);
+    NW_REQUIRED_PARAM(hasFocus);
+
+    /* parameter assertion block */
+    NW_ASSERT (NW_Object_IsInstanceOf (skin, &NW_FBox_Epoc32ButtonBoxSkin_Class));
+
+    /* for convenience */
+    ButtonBox = NW_FBox_ButtonBoxOf (box);
+
+    /* this is the label */
+    value = NW_FBox_ButtonBox_GetValue(ButtonBox);
+
+    /* Calculate the inner rectangle */
+    NW_LMgr_Box_GetInnerRectangle(box, &innerRect);
+ 
+    /* Get the start coordinates for text*/
+    textStart = innerRect.point;
+	  width = (NW_Uint16)innerRect.dimension.width;
+    
+    /* now centralize the text */
+    NW_LMgr_PropertyValue_t sizeVal;
+    NW_Uint16 box_height = 0;
+    NW_Uint16 box_width = 0;
+    sizeVal.integer = 0;
+    status = NW_LMgr_Box_GetPropertyValue(box, NW_CSS_Prop_width, NW_CSS_ValueType_Px, &sizeVal);
+    if (KBrsrSuccess == status)
+      {
+      box_width = (NW_Uint16)sizeVal.integer;
+      }
+    
+    status = NW_LMgr_Box_GetPropertyValue(box, NW_CSS_Prop_height, NW_CSS_ValueType_Px, &sizeVal);
+    if (KBrsrSuccess == status)
+      {
+      box_height = (NW_Uint16)sizeVal.integer;
+      }
+
+    /* calculate the extents */
+    NW_GDI_Dimension2D_t textExtent;
+
+    NW_FBox_Epoc32ButtonBoxSkin_GetDirection(box, &dir);
+    status = deviceContext->GetTextExtent ( value,
+                                            NW_LMgr_Box_GetFont(box),
+                                            0, 
+                                            dir, 
+                                            &textExtent);
+    
+    /* if no truncation needed, centralize text with text length */
+    if (textExtent.width <= box_width)
+      {
+      textStart.x += box_width/2 - 1;
+      textStart.x -= textExtent.width/2;
+      }
+
+    if (box_height != 0)
+      {
+      textStart.y += box_height/2;
+      textStart.y -= textExtent.height/2;
+      }
+    
+    /* draw shadow to create 3D effect */
+    NW_GDI_Rectangle_t boxBounds = NW_LMgr_Box_GetDisplayBounds( box );
+    shadow[0].x = (NW_GDI_Metric_t)(boxBounds.point.x + 1);
+    shadow[0].y = (NW_GDI_Metric_t)(boxBounds.point.y + boxBounds.dimension.height);
+    shadow[1].x = (NW_GDI_Metric_t)(boxBounds.point.x + boxBounds.dimension.width);
+    shadow[1].y = shadow[0].y;
+    shadow[2].x = shadow[1].x;
+    shadow[2].y = (NW_GDI_Metric_t)(boxBounds.point.y + 1);
+
+    initialColor = deviceContext->ForegroundColor();
+    initialBgColor = deviceContext->BackgroundColor();
+                                                
+    deviceContext->SetForegroundColor( NW_GDI_Color_Black); 
+    status = deviceContext->DrawPolyline ( 3, shadow, NW_FALSE);
+    NW_THROW_ON_ERROR(status);
+    
+    NW_LMgr_Property_t backgroundProp;
+    backgroundProp.type = NW_CSS_ValueType_Token;
+    backgroundProp.value.token = NW_CSS_PropValue_transparent;
+    status = NW_LMgr_Box_GetProperty(box, NW_CSS_Prop_backgroundColor, &backgroundProp);
+    
+    NW_GDI_Color_t foregroundColor = 0;
+    NW_LMgr_Property_t fgColor;
+    fgColor.type = NW_CSS_ValueType_Color;
+    status = NW_LMgr_Box_GetProperty(box, NW_CSS_Prop_color, &fgColor);
+    if (KBrsrSuccess == status)
+      {
+      foregroundColor = fgColor.value.integer;
+      }
+    else
+      {
+      foregroundColor = NW_GDI_Color_Black;
+      }
+    deviceContext->SetForegroundColor( foregroundColor);
+    
+    /* Make button label draw itself at the specified location */
+    deviceContext->SetPaintMode ( NW_GDI_PaintMode_Copy);
+
+    if ( value != NULL)
+      {
+      status = NW_FBox_Epoc32ButtonBoxSkin_DisplayText(box, 
+        deviceContext, 
+        textStart, 
+        value, 
+        width); 
+
+      NW_THROW_ON_ERROR(status);
+      }
+
+    if (hasFocus)
+      {
+        NW_LMgr_FrameInfo_t borderWidth;
+        NW_LMgr_FrameInfo_t borderStyle;
+        NW_LMgr_FrameInfo_t borderColor;
+
+        NW_LMgr_Box_GetBorderColor (box, &borderColor);
+        NW_LMgr_Box_GetBorderStyle (box, &borderStyle, ELMgrFrameAll );
+        NW_LMgr_Box_GetBorderWidth (box, &borderWidth, ELMgrFrameAll );
+
+        borderWidth.top = (NW_GDI_Metric_t)(borderWidth.top + 1);
+        borderWidth.bottom = (NW_GDI_Metric_t)(borderWidth.bottom + 1);
+        borderWidth.left = (NW_GDI_Metric_t)(borderWidth.left + 1);
+        borderWidth.right = (NW_GDI_Metric_t)(borderWidth.right + 1);
+
+        status = NW_LMgr_Box_DrawBorder ( NW_LMgr_Box_GetDisplayBounds( box ), deviceContext, &borderWidth, &borderStyle, &borderColor);
+        _NW_THROW_ON_ERROR(status);
+      }
+
+    deviceContext->SetForegroundColor( initialColor);
+    deviceContext->SetBackgroundColor( initialBgColor);
+
+    } 
+  NW_CATCH (status) 
+    {
+    } 
+  NW_FINALLY 
+    {
+    return status;
+    } 
+  NW_END_TRY
+  }
+
+/* ------------------------------------------------------------------------- *
+   convenience methods
+ * ------------------------------------------------------------------------- */
+NW_FBox_ButtonBoxSkin_t*
+NW_FBox_ButtonBoxSkin_New (NW_FBox_FormBox_t* formBox)
+{
+  return (NW_FBox_ButtonBoxSkin_t*)
+    NW_Object_New (&NW_FBox_Epoc32ButtonBoxSkin_Class, formBox);
+}