View Javadoc
1   package org.argeo.people.ui.composites;
2   
3   import java.util.List;
4   
5   import org.argeo.connect.ui.ConnectColumnDefinition;
6   import org.argeo.eclipse.ui.EclipseUiUtils;
7   import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
8   import org.argeo.eclipse.ui.utils.ViewerUtils;
9   import org.eclipse.jface.viewers.ColumnLabelProvider;
10  import org.eclipse.jface.viewers.IStructuredContentProvider;
11  import org.eclipse.jface.viewers.TableViewer;
12  import org.eclipse.jface.viewers.TableViewerColumn;
13  import org.eclipse.jface.viewers.Viewer;
14  import org.eclipse.jface.viewers.ViewerComparator;
15  import org.eclipse.swt.SWT;
16  import org.eclipse.swt.events.SelectionAdapter;
17  import org.eclipse.swt.events.SelectionEvent;
18  import org.eclipse.swt.layout.GridData;
19  import org.eclipse.swt.layout.GridLayout;
20  import org.eclipse.swt.widgets.Composite;
21  import org.eclipse.swt.widgets.Table;
22  import org.eclipse.swt.widgets.TableColumn;
23  
24  /** Utility class that wraps a table viewer to display JCR rows */
25  public class PeopleTableViewer extends Composite {
26  	private static final long serialVersionUID = 1L;
27  	private TableViewer viewer;
28  	private MyViewerComparator comparator;
29  
30  	private List<ConnectColumnDefinition> colDefs;
31  	private int tableStyle;
32  
33  	public List<ConnectColumnDefinition> getColumnsDef() {
34  		return colDefs;
35  	}
36  
37  	// CONSTRUCTOR
38  	public PeopleTableViewer(Composite parent, int style,
39  			List<ConnectColumnDefinition> columns) {
40  		super(parent, SWT.NONE);
41  		this.tableStyle = style;
42  		this.colDefs = columns;
43  		populate();
44  	}
45  
46  	protected void populate() {
47  		// initialization
48  		Composite parent = this;
49  		// Main Layout
50  		GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
51  		this.setLayout(layout);
52  		createTableViewer(parent);
53  		EclipseUiSpecificUtils.enableToolTipSupport(viewer);
54  		viewer.setContentProvider(new MyTableContentProvider());
55  	}
56  
57  	/** Returns the User table viewer, typically to add doubleclick listener */
58  	public TableViewer getTableViewer() {
59  		return viewer;
60  	}
61  
62  	private void createTableViewer(final Composite parent) {
63  		// Creates objects
64  		Table table = new Table(parent, tableStyle);
65  		viewer = new TableViewer(table);
66  		comparator = new MyViewerComparator();
67  
68  		// Configure
69  		table.setLinesVisible(true);
70  		table.setHeaderVisible(true);
71  		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
72  
73  		// Create columns
74  		TableViewerColumn column;
75  		int i = 0;
76  		for (ConnectColumnDefinition colDef : colDefs) {
77  			column = ViewerUtils.createTableViewerColumn(viewer,
78  					colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
79  			column.setLabelProvider(colDef.getColumnLabelProvider());
80  			column.getColumn().addSelectionListener(
81  					getSelectionAdapter(column.getColumn(), i));
82  			i++;
83  		}
84  
85  		viewer.setComparator(comparator);
86  	}
87  
88  	private SelectionAdapter getSelectionAdapter(final TableColumn column,
89  			final int index) {
90  		SelectionAdapter selectionAdapter = new SelectionAdapter() {
91  			private static final long serialVersionUID = 1L;
92  
93  			@Override
94  			public void widgetSelected(SelectionEvent e) {
95  				comparator.setColumn(index);
96  				int dir = comparator.getDirection();
97  				viewer.getTable().setSortDirection(dir);
98  				viewer.getTable().setSortColumn(column);
99  				viewer.refresh();
100 			}
101 		};
102 		return selectionAdapter;
103 	}
104 
105 	private class MyTableContentProvider implements IStructuredContentProvider {
106 		private static final long serialVersionUID = 7164029504991808317L;
107 
108 		public Object[] getElements(Object inputElement) {
109 			return (Object[]) inputElement;
110 		}
111 
112 		public void dispose() {
113 		}
114 
115 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
116 		}
117 	}
118 
119 	/* Add sort abilities */
120 	private class MyViewerComparator extends ViewerComparator {
121 		private static final long serialVersionUID = 1L;
122 
123 		private int propertyIndex;
124 		private static final int DESCENDING = 1;
125 		private int direction = 0;
126 
127 		public MyViewerComparator() {
128 			this.propertyIndex = 0;
129 			direction = DESCENDING;
130 		}
131 
132 		public int getDirection() {
133 			return direction == 1 ? SWT.DOWN : SWT.UP;
134 		}
135 
136 		public void setColumn(int column) {
137 			if (column == this.propertyIndex) {
138 				// Same column as last sort; toggle the direction
139 				direction = 1 - direction;
140 			} else {
141 				// New column; do an ascending sort
142 				this.propertyIndex = column;
143 				direction = DESCENDING;
144 			}
145 		}
146 
147 		@Override
148 		public int compare(Viewer viewer, Object e1, Object e2) {
149 
150 			ColumnLabelProvider labelProvider = colDefs.get(propertyIndex)
151 					.getColumnLabelProvider();
152 			int rc = labelProvider.getText(e1).compareTo(
153 					labelProvider.getText(e2));
154 
155 			// If descending order, flip the direction
156 			if (direction == DESCENDING) {
157 				rc = -rc;
158 			}
159 			return rc;
160 		}
161 	}
162 
163 	public void refresh() {
164 		viewer.refresh();
165 	}
166 
167 	@Override
168 	public boolean setFocus() {
169 		viewer.getTable().setFocus();
170 		return true;
171 	}
172 
173 	// @Override
174 	// public void dispose() {
175 	// super.dispose();
176 	// }
177 }