From: Matti Tahvonen Date: Wed, 15 Aug 2007 08:19:07 +0000 (+0000) Subject: svn changeset:2012/svn branch:trunk X-Git-Tag: 6.7.0.beta1~6102 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=fcb535c32d7513435938d165ea8855d5f5050a8c;p=vaadin-framework.git svn changeset:2012/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Caption.java b/src/com/itmill/toolkit/terminal/gwt/client/Caption.java index 3e1936638b..873433ba67 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/Caption.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/Caption.java @@ -1,15 +1,29 @@ package com.itmill.toolkit.terminal.gwt.client; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.SimplePanel; public class Caption extends HTML { private Paintable owner; + private Element errorIndicatorElement; + + private Element captionText; + + private ErrorMessage errorMessage; + + private PopupPanel errorContainer; + + /* Caption must be attached to a Paintable */ + private Caption(){}; + public Caption(Paintable component) { + super(); owner = component; setStyleName("i-caption"); } @@ -17,21 +31,78 @@ public class Caption extends HTML { public void updateCaption(UIDL uidl) { setVisible(!uidl.getBooleanAttribute("invisible")); - String c = uidl.getStringAttribute("caption"); - if (c == null) { - } else { - setText(c); + if(uidl.hasAttribute("error")) { + UIDL errorUidl = uidl.getErrors(); + + if(errorIndicatorElement == null) { + errorIndicatorElement = DOM.createDiv(); + DOM.setAttribute(errorIndicatorElement, "className", "i-errorindicator"); + DOM.insertChild(getElement(), errorIndicatorElement, 0); + } + + errorMessage = new ErrorMessage(); + errorMessage.updateFromUIDL(errorUidl); + + } else if( errorIndicatorElement != null) { + DOM.setStyleAttribute(errorIndicatorElement, "display", "none"); } - if(uidl.hasAttribute("description")) { - setTitle(uidl.getStringAttribute("description")); + + if(uidl.hasAttribute("caption")) { + if(captionText == null) { + captionText = DOM.createSpan(); + DOM.appendChild(getElement(), captionText); + } + DOM.setInnerText(captionText, uidl.getStringAttribute("caption")); } - if(uidl.hasAttribute("error")) { - // TODO error messages + if(uidl.hasAttribute("description")) { + if(captionText != null) { + DOM.setAttribute(captionText, "title", uidl.getStringAttribute("description")); + } else { + setTitle(uidl.getStringAttribute("description")); + } } + } + public void onBrowserEvent(Event event) { + Element target= DOM.eventGetTarget(event); + if(errorIndicatorElement != null && DOM.compare(target, errorIndicatorElement)) { + switch (DOM.eventGetType(event)) { + case Event.ONMOUSEOVER: + showErrorMessage(); + break; + case Event.ONMOUSEOUT: + hideErrorMessage(); + break; + default: + break; + } + } + } + + private void hideErrorMessage() { + if(errorContainer != null) { + errorContainer.hide(); + } + } + + private void showErrorMessage() { + if(errorMessage != null) { + if(errorContainer == null) { + errorContainer = new PopupPanel(); + errorContainer.setWidget(errorMessage); + } + errorContainer.setPopupPosition( + DOM.getAbsoluteLeft(errorIndicatorElement) + + 2*DOM.getIntAttribute(errorIndicatorElement, "offsetHeight"), + DOM.getAbsoluteTop(errorIndicatorElement) + + 2*DOM.getIntAttribute(errorIndicatorElement, "offsetHeight")); + errorContainer.show(); + } + } + public static boolean isNeeded(UIDL uidl) { if (uidl.getStringAttribute("caption") != null) return true; // TODO Description and error messages diff --git a/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java b/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java index 3dc4997e0b..4cffdbcd35 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/UIDL.java @@ -397,4 +397,10 @@ public class UIDL { public int getChidlCount() { return json.size()-2; } + + public UIDL getErrors() { + JSONArray a = (JSONArray) ((JSONObject) json.get(1)).get("error"); + return new UIDL(a); + } + } diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/caption/css/caption.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/caption/css/caption.css new file mode 100644 index 0000000000..af4a30ef07 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/caption/css/caption.css @@ -0,0 +1,13 @@ +.i-errorindicator { + width: 10px; + height: 10px; + display: block; + float:left; + background: #f00; +} + +.i-error { + padding-left: 15px; + background: #fff; + border: 1px solid red; +} \ No newline at end of file diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css index ee80367724..df2efe8c1d 100644 --- a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css @@ -7,3 +7,4 @@ @import "table/css/table.css"; @import "slider/css/slider.css"; @import "window/css/window.css"; +@import "caption/css/caption.css"; diff --git a/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java b/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java index a755ca9c65..a4e0fa5db9 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/JsonPaintTarget.java @@ -87,6 +87,8 @@ public class JsonPaintTarget implements PaintTarget { private JsonTag tag; + private int errorsOpen; + /** * Creates a new XMLPrintWriter, without automatic line flushing. * @@ -162,6 +164,10 @@ public class JsonPaintTarget implements PaintTarget { mTagArgumentListOpen = true; customLayoutArgumentsOpen = "customlayout".equals(tagName); + + if("error".equals(tagName)) { + errorsOpen++; + } } /** @@ -195,7 +201,17 @@ public class JsonPaintTarget implements PaintTarget { throw new PaintException("Invalid UIDL: wrong ending tag: '" + tagName + "' expected: '" + lastTag + "'."); - parent.addData(tag.getJSON()); + // simple hack which writes error uidl structure into attribute + if("error".equals(lastTag)) { + if(errorsOpen == 1) // ending error section + parent.addAttribute("\"error\":[\"error\",{}"+tag.getData() + "]"); + else // sub error + parent.addData(tag.getJSON()); + errorsOpen--; + } else { + parent.addData(tag.getJSON()); + } + tag = parent; } else {