package org.ovirt.engine.ui.webadmin.widget.bookmark; import org.ovirt.engine.core.common.businessentities.Bookmark; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.widget.action.AbstractActionStackPanelItem; import org.ovirt.engine.ui.common.widget.action.SimpleActionPanel; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.gin.ClientGinjectorProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.BookmarkModelProvider; import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.Range; import com.google.gwt.view.client.SingleSelectionModel; public class BookmarkList extends AbstractActionStackPanelItem<BookmarkModelProvider, Bookmark, CellList<Bookmark>> { interface WidgetUiBinder extends UiBinder<Widget, BookmarkList> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } interface WidgetIdHandler extends ElementIdHandler<BookmarkList> { WidgetIdHandler idHandler = GWT.create(WidgetIdHandler.class); } @UiField ScrollPanel scrollPanel; private static final ApplicationConstants constants = AssetProvider.getConstants(); public BookmarkList(BookmarkModelProvider modelProvider) { super(modelProvider); initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); WidgetIdHandler.idHandler.generateAndSetIds(this); addActionButtons(modelProvider); addScrollEventHandler(scrollPanel); setProperVisibleRange(); } @Override protected CellList<Bookmark> createDataDisplayWidget(BookmarkModelProvider modelProvider) { final CellList<Bookmark> display = new CellList<>(new BookmarkListItemCell()); display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); display.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE); // TODO-GWT work around GWT issue with KeyboardSelectionPolicy.BOUND_TO_SELECTION // Using KeyboardSelectionPolicy.ENABLED instead and handling the input ourselves. // See https://github.com/gwtproject/gwt/issues/6309 for details. display.addDomHandler(event -> { SingleSelectionModel<Bookmark> selectionModel = (SingleSelectionModel<Bookmark>) display.getSelectionModel(); if (selectionModel.getSelectedObject() != null) { Bookmark item = null; int index = display.getVisibleItems().indexOf(selectionModel.getSelectedObject()); int key = event.getNativeEvent().getKeyCode(); if (key == KeyCodes.KEY_UP) { item = display.getVisibleItems().get(index - 1); } else if (key == KeyCodes.KEY_DOWN) { item = display.getVisibleItems().get(index + 1); } if (item != null) { selectionModel.setSelected(item, true); event.stopPropagation(); event.preventDefault(); } } }, KeyDownEvent.getType()); display.sinkEvents(Event.ONKEYDOWN); modelProvider.addDataDisplay(display); return display; } @Override protected SimpleActionPanel<Bookmark> createActionPanel(BookmarkModelProvider modelProvider) { return new SimpleActionPanel<>(modelProvider, modelProvider.getSelectionModel(), ClientGinjectorProvider.getEventBus()); } private void addActionButtons(final BookmarkModelProvider modelProvider) { actionPanel.addActionButton(new WebAdminButtonDefinition<Bookmark>(constants.newBookmark()) { @Override protected UICommand resolveCommand() { return modelProvider.getModel().getNewCommand(); } }); actionPanel.addActionButton(new WebAdminButtonDefinition<Bookmark>(constants.editBookmark()) { @Override protected UICommand resolveCommand() { return modelProvider.getModel().getEditCommand(); } }); actionPanel.addActionButton(new WebAdminButtonDefinition<Bookmark>(constants.removeBookmark()) { @Override protected UICommand resolveCommand() { return modelProvider.getModel().getRemoveCommand(); } }); } void addScrollEventHandler(final ScrollPanel scrollPanel) { scrollPanel.addScrollHandler(event -> { if (scrollPanel.getVerticalScrollPosition() >= scrollPanel.getMaximumVerticalScrollPosition()) { setProperVisibleRange(); } }); } private void setProperVisibleRange() { // Extend the visible range of data display widget Range visibleRange = getDataDisplayWidget().getVisibleRange(); getDataDisplayWidget().setVisibleRange( visibleRange.getStart(), visibleRange.getLength() + getDataDisplayWidget().getPageSize()); } }