package org.simantics.interop.utils; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ContentViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; public class StringColumnComparator extends ViewerComparator { private int propertyIndex; private static final int DESCENDING = 1; private int direction = DESCENDING; public StringColumnComparator() { this.propertyIndex = 0; this.direction = DESCENDING; } public void setColumnt(int column) { if (column == this.propertyIndex) { direction = 1-direction; } else { this.propertyIndex = column; direction = DESCENDING; } } @Override public int compare(Viewer viewer, Object e1, Object e2) { int rc = 0; int cat1 = category(e1); int cat2 = category(e2); if (cat1 != cat2) { rc = cat1 - cat2; } else { String name1 = null; String name2 = null; if (viewer == null || !(viewer instanceof ContentViewer)) { name1 = e1.toString(); name2 = e2.toString(); } else { IBaseLabelProvider prov = ((ContentViewer) viewer).getLabelProvider(); if (viewer instanceof TableViewer && ((TableViewer)viewer).getLabelProvider(propertyIndex) != null) { CellLabelProvider clp = ((TableViewer)viewer).getLabelProvider(propertyIndex); if (clp instanceof ILabelProvider) { ILabelProvider ilb = (ILabelProvider)clp; name1 = ilb.getText(e1); name2 = ilb.getText(e2); } } if (name1 == null) { if (prov instanceof ITableLabelProvider) { ITableLabelProvider lprov = (ITableLabelProvider) prov; name1 = lprov.getColumnText(e1,propertyIndex); name2 = lprov.getColumnText(e2,propertyIndex); } else if (prov instanceof ILabelProvider) { ILabelProvider lprov = (ILabelProvider) prov; name1 = lprov.getText(e1); name2 = lprov.getText(e2); } else { name1 = e1.toString(); name2 = e2.toString(); } } } if (name1 == null) { name1 = "";//$NON-NLS-1$ } if (name2 == null) { name2 = "";//$NON-NLS-1$ } // use the comparator to compare the strings rc = getComparator().compare(name1, name2); } if (direction != DESCENDING) rc = -rc; return rc; } }