in src/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/common/LaneEditor.java [134:294]
private void init() {
// FIXME: Do we want to group under categories somehow, or just hide the filters that don't have any existing event types.
this.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
Composite laneHeaderContainer = new Composite(this, SWT.NONE);
laneHeaderContainer.setLayout(GridLayoutFactory.swtDefaults().create());
laneHeaderContainer.setLayoutData(GridDataFactory.fillDefaults().create());
// FIXME: Add a duplicate action?
IAction moveUpAction = ActionToolkit.action(() -> moveSelected(true), Messages.LANES_MOVE_UP_ACTION,
UIPlugin.getDefault().getMCImageDescriptor(UIPlugin.ICON_NAV_UP));
IAction moveDownAction = ActionToolkit.action(() -> moveSelected(false), Messages.LANES_MOVE_DOWN_ACTION,
UIPlugin.getDefault().getMCImageDescriptor(UIPlugin.ICON_NAV_DOWN));
IAction addAction = ActionToolkit.action(this::addLane, Messages.LANES_ADD_LANE_ACTION,
UIPlugin.getDefault().getMCImageDescriptor(UIPlugin.ICON_ADD));
IAction removeAction = ActionToolkit.commandAction(this::deleteSelected,
IWorkbenchCommandConstants.EDIT_DELETE);
Control toolbar = ActionUiToolkit.buildToolBar(laneHeaderContainer,
Stream.of(moveUpAction, moveDownAction, addAction, removeAction), false);
toolbar.setLayoutData(GridDataFactory.fillDefaults().create());
Label lanesTitle = new Label(laneHeaderContainer, SWT.NONE);
lanesTitle.setText(Messages.LANES_EDITOR_LABEL);
lanesTitle.setLayoutData(GridDataFactory.fillDefaults().create());
Label filterTitle = new Label(this, SWT.NONE);
filterTitle.setText(Messages.LANES_FILTER_LABEL);
filterTitle.setLayoutData(
GridDataFactory.fillDefaults().grab(true, false).align(SWT.BEGINNING, SWT.END).create());
lanesViewer = CheckboxTableViewer.newCheckList(this, SWT.BORDER | SWT.V_SCROLL);
TableViewerColumn viewerColumn = new TableViewerColumn(lanesViewer, SWT.NONE);
viewerColumn.getColumn().setText(Messages.LANES_LANE_COLUMN);
viewerColumn.getColumn().setWidth(200);
// FIXME: Would like to enable editing by some other means than single-clicking, but seems a bit tricky.
viewerColumn.setEditingSupport(new EditingSupport(lanesViewer) {
private String currentName;
@Override
protected void setValue(Object element, Object value) {
String newName = value.toString();
if (currentName != null && currentName.equals(newName)) {
return;
}
LaneDefinition oldLd = (LaneDefinition) element;
LaneDefinition newLane = new LaneDefinition(value.toString(), oldLd.enabled, oldLd.filter,
oldLd.isRestLane);
int elementIndex = lanes.indexOf(element);
lanes.set(elementIndex, newLane);
lanesViewer.replace(newLane, elementIndex);
getViewer().update(element, null);
}
@Override
protected Object getValue(Object element) {
currentName = ((LaneDefinition) element).getName();
return currentName;
}
@Override
protected CellEditor getCellEditor(Object element) {
return new TextCellEditor((Composite) getViewer().getControl());
}
@Override
protected boolean canEdit(Object element) {
return true;
}
});
lanesViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof LaneDefinition) {
if (element == selected) {
return ((LaneDefinition) element).getNameOrCount(filterEditor.getCheckedTypeIds().count());
} else {
return ((LaneDefinition) element).getName();
}
}
return super.getText(element);
};
// FIXME: Do we want to use italics for empty lanes?
// @Override
// public Font getFont(Object element) {
// if (getTypesCount(element) > 0) {
// return JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT);
// } else {
// return JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
// }
// }
//
// private long getTypesCount(Object element) {
// if (element == selected) {
// return filterEditor.getCheckedTypeIds().count();
// } else if (element instanceof LaneDefinition) {
// return ((LaneDefinition)element).getTypesCount();
// }
// return 0;
// }
});
lanesViewer.setContentProvider(ArrayContentProvider.getInstance());
// FIXME: Can we potentially reuse this tooltip in the legend as well?
new ToolTip(lanesViewer.getControl(), ToolTip.NO_RECREATE, false) {
@Override
protected ViewerCell getToolTipArea(Event event) {
return lanesViewer.getCell(new Point(event.x, event.y));
}
@Override
protected Composite createToolTipContentArea(Event event, Composite parent) {
FormText formText = CompositeToolkit.createInfoFormText(parent);
Object element = getToolTipArea(event).getElement();
Stream<String> ids = Stream.empty();
if (element == selected) {
ids = filterEditor.getCheckedTypeIds();
} else if (element instanceof LaneDefinition
&& ((LaneDefinition) element).filter instanceof Types) {
ids = ((Types) ((LaneDefinition) element).filter).getTypes().stream();
}
StringBuilder sb = new StringBuilder();
ids.forEach(typeId -> {
Color color = TypeLabelProvider.getColorOrDefault(typeId);
formText.setImage(typeId, SWTColorToolkit.getColorThumbnail(SWTColorToolkit.asRGB(color)));
sb.append("<li style='image' value='" + typeId + "'>" + typeId + "</li>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
});
if (sb.length() > 0) {
sb.insert(0, "<form>"); //$NON-NLS-1$
sb.append("</form>"); //$NON-NLS-1$
formText.setText(sb.toString(), true, false);
} else {
formText.setText(Messages.LANES_CHECK_TO_INCLUDE, false, false);
}
return formText;
}
};
lanesViewer.setInput(lanes);
lanesViewer.setCheckedElements(lanes.stream().filter(ld -> ld.isEnabled()).toArray());
MCContextMenuManager mm = MCContextMenuManager.create(lanesViewer.getControl());
mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, moveUpAction);
mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, moveDownAction);
// FIXME: Add icon
mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, addAction);
mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, removeAction);
filterEditor = new TypeFilterBuilder(this, this::onTypeFilterChange);
filterEditor.setInput(root);
filterEditor.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
isDropdownFilter = updateChart != null ? true : false;
lanesViewer.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(false, true).create());
lanesViewer.addSelectionChangedListener(
e -> laneSelectionChanges(((IStructuredSelection) e.getSelection()).getFirstElement()));
LaneDefinition firstLane = lanes.get(0);
lanesViewer.setSelection(new StructuredSelection(firstLane));
}