package com.vaadin.tests.containers.filesystemcontainer; import java.io.File; import java.io.IOException; import java.util.ArrayList; import com.vaadin.tests.components.TestBase; import com.vaadin.tests.util.Log; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.HorizontalLayout; import com.vaadin.v7.data.Container; import com.vaadin.v7.data.Container.Ordered; import com.vaadin.v7.data.util.FilesystemContainer; import com.vaadin.v7.ui.Table; import com.vaadin.v7.ui.Tree.CollapseEvent; import com.vaadin.v7.ui.Tree.CollapseListener; import com.vaadin.v7.ui.Tree.ExpandEvent; import com.vaadin.v7.ui.Tree.ExpandListener; import com.vaadin.v7.ui.TreeTable; public class FileSystemContainerInTreeTable extends TestBase { private Log log = new Log(5); private TreeTable treeTable; @Override protected void setup() { setTheme("reindeer-tests"); final File folder; try { File tempFile = File.createTempFile("fsc-tt", ""); tempFile.delete(); folder = new File(tempFile.getParent(), tempFile.getName()); folder.mkdir(); System.out.println(folder.getPath()); folder.deleteOnExit(); populate(folder, 3, 10); FilesystemContainer fsc = new FilesystemContainer(folder); treeTable = new TreeTable(); treeTable.addStyleName("table-equal-rowheight"); treeTable.setWidth("450px"); treeTable.setHeight("550px"); treeTable.setContainerDataSource(fsc); treeTable.setItemIconPropertyId(FilesystemContainer.PROPERTY_ICON); treeTable.setVisibleColumns(new String[] { "Name" }); treeTable.setColumnWidth("Name", 400); treeTable.addListener(new ExpandListener() { @Override public void nodeExpand(ExpandEvent event) { logExpandCollapse(event.getItemId(), "expanded"); } }); treeTable.addListener(new CollapseListener() { @Override public void nodeCollapse(CollapseEvent event) { logExpandCollapse(event.getItemId(), "collapsed"); } }); addComponent(log); addComponent(treeTable); HorizontalLayout buttonLayout = new HorizontalLayout(); buttonLayout.setSpacing(true); buttonLayout.addComponent( new Button("Create dir11", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { new File(folder, "dir11").mkdir(); log.log("Row dir11 created"); } })); buttonLayout.addComponent( new Button("Delete dir11", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { new File(folder, "dir11").delete(); log.log("Row dir11 deleted"); } })); // to clean up explicitly before ending an automated test buttonLayout.addComponent( new Button("Clean all files", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { folder.delete(); } })); addComponent(buttonLayout); } catch (IOException e) { e.printStackTrace(); } } private void populate(File folder, int subDirectories, int files) throws IOException { for (int i = 1; i <= files; i++) { File f = new File(folder, "file" + i + ".txt"); f.createNewFile(); } for (int i = 1; i <= subDirectories; i++) { File f = new File(folder, "dir" + i); f.mkdir(); populate(f, 0, 2); } } protected int indexOfId(Table source, Object itemId) { Container.Ordered c = (Ordered) source.getContainerDataSource(); if (c instanceof Container.Indexed) { return ((Container.Indexed) source).indexOfId(itemId); } else { ArrayList<Object> list = new ArrayList<>(source.getItemIds()); return list.indexOf(itemId); } } protected void logExpandCollapse(Object itemId, String operation) { File file = (File) itemId; // do not use the variable part (path) of file name log.log("Row " + file.getName() + " " + operation + ". Row index: " + indexOfId(treeTable, itemId)); } @Override protected String getDescription() { return "TreeTable partial updates can only be used with a container that notifies the TreeTable of item set changes"; } @Override protected Integer getTicketNumber() { return 7837; } }