package rtt.annotation.editor.ui.viewer.provider; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.ui.services.IDisposable; public abstract class ViewerItemProvider implements IDisposable { protected static class ViewerItemLabelProvider extends ColumnLabelProvider { private int column = ViewerItemProvider.FIRST_COLUMN; protected ViewerItemLabelProvider(int column) { this.column = column; } @Override public String getText(Object element) { if (element instanceof ViewerItem) { return ((ViewerItem) element).getColumnText(column); } return super.getText(element); } protected static ColumnLabelProvider create(int column) { return new ViewerItemLabelProvider(column); } @Override public Color getForeground(Object element) { if (element instanceof ViewerItem) { return ((ViewerItem) element).getColor(); } return super.getForeground(element); } @Override public Font getFont(Object element) { if (element instanceof ViewerItem) { return ((ViewerItem) element).getFont(); } return super.getFont(element); } } protected static class ViewerItemContentProvider implements ITreeContentProvider { private ViewerItemProvider provider; private static final Object[] EMPTY_ARRAY = new Object[0]; private ViewerItem mainItem = new TextViewerItem(null); protected ViewerItemContentProvider(ViewerItemProvider provider) { this.provider = provider; } @Override public void dispose() {} @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (newInput == null) { mainItem.clear(); } if (provider.hasElements(newInput)) { mainItem.clear(); List<ViewerItem> newData = provider.setInput(newInput, mainItem); if (newData != null && !newData.isEmpty()) { mainItem.addAll(newData); } } } @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof ViewerItem) { return ((ViewerItem) parentElement).getChildren().toArray(); } if (provider.hasElements(parentElement)) { return mainItem.getChildren().toArray(); } return EMPTY_ARRAY; } @Override public Object getParent(Object element) { if (element instanceof ViewerItem) { return ((ViewerItem) element).getParent(); } return null; } @Override public boolean hasChildren(Object element) { return getChildren(element).length > 0; } } public static final int FIRST_COLUMN = 0; public static final int SECOND_COLUMN = 1; public static final int THIRD_COLUMN = 2; public static final int FOURTH_COLUMN = 3; public static final int FIFTH_COLUMN = 4; private ViewerItemContentProvider contentProvider; private List<CellLabelProvider> labelProviders = new ArrayList<>(0); public IContentProvider getContentProvider() { if (contentProvider == null) { contentProvider = new ViewerItemContentProvider(this); } return contentProvider; } public CellLabelProvider getLabelProvider(int column) { if (labelProviders.size() <= column) { labelProviders.add(ViewerItemLabelProvider.create(column)); } return labelProviders.get(column); } @Override public void dispose() { if (contentProvider != null) { contentProvider.dispose(); contentProvider = null; } for (CellLabelProvider labelProvider : labelProviders) { labelProvider.dispose(); } labelProviders.clear(); labelProviders = null; } abstract List<ViewerItem> setInput(Object input, ViewerItem parent); abstract boolean hasElements(Object parentElement); }