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

Reply via email to