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