aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur.signell@itmill.com>2010-02-23 10:17:00 +0000
committerArtur Signell <artur.signell@itmill.com>2010-02-23 10:17:00 +0000
commitd3d39ab75f25555ed1c58d6fe727d1d25d489a61 (patch)
tree166d5d26f182b45aa5f00f674e2466302aa27362
parent73ecd7f2a42e09868e4fd9c91073867c809836a2 (diff)
downloadvaadin-framework-d3d39ab75f25555ed1c58d6fe727d1d25d489a61.tar.gz
vaadin-framework-d3d39ab75f25555ed1c58d6fe727d1d25d489a61.zip
Merged [11391],[11473],[11474],[11475],[11477] from 6.2
Fix and test case for #4222 svn changeset:11485/svn branch:6.3
-rw-r--r--src/com/vaadin/ui/Table.java20
-rw-r--r--src/com/vaadin/ui/Window.java45
-rw-r--r--tests/src/com/vaadin/tests/server/components/TestWindow.java90
3 files changed, 145 insertions, 10 deletions
diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java
index 0563756d40..3804f8979e 100644
--- a/src/com/vaadin/ui/Table.java
+++ b/src/com/vaadin/ui/Table.java
@@ -36,14 +36,20 @@ import com.vaadin.terminal.gwt.client.ui.VScrollTable;
/**
* <p>
- * <code>TableComponent</code> is used for representing data or components in
- * pageable and selectable table.
+ * <code>Table</code> is used for representing data or components in a pageable
+ * and selectable table.
* </p>
*
* <p>
- * Note! Since version 5, components in Table will not have their caption nor
- * icon rendered. In order to workaround this limitation, wrap your component in
- * a Layout.
+ * Scalability of the Table is largely dictated by the container. A table does
+ * not have a limit for the number of items and is just as fast with hundreds of
+ * thousands of items as with just a few. The current GWT implementation with
+ * scrolling however limits the number of rows to around 500000, depending on
+ * the browser and the pixel height of rows.
+ * </p>
+ *
+ * <p>
+ * Components in a Table will not have their caption nor icon rendered.
* </p>
*
* @author IT Mill Ltd.
@@ -502,6 +508,8 @@ public class Table extends AbstractSelect implements Action.Container,
}
// Assures the visual refresh
+ // FIXME: Is this really needed? Header captions should not affect
+ // content so requestRepaint() should be sufficient.
resetPageBuffer();
refreshRenderedCells();
}
@@ -971,6 +979,8 @@ public class Table extends AbstractSelect implements Action.Container,
columnHeaders.put(propertyId, header);
// Assures the visual refresh
+ // FIXME: Is this really needed? Header captions should not affect
+ // content so requestRepaint() should be sufficient.
refreshRenderedCells();
}
diff --git a/src/com/vaadin/ui/Window.java b/src/com/vaadin/ui/Window.java
index 63daabdf90..f4657d81f6 100644
--- a/src/com/vaadin/ui/Window.java
+++ b/src/com/vaadin/ui/Window.java
@@ -1053,28 +1053,63 @@ public class Window extends Panel implements URIHandler, ParameterHandler {
}
}
+ /**
+ * An interface used for listening to Window close events. Add the
+ * CloseListener to a browser level window or a sub window and
+ * {@link CloseListener#windowClose(CloseEvent)} will be called whenever the
+ * user closes the window.
+ *
+ * <p>
+ * Note that removing windows using {@link #removeWindow(Window)} will not
+ * fire the CloseListener.
+ * </p>
+ */
public interface CloseListener extends Serializable {
+ /**
+ * Called when the user closes a window. Use
+ * {@link CloseEvent#getWindow()} to get a reference to the
+ * {@link Window} that was closed.
+ *
+ * @param e
+ * Event containing
+ */
public void windowClose(CloseEvent e);
}
/**
- * Adds the listener.
+ * Adds a CloseListener to the window.
+ *
+ * For a sub window the CloseListener is fired when the user closes it
+ * (clicks on the close button).
+ *
+ * For a browser level window the CloseListener is fired when the browser
+ * level window is closed. Note that closing a browser level window does not
+ * mean it will be destroyed.
+ *
+ * <p>
+ * Note that removing windows using {@link #removeWindow(Window)} will not
+ * fire the CloseListener.
+ * </p>
*
* @param listener
- * the listener to add.
+ * the CloseListener to add.
*/
public void addListener(CloseListener listener) {
addListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
}
/**
- * Removes the listener.
+ * Removes the CloseListener from the window.
+ *
+ * <p>
+ * For more information on CloseListeners see {@link CloseListener}.
+ * </p>
*
* @param listener
- * the listener to remove.
+ * the CloseListener to remove.
*/
public void removeListener(CloseListener listener) {
- addListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
+ removeListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
}
protected void fireClose() {
diff --git a/tests/src/com/vaadin/tests/server/components/TestWindow.java b/tests/src/com/vaadin/tests/server/components/TestWindow.java
new file mode 100644
index 0000000000..05604aba61
--- /dev/null
+++ b/tests/src/com/vaadin/tests/server/components/TestWindow.java
@@ -0,0 +1,90 @@
+package com.vaadin.tests.server.components;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+
+import com.vaadin.ui.Window;
+import com.vaadin.ui.Window.CloseEvent;
+import com.vaadin.ui.Window.CloseListener;
+import com.vaadin.ui.Window.ResizeEvent;
+import com.vaadin.ui.Window.ResizeListener;
+
+public class TestWindow extends TestCase {
+
+ private Window window;
+
+ @Override
+ protected void setUp() throws Exception {
+ window = new Window();
+ }
+
+ public void testCloseListener() {
+ CloseListener cl = EasyMock.createMock(Window.CloseListener.class);
+
+ // Expectations
+ cl.windowClose(EasyMock.isA(CloseEvent.class));
+
+ // Start actual test
+ EasyMock.replay(cl);
+
+ // Add listener and send a close event -> should end up in listener once
+ window.addListener(cl);
+ sendClose(window);
+
+ // Ensure listener was called once
+ EasyMock.verify(cl);
+
+ // Remove the listener and send close event -> should not end up in
+ // listener
+ window.removeListener(cl);
+ sendClose(window);
+
+ // Ensure listener still has been called only once
+ EasyMock.verify(cl);
+
+ }
+
+ public void testResizeListener() {
+ ResizeListener rl = EasyMock.createMock(Window.ResizeListener.class);
+
+ // Expectations
+ rl.windowResized(EasyMock.isA(ResizeEvent.class));
+
+ // Start actual test
+ EasyMock.replay(rl);
+
+ // Add listener and send a resize event -> should end up in listener
+ // once
+ window.addListener(rl);
+ sendResize(window);
+
+ // Ensure listener was called once
+ EasyMock.verify(rl);
+
+ // Remove the listener and send close event -> should not end up in
+ // listener
+ window.removeListener(rl);
+ sendResize(window);
+
+ // Ensure listener still has been called only once
+ EasyMock.verify(rl);
+
+ }
+
+ private void sendResize(Window window2) {
+ Map<String, Object> variables = new HashMap<String, Object>();
+ variables.put("height", 1234);
+ window.changeVariables(window, variables);
+
+ }
+
+ private static void sendClose(Window window) {
+ Map<String, Object> variables = new HashMap<String, Object>();
+ variables.put("close", true);
+ window.changeVariables(window, variables);
+ }
+}