diff -r 000000000000 -r dd21522fd290 webengine/wmlengine/src/fbox/src/FBOXFormBoxUtils.cpp --- /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 --; + } +}