public AncestorViewer()

in src/application/org.openjdk.jmc.joverflow.ui/src/main/java/org/openjdk/jmc/joverflow/ui/viewers/AncestorViewer.java [83:275]


	public AncestorViewer(Composite parent, int style) {
		mContainer = new SashForm(parent, style);

		{
			Composite leftContainer = new Composite(mContainer, SWT.BORDER);
			leftContainer.setLayout(new FormLayout());

			Label title = new Label(leftContainer, SWT.NONE);
			title.setText("Ancestor Referrer");
			{
				FormData data = new FormData();
				data.top = new FormAttachment(0, 10);
				data.left = new FormAttachment(0, 10);
				title.setLayoutData(data);

			}

			{
				Button update = new Button(leftContainer, SWT.NONE);
				update.setText("Update");
				update.addListener(SWT.Selection, event -> updatePrefixFilter());
				{
					FormData data = new FormData();
					data.bottom = new FormAttachment(100, -10);
					data.right = new FormAttachment(100, -10);
					update.setLayoutData(data);
				}

				mInput = new Text(leftContainer, SWT.BORDER);
				mInput.setMessage("Ancestor prefix");
				mInput.addListener(SWT.Traverse, event -> {
					if (event.detail == SWT.TRAVERSE_RETURN) {
						updatePrefixFilter();
					}
				});
				{

					FormData fd_text = new FormData();
					fd_text.right = new FormAttachment(update, -10);
					fd_text.bottom = new FormAttachment(update, 0, SWT.CENTER);
					fd_text.left = new FormAttachment(0, 10);
					mInput.setLayoutData(fd_text);
				}

				SashForm container = new SashForm(leftContainer, SWT.VERTICAL);
				{
					FormData fd_sashForm = new FormData();
					fd_sashForm.bottom = new FormAttachment(update, -10);
					fd_sashForm.top = new FormAttachment(title, 10);
					fd_sashForm.right = new FormAttachment(100, -10);
					fd_sashForm.left = new FormAttachment(0, 10);
					container.setLayoutData(fd_sashForm);
				}

				mPieChart = new PieChartViewer(container, SWT.NONE);
				mPieChart.setContentProvider(ArrayContentProvider.getInstance());
				ColorIndexedArcAttributeProvider provider = new ColorIndexedArcAttributeProvider() {
					@Override
					public int getWeight(Object element) {
						return (int) ((MemoryStatisticsItem) element).getMemory();
					}
				};
				provider.setMinimumArcAngle(5);
				mPieChart.setArcAttributeProvider(provider);
				mPieChart.setMinimumArcAngle(5);
				mPieChart.getPieChart().setZoomRatio(1.2);
				mPieChart.setComparator(new ViewerComparator() {
					@Override
					public int compare(Viewer viewer, Object e1, Object e2) {
						return (int) (((MemoryStatisticsItem) e2).getMemory()
								- ((MemoryStatisticsItem) e1).getMemory());
					}
				});

				mFilterList = new FilterList<>(container, SWT.NONE);
				mFilterList.addFilterChangedListener(this::notifyFilterChangedListeners);

				container.setWeights(new int[] {3, 2});
			}

		}

		{
			Composite tableContainer = new Composite(mContainer, SWT.BORDER);
			tableContainer.setLayout(new FillLayout(SWT.HORIZONTAL));

			mTableViewer = new MemoryStatisticsTableViewer(tableContainer, SWT.NONE);

			BiConsumer<MemoryStatisticsItem, Boolean> addFilter = (item, exclusion) -> {
				if (item.getId() == null) {
					return;
				}

				mFilterList.addFilter(new Predicate<RefChainElement>() {
					final String ancestor = item.getId().toString();
					final boolean excluded = exclusion;

					@Override
					public boolean test(RefChainElement referrer) {
						while (referrer != null) {
							String refName = referrer.toString();
							if (ancestor.equals(refName)) {
								return !excluded;
							}
							referrer = referrer.getReferer();
						}
						return excluded;
					}

					@Override
					public String toString() {
						return "Ancestors" + (excluded ? " \u220C " : " \u220B ") + ancestor; //$NON-NLS-2$ //$NON-NLS-3$
					}

					@Override
					public int hashCode() {
						return ancestor.hashCode();
					}

					@Override
					public boolean equals(Object obj) {
						if (obj == null) {
							return false;
						}
						if (getClass() != obj.getClass()) {
							return false;
						}

						return hashCode() == obj.hashCode();
					}
				});

			};

			mPieChart.getPieChart().addMouseListener(new MouseListener() {
				@Override
				public void mouseDoubleClick(MouseEvent e) {
					// no op
				}

				@Override
				public void mouseDown(MouseEvent e) {
					// no op
				}

				@Override
				public void mouseUp(MouseEvent e) {
					ArcItem item = mPieChart.getPieChart().getHighlightedItem();
					if (item == null) {
						return;
					}

					if (item.getData() == null) {
						return;
					}

					addFilter.accept((MemoryStatisticsItem) item.getData(), e.button != 1);
				}
			});

			mTableViewer.getTable().addMouseListener(new MouseListener() {
				@Override
				public void mouseDoubleClick(MouseEvent e) {
					// no op
				}

				@Override
				public void mouseDown(MouseEvent e) {
					// no op
				}

				@Override
				public void mouseUp(MouseEvent e) {
					if (e.button != 1 && e.button != 3) {
						return;
					}

					if (mTableViewer.getSelection().isEmpty()) {
						return;
					}

					IStructuredSelection selection = (IStructuredSelection) mTableViewer.getSelection();
					MemoryStatisticsItem item = (MemoryStatisticsItem) selection.getFirstElement();
					addFilter.accept(item, e.button != 1);
				}
			});
		}

		mContainer.setWeights(new int[] {1, 2});

		mTableViewer.setPieChartViewer(mPieChart);
		mPieChart.setTableViewer(mTableViewer);
	}