]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/plugins/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java
draft implementation of the history request.
[lgpl/argeo-commons.git] / eclipse / plugins / 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.eclipse.core.runtime.IProgressMonitor;
14 import org.eclipse.core.runtime.IStatus;
15 import org.eclipse.core.runtime.Status;
16 import org.eclipse.jface.dialogs.ErrorDialog;
17 import org.eclipse.jface.viewers.ColumnLabelProvider;
18 import org.eclipse.jface.viewers.IDoubleClickListener;
19 import org.eclipse.jface.viewers.IStructuredContentProvider;
20 import org.eclipse.jface.viewers.TableViewer;
21 import org.eclipse.jface.viewers.TableViewerColumn;
22 import org.eclipse.jface.viewers.Viewer;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.custom.SashForm;
25 import org.eclipse.swt.graphics.Image;
26 import org.eclipse.swt.layout.FillLayout;
27 import org.eclipse.swt.layout.GridData;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.ui.IEditorInput;
31 import org.eclipse.ui.IEditorSite;
32 import org.eclipse.ui.PartInitException;
33 import org.eclipse.ui.part.EditorPart;
34
35 /** Executes any JCR query. */
36 public abstract class AbstractJcrQueryEditor extends EditorPart {
37 protected String initialQuery;
38 protected String initialQueryType;
39
40 private Session session;
41
42 private TableViewer viewer;
43 private List<TableViewerColumn> tableViewerColumns = new ArrayList<TableViewerColumn>();
44
45 protected abstract void createQueryForm(Composite parent);
46
47 @Override
48 public void init(IEditorSite site, IEditorInput input)
49 throws PartInitException {
50 JcrQueryEditorInput editorInput = (JcrQueryEditorInput) input;
51 initialQuery = editorInput.getQuery();
52 initialQueryType = editorInput.getQueryType();
53 setSite(site);
54 setInput(editorInput);
55 }
56
57 @Override
58 public final void createPartControl(final Composite parent) {
59 parent.setLayout(new FillLayout());
60
61 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
62 sashForm.setSashWidth(4);
63 sashForm.setLayout(new FillLayout());
64
65 Composite top = new Composite(sashForm, SWT.NONE);
66 GridLayout gl = new GridLayout(1, false);
67 top.setLayout(gl);
68
69 // Device device = Display.getCurrent();
70 // Color red = new Color(device, 255, 0, 0);
71 // top.setBackground(red);
72 createQueryForm(top);
73
74 Composite bottom = new Composite(sashForm, SWT.NONE);
75 bottom.setLayout(new GridLayout(1, false));
76 sashForm.setWeights(getWeights());
77
78 viewer = new TableViewer(bottom);
79 viewer.getTable().setLayoutData(
80 new GridData(SWT.FILL, SWT.FILL, true, true));
81 viewer.getTable().setHeaderVisible(true);
82 viewer.setContentProvider(new QueryResultContentProvider());
83 // viewer.setLabelProvider(new QueryResultLabelProvider());
84 viewer.setInput(getEditorSite());
85
86 if (getTableDoubleClickListener() != null)
87 viewer.addDoubleClickListener(getTableDoubleClickListener());
88
89 }
90
91 /**
92 * To be overidden to adapt size of form and result frames.
93 *
94 * @return
95 */
96 protected int[] getWeights() {
97 return new int[] { 30, 70 };
98 }
99
100 /**
101 * To be overidden to implement a doubleclick Listener on one of the rows of
102 * the table.
103 *
104 * @return
105 */
106 protected IDoubleClickListener getTableDoubleClickListener() {
107 return null;
108 }
109
110 protected void executeQuery(String statement) {
111 try {
112 QueryResult qr = session.getWorkspace().getQueryManager()
113 .createQuery(statement, initialQueryType).execute();
114
115 // remove previous columns
116 for (TableViewerColumn tvc : tableViewerColumns)
117 tvc.getColumn().dispose();
118
119 for (final String columnName : qr.getColumnNames()) {
120 TableViewerColumn tvc = new TableViewerColumn(viewer, SWT.NONE);
121 configureColumn(columnName, tvc);
122 tvc.setLabelProvider(getLabelProvider(columnName));
123 tableViewerColumns.add(tvc);
124 }
125
126 viewer.setInput(qr);
127 } catch (RepositoryException e) {
128 ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
129 + statement, new Status(IStatus.ERROR,
130 "org.argeo.eclipse.ui.jcr", e.getMessage()));
131 // throw new ArgeoException("Cannot execute JCR query " + statement,
132 // e);
133 }
134 }
135
136 /**
137 * To be overridden in order to configure column label providers .
138 */
139 protected ColumnLabelProvider getLabelProvider(final String columnName) {
140 return new ColumnLabelProvider() {
141 public String getText(Object element) {
142 Row row = (Row) element;
143 try {
144 return row.getValue(columnName).getString();
145 } catch (RepositoryException e) {
146 throw new ArgeoException("Cannot display row " + row, e);
147 }
148 }
149
150 public Image getImage(Object element) {
151 return null;
152 }
153 };
154 }
155
156 /** To be overridden in order to configure the columns. */
157 protected void configureColumn(String jcrColumnName,
158 TableViewerColumn column) {
159 column.getColumn().setWidth(50);
160 column.getColumn().setText(jcrColumnName);
161 }
162
163 private class QueryResultContentProvider implements
164 IStructuredContentProvider {
165
166 public void dispose() {
167 }
168
169 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
170 }
171
172 public Object[] getElements(Object inputElement) {
173 if (!(inputElement instanceof QueryResult))
174 return new String[] {};
175
176 try {
177 QueryResult queryResult = (QueryResult) inputElement;
178 List<Row> rows = new ArrayList<Row>();
179 RowIterator rit = queryResult.getRows();
180 while (rit.hasNext()) {
181 rows.add(rit.nextRow());
182 }
183
184 // List<Node> elems = new ArrayList<Node>();
185 // NodeIterator nit = queryResult.getNodes();
186 // while (nit.hasNext()) {
187 // elems.add(nit.nextNode());
188 // }
189 return rows.toArray();
190 } catch (RepositoryException e) {
191 throw new ArgeoException("Cannot read query result", e);
192 }
193 }
194
195 }
196
197 // private class QueryResultLabelProvider extends LabelProvider implements
198 // ITableLabelProvider {
199 // public String getColumnText(Object element, int columnIndex) {
200 // Row row = (Row) element;
201 // try {
202 // return row.getValues()[columnIndex].toString();
203 // } catch (RepositoryException e) {
204 // throw new ArgeoException("Cannot display row " + row, e);
205 // }
206 // }
207 //
208 // public Image getColumnImage(Object element, int columnIndex) {
209 // return null;
210 // }
211 //
212 // }
213
214 @Override
215 public boolean isDirty() {
216 return false;
217 }
218
219 @Override
220 public void doSave(IProgressMonitor monitor) {
221 // TODO save the query in JCR?
222
223 }
224
225 @Override
226 public void doSaveAs() {
227 }
228
229 @Override
230 public boolean isSaveAsAllowed() {
231 return false;
232 }
233
234 // IoC
235 public void setSession(Session session) {
236 this.session = session;
237 }
238
239 }