| 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; |
| } |
| |
| } |