]> source.dussan.org Git - vaadin-framework.git/commitdiff
Allow turning sorting on/off for columns #13334
authorJohn Ahlroos <john@vaadin.com>
Wed, 25 Jun 2014 08:16:46 +0000 (11:16 +0300)
committerJohn Ahlroos <john@vaadin.com>
Fri, 27 Jun 2014 06:45:44 +0000 (09:45 +0300)
Change-Id: I161dfd2cd534cdf4fc13467811f77be7d8cbc339

client/src/com/vaadin/client/ui/grid/Grid.java
client/src/com/vaadin/client/ui/grid/GridConnector.java
server/src/com/vaadin/ui/components/grid/Grid.java
server/src/com/vaadin/ui/components/grid/GridColumn.java
shared/src/com/vaadin/shared/ui/grid/GridColumnState.java
uitest/src/com/vaadin/tests/components/grid/GridBasicFeatures.java

index 299aa739b38402dc202d93ea74e74c8a32541307..a1c4b4308a22bb9a307ade248fc9781706e66600 100644 (file)
@@ -296,9 +296,6 @@ public class Grid<T> extends Composite implements
          * Renderer for columns which are sortable
          * 
          * FIXME Currently assumes multisorting
-         * 
-         * FIXME Currently all columns are assumed sortable
-         * 
          */
         private class SortableColumnHeaderRenderer extends
                 ComplexRenderer<String> {
@@ -331,26 +328,36 @@ public class Grid<T> extends Composite implements
                 if (grid != null) {
                     SortOrder sortingOrder = getSortingOrder();
                     Element cellElement = cell.getElement();
-                    if (sortingOrder != null) {
-                        int sortIndex = grid.getSortOrder().indexOf(
-                                sortingOrder);
-                        if (sortIndex > -1 && grid.getSortOrder().size() > 1) {
-                            // Show sort order indicator if column is sorted and
-                            // other sorted columns also exists.
-                            cellElement.setAttribute("sort-order",
-                                    String.valueOf(sortIndex + 1));
-
+                    if (grid.getColumn(cell.getColumn()).isSortable()) {
+                        if (sortingOrder != null) {
+                            int sortIndex = grid.getSortOrder().indexOf(
+                                    sortingOrder);
+                            if (sortIndex > -1
+                                    && grid.getSortOrder().size() > 1) {
+                                // Show sort order indicator if column is sorted
+                                // and other sorted columns also exists.
+                                cellElement.setAttribute("sort-order",
+                                        String.valueOf(sortIndex + 1));
+
+                            } else {
+                                cellElement.removeAttribute("sort-order");
+                            }
                         } else {
-                            cellElement.removeAttribute("sort-order");
+                            cleanup(cell);
                         }
                     } else {
-                        cellElement.removeAttribute("sort-order");
-                        cellElement.removeClassName("sort-desc");
-                        cellElement.removeClassName("sort-asc");
+                        cleanup(cell);
                     }
                 }
             }
 
+            private void cleanup(FlyweightCell cell) {
+                Element cellElement = cell.getElement();
+                cellElement.removeAttribute("sort-order");
+                cellElement.removeClassName("sort-desc");
+                cellElement.removeClassName("sort-asc");
+            }
+
             @Override
             public Collection<String> getConsumedEvents() {
                 return Arrays.asList(BrowserEvents.MOUSEDOWN);
@@ -358,25 +365,31 @@ public class Grid<T> extends Composite implements
 
             @Override
             public void onBrowserEvent(Cell cell, NativeEvent event) {
-                if (BrowserEvents.MOUSEDOWN.equals(event.getType())) {
-                    event.preventDefault();
 
-                    SortOrder sortingOrder = getSortingOrder();
-                    if (sortingOrder == null) {
-                        /*
-                         * No previous sorting, sort Ascending
-                         */
-                        sort(cell, SortDirection.ASCENDING, event.getShiftKey());
+                // Handle sorting events if column is sortable
+                if (grid.getColumn(cell.getColumn()).isSortable()) {
+                    if (BrowserEvents.MOUSEDOWN.equals(event.getType())) {
+                        event.preventDefault();
 
-                    } else {
-                        // Toggle sorting
-                        SortDirection direction = sortingOrder.getDirection();
-                        if (direction == SortDirection.ASCENDING) {
-                            sort(cell, SortDirection.DESCENDING,
-                                    event.getShiftKey());
-                        } else {
+                        SortOrder sortingOrder = getSortingOrder();
+                        if (sortingOrder == null) {
+                            /*
+                             * No previous sorting, sort Ascending
+                             */
                             sort(cell, SortDirection.ASCENDING,
                                     event.getShiftKey());
+
+                        } else {
+                            // Toggle sorting
+                            SortDirection direction = sortingOrder
+                                    .getDirection();
+                            if (direction == SortDirection.ASCENDING) {
+                                sort(cell, SortDirection.DESCENDING,
+                                        event.getShiftKey());
+                            } else {
+                                sort(cell, SortDirection.ASCENDING,
+                                        event.getShiftKey());
+                            }
                         }
                     }
                 }
@@ -439,7 +452,6 @@ public class Grid<T> extends Composite implements
                 }
                 return null;
             }
-
         }
 
         /**
@@ -475,7 +487,7 @@ public class Grid<T> extends Composite implements
         /**
          * Renderer for rendering the header cell value into the cell
          */
-        private SortableColumnHeaderRenderer headerRenderer = new SortableColumnHeaderRenderer(
+        private Renderer<String> headerRenderer = new SortableColumnHeaderRenderer(
                 new TextRenderer());
 
         /**
@@ -483,6 +495,8 @@ public class Grid<T> extends Composite implements
          */
         private Renderer<String> footerRenderer = new TextRenderer();
 
+        private boolean sortable = false;
+
         /**
          * Constructs a new column with a custom renderer.
          * 
@@ -747,6 +761,31 @@ public class Grid<T> extends Composite implements
                 return conf.getColumnWidth(index);
             }
         }
+
+        /**
+         * Enables sort indicators for the grid.
+         * <p>
+         * <b>Note:</b>The API can still sort the column even if this is set to
+         * <code>false</code>.
+         * 
+         * @param sortable
+         *            <code>true</code> when column sort indicators are visible.
+         */
+        public void setSortable(boolean sortable) {
+            if (this.sortable != sortable) {
+                this.sortable = sortable;
+                grid.refreshHeader();
+            }
+        }
+
+        /**
+         * Are sort indicators shown for the column.
+         * 
+         * @return <code>true</code> if the column is sortable
+         */
+        public boolean isSortable() {
+            return sortable;
+        }
     }
 
     /**
index 95b493b4513e52b1d618645c4a29d6d7d52e17da..0bfcf8ffcdb01a261dc7760dc1b7a15c2c474d33 100644 (file)
@@ -272,6 +272,7 @@ public class GridConnector extends AbstractComponentConnector {
         column.setHeaderCaption(state.header);
         column.setFooterCaption(state.footer);
         column.setWidth(state.width);
+        column.setSortable(state.sortable);
     }
 
     /**
index 0d7e7999785f7de3b49f5d5d8071e48567adcae7..1ebf227330328c61630ad9928388bc59b88ebd75 100644 (file)
@@ -30,6 +30,7 @@ import com.vaadin.data.Container;
 import com.vaadin.data.Container.PropertySetChangeEvent;
 import com.vaadin.data.Container.PropertySetChangeListener;
 import com.vaadin.data.Container.PropertySetChangeNotifier;
+import com.vaadin.data.Container.Sortable;
 import com.vaadin.data.RpcDataProviderExtension;
 import com.vaadin.server.KeyMapper;
 import com.vaadin.shared.ui.grid.ColumnGroupRowState;
@@ -253,6 +254,13 @@ public class Grid extends AbstractComponent implements SelectionChangeNotifier {
             if (!columns.containsKey(propertyId)) {
                 GridColumn column = appendColumn(propertyId);
 
+                // Initial sorting is defined by container
+                if (datasource instanceof Sortable) {
+                    column.setSortable(((Sortable) datasource)
+                            .getSortableContainerPropertyIds().contains(
+                                    propertyId));
+                }
+
                 // Add by default property id as column header
                 column.setHeaderCaption(String.valueOf(propertyId));
             }
index fd504fdae3ba05828bf8071b1d094adcf1d6f521..634526ea7c7ec2bd8328d39452ddccbc9a056394 100644 (file)
@@ -395,4 +395,22 @@ public class GridColumn implements Serializable {
                 grid.getPropertyIdByColumnId(state.id));
     }
 
+    /**
+     * Should sorting controls be available for the column
+     * 
+     * @param sortable
+     *            <code>true</code> if the sorting controls should be visible.
+     */
+    public void setSortable(boolean sortable) {
+        checkColumnIsAttached();
+        state.sortable = sortable;
+        grid.markAsDirty();
+    }
+
+    /**
+     * Are the sorting controls visible in the column header
+     */
+    public boolean isSortable() {
+        return state.sortable;
+    }
 }
index 581d4d436559f567c57520b77ced72a9d8162c4b..d1df08c294af1ce0b4b31c7aa372683a5e9dd31a 100644 (file)
@@ -55,4 +55,9 @@ public class GridColumnState implements Serializable {
     public int width = 100;
 
     public Connector rendererConnector;
+
+    /**
+     * Are sorting indicators shown for a column. Default is false.
+     */
+    public boolean sortable = false;
 }
index 1dc500202e5c347c6c773a67cdc47d1ef3bbed01..06fe088deed18e435c64d4e312bfcfe855293fb6 100644 (file)
@@ -192,6 +192,21 @@ public class GridBasicFeatures extends AbstractComponentTest<Grid> {
                         }
                     }, null, c);
 
+            createBooleanAction("Sortable", getColumnProperty(c), true,
+                    new Command<Grid, Boolean>() {
+
+                        @Override
+                        public void execute(Grid grid, Boolean value,
+                                Object columnIndex) {
+                            Object propertyId = (new ArrayList(grid
+                                    .getContainerDatasource()
+                                    .getContainerPropertyIds())
+                                    .get((Integer) columnIndex));
+                            GridColumn column = grid.getColumn(propertyId);
+                            column.setSortable(value);
+                        }
+                    }, c);
+
             createCategory("Column" + c + " Width", getColumnProperty(c));
 
             createClickAction("Auto", "Column" + c + " Width",