Author: yurize
Date: Sun Jan 22 16:17:44 2012
New Revision: 1234538

URL: http://svn.apache.org/viewvc?rev=1234538&view=rev
Log:
Removes blip auto focus and adds blip navigation buttons to the wave view 
toolbar instead. https://reviews.apache.org/r/3577/

Modified:
    
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StageTwoProvider.java
    
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StagesProvider.java
    incubator/wave/trunk/src/org/waveprotocol/wave/client/StageThree.java
    incubator/wave/trunk/src/org/waveprotocol/wave/client/StageTwo.java
    
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/focus/FocusBlipSelector.java
    
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/toolbar/ViewToolbar.java

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StageTwoProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StageTwoProvider.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StageTwoProvider.java
 (original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StageTwoProvider.java
 Sun Jan 22 16:17:44 2012
@@ -25,13 +25,7 @@ import org.waveprotocol.wave.client.Stag
 import org.waveprotocol.wave.client.StageTwo;
 import org.waveprotocol.wave.client.account.ProfileManager;
 import org.waveprotocol.wave.client.common.util.AsyncHolder;
-import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusBlipSelector;
-import org.waveprotocol.wave.client.wavepanel.impl.focus.ViewTraverser;
-import org.waveprotocol.wave.client.wavepanel.impl.reader.Reader;
-import org.waveprotocol.wave.client.wavepanel.view.BlipView;
-import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider;
 import org.waveprotocol.wave.concurrencycontrol.channel.WaveViewService;
-import org.waveprotocol.wave.model.conversation.ConversationView;
 import org.waveprotocol.wave.model.id.IdGenerator;
 import org.waveprotocol.wave.model.schema.SchemaProvider;
 import org.waveprotocol.wave.model.schema.conversation.ConversationSchemas;
@@ -136,12 +130,9 @@ public class StageTwoProvider extends St
 
           // Install eager UI.
           installFeatures();
-          Reader reader = installReader();
 
           // Rendering, and therefore the whole stage is now ready.
           whenReady.use(StageTwoProvider.this);
-
-          selectAndFocusOnBlip(reader);
         }
       });
     }
@@ -167,20 +158,4 @@ public class StageTwoProvider extends St
   protected void fetchWave(final AsyncHolder.Accessor<WaveViewData> whenReady) 
{
     whenReady.use(WaveViewDataImpl.create(waveRef.getWaveId()));
   }
-
-  /**
-   * Finds the blip that should receive the focus and selects it.
-   */
-  private void selectAndFocusOnBlip(Reader reader) {
-    ModelAsViewProvider views = getModelAsViewProvider();
-    ConversationView wave = getConversations();
-    StageOne one = getStageOne();
-    FocusBlipSelector blipSelector =
-        FocusBlipSelector.create(waveRef, wave, views, reader, new 
ViewTraverser());
-    BlipView blipUi = blipSelector.select();
-    // Focus on the selected blip.
-    if (blipUi != null) {
-      one.getFocusFrame().focus(blipUi);
-    }
-  }
 }

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StagesProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StagesProvider.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StagesProvider.java
 (original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/webclient/client/StagesProvider.java
 Sun Jan 22 16:17:44 2012
@@ -31,6 +31,10 @@ import org.waveprotocol.wave.client.acco
 import org.waveprotocol.wave.client.common.util.AsyncHolder;
 import org.waveprotocol.wave.client.common.util.AsyncHolder.Accessor;
 import org.waveprotocol.wave.client.common.util.LogicalPanel;
+import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusBlipSelector;
+import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusFramePresenter;
+import org.waveprotocol.wave.client.wavepanel.impl.focus.ViewTraverser;
+import org.waveprotocol.wave.client.wavepanel.impl.reader.Reader;
 import org.waveprotocol.wave.client.wavepanel.view.BlipView;
 import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider;
 import org.waveprotocol.wave.client.wavepanel.view.dom.full.BlipQueueRenderer;
@@ -169,8 +173,12 @@ public class StagesProvider extends Stag
   }
 
   private void handleExistingWave(StageThree three) {
-    BlipQueueRenderer blipQueue = two.getBlipQueue();
-    blipQueue.flush();
+    if (waveRef.hasDocumentId()) {
+      BlipQueueRenderer blipQueue = two.getBlipQueue();
+      blipQueue.flush();
+      selectAndFocusOnBlip(two.getReader(), two.getModelAsViewProvider(), 
two.getConversations(),
+          one.getFocusFrame(), waveRef);
+    }
   }
 
   public void destroy() {
@@ -194,6 +202,20 @@ public class StagesProvider extends Stag
   }
 
   /**
+   * Finds the blip that should receive the focus and selects it.
+   */
+  private static void selectAndFocusOnBlip(Reader reader, ModelAsViewProvider 
views,
+      ConversationView wave, FocusFramePresenter focusFrame, WaveRef waveRef) {
+    FocusBlipSelector blipSelector =
+        FocusBlipSelector.create(wave, views, reader, new ViewTraverser());
+    BlipView blipUi = blipSelector.selectBlipByWaveRef(waveRef);
+    // Focus on the selected blip.
+    if (blipUi != null) {
+      focusFrame.focus(blipUi);
+    }
+  }
+
+  /**
    * @return a halting provider if this stage is closed. Otherwise, returns the
    *         given provider.
    */

