import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Focusable;
import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.vaadin.terminal.gwt.client.VCaptionWrapper;
import com.vaadin.terminal.gwt.client.VTooltip;
import com.vaadin.terminal.gwt.client.RenderInformation.Size;
+import com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextArea;
public class VPopupView extends HTML implements Container, Iterable<Widget> {
// Notify children with focus
if ((popupComponentWidget instanceof Focusable)) {
((Focusable) popupComponentWidget).setFocus(false);
+ } else {
+
+ checkForRTE(popupComponentWidget);
}
// Notify children that have used the keyboard
activeChildren.clear();
}
+ private void checkForRTE(Widget popupComponentWidget2) {
+ if (popupComponentWidget2 instanceof VRichTextArea) {
+ ((VRichTextArea) popupComponentWidget2)
+ .synchronizeContentToServer();
+ } else if (popupComponentWidget2 instanceof HasWidgets) {
+ HasWidgets hw = (HasWidgets) popupComponentWidget2;
+ Iterator<Widget> iterator = hw.iterator();
+ while (iterator.hasNext()) {
+ checkForRTE(iterator.next());
+ }
+ }
+ }
+
@Override
public boolean remove(Widget w) {
/**
* This class implements a basic client side rich text editor component.
- *
+ *
* @author IT Mill Ltd.
- *
+ *
*/
public class VRichTextArea extends Composite implements Paintable, Field,
ChangeHandler, BlurHandler, KeyPressHandler {
// TODO is this really used, or does everything go via onBlur() only?
public void onChange(ChangeEvent event) {
+ synchronizeContentToServer();
+ }
+
+ /**
+ * Method is public to let popupview force synchronization on close.
+ */
+ public void synchronizeContentToServer() {
+ final String html = rta.getHTML();
if (client != null && id != null) {
- client.updateVariable(id, "text", rta.getText(), immediate);
+ client.updateVariable(id, "text", html, immediate);
}
}
public void onBlur(BlurEvent event) {
- final String html = rta.getHTML();
- client.updateVariable(id, "text", html, immediate);
-
+ synchronizeContentToServer();
}
/**
--- /dev/null
+package com.vaadin.tests.components.popupview;\r
+\r
+import com.vaadin.tests.components.TestBase;\r
+import com.vaadin.ui.Component;\r
+import com.vaadin.ui.PopupView;\r
+import com.vaadin.ui.RichTextArea;\r
+import com.vaadin.ui.VerticalLayout;\r
+import com.vaadin.ui.PopupView.Content;\r
+\r
+public class PopupViewWithRTE extends TestBase {\r
+\r
+ @Override\r
+ protected String getDescription() {\r
+ return "Rich text editor should work properly in popupview. Try to edit text below.";\r
+ }\r
+\r
+ @Override\r
+ protected Integer getTicketNumber() {\r
+ return 3043;\r
+ }\r
+\r
+ @Override\r
+ protected void setup() {\r
+ PopupView pv = new PopupView(new Content() {\r
+\r
+ RichTextArea rte = new RichTextArea();\r
+\r
+ VerticalLayout vl = new VerticalLayout();\r
+\r
+ public String getMinimizedValueAsHTML() {\r
+ Object value = rte.getValue();\r
+ if (value == null || "".equals(value)) {\r
+ value = "Initial <b>content</b> for <h3>rte</h3>.";\r
+ rte.setValue(value);\r
+ rte.setHeight("150px");\r
+ rte.setWidth("100%");\r
+ vl.addComponent(rte);\r
+ vl.setWidth("600px");\r
+ }\r
+ return value.toString();\r
+ }\r
+\r
+ public Component getPopupComponent() {\r
+ return vl;\r
+ }\r
+ });\r
+ getLayout().addComponent(pv);\r
+ }\r
+\r
+}\r