[Title] NullPointerException occured at opening WPE with html file, which has object...
authorchanghyun1.lee <changhyun1.lee@samsung.com>
Mon, 21 Jan 2013 12:11:33 +0000 (21:11 +0900)
committerchanghyun1.lee <changhyun1.lee@samsung.com>
Mon, 21 Jan 2013 12:13:21 +0000 (21:13 +0900)
[Desc.]
[Issue] Redmine-8125

Change-Id: I225df180b9b7fa92a26638ff7ec17bf01f602d30

org.eclipse.jst.pagedesigner.patch/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java [new file with mode: 0755]

diff --git a/org.eclipse.jst.pagedesigner.patch/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java b/org.eclipse.jst.pagedesigner.patch/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
new file mode 100755 (executable)
index 0000000..708dc74
--- /dev/null
@@ -0,0 +1,220 @@
+/*******************************************************************************\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