Greg Padgett has uploaded a new change for review. Change subject: webadmin: improve behavior of bookmark list ......................................................................
webadmin: improve behavior of bookmark list This fixes some problems with the behavior of the bookmark list: - re-selection of already-selected bookmarks was not working (gwt issue 6310) - bookmarks would stay selected after navigating elsewhere in the UI - a selected bookmark would be de-selected when the list was updated The list now behaves as expected, with selections remaining active until navigation or a search is performed, and once de-selected, a bookmark can again be selected to return to the same place in the UI. Change-Id: I21e0f807f5855f17d3549468a6ccf182156f12bb Bug-Url: https://bugzilla.redhat.com/880499 Signed-off-by: Greg Padgett <gpadg...@redhat.com> --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/bookmarks/BookmarkListModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/BookmarkModelProvider.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/bookmark/BookmarkList.java 3 files changed, 84 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/81/10781/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/bookmarks/BookmarkListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/bookmarks/BookmarkListModel.java index 450344a..bdf50ab 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/bookmarks/BookmarkListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/bookmarks/BookmarkListModel.java @@ -96,6 +96,18 @@ privateRemoveCommand = value; } + private boolean privateIsBookmarkInitiated; + + public boolean getIsBookmarkInitiated() + { + return privateIsBookmarkInitiated; + } + + private void setIsBookmarkInitiated(boolean value) + { + privateIsBookmarkInitiated = value; + } + static { NavigatedEventDefinition = new EventDefinition("Navigated", BookmarkListModel.class); //$NON-NLS-1$ @@ -109,7 +121,9 @@ setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ + setIsBookmarkInitiated(true); getSearchCommand().Execute(); + setIsBookmarkInitiated(false); setIsTimerDisabled(true); @@ -129,8 +143,14 @@ { SearchableListModel bookmarkListModel = (BookmarkListModel) model; List<Bookmark> resultList = (List<Bookmark>) ((VdcQueryReturnValue) ReturnValue).getReturnValue(); - Collections.sort(resultList, COMPARATOR); + if (resultList != null) { + Collections.sort(resultList, COMPARATOR); + } + + // Prevent bookmark list updates from clearing selected bookmark + setIsBookmarkInitiated(true); bookmarkListModel.setItems(resultList); + setIsBookmarkInitiated(false); } }; @@ -307,10 +327,13 @@ super.OnSelectedItemChanged(); UpdateActionAvailability(); - if (getSelectedItem() != null) + if (getSelectedItem() != null && !getIsBookmarkInitiated()) { + // Don't fire navigation events in response to the bookmark list updating itself + setIsBookmarkInitiated(true); getNavigatedEvent().raise(this, new BookmarkEventArgs((org.ovirt.engine.core.common.businessentities.Bookmark) getSelectedItem())); + setIsBookmarkInitiated(false); } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/BookmarkModelProvider.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/BookmarkModelProvider.java index 5dd245e..fc66bd4 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/BookmarkModelProvider.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/BookmarkModelProvider.java @@ -8,6 +8,7 @@ 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.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget; import org.ovirt.engine.ui.common.presenter.popup.RemoveConfirmationPopupPresenterWidget; import org.ovirt.engine.ui.common.uicommon.model.DataBoundTabModelProvider; @@ -82,10 +83,31 @@ } } }); + + // Clear selection when a new tab is selected + getCommonModel().getSelectedItemChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + if (getCommonModel().getSelectedItem() != null) { + clearSelection(); + } + } + }); + + // Clear selection when the search string is updated + getCommonModel().getPropertyChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + if ("SearchString".equals(((PropertyChangedEventArgs) args).PropertyName)) { //$NON-NLS-1$ + clearSelection(); + } + } + }); + } void clearSelection() { - if (selectionModel.getSelectedObject() != null) { + if (selectionModel.getSelectedObject() != null && !getModel().getIsBookmarkInitiated()) { selectionModel.setSelected(selectionModel.getSelectedObject(), false); } } @@ -93,9 +115,6 @@ @Override protected void updateDataProvider(List<Bookmark> items) { super.updateDataProvider(items); - - // Clear selection when updating data - clearSelection(); } @Override diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/bookmark/BookmarkList.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/bookmark/BookmarkList.java index c433a79..5dffd73 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/bookmark/BookmarkList.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/bookmark/BookmarkList.java @@ -12,6 +12,9 @@ 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.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.ScrollEvent; import com.google.gwt.event.dom.client.ScrollHandler; import com.google.gwt.uibinder.client.UiBinder; @@ -19,9 +22,11 @@ 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>> { @@ -51,10 +56,39 @@ protected CellList<Bookmark> createDataDisplayWidget(BookmarkModelProvider modelProvider) { ApplicationTemplates templates = ClientGinjectorProvider.instance().getApplicationTemplates(); - CellList<Bookmark> display = new CellList<Bookmark>(new BookmarkListItemCell(templates)); - display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION); + final CellList<Bookmark> display = new CellList<Bookmark>(new BookmarkListItemCell(templates)); + + display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); display.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE); + // Using KeyboardSelectionPolicy.BOUND_TO_SELECTION is preferable, but broken (see + // gwt issue 6310). Instead, use ENABLED and handle the keyboard input ourselves. + display.addDomHandler(new KeyDownHandler() { + @Override + @SuppressWarnings("unchecked") + public void onKeyDown(KeyDownEvent 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; -- To view, visit http://gerrit.ovirt.org/10781 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I21e0f807f5855f17d3549468a6ccf182156f12bb Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Greg Padgett <gpadg...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches