package org.ovirt.engine.ui.webadmin.uicommon.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.bookmarks;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.models.bookmarks.BookmarkListModel;
import org.ovirt.engine.ui.webadmin.gin.ClientGinjector;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.AbstractModelBoundPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.RemoveConfirmationPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.bookmark.BookmarkPopupPresenterWidget;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class BookmarkModelProvider extends DataBoundTabModelProvider<bookmarks, BookmarkListModel> {
private final SingleSelectionModel<bookmarks> selectionModel;
private final Provider<BookmarkPopupPresenterWidget> popupProvider;
private final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider;
private final SystemTreeModelProvider treeModelProvider;
private final TagModelProvider tagModelProvider;
@Inject
public BookmarkModelProvider(ClientGinjector ginjector,
SystemTreeModelProvider treeModelProvider, TagModelProvider tagModelProvider) {
super(ginjector);
this.popupProvider = ginjector.getBookmarkPopupPresenterWidgetProvider();
this.removeConfirmPopupProvider = ginjector.getRemoveConfirmPopupProvider();
this.treeModelProvider = treeModelProvider;
this.tagModelProvider = tagModelProvider;
// Create selection model
selectionModel = new SingleSelectionModel<bookmarks>();
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
List<bookmarks> selectedItems = selectionModel.getSelectedObject() != null
? new ArrayList<bookmarks>(Arrays.asList(selectionModel.getSelectedObject()))
: new ArrayList<bookmarks>();
BookmarkModelProvider.this.setSelectedItems(selectedItems);
}
});
}
@Override
protected void onCommonModelChange() {
super.onCommonModelChange();
// Clear selection when a system tree node is selected
treeModelProvider.getModel().getSelectedItemChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
if (treeModelProvider.getModel().getSelectedItem() != null) {
clearSelection();
}
}
});
// Clear selection when a tag tree node is pinned
tagModelProvider.getModel().getSelectedItemsChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
if (tagModelProvider.getModel().getSelectedItems() != null
&& !tagModelProvider.getModel().getSelectedItems().isEmpty()) {
clearSelection();
}
}
});
}
void clearSelection() {
if (selectionModel.getSelectedObject() != null) {
selectionModel.setSelected(selectionModel.getSelectedObject(), false);
}
}
@Override
protected void updateDataProvider(List<bookmarks> items) {
super.updateDataProvider(items);
// Clear selection when updating data
clearSelection();
}
@Override
public BookmarkListModel getModel() {
return getCommonModel().getBookmarkList();
}
@Override
public void setSelectedItems(List<bookmarks> items) {
getModel().setSelectedItem(items.size() > 0 ? items.get(0) : null);
getModel().setSelectedItems(items);
}
public SingleSelectionModel<bookmarks> getSelectionModel() {
return selectionModel;
}
@Override
public void addDataDisplay(HasData<bookmarks> display) {
super.addDataDisplay(display);
display.setSelectionModel(selectionModel);
}
@Override
protected AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(UICommand lastExecutedCommand) {
if (lastExecutedCommand == getModel().getNewCommand()
|| lastExecutedCommand == getModel().getEditCommand()) {
return popupProvider.get();
} else {
return super.getModelPopup(lastExecutedCommand);
}
}
@Override
protected AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(UICommand lastExecutedCommand) {
if (lastExecutedCommand == getModel().getRemoveCommand()) {
return removeConfirmPopupProvider.get();
} else {
return super.getConfirmModelPopup(lastExecutedCommand);
}
}
}