summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebContent/VAADIN/themes/reindeer/styles.css6
-rw-r--r--WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css2
-rw-r--r--src/com/vaadin/data/Container.java34
-rw-r--r--src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java5
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java14
-rw-r--r--src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java101
-rw-r--r--src/com/vaadin/ui/AbstractComponent.java1
-rw-r--r--src/com/vaadin/ui/AbstractSelect.java7
-rw-r--r--src/com/vaadin/ui/Tree.java7
-rw-r--r--tests/src/com/vaadin/tests/components/button/Buttons.html32
-rw-r--r--tests/src/com/vaadin/tests/components/button/Buttons.java12
-rw-r--r--tests/src/com/vaadin/tests/components/menubar/Menubars.html32
-rw-r--r--tests/src/com/vaadin/tests/components/menubar/Menubars.java126
13 files changed, 328 insertions, 51 deletions
diff --git a/WebContent/VAADIN/themes/reindeer/styles.css b/WebContent/VAADIN/themes/reindeer/styles.css
index 446c69d7d9..afb15e49a8 100644
--- a/WebContent/VAADIN/themes/reindeer/styles.css
+++ b/WebContent/VAADIN/themes/reindeer/styles.css
@@ -1,5 +1,5 @@
-.v-theme-version:after {content:"9_9_9_INTERNAL-DEBUG-BUILD";}
-.v-theme-version-9_9_9_INTERNAL-DEBUG-BUILD {display: none;}
+.v-theme-version:after {content:"6_2_0_dev-20091229";}
+.v-theme-version-6_2_0_dev-20091229 {display: none;}
/* Automatically compiled css file from subdirectories. */
.v-absolutelayout-wrapper {
@@ -4256,6 +4256,8 @@ td.v-datefield-calendarpanel-nextyear {
.v-ie .v-tabsheet-tabs .v-errorindicator {
zoom: 1;
display: inline;
+}
+.v-ie8 .v-tabsheet-tabs .v-errorindicator {
display: inline-block;
}
diff --git a/WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css b/WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css
index 8cf324be26..83f5ce9a0d 100644
--- a/WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css
+++ b/WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css
@@ -157,5 +157,7 @@
.v-ie .v-tabsheet-tabs .v-errorindicator {
zoom: 1;
display: inline;
+}
+.v-ie8 .v-tabsheet-tabs .v-errorindicator {
display: inline-block;
} \ No newline at end of file
diff --git a/src/com/vaadin/data/Container.java b/src/com/vaadin/data/Container.java
index 226a4e0b09..5777bf2b05 100644
--- a/src/com/vaadin/data/Container.java
+++ b/src/com/vaadin/data/Container.java
@@ -541,6 +541,24 @@ public interface Container extends Serializable {
* <code>false</code> if not (is a leaf)
*/
public boolean hasChildren(Object itemId);
+
+ /**
+ * <p>
+ * Removes the Item identified by <code>ItemId</code> from the
+ * Container.
+ * </p>
+ *
+ * <p>
+ * Note that this does not remove any children the item might have.
+ * </p>
+ *
+ * @param itemId
+ * ID of the Item to remove
+ * @return <code>true</code> if the operation succeeded,
+ * <code>false</code> if not
+ */
+ public boolean removeItem(Object itemId)
+ throws UnsupportedOperationException;
}
/**
@@ -555,17 +573,15 @@ public interface Container extends Serializable {
* visible in the container.
*
* When an {@link com.vaadin.data.Ordered} or
- * {@link com.vaadin.data.Indexed} container is filtered, all
- * operations of these interfaces should only use the filtered contents and
- * the filtered indices to the container.
+ * {@link com.vaadin.data.Indexed} container is filtered, all operations of
+ * these interfaces should only use the filtered contents and the filtered
+ * indices to the container.
*
- * Adding items (if supported) to a filtered
- * {@link com.vaadin.data.Ordered} or
- * {@link com.vaadin.data.Indexed} container should insert them
+ * Adding items (if supported) to a filtered {@link com.vaadin.data.Ordered}
+ * or {@link com.vaadin.data.Indexed} container should insert them
* immediately after the indicated visible item. The unfiltered position of
- * items added at index 0, at index
- * {@link com.vaadin.data.Container#size()} or at an undefined
- * position is up to the implementation.
+ * items added at index 0, at index {@link com.vaadin.data.Container#size()}
+ * or at an undefined position is up to the implementation.
*
* @since 5.0
*/
diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java
index 4700451543..4ea806e29e 100644
--- a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java
+++ b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java
@@ -158,9 +158,8 @@ public class ApplicationConfiguration {
// Something went wrong: multiple widgetsets inited
String msg = "Tried to init " + widgetset.getClass().getName()
+ ", but " + initedWidgetSet.getClass().getName()
- + " is already inited.";
- System.err.println(msg);
- throw new IllegalStateException(msg);
+ + " was already inited.";
+ ApplicationConnection.getConsole().log(msg);
}
initedWidgetSet = widgetset;
ArrayList<String> appIds = new ArrayList<String>();
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
index 9cad1fbd91..4e17dcb879 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
@@ -787,7 +787,21 @@ public class VMenuBar extends Widget implements Paintable,
paddingWidth = widthBefore - getElement().getClientWidth();
getElement().getStyle().setProperty("padding", "");
}
+ String overflow = "";
+ if (BrowserInfo.get().isIE6()) {
+ // IE6 cannot measure available width correctly without
+ // overflow:hidden
+ overflow = getElement().getStyle().getProperty("overflow");
+ getElement().getStyle().setProperty("overflow", "hidden");
+ }
+
int availableWidth = getElement().getClientWidth() - paddingWidth;
+
+ if (BrowserInfo.get().isIE6()) {
+ // IE6 cannot measure available width correctly without
+ // overflow:hidden
+ getElement().getStyle().setProperty("overflow", overflow);
+ }
int diff = availableWidth - getConsumedWidth();
removeItem(moreItem);
diff --git a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
index e745282605..649a5e129d 100644
--- a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
+++ b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java
@@ -4,9 +4,15 @@
package com.vaadin.terminal.gwt.server;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -1000,25 +1006,37 @@ public class JsonPaintTarget implements PaintTarget {
}
}
+ private static final Map<Class<? extends Paintable>, Class<? extends Paintable>> widgetMappingCache = new HashMap<Class<? extends Paintable>, Class<? extends Paintable>>();
+
@SuppressWarnings("unchecked")
public String getTag(Paintable paintable) {
- /*
- * Client widget annotation is searched from component hierarchy to
- * detect the component that presumably has client side implementation.
- * The server side name is used in the transportation, but encoded into
- * integer strings to optimized transferred data.
- */
- Class<? extends Paintable> class1 = paintable.getClass();
- while (!hasClientWidgetMapping(class1)) {
- Class<?> superclass = class1.getSuperclass();
- if (superclass != null
- && Paintable.class.isAssignableFrom(superclass)) {
- class1 = (Class<? extends Paintable>) superclass;
- } else {
- System.out
- .append("Warning: no superclass of givent has ClientWidget"
- + " annotation. Component will not be mapped correctly on client side.");
- break;
+ Class<? extends Paintable> class1;
+ synchronized (widgetMappingCache) {
+ class1 = widgetMappingCache.get(paintable.getClass());
+ }
+ if (class1 == null) {
+ /*
+ * Client widget annotation is searched from component hierarchy to
+ * detect the component that presumably has client side
+ * implementation. The server side name is used in the
+ * transportation, but encoded into integer strings to optimized
+ * transferred data.
+ */
+ class1 = paintable.getClass();
+ while (!hasClientWidgetMapping(class1)) {
+ Class<?> superclass = class1.getSuperclass();
+ if (superclass != null
+ && Paintable.class.isAssignableFrom(superclass)) {
+ class1 = (Class<? extends Paintable>) superclass;
+ } else {
+ System.out
+ .append("Warning: no superclass of givent has ClientWidget"
+ + " annotation. Component will not be mapped correctly on client side.");
+ break;
+ }
+ }
+ synchronized (widgetMappingCache) {
+ widgetMappingCache.put(paintable.getClass(), class1);
}
}
@@ -1029,15 +1047,58 @@ public class JsonPaintTarget implements PaintTarget {
private boolean hasClientWidgetMapping(Class<? extends Paintable> class1) {
try {
- ClientWidget annotation = class1.getAnnotation(ClientWidget.class);
- return annotation != null;
+ return class1.isAnnotationPresent(ClientWidget.class);
} catch (RuntimeException e) {
if (e.getStackTrace()[0].getClassName().equals(
"org.glassfish.web.loader.WebappClassLoader")) {
+
// Glassfish 3 is darn eager to load the value class, even
// though we just want to check if the annotation exists.
// See #3920, remove this hack when fixed in glassfish
- return true;
+ // In some situations (depending on class loading order) it
+ // would be enough to return true here, but it is safer to check
+ // the annotation from bytecode
+
+ String name = class1.getName().replace('.', File.separatorChar)
+ + ".class";
+
+ try {
+ InputStream stream = class1.getClassLoader()
+ .getResourceAsStream(name);
+ BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(stream));
+ try {
+ String line;
+ boolean atSourcefile = false;
+ while ((line = bufferedReader.readLine()) != null) {
+ if (line.startsWith("SourceFile")) {
+ atSourcefile = true;
+ }
+ if (atSourcefile) {
+ if (line.contains("ClientWidget")) {
+ return true;
+ }
+ }
+ // TODO could optize to quit at the end attribute
+ }
+ } catch (IOException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } finally {
+ try {
+ bufferedReader.close();
+ } catch (IOException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ }
+
+ } catch (Throwable e2) {
+ // TODO Auto-generated catch block
+ e2.printStackTrace();
+ }
+
+ return false;
} else {
// throw exception forward
throw e;
diff --git a/src/com/vaadin/ui/AbstractComponent.java b/src/com/vaadin/ui/AbstractComponent.java
index 4619c2ab8d..0c02792fff 100644
--- a/src/com/vaadin/ui/AbstractComponent.java
+++ b/src/com/vaadin/ui/AbstractComponent.java
@@ -315,6 +315,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
*/
public void setLocale(Locale locale) {
this.locale = locale;
+ requestRepaint();
}
/*
diff --git a/src/com/vaadin/ui/AbstractSelect.java b/src/com/vaadin/ui/AbstractSelect.java
index b8ef6bc206..4b5ef4a0a8 100644
--- a/src/com/vaadin/ui/AbstractSelect.java
+++ b/src/com/vaadin/ui/AbstractSelect.java
@@ -793,12 +793,9 @@ public abstract class AbstractSelect extends AbstractField implements
return retval;
}
- /**
- * Removes the item identified by Id from the container. This functionality
- * is optional. If the function is not implemented, the functions allways
- * returns false.
+ /*
+ * (non-Javadoc)
*
- * @return True if the operation succeeded.
* @see com.vaadin.data.Container#removeItem(java.lang.Object)
*/
public boolean removeItem(Object itemId)
diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java
index 509d83a153..28a410fa13 100644
--- a/src/com/vaadin/ui/Tree.java
+++ b/src/com/vaadin/ui/Tree.java
@@ -1068,4 +1068,11 @@ public class Tree extends AbstractSelect implements Container.Hierarchical,
public abstract String getStyle(Object itemId);
}
+ // Overriden so javadoc comes from Container.Hierarchical
+ @Override
+ public boolean removeItem(Object itemId)
+ throws UnsupportedOperationException {
+ return super.removeItem(itemId);
+ }
+
}
diff --git a/tests/src/com/vaadin/tests/components/button/Buttons.html b/tests/src/com/vaadin/tests/components/button/Buttons.html
new file mode 100644
index 0000000000..43e554bec5
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/button/Buttons.html
@@ -0,0 +1,32 @@
+<?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>com.vaadin.tests.components.button.Buttons</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">com.vaadin.tests.components.button.Buttons</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.button.Buttons</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/button/Buttons.java b/tests/src/com/vaadin/tests/components/button/Buttons.java
index 4b1e7d60d8..b27d3f8ae9 100644
--- a/tests/src/com/vaadin/tests/components/button/Buttons.java
+++ b/tests/src/com/vaadin/tests/components/button/Buttons.java
@@ -8,7 +8,6 @@ import com.vaadin.tests.util.LoremIpsum;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
-import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.NativeButton;
import com.vaadin.ui.Button.ClickEvent;
@@ -54,17 +53,6 @@ public class Buttons extends ComponentTestCase {
}
- private Component createActionLayout() {
- HorizontalLayout actionLayout = new HorizontalLayout();
- actionLayout.setSpacing(true);
- actionLayout.setMargin(true);
- for (Component c : createActions()) {
- actionLayout.addComponent(c);
- }
- addComponent(actionLayout);
- return actionLayout;
- }
-
private Button createButton(String text, boolean nativeButton) {
Button b;
if (nativeButton) {
diff --git a/tests/src/com/vaadin/tests/components/menubar/Menubars.html b/tests/src/com/vaadin/tests/components/menubar/Menubars.html
new file mode 100644
index 0000000000..090a6bf08d
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/menubar/Menubars.html
@@ -0,0 +1,32 @@
+<?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="http://artur-laptop.office.itmill.com:8888/" />
+<title>com.vaadin.tests.components.menubar.Menubars</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">com.vaadin.tests.components.menubar.Menubars</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.menubar.Menubars</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/menubar/Menubars.java b/tests/src/com/vaadin/tests/components/menubar/Menubars.java
new file mode 100644
index 0000000000..15c353b98a
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/menubar/Menubars.java
@@ -0,0 +1,126 @@
+package com.vaadin.tests.components.menubar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.tests.components.ComponentTestCase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.MenuBar;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.MenuBar.MenuItem;
+
+public class Menubars extends ComponentTestCase {
+
+ MenuBar menubar[] = new MenuBar[20];
+
+ @Override
+ protected void setup() {
+ super.setup();
+
+ MenuBar m;
+ m = createMenuBar("This is an undefined wide menubar with 3 items", 3);
+
+ m.setWidth(null);
+ addTestComponent(m);
+
+ m = createMenuBar(
+ "This is an undefined wide menubar with fixed 100px height (4 items)",
+ 4);
+ m.setWidth(null);
+ m.setHeight("100px");
+ addTestComponent(m);
+
+ m = createMenuBar("This is a 200px wide menubar with 10 items", 10);
+ m.setWidth("200px");
+ addTestComponent(m);
+
+ m = createMenuBar("This is a 200px wide menubar with 2 items", 2);
+ m.setWidth("200px");
+ addTestComponent(m);
+
+ m = createMenuBar("This is a 100% wide menubar with 3 items ", 3);
+ m.setWidth("100%");
+ addTestComponent(m);
+
+ m = createMenuBar("This is a 100% wide menubar with 40 items ", 40);
+ m.setWidth("100%");
+ addTestComponent(m);
+
+ m = createMenuBar(
+ "This is a 100% wide menubar with fixed 65px height (5 items). ",
+ 5);
+ m.setWidth("100%");
+ m.setHeight("65px");
+
+ addTestComponent(m);
+
+ }
+
+ private MenuBar createMenuBar(String text, int items) {
+ MenuBar m = new MenuBar();
+ m.setCaption(text);
+
+ for (int i = 1; i <= items; i++) {
+ MenuItem mi = m.addItem("Item " + i, null);
+ for (int j = 1; j <= items; j++) {
+ mi.addItem("Sub menu " + i + "/" + j, null);
+ }
+ }
+
+ return m;
+ }
+
+ @Override
+ protected String getDescription() {
+ return "A generic test for MenuBars in different configurations";
+ }
+
+ @Override
+ protected List<Component> createActions() {
+ ArrayList<Component> actions = new ArrayList<Component>();
+
+ CheckBox errorIndicators = new CheckBox("Error indicators",
+ new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ Button b = event.getButton();
+ boolean enabled = (Boolean) b.getValue();
+ setErrorIndicators(enabled);
+
+ }
+ });
+
+ CheckBox enabled = new CheckBox("Enabled", new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ Button b = event.getButton();
+ boolean enabled = (Boolean) b.getValue();
+ setEnabled(enabled);
+ }
+ });
+
+ CheckBox readonly = new CheckBox("Readonly",
+ new Button.ClickListener() {
+ public void buttonClick(ClickEvent event) {
+ Button b = event.getButton();
+ boolean enabled = (Boolean) b.getValue();
+ setReadOnly(enabled);
+ }
+ });
+
+ errorIndicators.setValue(new Boolean(false));
+ readonly.setValue(new Boolean(false));
+ enabled.setValue(new Boolean(true));
+
+ errorIndicators.setImmediate(true);
+ readonly.setImmediate(true);
+ enabled.setImmediate(true);
+
+ actions.add(errorIndicators);
+ actions.add(readonly);
+ actions.add(enabled);
+
+ return actions;
+ }
+
+}