Package org.eclipse.wst.html.core.internal.htmlcss

Source Code of org.eclipse.wst.html.core.internal.htmlcss.CSSQueryContext

/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.html.core.internal.htmlcss;



import java.util.Enumeration;

import org.eclipse.wst.css.core.internal.contentmodel.PropCMProperty;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSValue;
import org.eclipse.wst.css.core.internal.util.CSSLinkConverter;
import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;

/**
*/
class CSSQueryContext extends CSSPropertyContext {

  /**
   */
  public CSSQueryContext() {
    super();
  }

  /**
   */
  public CSSQueryContext(ICSSStyleDeclaration decl) {
    super(decl);
  }

  /**
   *
   */
  public void applyFull(ICSSStyleDeclaration decl) {
    if (decl == null)
      return;
    Enumeration keys = fProperties.keys();
    while (keys.hasMoreElements()) {
      Object key = keys.nextElement();
      Object val = fProperties.get(key);

      if (val instanceof CSSQueryDeclarationData) {
        ICSSStyleDeclItem declItem = ((CSSQueryDeclarationData) val).getDeclItem();
        if (declItem.getLength() <= 0) {
          ICSSStyleDeclItem itemToRemove = decl.getDeclItemNode(key.toString());
          if (itemToRemove != null) {
            decl.removeDeclItemNode(itemToRemove);
          }
        }
        else {
          decl.setDeclItemNode(declItem);
        }
      }
      else {
        String value = (val instanceof ICSSValue) ? ((ICSSValue) val).getCSSValueText() : val.toString();

        if (value == null || value.length() <= 0) {
          ICSSStyleDeclItem itemToRemove = decl.getDeclItemNode(key.toString());
          if (itemToRemove != null) {
            decl.removeDeclItemNode(itemToRemove);
          }
        }
        else {
          decl.setProperty(key.toString(), value, null);
        }
      }
    }
  }

  /**
   */
  private boolean check(String propName, boolean important, int specificity) {
    Object current = fProperties.get(propName);
    if (current != null && current instanceof CSSQueryValueData) {
      CSSQueryValueData currentValue = (CSSQueryValueData) current;
      if ((!important && currentValue.important) || (currentValue.getSpecificity() > specificity)) {
        return false;
      }
    }
    return true;
  }

  /**
   */
  public void overrideWithExpand(ICSSStyleDeclaration decl, int specificity) {
    if (decl == null)
      return;

    CSSLinkConverter conv = new CSSLinkConverter(decl.getOwnerDocument().getModel());

    int nProperties = decl.getLength();
    for (int i = 0; i < nProperties; i++) {
      String propName = decl.item(i);
      if (propName != null) {
        String propN = propName.trim().toLowerCase();
        if (propN.length() != 0) {
          PropCMProperty prop = PropCMProperty.getInstanceOf(propN);
          String priority = decl.getPropertyPriority(propName);
          boolean important = priority != null && priority.length() > 0;
          if (prop != null && prop.isShorthand()) {
            // expand shorthand property
            CSSQueryContext context = new CSSQueryContext();
            expandToLeaf(prop, decl.getPropertyValue(propName), context);

            Enumeration properties = context.properties();
            while (properties.hasMoreElements()) {
              propN = properties.nextElement().toString();
              if (check(propN, important, specificity)) {
                fProperties.put(propN, new CSSQueryValueData(conv.toAbsolute(context.get(propN)), important, specificity));
              }
            }
          }
          else {
            if (check(propN, important, specificity)) {
              ICSSStyleDeclItem declItem = (ICSSStyleDeclItem) decl.getDeclItemNode(propName).cloneNode(true);
              int nValues = declItem.getLength();
              for (int j = 0; j < nValues; j++) {
                conv.toAbsolute(declItem.item(j));
              }
              declItem.setPriority(null);
              fProperties.put(propN, new CSSQueryDeclarationData(declItem, important, specificity));
            }
          }
        }
      }
    }
  }
}
TOP

Related Classes of org.eclipse.wst.html.core.internal.htmlcss.CSSQueryContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.