001: /*
002: ItsNat Java Web Application Framework
003: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
004: Author: Jose Maria Arranz Santamaria
005:
006: This program is free software: you can redistribute it and/or modify
007: it under the terms of the GNU Affero General Public License as published by
008: the Free Software Foundation, either version 3 of the License, or
009: (at your option) any later version. See the GNU Affero General Public
010: License for more details. See the copy of the GNU Affero General Public License
011: included in this program. If not, see <http://www.gnu.org/licenses/>.
012: */
013:
014: package org.itsnat.impl.core.css;
015:
016: import org.w3c.dom.DOMException;
017: import org.w3c.dom.css.CSSValue;
018: import org.itsnat.impl.core.css.lex.SourceCode;
019: import org.itsnat.impl.core.css.lex.Space;
020:
021: /**
022: *
023: * @author jmarranz
024: */
025: public abstract class CSSValueImpl implements CSSValue,
026: ObjectValueParent {
027: protected SourceCode cssTextCode;
028: protected ObjectValueParent parent;
029: protected int code;
030:
031: /** Creates a new instance of CSSValueImpl */
032: public CSSValueImpl(SourceCode cssTextCode, int code,
033: ObjectValueParent parent) {
034: this .cssTextCode = cssTextCode;
035: this .code = code;
036: this .parent = parent;
037: }
038:
039: public static CSSValueImpl newCSSValue(SourceCode cssTextCode,
040: int code, ObjectValueParent parent) {
041: if (CSSValueInheritImpl.isCSSValueInherit(cssTextCode))
042: return new CSSValueInheritImpl(cssTextCode, code, parent);
043: else {
044: SourceCode cssTextCodeTmp = cssTextCode; // El original no lo tocamos pues necesitamos asignar el original
045: cssTextCodeTmp = cssTextCodeTmp.trim();
046: SourceCode[] parts = cssTextCodeTmp.split(new Space(' '));
047: if (parts.length > 1)
048: return new CSSValueListImpl(cssTextCode, parts, code,
049: parent);
050: else
051: return new CSSPrimitiveValueImpl(cssTextCode, code,
052: parent);
053: }
054: }
055:
056: public int getCode() {
057: return code;
058: }
059:
060: public ObjectValueParent getCSSValueParent() {
061: return parent;
062: }
063:
064: public abstract void rebuild(SourceCode cssText);
065:
066: public String getCssText() {
067: return getCssTextSourceCode(true).toString();
068: }
069:
070: public SourceCode getCssTextSourceCode(boolean checkFromElem) {
071: if (checkFromElem) {
072: CSSValueImpl current = (CSSValueImpl) parent
073: .getUpdatedChildObjectValueFromElement(this ,
074: getCode());
075: if (current != this ) {
076: if (!this .cssTextCode.equals(current
077: .getCssTextSourceCode(false))) // Si ha cambiado la propiedad puede haber cambiado el tipo de valor etc, el objeto no vale (pues es un objeto vinculado al elemento)
078: throw new DOMException(
079: DOMException.INVALID_ACCESS_ERR,
080: "CSS property " + parent.getPropertyName()
081: + " has been indirectly changed");
082: }
083: }
084:
085: return this .cssTextCode;
086: }
087:
088: public void setCssText(String cssText) throws DOMException {
089: setCssTextSourceCode(new SourceCode(cssText), true);
090: }
091:
092: public void setCssTextSourceCode(SourceCode cssTextCode,
093: boolean rebuild) throws DOMException {
094: if (!this .cssTextCode.equals(cssTextCode)) {
095: this .cssTextCode = cssTextCode;
096: if (rebuild)
097: rebuild(cssTextCode);
098: }
099: // Enviamos el valor siempre al elemento aunque aquí no haya cambiado pues puede haberse cambiado indirectamente por el Element
100: parent.notifyToElementChangedCSSText(cssTextCode, this );
101: }
102:
103: public abstract short getCssValueType();
104:
105: public String getPropertyName() {
106: return parent.getPropertyName();
107: }
108:
109: }
|