Modified: incubator/wave/trunk/src/org/waveprotocol/wave/client/StageThree.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/client/StageThree.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/wave/client/StageThree.java 
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/wave/client/StageThree.java Sun 
Jan 22 16:17:44 2012
@@ -43,6 +43,7 @@ import org.waveprotocol.wave.client.wave
 import org.waveprotocol.wave.client.wavepanel.view.dom.full.BlipQueueRenderer;
 import org.waveprotocol.wave.client.widget.popup.PopupChromeFactory;
 import org.waveprotocol.wave.client.widget.popup.PopupFactory;
+import org.waveprotocol.wave.model.conversation.ConversationView;
 import org.waveprotocol.wave.model.wave.ParticipantId;
 
 /**
@@ -163,7 +164,10 @@ public interface StageThree {
     }
 
     protected ViewToolbar createViewToolbar() {
-      return ViewToolbar.create();
+      ModelAsViewProvider views = stageTwo.getModelAsViewProvider();
+      ConversationView wave = stageTwo.getConversations();
+      return ViewToolbar.create(stageTwo.getStageOne().getFocusFrame(), views, 
wave,
+          stageTwo.getReader());
     }
 
     protected String getLocalDomain() {

Modified: incubator/wave/trunk/src/org/waveprotocol/wave/client/StageTwo.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/client/StageTwo.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/wave/client/StageTwo.java 
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/wave/client/StageTwo.java Sun Jan 
22 16:17:44 2012
@@ -184,6 +184,9 @@ public interface StageTwo {
   /** @return stage one. */
   StageOne getStageOne();
 
