diff --git a/src/net/apocalypselabs/symat/Graph.java b/src/net/apocalypselabs/symat/Graph.java index 0c40020..401184e 100644 --- a/src/net/apocalypselabs/symat/Graph.java +++ b/src/net/apocalypselabs/symat/Graph.java @@ -62,9 +62,13 @@ public class Graph extends javax.swing.JInternalFrame { // If a graph is being drawn, set to true, else false boolean graphing = false; + // Graph scaling data. private double xtimes = 15; private double ytimes = 15; private double scale = 1; + + // The current value for the zoom/scale, as entered by the user + private int scaleLevel = 0; /** * Creates new form Graph @@ -333,21 +337,37 @@ public class Graph extends javax.swing.JInternalFrame { dispGraph(); }//GEN-LAST:event_formComponentShown + /** + * Get the zoom ratio. + * + * @param zoomLevel The zoom level to calculate from. + * @return The ratio. + */ + public static double getScale(int zoomLevel) { + double gscale = 15.0; + if (zoomLevel >= 0) { + gscale = 1.0 / (zoomLevel + 1.0); + } else { + gscale = 1.0 * (abs(zoomLevel) + 1.0); + } + return gscale; + } + /** * Set the zoom level. The larger the int, the more zoomed it is. * * @param zoomLevel Level to zoom. 0 is default (10x10). */ public void setZoom(int zoomLevel) { + scaleLevel = zoomLevel; if (zoomLevel >= 0) { xtimes = 15.0 * (zoomLevel + 1.0); ytimes = 15.0 * (zoomLevel + 1.0); - scale = 1.0 / (zoomLevel + 1.0); } else { xtimes = 15.0 / (abs(zoomLevel) + 1.0); ytimes = 15.0 / (abs(zoomLevel) + 1.0); - scale = 1.0 * (abs(zoomLevel) + 1.0); } + scale = getScale(zoomLevel); scaleLbl.setText("Scale: 1 to " + scale); Debug.println("Scaled to xtimes=" + xtimes + ", ytimes=" + ytimes + ", scale=1to" + scale); clearDraw(false); @@ -363,7 +383,6 @@ public class Graph extends javax.swing.JInternalFrame { new GraphThread(history.split("\n")).start(); inBox.setText(""); } - } private void dispGraph() { @@ -413,15 +432,17 @@ public class Graph extends javax.swing.JInternalFrame { }//GEN-LAST:event_jMenuItem3ActionPerformed private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed - try { - int size = Integer.parseInt(JOptionPane.showInternalInputDialog(this, - "Graph scale (negative numbers less detail, positive more detail):", - "Scale", - JOptionPane.QUESTION_MESSAGE)); + GraphScale gs = new GraphScale(scaleLevel); + int size = 0; + int result = JOptionPane.showInternalConfirmDialog(this, + gs, + "Graph Scale", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + size = gs.getScale(); Debug.println("Scaling to: " + size); setZoom(size); - } catch (Exception ex) { - } }//GEN-LAST:event_jMenuItem6ActionPerformed diff --git a/src/net/apocalypselabs/symat/GraphScale.form b/src/net/apocalypselabs/symat/GraphScale.form new file mode 100644 index 0000000..34b88bc --- /dev/null +++ b/src/net/apocalypselabs/symat/GraphScale.form @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/net/apocalypselabs/symat/GraphScale.java b/src/net/apocalypselabs/symat/GraphScale.java new file mode 100644 index 0000000..f5e90f4 --- /dev/null +++ b/src/net/apocalypselabs/symat/GraphScale.java @@ -0,0 +1,124 @@ +/* + * 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.math.BigDecimal; +import java.math.RoundingMode; + +/** + * + * @author Skylar + */ +public class GraphScale extends javax.swing.JPanel { + + /** + * Creates new form GraphSettings + */ + public GraphScale() { + initComponents(); + } + + public GraphScale(int scale) { + this(); + scaleSpinner.setValue(scale); + } + + /** + * 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() { + + scaleSpinner = new javax.swing.JSpinner(); + helpLbl = new javax.swing.JLabel(); + scaleLbl = new javax.swing.JLabel(); + + scaleSpinner.setModel(new javax.swing.SpinnerNumberModel()); + scaleSpinner.setEditor(new javax.swing.JSpinner.NumberEditor(scaleSpinner, "")); + scaleSpinner.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + scaleSpinnerStateChanged(evt); + } + }); + + helpLbl.setText("Set detail level for graph (larger is finer):"); + + scaleLbl.setText("1 tick = 1 x"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(helpLbl) + .addGroup(layout.createSequentialGroup() + .addComponent(scaleSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(scaleLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(helpLbl) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(scaleSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(scaleLbl)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void scaleSpinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_scaleSpinnerStateChanged + double scale = Graph.getScale((int) scaleSpinner.getValue()); + BigDecimal bd = new BigDecimal(scale); + bd = bd.setScale(6, RoundingMode.HALF_UP); + scaleLbl.setText("1 tick = " + String.valueOf(bd.doubleValue()) + " x"); + }//GEN-LAST:event_scaleSpinnerStateChanged + + /** + * Get the chosen scale. + * + * @return the scale. + */ + public int getScale() { + return (int) scaleSpinner.getValue(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel helpLbl; + private javax.swing.JLabel scaleLbl; + private javax.swing.JSpinner scaleSpinner; + // End of variables declaration//GEN-END:variables +}