diff --git a/lib/beautyeye_lnf.jar b/lib/beautyeye_lnf.jar new file mode 100644 index 0000000..ad6f1df Binary files /dev/null and b/lib/beautyeye_lnf.jar differ diff --git a/lib/json-simple-1.1.1.jar b/lib/json-simple-1.1.1.jar new file mode 100644 index 0000000..66347a6 Binary files /dev/null and b/lib/json-simple-1.1.1.jar differ diff --git a/lib/seaglasslookandfeel-0.2.jar b/lib/seaglasslookandfeel-0.2.jar new file mode 100644 index 0000000..059f9f0 Binary files /dev/null and b/lib/seaglasslookandfeel-0.2.jar differ diff --git a/src/net/apocalypselabs/symat/Display.form b/src/net/apocalypselabs/symat/Display.form index 3c76018..2cd362f 100644 --- a/src/net/apocalypselabs/symat/Display.form +++ b/src/net/apocalypselabs/symat/Display.form @@ -13,13 +13,13 @@ - + - + - + @@ -58,12 +58,11 @@ - - + - + @@ -88,7 +87,7 @@ - + @@ -97,7 +96,7 @@ - + @@ -111,7 +110,7 @@ - + @@ -119,7 +118,7 @@ - + diff --git a/src/net/apocalypselabs/symat/Display.java b/src/net/apocalypselabs/symat/Display.java index 93c1276..bd93862 100644 --- a/src/net/apocalypselabs/symat/Display.java +++ b/src/net/apocalypselabs/symat/Display.java @@ -45,8 +45,6 @@ */ package net.apocalypselabs.symat; -import javax.swing.JOptionPane; - /** * * @author Skylar @@ -79,9 +77,9 @@ public class Display extends javax.swing.JInternalFrame { setIconifiable(true); setTitle("Theme"); setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/settings.png"))); // NOI18N - setMaximumSize(new java.awt.Dimension(170, 190)); - setMinimumSize(new java.awt.Dimension(170, 190)); - setPreferredSize(new java.awt.Dimension(170, 190)); + setMaximumSize(new java.awt.Dimension(170, 188)); + setMinimumSize(new java.awt.Dimension(170, 188)); + setPreferredSize(new java.awt.Dimension(170, 188)); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentShown(java.awt.event.ComponentEvent evt) { formComponentShown(evt); @@ -93,10 +91,10 @@ public class Display extends javax.swing.JInternalFrame { themeGroup.add(themeLight); themeLight.setSelected(true); - themeLight.setText("Light"); + themeLight.setText("Daylight"); themeGroup.add(themeDark); - themeDark.setText("Dark"); + themeDark.setText("NightDark"); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); @@ -107,14 +105,14 @@ public class Display extends javax.swing.JInternalFrame { .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(themeLight) .addComponent(themeDark)) - .addContainerGap(67, Short.MAX_VALUE)) + .addContainerGap(43, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(themeLight) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(themeDark) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -142,11 +140,10 @@ public class Display extends javax.swing.JInternalFrame { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(saveBtn) - .addContainerGap(29, Short.MAX_VALUE)) + .addContainerGap(41, Short.MAX_VALUE)) ); pack(); @@ -172,13 +169,7 @@ public class Display extends javax.swing.JInternalFrame { } else { PrefStorage.saveSetting("theme", "light"); } - if (!PrefStorage.save()) { - // Something dun goofed... - JOptionPane.showInternalMessageDialog(this, - "Error: Problem occured while saving settings. " - + "This error is outside the control of " - + "the application."); - } + PrefStorage.save(); MainGUI.updateDisplay(); dispose(); }//GEN-LAST:event_saveBtnActionPerformed diff --git a/src/net/apocalypselabs/symat/Functions.java b/src/net/apocalypselabs/symat/Functions.java index 5a74e02..af398e2 100644 --- a/src/net/apocalypselabs/symat/Functions.java +++ b/src/net/apocalypselabs/symat/Functions.java @@ -46,6 +46,7 @@ package net.apocalypselabs.symat; import static java.lang.Math.*; +import java.util.HashMap; import javax.swing.JOptionPane; import org.matheclipse.core.eval.EvalUtilities; import org.matheclipse.parser.client.math.MathException; @@ -59,6 +60,8 @@ import org.matheclipse.parser.client.math.MathException; */ public class Functions { + public static final HashMap GLOBALS = new HashMap<>(); + private final EvalUtilities util = new EvalUtilities(true, true); Graph graphwin = new Graph(true); @@ -203,6 +206,45 @@ public class Functions { graphwin.drawDot(x, y); } + /* + Global variables are accessible across scripts. + */ + /** + * Set a global variable. + * + * @param name The variable name + * @param var The variable + */ + public static void global(String name, Object var) { + GLOBALS.put(name, var); + } + + /** + * Get a global variable. + * + * @param name The variable name + * @return The variable + */ + public static Object global(String name) { + return GLOBALS.get(name); + } + + /** + * Clear all the GLOBALS. + */ + public static void clrglobals() { + GLOBALS.clear(); + } + + /** + * Check if the given global key is set. + * @param name The key to check. + * @return True if the key exists, else false. + */ + public static boolean globalcontains(String name) { + return GLOBALS.containsKey(name); + } + /* Other */ diff --git a/src/net/apocalypselabs/symat/Globals.form b/src/net/apocalypselabs/symat/Globals.form new file mode 100644 index 0000000..6e9a1a3 --- /dev/null +++ b/src/net/apocalypselabs/symat/Globals.form @@ -0,0 +1,200 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/net/apocalypselabs/symat/Globals.java b/src/net/apocalypselabs/symat/Globals.java new file mode 100644 index 0000000..d6f2bdc --- /dev/null +++ b/src/net/apocalypselabs/symat/Globals.java @@ -0,0 +1,271 @@ +/* + * CODE LICENSE ===================== + * Copyright (c) 2015, Apocalypse Laboratories + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * 4. You adhere to the Media License detailed below. If you do not, this license + * is automatically revoked and you must purge all copies of the software you + * possess, in source or binary form. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * MEDIA LICENSE ==================== + * All images and other graphical files (the "graphics") included with this + * software are copyright (c) 2015 Apocalypse Laboratories. You may not distribute + * the graphics or any program, source code repository, or other digital storage + * media containing them without written permission from Apocalypse Laboratories. + * This ban on distribution only applies to publicly available systems. + * A password-protected network file share, USB drive, or other storage scheme that + * cannot be easily accessed by the public is generally allowed. If in doubt, + * contact Apocalypse Laboratories. If Apocalypse Laboratories allows or denies + * you permission, that decision is considered final and binding. + */ +package net.apocalypselabs.symat; + +import javax.swing.JOptionPane; + +/** + * + * @author Skylar + */ +public class Globals extends javax.swing.JInternalFrame { + + private int hashCode; + + /** + * Creates new form Globals + */ + public Globals() { + initComponents(); + } + + /** + * 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() { + + addBtn = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + jScrollPane1 = new javax.swing.JScrollPane(); + keyList = new javax.swing.JList(); + remBtn = new javax.swing.JButton(); + jPanel2 = new javax.swing.JPanel(); + jScrollPane2 = new javax.swing.JScrollPane(); + valBox = new javax.swing.JTextArea(); + refreshBtn = new javax.swing.JButton(); + + setClosable(true); + setIconifiable(true); + setMaximizable(true); + setResizable(true); + setTitle("Global Variables"); + setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/globals.png"))); // NOI18N + addComponentListener(new java.awt.event.ComponentAdapter() { + public void componentShown(java.awt.event.ComponentEvent evt) { + formComponentShown(evt); + } + }); + + addBtn.setText("Add"); + addBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + addBtnActionPerformed(evt); + } + }); + + jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Variables")); + + keyList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + keyList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(javax.swing.event.ListSelectionEvent evt) { + keyListValueChanged(evt); + } + }); + jScrollPane1.setViewportView(keyList); + + 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(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE)) + ); + + remBtn.setText("Remove"); + remBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + remBtnActionPerformed(evt); + } + }); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Value")); + + valBox.setEditable(false); + valBox.setColumns(1); + valBox.setRows(1); + valBox.setTabSize(4); + jScrollPane2.setViewportView(valBox); + + 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(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE) + .addContainerGap()) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane2)) + ); + + refreshBtn.setText("Refresh"); + refreshBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + refreshBtnActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(addBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(remBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(refreshBtn) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(addBtn) + .addComponent(remBtn) + .addComponent(refreshBtn)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void keyListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_keyListValueChanged + if (keyList.getSelectedValue() != null) { + try { + valBox.setText(Functions.GLOBALS.get( + keyList.getSelectedValue().toString()).toString()); + } catch (Exception ex) { + valBox.setText("Error. Note some datatypes " + + "cannot be displayed here."); + } + } + }//GEN-LAST:event_keyListValueChanged + + private void addBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addBtnActionPerformed + String name = JOptionPane.showInternalInputDialog(this, + "New variable name:", + "New global", + JOptionPane.PLAIN_MESSAGE); + if (name != null) { + if (!name.equals("")) { + Functions.GLOBALS.put(name, null); + refreshList(); + } + } + }//GEN-LAST:event_addBtnActionPerformed + + private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown + refreshList(); + }//GEN-LAST:event_formComponentShown + + private void remBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_remBtnActionPerformed + if (keyList.getSelectedValue() != null) { + int choice = JOptionPane.showInternalConfirmDialog(this, + "Delete variable '" + + keyList.getSelectedValue().toString() + "'?", + "Delete?", + JOptionPane.YES_NO_OPTION); + if (choice == JOptionPane.YES_OPTION) { + Functions.GLOBALS.remove(keyList.getSelectedValue().toString()); + refreshList(); + } + } + }//GEN-LAST:event_remBtnActionPerformed + + private void refreshBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshBtnActionPerformed + refreshList(); + }//GEN-LAST:event_refreshBtnActionPerformed + + private void refreshList() { + if (Functions.GLOBALS.hashCode() != hashCode) { + keyList.setListData(Functions.GLOBALS.keySet().toArray()); + hashCode = Functions.GLOBALS.hashCode(); + valBox.setText(""); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton addBtn; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JList keyList; + private javax.swing.JButton refreshBtn; + private javax.swing.JButton remBtn; + private javax.swing.JTextArea valBox; + // End of variables declaration//GEN-END:variables +} diff --git a/src/net/apocalypselabs/symat/MainGUI.form b/src/net/apocalypselabs/symat/MainGUI.form index efe5e15..78ca6ca 100644 --- a/src/net/apocalypselabs/symat/MainGUI.form +++ b/src/net/apocalypselabs/symat/MainGUI.form @@ -62,8 +62,8 @@ - - + + @@ -76,26 +76,24 @@ - + - - - + + + - - - - - - - - - + + + + + + + @@ -175,12 +173,12 @@ - + - + - + @@ -192,7 +190,7 @@ - + @@ -203,8 +201,8 @@ - - + + @@ -216,22 +214,22 @@ - + - - - + + + - - - - - - + + + + + + @@ -256,7 +254,7 @@ - + @@ -271,12 +269,12 @@ - + - + - + @@ -288,15 +286,15 @@ - + - + - + - + @@ -308,7 +306,7 @@ - + @@ -340,9 +338,9 @@ - - - + + + diff --git a/src/net/apocalypselabs/symat/MainGUI.java b/src/net/apocalypselabs/symat/MainGUI.java index 5d79d3c..fede1ed 100644 --- a/src/net/apocalypselabs/symat/MainGUI.java +++ b/src/net/apocalypselabs/symat/MainGUI.java @@ -53,7 +53,6 @@ import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.beans.PropertyVetoException; import java.io.File; import java.io.IOException; import java.util.Calendar; @@ -73,9 +72,9 @@ import javax.swing.UIManager; public class MainGUI extends javax.swing.JFrame { // TODO: Add more code comments and stuff in case anybody else reads this - public static final String APP_NAME = "SyMAT 1.1"; - public static final double APP_CODE = 13; - public static final String VERSION_NAME = "1.1"; + public static final String APP_NAME = "SyMAT 1.2"; + public static final double APP_CODE = 14; + public static final String VERSION_NAME = "1.2"; public static final String API_URL = "https://apis.symatapp.com/"; public static String argfile = ""; public static boolean skipPython = false; // Skip python init on start? @@ -122,7 +121,7 @@ public class MainGUI extends javax.swing.JFrame { // Disable community tab tabs.remove(2); - + // Open initial windows boolean loaded = false; if (!argfile.equals("")) { @@ -314,12 +313,12 @@ public class MainGUI extends javax.swing.JFrame { editorBtn = new javax.swing.JButton(); graphBtn = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); - helpBtn = new javax.swing.JButton(); + globalsBtn = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); arrangeWindowsBtn = new javax.swing.JButton(); - closeAllBtn = new javax.swing.JButton(); displaySettingsBtn = new javax.swing.JButton(); + helpBtn = new javax.swing.JButton(); jPanel5 = new javax.swing.JPanel(); wikiBtn = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); @@ -402,16 +401,16 @@ public class MainGUI extends javax.swing.JFrame { jLabel1.setText(namemark()); jLabel1.setFocusable(false); - helpBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/help.png"))); // NOI18N - helpBtn.setText("Manual"); - 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() { + globalsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/globals.png"))); // NOI18N + globalsBtn.setText("Vars"); + globalsBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); + globalsBtn.setFocusable(false); + globalsBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + globalsBtn.setOpaque(false); + globalsBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + globalsBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - helpBtnActionPerformed(evt); + globalsBtnActionPerformed(evt); } }); @@ -424,27 +423,26 @@ public class MainGUI extends javax.swing.JFrame { .addComponent(shellBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(editorBtn) - .addGap(12, 12, 12) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(graphBtn) - .addGap(11, 11, 11) - .addComponent(helpBtn) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 124, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(globalsBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 127, Short.MAX_VALUE) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(shellBtn) - .addComponent(editorBtn) - .addComponent(graphBtn) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(helpBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(jPanel4Layout.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) + .addComponent(globalsBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - tabs.addTab("Apps", jPanel4); + tabs.addTab("Home", jPanel4); jPanel2.setOpaque(false); @@ -454,7 +452,7 @@ public class MainGUI extends javax.swing.JFrame { jLabel3.setFocusable(false); arrangeWindowsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/cascade.png"))); // NOI18N - arrangeWindowsBtn.setText("Cascade"); + arrangeWindowsBtn.setText("Arrange"); arrangeWindowsBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); arrangeWindowsBtn.setFocusable(false); arrangeWindowsBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); @@ -466,19 +464,6 @@ public class MainGUI extends javax.swing.JFrame { } }); - closeAllBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/closeall.png"))); // NOI18N - closeAllBtn.setText("Close All"); - closeAllBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); - closeAllBtn.setFocusable(false); - closeAllBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - closeAllBtn.setOpaque(false); - closeAllBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - closeAllBtn.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - closeAllBtnActionPerformed(evt); - } - }); - displaySettingsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/display.png"))); // NOI18N displaySettingsBtn.setText("Theme"); displaySettingsBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); @@ -492,6 +477,19 @@ public class MainGUI extends javax.swing.JFrame { } }); + helpBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/images/help.png"))); // NOI18N + helpBtn.setText("Manual"); + 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); + } + }); + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( @@ -500,24 +498,24 @@ public class MainGUI extends javax.swing.JFrame { .addContainerGap() .addComponent(displaySettingsBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(arrangeWindowsBtn) + .addComponent(arrangeWindowsBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(closeAllBtn) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 490, Short.MAX_VALUE)) + .addComponent(helpBtn) + .addGap(77, 77, 77) + .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(arrangeWindowsBtn) - .addComponent(closeAllBtn) - .addComponent(displaySettingsBtn)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(arrangeWindowsBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(displaySettingsBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(helpBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); - tabs.addTab("Window", jPanel2); + tabs.addTab("Apps", jPanel2); jPanel5.setFocusable(false); jPanel5.setOpaque(false); @@ -553,9 +551,9 @@ public class MainGUI extends javax.swing.JFrame { jPanel5Layout.setVerticalGroup( jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel5Layout.createSequentialGroup() - .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(wikiBtn) - .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(wikiBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -689,16 +687,6 @@ public class MainGUI extends javax.swing.JFrame { loadFrame(new Display()); }//GEN-LAST:event_displaySettingsBtnActionPerformed - private void closeAllBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeAllBtnActionPerformed - for (JInternalFrame ji : mainPane.getAllFrames()) { - try { - ji.setClosed(true); - } catch (PropertyVetoException ex) { - ji.dispose(); - } - } - }//GEN-LAST:event_closeAllBtnActionPerformed - private void arrangeWindowsBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_arrangeWindowsBtnActionPerformed cascade(); }//GEN-LAST:event_arrangeWindowsBtnActionPerformed @@ -771,6 +759,10 @@ public class MainGUI extends javax.swing.JFrame { //loadFrame(new Wiki()); }//GEN-LAST:event_wikiBtnActionPerformed + private void globalsBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_globalsBtnActionPerformed + loadFrame(new Globals()); + }//GEN-LAST:event_globalsBtnActionPerformed + /* End the button handlers. */ @@ -851,6 +843,7 @@ public class MainGUI extends javax.swing.JFrame { /* 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())) { @@ -858,16 +851,24 @@ public class MainGUI extends javax.swing.JFrame { 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); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException e) { + java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, e); + } + + if (PrefStorage.getSetting("theme").equals("glass")) { + try { + UIManager.setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel"); + } catch (Exception ex) { + + } } // // try { // Ubuntu font for prettifying - ubuntuRegular = Font.createFont(Font.TRUETYPE_FONT,MainGUI.class. - getResourceAsStream("/ubuntu.ttf")); + ubuntuRegular = Font.createFont(Font.TRUETYPE_FONT, MainGUI.class. + getResourceAsStream("/ubuntu.ttf")); } catch (FontFormatException | IOException ex) { ubuntuRegular = Font.getFont(Font.SANS_SERIF); System.err.println("Error loading fonts: " + ex.getMessage()); @@ -909,9 +910,9 @@ public class MainGUI extends javax.swing.JFrame { // Variables declaration - do not modify//GEN-BEGIN:variables public static javax.swing.JButton arrangeWindowsBtn; - public static javax.swing.JButton closeAllBtn; public static javax.swing.JButton displaySettingsBtn; public static javax.swing.JButton editorBtn; + public static javax.swing.JButton globalsBtn; public static javax.swing.JButton graphBtn; public static javax.swing.JButton helpBtn; public static javax.swing.JLabel jLabel1; diff --git a/src/net/apocalypselabs/symat/icons/globals.png b/src/net/apocalypselabs/symat/icons/globals.png new file mode 100644 index 0000000..c40d4d6 Binary files /dev/null and b/src/net/apocalypselabs/symat/icons/globals.png differ diff --git a/src/net/apocalypselabs/symat/images/globals.png b/src/net/apocalypselabs/symat/images/globals.png new file mode 100644 index 0000000..18072d4 Binary files /dev/null and b/src/net/apocalypselabs/symat/images/globals.png differ