Merge branch 'develop' into taxonDescription
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / dialog / selection / ReferenceSelectionDialog.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.ui.dialog.selection;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.commons.lang.StringUtils;
21 import org.eclipse.jface.viewers.ILabelProvider;
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.widgets.Button;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Control;
28 import org.eclipse.swt.widgets.Shell;
29 import org.eclipse.swt.widgets.Text;
30
31 import eu.etaxonomy.cdm.api.service.IReferenceService;
32 import eu.etaxonomy.cdm.api.service.dto.IdentifiedEntityDTO;
33 import eu.etaxonomy.cdm.api.service.dto.IdentifiedEntityDTO.AlternativeIdentifier;
34 import eu.etaxonomy.cdm.model.reference.Reference;
35 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
36 import eu.etaxonomy.cdm.persistence.query.MatchMode;
37 import eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard;
38 import eu.etaxonomy.taxeditor.newWizard.NewReferenceWizard;
39 import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
40 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
41 import eu.etaxonomy.taxeditor.store.CdmStore;
42
43 /**
44 * <p>FilteredReferenceSelectionDialog class.</p>
45 *
46 * @author n.hoffmann
47 * @created 04.06.2009
48 * @version 1.0
49 */
50 public class ReferenceSelectionDialog extends AbstractFilteredCdmResourceSelectionDialog<Reference> {
51
52 protected static boolean isInReference = false;
53 private Reference currentReference;
54 List<String> lastSelectedReferences = null;
55 Map<UUID, AlternativeIdentifier> identifierMap;
56
57 /**
58 * <p>select</p>
59 *
60 * @param reference a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
61 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
62 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
63 * @return a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
64 */
65 public static Reference select(Shell shell, //ConversationHolder conversation,
66 Reference reference, boolean isInReference) {
67 ReferenceSelectionDialog dialog = new ReferenceSelectionDialog(shell, //conversation,
68 "Choose a reference", false, reference, isInReference);
69 return getSelectionFromDialog(dialog);
70 }
71
72 /**
73 * <p>select</p>
74 *
75 * @param reference a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
76 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
77 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
78 * @return a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
79 */
80 public static Reference select(Shell shell, //ConversationHolder conversation,
81 Reference reference) {
82 ReferenceSelectionDialog dialog = new ReferenceSelectionDialog(shell, //conversation,
83 "Choose a reference", false, reference);
84 return getSelectionFromDialog(dialog);
85 }
86
87
88
89 /**
90 * <p>Constructor for FilteredReferenceSelectionDialog.</p>
91 *
92 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
93 * @param title a {@link java.lang.String} object.
94 * @param reference a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
95 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
96 * @param multi a boolean.
97 */
98 protected ReferenceSelectionDialog(Shell shell, //ConversationHolder conversation,
99 String title, boolean multi, Reference reference) {
100 super(shell, //conversation,
101 title, multi, ReferenceSelectionDialog.class.getCanonicalName(), reference);
102 this.currentReference = reference;
103
104
105 }
106
107
108
109
110 /**
111 * <p>Constructor for FilteredReferenceSelectionDialog.</p>
112 *
113 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
114 * @param title a {@link java.lang.String} object.
115 * @param reference a {@link eu.etaxonomy.cdm.model.reference.ReferenceBase} object.
116 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
117 * @param multi a boolean.
118 */
119 protected ReferenceSelectionDialog(Shell shell, //ConversationHolder conversation,
120 String title, boolean multi, Reference reference, boolean isInReference) {
121 super(shell, //conversation,
122 title, multi, ReferenceSelectionDialog.class.getCanonicalName(), null);
123 this.isInReference = isInReference;
124 this.currentReference = reference;
125
126 }
127
128
129 /* (non-Javadoc)
130 * @see eu.etaxonomy.taxeditor.dialogs.AbstractFilteredCdmResourceSelectionDialog#getPersistentObject(java.util.UUID)
131 */
132 /** {@inheritDoc} */
133 @Override
134 protected Reference getPersistentObject(UUID cdmUuid) {
135 if (lastSelectedReferences == null){
136 lastSelectedReferences = new ArrayList<>();
137 }
138 if (lastSelectedReferences.size()<6){
139 lastSelectedReferences.add(cdmUuid.toString());
140 }else{
141 lastSelectedReferences.remove(0);
142 lastSelectedReferences.add(cdmUuid.toString());
143 }
144
145 PreferencesUtil.setLastSelectedReference(lastSelectedReferences);
146 return CdmStore.getService(IReferenceService.class).load(cdmUuid);
147 }
148
149 /* (non-Javadoc)
150 * @see eu.etaxonomy.taxeditor.dialogs.AbstractFilteredCdmResourceSelectionDialog#search
151 */
152 /** {@inheritDoc} */
153 @Override
154 protected void callService(String pattern) {
155
156 if (StringUtils.isBlank(pattern) && lastSelectedReferences == null){
157 lastSelectedReferences = PreferencesUtil.getLastSelectedReferences();
158 Set<UUID> uuids = new HashSet<>();
159 for (String uuidString: lastSelectedReferences){
160 uuids.add(UUID.fromString(uuidString));
161 }
162 if (!uuids.isEmpty()){
163 model = CdmStore.getService(IReferenceService.class).getUuidAndTitleCacheForUUIDS(uuids);
164 }
165
166 } else if (isInReference && currentReference != null){
167
168 if (isUseIdentifier()){
169 List<IdentifiedEntityDTO<Reference>> list = CdmStore.getService(IReferenceService.class).listByIdentifierAbbrev(pattern, null, MatchMode.BEGINNING, limitOfInitialElements);
170 if (model!= null){
171 model.clear();
172 }
173 for (IdentifiedEntityDTO dto: list){
174
175 model.add(dto.getCdmEntity());
176 }
177 }else{
178 model = CdmStore.getService(IReferenceService.class).getUuidAndTitleCache(limitOfInitialElements,pattern, currentReference.getType());
179 }
180
181 }else{
182 if (isUseIdentifier()){
183 List<IdentifiedEntityDTO<Reference>> list = CdmStore.getService(IReferenceService.class).listByIdentifierAbbrev(pattern, null, MatchMode.BEGINNING, limitOfInitialElements);
184 if (model!= null){
185 model.clear();
186 }
187 identifierMap = new HashMap();
188 for (IdentifiedEntityDTO dto: list){
189 identifierMap.put(dto.getCdmEntity().getUuid(), dto.getIdentifier());
190 model.add(dto.getCdmEntity());
191
192 }
193 }else{
194 model = CdmStore.getService(IReferenceService.class).getUuidAndTitleCache(limitOfInitialElements,pattern);
195 }
196
197 }
198
199 }
200
201 @Override
202 protected void addIdentifierCheckButton(Composite searchAndFilter) {
203 Button btnCheckButton = new Button(searchAndFilter, SWT.CHECK);
204 btnCheckButton.setText("Use Identifier");
205 btnCheckButton.addSelectionListener(new SelectionAdapter() {
206 @Override
207 public void widgetSelected(SelectionEvent e) {
208 useIdentifier = btnCheckButton.getSelection();
209 }
210 });
211 }
212 /** {@inheritDoc} */
213 @Override
214 protected String getTitle(Reference cdmObject) {
215 if(cdmObject == null){
216 return "";
217 }else{
218 return super.getTitle(cdmObject);
219 }
220 // }else{
221 // return DefaultReferenceCacheStrategy.putAuthorToEndOfString(cdmObject.getTitleCache(), cdmObject.getAuthorship().getTitleCache());
222 // }
223 }
224
225 /** {@inheritDoc} */
226 @Override
227 protected AbstractNewEntityWizard getNewEntityWizard(String parameter) {
228 return new NewReferenceWizard();
229 }
230
231 /** {@inheritDoc} */
232 @Override
233 protected String[] getNewWizardText() {
234 return new String[]{"New Reference"};
235 }
236
237 /** {@inheritDoc} */
238 @Override
239 protected void search() {
240 Control control =getSearchField();
241 String pattern = null;
242 if (control != null){
243 pattern = ((Text)control).getText();
244 callService(pattern);
245
246 fillContentProvider(null);
247 }
248 }
249 @Override
250 protected ILabelProvider createListLabelProvider() {
251 return new FilteredReferenceLabelProvider();
252 }
253
254 public class FilteredReferenceLabelProvider extends FilteredCdmResourceLabelProvider {
255 @Override
256 public String getText(Object element) {
257 if (element == null) {
258 return null;
259 }
260 UuidAndTitleCache uuidAndTitleCache = (UuidAndTitleCache) element;
261 String titleCache = uuidAndTitleCache.getTitleCache();
262 if(PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.SHOW_ID_IN_ENTITY_SELECTION_DIAOLOG)){
263 titleCache += " ["+uuidAndTitleCache.getId()+"]";
264 }
265 if (isUseIdentifier()){
266 AlternativeIdentifier identifier = identifierMap.get(uuidAndTitleCache.getUuid());
267 titleCache += " (" + identifier.getTypeLabel() +": " + identifier.getIdentifier() + ")";
268 }
269
270 return titleCache;
271 }
272 };
273
274 }