Merge lp:~tapaal-contributor/tapaal/add-export-options into lp:tapaal

Proposed by Lena Said
Status: Merged
Approved by: Jiri Srba
Approved revision: 1120
Merged at revision: 1114
Proposed branch: lp:~tapaal-contributor/tapaal/add-export-options
Merge into: lp:tapaal
Diff against target: 497 lines (+176/-125)
6 files modified
src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNExporter.java (+9/-9)
src/pipe/gui/Export.java (+114/-83)
src/pipe/gui/ExportBatchDialog.java (+46/-26)
src/pipe/gui/GuiFrame.java (+4/-4)
src/pipe/gui/widgets/QueryDialog.java (+2/-2)
src/pipe/gui/widgets/filebrowser/NativeFileBrowser.java (+1/-1)
To merge this branch: bzr merge lp:~tapaal-contributor/tapaal/add-export-options
Reviewer Review Type Date Requested Status
Jiri Srba Approve
Lena Said (community) Needs Resubmitting
Kenneth Yrke Jørgensen code Approve
Review via email: mp+394850@code.launchpad.net

Commit message

Added different export formats in the batch dialog

Description of the change

Added the options to export to verifyTAPN and verifyDTAPN by selecting the engine in a drop down menu

To post a comment you must log in.
Kenneth Yrke Jørgensen (yrke) wrote :

I don't seen any major issues, but I added a few code styling comments that could be fixed.

review: Approve (code)
Jiri Srba (srba) wrote :

Two other things to fix:

1. when exporting to verifytapn and verifydtapn and model that has more than one query, it creates a single query.q file that does not parse by the engines (each query needs to get a separate query file, number them for example as query-1.q query-2.q etc).

2. In the batch export dropdown menu, add "model and queries" for the verifytapn and verifydtapn description.

3. The Export menu name should be: "Batch export of models and queries"

review: Needs Fixing
1120. By Lena Said on 2020-12-14

Fixed names and query files + cleaned up

Lena Said (lsaid) :
Lena Said (lsaid) wrote :

Fixed code styling and naming of elements in the UI. Also changed the way the queries are saved, so each query gets a query file

review: Needs Resubmitting
Jiri Srba (srba) wrote :

