diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2012-07-24 15:04:49 +0300 |
---|---|---|
committer | Johannes Dahlström <johannesd@vaadin.com> | 2012-07-24 15:04:49 +0300 |
commit | 52d8abf71b94fdc717d55bfdf2e2fa0fc29760a2 (patch) | |
tree | 43db695d51811c9205fefc4a14c3afa7ded87641 | |
parent | 0bac9d1a5616a181806a7cfa34ed2dadbba92fa9 (diff) | |
parent | b6ea64e917b69a80bd61c0541947fee8faf0e46c (diff) | |
download | vaadin-framework-52d8abf71b94fdc717d55bfdf2e2fa0fc29760a2.tar.gz vaadin-framework-52d8abf71b94fdc717d55bfdf2e2fa0fc29760a2.zip |
Merge branch '6.8'
Conflicts:
WebContent/VAADIN/themes/base/treetable/treetable.css
WebContent/release-notes.html
src/com/vaadin/terminal/gwt/client/VUIDLBrowser.java
src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java
13 files changed, 367 insertions, 36 deletions
diff --git a/WebContent/VAADIN/themes/base/table/table.css b/WebContent/VAADIN/themes/base/table/table.css index 653063ccb5..55728e3264 100644 --- a/WebContent/VAADIN/themes/base/table/table.css +++ b/WebContent/VAADIN/themes/base/table/table.css @@ -241,6 +241,11 @@ .v-off { color: #ddd; } + +.v-table .v-checkbox { + display: inline-block; +} + /************************************* * Drag'n'drop styles *************************************/ diff --git a/WebContent/VAADIN/themes/base/treetable/treetable.css b/WebContent/VAADIN/themes/base/treetable/treetable.css index de505ba774..4d9ad5031b 100644 --- a/WebContent/VAADIN/themes/base/treetable/treetable.css +++ b/WebContent/VAADIN/themes/base/treetable/treetable.css @@ -4,14 +4,17 @@ height: 10px; /* defines the amount of indent per level */ width: 18px; + position: absolute; + left: 0; + top: 5px; } .v-treetable-node-closed { - background: url(../treetable/img/arrow-right.png) right center no-repeat; + background: url(../treetable/img/arrow-right.png) right top no-repeat; } .v-treetable-node-open { - background: url(../treetable/img/arrow-down.png) right center no-repeat; + background: url(../treetable/img/arrow-down.png) right top no-repeat; } .v-treetable .v-checkbox { @@ -25,6 +28,10 @@ z-index: 10; } +.v-treetable .v-table-cell-wrapper { + position: relative; +} + .v-treetable .v-table-body .v-table-table .v-table-row-animating { zoom:1; z-index:1; diff --git a/WebContent/VAADIN/themes/reindeer/table/table.css b/WebContent/VAADIN/themes/reindeer/table/table.css index 9b78d86e34..5d67cfe564 100644 --- a/WebContent/VAADIN/themes/reindeer/table/table.css +++ b/WebContent/VAADIN/themes/reindeer/table/table.css @@ -112,9 +112,9 @@ text-shadow: #f3f5f8 0 1px 0; line-height: normal; } -.v-table-generated-row .v-table-cell-content { - padding-top: 1px; - padding-bottom: 2px; +.v-table-generated-row .v-table-cell-wrapper { + padding-top: 4px; + padding-bottom: 5px; } .v-table-cell-content:last-child { border-right-color: transparent; diff --git a/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java b/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java index 4050f1bafc..c8bebc2c66 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java +++ b/src/com/vaadin/terminal/gwt/client/ui/textfield/VTextField.java @@ -301,7 +301,7 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, if (!prompting && newText != null && !newText.equals(valueBeforeEdit)) { sendValueChange = immediate; - client.updateVariable(paintableId, "text", getText(), false); + client.updateVariable(paintableId, "text", newText, false); valueBeforeEdit = newText; valueBeforeEditIsSynced = true; } @@ -366,6 +366,11 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, @Override public void onBlur(BlurEvent event) { + // this is called twice on Chrome when e.g. changing tab while prompting + // field focused - do not change settings on the second time + if (focusedTextField != this) { + return; + } removeStyleDependentName(CLASSNAME_FOCUS); focusedTextField = null; String text = getText(); diff --git a/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java b/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java index 91e1fe2a3d..c03dff9507 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/treetable/VTreeTable.java @@ -97,7 +97,7 @@ public class VTreeTable extends VScrollTable { } class VTreeTableScrollBody extends VScrollTable.VScrollTableBody { - private int identWidth = -1; + private int indentWidth = -1; VTreeTableScrollBody() { super(); @@ -165,7 +165,7 @@ public class VTreeTable extends VScrollTable { container.insertFirst(treeSpacer); depth = rowUidl.hasAttribute("depth") ? rowUidl .getIntAttribute("depth") : 0; - setIdent(); + setIndent(); isTreeCellAdded = true; return true; } @@ -202,18 +202,19 @@ public class VTreeTable extends VScrollTable { } - private void setIdent() { - if (getIdentWidth() > 0 && depth != 0) { - treeSpacer.getStyle().setWidth( - (depth + 1) * getIdentWidth(), Unit.PX); + private void setIndent() { + if (getIndentWidth() > 0) { + treeSpacer.getParentElement().getStyle() + .setPaddingLeft(getIndent(), Unit.PX); + treeSpacer.getStyle().setWidth(getIndent(), Unit.PX); } } @Override protected void onAttach() { super.onAttach(); - if (getIdentWidth() < 0) { - detectIdent(this); + if (getIndentWidth() < 0) { + detectIndent(this); } } @@ -227,6 +228,19 @@ public class VTreeTable extends VScrollTable { return consumedSpace; } + @Override + protected void setCellWidth(int cellIx, int width) { + if (cellIx == colIndexOfHierarchy + (showRowHeaders ? 1 : 0)) { + // take indentation padding into account if this is the + // hierarchy column + width = Math.max(width - getIndent(), 0); + } + super.setCellWidth(cellIx, width); + } + + private int getIndent() { + return (depth + 1) * getIndentWidth(); + } } protected class VTreeTableGeneratedRow extends VTreeTableRow { @@ -354,20 +368,20 @@ public class VTreeTable extends VScrollTable { } } - private int getIdentWidth() { - return identWidth; + private int getIndentWidth() { + return indentWidth; } - private void detectIdent(VTreeTableRow vTreeTableRow) { - identWidth = vTreeTableRow.treeSpacer.getOffsetWidth(); - if (identWidth == 0) { - identWidth = -1; + private void detectIndent(VTreeTableRow vTreeTableRow) { + indentWidth = vTreeTableRow.treeSpacer.getOffsetWidth(); + if (indentWidth == 0) { + indentWidth = -1; return; } Iterator<Widget> iterator = iterator(); while (iterator.hasNext()) { VTreeTableRow next = (VTreeTableRow) iterator.next(); - next.setIdent(); + next.setIndent(); } } diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 274d648d79..e89f48f201 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -1587,9 +1587,10 @@ public class Table extends AbstractSelect implements Action.Container, // Collects the basic facts about the table page final int pagelen = getPageLength(); - int firstIndex = getCurrentPageFirstItemIndex(); int rows, totalRows; rows = totalRows = size(); + int firstIndex = Math + .min(getCurrentPageFirstItemIndex(), totalRows - 1); if (rows > 0 && firstIndex >= 0) { rows -= firstIndex; } diff --git a/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java new file mode 100644 index 0000000000..7009d03f77 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/popupview/PopupViewClickShortcut.java @@ -0,0 +1,75 @@ +package com.vaadin.tests.components.popupview; + +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.event.ShortcutAction.ModifierKey; +import com.vaadin.tests.components.TestBase; +import com.vaadin.tests.util.Log; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.Layout; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PopupViewClickShortcut extends TestBase { + + private Window sub = new Window("Table", makeTable("Subwindow", KeyCode.S)); + + private Log log = new Log(5); + + @Override + protected void setup() { + sub.center(); + getMainWindow().addWindow(sub); + addComponent(log); + addComponent(new PopupView("Show popup table", makeTable("Popup", + KeyCode.P))); + addComponent(makeTable("Main window", KeyCode.M)); + sub.addComponent(new PopupView("Show popup table", makeTable( + "Subwindow popup", KeyCode.U))); + } + + private ComponentContainer makeTable(final String caption, int keyCode) { + final Table t = new Table(); + t.setSelectable(true); + t.setHeight("200px"); + t.setWidth("200px"); + t.addContainerProperty("foo", String.class, "foo"); + for (int i = 0; i < 5; i++) { + t.addItem(new String[] { "foo " + i }, i); + } + + final Layout l = new VerticalLayout(); + l.setCaption(caption); + l.setWidth(null); + + Button b = new Button("Submit " + caption, new Button.ClickListener() { + private int i = 5; + + public void buttonClick(ClickEvent event) { + log.log("Submitted from " + + event.getButton().getParent().getCaption()); + t.addItem(new String[] { "added " + i++ }, i); + } + }); + b.setClickShortcut(keyCode, ModifierKey.ALT); + + l.addComponent(t); + l.addComponent(b); + + return l; + } + + @Override + protected String getDescription() { + return "Enter ClickShortcut does not work with PopupView"; + } + + @Override + protected Integer getTicketNumber() { + return 8193; + } + +} diff --git a/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.html b/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.html new file mode 100644 index 0000000000..8d46523c40 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.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>SelectableEditable</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">SelectableEditable</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.table.SelectableEditable?restartApplication</td> + <td></td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentstableSelectableEditable::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[1]/domChild[0]</td> + <td>70,12</td> +</tr> +<tr> + <td>assertCSSClass</td> + <td>vaadin=runcomvaadintestscomponentstableSelectableEditable::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]</td> + <td>v-selected</td> +</tr> + +</tbody></table> +</body> +</html> diff --git a/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.java b/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.java new file mode 100644 index 0000000000..2b33c71d2a --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/SelectableEditable.java @@ -0,0 +1,37 @@ +package com.vaadin.tests.components.table; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Table; + +public class SelectableEditable extends TestBase { + + @Override + protected void setup() { + // TODO Auto-generated method stub + + final Table table = new Table(); + table.setWidth("500px"); + table.setSelectable(true); + table.setEditable(true); + + table.addContainerProperty("name", String.class, null); + table.addContainerProperty("alive", Boolean.class, false); + for (int i = 0; i < 10; ++i) { + table.addItem(new Object[] { "Person " + i, false }, i); + } + + addComponent(table); + } + + @Override + protected String getDescription() { + // TODO Auto-generated method stub + return "It is difficult to select rows of an editable Table, especially columns with checkboxes."; + } + + @Override + protected Integer getTicketNumber() { + // TODO Auto-generated method stub + return 9064; + } +} diff --git a/tests/testbench/com/vaadin/tests/components/treetable/AddNodesOnExpand.java b/tests/testbench/com/vaadin/tests/components/treetable/AddNodesOnExpand.java index ae12d46988..f6b32aa4a9 100644 --- a/tests/testbench/com/vaadin/tests/components/treetable/AddNodesOnExpand.java +++ b/tests/testbench/com/vaadin/tests/components/treetable/AddNodesOnExpand.java @@ -23,7 +23,8 @@ public class AddNodesOnExpand extends TestBase { Object openedItemId = event.getItemId(); if (!treetable.hasChildren(openedItemId)) { for (int j = 0; j < 3; j++) { - treetable.addItem(openedItemId + "-" + j); + treetable.addItem(new String[] { "Subitem " + j }, + openedItemId + "-" + j); treetable.setParent(openedItemId + "-" + j, openedItemId); } @@ -39,7 +40,7 @@ public class AddNodesOnExpand extends TestBase { }); for (int i = 0; i < 3; i++) { - treetable.addItem(Integer.valueOf(i)); + treetable.addItem(new String[] { "Item " + i }, Integer.valueOf(i)); } addComponent(treetable); diff --git a/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.html b/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.html new file mode 100644 index 0000000000..05c5986e6b --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.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>ComponentsInTreeTable</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">ComponentsInTreeTable</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.treetable.ComponentsInTreeTable?restartApplication</td> + <td></td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentstreetableComponentsInTreeTable::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTreeTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]</td> + <td>15,7</td> +</tr> +<tr> + <td>screenCapture</td> + <td></td> + <td></td> +</tr> + +</tbody></table> +</body> +</html> diff --git a/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.java b/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.java index 5b7700bc6e..8ff80204cc 100644 --- a/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.java +++ b/tests/testbench/com/vaadin/tests/components/treetable/ComponentsInTreeTable.java @@ -7,6 +7,7 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; import com.vaadin.ui.TreeTable; +import com.vaadin.ui.VerticalLayout; public class ComponentsInTreeTable extends TestBase { @@ -14,28 +15,28 @@ public class ComponentsInTreeTable extends TestBase { protected void setup() { TreeTable tt = new TreeTable(); tt.setWidth("300px"); + tt.setHeight("300px"); addComponent(tt); - Object id, id2; + tt.addContainerProperty("component", Component.class, ""); + tt.addContainerProperty("type", String.class, "bar"); - tt.addContainerProperty("foo", Component.class, ""); - tt.addContainerProperty("bar", String.class, "bar"); - tt.addContainerProperty("baz", String.class, "baz"); - - id = tt.addItem(); Layout l = new HorizontalLayout(); l.addComponent(new Label("bar")); l.addComponent(new Label("bar")); - tt.getContainerProperty(id, "foo").setValue(l); + tt.addItem(new Object[] { l, "HorizontalLayout" }, 1); + + l = new VerticalLayout(); + l.addComponent(new Label("baz")); + l.addComponent(new Label("baz")); + tt.addItem(new Object[] { l, "VerticalLayout" }, 2); - id = tt.addItem(); Label lbl = new Label("<b>foo</b><br/><i>bar</i>"); lbl.setContentMode(Label.CONTENT_XHTML); - tt.getContainerProperty(id, "foo").setValue(lbl); + tt.addItem(new Object[] { lbl, "Label" }, 3); - id2 = tt.addItem(); - tt.setParent(id2, id); - tt.getContainerProperty(id2, "foo").setValue(new Button("Test")); + tt.addItem(new Object[] { new Button("Test"), "Button" }, 4); + tt.setParent(4, 3); } @Override diff --git a/tests/testbench/com/vaadin/tests/tickets/Ticket8291.java b/tests/testbench/com/vaadin/tests/tickets/Ticket8291.java new file mode 100644 index 0000000000..86b5db953b --- /dev/null +++ b/tests/testbench/com/vaadin/tests/tickets/Ticket8291.java @@ -0,0 +1,121 @@ +package com.vaadin.tests.tickets; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.vaadin.Application; +import com.vaadin.data.Container.Filter; +import com.vaadin.data.Item; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.Window; + +/** + * Test for #8291 and #7666: NegativeArraySizeException when Table scrolled to + * the end and its size reduced. + */ +public class Ticket8291 extends Application { + + @Override + public void init() { + setMainWindow(new Window("", new TestView())); + } + + private static class DecimateFilter implements Filter { + public boolean passesFilter(Object itemId, Item item) + throws UnsupportedOperationException { + return ((((TestObject) itemId).property3 % 10) == 0); + } + + public boolean appliesToProperty(Object propertyId) { + return true; + } + } + + private static class TestView extends HorizontalLayout { + + private Filter filter = null; + + private boolean reduceData; + + private TestView() { + final Table table = new Table(); + List<TestObject> data = createData(1000); + final BeanItemContainer<TestObject> container = new BeanItemContainer<TestObject>( + TestObject.class, data) { + + @Override + public int size() { + if (reduceData) { + return 100; + } else { + return super.size(); + } + } + }; + table.setContainerDataSource(container); + addComponent(table); + Button button = new Button("Click"); + button.addListener(new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + reduceData = !reduceData; + table.refreshRowCache(); + } + }); + addComponent(button); + Button button2 = new Button("Filter"); + button2.addListener(new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + if (filter != null) { + container.removeAllContainerFilters(); + filter = null; + } else { + filter = new DecimateFilter(); + container.addContainerFilter(filter); + } + table.refreshRowCache(); + } + }); + addComponent(button2); + } + } + + private static List<TestObject> createData(int count) { + ArrayList<TestObject> data = new ArrayList<TestObject>(count); + for (int i = 0; i < count; i++) { + data.add(new TestObject("string-" + i, new Date(), i)); + } + return data; + } + + public static class TestObject { + + private String property1; + private Date property2; + private Integer property3; + + public TestObject(String property1, Date property2, Integer property3) { + this.property1 = property1; + this.property2 = property2; + this.property3 = property3; + } + + public String getProperty1() { + return property1; + } + + public Date getProperty2() { + return property2; + } + + public Integer getProperty3() { + return property3; + } + + } + +} |