From: Matti Tahvonen Date: Tue, 9 Mar 2010 09:26:36 +0000 (+0000) Subject: VScrollTable: If multiple rows selected and drag starts on selected row, client side... X-Git-Tag: 6.7.0.beta1~1980 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=462fe69681fce7e654efb47807cc6c8c83ba62f8;p=vaadin-framework.git VScrollTable: If multiple rows selected and drag starts on selected row, client side now hints that all those rows are dragged. svn changeset:11700/svn branch:6.3 --- diff --git a/WebContent/VAADIN/themes/base/common/common.css b/WebContent/VAADIN/themes/base/common/common.css index 336fe828a2..d14eb2fa8d 100644 --- a/WebContent/VAADIN/themes/base/common/common.css +++ b/WebContent/VAADIN/themes/base/common/common.css @@ -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 { diff --git a/WebContent/VAADIN/themes/base/styles.css b/WebContent/VAADIN/themes/base/styles.css index ae67ae2a7a..34dcf7e570 100644 --- a/WebContent/VAADIN/themes/base/styles.css +++ b/WebContent/VAADIN/themes/base/styles.css @@ -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, diff --git a/WebContent/VAADIN/themes/base/table/table.css b/WebContent/VAADIN/themes/base/table/table.css index e26d3aa22c..783fec6604 100644 --- a/WebContent/VAADIN/themes/base/table/table.css +++ b/WebContent/VAADIN/themes/base/table/table.css @@ -160,15 +160,21 @@ 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 */ +} + + diff --git a/WebContent/VAADIN/themes/reindeer/styles.css b/WebContent/VAADIN/themes/reindeer/styles.css index 60451c64c7..be4a7bb11b 100644 --- a/WebContent/VAADIN/themes/reindeer/styles.css +++ b/WebContent/VAADIN/themes/reindeer/styles.css @@ -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 */ diff --git a/WebContent/VAADIN/themes/reindeer/table/table.css b/WebContent/VAADIN/themes/reindeer/table/table.css index 87a72f2f4a..623a771218 100644 --- a/WebContent/VAADIN/themes/reindeer/table/table.css +++ b/WebContent/VAADIN/themes/reindeer/table/table.css @@ -257,4 +257,6 @@ .v-table-borderless .v-table-header-wrap, .v-table-borderless .v-table-body { border: none; -} \ No newline at end of file +} + + diff --git a/WebContent/VAADIN/themes/runo/styles.css b/WebContent/VAADIN/themes/runo/styles.css index 493a7ea8eb..caa62af1a2 100644 --- a/WebContent/VAADIN/themes/runo/styles.css +++ b/WebContent/VAADIN/themes/runo/styles.css @@ -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, diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 53f0033bcd..0cbb3d73e3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -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 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 arg0) { client.getContextMenu().hide(); } - + } diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java index 21129e0b51..2e3ddf72d3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragAndDropManager.java @@ -599,6 +599,10 @@ public class VDragAndDropManager { } } + Element getDragElement() { + return dragElement; + } + private final Timer lazyAttachDragElement = new Timer() { @Override diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java index 3b94fcb606..5e5d3326ca 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/VDragEvent.java @@ -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(); } /** diff --git a/tests/src/com/vaadin/tests/dd/DDTest4.java b/tests/src/com/vaadin/tests/dd/DDTest4.java index f2f0ab73d7..f10d7b7c39 100644 --- a/tests/src/com/vaadin/tests/dd/DDTest4.java +++ b/tests/src/com/vaadin/tests/dd/DDTest4.java @@ -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();