]> source.dussan.org Git - vaadin-framework.git/commitdiff
Force-table-to-recalculate-column-widths feature. Fixes #1983 (see ticket for more)
authorMarc Englund <marc.englund@itmill.com>
Thu, 11 Sep 2008 12:44:33 +0000 (12:44 +0000)
committerMarc Englund <marc.englund@itmill.com>
Thu, 11 Sep 2008 12:44:33 +0000 (12:44 +0000)
svn changeset:5389/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java
src/com/itmill/toolkit/tests/tickets/Ticket1983.java
src/com/itmill/toolkit/ui/Table.java

index 0d576af198c1ac0884ffc1809c8407dfe2e0e015..4b9e6051afdbfb6bc711f21777c4c092d48656fd 100644 (file)
@@ -131,6 +131,13 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
     private int oldAvailPixels;
     private boolean emitClickEvents;
 
+    /*
+     * Read from the "recalcWidths" -attribute. When it is true, the table will
+     * recalculate the widths for columns - desirable in some cases. For #1983,
+     * marked experimental.
+     */
+    boolean recalcWidths = false;
+
     public IScrollTable() {
 
         bodyContainer.addScrollListener(this);
@@ -170,6 +177,8 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
             totalRows = newTotalRows;
         }
 
+        recalcWidths = uidl.hasAttribute("recalcWidths");
+
         pageLength = uidl.getIntAttribute("pagelength");
         if (pageLength == 0) {
             pageLength = totalRows;
@@ -245,7 +254,7 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
         }
         updateHeader(uidl.getStringArrayAttribute("vcolorder"));
 
-        if (initializedAndAttached) {
+        if (!recalcWidths && initializedAndAttached) {
             updateBody(rowData, uidl.getIntAttribute("firstrow"), uidl
                     .getIntAttribute("rows"));
         } else {
@@ -973,10 +982,15 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
                 DOM.setStyleAttribute(captionContainer, "overflow", "");
             }
             width = w;
-            DOM.setStyleAttribute(captionContainer, "width", (w
-                    - DRAG_WIDGET_WIDTH - 4)
-                    + "px");
-            setWidth(w + "px");
+            if (w == -1) {
+                DOM.setStyleAttribute(captionContainer, "width", "");
+                setWidth("");
+            } else {
+                DOM.setStyleAttribute(captionContainer, "width", (w
+                        - DRAG_WIDGET_WIDTH - 4)
+                        + "px");
+                setWidth(w + "px");
+            }
         }
 
         public int getWidth() {
@@ -1323,6 +1337,8 @@ public class IScrollTable extends Composite implements Table, ScrollListener,
                 if (col.hasAttribute("width")) {
                     final String width = col.getStringAttribute("width");
                     c.setWidth(Integer.parseInt(width));
+                } else if (recalcWidths) {
+                    c.setWidth(-1);
                 }
             }
             // check for orphaned header cells
index 0948cb89c20235de3d0cc6abfe06b8bc2e8bcd8c..f8fafedbfdebac8d24ed06cadf875a0b20f999c7 100644 (file)
@@ -9,6 +9,7 @@ import com.itmill.toolkit.ui.OrderedLayout;
 import com.itmill.toolkit.ui.SplitPanel;
 import com.itmill.toolkit.ui.Table;
 import com.itmill.toolkit.ui.Window;
