package org.argeo.eclipse.ui.parts; import java.util.ArrayList; import java.util.List; import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiException; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.util.ViewerUtils; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; 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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.osgi.service.useradmin.User; /** * Generic composite that display a filter and a table viewer to display users * (can also be groups) * * Warning: this class does not extends TableViewer. Use the * getTableViewer method to access it. * */ public abstract class LdifUsersTable extends Composite { private static final long serialVersionUID = -7385959046279360420L; // Context // private UserAdmin userAdmin; // Configuration private List columnDefs = new ArrayList(); private boolean hasFilter; private boolean preventTableLayout = false; private boolean hasSelectionColumn; private int tableStyle; // Local UI Objects private TableViewer usersViewer; private Text filterTxt; /* EXPOSED METHODS */ /** * @param parent * @param style */ public LdifUsersTable(Composite parent, int style) { super(parent, SWT.NO_FOCUS); this.tableStyle = style; } // TODO workaround the bug of the table layout in the Form public LdifUsersTable(Composite parent, int style, boolean preventTableLayout) { super(parent, SWT.NO_FOCUS); this.tableStyle = style; this.preventTableLayout = preventTableLayout; } /** This must be called before the call to populate method */ public void setColumnDefinitions(List columnDefinitions) { this.columnDefs = columnDefinitions; } /** * * @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; hasFilter = addFilter; hasSelectionColumn = addSelection; // Main Layout GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); layout.verticalSpacing = 5; this.setLayout(layout); if (hasFilter) createFilterPart(parent); Composite tableComp = new Composite(parent, SWT.NO_FOCUS); tableComp.setLayoutData(EclipseUiUtils.fillAll()); usersViewer = createTableViewer(tableComp); usersViewer.setContentProvider(new UsersContentProvider()); } /** * * @param showMore * display static filters on creation * @param addSelection * choose to add a column to select some of the displayed results or * not */ public void populateWithStaticFilters(boolean showMore, boolean addSelection) { // initialization Composite parent = this; hasFilter = true; hasSelectionColumn = addSelection; // Main Layout GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); layout.verticalSpacing = 5; this.setLayout(layout); createStaticFilterPart(parent, showMore); Composite tableComp = new Composite(parent, SWT.NO_FOCUS); tableComp.setLayoutData(EclipseUiUtils.fillAll()); usersViewer = createTableViewer(tableComp); usersViewer.setContentProvider(new UsersContentProvider()); } /** Enable access to the selected users or groups */ public List getSelectedUsers() { if (hasSelectionColumn) { Object[] elements = ((CheckboxTableViewer) usersViewer).getCheckedElements(); List result = new ArrayList(); for (Object obj : elements) { result.add((User) obj); } return result; } else throw new EclipseUiException( "Unvalid request: no selection column " + "has been created for the current table"); } /** Returns the User table viewer, typically to add doubleclick listener */ public TableViewer getTableViewer() { return usersViewer; } /** * Force the refresh of the underlying table using the current filter string if * relevant */ public void refresh() { String filter = hasFilter ? filterTxt.getText().trim() : null; if ("".equals(filter)) filter = null; refreshFilteredList(filter); } /** Effective repository request: caller must implement this method */ abstract protected List listFilteredElements(String filter); // protected List listFilteredElements(String filter) { // List users = new ArrayList(); // try { // Role[] roles = userAdmin.getRoles(filter); // // Display all users and groups // for (Role role : roles) // users.add((User) role); // } catch (InvalidSyntaxException e) { // throw new EclipseUiException("Unable to get roles with filter: " // + filter, e); // } // return users; // } /* GENERIC COMPOSITE METHODS */ @Override public boolean setFocus() { if (hasFilter) return filterTxt.setFocus(); else return usersViewer.getTable().setFocus(); } @Override public void dispose() { super.dispose(); } /* LOCAL CLASSES AND METHODS */ // Will be usefull to rather use a virtual table viewer private void refreshFilteredList(String filter) { List users = listFilteredElements(filter); usersViewer.setInput(users.toArray()); } private class UsersContentProvider implements IStructuredContentProvider { private static final long serialVersionUID = 1L; 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.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false)); filterTxt.addModifyListener(new ModifyListener() { private static final long serialVersionUID = 1L; public void modifyText(ModifyEvent event) { refreshFilteredList(filterTxt.getText()); } }); } private void createStaticFilterPart(Composite parent, boolean showMore) { Composite filterComp = new Composite(parent, SWT.NO_FOCUS); filterComp.setLayout(new GridLayout(2, false)); filterComp.setLayoutData(EclipseUiUtils.fillWidth()); // generic search filterTxt = new Text(filterComp, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL); filterTxt.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false)); // filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | // GridData.HORIZONTAL_ALIGN_FILL)); filterTxt.addModifyListener(new ModifyListener() { private static final long serialVersionUID = 1L; public void modifyText(ModifyEvent event) { refreshFilteredList(filterTxt.getText()); } }); // add static filter abilities Link moreLk = new Link(filterComp, SWT.NONE); Composite staticFilterCmp = new Composite(filterComp, SWT.NO_FOCUS); staticFilterCmp.setLayoutData(EclipseUiUtils.fillWidth(2)); populateStaticFilters(staticFilterCmp); MoreLinkListener listener = new MoreLinkListener(moreLk, staticFilterCmp, showMore); // initialise the layout listener.refresh(); moreLk.addSelectionListener(listener); } /** Overwrite to add static filters */ protected void populateStaticFilters(Composite staticFilterCmp) { } // private void addMoreSL(final Link more) { // more.addSelectionListener( } private class MoreLinkListener extends SelectionAdapter { private static final long serialVersionUID = -524987616510893463L; private boolean isShown; private final Composite staticFilterCmp; private final Link moreLk; public MoreLinkListener(Link moreLk, Composite staticFilterCmp, boolean isShown) { this.moreLk = moreLk; this.staticFilterCmp = staticFilterCmp; this.isShown = isShown; } @Override public void widgetSelected(SelectionEvent e) { isShown = !isShown; refresh(); } public void refresh() { GridData gd = (GridData) staticFilterCmp.getLayoutData(); if (isShown) { moreLk.setText(" Less... "); gd.heightHint = SWT.DEFAULT; } else { moreLk.setText(" More... "); gd.heightHint = 0; } forceLayout(); } } private void forceLayout() { LdifUsersTable.this.getParent().layout(true, true); } private TableViewer createTableViewer(final Composite parent) { int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL; if (hasSelectionColumn) style = style | SWT.CHECK; Table table = new Table(parent, style); TableColumnLayout layout = new TableColumnLayout(); // TODO the table layout does not works with the scrolled form if (preventTableLayout) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); table.setLayoutData(EclipseUiUtils.fillAll()); } else parent.setLayout(layout); TableViewer viewer; if (hasSelectionColumn) viewer = new CheckboxTableViewer(table); else viewer = new TableViewer(table); table.setLinesVisible(true); table.setHeaderVisible(true); TableViewerColumn column; // int offset = 0; if (hasSelectionColumn) { // offset = 1; column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE, 25); column.setLabelProvider(new ColumnLabelProvider() { private static final long serialVersionUID = 1L; @Override public String getText(Object element) { return null; } }); layout.setColumnData(column.getColumn(), new ColumnWeightData(25, 25, false)); SelectionAdapter selectionAdapter = new SelectionAdapter() { private static final long serialVersionUID = 1L; boolean allSelected = false; @Override public void widgetSelected(SelectionEvent e) { allSelected = !allSelected; ((CheckboxTableViewer) usersViewer).setAllChecked(allSelected); } }; column.getColumn().addSelectionListener(selectionAdapter); } // NodeViewerComparator comparator = new NodeViewerComparator(); // TODO enable the sort by click on the header // int i = offset; for (ColumnDefinition colDef : columnDefs) createTableColumn(viewer, layout, colDef); // 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 // JcrColumnDefinition firstCol = colDefs.get(0); // comparator.setColumn(firstCol.getPropertyType(), // firstCol.getPropertyName()); // viewer.setComparator(comparator); return viewer; } /** Default creation of a column for a user table */ private TableViewerColumn createTableColumn(TableViewer tableViewer, TableColumnLayout layout, ColumnDefinition columnDef) { boolean resizable = true; TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn column = tvc.getColumn(); column.setText(columnDef.getLabel()); column.setWidth(columnDef.getMinWidth()); column.setResizable(resizable); ColumnLabelProvider lp = columnDef.getLabelProvider(); // add a reference to the display to enable font management // if (lp instanceof UserAdminAbstractLP) // ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable() // .getDisplay()); tvc.setLabelProvider(lp); layout.setColumnData(column, new ColumnWeightData(columnDef.getWeight(), columnDef.getMinWidth(), resizable)); return tvc; } }