use of org.eclipse.jface.viewers.OwnerDrawLabelProvider in project AGREE by loonwerks.
the class VariablesView method createView.
@PostConstruct
void createView(final Composite parent) {
final Display display = parent.getDisplay();
colorManager = new DeviceResourceManager(display);
unchangedValueColor = colorManager.createColor(new RGB(192, 192, 192));
constraintErrorColor = colorManager.createColor(red);
greenImage = createColorIconImage(display, green);
redImage = createColorIconImage(display, red);
yellowImage = createColorIconImage(display, yellow);
customColorImage = createColorIconImage(display, customRgb);
// Create root composite
final Composite root = new Composite(parent, SWT.NONE);
final GridLayout rootLayout = new GridLayout(1, false);
root.setLayout(rootLayout);
// Create the variable tree viewer
treeViewer = new VariablesTreeViewer(root, SWT.FULL_SELECTION);
// Enable tooltip support
ColumnViewerToolTipSupport.enableFor(treeViewer);
treeSelectionTracker = new TreeSelectionTracker(treeViewer);
GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());
treeViewer.setUseHashlookup(true);
final VariableContentProvider contentProvider = new VariableContentProvider();
treeViewer.setContentProvider(contentProvider);
treeViewer.setInput(null);
treeViewer.setComparator(new ViewerComparator() {
@Override
public int compare(final Viewer viewer, final Object e1, final Object e2) {
if (contentProvider.currentState == null) {
return 0;
}
// Sort component instances before other variables
final InstanceObject io1 = contentProvider.currentState.getEngineState().getElementInstanceObject(e1);
final InstanceObject io2 = contentProvider.currentState.getEngineState().getElementInstanceObject(e2);
if (io1 instanceof ComponentInstance && !(io2 instanceof ComponentInstance)) {
return -1;
} else if (io2 instanceof ComponentInstance && !(io1 instanceof ComponentInstance)) {
return 1;
}
// Sort feature instances before the remainder
if (io1 instanceof FeatureInstance && !(io2 instanceof FeatureInstance)) {
return -1;
} else if (io2 instanceof FeatureInstance && !(io1 instanceof FeatureInstance)) {
return 1;
}
final String n1 = contentProvider.currentState.getEngineState().getElementName(e1);
final String n2 = contentProvider.currentState.getEngineState().getElementName(e2);
return getComparator().compare(n1, n2);
}
});
treeViewer.setFilters(new ViewerFilter[] { new ViewerFilter() {
@Override
public boolean select(final Viewer viewer, final Object parentElement, final Object element) {
return !contentProvider.currentState.getEngineState().isElementHidden(element);
}
} });
// Create columns
final TreeViewerColumn nameColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
nameColumn.getColumn().setWidth(200);
nameColumn.getColumn().setText("Name");
nameColumn.getColumn().addControlListener(resizeListener);
nameColumn.setLabelProvider(new StyledCellLabelProvider() {
@Override
public void update(final ViewerCell cell) {
cell.setText(getText(cell.getElement()));
cell.setImage(getImage(cell.getElement()));
}
private String getText(final Object element) {
// Get the name of the frame state element
final SimulatorState state = contentProvider.getCurrentState();
if (state == null) {
return "";
}
return state.getEngineState().getElementName(element);
}
private Image getImage(final Object element) {
final SimulatorState state = contentProvider.getCurrentState();
if (state == null) {
return null;
}
final InstanceObject instanceObject = state.getEngineState().getElementInstanceObject(element);
return instanceObject == null ? null : UiUtil.getModelElementLabelProvider().getImage(instanceObject);
}
});
final TreeViewerColumn nextValueColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
nextValueColumn.getColumn().setWidth(100);
nextValueColumn.getColumn().setText("Next Value");
nextValueColumn.setLabelProvider(new OwnerDrawLabelProvider() {
@Override
public void initialize(final ColumnViewer viewer, final ViewerColumn column) {
super.initialize(viewer, column, true);
}
@Override
public void update(final ViewerCell cell) {
final String constraintTxt = getConstraintText(cell.getElement());
final String txt;
final Color foreground;
if (constraintTxt == null) {
// Attempt to retrieve the value for the next frame from from the engine state.
final SimulatorState state = contentProvider.getCurrentState();
if (state == null) {
txt = "";
} else {
final SimulationEngineState engineState = state.getEngineState();
txt = ValueFormatter.formatValue(engineState.getElementValue(engineState.getNumberOfFrames(), cell.getElement()));
}
foreground = unchangedValueColor;
} else {
txt = constraintTxt;
foreground = null;
}
cell.setText(txt);
cell.setForeground(foreground);
super.update(cell);
}
private String getConstraintText(final Object element) {
// Return the invalid value if the input that was entered is not correct
final ConstraintError constraintError = elementToConstraintErrorMap.get(element);
if (constraintError != null) {
return constraintError.constraint;
}
final SimulationEngineState engineState = simulationUiService.getCurrentState().getEngineState();
if (engineState == null) {
return null;
}
final InputConstraint ic = engineState.getElementInputConstraintForNextFrame(element);
if (ic == null) {
return null;
}
return inputConstraintHelper.unparse(ic);
}
@Override
public String getToolTipText(final Object element) {
final ConstraintError constraintError = elementToConstraintErrorMap.get(element);
if (constraintError == null) {
return super.getToolTipText(element);
} else {
return constraintError.errorMessage;
}
}
@Override
protected void measure(final Event event, final Object element) {
}
@Override
protected void erase(final Event event, final Object element) {
// Color cells which contain invalid values
if (elementToConstraintErrorMap.containsKey(element)) {
final GC gc = event.gc;
final Color oldBackground = event.gc.getBackground();
gc.setBackground(constraintErrorColor);
final Rectangle bounds = event.getBounds();
gc.fillRectangle(bounds);
gc.setBackground(oldBackground);
// Ensure that selection and hover indicators are not drawn for the highlighted cell
event.detail &= ~SWT.SELECTED;
event.detail &= ~SWT.HOT;
}
// Disable drawing foreground. paint() will draw the foreground text in order to fix coloring issues when the row is selected.
event.detail &= ~SWT.FOREGROUND;
}
@Override
protected void paint(final Event event, final Object element) {
// Draw just the text with the appropriate background color
final TreeItem item = (TreeItem) event.item;
final Rectangle textBounds = item.getTextBounds(event.index);
final GC gc = event.gc;
final String txt = item.getText(event.index);
gc.setForeground(item.getForeground(event.index));
String drawTxt = txt;
// Check the width of the text and truncate it as necessary
final int maxWidth = Math.max(gc.getClipping().width - 6, textBounds.width);
if (maxWidth > 0) {
String truncatedTxt = txt;
while (gc.textExtent(drawTxt).x > maxWidth && truncatedTxt.length() > 0) {
truncatedTxt = truncatedTxt.substring(0, truncatedTxt.length() - 1);
drawTxt = truncatedTxt + "...";
}
gc.drawString(drawTxt, textBounds.x, textBounds.y, true);
}
}
});
nextValueEditingSupport = new NextValueEditingSupport(simulationUiService, treeViewer);
nextValueColumn.setEditingSupport(nextValueEditingSupport);
nextValueColumn.getColumn().addControlListener(resizeListener);
// Make headers and lines visible
final Tree tree = treeViewer.getTree();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
createContextMenu(tree);
// Listen for tree resizing
tree.addControlListener(resizeListener);
// Create the slider
frameSlider = new Slider(root, SWT.HORIZONTAL);
frameSlider.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
if (!editingTreeViewer) {
startEditingTreeViewer();
frameScrollOffset = frameSlider.getMaximum() - frameSlider.getSelection() - frameSlider.getThumb();
update();
stopEditingTreeViewer();
}
}
});
GridDataFactory.fillDefaults().grab(true, false).applyTo(frameSlider);
// Add listener and populate UI with current state
simulationUiService.addStateChangeListener(stateListener);
stateListener.onSimulatorStateChanged(simulationUiService.getCurrentState());
}
Aggregations