From d666b9d198adb00e4cda936ac3287f0a8f3a4445 Mon Sep 17 00:00:00 2001 From: Amin Date: Fri, 26 Mar 2021 23:01:13 +0430 Subject: [PATCH] Fix issue related to opening a saved file --- pom.xml | 2 +- .../ac/sbu/controller/DrawPaneController.java | 13 ++-- .../ir/ac/sbu/controller/MainController.java | 17 +++-- src/main/java/ir/ac/sbu/model/NodeModel.java | 15 +++-- .../ir/ac/sbu/service/SaveLoadService.java | 64 ++++--------------- .../ac/sbu/service/jsonmodel/GraphJSON.java | 35 +++++++++- .../ir/ac/sbu/service/jsonmodel/NodeJSON.java | 9 ++- 7 files changed, 81 insertions(+), 74 deletions(-) diff --git a/pom.xml b/pom.xml index 17213df..9fb38ef 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ir.ac.sbu PGen - 2.4.2 + 2.4.3 UTF-8 diff --git a/src/main/java/ir/ac/sbu/controller/DrawPaneController.java b/src/main/java/ir/ac/sbu/controller/DrawPaneController.java index b164a23..2be569b 100644 --- a/src/main/java/ir/ac/sbu/controller/DrawPaneController.java +++ b/src/main/java/ir/ac/sbu/controller/DrawPaneController.java @@ -13,7 +13,7 @@ import ir.ac.sbu.model.NodeModel; public class DrawPaneController implements RefreshableController { - private Pane pane; + private final Pane pane; private GraphModel graph; private NodeModel firstNode = null; @@ -23,6 +23,9 @@ public DrawPaneController(Pane pane) { } public void refresh() { + if (graph == null) { + return; // Not initialized yet. + } pane.getChildren().clear(); for (NodeModel nodeModel : graph.getNodes()) { @@ -42,11 +45,9 @@ public void refresh() { private void onShiftClick(MouseEvent mouseEvent) { NodeModel node = ((GraphNode) mouseEvent.getSource()).getNodeModel(); - if (firstNode == null) - firstNode = node; - else { - CommandManager.getInstance().applyCommand( new MakeEdgeCmd(firstNode, node)); - firstNode = node; + firstNode = node; + if (firstNode != null) { + CommandManager.getInstance().applyCommand(new MakeEdgeCmd(firstNode, node)); } } diff --git a/src/main/java/ir/ac/sbu/controller/MainController.java b/src/main/java/ir/ac/sbu/controller/MainController.java index 39d7a30..d0857dd 100644 --- a/src/main/java/ir/ac/sbu/controller/MainController.java +++ b/src/main/java/ir/ac/sbu/controller/MainController.java @@ -12,6 +12,7 @@ import ir.ac.sbu.utility.DialogUtility; import ir.ac.sbu.utility.GenerateUID; import ir.ac.sbu.utility.ResourceUtility; +import java.io.FileNotFoundException; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -357,9 +358,16 @@ private void fileNew(ActionEvent actionEvent) { private void fileOpen(ActionEvent actionEvent) { File selectedFile = DialogUtility.showOpenDialog(pane.getScene().getWindow(), "*.pgs"); if (selectedFile != null) { - SaveLoadService exportService = new SaveLoadService(selectedFile); - exportService.load(graphList); - drawPaneController.setGraph(graphList.getItems().get(0)); + List graphList; + try { + graphList = SaveLoadService.load(selectedFile); + } catch (FileNotFoundException e) { + DialogUtility.showErrorDialog("Unable to find file: " + selectedFile.getPath(), e.toString()); + return; + } + + drawPaneController.setGraph(graphList.get(0)); + graphs.setAll(graphList); drawPaneController.refresh(); lastChosenFileForSave = selectedFile; } @@ -386,8 +394,7 @@ private boolean fileSaveAs(ActionEvent actionEvent) { private void saveGraphs(File file) { parserRenumber(null); - SaveLoadService exportService = new SaveLoadService(file); - exportService.save(graphs); + SaveLoadService.save(graphs, file); } public void helpAbout(ActionEvent actionEvent) { diff --git a/src/main/java/ir/ac/sbu/model/NodeModel.java b/src/main/java/ir/ac/sbu/model/NodeModel.java index 6c110a7..91aa650 100644 --- a/src/main/java/ir/ac/sbu/model/NodeModel.java +++ b/src/main/java/ir/ac/sbu/model/NodeModel.java @@ -1,18 +1,21 @@ package ir.ac.sbu.model; -import javafx.beans.property.*; - import java.util.ArrayList; import java.util.List; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleDoubleProperty; public class NodeModel { + private int id; - private DoubleProperty x; - private DoubleProperty y; + private final DoubleProperty x; + private final DoubleProperty y; private GraphModel graph; - private BooleanProperty finalNode; - private BooleanProperty startNode; + private final BooleanProperty finalNode; + private final BooleanProperty startNode; private List adjacent; public NodeModel(double x, double y, GraphModel graph, int id) { diff --git a/src/main/java/ir/ac/sbu/service/SaveLoadService.java b/src/main/java/ir/ac/sbu/service/SaveLoadService.java index fe94e8d..1b635be 100644 --- a/src/main/java/ir/ac/sbu/service/SaveLoadService.java +++ b/src/main/java/ir/ac/sbu/service/SaveLoadService.java @@ -2,33 +2,22 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import ir.ac.sbu.model.GraphModel; +import ir.ac.sbu.model.NodeModel; import ir.ac.sbu.service.jsonmodel.GraphJSON; import ir.ac.sbu.utility.DialogUtility; import ir.ac.sbu.utility.GenerateUID; -import javafx.scene.control.ListView; -import ir.ac.sbu.model.EdgeModel; -import ir.ac.sbu.model.GraphModel; -import ir.ac.sbu.model.NodeModel; - import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; - public class SaveLoadService { - private File file; - - public SaveLoadService(File selectedDirectory) { - file = selectedDirectory; - } - public void save(List graphs) { + public static void save(List graphs, File file) { List graphJSONs = graphs.stream().map(GraphJSON::new).collect(Collectors.toList()); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String out = gson.toJson(graphJSONs); @@ -40,47 +29,16 @@ public void save(List graphs) { } - public void load(ListView list) { + public static List load(File file) throws FileNotFoundException { Gson gson = new GsonBuilder().setPrettyPrinting().create(); - List graphJSONs = null; - try { - list.getItems().clear(); - graphJSONs = Arrays.asList(gson.fromJson(new FileReader(file), GraphJSON[].class)); - graphJSONs.forEach(graph -> - { - GraphModel graphModel = new GraphModel(graph.getName()); - Map nodes = new HashMap<>(); - graph.getNodes().forEach(nodeJSON -> { - NodeModel node = new NodeModel(nodeJSON.getX(), nodeJSON.getY(), graphModel, GenerateUID.createID()); - node.setId(nodeJSON.getId()); - node.setFinalNode(nodeJSON.isFinal()); - nodes.put(node.getId(), node); - graphModel.getNodes().add(node); - }); - if (graph.getStart() != -1) - if (graphModel.getNodes().stream().anyMatch(nodeJSON -> nodeJSON.getId() == graph.getStart())) - graphModel.setStart(graphModel.getNodes().stream().filter(nodeJSON -> nodeJSON.getId() == graph.getStart()).findFirst().get()); - graph.getEdges().forEach(edgeJSON -> - { - NodeModel start = nodes.get(edgeJSON.getStart()); - NodeModel end = nodes.get(edgeJSON.getEnd()); - EdgeModel edge = new EdgeModel(start, end); - edge.setFunction(edgeJSON.getFunc()); - edge.setToken(edgeJSON.getToken()); - edge.anchorXProperty().setValue(edgeJSON.getAnchorX()); - edge.anchorYProperty().setValue(edgeJSON.getAnchorY()); - edge.setGraph(edgeJSON.isGraph()); - edge.setGlobal(edgeJSON.isGlobal()); - start.getAdjacentList().add(edge); + List graphs = Arrays.stream(gson.fromJson(new FileReader(file), GraphJSON[].class)) + .map(GraphJSON::toGraphModel) + .collect(Collectors.toList()); - }); - list.getItems().add(graphModel); - }); - GenerateUID.setIdCounter(list.getItems().stream(). - flatMap(graphModel -> graphModel.getNodes().stream()).map(NodeModel::getId).max(Integer::compareTo).get() + 1); + GenerateUID.setIdCounter(graphs.stream(). + flatMap(graphModel -> graphModel.getNodes().stream()) + .mapToInt(NodeModel::getId).max().orElse(0) + 1); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } + return graphs; } } diff --git a/src/main/java/ir/ac/sbu/service/jsonmodel/GraphJSON.java b/src/main/java/ir/ac/sbu/service/jsonmodel/GraphJSON.java index 4dca69d..f289c5a 100644 --- a/src/main/java/ir/ac/sbu/service/jsonmodel/GraphJSON.java +++ b/src/main/java/ir/ac/sbu/service/jsonmodel/GraphJSON.java @@ -1,11 +1,14 @@ package ir.ac.sbu.service.jsonmodel; +import ir.ac.sbu.model.EdgeModel; import ir.ac.sbu.model.GraphModel; - +import ir.ac.sbu.model.NodeModel; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class GraphJSON { + private String name; private List nodes; private List edges; @@ -18,8 +21,36 @@ public GraphJSON(GraphModel g) { name = g.getName(); nodes = g.getNodes().stream().map(NodeJSON::new).collect(Collectors.toList()); edges = g.getEdges().stream().map(EdgeJSON::new).collect(Collectors.toList()); - if (g.getStart() != null) + if (g.getStart() != null) { start = g.getStart().getId(); + } + } + + public GraphModel toGraphModel() { + GraphModel graphModel = new GraphModel(name); + Map graphNodes = nodes.stream() + .collect(Collectors.toMap(NodeJSON::getId, node -> node.toNodeModel(graphModel))); + graphModel.getNodes().addAll(graphNodes.values()); + if (start != -1) { + graphModel.getNodes().stream() + .filter(nodeJSON -> nodeJSON.getId() == start) + .findFirst().ifPresent(graphModel::setStart); + } + + edges.forEach(edgeJSON -> + { + NodeModel start = graphNodes.get(edgeJSON.getStart()); + NodeModel end = graphNodes.get(edgeJSON.getEnd()); + EdgeModel edge = new EdgeModel(start, end); + edge.setFunction(edgeJSON.getFunc()); + edge.setToken(edgeJSON.getToken()); + edge.anchorXProperty().setValue(edgeJSON.getAnchorX()); + edge.anchorYProperty().setValue(edgeJSON.getAnchorY()); + edge.setGraph(edgeJSON.isGraph()); + edge.setGlobal(edgeJSON.isGlobal()); + start.getAdjacentList().add(edge); + }); + return graphModel; } public String getName() { diff --git a/src/main/java/ir/ac/sbu/service/jsonmodel/NodeJSON.java b/src/main/java/ir/ac/sbu/service/jsonmodel/NodeJSON.java index daac0a3..1081830 100644 --- a/src/main/java/ir/ac/sbu/service/jsonmodel/NodeJSON.java +++ b/src/main/java/ir/ac/sbu/service/jsonmodel/NodeJSON.java @@ -1,15 +1,16 @@ package ir.ac.sbu.service.jsonmodel; +import ir.ac.sbu.model.GraphModel; import ir.ac.sbu.model.NodeModel; public class NodeJSON { + private double x; private double y; private int id; private boolean isFinal; public NodeJSON() { - } public NodeJSON(NodeModel n) { @@ -19,6 +20,12 @@ public NodeJSON(NodeModel n) { isFinal = n.isFinalNode(); } + public NodeModel toNodeModel(GraphModel graphModel) { + NodeModel node = new NodeModel(x, y, graphModel, id); + node.setFinalNode(isFinal); + return node; + } + public double getX() { return x; }