Add "real" graph scaling UI
This commit is contained in:
parent
eefdf72a52
commit
008c6e6f25
@ -62,10 +62,14 @@ public class Graph extends javax.swing.JInternalFrame {
|
|||||||
// If a graph is being drawn, set to true, else false
|
// If a graph is being drawn, set to true, else false
|
||||||
boolean graphing = false;
|
boolean graphing = false;
|
||||||
|
|
||||||
|
// Graph scaling data.
|
||||||
private double xtimes = 15;
|
private double xtimes = 15;
|
||||||
private double ytimes = 15;
|
private double ytimes = 15;
|
||||||
private double scale = 1;
|
private double scale = 1;
|
||||||
|
|
||||||
|
// The current value for the zoom/scale, as entered by the user
|
||||||
|
private int scaleLevel = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new form Graph
|
* Creates new form Graph
|
||||||
*/
|
*/
|
||||||
@ -333,21 +337,37 @@ public class Graph extends javax.swing.JInternalFrame {
|
|||||||
dispGraph();
|
dispGraph();
|
||||||
}//GEN-LAST:event_formComponentShown
|
}//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.
|
* Set the zoom level. The larger the int, the more zoomed it is.
|
||||||
*
|
*
|
||||||
* @param zoomLevel Level to zoom. 0 is default (10x10).
|
* @param zoomLevel Level to zoom. 0 is default (10x10).
|
||||||
*/
|
*/
|
||||||
public void setZoom(int zoomLevel) {
|
public void setZoom(int zoomLevel) {
|
||||||
|
scaleLevel = zoomLevel;
|
||||||
if (zoomLevel >= 0) {
|
if (zoomLevel >= 0) {
|
||||||
xtimes = 15.0 * (zoomLevel + 1.0);
|
xtimes = 15.0 * (zoomLevel + 1.0);
|
||||||
ytimes = 15.0 * (zoomLevel + 1.0);
|
ytimes = 15.0 * (zoomLevel + 1.0);
|
||||||
scale = 1.0 / (zoomLevel + 1.0);
|
|
||||||
} else {
|
} else {
|
||||||
xtimes = 15.0 / (abs(zoomLevel) + 1.0);
|
xtimes = 15.0 / (abs(zoomLevel) + 1.0);
|
||||||
ytimes = 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);
|
scaleLbl.setText("Scale: 1 to " + scale);
|
||||||
Debug.println("Scaled to xtimes=" + xtimes + ", ytimes=" + ytimes + ", scale=1to" + scale);
|
Debug.println("Scaled to xtimes=" + xtimes + ", ytimes=" + ytimes + ", scale=1to" + scale);
|
||||||
clearDraw(false);
|
clearDraw(false);
|
||||||
@ -363,7 +383,6 @@ public class Graph extends javax.swing.JInternalFrame {
|
|||||||
new GraphThread(history.split("\n")).start();
|
new GraphThread(history.split("\n")).start();
|
||||||
inBox.setText("");
|
inBox.setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dispGraph() {
|
private void dispGraph() {
|
||||||
@ -413,15 +432,17 @@ public class Graph extends javax.swing.JInternalFrame {
|
|||||||
}//GEN-LAST:event_jMenuItem3ActionPerformed
|
}//GEN-LAST:event_jMenuItem3ActionPerformed
|
||||||
|
|
||||||
private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
|
private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
|
||||||
try {
|
GraphScale gs = new GraphScale(scaleLevel);
|
||||||
int size = Integer.parseInt(JOptionPane.showInternalInputDialog(this,
|
int size = 0;
|
||||||
"Graph scale (negative numbers less detail, positive more detail):",
|
int result = JOptionPane.showInternalConfirmDialog(this,
|
||||||
"Scale",
|
gs,
|
||||||
JOptionPane.QUESTION_MESSAGE));
|
"Graph Scale",
|
||||||
|
JOptionPane.OK_CANCEL_OPTION,
|
||||||
|
JOptionPane.PLAIN_MESSAGE);
|
||||||
|
if (result == JOptionPane.OK_OPTION) {
|
||||||
|
size = gs.getScale();
|
||||||
Debug.println("Scaling to: " + size);
|
Debug.println("Scaling to: " + size);
|
||||||
setZoom(size);
|
setZoom(size);
|
||||||
} catch (Exception ex) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}//GEN-LAST:event_jMenuItem6ActionPerformed
|
}//GEN-LAST:event_jMenuItem6ActionPerformed
|
||||||
|
|
||||||
|
73
src/net/apocalypselabs/symat/GraphScale.form
Normal file
73
src/net/apocalypselabs/symat/GraphScale.form
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
|
<Component id="helpLbl" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="scaleSpinner" min="-2" pref="71" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="scaleLbl" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="helpLbl" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="scaleSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="scaleLbl" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JSpinner" name="scaleSpinner">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
|
||||||
|
<SpinnerModel initial="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="editor" type="javax.swing.JComponent" editor="org.netbeans.modules.form.editors.SpinnerEditorEditor">
|
||||||
|
<SpinnerEditor format="" type="3"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="scaleSpinnerStateChanged"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="helpLbl">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" value="Set detail level for graph (larger is finer):"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="scaleLbl">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" value="1 tick = 1 x"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
124
src/net/apocalypselabs/symat/GraphScale.java
Normal file
124
src/net/apocalypselabs/symat/GraphScale.java
Normal file
@ -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 <product> 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")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user