]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/fs/FsTreeViewer.java
CMS wizard and error feedback
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui / src / org / argeo / eclipse / ui / fs / FsTreeViewer.java
1 package org.argeo.eclipse.ui.fs;
2
3 import java.io.IOException;
4 import java.nio.file.DirectoryIteratorException;
5 import java.nio.file.DirectoryStream;
6 import java.nio.file.Files;
7 import java.nio.file.Path;
8 import java.util.ArrayList;
9 import java.util.List;
10
11 import org.argeo.eclipse.ui.ColumnDefinition;
12 import org.eclipse.jface.viewers.ITreeContentProvider;
13 import org.eclipse.jface.viewers.TreeViewer;
14 import org.eclipse.jface.viewers.TreeViewerColumn;
15 import org.eclipse.jface.viewers.Viewer;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.swt.widgets.Tree;
20 import org.eclipse.swt.widgets.TreeColumn;
21
22 /**
23 * Canonical implementation of a JFace TreeViewer to display the content of a
24 * repository
25 */
26 public class FsTreeViewer extends TreeViewer {
27 private static final long serialVersionUID = -5632407542678477234L;
28
29 private boolean showHiddenItems = false;
30 private boolean showDirectoryFirst = true;
31 private String orderingProperty = FsUiConstants.PROPERTY_NAME;
32
33 public FsTreeViewer(Composite parent, int style) {
34 super(parent, style | SWT.VIRTUAL);
35 }
36
37 public Tree configureDefaultSingleColumnTable(int tableWidthHint) {
38 Tree tree = this.getTree();
39 tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
40 tree.setLinesVisible(true);
41 tree.setHeaderVisible(false);
42 // CmsUtils.markup(tree);
43
44 TreeViewerColumn column = new TreeViewerColumn(this, SWT.NONE);
45 TreeColumn tcol = column.getColumn();
46 tcol.setWidth(tableWidthHint);
47 column.setLabelProvider(new FileIconNameLabelProvider());
48
49 this.setContentProvider(new MyCP());
50 return tree;
51 }
52
53 public Tree configureDefaultTable(List<ColumnDefinition> columns) {
54 this.setContentProvider(new MyCP());
55 Tree tree = this.getTree();
56 tree.setLinesVisible(true);
57 tree.setHeaderVisible(true);
58 // CmsUtils.markup(tree);
59 // CmsUtils.style(tree, MaintenanceStyles.BROWSER_COLUMN);
60 for (ColumnDefinition colDef : columns) {
61 TreeViewerColumn column = new TreeViewerColumn(this, SWT.NONE);
62 column.setLabelProvider(colDef.getLabelProvider());
63 TreeColumn tcol = column.getColumn();
64 tcol.setResizable(true);
65 tcol.setText(colDef.getLabel());
66 tcol.setWidth(colDef.getMinWidth());
67 }
68 return tree;
69 }
70
71 public void setInput(Path dir, String filter) {
72 try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
73 // TODO make this lazy
74 List<Path> paths = new ArrayList<>();
75 for (Path entry : stream) {
76 paths.add(entry);
77 }
78 Object[] rows = paths.toArray(new Object[0]);
79 this.setInput(rows);
80 // this.setItemCount(rows.length);
81 this.refresh();
82 } catch (IOException | DirectoryIteratorException e) {
83 throw new FsUiException("Unable to filter " + dir + " children with filter " + filter, e);
84 }
85 }
86
87 /** Directly displays bookmarks **/
88 public void setPathsInput(Path... paths) {
89 this.setInput((Object[]) paths);
90 // this.setItemCount(paths.length);
91 this.refresh();
92 }
93
94 private class MyCP implements ITreeContentProvider {
95 private static final long serialVersionUID = 9096550041395433128L;
96 private Object[] elements;
97
98 public void dispose() {
99 }
100
101 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
102 // IMPORTANT: don't forget this: an exception will be thrown if
103 // a selected object is not part of the results anymore.
104 viewer.setSelection(null);
105 this.elements = (Object[]) newInput;
106 }
107
108 @Override
109 public Object[] getElements(Object inputElement) {
110 return elements;
111 }
112
113 @Override
114 public Object[] getChildren(Object parentElement) {
115 Path path = (Path) parentElement;
116 if (!Files.isDirectory(path))
117 return null;
118 else
119 return FsUiUtils.getChildren(path, "*", showHiddenItems, showDirectoryFirst, orderingProperty, false);
120 }
121
122 @Override
123 public Object getParent(Object element) {
124 Path path = (Path) element;
125 return path.getParent();
126 }
127
128 @Override
129 public boolean hasChildren(Object element) {
130 Path path = (Path) element;
131 try {
132 if (!Files.isDirectory(path))
133 return false;
134 else
135 try (DirectoryStream<Path> children = Files.newDirectoryStream(path, "*")) {
136 return children.iterator().hasNext();
137 }
138 } catch (IOException e) {
139 throw new FsUiException("Unable to check child existence on " + path, e);
140 }
141 }
142
143 }
144 }