webengine/wmlengine/src/fbox/src/FBOXFormBoxUtils.cpp
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/fbox/src/FBOXFormBoxUtils.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,222 @@
+/*
+* 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_formboxutils.h"
+#include "nwx_defs.h"
+#include "nwx_string.h"
+#include "nw_fbox_formbox.h"
+#include "GDIDeviceContext.h"
+#include "BrsrStatusCodes.h"
+
+
+/* ------------------------------------------------------------------------- *
+    private data typed
+ * ------------------------------------------------------------------------- */
+
+const NW_Ucs2 EscapeChar = '\\';
+const NW_Ucs2 NW_FBox_FormBoxUtils_Truncate[] = {'.','.','.','\0'};
+const NW_Ucs2 NW_FBox_FormBoxUtils_TrueStr[] = { 't', 'r', 'u', 'e', '\0' };
+const NW_Ucs2 NW_FBox_FormBoxUtils_FalseStr[] = { 'f', 'a', 'l', 's', 'e', '\0' };
+
+/* ------------------------------------------------------------------------- */
+TBrowserStatusCode 
+NW_FBox_FormBoxUtils_GetDisplayLength(CGDIDeviceContext* deviceContext,
+																			NW_Text_t* text,
+                                      CGDIFont* font,
+																			NW_Text_Length_t totalLength,
+																			NW_Uint16 width,
+																			NW_Text_Length_t* displayLength,
+																			NW_Bool isNumber)
+  {
+  NW_GDI_Dimension2D_t extent;
+  NW_GDI_Dimension2D_t truncate_extent;
+  NW_Text_UCS2_t* truncate_text;
+  TBrowserStatusCode status = KBrsrSuccess;
+  NW_Bool OverFlow = NW_FALSE;
+  NW_Text_Length_t i;
+	NW_Text_Length_t start = 0;
+  truncate_text = NW_Text_UCS2_New ((NW_Ucs2*) NW_FBox_FormBoxUtils_Truncate, 
+                                    NW_FBox_FormBoxUtils_Truncate_len, 
+                                    0);
+  if (truncate_text == NULL)
+    {
+    return KBrsrOutOfMemory;
+    }
+  status = deviceContext->GetTextExtent ( NW_TextOf(truncate_text),
+                                          font,
+                                          0, 
+                                          NW_GDI_FlowDirection_LeftRight, 
+                                          &truncate_extent);
+  if (status != KBrsrSuccess)
+    {
+    NW_Object_Delete(truncate_text);
+    return status;
+    }
+  
+  NW_Object_Delete(truncate_text);
+  extent.width = 0;
+  extent.height = 0;
+  for (i=1; i<=totalLength; i++) 
+    {
+		if(isNumber)
+		  {
+			start = (NW_Text_Length_t) (totalLength - i);
+		  }
+    status = deviceContext->GetSubstringExtent( text, 
+                                                font,
+                                                start, 
+                                                i,
+                                                0, 
+                                                NW_GDI_FlowDirection_LeftRight, 
+                                                &extent );
+    if (status != KBrsrSuccess)
+      {
+      return status;
+      }
+    if(!OverFlow)
+      {
+      if(extent.width > width)
+        {
+        if(i > 3) 
+          {
+					i = (NW_Text_Length_t) (i - 3);
+				  }
+				else 
+          {
+					i = 0;
+			  	}
+        OverFlow = NW_TRUE;
+        }
+      continue;
+      }
+    else if ((extent.width + truncate_extent.width) > width) 
+      {
+      break;
+      }
+    }
+  *displayLength = --i;
+  return status;
+}
+
+/* ------------------------------------------------------------------------- */
+NW_HED_DocumentRoot_t *
+NW_FBox_FormBoxUtils_GetDocRoot(NW_LMgr_Box_t* box)
+{
+  NW_HED_DocumentRoot_t* docRoot = NULL;
+  NW_FBox_FormLiaison_t  *fboxFormLiaison = NULL;
+  NW_ASSERT(box != NULL);
+  NW_ASSERT(NW_Object_IsInstanceOf(box, &NW_FBox_FormBox_Class));
+  fboxFormLiaison = NW_FBox_FormBox_GetFormLiaison (box);
+  (void) NW_FBox_FormLiaison_GetDocRoot(fboxFormLiaison, &docRoot );
+  return docRoot;
+}
+
+/* ------------------------------------------------------------------------- */
+NW_Uint16
+NW_FBox_FormBoxUtils_GetNumEscapeChars(const NW_Ucs2* format)
+{
+	NW_Uint16 numEscapeChars = 0;
+	if((!format) || (!*format))
+	{
+		return numEscapeChars;
+	}
+	while(*format)
+	{
+		if((*format == EscapeChar) && *(format + 1))
+		{
+			numEscapeChars++;
+			format++;
+		}
+		format++;
+	}
+	return numEscapeChars;
+}
+
+/* ------------------------------------------------------------------------- */
+void
+NW_FBox_FormBoxUtils_FillEscapeChars(const NW_Ucs2* format, NW_Ucs2 *input, 
+                                     NW_Ucs2 *retValue, NW_Uint16 retValueLen)
+{
+	if( (!format) || (!*format) || (!input))
+	{
+		return;
+	}
+	while(*format && retValueLen)
+	{
+		if((*format == EscapeChar) && *(format + 1))
+		{
+			format++;
+			*retValue = *format;
+			retValue++;
+		}
+		else if (*input)
+		{
+			*retValue = *input;
+			retValue++;
+			input++;
+		}
+		else
+		{
+			break;
+		}
+		format++;
+		retValueLen --;
+	}
+	while(*input && retValueLen)
+	{
+        /*lint --e{794} Conceivable use of null pointer*/
+
+		*retValue = *input;
+		retValue++;
+		input++;
+		retValueLen --;
+	}
+}
+
+/* ------------------------------------------------------------------------- */
+void
+NW_FBox_FormBoxUtils_StripEscapeChars(const NW_Ucs2* format, NW_Ucs2 *input, 
+																			NW_Ucs2 *retValue, NW_Uint16 retValueLen)
+{
+	if( (!format) || (!*format) || (!input))
+	{
+		return;
+	}
+	while(*format && *input && retValueLen)
+	{
+		if((*format == EscapeChar) && *(format + 1))
+		{
+			format += 2;
+		}
+		else
+		{
+			*retValue = *input;
+			retValue++;
+			format++;
+			retValueLen --;
+		}
+		input++;
+	}
+	while(*input && retValueLen)
+	{
+		*retValue = *input;
+		retValue++;
+		input++;
+		retValueLen --;
+	}
+}