summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-18 17:41:43 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-18 17:41:43 -0500
commit40f7b6e806140fc2fc741c63c71f5ce97b4bd1d2 (patch)
treee43ce4a066da9714da5d7274a443e98b818e73a5 /src/main
parentf0541a955b6e4b12d808cffec0874f50a004e8b9 (diff)
Implemented one-way conversion, duplicate prefixes can now be hidden
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java5
-rw-r--r--src/main/java/sevenUnits/unit/BritishImperial.java2
-rw-r--r--src/main/java/sevenUnits/unit/UnitDatabase.java26
-rw-r--r--src/main/java/sevenUnits/unit/UnitType.java24
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java71
-rw-r--r--src/main/java/sevenUnitsGUI/TabbedView.java9
6 files changed, 90 insertions, 47 deletions
diff --git a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
index e10bab4..309bdb9 100644
--- a/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
+++ b/src/main/java/sevenUnits/converterGUI/SevenUnitsGUI.java
@@ -298,7 +298,8 @@ final class SevenUnitsGUI {
this.database.unitMapPrefixless(true).keySet());
this.unitNames.sort(null); // sorts it using Comparable
- this.prefixNames = new ArrayList<>(this.database.prefixMap().keySet());
+ this.prefixNames = new ArrayList<>(
+ this.database.prefixMap(true).keySet());
this.prefixNames.sort(this.prefixNameComparator); // sorts it using my
// comparator
@@ -611,7 +612,7 @@ final class SevenUnitsGUI {
* @since v0.2.0
*/
public final Set<String> prefixNameSet() {
- return this.database.prefixMap().keySet();
+ return this.database.prefixMap(true).keySet();
}
/**
diff --git a/src/main/java/sevenUnits/unit/BritishImperial.java b/src/main/java/sevenUnits/unit/BritishImperial.java
index c6e65fb..0ecba6d 100644
--- a/src/main/java/sevenUnits/unit/BritishImperial.java
+++ b/src/main/java/sevenUnits/unit/BritishImperial.java
@@ -121,5 +121,5 @@ public final class BritishImperial {
public static final Unit FAHRENHEIT = Unit
.fromConversionFunctions(Metric.KELVIN.getBase(),
tempK -> tempK * 1.8 - 459.67, tempF -> (tempF + 459.67) / 1.8)
- .withName(NameSymbol.of("degrees Fahrenheit", "\u00B0F"));
+ .withName(NameSymbol.of("degree Fahrenheit", "\u00B0F"));
}
diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java
index a4f0c44..71676a1 100644
--- a/src/main/java/sevenUnits/unit/UnitDatabase.java
+++ b/src/main/java/sevenUnits/unit/UnitDatabase.java
@@ -1160,16 +1160,16 @@ public final class UnitDatabase {
}
/**
- * @return true if entry represents a removable duplicate entry of unitMap.
+ * @return true if entry represents a removable duplicate entry of map.
* @since 2021-05-22
*/
- static boolean isRemovableDuplicate(Map<String, Unit> unitMap,
- Entry<String, Unit> entry) {
- for (final Entry<String, Unit> e : unitMap.entrySet()) {
+ static <T> boolean isRemovableDuplicate(Map<String, T> map,
+ Entry<String, T> entry) {
+ for (final Entry<String, T> e : map.entrySet()) {
final String name = e.getKey();
- final Unit value = e.getValue();
+ final T value = e.getValue();
if (lengthFirstComparator.compare(entry.getKey(), name) < 0
- && Objects.equals(unitMap.get(entry.getKey()), value))
+ && Objects.equals(map.get(entry.getKey()), value))
return true;
}
return false;
@@ -2010,12 +2010,18 @@ public final class UnitDatabase {
}
/**
+ * @param includeDuplicates if false, duplicates are removed from the map
* @return a map mapping prefix names to prefixes
- * @since 2019-04-13
- * @since v0.2.0
+ * @since 2022-04-18
+ * @since v0.4.0
*/
- public Map<String, UnitPrefix> prefixMap() {
- return Collections.unmodifiableMap(this.prefixes);
+ public Map<String, UnitPrefix> prefixMap(boolean includeDuplicates) {
+ if (includeDuplicates)
+ return Collections.unmodifiableMap(this.prefixes);
+ else
+ return Collections.unmodifiableMap(ConditionalExistenceCollections
+ .conditionalExistenceMap(this.prefixes,
+ entry -> !isRemovableDuplicate(this.prefixes, entry)));
}
/**
diff --git a/src/main/java/sevenUnits/unit/UnitType.java b/src/main/java/sevenUnits/unit/UnitType.java
index a13051a..7cebf2d 100644
--- a/src/main/java/sevenUnits/unit/UnitType.java
+++ b/src/main/java/sevenUnits/unit/UnitType.java
@@ -16,6 +16,8 @@
*/
package sevenUnits.unit;
+import java.util.function.Predicate;
+
/**
* A type of unit, as chosen by the type of system it is in.
* <ul>
@@ -31,4 +33,26 @@ package sevenUnits.unit;
*/
public enum UnitType {
METRIC, SEMI_METRIC, NON_METRIC;
+
+ /**
+ * Determines which type a unit is. The type will be:
+ * <ul>
+ * <li>{@code SEMI_METRIC} if the unit passes the provided predicate
+ * <li>{@code METRIC} if it fails the predicate but is metric
+ * <li>{@code NON_METRIC} if it fails the predicate and is not metric
+ * </ul>
+ *
+ * @param u unit to test
+ * @param isSemiMetric predicate to determine if a unit is semi-metric
+ * @return type of unit
+ * @since 2022-04-18
+ */
+ public static final UnitType getType(Unit u, Predicate<Unit> isSemiMetric) {
+ if (isSemiMetric.test(u))
+ return SEMI_METRIC;
+ else if (u.isMetric())
+ return METRIC;
+ else
+ return NON_METRIC;
+ }
}
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index 85a0ddc..f4f3e3a 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -30,6 +30,7 @@ import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import sevenUnits.ProgramInfo;
import sevenUnits.unit.BaseDimension;
@@ -194,10 +195,10 @@ public final class Presenter {
private boolean oneWayConversionEnabled;
/**
- * If this is false, duplicate units will be removed from the unit view in
- * views that show units as a list to choose from.
+ * If this is false, duplicate units and prefixes will be removed from the
+ * unit view in views that show units as a list to choose from.
*/
- private boolean showDuplicateUnits;
+ private boolean showDuplicates;
/**
* Creates a Presenter
@@ -416,8 +417,8 @@ public final class Presenter {
* @return true iff duplicate units are shown in unit lists
* @since 2022-03-30
*/
- public boolean duplicateUnitsShown() {
- return this.showDuplicateUnits;
+ public boolean duplicatesShown() {
+ return this.showDuplicates;
}
/**
@@ -455,25 +456,18 @@ public final class Presenter {
}
/**
- * @return type of unit {@code u}
+ * @return whether or not the provided unit is semi-metric (i.e. an
+ * exception)
* @since 2022-04-16
*/
- private final UnitType getUnitType(Unit u) {
+ private final boolean isSemiMetric(Unit u) {
// determine if u is an exception
final var primaryName = u.getPrimaryName();
final var symbol = u.getSymbol();
- final boolean isException = primaryName.isPresent()
+ return 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;
}
/**
@@ -510,10 +504,7 @@ public final class Presenter {
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());
+ this.updateView();
}
void prefixSelected() {
@@ -572,8 +563,8 @@ public final class Presenter {
* @param showDuplicateUnits whether or not duplicate units should be shown
* @since 2022-03-30
*/
- public void setShowDuplicateUnits(boolean showDuplicateUnits) {
- this.showDuplicateUnits = showDuplicateUnits;
+ public void setShowDuplicates(boolean showDuplicateUnits) {
+ this.showDuplicates = showDuplicateUnits;
this.updateView();
}
@@ -589,7 +580,7 @@ public final class Presenter {
|| 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);
+ final var unitType = UnitType.getType(u, this::isSemiMetric);
this.view.showUnit(nameSymbol, definition, dimensionString, unitType);
}
@@ -621,14 +612,36 @@ public final class Presenter {
.getDimension(((UnitConversionView) this.view)
.getSelectedDimensionName().orElseThrow());
- final Set<String> units = this.database
- .unitMapPrefixless(this.showDuplicateUnits).entrySet().stream()
+ // load units & prefixes into viewers
+ this.view.setViewableUnitNames(
+ this.database.unitMapPrefixless(this.showDuplicates).keySet());
+ this.view.setViewablePrefixNames(
+ this.database.prefixMap(this.showDuplicates).keySet());
+
+ // get From and To units
+ Stream<Unit> fromUnits = this.database
+ .unitMapPrefixless(this.showDuplicates).entrySet().stream()
.map(Map.Entry::getValue)
- .filter(u -> viewDimension.equals(u.getDimension()))
- .map(Unit::getName).collect(Collectors.toSet());
+ .filter(u -> viewDimension.equals(u.getDimension()));
+
+ Stream<Unit> toUnits = this.database
+ .unitMapPrefixless(this.showDuplicates).entrySet().stream()
+ .map(Map.Entry::getValue)
+ .filter(u -> viewDimension.equals(u.getDimension()));
+
+ // filter by unit type, if desired
+ if (this.oneWayConversionEnabled) {
+ fromUnits = fromUnits.filter(u -> UnitType.getType(u,
+ this::isSemiMetric) != UnitType.METRIC);
+ toUnits = toUnits.filter(u -> UnitType.getType(u,
+ this::isSemiMetric) != UnitType.NON_METRIC);
+ }
- ucview.setFromUnitNames(units);
- ucview.setToUnitNames(units);
+ // set unit names
+ ucview.setFromUnitNames(
+ fromUnits.map(Unit::getName).collect(Collectors.toSet()));
+ ucview.setToUnitNames(
+ toUnits.map(Unit::getName).collect(Collectors.toSet()));
}
}
diff --git a/src/main/java/sevenUnitsGUI/TabbedView.java b/src/main/java/sevenUnitsGUI/TabbedView.java
index 3a951ef..098c374 100644
--- a/src/main/java/sevenUnitsGUI/TabbedView.java
+++ b/src/main/java/sevenUnitsGUI/TabbedView.java
@@ -634,11 +634,10 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
.setAnchor(GridBagConstraints.LINE_START).build());
final JCheckBox showAllVariations = new JCheckBox(
- "Show Duplicates in \"Convert Units\"");
- showAllVariations.setSelected(this.presenter.duplicateUnitsShown());
- showAllVariations
- .addItemListener(e -> this.presenter.setShowDuplicateUnits(
- e.getStateChange() == ItemEvent.SELECTED));
+ "Show Duplicate Units & Prefixes");
+ showAllVariations.setSelected(this.presenter.duplicatesShown());
+ showAllVariations.addItemListener(e -> this.presenter
+ .setShowDuplicates(e.getStateChange() == ItemEvent.SELECTED));
miscPanel.add(showAllVariations, new GridBagBuilder(0, 1)
.setAnchor(GridBagConstraints.LINE_START).build());