View Javadoc
1   package org.argeo.eclipse.ui.fs;
2   
3   import java.nio.file.Files;
4   import java.nio.file.Path;
5   import java.util.ArrayList;
6   import java.util.List;
7   
8   import org.apache.commons.logging.Log;
9   import org.apache.commons.logging.LogFactory;
10  import org.argeo.eclipse.ui.ColumnDefinition;
11  import org.argeo.eclipse.ui.EclipseUiUtils;
12  import org.eclipse.jface.viewers.ISelectionChangedListener;
13  import org.eclipse.jface.viewers.IStructuredSelection;
14  import org.eclipse.jface.viewers.SelectionChangedEvent;
15  import org.eclipse.swt.SWT;
16  import org.eclipse.swt.custom.SashForm;
17  import org.eclipse.swt.events.KeyEvent;
18  import org.eclipse.swt.events.KeyListener;
19  import org.eclipse.swt.layout.GridData;
20  import org.eclipse.swt.layout.GridLayout;
21  import org.eclipse.swt.widgets.Composite;
22  import org.eclipse.swt.widgets.Table;
23  import org.eclipse.swt.widgets.Tree;
24  
25  /** A simple Java 7 nio files browser with a tree */
26  public class SimpleFsTreeBrowser extends Composite {
27  	private final static Log log = LogFactory.getLog(SimpleFsTreeBrowser.class);
28  	private static final long serialVersionUID = -40347919096946585L;
29  
30  	private Path currSelected;
31  	private FsTreeViewer treeViewer;
32  	private FsTableViewer directoryDisplayViewer;
33  
34  	public SimpleFsTreeBrowser(Composite parent, int style) {
35  		super(parent, style);
36  		createContent(this);
37  		// parent.layout(true, true);
38  	}
39  
40  	private void createContent(Composite parent) {
41  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
42  		SashForm form = new SashForm(parent, SWT.HORIZONTAL);
43  		Composite child1 = new Composite(form, SWT.NONE);
44  		populateTree(child1);
45  		Composite child2 = new Composite(form, SWT.BORDER);
46  		populateDisplay(child2);
47  		form.setLayoutData(EclipseUiUtils.fillAll());
48  		form.setWeights(new int[] { 1, 3 });
49  	}
50  
51  	public void setInput(Path... paths) {
52  		treeViewer.setPathsInput(paths);
53  		treeViewer.getControl().getParent().layout(true, true);
54  	}
55  
56  	private void populateTree(final Composite parent) {
57  		// GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
58  		// layout.verticalSpacing = 5;
59  		parent.setLayout(new GridLayout());
60  
61  		ISelectionChangedListener selList = new MySelectionChangedListener();
62  
63  		treeViewer = new FsTreeViewer(parent, SWT.MULTI);
64  		Tree tree = treeViewer.configureDefaultSingleColumnTable(500);
65  		GridData gd = EclipseUiUtils.fillAll();
66  		// gd.horizontalIndent = 10;
67  		tree.setLayoutData(gd);
68  		treeViewer.addSelectionChangedListener(selList);
69  	}
70  
71  	private class MySelectionChangedListener implements ISelectionChangedListener {
72  		@Override
73  		public void selectionChanged(SelectionChangedEvent event) {
74  			IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
75  			if (selection.isEmpty())
76  				return;
77  			else {
78  				Path newSelected = (Path) selection.getFirstElement();
79  				if (newSelected.equals(currSelected))
80  					return;
81  				currSelected = newSelected;
82  				if (Files.isDirectory(currSelected))
83  					directoryDisplayViewer.setInput(currSelected, "*");
84  			}
85  		}
86  	}
87  
88  	private void populateDisplay(final Composite parent) {
89  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
90  		directoryDisplayViewer = new FsTableViewer(parent, SWT.MULTI);
91  		List<ColumnDefinition> colDefs = new ArrayList<>();
92  		colDefs.add(new ColumnDefinition(new FileIconNameLabelProvider(), "Name", 200, 200));
93  		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_SIZE), "Size", 100, 100));
94  		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_TYPE), "Type", 300, 300));
95  		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_LAST_MODIFIED),
96  				"Last modified", 100, 100));
97  		Table table = directoryDisplayViewer.configureDefaultTable(colDefs);
98  		table.setLayoutData(EclipseUiUtils.fillAll());
99  
100 		table.addKeyListener(new KeyListener() {
101 			private static final long serialVersionUID = -8083424284436715709L;
102 
103 			@Override
104 			public void keyReleased(KeyEvent e) {
105 			}
106 
107 			@Override
108 			public void keyPressed(KeyEvent e) {
109 				log.debug("Key event received: " + e.keyCode);
110 				IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
111 				Path selected = null;
112 				if (!selection.isEmpty())
113 					selected = ((Path) selection.getFirstElement());
114 				if (e.keyCode == SWT.CR) {
115 					if (!Files.isDirectory(selected))
116 						return;
117 					if (selected != null) {
118 						currSelected = selected;
119 						directoryDisplayViewer.setInput(currSelected, "*");
120 					}
121 				} else if (e.keyCode == SWT.BS) {
122 					currSelected = currSelected.getParent();
123 					directoryDisplayViewer.setInput(currSelected, "*");
124 					directoryDisplayViewer.getTable().setFocus();
125 				}
126 			}
127 		});
128 	}
129 }