Tested and works very well.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNExporter.java'
2--- src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNExporter.java 2020-08-06 13:48:04 +0000
3+++ src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNExporter.java 2020-12-14 17:15:10 +0000
4@@ -30,10 +30,10 @@
5 }
6
7
8- return export(model, query, modelFile, queryFile, null, lens);
9+ return export(model, query, modelFile, queryFile, lens);
10 }
11
12- public ExportedVerifyTAPNModel export(TimedArcPetriNet model, TAPNQuery query, File modelFile, File queryFile, pipe.dataLayer.TAPNQuery dataLayerQuery, TabContent.TAPNLens lens) {
13+ public ExportedVerifyTAPNModel export(TimedArcPetriNet model, TAPNQuery query, File modelFile, File queryFile, TabContent.TAPNLens lens) {
14 if (modelFile == null || queryFile == null)
15 return null;
16
17@@ -44,16 +44,16 @@
18 modelStream.close();
19
20 PrintStream queryStream = new PrintStream(queryFile);
21- if (query.getCategory() == QueryCategory.CTL){
22- CTLQueryVisitor XMLVisitor = new CTLQueryVisitor();
23- queryStream.append(XMLVisitor.getXMLQueryFor(query.getProperty(), null));
24- } else if (lens != null && lens.isGame()) {
25- queryStream.append("control: " + query.getProperty().toString());
26+ if (query == null) {
27+ throw new FileNotFoundException(null);
28+ } else if (query.getCategory() == QueryCategory.CTL) {
29+ CTLQueryVisitor XMLVisitor = new CTLQueryVisitor();
30+ queryStream.append(XMLVisitor.getXMLQueryFor(query.getProperty(), null));
31+ } else if (lens != null && lens.isGame()) {
32+ queryStream.append("control: " + query.getProperty().toString());
33 } else {
34 queryStream.append(query.getProperty().toString());
35 }
36-
37-
38 queryStream.close();
39 } catch(FileNotFoundException e) {
40 System.err.append("An error occurred while exporting the model to verifytapn. Verification cancelled.");
41
42=== modified file 'src/pipe/gui/Export.java'
43--- src/pipe/gui/Export.java 2020-04-18 13:45:34 +0000
44+++ src/pipe/gui/Export.java 2020-12-14 17:15:10 +0000
45@@ -19,7 +19,8 @@
46 import java.io.FileOutputStream;
47 import java.io.IOException;
48 import java.io.PrintStream;
49-import java.util.Iterator;
50+import java.lang.reflect.Array;
51+import java.util.*;
52
53 import javax.imageio.ImageIO;
54 import javax.imageio.ImageWriter;
55@@ -33,6 +34,13 @@
56 import javax.xml.transform.TransformerConfigurationException;
57 import javax.xml.transform.TransformerException;
58
59+import dk.aau.cs.model.tapn.TimedArcPetriNet;
60+import dk.aau.cs.util.Tuple;
61+import dk.aau.cs.verification.VerifyTAPN.ExportedVerifyTAPNModel;
62+import dk.aau.cs.verification.VerifyTAPN.VerifyPNExporter;
63+import dk.aau.cs.verification.VerifyTAPN.VerifyTAPN;
64+import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNExporter;
65+import org.jetbrains.annotations.NotNull;
66 import org.w3c.dom.DOMException;
67
68 import dk.aau.cs.TCTL.visitors.CTLQueryVisitor;
69@@ -49,6 +57,7 @@
70 import pipe.dataLayer.NetWriter;
71 import pipe.dataLayer.TAPNQuery;
72 import pipe.gui.canvas.DrawingSurfaceImpl;
73+import pipe.gui.widgets.QueryDialog;
74 import pipe.gui.widgets.filebrowser.FileBrowser;
75
76 /**
77@@ -58,69 +67,92 @@
78 */
79 public class Export {
80
81- public static final int PNG = 1;
82- public static final int POSTSCRIPT = 2;
83- public static final int PRINTER = 3;
84- public static final int TIKZ = 5;
85- public static final int PNML = 6;
86- public static final int QUERY = 7;
87-
88- private static void toPnml(DrawingSurfaceImpl g, String filename)
89- throws NullPointerException, DOMException, TransformerConfigurationException,
90- IOException, ParserConfigurationException, TransformerException {
91- TabContent currentTab = CreateGui.getCurrentTab();
92- NetworkMarking currentMarking = null;
93- if(CreateGui.getCurrentTab().isInAnimationMode()){
94- currentMarking = currentTab.network().marking();
95- currentTab.network().setMarking(CreateGui.getAnimator().getInitialMarking());
96- }
97-
98- NetWriter tapnWriter = new PNMLWriter(
99- currentTab.network(),
100- currentTab.getGuiModels()
101- );
102-
103- tapnWriter.savePNML(new File(filename));
104-
105- if(CreateGui.getCurrentTab().isInAnimationMode()){
106- currentTab.network().setMarking(currentMarking);
107- }
108- }
109-
110- private static void toQueryXML(String filename){
111- toQueryXML(CreateGui.getCurrentTab().network(), filename, CreateGui.getCurrentTab().queries());
112-
113- }
114-
115- public static void toQueryXML(TimedArcPetriNetNetwork network, String filename, Iterable<TAPNQuery> queries){
116- try{
117- ITAPNComposer composer = new TAPNComposer(new MessengerImpl(), true);
118- NameMapping mapping = composer.transformModel(network).value2();
119- Iterator<TAPNQuery> queryIterator = queries.iterator();
120- PrintStream queryStream = new PrintStream(filename);
121- CTLQueryVisitor XMLVisitor = new CTLQueryVisitor();
122-
123- while(queryIterator.hasNext()){
124- TAPNQuery clonedQuery = queryIterator.next().copy();
125-
126- // Attempt to parse and possibly transform the string query using the manual edit parser
127- TCTLAbstractProperty newProperty;
128- try {
129- newProperty = TAPAALCTLQueryParser.parse(clonedQuery.getProperty().toString());
130- } catch (Throwable ex) {
131- newProperty = clonedQuery == null ? new TCTLPathPlaceHolder() : clonedQuery.getProperty();
132- }
133- newProperty.accept(new RenameAllPlacesVisitor(mapping), null);
134- newProperty.accept(new RenameAllTransitionsVisitor(mapping), null);
135- XMLVisitor.buildXMLQuery(newProperty, clonedQuery.getName());
136- }
137- queryStream.print(XMLVisitor.getFormatted());
138-
139- queryStream.close();
140- } catch(FileNotFoundException e) {
141- System.err.append("An error occurred while exporting the queries to XML.");
142- }
143- }
144+ public static final int PNG = 1;
145+ public static final int POSTSCRIPT = 2;
146+ public static final int PRINTER = 3;
147+ public static final int TIKZ = 5;
148+ public static final int PNML = 6;
149+ public static final int QUERY = 7;
150+
151+ private static void toPnml(DrawingSurfaceImpl g, String filename)
152+ throws NullPointerException, DOMException, TransformerConfigurationException,
153+ IOException, ParserConfigurationException, TransformerException {
154+ TabContent currentTab = CreateGui.getCurrentTab();
155+ NetworkMarking currentMarking = null;
156+ if (CreateGui.getCurrentTab().isInAnimationMode()) {
157+ currentMarking = currentTab.network().marking();
158+ currentTab.network().setMarking(CreateGui.getAnimator().getInitialMarking());
159+ }
160+
161+ NetWriter tapnWriter = new PNMLWriter(
162+ currentTab.network(),
163+ currentTab.getGuiModels()
164+ );
165+
166+ tapnWriter.savePNML(new File(filename));
167+
168+ if (CreateGui.getCurrentTab().isInAnimationMode()) {
169+ currentTab.network().setMarking(currentMarking);
170+ }
171+ }
172+
173+ private static void toQueryXML(String filename) {
174+ toQueryXML(CreateGui.getCurrentTab().network(), filename, CreateGui.getCurrentTab().queries());
175+
176+ }
177+
178+ public static void toQueryXML(TimedArcPetriNetNetwork network, String filename, Iterable<TAPNQuery> queries) {
179+ try {
180+ ITAPNComposer composer = new TAPNComposer(new MessengerImpl(), true);
181+ NameMapping mapping = composer.transformModel(network).value2();
182+ Iterator<TAPNQuery> queryIterator = queries.iterator();
183+ PrintStream queryStream = new PrintStream(filename);
184+ CTLQueryVisitor XMLVisitor = new CTLQueryVisitor();
185+
186+ while (queryIterator.hasNext()) {
187+ TAPNQuery clonedQuery = queryIterator.next().copy();
188+
189+ // Attempt to parse and possibly transform the string query using the manual edit parser
190+ TCTLAbstractProperty newProperty;
191+ try {
192+ newProperty = TAPAALCTLQueryParser.parse(clonedQuery.getProperty().toString());
193+ } catch (Throwable ex) {
194+ newProperty = clonedQuery == null ? new TCTLPathPlaceHolder() : clonedQuery.getProperty();
195+ }
196+ newProperty.accept(new RenameAllPlacesVisitor(mapping), null);
197+ newProperty.accept(new RenameAllTransitionsVisitor(mapping), null);
198+ XMLVisitor.buildXMLQuery(newProperty, clonedQuery.getName());
199+ }
200+ queryStream.print(XMLVisitor.getFormatted());
201+
202+ queryStream.close();
203+ } catch (FileNotFoundException e) {
204+ System.err.append("An error occurred while exporting the queries to XML.");
205+ }
206+ }
207+
208+ public static void toVerifyTAPN(TimedArcPetriNetNetwork network, Iterable<TAPNQuery> queries, String modelFile, String queryFile, boolean isDTAPN) {
209+ VerifyTAPNExporter exporter = new VerifyTAPNExporter();
210+
211+ ITAPNComposer composer = new TAPNComposer(new MessengerImpl(), false);
212+ Tuple<TimedArcPetriNet, NameMapping> transformedModel = composer.transformModel(network);
213+ TimedArcPetriNet model = transformedModel.value1();
214+
215+ TabContent.TAPNLens lens = new TabContent.TAPNLens(!model.isUntimed(), model.hasUncontrollableTransitions());
216+
217+ RenameAllPlacesVisitor visitor = new RenameAllPlacesVisitor(transformedModel.value2());
218+ int i = 0;
219+ for (TAPNQuery query : queries) {
220+ query.getProperty().accept(visitor, null);
221+ i++;
222+
223+ if (lens.isGame() && isDTAPN) {
224+ exporter.export(model, new dk.aau.cs.model.tapn.TAPNQuery(query.getProperty(), 0), new File(modelFile), new File(queryFile + i + ".q"), lens);
225+ } else {
226+ exporter.export(model, new dk.aau.cs.model.tapn.TAPNQuery(query.getProperty(), 0), new File(modelFile), new File(queryFile + i + ".q"), new TabContent.TAPNLens(true, false));
227+ }
228+ }
229+ }
230
231 public static void toPostScript(Object g, String filename)
232 throws PrintException, IOException {
233@@ -187,24 +219,23 @@
234 // dot is for extension
235 filename = filename.substring(0, dotpos + 1);
236 switch (format) {
237- case PNG:
238- filename += "png";
239- break;
240- case POSTSCRIPT:
241- filename += "ps";
242- break;
243- case TIKZ:
244- filename += "tex";
245- break;
246- case PNML:
247- filename += "pnml";
248- break;
249- case QUERY:
250- filename = filename.substring(0, dotpos);
251- filename += "-queries.xml";
252- break;
253- }
254-
255+ case PNG:
256+ filename += "png";
257+ break;
258+ case POSTSCRIPT:
259+ filename += "ps";
260+ break;
261+ case TIKZ:
262+ filename += "tex";
263+ break;
264+ case PNML:
265+ filename += "pnml";
266+ break;
267+ case QUERY:
268+ filename = filename.substring(0, dotpos);
269+ filename += "-queries.xml";
270+ break;
271+ }
272 }
273 }
274
275@@ -266,7 +297,7 @@
276 }
277 break;
278 }
279- } catch (Exception e) {
280+ } catch (Exception e) {
281 // There was some problem with the action
282 JOptionPane.showMessageDialog(CreateGui.getApp(),
283 "There were errors performing the requested action:\n" + e,
284
285=== modified file 'src/pipe/gui/ExportBatchDialog.java'
286--- src/pipe/gui/ExportBatchDialog.java 2020-07-20 08:09:36 +0000
287+++ src/pipe/gui/ExportBatchDialog.java 2020-12-14 17:15:10 +0000
288@@ -24,19 +24,7 @@
289 import java.util.Comparator;
290 import java.util.HashMap;
291 import java.util.List;
292-import javax.swing.BorderFactory;
293-import javax.swing.DefaultListModel;
294-import javax.swing.JButton;
295-import javax.swing.JCheckBox;
296-import javax.swing.JDialog;
297-import javax.swing.JLabel;
298-import javax.swing.JList;
299-import javax.swing.JPanel;
300-import javax.swing.JProgressBar;
301-import javax.swing.JScrollPane;
302-import javax.swing.JTable;
303-import javax.swing.JTextField;
304-import javax.swing.ListSelectionModel;
305+import javax.swing.*;
306 import javax.swing.border.Border;
307 import javax.swing.event.DocumentEvent;
308 import javax.swing.event.DocumentListener;
309@@ -46,6 +34,7 @@
310 import javax.xml.parsers.ParserConfigurationException;
311 import javax.xml.transform.TransformerConfigurationException;
312 import javax.xml.transform.TransformerException;
313+
314 import org.w3c.dom.DOMException;
315 import dk.aau.cs.gui.FileNameCellRenderer;
316 import dk.aau.cs.gui.components.ExportBatchResultTableModel;
317@@ -55,6 +44,7 @@
318 import dk.aau.cs.model.tapn.TimedArcPetriNet;
319 import dk.aau.cs.util.StringComparator;
320 import pipe.dataLayer.DataLayer;
321+import pipe.dataLayer.TAPNQuery;
322 import pipe.gui.widgets.filebrowser.FileBrowser;
323
324 public class ExportBatchDialog extends JDialog {
325@@ -62,8 +52,9 @@
326 private final static String TOOL_TIP_AddFilesButton = "Press to add nets to batch export";
327 private final static String TOOL_TIP_RemoveFilesButton = "Press to remove the currently selected nets";
328 private final static String TOOL_TIP_ClearFilesButton = "Press to remove all nets from list";
329- private final static String TOOL_TIP_ExportFilesButton = "Press to export all nets in PNML and XML format";
330- private final static String TOOL_TIP_UniqueQueryNamesCheckbox = "Give queries unique names when exporting";
331+ private final static String TOOL_TIP_ExportFilesButton = "Press to export all nets in the selected format";
332+ private final static String TOOL_TIP_SelectedEngineComboBox = "Select the engine in which the format of the net should be compatible with";
333+ private final static String TOOL_TIP_UniqueQueryNamesCheckbox = "Give queries unique names when exporting";
334 private final static String NAME_SuccesString = "Succeeded";
335 private final static String NAME_SuccesStringOrphanTransitionsRemoved = "Succeeded, orphan transitions removed";
336 private final static String NAME_FailStringFolderExists = "Failed as the subfolder already exists";
337@@ -83,7 +74,8 @@
338 private final List<File> files = new ArrayList<File>();
339 private String lastExportPath;
340 private String lastSelectPath;
341- private JCheckBox uniqueQueryNames;
342+ private JCheckBox uniqueQueryNames;
343+ private JComboBox selectedEngine;
344 private File destinationFile;
345 private ExportBatchResultTableModel tableModel;
346
347@@ -243,14 +235,28 @@
348 enableButtons();
349 });
350 chooserPanel.add(destinationPathSelector, gbc);
351-
352+
353+ final String[] options = new String[] {
354+ "PNML and XML queries (verifypn)",
355+ "Continuous Engine model and queries (verifytapn)",
356+ "Discrete Engine model and queries (verifydtapn)"
357+ };
358+ selectedEngine = new JComboBox(options);
359+ selectedEngine.setToolTipText(TOOL_TIP_SelectedEngineComboBox);
360+
361+ gbc = new GridBagConstraints();
362+ gbc.gridx = 0;
363+ gbc.gridy = 1;
364+ gbc.anchor = GridBagConstraints.NORTHWEST;
365+ gbc.insets = new Insets(10, 0, 0, 0);
366+ chooserPanel.add(selectedEngine, gbc);
367
368 uniqueQueryNames = new JCheckBox("Use unique query names", true);
369 uniqueQueryNames.setToolTipText(TOOL_TIP_UniqueQueryNamesCheckbox);
370
371 gbc = new GridBagConstraints();
372 gbc.gridx = 0;
373- gbc.gridy = 1;
374+ gbc.gridy = 2;
375 gbc.anchor = GridBagConstraints.NORTHWEST;
376 gbc.insets = new Insets(10, 0, 0, 0);
377 chooserPanel.add(uniqueQueryNames, gbc);
378@@ -459,7 +465,7 @@
379 }
380 else return;
381 }
382-
383+
384 private void exportFiles() {
385 //loading bar
386 initProgressBar();
387@@ -509,13 +515,27 @@
388 }
389
390 private void exportModel(File file, Path path) throws Exception {
391- LoadedModel loadedModel = loader.load(file);
392- exportPNML(path, loadedModel);
393- if(!uniqueQueryNames.isSelected())
394- Export.toQueryXML(loadedModel.network(), path.toString() + "/query.xml", loadedModel.queries());
395- else {
396- Export.toQueryXML(loadedModel.network(), path.toString() + "/query.xml", renameQueries(file.getName(), loadedModel.queries()));
397- }
398+ LoadedModel loadedModel = loader.load(file);
399+ Collection<TAPNQuery> queries;
400+
401+ if (uniqueQueryNames.isSelected()) {
402+ queries = renameQueries(file.getName(), loadedModel.queries());
403+ } else {
404+ queries = loadedModel.queries();
405+ }
406+
407+ switch (selectedEngine.getSelectedIndex()) {
408+ case 0:
409+ exportPNML(path, loadedModel);
410+ Export.toQueryXML(loadedModel.network(), path.toString() + "/query.xml", queries);
411+ break;
412+ case 1:
413+ Export.toVerifyTAPN(loadedModel.network(), queries, path.toString() + "/model.xml", path.toString() + "/query", false);
414+ break;
415+ case 2:
416+ Export.toVerifyTAPN(loadedModel.network(), queries, path.toString() + "/model.xml", path.toString() + "/query", true);
417+ break;
418+ }
419 }
420
421 private void exportPNML(Path path, LoadedModel loadedModel) throws DOMException, TransformerConfigurationException, IOException, ParserConfigurationException, TransformerException {
422
423=== modified file 'src/pipe/gui/GuiFrame.java'
424--- src/pipe/gui/GuiFrame.java 2020-10-30 12:24:35 +0000
425+++ src/pipe/gui/GuiFrame.java 2020-12-14 17:15:10 +0000
426@@ -18,8 +18,10 @@
427
428 import com.sun.jna.Platform;
429 import dk.aau.cs.gui.*;
430+import dk.aau.cs.model.tapn.TimedArcPetriNet;
431 import dk.aau.cs.util.JavaUtil;
432 import dk.aau.cs.verification.VerifyTAPN.VerifyPN;
433+import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNExporter;
434 import net.tapaal.Preferences;
435 import net.tapaal.TAPAAL;
436 import net.tapaal.helpers.Reference.MutableReference;
437@@ -27,6 +29,7 @@
438 import net.tapaal.swinghelpers.ExtendedJTabbedPane;
439 import net.tapaal.swinghelpers.ToggleButtonWithoutText;
440 import org.jetbrains.annotations.NotNull;
441+import pipe.dataLayer.TAPNQuery;
442 import pipe.gui.Pipe.ElementType;
443 import pipe.gui.action.GuiAction;
444 import pipe.gui.widgets.WorkflowDialog;
445@@ -173,7 +176,7 @@
446 currentTab.ifPresent(TabContentActions::importTrace);
447 }
448 };
449- private final GuiAction exportBatchAction = new GuiAction("Batch Export to PNML and XML Queries", "Export multiple nets into PNML together with the XML queries, while removing the timing information", KeyStroke.getKeyStroke('D', (shortcutkey + InputEvent.SHIFT_DOWN_MASK))) {
450+ private final GuiAction exportBatchAction = new GuiAction("Batch Export of model and queries", "Export multiple nets into PNML together with the XML queries, while removing the timing information", KeyStroke.getKeyStroke('D', (shortcutkey + InputEvent.SHIFT_DOWN_MASK))) {
451 public void actionPerformed(ActionEvent e) {
452 ExportBatchDialog.ShowExportBatchDialog();
453 }
454@@ -1380,13 +1383,10 @@
455
456 exportMenu.add(exportPSAction);
457
458-
459 exportMenu.add(exportToTikZAction);
460
461-
462 exportMenu.add(exportToPNMLAction);
463
464-
465 exportMenu.add(exportToXMLAction);
466
467 exportMenu.add(exportBatchAction);
468
469=== modified file 'src/pipe/gui/widgets/QueryDialog.java'
470--- src/pipe/gui/widgets/QueryDialog.java 2020-11-06 13:15:11 +0000
471+++ src/pipe/gui/widgets/QueryDialog.java 2020-12-14 17:15:10 +0000
472@@ -3049,10 +3049,10 @@
473 }
474 if(reduction == ReductionOption.VerifyTAPN || reduction == ReductionOption.VerifyTAPNdiscreteVerification) {
475 VerifyTAPNExporter exporter = new VerifyTAPNExporter();
476- exporter.export(transformedModel.value1(), clonedQuery, new File(xmlFile), new File(queryFile), tapnQuery, lens);
477+ exporter.export(transformedModel.value1(), clonedQuery, new File(xmlFile), new File(queryFile), lens);
478 } else if(reduction == ReductionOption.VerifyPN){
479 VerifyPNExporter exporter = new VerifyPNExporter();
480- exporter.export(transformedModel.value1(), clonedQuery, new File(xmlFile), new File(queryFile), tapnQuery, lens);
481+ exporter.export(transformedModel.value1(), clonedQuery, new File(xmlFile), new File(queryFile), lens);
482 } else {
483 UppaalExporter exporter = new UppaalExporter();
484 try {
485
486=== modified file 'src/pipe/gui/widgets/filebrowser/NativeFileBrowser.java'
487--- src/pipe/gui/widgets/filebrowser/NativeFileBrowser.java 2020-05-05 18:15:47 +0000
488+++ src/pipe/gui/widgets/filebrowser/NativeFileBrowser.java 2020-12-14 17:15:10 +0000
489@@ -29,7 +29,7 @@
490 //if(path == null) path = lastPath;
491
492 this.ext = ext;
493- this.optionalExt = optionalExt;
494+ this.optionalExt = optionalExt;
495 //fc.setDirectory(path);
496
497 // Setup filter if extension specified

Subscribers

People subscribed via source and target branches