/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "nscore.h" #include "nsHTMLValue.h" #include "nsString.h" #include "nsReadableUtils.h" #include "nsUnicharUtils.h" #include "nsCRT.h" #include "nsMemory.h" #include "nsIDocument.h" #include "nsIHTMLDocument.h" #include "nsUnitConversion.h" #include "prprf.h" #include "nsICSSStyleRule.h" #include "nsCSSDeclaration.h" nsHTMLValue::nsHTMLValue() : mUnit(eHTMLUnit_String) { mValue.mString = nsnull; } nsHTMLValue::nsHTMLValue(PRInt32 aValue, nsHTMLUnit aUnit) : mUnit(aUnit) { NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER, "unit not an integer unit"); if (GetUnitClass() == HTMLUNIT_INTEGER) { mValue.mInt = aValue; } else { mUnit = eHTMLUnit_String; mValue.mString = nsnull; } } nsHTMLValue::~nsHTMLValue(void) { Reset(); } void nsHTMLValue::Reset(void) { if (GetUnitClass() == HTMLUNIT_STRING) { if (mValue.mString) { nsCheapStringBufferUtils::Free(mValue.mString); } } else if (mUnit == eHTMLUnit_CSSStyleRule) { NS_IF_RELEASE(mValue.mCSSStyleRule); } else if (mUnit == eHTMLUnit_AtomArray) { delete mValue.mAtomArray; } mUnit = eHTMLUnit_String; mValue.mString = nsnull; } void nsHTMLValue::SetIntValue(PRInt32 aValue, nsHTMLUnit aUnit) { Reset(); mUnit = aUnit; NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER, "not an int value"); if (GetUnitClass() == HTMLUNIT_INTEGER) { mValue.mInt = aValue; } else { mUnit = eHTMLUnit_String; mValue.mString = nsnull; } } void nsHTMLValue::SetPercentValue(float aValue) { Reset(); mUnit = eHTMLUnit_Percent; mValue.mFloat = aValue; } void nsHTMLValue::SetStringValueInternal(const nsAString& aValue, nsHTMLUnit aUnit) { NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING, "unit not a string unit!"); if (GetUnitClass() == HTMLUNIT_STRING) { // Remember the length of the string if necessary if (aValue.IsEmpty()) { mValue.mString = nsnull; } else { nsCheapStringBufferUtils::CopyToBuffer(mValue.mString, aValue); } } else { mUnit = eHTMLUnit_String; mValue.mString = nsnull; } } void nsHTMLValue::SetStringValue(const nsAString& aValue, nsHTMLUnit aUnit) { Reset(); mUnit = aUnit; SetStringValueInternal(aValue, aUnit); } void nsHTMLValue::SetCSSStyleRuleValue(nsICSSStyleRule* aValue) { Reset(); mUnit = eHTMLUnit_CSSStyleRule; mValue.mCSSStyleRule = aValue; NS_IF_ADDREF(mValue.mCSSStyleRule); } void nsHTMLValue::SetAtomArrayValue(nsCOMArray* aValue) { Reset(); mUnit = eHTMLUnit_AtomArray; mValue.mAtomArray = aValue; } void nsHTMLValue::SetColorValue(nscolor aValue) { Reset(); mUnit = eHTMLUnit_Color; mValue.mColor = aValue; } // // Parsing methods // PRBool nsHTMLValue::EnumValueToString(const EnumTable* aTable, nsAString& aResult) const { if (GetUnit() == eHTMLUnit_Enumerated) { PRInt32 v = GetIntValue(); while (aTable->tag) { if (aTable->value == v) { CopyASCIItoUCS2(nsDependentCString(aTable->tag), aResult); return PR_TRUE; } aTable++; } } aResult.Truncate(); return PR_FALSE; }