summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2022-02-26 09:53:24 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2022-02-26 09:53:24 -0500
commit07c86e02be29aa3d3d878adce62c5c0a9a458e47 (patch)
treef7b13c71beed93f3af0919a2c835414252bf30c7 /src/main/java
parentb7eee33a5b162b4057d04d28f45738e3048bf01d (diff)
Implemented unit conversion, with a few problems
TabbedView now displays its units, but with their toString method which shows their definition in addition to their name
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java2
-rw-r--r--src/main/java/sevenUnits/unit/BaseDimension.java50
-rw-r--r--src/main/java/sevenUnits/unit/BaseUnit.java2
-rw-r--r--src/main/java/sevenUnits/unit/BritishImperial.java2
-rw-r--r--src/main/java/sevenUnits/unit/FunctionalUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/FunctionalUnitlike.java1
-rw-r--r--src/main/java/sevenUnits/unit/LinearUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/Metric.java1
-rw-r--r--src/main/java/sevenUnits/unit/MultiUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/Unit.java2
-rw-r--r--src/main/java/sevenUnits/unit/UnitDatabase.java23
-rw-r--r--src/main/java/sevenUnits/unit/UnitPrefix.java1
-rw-r--r--src/main/java/sevenUnits/unit/UnitValue.java2
-rw-r--r--src/main/java/sevenUnits/unit/Unitlike.java2
-rw-r--r--src/main/java/sevenUnits/unit/UnitlikeValue.java2
-rw-r--r--src/main/java/sevenUnits/utils/NameSymbol.java (renamed from src/main/java/sevenUnits/unit/NameSymbol.java)21
-rw-r--r--src/main/java/sevenUnits/utils/Nameable.java (renamed from src/main/java/sevenUnits/unit/Nameable.java)2
-rw-r--r--src/main/java/sevenUnits/utils/NamedObjectProduct.java7
-rw-r--r--src/main/java/sevenUnits/utils/ObjectProduct.java6
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java202
-rw-r--r--src/main/java/sevenUnitsGUI/TabbedView.java14
-rw-r--r--src/main/java/sevenUnitsGUI/UnitConversionView.java3
-rw-r--r--src/main/java/sevenUnitsGUI/ViewBot.java7
23 files changed, 288 insertions, 67 deletions
diff --git a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
index 9c6ae0a..55e1546 100644
--- a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
+++ b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
@@ -70,12 +70,12 @@ import sevenUnits.unit.BritishImperial;
import sevenUnits.unit.LinearUnit;
import sevenUnits.unit.LinearUnitValue;
import sevenUnits.unit.Metric;
-import sevenUnits.unit.NameSymbol;
import sevenUnits.unit.Unit;
import sevenUnits.unit.UnitDatabase;
import sevenUnits.unit.UnitPrefix;
import sevenUnits.unit.UnitValue;
import sevenUnits.utils.ConditionalExistenceCollections;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/BaseDimension.java b/src/main/java/sevenUnits/unit/BaseDimension.java
index d5e98ca..bcd57d9 100644
--- a/src/main/java/sevenUnits/unit/BaseDimension.java
+++ b/src/main/java/sevenUnits/unit/BaseDimension.java
@@ -18,70 +18,58 @@ package sevenUnits.unit;
import java.util.Objects;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
+
/**
* A dimension that defines a {@code BaseUnit}
*
* @author Adrien Hopkins
* @since 2019-10-16
*/
-public final class BaseDimension {
+public final class BaseDimension implements Nameable {
/**
* Gets a {@code BaseDimension} with the provided name and symbol.
*
- * @param name
- * name of dimension
- * @param symbol
- * symbol used for dimension
+ * @param name name of dimension
+ * @param symbol symbol used for dimension
* @return dimension
* @since 2019-10-16
*/
public static BaseDimension valueOf(final String name, final String symbol) {
return new BaseDimension(name, symbol);
}
-
+
/**
* The name of the dimension.
*/
private final String name;
/**
- * The symbol used by the dimension. Symbols should be short, generally one or two characters.
+ * The symbol used by the dimension. Symbols should be short, generally one
+ * or two characters.
*/
private final String symbol;
-
+
/**
* Creates the {@code BaseDimension}.
*
- * @param name
- * name of unit
- * @param symbol
- * symbol of unit
- * @throws NullPointerException
- * if any argument is null
+ * @param name name of unit
+ * @param symbol symbol of unit
+ * @throws NullPointerException if any argument is null
* @since 2019-10-16
*/
private BaseDimension(final String name, final String symbol) {
this.name = Objects.requireNonNull(name, "name must not be null.");
this.symbol = Objects.requireNonNull(symbol, "symbol must not be null.");
}
-
- /**
- * @return name
- * @since 2019-10-16
- */
- public final String getName() {
- return this.name;
- }
-
- /**
- * @return symbol
- * @since 2019-10-16
- */
- public final String getSymbol() {
- return this.symbol;
+
+ @Override
+ public NameSymbol getNameSymbol() {
+ return NameSymbol.of(this.name, this.symbol);
}
-
+
@Override
public String toString() {
- return String.format("%s (%s)", this.getName(), this.getSymbol());
+ return String.format("%s (%s)", this.name, this.symbol);
}
}
diff --git a/src/main/java/sevenUnits/unit/BaseUnit.java b/src/main/java/sevenUnits/unit/BaseUnit.java
index ee2c277..dba7f52 100644
--- a/src/main/java/sevenUnits/unit/BaseUnit.java
+++ b/src/main/java/sevenUnits/unit/BaseUnit.java
@@ -20,6 +20,8 @@ import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
+import sevenUnits.utils.NameSymbol;
+
/**
* A unit that other units are defined by.
* <p>
diff --git a/src/main/java/sevenUnits/unit/BritishImperial.java b/src/main/java/sevenUnits/unit/BritishImperial.java
index 743beeb..c6e65fb 100644
--- a/src/main/java/sevenUnits/unit/BritishImperial.java
+++ b/src/main/java/sevenUnits/unit/BritishImperial.java
@@ -16,6 +16,8 @@
*/
package sevenUnits.unit;
+import sevenUnits.utils.NameSymbol;
+
/**
* A static utility class that contains units in the British Imperial system.
*
diff --git a/src/main/java/sevenUnits/unit/FunctionalUnit.java b/src/main/java/sevenUnits/unit/FunctionalUnit.java
index df457e4..720b0af 100644
--- a/src/main/java/sevenUnits/unit/FunctionalUnit.java
+++ b/src/main/java/sevenUnits/unit/FunctionalUnit.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.Objects;
import java.util.function.DoubleUnaryOperator;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/FunctionalUnitlike.java b/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
index 2ee9e19..d6046c0 100644
--- a/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
+++ b/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.function.DoubleFunction;
import java.util.function.ToDoubleFunction;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/LinearUnit.java b/src/main/java/sevenUnits/unit/LinearUnit.java
index 25c2e2e..deefc9a 100644
--- a/src/main/java/sevenUnits/unit/LinearUnit.java
+++ b/src/main/java/sevenUnits/unit/LinearUnit.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.Objects;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
diff --git a/src/main/java/sevenUnits/unit/Metric.java b/src/main/java/sevenUnits/unit/Metric.java
index 3c4d291..78e3769 100644
--- a/src/main/java/sevenUnits/unit/Metric.java
+++ b/src/main/java/sevenUnits/unit/Metric.java
@@ -18,6 +18,7 @@ package sevenUnits.unit;
import java.util.Set;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/MultiUnit.java b/src/main/java/sevenUnits/unit/MultiUnit.java
index 83cdb03..bc240e3 100644
--- a/src/main/java/sevenUnits/unit/MultiUnit.java
+++ b/src/main/java/sevenUnits/unit/MultiUnit.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/Unit.java b/src/main/java/sevenUnits/unit/Unit.java
index 005b6f7..9866e9c 100644
--- a/src/main/java/sevenUnits/unit/Unit.java
+++ b/src/main/java/sevenUnits/unit/Unit.java
@@ -22,6 +22,8 @@ import java.util.Objects;
import java.util.function.DoubleUnaryOperator;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java
index 18ac619..b029539 100644
--- a/src/main/java/sevenUnits/unit/UnitDatabase.java
+++ b/src/main/java/sevenUnits/unit/UnitDatabase.java
@@ -47,6 +47,8 @@ import java.util.regex.Pattern;
import sevenUnits.utils.ConditionalExistenceCollections;
import sevenUnits.utils.DecimalComparison;
import sevenUnits.utils.ExpressionParser;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.NamedObjectProduct;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
@@ -1197,7 +1199,7 @@ public final class UnitDatabase {
* @since 2019-03-14
* @since v0.2.0
*/
- private final Map<String, ObjectProduct<BaseDimension>> dimensions;
+ private final Map<String, NamedObjectProduct<BaseDimension>> dimensions;
/**
* A map mapping strings to units (including prefixes)
@@ -1313,9 +1315,16 @@ public final class UnitDatabase {
*/
public void addDimension(final String name,
final ObjectProduct<BaseDimension> dimension) {
- this.dimensions.put(
- Objects.requireNonNull(name, "name must not be null."),
- Objects.requireNonNull(dimension, "dimension must not be null."));
+ Objects.requireNonNull(name, "name may not be null");
+ Objects.requireNonNull(dimension, "dimension may not be null");
+ if (dimension instanceof NamedObjectProduct) {
+ this.dimensions.put(name,
+ (NamedObjectProduct<BaseDimension>) dimension);
+ } else {
+ final NamedObjectProduct<BaseDimension> namedDimension = dimension
+ .withName(NameSymbol.ofName(name));
+ this.dimensions.put(name, namedDimension);
+ }
}
/**
@@ -1367,7 +1376,7 @@ public final class UnitDatabase {
throw e;
}
- this.addDimension(name, dimension);
+ this.addDimension(name, dimension.withName(NameSymbol.ofName(name)));
}
}
@@ -1463,7 +1472,7 @@ public final class UnitDatabase {
throw e;
}
- this.addUnit(name, unit);
+ this.addUnit(name, unit.withName(NameSymbol.ofName(name)));
}
}
}
@@ -1510,7 +1519,7 @@ public final class UnitDatabase {
* @since 2019-04-13
* @since v0.2.0
*/
- public Map<String, ObjectProduct<BaseDimension>> dimensionMap() {
+ public Map<String, NamedObjectProduct<BaseDimension>> dimensionMap() {
return Collections.unmodifiableMap(this.dimensions);
}
diff --git a/src/main/java/sevenUnits/unit/UnitPrefix.java b/src/main/java/sevenUnits/unit/UnitPrefix.java
index 308f4b0..bf9d1fd 100644
--- a/src/main/java/sevenUnits/unit/UnitPrefix.java
+++ b/src/main/java/sevenUnits/unit/UnitPrefix.java
@@ -21,6 +21,7 @@ import java.util.Optional;
import java.util.Set;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
/**
* A prefix that can be applied to a {@code LinearUnit} to multiply it by some value
diff --git a/src/main/java/sevenUnits/unit/UnitValue.java b/src/main/java/sevenUnits/unit/UnitValue.java
index f6d18f8..339263d 100644
--- a/src/main/java/sevenUnits/unit/UnitValue.java
+++ b/src/main/java/sevenUnits/unit/UnitValue.java
@@ -19,6 +19,8 @@ package sevenUnits.unit;
import java.util.Objects;
import java.util.Optional;
+import sevenUnits.utils.NameSymbol;
+
/**
* A value expressed in a unit.
*
diff --git a/src/main/java/sevenUnits/unit/Unitlike.java b/src/main/java/sevenUnits/unit/Unitlike.java
index d2dcbbb..68de2c2 100644
--- a/src/main/java/sevenUnits/unit/Unitlike.java
+++ b/src/main/java/sevenUnits/unit/Unitlike.java
@@ -22,6 +22,8 @@ import java.util.Objects;
import java.util.function.DoubleFunction;
import java.util.function.ToDoubleFunction;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/UnitlikeValue.java b/src/main/java/sevenUnits/unit/UnitlikeValue.java
index edc13ca..26354b1 100644
--- a/src/main/java/sevenUnits/unit/UnitlikeValue.java
+++ b/src/main/java/sevenUnits/unit/UnitlikeValue.java
@@ -18,6 +18,8 @@ package sevenUnits.unit;
import java.util.Optional;
+import sevenUnits.utils.NameSymbol;
+
/**
*
* @since 2020-09-07
diff --git a/src/main/java/sevenUnits/unit/NameSymbol.java b/src/main/java/sevenUnits/utils/NameSymbol.java
index 3e26138..aea274b 100644
--- a/src/main/java/sevenUnits/unit/NameSymbol.java
+++ b/src/main/java/sevenUnits/utils/NameSymbol.java
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-package sevenUnits.unit;
+package sevenUnits.utils;
import java.util.Arrays;
import java.util.Collections;
@@ -277,4 +277,23 @@ public final class NameSymbol {
// if primaryName is empty, otherNames must also be empty
return this.primaryName.isEmpty() && this.symbol.isEmpty();
}
+
+ /**
+ * @return a short version of this NameSymbol (defaults to symbol instead of
+ * primary name)
+ * @since 2022-02-26
+ */
+ public String shortName() {
+ return this.symbol.or(this::getPrimaryName).orElse("EMPTY");
+ }
+
+ @Override
+ public String toString() {
+ if (this.isEmpty())
+ return "NameSymbol.EMPTY";
+ else if (this.primaryName.isPresent() && this.symbol.isPresent())
+ return this.primaryName + " (" + this.symbol + ")";
+ else
+ return this.primaryName.orElseGet(this.symbol::orElseThrow);
+ }
} \ No newline at end of file
diff --git a/src/main/java/sevenUnits/unit/Nameable.java b/src/main/java/sevenUnits/utils/Nameable.java
index ed23687..3cfc05a 100644
--- a/src/main/java/sevenUnits/unit/Nameable.java
+++ b/src/main/java/sevenUnits/utils/Nameable.java
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-package sevenUnits.unit;
+package sevenUnits.utils;
import java.util.Optional;
import java.util.Set;
diff --git a/src/main/java/sevenUnits/utils/NamedObjectProduct.java b/src/main/java/sevenUnits/utils/NamedObjectProduct.java
index 514f0b1..9c3079c 100644
--- a/src/main/java/sevenUnits/utils/NamedObjectProduct.java
+++ b/src/main/java/sevenUnits/utils/NamedObjectProduct.java
@@ -18,9 +18,6 @@ package sevenUnits.utils;
import java.util.Map;
-import sevenUnits.unit.NameSymbol;
-import sevenUnits.unit.Nameable;
-
/**
* An ObjectProduct with name(s) and/or a symbol. Can be created with the
* {@link ObjectProduct#withName} method.
@@ -43,4 +40,8 @@ public class NamedObjectProduct<T> extends ObjectProduct<T>
return this.nameSymbol;
}
+ @Override
+ public String toString() {
+ return this.nameSymbol.toString() + ", " + super.toString();
+ }
}
diff --git a/src/main/java/sevenUnits/utils/ObjectProduct.java b/src/main/java/sevenUnits/utils/ObjectProduct.java
index d4f88b9..926ce10 100644
--- a/src/main/java/sevenUnits/utils/ObjectProduct.java
+++ b/src/main/java/sevenUnits/utils/ObjectProduct.java
@@ -26,8 +26,6 @@ import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
-import sevenUnits.unit.NameSymbol;
-
/**
* An immutable product of multiple objects of a type, such as base units. The
* objects can be multiplied and exponentiated.
@@ -246,7 +244,9 @@ public class ObjectProduct<T> {
*/
@Override
public String toString() {
- return this.toString(Object::toString);
+ return this.toString(o -> o instanceof Nameable
+ ? ((Nameable) o).getNameSymbol().shortName()
+ : o.toString());
}
/**
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index 23a631d..be02364 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -19,17 +19,26 @@ package sevenUnitsGUI;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.OptionalDouble;
import java.util.Scanner;
+import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import sevenUnits.ProgramInfo;
import sevenUnits.unit.BaseDimension;
+import sevenUnits.unit.BritishImperial;
+import sevenUnits.unit.Metric;
import sevenUnits.unit.Unit;
import sevenUnits.unit.UnitDatabase;
import sevenUnits.unit.UnitPrefix;
+import sevenUnits.unit.UnitValue;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
@@ -40,6 +49,44 @@ import sevenUnits.utils.UncertainDouble;
* @since 2021-12-15
*/
public final class Presenter {
+ /** The default place where settings are stored. */
+ private static final String DEFAULT_SETTINGS_FILEPATH = "settings.txt";
+ /** The default place where units are stored. */
+ private static final String DEFAULT_UNITS_FILEPATH = "/unitsfile.txt";
+ /** The default place where dimensions are stored. */
+ private static final String DEFAULT_DIMENSIONS_FILEPATH = "/dimensionfile.txt";
+ /** The default place where exceptions are stored. */
+ private static final String DEFAULT_EXCEPTIONS_FILEPATH = "/metric_exceptions.txt";
+
+ /**
+ * Adds default units and dimensions to a database.
+ *
+ * @param database database to add to
+ * @since 2019-04-14
+ * @since v0.2.0
+ */
+ private static void addDefaults(final UnitDatabase database) {
+ database.addUnit("metre", Metric.METRE);
+ database.addUnit("kilogram", Metric.KILOGRAM);
+ database.addUnit("gram", Metric.KILOGRAM.dividedBy(1000));
+ database.addUnit("second", Metric.SECOND);
+ database.addUnit("ampere", Metric.AMPERE);
+ database.addUnit("kelvin", Metric.KELVIN);
+ database.addUnit("mole", Metric.MOLE);
+ database.addUnit("candela", Metric.CANDELA);
+ database.addUnit("bit", Metric.BIT);
+ database.addUnit("unit", Metric.ONE);
+ // nonlinear units - must be loaded manually
+ database.addUnit("tempCelsius", Metric.CELSIUS);
+ database.addUnit("tempFahrenheit", BritishImperial.FAHRENHEIT);
+
+ // load initial dimensions
+ database.addDimension("LENGTH", Metric.Dimensions.LENGTH);
+ database.addDimension("MASS", Metric.Dimensions.MASS);
+ database.addDimension("TIME", Metric.Dimensions.TIME);
+ database.addDimension("TEMPERATURE", Metric.Dimensions.TEMPERATURE);
+ }
+
/**
* @return text in About file
* @since 2022-02-19
@@ -86,6 +133,25 @@ public final class Presenter {
}
/**
+ * Accepts a collection and returns a set with the unique elements in that
+ * collection
+ *
+ * @param <E> type of element in collection
+ * @param collection collection to uniquify
+ * @return unique collection
+ * @since 2022-02-26
+ */
+ private static <E> Set<E> unique(Collection<E> collection) {
+ final Set<E> uniqueSet = new HashSet<>();
+ for (final E e : collection) {
+ if (!uniqueSet.contains(e)) {
+ uniqueSet.add(e);
+ }
+ }
+ return uniqueSet;
+ }
+
+ /**
* @return {@code line} with any comments removed.
* @since 2021-03-13
*/
@@ -127,6 +193,13 @@ public final class Presenter {
private Predicate<List<UnitPrefix>> prefixRepetitionRule;
/**
+ * The set of units that is considered neither metric nor nonmetric for the
+ * purposes of the metric-imperial one-way conversion. These units are
+ * included in both From and To, even if One Way Conversion is enabled.
+ */
+ private final Set<String> metricExceptions;
+
+ /**
* If this is true, views that show units as a list will have metric units
* removed from the From unit list and imperial/USC units removed from the To
* unit list.
@@ -148,20 +221,43 @@ public final class Presenter {
public Presenter(View view) {
this.view = view;
this.database = new UnitDatabase();
+ addDefaults(this.database);
+
+ // load units and prefixes
+ try (final InputStream units = inputStream(DEFAULT_UNITS_FILEPATH)) {
+ this.database.loadUnitsFromStream(units);
+ } catch (final IOException e) {
+ throw new AssertionError("Loading of unitsfile.txt failed.", e);
+ }
+
+ // load dimensions
+ try (final InputStream dimensions = inputStream(
+ DEFAULT_DIMENSIONS_FILEPATH)) {
+ this.database.loadDimensionsFromStream(dimensions);
+ } catch (final IOException e) {
+ throw new AssertionError("Loading of dimensionfile.txt failed.", e);
+ }
+
+ // load metric exceptions
+ try {
+ this.metricExceptions = new HashSet<>();
+ try (InputStream exceptions = inputStream(DEFAULT_EXCEPTIONS_FILEPATH);
+ Scanner scanner = new Scanner(exceptions)) {
+ while (scanner.hasNextLine()) {
+ final String line = Presenter
+ .withoutComments(scanner.nextLine());
+ if (!line.isBlank()) {
+ this.metricExceptions.add(line);
+ }
+ }
+ }
+ } catch (final IOException e) {
+ throw new AssertionError("Loading of metric_exceptions.txt failed.",
+ e);
+ }
}
/**
- * Sets the dimension of the view's From and To units.
- *
- * @throws UnsupportedOperationException if the view does not support
- * unit-based conversion (does not
- * implement
- * {@link UnitConversionView})
- * @since 2021-12-15
- */
- public void applyDimensionFilter() {}
-
- /**
* Gets settings from the view and applies them to both view and presenter.
*
* @since 2021-12-15
@@ -190,7 +286,52 @@ public final class Presenter {
* {@link UnitConversionView})
* @since 2021-12-15
*/
- public void convertUnits() {}
+ public void convertUnits() {
+ if (this.view instanceof UnitConversionView) {
+ final UnitConversionView ucview = (UnitConversionView) this.view;
+
+ final Optional<Unit> fromUnitOptional = ucview.getFromSelection();
+ final Optional<Unit> toUnitOptional = ucview.getToSelection();
+ final OptionalDouble valueOptional = ucview.getInputValue();
+
+ // ensure everything is obtained
+ final Unit fromUnit, toUnit;
+ final double value;
+ if (fromUnitOptional.isPresent()) {
+ fromUnit = fromUnitOptional.orElseThrow();
+ } else {
+ this.view.showErrorMessage("Unit Conversion Error",
+ "Please specify a From unit");
+ return;
+ }
+ if (toUnitOptional.isPresent()) {
+ toUnit = toUnitOptional.orElseThrow();
+ } else {
+ this.view.showErrorMessage("Unit Conversion Error",
+ "Please specify a To unit");
+ return;
+ }
+ if (valueOptional.isPresent()) {
+ value = valueOptional.orElseThrow();
+ } else {
+ this.view.showErrorMessage("Unit Conversion Error",
+ "Please specify a valid value");
+ return;
+ }
+
+ if (!fromUnit.canConvertTo(toUnit))
+ throw new AssertionError(
+ "From and To units incompatible (should be impossible)");
+
+ // convert!
+ final UnitValue initialValue = UnitValue.of(fromUnit, value);
+ final UnitValue converted = initialValue.convertTo(toUnit);
+ ucview.showUnitConversionOutput(
+ String.format("%s = %s", initialValue, converted));
+ } else
+ throw new UnsupportedOperationException(
+ "This function can only be called when the view is a UnitConversionView.");
+ }
/**
* Loads settings from the user's settings file and applies them to the view.
@@ -199,6 +340,21 @@ public final class Presenter {
*/
public void loadSettings() {}
+ /**
+ * Completes creation of the presenter. This part of the initialization
+ * depends on the view's functions, so it cannot be run if the components
+ * they depend on are not created yet.
+ *
+ * @since 2022-02-26
+ */
+ public void postViewInitialize() {
+ // unit conversion specific stuff
+ if (this.view instanceof UnitConversionView) {
+ final UnitConversionView ucview = (UnitConversionView) this.view;
+ ucview.setDimensions(unique(this.database.dimensionMap().values()));
+ }
+ }
+
void prefixSelected() {}
/**
@@ -227,4 +383,26 @@ public final class Presenter {
}
void unitNameSelected() {}
+
+ /**
+ * Updates the view's From and To units, if it has some
+ *
+ * @since 2021-12-15
+ */
+ public void updateView() {
+ if (this.view instanceof UnitConversionView) {
+ final UnitConversionView ucview = (UnitConversionView) this.view;
+ final ObjectProduct<BaseDimension> viewDimension = ucview
+ .getSelectedDimension().orElseThrow();
+
+ final Set<Unit> units = this.database
+ .unitMapPrefixless(this.showDuplicateUnits).entrySet().stream()
+ .map(Map.Entry::getValue)
+ .filter(u -> viewDimension.equals(u.getDimension()))
+ .collect(Collectors.toSet());
+
+ ucview.setFromUnits(units);
+ ucview.setToUnits(units);
+ }
+ }
}
diff --git a/src/main/java/sevenUnitsGUI/TabbedView.java b/src/main/java/sevenUnitsGUI/TabbedView.java
index e92b661..c3a05e2 100644
--- a/src/main/java/sevenUnitsGUI/TabbedView.java
+++ b/src/main/java/sevenUnitsGUI/TabbedView.java
@@ -28,6 +28,7 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Optional;
+import java.util.OptionalDouble;
import java.util.Set;
import javax.swing.BorderFactory;
@@ -212,7 +213,7 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
this.dimensionSelector = new JComboBox<>();
inBetweenPanel.add(this.dimensionSelector, BorderLayout.PAGE_START);
this.dimensionSelector
- .addItemListener(e -> this.presenter.applyDimensionFilter());
+ .addItemListener(e -> this.presenter.updateView());
final JLabel arrowLabel = new JLabel("-->");
inBetweenPanel.add(arrowLabel, BorderLayout.CENTER);
@@ -326,9 +327,9 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
this.masterPane.setMnemonicAt(5, KeyEvent.VK_S);
// ============ FINALIZE CREATION OF VIEW ============
+ this.presenter.postViewInitialize();
this.frame.pack();
this.frame.setVisible(true);
-
}
/**
@@ -541,8 +542,13 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
}
@Override
- public String getInputValue() {
- return this.valueInput.getText();
+ public OptionalDouble getInputValue() {
+ final String text = this.valueInput.getText();
+ try {
+ return OptionalDouble.of(Double.parseDouble(text));
+ } catch (final NumberFormatException e) {
+ return OptionalDouble.empty();
+ }
}
@Override
diff --git a/src/main/java/sevenUnitsGUI/UnitConversionView.java b/src/main/java/sevenUnitsGUI/UnitConversionView.java
index 5fd5a82..e411a44 100644
--- a/src/main/java/sevenUnitsGUI/UnitConversionView.java
+++ b/src/main/java/sevenUnitsGUI/UnitConversionView.java
@@ -17,6 +17,7 @@
package sevenUnitsGUI;
import java.util.Optional;
+import java.util.OptionalDouble;
import java.util.Set;
import sevenUnits.unit.BaseDimension;
@@ -48,7 +49,7 @@ public interface UnitConversionView extends View {
* string provided by the user)
* @since 2021-12-15
*/
- String getInputValue();
+ OptionalDouble getInputValue();
/**
* @return selected dimension
diff --git a/src/main/java/sevenUnitsGUI/ViewBot.java b/src/main/java/sevenUnitsGUI/ViewBot.java
index 0c0d189..bc5302b 100644
--- a/src/main/java/sevenUnitsGUI/ViewBot.java
+++ b/src/main/java/sevenUnitsGUI/ViewBot.java
@@ -20,6 +20,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.OptionalDouble;
import java.util.Set;
import sevenUnits.unit.BaseDimension;
@@ -47,7 +48,7 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
/**
* The user-provided string representing the value in {@code fromSelection}
*/
- private String inputValue;
+ private OptionalDouble inputValue;
/** The unit selected in the From selection */
private Optional<Unit> fromSelection;
/** The unit selected in the To selection */
@@ -102,7 +103,7 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
}
@Override
- public String getInputValue() {
+ public OptionalDouble getInputValue() {
return this.inputValue;
}
@@ -190,7 +191,7 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
* @param inputValue the inputValue to set
* @since 2022-01-29
*/
- public void setInputValue(String inputValue) {
+ public void setInputValue(OptionalDouble inputValue) {
this.inputValue = inputValue;
}