Skip to content

Commit 0541f9d

Browse files
committed
Open/Save signatures to file
1 parent ceb5321 commit 0541f9d

File tree

2 files changed

+102
-3
lines changed

2 files changed

+102
-3
lines changed

src/com/inverseinnovations/VisualMALSignatureDesigner/BlockWindow.java

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,26 @@
88
import java.awt.event.ActionEvent;
99
import java.awt.event.ActionListener;
1010
import java.awt.event.KeyEvent;
11+
import java.io.File;
12+
import java.io.IOException;
1113
import java.io.PrintWriter;
14+
import java.nio.file.Files;
15+
import java.nio.file.Paths;
1216

1317
import javax.swing.BorderFactory;
1418
import javax.swing.Box;
1519
import javax.swing.BoxLayout;
1620
import javax.swing.ImageIcon;
1721
import javax.swing.JButton;
1822
import javax.swing.JDialog;
23+
import javax.swing.JFileChooser;
1924
import javax.swing.JFrame;
2025
import javax.swing.JLabel;
2126
import javax.swing.JList;
2227
import javax.swing.JMenu;
2328
import javax.swing.JMenuBar;
2429
import javax.swing.JMenuItem;
30+
import javax.swing.JOptionPane;
2531
import javax.swing.JPanel;
2632
import javax.swing.JScrollPane;
2733
import javax.swing.JTabbedPane;
@@ -30,6 +36,9 @@
3036
import javax.swing.ListSelectionModel;
3137
import javax.swing.SwingUtilities;
3238
import javax.swing.WindowConstants;
39+
import javax.swing.filechooser.FileFilter;
40+
import javax.swing.filechooser.FileNameExtensionFilter;
41+
3342
import com.inverseinnovations.VisualMALSignatureDesigner.BuildingBlock.*;
3443
import com.inverseinnovations.VisualMALSignatureDesigner.BuildingBlock.Filter.*;
3544

@@ -59,7 +68,72 @@ public void run(){
5968
JMenu menu = new JMenu("File");//Build the first menu.
6069

6170
//a group of JMenuItems
62-
JMenuItem menuItem = new JMenuItem("Generate Script");
71+
JMenuItem menuItem = new JMenuItem("Open");
72+
menuItem.addActionListener(new ActionListener(){
73+
public void actionPerformed(ActionEvent e){
74+
final JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
75+
FileFilter filter = new FileNameExtensionFilter("VisualMSD file", new String[] {"vmsd"});
76+
fc.addChoosableFileFilter(filter);
77+
fc.setFileFilter(filter);
78+
79+
File dir = new File(System.getProperty("user.dir"));
80+
if(dir.isDirectory() && dir.canRead()){
81+
fc.setCurrentDirectory(dir);
82+
int returnVal = fc.showOpenDialog(blockFrame);
83+
if (returnVal == JFileChooser.APPROVE_OPTION) {
84+
File file = fc.getSelectedFile();
85+
if(file.isFile()){
86+
//load file
87+
BuildingBlock block = null;
88+
try {
89+
block = blocks.bytesToNode(Files.readAllBytes(Paths.get(file.getPath())));
90+
} catch (IOException e1) {JOptionPane.showMessageDialog(blockFrame, "ERROR: Cannot load file!");}
91+
if(block != null){
92+
blocks.setRootNode(block);
93+
}
94+
}
95+
}
96+
}
97+
}
98+
});
99+
menu.add(menuItem);
100+
//a group of JMenuItems
101+
menuItem = new JMenuItem("Save");
102+
menuItem.addActionListener(new ActionListener(){
103+
public void actionPerformed(ActionEvent e){
104+
final JFileChooser fc = new JFileChooser(System.getProperty("user.dir") + "sig.vmsd");
105+
FileFilter filter = new FileNameExtensionFilter("VisualMSD file", new String[] {"vmsd"});
106+
fc.setSelectedFile(new File("sig.vmsd"));
107+
fc.addChoosableFileFilter(filter);
108+
fc.setFileFilter(filter);
109+
110+
File dir = new File(System.getProperty("user.dir"));
111+
if(dir.isDirectory() && dir.canWrite()){
112+
fc.setCurrentDirectory(dir);
113+
int returnVal = fc.showSaveDialog(blockFrame);
114+
if (returnVal == JFileChooser.APPROVE_OPTION) {
115+
File file = fc.getSelectedFile();
116+
BuildingBlock block = blocks.getRootNode();
117+
if(file.exists()){
118+
if(file.canWrite()){
119+
try {
120+
Files.write(Paths.get(file.getPath()), blocks.nodeToBytes(block));
121+
JOptionPane.showMessageDialog(blockFrame, "Saved");
122+
} catch (IOException e1) {JOptionPane.showMessageDialog(blockFrame, "ERROR: Cannot save file!");}
123+
}else{JOptionPane.showMessageDialog(blockFrame, "File is not rewritable");}
124+
}
125+
else{
126+
try {
127+
Files.write(Paths.get(file.getPath()), blocks.nodeToBytes(block));
128+
JOptionPane.showMessageDialog(blockFrame, "Saved");
129+
} catch (IOException e1) {JOptionPane.showMessageDialog(blockFrame, "ERROR: Cannot save file!");}
130+
}
131+
}
132+
}else{JOptionPane.showMessageDialog(blockFrame, "Dir is not writable");}
133+
}
134+
});
135+
menu.add(menuItem);
136+
menuItem = new JMenuItem("Generate Script");
63137
menuItem.addActionListener(new ActionListener(){
64138
public void actionPerformed(ActionEvent e){
65139
final JDialog d = new JDialog(blockFrame, "MSD Script", true);

src/com/inverseinnovations/VisualMALSignatureDesigner/DynamicTree.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,15 @@ private void reExpandPaths(List<TreePath> expPaths){
214214
}
215215

216216
public BuildingBlock cloneNode(BuildingBlock node){
217-
ByteArrayOutputStream bos = new ByteArrayOutputStream();
218217
BuildingBlock theReturn = null;
218+
219+
byte[] bytes = nodeToBytes(node);
220+
theReturn = bytesToNode(bytes);
221+
return theReturn;
222+
}
223+
224+
public byte[] nodeToBytes(BuildingBlock node){
225+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
219226
ObjectOutputStream oos = null;
220227
try {
221228
oos = new ObjectOutputStream(bos);
@@ -229,7 +236,11 @@ public BuildingBlock cloneNode(BuildingBlock node){
229236
} catch (IOException e) {}
230237
}
231238

232-
byte[] bytes = bos.toByteArray();
239+
return bos.toByteArray();
240+
}
241+
242+
public BuildingBlock bytesToNode(byte[] bytes){
243+
BuildingBlock theReturn = null;
233244
ObjectInputStream ois;
234245
try {
235246
ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
@@ -240,6 +251,20 @@ public BuildingBlock cloneNode(BuildingBlock node){
240251
return theReturn;
241252
}
242253

254+
public void setRootNode(BuildingBlock node){
255+
if(node != null){
256+
if(node instanceof InitSignature){
257+
rootNode = node;
258+
treeModel = new DefaultTreeModel(rootNode);
259+
tree.setModel(treeModel);
260+
rootNode.reinit(Main);
261+
reload();
262+
Main.ImageWindow.update();
263+
}
264+
else{System.out.println("Not a root node");}
265+
}
266+
}
267+
243268
class MyTreeModelListener implements TreeModelListener {
244269
public void treeNodesChanged(TreeModelEvent e) {
245270
DefaultMutableTreeNode node;

0 commit comments

Comments
 (0)