/* * Apocalypse Laboratories * Open Source License * * Source code can be used for any purpose, as long as: * - Compiled binaries are rebranded and trademarks are not * visible by the end user at any time, except to give * credit to Apocalypse Laboratories, such as by showing * "Based on by Apocalypse Laboratories" or a * similar notice; * - You do not use the code for evil; * - Rebranded compiled applications have significant * differences in functionality; * - and you provide your modified source code for download, * under the terms of the GNU LGPL v3 or a comparable * license. * * Compiled binaries cannot be redistributed or mirrored, * unless: * - You have written permission from Apocalypse Laboratories; * - Downloads are not available from Apocalypse Laboratories, * not even behind a paywall or other blocking mechanism; * - or you have received a multi-computer license, in which * case you should take measures to prevent unauthorized * downloads, such as preventing download access from the * Internet. */ package net.apocalypselabs.symat; import java.awt.Rectangle; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JDesktopPane; import javax.swing.JInternalFrame; /** * * @author Skylar */ public class MainGUI extends javax.swing.JFrame { public static final String APP_NAME = "SyMAT 0.6"; public static final double APP_CODE = 0.6; public static String argfile = ""; /** * Creates new form MainGUI */ public MainGUI() { initComponents(); setIconImage((new ImageIcon(getClass().getResource("icon.png"))).getImage()); setLocationRelativeTo(null); try { URL url = new URL("http://symat.aplabs.us/version.txt"); InputStream is = url.openStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); br.close(); is.close(); double version = Double.parseDouble(line); if (version > APP_CODE) { if (PrefStorage.getSetting("update-ignore").equals(APP_CODE + "|" + version)) { System.out.println("An update was found, but has been ignored by the user."); } else { loadFrame(new Update(version)); } } } catch (IOException | NumberFormatException e) { System.err.println("Fail: Cannot check update server. \n" + " Assuming local copy up-to-date."); } // Open shell unless prog was run with argument if (argfile.equals("")) { Interpreter sh = new Interpreter(); loadFrame(sh); } else { CodeEditor ed = new CodeEditor(); loadFrame(ed); ed.openFileFromString(argfile); argfile = ""; } } private static String namemark() { String nbsp = ""; for (int i = 0; i < 8; i++) { nbsp += " "; } return "" + nbsp + "" + APP_NAME + "  "; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; tabs = new javax.swing.JTabbedPane(); jPanel4 = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel(); shellBtn = new javax.swing.JButton(); editorBtn = new javax.swing.JButton(); graphBtn = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jPanel2 = new javax.swing.JPanel(); helpBtn = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); arrangeWindowsBtn = new javax.swing.JButton(); jPanel3 = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); mainPane = new javax.swing.JDesktopPane(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle(APP_NAME); setMinimumSize(new java.awt.Dimension(600, 500)); setPreferredSize(new java.awt.Dimension(700, 500)); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentShown(java.awt.event.ComponentEvent evt) { formComponentShown(evt); } }); jPanel4.setEnabled(false); jPanel4.setLayout(null); tabs.addTab("", jPanel4); shellBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/shell.png"))); // NOI18N shellBtn.setText("Shell"); shellBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); shellBtn.setFocusable(false); shellBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); shellBtn.setOpaque(false); shellBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); shellBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { shellBtnActionPerformed(evt); } }); editorBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/editor.png"))); // NOI18N editorBtn.setText("Editor"); editorBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); editorBtn.setFocusable(false); editorBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); editorBtn.setOpaque(false); editorBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); editorBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editorBtnActionPerformed(evt); } }); graphBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/graph.png"))); // NOI18N graphBtn.setText("Graph"); graphBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); graphBtn.setFocusable(false); graphBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); graphBtn.setOpaque(false); graphBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); graphBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { graphBtnActionPerformed(evt); } }); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel1.setText(namemark()); jLabel1.setFocusable(false); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(shellBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(editorBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(graphBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 494, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(shellBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(editorBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(graphBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 0, 0)) ); tabs.addTab("Apps", jPanel1); helpBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/help.png"))); // NOI18N helpBtn.setText("Help"); helpBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); helpBtn.setFocusable(false); helpBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); helpBtn.setOpaque(false); helpBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); helpBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { helpBtnActionPerformed(evt); } }); jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel3.setText(namemark()); jLabel3.setFocusable(false); arrangeWindowsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/help.png"))); // NOI18N arrangeWindowsBtn.setText("Arrange"); arrangeWindowsBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); arrangeWindowsBtn.setFocusable(false); arrangeWindowsBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); arrangeWindowsBtn.setOpaque(false); arrangeWindowsBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); arrangeWindowsBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { arrangeWindowsBtnActionPerformed(evt); } }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addComponent(helpBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(arrangeWindowsBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 551, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(helpBtn) .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(arrangeWindowsBtn) ); tabs.addTab("Tools", jPanel2); jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel4.setText(namemark()); jLabel4.setFocusable(false); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 691, Short.MAX_VALUE) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0)) ); tabs.addTab("Settings", jPanel3); tabs.setSelectedIndex(1); mainPane.setBackground(new java.awt.Color(204, 204, 204)); mainPane.setAutoscrolls(true); mainPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); mainPane.setOpaque(false); javax.swing.GroupLayout mainPaneLayout = new javax.swing.GroupLayout(mainPane); mainPane.setLayout(mainPaneLayout); mainPaneLayout.setHorizontalGroup( mainPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 0, Short.MAX_VALUE) ); mainPaneLayout.setVerticalGroup( mainPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(mainPane) .addComponent(tabs) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(tabs, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(mainPane)) ); tabs.setEnabledAt(0, false); pack(); }// //GEN-END:initComponents private void shellBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shellBtnActionPerformed Interpreter i = new Interpreter(); loadFrame(i); }//GEN-LAST:event_shellBtnActionPerformed private void editorBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editorBtnActionPerformed CodeEditor e = new CodeEditor(); loadFrame(e); }//GEN-LAST:event_editorBtnActionPerformed private void graphBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_graphBtnActionPerformed Graph g = new Graph(); loadFrame(g); }//GEN-LAST:event_graphBtnActionPerformed private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown setLocationRelativeTo(null); }//GEN-LAST:event_formComponentShown private void helpBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpBtnActionPerformed Help h = new Help(); loadFrame(h); }//GEN-LAST:event_helpBtnActionPerformed private void arrangeWindowsBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_arrangeWindowsBtnActionPerformed cascade(); }//GEN-LAST:event_arrangeWindowsBtnActionPerformed /** * Adds the given JInternalFrame to the mainPane. Automatically does layout * and sets visible as well. * * @param frame */ public static void loadFrame(JInternalFrame frame) { int w = frame.getWidth(); int h = frame.getHeight(); int pw = mainPane.getWidth(); int ph = mainPane.getHeight(); if (frame.isResizable()) { if (h > ph) { h = ph; } if (w > pw) { w = pw; } frame.setSize(w, h); } mainPane.add(frame); frame.setLocation( (pw / 2) - (w / 2), (ph / 2) - (h / 2)); if (frame.getLocation().y < 0) { frame.setLocation(frame.getLocation().x, 0); } frame.setVisible(true); } public static void cascade() { JInternalFrame[] frames = mainPane.getAllFrames(); int x = 12; int y = 24; Debug.println("Cascading "+frames.length+" frames..."); for (int i = 0; i < frames.length; i++) { if (frames[i].isVisible()) { Debug.println("Frame: " + frames[i].getTitle() + ", Times: " + i + ", Xpos: " + x * i + ", Ypos: " + y * i); frames[i].setBounds(x * i, y * i, frames[i].getWidth(), frames[i].getHeight()); frames[i].toFront(); } } } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new MainGUI().setVisible(true); } }); // Trigger open passed script file if (args.length == 1) { argfile = args[0]; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton arrangeWindowsBtn; private javax.swing.JButton editorBtn; private javax.swing.JButton graphBtn; private javax.swing.JButton helpBtn; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; public static javax.swing.JDesktopPane mainPane; private javax.swing.JButton shellBtn; private javax.swing.JTabbedPane tabs; // End of variables declaration//GEN-END:variables }