fix #8148: add widthHint to styledTextfield
[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());
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() && PreferencesUtil.getBooleanValue(IPreferenceKeys.SEARCH_FOR_IDENTIFIER_AND_TITLECACHE)){
183 List<IdentifiedEntityDTO<Reference>> list = CdmStore.getService(IReferenceService.class).listByIdentifierAndTitleCacheAbbrev(pattern, null, MatchMode.BEGINNING, limitOfInitialElements);
184 if (model!= null){
185 model.clear();
186 }
187 identifierMap = new HashMap();
188 for (IdentifiedEntityDTO dto: list){
189 if (dto.getIdentifier() != null){
190 identifierMap.put(dto.getCdmEntity().getUuid(), dto.getIdentifier());
191 }
192 model.add(dto.getCdmEntity());
193
194 }
195 }else if (isUseIdentifier() ){
196 List<IdentifiedEntityDTO<Reference>> list = CdmStore.getService(IReferenceService.class).listByIdentifierAbbrev(pattern, null, MatchMode.BEGINNING, limitOfInitialElements);
197 if (model!= null){
198 model.clear();
199 }
200 identifierMap = new HashMap();
201 for (IdentifiedEntityDTO dto: list){
202 identifierMap.put(dto.getCdmEntity().getUuid(), dto.getIdentifier());
203 model.add(dto.getCdmEntity());
204
205 }
206 }else {
207 model = CdmStore.getService(IReferenceService.class).getUuidAndTitleCache(limitOfInitialElements,pattern);
208 }
209
210 }
211
212 }
213
214 @Override
215 protected void addIdentifierCheckButton(Composite searchAndFilter) {
216 Button btnCheckButton = new Button(searchAndFilter, SWT.CHECK);
217 btnCheckButton.setText("Use Identifier");
218 if (PreferencesUtil.getBooleanValue(IPreferenceKeys.IS_SEARCH_FOR_IDENTIFIER_AS_DEFAULT)){
219 btnCheckButton.setSelection(true);
220 useIdentifier = true;
221 }
222 btnCheckButton.addSelectionListener(new SelectionAdapter() {
223 @Override
224 public void widgetSelected(SelectionEvent e) {
225 useIdentifier = btnCheckButton.getSelection();
226 search();
227 }
228 });
229 }
230 /** {@inheritDoc} */
231 @Override
232 protected String getTitle(Reference cdmObject) {
233 if(cdmObject == null){
234 return "";
235 }else{
236 return super.getTitle(cdmObject);
237 }
238 // }else{
239 // return DefaultReferenceCacheStrategy.putAuthorToEndOfString(cdmObject.getTitleCache(), cdmObject.getAuthorship().getTitleCache());
240 // }
241 }
242
243 /** {@inheritDoc} */
244 @Override
245 protected AbstractNewEntityWizard getNewEntityWizard(String parameter) {
246 return new NewReferenceWizard();
247 }
248
249 /** {@inheritDoc} */
250 @Override
251 protected String[] getNewWizardText() {
252 return new String[]{"New Reference"};
253 }
254
255 /** {@inheritDoc} */
256 @Override
257 protected void search() {
258 Control control =getSearchField();
259 String pattern = null;
260 if (control != null){
261 pattern = ((Text)control).getText();
262 callService(pattern);
263
264 fillContentProvider(null);
265 }
266 }
267 @Override
268 protected ILabelProvider createListLabelProvider() {
269 return new FilteredReferenceLabelProvider();
270 }
271
272 public class FilteredReferenceLabelProvider extends FilteredCdmResourceLabelProvider {
273 @Override
274 public String getText(Object element) {
275 if (element == null) {
276 return null;
277 }
278 UuidAndTitleCache uuidAndTitleCache = (UuidAndTitleCache) element;
279 String titleCache = uuidAndTitleCache.getTitleCache();
280 if(PreferencesUtil.getBooleanValue(IPreferenceKeys.SHOW_ID_IN_ENTITY_SELECTION_DIAOLOG)){
281 titleCache += " ["+uuidAndTitleCache.getId()+"]";
282 }
283 if (isUseIdentifier()){
284 if (identifierMap != null){
285 AlternativeIdentifier identifier = identifierMap.get(uuidAndTitleCache.getUuid());
286 if (identifier != null){
287 titleCache += " (" + identifier.getTypeLabel() +": " + identifier.getIdentifier() + ")";
288 }else{
289 titleCache += " (-)";
290 }
291 }
292
293 }
294
295 return titleCache;
296 }
297 };
298
299 }