--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2006 Sybase, Inc. and others.\r
+ *\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Sybase, Inc. - initial API and implementation\r
+ *******************************************************************************/\r
+package org.eclipse.jst.pagedesigner.figurehandler;\r
+\r
+import java.util.List;\r
+\r
+import org.eclipse.core.resources.IFile;\r
+import org.eclipse.draw2d.IFigure;\r
+import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;\r
+import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;\r
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;\r
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;\r
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;\r
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;\r
+import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;\r
+import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;\r
+import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;\r
+import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;\r
+import org.eclipse.jst.pagedesigner.utils.HTMLUtil;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;\r
+import org.w3c.dom.Element;\r
+import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
+import org.w3c.dom.Text;\r
+\r
+/**\r
+ * @author mengbo\r
+ * @version 1.5\r
+ */\r
+public final class FigureFactory \r
+{\r
+ /**\r
+ * @param figure\r
+ * @param node\r
+ */\r
+ private static void createFigureDeep(IFigure parentFigure, final Node node) {\r
+ if (node instanceof Element) {\r
+ IFigureHandler handler = createAndAdapt((Element) node);\r
+ if (handler instanceof HiddenFigureHandler) {\r
+ // for deep hidden element, we don't create figure for them.\r
+ // this will remove the small <> icon for data window.\r
+ return;\r
+ }\r
+ CSSFigure figure = new CSSFigure();\r
+ handler.updateFigure((Element) node, figure);\r
+ // IFigure figure = handler.createFigure((Element) node);\r
+ parentFigure.add(figure);\r
+ if (!handler.isWidget()) {\r
+ NodeList children = node.getChildNodes();\r
+\r
+ for (int i = 0, size = children.getLength(); i < size; i++) {\r
+ createFigureDeep(figure, children.item(i));\r
+ }\r
+ }\r
+ } else if (node instanceof Text) {\r
+ final String data = HTMLUtil.compactWhitespaces((Text) node, node\r
+ .getNodeValue());\r
+ // XXX: seemed there is some bug in handling whitespace (unnecessary\r
+ // take additional space)\r
+ // so skip it here.\r
+ if (data.trim().length() == 0) {\r
+ return;\r
+ }\r
+ // XXX: currently creating of CSSTextFigure is distributed both here\r
+ // and TextEditPart. We may want to unify them later.\r
+ CSSTextFigure figure = new CSSTextFigure(new ICSSTextProvider() {\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()\r
+ */\r
+ // TODO: dead?\r
+// public ICSSStyle getCSSStyle() {\r
+// INodeNotifier notifier = (INodeNotifier) node\r
+// .getParentNode();\r
+// return (ICSSStyle) notifier.getAdapterFor(ICSSStyle.class);\r
+// }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getTextData()\r
+ */\r
+ public String getTextData() {\r
+ return data;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getSelectedRange()\r
+ */\r
+ public int[] getSelectedRange() {\r
+ // text figure created here will not be real text in\r
+ // original doc.\r
+ // so don't support their selection.\r
+ return null;\r
+ }\r
+ });\r
+ parentFigure.add(figure);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param ele\r
+ * @param old\r
+ * @param figure\r
+ * @return the figure\r
+ */\r
+ public static IFigure updateDeepFigure(Element ele, Element old,\r
+ CSSFigure figure) {\r
+ recursiveDisposeAndUnadapt(old);\r
+ List figureChildren = figure.getChildren();\r
+ for (int i = figureChildren.size() - 1; i >= 0; i--) {\r
+ figure.remove((IFigure) figureChildren.get(i));\r
+ }\r
+\r
+ IFigureHandler handler = createAndAdapt(ele);\r
+ handler.updateFigure(ele, figure);\r
+ if (!handler.isWidget()) {\r
+ NodeList children = ele.getChildNodes();\r
+ for (int i = 0, size = children.getLength(); i < size; i++) {\r
+ createFigureDeep(figure, children.item(i));\r
+ }\r
+ }\r
+ return figure;\r
+ }\r
+\r
+\r
+ private static void recursiveDisposeAndUnadapt(Element ele) {\r
+ disposeAndUnadapt(ele);\r
+ NodeList nl = ele.getChildNodes();\r
+ for (int i = 0, size = nl.getLength(); i < size; i++) {\r
+ Node n = nl.item(i);\r
+ if (n instanceof Element) {\r
+ recursiveDisposeAndUnadapt((Element) n);\r
+ }\r
+ }\r
+ }\r
+\r
+ private static void disposeAndUnadapt(Element ele) {\r
+ IFigureHandler handler = getHandler(ele);\r
+ if (handler != null) {\r
+ handler.dispose();\r
+ ((IDOMElement) ele).removeAdapter(handler);\r
+ }\r
+ }\r
+\r
+ private static IFigureHandler getHandler(Element ele) {\r
+ if (ele instanceof IDOMElement) {\r
+ IDOMElement xmlele = (IDOMElement) ele;\r
+ return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private static IFigureHandler createAndAdapt(Element ele) {\r
+ IFigureHandler handler = createFigureHandler(ele);\r
+ if (ele instanceof IDOMElement) {\r
+ ((IDOMElement) ele).addAdapter(handler);\r
+ }\r
+ return handler;\r
+ }\r
+\r
+ private static IFigureHandler createFigureHandler(Element ele) {\r
+ String tag = ele.getTagName();\r
+ if ("input".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ return new InputFigureHandler();\r
+ } else if ("select".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ return new SelectFigureHandler();\r
+ } else if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ return new ImgFigureHandler();\r
+ } else if ("object".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ // NOTE:: https://bugs.eclipse.org/bugs/show_bug.cgi?id=398476\r
+ //return new ObjectFigureHandler();\r
+ return new DefaultFigureHandler();\r
+ } else if ("textarea".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ return new TextareaFigureHandler();\r
+ } else if ("br".equalsIgnoreCase(tag)) { //$NON-NLS-1$\r
+ return new BRFigureHandler();\r
+ } else if (!HTMLUtil.isVisualHtmlElement(tag)) {\r
+ return new HiddenFigureHandler(getSharedHTMLImage(ele));\r
+ } else {\r
+ return new DefaultFigureHandler();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param tag\r
+ * @return\r
+ */\r
+ private static Image getSharedHTMLImage(Element element) {\r
+ Image image = null;\r
+ \r
+ IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(element);\r
+ if (context != null){ \r
+ IWorkspaceContextResolver wsResolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);\r
+ if (wsResolver != null){\r
+ image = TagImageManager.getInstance().getSmallIconImage((IFile)wsResolver.getResource(),"HTML", element.getLocalName()); //$NON-NLS-1$\r
+ }\r
+ }\r
+ return image != null ? image : JSFUICommonPlugin.getDefault().getImage(\r
+ JSFSharedImages.DEFAULT_PALETTE_TAG_IMG); \r
+ }\r
+ \r
+ private FigureFactory()\r
+ {\r
+ // no external instantiation\r
+ }\r
+}\r