package sk.stuba.fiit.perconik.eclipse.jface.viewers; import java.util.Set; import com.google.common.base.Equivalence; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Widget; import static java.util.Arrays.asList; import static com.google.common.base.Preconditions.checkNotNull; import static sk.stuba.fiit.perconik.eclipse.jface.viewers.ElementComparers.toEquivalence; import static sk.stuba.fiit.perconik.utilities.MoreSets.newHashSet; public class RegularTableViewer extends CheckboxTableViewer { protected final String grayStateKey; protected int normalColor; protected int grayColor; public RegularTableViewer(final Table table) { super(table); this.grayStateKey = RegularTableViewer.class.getName() + ".grayed"; this.normalColor = SWT.COLOR_LIST_FOREGROUND; this.grayColor = SWT.COLOR_GRAY; } protected void setGrayedItem(final TableItem item, final boolean state) { item.setData(this.grayStateKey, state); item.setForeground(item.getDisplay().getSystemColor(state ? this.grayColor : this.normalColor)); } @Override public void setAllGrayed(final boolean state) { for (TableItem item: this.getTable().getItems()) { if (item.getData() != null && getGrayedItem(item) != state) { setGrayedItem(item, state); } } } @Override public boolean setGrayed(final Object element, final boolean state) { Widget widget = this.findItem(checkNotNull(element)); if (widget instanceof TableItem) { TableItem item = (TableItem) widget; if (getGrayedItem(item) != state) { setGrayedItem(item, state); } return true; } return false; } @Override public void setGrayedElements(final Object[] elements) { Equivalence<Object> equivalence = this.getEquivalence(); Set<Equivalence.Wrapper<Object>> set = newHashSet(equivalence, asList(elements)); for (TableItem item: this.getTable().getItems()) { Object element = item.getData(); if (element != null) { boolean state = set.contains(equivalence.wrap(element)); if (getGrayedItem(item) != state) { setGrayedItem(item, state); } } } } protected boolean getGrayedItem(final TableItem item) { Object value = item.getData(this.grayStateKey); return value != null ? (boolean) value : false; } public Equivalence<Object> getEquivalence() { return this.getComparer() != null ? toEquivalence(Object.class, this.getComparer()) : Equivalence.equals(); } }