Repository: incubator-wave Updated Branches: refs/heads/master 803697606 -> c2784ad28
Adds support to Robot API and client for form buttons. https://reviews.apache.org/r/25034/ Project: http://git-wip-us.apache.org/repos/asf/incubator-wave/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-wave/commit/4499ce56 Tree: http://git-wip-us.apache.org/repos/asf/incubator-wave/tree/4499ce56 Diff: http://git-wip-us.apache.org/repos/asf/incubator-wave/diff/4499ce56 Branch: refs/heads/master Commit: 4499ce56fbc512cdae68cac323aadde9cc57ab21 Parents: 8036976 Author: Antonio Tenorio-Fornés <[email protected]> Authored: Sun Apr 12 22:34:07 2015 +0300 Committer: Yuri Zelikov <[email protected]> Committed: Sun Apr 12 22:35:02 2015 +0300 ---------------------------------------------------------------------- .../operations/DocumentModifyService.java | 4 +++ .../server/robots/passive/EventGenerator.java | 18 ++++++++++ .../wave/client/doodad/form/button/Button.java | 35 ++++++++++++++++++++ .../wave/client/editor/Editors.java | 3 ++ 4 files changed, 60 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/4499ce56/src/org/waveprotocol/box/server/robots/operations/DocumentModifyService.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/robots/operations/DocumentModifyService.java b/src/org/waveprotocol/box/server/robots/operations/DocumentModifyService.java index 2a501c9..166c360 100644 --- a/src/org/waveprotocol/box/server/robots/operations/DocumentModifyService.java +++ b/src/org/waveprotocol/box/server/robots/operations/DocumentModifyService.java @@ -29,6 +29,7 @@ import com.google.wave.api.OperationRequest; import com.google.wave.api.Range; import com.google.wave.api.data.ApiView; import com.google.wave.api.data.DocumentHitIterator; +import com.google.wave.api.data.ElementSerializer; import com.google.wave.api.impl.DocumentModifyAction; import com.google.wave.api.impl.DocumentModifyAction.BundledAnnotation; import com.google.wave.api.impl.DocumentModifyAction.ModifyHow; @@ -418,6 +419,9 @@ public class DocumentModifyService implements OperationService { // TODO (Yuri Z.) Make it possible to specify a location to insert the // gadget and implement insertion at the specified location. LineContainers.appendLine(doc, xml); + } else if (element.isFormElement()) { + XmlStringBuilder xml = ElementSerializer.apiElementToXml(element); + LineContainers.appendLine(doc, xml); } else { // TODO(ljvderijk): Inserting other elements. throw new UnsupportedOperationException( http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/4499ce56/src/org/waveprotocol/box/server/robots/passive/EventGenerator.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/robots/passive/EventGenerator.java b/src/org/waveprotocol/box/server/robots/passive/EventGenerator.java index be70f0b..206a33b 100644 --- a/src/org/waveprotocol/box/server/robots/passive/EventGenerator.java +++ b/src/org/waveprotocol/box/server/robots/passive/EventGenerator.java @@ -30,6 +30,7 @@ import com.google.wave.api.event.AnnotatedTextChangedEvent; import com.google.wave.api.event.DocumentChangedEvent; import com.google.wave.api.event.Event; import com.google.wave.api.event.EventType; +import com.google.wave.api.event.FormButtonClickedEvent; import com.google.wave.api.event.WaveletBlipCreatedEvent; import com.google.wave.api.event.WaveletBlipRemovedEvent; import com.google.wave.api.event.WaveletParticipantsChangedEvent; @@ -54,6 +55,8 @@ import org.waveprotocol.wave.model.document.Doc.N; import org.waveprotocol.wave.model.document.Doc.T; import org.waveprotocol.wave.model.document.indexed.DocumentEvent; import org.waveprotocol.wave.model.document.indexed.DocumentEvent.AnnotationChanged; +import org.waveprotocol.wave.model.document.indexed.DocumentEvent.ContentInserted; +import org.waveprotocol.wave.model.document.raw.impl.Element; import org.waveprotocol.wave.model.operation.OperationException; import org.waveprotocol.wave.model.operation.SilentOperationSink; import org.waveprotocol.wave.model.operation.wave.BasicWaveletOperationContextFactory; @@ -280,6 +283,21 @@ public class EventGenerator { addEvent(apiEvent, capabilities, blip.getId(), messages); } } else { + if (capabilities.containsKey(EventType.FORM_BUTTON_CLICKED)) { + if (eventComponent.getType() == DocumentEvent.Type.CONTENT_INSERTED) { + ContentInserted<N, E, T> contentInserted = (ContentInserted<N, E, T>) eventComponent; + Element elementInserted = ((Element) contentInserted.getSubtreeElement()); + if (elementInserted.getTagName().equals("click")) { + FormButtonClickedEvent buttonClickedEvent = + new FormButtonClickedEvent(null, null, + elementInserted.getAttribute("clicker"), Long.decode(elementInserted + .getAttribute("time")), blip.getId(), elementInserted + .getParentElement().getAttribute("name")); + addEvent(buttonClickedEvent, capabilities, blip.getId(), messages); + } + } + + } else if (capabilities.containsKey(EventType.DOCUMENT_CHANGED) && !documentChangedEventGenerated) { DocumentChangedEvent apiEvent = new DocumentChangedEvent( http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/4499ce56/src/org/waveprotocol/wave/client/doodad/form/button/Button.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/wave/client/doodad/form/button/Button.java b/src/org/waveprotocol/wave/client/doodad/form/button/Button.java index 7831cd9..e26216c 100644 --- a/src/org/waveprotocol/wave/client/doodad/form/button/Button.java +++ b/src/org/waveprotocol/wave/client/doodad/form/button/Button.java @@ -19,6 +19,12 @@ package org.waveprotocol.wave.client.doodad.form.button; +import com.google.gwt.user.client.Event; + +import org.waveprotocol.box.webclient.client.Session; +import org.waveprotocol.wave.client.common.util.DomHelper; +import org.waveprotocol.wave.client.common.util.DomHelper.HandlerReference; +import org.waveprotocol.wave.client.common.util.DomHelper.JavaScriptEventListener; import org.waveprotocol.wave.client.doodad.form.events.ContentEvents; import org.waveprotocol.wave.client.editor.ElementHandlerRegistry; import org.waveprotocol.wave.client.editor.NodeEventHandler; @@ -32,10 +38,14 @@ import org.waveprotocol.wave.client.widget.button.ClickButton; import org.waveprotocol.wave.model.document.util.Property; import org.waveprotocol.wave.model.document.util.XmlStringBuilder; +import java.util.HashMap; + public final class Button { private static final String TAGNAME = "button"; static final Property<ClickButton> BUTTON_LOGIC_PROP = Property.immutable("button_logic"); + private static final Property<HandlerReference> HANDLE = Property.mutable("handle"); + private static final ButtonRenderingMutationHandler RENDERING_MUTATION_HANDLER = new ButtonRenderingMutationHandler(); @@ -55,6 +65,31 @@ public final class Button { return false; } } + + @Override + public void onActivated(final ContentElement element) { + element.setProperty(HANDLE, DomHelper.registerEventHandler(element.getImplNodelet(), "click", + new JavaScriptEventListener() { + @Override + public void onJavaScriptEvent(String name, Event event) { + ContentNode ev = element.getFirstChild(); + while (ev.getNextSibling() != null && ev.asElement().getName() != "events") { + ev = ev.getNextSibling(); + } + HashMap<String, String> attr = new HashMap<String, String>(); + attr.put("time", Long.toString(System.currentTimeMillis())); + attr.put("clicker", Session.get().getAddress()); + ev.getMutableDoc().createChildElement(ev.asElement(), "click", attr); + } + + })); + } + + @Override + public void onDeactivated(ContentElement element) { + // Clean up + element.getProperty(HANDLE).unregister(); + } }; http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/4499ce56/src/org/waveprotocol/wave/client/editor/Editors.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/wave/client/editor/Editors.java b/src/org/waveprotocol/wave/client/editor/Editors.java index 0ff2538..0f235ae 100644 --- a/src/org/waveprotocol/wave/client/editor/Editors.java +++ b/src/org/waveprotocol/wave/client/editor/Editors.java @@ -26,6 +26,7 @@ import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import org.waveprotocol.wave.client.common.util.UserAgent; +import org.waveprotocol.wave.client.doodad.form.FormDoodads; import org.waveprotocol.wave.client.editor.content.ContentDocElement; import org.waveprotocol.wave.client.editor.content.ContentDocument; import org.waveprotocol.wave.client.editor.content.img.ImgDoodad; @@ -111,6 +112,8 @@ public final class Editors { AnnotationPaint.register(ROOT_HANDLER_REGISTRY); ImgDoodad.register(ROOT_HANDLER_REGISTRY); + FormDoodads.register(ROOT_HANDLER_REGISTRY); + // after registries, set selection information: ValidSelectionStrategy.registerTagForSelections( LineContainers.PARAGRAPH_FULL_TAGNAME, false, Skip.NONE);
