< prev index next >

application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/FileIOPage.java

Print this page




 152                 HISTOGRAM.addColumn(WRITE_SIZE, JdkAggregators.FILE_WRITE_SIZE);
 153                 LIST.addColumn(JdkAttributes.IO_PATH);
 154                 LIST.addColumn(JfrAttributes.START_TIME);
 155                 LIST.addColumn(JfrAttributes.END_TIME);
 156                 LIST.addColumn(JfrAttributes.DURATION);
 157                 LIST.addColumn(JdkAttributes.IO_FILE_BYTES_READ);
 158                 LIST.addColumn(JdkAttributes.IO_FILE_BYTES_WRITTEN);
 159                 LIST.addColumn(JfrAttributes.EVENT_THREAD);
 160                 LIST.addColumn(JdkAttributes.IO_FILE_READ_EOF);
 161         }
 162 
 163         private class IOPageUi implements IPageUI {
 164                 private static final String FILE_IO_TABLE = "fileIoTable"; //$NON-NLS-1$
 165                 private static final String FILE_IO_LIST = "fileIoList"; //$NON-NLS-1$
 166                 private static final String SASH_ELEMENT = "sash"; //$NON-NLS-1$
 167                 private static final String LIST_ELEMENT = "eventList"; //$NON-NLS-1$
 168                 private static final String TABLE_ELEMENT = "table"; //$NON-NLS-1$
 169 
 170                 private final ChartCanvas timelineCanvas;
 171                 private final ChartCanvas durationCanvas;

 172                 private XYChart timelineChart;
 173                 private IRange<IQuantity> timeRange;
 174                 private IItemCollection selectionItems;
 175                 private final ItemList itemList;
 176                 private final ItemHistogram table;
 177                 private final SashForm sash;
 178                 private final IPageContainer pageContainer;
 179                 private FilterComponent tableFilter;
 180                 private FilterComponent itemListFilter;
 181                 private FlavorSelector flavorSelector;
 182 
 183                 IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 184                         this.pageContainer = pageContainer;
 185                         Form form = DataPageToolkit.createForm(parent, toolkit, getName(), getIcon());
 186                         sash = new SashForm(form.getBody(), SWT.VERTICAL);
 187                         toolkit.adapt(sash);
 188 
 189                         addResultActions(form);
 190 
 191                         table = HISTOGRAM.buildWithoutBorder(sash, JdkAttributes.IO_PATH,


 203                         mm.add(tableFilter.getShowFilterAction());
 204                         mm.add(tableFilter.getShowSearchAction());
 205 
 206                         CTabFolder tabFolder = new CTabFolder(sash, SWT.NONE);
 207                         toolkit.adapt(tabFolder);
 208                         CTabItem t1 = new CTabItem(tabFolder, SWT.NONE);
 209                         t1.setToolTipText(Messages.IO_PAGE_TIMELINE_DESCRIPTION);
 210                         timelineCanvas = new ChartCanvas(tabFolder);
 211                         t1.setText(Messages.PAGES_TIMELINE);
 212                         t1.setControl(timelineCanvas);
 213                         DataPageToolkit.createChartTimestampTooltip(timelineCanvas);
 214 
 215                         CTabItem t2 = new CTabItem(tabFolder, SWT.NONE);
 216                         t2.setToolTipText(Messages.IO_PAGE_DURATIONS_DESCRIPTION);
 217                         durationCanvas = new ChartCanvas(tabFolder);
 218                         t2.setText(Messages.PAGES_DURATIONS);
 219                         t2.setControl(durationCanvas);
 220                         DataPageToolkit.createChartTooltip(durationCanvas);
 221 
 222                         CTabItem t3 = new CTabItem(tabFolder, SWT.NONE);
 223                         t3.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);







 224                         itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT)));
 225                         MCContextMenuManager itemListMm = MCContextMenuManager
 226                                         .create(itemList.getManager().getViewer().getControl());
 227                         ColumnMenusFactory.addDefaultMenus(itemList.getManager(), itemListMm);
 228                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), itemList,
 229                                         Messages.FileIOPage_LOG_SELECTION, itemListMm);
 230                         itemList.getManager().getViewer().addSelectionChangedListener(
 231                                         e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get())));
 232                         t3.setText(Messages.PAGES_EVENT_LOG);
 233                         itemListFilter = FilterComponent.createFilterComponent(itemList, FileIOPage.this.itemListFilter,
 234                                         getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections,
 235                                         this::onListFilterChange);
 236                         itemListMm.add(itemListFilter.getShowFilterAction());
 237                         itemListMm.add(itemListFilter.getShowSearchAction());
 238                         t3.setControl(itemListFilter.getComponent());
 239 
 240                         tableFilter.loadState(state.getChild(FILE_IO_TABLE));
 241                         itemListFilter.loadState(state.getChild(FILE_IO_LIST));
 242 
 243                         tabFolder.setSelection(tabFolderIndex);
 244                         tabFolder.addSelectionListener(new SelectionAdapter() {
 245                                 @Override
 246                                 public void widgetSelected(SelectionEvent e) {
 247                                         tabFolderIndex = ((CTabFolder) e.getSource()).getSelectionIndex();
 248                                 }
 249                         });
 250 
 251                         timelineChart = createTimelineChart(pageContainer);
 252                         hookUpTimeLineChart();
 253                         PersistableSashForm.loadState(sash, state.getChild(SASH_ELEMENT));
 254 
 255                         flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_ITEMS, getDataSource().getItems(),
 256                                         pageContainer, this::onInputSelected, this::onShowFlavor, flavorSelectorState);
 257 
 258                         table.getManager().setSelectionState(tableSelection);


 306                                         JfrAttributes.LIFETIME, Messages.FileIOPage_TIMELINE_SELECTION, timelineCanvas.getContextMenu());
 307                 }
 308 
 309                 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
 310                         this.selectionItems = items;
 311                         this.timeRange = timeRange;
 312                         updateDetails();
 313                 }
 314 
 315                 private void updateDetails() {
 316                         IItemCollection items = selectionItems != null ? selectionItems.apply(TABLE_ITEMS)
 317                                         : getDataSource().getItems().apply(TABLE_ITEMS);
 318                         table.show(items);
 319                         HistogramSelection histogramSelection = table.getSelection();
 320                         IItemCollection selectedItems = histogramSelection.getRowCount() == 0 ? items
 321                                         : histogramSelection.getItems();
 322 
 323                         String pathCount = pathCount(histogramSelection.getRowCount());
 324                         List<IXDataRenderer> timelineRows = new ArrayList<>();
 325                         List<IXDataRenderer> durationRows = new ArrayList<>();

 326                         IItemCollection readItems = selectedItems.apply(JdkFilters.FILE_READ);
 327                         if (readItems.hasItems()) {
 328                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.FileIOPage_ROW_FILE_READ + pathCount,
 329                                                 JdkAggregators.FILE_READ_SIZE.getDescription(), readItems, JdkAggregators.FILE_READ_SIZE,
 330                                                 READ_COLOR, FileIOPage::getColor));
 331                                 durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_READ + pathCount,
 332                                                 JdkAggregators.FILE_READ_COUNT.getDescription(), readItems, JdkAggregators.FILE_READ_COUNT,
 333                                                 READ_COLOR));



 334                         }
 335                         IItemCollection writeItems = selectedItems.apply(JdkFilters.FILE_WRITE);
 336                         if (writeItems.hasItems()) {
 337                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.FileIOPage_ROW_FILE_WRITE + pathCount,
 338                                                 JdkAggregators.FILE_WRITE_SIZE.getDescription(), writeItems, JdkAggregators.FILE_WRITE_SIZE,
 339                                                 WRITE_COLOR, FileIOPage::getColor));
 340                                 durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_WRITE + pathCount,
 341                                                 JdkAggregators.FILE_WRITE_COUNT.getDescription(), writeItems, JdkAggregators.FILE_WRITE_COUNT,
 342                                                 WRITE_COLOR));



 343                         }
 344 //                      ItemRow[] pathRows = selection.getSelectedRows(FileIOPage::buildPathLane).toArray(ItemRow[]::new);
 345 
 346                         timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows));
 347 
 348                         IXDataRenderer durationRoot = RendererToolkit.uniformRows(durationRows);

 349                         // FIXME: X-auto-range should be done properly
 350                         IQuantity max = selectedItems.getAggregate(JdkAggregators.LONGEST_EVENT);
 351                         // FIXME: Workaround to make max value included
 352                         max = max == null ? UnitLookup.MILLISECOND.quantity(20) : max.add(UnitLookup.MILLISECOND.quantity(20));
 353                         XYChart durationChart = new XYChart(UnitLookup.MILLISECOND.quantity(0), max, durationRoot, 180);
 354                         DataPageToolkit.setChart(durationCanvas, durationChart, JfrAttributes.DURATION,
 355                                         selection -> pageContainer.showSelection(selection));
 356                         durationChart.setVisibleRange(durationRange.getStart(), durationRange.getEnd());
 357                         durationChart.addVisibleRangeListener(range -> durationRange = range);
 358                         durationCanvas.setChart(durationChart);
 359                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart,
 360                                         JfrAttributes.DURATION, Messages.FileIOPage_DURATION_SELECTION, durationCanvas.getContextMenu());
 361                         itemList.show(selectedItems);













 362                 }
 363         }
 364 
 365         private static TableSettings getTableSettings(IState state) {
 366                 if (state == null) {
 367                         return new TableSettings(TOTAL_TIME, Arrays.asList(
 368                                         new ColumnSettings(ItemHistogram.KEY_COL_ID, false, 500, null),
 369                                         new ColumnSettings(TOTAL_TIME, true, 120, false), new ColumnSettings(MAX_TIME, false, 120, false),
 370                                         new ColumnSettings(AVG_TIME, false, 120, false), new ColumnSettings(STDDEV_TIME, false, 120, false),
 371                                         new ColumnSettings(READ_COUNT, false, 120, false),
 372                                         new ColumnSettings(WRITE_COUNT, false, 120, false),
 373                                         new ColumnSettings(READ_SIZE, false, 120, false), new ColumnSettings(WRITE_SIZE, false, 120, false),
 374                                         new ColumnSettings(READ_EOF, false, 80, false)));
 375                 } else {
 376                         return new TableSettings(state);
 377                 }
 378         }
 379 
 380         @Override
 381         public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 382                 return new IOPageUi(parent, toolkit, pageContainer, state);
 383         }
 384 
 385         private SelectionState tableSelection;
 386         private SelectionState itemListSelection;
 387         private IItemFilter tableFilter = null;
 388         private IItemFilter itemListFilter = null;
 389         private int tabFolderIndex = 0;
 390         private IRange<IQuantity> timelineRange;
 391         private IRange<IQuantity> durationRange;


 392         public FlavorSelectorState flavorSelectorState;
 393 
 394         public FileIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 395                 super(dpd, items, editor);
 396                 timelineRange = editor.getRecordingRange();
 397                 durationRange = editor.getRecordingRange();

 398         }
 399 
 400 //      private static ItemRow buildPathLane(Object path, Supplier<Stream<ItemStream>> pathItems) {
 401 //              String pathName = String.valueOf(path);
 402 //              pathName = pathName.length() > 26 ? pathName.substring(0, 23) + "..." : pathName; //$NON-NLS-1$
 403 //              return new ItemRow(pathName, buildSpanRenderer(pathItems), pathItems);
 404 //      }
 405 
 406         private static Color getColor(IItem item) {
 407                 return JdkTypeIDs.FILE_READ.equals(item.getType().getIdentifier()) ? READ_ALPHA_COLOR : WRITE_ALPHA_COLOR;
 408         }
 409 
 410         @Override
 411         public IItemFilter getDefaultSelectionFilter() {
 412                 return TABLE_ITEMS;
 413         }
 414 
 415         private static String pathCount(int count) {
 416                 switch (count) {
 417                 case 0:


 152                 HISTOGRAM.addColumn(WRITE_SIZE, JdkAggregators.FILE_WRITE_SIZE);
 153                 LIST.addColumn(JdkAttributes.IO_PATH);
 154                 LIST.addColumn(JfrAttributes.START_TIME);
 155                 LIST.addColumn(JfrAttributes.END_TIME);
 156                 LIST.addColumn(JfrAttributes.DURATION);
 157                 LIST.addColumn(JdkAttributes.IO_FILE_BYTES_READ);
 158                 LIST.addColumn(JdkAttributes.IO_FILE_BYTES_WRITTEN);
 159                 LIST.addColumn(JfrAttributes.EVENT_THREAD);
 160                 LIST.addColumn(JdkAttributes.IO_FILE_READ_EOF);
 161         }
 162 
 163         private class IOPageUi implements IPageUI {
 164                 private static final String FILE_IO_TABLE = "fileIoTable"; //$NON-NLS-1$
 165                 private static final String FILE_IO_LIST = "fileIoList"; //$NON-NLS-1$
 166                 private static final String SASH_ELEMENT = "sash"; //$NON-NLS-1$
 167                 private static final String LIST_ELEMENT = "eventList"; //$NON-NLS-1$
 168                 private static final String TABLE_ELEMENT = "table"; //$NON-NLS-1$
 169 
 170                 private final ChartCanvas timelineCanvas;
 171                 private final ChartCanvas durationCanvas;
 172                 private final ChartCanvas sizeCanvas;
 173                 private XYChart timelineChart;
 174                 private IRange<IQuantity> timeRange;
 175                 private IItemCollection selectionItems;
 176                 private final ItemList itemList;
 177                 private final ItemHistogram table;
 178                 private final SashForm sash;
 179                 private final IPageContainer pageContainer;
 180                 private FilterComponent tableFilter;
 181                 private FilterComponent itemListFilter;
 182                 private FlavorSelector flavorSelector;
 183 
 184                 IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 185                         this.pageContainer = pageContainer;
 186                         Form form = DataPageToolkit.createForm(parent, toolkit, getName(), getIcon());
 187                         sash = new SashForm(form.getBody(), SWT.VERTICAL);
 188                         toolkit.adapt(sash);
 189 
 190                         addResultActions(form);
 191 
 192                         table = HISTOGRAM.buildWithoutBorder(sash, JdkAttributes.IO_PATH,


 204                         mm.add(tableFilter.getShowFilterAction());
 205                         mm.add(tableFilter.getShowSearchAction());
 206 
 207                         CTabFolder tabFolder = new CTabFolder(sash, SWT.NONE);
 208                         toolkit.adapt(tabFolder);
 209                         CTabItem t1 = new CTabItem(tabFolder, SWT.NONE);
 210                         t1.setToolTipText(Messages.IO_PAGE_TIMELINE_DESCRIPTION);
 211                         timelineCanvas = new ChartCanvas(tabFolder);
 212                         t1.setText(Messages.PAGES_TIMELINE);
 213                         t1.setControl(timelineCanvas);
 214                         DataPageToolkit.createChartTimestampTooltip(timelineCanvas);
 215 
 216                         CTabItem t2 = new CTabItem(tabFolder, SWT.NONE);
 217                         t2.setToolTipText(Messages.IO_PAGE_DURATIONS_DESCRIPTION);
 218                         durationCanvas = new ChartCanvas(tabFolder);
 219                         t2.setText(Messages.PAGES_DURATIONS);
 220                         t2.setControl(durationCanvas);
 221                         DataPageToolkit.createChartTooltip(durationCanvas);
 222                         
 223                         CTabItem t3 = new CTabItem(tabFolder, SWT.NONE);
 224                         t3.setToolTipText(Messages.IO_PAGE_SIZE_DESCRIPTION);
 225                         sizeCanvas = new ChartCanvas(tabFolder);
 226                         t3.setText(Messages.PAGES_SIZE);
 227                         t3.setControl(sizeCanvas);
 228                         DataPageToolkit.createChartTooltip(sizeCanvas);
 229 
 230                         CTabItem t4 = new CTabItem(tabFolder, SWT.NONE);
 231                         t4.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);
 232                         itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT)));
 233                         MCContextMenuManager itemListMm = MCContextMenuManager
 234                                         .create(itemList.getManager().getViewer().getControl());
 235                         ColumnMenusFactory.addDefaultMenus(itemList.getManager(), itemListMm);
 236                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), itemList,
 237                                         Messages.FileIOPage_LOG_SELECTION, itemListMm);
 238                         itemList.getManager().getViewer().addSelectionChangedListener(
 239                                         e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get())));
 240                         t4.setText(Messages.PAGES_EVENT_LOG);
 241                         itemListFilter = FilterComponent.createFilterComponent(itemList, FileIOPage.this.itemListFilter,
 242                                         getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections,
 243                                         this::onListFilterChange);
 244                         itemListMm.add(itemListFilter.getShowFilterAction());
 245                         itemListMm.add(itemListFilter.getShowSearchAction());
 246                         t4.setControl(itemListFilter.getComponent());
 247 
 248                         tableFilter.loadState(state.getChild(FILE_IO_TABLE));
 249                         itemListFilter.loadState(state.getChild(FILE_IO_LIST));
 250 
 251                         tabFolder.setSelection(tabFolderIndex);
 252                         tabFolder.addSelectionListener(new SelectionAdapter() {
 253                                 @Override
 254                                 public void widgetSelected(SelectionEvent e) {
 255                                         tabFolderIndex = ((CTabFolder) e.getSource()).getSelectionIndex();
 256                                 }
 257                         });
 258 
 259                         timelineChart = createTimelineChart(pageContainer);
 260                         hookUpTimeLineChart();
 261                         PersistableSashForm.loadState(sash, state.getChild(SASH_ELEMENT));
 262 
 263                         flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_ITEMS, getDataSource().getItems(),
 264                                         pageContainer, this::onInputSelected, this::onShowFlavor, flavorSelectorState);
 265 
 266                         table.getManager().setSelectionState(tableSelection);


 314                                         JfrAttributes.LIFETIME, Messages.FileIOPage_TIMELINE_SELECTION, timelineCanvas.getContextMenu());
 315                 }
 316 
 317                 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
 318                         this.selectionItems = items;
 319                         this.timeRange = timeRange;
 320                         updateDetails();
 321                 }
 322 
 323                 private void updateDetails() {
 324                         IItemCollection items = selectionItems != null ? selectionItems.apply(TABLE_ITEMS)
 325                                         : getDataSource().getItems().apply(TABLE_ITEMS);
 326                         table.show(items);
 327                         HistogramSelection histogramSelection = table.getSelection();
 328                         IItemCollection selectedItems = histogramSelection.getRowCount() == 0 ? items
 329                                         : histogramSelection.getItems();
 330 
 331                         String pathCount = pathCount(histogramSelection.getRowCount());
 332                         List<IXDataRenderer> timelineRows = new ArrayList<>();
 333                         List<IXDataRenderer> durationRows = new ArrayList<>();
 334                         List<IXDataRenderer> sizeRows = new ArrayList<>();
 335                         IItemCollection readItems = selectedItems.apply(JdkFilters.FILE_READ);
 336                         if (readItems.hasItems()) {
 337                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.FileIOPage_ROW_FILE_READ + pathCount,
 338                                                 JdkAggregators.FILE_READ_SIZE.getDescription(), readItems, JdkAggregators.FILE_READ_SIZE,
 339                                                 READ_COLOR, FileIOPage::getColor));
 340                                 durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_READ + pathCount,
 341                                                 JdkAggregators.FILE_READ_COUNT.getDescription(), readItems, JdkAggregators.FILE_READ_COUNT,
 342                                                 READ_COLOR));
 343                                 sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.FileIOPage_ROW_FILE_READ + pathCount,
 344                                                 JdkAggregators.FILE_READ_COUNT.getDescription(), readItems, JdkAggregators.FILE_READ_COUNT,
 345                                                 READ_COLOR, JdkAttributes.IO_FILE_BYTES_READ));
 346                         }
 347                         IItemCollection writeItems = selectedItems.apply(JdkFilters.FILE_WRITE);
 348                         if (writeItems.hasItems()) {
 349                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.FileIOPage_ROW_FILE_WRITE + pathCount,
 350                                                 JdkAggregators.FILE_WRITE_SIZE.getDescription(), writeItems, JdkAggregators.FILE_WRITE_SIZE,
 351                                                 WRITE_COLOR, FileIOPage::getColor));
 352                                 durationRows.add(DataPageToolkit.buildDurationHistogram(Messages.FileIOPage_ROW_FILE_WRITE + pathCount,
 353                                                 JdkAggregators.FILE_WRITE_COUNT.getDescription(), writeItems, JdkAggregators.FILE_WRITE_COUNT,
 354                                                 WRITE_COLOR));
 355                                 sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.FileIOPage_ROW_FILE_WRITE + pathCount,
 356                                                 JdkAggregators.FILE_WRITE_COUNT.getDescription(), writeItems, JdkAggregators.FILE_WRITE_COUNT,
 357                                                 WRITE_COLOR, JdkAttributes.IO_FILE_BYTES_WRITTEN));
 358                         }
 359 //                      ItemRow[] pathRows = selection.getSelectedRows(FileIOPage::buildPathLane).toArray(ItemRow[]::new);
 360 
 361                         timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows));
 362 
 363                         IXDataRenderer durationRoot = RendererToolkit.uniformRows(durationRows);
 364                         
 365                         // FIXME: X-auto-range should be done properly
 366                         IQuantity max = selectedItems.getAggregate(JdkAggregators.LONGEST_EVENT);
 367                         // FIXME: Workaround to make max value included
 368                         max = max == null ? UnitLookup.MILLISECOND.quantity(20) : max.add(UnitLookup.MILLISECOND.quantity(20));
 369                         XYChart durationChart = new XYChart(UnitLookup.MILLISECOND.quantity(0), max, durationRoot, 180);
 370                         DataPageToolkit.setChart(durationCanvas, durationChart, JfrAttributes.DURATION,
 371                                         selection -> pageContainer.showSelection(selection));
 372                         durationChart.setVisibleRange(durationRange.getStart(), durationRange.getEnd());
 373                         durationChart.addVisibleRangeListener(range -> durationRange = range);
 374                         durationCanvas.setChart(durationChart);
 375                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart,
 376                                         JfrAttributes.DURATION, Messages.FileIOPage_DURATION_SELECTION, durationCanvas.getContextMenu());
 377                         itemList.show(selectedItems);
 378                         
 379                         IXDataRenderer sizeRoot = RendererToolkit.uniformRows(sizeRows);
 380                         IQuantity sizeMax = selectedItems.getAggregate(JdkAggregators.FILE_READ_LARGEST);
 381                         // FIXME: Workaround to make max value included
 382                         sizeMax = sizeMax == null ? UnitLookup.BYTE.quantity(64): sizeMax.add(UnitLookup.BYTE.quantity(64));
 383                         XYChart sizeChart = new XYChart(UnitLookup.BYTE.quantity(0), sizeMax, sizeRoot, 180);
 384                         DataPageToolkit.setChart(sizeCanvas, sizeChart, JdkAttributes.IO_SIZE,
 385                                         selection -> pageContainer.showSelection(selection));
 386                         sizeChart.setVisibleRange(sizeRange.getStart(), sizeRange.getEnd());
 387                         sizeChart.addVisibleRangeListener(range -> sizeRange = range);
 388                         sizeCanvas.setChart(sizeChart);
 389                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), sizeChart,
 390                                         JdkAttributes.IO_SIZE, Messages.FileIOPage_SIZE_SELECTION, sizeCanvas.getContextMenu());
 391                 }
 392         }
 393 
 394         private static TableSettings getTableSettings(IState state) {
 395                 if (state == null) {
 396                         return new TableSettings(TOTAL_TIME, Arrays.asList(
 397                                         new ColumnSettings(ItemHistogram.KEY_COL_ID, false, 500, null),
 398                                         new ColumnSettings(TOTAL_TIME, true, 120, false), new ColumnSettings(MAX_TIME, false, 120, false),
 399                                         new ColumnSettings(AVG_TIME, false, 120, false), new ColumnSettings(STDDEV_TIME, false, 120, false),
 400                                         new ColumnSettings(READ_COUNT, false, 120, false),
 401                                         new ColumnSettings(WRITE_COUNT, false, 120, false),
 402                                         new ColumnSettings(READ_SIZE, false, 120, false), new ColumnSettings(WRITE_SIZE, false, 120, false),
 403                                         new ColumnSettings(READ_EOF, false, 80, false)));
 404                 } else {
 405                         return new TableSettings(state);
 406                 }
 407         }
 408 
 409         @Override
 410         public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 411                 return new IOPageUi(parent, toolkit, pageContainer, state);
 412         }
 413 
 414         private SelectionState tableSelection;
 415         private SelectionState itemListSelection;
 416         private IItemFilter tableFilter = null;
 417         private IItemFilter itemListFilter = null;
 418         private int tabFolderIndex = 0;
 419         private IRange<IQuantity> timelineRange;
 420         private IRange<IQuantity> durationRange;
 421         private IRange<IQuantity> sizeRange;
 422 
 423         public FlavorSelectorState flavorSelectorState;
 424 
 425         public FileIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 426                 super(dpd, items, editor);
 427                 timelineRange = editor.getRecordingRange();
 428                 durationRange = editor.getRecordingRange();
 429                 sizeRange = DataPageToolkit.buildSizeRange(items.getItems(), false);
 430         }
 431 
 432 //      private static ItemRow buildPathLane(Object path, Supplier<Stream<ItemStream>> pathItems) {
 433 //              String pathName = String.valueOf(path);
 434 //              pathName = pathName.length() > 26 ? pathName.substring(0, 23) + "..." : pathName; //$NON-NLS-1$
 435 //              return new ItemRow(pathName, buildSpanRenderer(pathItems), pathItems);
 436 //      }
 437 
 438         private static Color getColor(IItem item) {
 439                 return JdkTypeIDs.FILE_READ.equals(item.getType().getIdentifier()) ? READ_ALPHA_COLOR : WRITE_ALPHA_COLOR;
 440         }
 441 
 442         @Override
 443         public IItemFilter getDefaultSelectionFilter() {
 444                 return TABLE_ITEMS;
 445         }
 446 
 447         private static String pathCount(int count) {
 448                 switch (count) {
 449                 case 0:
< prev index next >