]> 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
Implementation of requests, better handling of check in / check out process.
[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(2);
63 sashForm.setLayout(new FillLayout());
64
65 Composite top = new Composite(sashForm, SWT.NONE);
66 top.setLayout(new GridLayout(1, false));
67 // Device device = Display.getCurrent();
68 // Color red = new Color(device, 255, 0, 0);
69 // top.setBackground(red);
70 createQueryForm(top);
71
72 Composite bottom = new Composite(sashForm, SWT.NONE);
73 bottom.setLayout(new GridLayout(1, false));
74 sashForm.setWeights(getWeights());
75
76 viewer = new TableViewer(bottom);
77 viewer.getTable().setLayoutData(
78 new GridData(SWT.FILL, SWT.FILL, true, true));
79 viewer.getTable().setHeaderVisible(true);
80 viewer.setContentProvider(new QueryResultContentProvider());
81 // viewer.setLabelProvider(new QueryResultLabelProvider());
82 viewer.setInput(getEditorSite());
83
84 if (getTableDoubleClickListener() != null)
85 viewer.addDoubleClickListener(getTableDoubleClickListener());
86
87 }
88
89 /**
90 * To be overidden to adapt size of form and result frames.
91 *
92 * @return
93 */
94 protected int[] getWeights() {
95 return new int[] { 30, 70 };
96 }
97
98 /**
99 * To be overidden to implement a doubleclick Listener on one of the rows of
100 * the table.
101 *
102 * @return
103 */
104 protected IDoubleClickListener getTableDoubleClickListener() {
105 return null;
106 }
107
108 protected void executeQuery(String statement) {
109 try {
110 QueryResult qr = session.getWorkspace().getQueryManager()
111 .createQuery(statement, initialQueryType).execute();
112
113 // remove previous columns
114 for (TableViewerColumn tvc : tableViewerColumns)
115 tvc.getColumn().dispose();
116
117 for (final String columnName : qr.getColumnNames()) {
118 TableViewerColumn tvc = new TableViewerColumn(viewer, SWT.NONE);
119 configureColumn(columnName, tvc);
120 tvc.setLabelProvider(new ColumnLabelProvider() {
121
122 public String getText(Object element) {
123 Row row = (Row) element;
124 try {
125 return row.getValue(columnName).getString();
126 } catch (RepositoryException e) {
127 throw new ArgeoException("Cannot display row "
128 + row, e);
129 }
130 }
131
132 public Image getImage(Object element) {
133 return null;
134 }
135 });
136 tableViewerColumns.add(tvc);
137 }
138
139 viewer.setInput(qr);
140 } catch (RepositoryException e) {
141 ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
142 + statement, new Status(IStatus.ERROR,
143 "org.argeo.eclipse.ui.jcr", e.getMessage()));
144 // throw new ArgeoException("Cannot execute JCR query " + statement,
145 // e);
146 }
147 }
148
149 /** To be overridden in order to configure the columns. */
150 protected void configureColumn(String jcrColumnName,
151 TableViewerColumn column) {
152 column.getColumn().setWidth(50);
153 column.getColumn().setText(jcrColumnName);
154 }
155
156 private class QueryResultContentProvider implements
157 IStructuredContentProvider {
158
159 public void dispose() {
160 }
161
162 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
163 }
164
165 public Object[] getElements(Object inputElement) {
166 if (!(inputElement instanceof QueryResult))
167 return new String[] {};
168
169 try {
170 QueryResult queryResult = (QueryResult) inputElement;
171 List<Row> rows = new ArrayList<Row>();
172 RowIterator rit = queryResult.getRows();
173 while (rit.hasNext()) {
174 rows.add(rit.nextRow());
175 }
176
177 // List<Node> elems = new ArrayList<Node>();
178 // NodeIterator nit = queryResult.getNodes();
179 // while (nit.hasNext()) {
180 // elems.add(nit.nextNode());
181 // }
182 return rows.toArray();
183 } catch (RepositoryException e) {
184 throw new ArgeoException("Cannot read query result", e);
185 }
186 }
187
188 }
189
190 // private class QueryResultLabelProvider extends LabelProvider implements
191 // ITableLabelProvider {
192 // public String getColumnText(Object element, int columnIndex) {
193 // Row row = (Row) element;
194 // try {
195 // return row.getValues()[columnIndex].toString();
196 // } catch (RepositoryException e) {
197 // throw new ArgeoException("Cannot display row " + row, e);
198 // }
199 // }
200 //
201 // public Image getColumnImage(Object element, int columnIndex) {
202 // return null;
203 // }
204 //
205 // }
206
207 @Override
208 public boolean isDirty() {
209 return false;
210 }
211
212 @Override
213 public void doSave(IProgressMonitor monitor) {
214 // TODO save the query in JCR?
215
216 }
217
218 @Override
219 public void doSaveAs() {
220 }
221
222 @Override
223 public boolean isSaveAsAllowed() {
224 return false;
225 }
226
227 // IoC
228 public void setSession(Session session) {
229 this.session = session;
230 }
231
232 }