/**
*
*/
package fr.inria.soctrace.framesoc.ui.tracetable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.SWT;
import fr.inria.soctrace.framesoc.ui.model.ITableColumn;
import fr.inria.soctrace.lib.model.Trace;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
/**
* Cache for trace table rows. This cache is not aware of the filter rows. The first row actual has
* index 0.
*
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*/
public class TraceTableCache {
private List<TraceTableRow> fSortedRows;
private Map<Integer, TraceTableRow> fIndex;
private TraceTableRowFilter fFilter;
private Map<String, TraceTableColumn> tableColumns;
/**
* Initialize the cache with existing traces.
*
* @param traces
* traces
*/
public void init(List<Trace> traces) {
fSortedRows = new ArrayList<>();
tableColumns = new HashMap<String, TraceTableColumn>();
for (TraceTableColumnEnum traceTableColumnEnum : TraceTableColumnEnum
.values()) {
tableColumns.put(traceTableColumnEnum.getHeader(),
new TraceTableColumn(traceTableColumnEnum));
}
for (Trace trace : traces) {
fSortedRows.add(new TraceTableRow(trace, this));
}
// Initialize custom parameters in every row
for (TraceTableRow traceTablerow : fSortedRows) {
traceTablerow.initValues(this);
}
// Init filter only after filling the rows, in order to have all the
// column data
fFilter = new TraceTableRowFilter(this);
sort(tableColumns.get(TraceTableColumnEnum.ALIAS.getHeader()), SWT.UP);
}
/**
* Get the trace table row at the give table index.
*
* @param index
* row index
* @return the trace table row for the passed index
*/
public TraceTableRow get(int index) {
return fIndex.get(index);
}
/**
* Get the number of visible rows.
*
* @return the number of visible rows.
*/
public int getItemCount() {
return fIndex.size();
}
public Map<String, TraceTableColumn> getTableColumns() {
return tableColumns;
}
/**
* Set the filter text for the given column.
*
* @param col
* column to filter
* @param string
* filter text
*/
public void setFilterText(ITableColumn col, String string) {
fFilter.setFilterText(col, string);
}
/**
* Apply the filter set.
*/
public void applyFilter() {
int index = 0;
fIndex = new HashMap<>();
for (TraceTableRow t : fSortedRows) {
if (fFilter.matches(t)) {
fIndex.put(index++, t);
}
}
}
/**
* Clean the filter.
*/
public void cleanFilter() {
fFilter.clean();
}
/**
* Sort the rows according to the given column in the given direction.
*
* @param col
* sort column
* @param dir
* direction
*/
public void sort(final ITableColumn col, final int dir) {
// sort rows
Collections.sort(fSortedRows, new Comparator<TraceTableRow>() {
@Override
public int compare(TraceTableRow o1, TraceTableRow o2) {
if (dir != SWT.UP) {
// swap for reverse ordering
TraceTableRow tmp = o1;
o1 = o2;
o2 = tmp;
}
if (col.getHeader().equals(
TraceTableColumnEnum.MAX_TIMESTAMP.getHeader()))
return Long.compare(o1.getTrace().getMaxTimestamp(), o2
.getTrace().getMaxTimestamp());
if (col.getHeader().equals(
TraceTableColumnEnum.MIN_TIMESTAMP.getHeader()))
return Long.compare(o1.getTrace().getMinTimestamp(), o2
.getTrace().getMinTimestamp());
if (col.getHeader().equals(
TraceTableColumnEnum.NUMBER_OF_CPUS.getHeader()))
return Integer.compare(o1.getTrace().getNumberOfCpus(), o2
.getTrace().getNumberOfCpus());
if (col.getHeader().equals(
TraceTableColumnEnum.NUMBER_OF_EVENTS.getHeader()))
return Integer.compare(o1.getTrace().getNumberOfEvents(),
o2.getTrace().getNumberOfEvents());
if (col.getHeader().equals(
TraceTableColumnEnum.TRACING_DATE.getHeader()))
return o1.getTrace().getTracingDate()
.compareTo(o2.getTrace().getTracingDate());
// Default:
try {
return o1.get(col).compareTo(o2.get(col));
} catch (SoCTraceException e) {
e.printStackTrace();
}
return 0;
}
});
// re-index visible rows
int index = 0;
fIndex = new HashMap<>();
boolean hasFilters = fFilter.hasFilters();
for (TraceTableRow row : fSortedRows) {
if (!hasFilters || fFilter.matches(row)) {
fIndex.put(index++, row);
}
}
}
}