--- /dev/null
+package org.argeo.slc.akb.ui.composites;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
+import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.Ordering;
+import javax.jcr.query.qom.QueryObjectModel;
+import javax.jcr.query.qom.QueryObjectModelFactory;
+import javax.jcr.query.qom.Selector;
+import javax.jcr.query.qom.StaticOperand;
+
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.jcr.JcrUiUtils;
+import org.argeo.eclipse.ui.jcr.lists.ColumnDefinition;
+import org.argeo.eclipse.ui.jcr.lists.NodeViewerComparator;
+import org.argeo.eclipse.ui.jcr.lists.SimpleJcrNodeLabelProvider;
+import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
+import org.argeo.eclipse.ui.utils.ViewerUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbNames;
+import org.argeo.slc.akb.ui.providers.AkbImageProvider;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+public class AkbItemsTableComposite extends Composite implements ArgeoNames {
+ // private final static Log log =
+ // LogFactory.getLog(UserTableComposite.class);
+
+ private TableViewer usersViewer;
+ private Text filterTxt;
+ private final static String FILTER_HELP_MSG = "Type filter criterion "
+ + "separated by a space";
+ private Session session;
+
+ private Font italic;
+ private Font bold;
+
+ private boolean hasFilter;
+ private boolean hasSelectionColumn;
+
+ // private List<Node> selectedItems = new ArrayList<Node>();
+
+ /**
+ * Overwrite to display other columns
+ */
+ public List<ColumnDefinition> getColumnsDef() {
+ List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+ // Name
+ columnDefs.add(new ColumnDefinition(null, Property.JCR_TITLE,
+ PropertyType.STRING, "Name", 150));
+
+ return columnDefs;
+ }
+
+ public AkbItemsTableComposite(Composite parent, int style, Session session) {
+ super(parent, style);
+ this.session = session;
+ }
+
+ /**
+ *
+ * @param addFilter
+ * choose to add a field to filter results or not
+ * @param addSelection
+ * choose to add a column to select some of the displayed results
+ * or not
+ */
+ public void populate(boolean addFilter, boolean addSelection) {
+ // initialization
+ Composite parent = this;
+ italic = EclipseUiUtils.getItalicFont(parent);
+ bold = EclipseUiUtils.getBoldFont(parent);
+ hasFilter = addFilter;
+ hasSelectionColumn = addSelection;
+
+ // Main Layout
+ this.setLayout(new GridLayout(1, false));
+ if (hasFilter)
+ createFilterPart(parent);
+ usersViewer = createTableViewer(parent);
+ EclipseUiSpecificUtils.enableToolTipSupport(usersViewer);
+ usersViewer.setContentProvider(new UsersContentProvider());
+ refreshFilteredList();
+ }
+
+ /** Returns the User table viewer, typically to add doubleclick listener */
+ public TableViewer getTableViewer() {
+ return usersViewer;
+ }
+
+ private TableViewer createTableViewer(final Composite parent) {
+ int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
+ if (hasSelectionColumn)
+ style = style | SWT.CHECK;
+
+ Table table = new Table(parent, style);
+ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ TableViewer viewer;
+ if (hasSelectionColumn)
+ viewer = new CheckboxTableViewer(table);
+ else
+ viewer = new TableViewer(table);
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ // pass a mapping between col index and property name to the comparator.
+ // List<String> propertiesList = new ArrayList<String>();
+
+ TableViewerColumn column;
+ int offset = 0;
+ // if (hasSelectionColumn) {
+ if (hasSelectionColumn) {
+ offset++;
+ column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE,
+ 25);
+ // column.setEditingSupport(new SelectedEditingSupport(viewer));
+ column.setLabelProvider(new ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return null;
+ }
+ });
+ SelectionAdapter selectionAdapter = new SelectionAdapter() {
+ boolean allSelected = false;
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ allSelected = !allSelected;
+ ((CheckboxTableViewer) usersViewer)
+ .setAllChecked(allSelected);
+ }
+ };
+ column.getColumn().addSelectionListener(selectionAdapter);
+ }
+
+ // Image column
+ offset++;
+ column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE, 25);
+ // column.setEditingSupport(new SelectedEditingSupport(viewer));
+ column.setLabelProvider(new ColumnLabelProvider() {
+ private AkbImageProvider imageProvider = new AkbImageProvider();
+
+ @Override
+ public String getText(Object element) {
+ return null;
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return imageProvider.getImage(element);
+ }
+
+ });
+
+ // Create other columns
+ List<ColumnDefinition> colDefs = getColumnsDef();
+
+ NodeViewerComparator comparator = new NodeViewerComparator();
+ int i = offset;
+ for (ColumnDefinition colDef : colDefs) {
+ column = ViewerUtils.createTableViewerColumn(viewer,
+ colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
+ column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
+ column.getColumn().addSelectionListener(
+ JcrUiUtils.getNodeSelectionAdapter(i,
+ colDef.getPropertyType(), colDef.getPropertyName(),
+ comparator, viewer));
+ i++;
+ }
+
+ // IMPORTANT: initialize comparator before setting it
+ ColumnDefinition firstCol = colDefs.get(0);
+ comparator.setColumn(firstCol.getPropertyType(),
+ firstCol.getPropertyName());
+ viewer.setComparator(comparator);
+
+ return viewer;
+ }
+
+ private class CLProvider extends SimpleJcrNodeLabelProvider {
+
+ public CLProvider(String propertyName) {
+ super(propertyName);
+ }
+
+ public String getToolTipText(Object element) {
+ return getText(element);
+ }
+
+ @Override
+ public Font getFont(Object elem) {
+ return null;
+ // // self
+ // String username = getProperty(elem, ARGEO_USER_ID);
+ // if (username.equals(session.getUserID()))
+ // return bold;
+ //
+ // // disabled
+ // try {
+ // Node userProfile = (Node) elem;
+ // // Node userProfile = userHome.getNode(ARGEO_PROFILE);
+ // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
+ // return italic;
+ // else
+ // return null;
+ // } catch (RepositoryException e) {
+ // throw new AkbException("Cannot get font for " + username, e);
+ // }
+ }
+ }
+
+ @Override
+ public boolean setFocus() {
+ usersViewer.getTable().setFocus();
+ return true;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ public void refresh() {
+ refreshFilteredList();
+ }
+
+ private String getProperty(Object element, String name) {
+ try {
+ Node node = (Node) element;
+ return node.hasProperty(name) ? node.getProperty(name).getString()
+ : "";
+ } catch (RepositoryException e) {
+ throw new AkbException("Cannot get property " + name, e);
+ }
+ }
+
+ private class UsersContentProvider implements IStructuredContentProvider {
+
+ public Object[] getElements(Object inputElement) {
+ return (Object[]) inputElement;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ /* MANAGE FILTER */
+ private void createFilterPart(Composite parent) {
+ // Text Area for the filter
+ filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
+ | SWT.ICON_CANCEL);
+ filterTxt.setMessage(FILTER_HELP_MSG);
+ filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+ | GridData.HORIZONTAL_ALIGN_FILL));
+ filterTxt.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent event) {
+ refreshFilteredList();
+ }
+ });
+ }
+
+ /**
+ * Refresh the user list: caller might overwrite in order to display a
+ * subset of all users
+ */
+ protected void refreshFilteredList() {
+ List<Node> nodes;
+ try {
+ nodes = JcrUtils.nodeIteratorToList(listFilteredElements(session,
+ hasFilter ? filterTxt.getText() : null));
+ usersViewer.setInput(nodes.toArray());
+ } catch (RepositoryException e) {
+ throw new AkbException("Unable to items", e);
+ }
+ }
+
+ /**
+ * Build repository request : caller might overwrite in order to display a
+ * subset of all users
+ */
+ protected NodeIterator listFilteredElements(Session session, String filter)
+ throws RepositoryException {
+ QueryManager queryManager = session.getWorkspace().getQueryManager();
+ QueryObjectModelFactory factory = queryManager.getQOMFactory();
+
+ Selector source = factory.selector(NodeType.MIX_TITLE,
+ NodeType.MIX_TITLE);
+
+ // Default Constraint: in correct sub tree
+ Constraint defaultC = factory.descendantNode(source.getSelectorName(),
+ AkbNames.AKB_TEMPLATES_BASE_PATH);
+
+ // FIXME: workaround to display only legal nodes
+ defaultC = factory.and(defaultC, factory.propertyExistence(
+ source.getSelectorName(), Property.JCR_TITLE));
+
+ // Build constraints based the textArea content
+ if (filter != null && !"".equals(filter.trim())) {
+ // Parse the String
+ String[] strs = filter.trim().split(" ");
+ for (String token : strs) {
+ StaticOperand so = factory.literal(session.getValueFactory()
+ .createValue("*" + token + "*"));
+ Constraint currC = factory.fullTextSearch(
+ source.getSelectorName(), null, so);
+ if (defaultC == null)
+ defaultC = currC;
+ else
+ defaultC = factory.and(defaultC, currC);
+ }
+ }
+
+ Ordering order = factory.ascending(factory.propertyValue(
+ source.getSelectorName(), Property.JCR_TITLE));
+ Ordering[] orderings = { order };
+
+ QueryObjectModel query = factory.createQuery(source, defaultC,
+ orderings, null);
+
+ QueryResult result = query.execute();
+ return result.getNodes();
+ }
+}
\ No newline at end of file
package org.argeo.slc.akb.ui.views;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import org.argeo.eclipse.ui.utils.CommandUtils;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.akb.AkbException;
import org.argeo.slc.akb.ui.AkbUiPlugin;
-import org.eclipse.jface.viewers.TableViewer;
+import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor;
+import org.argeo.slc.akb.ui.composites.AkbItemsTableComposite;
+import org.argeo.slc.akb.utils.AkbJcrUtils;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
/** Basic view that display a list of items with a quick search field. */
private Session session;
// This page widgets
- private TableViewer itemViewer;
- private Text filterTxt;
- private final static String FILTER_HELP_MSG = "Search...";
+ private AkbItemsTableComposite userTableCmp;
@Override
public void createPartControl(Composite parent) {
gl.horizontalSpacing = gl.verticalSpacing = gl.marginWidth = 0;
parent.setLayout(gl);
- // Filter
- Composite cmp = new Composite(parent, SWT.NO_FOCUS);
- cmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
- createFilterPart(cmp);
-
+ // Create the composite that displays the list and a filter
+ AkbItemsTableComposite userTableCmp = new AkbItemsTableComposite(
+ parent, SWT.NO_FOCUS, session);
+ userTableCmp.populate(true, false);
+ userTableCmp
+ .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ // Configure
+ userTableCmp.getTableViewer().addDoubleClickListener(
+ new ViewDoubleClickListener());
+ getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
+
+ // // Filter
+ // Composite cmp = new Composite(parent, SWT.NO_FOCUS);
+ // cmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ // createFilterPart(cmp);
+ //
// // Table
// cmp = new Composite(parent, SWT.NO_FOCUS);
// cmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
- // itemViewer = createListPart(cmp, new EntitySingleColumnLabelProvider(
- // peopleService));
+ // itemViewer = createListPart(cmp);
//
- // refreshFilteredList();
+ // // refreshFilteredList();
}
- private void createFilterPart(Composite parent) {
- parent.setLayout(new GridLayout());
- // Text Area for the filter
- filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
- | SWT.ICON_CANCEL);
- filterTxt.setMessage(FILTER_HELP_MSG);
- filterTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
- filterTxt.addModifyListener(new ModifyListener() {
-
- public void modifyText(ModifyEvent event) {
- // refreshFilteredList();
+ class ViewDoubleClickListener implements IDoubleClickListener {
+ public void doubleClick(DoubleClickEvent evt) {
+ Object obj = ((IStructuredSelection) evt.getSelection())
+ .getFirstElement();
+ try {
+ if (obj instanceof Node) {
+ Node node = (Node) obj;
+ Node currEnv = AkbJcrUtils.getCurrentTemplate(node);
+
+ // Add Connector Alias
+ Map<String, String> params = new HashMap<String, String>();
+ params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID,
+ node.getIdentifier());
+ params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,
+ currEnv.getIdentifier());
+
+ CommandUtils.callCommand(OpenAkbNodeEditor.ID, params);
+ }
+ } catch (RepositoryException e) {
+ throw new AkbException("Cannot open " + obj, e);
}
- });
+ }
}
- // protected TableViewer createListPart(Composite parent,
- // ILabelProvider labelProvider) {
+ // private void createFilterPart(Composite parent) {
+ // parent.setLayout(new GridLayout());
+ // // Text Area for the filter
+ // filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
+ // | SWT.ICON_CANCEL);
+ // filterTxt.setMessage(FILTER_HELP_MSG);
+ // filterTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ // filterTxt.addModifyListener(new ModifyListener() {
+ //
+ // public void modifyText(ModifyEvent event) {
+ // refreshFilteredList();
+ // }
+ // });
+ // }
+ //
+ // protected TableViewer createListPart(Composite parent) {
// TableViewer v = new TableViewer(parent);
- // v.setLabelProvider(labelProvider);
//
// TableColumn singleColumn = new TableColumn(v.getTable(), SWT.V_SCROLL);
// TableColumnLayout tableColumnLayout = new TableColumnLayout();
@Override
public void dispose() {
- // JcrUtils.logoutQuietly(session);
+ userTableCmp.dispose();
+ JcrUtils.logoutQuietly(session);
super.dispose();
}
/* DEPENDENCY INJECTION */
public void setRepository(Repository repository) {
- // try {
- // session = repository.login();
- // } catch (RepositoryException e) {
- // throw new PeopleException("Unable to initialize "
- // + "session for view " + ID, e);
- // }
+ try {
+ session = repository.login();
+ } catch (RepositoryException e) {
+ throw new AkbException("Unable to initialize "
+ + "session for view " + ID, e);
+ }
}
}
\ No newline at end of file