aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebContent/VAADIN/themes/tests-tickets/styles.css3
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java4
-rw-r--r--src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java4
-rw-r--r--src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java2
-rw-r--r--src/com/vaadin/ui/AbstractField.java2
-rw-r--r--src/com/vaadin/ui/AbstractTextField.java18
-rw-r--r--tests/src/com/vaadin/tests/components/tabsheet/TabSheetTabTheming.java27
-rw-r--r--tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.html37
-rw-r--r--tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.java32
-rw-r--r--tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.html67
-rw-r--r--tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.java55
11 files changed, 240 insertions, 11 deletions
diff --git a/WebContent/VAADIN/themes/tests-tickets/styles.css b/WebContent/VAADIN/themes/tests-tickets/styles.css
index e63a5767b3..e6001a6dc2 100644
--- a/WebContent/VAADIN/themes/tests-tickets/styles.css
+++ b/WebContent/VAADIN/themes/tests-tickets/styles.css
@@ -333,3 +333,6 @@
color: blue;
}
+.v-tabsheet-pg .v-tabsheet-tabitem-selected {
+ font-weight: bold
+} \ No newline at end of file
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java
index f892d476cb..9b99391dda 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java
@@ -228,6 +228,10 @@ public class VTabsheet extends VTabsheetBase {
false);
}
oldSelected = newSelected;
+
+ // The selected tab might need more (or less) space
+ updateCaptionSize(index);
+ updateCaptionSize(activeTabIndex);
}
public void removeTab(int i) {
diff --git a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java
index 0504e02787..02218f4bc2 100644
--- a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java
+++ b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java
@@ -165,9 +165,9 @@ public abstract class AbstractWebApplicationContext implements
final String filename = resource.getFilename();
if (filename == null) {
- return "APP/" + mapKey + "/";
+ return "app://APP/" + mapKey + "/";
} else {
- return "APP/" + mapKey + "/" + filename;
+ return "app://APP/" + mapKey + "/" + filename;
}
}
diff --git a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
index 080ff33af5..8b1e776b4c 100644
--- a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
+++ b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
@@ -371,7 +371,7 @@ public class JsonPaintTarget implements PaintTarget {
"Application not specified for resorce "
+ value.getClass().getName());
}
- final String uri = "app://" + a.getRelativeLocation(r);
+ final String uri = a.getRelativeLocation(r);
addAttribute(name, uri);
} else if (value instanceof ThemeResource) {
diff --git a/src/com/vaadin/ui/AbstractField.java b/src/com/vaadin/ui/AbstractField.java
index 27682c764d..2ce6294df5 100644
--- a/src/com/vaadin/ui/AbstractField.java
+++ b/src/com/vaadin/ui/AbstractField.java
@@ -1042,7 +1042,7 @@ public abstract class AbstractField extends AbstractComponent implements Field,
/**
* Sets the internal field value. This is purely used by AbstractField to
* change the internal Field value. It does not trigger valuechange events.
- * It can be overriden by the inheriting classes to update all dependent
+ * It can be overridden by the inheriting classes to update all dependent
* variables.
*
* @param newValue
diff --git a/src/com/vaadin/ui/AbstractTextField.java b/src/com/vaadin/ui/AbstractTextField.java
index ad31a46157..693106b686 100644
--- a/src/com/vaadin/ui/AbstractTextField.java
+++ b/src/com/vaadin/ui/AbstractTextField.java
@@ -439,17 +439,23 @@ public abstract class AbstractTextField extends AbstractField implements
private void firePendingTextChangeEvent() {
if (textChangeEventPending) {
- fireEvent(new TextChangeEventImpl(this));
textChangeEventPending = false;
+ fireEvent(new TextChangeEventImpl(this));
}
}
@Override
protected void setInternalValue(Object newValue) {
- if (changingVariables) {
+ if (changingVariables && !textChangeEventPending) {
/*
- * Fire text change event before value change event if change is
- * coming from the client side.
+ * Fire a "simulated" text change event before value change event if
+ * change is coming from the client side.
+ *
+ * Iff there is both value change and textChangeEvent in same
+ * variable burst, it is a text field in non immediate mode and the
+ * text change event "flushed" queued value change event. In this
+ * case textChangeEventPending flag is already on and text change
+ * event will be fired after the value change event.
*/
if (newValue == null && lastKnownTextContent != null
&& !lastKnownTextContent.equals(getNullRepresentation())) {
@@ -463,9 +469,7 @@ public abstract class AbstractTextField extends AbstractField implements
textChangeEventPending = true;
}
- if (textChangeEventPending) {
- firePendingTextChangeEvent();
- }
+ firePendingTextChangeEvent();
}
super.setInternalValue(newValue);
}
diff --git a/tests/src/com/vaadin/tests/components/tabsheet/TabSheetTabTheming.java b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetTabTheming.java
new file mode 100644
index 0000000000..94b49d4ae0
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetTabTheming.java
@@ -0,0 +1,27 @@
+package com.vaadin.tests.components.tabsheet;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.TabSheet;
+
+public class TabSheetTabTheming extends TestBase {
+
+ @Override
+ public void setup() {
+ TabSheet tabsheet = new TabSheet();
+ tabsheet.setStyleName("pg");
+ tabsheet.addTab(new Label(), "Brown fox and the fence", null);
+ tabsheet.addTab(new Label(), "Something about using all the keys", null);
+ addComponent(tabsheet);
+ setTheme("tests-tickets");
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Changing tabs should not cause flickering, cut text or text that moves back and forth.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 6781;
+ }
+} \ No newline at end of file
diff --git a/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.html b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.html
new file mode 100644
index 0000000000..6f0772aa29
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.html
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>TextChangeEventsEternalLoop</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">TextChangeEventsEternalLoop</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.textfield.TextChangeEventsEternalLoop?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsEternalLoop::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>99,4</td>
+</tr>
+<tr>
+ <td>enterCharacter</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsEternalLoop::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>g</td>
+</tr>
+<tr>
+ <td>verifyValue</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsEternalLoop::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>g</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.java b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.java
new file mode 100644
index 0000000000..22348bb5b5
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsEternalLoop.java
@@ -0,0 +1,32 @@
+package com.vaadin.tests.components.textfield;
+
+import com.vaadin.event.FieldEvents.TextChangeEvent;
+import com.vaadin.event.FieldEvents.TextChangeListener;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.TextField;
+
+public class TextChangeEventsEternalLoop extends TestBase {
+ @Override
+ protected void setup() {
+
+ final TextField tf = new TextField("Debug");
+ getLayout().addComponent(tf);
+
+ tf.addListener(new TextChangeListener() {
+ public void textChange(TextChangeEvent event) {
+ tf.setValue(event.getText());
+ }
+ });
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Moving current text to value in text change listener should not cause eternal loop.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 6376;
+ }
+
+} \ No newline at end of file
diff --git a/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.html b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.html
new file mode 100644
index 0000000000..cc3c48bfa7
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.html
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>TextChangeEventsWithNonImmediateValueChange</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">TextChangeEventsWithNonImmediateValueChange</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.textfield.TextChangeEventsWithNonImmediateValueChange?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>15,18</td>
+</tr>
+<tr>
+ <td>keyPress</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>a</td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>1000</td>
+ <td></td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>enter</td>
+</tr>
+<tr>
+ <td>keyPress</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td>
+ <td>a</td>
+</tr>
+<tr>
+ <td>pause</td>
+ <td>1000</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::PID_SLog_row_2</td>
+ <td>1. Text change event for Default, text content currently:'a' Cursor at index:1</td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::PID_SLog_row_1</td>
+ <td>2. Value change:a</td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstextfieldTextChangeEventsWithNonImmediateValueChange::PID_SLog_row_0</td>
+ <td>3. Text change event for Default, text content currently:'aa' Cursor at index:2</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.java b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.java
new file mode 100644
index 0000000000..a893739bff
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/textfield/TextChangeEventsWithNonImmediateValueChange.java
@@ -0,0 +1,55 @@
+package com.vaadin.tests.components.textfield;
+
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.event.FieldEvents.TextChangeEvent;
+import com.vaadin.event.FieldEvents.TextChangeListener;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.tests.util.Log;
+import com.vaadin.ui.TextField;
+
+public class TextChangeEventsWithNonImmediateValueChange extends TestBase {
+ Log l = new Log(5);
+
+ @Override
+ protected void setup() {
+
+ TextField tf = new TextField("Default");
+
+ TextChangeListener inputEventListener = new TextChangeListener() {
+
+ public void textChange(TextChangeEvent event) {
+ l.log("Text change event for "
+ + event.getComponent().getCaption()
+ + ", text content currently:'" + event.getText()
+ + "' Cursor at index:" + event.getCursorPosition());
+ }
+ };
+
+ tf.addListener(inputEventListener);
+
+ // tf.setImmediate(true); // works when this is set
+
+ tf.addListener(new ValueChangeListener() {
+
+ public void valueChange(ValueChangeEvent event) {
+ l.log("Value change:" + event.getProperty().toString());
+ }
+ });
+
+ getLayout().addComponent(tf);
+
+ getLayout().addComponent(l);
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Type a, pause for a second, type ENTER, type a. Text field should not forget the last textchange event right after valuechange (enter).";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 6866;
+ }
+
+} \ No newline at end of file