diff options
-rw-r--r-- | WebContent/VAADIN/themes/base/styles.css | 8 | ||||
-rw-r--r-- | WebContent/VAADIN/themes/base/textfield/richtext.css | 4 | ||||
-rw-r--r-- | WebContent/VAADIN/themes/reindeer/styles.css | 8 | ||||
-rw-r--r-- | WebContent/VAADIN/themes/runo/styles.css | 8 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java | 86 | ||||
-rw-r--r-- | src/com/vaadin/ui/RichTextArea.java | 11 |
6 files changed, 100 insertions, 25 deletions
diff --git a/WebContent/VAADIN/themes/base/styles.css b/WebContent/VAADIN/themes/base/styles.css index e2afa41a10..973024c7ce 100644 --- a/WebContent/VAADIN/themes/base/styles.css +++ b/WebContent/VAADIN/themes/base/styles.css @@ -1,5 +1,5 @@ -.v-theme-version:after {content:"6_4_0_dev-20100707";} -.v-theme-version-6_4_0_dev-20100707 {display: none;} +.v-theme-version:after {content:"6_4_1_dev-20100721";} +.v-theme-version-6_4_1_dev-20100721 {display: none;} /* Automatically compiled css file from subdirectories. */ .v-absolutelayout-wrapper { @@ -1870,6 +1870,10 @@ textarea.v-textarea-readonly:focus { margin-right: 2px; } +.v-richtextarea-readonly { + border: none; +} + .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; diff --git a/WebContent/VAADIN/themes/base/textfield/richtext.css b/WebContent/VAADIN/themes/base/textfield/richtext.css index eaf7761d3e..a304fa2a57 100644 --- a/WebContent/VAADIN/themes/base/textfield/richtext.css +++ b/WebContent/VAADIN/themes/base/textfield/richtext.css @@ -49,4 +49,8 @@ .v-richtextarea .gwt-RichTextToolbar .gwt-ListBox { width: 24.5%; margin-right: 2px; +} + +.v-richtextarea-readonly { + border: none; }
\ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/styles.css b/WebContent/VAADIN/themes/reindeer/styles.css index 14de57f80d..519c5c2f3e 100644 --- a/WebContent/VAADIN/themes/reindeer/styles.css +++ b/WebContent/VAADIN/themes/reindeer/styles.css @@ -1,5 +1,5 @@ -.v-theme-version:after {content:"6_4_0_dev-20100707";} -.v-theme-version-6_4_0_dev-20100707 {display: none;} +.v-theme-version:after {content:"6_4_1_dev-20100721";} +.v-theme-version-6_4_1_dev-20100721 {display: none;} /* Automatically compiled css file from subdirectories. */ .v-absolutelayout-wrapper { @@ -1870,6 +1870,10 @@ textarea.v-textarea-readonly:focus { margin-right: 2px; } +.v-richtextarea-readonly { + border: none; +} + .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; diff --git a/WebContent/VAADIN/themes/runo/styles.css b/WebContent/VAADIN/themes/runo/styles.css index ffb721d21f..4cc9ef7f14 100644 --- a/WebContent/VAADIN/themes/runo/styles.css +++ b/WebContent/VAADIN/themes/runo/styles.css @@ -1,5 +1,5 @@ -.v-theme-version:after {content:"6_4_0_dev-20100707";} -.v-theme-version-6_4_0_dev-20100707 {display: none;} +.v-theme-version:after {content:"6_4_1_dev-20100721";} +.v-theme-version-6_4_1_dev-20100721 {display: none;} /* Automatically compiled css file from subdirectories. */ .v-absolutelayout-wrapper { @@ -1870,6 +1870,10 @@ textarea.v-textarea-readonly:focus { margin-right: 2px; } +.v-richtextarea-readonly { + border: none; +} + .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; diff --git a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java index b82f96e456..8752d2a78f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java +++ b/src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java @@ -24,6 +24,7 @@ import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; @@ -53,9 +54,9 @@ public class VRichTextArea extends Composite implements Paintable, Field, private boolean immediate = false; - private RichTextArea rta = new RichTextArea(); + private RichTextArea rta; - private VRichTextToolbar formatter = new VRichTextToolbar(rta); + private VRichTextToolbar formatter; private HTML html = new HTML(); @@ -76,13 +77,11 @@ public class VRichTextArea extends Composite implements Paintable, Field, private String currentValue = ""; + private boolean readOnly = false; + public VRichTextArea() { + createRTAComponents(); fp.add(formatter); - - rta.setWidth("100%"); - rta.addBlurHandler(this); - rta.addKeyDownHandler(this); - fp.add(rta); initWidget(fp); @@ -90,36 +89,63 @@ public class VRichTextArea extends Composite implements Paintable, Field, } + private void createRTAComponents() { + rta = new RichTextArea(); + rta.setWidth("100%"); + rta.addBlurHandler(this); + rta.addKeyDownHandler(this); + formatter = new VRichTextToolbar(rta); + } + public void setEnabled(boolean enabled) { if (this.enabled != enabled) { - rta.setEnabled(enabled); - if (enabled) { - fp.remove(html); - fp.add(rta); - } else { - html.setHTML(rta.getHTML()); - fp.remove(rta); - fp.add(html); - } + // rta.setEnabled(enabled); + swapEditableArea(); this.enabled = enabled; } } + /** + * Swaps html to rta and visa versa. + */ + private void swapEditableArea() { + if (html.isAttached()) { + fp.remove(html); + if (BrowserInfo.get().isWebkit()) { + fp.remove(formatter); + createRTAComponents(); // recreate new RTA to bypass #5379 + fp.add(formatter); + } + rta.setHTML(currentValue); + fp.add(rta); + } else { + html.setHTML(currentValue); + fp.remove(rta); + fp.add(html); + } + } + public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) { this.client = client; id = uidl.getId(); if (uidl.hasVariable("text")) { currentValue = uidl.getStringVariable("text"); - rta.setHTML(currentValue); - + if (rta.isAttached()) { + rta.setHTML(currentValue); + } else { + html.setHTML(currentValue); + } + } + if (!uidl.hasAttribute("cached")) { + setEnabled(!uidl.getBooleanAttribute("disabled")); } - setEnabled(!uidl.getBooleanAttribute("disabled")); if (client.updateComponent(this, uidl, true)) { return; } + setReadOnly(uidl.getBooleanAttribute("readonly")); immediate = uidl.getBooleanAttribute("immediate"); int newMaxLength = uidl.hasAttribute("maxLength") ? uidl .getIntAttribute("maxLength") : -1; @@ -135,6 +161,22 @@ public class VRichTextArea extends Composite implements Paintable, Field, } } + private void setReadOnly(boolean b) { + if (isReadOnly() != b) { + swapEditableArea(); + readOnly = b; + if (readOnly) { + formatter.setVisible(false); + } else { + formatter.setVisible(true); + } + } + } + + private boolean isReadOnly() { + return readOnly; + } + // TODO is this really used, or does everything go via onBlur() only? public void onChange(ChangeEvent event) { synchronizeContentToServer(); @@ -149,7 +191,13 @@ public class VRichTextArea extends Composite implements Paintable, Field, if (!html.equals(currentValue)) { client.updateVariable(id, "text", html, immediate); currentValue = html; + } else { + ApplicationConnection.getConsole().log( + "RTE: Not updated: " + currentValue + "|" + html); + } + } else { + ApplicationConnection.getConsole().log("RTE: No client or ID!"); } } diff --git a/src/com/vaadin/ui/RichTextArea.java b/src/com/vaadin/ui/RichTextArea.java index f7aceb4dcc..bb7b6e58c1 100644 --- a/src/com/vaadin/ui/RichTextArea.java +++ b/src/com/vaadin/ui/RichTextArea.java @@ -91,4 +91,15 @@ public class RichTextArea extends TextField { "RichTextArea does not support inputPrompt"); } + @Override + public void setReadOnly(boolean readOnly) { + super.setReadOnly(readOnly); + // IE6 cannot support multi-classname selectors properly + if (readOnly) { + addStyleName("v-richtextarea-readonly"); + } else { + removeStyleName("v-richtextarea-readonly"); + } + } + } |