svn changeset:10693/svn branch:6.3tags/6.7.0.beta1
@@ -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; | |||
} | |||
@@ -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; | |||
} |
@@ -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 | |||
*/ |
@@ -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>(); |
@@ -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); |
@@ -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; |
@@ -315,6 +315,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource | |||
*/ | |||
public void setLocale(Locale locale) { | |||
this.locale = locale; | |||
requestRepaint(); | |||
} | |||
/* |
@@ -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) |
@@ -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); | |||
} | |||
} |
@@ -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> |
@@ -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) { |
@@ -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> |
@@ -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; | |||
} | |||
} |