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:
|