package com.vaadin.tests.components; import java.util.Collection; import com.vaadin.event.Action; import com.vaadin.event.Action.Handler; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.event.dd.acceptcriteria.SourceIs; import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.tests.util.Person; import com.vaadin.tests.util.PersonContainer; import com.vaadin.tests.util.TestUtils; import com.vaadin.ui.Accordion; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.v7.data.Item; import com.vaadin.v7.data.util.IndexedContainer; import com.vaadin.v7.event.DataBoundTransferable; import com.vaadin.v7.ui.AbstractSelect.AbstractSelectTargetDetails; import com.vaadin.v7.ui.Table; public class TouchScrollables extends TestBase { java.util.Random r = new java.util.Random(1); private TabSheet testSelector = new TabSheet(); @Override public void setup() { getLayout().addComponent(testSelector); testSelector.setHeight("500px"); addTest(getPanelTest()); addTest(getSimpleTableTest()); addTest(getDDSortableTableTest()); addTest(getTabSheetTest()); addTest(getSplitPanelTest()); addTest(getAccordionTest()); addTest(getSubWindowTest()); TestUtils.injectCSS(getLayout().getUI(), "body * {-webkit-user-select: none;} .v-table-row-drag-middle .v-table-cell-content {" + " background-color: inherit ; border-bottom: 1px solid cyan;" + "}" + ".v-table-row-drag-middle .v-table-cell-wrapper {" + " margin-bottom: -1px;" + "}" + "" ); } private Component getPanelTest() { Layout cssLayout = new CssLayout(); cssLayout.setCaption("Panel"); final VerticalLayout pl = new VerticalLayout(); pl.setMargin(true); final Panel p = new Panel(pl); p.setHeight("400px"); Label l50 = null; for (int i = 0; i < 100; i++) { Label c = new Label("Label" + i); pl.addComponent(c); if (i == 50) { l50 = c; } } final Label l = l50; Button button = new Button("Scroll to label 50", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { getLayout().getUI().scrollIntoView(l); } }); cssLayout.addComponent(button); button = new Button("Scroll to 100px", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { p.setScrollTop(100); } }); cssLayout.addComponent(button); cssLayout.addComponent(p); return cssLayout; } private Component getTabSheetTest() { TabSheet ts = new TabSheet(); ts.setCaption("Tabsheet"); ts.setHeight("100%"); ts.addTab(getBigComponent(), "Tab 1"); ts.addTab(getBigComponent(), "Tab 2"); return ts; } private Component getSplitPanelTest() { HorizontalSplitPanel sp = new HorizontalSplitPanel(); sp.setCaption("Splitpanel"); sp.addComponent(getBigComponent()); sp.addComponent(getBigComponent()); return sp; } private Component getSimpleTableTest() { CssLayout cssLayout = new CssLayout(); final Table table = new Table(); Button button = new Button("Toggle lazyloading"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { if (table.getCacheRate() == 100) { table.setCacheRate(2); table.setPageLength(15); } else { table.setCacheRate(100); table.setHeight("400px"); } } }); cssLayout.addComponent(button); button = new Button("Toggle selectable"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { table.setSelectable(!table.isSelectable()); } }); cssLayout.addComponent(button); table.addContainerProperty("foo", String.class, "bar"); table.setRowHeaderMode(Table.ROW_HEADER_MODE_INDEX); for (int i = 0; i < 1000; i++) { table.addItem(); } cssLayout.addComponent(table); cssLayout.setCaption("Table"); return cssLayout; } private Component getAccordionTest() { Accordion a = new Accordion(); a.setCaption("Accordion"); a.setHeight("100%"); a.addTab(getBigComponent(), "Tab 1"); a.addTab(getBigComponent(), "Tab 2"); a.addTab(getBigComponent(), "Tab 3"); return a; } private Component getSubWindowTest() { Button b = new Button("Open subwindow", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { VerticalLayout layout = new VerticalLayout(); layout.setMargin(true); Window w = new Window("Subwindow", layout); w.center(); w.setHeight("200px"); layout.addComponent(getBigComponent()); getMainWindow().addWindow(w); } }); return b; } private Component getDDSortableTableTest() { final Table table; table = new Table(); table.setCaption("DD sortable table with context menus"); // table.setWidth("100%"); table.setPageLength(10); table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID); table.setSelectable(true); table.setMultiSelect(true); table.addActionHandler(new Handler() { Action[] actions = new Action[] { new Action("FOO"), new Action("BAR"), new Action("CAR") }; @Override public Action[] getActions(Object target, Object sender) { return actions; } @Override public void handleAction(Action action, Object sender, Object target) { Notification.show(action.getCaption()); } }); populateTable(table); /* * Make table rows draggable */ table.setDragMode(Table.TableDragMode.ROW); table.setDropHandler(new DropHandler() { // accept only drags from this table AcceptCriterion crit = new SourceIs(table); @Override public AcceptCriterion getAcceptCriterion() { return crit; } @Override public void drop(DragAndDropEvent dropEvent) { AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dropEvent .getTargetDetails(); DataBoundTransferable transferable = (DataBoundTransferable) dropEvent .getTransferable(); Object itemIdOver = dropTargetData.getItemIdOver(); Object itemId = transferable.getItemId(); if (itemId == null || itemIdOver == null || itemId.equals(itemIdOver)) { return; // no move happened } // IndexedContainer goodies... (hint: don't use it in real apps) IndexedContainer containerDataSource = (IndexedContainer) table .getContainerDataSource(); int newIndex = containerDataSource.indexOfId(itemIdOver) - 1; if (dropTargetData .getDropLocation() != VerticalDropLocation.TOP) { newIndex++; } if (newIndex < 0) { newIndex = 0; } Object idAfter = containerDataSource.getIdByIndex(newIndex); Collection<?> selections = (Collection<?>) table.getValue(); if (selections != null && selections.contains(itemId)) { // dragged a selected item, if multiple rows selected, drag // them too (functionality similar to apple mail) for (Object object : selections) { moveAfter(containerDataSource, object, idAfter); } } else { // move just the dragged row, not considering selection at // all moveAfter(containerDataSource, itemId, idAfter); } } private void moveAfter(IndexedContainer containerDataSource, Object itemId, Object idAfter) { try { IndexedContainer clone = null; clone = (IndexedContainer) containerDataSource.clone(); containerDataSource.removeItem(itemId); Item newItem = containerDataSource.addItemAfter(idAfter, itemId); Item item = clone.getItem(itemId); for (Object propId : item.getItemPropertyIds()) { newItem.getItemProperty(propId).setValue( item.getItemProperty(propId).getValue()); } // TODO Auto-generated method stub } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); return table; } private void populateTable(Table table) { table.addContainerProperty("Name", String.class, ""); table.addContainerProperty("Weight", Integer.class, 0); PersonContainer testData = PersonContainer.createWithTestData(); for (int i = 0; i < 40; i++) { Item addItem = table.addItem("Item" + i); Person p = testData.getIdByIndex(i); addItem.getItemProperty("Name") .setValue(p.getFirstName() + " " + p.getLastName()); addItem.getItemProperty("Weight").setValue(50 + r.nextInt(60)); } } private void addTest(final Component t) { testSelector.addComponent(t); } private Component getBigComponent() { Layout l = new VerticalLayout(); for (int i = 0; i < 100; i++) { Label c = new Label("Label" + i); l.addComponent(c); } return l; } @Override protected String getDescription() { return "Various components and setups suitable for testing scrolling on touch devices."; } @Override protected Integer getTicketNumber() { return null; } }