aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebContent/VAADIN/themes/base/styles.css8
-rw-r--r--WebContent/VAADIN/themes/base/textfield/richtext.css4
-rw-r--r--WebContent/VAADIN/themes/reindeer/styles.css8
-rw-r--r--WebContent/VAADIN/themes/runo/styles.css8
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/richtextarea/VRichTextArea.java86
-rw-r--r--src/com/vaadin/ui/RichTextArea.java11
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");
+ }
+ }
+
}