--- old/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/FileIOPage.java 2019-03-29 15:35:11.262016531 -0400 +++ new/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/FileIOPage.java 2019-03-29 15:35:11.193016944 -0400 @@ -169,6 +169,7 @@ private final ChartCanvas timelineCanvas; private final ChartCanvas durationCanvas; + private final ChartCanvas sizeCanvas; private XYChart timelineChart; private IRange timeRange; private IItemCollection selectionItems; @@ -218,9 +219,16 @@ t2.setText(Messages.PAGES_DURATIONS); t2.setControl(durationCanvas); DataPageToolkit.createChartTooltip(durationCanvas); - + CTabItem t3 = new CTabItem(tabFolder, SWT.NONE); - t3.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION); + t3.setToolTipText(Messages.IO_PAGE_SIZE_DESCRIPTION); + sizeCanvas = new ChartCanvas(tabFolder); + t3.setText(Messages.PAGES_SIZE); + t3.setControl(sizeCanvas); + DataPageToolkit.createChartTooltip(sizeCanvas); + + CTabItem t4 = new CTabItem(tabFolder, SWT.NONE); + t4.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION); itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT))); MCContextMenuManager itemListMm = MCContextMenuManager .create(itemList.getManager().getViewer().getControl()); @@ -229,13 +237,13 @@ Messages.FileIOPage_LOG_SELECTION, itemListMm); itemList.getManager().getViewer().addSelectionChangedListener( e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get()))); - t3.setText(Messages.PAGES_EVENT_LOG); + t4.setText(Messages.PAGES_EVENT_LOG); itemListFilter = FilterComponent.createFilterComponent(itemList, FileIOPage.this.itemListFilter, getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections, this::onListFilterChange); itemListMm.add(itemListFilter.getShowFilterAction()); itemListMm.add(itemListFilter.getShowSearchAction()); - t3.setControl(itemListFilter.getComponent()); + t4.setControl(itemListFilter.getComponent()); tableFilter.loadState(state.getChild(FILE_IO_TABLE)); itemListFilter.loadState(state.getChild(FILE_IO_LIST)); @@ -323,6 +331,7 @@ String pathCount = pathCount(histogramSelection.getRowCount()); List timelineRows = new ArrayList<>(); List durationRows = new ArrayList<>(); + List sizeRows = new ArrayList<>(); IItemCollection readItems = selectedItems.apply(JdkFilters.FILE_READ); if (readItems.hasItems()) { timelineRows.add(DataPageToolkit.buildSizeRow(Messages.FileIOPage_ROW_FILE_READ + pathCount, @@ -331,6 +340,9 @@ durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_READ + pathCount, JdkAggregators.FILE_READ_COUNT.getDescription(), readItems, JdkAggregators.FILE_READ_COUNT, READ_COLOR)); + sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.FileIOPage_ROW_FILE_READ + pathCount, + JdkAggregators.FILE_READ_COUNT.getDescription(), readItems, JdkAggregators.FILE_READ_COUNT, + READ_COLOR, JdkAttributes.IO_FILE_BYTES_READ)); } IItemCollection writeItems = selectedItems.apply(JdkFilters.FILE_WRITE); if (writeItems.hasItems()) { @@ -340,12 +352,16 @@ durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_WRITE + pathCount, JdkAggregators.FILE_WRITE_COUNT.getDescription(), writeItems, JdkAggregators.FILE_WRITE_COUNT, WRITE_COLOR)); + sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.FileIOPage_ROW_FILE_WRITE + pathCount, + JdkAggregators.FILE_WRITE_COUNT.getDescription(), writeItems, JdkAggregators.FILE_WRITE_COUNT, + WRITE_COLOR, JdkAttributes.IO_FILE_BYTES_WRITTEN)); } // ItemRow[] pathRows = selection.getSelectedRows(FileIOPage::buildPathLane).toArray(ItemRow[]::new); timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows)); IXDataRenderer durationRoot = RendererToolkit.uniformRows(durationRows); + // FIXME: X-auto-range should be done properly IQuantity max = selectedItems.getAggregate(JdkAggregators.LONGEST_EVENT); // FIXME: Workaround to make max value included @@ -359,6 +375,19 @@ SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart, JfrAttributes.DURATION, Messages.FileIOPage_DURATION_SELECTION, durationCanvas.getContextMenu()); itemList.show(selectedItems); + + IXDataRenderer sizeRoot = RendererToolkit.uniformRows(sizeRows); + IQuantity sizeMax = selectedItems.getAggregate(JdkAggregators.FILE_READ_LARGEST); + // FIXME: Workaround to make max value included + sizeMax = sizeMax == null ? UnitLookup.BYTE.quantity(64): sizeMax.add(UnitLookup.BYTE.quantity(64)); + XYChart sizeChart = new XYChart(UnitLookup.BYTE.quantity(0), sizeMax, sizeRoot, 180); + DataPageToolkit.setChart(sizeCanvas, sizeChart, JdkAttributes.IO_SIZE, + selection -> pageContainer.showSelection(selection)); + sizeChart.setVisibleRange(sizeRange.getStart(), sizeRange.getEnd()); + sizeChart.addVisibleRangeListener(range -> sizeRange = range); + sizeCanvas.setChart(sizeChart); + SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), sizeChart, + JdkAttributes.IO_SIZE, Messages.FileIOPage_SIZE_SELECTION, sizeCanvas.getContextMenu()); } } @@ -389,12 +418,15 @@ private int tabFolderIndex = 0; private IRange timelineRange; private IRange durationRange; + private IRange sizeRange; + public FlavorSelectorState flavorSelectorState; public FileIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) { super(dpd, items, editor); timelineRange = editor.getRecordingRange(); durationRange = editor.getRecordingRange(); + sizeRange = DataPageToolkit.buildSizeRange(items.getItems(), false); } // private static ItemRow buildPathLane(Object path, Supplier> pathItems) {