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);
}
/**