Package org.eclipse.jst.pagedesigner.css2

Source Code of org.eclipse.jst.pagedesigner.css2.CSSTempUtil

/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
*     Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.css2;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.stylesheets.StyleSheet;
import org.w3c.dom.stylesheets.StyleSheetList;

/**
* @author mengbo
* @version 1.5
*/
public final class CSSTempUtil {
  /**
   * the default implementation of (IStyleSheetListAdapter)
   * docnotifier.getAdapterFor(IStyleSheetListAdapter.class) will only get
   * those style tags under certain tags like "html", "head", etc.
   *
   * But datawindow is generating style tag and is not putting them into
   * "head". So we can't handle them using the default SSE mechanism.
   *
   * We have another problem: currently the converted element is also using
   * the original document, not generating another document, and these
   * elements is not really adding into the document, so they can't be reached
   * from the document.
   *
   * @param element
   * @return the list
   * see org.eclipse.wst.html.core.htmlcss.HTMLDocumentAdapter#addStyleSheet(org.w3c.dom.Element)
   */
  public static List getStyleSheets(Element element) {
    List styleSheets = new ArrayList();
    INodeNotifier docnotifier = (INodeNotifier) element.getOwnerDocument();
    IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) docnotifier
        .getAdapterFor(IStyleSheetListAdapter.class);

    StyleSheetList ssl = (adapter == null ? null : adapter.getStyleSheets());

    if (ssl != null) {
      for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
        // loop for styles (<style> and <link>)
        org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
        styleSheets.add(ss);
      }
    }

    // now is our work-around part for support datawindow.
    Node parent = element.getParentNode();
    Element rootEle = element;
    while (parent != null && parent instanceof Element) {
      rootEle = (Element) parent;
      parent = parent.getParentNode();
    }
    addStyleSheet(rootEle, styleSheets);

    //add stylesheets from any active IDTSkin instances
    if (element instanceof IDOMNode) {
      List<IDTSkin> dtSkins =
        DTSkinManager.getInstance((IDOMNode)element).getCurrentSkins();
      for (IDTSkin dtSkin: dtSkins) {
        if (dtSkin != null) {
          styleSheets.addAll(dtSkin.getStyleSheets());
        }
      }
    }

    return styleSheets;
  }

  /**
   */
  private static void addStyleSheet(Element node, List result) {
    IDOMElement element = (IDOMElement) node;
    String tagName = element.getTagName();
    if (tagName == null) {
      return;
    }
    boolean isContainer = false;

    if (element.isCommentTag()) {
      Node parent = element.getParentNode();
      if (parent == element.getOwnerDocument()) {
        // This condition is too severe, actually do not work for JSF
        // template.
        // But above (! globalTag() && isContainer()) cover JSF template
        // + tpl template
        isContainer = true;
      } else if (parent.getNodeType() == Node.ELEMENT_NODE) {
        tagName = ((Element) parent).getTagName();
        if (tagName != null
            && tagName
                .equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
          isContainer = true;
        }
      }
    } else {
      INodeNotifier notifier = element;

      // (lium) Increase performance: since this method is called tooooo
      // many times,
      // and getAdapterFor() is slow, so add a check on the tagName to
      // filter
      // those stylesheet stuff first.
      if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagName)
          || IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagName)) {
        INodeAdapter adapter = notifier
            .getAdapterFor(IStyleSheetAdapter.class);
        if (adapter instanceof IStyleSheetAdapter) {
          StyleSheet sheet = ((IStyleSheetAdapter) adapter).getSheet();
                    if (sheet != null)
                    {
                        result.add(sheet);
                    }
        }
      }

      isContainer = true;
    }
    if (isContainer) {
      for (Node child = element.getFirstChild(); child != null; child = child
          .getNextSibling()) {
        if (child.getNodeType() != Node.ELEMENT_NODE)
          continue;
        addStyleSheet((Element) child, result);
      }
    }
  }
 
  private CSSTempUtil()
  {
      //  util class, no instantiation
  }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.css2.CSSTempUtil

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.