From e0c5021a9ba85debf0c0722d78f75a0dbcc8376b Mon Sep 17 00:00:00 2001
From: Adrien Hopkins
Date: Sat, 13 Apr 2019 12:17:14 -0400
Subject: Implemented the dimension-based converter.
Also added a search box list, and fixed a bug with dimension exponentiation.
---
.../unitConverter/converterGUI/SearchBoxList.java | 205 +++++++++++++++++++++
1 file changed, 205 insertions(+)
create mode 100644 src/org/unitConverter/converterGUI/SearchBoxList.java
(limited to 'src/org/unitConverter/converterGUI/SearchBoxList.java')
diff --git a/src/org/unitConverter/converterGUI/SearchBoxList.java b/src/org/unitConverter/converterGUI/SearchBoxList.java
new file mode 100644
index 0000000..7d3b748
--- /dev/null
+++ b/src/org/unitConverter/converterGUI/SearchBoxList.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (C) 2019 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+package org.unitConverter.converterGUI;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.function.Predicate;
+
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+
+/**
+ * @author Adrien Hopkins
+ * @since 2019-04-13
+ */
+final class SearchBoxList extends JPanel {
+
+ /**
+ * @since 2019-04-13
+ */
+ private static final long serialVersionUID = 6226930279415983433L;
+
+ /**
+ * The text to place in an empty search box.
+ */
+ private static final String EMPTY_TEXT = "Search...";
+ /**
+ * The color to use for an empty foreground.
+ */
+ private static final Color EMPTY_FOREGROUND = new Color(192, 192, 192);
+
+ // the components
+ private final Collection itemsToFilter;
+ private final DelegateListModel listModel;
+ private final JTextField searchBox;
+ private final JList searchItems;
+
+ private boolean searchBoxEmpty = true;
+
+ // I need to do this because, for some reason, Swing is auto-focusing my search box without triggering a focus
+ // event.
+ private boolean searchBoxFocused = false;
+
+ private Predicate searchFilter = o -> true;
+
+ /**
+ * Creates the {@code SearchBoxList}.
+ *
+ * @since 2019-04-13
+ */
+ public SearchBoxList(final Collection itemsToFilter) {
+ super(new BorderLayout(), true);
+ this.itemsToFilter = itemsToFilter;
+
+ // create the components
+ this.listModel = new DelegateListModel<>(new ArrayList<>(itemsToFilter));
+ this.searchItems = new JList<>(this.listModel);
+
+ this.searchBox = new JTextField(EMPTY_TEXT);
+ this.searchBox.setForeground(EMPTY_FOREGROUND);
+
+ // add them to the panel
+ this.add(this.searchBox, BorderLayout.PAGE_START);
+ this.add(new JScrollPane(this.searchItems), BorderLayout.CENTER);
+
+ // set up the search box
+ this.searchBox.addFocusListener(new FocusListener() {
+ @Override
+ public void focusGained(final FocusEvent e) {
+ SearchBoxList.this.searchBoxFocusGained(e);
+ }
+
+ @Override
+ public void focusLost(final FocusEvent e) {
+ SearchBoxList.this.searchBoxFocusLost(e);
+ }
+ });
+
+ this.searchBox.addCaretListener(e -> this.searchBoxTextChanged());
+ this.searchBoxEmpty = true;
+ }
+
+ /**
+ * Adds an additional filter for searching.
+ *
+ * @param filter
+ * filter to add.
+ * @since 2019-04-13
+ */
+ public void addSearchFilter(final Predicate filter) {
+ this.searchFilter = this.searchFilter.and(filter);
+ }
+
+ /**
+ * Resets the search filter.
+ *
+ * @since 2019-04-13
+ */
+ public void clearSearchFilters() {
+ this.searchFilter = o -> true;
+ }
+
+ /**
+ * @return value selected in item list
+ * @since 2019-04-13
+ */
+ public String getSelectedValue() {
+ return this.searchItems.getSelectedValue();
+ }
+
+ /**
+ * Re-applies the filters.
+ *
+ * @since 2019-04-13
+ */
+ public void reapplyFilter() {
+ final String searchText = this.searchBoxEmpty ? "" : this.searchBox.getText();
+ final FilterComparator comparator = new FilterComparator(searchText);
+
+ this.listModel.clear();
+ this.itemsToFilter.forEach(string -> {
+ if (string.toLowerCase().contains(searchText.toLowerCase())) {
+ this.listModel.add(string);
+ }
+ });
+
+ // applies the custom filters
+ this.listModel.removeIf(this.searchFilter.negate());
+
+ // sorts the remaining items
+ this.listModel.sort(comparator);
+ }
+
+ /**
+ * Runs whenever the search box gains focus.
+ *
+ * @param e
+ * focus event
+ * @since 2019-04-13
+ */
+ private void searchBoxFocusGained(final FocusEvent e) {
+ this.searchBoxFocused = true;
+ if (this.searchBoxEmpty) {
+ this.searchBox.setText("");
+ this.searchBox.setForeground(Color.BLACK);
+ }
+ }
+
+ /**
+ * Runs whenever the search box loses focus.
+ *
+ * @param e
+ * focus event
+ * @since 2019-04-13
+ */
+ private void searchBoxFocusLost(final FocusEvent e) {
+ this.searchBoxFocused = false;
+ if (this.searchBoxEmpty) {
+ this.searchBox.setText(EMPTY_TEXT);
+ this.searchBox.setForeground(EMPTY_FOREGROUND);
+ }
+ }
+
+ private void searchBoxTextChanged() {
+ if (this.searchBoxFocused) {
+ this.searchBoxEmpty = this.searchBox.getText().equals("");
+ }
+ final String searchText = this.searchBoxEmpty ? "" : this.searchBox.getText();
+ final FilterComparator comparator = new FilterComparator(searchText);
+
+ // initialize list with items that match the filter then sort
+ this.listModel.clear();
+ this.itemsToFilter.forEach(string -> {
+ if (string.toLowerCase().contains(searchText.toLowerCase())) {
+ this.listModel.add(string);
+ }
+ });
+
+ // applies the custom filters
+ this.listModel.removeIf(this.searchFilter.negate());
+
+ // sorts the remaining items
+ this.listModel.sort(comparator);
+ }
+}
--
cgit v1.2.3
From 54b9f00faba367e1ef325c9d0bc75a848fadb906 Mon Sep 17 00:00:00 2001
From: Adrien Hopkins
Date: Sun, 14 Apr 2019 15:39:38 -0400
Subject: The unit and prefix viewers now use SearchBoxList.
---
src/org/unitConverter/UnitsDatabase.java | 2 +
.../converterGUI/FilterComparator.java | 50 ++-
.../unitConverter/converterGUI/SearchBoxList.java | 77 +++-
.../converterGUI/UnitConverterGUI.java | 401 +++++++--------------
unitsfile.txt | 2 +-
5 files changed, 247 insertions(+), 285 deletions(-)
(limited to 'src/org/unitConverter/converterGUI/SearchBoxList.java')
diff --git a/src/org/unitConverter/UnitsDatabase.java b/src/org/unitConverter/UnitsDatabase.java
index 959c151..abe6546 100755
--- a/src/org/unitConverter/UnitsDatabase.java
+++ b/src/org/unitConverter/UnitsDatabase.java
@@ -134,6 +134,7 @@ public final class UnitsDatabase {
// the indices of the prefixes attached to the current unit
private final List prefixCoordinates = new ArrayList<>();
+ // values from the unit entry set
private final Map map;
private final List unitNames;
private final List prefixNames;
@@ -366,6 +367,7 @@ public final class UnitsDatabase {
// the indices of the prefixes attached to the current unit
private final List prefixCoordinates = new ArrayList<>();
+ // values from the unit name set
private final Map map;
private final List unitNames;
private final List prefixNames;
diff --git a/src/org/unitConverter/converterGUI/FilterComparator.java b/src/org/unitConverter/converterGUI/FilterComparator.java
index ad8d0b0..ef94602 100755
--- a/src/org/unitConverter/converterGUI/FilterComparator.java
+++ b/src/org/unitConverter/converterGUI/FilterComparator.java
@@ -41,6 +41,12 @@ public final class FilterComparator implements Comparator {
* @since v0.1.0
*/
private final Comparator comparator;
+ /**
+ * Whether or not the comparison is case-sensitive.
+ *
+ * @since 2019-04-14
+ */
+ private final boolean caseSensitive;
/**
* Creates the {@code FilterComparator}.
@@ -60,38 +66,62 @@ public final class FilterComparator implements Comparator {
* string to filter by
* @param comparator
* comparator to fall back to if all else fails, null is compareTo.
+ * @throws NullPointerException
+ * if filter is null
* @since 2019-01-15
* @since v0.1.0
+ */
+ public FilterComparator(final String filter, final Comparator comparator) {
+ this(filter, comparator, false);
+ }
+
+ /**
+ * Creates the {@code FilterComparator}.
+ *
+ * @param filter
+ * string to filter by
+ * @param comparator
+ * comparator to fall back to if all else fails, null is compareTo.
+ * @param caseSensitive
+ * whether or not the comparator is case-sensitive
* @throws NullPointerException
* if filter is null
+ * @since 2019-04-14
*/
- public FilterComparator(final String filter, final Comparator comparator) {
+ public FilterComparator(final String filter, final Comparator comparator, final boolean caseSensitive) {
this.filter = Objects.requireNonNull(filter, "filter must not be null.");
this.comparator = comparator;
+ this.caseSensitive = caseSensitive;
}
@Override
public int compare(final String arg0, final String arg1) {
- // this is case insensitive, so make them lowercase
- final String arg0lower = arg0.toLowerCase();
- final String arg1lower = arg1.toLowerCase();
+ // if this is case insensitive, make them lowercase
+ final String str0, str1;
+ if (this.caseSensitive) {
+ str0 = arg0;
+ str1 = arg1;
+ } else {
+ str0 = arg0.toLowerCase();
+ str1 = arg1.toLowerCase();
+ }
// elements that start with the filter always go first
- if (arg0lower.startsWith(this.filter) && !arg1lower.startsWith(this.filter))
+ if (str0.startsWith(this.filter) && !str1.startsWith(this.filter))
return -1;
- else if (!arg0lower.startsWith(this.filter) && arg1lower.startsWith(this.filter))
+ else if (!str0.startsWith(this.filter) && str1.startsWith(this.filter))
return 1;
// elements that contain the filter but don't start with them go next
- if (arg0lower.contains(this.filter) && !arg1lower.contains(this.filter))
+ if (str0.contains(this.filter) && !str1.contains(this.filter))
return -1;
- else if (!arg0lower.contains(this.filter) && !arg1lower.contains(this.filter))
+ else if (!str0.contains(this.filter) && !str1.contains(this.filter))
return 1;
// other elements go last
if (this.comparator == null)
- return arg0lower.compareTo(arg1lower);
+ return str0.compareTo(str1);
else
- return this.comparator.compare(arg0lower, arg1lower);
+ return this.comparator.compare(str0, str1);
}
}
diff --git a/src/org/unitConverter/converterGUI/SearchBoxList.java b/src/org/unitConverter/converterGUI/SearchBoxList.java
index 7d3b748..35cc347 100644
--- a/src/org/unitConverter/converterGUI/SearchBoxList.java
+++ b/src/org/unitConverter/converterGUI/SearchBoxList.java
@@ -22,6 +22,7 @@ import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.function.Predicate;
import javax.swing.JList;
@@ -61,16 +62,25 @@ final class SearchBoxList extends JPanel {
// event.
private boolean searchBoxFocused = false;
- private Predicate searchFilter = o -> true;
+ private Predicate customSearchFilter = o -> true;
+ private final Comparator defaultOrdering;
+ private final boolean caseSensitive;
+
+ public SearchBoxList(final Collection itemsToFilter) {
+ this(itemsToFilter, null, false);
+ }
/**
* Creates the {@code SearchBoxList}.
*
* @since 2019-04-13
*/
- public SearchBoxList(final Collection itemsToFilter) {
+ public SearchBoxList(final Collection itemsToFilter, final Comparator defaultOrdering,
+ final boolean caseSensitive) {
super(new BorderLayout(), true);
this.itemsToFilter = itemsToFilter;
+ this.defaultOrdering = defaultOrdering;
+ this.caseSensitive = caseSensitive;
// create the components
this.listModel = new DelegateListModel<>(new ArrayList<>(itemsToFilter));
@@ -108,7 +118,7 @@ final class SearchBoxList extends JPanel {
* @since 2019-04-13
*/
public void addSearchFilter(final Predicate filter) {
- this.searchFilter = this.searchFilter.and(filter);
+ this.customSearchFilter = this.customSearchFilter.and(filter);
}
/**
@@ -117,7 +127,44 @@ final class SearchBoxList extends JPanel {
* @since 2019-04-13
*/
public void clearSearchFilters() {
- this.searchFilter = o -> true;
+ this.customSearchFilter = o -> true;
+ }
+
+ /**
+ * @return this component's search box component
+ * @since 2019-04-14
+ */
+ public final JTextField getSearchBox() {
+ return this.searchBox;
+ }
+
+ /**
+ * @param searchText
+ * text to search for
+ * @return a filter that filters out that text, based on this list's case sensitive setting
+ * @since 2019-04-14
+ */
+ private Predicate getSearchFilter(final String searchText) {
+ if (this.caseSensitive)
+ return string -> string.contains(searchText);
+ else
+ return string -> string.toLowerCase().contains(searchText.toLowerCase());
+ }
+
+ /**
+ * @return this component's list component
+ * @since 2019-04-14
+ */
+ public final JList getSearchList() {
+ return this.searchItems;
+ }
+
+ /**
+ * @return index selected in item list
+ * @since 2019-04-14
+ */
+ public int getSelectedIndex() {
+ return this.searchItems.getSelectedIndex();
}
/**
@@ -135,17 +182,18 @@ final class SearchBoxList extends JPanel {
*/
public void reapplyFilter() {
final String searchText = this.searchBoxEmpty ? "" : this.searchBox.getText();
- final FilterComparator comparator = new FilterComparator(searchText);
+ final FilterComparator comparator = new FilterComparator(searchText, this.defaultOrdering, this.caseSensitive);
+ final Predicate searchFilter = this.getSearchFilter(searchText);
this.listModel.clear();
this.itemsToFilter.forEach(string -> {
- if (string.toLowerCase().contains(searchText.toLowerCase())) {
+ if (searchFilter.test(string)) {
this.listModel.add(string);
}
});
// applies the custom filters
- this.listModel.removeIf(this.searchFilter.negate());
+ this.listModel.removeIf(this.customSearchFilter.negate());
// sorts the remaining items
this.listModel.sort(comparator);
@@ -181,23 +229,32 @@ final class SearchBoxList extends JPanel {
}
}
+ /**
+ * Runs whenever the text in the search box is changed.
+ *
+ * Reapplies the search filter, and custom filters.
+ *
+ *
+ * @since 2019-04-14
+ */
private void searchBoxTextChanged() {
if (this.searchBoxFocused) {
this.searchBoxEmpty = this.searchBox.getText().equals("");
}
final String searchText = this.searchBoxEmpty ? "" : this.searchBox.getText();
- final FilterComparator comparator = new FilterComparator(searchText);
+ final FilterComparator comparator = new FilterComparator(searchText, this.defaultOrdering, this.caseSensitive);
+ final Predicate searchFilter = this.getSearchFilter(searchText);
// initialize list with items that match the filter then sort
this.listModel.clear();
this.itemsToFilter.forEach(string -> {
- if (string.toLowerCase().contains(searchText.toLowerCase())) {
+ if (searchFilter.test(string)) {
this.listModel.add(string);
}
});
// applies the custom filters
- this.listModel.removeIf(this.searchFilter.negate());
+ this.listModel.removeIf(this.customSearchFilter.negate());
// sorts the remaining items
this.listModel.sort(comparator);
diff --git a/src/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
index 34cbef9..cacc3b7 100755
--- a/src/org/unitConverter/converterGUI/UnitConverterGUI.java
+++ b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
@@ -35,16 +35,12 @@ import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
-import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
-import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
-import javax.swing.ListModel;
-import javax.swing.ListSelectionModel;
import org.unitConverter.UnitsDatabase;
import org.unitConverter.dimension.StandardDimensions;
@@ -95,20 +91,14 @@ final class UnitConverterGUI {
private final View view;
/** The units known by the program. */
- private final UnitsDatabase units;
+ private final UnitsDatabase database;
/** The names of all of the units */
private final List unitNames;
- /** The names of all of the units, but filtered */
- private final DelegateListModel unitNamesFiltered;
-
/** The names of all of the prefixes */
private final List prefixNames;
- /** The names of all of the prefixes */
- private final DelegateListModel prefixNamesFiltered;
-
/** The names of all of the dimensions */
private final List dimensionNames;
@@ -128,23 +118,23 @@ final class UnitConverterGUI {
this.view = view;
// load initial units
- this.units = new UnitsDatabase();
- Presenter.addDefaults(this.units);
+ this.database = new UnitsDatabase();
+ Presenter.addDefaults(this.database);
- this.units.loadUnitsFile(new File("unitsfile.txt"));
- this.units.loadDimensionFile(new File("dimensionfile.txt"));
+ 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
this.prefixNameComparator = (o1, o2) -> {
- if (!Presenter.this.units.containsPrefixName(o1))
+ if (!Presenter.this.database.containsPrefixName(o1))
return -1;
- else if (!Presenter.this.units.containsPrefixName(o2))
+ else if (!Presenter.this.database.containsPrefixName(o2))
return 1;
- final UnitPrefix p1 = Presenter.this.units.getPrefix(o1);
- final UnitPrefix p2 = Presenter.this.units.getPrefix(o2);
+ final UnitPrefix p1 = Presenter.this.database.getPrefix(o1);
+ final UnitPrefix p2 = Presenter.this.database.getPrefix(o2);
if (p1.getMultiplier() < p2.getMultiplier())
return -1;
@@ -154,19 +144,13 @@ final class UnitConverterGUI {
return o1.compareTo(o2);
};
- this.unitNames = new ArrayList<>(this.units.unitMapPrefixless().keySet());
+ this.unitNames = new ArrayList<>(this.database.unitMapPrefixless().keySet());
this.unitNames.sort(null); // sorts it using Comparable
- this.unitNamesFiltered = new DelegateListModel<>(new ArrayList<>(this.units.unitMapPrefixless().keySet()));
- this.unitNamesFiltered.sort(null); // sorts it using Comparable
-
- this.prefixNames = new ArrayList<>(this.units.prefixMap().keySet());
+ this.prefixNames = new ArrayList<>(this.database.prefixMap().keySet());
this.prefixNames.sort(this.prefixNameComparator); // sorts it using my comparator
- this.prefixNamesFiltered = new DelegateListModel<>(new ArrayList<>(this.units.prefixMap().keySet()));
- this.prefixNamesFiltered.sort(this.prefixNameComparator); // sorts it using my comparator
-
- this.dimensionNames = new DelegateListModel<>(new ArrayList<>(this.units.dimensionMap().keySet()));
+ 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
@@ -174,9 +158,43 @@ final class UnitConverterGUI {
// print out unit counts
System.out.printf("Successfully loaded %d units with %d unit names (%d base units).%n",
- new HashSet<>(this.units.unitMapPrefixless().values()).size(),
- this.units.unitMapPrefixless().size(),
- new HashSet<>(this.units.unitMapPrefixless().values()).stream().filter(isFullBase).count());
+ new HashSet<>(this.database.unitMapPrefixless().values()).size(),
+ this.database.unitMapPrefixless().size(),
+ new HashSet<>(this.database.unitMapPrefixless().values()).stream().filter(isFullBase).count());
+ }
+
+ /**
+ * Converts in the dimension-based converter
+ *
+ * @since 2019-04-13
+ */
+ public final void convertDimensionBased() {
+ final String fromSelection = this.view.getFromSelection();
+ if (fromSelection == null) {
+ this.view.showErrorDialog("Error", "No unit selected in From field");
+ return;
+ }
+ final String toSelection = this.view.getToSelection();
+ if (toSelection == null) {
+ 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 String input = this.view.getDimensionConverterInput();
+ if (input.equals("")) {
+ this.view.showErrorDialog("Error", "No value to convert entered.");
+ return;
+ }
+ final double beforeValue = Double.parseDouble(input);
+ final double value = to.convertFromBase(from.convertToBase(beforeValue));
+
+ final String output = this.getRoundedString(value);
+
+ this.view.setDimensionConverterOutputText(
+ String.format("%s %s = %s %s", input, fromSelection, output, toSelection));
}
/**
@@ -190,7 +208,7 @@ final class UnitConverterGUI {
* @since 2019-01-26
* @since v0.1.0
*/
- public final void convert() {
+ public final void convertExpressions() {
final String fromUnitString = this.view.getFromText();
final String toUnitString = this.view.getToText();
@@ -202,7 +220,7 @@ final class UnitConverterGUI {
// try to parse from
final Unit from;
try {
- from = this.units.getUnitFromExpression(fromUnitString);
+ from = this.database.getUnitFromExpression(fromUnitString);
} catch (final IllegalArgumentException e) {
this.view.showErrorDialog("Parse Error", "Could not recognize text in From entry: " + e.getMessage());
return;
@@ -212,11 +230,11 @@ final class UnitConverterGUI {
// try to parse to
final Unit to;
try {
- if (this.units.containsUnitName(toUnitString)) {
+ if (this.database.containsUnitName(toUnitString)) {
// if it's a unit, convert to that
- to = this.units.getUnit(toUnitString);
+ to = this.database.getUnit(toUnitString);
} else {
- to = this.units.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());
@@ -233,50 +251,35 @@ final class UnitConverterGUI {
value = to.convertFromBase(from.convertToBase(1));
// round value
- final BigDecimal bigValue = new BigDecimal(value).round(new MathContext(this.significantFigures));
- String output = bigValue.toString();
+ final String output = this.getRoundedString(value);
- // 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);
- }
- }
-
- this.view.setOutputText(String.format("%s = %s %s", fromUnitString, output, toUnitString));
+ this.view.setExpressionConverterOutputText(
+ String.format("%s = %s %s", fromUnitString, output, toUnitString));
}
/**
- * Converts in the dimension-based converter
- *
+ * @return a list of all of the unit dimensions
* @since 2019-04-13
*/
- public final void convertDimensionBased() {
- final String fromSelection = this.view.getFromSelection();
- if (fromSelection == null) {
- this.view.showErrorDialog("Error", "No unit selected in From field");
- return;
- }
- final String toSelection = this.view.getToSelection();
- if (toSelection == null) {
- this.view.showErrorDialog("Error", "No unit selected in To field");
- return;
- }
-
- final Unit from = this.units.getUnit(fromSelection);
- final Unit to = this.units.getUnit(toSelection);
+ public final List dimensionNameList() {
+ return this.dimensionNames;
+ }
- final String input = this.view.getDimensionBasedInput();
- if (input.equals("")) {
- this.view.showErrorDialog("Error", "No value to convert entered.");
- return;
- }
- final double beforeValue = Double.parseDouble(input);
- final double value = to.convertFromBase(from.convertToBase(beforeValue));
+ /**
+ * @return a comparator to compare prefix names
+ * @since 2019-04-14
+ */
+ public final Comparator getPrefixNameComparator() {
+ return this.prefixNameComparator;
+ }
+ /**
+ * @param value
+ * value to round
+ * @return string of that value rounded to {@code significantDigits} significant digits.
+ * @since 2019-04-14
+ */
+ private final String getRoundedString(final double value) {
// round value
final BigDecimal bigValue = new BigDecimal(value).round(new MathContext(this.significantFigures));
String output = bigValue.toString();
@@ -291,86 +294,15 @@ final class UnitConverterGUI {
}
}
- this.view.setDimensionBasedOutputText(
- String.format("%s %s = %s %s", input, fromSelection, output, toSelection));
- }
-
- /**
- * @return a list of all of the unit dimensions
- * @since 2019-04-13
- */
- public final List dimensionNameList() {
- return this.dimensionNames;
- }
-
- /**
- * Filters the filtered model for units
- *
- * @param filter
- * filter to use
- * @since 2019-01-15
- * @since v0.1.0
- */
- private final void filterFilteredPrefixModel(final Predicate filter) {
- this.prefixNamesFiltered.clear();
- for (final String prefixName : this.prefixNames) {
- if (filter.test(prefixName)) {
- this.prefixNamesFiltered.add(prefixName);
- }
- }
- }
-
- /**
- * Filters the filtered model for units
- *
- * @param filter
- * filter to use
- * @since 2019-01-15
- * @since v0.1.0
- */
- private final void filterFilteredUnitModel(final Predicate filter) {
- this.unitNamesFiltered.clear();
- for (final String unitName : this.unitNames) {
- if (filter.test(unitName)) {
- this.unitNamesFiltered.add(unitName);
- }
- }
+ return output;
}
/**
- * @return a list model of all of the unit keys
- * @since 2019-01-14
- * @since v0.1.0
- */
- public final ListModel keyListModel() {
- return this.unitNamesFiltered;
- }
-
- /**
- * Runs whenever the prefix filter is changed.
- *
- * Filters the prefix list then sorts it using a {@code FilterComparator}.
- *
- *
- * @since 2019-01-15
- * @since v0.1.0
- */
- public final void prefixFilterUpdated() {
- final String filter = this.view.getPrefixFilterText();
- if (filter.equals("")) {
- this.filterFilteredPrefixModel(t -> true);
- } else {
- this.filterFilteredPrefixModel(t -> t.contains(filter));
- }
- this.prefixNamesFiltered.sort(new FilterComparator(filter));
- }
-
- /**
- * @return a list model of all of the prefix names
- * @since 2019-01-15
+ * @return a set of all prefix names in the database
+ * @since 2019-04-14
*/
- public final ListModel prefixNameListModel() {
- return this.prefixNamesFiltered;
+ public final Set prefixNameSet() {
+ return this.database.prefixMap().keySet();
}
/**
@@ -383,12 +315,11 @@ final class UnitConverterGUI {
* @since v0.1.0
*/
public final void prefixSelected() {
- final int index = this.view.getPrefixListSelection();
- if (index == -1)
+ final String prefixName = this.view.getPrefixViewerSelection();
+ if (prefixName == null)
return;
else {
- final String prefixName = this.prefixNamesFiltered.get(index);
- final UnitPrefix prefix = this.units.getPrefix(prefixName);
+ final UnitPrefix prefix = this.database.getPrefix(prefixName);
this.view.setPrefixTextBoxText(String.format("%s%nMultiplier: %s", prefixName, prefix.getMultiplier()));
}
@@ -403,25 +334,6 @@ final class UnitConverterGUI {
this.significantFigures = significantFigures;
}
- /**
- * Runs whenever the unit filter is changed.
- *
- * Filters the unit list then sorts it using a {@code FilterComparator}.
- *
- *
- * @since 2019-01-15
- * @since v0.1.0
- */
- public final void unitFilterUpdated() {
- final String filter = this.view.getUnitFilterText();
- if (filter.equals("")) {
- this.filterFilteredUnitModel(t -> true);
- } else {
- this.filterFilteredUnitModel(t -> t.contains(filter));
- }
- this.unitNamesFiltered.sort(new FilterComparator(filter));
- }
-
/**
* Returns true if and only if the unit represented by {@code unitName} has the dimension represented by
* {@code dimensionName}.
@@ -433,9 +345,9 @@ final class UnitConverterGUI {
* @return whether unit has dimenision
* @since 2019-04-13
*/
- public boolean unitMatchesDimension(final String unitName, final String dimensionName) {
- final Unit unit = this.units.getUnit(unitName);
- final UnitDimension dimension = this.units.getDimension(dimensionName);
+ public final boolean unitMatchesDimension(final String unitName, final String dimensionName) {
+ final Unit unit = this.database.getUnit(unitName);
+ final UnitDimension dimension = this.database.getDimension(dimensionName);
return unit.getDimension().equals(dimension);
}
@@ -448,20 +360,23 @@ final class UnitConverterGUI {
* @since 2019-01-15
* @since v0.1.0
*/
- public void unitNameSelected() {
- final int index = this.view.getUnitListSelection();
- if (index == -1)
+ public final void unitNameSelected() {
+ final String unitName = this.view.getUnitViewerSelection();
+ if (unitName == null)
return;
else {
- final String unitName = this.unitNamesFiltered.get(index);
- final Unit unit = this.units.getUnit(unitName);
+ 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
+ */
public final Set unitNameSet() {
- return this.units.unitMapPrefixless().keySet();
+ return this.database.unitMapPrefixless().keySet();
}
}
@@ -471,26 +386,17 @@ final class UnitConverterGUI {
/** The view's associated presenter. */
private final Presenter presenter;
- /** The list of unit names in the unit viewer */
- private final JList unitNameList;
- /** The list of prefix names in the prefix viewer */
- private final JList prefixNameList;
- /** The unit search box in the unit viewer */
- private final JTextField unitFilterEntry;
- /** The text box for unit data in the unit viewer */
- private final JTextArea unitTextBox;
- /** The prefix search box in the prefix viewer */
- private final JTextField prefixFilterEntry;
- /** The text box for prefix data in the prefix viewer */
- private final JTextArea prefixTextBox;
+ // DIMENSION-BASED CONVERTER
+ /** The panel for inputting values in the dimension-based converter */
+ private final JTextField valueInput;
/** The panel for "From" in the dimension-based converter */
private final SearchBoxList fromSearch;
/** The panel for "To" in the dimension-based converter */
private final SearchBoxList toSearch;
- /** The panel for inputting values in the dimension-based converter */
- private final JTextField valueInput;
/** 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;
/** The "To" entry in the conversion panel */
@@ -498,6 +404,16 @@ final class UnitConverterGUI {
/** 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;
+ /** The searchable list of prefix names in the prefix viewer */
+ private final SearchBoxList prefixNameList;
+ /** The text box for unit data in the unit viewer */
+ private final JTextArea unitTextBox;
+ /** The text box for prefix data in the prefix viewer */
+ private final JTextArea prefixTextBox;
+
/**
* Creates the {@code View}.
*
@@ -510,11 +426,10 @@ final class UnitConverterGUI {
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// create the components
- this.unitNameList = new JList<>(this.presenter.keyListModel());
- this.prefixNameList = new JList<>(this.presenter.prefixNameListModel());
- this.unitFilterEntry = new JTextField();
+ this.unitNameList = new SearchBoxList(this.presenter.unitNameSet());
+ this.prefixNameList = new SearchBoxList(this.presenter.prefixNameSet(),
+ this.presenter.getPrefixNameComparator(), true);
this.unitTextBox = new JTextArea();
- this.prefixFilterEntry = new JTextField();
this.prefixTextBox = new JTextArea();
this.fromSearch = new SearchBoxList(this.presenter.unitNameSet());
this.toSearch = new SearchBoxList(this.presenter.unitNameSet());
@@ -534,7 +449,7 @@ final class UnitConverterGUI {
* @return value in dimension-based converter
* @since 2019-04-13
*/
- public String getDimensionBasedInput() {
+ public String getDimensionConverterInput() {
return this.valueInput.getText();
}
@@ -556,21 +471,12 @@ final class UnitConverterGUI {
}
/**
- * @return text in prefix filter
+ * @return index of selected prefix in prefix viewer
* @since 2019-01-15
* @since v0.1.0
*/
- public String getPrefixFilterText() {
- return this.prefixFilterEntry.getText();
- }
-
- /**
- * @return index of selected prefix
- * @since 2019-01-15
- * @since v0.1.0
- */
- public int getPrefixListSelection() {
- return this.prefixNameList.getSelectedIndex();
+ public String getPrefixViewerSelection() {
+ return this.prefixNameList.getSelectedValue();
}
/**
@@ -591,20 +497,12 @@ final class UnitConverterGUI {
}
/**
- * @return text in unit filter
- * @see javax.swing.text.JTextComponent#getText()
- */
- public String getUnitFilterText() {
- return this.unitFilterEntry.getText();
- }
-
- /**
- * @return index of selected unit
+ * @return index of selected unit in unit viewer
* @since 2019-01-15
* @since v0.1.0
*/
- public int getUnitListSelection() {
- return this.unitNameList.getSelectedIndex();
+ public String getUnitViewerSelection() {
+ return this.unitNameList.getSelectedValue();
}
/**
@@ -764,7 +662,7 @@ final class UnitConverterGUI {
final JButton convertButton = new JButton("Convert!");
convertExpressionPanel.add(convertButton);
- convertButton.addActionListener(e -> this.presenter.convert());
+ convertButton.addActionListener(e -> this.presenter.convertExpressions());
}
{ // output of conversion
@@ -808,24 +706,11 @@ final class UnitConverterGUI {
unitLookupPanel.setLayout(new GridLayout());
- { // panel for listing and searching
- final JPanel listPanel = new JPanel();
- unitLookupPanel.add(listPanel);
-
- listPanel.setLayout(new BorderLayout());
+ { // search panel
+ unitLookupPanel.add(this.unitNameList);
- { // unit search box
- listPanel.add(this.unitFilterEntry, BorderLayout.PAGE_START);
- this.unitFilterEntry.addCaretListener(e -> this.presenter.unitFilterUpdated());
- }
-
- { // a list of units
- listPanel.add(new JScrollPane(this.unitNameList), BorderLayout.CENTER);
- this.unitNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // temp
- this.unitNameList.addListSelectionListener(e -> {
- this.presenter.unitNameSelected();
- });
- }
+ this.unitNameList.getSearchList()
+ .addListSelectionListener(e -> this.presenter.unitNameSelected());
}
{ // the text box for unit's toString
@@ -842,23 +727,10 @@ final class UnitConverterGUI {
prefixLookupPanel.setLayout(new GridLayout(1, 2));
{ // panel for listing and seaching
- final JPanel prefixListPanel = new JPanel();
- prefixLookupPanel.add(prefixListPanel);
-
- prefixListPanel.setLayout(new BorderLayout());
-
- { // prefix search box
- prefixListPanel.add(this.prefixFilterEntry, BorderLayout.PAGE_START);
- this.prefixFilterEntry.addCaretListener(e -> this.presenter.prefixFilterUpdated());
- }
+ prefixLookupPanel.add(this.prefixNameList);
- { // a list of prefixes
- prefixListPanel.add(new JScrollPane(this.prefixNameList), BorderLayout.CENTER);
- this.prefixNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // temp
- this.prefixNameList.addListSelectionListener(e -> {
- this.presenter.prefixSelected();
- });
- }
+ this.prefixNameList.getSearchList()
+ .addListSelectionListener(e -> this.presenter.prefixSelected());
}
{ // the text box for prefix's toString
@@ -876,7 +748,7 @@ final class UnitConverterGUI {
* text to set
* @since 2019-04-13
*/
- public void setDimensionBasedOutputText(final String text) {
+ public void setDimensionConverterOutputText(final String text) {
this.dimensionBasedOutput.setText(text);
}
@@ -888,12 +760,12 @@ final class UnitConverterGUI {
* @since 2019-01-15
* @since v0.1.0
*/
- public void setOutputText(final String text) {
+ public void setExpressionConverterOutputText(final String text) {
this.output.setText(text);
}
/**
- * Sets the text of the prefix text box.
+ * Sets the text of the prefix text box in the prefix viewer.
*
* @param text
* text to set
@@ -905,14 +777,15 @@ final class UnitConverterGUI {
}
/**
- * Sets the text of the unit text box.
+ * Sets the text of the unit text box in the unit viewer.
*
- * @param t
+ * @param text
* text to set
- * @see javax.swing.text.JTextComponent#setText(java.lang.String)
+ * @since 2019-01-15
+ * @since v0.1.0
*/
- public void setUnitTextBoxText(final String t) {
- this.unitTextBox.setText(t);
+ public void setUnitTextBoxText(final String text) {
+ this.unitTextBox.setText(text);
}
/**
diff --git a/unitsfile.txt b/unitsfile.txt
index 553fd5e..bda9b81 100755
--- a/unitsfile.txt
+++ b/unitsfile.txt
@@ -138,7 +138,7 @@ radian m / m
rad radian
steradian m^2 / m^2
sr steradian
-degree 360 / tau * radian
+degree tau / 360 radian
deg degree
° degree
--
cgit v1.2.3
From 73d305684d3549d17ebd95a5fdb7d366849db226 Mon Sep 17 00:00:00 2001
From: Adrien Hopkins
Date: Sun, 14 Apr 2019 17:29:50 -0400
Subject: Added @since tags to all classes and methods from v0.2.0
---
src/org/unitConverter/UnitsDatabase.java | 47 +++++++++++++++++++++-
.../converterGUI/FilterComparator.java | 2 +
.../converterGUI/MutablePredicate.java | 10 +++++
.../unitConverter/converterGUI/SearchBoxList.java | 35 ++++++++++++++++
.../converterGUI/UnitConverterGUI.java | 13 ++++++
.../unitConverter/converterGUI/package-info.java | 1 +
src/org/unitConverter/dimension/package-info.java | 1 +
src/org/unitConverter/math/DecimalComparison.java | 7 ++++
src/org/unitConverter/math/ExpressionParser.java | 46 ++++++++++++++++++++-
src/org/unitConverter/unit/AbstractUnit.java | 1 -
src/org/unitConverter/unit/BaseUnit.java | 1 +
src/org/unitConverter/unit/DefaultUnitPrefix.java | 1 +
src/org/unitConverter/unit/LinearUnit.java | 3 ++
src/org/unitConverter/unit/UnitPrefix.java | 3 ++
src/org/unitConverter/unit/package-info.java | 1 +
src/test/java/ExpressionParserTest.java | 1 +
src/test/java/UnitTest.java | 1 +
src/test/java/UnitsDatabaseTest.java | 7 ++++
src/test/java/package-info.java | 1 +
19 files changed, 179 insertions(+), 3 deletions(-)
(limited to 'src/org/unitConverter/converterGUI/SearchBoxList.java')
diff --git a/src/org/unitConverter/UnitsDatabase.java b/src/org/unitConverter/UnitsDatabase.java
index abe6546..e5d2f67 100755
--- a/src/org/unitConverter/UnitsDatabase.java
+++ b/src/org/unitConverter/UnitsDatabase.java
@@ -72,9 +72,15 @@ public final class UnitsDatabase {
* "A", inputting "ABC" will return the unit "C" with the prefix "AB", not "BC" with the prefix "A".
*
*
+ *
+ * This map is infinite in size if there is at least one unit and at least one prefix. If it is infinite, some
+ * operations that only work with finite collections, like converting name/entry sets to arrays, will throw an
+ * {@code UnsupportedOperationException}.
+ *
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitMap implements Map {
/**
@@ -82,6 +88,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntrySet extends AbstractSet> {
/**
@@ -89,6 +96,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntry implements Entry {
private final String key;
@@ -98,8 +106,11 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitEntry}.
*
* @param key
+ * key
* @param value
+ * value
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitEntry(final String key, final Unit value) {
this.key = key;
@@ -127,6 +138,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntryIterator implements Iterator> {
// position in the unit list
@@ -143,6 +155,7 @@ public final class UnitsDatabase {
* Creates the {@code UnitsDatabase.PrefixedUnitMap.PrefixedUnitNameSet.PrefixedUnitNameIterator}.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitEntryIterator(final PrefixedUnitEntrySet set) {
this.map = set.map;
@@ -153,6 +166,7 @@ public final class UnitsDatabase {
/**
* @return current unit name
* @since 2019-04-14
+ * @since v0.2.0
*/
private String getCurrentUnitName() {
final StringBuilder unitName = new StringBuilder();
@@ -180,6 +194,7 @@ public final class UnitsDatabase {
* Changes this iterator's position to the next available one.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private void incrementPosition() {
this.unitNamePosition++;
@@ -239,7 +254,9 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitNameSet}.
*
* @param map
+ * map that created this set
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitEntrySet(final PrefixedUnitMap map) {
this.map = map;
@@ -353,6 +370,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitNameSet extends AbstractSet {
/**
@@ -360,6 +378,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitNameIterator implements Iterator {
// position in the unit list
@@ -376,6 +395,7 @@ public final class UnitsDatabase {
* Creates the {@code UnitsDatabase.PrefixedUnitMap.PrefixedUnitNameSet.PrefixedUnitNameIterator}.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitNameIterator(final PrefixedUnitNameSet set) {
this.map = set.map;
@@ -386,6 +406,7 @@ public final class UnitsDatabase {
/**
* @return current unit name
* @since 2019-04-14
+ * @since v0.2.0
*/
private String getCurrentUnitName() {
final StringBuilder unitName = new StringBuilder();
@@ -413,6 +434,7 @@ public final class UnitsDatabase {
* Changes this iterator's position to the next available one.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private void incrementPosition() {
this.unitNamePosition++;
@@ -472,7 +494,9 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitNameSet}.
*
* @param map
+ * map that created this set
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitNameSet(final PrefixedUnitMap map) {
this.map = map;
@@ -567,13 +591,13 @@ public final class UnitsDatabase {
// infinite set
throw new UnsupportedOperationException("Cannot make an infinite set into an array.");
}
-
}
/**
* The units stored in this collection, without prefixes.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map units;
@@ -581,6 +605,7 @@ public final class UnitsDatabase {
* The available prefixes for use.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map prefixes;
@@ -593,8 +618,11 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitMap}.
*
* @param units
+ * map mapping unit names to units
* @param prefixes
+ * map mapping prefix names to prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitMap(final Map units, final Map prefixes) {
// I am making unmodifiable maps to ensure I don't accidentally make changes.
@@ -804,6 +832,7 @@ public final class UnitsDatabase {
* exponent
* @return result
* @since 2019-04-10
+ * @since v0.2.0
*/
private static final LinearUnit exponentiateUnits(final LinearUnit base, final LinearUnit exponentUnit) {
// exponent function - first check if o2 is a number,
@@ -841,6 +870,7 @@ public final class UnitsDatabase {
* The dimensions in this system.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map dimensions;
@@ -848,6 +878,7 @@ public final class UnitsDatabase {
* A map mapping strings to units (including prefixes)
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map units;
@@ -855,6 +886,7 @@ public final class UnitsDatabase {
* A parser that can parse unit expressions.
*
* @since 2019-03-22
+ * @since v0.2.0
*/
private final ExpressionParser unitExpressionParser = new ExpressionParser.Builder<>(
this::getLinearUnit).addBinaryOperator("+", (o1, o2) -> o1.plus(o2), 0)
@@ -867,6 +899,7 @@ public final class UnitsDatabase {
* A parser that can parse unit prefix expressions
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final ExpressionParser prefixExpressionParser = new ExpressionParser.Builder<>(this::getPrefix)
.addBinaryOperator("*", (o1, o2) -> o1.times(o2), 0).addSpaceFunction("*")
@@ -877,6 +910,7 @@ public final class UnitsDatabase {
* A parser that can parse unit dimension expressions.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final ExpressionParser unitDimensionParser = new ExpressionParser.Builder<>(
this::getDimension).addBinaryOperator("*", (o1, o2) -> o1.times(o2), 0).addSpaceFunction("*")
@@ -905,6 +939,7 @@ public final class UnitsDatabase {
* @throws NullPointerException
* if name or dimension is null
* @since 2019-03-14
+ * @since v0.2.0
*/
public void addDimension(final String name, final UnitDimension dimension) {
this.dimensions.put(Objects.requireNonNull(name, "name must not be null."),
@@ -919,6 +954,7 @@ public final class UnitsDatabase {
* @param lineCounter
* number of line, for error messages
* @since 2019-04-10
+ * @since v0.2.0
*/
private void addDimensionFromLine(final String line, final long lineCounter) {
// ignore lines that start with a # sign - they're comments
@@ -1004,6 +1040,7 @@ public final class UnitsDatabase {
* @param lineCounter
* number of line, for error messages
* @since 2019-04-10
+ * @since v0.2.0
*/
private void addUnitOrPrefixFromLine(final String line, final long lineCounter) {
// ignore lines that start with a # sign - they're comments
@@ -1064,6 +1101,7 @@ public final class UnitsDatabase {
* name to test
* @return if database contains name
* @since 2019-03-14
+ * @since v0.2.0
*/
public boolean containsDimensionName(final String name) {
return this.dimensions.containsKey(name);
@@ -1098,6 +1136,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping dimension names to dimensions
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map dimensionMap() {
return Collections.unmodifiableMap(this.dimensions);
@@ -1114,6 +1153,7 @@ public final class UnitsDatabase {
* dimension's name
* @return dimension
* @since 2019-03-14
+ * @since v0.2.0
*/
public UnitDimension getDimension(final String name) {
Objects.requireNonNull(name, "name must not be null.");
@@ -1152,6 +1192,7 @@ public final class UnitsDatabase {
* @throws NullPointerException
* if expression is null
* @since 2019-04-13
+ * @since v0.2.0
*/
public UnitDimension getDimensionFromExpression(final String expression) {
Objects.requireNonNull(expression, "expression must not be null.");
@@ -1180,6 +1221,7 @@ public final class UnitsDatabase {
* unit's name
* @return unit
* @since 2019-03-22
+ * @since v0.2.0
*/
private LinearUnit getLinearUnit(final String name) {
// see if I am using a function-unit like tempC(100)
@@ -1411,6 +1453,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping prefix names to prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map prefixMap() {
return Collections.unmodifiableMap(this.prefixes);
@@ -1419,6 +1462,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping unit names to units, including prefixed names
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map unitMap() {
return this.units; // PrefixedUnitMap is immutable so I don't need to make an unmodifiable map.
@@ -1427,6 +1471,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping unit names to units, ignoring prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map unitMapPrefixless() {
return Collections.unmodifiableMap(this.prefixlessUnits);
diff --git a/src/org/unitConverter/converterGUI/FilterComparator.java b/src/org/unitConverter/converterGUI/FilterComparator.java
index 2d0e7f9..7b17bfc 100755
--- a/src/org/unitConverter/converterGUI/FilterComparator.java
+++ b/src/org/unitConverter/converterGUI/FilterComparator.java
@@ -45,6 +45,7 @@ final class FilterComparator implements Comparator {
* Whether or not the comparison is case-sensitive.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private final boolean caseSensitive;
@@ -87,6 +88,7 @@ final class FilterComparator implements Comparator {
* @throws NullPointerException
* if filter is null
* @since 2019-04-14
+ * @since v0.2.0
*/
public FilterComparator(final String filter, final Comparator comparator, final boolean caseSensitive) {
this.filter = Objects.requireNonNull(filter, "filter must not be null.");
diff --git a/src/org/unitConverter/converterGUI/MutablePredicate.java b/src/org/unitConverter/converterGUI/MutablePredicate.java
index 157903c..e15b3cd 100644
--- a/src/org/unitConverter/converterGUI/MutablePredicate.java
+++ b/src/org/unitConverter/converterGUI/MutablePredicate.java
@@ -23,14 +23,22 @@ import java.util.function.Predicate;
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
final class MutablePredicate implements Predicate {
+ /**
+ * The predicate stored in this {@code MutablePredicate}
+ *
+ * @since 2019-04-13
+ * @since v0.2.0
+ */
private Predicate predicate;
/**
* Creates the {@code MutablePredicate}.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
public MutablePredicate(final Predicate predicate) {
this.predicate = predicate;
@@ -39,6 +47,7 @@ final class MutablePredicate implements Predicate {
/**
* @return predicate
* @since 2019-04-13
+ * @since v0.2.0
*/
public final Predicate getPredicate() {
return this.predicate;
@@ -48,6 +57,7 @@ final class MutablePredicate implements Predicate {
* @param predicate
* new value of predicate
* @since 2019-04-13
+ * @since v0.2.0
*/
public final void setPredicate(final Predicate predicate) {
this.predicate = predicate;
diff --git a/src/org/unitConverter/converterGUI/SearchBoxList.java b/src/org/unitConverter/converterGUI/SearchBoxList.java
index 35cc347..1995466 100644
--- a/src/org/unitConverter/converterGUI/SearchBoxList.java
+++ b/src/org/unitConverter/converterGUI/SearchBoxList.java
@@ -33,20 +33,29 @@ import javax.swing.JTextField;
/**
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
final class SearchBoxList extends JPanel {
/**
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final long serialVersionUID = 6226930279415983433L;
/**
* The text to place in an empty search box.
+ *
+ * @since 2019-04-13
+ * @since v0.2.0
*/
private static final String EMPTY_TEXT = "Search...";
+
/**
* The color to use for an empty foreground.
+ *
+ * @since 2019-04-13
+ * @since v0.2.0
*/
private static final Color EMPTY_FOREGROUND = new Color(192, 192, 192);
@@ -66,6 +75,13 @@ final class SearchBoxList extends JPanel {
private final Comparator defaultOrdering;
private final boolean caseSensitive;
+ /**
+ * Creates the {@code SearchBoxList}.
+ *
+ * @param itemsToFilter
+ * items to put in the list
+ * @since 2019-04-14
+ */
public SearchBoxList(final Collection itemsToFilter) {
this(itemsToFilter, null, false);
}
@@ -73,7 +89,15 @@ final class SearchBoxList extends JPanel {
/**
* Creates the {@code SearchBoxList}.
*
+ * @param itemsToFilter
+ * items to put in the list
+ * @param defaultOrdering
+ * default ordering of items after filtration (null=Comparable)
+ * @param caseSensitive
+ * whether or not the filtration is case-sensitive
+ *
* @since 2019-04-13
+ * @since v0.2.0
*/
public SearchBoxList(final Collection itemsToFilter, final Comparator defaultOrdering,
final boolean caseSensitive) {
@@ -116,6 +140,7 @@ final class SearchBoxList extends JPanel {
* @param filter
* filter to add.
* @since 2019-04-13
+ * @since v0.2.0
*/
public void addSearchFilter(final Predicate filter) {
this.customSearchFilter = this.customSearchFilter.and(filter);
@@ -125,6 +150,7 @@ final class SearchBoxList extends JPanel {
* Resets the search filter.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
public void clearSearchFilters() {
this.customSearchFilter = o -> true;
@@ -133,6 +159,7 @@ final class SearchBoxList extends JPanel {
/**
* @return this component's search box component
* @since 2019-04-14
+ * @since v0.2.0
*/
public final JTextField getSearchBox() {
return this.searchBox;
@@ -143,6 +170,7 @@ final class SearchBoxList extends JPanel {
* text to search for
* @return a filter that filters out that text, based on this list's case sensitive setting
* @since 2019-04-14
+ * @since v0.2.0
*/
private Predicate getSearchFilter(final String searchText) {
if (this.caseSensitive)
@@ -154,6 +182,7 @@ final class SearchBoxList extends JPanel {
/**
* @return this component's list component
* @since 2019-04-14
+ * @since v0.2.0
*/
public final JList getSearchList() {
return this.searchItems;
@@ -162,6 +191,7 @@ final class SearchBoxList extends JPanel {
/**
* @return index selected in item list
* @since 2019-04-14
+ * @since v0.2.0
*/
public int getSelectedIndex() {
return this.searchItems.getSelectedIndex();
@@ -170,6 +200,7 @@ final class SearchBoxList extends JPanel {
/**
* @return value selected in item list
* @since 2019-04-13
+ * @since v0.2.0
*/
public String getSelectedValue() {
return this.searchItems.getSelectedValue();
@@ -179,6 +210,7 @@ final class SearchBoxList extends JPanel {
* Re-applies the filters.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
public void reapplyFilter() {
final String searchText = this.searchBoxEmpty ? "" : this.searchBox.getText();
@@ -205,6 +237,7 @@ final class SearchBoxList extends JPanel {
* @param e
* focus event
* @since 2019-04-13
+ * @since v0.2.0
*/
private void searchBoxFocusGained(final FocusEvent e) {
this.searchBoxFocused = true;
@@ -220,6 +253,7 @@ final class SearchBoxList extends JPanel {
* @param e
* focus event
* @since 2019-04-13
+ * @since v0.2.0
*/
private void searchBoxFocusLost(final FocusEvent e) {
this.searchBoxFocused = false;
@@ -236,6 +270,7 @@ final class SearchBoxList extends JPanel {
*
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private void searchBoxTextChanged() {
if (this.searchBoxFocused) {
diff --git a/src/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
index 1f59e3a..e258c6f 100755
--- a/src/org/unitConverter/converterGUI/UnitConverterGUI.java
+++ b/src/org/unitConverter/converterGUI/UnitConverterGUI.java
@@ -64,6 +64,7 @@ final class UnitConverterGUI {
* @param database
* database to add to
* @since 2019-04-14
+ * @since v0.2.0
*/
private static void addDefaults(final UnitsDatabase database) {
database.addUnit("metre", SI.METRE);
@@ -167,6 +168,7 @@ final class UnitConverterGUI {
* Converts in the dimension-based converter
*
* @since 2019-04-13
+ * @since v0.2.0
*/
public final void convertDimensionBased() {
final String fromSelection = this.view.getFromSelection();
@@ -264,6 +266,7 @@ final class UnitConverterGUI {
/**
* @return a list of all of the unit dimensions
* @since 2019-04-13
+ * @since v0.2.0
*/
public final List dimensionNameList() {
return this.dimensionNames;
@@ -272,6 +275,7 @@ final class UnitConverterGUI {
/**
* @return a comparator to compare prefix names
* @since 2019-04-14
+ * @since v0.2.0
*/
public final Comparator getPrefixNameComparator() {
return this.prefixNameComparator;
@@ -282,6 +286,7 @@ final class UnitConverterGUI {
* value to round
* @return string of that value rounded to {@code significantDigits} significant digits.
* @since 2019-04-14
+ * @since v0.2.0
*/
private final String getRoundedString(final double value) {
// round value
@@ -304,6 +309,7 @@ final class UnitConverterGUI {
/**
* @return a set of all prefix names in the database
* @since 2019-04-14
+ * @since v0.2.0
*/
public final Set prefixNameSet() {
return this.database.prefixMap().keySet();
@@ -333,6 +339,7 @@ final class UnitConverterGUI {
* @param significantFigures
* new value of significantFigures
* @since 2019-01-15
+ * @since v0.1.0
*/
public final void setSignificantFigures(final int significantFigures) {
this.significantFigures = significantFigures;
@@ -348,6 +355,7 @@ final class UnitConverterGUI {
* name of dimension to test
* @return whether unit has dimenision
* @since 2019-04-13
+ * @since v0.2.0
*/
public final boolean unitMatchesDimension(final String unitName, final String dimensionName) {
final Unit unit = this.database.getUnit(unitName);
@@ -378,6 +386,7 @@ final class UnitConverterGUI {
/**
* @return a set of all of the unit names
* @since 2019-04-14
+ * @since v0.2.0
*/
public final Set unitNameSet() {
return this.database.unitMapPrefixless().keySet();
@@ -452,6 +461,7 @@ final class UnitConverterGUI {
/**
* @return value in dimension-based converter
* @since 2019-04-13
+ * @since v0.2.0
*/
public String getDimensionConverterInput() {
return this.valueInput.getText();
@@ -460,6 +470,7 @@ final class UnitConverterGUI {
/**
* @return selection in "From" selector in dimension-based converter
* @since 2019-04-13
+ * @since v0.2.0
*/
public String getFromSelection() {
return this.fromSearch.getSelectedValue();
@@ -486,6 +497,7 @@ final class UnitConverterGUI {
/**
* @return selection in "To" selector in dimension-based converter
* @since 2019-04-13
+ * @since v0.2.0
*/
public String getToSelection() {
return this.toSearch.getSelectedValue();
@@ -752,6 +764,7 @@ final class UnitConverterGUI {
* @param text
* text to set
* @since 2019-04-13
+ * @since v0.2.0
*/
public void setDimensionConverterOutputText(final String text) {
this.dimensionBasedOutput.setText(text);
diff --git a/src/org/unitConverter/converterGUI/package-info.java b/src/org/unitConverter/converterGUI/package-info.java
index d899f97..1555291 100644
--- a/src/org/unitConverter/converterGUI/package-info.java
+++ b/src/org/unitConverter/converterGUI/package-info.java
@@ -19,5 +19,6 @@
*
* @author Adrien Hopkins
* @since 2019-01-25
+ * @since v0.2.0
*/
package org.unitConverter.converterGUI;
\ No newline at end of file
diff --git a/src/org/unitConverter/dimension/package-info.java b/src/org/unitConverter/dimension/package-info.java
index db363df..8cb26b1 100755
--- a/src/org/unitConverter/dimension/package-info.java
+++ b/src/org/unitConverter/dimension/package-info.java
@@ -19,5 +19,6 @@
*
* @author Adrien Hopkins
* @since 2018-12-22
+ * @since v0.1.0
*/
package org.unitConverter.dimension;
\ No newline at end of file
diff --git a/src/org/unitConverter/math/DecimalComparison.java b/src/org/unitConverter/math/DecimalComparison.java
index e6fb733..7cdbe5b 100644
--- a/src/org/unitConverter/math/DecimalComparison.java
+++ b/src/org/unitConverter/math/DecimalComparison.java
@@ -21,6 +21,7 @@ package org.unitConverter.math;
*
* @author Adrien Hopkins
* @since 2019-03-18
+ * @since v0.2.0
*/
public final class DecimalComparison {
/**
@@ -28,6 +29,7 @@ public final class DecimalComparison {
* they are considered equal.
*
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final double DOUBLE_EPSILON = 1.0e-15;
@@ -36,6 +38,7 @@ public final class DecimalComparison {
* they are considered equal.
*
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final float FLOAT_EPSILON = 1.0e-6f;
@@ -48,6 +51,7 @@ public final class DecimalComparison {
* second value to test
* @return whether they are equal
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final boolean equals(final double a, final double b) {
return DecimalComparison.equals(a, b, DOUBLE_EPSILON);
@@ -64,6 +68,7 @@ public final class DecimalComparison {
* allowed difference
* @return whether they are equal
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final boolean equals(final double a, final double b, final double epsilon) {
return Math.abs(a - b) <= epsilon * Math.max(Math.abs(a), Math.abs(b));
@@ -78,6 +83,7 @@ public final class DecimalComparison {
* second value to test
* @return whether they are equal
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final boolean equals(final float a, final float b) {
return DecimalComparison.equals(a, b, FLOAT_EPSILON);
@@ -94,6 +100,7 @@ public final class DecimalComparison {
* allowed difference
* @return whether they are equal
* @since 2019-03-18
+ * @since v0.2.0
*/
public static final boolean equals(final float a, final float b, final float epsilon) {
return Math.abs(a - b) <= epsilon * Math.max(Math.abs(a), Math.abs(b));
diff --git a/src/org/unitConverter/math/ExpressionParser.java b/src/org/unitConverter/math/ExpressionParser.java
index d01afaa..b2261ed 100644
--- a/src/org/unitConverter/math/ExpressionParser.java
+++ b/src/org/unitConverter/math/ExpressionParser.java
@@ -35,8 +35,8 @@ import java.util.function.UnaryOperator;
* @param
* type of object that exists in parsed expressions
* @since 2019-03-14
+ * @since v0.2.0
*/
-// TODO: possibly make this class non-final?
public final class ExpressionParser {
/**
* A builder that can create {@code ExpressionParser} instances.
@@ -45,6 +45,7 @@ public final class ExpressionParser {
* @param
* type of object that exists in parsed expressions
* @since 2019-03-17
+ * @since v0.2.0
*/
public static final class Builder {
/**
@@ -52,6 +53,7 @@ public final class ExpressionParser {
* would use {@code Integer::parseInt}.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Function objectObtainer;
@@ -59,6 +61,7 @@ public final class ExpressionParser {
* The function of the space as an operator (like 3 x y)
*
* @since 2019-03-22
+ * @since v0.2.0
*/
private String spaceFunction = null;
@@ -66,6 +69,7 @@ public final class ExpressionParser {
* A map mapping operator strings to operator functions, for unary operators.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map> unaryOperators;
@@ -73,6 +77,7 @@ public final class ExpressionParser {
* A map mapping operator strings to operator functions, for binary operators.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map> binaryOperators;
@@ -84,6 +89,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code objectObtainer} is null
* @since 2019-03-17
+ * @since v0.2.0
*/
public Builder(final Function objectObtainer) {
this.objectObtainer = Objects.requireNonNull(objectObtainer, "objectObtainer must not be null.");
@@ -104,6 +110,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code text} or {@code operator} is null
* @since 2019-03-17
+ * @since v0.2.0
*/
public Builder addBinaryOperator(final String text, final BinaryOperator operator, final int priority) {
Objects.requireNonNull(text, "text must not be null.");
@@ -128,6 +135,7 @@ public final class ExpressionParser {
* text of operator to use
* @return this builder
* @since 2019-03-22
+ * @since v0.2.0
*/
public Builder addSpaceFunction(final String operator) {
Objects.requireNonNull(operator, "operator must not be null.");
@@ -152,6 +160,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code text} or {@code operator} is null
* @since 2019-03-17
+ * @since v0.2.0
*/
public Builder addUnaryOperator(final String text, final UnaryOperator operator, final int priority) {
Objects.requireNonNull(text, "text must not be null.");
@@ -171,6 +180,7 @@ public final class ExpressionParser {
/**
* @return an {@code ExpressionParser} instance with the properties given to this builder
* @since 2019-03-17
+ * @since v0.2.0
*/
public ExpressionParser build() {
return new ExpressionParser<>(this.objectObtainer, this.unaryOperators, this.binaryOperators,
@@ -185,11 +195,15 @@ public final class ExpressionParser {
* @param
* type of operand and result
* @since 2019-03-17
+ * @since v0.2.0
*/
private static abstract class PriorityBinaryOperator
implements BinaryOperator, Comparable> {
/**
* The operator's priority. Higher-priority operators are applied before lower-priority operators
+ *
+ * @since 2019-03-17
+ * @since v0.2.0
*/
private final int priority;
@@ -199,6 +213,7 @@ public final class ExpressionParser {
* @param priority
* operator's priority
* @since 2019-03-17
+ * @since v0.2.0
*/
public PriorityBinaryOperator(final int priority) {
this.priority = priority;
@@ -209,6 +224,10 @@ public final class ExpressionParser {
*
*
* {@inheritDoc}
+ *
+ *
+ * @since 2019-03-17
+ * @since v0.2.0
*/
@Override
public int compareTo(final PriorityBinaryOperator o) {
@@ -223,6 +242,7 @@ public final class ExpressionParser {
/**
* @return priority
* @since 2019-03-22
+ * @since v0.2.0
*/
public final int getPriority() {
return this.priority;
@@ -236,11 +256,15 @@ public final class ExpressionParser {
* @param
* type of operand and result
* @since 2019-03-17
+ * @since v0.2.0
*/
private static abstract class PriorityUnaryOperator
implements UnaryOperator, Comparable> {
/**
* The operator's priority. Higher-priority operators are applied before lower-priority operators
+ *
+ * @since 2019-03-17
+ * @since v0.2.0
*/
private final int priority;
@@ -250,6 +274,7 @@ public final class ExpressionParser {
* @param priority
* operator's priority
* @since 2019-03-17
+ * @since v0.2.0
*/
public PriorityUnaryOperator(final int priority) {
this.priority = priority;
@@ -260,6 +285,10 @@ public final class ExpressionParser {
*
*
* {@inheritDoc}
+ *
+ *
+ * @since 2019-03-17
+ * @since v0.2.0
*/
@Override
public int compareTo(final PriorityUnaryOperator o) {
@@ -274,6 +303,7 @@ public final class ExpressionParser {
/**
* @return priority
* @since 2019-03-22
+ * @since v0.2.0
*/
public final int getPriority() {
return this.priority;
@@ -285,6 +315,7 @@ public final class ExpressionParser {
*
* @author Adrien Hopkins
* @since 2019-03-14
+ * @since v0.2.0
*/
private static enum TokenType {
OBJECT, UNARY_OPERATOR, BINARY_OPERATOR;
@@ -294,6 +325,7 @@ public final class ExpressionParser {
* The opening bracket.
*
* @since 2019-03-22
+ * @since v0.2.0
*/
public static final char OPENING_BRACKET = '(';
@@ -301,6 +333,7 @@ public final class ExpressionParser {
* The closing bracket.
*
* @since 2019-03-22
+ * @since v0.2.0
*/
public static final char CLOSING_BRACKET = ')';
@@ -315,6 +348,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if string is null
* @since 2019-03-22
+ * @since v0.2.0
*/
private static int findBracketPair(final String string, final int bracketPosition) {
Objects.requireNonNull(string, "string must not be null.");
@@ -361,6 +395,7 @@ public final class ExpressionParser {
* use {@code Integer::parseInt}.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Function objectObtainer;
@@ -368,6 +403,7 @@ public final class ExpressionParser {
* A map mapping operator strings to operator functions, for unary operators.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map> unaryOperators;
@@ -375,6 +411,7 @@ public final class ExpressionParser {
* A map mapping operator strings to operator functions, for binary operators.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map> binaryOperators;
@@ -382,6 +419,7 @@ public final class ExpressionParser {
* The operator for space, or null if spaces have no function.
*
* @since 2019-03-22
+ * @since v0.2.0
*/
private final String spaceOperator;
@@ -397,6 +435,7 @@ public final class ExpressionParser {
* @param spaceOperator
* operator used by spaces
* @since 2019-03-14
+ * @since v0.2.0
*/
private ExpressionParser(final Function objectObtainer,
final Map> unaryOperators,
@@ -419,6 +458,7 @@ public final class ExpressionParser {
* expression
* @return expression in RPN
* @since 2019-03-17
+ * @since v0.2.0
*/
private String convertExpressionToReversePolish(final String expression) {
Objects.requireNonNull(expression, "expression must not be null.");
@@ -523,6 +563,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if components is null
* @since 2019-03-22
+ * @since v0.2.0
*/
private int findHighestPriorityOperatorPosition(final List components) {
Objects.requireNonNull(components, "components must not be null.");
@@ -572,6 +613,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code expression} is null
* @since 2019-03-14
+ * @since v0.2.0
*/
private TokenType getTokenType(final String token) {
Objects.requireNonNull(token, "token must not be null.");
@@ -593,6 +635,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code expression} is null
* @since 2019-03-14
+ * @since v0.2.0
*/
public T parseExpression(final String expression) {
return this.parseReversePolishExpression(this.convertExpressionToReversePolish(expression));
@@ -607,6 +650,7 @@ public final class ExpressionParser {
* @throws NullPointerException
* if {@code expression} is null
* @since 2019-03-14
+ * @since v0.2.0
*/
private T parseReversePolishExpression(final String expression) {
Objects.requireNonNull(expression, "expression must not be null.");
diff --git a/src/org/unitConverter/unit/AbstractUnit.java b/src/org/unitConverter/unit/AbstractUnit.java
index a0d6f7e..05a6c17 100644
--- a/src/org/unitConverter/unit/AbstractUnit.java
+++ b/src/org/unitConverter/unit/AbstractUnit.java
@@ -110,7 +110,6 @@ public abstract class AbstractUnit implements Unit {
return this.system;
}
- // TODO document and revise units' toString methods
@Override
public String toString() {
return String.format("%s-derived unit of dimension %s", this.getSystem(), this.getDimension());
diff --git a/src/org/unitConverter/unit/BaseUnit.java b/src/org/unitConverter/unit/BaseUnit.java
index 8bac866..67309cf 100755
--- a/src/org/unitConverter/unit/BaseUnit.java
+++ b/src/org/unitConverter/unit/BaseUnit.java
@@ -111,6 +111,7 @@ public final class BaseUnit extends LinearUnit {
/**
* @return true if the unit is a "full base" unit like the metre or second.
* @since 2019-04-10
+ * @since v0.2.0
*/
public final boolean isFullBase() {
return this.isFullBase;
diff --git a/src/org/unitConverter/unit/DefaultUnitPrefix.java b/src/org/unitConverter/unit/DefaultUnitPrefix.java
index c0e8dcc..4a9e487 100755
--- a/src/org/unitConverter/unit/DefaultUnitPrefix.java
+++ b/src/org/unitConverter/unit/DefaultUnitPrefix.java
@@ -33,6 +33,7 @@ public final class DefaultUnitPrefix implements UnitPrefix {
*
* @param multiplier
* @since 2019-01-14
+ * @since v0.2.0
*/
public DefaultUnitPrefix(final double multiplier) {
this.multiplier = multiplier;
diff --git a/src/org/unitConverter/unit/LinearUnit.java b/src/org/unitConverter/unit/LinearUnit.java
index 5b2680b..1b1ac97 100644
--- a/src/org/unitConverter/unit/LinearUnit.java
+++ b/src/org/unitConverter/unit/LinearUnit.java
@@ -175,6 +175,7 @@ public class LinearUnit extends AbstractUnit {
* @throws NullPointerException
* if {@code subtrahend} is null
* @since 2019-03-17
+ * @since v0.2.0
*/
public LinearUnit minus(final LinearUnit subtrahendend) {
Objects.requireNonNull(subtrahendend, "addend must not be null.");
@@ -203,6 +204,7 @@ public class LinearUnit extends AbstractUnit {
* @throws NullPointerException
* if {@code addend} is null
* @since 2019-03-17
+ * @since v0.2.0
*/
public LinearUnit plus(final LinearUnit addend) {
Objects.requireNonNull(addend, "addend must not be null.");
@@ -284,6 +286,7 @@ public class LinearUnit extends AbstractUnit {
* prefix to apply
* @return unit with prefix
* @since 2019-03-18
+ * @since v0.2.0
*/
public LinearUnit withPrefix(final UnitPrefix prefix) {
return this.times(prefix.getMultiplier());
diff --git a/src/org/unitConverter/unit/UnitPrefix.java b/src/org/unitConverter/unit/UnitPrefix.java
index a1609c6..9f9645d 100755
--- a/src/org/unitConverter/unit/UnitPrefix.java
+++ b/src/org/unitConverter/unit/UnitPrefix.java
@@ -31,6 +31,7 @@ public interface UnitPrefix {
* prefix to divide by
* @return quotient of prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
default UnitPrefix dividedBy(final UnitPrefix other) {
return new DefaultUnitPrefix(this.getMultiplier() / other.getMultiplier());
@@ -50,6 +51,7 @@ public interface UnitPrefix {
* prefix to multiply by
* @return product of prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
default UnitPrefix times(final UnitPrefix other) {
return new DefaultUnitPrefix(this.getMultiplier() * other.getMultiplier());
@@ -62,6 +64,7 @@ public interface UnitPrefix {
* exponent to raise to
* @return result of exponentiation.
* @since 2019-04-13
+ * @since v0.2.0
*/
default UnitPrefix toExponent(final double exponent) {
return new DefaultUnitPrefix(Math.pow(getMultiplier(), exponent));
diff --git a/src/org/unitConverter/unit/package-info.java b/src/org/unitConverter/unit/package-info.java
index c4493ae..dd5a939 100644
--- a/src/org/unitConverter/unit/package-info.java
+++ b/src/org/unitConverter/unit/package-info.java
@@ -19,5 +19,6 @@
*
* @author Adrien Hopkins
* @since 2019-01-25
+ * @since v0.1.0
*/
package org.unitConverter.unit;
\ No newline at end of file
diff --git a/src/test/java/ExpressionParserTest.java b/src/test/java/ExpressionParserTest.java
index 62fa964..40c91ac 100644
--- a/src/test/java/ExpressionParserTest.java
+++ b/src/test/java/ExpressionParserTest.java
@@ -26,6 +26,7 @@ import org.unitConverter.math.ExpressionParser;
*
* @author Adrien Hopkins
* @since 2019-03-22
+ * @since v0.2.0
*/
public class ExpressionParserTest {
private static final ExpressionParser numberParser = new ExpressionParser.Builder<>(Integer::parseInt)
diff --git a/src/test/java/UnitTest.java b/src/test/java/UnitTest.java
index 952b6f2..00fcf3c 100755
--- a/src/test/java/UnitTest.java
+++ b/src/test/java/UnitTest.java
@@ -35,6 +35,7 @@ import org.unitConverter.unit.Unit;
*
* @author Adrien Hopkins
* @since 2018-12-22
+ * @since v0.1.0
*/
public class UnitTest {
/** A random number generator */
diff --git a/src/test/java/UnitsDatabaseTest.java b/src/test/java/UnitsDatabaseTest.java
index 8429561..9222740 100644
--- a/src/test/java/UnitsDatabaseTest.java
+++ b/src/test/java/UnitsDatabaseTest.java
@@ -38,6 +38,7 @@ import org.unitConverter.unit.UnitPrefix;
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
public class UnitsDatabaseTest {
// some linear units and one nonlinear
@@ -72,6 +73,7 @@ public class UnitsDatabaseTest {
* Test that prefixes correctly apply to units.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testPrefixes() {
@@ -101,6 +103,7 @@ public class UnitsDatabaseTest {
*
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testPrefixlessUnitMap() {
@@ -123,6 +126,7 @@ public class UnitsDatabaseTest {
* Tests that the database correctly stores and retrieves units, ignoring prefixes.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testPrefixlessUnits() {
@@ -143,6 +147,7 @@ public class UnitsDatabaseTest {
* Test that unit expressions return the correct value.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testUnitExpressions() {
@@ -176,6 +181,7 @@ public class UnitsDatabaseTest {
* Tests both the unit name iterator and the name-unit entry iterator
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testUnitIterator() {
@@ -221,6 +227,7 @@ public class UnitsDatabaseTest {
*
*
* @since 2019-04-14
+ * @since v0.2.0
*/
@Test
public void testUnitPrefixCombinations() {
diff --git a/src/test/java/package-info.java b/src/test/java/package-info.java
index 87b4a06..3da7fcb 100644
--- a/src/test/java/package-info.java
+++ b/src/test/java/package-info.java
@@ -19,5 +19,6 @@
*
* @author Adrien Hopkins
* @since 2019-03-16
+ * @since v0.2.0
*/
package test.java;
\ No newline at end of file
--
cgit v1.2.3