Project

General

Profile

« Previous | Next » 

Revision 707b6237

Added by Niels Hoffmann over 12 years ago

Merged with trunk

View differences:

eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialogs/filteredSelection/AbstractFilteredCdmResourceSelectionDialog.java
10 10

  
11 11
package eu.etaxonomy.taxeditor.ui.dialogs.filteredSelection;
12 12

  
13
import java.lang.reflect.Field;
13 14
import java.text.Collator;
14 15
import java.util.Comparator;
15 16
import java.util.HashSet;
......
89 90
		
90 91
		initModel();
91 92
		
92
		if (cdmObject != null) {
93
			setInitialPattern(getTitle(cdmObject));
93
		String objectTitle = getTitle(cdmObject);
94
		if (objectTitle != null) {
95
			setInitialPattern(objectTitle);
94 96
		}
95 97
		
96
		ILabelProvider labelProvider = new FilteredCdmResourceLabelProvider();
97
		setListLabelProvider(labelProvider);
98
		setDetailsLabelProvider(labelProvider);
98
		setListLabelProvider(createListLabelProvider());
99
		setDetailsLabelProvider(createDetailsLabelProvider());
99 100
		
100
//		setSelectionHistory(new ResourceSelectionHistory());
101
		setSelectionHistory(new ResourceSelectionHistory());
101 102
	}
102 103
	
103 104
	/**
104
	 * Override in suibclasses.
105
	 * By default, we are returning the standard list label provider
106
	 * 
107
	 * Override in subclasses if you want different behavior 
108
	 * 
109
	 * @return
110
	 */
111
	protected ILabelProvider createDetailsLabelProvider() {
112
		return createListLabelProvider();
113
	}
114

  
115
	/**
116
	 * 
117
	 * @return
118
	 */
119
	protected ILabelProvider createListLabelProvider() {
120
		return new FilteredCdmResourceLabelProvider();
121
	}
122

  
123
	/**
124
	 * Override in subclasses.
105 125
	 * Will run before initModel()
106 126
	 */
107 127
	protected void init() {
108 128
		
109 129
	}
110

  
130
	
111 131
	/**
112 132
	 * <p>getSelectionFromDialog</p>
113 133
	 *
......
116 136
	 * @return a TYPE object.
117 137
	 */
118 138
	protected static <TYPE extends CdmBase> TYPE getSelectionFromDialog(AbstractFilteredCdmResourceSelectionDialog<TYPE> dialog) {
119
		if (dialog.open() == Window.CANCEL) {
139
		//dialog.setInitialPattern("");
140
		int result = dialog.open();
141
		
142
		if (result == Window.CANCEL) {
120 143
			return null;
121 144
		}
122 145
		
......
176 199
	 * @return a {@link java.lang.String} object.
177 200
	 */
178 201
	protected String getTitle(T cdmObject) {
202
		if(cdmObject == null){
203
			return "";
204
		}
205
		
179 206
		if (cdmObject instanceof IIdentifiableEntity) {
180 207
			return ((IIdentifiableEntity) cdmObject).getTitleCache();			
181 208
		}
182
		return null;
209
		
210
		throw new IllegalArgumentException("Generic method only" +
211
				" supports cdmObject of type IIdentifiableEntity." +
212
				" Please implement specific method in subclass.");
183 213
	}
214
	
184 215

  
185 216
	/** {@inheritDoc} */
186 217
	@Override
......
202 233
	protected ItemsFilter createFilter() {
203 234
		return new ItemsFilter() {
204 235

  
236
			/**
237
			 * Always returns false to enforce refiltering even if the pattern is equal
238
			 */
239
			@Override
240
			public boolean equalsFilter(ItemsFilter filter) {
241
				return false;
242
			}
243
			
205 244
			@Override
206 245
			public boolean isConsistentItem(Object item) {
207 246
				return false;
......
228 267
	 * @param cdmObject a T object.
229 268
	 */
230 269
	protected void setPattern(T cdmObject) {
231
		((Text) getPatternControl()).setText(getTitle(cdmObject));
270
		// FilteredSelection does some very tricky caching to make sure it 
271
		// runs with high performance. 
272
		// This works for most use cases, but we want to change the model while the dialog is open
273
		// and all the clever caching prevents the content provider from knowing that the model has changed
274
		// I am aware, that this is a hack, but the FilteredSelectionDialog API does not offer a convenient 
275
		// way to solve the problem.
276
		try {
277
			Field lastCompletedFilter = this.getClass().getSuperclass().getSuperclass().getDeclaredField("lastCompletedFilter");
278
			lastCompletedFilter.setAccessible(true);
279
			lastCompletedFilter.set(this, null);
280
		} catch (SecurityException e) {
281
			StoreUtil.error(getClass(), e);
282
		} catch (NoSuchFieldException e) {
283
			StoreUtil.error(getClass(), e);
284
		} catch (IllegalArgumentException e) {
285
			StoreUtil.error(getClass(), e);
286
		} catch (IllegalAccessException e) {
287
			StoreUtil.error(getClass(), e);
288
		}
289
		
290
		// this also is not the nicest way to do it. 
291
		// I am still amazed, that FilteredSelectionDialog does not offer any methods to change its data
292
		// once it was opened. Am I doing it wrong?
293
		String pattern = getTitle(cdmObject);
294
		((Text) getPatternControl()).setText(pattern);
232 295
	}
233 296
	
234 297
	/* (non-Javadoc)

Also available in: Unified diff