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