diff options
author | Adrien Hopkins <ahopk127@my.yorku.ca> | 2022-04-16 17:00:52 -0500 |
---|---|---|
committer | Adrien Hopkins <ahopk127@my.yorku.ca> | 2022-04-16 17:00:52 -0500 |
commit | 855cdf83b91bd3061662e563db6656408cc24a12 (patch) | |
tree | ed6138a7ad36a0a50aaeae8743c0a41150166abe /src/main | |
parent | 4aaf6a8b60fbec63c2e0bee624b3859ded0ecde3 (diff) |
Implemented the unit & prefix viewers
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/sevenUnits/unit/LinearUnit.java | 5 | ||||
-rw-r--r-- | src/main/java/sevenUnits/unit/UnitDatabase.java | 4 | ||||
-rw-r--r-- | src/main/java/sevenUnits/utils/ObjectProduct.java | 7 | ||||
-rw-r--r-- | src/main/java/sevenUnitsGUI/Presenter.java | 98 | ||||
-rw-r--r-- | src/main/java/sevenUnitsGUI/TabbedView.java | 15 | ||||
-rw-r--r-- | src/main/java/sevenUnitsGUI/ViewBot.java | 29 |
6 files changed, 125 insertions, 33 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 |