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=c23a6079952a82eb6927c1cdc28ef5de1a7853f0;hb=29af77f249a4842bfd3f9280755121c9c98b32a1;hp=d6b0c7d228bbf55554141b6cda434c426694718f;hpb=62f9a86961adc4fd44782e3c2f79852b1269810d;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 d6b0c7d2..c23a6079 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 @@ -7,9 +7,10 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; +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.simantics.district.imports.DistrictImportUtils; import org.slf4j.Logger; @@ -17,43 +18,86 @@ import org.slf4j.LoggerFactory; public class TechTypeTableDataProvider implements IDataProvider { - @SuppressWarnings("unused") private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTableDataProvider.class); private List records = new ArrayList<>(); - private List filteredRecords = new ArrayList<>(); - private String filter = ""; + private boolean[] enabled; + private String filter = null; private List variables = null; private List headers = null; + private int[] filteredRows; + private ListenerList enableListeners = new ListenerList(); + + public TechTypeTableDataProvider(String data, int[] enabledList) { + setData(data); + setEnabledFlags(enabledList); + } + public TechTypeTableDataProvider(String data) { // load csv setData(data); } + + public void setEnabledFlags(int[] enabledList) { + this.enabled = new boolean[records.size()]; + if (enabledList != null) { + for (int i : enabledList) { + if (i >= 0 && i < enabled.length) + enabled[i] = true; + } + } + } public String getVariableName(int columnIndex) { - return variables != null && columnIndex < variables.size() ? variables.get(columnIndex) : null; + return variables != null && columnIndex > 0 && columnIndex <= variables.size() ? variables.get(columnIndex - 1) : null; } public int getVariableIndex(String variableName) { - return variables != null ? variables.indexOf(variableName) : -1; + return variables != null ? variables.indexOf(variableName) + 1 : -1; + } + + public CSVRecord getRecord(int rowIndex) { + return records.get(filteredRows[rowIndex]); + } + + public boolean isEnabled(int rowIndex) { + return enabled[filteredRows[rowIndex]]; } public String getHeaderValue(int columnIndex) { if (headers == null) { return ""; + } else if (columnIndex == 0) { + return "Enabled"; + } else { + return headers.get(columnIndex - 1); } - return headers.get(columnIndex); } @Override public Object getDataValue(int columnIndex, int rowIndex) { - return filteredRecords.get(rowIndex).get(columnIndex); + if (columnIndex == 0) { + return isEnabled(rowIndex); + } + return getRecord(rowIndex).get(columnIndex - 1); } @Override public void setDataValue(int columnIndex, int rowIndex, Object newValue) { + if (columnIndex == 0) { + boolean value = Boolean.parseBoolean((String) newValue); + enabled[filteredRows[rowIndex]] = value; + fireEnableEvent(rowIndex, value); + } + } + + public void addEnableListener(EnableListener listener) { + enableListeners.add(listener); + } + private void fireEnableEvent(int rowIndex, boolean newValue) { + enableListeners.forEach(l -> l.rowEnabled(rowIndex, newValue)); } @Override @@ -61,30 +105,38 @@ public class TechTypeTableDataProvider implements IDataProvider { if (records.isEmpty()) { return 0; } - return records.get(0).size(); + return records.get(0).size() + 1; } @Override public int getRowCount() { - return filteredRecords.size(); + return filteredRows.length; } public boolean isEditable(int columnIndex, int rowIndex) { - return false; + return columnIndex == 0; } public void setFilter(String text) { - this.filter = text.toLowerCase(); + this.filter = text != null ? text.toLowerCase() : null; - filteredRecords = records.stream().filter(record -> { - for (int i = 0; i < record.size(); i++) { - String columnContent = record.get(i); - if (columnContent.toLowerCase().contains(filter)) { - return true; - } + filteredRows = IntStream.range(0, records.size()) + .filter(k -> isMatch(records.get(k), filter)) + .toArray(); + } + + private static boolean isMatch(CSVRecord record, String filterString) { + if (filterString == null || filterString.isEmpty()) + return true; + + for (int i = 0; i < record.size(); i++) { + String columnContent = record.get(i); + if (columnContent.toLowerCase().contains(filterString)) { + return true; } - return false; - }).collect(Collectors.toList()); + } + + return false; } /** @@ -96,7 +148,7 @@ public class TechTypeTableDataProvider implements IDataProvider { */ public void setPath(String path) { records.clear(); - filteredRecords.clear(); + if (path != null) { Path techTypeCsv = Paths.get(path); try { @@ -109,7 +161,7 @@ public class TechTypeTableDataProvider implements IDataProvider { } } - setFilter(""); + setFilter(null); } /** @@ -121,7 +173,7 @@ public class TechTypeTableDataProvider implements IDataProvider { */ public void setData(String data) { records.clear(); - filteredRecords.clear(); + if (data != null) { long ncommas = data.chars().filter(c -> c == ',').count(); long nsemis = data.chars().filter(c -> c == ';').count(); @@ -154,8 +206,10 @@ public class TechTypeTableDataProvider implements IDataProvider { headers.add(variable + (unit != null && !unit.isEmpty() && !(unit.startsWith("(") && unit.endsWith(")")) ? " [" + unit + "]" : "")); } } + + enabled = new boolean[records.size()]; - setFilter(""); + setFilter(null); } } \ No newline at end of file