View Javadoc
1   package org.argeo.connect.e4.parts;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import javax.jcr.Property;
7   import javax.jcr.RepositoryException;
8   import javax.jcr.query.Query;
9   import javax.jcr.query.QueryResult;
10  import javax.jcr.query.Row;
11  
12  import org.argeo.connect.ConnectConstants;
13  import org.argeo.connect.ConnectException;
14  import org.argeo.connect.resources.ResourcesNames;
15  import org.argeo.connect.ui.ConnectColumnDefinition;
16  import org.argeo.connect.ui.IJcrTableViewer;
17  import org.argeo.connect.ui.util.JcrHtmlLabelProvider;
18  import org.argeo.connect.ui.widgets.TagLikeDropDown;
19  import org.argeo.connect.util.ConnectJcrUtils;
20  import org.argeo.connect.util.XPathUtils;
21  import org.argeo.eclipse.ui.EclipseUiUtils;
22  import org.eclipse.swt.SWT;
23  import org.eclipse.swt.events.SelectionAdapter;
24  import org.eclipse.swt.events.SelectionEvent;
25  import org.eclipse.swt.layout.GridLayout;
26  import org.eclipse.swt.widgets.Button;
27  import org.eclipse.swt.widgets.Composite;
28  import org.eclipse.swt.widgets.Text;
29  
30  /** Search the repository with a given entity type */
31  public class DefaultSearchEntityEditor extends AbstractSearchEntityEditor implements IJcrTableViewer {
32  
33  	// public final static String ID = ConnectUiPlugin.PLUGIN_ID +
34  	// ".defaultSearchEntityEditor";
35  
36  	// Default column
37  	private List<ConnectColumnDefinition> colDefs;
38  	private TagLikeDropDown tagDD;
39  
40  	@Override
41  	public void init() {
42  		super.init();
43  		// super.init(site, input);
44  		colDefs = new ArrayList<ConnectColumnDefinition>();
45  		colDefs.add(new ConnectColumnDefinition("Display Name", new JcrHtmlLabelProvider(Property.JCR_TITLE), 300));
46  		colDefs.add(new ConnectColumnDefinition("Tags", new JcrHtmlLabelProvider(ResourcesNames.CONNECT_TAGS), 300));
47  	}
48  
49  	/** Override this to provide type specific static filters */
50  	protected void populateStaticFilters(Composite body) {
51  		body.setLayout(new GridLayout(4, false));
52  
53  		Text tagTxt = createBoldLT(body, "Tag", "",
54  				"Select from list to find entities that are categorised with this tag");
55  		tagDD = new TagLikeDropDown(getSession(), getResourceService(), ConnectConstants.RESOURCE_TAG, tagTxt);
56  
57  		Button goBtn = new Button(body, SWT.PUSH);
58  		goBtn.setText("Search");
59  		goBtn.addSelectionListener(new SelectionAdapter() {
60  			private static final long serialVersionUID = 1L;
61  
62  			@Override
63  			public void widgetSelected(SelectionEvent e) {
64  				refreshFilteredList();
65  			}
66  		});
67  
68  		Button resetBtn = new Button(body, SWT.PUSH);
69  		resetBtn.setText("Reset");
70  		resetBtn.addSelectionListener(new SelectionAdapter() {
71  			private static final long serialVersionUID = 1L;
72  
73  			@Override
74  			public void widgetSelected(SelectionEvent e) {
75  				tagDD.reset(null);
76  			}
77  		});
78  	}
79  
80  	/** Refresh the table viewer based on the free text search field */
81  	protected void refreshFilteredList() {
82  		try {
83  			// XPath
84  			StringBuilder builder = new StringBuilder();
85  			builder.append("//element(*, ").append(getEntityType()).append(")");
86  			String attrQuery = XPathUtils.localAnd(XPathUtils.getFreeTextConstraint(getFilterText().getText()),
87  					XPathUtils.getPropertyEquals(ResourcesNames.CONNECT_TAGS, tagDD.getText()));
88  			if (EclipseUiUtils.notEmpty(attrQuery))
89  				builder.append("[").append(attrQuery).append("]");
90  			builder.append(" order by @").append(Property.JCR_TITLE).append(" ascending");
91  			Query query = XPathUtils.createQuery(getSession(), builder.toString());
92  			QueryResult result = query.execute();
93  			Row[] rows = ConnectJcrUtils.rowIteratorToArray(result.getRows());
94  			setViewerInput(rows);
95  		} catch (RepositoryException e) {
96  			throw new ConnectException("Unable to list " + getEntityType() + " entities with static filter ", e);
97  		}
98  	}
99  
100 	/** Overwrite to provide corresponding column definitions */
101 	@Override
102 	public List<ConnectColumnDefinition> getColumnDefinition(String extractId) {
103 		return colDefs;
104 	}
105 }