package org.argeo.library.ui; import java.util.SortedMap; import java.util.TreeMap; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.query.Query; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.CmsView; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.entity.EntityType; import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; import org.argeo.suite.ui.SuiteEvent; import org.argeo.suite.ui.SuiteIcon; import org.argeo.suite.ui.widgets.TreeOrSearchArea; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public class ContentEntryArea implements CmsUiProvider { @Override public Control createUi(Composite parent, Node context) throws RepositoryException { CmsTheme theme = CmsTheme.getCmsTheme(parent); parent.setLayout(new GridLayout()); Ui ui = new Ui(parent, SWT.NONE); ui.setLayoutData(CmsUiUtils.fillAll()); TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE); nameCol.getColumn().setWidth(400); nameCol.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Node node = (Node) element; return Jcr.getTitle(node); } @Override public Image getImage(Object element) { Node node = (Node) element; Image icon; if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) { icon = SuiteIcon.folder.getSmallIcon(theme); } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) { // TODO check recognized document types icon = SuiteIcon.document.getSmallIcon(theme); } else if (Jcr.isNodeType(node, EntityType.document.get())) { icon = SuiteIcon.document.getSmallIcon(theme); } else { if (!isLeaf(node)) icon = SuiteIcon.folder.getSmallIcon(theme); else icon = null; } return icon; } }); ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); if (user != null) { CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(user)); } } }); ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); if (user != null) { CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(user)); } } }); ui.getTreeViewer().setContentProvider(new SpacesContentProvider()); ui.getTreeViewer().setInput(context.getSession()); return ui; } protected boolean isLeaf(Node node) { return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get()) || Jcr.isNodeType(node, NodeType.NT_FILE); } class Ui extends TreeOrSearchArea { public Ui(Composite parent, int style) { super(parent, style); } } class SpacesContentProvider implements ITreeContentProvider { @Override public Object[] getElements(Object inputElement) { Session session = (Session) inputElement; try { Query query = session.getWorkspace().getQueryManager() .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2); NodeIterator spacesIt = query.execute().getNodes(); SortedMap map = new TreeMap<>(); while (spacesIt.hasNext()) { Node space = spacesIt.nextNode(); String path = space.getPath(); map.put(path, space); } return map.values().toArray(); } catch (RepositoryException e) { throw new JcrException(e); } } @Override public Object[] getChildren(Object parentElement) { Node parent = (Node) parentElement; if (isLeaf(parent)) return null; return Jcr.getNodes(parent).toArray(); } @Override public Object getParent(Object element) { Node node = (Node) element; return Jcr.getParent(node); } @Override public boolean hasChildren(Object element) { Node node = (Node) element; return !isLeaf(node); } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } }