package org.argeo.eclipse.ui.fs; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import org.argeo.api.cms.CmsLog; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; /** * Experimental UI upon Java 7 nio files api: SashForm layout with bookmarks on * the left hand side and a simple table on the right hand side. */ public class SimpleFsBrowser extends Composite { private final static CmsLog log = CmsLog.getLog(SimpleFsBrowser.class); private static final long serialVersionUID = -40347919096946585L; private Path currSelected; private FsTableViewer bookmarksViewer; private FsTableViewer directoryDisplayViewer; public SimpleFsBrowser(Composite parent, int style) { super(parent, style); createContent(this); // parent.layout(true, true); } public Viewer getViewer() { return directoryDisplayViewer; } private void createContent(Composite parent) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); SashForm form = new SashForm(parent, SWT.HORIZONTAL); Composite leftCmp = new Composite(form, SWT.NONE); populateBookmarks(leftCmp); Composite rightCmp = new Composite(form, SWT.BORDER); populateDisplay(rightCmp); form.setLayoutData(EclipseUiUtils.fillAll()); form.setWeights(new int[] { 1, 3 }); } public void setInput(Path... paths) { bookmarksViewer.setPathsInput(paths); bookmarksViewer.getTable().getParent().layout(true, true); } private void populateBookmarks(final Composite parent) { // GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); // layout.verticalSpacing = 5; parent.setLayout(new GridLayout()); ISelectionChangedListener selList = new MySelectionChangedListener(); appendTitle(parent, "My bookmarks"); bookmarksViewer = new FsTableViewer(parent, SWT.MULTI | SWT.NO_SCROLL); Table table = bookmarksViewer.configureDefaultSingleColumnTable(500); GridData gd = EclipseUiUtils.fillWidth(); gd.horizontalIndent = 10; table.setLayoutData(gd); bookmarksViewer.addSelectionChangedListener(selList); appendTitle(parent, "Jcr + File"); FsTableViewer jcrFilesViewers = new FsTableViewer(parent, SWT.MULTI | SWT.NO_SCROLL); table = jcrFilesViewers.configureDefaultSingleColumnTable(500); gd = EclipseUiUtils.fillWidth(); gd.horizontalIndent = 10; table.setLayoutData(gd); jcrFilesViewers.addSelectionChangedListener(selList); // FileSystemProvider fsProvider = new JackrabbitMemoryFsProvider(); // try { // Path testPath = fsProvider.getPath(new URI("jcr+memory:/")); // jcrFilesViewers.setPathsInput(testPath); // } catch (URISyntaxException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } private Label appendTitle(Composite parent, String value) { Label titleLbl = new Label(parent, SWT.NONE); titleLbl.setText(value); titleLbl.setFont(EclipseUiUtils.getBoldFont(parent)); GridData gd = EclipseUiUtils.fillWidth(); gd.horizontalIndent = 5; gd.verticalIndent = 5; titleLbl.setLayoutData(gd); return titleLbl; } private class MySelectionChangedListener implements ISelectionChangedListener { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) bookmarksViewer.getSelection(); if (selection.isEmpty()) return; else { Path newSelected = (Path) selection.getFirstElement(); if (newSelected.equals(currSelected)) return; currSelected = newSelected; directoryDisplayViewer.setInput(currSelected, "*"); } } } private void populateDisplay(final Composite parent) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); directoryDisplayViewer = new FsTableViewer(parent, SWT.MULTI); List colDefs = new ArrayList<>(); colDefs.add(new ColumnDefinition(new FileIconNameLabelProvider(), "Name", 200)); colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_SIZE), "Size", 100)); colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_TYPE), "Type", 250)); colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_LAST_MODIFIED), "Last modified", 200)); Table table = directoryDisplayViewer.configureDefaultTable(colDefs); table.setLayoutData(EclipseUiUtils.fillAll()); table.addKeyListener(new KeyListener() { private static final long serialVersionUID = -8083424284436715709L; @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { log.debug("Key event received: " + e.keyCode); IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection(); Path selected = null; if (!selection.isEmpty()) selected = ((Path) selection.getFirstElement()); if (e.keyCode == SWT.CR) { if (!Files.isDirectory(selected)) return; if (selected != null) { currSelected = selected; directoryDisplayViewer.setInput(currSelected, "*"); } } else if (e.keyCode == SWT.BS) { currSelected = currSelected.getParent(); directoryDisplayViewer.setInput(currSelected, "*"); directoryDisplayViewer.getTable().setFocus(); } } }); // directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() { // @Override // public void doubleClick(DoubleClickEvent event) { // IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection(); // Path selected = null; // if (!selection.isEmpty()) { // Object obj = selection.getFirstElement(); // if (obj instanceof Path) // selected = (Path) obj; // else if (obj instanceof ParentDir) // selected = ((ParentDir) obj).getPath(); // } // if (selected != null) { // if (!Files.isDirectory(selected)) // return; // currSelected = selected; // directoryDisplayViewer.setInput(currSelected, "*"); // } // } // }); directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection(); Path selected = null; if (!selection.isEmpty()) { Object obj = selection.getFirstElement(); if (obj instanceof Path) selected = (Path) obj; else if (obj instanceof ParentDir) selected = ((ParentDir) obj).getPath(); } if (selected != null) { if (!Files.isDirectory(selected)) return; currSelected = selected; directoryDisplayViewer.setInput(currSelected, "*"); } } }); } }