Try using InputElement#getValue() instead of Node#getNodeValue().  I'm not
exactly sure what nodeValue is, but I don't think its the same thing as the
input value.

Element e = Element.as(n);
InputElement input = e.cast();
String value = input.getValue();

Thanks,
John LaBanca
[email protected]


On Sat, Dec 4, 2010 at 4:09 AM, sevendays <[email protected]> wrote:

> Thanks John, however this did not resolve my problem. I did what you
> suggested but I'm still having trouble seeing the 'value' set on the
> <input> elements. I did the following:
>
> 1) Change to extending AbstractEditableCell.
> 2) Changed to using a Template combined with a SafeHtml renderer for
> the <input> tags.
> 3) Pick up the "change" event in onBrowserEvent (see code snippet
> below)
> 4) Inspect DOM tree to get the appropriate InputElement, then call
> getNodeValue() (see code snippet below)
>
> The problem is that getNodeValue() is null, even when the Element is
> definitely the correct one and after I have entered a value in the
> <input> field. It seems that when I enter a value in the form field,
> it doesn't make it onto the DOM tree, and therefore isn't seen by GWT.
>
> Any suggestions?
>
>
> ----------
>
>
> private static InputElement findElementTreeRecursive(Node n, String
> id) {
>
>        if (n.getNodeType() == Node.ELEMENT_NODE) {
>                Element e = Element.as(n);
>
>                System.out.println(" let's compare element " + e.getId() + "
> with "
> + id);
>
>                if (e.getId().equals(id)) {
>                        System.out.println("findElementTreeRecursive found
> element " +
> e.getNodeName() + ", value= " + e.getNodeValue() + ", id= " +
> e.getId());
>                        return (InputElement) e;
>                 }
>        }
>
>        NodeList<Node> childNodes = n.getChildNodes();
>
>         for (int i=0; i<childNodes.getLength(); i++) {
>                Node nDOM = childNodes.getItem(i);
>
>                 findElementTreeRecursive(nDOM, id);
>        }
>
>        System.out.println("findElementTreeRecursive NOT FOUND ELEMENT :(
> ");
>
>        return null;
> }
>
>
> -----------------
>
>
>
> @Override
> public void onBrowserEvent(Element parent, NodeDTO value, Object key,
>                 NativeEvent event, ValueUpdater valueUpdater) {
>        // Check that the value is not null.
>        if (value == null) {
>                return;
>        }
>
>        // Call the super handler, which handlers the enter key.
>         super.onBrowserEvent(parent, value, key, event, valueUpdater);
>
>         if ("change".equals(event.getType())) {
>                Element target = event.getEventTarget().cast();
>                // findElementTreeRecursive() is called within
> getInputElement()
>                InputElement inputPctComplete = getInputElement(parent,
> ELEMENT_AGE_ID);
>         }
> }
>
>
> On Dec 4, 12:34 am, John LaBanca <[email protected]> wrote:
> > AbstractInputCell is intended to be wrap a single input element, not an
> > entire form.  Specifically, you need to override getInputElement(parent)
> to
> > dig into the DOM and get the input element that you are wrapping.  By
> > default, getInputElement(parent) gets the first child of the parent,
> > assuming that the cell renders a single input element and nothing else.
> >  Still, even if you override getInputElement, you'll only be able to
> return
> > one value.
> >
> > What you really need to do is create a new AbstractEditableCell.  In
> > onBrowserEvent, catch the change event and dig down to all of the input
> > elements in the form, updating the DTO as needed.
> >
> > Thanks,
> > John LaBanca
> > [email protected]
> >
> > On Fri, Dec 3, 2010 at 9:23 AM, sevendays <[email protected]> wrote:
> > > I have created a CellBrowser where each cell is a custom HTML
> > > component that features a few different HTML form components (e.g.
> > > age, feeling etc.).
> >
> > > The form displays fine, however, I can't get the value entered in the
> > > form into the client-side code. The relevant element in the DOM
> > > doesn't have the 'value' attribute set properly.
> >
> > > I have tried a few things, including:
> >
> > > 1) Getting the element from the DOM object using
> > > dom.getElementById(ELEMENT_AGE_ID), this returns an entity but value
> > > is null, even though I had just entered a value into this element.
> >
> > > 2) Recursively looping round the DOM node tree, and printing it out to
> > > the console (printElementTree()) - again I can see the element but the
> > > value is null (after entering a value).
> >
> > > What am I not doing correctly? How can I get the value attribute to
> > > update on the element in the DOM? Once it has been updated, how do I
> > > get the values from the elements with IDs ELEMENT_AGE_ID,
> > > ELEMENT_FEELING_ID etc.?
> >
> > > An extract of the code is below. Any suggestions or advice would be
> > > appreciated.
> >
> > > ---------------------------------------------------
> >
> > > public class NodeTreeItemCell extends AbstractInputCell<NodeDTO,
> > > NodeTreeItemCell.ViewData> {
> >
> > >        public static final int CELL_WIDTH = 440;
> >
> > >        // these statics are the HTML element IDs
> > >        public static final String ELEMENT_AGE_ID = "txtAge";
> > >        public static final String ELEMENT_FEELING_ID = "optFeeling";
> > >        public static final String ELEMENT_TOWN_ID = "txtTown";
> > >        public static final String ELEMENT_BUTTON_UPDATE_ID =
> "btnUpdate";
> >
> > >        public NodeTreeItemCell() {
> > >                /*
> > >                 * Let the parent class know that our cell responds to
> click
> > > events
> > > and
> > >                 * keydown events.
> > >                 */
> > >                super("click", "change", "keyup");
> >
> > >        }
> >
> > >        @Override
> > >        public void render(NodeDTO value, Object key, SafeHtmlBuilder
> sb) {
> >
> > >                if (value == null) {
> > >                        return;
> > >                }
> >
> > >                // Start
> > >                sb.appendHtmlConstant("<div id=\"hPanelRoot\"
> > > class=\"nbRoot\" >");
> > >                sb.appendHtmlConstant(" <table>");
> > >                sb.appendHtmlConstant(" <tr>");
> >
> > >                // left panel
> > >                sb.appendHtmlConstant(" <td
> style=\"vertical-align:top;\"
> > >  id=
> > > \"vPanelLeft\">");
> > >                sb.appendHtmlConstant("  <table>");
> > >                sb.appendHtmlConstant("   <tr><td
> > > class=\"nbIcon\">*</td></tr>");
> > >                sb.appendHtmlConstant("  </table>");
> > >                sb.appendHtmlConstant(" </td>");
> >
> > >                // main panel
> > >                sb.appendHtmlConstant(" <td
> style=\"vertical-align:top;\"
> > > id=
> > > \"vPanelMain\" class=\"nbMainPanel\">");
> > >                sb.appendHtmlConstant("  <table
> style=\"width:100%;\">");
> > >                sb.appendHtmlConstant("   <tr>");
> > >                sb.appendHtmlConstant("    <td>");
> > >                sb.appendHtmlConstant("    <span>Build:</span>");
> > >                sb.appendHtmlConstant("    <input type=\"text\"
> > > class=\"nbTextBox\"
> > > size=\"3\" maxlength=\"3\" id=\"" +
> > > SafeHtmlUtils.fromTrustedString(ELEMENT_AGE_ID) + "\"></input>");
> > >                sb.appendHtmlConstant("    <span>%</span>");
> > >                sb.appendHtmlConstant("    <span>Feeling:</span>");
> > >                sb.appendHtmlConstant("    <select id=\"" +
> > > SafeHtmlUtils.fromTrustedString(ELEMENT_FEELING_ID) + "\">");
> > >                sb.appendHtmlConstant("    </select>");
> > >                sb.appendHtmlConstant("    </td>");
> > >                sb.appendHtmlConstant("   </tr>");
> > >                sb.appendHtmlConstant("   <tr>");
> > >                sb.appendHtmlConstant("    <td id=\"tbc\"
> > > class=\"nbItemRow\">");
> > >                sb.appendHtmlConstant("    <span>Expected
> > > Complete:</span>");
> > >                sb.appendHtmlConstant("    <input type=\"text\" id=\"" +
> > > SafeHtmlUtils.fromTrustedString(ELEMENT_TOWN_ID) + "\"></input>");
> > >                sb.appendHtmlConstant("    <input type=\"button\"
> > > value=\"Update\"
> > > class=\"nbButton\"id=\"" +
> > > SafeHtmlUtils.fromTrustedString(ELEMENT_BUTTON_UPDATE_ID) + "\"></
> > > input>");
> > >                sb.appendHtmlConstant("    </td>");
> > >                sb.appendHtmlConstant("   </tr>");
> > >                sb.appendHtmlConstant("  </table> ");
> > >                sb.appendHtmlConstant(" </td>");
> >
> > >                // end
> > >                sb.appendHtmlConstant(" </tr>");
> > >                sb.appendHtmlConstant(" </table>");
> > >                sb.appendHtmlConstant("</div>");
> >
> > >        }
> >
> > >        @Override
> > >        public void onBrowserEvent(Element parent, NodeDTO value, Object
> > > key,
> > > NativeEvent event, ValueUpdater<NodeDTO> valueUpdater) {
> >
> > >                super.onBrowserEvent(parent, value, key, event,
> > > valueUpdater);
> > >                String type = event.getType();
> > >                if ("change".equals(type)) {
> >
> > >                        printElementTree(parent, 1);
> >
> > > //                      InputElement txtPctProgress =
> > > //                              SelectElement select =
> > > parent.getFirstChild().cast();
> > > //                      String newValue =
> > > options.get(select.getSelectedIndex());
> > > //                      setViewData(key, newValue);
> > > //                      finishEditing(parent, newValue, key,
> valueUpdater);
> > > //                      if (valueUpdater != null) {
> > > //                              valueUpdater.update(newValue);
> > > //                      }
> > >                }
> >
> > >        }
> >
> > >        @Override
> > >        protected void finishEditing(Element parent, NodeDTO value,
> Object
> > > key, ValueUpdater<NodeDTO> valueUpdater) {
> > >                //super.finishEditing(parent, value, key, valueUpdater);
> > >                String newValue = getInputElement(parent).getValue();
> >
> > >                // newValue is always null
> > >                System.out.println("NEW VALUE = " + newValue);
> >
> > >        }
> >
> > >        private static void printElementTree(Node n, int level) {
> > >                NodeList<Node> childNodes = n.getChildNodes();
> >
> > >                String indicator = "";
> >
> > >                for (int h=0; h<level; h++) {
> > >                        indicator = indicator + "> ";
> > >                }
> >
> > >                level = level + 1;
> >
> > >                for (int i=0; i<childNodes.getLength(); i++) {
> > >                        Node nDOM = childNodes.getItem(i);
> >
> > >                        String type = "";
> >
> > >                        switch (nDOM.getNodeType()) {
> > >                        case Node.ELEMENT_NODE:
> > >                                type = "element node";
> > >                                Element e = Element.as(nDOM);
> > >                                System.out.println(indicator+ "Child DOM
> > > element " +
> > > nDOM.getNodeName() + " value= " + nDOM.getNodeValue() + " type= " +
> > > type + " id= " + e.getId());
> > >                        case Node.DOCUMENT_NODE:
> > >                                type = "document node";
> > >                                System.out.println(indicator+ "Child DOM
> > > element " +
> > > nDOM.getNodeName() + " value= " + nDOM.getNodeValue() + " type= " +
> > > type);
> > >                        case Node.TEXT_NODE:
> > >                                type = "text node";
> > >                                System.out.println(indicator+ "Child DOM
> > > element " +
> > > nDOM.getNodeName() + " value= " + nDOM.getNodeValue() + " type= " +
> > > type);
> > >                        }
> >
> > >                        printElementTree(nDOM, level);
> > >                }
> > >        }
> >
> > >        @Override
> > >        protected InputElement getInputElement(Element parent) {
> > >                return super.getInputElement(parent).<InputElement>
> cast();
> > >        }
> >
> > >        /**
> > >         * The {...@code ViewData} for this cell.
> > >         */
> > >        public static class ViewData {
> > >                /**
> > >                 * The last value that was updated.
> > >                 */
> > >                private String lastValue;
> >
> > >                /**
> > >                 * The current value.
> > >                 */
> > >                private String curValue;
> >
> > >                /**
> > >                 * Construct a ViewData instance containing a given
> value.
> > >                 */
> > >                public ViewData(String value) {
> > >                        this.lastValue = value;
> > >                        this.curValue = value;
> > >                }
> >
> > >                /**
> > >                 * Return true if the last and current values of this
> > > ViewData
> > > object
> > >                 * are equal to those of the other object.
> > >                 */
> > >                @Override
> > >                public boolean equals(Object other) {
> > >                        if (!(other instanceof ViewData)) {
> > >                                return false;
> > >                        }
> > >                        ViewData vd = (ViewData) other;
> > >                        return equalsOrNull(lastValue, vd.lastValue)
> > >                        && equalsOrNull(curValue, vd.curValue);
> > >                }
> >
> > >                /**
> > >                 * Return the current value of the input element.
> > >                 */
> > >                public String getCurrentValue() {
> > >                        return
> >
> > ...
> >
> > read more ยป
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to