+import com.itmill.toolkit.ui.Button.ClickEvent;
 
 /**
  * Test class for ticket 1983
@@ -23,6 +24,9 @@ public class Ticket1983 extends Application {
 
     private static class TestLayout extends SplitPanel {
         boolean isLong = true;
+        final Table table = new MyTable();
+        final String propId = "col";
+        final String propId2 = "col2";
 
         public TestLayout() {
             super(ORIENTATION_HORIZONTAL);
@@ -44,13 +48,26 @@ public class Ticket1983 extends Application {
             leftSide.setHeight("100%");
 
             final IndexedContainer dataSource = new IndexedContainer();
-            final String propId = "col";
             dataSource.addContainerProperty(propId, String.class, null);
+            dataSource.addContainerProperty(propId2, String.class, null);
             final Object itemId = dataSource.addItem();
             dataSource.getItem(itemId).getItemProperty(propId).setValue(
                     "Very long value that makes a scrollbar appear for sure");
+            dataSource.getItem(itemId).getItemProperty(propId2).setValue(
+                    "Very long value that makes a scrollbar appear for sure");
+
+            for (int i = 0; i < 150; i++) {
+                Object id = dataSource.addItem();
+                dataSource
+                        .getItem(id)
+                        .getItemProperty(propId)
+                        .setValue(
+                                (i == 100 ? "Very long value that makes a scrollbar appear for sure"
+                                        : "Short"));
+                dataSource.getItem(id).getItemProperty(propId2).setValue(
+                        "Short");
+            }
 
-            final Table table = new Table();
             table.setSizeFull();
             table.setContainerDataSource(dataSource);
             table.setVisibleColumns(new Object[] { propId });
@@ -65,6 +82,8 @@ public class Ticket1983 extends Application {
                     if (isLong) {
                         dataSource.getItem(itemId).getItemProperty(propId)
                                 .setValue("Short value");
+                        dataSource.getItem(itemId).getItemProperty(propId2)
+                                .setValue("Short value");
                         isLong = false;
                     } else {
                         dataSource
@@ -72,15 +91,47 @@ public class Ticket1983 extends Application {
                                 .getItemProperty(propId)
                                 .setValue(
                                         "Very long value that makes a scrollbar appear for sure");
+                        dataSource
+                                .getItem(itemId)
+                                .getItemProperty(propId2)
+                                .setValue(
+                                        "Very long value that makes a scrollbar appear for sure");
                         isLong = true;
                     }
                     // Works the same way with or without repaint request
                     table.requestRepaint();
                 }
             });
-            leftSide.setFirstComponent(button);
+
+            OrderedLayout ol = new OrderedLayout();
+            ol.addComponent(button);
+            leftSide.setFirstComponent(ol);
+
+            button = new Button("Two col");
+            button.addListener(new Button.ClickListener() {
+                public void buttonClick(ClickEvent event) {
+                    Button b = event.getButton();
+                    if (((Boolean) b.getValue()).booleanValue()) {
+                        table
+                                .setVisibleColumns(new Object[] { propId,
+                                        propId2 });
+                    } else {
+                        table.setVisibleColumns(new Object[] { propId });
+                    }
+
+                }
+
+            });
+            button.setSwitchMode(true);
+            ol.addComponent(button);
 
             return leftSide;
         }
     }
+
+    static class MyTable extends Table {
+        MyTable() {
+            alwaysRecalculateColumnWidths = true;
+        }
+    }
 }
index 0d22f641adf85728a0a30172d085d34f92f4cca9..d9421395f583d786e6167d6bac38cd9292ff0725 100644 (file)
@@ -312,6 +312,12 @@ public class Table extends AbstractSelect implements Action.Container,
 
     private int clickListenerCount;
 
+    /*
+     * EXPERIMENTAL feature: will tell the client to re-calculate column widths
+     * if set to true. Currently no setter: extend to enable.
+     */
+    protected boolean alwaysRecalculateColumnWidths = false;
+
     /* Table constructors */
 
     /**
@@ -1795,6 +1801,13 @@ public class Table extends AbstractSelect implements Action.Container,
             rows = reqRowsToPaint;
         } else {
             rows = cells[0].length;
+            if (alwaysRecalculateColumnWidths) {
+                // TODO experimental feature for now: tell the client to
+                // recalculate column widths.
+                // We'll only do this for paints that do not originate from
+                // table scroll/cache requests (i.e when reqRowsToPaint<0)
+                target.addAttribute("recalcWidths", true);
+            }
         }
 
         if (!isNullSelectionAllowed() && getNullSelectionItemId() != null