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.DoubleClickEvent;
13  import org.eclipse.jface.viewers.IDoubleClickListener;
14  import org.eclipse.jface.viewers.ISelectionChangedListener;
15  import org.eclipse.jface.viewers.IStructuredSelection;
16  import org.eclipse.jface.viewers.SelectionChangedEvent;
17  import org.eclipse.jface.viewers.Viewer;
18  import org.eclipse.swt.SWT;
19  import org.eclipse.swt.custom.SashForm;
20  import org.eclipse.swt.events.KeyEvent;
21  import org.eclipse.swt.events.KeyListener;
22  import org.eclipse.swt.layout.GridData;
23  import org.eclipse.swt.layout.GridLayout;
24  import org.eclipse.swt.widgets.Composite;
25  import org.eclipse.swt.widgets.Label;
26  import org.eclipse.swt.widgets.Table;
27  
28  /**
29   * Experimental UI upon Java 7 nio files api: SashForm layout with bookmarks on
30   * the left hand side and a simple table on the right hand side.
31   */
32  public class SimpleFsBrowser extends Composite {
33  	private final static Log log = LogFactory.getLog(SimpleFsBrowser.class);
34  	private static final long serialVersionUID = -40347919096946585L;
35  
36  	private Path currSelected;
37  	private FsTableViewer bookmarksViewer;
38  	private FsTableViewer directoryDisplayViewer;
39  
40  	public SimpleFsBrowser(Composite parent, int style) {
41  		super(parent, style);
42  		createContent(this);
43  		// parent.layout(true, true);
44  	}
45  
46  	public Viewer getViewer() {
47  		return directoryDisplayViewer;
48  	}
49  
50  	private void createContent(Composite parent) {
51  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
52  
53  		SashForm form = new SashForm(parent, SWT.HORIZONTAL);
54  		Composite leftCmp = new Composite(form, SWT.NONE);
55  		populateBookmarks(leftCmp);
56  
57  		Composite rightCmp = new Composite(form, SWT.BORDER);
58  		populateDisplay(rightCmp);
59  		form.setLayoutData(EclipseUiUtils.fillAll());
60  		form.setWeights(new int[] { 1, 3 });
61  	}
62  
63  	public void setInput(Path... paths) {
64  		bookmarksViewer.setPathsInput(paths);
65  		bookmarksViewer.getTable().getParent().layout(true, true);
66  	}
67  
68  	private void populateBookmarks(final Composite parent) {
69  		// GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
70  		// layout.verticalSpacing = 5;
71  		parent.setLayout(new GridLayout());
72  
73  		ISelectionChangedListener selList = new MySelectionChangedListener();
74  
75  		appendTitle(parent, "My bookmarks");
76  		bookmarksViewer = new FsTableViewer(parent, SWT.MULTI | SWT.NO_SCROLL);
77  		Table table = bookmarksViewer.configureDefaultSingleColumnTable(500);
78  		GridData gd = EclipseUiUtils.fillWidth();
79  		gd.horizontalIndent = 10;
80  		table.setLayoutData(gd);
81  		bookmarksViewer.addSelectionChangedListener(selList);
82  
83  		appendTitle(parent, "Jcr + File");
84  
85  		FsTableViewer jcrFilesViewers = new FsTableViewer(parent, SWT.MULTI | SWT.NO_SCROLL);
86  		table = jcrFilesViewers.configureDefaultSingleColumnTable(500);
87  		gd = EclipseUiUtils.fillWidth();
88  		gd.horizontalIndent = 10;
89  		table.setLayoutData(gd);
90  		jcrFilesViewers.addSelectionChangedListener(selList);
91  
92  		// FileSystemProvider fsProvider = new JackrabbitMemoryFsProvider();
93  		// try {
94  		// Path testPath = fsProvider.getPath(new URI("jcr+memory:/"));
95  		// jcrFilesViewers.setPathsInput(testPath);
96  		// } catch (URISyntaxException e) {
97  		// // TODO Auto-generated catch block
98  		// e.printStackTrace();
99  		// }
100 	}
101 
102 	private Label appendTitle(Composite parent, String value) {
103 		Label titleLbl = new Label(parent, SWT.NONE);
104 		titleLbl.setText(value);
105 		titleLbl.setFont(EclipseUiUtils.getBoldFont(parent));
106 		GridData gd = EclipseUiUtils.fillWidth();
107 		gd.horizontalIndent = 5;
108 		gd.verticalIndent = 5;
109 		titleLbl.setLayoutData(gd);
110 		return titleLbl;
111 	}
112 
113 	private class MySelectionChangedListener implements ISelectionChangedListener {
114 		@Override
115 		public void selectionChanged(SelectionChangedEvent event) {
116 			IStructuredSelection selection = (IStructuredSelection) bookmarksViewer.getSelection();
117 			if (selection.isEmpty())
118 				return;
119 			else {
120 				Path newSelected = (Path) selection.getFirstElement();
121 				if (newSelected.equals(currSelected))
122 					return;
123 				currSelected = newSelected;
124 				directoryDisplayViewer.setInput(currSelected, "*");
125 			}
126 		}
127 	}
128 
129 	private void populateDisplay(final Composite parent) {
130 		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
131 		directoryDisplayViewer = new FsTableViewer(parent, SWT.MULTI);
132 		List<ColumnDefinition> colDefs = new ArrayList<>();
133 		colDefs.add(new ColumnDefinition(new FileIconNameLabelProvider(), "Name", 200));
134 		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_SIZE), "Size", 100));
135 		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_TYPE), "Type", 250));
136 		colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_LAST_MODIFIED),
137 				"Last modified", 200));
138 		Table table = directoryDisplayViewer.configureDefaultTable(colDefs);
139 		table.setLayoutData(EclipseUiUtils.fillAll());
140 
141 		table.addKeyListener(new KeyListener() {
142 			private static final long serialVersionUID = -8083424284436715709L;
143 
144 			@Override
145 			public void keyReleased(KeyEvent e) {
146 			}
147 
148 			@Override
149 			public void keyPressed(KeyEvent e) {
150 				log.debug("Key event received: " + e.keyCode);
151 				IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
152 				Path selected = null;
153 				if (!selection.isEmpty())
154 					selected = ((Path) selection.getFirstElement());
155 				if (e.keyCode == SWT.CR) {
156 					if (!Files.isDirectory(selected))
157 						return;
158 					if (selected != null) {
159 						currSelected = selected;
160 						directoryDisplayViewer.setInput(currSelected, "*");
161 					}
162 				} else if (e.keyCode == SWT.BS) {
163 					currSelected = currSelected.getParent();
164 					directoryDisplayViewer.setInput(currSelected, "*");
165 					directoryDisplayViewer.getTable().setFocus();
166 				}
167 			}
168 		});
169 
170 //		directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() {
171 //			@Override
172 //			public void doubleClick(DoubleClickEvent event) {
173 //				IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
174 //				Path selected = null;
175 //				if (!selection.isEmpty()) {
176 //					Object obj = selection.getFirstElement();
177 //					if (obj instanceof Path)
178 //						selected = (Path) obj;
179 //					else if (obj instanceof ParentDir)
180 //						selected = ((ParentDir) obj).getPath();
181 //				}
182 //				if (selected != null) {
183 //					if (!Files.isDirectory(selected))
184 //						return;
185 //					currSelected = selected;
186 //					directoryDisplayViewer.setInput(currSelected, "*");
187 //				}
188 //			}
189 //		});
190 
191 		directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() {
192 			@Override
193 			public void doubleClick(DoubleClickEvent event) {
194 				IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
195 				Path selected = null;
196 				if (!selection.isEmpty()) {
197 					Object obj = selection.getFirstElement();
198 					if (obj instanceof Path)
199 						selected = (Path) obj;
200 					else if (obj instanceof ParentDir)
201 						selected = ((ParentDir) obj).getPath();
202 				}
203 				if (selected != null) {
204 					if (!Files.isDirectory(selected))
205 						return;
206 					currSelected = selected;
207 					directoryDisplayViewer.setInput(currSelected, "*");
208 				}
209 			}
210 		});
211 	}
212 }