blob: a760995b52748fdbf34545e79b39020acb01b37f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2019 Dirk Fauth and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dirk Fauth - initial API and implementation and/or initial documentation
* Dirk Fauth <dirk.fauth@googlemail.com> - Added improved resource handling
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.examples.examples._102_Configuration;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor;
import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample;
import org.eclipse.nebula.widgets.nattable.examples.runner.StandaloneNatExampleRunner;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator;
import org.eclipse.nebula.widgets.nattable.painter.cell.AutomaticRowHeightTextPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.ImagePainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.CellPainterDecorator;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.LineBorderDecorator;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.PaddingDecorator;
import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.style.HorizontalAlignmentEnum;
import org.eclipse.nebula.widgets.nattable.style.Style;
import org.eclipse.nebula.widgets.nattable.ui.util.CellEdgeEnum;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageDataProvider;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
/**
* Example showing a NatTable with dynamic row height that is increasing and
* shrinking the row height dependent to the content.
*/
public class AutomaticRowHeightExample extends AbstractNatExample {
private static final Display DISPLAY = Display.getDefault();
private final List<LogRecord> logMessages = new ArrayList<>();
public static void main(String[] args) throws Exception {
StandaloneNatExampleRunner.run(new AutomaticRowHeightExample());
}
@Override
public String getDescription() {
return "Demonstrates how to implement a log viewer using NatTable with the percentage "
+ "sizing and the automatic row height calculation feature. If you resize the "
+ "window you will see the rows growing/shrinking to always show the whole content "
+ "by wrapping the text and resizing the row heights.";
}
@Override
public Control createExampleControl(Composite parent) {
Composite panel = new Composite(parent, SWT.NONE);
GridData layoutData = GridDataFactory.fillDefaults().grab(true, true).create();
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.marginWidth = 0;
layout.marginHeight = 0;
panel.setLayout(layout);
panel.setLayoutData(layoutData);
loadMessages();
ListDataProvider<LogRecord> dataProvider =
new ListDataProvider<>(
this.logMessages,
new ReflectiveColumnPropertyAccessor<LogRecord>(new String[] { "message" })); //$NON-NLS-1$
DataLayer dataLayer = new DataLayer(dataProvider);
dataLayer.setColumnPercentageSizing(true);
dataLayer.setColumnWidthPercentageByPosition(0, 100);
dataLayer.setConfigLabelAccumulator(new ValidatorMessageLabelAccumulator());
ViewportLayer layer = new ViewportLayer(dataLayer);
layer.setRegionName(GridRegion.BODY);
NatTable natTable = new NatTable(panel, NatTable.DEFAULT_STYLE_OPTIONS | SWT.BORDER, layer, false);
natTable.addConfiguration(new ValidationMessageTableStyleConfiguration(parent));
natTable.configure();
GridDataFactory.fillDefaults().grab(true, true).applyTo(natTable);
return panel;
}
private void loadMessages() {
String text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
+ "sed diam nonumy eirmod tempor invidunt ut labore et dolore "
+ "magna aliquyam erat, sed diam voluptua.";
Level[] levels = new Level[] { Level.SEVERE, Level.WARNING, Level.INFO };
String[] words = text.split(" ");
Random levelRandom = new Random();
Random wordRandom = new Random();
for (int i = 0; i < 100; i++) {
int randWords = wordRandom.nextInt(words.length);
String msg = "";
for (int j = 0; j < randWords; j++) {
msg += words[j] + " ";
}
this.logMessages.add(
new LogRecord(levels[levelRandom.nextInt(levels.length)], msg));
}
}
public class ValidatorMessageLabelAccumulator implements IConfigLabelAccumulator {
@Override
public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) {
LogRecord vm = AutomaticRowHeightExample.this.logMessages.get(rowPosition);
configLabels.addLabel(vm.getLevel().toString());
}
}
public class ValidationMessageTableStyleConfiguration extends DefaultNatTableStyleConfiguration {
private LocalResourceManager resManager;
private Image errorImage;
private Image warningImage;
private Image infoImage;
public ValidationMessageTableStyleConfiguration(Composite composite) {
this.resManager = new LocalResourceManager(JFaceResources.getResources(), composite);
int IMAGE_SIZE = GUIHelper.convertHorizontalPixelToDpi(16);
this.errorImage = this.resManager.createImage(ImageDescriptor.createFromImageDataProvider(new ImageDataProvider() {
@Override
public ImageData getImageData(int zoom) {
return DISPLAY.getSystemImage(SWT.ICON_ERROR)
.getImageData(zoom).scaledTo(IMAGE_SIZE, IMAGE_SIZE);
}
}));
this.warningImage = this.resManager.createImage(ImageDescriptor.createFromImageDataProvider(new ImageDataProvider() {
@Override
public ImageData getImageData(int zoom) {
return DISPLAY.getSystemImage(SWT.ICON_WARNING)
.getImageData(zoom).scaledTo(IMAGE_SIZE, IMAGE_SIZE);
}
}));
this.infoImage = this.resManager.createImage(ImageDescriptor.createFromImageDataProvider(new ImageDataProvider() {
@Override
public ImageData getImageData(int zoom) {
return DISPLAY.getSystemImage(SWT.ICON_INFORMATION)
.getImageData(zoom).scaledTo(IMAGE_SIZE, IMAGE_SIZE);
}
}));
this.hAlign = HorizontalAlignmentEnum.LEFT;
this.cellPainter = new LineBorderDecorator(
new PaddingDecorator(
new CellPainterDecorator(
new AutomaticRowHeightTextPainter(2),
CellEdgeEnum.LEFT, new ImagePainter()),
0, 2, 0, 2));
}
@Override
public void configureRegistry(IConfigRegistry configRegistry) {
super.configureRegistry(configRegistry);
Style errorStyle = new Style();
errorStyle.setAttributeValue(
CellStyleAttributes.IMAGE,
this.errorImage);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_STYLE,
errorStyle,
DisplayMode.NORMAL,
Level.SEVERE.toString());
Style warningStyle = new Style();
warningStyle.setAttributeValue(
CellStyleAttributes.IMAGE,
this.warningImage);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_STYLE,
warningStyle,
DisplayMode.NORMAL,
Level.WARNING.toString());
Style informationStyle = new Style();
informationStyle.setAttributeValue(
CellStyleAttributes.IMAGE,
this.infoImage);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_STYLE,
informationStyle,
DisplayMode.NORMAL,
Level.INFO.toString());
}
}
}