From 11c9d19c25f10b717e3c9534c65298bb10d31a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sat, 7 Nov 2015 22:01:19 +0300 Subject: [PATCH 01/12] Initial commit, has missing code --- gui/README.md | 6 + gui/src/asl/gui/Main.java | 411 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 417 insertions(+) create mode 100644 gui/README.md create mode 100644 gui/src/asl/gui/Main.java diff --git a/gui/README.md b/gui/README.md new file mode 100644 index 0000000..0eea8ae --- /dev/null +++ b/gui/README.md @@ -0,0 +1,6 @@ +ASL GUI +=========== + +An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. + +Maintained by yours truly: [654wak654](https://github.com/654wak654/) \ No newline at end of file diff --git a/gui/src/asl/gui/Main.java b/gui/src/asl/gui/Main.java new file mode 100644 index 0000000..bee0e78 --- /dev/null +++ b/gui/src/asl/gui/Main.java @@ -0,0 +1,411 @@ +/* + * The MIT License + * + * Copyright 2015 Ozan Egitmen. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package asl.gui; + +import java.awt.Color; +import java.io.File; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.prefs.Preferences; +import javax.swing.BorderFactory; +import javax.swing.JFileChooser; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.border.Border; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.plaf.ColorUIResource; + +public class Main extends javax.swing.JFrame { + + Preferences prefs = Preferences.userRoot().node(this.getClass().getName()); + boolean outputFixDir = false; + + public Main() { + initComponents(); + getContentPane().setBackground(Color.WHITE); + lblASLError.setText(" "); + lblInputError.setText(" "); + lblOutputError.setText(" "); + txtASLDir.setText(prefs.get("aslDir", "")); + txtInputDir.setText(prefs.get("inputDir", "")); + txtOutputDir.setText(prefs.get("outputDir", "")); + cbCompileAll.setSelected(prefs.getBoolean("compileAll", false)); + cbPrettyPrinting.setSelected(prefs.getBoolean("prettyPrinting", false)); + } + + private String fileChooser(String title, FileNameExtensionFilter fileType) { + JFileChooser chooser = new JFileChooser(); + if (fileType != null) { + chooser.setFileFilter(fileType); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setFileSelectionMode(0); + } else { + chooser.setFileSelectionMode(1); + } + chooser.setDialogTitle(title); + String selectedPath = ""; + if (chooser.showOpenDialog(null) == 0) { + selectedPath = chooser.getSelectedFile().toString(); + } else { + chooser.cancelSelection(); + } + return selectedPath; + } + + @SuppressWarnings("unchecked") + private void initComponents() { + + lblInput = new javax.swing.JLabel(); + txtInputDir = new javax.swing.JTextField(); + lblOutput = new javax.swing.JLabel(); + txtOutputDir = new javax.swing.JTextField(); + btnInput = new javax.swing.JButton(); + btnOutput = new javax.swing.JButton(); + lblASL = new javax.swing.JLabel(); + txtASLDir = new javax.swing.JTextField(); + btnASL = new javax.swing.JButton(); + jSeparator = new javax.swing.JSeparator(); + lblASLSmall = new javax.swing.JLabel(); + lblInputSmall = new javax.swing.JLabel(); + lblOutputSmall = new javax.swing.JLabel(); + cbCompileAll = new javax.swing.JCheckBox(); + cbPrettyPrinting = new javax.swing.JCheckBox(); + btnCompile = new javax.swing.JButton(); + lblASLError = new javax.swing.JLabel(); + lblInputError = new javax.swing.JLabel(); + lblOutputError = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("ASL GUI"); + setMinimumSize(new java.awt.Dimension(410, 429)); + setResizable(false); + + lblInput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblInput.setText("Input Directory:"); + lblInput.setOpaque(true); + + txtInputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + + lblOutput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblOutput.setText("Output Directory:"); + lblOutput.setOpaque(true); + + txtOutputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + + btnInput.setText("..."); + btnInput.setToolTipText("Opens a dialog to select input file or directory"); + btnInput.setFocusable(false); + btnInput.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + btnInputMouseClicked(evt); + } + }); + + btnOutput.setText("..."); + btnOutput.setToolTipText("Opens a dialog to select output directory"); + btnOutput.setFocusable(false); + btnOutput.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + btnOutputMouseClicked(evt); + } + }); + + lblASL.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblASL.setText("ASL Compiler Directory"); + lblASL.setOpaque(true); + + txtASLDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + + btnASL.setText("..."); + btnASL.setToolTipText("Opens a dialog to select the compiler location"); + btnASL.setFocusable(false); + btnASL.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + btnASLMouseClicked(evt); + } + }); + + jSeparator.setToolTipText(""); + + lblASLSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblASLSmall.setText("Location of the asl.exe file."); + lblASLSmall.setOpaque(true); + + lblInputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblInputSmall.setText("Script that should be compiled in to the output directory."); + lblInputSmall.setOpaque(true); + + lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblOutputSmall.setText("Directory that the compiled .sqf script(s) will be saved in."); + lblOutputSmall.setOpaque(true); + + cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); + cbCompileAll.setText("Compile all scripts (Directory of the selected script will be used)."); + cbCompileAll.setFocusable(false); + cbCompileAll.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + cbCompileAllStateChanged(evt); + } + }); + + cbPrettyPrinting.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); + cbPrettyPrinting.setText("Activate pretty printing."); + cbPrettyPrinting.setFocusable(false); + cbPrettyPrinting.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + cbPrettyPrintingStateChanged(evt); + } + }); + + btnCompile.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + btnCompile.setText("Compile"); + btnCompile.setToolTipText("Opens a dialog to select output directory"); + btnCompile.setFocusable(false); + btnCompile.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + btnCompileMouseClicked(evt); + } + }); + + lblASLError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblASLError.setForeground(java.awt.Color.red); + lblASLError.setText("Some error"); + + lblInputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblInputError.setForeground(java.awt.Color.red); + lblInputError.setText("Some error"); + + lblOutputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblOutputError.setForeground(java.awt.Color.red); + lblOutputError.setText("Some error"); + lblOutputError.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblOutputErrorMouseClicked(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSeparator) + .addGroup(layout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblOutputError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblInputError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblASLError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblASL) + .addComponent(lblASLSmall) + .addGroup(layout.createSequentialGroup() + .addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(6, 6, 6) + .addComponent(btnASL)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(txtOutputDir, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblOutput, javax.swing.GroupLayout.Alignment.LEADING)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnOutput)) + .addComponent(lblOutputSmall) + .addComponent(cbPrettyPrinting) + .addComponent(cbCompileAll) + .addComponent(lblInput) + .addGroup(layout.createSequentialGroup() + .addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnInput)) + .addComponent(lblInputSmall)) + .addGap(0, 0, Short.MAX_VALUE))) + .addGap(24, 24, 24)) + .addGroup(layout.createSequentialGroup() + .addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(22, 22, 22)))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(6, 6, 6) + .addComponent(lblASL) + .addGap(3, 3, 3) + .addComponent(lblASLSmall) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(btnASL, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(4, 4, 4) + .addComponent(lblASLError) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(3, 3, 3) + .addComponent(lblInput) + .addGap(3, 3, 3) + .addComponent(lblInputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(btnInput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(4, 4, 4) + .addComponent(lblInputError) + .addGap(6, 6, 6) + .addComponent(lblOutput) + .addGap(3, 3, 3) + .addComponent(lblOutputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(6, 6, 6) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtOutputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(4, 4, 4) + .addComponent(lblOutputError) + .addGap(6, 6, 6) + .addComponent(cbCompileAll) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(cbPrettyPrinting) + .addGap(18, 18, 18) + .addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(11, 11, 11)) + ); + + pack(); + setLocationRelativeTo(null); + } + + private void btnInputMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt)) { + String path = fileChooser("Select asl script location", new FileNameExtensionFilter("Arma Scripting Language File", "asl")); + File inputDir = new File(path); + if (inputDir.exists()) { + prefs.put("inputDir", path); + txtInputDir.setText(path); + } + } + } + + private void btnOutputMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt)) { + String path = fileChooser("Select output location", null); + File outputDir = new File(path); + if (outputDir.exists() && outputDir.isDirectory()) { + prefs.put("outputDir", path); + txtOutputDir.setText(path); + } else if (!outputDir.exists()) { + lblOutputError.setText("Folder doesn't exsist! Click this message to create it."); + outputFixDir = true; + } + } + } + + private void btnASLMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt)) { + String path = fileChooser("Select 'asl.exe' location", new FileNameExtensionFilter("Executable", "exe")); + File asl = new File(path); + if (asl.exists()) { + prefs.put("aslDir", path); + txtASLDir.setText(path); + } + } + } + + private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt)) { + JTextField[] dirFields = {txtASLDir, txtInputDir, txtOutputDir}; + for (byte i = 0; i < 3; i++) { + File bleh = new File(dirFields[i].getText()); + if (!bleh.exists()) { + switch (i) { + case 0: + lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); + break; + case 1: + lblInputError.setText("Script doesn't exist!"); + break; + case 2: + lblOutputError.setText("This Folder doesn't exsist! Click this message to create it."); + outputFixDir = true; + break; + } + } + + } + } + } + + private void cbCompileAllStateChanged(javax.swing.event.ChangeEvent evt) { + prefs.putBoolean("compileAll", cbCompileAll.isSelected()); + } + + private void cbPrettyPrintingStateChanged(javax.swing.event.ChangeEvent evt) { + prefs.putBoolean("prettyPrinting", cbPrettyPrinting.isSelected()); + } + + private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt) && outputFixDir) { + new File(txtOutputDir.getText()).mkdirs(); + outputFixDir = false; + } + } + + public static void main(String args[]) { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + UIManager.put("ToolTip.background", new ColorUIResource(255, 255, 255)); + UIManager.put("ToolTip.foreground", new ColorUIResource(87, 87, 87)); + Border lineBorder = BorderFactory.createLineBorder(new Color(118, 118, 118)); + UIManager.put("ToolTip.border", lineBorder); + Border compoundBorder = BorderFactory.createCompoundBorder(UIManager.getBorder("ToolTip.border"), BorderFactory.createEmptyBorder(0, 2, 2, 3)); + UIManager.put("ToolTip.border", compoundBorder); + java.awt.EventQueue.invokeLater(() -> { + new Main().setVisible(true); + }); + } + + private javax.swing.JButton btnASL; + private javax.swing.JButton btnCompile; + private javax.swing.JButton btnInput; + private javax.swing.JButton btnOutput; + private javax.swing.JCheckBox cbCompileAll; + private javax.swing.JCheckBox cbPrettyPrinting; + private javax.swing.JSeparator jSeparator; + private javax.swing.JLabel lblASL; + private javax.swing.JLabel lblASLError; + private javax.swing.JLabel lblASLSmall; + private javax.swing.JLabel lblInput; + private javax.swing.JLabel lblInputError; + private javax.swing.JLabel lblInputSmall; + private javax.swing.JLabel lblOutput; + private javax.swing.JLabel lblOutputError; + private javax.swing.JLabel lblOutputSmall; + private javax.swing.JTextField txtASLDir; + private javax.swing.JTextField txtInputDir; + private javax.swing.JTextField txtOutputDir; +} From 664b4357158e3217ac6ce7bfa7df3795b914ce41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 15:23:21 +0200 Subject: [PATCH 02/12] Beta Release Commit --- gui/ASL GUI.exe | Bin 0 -> 46574 bytes gui/README.md | 2 +- gui/src/asl/gui/DlgError.java | 83 ++++++++++++++++ gui/src/asl/gui/Main.java | 181 +++++++++++++++++++++++++--------- 4 files changed, 216 insertions(+), 50 deletions(-) create mode 100644 gui/ASL GUI.exe create mode 100644 gui/src/asl/gui/DlgError.java diff --git a/gui/ASL GUI.exe b/gui/ASL GUI.exe new file mode 100644 index 0000000000000000000000000000000000000000..86823c7f0e0e99d9649c3f7494cf6302ac8325f1 GIT binary patch literal 46574 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%0Du!Wl`WN)XdoZ%cSkRG!N|}P27-VpXzDT5W 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 literal 0 HcmV?d00001 diff --git a/gui/README.md b/gui/README.md index 0eea8ae..56f79d2 100644 --- a/gui/README.md +++ b/gui/README.md @@ -1,4 +1,4 @@ -ASL GUI +ASL GUI version =========== An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. diff --git a/gui/src/asl/gui/DlgError.java b/gui/src/asl/gui/DlgError.java new file mode 100644 index 0000000..52f6299 --- /dev/null +++ b/gui/src/asl/gui/DlgError.java @@ -0,0 +1,83 @@ +/* + * The MIT License + * + * Copyright 2015 Ozan Egitmen. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package asl.gui; + +public class DlgError extends javax.swing.JDialog { + + boolean isAbort = true; + + public DlgError(java.awt.Frame parent, boolean modal, String errorMessage) { + super(parent, modal); + initComponents(); + lblError.setText(errorMessage); + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + lblError = new javax.swing.JLabel(); + lblTitle = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("ERROR"); + setIconImage(null); + setMinimumSize(new java.awt.Dimension(380, 150)); + setResizable(false); + setType(java.awt.Window.Type.POPUP); + + lblError.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + lblError.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + lblError.setText("Some error"); + + lblTitle.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + lblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + lblTitle.setText("asl.exe has encountered an error:"); + lblTitle.setToolTipText(""); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblTitle, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) + .addComponent(lblError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(lblTitle) + .addGap(18, 18, 18) + .addComponent(lblError) + .addGap(27, 27, 27)) + ); + + pack(); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel lblError; + private javax.swing.JLabel lblTitle; + // End of variables declaration//GEN-END:variables +} diff --git a/gui/src/asl/gui/Main.java b/gui/src/asl/gui/Main.java index bee0e78..78c2f95 100644 --- a/gui/src/asl/gui/Main.java +++ b/gui/src/asl/gui/Main.java @@ -24,7 +24,13 @@ package asl.gui; import java.awt.Color; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.Preferences; @@ -41,7 +47,7 @@ import javax.swing.plaf.ColorUIResource; public class Main extends javax.swing.JFrame { Preferences prefs = Preferences.userRoot().node(this.getClass().getName()); - boolean outputFixDir = false; + boolean aslFix, outputDirFix, gaveError = false; public Main() { initComponents(); @@ -76,6 +82,7 @@ public class Main extends javax.swing.JFrame { } @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents private void initComponents() { lblInput = new javax.swing.JLabel(); @@ -100,23 +107,22 @@ public class Main extends javax.swing.JFrame { setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("ASL GUI"); - setMinimumSize(new java.awt.Dimension(410, 429)); setResizable(false); - lblInput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblInput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N lblInput.setText("Input Directory:"); lblInput.setOpaque(true); - txtInputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + txtInputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N - lblOutput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblOutput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N lblOutput.setText("Output Directory:"); lblOutput.setOpaque(true); - txtOutputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + txtOutputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N btnInput.setText("..."); - btnInput.setToolTipText("Opens a dialog to select input file or directory"); + btnInput.setToolTipText("Opens a dialog to select input file"); btnInput.setFocusable(false); btnInput.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { @@ -133,11 +139,11 @@ public class Main extends javax.swing.JFrame { } }); - lblASL.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + lblASL.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N lblASL.setText("ASL Compiler Directory"); lblASL.setOpaque(true); - txtASLDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); + txtASLDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N btnASL.setText("..."); btnASL.setToolTipText("Opens a dialog to select the compiler location"); @@ -150,20 +156,20 @@ public class Main extends javax.swing.JFrame { jSeparator.setToolTipText(""); - lblASLSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblASLSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N lblASLSmall.setText("Location of the asl.exe file."); lblASLSmall.setOpaque(true); - lblInputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); - lblInputSmall.setText("Script that should be compiled in to the output directory."); + lblInputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblInputSmall.setText("Directory of scripts that will be compiled in to the output directory."); lblInputSmall.setOpaque(true); - lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N lblOutputSmall.setText("Directory that the compiled .sqf script(s) will be saved in."); lblOutputSmall.setOpaque(true); - cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); - cbCompileAll.setText("Compile all scripts (Directory of the selected script will be used)."); + cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); // NOI18N + cbCompileAll.setText("Compile all scripts including sub folders."); cbCompileAll.setFocusable(false); cbCompileAll.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { @@ -171,7 +177,7 @@ public class Main extends javax.swing.JFrame { } }); - cbPrettyPrinting.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); + cbPrettyPrinting.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); // NOI18N cbPrettyPrinting.setText("Activate pretty printing."); cbPrettyPrinting.setFocusable(false); cbPrettyPrinting.addChangeListener(new javax.swing.event.ChangeListener() { @@ -180,7 +186,7 @@ public class Main extends javax.swing.JFrame { } }); - btnCompile.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); + btnCompile.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N btnCompile.setText("Compile"); btnCompile.setToolTipText("Opens a dialog to select output directory"); btnCompile.setFocusable(false); @@ -190,15 +196,20 @@ public class Main extends javax.swing.JFrame { } }); - lblASLError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblASLError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N lblASLError.setForeground(java.awt.Color.red); lblASLError.setText("Some error"); + lblASLError.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblASLErrorMouseClicked(evt); + } + }); - lblInputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblInputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N lblInputError.setForeground(java.awt.Color.red); lblInputError.setText("Some error"); - lblOutputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblOutputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N lblOutputError.setForeground(java.awt.Color.red); lblOutputError.setText("Some error"); lblOutputError.addMouseListener(new java.awt.event.MouseAdapter() { @@ -235,14 +246,14 @@ public class Main extends javax.swing.JFrame { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnOutput)) .addComponent(lblOutputSmall) - .addComponent(cbPrettyPrinting) - .addComponent(cbCompileAll) .addComponent(lblInput) .addGroup(layout.createSequentialGroup() .addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnInput)) - .addComponent(lblInputSmall)) + .addComponent(lblInputSmall) + .addComponent(cbCompileAll) + .addComponent(cbPrettyPrinting)) .addGap(0, 0, Short.MAX_VALUE))) .addGap(24, 24, 24)) .addGroup(layout.createSequentialGroup() @@ -288,41 +299,41 @@ public class Main extends javax.swing.JFrame { .addComponent(cbCompileAll) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(cbPrettyPrinting) - .addGap(18, 18, 18) + .addGap(11, 11, 11) .addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(11, 11, 11)) ); pack(); setLocationRelativeTo(null); - } + }// //GEN-END:initComponents - private void btnInputMouseClicked(java.awt.event.MouseEvent evt) { + private void btnInputMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnInputMouseClicked if (SwingUtilities.isLeftMouseButton(evt)) { - String path = fileChooser("Select asl script location", new FileNameExtensionFilter("Arma Scripting Language File", "asl")); + String path = fileChooser("Select input directory", null); File inputDir = new File(path); if (inputDir.exists()) { prefs.put("inputDir", path); txtInputDir.setText(path); } } - } + }//GEN-LAST:event_btnInputMouseClicked - private void btnOutputMouseClicked(java.awt.event.MouseEvent evt) { + private void btnOutputMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnOutputMouseClicked if (SwingUtilities.isLeftMouseButton(evt)) { - String path = fileChooser("Select output location", null); + String path = fileChooser("Select output directory", null); File outputDir = new File(path); if (outputDir.exists() && outputDir.isDirectory()) { prefs.put("outputDir", path); txtOutputDir.setText(path); } else if (!outputDir.exists()) { - lblOutputError.setText("Folder doesn't exsist! Click this message to create it."); - outputFixDir = true; + lblOutputError.setText("Output folder doesn't exsist! Click this message to create it."); + outputDirFix = true; } } - } + }//GEN-LAST:event_btnOutputMouseClicked - private void btnASLMouseClicked(java.awt.event.MouseEvent evt) { + private void btnASLMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnASLMouseClicked if (SwingUtilities.isLeftMouseButton(evt)) { String path = fileChooser("Select 'asl.exe' location", new FileNameExtensionFilter("Executable", "exe")); File asl = new File(path); @@ -331,46 +342,116 @@ public class Main extends javax.swing.JFrame { txtASLDir.setText(path); } } - } + }//GEN-LAST:event_btnASLMouseClicked - private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) { + private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCompileMouseClicked if (SwingUtilities.isLeftMouseButton(evt)) { + String sumthin = new File(txtASLDir.getText()).getParent() + "\\asl.exe"; + if (!new File(sumthin).exists()) { + lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); + } JTextField[] dirFields = {txtASLDir, txtInputDir, txtOutputDir}; for (byte i = 0; i < 3; i++) { File bleh = new File(dirFields[i].getText()); if (!bleh.exists()) { + gaveError = true; switch (i) { case 0: lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); + aslFix = true; break; case 1: - lblInputError.setText("Script doesn't exist!"); + lblInputError.setText("This folder doesn't exist!"); break; case 2: - lblOutputError.setText("This Folder doesn't exsist! Click this message to create it."); - outputFixDir = true; + lblOutputError.setText("Output folder doesn't exsist! Click this message to create it."); + outputDirFix = true; + break; + } + return; + } + if (bleh.exists() && gaveError) { + switch (i) { + case 0: + lblASLError.setText(" "); + break; + case 1: + lblInputError.setText(" "); + break; + case 2: + lblOutputError.setText(" "); + outputDirFix = true; break; } } - + } + if (gaveError) { + return; + } + String compileAll = "", prettyPrinting = ""; + if (cbCompileAll.isSelected()) { + compileAll = "-r"; + } + if (cbPrettyPrinting.isSelected()) { + prettyPrinting = "-pretty"; + } + String asl = txtASLDir.getText(); + String input = txtInputDir.getText(); + String output = txtOutputDir.getText(); + String aslError = " "; + try { + Process aslProcess = new ProcessBuilder(asl, compileAll, prettyPrinting, input, output).start(); + InputStream is = aslProcess.getInputStream(); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String line; + while ((line = br.readLine()) != null) { + if (line.contains("Error")) { + aslError = line; + } + } + aslProcess.waitFor(); + if (!aslError.equals(" ")) { + DlgError error = new DlgError(this, true, aslError); + error.setLocationRelativeTo(this); + error.setVisible(true); + } + //Runtime.getRuntime().exec("cmd /c start \"" + asl + "\" " + compileAll + prettyPrinting + "\"" + input + "\" \"" + output + "\""); + //TODO: Start app in command line with parameters + } catch (IOException | InterruptedException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } - } + }//GEN-LAST:event_btnCompileMouseClicked - private void cbCompileAllStateChanged(javax.swing.event.ChangeEvent evt) { + private void cbCompileAllStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_cbCompileAllStateChanged prefs.putBoolean("compileAll", cbCompileAll.isSelected()); - } + }//GEN-LAST:event_cbCompileAllStateChanged - private void cbPrettyPrintingStateChanged(javax.swing.event.ChangeEvent evt) { + private void cbPrettyPrintingStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_cbPrettyPrintingStateChanged prefs.putBoolean("prettyPrinting", cbPrettyPrinting.isSelected()); - } + }//GEN-LAST:event_cbPrettyPrintingStateChanged - private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) { - if (SwingUtilities.isLeftMouseButton(evt) && outputFixDir) { + private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblOutputErrorMouseClicked + if (SwingUtilities.isLeftMouseButton(evt) && outputDirFix) { new File(txtOutputDir.getText()).mkdirs(); - outputFixDir = false; + outputDirFix = false; + lblOutputError.setText(" "); } - } + }//GEN-LAST:event_lblOutputErrorMouseClicked + + private void lblASLErrorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblASLErrorMouseClicked + if (SwingUtilities.isLeftMouseButton(evt) && aslFix) { + try { + URI github = new URI("https://github.com/DeKugelschieber/asl/releases"); + java.awt.Desktop.getDesktop().browse(github); + } catch (URISyntaxException | IOException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + aslFix = false; + lblASLError.setText(" "); + } + }//GEN-LAST:event_lblASLErrorMouseClicked public static void main(String args[]) { try { @@ -389,6 +470,7 @@ public class Main extends javax.swing.JFrame { }); } + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnASL; private javax.swing.JButton btnCompile; private javax.swing.JButton btnInput; @@ -408,4 +490,5 @@ public class Main extends javax.swing.JFrame { private javax.swing.JTextField txtASLDir; private javax.swing.JTextField txtInputDir; private javax.swing.JTextField txtOutputDir; + // End of variables declaration//GEN-END:variables } From 5bcfda10bdccf2d6b2a49f16f170ea7d6a6e677a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 15:24:31 +0200 Subject: [PATCH 03/12] Update README.md --- gui/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/README.md b/gui/README.md index 56f79d2..472d6fe 100644 --- a/gui/README.md +++ b/gui/README.md @@ -1,6 +1,6 @@ -ASL GUI version +ASL GUI version =========== An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. -Maintained by yours truly: [654wak654](https://github.com/654wak654/) \ No newline at end of file +Maintained by yours truly: [654wak654](https://github.com/654wak654/) From 68f05f09eaaf300471ef7765c64e0da96974c9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 19:51:14 +0200 Subject: [PATCH 04/12] v0.2.1 --- gui/ASL GUI.exe | Bin 46574 -> 46366 bytes gui/README.md | 7 +- gui/src/asl/gui/DlgError.java | 33 ++--- gui/src/asl/gui/Main.java | 246 +++++++++++----------------------- 4 files changed, 92 insertions(+), 194 deletions(-) diff --git a/gui/ASL GUI.exe b/gui/ASL GUI.exe index 86823c7f0e0e99d9649c3f7494cf6302ac8325f1..c7a3d87e63e0b8e86776c5801f947c662d14ef1d 100644 GIT binary patch delta 10381 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 delta 10587 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 +ASL GUI version =========== An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. -Maintained by yours truly: [654wak654](https://github.com/654wak654/) \ No newline at end of file +Maintained by yours truly: [654wak654](https://github.com/654wak654/) + +**Version 0.2.1:** +Fixed some possible bugs, did some style fixes and other code adjustments. It's now is readable without getting cataracts. Mostly anyway... \ No newline at end of file diff --git a/gui/src/asl/gui/DlgError.java b/gui/src/asl/gui/DlgError.java index 52f6299..906b7a0 100644 --- a/gui/src/asl/gui/DlgError.java +++ b/gui/src/asl/gui/DlgError.java @@ -25,18 +25,13 @@ package asl.gui; public class DlgError extends javax.swing.JDialog { - boolean isAbort = true; - public DlgError(java.awt.Frame parent, boolean modal, String errorMessage) { super(parent, modal); initComponents(); lblError.setText(errorMessage); } - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents private void initComponents() { - lblError = new javax.swing.JLabel(); lblTitle = new javax.swing.JLabel(); @@ -47,37 +42,25 @@ public class DlgError extends javax.swing.JDialog { setResizable(false); setType(java.awt.Window.Type.POPUP); - lblError.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + lblError.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); lblError.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblError.setText("Some error"); - lblTitle.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + lblTitle.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); lblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblTitle.setText("asl.exe has encountered an error:"); lblTitle.setToolTipText(""); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lblTitle, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) - .addComponent(lblError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(lblTitle) - .addGap(18, 18, 18) - .addComponent(lblError) - .addGap(27, 27, 27)) - ); + layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblTitle, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE).addComponent(lblError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); + layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(lblTitle).addGap(18, 18, 18).addComponent(lblError).addGap(27, 27, 27))); pack(); - }// //GEN-END:initComponents + } - // Variables declaration - do not modify//GEN-BEGIN:variables + // Variables declaration - do not modify private javax.swing.JLabel lblError; private javax.swing.JLabel lblTitle; - // End of variables declaration//GEN-END:variables -} + // End of variables declaration +} \ No newline at end of file diff --git a/gui/src/asl/gui/Main.java b/gui/src/asl/gui/Main.java index 78c2f95..36356d6 100644 --- a/gui/src/asl/gui/Main.java +++ b/gui/src/asl/gui/Main.java @@ -27,7 +27,6 @@ import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; @@ -62,15 +61,13 @@ public class Main extends javax.swing.JFrame { cbPrettyPrinting.setSelected(prefs.getBoolean("prettyPrinting", false)); } - private String fileChooser(String title, FileNameExtensionFilter fileType) { + private String fileChooser(String title, int fileType) { JFileChooser chooser = new JFileChooser(); - if (fileType != null) { - chooser.setFileFilter(fileType); + if (fileType == 0) { + chooser.setFileFilter(new FileNameExtensionFilter("Executable", "exe")); chooser.setAcceptAllFileFilterUsed(false); - chooser.setFileSelectionMode(0); - } else { - chooser.setFileSelectionMode(1); } + chooser.setFileSelectionMode(fileType); chooser.setDialogTitle(title); String selectedPath = ""; if (chooser.showOpenDialog(null) == 0) { @@ -81,8 +78,6 @@ public class Main extends javax.swing.JFrame { return selectedPath; } - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents private void initComponents() { lblInput = new javax.swing.JLabel(); @@ -109,17 +104,17 @@ public class Main extends javax.swing.JFrame { setTitle("ASL GUI"); setResizable(false); - lblInput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N + lblInput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); lblInput.setText("Input Directory:"); lblInput.setOpaque(true); - txtInputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + txtInputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); - lblOutput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N + lblOutput.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); lblOutput.setText("Output Directory:"); lblOutput.setOpaque(true); - txtOutputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + txtOutputDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); btnInput.setText("..."); btnInput.setToolTipText("Opens a dialog to select input file"); @@ -139,11 +134,11 @@ public class Main extends javax.swing.JFrame { } }); - lblASL.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N + lblASL.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); lblASL.setText("ASL Compiler Directory"); lblASL.setOpaque(true); - txtASLDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); // NOI18N + txtASLDir.setFont(new java.awt.Font("Segoe UI Light", 0, 16)); btnASL.setText("..."); btnASL.setToolTipText("Opens a dialog to select the compiler location"); @@ -156,20 +151,20 @@ public class Main extends javax.swing.JFrame { jSeparator.setToolTipText(""); - lblASLSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblASLSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); lblASLSmall.setText("Location of the asl.exe file."); lblASLSmall.setOpaque(true); - lblInputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblInputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); lblInputSmall.setText("Directory of scripts that will be compiled in to the output directory."); lblInputSmall.setOpaque(true); - lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N - lblOutputSmall.setText("Directory that the compiled .sqf script(s) will be saved in."); + lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); + lblOutputSmall.setText("Directory that the compiled.sqf script(s) will be saved in."); lblOutputSmall.setOpaque(true); - cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); // NOI18N - cbCompileAll.setText("Compile all scripts including sub folders."); + cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); + cbCompileAll.setText("Compile all scripts in subfolders too."); cbCompileAll.setFocusable(false); cbCompileAll.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { @@ -177,7 +172,7 @@ public class Main extends javax.swing.JFrame { } }); - cbPrettyPrinting.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); // NOI18N + cbPrettyPrinting.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); cbPrettyPrinting.setText("Activate pretty printing."); cbPrettyPrinting.setFocusable(false); cbPrettyPrinting.addChangeListener(new javax.swing.event.ChangeListener() { @@ -186,7 +181,7 @@ public class Main extends javax.swing.JFrame { } }); - btnCompile.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); // NOI18N + btnCompile.setFont(new java.awt.Font("Microsoft JhengHei UI Light", 0, 16)); btnCompile.setText("Compile"); btnCompile.setToolTipText("Opens a dialog to select output directory"); btnCompile.setFocusable(false); @@ -196,7 +191,7 @@ public class Main extends javax.swing.JFrame { } }); - lblASLError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblASLError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); lblASLError.setForeground(java.awt.Color.red); lblASLError.setText("Some error"); lblASLError.addMouseListener(new java.awt.event.MouseAdapter() { @@ -205,11 +200,11 @@ public class Main extends javax.swing.JFrame { } }); - lblInputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblInputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); lblInputError.setForeground(java.awt.Color.red); lblInputError.setText("Some error"); - lblOutputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); // NOI18N + lblOutputError.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); lblOutputError.setForeground(java.awt.Color.red); lblOutputError.setText("Some error"); lblOutputError.addMouseListener(new java.awt.event.MouseAdapter() { @@ -220,135 +215,57 @@ public class Main extends javax.swing.JFrame { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jSeparator) - .addGroup(layout.createSequentialGroup() - .addGap(15, 15, 15) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lblOutputError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lblInputError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lblASLError, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lblASL) - .addComponent(lblASLSmall) - .addGroup(layout.createSequentialGroup() - .addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(6, 6, 6) - .addComponent(btnASL)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(txtOutputDir, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lblOutput, javax.swing.GroupLayout.Alignment.LEADING)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnOutput)) - .addComponent(lblOutputSmall) - .addComponent(lblInput) - .addGroup(layout.createSequentialGroup() - .addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnInput)) - .addComponent(lblInputSmall) - .addComponent(cbCompileAll) - .addComponent(cbPrettyPrinting)) - .addGap(0, 0, Short.MAX_VALUE))) - .addGap(24, 24, 24)) - .addGroup(layout.createSequentialGroup() - .addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(22, 22, 22)))) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(6, 6, 6) - .addComponent(lblASL) - .addGap(3, 3, 3) - .addComponent(lblASLSmall) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(btnASL, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(4, 4, 4) - .addComponent(lblASLError) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(3, 3, 3) - .addComponent(lblInput) - .addGap(3, 3, 3) - .addComponent(lblInputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(btnInput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(4, 4, 4) - .addComponent(lblInputError) - .addGap(6, 6, 6) - .addComponent(lblOutput) - .addGap(3, 3, 3) - .addComponent(lblOutputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(6, 6, 6) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(txtOutputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(4, 4, 4) - .addComponent(lblOutputError) - .addGap(6, 6, 6) - .addComponent(cbCompileAll) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(cbPrettyPrinting) - .addGap(11, 11, 11) - .addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(11, 11, 11)) - ); + layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jSeparator).addGroup(layout.createSequentialGroup().addGap(15, 15, 15).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblOutputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblInputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false).addComponent(lblASLError, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblASL).addComponent(lblASLSmall).addGroup(layout.createSequentialGroup().addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addComponent(btnASL)).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(txtOutputDir, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblOutput, javax.swing.GroupLayout.Alignment.LEADING)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnOutput)).addComponent(lblOutputSmall).addComponent(lblInput).addGroup(layout.createSequentialGroup().addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnInput)).addComponent(lblInputSmall).addComponent(cbCompileAll).addComponent(cbPrettyPrinting))).addGap(0, 0, Short.MAX_VALUE))).addGap(24, 24, 24)).addGroup(layout.createSequentialGroup().addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(22, 22, 22))))); + layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(6, 6, 6).addComponent(lblASL).addGap(3, 3, 3).addComponent(lblASLSmall).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnASL, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblASLError).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(3, 3, 3).addComponent(lblInput).addGap(3, 3, 3).addComponent(lblInputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnInput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblInputError).addGap(6, 6, 6).addComponent(lblOutput).addGap(3, 3, 3).addComponent(lblOutputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtOutputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblOutputError).addGap(6, 6, 6).addComponent(cbCompileAll).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(cbPrettyPrinting).addGap(11, 11, 11).addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(11, 11, 11))); pack(); setLocationRelativeTo(null); - }// //GEN-END:initComponents + } - private void btnInputMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnInputMouseClicked + private void btnInputMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt)) { - String path = fileChooser("Select input directory", null); + String path = fileChooser("Select input directory", 1); File inputDir = new File(path); if (inputDir.exists()) { prefs.put("inputDir", path); txtInputDir.setText(path); } - } - }//GEN-LAST:event_btnInputMouseClicked + if (gaveError) { - private void btnOutputMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnOutputMouseClicked - if (SwingUtilities.isLeftMouseButton(evt)) { - String path = fileChooser("Select output directory", null); - File outputDir = new File(path); - if (outputDir.exists() && outputDir.isDirectory()) { - prefs.put("outputDir", path); - txtOutputDir.setText(path); - } else if (!outputDir.exists()) { - lblOutputError.setText("Output folder doesn't exsist! Click this message to create it."); - outputDirFix = true; } } - }//GEN-LAST:event_btnOutputMouseClicked + } - private void btnASLMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnASLMouseClicked + private void btnOutputMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt)) { - String path = fileChooser("Select 'asl.exe' location", new FileNameExtensionFilter("Executable", "exe")); + String path = fileChooser("Select output directory", 1); + File outputDir = new File(path); + if (outputDir.exists()) { + prefs.put("outputDir", path); + txtOutputDir.setText(path); + if (outputDirFix) { + lblOutputError.setText(" "); + } + } + } + } + + private void btnASLMouseClicked(java.awt.event.MouseEvent evt) { + if (SwingUtilities.isLeftMouseButton(evt)) { + String path = fileChooser("Select 'asl.exe' location", 0); File asl = new File(path); if (asl.exists()) { prefs.put("aslDir", path); txtASLDir.setText(path); } } - }//GEN-LAST:event_btnASLMouseClicked + } - private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnCompileMouseClicked + private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt)) { - String sumthin = new File(txtASLDir.getText()).getParent() + "\\asl.exe"; - if (!new File(sumthin).exists()) { + if (!new File(txtASLDir.getText()).exists()) { lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); + return; } JTextField[] dirFields = {txtASLDir, txtInputDir, txtOutputDir}; for (byte i = 0; i < 3; i++) { @@ -369,8 +286,7 @@ public class Main extends javax.swing.JFrame { break; } return; - } - if (bleh.exists() && gaveError) { + } else if (gaveError) { switch (i) { case 0: lblASLError.setText(" "); @@ -380,7 +296,7 @@ public class Main extends javax.swing.JFrame { break; case 2: lblOutputError.setText(" "); - outputDirFix = true; + outputDirFix = false; break; } } @@ -388,22 +304,16 @@ public class Main extends javax.swing.JFrame { if (gaveError) { return; } - String compileAll = "", prettyPrinting = ""; - if (cbCompileAll.isSelected()) { - compileAll = "-r"; - } - if (cbPrettyPrinting.isSelected()) { - prettyPrinting = "-pretty"; - } - String asl = txtASLDir.getText(); - String input = txtInputDir.getText(); - String output = txtOutputDir.getText(); - String aslError = " "; + //Rapid String declarations + String prettyPrinting = cbPrettyPrinting.isSelected() ? "-pretty" : "", + compileAll = cbCompileAll.isSelected() ? "-r" : "", + asl = txtASLDir.getText(), + input = txtInputDir.getText(), + output = txtOutputDir.getText(), + aslError = " "; try { Process aslProcess = new ProcessBuilder(asl, compileAll, prettyPrinting, input, output).start(); - InputStream is = aslProcess.getInputStream(); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader br = new BufferedReader(isr); + BufferedReader br = new BufferedReader(new InputStreamReader(aslProcess.getInputStream())); String line; while ((line = br.readLine()) != null) { if (line.contains("Error")) { @@ -411,36 +321,38 @@ public class Main extends javax.swing.JFrame { } } aslProcess.waitFor(); - if (!aslError.equals(" ")) { - DlgError error = new DlgError(this, true, aslError); - error.setLocationRelativeTo(this); - error.setVisible(true); - } - //Runtime.getRuntime().exec("cmd /c start \"" + asl + "\" " + compileAll + prettyPrinting + "\"" + input + "\" \"" + output + "\""); - //TODO: Start app in command line with parameters + /* + Heavily obsolete alternative: + Runtime.getRuntime().exec("cmd /c start \"" + asl + "\" " + compileAll + prettyPrinting + "\"" + input + "\" \"" + output + "\""); + */ } catch (IOException | InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } + if (!aslError.equals(" ")) { + DlgError error = new DlgError(this, true, aslError); + error.setLocationRelativeTo(this); + error.setVisible(true); + } } - }//GEN-LAST:event_btnCompileMouseClicked + } - private void cbCompileAllStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_cbCompileAllStateChanged + private void cbCompileAllStateChanged(javax.swing.event.ChangeEvent evt) { prefs.putBoolean("compileAll", cbCompileAll.isSelected()); - }//GEN-LAST:event_cbCompileAllStateChanged + } - private void cbPrettyPrintingStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_cbPrettyPrintingStateChanged + private void cbPrettyPrintingStateChanged(javax.swing.event.ChangeEvent evt) { prefs.putBoolean("prettyPrinting", cbPrettyPrinting.isSelected()); - }//GEN-LAST:event_cbPrettyPrintingStateChanged + } - private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblOutputErrorMouseClicked + private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt) && outputDirFix) { new File(txtOutputDir.getText()).mkdirs(); outputDirFix = false; lblOutputError.setText(" "); } - }//GEN-LAST:event_lblOutputErrorMouseClicked + } - private void lblASLErrorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblASLErrorMouseClicked + private void lblASLErrorMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt) && aslFix) { try { URI github = new URI("https://github.com/DeKugelschieber/asl/releases"); @@ -451,7 +363,7 @@ public class Main extends javax.swing.JFrame { aslFix = false; lblASLError.setText(" "); } - }//GEN-LAST:event_lblASLErrorMouseClicked + } public static void main(String args[]) { try { @@ -470,7 +382,7 @@ public class Main extends javax.swing.JFrame { }); } - // Variables declaration - do not modify//GEN-BEGIN:variables + // Variables declaration - do not modify private javax.swing.JButton btnASL; private javax.swing.JButton btnCompile; private javax.swing.JButton btnInput; @@ -490,5 +402,5 @@ public class Main extends javax.swing.JFrame { private javax.swing.JTextField txtASLDir; private javax.swing.JTextField txtInputDir; private javax.swing.JTextField txtOutputDir; - // End of variables declaration//GEN-END:variables -} + // End of variables declaration +} \ No newline at end of file From 0c63114c44c4239637e63de26f7302f4f1e80227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 19:55:00 +0200 Subject: [PATCH 05/12] Update README.md --- gui/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/README.md b/gui/README.md index 6cc7c48..bf60b3d 100644 --- a/gui/README.md +++ b/gui/README.md @@ -6,4 +6,5 @@ An optional Java interface to make the compile procces of ASL faster and more us Maintained by yours truly: [654wak654](https://github.com/654wak654/) **Version 0.2.1:** -Fixed some possible bugs, did some style fixes and other code adjustments. It's now is readable without getting cataracts. Mostly anyway... \ No newline at end of file + +Fixed some possible bugs, did some style fixes and other code adjustments. It's now is readable without getting cataracts. Mostly anyway... From ca26fbf6d44a8daa64080c303155709f8de44869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 19:56:59 +0200 Subject: [PATCH 06/12] Update README.md --- gui/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/README.md b/gui/README.md index bf60b3d..c3ad0f7 100644 --- a/gui/README.md +++ b/gui/README.md @@ -1,10 +1,10 @@ -ASL GUI version +ASL GUI version ========= An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. Maintained by yours truly: [654wak654](https://github.com/654wak654/) -**Version 0.2.1:** +**Version 0.3.0:** Fixed some possible bugs, did some style fixes and other code adjustments. It's now is readable without getting cataracts. Mostly anyway... From 07ce5e7a0b757682048f4b0295a674b919ceacb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Sun, 15 Nov 2015 19:57:46 +0200 Subject: [PATCH 07/12] Updated ASL GUI.exe --- gui/ASL GUI.exe | Bin 46366 -> 46366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/ASL GUI.exe b/gui/ASL GUI.exe index c7a3d87e63e0b8e86776c5801f947c662d14ef1d..5a72cddde0ad46f1d0e3961ca5bba265b8d51bae 100644 GIT binary patch delta 306 zcmbRDifP^}rU@NP^~Wc6`7sB{FmAl9SqkJ$W-F5eQEFv%QuW6@!Wh7Sk%57QfkA-@ z!UIb0D-*+zc0fqK!y=u4kd`aQ)ZKuP_QN8*03lt6Mfw0jdL0(&2MFnVXwpEhF>o+3 bG=RKTe|$4v#V;m)W)KGmp!8<(YIZ9CP|H0L delta 306 zcmbRDifP^}rU@NPK8GiE`7w8%Vc2+EvlPgi%vL4`qSVUjqK0W8h$7 bXaIT5=kR8}ieF6p5Y>zfP Date: Sun, 22 Nov 2015 00:17:13 +0200 Subject: [PATCH 08/12] Update README.md --- gui/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/README.md b/gui/README.md index c3ad0f7..f44b2ba 100644 --- a/gui/README.md +++ b/gui/README.md @@ -1,4 +1,4 @@ -ASL GUI version +ASL GUI version ========= An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. From 1c67be7d2e204342afad82096f0e0ab2d5ccbff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Mon, 23 Nov 2015 16:19:11 +0200 Subject: [PATCH 09/12] Release Version --- gui/ASL GUI.exe | Bin 46366 -> 45890 bytes gui/README.md | 8 ++- gui/src/asl/gui/DlgError.java | 5 +- gui/src/asl/gui/Main.java | 112 ++++++++++++---------------------- 4 files changed, 47 insertions(+), 78 deletions(-) diff --git a/gui/ASL GUI.exe b/gui/ASL GUI.exe index 5a72cddde0ad46f1d0e3961ca5bba265b8d51bae..2e26d2ecd1469bfd4c6403c9e08badd86ba74f12 100644 GIT binary patch delta 12412 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 pYvy132+M;rcWA{{Zi3vnK!m delta 12888 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 c`QJ(Y_fK*#F!X +ASL GUI version ========= An optional Java interface to make the compile procces of ASL faster and more user-friendly. It's released under the MIT licence just like the core project. Maintained by yours truly: [654wak654](https://github.com/654wak654/) -**Version 0.3.0:** +**Version 1.0.0.0** + +More style changes and bug fixes, marked ready for release. + +**Version 0.3.0.0:** Fixed some possible bugs, did some style fixes and other code adjustments. It's now is readable without getting cataracts. Mostly anyway... diff --git a/gui/src/asl/gui/DlgError.java b/gui/src/asl/gui/DlgError.java index 906b7a0..f0a6c22 100644 --- a/gui/src/asl/gui/DlgError.java +++ b/gui/src/asl/gui/DlgError.java @@ -25,6 +25,8 @@ package asl.gui; public class DlgError extends javax.swing.JDialog { + boolean isAbort = true; + public DlgError(java.awt.Frame parent, boolean modal, String errorMessage) { super(parent, modal); initComponents(); @@ -32,6 +34,7 @@ public class DlgError extends javax.swing.JDialog { } private void initComponents() { + lblError = new javax.swing.JLabel(); lblTitle = new javax.swing.JLabel(); @@ -59,8 +62,6 @@ public class DlgError extends javax.swing.JDialog { pack(); } - // Variables declaration - do not modify private javax.swing.JLabel lblError; private javax.swing.JLabel lblTitle; - // End of variables declaration } \ No newline at end of file diff --git a/gui/src/asl/gui/Main.java b/gui/src/asl/gui/Main.java index 36356d6..2fcb42a 100644 --- a/gui/src/asl/gui/Main.java +++ b/gui/src/asl/gui/Main.java @@ -46,7 +46,7 @@ import javax.swing.plaf.ColorUIResource; public class Main extends javax.swing.JFrame { Preferences prefs = Preferences.userRoot().node(this.getClass().getName()); - boolean aslFix, outputDirFix, gaveError = false; + boolean inputError = false, outputError = false, aslError = false; public Main() { initComponents(); @@ -70,14 +70,26 @@ public class Main extends javax.swing.JFrame { chooser.setFileSelectionMode(fileType); chooser.setDialogTitle(title); String selectedPath = ""; - if (chooser.showOpenDialog(null) == 0) { + if (chooser.showOpenDialog(null) == 0) selectedPath = chooser.getSelectedFile().toString(); - } else { + else chooser.cancelSelection(); - } return selectedPath; } + private void setErrorCondition(int i, boolean j) { + if (i == 0) { + lblASLError.setText(j ? "asl.exe isn't in this location! You can click this message to download it." : " "); + aslError = j; + } else if (i == 1) { + lblInputError.setText(j ? "This folder doesn't exist!" : " "); + inputError = j; + } else { + lblOutputError.setText(j ? "Output folder doesn't exsist! Click this message to create it." : " "); + outputError = j; + } + } + private void initComponents() { lblInput = new javax.swing.JLabel(); @@ -160,7 +172,7 @@ public class Main extends javax.swing.JFrame { lblInputSmall.setOpaque(true); lblOutputSmall.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 10)); - lblOutputSmall.setText("Directory that the compiled.sqf script(s) will be saved in."); + lblOutputSmall.setText("Directory that the compiled .sqf script(s) will be saved in."); lblOutputSmall.setOpaque(true); cbCompileAll.setFont(new java.awt.Font("Microsoft YaHei UI", 0, 11)); @@ -215,8 +227,8 @@ public class Main extends javax.swing.JFrame { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jSeparator).addGroup(layout.createSequentialGroup().addGap(15, 15, 15).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblOutputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblInputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false).addComponent(lblASLError, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblASL).addComponent(lblASLSmall).addGroup(layout.createSequentialGroup().addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addComponent(btnASL)).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(txtOutputDir, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblOutput, javax.swing.GroupLayout.Alignment.LEADING)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnOutput)).addComponent(lblOutputSmall).addComponent(lblInput).addGroup(layout.createSequentialGroup().addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnInput)).addComponent(lblInputSmall).addComponent(cbCompileAll).addComponent(cbPrettyPrinting))).addGap(0, 0, Short.MAX_VALUE))).addGap(24, 24, 24)).addGroup(layout.createSequentialGroup().addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(22, 22, 22))))); - layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(6, 6, 6).addComponent(lblASL).addGap(3, 3, 3).addComponent(lblASLSmall).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnASL, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblASLError).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(3, 3, 3).addComponent(lblInput).addGap(3, 3, 3).addComponent(lblInputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnInput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblInputError).addGap(6, 6, 6).addComponent(lblOutput).addGap(3, 3, 3).addComponent(lblOutputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtOutputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblOutputError).addGap(6, 6, 6).addComponent(cbCompileAll).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(cbPrettyPrinting).addGap(11, 11, 11).addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(11, 11, 11))); + layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jSeparator).addGroup(layout.createSequentialGroup().addGap(15, 15, 15).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblOutputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblInputError, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false).addComponent(lblASLError, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 371, javax.swing.GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(lblASL).addComponent(lblASLSmall).addGroup(layout.createSequentialGroup().addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addComponent(btnASL)).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(txtOutputDir, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(lblOutput, javax.swing.GroupLayout.Alignment.LEADING)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnOutput)).addComponent(lblOutputSmall).addComponent(lblInput).addGroup(layout.createSequentialGroup().addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(btnInput)).addComponent(lblInputSmall).addComponent(cbCompileAll).addComponent(cbPrettyPrinting))).addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 373, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(20, 20, 20))); + layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(6, 6, 6).addComponent(lblASL).addGap(3, 3, 3).addComponent(lblASLSmall).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtASLDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnASL, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblASLError).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(3, 3, 3).addComponent(lblInput).addGap(3, 3, 3).addComponent(lblInputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtInputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnInput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblInputError).addGap(6, 6, 6).addComponent(lblOutput).addGap(3, 3, 3).addComponent(lblOutputSmall, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(6, 6, 6).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(txtOutputDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(4, 4, 4).addComponent(lblOutputError).addGap(6, 6, 6).addComponent(cbCompileAll).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(cbPrettyPrinting).addGap(11, 11, 11).addComponent(btnCompile, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(11, 11, 11))); pack(); setLocationRelativeTo(null); @@ -229,9 +241,8 @@ public class Main extends javax.swing.JFrame { if (inputDir.exists()) { prefs.put("inputDir", path); txtInputDir.setText(path); - } - if (gaveError) { - + if (inputError) + setErrorCondition(1, false); } } } @@ -243,9 +254,8 @@ public class Main extends javax.swing.JFrame { if (outputDir.exists()) { prefs.put("outputDir", path); txtOutputDir.setText(path); - if (outputDirFix) { - lblOutputError.setText(" "); - } + if (outputError) + setErrorCondition(2, false); } } } @@ -257,81 +267,39 @@ public class Main extends javax.swing.JFrame { if (asl.exists()) { prefs.put("aslDir", path); txtASLDir.setText(path); + if (aslError) + setErrorCondition(0, false); } } } private void btnCompileMouseClicked(java.awt.event.MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt)) { - if (!new File(txtASLDir.getText()).exists()) { - lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); - return; - } JTextField[] dirFields = {txtASLDir, txtInputDir, txtOutputDir}; for (byte i = 0; i < 3; i++) { File bleh = new File(dirFields[i].getText()); - if (!bleh.exists()) { - gaveError = true; - switch (i) { - case 0: - lblASLError.setText("asl.exe isn't in this location! You can click this message to download it."); - aslFix = true; - break; - case 1: - lblInputError.setText("This folder doesn't exist!"); - break; - case 2: - lblOutputError.setText("Output folder doesn't exsist! Click this message to create it."); - outputDirFix = true; - break; - } - return; - } else if (gaveError) { - switch (i) { - case 0: - lblASLError.setText(" "); - break; - case 1: - lblInputError.setText(" "); - break; - case 2: - lblOutputError.setText(" "); - outputDirFix = false; - break; - } - } + setErrorCondition(i, !bleh.exists()); } - if (gaveError) { + if (aslError || inputError || outputError) return; - } - //Rapid String declarations - String prettyPrinting = cbPrettyPrinting.isSelected() ? "-pretty" : "", - compileAll = cbCompileAll.isSelected() ? "-r" : "", - asl = txtASLDir.getText(), - input = txtInputDir.getText(), - output = txtOutputDir.getText(), - aslError = " "; + String prettyPrinting = cbPrettyPrinting.isSelected() ? "-pretty" : "", compileAll = cbCompileAll.isSelected() ? "-r" : "", asl = txtASLDir.getText(), input = txtInputDir.getText(), output = txtOutputDir.getText(), error = " "; try { Process aslProcess = new ProcessBuilder(asl, compileAll, prettyPrinting, input, output).start(); BufferedReader br = new BufferedReader(new InputStreamReader(aslProcess.getInputStream())); String line; while ((line = br.readLine()) != null) { - if (line.contains("Error")) { - aslError = line; + if (line.toLowerCase().contains("error")) { + error = line; } } aslProcess.waitFor(); - /* - Heavily obsolete alternative: - Runtime.getRuntime().exec("cmd /c start \"" + asl + "\" " + compileAll + prettyPrinting + "\"" + input + "\" \"" + output + "\""); - */ } catch (IOException | InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } - if (!aslError.equals(" ")) { - DlgError error = new DlgError(this, true, aslError); - error.setLocationRelativeTo(this); - error.setVisible(true); + if (!error.equals(" ")) { + DlgError showError = new DlgError(this, true, error); + showError.setLocationRelativeTo(this); + showError.setVisible(true); } } } @@ -345,23 +313,21 @@ public class Main extends javax.swing.JFrame { } private void lblOutputErrorMouseClicked(java.awt.event.MouseEvent evt) { - if (SwingUtilities.isLeftMouseButton(evt) && outputDirFix) { + if (SwingUtilities.isLeftMouseButton(evt) && outputError) { new File(txtOutputDir.getText()).mkdirs(); - outputDirFix = false; - lblOutputError.setText(" "); + setErrorCondition(2, false); } } private void lblASLErrorMouseClicked(java.awt.event.MouseEvent evt) { - if (SwingUtilities.isLeftMouseButton(evt) && aslFix) { + if (SwingUtilities.isLeftMouseButton(evt) && aslError) { try { URI github = new URI("https://github.com/DeKugelschieber/asl/releases"); java.awt.Desktop.getDesktop().browse(github); } catch (URISyntaxException | IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } - aslFix = false; - lblASLError.setText(" "); + setErrorCondition(0, false); } } @@ -382,7 +348,6 @@ public class Main extends javax.swing.JFrame { }); } - // Variables declaration - do not modify private javax.swing.JButton btnASL; private javax.swing.JButton btnCompile; private javax.swing.JButton btnInput; @@ -402,5 +367,4 @@ public class Main extends javax.swing.JFrame { private javax.swing.JTextField txtASLDir; private javax.swing.JTextField txtInputDir; private javax.swing.JTextField txtOutputDir; - // End of variables declaration } \ No newline at end of file From df79809cdde25065504c571cc50d1eeed4880222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Mon, 23 Nov 2015 17:09:08 +0200 Subject: [PATCH 10/12] Changed error keyword from `error` to `panic` --- gui/src/asl/gui/Main.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/src/asl/gui/Main.java b/gui/src/asl/gui/Main.java index 2fcb42a..abefe59 100644 --- a/gui/src/asl/gui/Main.java +++ b/gui/src/asl/gui/Main.java @@ -288,7 +288,7 @@ public class Main extends javax.swing.JFrame { BufferedReader br = new BufferedReader(new InputStreamReader(aslProcess.getInputStream())); String line; while ((line = br.readLine()) != null) { - if (line.toLowerCase().contains("error")) { + if (line.toLowerCase().contains("panic")) { error = line; } } @@ -367,4 +367,4 @@ public class Main extends javax.swing.JFrame { private javax.swing.JTextField txtASLDir; private javax.swing.JTextField txtInputDir; private javax.swing.JTextField txtOutputDir; -} \ No newline at end of file +} From 2e94cf8efb8573755d60c9abee8ab2cd8074657c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Mon, 23 Nov 2015 17:14:09 +0200 Subject: [PATCH 11/12] Recompiled for previous fix --- gui/ASL GUI.exe | Bin 45890 -> 45897 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/ASL GUI.exe b/gui/ASL GUI.exe index 2e26d2ecd1469bfd4c6403c9e08badd86ba74f12..ab5ab946a6f1a26a829bc721ec78fd080c4a578c 100644 GIT binary patch delta 7755 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 delta 7726 zcmZvhRZyJE+D37gAcISAg6rS}_uy{96Wn2t@P!})GdKiy*WkfIaF^h&gS#gru*1Kz z&&94f|LL1mZ>^`htM9t%8QDka-A74?LaC)sglVEQmDjIu`2Ia4WBAei0jpmKRV}@q zA<{n!83_pu3F$e?f2P0nS3k1|mLd0H)fBLU$nkztN}- zU|?Y1h59S2qE4D8Br`xMlIiL(8$%*8k^g8aXzxGVi0VcDCpM+zw_TJR5<}7018e$6 z`Nu5$L#?>(e@K+j_n&B7>%s5jKPNWcB^D#&|GA`(JzwUQ8VRXCxipyzAVzUPVSbmS8lFV3-0`KX*0SwFfMEC|5ghXUH**1j*@Oqbv4{w#;jKrlt z9QYZ>kzWo+fVuQ8$^F;|?{F;b`rx21{gG)a*5a0fMQPri=;U3y2sNHh2!xZw8f?+y z#0b3R(#H+{V%T$%-gFo9GZ5X~O3v;;3EjOxzGS*B18&xOFHGLT0m-6GrSfj^uKx&^ zXl>Q&=}0#e^KVJU{748m^qu(`M-X0aNVv2npOoW2K!T1h8n)d7ZUkNKpD+GperkBh zAknl&MXL$LYu**H%D_$O`&^=EXp2t)mcWVTV&iOZN;$`x%#-+{BNa$d5YJTPg-wUlGqp z;WMMxX)lA49d;STNR1AjXF8+O>b4GlBo1SoscketqB?1`Cv3Pe`pOTI$xiyy28A5T z*=tWia#kp#p{r29$jWI0V=P?>HzQK?gBXzBtO;eMe*&T?{UFH?EQNEd4%hcw=i~bb zEVlRQZ^&;HDFr)oarh01aG%Y!TWRAOp?^t?B9k3HC2&5|KL}a~5P_%%`2hL)1RufL z6%oz(TJR}>j+aa8MMluR0zQ;avJ_;;(sUkXpv z>GYj;0-!@AV^ChTN)Oe=m{%5*c?Bg4GR`u@;vAsC9oKmjp_k+7BFh3nu@;uB z!%9-gr`z?V*c2C8`6hGm^&e^7v$~^0DVjE_W&yDJW0<4+OyC_=7uj3e6)X)mMr4Cy zN@Kgl_9^%6LZ`8ycGG5$27q{WT8{Hi4OW)pk^T}V_ zCQI1`sT7saO8uS*tj%i%SLdYY%v0hh3a!{wuGXc!Ph)qUQ~gehdkn*fPYgW@SzqFs zCyk#6!F0|WSt&|nESk4n2YFk_Coyn(#Iv*AeGF_jJ+KF4vRX{UoUF@W0stvtLWV9 zS)!goe|h@$0yL1()S&yqthSj!gAaXYy&On$qQ-h%kzKpLk5UoqrrIm}D&?(ndM#BIj#Io%;vuqqGptUHa7^ROg5gKEdf<0~WCj6p$E zQORnVtsr>$XM*REU66t>ysSH?p{szx7F>YnBSZ@03&~$pTeml_%u<=3N@s3K5w|_N zJjs!&@r2_z1v=i0iZ95M)7s3m2LWeWdhD??)aO<#Wf`pe4aA)C+hFPRfEQnyN2hgd zlMK3v3GdKWZMOPQH$E+Z-5D-kizd5{4wdSOdb9eLcIf4dBWuPT=8OzfqotY%CTmY> zp40T?WE@>yy!NfX^G-^fcy&&bu_mVGM3LPYh zTvKVx8mAMXJjZF%#$gzR0s0!|estfi?^$hJ(Mxz)gY!@>qaaHrcb)JFS$~>6Q@<%+ zn?DTap6aWPVxw^hY#t#B0)As}PRUY?Vl$<%YSojAShU<)k9As@`qq9zXY%QHlsN!> zKen7$ETV3SvCYq^Up$#tAuCh_Irp0y&}i93k@QDbibjhPvEkNom_}%UT)D{bYp}+m za)?d$ua!UO`KG-*M2wAr@||OI#uSXy%ZK)EFf62{83*mik0w?NfVSI&D()tJ3ao%t z^N`MP0t*tY7AT5ct5At*ifQf3LM;V$k+_|$Bdl*7l{1JR5yIm07=8y^&*UR6OpJY-3C=aT;l+;#`9$rG zbJK+ibcs}_5F_uLv7L*!*OFbfOwx+-V;$db9GQPw6kmT%o)F~o%t*a}|0#PhD7 zl7?UK@1CpZ05snH9kPWbdwLoft?Yxb$+FZ+fu^w}iV6{OEU3%5MX z-l@A;R76!7TyfT$fXw=vD_b?qYhl!_K};=fHj6-Gt0GaC;Xn-nEbwK}&O6>&QxOE! z>&~XJ5}5EIa3eP}@PxMN4b-Qr(|`%=ciZ;I^=Chq4%X;{{OdWtnz^u4eB;xX7rBk8 z3jn-}72qGGLJWmA{d^48nL=y>t9v||Tq(2ouGw=Q-=^^^>tu4AgMRRn{P3=S1zOFB z!fah)@T+9x_@&YEg1DdL<>Sz@wUpQ1)>59 z>hG((&w+#oFLaB3bo|-LLAR%V!hhAukqcN=l#h5)SY+n3Z_vKrD4J%#??b3caO@+ey0YNCG0* zcu~8WJ}}6jAlLL!mnV4Y5)U`+CeP8t-1_)KdyB)FE0gkbUKMEPk8E1Zs8L!fr@s*J zk1ntxP_L2;)oyKbD^~{~KB}z}e`xLQ4|JCLN3Jl68D2%A*64Ruz*_oOVGw1|1?&fg<-M>q zPP9#A4o`2%s_Rr@bcUzXC~0HZt(I_#3GwKqT46FVk^eMuu5S{e4peh;m_GZ9;8hw} zX0;<(FHlUy*$V@2db^Bej3umS&5<5i;KMbxjbWxy7^+VC#IClatbo%c;3Xg?{yC!H zr8s&@uE%v^TcD$bp77PKs=)<{9%ThCyJhs-K>H+%SRX?3VaiZBZJHFF@szm04|UHX zux@6?2}aJ|qrsmgSWjo9iLF>A2rE8rDTNDV64Ep4v;>cMl!ekU4%zxGKMf(SDk>^Y zyD2u1k~xQ_)ue~l#rOK6fwp}t5`j?#=LDtiCcFkY+n;tymW4VLA|+o93TlJjJka1# z7WrHitE>lyn`kR+2$V7P)FqmW*;HzM`M7ke%@sOapt4zpjtHOP?(c9u+sH*S5%N@e zh@7||9dr^_(XCMZ)CW{1X2z)gXfhxdL}zO9WhI(m($z2#>MUFh0@UIiE?s{S_d)dA z78XhP!Ib>Zh4=0V+|9Clu;@l#2ssv#%yzL3Ani5~HI1v-lAN#-{-u%Fut4kpQX5n8 zim%{^rmdrZ)7^M-@nVlsRQ|bbZ#b^oQ;0Mz|}rH zOKM>O?ytVKtGjqq8T)ipCrDPk5_ivKf3D}()GVmS68l?NtQVZti*jE)C<-LJGn*ZS ziN`m^{tBBu$P80HQ&(S?J@r(<)2D04!@%{LW}uq3!UG#J0xh7cH|^Z7=6PsMiwAqd z4sLdzj50C11{$97Rzgv9`X8_cMy4>VioU+c2Mr#%V?o|!ZWm=AVSM~Jp9?EJX2F`3 z!i`nraPu`5t#k&*uA?7K2GdOA-$XY+YKfSKrxy>2Nu|6Wu+5={>)88dZ8Wi;+a-J_XQQql zIFHr7(B<~mPp34w3V6w$z(VO(mAonCJdJ>zZyipo-v~0|cCHzB{6`|PcX2V2V@Z9W z!QJTbQcIH%-(!!u(g%Zc2HEdb{iTy0Z<(M5x^E2;o77QwSc|c{N~3maUZ;bO%O8Y~ zxO*q}f%Eu#`)&ue2-@dL2NN9&EkFAbjV%YvxTYCT?zCHo_J$;il9DOBQ(mgJ5OWeS zNo)KJ?;F)Z>oILZUmy!3#0M(0F56v-L05UwTZ<|H=+S}>NK0Ki>N?B4h zFTw$DGUxk40lRvsTai`fIr;_dATl_J*b zbp9vgpQ-_78km?Q)`Y=WNVbPRZ12(TH~;<`R=*TE;kDzw4~nbq5;*C~x_deP%lTeu z;YsKO=;^Zmi~inlVKd_nnD`ac_`9bX5CTp*9Xh|2|C~*zCW@%$cF18knSTFRk)(!> zB={WlE%KV>8m7rWN4F(Sgtd-#5nnKy9l4pG90552kJ7W4s>eOYw^Ag!DQlHl-n5n8-fp z6Vn=K%gkv;P^A+z_mAiz3gg%dYMuqDQ+U?Wq@lk#333&|H_zjTp3N)0`X0{zmDy!PVSJk zpCIg-1&=LY>ds<~5Lfkw@&yp?<-}9CkI1p>x|)XdzeN`2tT1UNNoCHQ$6m@rbFoCp zPt8=XFlix4WwDA^6_Sc}kP=SQ^B&L?r@tzd2(4y7mJpvFepAo@*)^9b=}LteEo!x&AI1B5Rx96^J_7lhNY#`YDzV-< zvMRBvDjQaEPPX^XIVbp!&8)vyLa_LL^PoNn_^Hb}(J&>3a}fju7uja74=N3%QwL!5 zL9)vz_~=MVL-;g01zmvdxh%d2{&Z_%)?Rr{DIBS_=i(w1eAF3}8|*GNgkq5B)qu+S zepeob^jXM=RtyV%MWI9vH2V#Ojbl`FXAdbZa^8qD;1p$lYsI7F4s9&F6bzuxcD zKDaFOF7lvzi0y%U?ZCZk;e+^*ROC>qG&Eo7qTgZ#=TKbJdqD0u3|GoLnf&)aljG`k zA-nlFM@%n^kWU2@6e#pCv2n__y}*hQ{jRj_#mX?vl)xEv^O`Eyf;6vHp#F2@RKxkJ zQf5{fIeKb$^_YmBIB>FB`cm1=$4cF}?E3h= zb7-CJshxtLuK{A{4~okOrM*(vU~C13L$^%2iLoMU9x|xX!q%dVEqve#6+fTAPp0qAZB%hfH(7L_qf&lhf5*cGXtis;q!(NDJ5db^%wn@xq>;m6mv1%_iWx#>9 z{EAp21E`deM230~%sAMZrB&1F$PS$7DAG9AE9{a}>_~6Ra2vvu#2K(cme5YNXp9Nd zc_g+N^nRyI(FAD_S9469d(2DwL5V}PbOatCI@!azznXe713psf=DgtMT;d8g9 zC)+K2z0ORMfH3-iy&{mBj^uUE4#Eu5`{A;f1;EX1h>1Ahp4~zpGlxv;67ZTFZwrr& zT(;ZOezA`3HcP$Pavih3jI$T~;@pNRU3dDPkh^2MD5iGX_QdnD;tp~@ejM@5UWI?9 zbv`zsw?Tdl4lRP)Aol>RZzA9Q&|6BBy(@I=*xH}aHaz{pQbZW?O7meM_2`|)suv95 z25h=SR+E$|TXU}N`Y^dnENk?5N0tztQ&8LlW8(}wiIG0Um$W{4z<$EnSMn5{GL)}E z#DY1oxk_ui^GVrs=2)@3aL5pLl$hMGAz8QwjwXwZ*spq|RFb>%zqEmasW~ly3SPbn zf4;knqw=TR@~2Sths3ul>T?%ij5z%cfX<^(yjQf>DASDIYahNj@(bv%4la4!mm9^> z--<)f^xReDrJ6|#c`?uUQp-hY3<^U;b@E=#9Xz|6WGK(`DJ-V@*>8hW2av!atSI;ZnsJc_^KDd}S+T_a9oS&I4_yW)^~h7*`_)b-%l z<|s8Ec@@Z8IPEAJmSU{5XT#M)mCaJKP3Dns;yZI_*8o@5mRnZFK6d81a+LAspQ5kF)nVH-v+%R zIG8#fgIp~3g`H#ctFl3noXlg3(y8+?M8^dy^J&az%=!TpU2QRauA8UyEGAICiT*8# zE!d4Srcz7VP3XJII5&VZ%z9vf^eyYoEx8-T(aJ!Jm zyS{%&ZFqpSoi($7*hrS?Q=~AdL`@%=DEgvyu&K8;fTR~_{FM^}>3kj%UjONcZEwbV6I`1%a?s?`9kYHowUnNnm^gKVdI(UA%Hx6c%4mIb;+%>CC z$0hSD7FDD9`BGaQ8HE%T=kJ0N3F+_paky6OPbZ05C-bL_RIKCs1OGaqKd7mb`-7|h zIKldVBEI!9{}zx*4WQ)N`acC`^3VThiH3ht@BV|X2ATir8}S-NFdF&)6r=wKX6HvU From d07611c3a5ce9d8e6bd4583ad2b54cadce2ee58b Mon Sep 17 00:00:00 2001 From: Marvin Blum Date: Thu, 26 Nov 2015 15:26:53 +0100 Subject: [PATCH 12/12] Fixed "switch" in keyword list. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0ed727..bfa5c46 100644 --- a/README.md +++ b/README.md @@ -234,7 +234,7 @@ Keywords should not be used as identifiers. Here is a full list of all keywords | var | | if | | while | -| witch | +| switch | | for | | foreach | | func |