summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-16 17:00:52 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-16 17:00:52 -0500
commit855cdf83b91bd3061662e563db6656408cc24a12 (patch)
treeed6138a7ad36a0a50aaeae8743c0a41150166abe /src
parent4aaf6a8b60fbec63c2e0bee624b3859ded0ecde3 (diff)
Implemented the unit & prefix viewers
Diffstat (limited to 'src')
-rw-r--r--src/main/java/sevenUnits/unit/LinearUnit.java5
-rw-r--r--src/main/java/sevenUnits/unit/UnitDatabase.java4
-rw-r--r--src/main/java/sevenUnits/utils/ObjectProduct.java7
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java98
-rw-r--r--src/main/java/sevenUnitsGUI/TabbedView.java15
-rw-r--r--src/main/java/sevenUnitsGUI/ViewBot.java29
-rw-r--r--src/test/java/sevenUnitsGUI/PresenterTest.java11
7 files changed, 132 insertions, 37 deletions
diff --git a/src/main/java/sevenUnits/unit/LinearUnit.java b/src/main/java/sevenUnits/unit/LinearUnit.java
index 3a28261..103b7f6 100644
--- a/src/main/java/sevenUnits/unit/LinearUnit.java
+++ b/src/main/java/sevenUnits/unit/LinearUnit.java
@@ -372,8 +372,9 @@ public final class LinearUnit extends Unit {
@Override
public String toDefinitionString() {
- return Double.toString(this.conversionFactor) + " "
- + this.getBase().toString(BaseUnit::getShortName);
+ return Double.toString(this.conversionFactor)
+ + (this.getBase().equals(ObjectProduct.empty()) ? ""
+ : " " + this.getBase().toString(BaseUnit::getShortName));
}
/**
diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java
index 5591d7d..7b02ac7 100644
--- a/src/main/java/sevenUnits/unit/UnitDatabase.java
+++ b/src/main/java/sevenUnits/unit/UnitDatabase.java
@@ -1458,7 +1458,9 @@ public final class UnitDatabase {
System.err.printf("Parsing error on line %d:%n", lineCounter);
throw e;
}
- this.addPrefix(name.substring(0, name.length() - 1), prefix);
+ final String prefixName = name.substring(0, name.length() - 1);
+ this.addPrefix(prefixName,
+ prefix.withName(NameSymbol.ofName(prefixName)));
} else {
// it's a unit, get the unit
final Unit unit;
diff --git a/src/main/java/sevenUnits/utils/ObjectProduct.java b/src/main/java/sevenUnits/utils/ObjectProduct.java
index 110bdc1..66bb773 100644
--- a/src/main/java/sevenUnits/utils/ObjectProduct.java
+++ b/src/main/java/sevenUnits/utils/ObjectProduct.java
@@ -257,9 +257,10 @@ public class ObjectProduct<T> implements Nameable {
/**
* Converts this product to a string using the objects'
- * {@link Object#toString()} method. If objects have a long toString
- * representation, it is recommended to use {@link #toString(Function)}
- * instead to shorten the returned string.
+ * {@link Object#toString()} method (or {@link Nameable#getShortName} if
+ * available). If objects have a long toString representation, it is
+ * recommended to use {@link #toString(Function)} instead to shorten the
+ * returned string.
*
* <p>
* {@inheritDoc}
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index 5c8ce53..981af21 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -33,13 +33,17 @@ import java.util.stream.Collectors;
import sevenUnits.ProgramInfo;
import sevenUnits.unit.BaseDimension;
+import sevenUnits.unit.BaseUnit;
import sevenUnits.unit.BritishImperial;
+import sevenUnits.unit.LinearUnit;
import sevenUnits.unit.LinearUnitValue;
import sevenUnits.unit.Metric;
import sevenUnits.unit.Unit;
import sevenUnits.unit.UnitDatabase;
import sevenUnits.unit.UnitPrefix;
+import sevenUnits.unit.UnitType;
import sevenUnits.unit.UnitValue;
+import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
@@ -383,6 +387,21 @@ public final class Presenter {
}
/**
+ * Gets a name for this dimension using the database
+ *
+ * @param dimension dimension to name
+ * @return name of dimension
+ * @since 2022-04-16
+ */
+ final String getDimensionName(ObjectProduct<BaseDimension> dimension) {
+ // find this dimension in the database and get its name
+ // if it isn't there, use the dimension's toString instead
+ return this.database.dimensionMap().values().stream()
+ .filter(d -> d.equals(dimension)).findAny().map(Nameable::getName)
+ .orElse(dimension.toString(Nameable::getName));
+ }
+
+ /**
* @return the rule that is used by this presenter to convert numbers into
* strings
* @since 2022-04-10
@@ -402,14 +421,25 @@ public final class Presenter {
}
/**
- * @return true iff the One-Way Conversion feature is available (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)
- *
- * @since 2022-03-30
+ * @return type of unit {@code u}
+ * @since 2022-04-16
*/
- public boolean oneWayConversionEnabled() {
- return this.oneWayConversionEnabled;
+ private final UnitType getUnitType(Unit u) {
+ // determine if u is an exception
+ final var primaryName = u.getPrimaryName();
+ final var symbol = u.getSymbol();
+ final boolean isException = primaryName.isPresent()
+ && this.metricExceptions.contains(primaryName.orElseThrow())
+ || symbol.isPresent()
+ && this.metricExceptions.contains(symbol.orElseThrow());
+
+ // determine unit type
+ if (isException)
+ return UnitType.SEMI_METRIC;
+ else if (u.isMetric())
+ return UnitType.METRIC;
+ else
+ return UnitType.NON_METRIC;
}
/**
@@ -422,6 +452,17 @@ public final class Presenter {
void loadSettings(Path settingsFile) {}
/**
+ * @return true iff the One-Way Conversion feature is available (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)
+ *
+ * @since 2022-03-30
+ */
+ public boolean oneWayConversionEnabled() {
+ return this.oneWayConversionEnabled;
+ }
+
+ /**
* 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.
@@ -434,9 +475,24 @@ public final class Presenter {
final UnitConversionView ucview = (UnitConversionView) this.view;
ucview.setDimensionNames(this.database.dimensionMap().keySet());
}
+
+ // load units & prefixes into viewers
+ this.view.setViewableUnitNames(
+ this.database.unitMapPrefixless(this.showDuplicateUnits).keySet());
+ this.view.setViewablePrefixNames(this.database.prefixMap().keySet());
}
- void prefixSelected() {}
+ void prefixSelected() {
+ final Optional<String> selectedPrefixName = this.view
+ .getViewedPrefixName();
+ final Optional<UnitPrefix> selectedPrefix = selectedPrefixName
+ .map(name -> this.database.containsPrefixName(name)
+ ? this.database.getPrefix(name)
+ : null);
+ selectedPrefix
+ .ifPresent(prefix -> this.view.showPrefix(prefix.getNameSymbol(),
+ String.valueOf(prefix.getMultiplier())));
+ }
/**
* Saves the presenter's settings to the user settings file.
@@ -488,12 +544,36 @@ public final class Presenter {
}
/**
+ * Shows a unit in the unit viewer
+ *
+ * @param u unit to show
+ * @since 2022-04-16
+ */
+ private final void showUnit(Unit u) {
+ final var nameSymbol = u.getNameSymbol();
+ final boolean isBase = u instanceof BaseUnit
+ || u instanceof LinearUnit && ((LinearUnit) u).isBase();
+ final var definition = isBase ? "(Base unit)" : u.toDefinitionString();
+ final var dimensionString = this.getDimensionName(u.getDimension());
+ final var unitType = this.getUnitType(u);
+ this.view.showUnit(nameSymbol, definition, dimensionString, unitType);
+ }
+
+ /**
* Runs whenever a unit name is selected in the unit viewer. Gets the
* description of a unit and displays it.
*
* @since 2022-04-10
*/
- void unitNameSelected() {}
+ void unitNameSelected() {
+ // get selected unit, if it's there and valid
+ final Optional<String> selectedUnitName = this.view.getViewedUnitName();
+ final Optional<Unit> selectedUnit = selectedUnitName
+ .map(unitName -> this.database.containsUnitName(unitName)
+ ? this.database.getUnit(unitName)
+ : null);
+ selectedUnit.ifPresent(this::showUnit);
+ }
/**
* Updates the view's From and To units, if it has some
diff --git a/src/main/java/sevenUnitsGUI/TabbedView.java b/src/main/java/sevenUnitsGUI/TabbedView.java
index fd48965..d0eb32f 100644
--- a/src/main/java/sevenUnitsGUI/TabbedView.java
+++ b/src/main/java/sevenUnitsGUI/TabbedView.java
@@ -578,12 +578,12 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
@Override
public Optional<String> getViewedPrefixName() {
- throw new UnsupportedOperationException("Not implemented yet");
+ return this.prefixNameList.getSelectedValue();
}
@Override
public Optional<String> getViewedUnitName() {
- throw new UnsupportedOperationException("Not implemented yet");
+ return this.unitNameList.getSelectedValue();
}
@Override
@@ -606,12 +606,12 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
@Override
public void setViewablePrefixNames(Set<String> prefixNames) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.prefixNameList.setItems(prefixNames);
}
@Override
public void setViewableUnitNames(Set<String> unitNames) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.unitNameList.setItems(unitNames);
}
@Override
@@ -628,13 +628,16 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
@Override
public void showPrefix(NameSymbol name, String multiplierString) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.prefixTextBox.setText(
+ String.format("%s%nMultiplier: %s", name, multiplierString));
}
@Override
public void showUnit(NameSymbol name, String definition,
String dimensionName, UnitType type) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.unitTextBox.setText(
+ String.format("%s%nDefinition: %s%nDimension: %s%nType: %s", name,
+ definition, dimensionName, type));
}
@Override
diff --git a/src/main/java/sevenUnitsGUI/ViewBot.java b/src/main/java/sevenUnitsGUI/ViewBot.java
index 988d1bc..dd9869d 100644
--- a/src/main/java/sevenUnitsGUI/ViewBot.java
+++ b/src/main/java/sevenUnitsGUI/ViewBot.java
@@ -216,6 +216,11 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
/** The units available in the To selection */
private Set<String> toUnits;
+ /** The selected unit in the unit viewer */
+ private Optional<String> unitViewerSelection;
+ /** The selected unit in the prefix viewer */
+ private Optional<String> prefixViewerSelection;
+
/** Saved outputs of all unit conversions */
private final List<UnitConversionRecord> unitConversions;
/** Saved outputs of all unit expressions */
@@ -314,12 +319,12 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
@Override
public Optional<String> getViewedPrefixName() {
- throw new UnsupportedOperationException("Not implemented yet");
+ return this.prefixViewerSelection;
}
@Override
public Optional<String> getViewedUnitName() {
- throw new UnsupportedOperationException("Not implemented yet");
+ return this.unitViewerSelection;
}
/**
@@ -423,26 +428,24 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
@Override
public void setViewablePrefixNames(Set<String> prefixNames) {
- throw new UnsupportedOperationException("Not implemented yet");
+ // do nothing, ViewBot supports selecting any prefix
}
@Override
public void setViewableUnitNames(Set<String> unitNames) {
- throw new UnsupportedOperationException("Not implemented yet");
+ // do nothing, ViewBot supports selecting any unit
}
- public void setViewedPrefixName(
- @SuppressWarnings("unused") Optional<String> viewedPrefixName) {
- throw new UnsupportedOperationException("Not implemented yet");
+ public void setViewedPrefixName(Optional<String> viewedPrefixName) {
+ this.prefixViewerSelection = viewedPrefixName;
}
public void setViewedPrefixName(String viewedPrefixName) {
this.setViewedPrefixName(Optional.of(viewedPrefixName));
}
- public void setViewedUnitName(
- @SuppressWarnings("unused") Optional<String> viewedUnitName) {
- throw new UnsupportedOperationException("Not implemented yet");
+ public void setViewedUnitName(Optional<String> viewedUnitName) {
+ this.unitViewerSelection = viewedUnitName;
}
public void setViewedUnitName(String viewedUnitName) {
@@ -462,13 +465,15 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
@Override
public void showPrefix(NameSymbol name, String multiplierString) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.prefixViewingRecords
+ .add(new PrefixViewingRecord(name, multiplierString));
}
@Override
public void showUnit(NameSymbol name, String definition,
String dimensionName, UnitType type) {
- throw new UnsupportedOperationException("Not implemented yet");
+ this.unitViewingRecords
+ .add(new UnitViewingRecord(name, definition, dimensionName, type));
}
@Override
diff --git a/src/test/java/sevenUnitsGUI/PresenterTest.java b/src/test/java/sevenUnitsGUI/PresenterTest.java
index 85ebe09..8446a90 100644
--- a/src/test/java/sevenUnitsGUI/PresenterTest.java
+++ b/src/test/java/sevenUnitsGUI/PresenterTest.java
@@ -212,7 +212,8 @@ public final class PresenterTest {
presenter.prefixSelected(); // just in case
// get correct values
- final var expectedNameSymbol = Metric.KILO.getNameSymbol();
+ final var expectedNameSymbol = presenter.database.getPrefix("kilo")
+ .getNameSymbol();
final var expectedMultiplierString = String
.valueOf(Metric.KILO.getMultiplier());
@@ -298,9 +299,11 @@ public final class PresenterTest {
// automatically
// get correct values
- final var expectedNameSymbol = Metric.METRE.getNameSymbol();
- final var expectedDefinition = Metric.METRE.toDefinitionString();
- final var expectedDimensionName = Metric.METRE.getDimension().getName();
+ final var expectedNameSymbol = presenter.database.getUnit("metre")
+ .getNameSymbol();
+ final var expectedDefinition = "(Base unit)";
+ final var expectedDimensionName = presenter
+ .getDimensionName(Metric.METRE.getDimension());
final var expectedUnitType = UnitType.METRIC;
// test for correctness