/******************************************************************************* * Copyright (c) 2013 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 <dirk.fauth@gmail.com> - initial API and implementation * Aparna Argade (Cadence Design Systems, Inc.) - For SWTBotNatTable tests *******************************************************************************/ package org.eclipse.swtbot.nebula.nattable.finder.test1; import java.util.ArrayList; import java.util.List; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.command.VisualRefreshCommand; import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration; import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration; import org.eclipse.nebula.widgets.nattable.data.AutomaticSpanningDataProvider; import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.data.ListDataProvider; import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.layer.SpanningDataLayer; import org.eclipse.nebula.widgets.nattable.persistence.command.DisplayPersistenceDialogCommandHandler; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry; import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher; import org.eclipse.nebula.widgets.nattable.ui.menu.IMenuItemProvider; import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuAction; import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuBuilder; import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swtbot.nebula.nattable.finder.SWTNatTableBot; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** * The original example can be extracted from * http://www.eclipse.org/downloads/download.php?file=/nattable/releases/1.3.0/NatTableExamples-1.3.0.jar * It is located at folder org\eclipse\nebula\widgets\nattable\examples\_500_Layers\_501_Data */ @RunWith(Suite.class) public class _5015_AutomaticDataSpanningExample { public SWTNatTableBot bot; public static NatTable nattable; public Shell shell; @Before public void setUp() { bot = new SWTNatTableBot(); runInUIThread(); } private void runInUIThread() { final Display display = Display.getDefault(); display.syncExec(new Runnable() { @Override public void run() { shell = createShell(display, "Nebula NatTable Test1"); nattable = createNatTable(shell); shell.open(); } }); } protected Shell createShell(final Display display, final String text) { Shell shell = new Shell(display); shell.setText(text); shell.setLayout(new FillLayout()); return shell; } private NatTable createNatTable(final Shell shell) { /* set contents to have something to test */ String[] propertyNames = { "columnOneNumber", "columnTwoNumber", "columnThreeNumber", "columnFourNumber", "columnFiveNumber" }; IColumnPropertyAccessor<NumberValues> cpa = new ReflectiveColumnPropertyAccessor<NumberValues>(propertyNames); IDataProvider dataProvider = new ListDataProvider<NumberValues>(createNumberValueList(), cpa); AutomaticSpanningDataProvider spanningDataProvider = new AutomaticSpanningDataProvider(dataProvider, true, false); NatTable natTable = new NatTable(shell, new ViewportLayer(new SelectionLayer(new SpanningDataLayer(spanningDataProvider))), false); natTable.addConfiguration(new DefaultNatTableStyleConfiguration()); natTable.addConfiguration(new BodyMenuConfiguration(natTable, spanningDataProvider)); natTable.configure(); natTable.registerCommandHandler(new DisplayPersistenceDialogCommandHandler()); return natTable; } private List<NumberValues> createNumberValueList() { List<NumberValues> result = new ArrayList<NumberValues>(); NumberValues nv = new NumberValues(); nv.setColumnOneNumber(5); nv.setColumnTwoNumber(4); nv.setColumnThreeNumber(3); nv.setColumnFourNumber(1); nv.setColumnFiveNumber(1); result.add(nv); nv = new NumberValues(); nv.setColumnOneNumber(1); nv.setColumnTwoNumber(1); nv.setColumnThreeNumber(2); nv.setColumnFourNumber(2); nv.setColumnFiveNumber(3); result.add(nv); return result; } class BodyMenuConfiguration extends AbstractUiBindingConfiguration { private Menu bodyMenu; private AutomaticSpanningDataProvider dataProvider; public BodyMenuConfiguration(NatTable natTable, AutomaticSpanningDataProvider dataProvider) { this.bodyMenu = createBodyMenu(natTable).build(); this.dataProvider = dataProvider; } protected PopupMenuBuilder createBodyMenu(final NatTable natTable) { return new PopupMenuBuilder(natTable).withMenuItemProvider(new IMenuItemProvider() { @Override public void addMenuItem(final NatTable natTable, Menu popupMenu) { MenuItem menuItem = new MenuItem(popupMenu, SWT.PUSH); menuItem.setText("Toggle auto spanning"); menuItem.setEnabled(true); menuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { if (BodyMenuConfiguration.this.dataProvider.isAutoColumnSpan()) { BodyMenuConfiguration.this.dataProvider.setAutoColumnSpan(false); BodyMenuConfiguration.this.dataProvider.setAutoRowSpan(true); } else if (BodyMenuConfiguration.this.dataProvider.isAutoRowSpan()) { BodyMenuConfiguration.this.dataProvider.setAutoRowSpan(false); } else { BodyMenuConfiguration.this.dataProvider.setAutoColumnSpan(true); } natTable.doCommand(new VisualRefreshCommand()); } }); } }).withStateManagerMenuItemProvider(); } @Override public void configureUiBindings(UiBindingRegistry uiBindingRegistry) { if (this.bodyMenu != null) { uiBindingRegistry.registerMouseDownBinding( new MouseEventMatcher(SWT.NONE, null, MouseEventMatcher.RIGHT_BUTTON), new PopupMenuAction(this.bodyMenu)); } } } @After public void tearDown() { Display.getDefault().syncExec(new Runnable() { @Override public void run() { if (shell != null) { shell.dispose(); } } }); } }