blob: f061e116ad96ca21e6a44735506910e8bd4ef6e2 [file] [log] [blame]
/*******************************************************************************
* 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
}
}