Package org.eclipse.jst.pagedesigner.figurehandler

Source Code of org.eclipse.jst.pagedesigner.figurehandler.FigureFactory

/*******************************************************************************
* 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.figurehandler;

import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

/**
* @author mengbo
* @version 1.5
*/
public final class FigureFactory
{
  /**
   * @param figure
   * @param node
   */
  private static void createFigureDeep(IFigure parentFigure, final Node node) {
    if (node instanceof Element) {
      IFigureHandler handler = createAndAdapt((Element) node);
      if (handler instanceof HiddenFigureHandler) {
        // for deep hidden element, we don't create figure for them.
        // this will remove the small <> icon for data window.
        return;
      }
      CSSFigure figure = new CSSFigure();
      handler.updateFigure((Element) node, figure);
      // IFigure figure = handler.createFigure((Element) node);
      parentFigure.add(figure);
      if (!handler.isWidget()) {
        NodeList children = node.getChildNodes();

        for (int i = 0, size = children.getLength(); i < size; i++) {
          createFigureDeep(figure, children.item(i));
        }
      }
    } else if (node instanceof Text) {
      final String data = HTMLUtil.compactWhitespaces((Text) node, node
          .getNodeValue());
      // XXX: seemed there is some bug in handling whitespace (unnecessary
      // take additional space)
      // so skip it here.
      if (data.trim().length() == 0) {
        return;
      }
      // XXX: currently creating of CSSTextFigure is distributed both here
      // and TextEditPart. We may want to unify them later.
      CSSTextFigure figure = new CSSTextFigure(new ICSSTextProvider() {
        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
         */
                //  TODO: dead?
//        public ICSSStyle getCSSStyle() {
//          INodeNotifier notifier = (INodeNotifier) node
//              .getParentNode();
//          return (ICSSStyle) notifier.getAdapterFor(ICSSStyle.class);
//        }

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getTextData()
         */
        public String getTextData() {
          return data;
        }

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getSelectedRange()
         */
        public int[] getSelectedRange() {
          // text figure created here will not be real text in
          // original doc.
          // so don't support their selection.
          return null;
        }
      });
      parentFigure.add(figure);
    }
  }

  /**
   * @param ele
   * @param old
   * @param figure
   * @return the figure
   */
  public static IFigure updateDeepFigure(Element ele, Element old,
      CSSFigure figure) {
    recursiveDisposeAndUnadapt(old);
    List figureChildren = figure.getChildren();
    for (int i = figureChildren.size() - 1; i >= 0; i--) {
      figure.remove((IFigure) figureChildren.get(i));
    }

    IFigureHandler handler = createAndAdapt(ele);
    handler.updateFigure(ele, figure);
    if (!handler.isWidget()) {
      NodeList children = ele.getChildNodes();
      for (int i = 0, size = children.getLength(); i < size; i++) {
        createFigureDeep(figure, children.item(i));
      }
    }
    return figure;
  }


  private static void recursiveDisposeAndUnadapt(Element ele) {
    disposeAndUnadapt(ele);
    NodeList nl = ele.getChildNodes();
    for (int i = 0, size = nl.getLength(); i < size; i++) {
      Node n = nl.item(i);
      if (n instanceof Element) {
        recursiveDisposeAndUnadapt((Element) n);
      }
    }
  }

  private static void disposeAndUnadapt(Element ele) {
    IFigureHandler handler = getHandler(ele);
    if (handler != null) {
      handler.dispose();
      ((IDOMElement) ele).removeAdapter(handler);
    }
  }

  private static IFigureHandler getHandler(Element ele) {
    if (ele instanceof IDOMElement) {
      IDOMElement xmlele = (IDOMElement) ele;
      return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);
    }
    return null;
  }

  private static IFigureHandler createAndAdapt(Element ele) {
    IFigureHandler handler = createFigureHandler(ele);
    if (ele instanceof IDOMElement) {
      ((IDOMElement) ele).addAdapter(handler);
    }
    return handler;
  }

  private static IFigureHandler createFigureHandler(Element ele) {
    String tag = ele.getTagName();
    if ("input".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new InputFigureHandler();
    } else if ("select".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new SelectFigureHandler();
    } else if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new ImgFigureHandler();
    } else if ("object".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new ObjectFigureHandler();
    } else if ("textarea".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new TextareaFigureHandler();
    } else if ("br".equalsIgnoreCase(tag)) { //$NON-NLS-1$
      return new BRFigureHandler();
    } else if (!HTMLUtil.isVisualHtmlElement(tag)) {
      return new HiddenFigureHandler(getSharedHTMLImage(ele));
    } else {
      return new DefaultFigureHandler();
    }
  }

  /**
   * @param tag
   * @return
   */
  private static Image getSharedHTMLImage(Element element) {
    Image image = null;
   
        IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(element);
        if (context != null){  
          IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
          if (wsResolver != null){
            image = TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"HTML", element.getLocalName()); //$NON-NLS-1$
          }
        }
    return image != null ? image : JSFUICommonPlugin.getDefault().getImage(
      JSFSharedImages.DEFAULT_PALETTE_TAG_IMG)
  }
 
  private FigureFactory()
  {
      // no external instantiation
  }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.figurehandler.FigureFactory

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.