/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.studio.tables.grid.adapter; import java.util.Iterator; import java.util.Map; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLTableReadOnly; import com.opendoorlogistics.core.tables.ColumnValueProcessor; import com.opendoorlogistics.core.tables.decorators.datastores.RowFilterDecorator; import com.opendoorlogistics.core.tables.decorators.datastores.SimpleDecorator; import com.opendoorlogistics.core.tables.utils.TableUtils; import com.opendoorlogistics.core.utils.strings.StandardisedStringTreeMap; class FilteredTableController { private final SimpleDecorator<ODLTableReadOnly> switchableDecorator; private final RowFilterDecorator<ODLTableReadOnly> filterDecorator; private final ODLDatastore<? extends ODLTableReadOnly> unfiltered; private final FilterState filterState ; private final int tableId; private boolean hasFilters; public static class FilterState{ private final StandardisedStringTreeMap<String> map = new StandardisedStringTreeMap<>(true); public String getColumnFilter(String column){ return map.get(column); } } public FilteredTableController(ODLDatastore<? extends ODLTableReadOnly> ds, int tableId){ this(ds,tableId, new FilterState()); } public FilteredTableController(ODLDatastore<? extends ODLTableReadOnly> ds, int tableId, FilterState filterState){ switchableDecorator = new SimpleDecorator<>(ODLTableReadOnly.class, ds); filterDecorator = new RowFilterDecorator<>(ds, tableId); unfiltered = ds; this.tableId =tableId; this.filterState = filterState; update(); } public void update(){ hasFilters = false; // get the current filters by column and remove any no longer used Iterator<Map.Entry<String,String> > it = filterState.map.entrySet().iterator(); ODLTableReadOnly table = unfiltered.getTableByImmutableId(tableId); if(table==null){ filterState.map.clear(); return; } int nc = table.getColumnCount(); String [] vals = new String[nc]; while(it.hasNext()){ Map.Entry<String,String> entry = it.next(); int colIndx = TableUtils.findColumnIndx(table, entry.getKey()); if(colIndx==-1){ it.remove(); }else{ vals[colIndx] = entry.getValue(); if(vals[colIndx]!=null){ hasFilters = true; } } } if(hasFilters){ // clear filter and then parse table readding passing rows filterDecorator.clearRows(); int nr = table.getRowCount(); for(int i =0 ; i<nr;i++){ boolean pass=true; for(int j=0;j<nc && pass;j++){ if(vals[j]!=null){ Object value = table.getValueAt(i, j); pass = ColumnValueProcessor.isEqual(vals[j], value); } } if(pass){ filterDecorator.addRowToFilter(table.getImmutableId(), table.getRowId(i)); } } switchableDecorator.replaceDecorated(filterDecorator); }else{ switchableDecorator.replaceDecorated(unfiltered); } } public ODLTableReadOnly getTable(){ return switchableDecorator.getTableByImmutableId(tableId); } public ODLDatastore<ODLTableReadOnly> getDs(){ return switchableDecorator; } public void setColumnFilter(String column, String value){ filterState.map.put(column, value); update(); } public boolean isFiltered(){ return hasFilters; } public FilterState getFilterState(){ return filterState; } }