blob: 6c2bd97ab56f005cd0d65d6f2ea0b41ccbd16c88 [file] [log] [blame]
package org.eclipse.wst.sse.sieditor.ui.v2.dt.clipboard;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.sse.sieditor.core.common.Logger;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.xsd.api.IType;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.dnd.SiEditorTransfer;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.xsd.XSDConcreteComponent;
import org.w3c.dom.Node;
public class ClipboardService {
private static final String ERROR_ON_DOM_TRANSFORMATION = "Cannot get text resentation of model object. Paste of clipboard content as text will not be possible"; //$NON-NLS-1$
public static void copyModelObjectsToClipboard(Object[] objects) {
Clipboard clipboard = new Clipboard(Display.getCurrent());
List<IModelObject> modelObjectsToCopy = new ArrayList<IModelObject>();
String modelObjectAsText = ""; //$NON-NLS-1$
for (Object object : objects) {
if (object instanceof IModelObject) {
IModelObject modelObject = (IModelObject) object;
modelObjectAsText += getModelObjectAsText(modelObject);
modelObjectsToCopy.add(modelObject);
}
}
clipboard.setContents(new Object[] { modelObjectsToCopy.toArray(), modelObjectAsText },
new Transfer[] { SiEditorTransfer.getInstance(), TextTransfer.getInstance() });
}
private static String getModelObjectAsText(IModelObject modelObject) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Node domNode = getDomNode(modelObject);
if (domNode == null) {
return ""; //$NON-NLS-1$
}
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //$NON-NLS-1$ //$NON-NLS-2$
transformer.transform(new DOMSource(domNode), new StreamResult(outputStream));
} catch (TransformerConfigurationException e) {
Logger.logError(ERROR_ON_DOM_TRANSFORMATION, e);
} catch (TransformerFactoryConfigurationError e) {
Logger.logError(ERROR_ON_DOM_TRANSFORMATION, e);
} catch (TransformerException e) {
Logger.logError(ERROR_ON_DOM_TRANSFORMATION, e);
}
try {
return outputStream.toString("UTF-8"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
Logger.logError(ERROR_ON_DOM_TRANSFORMATION, e);
}
return ""; //$NON-NLS-1$
}
private static Node getDomNode(IModelObject modelObject) {
EObject eObject = modelObject.getComponent();
if (eObject instanceof XSDConcreteComponent) {
XSDConcreteComponent xsdConcreteComponent = (XSDConcreteComponent) eObject;
return xsdConcreteComponent.getElement();
}
if (eObject instanceof WSDLElement) {
WSDLElement wsdlElement = (WSDLElement) eObject;
return wsdlElement.getElement();
}
return null;
}
public static Object[] getModelObjectsFromClipboard() {
Clipboard clipboard = new Clipboard(Display.getCurrent());
return (Object[]) clipboard.getContents(SiEditorTransfer.getInstance());
}
public static boolean isCopyEnabled(Object[] selectedNodes) {
if (selectedNodes == null || selectedNodes.length == 0) {
return false;
}
for (Object selectedNode : selectedNodes) {
if (!(selectedNode instanceof IDataTypesTreeNode)) {
return false;
}
final IModelObject modelObject = ((IDataTypesTreeNode) selectedNode).getModelObject();
if (!(modelObject instanceof IType)) {
return false;
}
}
return true;
}
}