diff --git a/src/net/apocalypselabs/symat/CodeEditor.form b/src/net/apocalypselabs/symat/CodeEditor.form
index 8bc3d96..5012e17 100644
--- a/src/net/apocalypselabs/symat/CodeEditor.form
+++ b/src/net/apocalypselabs/symat/CodeEditor.form
@@ -134,6 +134,9 @@
+
+
+
diff --git a/src/net/apocalypselabs/symat/CodeEditor.java b/src/net/apocalypselabs/symat/CodeEditor.java
index 9cce124..2353efc 100644
--- a/src/net/apocalypselabs/symat/CodeEditor.java
+++ b/src/net/apocalypselabs/symat/CodeEditor.java
@@ -143,6 +143,7 @@ public class CodeEditor extends javax.swing.JInternalFrame {
setResizable(true);
setTitle("Editor");
setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/editor.png"))); // NOI18N
+ setMinimumSize(new java.awt.Dimension(125, 50));
jSplitPane1.setDividerLocation(275);
jSplitPane1.setDividerSize(3);
diff --git a/src/net/apocalypselabs/symat/Debug.java b/src/net/apocalypselabs/symat/Debug.java
new file mode 100644
index 0000000..92fa11f
--- /dev/null
+++ b/src/net/apocalypselabs/symat/Debug.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+/**
+ * This class handles DEBUG logging, so it's easy to disable.
+ *
+ * @author Skylar
+ */
+public class Debug {
+ // If output should be on or off
+ public static final boolean DEBUG = true;
+
+ public static void println(Object data) {
+ if (DEBUG) System.out.println(data);
+ }
+
+ public static void printerr(Object data) {
+ if (DEBUG) System.err.println(data);
+ }
+}
diff --git a/src/net/apocalypselabs/symat/Graph.form b/src/net/apocalypselabs/symat/Graph.form
index d27b83b..974ede2 100644
--- a/src/net/apocalypselabs/symat/Graph.form
+++ b/src/net/apocalypselabs/symat/Graph.form
@@ -80,6 +80,12 @@
+
+
+
+
+
+
diff --git a/src/net/apocalypselabs/symat/Graph.java b/src/net/apocalypselabs/symat/Graph.java
index d4b8780..1b91b3c 100644
--- a/src/net/apocalypselabs/symat/Graph.java
+++ b/src/net/apocalypselabs/symat/Graph.java
@@ -120,6 +120,8 @@ public class Graph extends javax.swing.JInternalFrame {
setTitle("Graph");
setToolTipText("");
setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/graph.png"))); // NOI18N
+ setMaximumSize(new java.awt.Dimension(336, 406));
+ setMinimumSize(new java.awt.Dimension(336, 406));
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(java.awt.event.MouseEvent evt) {
formMouseDragged(evt);
diff --git a/src/net/apocalypselabs/symat/MainGUI.form b/src/net/apocalypselabs/symat/MainGUI.form
index 7a23d62..d67851e 100644
--- a/src/net/apocalypselabs/symat/MainGUI.form
+++ b/src/net/apocalypselabs/symat/MainGUI.form
@@ -1,11 +1,17 @@
-
diff --git a/src/net/apocalypselabs/symat/MainGUI.java b/src/net/apocalypselabs/symat/MainGUI.java
index dcb6ddc..cd60e49 100644
--- a/src/net/apocalypselabs/symat/MainGUI.java
+++ b/src/net/apocalypselabs/symat/MainGUI.java
@@ -27,12 +27,14 @@
*/
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;
/**
@@ -63,7 +65,7 @@ public class MainGUI extends javax.swing.JFrame {
double version = Double.parseDouble(line);
if (version > APP_CODE) {
if (PrefStorage.getSetting("update-ignore").equals(APP_CODE + "|" + version)) {
- System.err.println("An update was found, but has been ignored by the user.");
+ System.out.println("An update was found, but has been ignored by the user.");
} else {
loadFrame(new Update(version));
}
@@ -107,8 +109,8 @@ public class MainGUI extends javax.swing.JFrame {
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
- mainPane = new javax.swing.JDesktopPane();
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();
@@ -117,28 +119,24 @@ public class MainGUI extends javax.swing.JFrame {
jPanel2 = new javax.swing.JPanel();
helpBtn = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
- jLabel2 = 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);
}
});
- mainPane.setBackground(new java.awt.Color(204, 204, 204));
-
- 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, 407, Short.MAX_VALUE)
- );
+ 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");
@@ -188,25 +186,24 @@ public class MainGUI extends javax.swing.JFrame {
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.UNRELATED)
- .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 498, Short.MAX_VALUE))
+ .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.LEADING)
- .addComponent(shellBtn)
- .addComponent(editorBtn))
- .addGap(0, 0, Short.MAX_VALUE))
- .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addGap(0, 0, Short.MAX_VALUE)
- .addComponent(graphBtn))
+ .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);
@@ -228,30 +225,77 @@ public class MainGUI extends javax.swing.JFrame {
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(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE))
+ .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.createSequentialGroup()
- .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(helpBtn)
- .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(0, 0, Short.MAX_VALUE))
+ .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);
- jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
- jLabel2.setText(namemark());
- jLabel2.setFocusable(false);
- tabs.addTab("Settings", jLabel2);
+ 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);
@@ -263,11 +307,13 @@ public class MainGUI extends javax.swing.JFrame {
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addComponent(tabs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .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
@@ -295,14 +341,54 @@ public class MainGUI extends javax.swing.JFrame {
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(
- (mainPane.getWidth() / 2) - (frame.getWidth() / 2),
- (mainPane.getHeight() / 2) - (frame.getHeight() / 2));
+ (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
*/
@@ -341,14 +427,17 @@ public class MainGUI extends javax.swing.JFrame {
}
// 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 jLabel2;
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;