Skip to content

Commit

Permalink
Fix issue related to opening a saved file
Browse files Browse the repository at this point in the history
  • Loading branch information
Borjianamin98 committed Mar 26, 2021
1 parent 42813fd commit d666b9d
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 74 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>ir.ac.sbu</groupId>
<artifactId>PGen</artifactId>
<version>2.4.2</version>
<version>2.4.3</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/ir/ac/sbu/controller/DrawPaneController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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()) {
Expand All @@ -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));
}
}

Expand Down
17 changes: 12 additions & 5 deletions src/main/java/ir/ac/sbu/controller/MainController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<GraphModel> 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;
}
Expand All @@ -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) {
Expand Down
15 changes: 9 additions & 6 deletions src/main/java/ir/ac/sbu/model/NodeModel.java
Original file line number Diff line number Diff line change
@@ -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<EdgeModel> adjacent;

public NodeModel(double x, double y, GraphModel graph, int id) {
Expand Down
64 changes: 11 additions & 53 deletions src/main/java/ir/ac/sbu/service/SaveLoadService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<GraphModel> graphs) {
public static void save(List<GraphModel> graphs, File file) {
List<GraphJSON> graphJSONs = graphs.stream().map(GraphJSON::new).collect(Collectors.toList());
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String out = gson.toJson(graphJSONs);
Expand All @@ -40,47 +29,16 @@ public void save(List<GraphModel> graphs) {

}

public void load(ListView<GraphModel> list) {
public static List<GraphModel> load(File file) throws FileNotFoundException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
List<GraphJSON> 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<Integer, NodeModel> 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<GraphModel> 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;
}
}
35 changes: 33 additions & 2 deletions src/main/java/ir/ac/sbu/service/jsonmodel/GraphJSON.java
Original file line number Diff line number Diff line change
@@ -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<NodeJSON> nodes;
private List<EdgeJSON> edges;
Expand All @@ -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<Integer, NodeModel> 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() {
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/ir/ac/sbu/service/jsonmodel/NodeJSON.java
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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;
}
Expand Down

0 comments on commit d666b9d

Please sign in to comment.