package org.ovirt.engine.ui.uicommonweb.models; import java.util.List; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostInterfaceListModel; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; /** * @param <E> {@link org.ovirt.engine.ui.uicommonweb.models.SearchableListModel.E} * @param <D> type of the detail entity * @param <T> {@link org.ovirt.engine.ui.uicommonweb.models.SearchableListModel.T} */ @SuppressWarnings("unused") public abstract class ListWithDetailsModel<E, D, T> extends SearchableListModel<E, T> { private List<HasEntity<D>> detailModels; public List<HasEntity<D>> getDetailModels() { return detailModels; } public void setDetailModels(List<HasEntity<D>> value) { if (detailModels != value) { detailModels = value; onPropertyChanged(new PropertyChangedEventArgs("DetailModels")); //$NON-NLS-1$ } } private HasEntity<D> activeDetailModel; public HasEntity<D> getActiveDetailModel() { return activeDetailModel; } public void setActiveDetailModel(HasEntity<D> value) { if (activeDetailModel != value) { activeDetailModelChanging(value, getActiveDetailModel()); activeDetailModel = value; activeDetailModelChanged(); onPropertyChanged(new PropertyChangedEventArgs("ActiveDetailModel")); //$NON-NLS-1$ } } protected void updateDetailsAvailability() { } private void activeDetailModelChanging(HasEntity<D> newValue, HasEntity<D> oldValue) { // Make sure we had set an entity property of details model. if (oldValue != null) { oldValue.setEntity(null); if (oldValue instanceof SearchableListModel) { ((SearchableListModel) oldValue).stopRefresh(); } } if (newValue != null) { newValue.setEntity(provideDetailModelEntity(getSelectedItem())); } } protected abstract D provideDetailModelEntity(T selectedItem); @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); if (getSelectedItem() != null) { // Try to choose default (first) detail model. updateDetailsAvailability(); if (getDetailModels() != null) { if ((getActiveDetailModel() != null && !getActiveDetailModel().getIsAvailable()) || getActiveDetailModel() == null) { // ActiveDetailModel = DetailModels.FirstOrDefault(AvailabilityDecorator.GetIsAvailable); HasEntity<D> model = null; for (HasEntity<D> item : getDetailModels()) { if (item.getIsAvailable()) { model = item; break; } } setActiveDetailModel(model); } } // if (DetailModels != null && ActiveDetailModel == null) // { // ActiveDetailModel = DetailModels.FirstOrDefault(); // } } else { // If selected item become null, make sure we stop all activity on an active detail model. if (getActiveDetailModel() != null && getActiveDetailModel() instanceof SearchableListModel) { ((SearchableListModel) getActiveDetailModel()).stopRefresh(); } } // Synchronize selected item with the entity of an active details model. HasEntity<D> activeDetailModel = getActiveDetailModel(); if (getSelectedItem() != null && activeDetailModel != null) { if (activeDetailModel instanceof HostInterfaceListModel) { ((HostInterfaceListModel) activeDetailModel).setEntity((VDS) provideDetailModelEntity(getSelectedItem())); } else { activeDetailModel.setEntity(provideDetailModelEntity(getSelectedItem())); } } } protected void activeDetailModelChanged() { } @Override public void stopRefresh() { super.stopRefresh(); if (getDetailModels() != null) { // Stop search on all list models. for (HasEntity<D> model : getDetailModels()) { if (model instanceof SearchableListModel) { SearchableListModel listModel = (SearchableListModel) model; listModel.stopRefresh(); } } } } }