+package org.argeo.cms.swt.acr;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.acr.fs.FsContentProvider;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+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.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+public class AcrContentTreeView extends Composite {
+ private Tree tree;
+ private Table table;
+ private Content rootContent;
+
+ private Content selected;
+
+ public AcrContentTreeView(Composite parent, int style, Content content) {
+ super(parent, style);
+ this.rootContent = content;
+ this.selected = rootContent;
+ setLayout(new GridLayout(2, false));
+ initTree();
+ GridData treeGd = CmsSwtUtils.fillHeight();
+ treeGd.widthHint = 300;
+ tree.setLayoutData(treeGd);
+ initTable();
+
+ table.setLayoutData(CmsSwtUtils.fillAll());
+ }
+
+ protected void initTree() {
+ tree = new Tree(this, 0);
+ for (Content c : rootContent) {
+ TreeItem root = new TreeItem(tree, 0);
+ root.setText(c.getName().toString());
+ root.setData(c);
+ new TreeItem(root, 0);
+ }
+ tree.addListener(SWT.Expand, event -> {
+ final TreeItem root = (TreeItem) event.item;
+ TreeItem[] items = root.getItems();
+ for (TreeItem item : items) {
+ if (item.getData() != null)
+ return;
+ item.dispose();
+ }
+ Content content = (Content) root.getData();
+ for (Content c : content) {
+ TreeItem item = new TreeItem(root, 0);
+ item.setText(c.getName().toString());
+ item.setData(c);
+ boolean hasChildren = true;
+ if (hasChildren) {
+ new TreeItem(item, 0);
+ }
+ }
+ });
+ tree.addListener(SWT.Selection, event -> {
+ TreeItem item = (TreeItem) event.item;
+ selected = (Content) item.getData();
+ refreshTable();
+ });
+ }
+
+ protected void initTable() {
+ table = new Table(this, 0);
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+ TableColumn keyCol = new TableColumn(table, SWT.NONE);
+ keyCol.setText("Attribute");
+ keyCol.setWidth(200);
+ TableColumn valueCol = new TableColumn(table, SWT.NONE);
+ valueCol.setText("Value");
+ keyCol.setWidth(300);
+ refreshTable();
+ }
+
+ protected void refreshTable() {
+ for (TableItem item : table.getItems()) {
+ item.dispose();
+ }
+ for (QName key : selected.keySet()) {
+ TableItem item = new TableItem(table, 0);
+ item.setText(0, key.toString());
+ Object value = selected.get(key);
+ item.setText(1, value.toString());
+ }
+ table.getColumn(0).pack();
+ table.getColumn(1).pack();
+ }
+
+ public static void main(String[] args) {
+ Path basePath;
+ if (args.length > 0) {
+ basePath = Paths.get(args[0]);
+ } else {
+ basePath = Paths.get(System.getProperty("user.home"));
+ }
+
+ final Display display = new Display();
+ final Shell shell = new Shell(display);
+ shell.setText(basePath.toString());
+ shell.setLayout(new FillLayout());
+
+ FsContentProvider contentSession = new FsContentProvider(basePath, true);
+// GcrContentTreeView treeView = new GcrContentTreeView(shell, 0, contentSession.get("/"));
+
+ shell.setSize(shell.computeSize(800, 600));
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ display.dispose();
+ }
+}