]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java
-> Finalisation of file download for RAP
[lgpl/argeo-commons.git] / eclipse / runtime / org.argeo.eclipse.ui.jcr / src / main / java / org / argeo / eclipse / ui / jcr / editors / AbstractJcrQueryEditor.java
1 package org.argeo.eclipse.ui.jcr.editors;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.RepositoryException;
7 import javax.jcr.Session;
8 import javax.jcr.query.QueryResult;
9 import javax.jcr.query.Row;
10 import javax.jcr.query.RowIterator;
11
12 import org.argeo.ArgeoException;
13 import org.argeo.eclipse.ui.GenericTableComparator;
14 import org.eclipse.core.runtime.IProgressMonitor;
15 import org.eclipse.core.runtime.IStatus;
16 import org.eclipse.core.runtime.Status;
17 import org.eclipse.jface.dialogs.ErrorDialog;
18 import org.eclipse.jface.viewers.ColumnLabelProvider;
19 import org.eclipse.jface.viewers.IDoubleClickListener;
20 import org.eclipse.jface.viewers.IStructuredContentProvider;
21 import org.eclipse.jface.viewers.TableViewer;
22 import org.eclipse.jface.viewers.TableViewerColumn;
23 import org.eclipse.jface.viewers.Viewer;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.custom.SashForm;
26 import org.eclipse.swt.events.SelectionAdapter;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.graphics.Image;
29 import org.eclipse.swt.layout.FillLayout;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.TableColumn;
34 import org.eclipse.ui.IEditorInput;
35 import org.eclipse.ui.IEditorSite;
36 import org.eclipse.ui.PartInitException;
37 import org.eclipse.ui.part.EditorPart;
38
39 /** Executes any JCR query. */
40 public abstract class AbstractJcrQueryEditor extends EditorPart {
41
42 protected String initialQuery;
43 protected String initialQueryType;
44
45 // IoC
46 private Session session;
47
48 private TableViewer viewer;
49 private List<TableViewerColumn> tableViewerColumns = new ArrayList<TableViewerColumn>();
50 private GenericTableComparator comparator;
51
52 protected abstract void createQueryForm(Composite parent);
53
54 @Override
55 public void init(IEditorSite site, IEditorInput input)
56 throws PartInitException {
57 JcrQueryEditorInput editorInput = (JcrQueryEditorInput) input;
58 initialQuery = editorInput.getQuery();
59 initialQueryType = editorInput.getQueryType();
60 setSite(site);
61 setInput(editorInput);
62 }
63
64 @Override
65 public final void createPartControl(final Composite parent) {
66 parent.setLayout(new FillLayout());
67
68 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
69 sashForm.setSashWidth(4);
70 sashForm.setLayout(new FillLayout());
71
72 Composite top = new Composite(sashForm, SWT.NONE);
73 GridLayout gl = new GridLayout(1, false);
74 top.setLayout(gl);
75
76 createQueryForm(top);
77
78 Composite bottom = new Composite(sashForm, SWT.NONE);
79 bottom.setLayout(new GridLayout(1, false));
80 sashForm.setWeights(getWeights());
81
82 viewer = new TableViewer(bottom);
83 viewer.getTable().setLayoutData(
84 new GridData(SWT.FILL, SWT.FILL, true, true));
85 viewer.getTable().setHeaderVisible(true);
86 viewer.setContentProvider(getQueryResultContentProvider());
87 viewer.setInput(getEditorSite());
88
89 if (getComparator() != null) {
90 comparator = getComparator();
91 viewer.setComparator(comparator);
92 }
93 if (getTableDoubleClickListener() != null)
94 viewer.addDoubleClickListener(getTableDoubleClickListener());
95
96 }
97
98 protected void executeQuery(String statement) {
99 try {
100 QueryResult qr = session.getWorkspace().getQueryManager()
101 .createQuery(statement, initialQueryType).execute();
102
103 // remove previous columns
104 for (TableViewerColumn tvc : tableViewerColumns)
105 tvc.getColumn().dispose();
106
107 for (final String columnName : qr.getColumnNames()) {
108 TableViewerColumn tvc = new TableViewerColumn(viewer, SWT.NONE);
109 configureColumn(columnName, tvc);
110 tvc.setLabelProvider(getLabelProvider(columnName));
111 tableViewerColumns.add(tvc);
112 }
113
114 viewer.setInput(qr);
115 } catch (RepositoryException e) {
116 ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
117 + statement, new Status(IStatus.ERROR,
118 "org.argeo.eclipse.ui.jcr", e.getMessage()));
119 // throw new ArgeoException("Cannot execute JCR query " + statement,
120 // e);
121 }
122 }
123
124 /**
125 * To be overidden to adapt size of form and result frames.
126 *
127 * @return
128 */
129 protected int[] getWeights() {
130 return new int[] { 30, 70 };
131 }
132
133 /**
134 * To be overidden to implement a doubleclick Listener on one of the rows of
135 * the table.
136 *
137 * @return
138 */
139 protected IDoubleClickListener getTableDoubleClickListener() {
140 return null;
141 }
142
143 /**
144 * To be overiden in order to implement a specific
145 * QueryResultContentProvider
146 */
147 protected IStructuredContentProvider getQueryResultContentProvider() {
148 return new QueryResultContentProvider();
149 }
150
151 /**
152 * Enable specific implementation for columns
153 */
154 protected List<TableViewerColumn> getTableViewerColumns() {
155 return tableViewerColumns;
156 }
157
158 /**
159 * Enable specific implementation for columns
160 */
161 protected TableViewer getTableViewer() {
162 return viewer;
163 }
164
165 /**
166 * To be overridden in order to configure column label providers .
167 */
168 protected ColumnLabelProvider getLabelProvider(final String columnName) {
169 return new ColumnLabelProvider() {
170 public String getText(Object element) {
171 Row row = (Row) element;
172 try {
173 return row.getValue(columnName).getString();
174 } catch (RepositoryException e) {
175 throw new ArgeoException("Cannot display row " + row, e);
176 }
177 }
178
179 public Image getImage(Object element) {
180 return null;
181 }
182 };
183 }
184
185 /** To be overridden in order to configure the columns. */
186 protected void configureColumn(String jcrColumnName,
187 TableViewerColumn column) {
188 column.getColumn().setWidth(50);
189 column.getColumn().setText(jcrColumnName);
190 }
191
192 private class QueryResultContentProvider implements
193 IStructuredContentProvider {
194
195 public void dispose() {
196 }
197
198 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
199 }
200
201 public Object[] getElements(Object inputElement) {
202 if (!(inputElement instanceof QueryResult))
203 return new String[] {};
204
205 try {
206 QueryResult queryResult = (QueryResult) inputElement;
207 List<Row> rows = new ArrayList<Row>();
208 RowIterator rit = queryResult.getRows();
209 while (rit.hasNext()) {
210 rows.add(rit.nextRow());
211 }
212
213 // List<Node> elems = new ArrayList<Node>();
214 // NodeIterator nit = queryResult.getNodes();
215 // while (nit.hasNext()) {
216 // elems.add(nit.nextNode());
217 // }
218 return rows.toArray();
219 } catch (RepositoryException e) {
220 throw new ArgeoException("Cannot read query result", e);
221 }
222 }
223
224 }
225
226 /**
227 * Might be used by children classes to sort columns.
228 *
229 * @param column
230 * @param index
231 * @return
232 */
233 protected SelectionAdapter getSelectionAdapter(final TableColumn column,
234 final int index) {
235
236 SelectionAdapter selectionAdapter = new SelectionAdapter() {
237 @Override
238 public void widgetSelected(SelectionEvent e) {
239
240 if (true)
241 return;
242 // try {
243 //
244 // comparator.setColumn(index);
245 // int dir = viewer.getTable().getSortDirection();
246 // if (viewer.getTable().getSortColumn() == column) {
247 // dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
248 // } else {
249 //
250 // dir = SWT.DOWN;
251 // }
252 // viewer.getTable().setSortDirection(dir);
253 // viewer.getTable().setSortColumn(column);
254 // viewer.refresh();
255 // } catch (Exception exc) {
256 // exc.printStackTrace();
257 // }
258 }
259 };
260 return selectionAdapter;
261 }
262
263 /**
264 * To be overriden to enable sorting.
265 *
266 * @author bsinou
267 *
268 */
269 protected GenericTableComparator getComparator() {
270 return null;
271 }
272
273 @Override
274 public boolean isDirty() {
275 return false;
276 }
277
278 @Override
279 public void doSave(IProgressMonitor monitor) {
280 // TODO save the query in JCR?
281
282 }
283
284 @Override
285 public void doSaveAs() {
286 }
287
288 @Override
289 public boolean isSaveAsAllowed() {
290 return false;
291 }
292
293 // IoC
294 public void setSession(Session session) {
295 this.session = session;
296 }
297 }