package org.robotframework.ide.eclipse.main.plugin.tableeditor;
import java.util.List;
import java.util.Optional;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.data.IRowDataProvider;
import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.tooltip.NatTableContentTooltip;
import org.eclipse.swt.widgets.Event;
import org.robotframework.ide.eclipse.main.plugin.model.RobotFileInternalElement;
import com.google.common.base.Joiner;
public class RedNatTableContentTooltip extends NatTableContentTooltip {
private final SuiteFileMarkersContainer markersContainer;
protected final IRowDataProvider<?> dataProvider;
public RedNatTableContentTooltip(final NatTable natTable, final SuiteFileMarkersContainer markersContainer,
final IRowDataProvider<?> dataProvider) {
super(natTable);
this.markersContainer = markersContainer;
this.dataProvider = dataProvider;
}
@Override
protected String getText(final Event event) {
final int col = natTable.getColumnPositionByX(event.x);
final int row = natTable.getRowPositionByY(event.y);
final ILayerCell cell = natTable.getCellByPosition(col, row);
if (cell != null) {
final LabelStack labels = cell.getConfigLabels();
if (labels.hasLabel(MarkersLabelAccumulator.ERROR_MARKER_LABEL)
|| labels.hasLabel(MarkersLabelAccumulator.WARNING_MARKER_LABEL)) {
// substracting -1 due to columns header row
final Optional<RobotFileInternalElement> rowObject = getRowModelObject(row - 1);
final List<String> markerDescriptions = markersContainer.getMarkersMessagesFor(rowObject);
return markerDescriptions.isEmpty() ? null : createMessage(markerDescriptions);
} else {
return super.getText(event);
}
}
return null;
}
protected Optional<RobotFileInternalElement> getRowModelObject(final int rowPosition) {
final Object rowObject = dataProvider.getRowObject(rowPosition);
return rowObject instanceof RobotFileInternalElement ? Optional.of((RobotFileInternalElement) rowObject)
: Optional.<RobotFileInternalElement> empty();
}
private String createMessage(final List<String> markerDescriptions) {
if (markerDescriptions.isEmpty()) {
return null;
} else if (markerDescriptions.size() == 1) {
return Joiner.on('\n').join(markerDescriptions);
} else {
return "Multiple markers at this element\n- " + Joiner.on("\n- ").join(markerDescriptions);
}
}
}