--- /dev/null
+package org.argeo.cms.swt.app;
+
+import static org.argeo.api.acr.NamespaceUtils.toPrefixedName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.widgets.SwtHierarchicalPart;
+import org.argeo.cms.swt.widgets.SwtTabularPart;
+import org.argeo.cms.ux.acr.ContentHierarchicalPart;
+import org.argeo.cms.ux.widgets.Column;
+import org.argeo.cms.ux.widgets.DefaultTabularPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.widgets.Composite;
+
+public class AcrContentTreeView extends Composite {
+ private static final long serialVersionUID = -3707881216246077323L;
+
+ private Content rootContent;
+
+// private Content selected;
+
+ public AcrContentTreeView(Composite parent, int style, Content content) {
+ super(parent, style);
+ this.rootContent = content;
+ // this.selected = rootContent;
+ setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+ SashForm split = new SashForm(this, SWT.HORIZONTAL);
+ split.setLayoutData(CmsSwtUtils.fillAll());
+
+ ContentHierarchicalPart contentPart = new ContentHierarchicalPart();
+ contentPart.setInput(rootContent);
+
+ SwtHierarchicalPart<Content> hPart = new SwtHierarchicalPart<>(split, getStyle(), contentPart);
+
+ Composite area = new Composite(split, SWT.BORDER);
+ area.setLayout(CmsSwtUtils.noSpaceGridLayout(2));
+ split.setWeights(new int[] { 30, 70 });
+
+ // attributes
+ DefaultTabularPart<Content, QName> attributesPart = new DefaultTabularPart<>() {
+
+ @Override
+ protected List<QName> asList(Content input) {
+ return new ArrayList<>(input.keySet());
+ }
+ };
+
+ attributesPart.addColumn(new Column<QName>() {
+
+ @Override
+ public String getText(QName model) {
+ try {
+ return NamespaceUtils.toPrefixedName(model);
+ } catch (IllegalStateException e) {
+ return model.toString();
+ }
+ }
+ });
+ attributesPart.addColumn(new Column<QName>() {
+
+ @Override
+ public String getText(QName model) {
+ return attributesPart.getInput().get(model).toString();
+ }
+
+ @Override
+ public int getWidth() {
+ return 400;
+ }
+
+ });
+ // attributesPart.setInput(selected);
+
+ SwtTabularPart<Content, QName> attributeTable = new SwtTabularPart<>(area, style, attributesPart);
+ attributeTable.setLayoutData(CmsSwtUtils.fillAll());
+
+ // types
+ DefaultTabularPart<Content, QName> typesPart = new DefaultTabularPart<>() {
+
+ @Override
+ protected List<QName> asList(Content input) {
+ return input.getContentClasses();
+ }
+ };
+ typesPart.addColumn(new Column<QName>() {
+
+ @Override
+ public String getText(QName model) {
+ return toPrefixedName(model);
+ }
+
+ });
+
+ // typesPart.setInput(selected);
+
+ SwtTabularPart<Content, QName> typesTable = new SwtTabularPart<>(area, style, typesPart);
+ typesTable.setLayoutData(CmsSwtUtils.fillAll());
+
+ // controller
+ contentPart.setInput(rootContent);
+ contentPart.onSelected((o) -> {
+ Content c = (Content) o;
+// selected = c;
+ attributesPart.setInput(c);
+ typesPart.setInput(c);
+ });
+
+ attributesPart.refresh();
+ typesPart.refresh();
+ }
+
+// 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);
+//// 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();
+// }
+}