package bluej.stride.framedjava.frames;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import bluej.parser.ParseFailure;
import bluej.stride.framedjava.ast.Parser;
import bluej.stride.framedjava.convert.ConversionWarning;
import bluej.stride.framedjava.convert.ConvertResultDialog;
import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import bluej.stride.framedjava.ast.Loader;
import bluej.stride.framedjava.elements.CodeElement;
import bluej.stride.generic.Frame;
import bluej.utility.Debug;
import threadchecker.OnThread;
import threadchecker.Tag;
public class GreenfootFrameUtil
{
private static class XMLParseResult
{
public final List<CodeElement> elements;
public final String error;
public XMLParseResult(List<CodeElement> elements)
{
this.elements = elements;
this.error = null;
}
public XMLParseResult(String error)
{
this.elements = null;
this.error = error;
}
}
@OnThread(Tag.FXPlatform)
public static List getClipboardElements(Parser.JavaContext context)
{
final Clipboard clipboard = Clipboard.getSystemClipboard();
if (clipboard.hasString()) {
XMLParseResult strideParseResult = getElements(clipboard.getString());
if (strideParseResult.elements != null)
return strideParseResult.elements;
try
{
Parser.ConversionResult javaConvertResult = Parser.javaToStride(clipboard.getString(), context, false);
if (!javaConvertResult.getWarnings().isEmpty())
{
new ConvertResultDialog(javaConvertResult.getWarnings().stream().map(ConversionWarning::getMessage).collect(Collectors.toList())).showAndWait();
}
return javaConvertResult.getElements();
}
catch (ParseFailure pf)
{
new ConvertResultDialog(strideParseResult.error, pf.getMessage()).showAndWait();
return null;
}
}
return null;
}
private static XMLParseResult getElements(String xmlString)
{
Builder parser = new Builder();
Document doc = null;
try {
doc = parser.build(xmlString, null);
}
catch (ParsingException | IOException e) {
Debug.reportError(e);
return new XMLParseResult(e.getMessage());
}
if (doc == null) {
return new XMLParseResult("Unknown error");
}
Element root = doc.getRootElement();
if (!root.getLocalName().equals("frames")) {
return new XMLParseResult("Outer element was not frames");
}
List<CodeElement> elements = new ArrayList<CodeElement>();
for (int i = 0; i < root.getChildElements().size(); i++) {
elements.add(Loader.loadElement(root.getChildElements().get(i)));
}
return new XMLParseResult(elements);
}
public static String getXmlForMultipleFrames(List<Frame> frames)
{
Element framesEl = getXmlElementForMultipleFrames(frames);
return framesEl.toXML();
}
public static Element getXmlElementForMultipleFrames(List<Frame> frames)
{
Element framesEl = new Element("frames");
for (Frame f : frames) {
if (f instanceof CodeFrame) {
((CodeFrame<?>) f).regenerateCode();
CodeElement c = ((CodeFrame<?>) f).getCode();
framesEl.appendChild(c.toXML());
}
}
return framesEl;
}
@OnThread(Tag.FXPlatform)
private static String getJavaForMultipleFrames(List<Frame> frames)
{
StringBuilder java = new StringBuilder();
for (Frame f : frames) {
if (f instanceof CodeFrame) {
CodeElement c = ((CodeFrame<?>) f).getCode();
java.append(c.toJavaSource().toTemporaryJavaCodeString());
}
}
return java.toString();
}
public static List getElementsForMultipleFrames(List<Frame> frames)
{
return getElements(getXmlForMultipleFrames(frames)).elements;
}
public static void doCopyAsStride(List<Frame> frames)
{
if (frames.size() == 0)
return;
final ClipboardContent content = new ClipboardContent();
content.putString(getXmlForMultipleFrames(frames));
Clipboard.getSystemClipboard().setContent(content);
}
public static void doCopyAsImage(List<Frame> frames)
{
if (frames.size() == 0)
return;
final ClipboardContent content = new ClipboardContent();
content.putImage(Frame.takeShot(frames, null));
Clipboard.getSystemClipboard().setContent(content);
}
@OnThread(Tag.FXPlatform)
public static void doCopyAsJava(List<Frame> frames)
{
if (frames.size() == 0)
return;
final ClipboardContent content = new ClipboardContent();
content.putString(getJavaForMultipleFrames(frames));
Clipboard.getSystemClipboard().setContent(content);
}
}
top,
use,
map,
class GreenfootFrameUtil
top,
use,
map,
class GreenfootFrameUtil . XMLParseResult
. XMLParseResult
. XMLParseResult
. getClipboardElements
. getElements
. getXmlForMultipleFrames
. getXmlElementForMultipleFrames
. getJavaForMultipleFrames
. getElementsForMultipleFrames
. doCopyAsStride
. doCopyAsImage
. doCopyAsJava
212 neLoCode
+ 0 LoComm