]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/fs/FsTableViewer.java
Make CMS wizard more robust
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui / src / org / argeo / eclipse / ui / fs / FsTableViewer.java
1 package org.argeo.eclipse.ui.fs;
2
3 import java.nio.file.Files;
4 import java.nio.file.Path;
5 import java.util.List;
6
7 import org.argeo.eclipse.ui.ColumnDefinition;
8 import org.eclipse.jface.viewers.CellLabelProvider;
9 import org.eclipse.jface.viewers.ILazyContentProvider;
10 import org.eclipse.jface.viewers.TableViewer;
11 import org.eclipse.jface.viewers.TableViewerColumn;
12 import org.eclipse.jface.viewers.Viewer;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.layout.GridData;
15 import org.eclipse.swt.widgets.Composite;
16 import org.eclipse.swt.widgets.Table;
17 import org.eclipse.swt.widgets.TableColumn;
18
19 /**
20 * Canonical implementation of a JFace table viewer to display the content of a
21 * file folder
22 */
23 public class FsTableViewer extends TableViewer {
24 private static final long serialVersionUID = -5632407542678477234L;
25
26 private boolean showHiddenItems = false;
27 private boolean folderFirst = true;
28 private boolean reverseOrder = false;
29 private String orderProperty = FsUiConstants.PROPERTY_NAME;
30
31 public FsTableViewer(Composite parent, int style) {
32 super(parent, style | SWT.VIRTUAL);
33 }
34
35 public Table configureDefaultSingleColumnTable(int tableWidthHint) {
36
37 return configureDefaultSingleColumnTable(tableWidthHint, new FileIconNameLabelProvider());
38 }
39
40 public Table configureDefaultSingleColumnTable(int tableWidthHint, CellLabelProvider labelProvider) {
41 Table table = this.getTable();
42 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
43 table.setLinesVisible(false);
44 table.setHeaderVisible(false);
45 // CmsUtils.markup(table);
46 // CmsUtils.style(table, MaintenanceStyles.BROWSER_COLUMN);
47
48 TableViewerColumn column = new TableViewerColumn(this, SWT.NONE);
49 TableColumn tcol = column.getColumn();
50 tcol.setWidth(tableWidthHint);
51 column.setLabelProvider(labelProvider);
52 this.setContentProvider(new MyLazyCP());
53 return table;
54 }
55
56 public Table configureDefaultTable(List<ColumnDefinition> columns) {
57 this.setContentProvider(new MyLazyCP());
58 Table table = this.getTable();
59 table.setLinesVisible(true);
60 table.setHeaderVisible(true);
61 // CmsUtils.markup(table);
62 // CmsUtils.style(table, MaintenanceStyles.BROWSER_COLUMN);
63 for (ColumnDefinition colDef : columns) {
64 TableViewerColumn column = new TableViewerColumn(this, SWT.NONE);
65 column.setLabelProvider(colDef.getLabelProvider());
66 TableColumn tcol = column.getColumn();
67 tcol.setResizable(true);
68 tcol.setText(colDef.getLabel());
69 tcol.setWidth(colDef.getMinWidth());
70 }
71 return table;
72 }
73
74 public void setInput(Path dir, String filter) {
75 Path[] rows = FsUiUtils.getChildren(dir, filter, showHiddenItems, folderFirst, orderProperty, reverseOrder);
76 if (rows == null) {
77 this.setInput(null);
78 this.setItemCount(0);
79 return;
80 }
81 boolean isRoot;
82 try {
83 isRoot = dir.getRoot().equals(dir);
84 } catch (Exception e) {
85 // FIXME Workaround for JCR root node access
86 isRoot = dir.toString().equals("/");
87 }
88 final Object[] res;
89 if (isRoot)
90 res = rows;
91 else {
92 res = new Object[rows.length + 1];
93 res[0] = new ParentDir(dir.getParent());
94 for (int i = 1; i < res.length; i++) {
95 res[i] = rows[i - 1];
96 }
97 }
98 this.setInput(res);
99 int length = res.length;
100 this.setItemCount(length);
101 this.refresh();
102 }
103
104 /** Directly displays bookmarks **/
105 public void setPathsInput(Path... paths) {
106 this.setInput((Object[]) paths);
107 this.setItemCount(paths.length);
108 this.refresh();
109 }
110
111 private class MyLazyCP implements ILazyContentProvider {
112 private static final long serialVersionUID = 9096550041395433128L;
113 private Object[] elements;
114
115 public void dispose() {
116 }
117
118 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
119 // IMPORTANT: don't forget this: an exception will be thrown if
120 // a selected object is not part of the results anymore.
121 viewer.setSelection(null);
122 this.elements = (Object[]) newInput;
123 }
124
125 public void updateElement(int index) {
126 if (index < elements.length)
127 FsTableViewer.this.replace(elements[index], index);
128 }
129 }
130 }