private void init()

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));
		}