package org.argeo.swt.desktop; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class MiniExplorer { private Path url; private Text addressT; private Table browser; private boolean showHidden = false; public MiniExplorer(Composite parent, int style) { parent.setLayout(new GridLayout()); Composite toolBar = new Composite(parent, SWT.NONE); toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); toolBar.setLayout(new FillLayout()); addressT = new Text(toolBar, SWT.SINGLE | SWT.BORDER); // addressT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); addressT.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { setUrl(addressT.getText().trim()); } }); browser = createTable(parent, this.url); } public void setUrl(Path url) { this.url = url; if (addressT != null) addressT.setText(url.toString()); if (browser != null) { Composite parent = browser.getParent(); browser.dispose(); browser = createTable(parent, this.url); parent.layout(true, true); } } protected Table createTable(Composite parent, Path path) { Table table = new Table(parent, SWT.BORDER); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { Point pt = new Point(e.x, e.y); TableItem item = table.getItem(pt); Path path = (Path) item.getData(); if (Files.isDirectory(path)) { setUrl(path); } else { Program.launch(path.toString()); } } }); if (path != null) { if (path.getParent() != null) { TableItem parentTI = new TableItem(table, SWT.NONE); parentTI.setText(".."); parentTI.setData(path.getParent()); } try { // directories DirectoryStream ds = Files.newDirectoryStream(url, p -> Files.isDirectory(p) && isShown(p)); ds.forEach(p -> { TableItem ti = new TableItem(table, SWT.NONE); ti.setText(p.getFileName().toString() + "/"); ti.setData(p); }); // files ds = Files.newDirectoryStream(url, p -> !Files.isDirectory(p) && isShown(p)); ds.forEach(p -> { TableItem ti = new TableItem(table, SWT.NONE); ti.setText(p.getFileName().toString()); ti.setData(p); }); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return table; } protected boolean isShown(Path path) { if (showHidden) return true; try { return !Files.isHidden(path); } catch (IOException e) { throw new IllegalArgumentException("Cannot check " + path, e); } } public void setUrl(String url) { setUrl(Paths.get(url)); } public static void main(String[] args) { Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent(); Shell shell = new Shell(display, SWT.SHELL_TRIM); MiniExplorer miniBrowser = new MiniExplorer(shell, SWT.NONE); String url = args.length > 0 ? args[0] : System.getProperty("user.home"); miniBrowser.setUrl(url); shell.open(); shell.setSize(new Point(800, 480)); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }