protected void detachListener(Collection instances) { for (Object obj : instances) { if (obj instanceof Instance) detachListener((Instance) obj); } }
@Override public void excludeItem(T item) { checkNotNullArgument(item, "item is null"); backgroundWorker.checkUIAccess(); checkState(); if (this.item != null && this.item.equals(item)) { setItem(null); } data.remove(item.getId()); detachListener(item); fireCollectionChanged(Operation.REMOVE, Collections.singletonList(item)); }
@Override public void removeItem(T item) { checkNotNullArgument(item, "item is null"); backgroundWorker.checkUIAccess(); checkState(); if (this.item != null && this.item.equals(item)) { setItem(null); } data.remove(item.getId()); detachListener(item); deleted(item); fireCollectionChanged(Operation.REMOVE, Collections.singletonList(item)); }
@Override public void clear() { backgroundWorker.checkUIAccess(); // replaced refresh call with state initialization if (state != State.VALID) { invalidate(); State prevState = state; if (prevState != State.VALID) { valid(); fireStateChanged(prevState); } } // Get items List<Object> collectionItems = new ArrayList<>(data.values()); // Clear container data.clear(); // Notify listeners for (Object obj : collectionItems) { T item = (T) obj; detachListener(item); } setItem(null); fireCollectionChanged(Operation.CLEAR, Collections.emptyList()); }
/** * This method is invoked by {@link #loadData(Map)} method immediately after loading entities from {@code DataSupplier}. * <p>If you override this method, be sure to call {@code super()}. If you process the loaded entities somehow, * call {@code super()} after processing. * * @param params datasource parameters, as described in {@link CollectionDatasource#refresh(java.util.Map)} * @param context {@code LoadContext} which was used for loading data * @param entities loaded entities */ protected void afterLoadData(@SuppressWarnings("unused") Map<String, Object> params, LoadContext context, Collection<T> entities) { detachListener(data.values()); data.clear(); for (T entity : entities) { data.put(entity.getId(), entity); attachListener(entity); } lastQuery = context.getQuery(); }
protected void afterLoadValues(Map<String, Object> params, ValueLoadContext context, List<KeyValueEntity> entities) { ds.detachListener(ds.data.values()); ds.data.clear(); boolean hasEnumerations = ds.metaClass.getOwnProperties().stream() .anyMatch(p -> p.getRange().isEnum()); if (!hasEnumerations) { for (KeyValueEntity entity : entities) { ds.data.put(entity.getId(), entity); ds.attachListener(entity); entity.setMetaClass(ds.metaClass); } } else { List<MetaProperty> enumProperties = getEnumProperties(ds.metaClass); for (KeyValueEntity entity : entities) { convertEnumValues(entity, enumProperties); ds.data.put(entity.getId(), entity); ds.attachListener(entity); entity.setMetaClass(ds.metaClass); } } }
protected ValueLoadContext beforeLoadValues(Map<String, Object> params) { ValueLoadContext context = new ValueLoadContext(); ValueLoadContext.Query q = (ValueLoadContext.Query) ds.createDataQuery(context, params); if (q == null) { ds.detachListener(ds.data.values()); ds.data.clear(); return null; } if (ds.firstResult > 0) q.setFirstResult(ds.firstResult); if (ds.maxResults > 0) { q.setMaxResults(ds.maxResults); } if (storeName != null) context.setStoreName(storeName); context.setSoftDeletion(ds.isSoftDeletion()); context.setIdName(idName); for (MetaProperty property : ds.metaClass.getProperties()) { context.addProperty(property.getName()); } ds.dataLoadError = null; return context; }
/** * This method is invoked by {@link #loadData(Map)} method immediately before loading entities from {@code DataSupplier}. * <br>If you override this method, be sure to call {@code super()}. * * @param params datasource parameters, as described in {@link CollectionDatasource#refresh(java.util.Map)} * @return LoadContext which will be used to load data */ protected LoadContext beforeLoadData(Map<String, Object> params) { final LoadContext context = new LoadContext(metaClass); LoadContext.Query q = (LoadContext.Query) createDataQuery(context, params); if (q == null) { detachListener(data.values()); data.clear(); return null; } if (sortInfos != null && sortOnDb) { setSortDirection(q); } if (firstResult > 0) q.setFirstResult(firstResult); if (maxResults > 0) { q.setMaxResults(maxResults); } context.setView(view); context.setSoftDeletion(isSoftDeletion()); prepareLoadContext(context); dataLoadError = null; return context; }