@Override protected void showSearchedObjectsInTree( List<? extends ModelWrapper<?>> searchedObjects, boolean doubleClick) { for (ModelWrapper<?> searchedObject : searchedObjects) { List<AbstractAdapterBase> nodeRes = rootNode.search(searchedObject.getClass(), searchedObject.getId()); if (nodeRes.size() == 0) { searchedNode.addSearchObject(searchedObject, searchedObject.getId()); SpecimenTransitView.addToNode(searchedNode, searchedObject); } } if (searchedObjects.size() == 1) { ModelWrapper<?> searchedWrap = searchedObjects.get(0); List<AbstractAdapterBase> nodeRes = rootNode.search(searchedWrap.getClass(), searchedWrap.getId()); if (nodeRes.size() > 0) nodeRes.get(0).performDoubleClick(); } else { searchedNode.performExpand(); BgcPlugin.openMessage( Messages.SpecimenTransitView_res_dialog_title, NLS.bind(Messages.SpecimenTransitView_found_multiple_msg, searchedObjects.size())); } }
@Override public void performExpand() { List<ModelWrapper<?>> alreadyHasListener = new ArrayList<ModelWrapper<?>>(); try { for (AbstractAdapterBase child : getChildren()) { if (child instanceof AdapterBase) { ModelWrapper<?> childWrapper = ((AdapterBase) child).getModelObject(); if (childWrapper != null) { childWrapper.reload(); } } List<AbstractAdapterBase> subChildren = new ArrayList<AbstractAdapterBase>(child.getChildren()); List<AbstractAdapterBase> toRemove = new ArrayList<AbstractAdapterBase>(); for (AbstractAdapterBase subChild : subChildren) { ModelWrapper<?> wrapper = null; if (subChild instanceof AdapterBase) { Object subChildObj = ((AdapterBase) subChild).getModelObject(); if (subChildObj instanceof ModelWrapper) { wrapper = (ModelWrapper<?>) subChildObj; // wrapper.reload(); // FIXME: using reload here breaks a lot of stuff, // why? } } Integer subChildId = subChild.getId(); if (!searchedObjectIds.contains(subChildId)) { toRemove.add(subChild); } else { // subChild.rebuild(); if (wrapper != null) { alreadyHasListener.add(wrapper); } } } for (AbstractAdapterBase subChild : toRemove) child.removeChild(subChild); } // add searched objects is not yet there for (final Object o : searchedObjects) { if (o instanceof ModelWrapper) { ModelWrapper<?> w = (ModelWrapper<?>) o; if (!alreadyHasListener.contains(w)) { w.addWrapperListener( new WrapperListenerAdapter() { @Override public void deleted(WrapperEvent event) { searchedObjects.remove(o); performExpand(); } }); } } addNode(o); } if (!keepDirectLeafChild) { // remove sub children without any children List<AbstractAdapterBase> children = new ArrayList<AbstractAdapterBase>(getChildren()); for (AbstractAdapterBase child : children) { if (!(child instanceof DispatchAdapter) && child.getChildren().size() == 0) { removeChild(child); } } } } catch (final RemoteAccessException exp) { BgcPlugin.openRemoteAccessErrorMessage(exp); } catch (Exception e) { logger.error("Error while refreshing searched elements", e); // $NON-NLS-1$ } }