]> source.dussan.org Git - vaadin-framework.git/commitdiff
VScrollTable: If multiple rows selected and drag starts on selected row, client side...
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 9 Mar 2010 09:26:36 +0000 (09:26 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Tue, 9 Mar 2010 09:26:36 +0000 (09:26 +0000)
svn changeset:11700/svn branch:6.3

WebContent/VAADIN/themes/base/common/common.css
WebContent/VAADIN/themes/base/styles.css
WebContent/VAADIN/themes/base/table/table.css
WebContent/VAADIN/themes/reindeer/styles.css
WebContent/VAADIN/themes/reindeer/table/table.css
WebContent/VAADIN/themes/runo/styles.css
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java
src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java
tests/src/com/vaadin/tests/dd/DDTest4.java

index 336fe828a28ce8ca0448e74fa46dcc13f0e29f81..d14eb2fa8dcf76f478abf8e8d5d430ec1b71a8a0 100644 (file)
@@ -225,9 +225,8 @@ div.v-app-loading {
 .v-drag-element {
        z-index:60000;
        position:absolute;
-    opacity: 0.4;
-    filter: alpha(opacity=40);
-    border: 1px solid #999;
+    opacity: 0.5;
+    filter: alpha(opacity=50);
 }
 
 .v-ddwrapper {
index ae67ae2a7a0980c209f5cd77245502f09669523e..34dcf7e57094f8a9416a74283869593b62c76170 100644 (file)
@@ -1,5 +1,5 @@
-.v-theme-version:after {content:"6_3_0_dev-20100305";}
-.v-theme-version-6_3_0_dev-20100305 {display: none;}
+.v-theme-version:after {content:"6_3_0_dev-20100309";}
+.v-theme-version-6_3_0_dev-20100309 {display: none;}
 /* Automatically compiled css file from subdirectories. */
 
 .v-absolutelayout-wrapper {
@@ -455,9 +455,8 @@ div.v-app-loading {
 .v-drag-element {
        z-index:60000;
        position:absolute;
-    opacity: 0.4;
-    filter: alpha(opacity=40);
-    border: 1px solid #999;
+    opacity: 0.5;
+    filter: alpha(opacity=50);
 }
 
 .v-ddwrapper {
@@ -1429,17 +1428,23 @@ div.v-progressindicator-indeterminate-disabled {
        color: #ddd;
 }
 
-/* TODO remove important, replace with better anchors or order */
 .v-table-row-drag-middle .v-table-cell-content {
        background-color: cyan;
 }
-/* TODO consider using height neutral styling (scrollbar issues when pagelength = table.length ) */
 .v-table-row-drag-top .v-table-cell-content {
        border-top: 1px solid cyan ;
 }
+.v-table-row-drag-top .v-table-cell-wrapper {
+       margin-top: -1px; /* compensate the space consumed by border hint */
+}
 .v-table-row-drag-bottom .v-table-cell-content {
        border-bottom: 1px solid cyan;
 }
+.v-table-row-drag-bottom .v-table-cell-wrapper {
+       margin-bottom: -1px; /* compensate the space consumed by border hint */
+}
+
+
 
 
 .v-tabsheet,
index e26d3aa22c6259e5ece3ee51aa52dd3413f473ea..783fec6604fc77546473db44990c3115534eed74 100644 (file)
        color: #ddd;
 }
 
-/* TODO remove important, replace with better anchors or order */
 .v-table-row-drag-middle .v-table-cell-content {
        background-color: cyan;
 }
-/* TODO consider using height neutral styling (scrollbar issues when pagelength = table.length ) */
 .v-table-row-drag-top .v-table-cell-content {
        border-top: 1px solid cyan ;
 }
+.v-table-row-drag-top .v-table-cell-wrapper {
+       margin-top: -1px; /* compensate the space consumed by border hint */
+}
 .v-table-row-drag-bottom .v-table-cell-content {
        border-bottom: 1px solid cyan;
 }
+.v-table-row-drag-bottom .v-table-cell-wrapper {
+       margin-bottom: -1px; /* compensate the space consumed by border hint */
+}
+
+
 
index 60451c64c720beecd3fa7915fcfb2d2b05d37fe5..be4a7bb11b53816df0b9de4d3af008a46e4d821c 100644 (file)
@@ -1,5 +1,5 @@
-.v-theme-version:after {content:"6_3_0_dev-20100305";}
-.v-theme-version-6_3_0_dev-20100305 {display: none;}
+.v-theme-version:after {content:"6_3_0_dev-20100309";}
+.v-theme-version-6_3_0_dev-20100309 {display: none;}
 /* Automatically compiled css file from subdirectories. */
 
 .v-absolutelayout-wrapper {
@@ -455,9 +455,8 @@ div.v-app-loading {
 .v-drag-element {
        z-index:60000;
        position:absolute;
-    opacity: 0.4;
-    filter: alpha(opacity=40);
-    border: 1px solid #999;
+    opacity: 0.5;
+    filter: alpha(opacity=50);
 }
 
 .v-ddwrapper {
@@ -1429,17 +1428,23 @@ div.v-progressindicator-indeterminate-disabled {
        color: #ddd;
 }
 
-/* TODO remove important, replace with better anchors or order */
 .v-table-row-drag-middle .v-table-cell-content {
        background-color: cyan;
 }
-/* TODO consider using height neutral styling (scrollbar issues when pagelength = table.length ) */
 .v-table-row-drag-top .v-table-cell-content {
        border-top: 1px solid cyan ;
 }
+.v-table-row-drag-top .v-table-cell-wrapper {
+       margin-top: -1px; /* compensate the space consumed by border hint */
+}
 .v-table-row-drag-bottom .v-table-cell-content {
        border-bottom: 1px solid cyan;
 }
+.v-table-row-drag-bottom .v-table-cell-wrapper {
+       margin-bottom: -1px; /* compensate the space consumed by border hint */
+}
+
+
 
 
 .v-tabsheet,
@@ -4161,6 +4166,8 @@ td.v-datefield-calendarpanel-nextyear {
        border: none;
 }
 
+
+
 /* These styles get catenated together on build */
 
 /* Default Tabsheet styles */
index 87a72f2f4a507e0f145275bcb12ec7592fbb77b5..623a7712187e7a31fc0dbd65d89e26b1350ef390 100644 (file)
 .v-table-borderless .v-table-header-wrap,
 .v-table-borderless .v-table-body {
        border: none;
-}
\ No newline at end of file
+}
+
+
index 493a7ea8eb884aecc07ca6e1e38e9a486c76a1a2..caa62af1a2895f55fe47110f4fe470fbfe354b9a 100644 (file)
@@ -1,5 +1,5 @@
-.v-theme-version:after {content:"6_3_0_dev-20100305";}
-.v-theme-version-6_3_0_dev-20100305 {display: none;}
+.v-theme-version:after {content:"6_3_0_dev-20100309";}
+.v-theme-version-6_3_0_dev-20100309 {display: none;}
 /* Automatically compiled css file from subdirectories. */
 
 .v-absolutelayout-wrapper {
@@ -455,9 +455,8 @@ div.v-app-loading {
 .v-drag-element {
        z-index:60000;
        position:absolute;
-    opacity: 0.4;
-    filter: alpha(opacity=40);
-    border: 1px solid #999;
+    opacity: 0.5;
+    filter: alpha(opacity=50);
 }
 
 .v-ddwrapper {
@@ -1429,17 +1428,23 @@ div.v-progressindicator-indeterminate-disabled {
        color: #ddd;
 }
 
-/* TODO remove important, replace with better anchors or order */
 .v-table-row-drag-middle .v-table-cell-content {
        background-color: cyan;
 }
-/* TODO consider using height neutral styling (scrollbar issues when pagelength = table.length ) */
 .v-table-row-drag-top .v-table-cell-content {
        border-top: 1px solid cyan ;
 }
+.v-table-row-drag-top .v-table-cell-wrapper {
+       margin-top: -1px; /* compensate the space consumed by border hint */
+}
 .v-table-row-drag-bottom .v-table-cell-content {
        border-bottom: 1px solid cyan;
 }
+.v-table-row-drag-bottom .v-table-cell-wrapper {
+       margin-bottom: -1px; /* compensate the space consumed by border hint */
+}
+
+
 
 
 .v-tabsheet,
index 53f0033bcdc3cea5efa29a2184b34e05b9930808..0cbb3d73e378e9b13ce02201cec520a88eee1f06 100644 (file)
@@ -17,6 +17,7 @@ import com.google.gwt.dom.client.NodeList;
 import com.google.gwt.dom.client.TableCellElement;
 import com.google.gwt.dom.client.TableRowElement;
 import com.google.gwt.dom.client.TableSectionElement;
+import com.google.gwt.dom.client.Style.Visibility;
 import com.google.gwt.event.dom.client.ScrollEvent;
 import com.google.gwt.event.dom.client.ScrollHandler;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
@@ -2522,7 +2523,29 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
                                 // TODO propertyId
                                 VDragEvent ev = VDragAndDropManager.get()
                                         .startDrag(transferable, event, true);
-                                ev.createDragImage(getElement(), true);
+                                if (selectMode == SELECT_MODE_MULTI
+                                        && selectedRowKeys
+                                                .contains("" + rowKey)) {
+                                    ev.createDragImage(
+                                            (Element) scrollBody.tBodyElement
+                                                    .cast(), true);
+                                    Element dragImage = ev.getDragImage();
+                                    int i = 0;
+                                    for (Iterator<Widget> iterator = scrollBody
+                                            .iterator(); iterator.hasNext();) {
+                                        VScrollTableRow next = (VScrollTableRow) iterator
+                                                .next();
+                                        Element child = (Element) dragImage
+                                                .getChild(i++);
+                                        if (!selectedRowKeys.contains(""
+                                                + next.rowKey)) {
+                                            child.getStyle().setVisibility(
+                                                    Visibility.HIDDEN);
+                                        }
+                                    }
+                                } else {
+                                    ev.createDragImage(getElement(), true);
+                                }
                                 event.preventDefault();
                                 event.stopPropagation();
                             }
@@ -3272,5 +3295,5 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
     public void onValueChange(ValueChangeEvent<String> arg0) {
         client.getContextMenu().hide();
     }
-    
+
 }
index 21129e0b519bb7c2898851bbf9f74b4722f133d3..2e3ddf72d3ccd01bd4b53ed57ff5488187ad5172 100644 (file)
@@ -599,6 +599,10 @@ public class VDragAndDropManager {
         }
     }
 
+    Element getDragElement() {
+        return dragElement;
+    }
+
     private final Timer lazyAttachDragElement = new Timer() {
 
         @Override
index 3b94fcb606624784b548298c1080dad92648ff3c..5e5d3326caf54240cf139800e24399bf1637673e 100644 (file)
@@ -148,7 +148,14 @@ public class VDragEvent {
         element.getStyle().setMarginLeft(offsetX, Unit.PX);
         element.getStyle().setMarginTop(offsetY, Unit.PX);
         VDragAndDropManager.get().setDragElement(element);
+    }
 
+    /**
+     * @return the current Element used as a drag image (aka drag proxy) or null
+     *         if drag image is not currently set for this drag operation.
+     */
+    public Element getDragImage() {
+        return (Element) VDragAndDropManager.get().getDragElement();
     }
 
     /**
index f2f0ab73d7c166ffc5f02f7c9d4924830664273b..f10d7b7c391e9737cef662dc8ae36a0920a1db1a 100644 (file)
@@ -1,5 +1,7 @@
 package com.vaadin.tests.dd;
 
+import java.util.Collection;
+
 import com.vaadin.data.Item;
 import com.vaadin.data.util.IndexedContainer;
 import com.vaadin.demo.tutorial.addressbook.data.Person;
@@ -34,8 +36,11 @@ public class DDTest4 extends TestBase {
                         w,
                         ".v-table-row-drag-middle .v-table-cell-content {"
                                 + "        background-color: inherit ; border-bottom: 1px solid cyan;"
-                                + "}");
-        /* darn reindeer has no icons */
+                                + "}"
+                                + ".v-table-row-drag-middle .v-table-cell-wrapper {"
+                                + "        margin-bottom: -1px;" + "}" + ""
+
+                );
 
         // hl.addComponent(tree1);
         hl.addComponent(table);
@@ -47,6 +52,7 @@ public class DDTest4 extends TestBase {
         table.setPageLength(10);
         table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
         table.setSelectable(true);
+        table.setMultiSelect(true);
         populateTable();
         addComponent(hl);
 
@@ -78,25 +84,45 @@ public class DDTest4 extends TestBase {
                 // IndexedContainer goodies... (hint: don't use it in real apps)
                 IndexedContainer containerDataSource = (IndexedContainer) table
                         .getContainerDataSource();
-                IndexedContainer clone = null;
+                int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
+                if (dropTargetData.getDropLocation() != VerticalDropLocation.TOP) {
+                    newIndex++;
+                }
+                if (newIndex < 0) {
+                    newIndex = 0;
+                }
+                Object idAfter = containerDataSource.getIdByIndex(newIndex);
+                Collection selections = (Collection) table.getValue();
+                if (selections != null && selections.contains(itemId)) {
+                    // dragged a selected item, if multiple rows selected, drag
+                    // them too (functionality similar to apple mail)
+                    for (Object object : selections) {
+                        moveAfter(containerDataSource, object, idAfter);
+                    }
+
+                } else {
+                    // move just the dragged row, not considering selection at
+                    // all
+                    moveAfter(containerDataSource, itemId, idAfter);
+                }
+
+            }
+
+            private void moveAfter(IndexedContainer containerDataSource,
+                    Object itemId, Object idAfter) {
                 try {
+                    IndexedContainer clone = null;
                     clone = (IndexedContainer) containerDataSource.clone();
-                    int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
-                    if (dropTargetData.getDropLocation() != VerticalDropLocation.TOP) {
-                        newIndex++;
-                    }
-                    if (newIndex < 0) {
-                        newIndex = 0;
-                    }
                     containerDataSource.removeItem(itemId);
-                    Item newItem = containerDataSource.addItemAt(newIndex,
+                    Item newItem = containerDataSource.addItemAfter(idAfter,
                             itemId);
-
                     Item item = clone.getItem(itemId);
                     for (Object propId : item.getItemPropertyIds()) {
                         newItem.getItemProperty(propId).setValue(
                                 item.getItemProperty(propId).getValue());
                     }
+
+                    // TODO Auto-generated method stub
                 } catch (CloneNotSupportedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();