package org.openscada.ae.ui.views.views; import java.util.Comparator; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.openscada.ae.Event; import org.openscada.ae.ui.views.model.DecoratedEvent; import org.openscada.core.VariantComparator; class EventTableSorter extends ViewerSorter { private static final VariantComparator variantComparator = new VariantComparator (); private final EventTableColumn column; private final int dir; private static final Comparator<Event> idComparator = new Comparator<Event> () { @Override public int compare ( final Event e1, final Event e2 ) { return e1.getId ().compareTo ( e2.getId () ); } }; private static final Comparator<Event> sourceTimestampComparator = new Comparator<Event> () { @Override public int compare ( final Event e1, final Event e2 ) { return e1.getSourceTimestamp ().compareTo ( e2.getSourceTimestamp () ); } }; private static final Comparator<Event> entryTimestampComparator = new Comparator<Event> () { @Override public int compare ( final Event e1, final Event e2 ) { return e1.getEntryTimestamp ().compareTo ( e2.getEntryTimestamp () ); } }; private static final Comparator<Event> sequenceComparator = new Comparator<Event> () { @Override public int compare ( final Event e1, final Event e2 ) { return EventTableSorter.variantComparator.compare ( e1.getAttributes ().get ( "sequence" ), e2.getAttributes ().get ( "sequence" ) );//$NON-NLS-1$ //$NON-NLS-2$ } }; public EventTableSorter ( final EventTableColumn column, final int dir ) { this.column = column; this.dir = dir; } @Override public int compare ( final Viewer viewer, final Object o1, final Object o2 ) { final Event e1 = ( (DecoratedEvent)o1 ).getEvent (); final Event e2 = ( (DecoratedEvent)o2 ).getEvent (); if ( this.column == EventTableColumn.reservedColumnId ) { return chainCompare ( e1, e2, EventTableSorter.idComparator, EventTableSorter.sourceTimestampComparator, EventTableSorter.sequenceComparator, EventTableSorter.entryTimestampComparator ); } else if ( this.column == EventTableColumn.reservedColumnSourceTimestamp ) { return chainCompare ( e1, e2, EventTableSorter.sourceTimestampComparator, EventTableSorter.sequenceComparator, EventTableSorter.entryTimestampComparator, EventTableSorter.idComparator ); } else if ( this.column == EventTableColumn.reservedColumnEntryTimestamp ) { return chainCompare ( e1, e2, EventTableSorter.entryTimestampComparator, EventTableSorter.sourceTimestampComparator, EventTableSorter.sequenceComparator, EventTableSorter.idComparator ); } return 0; } private int invert ( final int result ) { return ( this.dir == SWT.DOWN ? -1 : 1 ) * result; } /** * Compare the events * <p> * This might look strange .. but actually is faster * </p< * @param e1 * @param e2 * @param cmp1 * @param cmp2 * @param cmp3 * @param cmp4 * @return */ private int chainCompare ( final Event e1, final Event e2, final Comparator<Event> cmp1, final Comparator<Event> cmp2, final Comparator<Event> cmp3, final Comparator<Event> cmp4 ) { int result; result = cmp1.compare ( e1, e2 ); if ( result != 0 ) { return invert ( result ); } result = cmp2.compare ( e1, e2 ); if ( result != 0 ) { return invert ( result ); } result = cmp3.compare ( e1, e2 ); if ( result != 0 ) { return invert ( result ); } result = cmp4.compare ( e1, e2 ); if ( result != 0 ) { return invert ( result ); } return 0; } }