1 package org
.argeo
.eclipse
.ui
.jcr
.editors
;
3 import java
.util
.ArrayList
;
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
;
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
;
39 /** Executes any JCR query. */
40 public abstract class AbstractJcrQueryEditor
extends EditorPart
{
42 protected String initialQuery
;
43 protected String initialQueryType
;
46 private Session session
;
48 private TableViewer viewer
;
49 private List
<TableViewerColumn
> tableViewerColumns
= new ArrayList
<TableViewerColumn
>();
50 private GenericTableComparator comparator
;
52 protected abstract void createQueryForm(Composite parent
);
55 public void init(IEditorSite site
, IEditorInput input
)
56 throws PartInitException
{
57 JcrQueryEditorInput editorInput
= (JcrQueryEditorInput
) input
;
58 initialQuery
= editorInput
.getQuery();
59 initialQueryType
= editorInput
.getQueryType();
61 setInput(editorInput
);
65 public final void createPartControl(final Composite parent
) {
66 parent
.setLayout(new FillLayout());
68 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
69 sashForm
.setSashWidth(4);
70 sashForm
.setLayout(new FillLayout());
72 Composite top
= new Composite(sashForm
, SWT
.NONE
);
73 GridLayout gl
= new GridLayout(1, false);
78 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
79 bottom
.setLayout(new GridLayout(1, false));
80 sashForm
.setWeights(getWeights());
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());
89 if (getComparator() != null) {
90 comparator
= getComparator();
91 viewer
.setComparator(comparator
);
93 if (getTableDoubleClickListener() != null)
94 viewer
.addDoubleClickListener(getTableDoubleClickListener());
98 protected void executeQuery(String statement
) {
100 QueryResult qr
= session
.getWorkspace().getQueryManager()
101 .createQuery(statement
, initialQueryType
).execute();
103 // remove previous columns
104 for (TableViewerColumn tvc
: tableViewerColumns
)
105 tvc
.getColumn().dispose();
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
);
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,
125 * To be overidden to adapt size of form and result frames.
129 protected int[] getWeights() {
130 return new int[] { 30, 70 };
134 * To be overidden to implement a doubleclick Listener on one of the rows of
139 protected IDoubleClickListener
getTableDoubleClickListener() {
144 * To be overiden in order to implement a specific
145 * QueryResultContentProvider
147 protected IStructuredContentProvider
getQueryResultContentProvider() {
148 return new QueryResultContentProvider();
152 * Enable specific implementation for columns
154 protected List
<TableViewerColumn
> getTableViewerColumns() {
155 return tableViewerColumns
;
159 * Enable specific implementation for columns
161 protected TableViewer
getTableViewer() {
166 * To be overridden in order to configure column label providers .
168 protected ColumnLabelProvider
getLabelProvider(final String columnName
) {
169 return new ColumnLabelProvider() {
170 public String
getText(Object element
) {
171 Row row
= (Row
) element
;
173 return row
.getValue(columnName
).getString();
174 } catch (RepositoryException e
) {
175 throw new ArgeoException("Cannot display row " + row
, e
);
179 public Image
getImage(Object element
) {
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
);
192 private class QueryResultContentProvider
implements
193 IStructuredContentProvider
{
195 public void dispose() {
198 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
201 public Object
[] getElements(Object inputElement
) {
202 if (!(inputElement
instanceof QueryResult
))
203 return new String
[] {};
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());
213 // List<Node> elems = new ArrayList<Node>();
214 // NodeIterator nit = queryResult.getNodes();
215 // while (nit.hasNext()) {
216 // elems.add(nit.nextNode());
218 return rows
.toArray();
219 } catch (RepositoryException e
) {
220 throw new ArgeoException("Cannot read query result", e
);
227 * Might be used by children classes to sort columns.
233 protected SelectionAdapter
getSelectionAdapter(final TableColumn column
,
236 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
238 public void widgetSelected(SelectionEvent e
) {
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;
252 // viewer.getTable().setSortDirection(dir);
253 // viewer.getTable().setSortColumn(column);
255 // } catch (Exception exc) {
256 // exc.printStackTrace();
260 return selectionAdapter
;
264 * To be overriden to enable sorting.
269 protected GenericTableComparator
getComparator() {
274 public boolean isDirty() {
279 public void doSave(IProgressMonitor monitor
) {
280 // TODO save the query in JCR?
285 public void doSaveAs() {
289 public boolean isSaveAsAllowed() {
294 public void setSession(Session session
) {
295 this.session
= session
;