package edu.ualberta.med.biobank.treeview;
import java.util.List;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.springframework.remoting.RemoteAccessException;
import edu.ualberta.med.biobank.common.wrappers.ModelWrapper;
import edu.ualberta.med.biobank.gui.common.BgcLogger;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import gov.nih.nci.system.applicationservice.ApplicationException;
public abstract class AbstractTodayNode<E extends ModelWrapper<?>> extends
AdapterBase {
private static BgcLogger logger = BgcLogger
.getLogger(AbstractTodayNode.class.getName());
private List<E> currentTodayElements;
public AbstractTodayNode(AdapterBase parent, int id) {
super(parent, id, Messages.AbstractTodayNode_today, true);
}
@Override
public void popupMenu(TreeViewer tv, Tree tree, Menu menu) {
//
}
@Override
protected void executeDoubleClick() {
performExpand();
}
@Override
protected List<E> getWrapperChildren() throws Exception {
return null;
}
@Override
public String getViewFormId() {
return null;
}
@Override
public String getTooltipTextInternal() {
return null;
}
@Override
protected String getLabelInternal() {
return null;
}
@Override
public String getEntryFormId() {
return null;
}
@Override
public void performExpand() {
try {
currentTodayElements = getTodayElements();
// remove elements that are not in today list
for (AbstractAdapterBase child : getChildren()) {
ModelWrapper<?> childWrapper = ((AdapterBase) child)
.getModelObject();
childWrapper.reload();
for (AbstractAdapterBase grandchild : child.getChildren()) {
ModelWrapper<?> grandchildWrapper =
((AdapterBase) grandchild)
.getModelObject();
grandchildWrapper.reload();
if (!currentTodayElements.contains(grandchildWrapper)
|| !isParentTo(childWrapper, grandchildWrapper)) {
grandchild.getParent().removeChild(grandchild);
}
}
}
// add today elements is not yet there
if (currentTodayElements != null) {
for (E wrapper : currentTodayElements) {
addChild(wrapper);
}
}
// remove sub children without any children
for (AbstractAdapterBase child : getChildren()) {
if (child.getChildren().isEmpty()) {
removeChild(child);
}
}
} catch (final RemoteAccessException exp) {
BgcPlugin.openRemoteAccessErrorMessage(exp);
} catch (Exception e) {
logger.error("Error while getting " + getLabel(), e); //$NON-NLS-1$
}
}
protected abstract boolean isParentTo(ModelWrapper<?> parent,
ModelWrapper<?> child);
protected abstract List<E> getTodayElements() throws ApplicationException;
protected abstract void addChild(E child);
@Override
public List<AbstractAdapterBase> search(Class<?> searchedClass,
Integer objectId) {
return searchChildren(searchedClass, objectId);
}
public List<E> getCurrentTodayElements() {
return currentTodayElements;
}
@Override
public int compareTo(AbstractAdapterBase o) {
return 0;
}
}