diff options
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 |