+  /** @return Reader. */
+  Reader getReader();
+
   /**
    * Default implementation of the stage two configuration. Each component is
    * defined by a factory method, any of which may be overridden in order to
@@ -232,6 +235,7 @@ public interface StageTwo {
     private BlipQueueRenderer queueRenderer;
     private ModelAsViewProvider modelAsView;
     private DiffController diffController;
+    private Reader reader;
 
     public DefaultProvider(StageOne stageOne) {
       this.stageOne = stageOne;
@@ -381,6 +385,11 @@ public interface StageTwo {
       return diffController == null ? diffController = createDiffController() 
: diffController;
     }
 
+    @Override
+    public final Reader getReader() {
+      return reader;
+    }
+
     /** @return the id mangler for model objects. Subclasses may override. */
     protected ModelIdMapper createModelIdMapper() {
       return ModelIdMapperImpl.create(getConversations(), "UC");
@@ -690,7 +699,6 @@ public interface StageTwo {
 
       // Install eager UI features
       installFeatures();
-      installReader();
 
       // Activate liveness.
       getConnector().connect(null);
@@ -712,13 +720,8 @@ public interface StageTwo {
      */
     protected void installFeatures() {
       // Eagerly install some features.
-    }
-
-    protected Reader installReader() {
-      Reader reader =
-          Reader.install(getSupplement(), stageOne.getFocusFrame(), 
getModelAsViewProvider(),
+      reader = Reader.install(getSupplement(), stageOne.getFocusFrame(), 
getModelAsViewProvider(),
           getDocumentRegistry());
-      return reader;
     }
   }
 }

Modified: 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/focus/FocusBlipSelector.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/focus/FocusBlipSelector.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/focus/FocusBlipSelector.java
 (original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/focus/FocusBlipSelector.java
 Sun Jan 22 16:17:44 2012
@@ -16,7 +16,6 @@
  */
 package org.waveprotocol.wave.client.wavepanel.impl.focus;
 
-import 
org.waveprotocol.wave.client.wavepanel.impl.focus.FocusFramePresenter.FocusOrder;
 import org.waveprotocol.wave.client.wavepanel.impl.reader.Reader;
 import org.waveprotocol.wave.client.wavepanel.view.BlipView;
 import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider;
@@ -37,9 +36,6 @@ import java.util.Map;
  */
 public class FocusBlipSelector {
 
-  /** The reference to the current wave. */
-  private final WaveRef waveRef;
-
   /** The conversation. */
   private final ConversationView wave;
 
@@ -49,51 +45,81 @@ public class FocusBlipSelector {
   /** The blip ordering. */
   private final  ViewTraverser traverser;
 
-  /** The ordering for focus frame movement. */
-  private final Reader reader;
+  /** The root blip. */
+  private BlipView rootBlip;
 
   /**
    * Creates a {@link FocusBlipSelector}.
    *
-   * @param waveRef the reference to the current wave that includes the blip id
-   *        in case the wave was loaded due to a click on a link to this wave.
    * @param wave the he conversation.
    * @param views the model with views.
    * @param traverser the blip ordering.
    * @param reader the ordering of focus frame movement.
    * @return the focus blip selector.
    */
-  public static FocusBlipSelector create(WaveRef waveRef, ConversationView 
wave,
+  public static FocusBlipSelector create(ConversationView wave,
       ModelAsViewProvider views, Reader reader, ViewTraverser traverser) {
-    return new FocusBlipSelector(waveRef, wave, views, reader, traverser);
+    return new FocusBlipSelector(wave, views, reader, traverser);
   }
 
-  FocusBlipSelector(WaveRef waveRef, ConversationView wave,
+  FocusBlipSelector(ConversationView wave,
       ModelAsViewProvider models, Reader reader, ViewTraverser traverser) {
-    this.waveRef = waveRef;
     this.wave = wave;
     this.views = models;
-    this.reader = reader;
     this.traverser = traverser;
   }
 
   /**
-   * @return the blip that should receive the focus or {@code null} if it was
-   *         impossible to compute it. The strategy for blip selection is like
-   *         follows:
-   *         <ul>
-   *         <li>Try to select the oldest unread blip using {@link 
FocusOrder}.</li>
-   *         <li>If all blips are already read, then select the most recently
-   *         modified blip.</li>
-   *         </ul>
+   * @return the most recently modified blip.
+   */
+  public BlipView selectMostRecentlyModified() {
+    Conversation conversation  = wave.getRoot();
+    if (conversation == null) {
+      return null;
+    } else {
+      ConversationBlip blip = wave.getRoot().getRootThread().getFirstBlip();
+      BlipView rootBlipUi = views.getBlipView(blip);
+      if (rootBlipUi == null) {
+        return null;
+      }
+      return findMostRecentlyModified(rootBlipUi);
+    }
+  }
+
+  /**
+   * @return the root blip of the currently displayed wave.
+   */
+  public BlipView getOrFindRootBlip() {
+    if (rootBlip == null) {
+      Conversation conversation  = wave.getRoot();
+      if (conversation == null) {
+        return null;
+      } else {
+        ConversationBlip blip = wave.getRoot().getRootThread().getFirstBlip();
+        BlipView rootBlipUi = views.getBlipView(blip);
+        if (rootBlipUi == null) {
+          return null;
+        }
+        rootBlip =  rootBlipUi;
+      }
+    }
+    return rootBlip;
+  }
+
+  /**
+   * Locates and returns the UI blip view by waveRef.
+   *
+   * @param waveRef the reference to the current wave that includes the blip 
id.
    */
-  public BlipView select() {
+  public BlipView selectBlipByWaveRef(WaveRef waveRef) {
     // Determine if waveRef has a documentId in it - if so, the referenced blip
     // should receive the focus on wave load.
     // First find conversation
     Conversation conversation;
-    if (waveRef.hasWaveletId()) {
+    String documentId = null;
+    if (waveRef != null && waveRef.hasWaveletId()) {
       String id = 
ModernIdSerialiser.INSTANCE.serialiseWaveletId(waveRef.getWaveletId());
+      documentId = waveRef.getDocumentId();
       conversation = wave.getConversation(id);
     } else {
       // Unspecified wavelet means root.
@@ -104,38 +130,14 @@ public class FocusBlipSelector {
     } else {
       ConversationBlip blip = null;
       // If there's blip reference then focus on that blip.
-      String documentId = waveRef.getDocumentId();
       // Find selected blip.
       if (documentId != null) {
         blip = wave.getRoot().getBlip(documentId);
         if (blip != null) {
           return views.getBlipView(blip);
-        } else {
-          return null;
-        }
-      } else {
-        blip = wave.getRoot().getRootThread().getFirstBlip();
-        BlipView rootBlipUi = views.getBlipView(blip);
-        if (rootBlipUi == null) {
-          return null;
-        }
-        if (reader != null) {
-          if (!reader.isRead(rootBlipUi)) {
-            // Return the root blip since it is unread.
-            return rootBlipUi;
-          }
-          // If no blip was referenced, then try to find the next blip starting
-          // from the root according to the order.
-          BlipView tempUi = reader.getNext(rootBlipUi);
-          if (tempUi != null && !tempUi.getId().equals(rootBlipUi.getId())) {
-            return tempUi;
-          } else {
-            return findMostRecentlyModified(rootBlipUi);
-          }
-        } else {
-          return findMostRecentlyModified(rootBlipUi);
         }
       }
+      return null;
     }
   }
 

Modified: 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/toolbar/ViewToolbar.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/toolbar/ViewToolbar.java?rev=1234538&r1=1234537&r2=1234538&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/toolbar/ViewToolbar.java
 (original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/wave/client/wavepanel/impl/toolbar/ViewToolbar.java
 Sun Jan 22 16:17:44 2012
@@ -17,9 +17,17 @@
 
 package org.waveprotocol.wave.client.wavepanel.impl.toolbar;
 
+import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusBlipSelector;
+import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusFramePresenter;
+import org.waveprotocol.wave.client.wavepanel.impl.focus.ViewTraverser;
+import org.waveprotocol.wave.client.wavepanel.impl.reader.Reader;
+import org.waveprotocol.wave.client.wavepanel.view.BlipView;
+import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider;
 import org.waveprotocol.wave.client.widget.toolbar.ToolbarButtonViewBuilder;
+import org.waveprotocol.wave.client.widget.toolbar.ToolbarView;
 import org.waveprotocol.wave.client.widget.toolbar.ToplevelToolbarWidget;
 import org.waveprotocol.wave.client.widget.toolbar.buttons.ToolbarClickButton;
+import org.waveprotocol.wave.model.conversation.ConversationView;
 
 /**
  * Attaches actions that can be performed in a Wave's "view mode" to a toolbar.
@@ -29,16 +37,68 @@ import org.waveprotocol.wave.client.widg
 public final class ViewToolbar {
 
   private final ToplevelToolbarWidget toolbarUi;
+  private final FocusFramePresenter focusFrame;
+  private final FocusBlipSelector blipSelector;
+  private final Reader reader;
 
-  private ViewToolbar(ToplevelToolbarWidget toolbarUi) {
+  private ViewToolbar(ToplevelToolbarWidget toolbarUi, FocusFramePresenter 
focusFrame,
+      ModelAsViewProvider views, ConversationView wave, Reader reader) {
     this.toolbarUi = toolbarUi;
+    this.focusFrame = focusFrame;
+    this.reader = reader;
+    blipSelector = FocusBlipSelector.create(wave, views, reader, new 
ViewTraverser());
   }
 
-  public static ViewToolbar create() {
-    return new ViewToolbar(new ToplevelToolbarWidget());
+  public static ViewToolbar create(FocusFramePresenter focus,  
ModelAsViewProvider views,
+  ConversationView wave, Reader reader) {
+    return new ViewToolbar(new ToplevelToolbarWidget(), focus, views, wave, 
reader);
   }
 
   public void init() {
+    ToolbarView group = toolbarUi.addGroup();
+
+    new ToolbarButtonViewBuilder().setText("Recent").applyTo(
+        group.addClickButton(), new ToolbarClickButton.Listener() {
+          @Override
+          public void onClicked() {
+            focusFrame.focus(blipSelector.selectMostRecentlyModified());
+          }
+        });
+
+    new ToolbarButtonViewBuilder().setText("Next Unread").applyTo(
+        group.addClickButton(), new ToolbarClickButton.Listener() {
+          @Override
+          public void onClicked() {
+            BlipView focusedBlip = focusFrame.getFocusedBlip();
+            if (focusedBlip == null) {
+              focusedBlip = blipSelector.getOrFindRootBlip();
+              boolean isRead = reader.isRead(focusedBlip);
+              focusFrame.focus(focusedBlip);
+              if (isRead) {
+                focusFrame.focusNext();
+              }
+            } else {
+              focusFrame.focusNext();
+            }
+          }
+        });
+    new ToolbarButtonViewBuilder().setText("Next").applyTo(
+        group.addClickButton(), new ToolbarClickButton.Listener() {
+          @Override
+          public void onClicked() {
+            focusFrame.moveDown();
+          }
+        });
+    new ToolbarButtonViewBuilder().setText("Previous").applyTo(
+        group.addClickButton(), new ToolbarClickButton.Listener() {
+          @Override
+          public void onClicked() {
+            focusFrame.moveUp();
+          }
+        });
+    // Fake group
+    group = toolbarUi.addGroup();
+    new ToolbarButtonViewBuilder().setText("").applyTo(group.addClickButton(), 
null);
   }
 
   /**


Reply via email to