summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/converterGUI/UnitConverterGUI.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/unitConverter/converterGUI/UnitConverterGUI.java')
-rw-r--r--src/org/unitConverter/converterGUI/UnitConverterGUI.java687
1 files changed, 418 insertions, 269 deletions
diff --git a/src/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
index 986cb52..8c70df4 100644
--- a/src/org/unitConverter/converterGUI/UnitConverterGUI.java
+++ b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
@@ -59,10 +59,13 @@ import org.unitConverter.math.ObjectProduct;
import org.unitConverter.unit.BaseDimension;
import org.unitConverter.unit.BritishImperial;
import org.unitConverter.unit.LinearUnit;
+import org.unitConverter.unit.LinearUnitValue;
+import org.unitConverter.unit.NameSymbol;
import org.unitConverter.unit.SI;
import org.unitConverter.unit.Unit;
import org.unitConverter.unit.UnitDatabase;
import org.unitConverter.unit.UnitPrefix;
+import org.unitConverter.unit.UnitValue;
/**
* @author Adrien Hopkins
@@ -74,20 +77,10 @@ final class UnitConverterGUI {
* A tab in the View.
*/
private enum Pane {
- UNIT_CONVERTER, EXPRESSION_CONVERTER, UNIT_VIEWER, PREFIX_VIEWER, SETTINGS;
+ UNIT_CONVERTER, EXPRESSION_CONVERTER, UNIT_VIEWER, PREFIX_VIEWER,
+ SETTINGS;
}
- /**
- * Different types of rounding.
- *
- * Significant digits: Rounds to a number of digits. i.e. with precision 5, 12345.6789 rounds to 12346.
- * Decimal places: Rounds to a number of digits after the decimal point, i.e. with precision 5, 12345.6789 rounds to 12345.67890.
- * Scientific: Rounds based on the number of digits and operations, following standard scientific rounding.
- */
- private static enum RoundingType {
- SIGNIFICANT_DIGITS, DECIMAL_PLACES, SCIENTIFIC;
- }
-
private static class Presenter {
/**
* Adds default units and dimensions to a database.
@@ -110,40 +103,40 @@ final class UnitConverterGUI {
// nonlinear units - must be loaded manually
database.addUnit("tempCelsius", SI.CELSIUS);
database.addUnit("tempFahrenheit", BritishImperial.FAHRENHEIT);
-
+
// load initial dimensions
database.addDimension("LENGTH", SI.Dimensions.LENGTH);
database.addDimension("MASS", SI.Dimensions.MASS);
database.addDimension("TIME", SI.Dimensions.TIME);
database.addDimension("TEMPERATURE", SI.Dimensions.TEMPERATURE);
}
-
+
/** The presenter's associated view. */
private final View view;
-
+
/** The units known by the program. */
private final UnitDatabase database;
-
+
/** The names of all of the units */
private final List<String> unitNames;
-
+
/** The names of all of the prefixes */
private final List<String> prefixNames;
-
+
/** The names of all of the dimensions */
private final List<String> dimensionNames;
-
+
private final Comparator<String> prefixNameComparator;
-
+
/*
- * Rounding-related settings. I am using my own system, and not MathContext,
- * because MathContext does not support decimal place based or scientific
- * rounding, only significant digit based rounding.
+ * Rounding-related settings. I am using my own system, and not
+ * MathContext, because MathContext does not support decimal place based
+ * or scientific rounding, only significant digit based rounding.
*/
private int precision = 6;
-
+
private RoundingType roundingType = RoundingType.SIGNIFICANT_DIGITS;
-
+
/**
* Creates the presenter.
*
@@ -153,14 +146,14 @@ final class UnitConverterGUI {
*/
Presenter(final View view) {
this.view = view;
-
+
// load initial units
this.database = new UnitDatabase();
Presenter.addDefaults(this.database);
-
+
this.database.loadUnitsFile(new File("unitsfile.txt"));
this.database.loadDimensionFile(new File("dimensionfile.txt"));
-
+
// a comparator that can be used to compare prefix names
// any name that does not exist is less than a name that does.
// otherwise, they are compared by value
@@ -169,37 +162,43 @@ final class UnitConverterGUI {
return -1;
else if (!Presenter.this.database.containsPrefixName(o2))
return 1;
-
+
final UnitPrefix p1 = Presenter.this.database.getPrefix(o1);
final UnitPrefix p2 = Presenter.this.database.getPrefix(o2);
-
+
if (p1.getMultiplier() < p2.getMultiplier())
return -1;
else if (p1.getMultiplier() > p2.getMultiplier())
return 1;
-
+
return o1.compareTo(o2);
};
-
- this.unitNames = new ArrayList<>(this.database.unitMapPrefixless().keySet());
+
+ this.unitNames = new ArrayList<>(
+ this.database.unitMapPrefixless().keySet());
this.unitNames.sort(null); // sorts it using Comparable
-
+
this.prefixNames = new ArrayList<>(this.database.prefixMap().keySet());
- this.prefixNames.sort(this.prefixNameComparator); // sorts it using my comparator
-
- this.dimensionNames = new DelegateListModel<>(new ArrayList<>(this.database.dimensionMap().keySet()));
+ this.prefixNames.sort(this.prefixNameComparator); // sorts it using my
+ // comparator
+
+ this.dimensionNames = new DelegateListModel<>(
+ new ArrayList<>(this.database.dimensionMap().keySet()));
this.dimensionNames.sort(null); // sorts it using Comparable
-
+
// a Predicate that returns true iff the argument is a full base unit
- final Predicate<Unit> isFullBase = unit -> unit instanceof LinearUnit && ((LinearUnit) unit).isBase();
-
+ final Predicate<Unit> isFullBase = unit -> unit instanceof LinearUnit
+ && ((LinearUnit) unit).isBase();
+
// print out unit counts
- System.out.printf("Successfully loaded %d units with %d unit names (%d base units).%n",
+ System.out.printf(
+ "Successfully loaded %d units with %d unit names (%d base units).%n",
new HashSet<>(this.database.unitMapPrefixless().values()).size(),
this.database.unitMapPrefixless().size(),
- new HashSet<>(this.database.unitMapPrefixless().values()).stream().filter(isFullBase).count());
+ new HashSet<>(this.database.unitMapPrefixless().values())
+ .stream().filter(isFullBase).count());
}
-
+
/**
* Converts in the dimension-based converter
*
@@ -209,7 +208,8 @@ final class UnitConverterGUI {
public final void convertDimensionBased() {
final String fromSelection = this.view.getFromSelection();
if (fromSelection == null) {
- this.view.showErrorDialog("Error", "No unit selected in From field");
+ this.view.showErrorDialog("Error",
+ "No unit selected in From field");
return;
}
final String toSelection = this.view.getToSelection();
@@ -217,31 +217,35 @@ final class UnitConverterGUI {
this.view.showErrorDialog("Error", "No unit selected in To field");
return;
}
-
+
final Unit from = this.database.getUnit(fromSelection);
- final Unit to = this.database.getUnit(toSelection);
-
- final double beforeValue;
+ final Unit to = this.database.getUnit(toSelection)
+ .withName(NameSymbol.ofName(toSelection));
+
+ final UnitValue beforeValue;
try {
- beforeValue = this.view.getDimensionConverterInput();
- } catch (ParseException e) {
- this.view.showErrorDialog("Error", "Error in parsing: " + e.getMessage());
+ beforeValue = UnitValue.of(from,
+ this.view.getDimensionConverterInput());
+ } catch (final ParseException e) {
+ this.view.showErrorDialog("Error",
+ "Error in parsing: " + e.getMessage());
return;
}
- final double value = from.convertTo(to, beforeValue);
-
- final String output = this.getRoundedString(new BigDecimal(value));
-
- this.view.setDimensionConverterOutputText(String.format("%s %s = %s %s",
- this.view.getDimensionConverterText(), fromSelection, output, toSelection));
+ final UnitValue value = beforeValue.convertTo(to);
+
+ final String output = this.getRoundedString(value);
+
+ this.view.setDimensionConverterOutputText(
+ String.format("%s = %s", beforeValue, output));
}
-
+
/**
* Runs whenever the convert button is pressed.
*
* <p>
- * Reads and parses a unit expression from the from and to boxes, then converts
- * {@code from} to {@code to}. Any errors are shown in JOptionPanes.
+ * Reads and parses a unit expression from the from and to boxes, then
+ * converts {@code from} to {@code to}. Any errors are shown in
+ * JOptionPanes.
* </p>
*
* @since 2019-01-26
@@ -250,64 +254,78 @@ final class UnitConverterGUI {
public final void convertExpressions() {
final String fromUnitString = this.view.getFromText();
final String toUnitString = this.view.getToText();
-
+
if (fromUnitString.isEmpty()) {
- this.view.showErrorDialog("Parse Error", "Please enter a unit expression in the From: box.");
+ this.view.showErrorDialog("Parse Error",
+ "Please enter a unit expression in the From: box.");
return;
}
if (toUnitString.isEmpty()) {
- this.view.showErrorDialog("Parse Error", "Please enter a unit expression in the To: box.");
+ this.view.showErrorDialog("Parse Error",
+ "Please enter a unit expression in the To: box.");
return;
}
-
- // try to parse from
- final Unit from;
+
+ final LinearUnitValue from;
+ final Unit to;
try {
- from = this.database.getUnitFromExpression(fromUnitString);
+ from = this.database.evaluateUnitExpression(fromUnitString);
} catch (final IllegalArgumentException e) {
- this.view.showErrorDialog("Parse Error", "Could not recognize text in From entry: " + e.getMessage());
+ this.view.showErrorDialog("Parse Error",
+ "Could not recognize text in From entry: " + e.getMessage());
return;
}
-
- final double value;
- // try to parse to
- final Unit to;
try {
- if (this.database.containsUnitName(toUnitString)) {
- // if it's a unit, convert to that
- to = this.database.getUnit(toUnitString);
- } else {
- to = this.database.getUnitFromExpression(toUnitString);
- }
+ to = this.database.getUnitFromExpression(toUnitString);
} catch (final IllegalArgumentException e) {
- this.view.showErrorDialog("Parse Error", "Could not recognize text in To entry: " + e.getMessage());
+ this.view.showErrorDialog("Parse Error",
+ "Could not recognize text in To entry: " + e.getMessage());
return;
}
-
- if (from.canConvertTo(to)) {
- value = from.convertTo(to, 1);
-
- // round value
- final String output = this.getRoundedString(new BigDecimal(value));
-
- this.view.setExpressionConverterOutputText(
- String.format("%s = %s %s", fromUnitString, output, toUnitString));
- } else if (from instanceof LinearUnit && SI.ONE.dividedBy((LinearUnit) from).canConvertTo(to)) {
- // reciprocal conversion (like seconds to hertz)
- value = SI.ONE.dividedBy((LinearUnit) from).convertTo(to, 1);
-
- // round value
- final String output = this.getRoundedString(new BigDecimal(value));
-
+
+ if (to instanceof LinearUnit) {
+ // convert to LinearUnitValue
+ final LinearUnitValue from2;
+ final LinearUnit to2 = (LinearUnit) to;
+ final boolean useSlash;
+
+ if (from.canConvertTo(to2)) {
+ from2 = from;
+ useSlash = false;
+ } else if (LinearUnitValue.ONE.dividedBy(from).canConvertTo(to2)) {
+ from2 = LinearUnitValue.ONE.dividedBy(from);
+ useSlash = true;
+ } else {
+ // if I can't convert, leave
+ this.view.showErrorDialog("Conversion Error",
+ String.format("Cannot convert between %s and %s",
+ fromUnitString, toUnitString));
+ return;
+ }
+
+ final LinearUnitValue converted = from2.convertTo(to2);
this.view.setExpressionConverterOutputText(
- String.format("1 / %s = %s %s", fromUnitString, output, toUnitString));
+ (useSlash ? "1 / " : "") + String.format("%s = %s",
+ fromUnitString, this.getRoundedString(converted)));
+ return;
} else {
- // if I can't convert, leave
- this.view.showErrorDialog("Conversion Error",
- String.format("Cannot convert between %s and %s", fromUnitString, toUnitString));
+ // convert to UnitValue
+ final UnitValue from2 = from.asUnitValue();
+ if (from2.canConvertTo(to)) {
+ final UnitValue converted = from2.convertTo(to);
+
+ this.view
+ .setExpressionConverterOutputText(String.format("%s = %s",
+ fromUnitString, this.getRoundedString(converted)));
+ } else {
+ // if I can't convert, leave
+ this.view.showErrorDialog("Conversion Error",
+ String.format("Cannot convert between %s and %s",
+ fromUnitString, toUnitString));
+ }
}
}
-
+
/**
* @return a list of all of the unit dimensions
* @since 2019-04-13
@@ -316,7 +334,7 @@ final class UnitConverterGUI {
public final List<String> dimensionNameList() {
return this.dimensionNames;
}
-
+
/**
* @return a comparator to compare prefix names
* @since 2019-04-14
@@ -325,20 +343,21 @@ final class UnitConverterGUI {
public final Comparator<String> getPrefixNameComparator() {
return this.prefixNameComparator;
}
-
+
/**
* @param value value to round
- * @return string of that value rounded to {@code significantDigits} significant
- * digits.
+ * @return string of that value rounded to {@code significantDigits}
+ * significant digits.
* @since 2019-04-14
* @since v0.2.0
*/
private final String getRoundedString(final BigDecimal value) {
// round value based on rounding type
final BigDecimal roundedValue;
- switch (roundingType) {
+ switch (this.roundingType) {
case DECIMAL_PLACES:
- roundedValue = value.setScale(precision, RoundingMode.HALF_EVEN);
+ roundedValue = value.setScale(this.precision,
+ RoundingMode.HALF_EVEN);
break;
case SCIENTIFIC:
throw new UnsupportedOperationException("Not yet implemented.");
@@ -350,7 +369,7 @@ final class UnitConverterGUI {
}
String output = roundedValue.toString();
-
+
// remove trailing zeroes
if (output.contains(".")) {
while (output.endsWith("0")) {
@@ -360,10 +379,68 @@ final class UnitConverterGUI {
output = output.substring(0, output.length() - 1);
}
}
-
+
return output;
}
-
+
+ /**
+ * Like {@link LinearUnitValue#toString(boolean)} with parameter
+ * {@code false}, but obeys this unit converter's rounding settings.
+ *
+ * @since 2020-08-04
+ */
+ private final String getRoundedString(final LinearUnitValue value) {
+ switch (this.roundingType) {
+ case DECIMAL_PLACES:
+ case SIGNIFICANT_DIGITS:
+ return this.getRoundedString(value.asUnitValue());
+ case SCIENTIFIC:
+ return value.toString(false);
+ default:
+ throw new AssertionError("Invalid switch condition.");
+ }
+ }
+
+ /**
+ * Like {@link UnitValue#toString()}, but obeys this unit converter's
+ * rounding settings.
+ *
+ * @since 2020-08-04
+ */
+ private final String getRoundedString(final UnitValue value) {
+ final BigDecimal unrounded = new BigDecimal(value.getValue());
+ final BigDecimal rounded;
+ int precision = this.precision;
+ switch (this.roundingType) {
+ case DECIMAL_PLACES:
+ rounded = unrounded.setScale(precision, RoundingMode.HALF_EVEN);
+ break;
+ case SCIENTIFIC:
+ precision = 12;
+ //$FALL-THROUGH$
+ case SIGNIFICANT_DIGITS:
+ rounded = unrounded
+ .round(new MathContext(precision, RoundingMode.HALF_EVEN));
+ break;
+ default:
+ throw new AssertionError("Invalid switch condition.");
+ }
+
+ String output = rounded.toString();
+
+ // remove trailing zeroes
+ if (output.contains(".")) {
+ while (output.endsWith("0")) {
+ output = output.substring(0, output.length() - 1);
+ }
+ if (output.endsWith(".")) {
+ output = output.substring(0, output.length() - 1);
+ }
+ }
+
+ return output + " " + value.getUnit().getPrimaryName().get();
+ }
+
/**
* @return a set of all prefix names in the database
* @since 2019-04-14
@@ -372,7 +449,7 @@ final class UnitConverterGUI {
public final Set<String> prefixNameSet() {
return this.database.prefixMap().keySet();
}
-
+
/**
* Runs whenever a prefix is selected in the viewer.
* <p>
@@ -388,11 +465,12 @@ final class UnitConverterGUI {
return;
else {
final UnitPrefix prefix = this.database.getPrefix(prefixName);
-
- this.view.setPrefixTextBoxText(String.format("%s%nMultiplier: %s", prefixName, prefix.getMultiplier()));
+
+ this.view.setPrefixTextBoxText(String.format("%s%nMultiplier: %s",
+ prefixName, prefix.getMultiplier()));
}
}
-
+
/**
* @param precision new value of precision
* @since 2019-01-15
@@ -401,10 +479,18 @@ final class UnitConverterGUI {
public final void setPrecision(final int precision) {
this.precision = precision;
}
-
+
+ /**
+ * @param roundingType the roundingType to set
+ * @since 2020-07-16
+ */
+ public final void setRoundingType(RoundingType roundingType) {
+ this.roundingType = roundingType;
+ }
+
/**
- * Returns true if and only if the unit represented by {@code unitName} has the
- * dimension represented by {@code dimensionName}.
+ * Returns true if and only if the unit represented by {@code unitName}
+ * has the dimension represented by {@code dimensionName}.
*
* @param unitName name of unit to test
* @param dimensionName name of dimension to test
@@ -412,12 +498,14 @@ final class UnitConverterGUI {
* @since 2019-04-13
* @since v0.2.0
*/
- public final boolean unitMatchesDimension(final String unitName, final String dimensionName) {
+ public final boolean unitMatchesDimension(final String unitName,
+ final String dimensionName) {
final Unit unit = this.database.getUnit(unitName);
- final ObjectProduct<BaseDimension> dimension = this.database.getDimension(dimensionName);
+ final ObjectProduct<BaseDimension> dimension = this.database
+ .getDimension(dimensionName);
return unit.getDimension().equals(dimension);
}
-
+
/**
* Runs whenever a unit is selected in the viewer.
* <p>
@@ -433,11 +521,11 @@ final class UnitConverterGUI {
return;
else {
final Unit unit = this.database.getUnit(unitName);
-
+
this.view.setUnitTextBoxText(unit.toString());
}
}
-
+
/**
* @return a set of all of the unit names
* @since 2019-04-14
@@ -446,16 +534,21 @@ final class UnitConverterGUI {
public final Set<String> unitNameSet() {
return this.database.unitMapPrefixless().keySet();
}
-
- /**
- * @param roundingType the roundingType to set
- * @since 2020-07-16
- */
- public final void setRoundingType(RoundingType roundingType) {
- this.roundingType = roundingType;
- }
}
-
+
+ /**
+ * Different types of rounding.
+ *
+ * Significant digits: Rounds to a number of digits. i.e. with precision 5,
+ * 12345.6789 rounds to 12346. Decimal places: Rounds to a number of digits
+ * after the decimal point, i.e. with precision 5, 12345.6789 rounds to
+ * 12345.67890. Scientific: Rounds based on the number of digits and
+ * operations, following standard scientific rounding.
+ */
+ private static enum RoundingType {
+ SIGNIFICANT_DIGITS, DECIMAL_PLACES, SCIENTIFIC;
+ }
+
private static class View {
private static final NumberFormat NUMBER_FORMATTER = new DecimalFormat();
@@ -465,7 +558,7 @@ final class UnitConverterGUI {
private final Presenter presenter;
/** The master pane containing all of the tabs. */
private final JTabbedPane masterPane;
-
+
// DIMENSION-BASED CONVERTER
/** The panel for inputting values in the dimension-based converter */
private final JTextField valueInput;
@@ -475,7 +568,7 @@ final class UnitConverterGUI {
private final SearchBoxList toSearch;
/** The output area in the dimension-based converter */
private final JTextArea dimensionBasedOutput;
-
+
// EXPRESSION-BASED CONVERTER
/** The "From" entry in the conversion panel */
private final JTextField fromEntry;
@@ -483,7 +576,7 @@ final class UnitConverterGUI {
private final JTextField toEntry;
/** The output area in the conversion panel */
private final JTextArea output;
-
+
// UNIT AND PREFIX VIEWERS
/** The searchable list of unit names in the unit viewer */
private final SearchBoxList unitNameList;
@@ -493,7 +586,7 @@ final class UnitConverterGUI {
private final JTextArea unitTextBox;
/** The text box for prefix data in the prefix viewer */
private final JTextArea prefixTextBox;
-
+
/**
* Creates the {@code View}.
*
@@ -505,7 +598,7 @@ final class UnitConverterGUI {
this.frame = new JFrame("Unit Converter");
this.frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.masterPane = new JTabbedPane();
-
+
// create the components
this.unitNameList = new SearchBoxList(this.presenter.unitNameSet());
this.prefixNameList = new SearchBoxList(this.presenter.prefixNameSet(),
@@ -519,13 +612,13 @@ final class UnitConverterGUI {
this.fromEntry = new JTextField();
this.toEntry = new JTextField();
this.output = new JTextArea(2, 32);
-
+
// create more components
this.initComponents();
-
+
this.frame.pack();
}
-
+
/**
* @return the currently selected pane.
* @throws AssertionError if no pane (or an invalid pane) is selected
@@ -546,19 +639,20 @@ final class UnitConverterGUI {
throw new AssertionError("No selected pane, or invalid pane.");
}
}
-
+
/**
* @return value in dimension-based converter
- * @throws ParseException
+ * @throws ParseException
* @since 2020-07-07
*/
public double getDimensionConverterInput() throws ParseException {
- Number value = NUMBER_FORMATTER.parse(this.valueInput.getText());
- if (value instanceof Double) {
+ final Number value = NUMBER_FORMATTER.parse(this.valueInput.getText());
+ if (value instanceof Double)
return (double) value;
- } else if (value instanceof Long) {
- return (((Long) value).longValue());
- } else throw new AssertionError();
+ else if (value instanceof Long)
+ return ((Long) value).longValue();
+ else
+ throw new AssertionError();
}
/**
@@ -569,7 +663,7 @@ final class UnitConverterGUI {
public String getDimensionConverterText() {
return this.valueInput.getText();
}
-
+
/**
* @return selection in "From" selector in dimension-based converter
* @since 2019-04-13
@@ -578,7 +672,7 @@ final class UnitConverterGUI {
public String getFromSelection() {
return this.fromSearch.getSelectedValue();
}
-
+
/**
* @return text in "From" box in converter panel
* @since 2019-01-15
@@ -587,7 +681,7 @@ final class UnitConverterGUI {
public String getFromText() {
return this.fromEntry.getText();
}
-
+
/**
* @return index of selected prefix in prefix viewer
* @since 2019-01-15
@@ -596,7 +690,7 @@ final class UnitConverterGUI {
public String getPrefixViewerSelection() {
return this.prefixNameList.getSelectedValue();
}
-
+
/**
* @return selection in "To" selector in dimension-based converter
* @since 2019-04-13
@@ -605,7 +699,7 @@ final class UnitConverterGUI {
public String getToSelection() {
return this.toSearch.getSelectedValue();
}
-
+
/**
* @return text in "To" box in converter panel
* @since 2019-01-26
@@ -614,7 +708,7 @@ final class UnitConverterGUI {
public String getToText() {
return this.toEntry.getText();
}
-
+
/**
* @return index of selected unit in unit viewer
* @since 2019-01-15
@@ -623,7 +717,7 @@ final class UnitConverterGUI {
public String getUnitViewerSelection() {
return this.unitNameList.getSelectedValue();
}
-
+
/**
* Starts up the application.
*
@@ -633,7 +727,7 @@ final class UnitConverterGUI {
public final void init() {
this.frame.setVisible(true);
}
-
+
/**
* Initializes the view's components.
*
@@ -643,199 +737,213 @@ final class UnitConverterGUI {
private final void initComponents() {
final JPanel masterPanel = new JPanel();
this.frame.add(masterPanel);
-
+
masterPanel.setLayout(new BorderLayout());
-
+
{ // pane with all of the tabs
masterPanel.add(this.masterPane, BorderLayout.CENTER);
-
+
{ // a panel for unit conversion using a selector
final JPanel convertUnitPanel = new JPanel();
this.masterPane.addTab("Convert Units", convertUnitPanel);
this.masterPane.setMnemonicAt(0, KeyEvent.VK_U);
-
+
convertUnitPanel.setLayout(new BorderLayout());
-
+
{ // panel for input part
final JPanel inputPanel = new JPanel();
convertUnitPanel.add(inputPanel, BorderLayout.CENTER);
-
+
inputPanel.setLayout(new GridLayout(1, 3));
-
+
final JComboBox<String> dimensionSelector = new JComboBox<>(
- this.presenter.dimensionNameList().toArray(new String[0]));
+ this.presenter.dimensionNameList()
+ .toArray(new String[0]));
dimensionSelector.setSelectedItem("LENGTH");
-
+
// handle dimension filter
- final MutablePredicate<String> dimensionFilter = new MutablePredicate<>(s -> true);
-
+ final MutablePredicate<String> dimensionFilter = new MutablePredicate<>(
+ s -> true);
+
// panel for From things
inputPanel.add(this.fromSearch);
-
+
this.fromSearch.addSearchFilter(dimensionFilter);
-
- { // for dimension selector and arrow that represents conversion
+
+ { // for dimension selector and arrow that represents
+ // conversion
final JPanel inBetweenPanel = new JPanel();
inputPanel.add(inBetweenPanel);
-
+
inBetweenPanel.setLayout(new BorderLayout());
-
+
{ // dimension selector
- inBetweenPanel.add(dimensionSelector, BorderLayout.PAGE_START);
+ inBetweenPanel.add(dimensionSelector,
+ BorderLayout.PAGE_START);
}
-
+
{ // the arrow in the middle
final JLabel arrowLabel = new JLabel("->");
inBetweenPanel.add(arrowLabel, BorderLayout.CENTER);
}
}
-
+
// panel for To things
-
+
inputPanel.add(this.toSearch);
-
+
this.toSearch.addSearchFilter(dimensionFilter);
-
+
// code for dimension filter
dimensionSelector.addItemListener(e -> {
- dimensionFilter.setPredicate(string -> View.this.presenter.unitMatchesDimension(string,
- (String) dimensionSelector.getSelectedItem()));
+ dimensionFilter.setPredicate(string -> View.this.presenter
+ .unitMatchesDimension(string,
+ (String) dimensionSelector.getSelectedItem()));
this.fromSearch.reapplyFilter();
this.toSearch.reapplyFilter();
});
-
- // apply the item listener once because I have a default selection
- dimensionFilter.setPredicate(string -> View.this.presenter.unitMatchesDimension(string,
- (String) dimensionSelector.getSelectedItem()));
+
+ // apply the item listener once because I have a default
+ // selection
+ dimensionFilter.setPredicate(string -> View.this.presenter
+ .unitMatchesDimension(string,
+ (String) dimensionSelector.getSelectedItem()));
this.fromSearch.reapplyFilter();
this.toSearch.reapplyFilter();
}
-
+
{ // panel for submit and output, and also value entry
final JPanel outputPanel = new JPanel();
convertUnitPanel.add(outputPanel, BorderLayout.PAGE_END);
-
+
outputPanel.setLayout(new GridLayout(3, 1));
-
+
{ // unit input
final JPanel valueInputPanel = new JPanel();
outputPanel.add(valueInputPanel);
-
+
valueInputPanel.setLayout(new BorderLayout());
-
+
{ // prompt
- final JLabel valuePrompt = new JLabel("Value to convert: ");
- valueInputPanel.add(valuePrompt, BorderLayout.LINE_START);
+ final JLabel valuePrompt = new JLabel(
+ "Value to convert: ");
+ valueInputPanel.add(valuePrompt,
+ BorderLayout.LINE_START);
}
-
+
{ // value to convert
- valueInputPanel.add(this.valueInput, BorderLayout.CENTER);
+ valueInputPanel.add(this.valueInput,
+ BorderLayout.CENTER);
}
}
-
+
{ // button to convert
final JButton convertButton = new JButton("Convert");
outputPanel.add(convertButton);
-
- convertButton.addActionListener(e -> this.presenter.convertDimensionBased());
+
+ convertButton.addActionListener(
+ e -> this.presenter.convertDimensionBased());
convertButton.setMnemonic(KeyEvent.VK_ENTER);
}
-
+
{ // output of conversion
outputPanel.add(this.dimensionBasedOutput);
this.dimensionBasedOutput.setEditable(false);
}
}
}
-
+
{ // panel for unit conversion using expressions
final JPanel convertExpressionPanel = new JPanel();
- this.masterPane.addTab("Convert Unit Expressions", convertExpressionPanel);
+ this.masterPane.addTab("Convert Unit Expressions",
+ convertExpressionPanel);
this.masterPane.setMnemonicAt(1, KeyEvent.VK_E);
-
+
convertExpressionPanel.setLayout(new GridLayout(4, 1));
-
+
{ // panel for units to convert from
final JPanel fromPanel = new JPanel();
convertExpressionPanel.add(fromPanel);
-
+
fromPanel.setBorder(BorderFactory.createTitledBorder("From"));
fromPanel.setLayout(new GridLayout(1, 1));
-
+
{ // entry for units
fromPanel.add(this.fromEntry);
}
}
-
+
{ // panel for units to convert to
final JPanel toPanel = new JPanel();
convertExpressionPanel.add(toPanel);
-
+
toPanel.setBorder(BorderFactory.createTitledBorder("To"));
toPanel.setLayout(new GridLayout(1, 1));
-
+
{ // entry for units
toPanel.add(this.toEntry);
}
}
-
+
{ // button to convert
final JButton convertButton = new JButton("Convert");
convertExpressionPanel.add(convertButton);
-
- convertButton.addActionListener(e -> this.presenter.convertExpressions());
+
+ convertButton.addActionListener(
+ e -> this.presenter.convertExpressions());
convertButton.setMnemonic(KeyEvent.VK_ENTER);
}
-
+
{ // output of conversion
final JPanel outputPanel = new JPanel();
convertExpressionPanel.add(outputPanel);
-
- outputPanel.setBorder(BorderFactory.createTitledBorder("Output"));
+
+ outputPanel
+ .setBorder(BorderFactory.createTitledBorder("Output"));
outputPanel.setLayout(new GridLayout(1, 1));
-
+
{ // output
outputPanel.add(this.output);
this.output.setEditable(false);
}
}
}
-
+
{ // panel to look up units
final JPanel unitLookupPanel = new JPanel();
this.masterPane.addTab("Unit Viewer", unitLookupPanel);
this.masterPane.setMnemonicAt(2, KeyEvent.VK_V);
-
+
unitLookupPanel.setLayout(new GridLayout());
-
+
{ // search panel
unitLookupPanel.add(this.unitNameList);
-
- this.unitNameList.getSearchList()
- .addListSelectionListener(e -> this.presenter.unitNameSelected());
+
+ this.unitNameList.getSearchList().addListSelectionListener(
+ e -> this.presenter.unitNameSelected());
}
-
+
{ // the text box for unit's toString
unitLookupPanel.add(this.unitTextBox);
this.unitTextBox.setEditable(false);
this.unitTextBox.setLineWrap(true);
}
}
-
+
{ // panel to look up prefixes
final JPanel prefixLookupPanel = new JPanel();
this.masterPane.addTab("Prefix Viewer", prefixLookupPanel);
this.masterPane.setMnemonicAt(3, KeyEvent.VK_P);
-
+
prefixLookupPanel.setLayout(new GridLayout(1, 2));
-
+
{ // panel for listing and seaching
prefixLookupPanel.add(this.prefixNameList);
-
- this.prefixNameList.getSearchList()
- .addListSelectionListener(e -> this.presenter.prefixSelected());
+
+ this.prefixNameList.getSearchList().addListSelectionListener(
+ e -> this.presenter.prefixSelected());
}
-
+
{ // the text box for prefix's toString
prefixLookupPanel.add(this.prefixTextBox);
this.prefixTextBox.setEditable(false);
@@ -848,77 +956,104 @@ final class UnitConverterGUI {
this.masterPane.addTab("\u2699", new JScrollPane(settingsPanel));
this.masterPane.setMnemonicAt(4, KeyEvent.VK_S);
- settingsPanel.setLayout(new BoxLayout(settingsPanel, BoxLayout.PAGE_AXIS));
+ settingsPanel.setLayout(
+ new BoxLayout(settingsPanel, BoxLayout.PAGE_AXIS));
{ // rounding settings
final JPanel roundingPanel = new JPanel();
settingsPanel.add(roundingPanel);
- roundingPanel.setBorder(new TitledBorder("Rounding Settings"));
+ roundingPanel
+ .setBorder(new TitledBorder("Rounding Settings"));
roundingPanel.setLayout(new GridBagLayout());
// rounding rule selection
final ButtonGroup roundingRuleButtons = new ButtonGroup();
final JLabel roundingRuleLabel = new JLabel("Rounding Rule:");
- roundingPanel.add(roundingRuleLabel, new GridBagBuilder(0, 0).setAnchor(GridBagConstraints.LINE_START).build());
+ roundingPanel.add(roundingRuleLabel, new GridBagBuilder(0, 0)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton fixedPrecision = new JRadioButton("Fixed Precision");
+ final JRadioButton fixedPrecision = new JRadioButton(
+ "Fixed Precision");
fixedPrecision.setSelected(true);
- fixedPrecision.addActionListener(e -> this.presenter.setRoundingType(RoundingType.SIGNIFICANT_DIGITS));
+ fixedPrecision.addActionListener(e -> this.presenter
+ .setRoundingType(RoundingType.SIGNIFICANT_DIGITS));
roundingRuleButtons.add(fixedPrecision);
- roundingPanel.add(fixedPrecision, new GridBagBuilder(0, 1).setAnchor(GridBagConstraints.LINE_START).build());
+ roundingPanel.add(fixedPrecision, new GridBagBuilder(0, 1)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton fixedDecimals = new JRadioButton("Fixed Decimal Places");
- fixedDecimals.addActionListener(e -> this.presenter.setRoundingType(RoundingType.DECIMAL_PLACES));
+ final JRadioButton fixedDecimals = new JRadioButton(
+ "Fixed Decimal Places");
+ fixedDecimals.addActionListener(e -> this.presenter
+ .setRoundingType(RoundingType.DECIMAL_PLACES));
roundingRuleButtons.add(fixedDecimals);
- roundingPanel.add(fixedDecimals, new GridBagBuilder(0, 2).setAnchor(GridBagConstraints.LINE_START).build());
+ roundingPanel.add(fixedDecimals, new GridBagBuilder(0, 2)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton relativePrecision = new JRadioButton("Scientific Precision");
+ final JRadioButton relativePrecision = new JRadioButton(
+ "Scientific Precision");
relativePrecision.setEnabled(false);
- relativePrecision.addActionListener(e -> this.presenter.setRoundingType(RoundingType.SCIENTIFIC));
+ relativePrecision.addActionListener(e -> this.presenter
+ .setRoundingType(RoundingType.SCIENTIFIC));
roundingRuleButtons.add(relativePrecision);
- roundingPanel.add(relativePrecision, new GridBagBuilder(0, 3).setAnchor(GridBagConstraints.LINE_START).build());
+ roundingPanel.add(relativePrecision, new GridBagBuilder(0, 3)
+ .setAnchor(GridBagConstraints.LINE_START).build());
final JLabel sliderLabel = new JLabel("Precision:");
- roundingPanel.add(sliderLabel, new GridBagBuilder(0, 4).setAnchor(GridBagConstraints.LINE_START).build());
+ roundingPanel.add(sliderLabel, new GridBagBuilder(0, 4)
+ .setAnchor(GridBagConstraints.LINE_START).build());
final JSlider sigDigSlider = new JSlider(0, 12);
- roundingPanel.add(sigDigSlider, new GridBagBuilder(0, 5).setAnchor(GridBagConstraints.LINE_START).build());
-
+ roundingPanel.add(sigDigSlider, new GridBagBuilder(0, 5)
+ .setAnchor(GridBagConstraints.LINE_START).build());
+
sigDigSlider.setMajorTickSpacing(4);
sigDigSlider.setMinorTickSpacing(1);
sigDigSlider.setSnapToTicks(true);
sigDigSlider.setPaintTicks(true);
sigDigSlider.setPaintLabels(true);
-
- sigDigSlider.addChangeListener(
- e -> this.presenter.setPrecision(sigDigSlider.getValue()));
+
+ sigDigSlider.addChangeListener(e -> this.presenter
+ .setPrecision(sigDigSlider.getValue()));
}
{ // prefix repetition settings
final JPanel prefixRepetitionPanel = new JPanel();
settingsPanel.add(prefixRepetitionPanel);
- prefixRepetitionPanel.setBorder(new TitledBorder("Prefix Repetition Settings"));
+ prefixRepetitionPanel.setBorder(
+ new TitledBorder("Prefix Repetition Settings"));
prefixRepetitionPanel.setLayout(new GridBagLayout());
// prefix rules
final ButtonGroup prefixRuleButtons = new ButtonGroup();
- final JRadioButton noRepetition = new JRadioButton("No Repetition");
+ final JRadioButton noRepetition = new JRadioButton(
+ "No Repetition");
noRepetition.setEnabled(false);
prefixRuleButtons.add(noRepetition);
- prefixRepetitionPanel.add(noRepetition, new GridBagBuilder(0, 0).setAnchor(GridBagConstraints.LINE_START).build());
+ prefixRepetitionPanel.add(noRepetition,
+ new GridBagBuilder(0, 0)
+ .setAnchor(GridBagConstraints.LINE_START)
+ .build());
- final JRadioButton noRestriction = new JRadioButton("No Restriction");
+ final JRadioButton noRestriction = new JRadioButton(
+ "No Restriction");
noRestriction.setSelected(true);
noRestriction.setEnabled(false);
prefixRuleButtons.add(noRestriction);
- prefixRepetitionPanel.add(noRestriction, new GridBagBuilder(0, 1).setAnchor(GridBagConstraints.LINE_START).build());
+ prefixRepetitionPanel.add(noRestriction,
+ new GridBagBuilder(0, 1)
+ .setAnchor(GridBagConstraints.LINE_START)
+ .build());
- final JRadioButton customRepetition = new JRadioButton("Custom Repetition Rule");
+ final JRadioButton customRepetition = new JRadioButton(
+ "Custom Repetition Rule");
customRepetition.setEnabled(false);
prefixRuleButtons.add(customRepetition);
- prefixRepetitionPanel.add(customRepetition, new GridBagBuilder(0, 2).setAnchor(GridBagConstraints.LINE_START).build());
+ prefixRepetitionPanel.add(customRepetition,
+ new GridBagBuilder(0, 2)
+ .setAnchor(GridBagConstraints.LINE_START)
+ .build());
}
{ // search settings
@@ -930,46 +1065,59 @@ final class UnitConverterGUI {
// searching rules
final ButtonGroup searchRuleButtons = new ButtonGroup();
- final JRadioButton noPrefixes = new JRadioButton("Never Include Prefixed Units");
+ final JRadioButton noPrefixes = new JRadioButton(
+ "Never Include Prefixed Units");
noPrefixes.setEnabled(false);
searchRuleButtons.add(noPrefixes);
- searchingPanel.add(noPrefixes, new GridBagBuilder(0, 0).setAnchor(GridBagConstraints.LINE_START).build());
+ searchingPanel.add(noPrefixes, new GridBagBuilder(0, 0)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton fixedPrefixes = new JRadioButton("Include Some Prefixes");
+ final JRadioButton fixedPrefixes = new JRadioButton(
+ "Include Some Prefixes");
fixedPrefixes.setEnabled(false);
searchRuleButtons.add(fixedPrefixes);
- searchingPanel.add(fixedPrefixes, new GridBagBuilder(0, 1).setAnchor(GridBagConstraints.LINE_START).build());
+ searchingPanel.add(fixedPrefixes, new GridBagBuilder(0, 1)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton explicitPrefixes = new JRadioButton("Include Explicit Prefixes");
+ final JRadioButton explicitPrefixes = new JRadioButton(
+ "Include Explicit Prefixes");
explicitPrefixes.setEnabled(false);
searchRuleButtons.add(explicitPrefixes);
- searchingPanel.add(explicitPrefixes, new GridBagBuilder(0, 2).setAnchor(GridBagConstraints.LINE_START).build());
+ searchingPanel.add(explicitPrefixes, new GridBagBuilder(0, 2)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JRadioButton alwaysInclude = new JRadioButton("Include All Single Prefixes");
+ final JRadioButton alwaysInclude = new JRadioButton(
+ "Include All Single Prefixes");
alwaysInclude.setEnabled(false);
searchRuleButtons.add(alwaysInclude);
- searchingPanel.add(alwaysInclude, new GridBagBuilder(0, 3).setAnchor(GridBagConstraints.LINE_START).build());
+ searchingPanel.add(alwaysInclude, new GridBagBuilder(0, 3)
+ .setAnchor(GridBagConstraints.LINE_START).build());
}
{ // miscellaneous settings
final JPanel miscPanel = new JPanel();
settingsPanel.add(miscPanel);
- miscPanel.setBorder(new TitledBorder("Miscellaneous Settings"));
+ miscPanel
+ .setBorder(new TitledBorder("Miscellaneous Settings"));
miscPanel.setLayout(new GridBagLayout());
- final JCheckBox showAllVariations = new JCheckBox("Show Symbols in \"Convert Units\"");
+ final JCheckBox showAllVariations = new JCheckBox(
+ "Show Symbols in \"Convert Units\"");
showAllVariations.setSelected(true);
showAllVariations.setEnabled(false);
- miscPanel.add(showAllVariations, new GridBagBuilder(0, 0).setAnchor(GridBagConstraints.LINE_START).build());
+ miscPanel.add(showAllVariations, new GridBagBuilder(0, 0)
+ .setAnchor(GridBagConstraints.LINE_START).build());
- final JButton unitFileButton = new JButton("Manage Unit Data Files");
+ final JButton unitFileButton = new JButton(
+ "Manage Unit Data Files");
unitFileButton.setEnabled(false);
- miscPanel.add(unitFileButton, new GridBagBuilder(0, 1).setAnchor(GridBagConstraints.LINE_START).build());
+ miscPanel.add(unitFileButton, new GridBagBuilder(0, 1)
+ .setAnchor(GridBagConstraints.LINE_START).build());
}
}
}
}
-
+
/**
* Sets the text in the output of the dimension-based converter.
*
@@ -980,7 +1128,7 @@ final class UnitConverterGUI {
public void setDimensionConverterOutputText(final String text) {
this.dimensionBasedOutput.setText(text);
}
-
+
/**
* Sets the text in the output of the conversion panel.
*
@@ -991,7 +1139,7 @@ final class UnitConverterGUI {
public void setExpressionConverterOutputText(final String text) {
this.output.setText(text);
}
-
+
/**
* Sets the text of the prefix text box in the prefix viewer.
*
@@ -1002,7 +1150,7 @@ final class UnitConverterGUI {
public void setPrefixTextBoxText(final String text) {
this.prefixTextBox.setText(text);
}
-
+
/**
* Sets the text of the unit text box in the unit viewer.
*
@@ -1013,7 +1161,7 @@ final class UnitConverterGUI {
public void setUnitTextBoxText(final String text) {
this.unitTextBox.setText(text);
}
-
+
/**
* Shows an error dialog.
*
@@ -1023,10 +1171,11 @@ final class UnitConverterGUI {
* @since v0.1.0
*/
public void showErrorDialog(final String title, final String message) {
- JOptionPane.showMessageDialog(this.frame, message, title, JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(this.frame, message, title,
+ JOptionPane.ERROR_MESSAGE);
}
}
-
+
public static void main(final String[] args) {
new View().init();
}