public CombinedChartSectionPart()

in src/application/org.openjdk.jmc.rjmx.ui/src/main/java/org/openjdk/jmc/rjmx/ui/internal/CombinedChartSectionPart.java [185:331]


	public CombinedChartSectionPart(Composite parent, FormToolkit toolkit, int style,
			IMRIMetadataService metadataService, IMRIService mris, IAttributeStorageService ss, IMemento state) {
		super(parent, toolkit, style);
		mds = metadataService;
		m_storageService = ss;
		mds.addObserver(metadataObserver);

		m_refreshController = RefreshController.createGroup(parent.getDisplay());
		rateCoordinator = new RateCoordinator();
		m_refreshController.add(rateCoordinator);
		chartDataObserver = new RateLimitedObserver(rateCoordinator, 200) {
			@Override
			protected void doRefresh(Object arg) {
				if (!chart.isDisposed()) {
					if (arg instanceof ITimestampedData) {
						long timestamp = ((ITimestampedData) arg).getX();
						chart.extendsDataRangeToInclude(timestamp);
					} else {
						chart.refresh();
					}
				}
			}
		};
		statisticsDataObserver = new RateLimitedObserver(rateCoordinator, 500) {
			@Override
			protected void doRefresh(Object arg) {
				TableViewer viewer = m_statisticsTable.getViewer();
				Control control = viewer.getControl();
				if ((control != null) && !control.isDisposed()) {
					boolean visible = control.isVisible();
					if (visible) {
						control.setRedraw(false);
					}
					// Unfortunately we have to do this even if not visible, until we reliably can detect when the viewer becomes visible
					// (Ideally, the super class or rate coordinator would handle this transparently for us.)
					viewer.refresh();
					if (visible) {
						control.setRedraw(true);
						control.update();
					}
				}
			}
		};

		Composite body = createSectionBody(MCLayoutFactory.createMarginFreeFormPageLayout());
		// FIXME: Long method, try to break out at least some anonymous classes
		final Composite stackContainer = toolkit.createComposite(body);
		stackContainer.setLayoutData(MCLayoutFactory.createFormPageLayoutData());
		final StackLayout stackLayout = new StackLayout();
		stackContainer.setLayout(stackLayout);
		final Composite chartContainer = toolkit.createComposite(stackContainer);
		chartContainer.setLayout(new GridLayout(2, false));
		IMemento tableState = state == null ? null : state.getChild(TABLE_TAG);
		m_statisticsTable = new StatisticsTable(stackContainer, new AttributeLabelProvider(mds, mris), this, false,
				tableState);
		m_statisticsTable.getViewer().setInput(statisticsProvider);
		chart = new ChartComposite(chartContainer, SWT.NONE, createEnableUpdatesCallback());
		chart.setChartSampleTooltipProvider(new ChartSampleTooltipProvider() {
			@Override
			public String getTooltip(DataSeries<?> series, double value) {
				if (series instanceof MRIDataSeries) {
					MRI mri = ((MRIDataSeries) series).getAttribute();
					IMRIMetadata metadata = mds.getMetadata(mri);
					IUnit unit = UnitLookup.getUnitOrNull(metadata.getUnitString());
					if (unit != null) {
						IQuantity quantity = unit.quantity(value);
						return MRIMetadataToolkit.getDisplayName(mds, mri) + ": " //$NON-NLS-1$
								+ quantity.displayUsing(IDisplayable.VERBOSE) + " (" //$NON-NLS-1$
								+ metadata.getValueType() + ", " //$NON-NLS-1$
								+ MBeanPropertiesOrderer.mriAsTooltip(mri) + ")"; //$NON-NLS-1$
					} else {
						return MRIMetadataToolkit.getDisplayName(mds, mri) + ": " //$NON-NLS-1$
								+ UnitLookup.NUMBER_UNITY.quantity(value).displayUsing(IDisplayable.AUTO) + " (" //$NON-NLS-1$
								+ metadata.getValueType() + ", " //$NON-NLS-1$
								+ MBeanPropertiesOrderer.mriAsTooltip(mri) + ")"; //$NON-NLS-1$
					}
				}
				return String.valueOf(value);
			}
		});
		chart.getChart().setMetadataProvider(new DefaultMetadataProvider() {
			@Override
			public Color getLineColor(DataSeries<?> ds) {
				MRI mri = ((MRIDataSeries) ds).getAttribute();
				return MRIMetadataToolkit.getColor(mds.getMetadata(mri));
			}

			@Override
			public RenderingMode getMode(DataSeries<?> ds) {
				return chart.getChartModel().getRenderingMode();
			}

			@Override
			public double getMultiplier(DataSeries<?> ds) {
				MRI mri = ((MRIDataSeries) ds).getAttribute();
				IUnit unit = UnitLookup.getUnitOrNull(mds.getMetadata(mri).getUnitString());
				if (unit instanceof LinearUnit) {
					LinearUnit linearUnit = (LinearUnit) unit;
					// FIXME: Determine outUnit through autorange, or pick one?
					LinearKindOfQuantity kind = linearUnit.getContentType();
					LinearUnit outUnit = kind.getDefaultUnit();
					return linearUnit.valueTransformTo(outUnit).getMultiplier();
				}
				return 1.0;
			}
		});

		chart.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		chart.showLast(ChartComposite.ONE_MINUTE);
		chart.getChart().setDataProvider(m_dataProvider);
		chart.getChartModel().addObserver(new Observer() {

			@Override
			public void update(Observable o, Object arg) {
				getSection().setText(chart.getChartModel().getChartTitle());
				chart.refresh();
			}
		});
		createLegend(toolkit, chartContainer, mris);
		getMCToolBarManager().add(new AddAttibutesAction(mds, mris, this) {

			@Override
			protected ContentType<?> getContentType() {
				return isEmpty() ? null : chart.getChartModel().getYAxis().getKindOfQuantity();
			}

			@Override
			protected boolean allowMultiple() {
				return !isEmpty();
			}

		}, MCToolBarManager.ALIGN_LEFT);
		accessibleControlAction = new AccessibleControlAction() {
			@Override
			public void run() {
				stackLayout.topControl = isChecked() ? m_statisticsTable.getViewer().getControl() : chartContainer;
				m_statisticsTable.getViewer().getControl().setVisible(isChecked());
				chartContainer.setVisible(!isChecked());
				refreshAll();
			}
		};
		getMCToolBarManager().add(accessibleControlAction);

		if (state != null) {
			restoreState(state);
		}
	}