| package org.eclipse.wst.sse.sieditor.ui.v2.clipboard; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.UnsupportedEncodingException; |
| |
| 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.ui.v2.dt.dnd.SiEditorTransfer; |
| 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 copyModelObjectToClipboard(IModelObject modelObject) { |
| Clipboard clipboard = new Clipboard(Display.getCurrent()); |
| |
| String modelObjectAsText = getModelObjectAsText(modelObject); |
| clipboard.setContents(new Object[] { modelObject, 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 IModelObject getModelObjectFromClipboard() { |
| Clipboard clipboard = new Clipboard(Display.getCurrent()); |
| return (IModelObject) clipboard.getContents(SiEditorTransfer.getInstance()); |
| } |
| } |