X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Ftechtype%2Ftable%2FTechTypeTableDataProvider.java;fp=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Ftechtype%2Ftable%2FTechTypeTableDataProvider.java;h=af0e28d07bc84be4b9b01ab221105b2f3c5269a9;hb=3424ba8b4dd8e368badce8515bca96a99be518f4;hp=c23a6079952a82eb6927c1cdc28ef5de1a7853f0;hpb=b84a03e5c4452c82c718644423373c0d7e2a1e62;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java index c23a6079..af0e28d0 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java @@ -5,6 +5,7 @@ import java.io.StringReader; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.stream.IntStream; @@ -12,7 +13,9 @@ import java.util.stream.IntStream; import org.apache.commons.csv.CSVRecord; import org.eclipse.core.runtime.ListenerList; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; +import org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum; import org.simantics.district.imports.DistrictImportUtils; +import org.simantics.district.network.techtype.TechTypeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,6 +32,18 @@ public class TechTypeTableDataProvider implements IDataProvider { private ListenerList enableListeners = new ListenerList(); + private int[] sortedRows; + + private static final Comparator VALUE_COMPARATOR = (a, b) -> { + try { + double da = Double.valueOf(a.replace(",", ".")); + double db = Double.valueOf(b.replace(",", ".")); + return Double.compare(da, db); + } catch (NumberFormatException e) { + return TechTypeUtils.compareNatural(a, b); + } + }; + public TechTypeTableDataProvider(String data, int[] enabledList) { setData(data); setEnabledFlags(enabledList); @@ -58,13 +73,17 @@ public class TechTypeTableDataProvider implements IDataProvider { } public CSVRecord getRecord(int rowIndex) { - return records.get(filteredRows[rowIndex]); + return records.get(recordIndex(rowIndex)); } - + public boolean isEnabled(int rowIndex) { - return enabled[filteredRows[rowIndex]]; + return enabled[recordIndex(rowIndex)]; } + private int recordIndex(int rowIndex) { + return sortedRows[filteredRows[rowIndex]]; + } + public String getHeaderValue(int columnIndex) { if (headers == null) { return ""; @@ -87,7 +106,7 @@ public class TechTypeTableDataProvider implements IDataProvider { public void setDataValue(int columnIndex, int rowIndex, Object newValue) { if (columnIndex == 0) { boolean value = Boolean.parseBoolean((String) newValue); - enabled[filteredRows[rowIndex]] = value; + enabled[recordIndex(rowIndex)] = value; fireEnableEvent(rowIndex, value); } } @@ -121,7 +140,7 @@ public class TechTypeTableDataProvider implements IDataProvider { this.filter = text != null ? text.toLowerCase() : null; filteredRows = IntStream.range(0, records.size()) - .filter(k -> isMatch(records.get(k), filter)) + .filter(k -> isMatch(records.get(sortedRows[k]), filter)) .toArray(); } @@ -161,6 +180,9 @@ public class TechTypeTableDataProvider implements IDataProvider { } } + enabled = new boolean[records.size()]; + sortedRows = IntStream.range(0, records.size()).toArray(); + setFilter(null); } @@ -208,8 +230,29 @@ public class TechTypeTableDataProvider implements IDataProvider { } enabled = new boolean[records.size()]; + sortedRows = IntStream.range(0, records.size()).toArray(); setFilter(null); } + public void sortBy(int columnIndex, SortDirectionEnum sortDirection) { + + if (columnIndex >= 0 && !sortDirection.equals(SortDirectionEnum.NONE)) { + Comparator comparator = columnIndex == 0 ? + Comparator.comparing(k -> enabled[sortedRows[(int) k]]) : + Comparator.comparing(k -> records.get(sortedRows[(int) k]).get(columnIndex-1), VALUE_COMPARATOR); + + if (sortDirection.equals(SortDirectionEnum.DESC)) + comparator = comparator.reversed(); + + sortedRows = IntStream.range(0, records.size()) + .mapToObj(i -> i) + .sorted(comparator) + .mapToInt(i -> sortedRows[i]) + .toArray(); + } else { + sortedRows = IntStream.range(0, records.size()).toArray(); + } + } + } \ No newline at end of file