diff options
-rw-r--r-- | WebContent/VAADIN/themes/reindeer/styles.css | 6 | ||||
-rw-r--r-- | WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet-normal-style.css | 2 | ||||
-rw-r--r-- | src/com/vaadin/data/Container.java | 34 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java | 5 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java | 14 | ||||
-rw-r--r-- | src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java | 101 | ||||
-rw-r--r-- | src/com/vaadin/ui/AbstractComponent.java | 1 | ||||
-rw-r--r-- | src/com/vaadin/ui/AbstractSelect.java | 7 | ||||
-rw-r--r-- | src/com/vaadin/ui/Tree.java | 7 | ||||
-rw-r--r-- | tests/src/com/vaadin/tests/components/button/Buttons.html | 32 | ||||
-rw-r--r-- | tests/src/com/vaadin/tests/components/button/Buttons.java | 12 | ||||
-rw-r--r-- | tests/src/com/vaadin/tests/components/menubar/Menubars.html | 32 | ||||
-rw-r--r-- | tests/src/com/vaadin/tests/components/menubar/Menubars.java | 126 |
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;
+ }
+
+}
|