You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/06/10 14:38:06 UTC

git commit: ISIS-432: table columns now sortable.

Updated Branches:
  refs/heads/master 734950d72 -> 5a85a303b


ISIS-432: table columns now sortable.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/5a85a303
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/5a85a303
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/5a85a303

Branch: refs/heads/master
Commit: 5a85a303b09e0e10582f6902d982b7554505f199
Parents: 734950d
Author: Dan Haywood <da...@apache.org>
Authored: Mon Jun 10 13:23:39 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Mon Jun 10 13:23:39 2013 +0100

----------------------------------------------------------------------
 .../CollectionContentsAsAjaxTablePanel.css      |  29 +++++++--
 .../CollectionContentsSortableDataProvider.java |  65 +++++++++++++++++--
 .../MyAjaxFallbackDefaultDataTable.java         |   1 -
 .../ajaxtable/columns/ColumnAbstract.java       |   6 +-
 .../columns/ObjectAdapterPropertyColumn.java    |   5 +-
 .../ajaxtable/images/arrow_down.png             | Bin 0 -> 189 bytes
 .../ajaxtable/images/arrow_off.png              | Bin 0 -> 178 bytes
 .../ajaxtable/images/arrow_up.png               | Bin 0 -> 189 bytes
 8 files changed, 88 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
index 81ef5d9..4be92ad 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
@@ -41,7 +41,8 @@
 	padding-left: 4px;
 	padding-right: 4px;
 }
-.collectionContentsAsAjaxTablePanel table.contents tr th { 
+.collectionContentsAsAjaxTablePanel table.contents tr th,
+.collectionContentsAsAjaxTablePanel table.contents tr th a { 
 	color: #FFFFFF;
 	background-color: #46423C;
 	text-align: left; 
@@ -50,16 +51,32 @@
 	font-weight:bold;
 }
 
+.collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderUp a,
+.collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderDown a {
+    background-color: #20B5C2;
+}
+
+.collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderUp a:hover,
+.collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderDown a:hover {
+    color: #46423C;
+}
+
 .collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderDown {
-	background-color: #87cbff; 
-	background-image: url(displaytag/img/arrow_down.png); 
+	background-color: #20B5C2; 
+	background-image: url(images/arrow_down.png); 
+    background-position: right;
+    background-repeat: no-repeat;
 }
 .collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderUp {
-	background-color: #87cbff; 
-	background-image: url(displaytag/img/arrow_up.png);
+	background-color: #20B5C2; 
+	background-image: url(images/arrow_up.png);
+    background-position: right;
+    background-repeat: no-repeat;
 }
 .collectionContentsAsAjaxTablePanel table.contents tr th.wicket_orderNone {
-	background-image: url(displaytag/img/arrow_off.png);
+	background-image: url(images/arrow_off.png);
+	background-position: right;
+    background-repeat: no-repeat;
 }
 .collectionContentsAsAjaxTablePanel table.contents tr th a {
 	font-weight: normal;

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
index 843476e..cc6f35e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
@@ -20,20 +20,23 @@
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
 import java.util.Iterator;
+import java.util.List;
+
+import com.google.common.collect.Ordering;
 
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
 /**
  * Part of the {@link AjaxFallbackDefaultDataTable} API.
- * 
- * <p>
- * TODO: not yet fully supported.
  */
 public class CollectionContentsSortableDataProvider extends SortableDataProvider<ObjectAdapter,String> {
 
@@ -47,7 +50,9 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
 
     @Override
     public Iterator<ObjectAdapter> iterator(final long first, final long count) {
-        return model.getObject().subList((int)first, (int)(first + count)).iterator();
+        List<ObjectAdapter> adapters = sortedIfRequired(model.getObject(), this.getSort());
+        
+        return adapters.subList((int)first, (int)(first + count)).iterator();
     }
 
     @Override
@@ -67,4 +72,56 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
     }
 
     
+    private List<ObjectAdapter> sortedIfRequired(List<ObjectAdapter> adapters, final SortParam<String> sort) {
+        if(sort == null) {
+            return adapters;
+        }
+        
+        final ObjectSpecification elementSpec = model.getTypeOfSpecification();
+        
+        final String sortPropertyId = sort.getProperty();
+        final ObjectAssociation sortProperty = elementSpec.getAssociation(sortPropertyId);
+        if(sortProperty == null) {
+            return adapters;
+        }
+
+        Ordering<ObjectAdapter> ordering = orderingBy(sortProperty, sort.isAscending());
+        return ordering.sortedCopy(adapters);
+    }
+
+    public static Ordering<ObjectAdapter> orderingBy(final ObjectAssociation sortProperty, final boolean ascending) {
+        final Ordering<ObjectAdapter> ordering = new Ordering<ObjectAdapter>(){
+    
+            @Override
+            public int compare(final ObjectAdapter p, final ObjectAdapter q) {
+                final ObjectAdapter pSort = sortProperty.get(p);
+                final ObjectAdapter qSort = sortProperty.get(q);
+                Ordering<ObjectAdapter> naturalOrdering = 
+                        ascending 
+                            ? ORDERING_BY_NATURAL.nullsFirst() 
+                            : ORDERING_BY_NATURAL.nullsLast();
+                return naturalOrdering.compare(pSort, qSort);
+            }
+        };
+        return ascending?ordering:ordering.reverse();
+    }
+
+    public static Ordering<ObjectAdapter> ORDERING_BY_NATURAL = new Ordering<ObjectAdapter>(){
+        @Override
+        public int compare(final ObjectAdapter p, final ObjectAdapter q) {
+            final Object pPojo = p.getObject();
+            final Object qPojo = q.getObject();
+            if(!(pPojo instanceof Comparable) || !(qPojo instanceof Comparable)) {
+                return 0;
+            } 
+            return naturalOrdering(pPojo, qPojo);
+        }
+        @SuppressWarnings("rawtypes")
+        private int naturalOrdering(final Object pPojo, final Object qPojo) {
+            Comparable pComparable = (Comparable) pPojo;
+            Comparable qComparable = (Comparable) qPojo;
+            return Ordering.natural().compare(pComparable, qComparable);
+        }
+    }; 
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/MyAjaxFallbackDefaultDataTable.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/MyAjaxFallbackDefaultDataTable.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/MyAjaxFallbackDefaultDataTable.java
index dd11ffe..91ca852 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/MyAjaxFallbackDefaultDataTable.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/MyAjaxFallbackDefaultDataTable.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable
 
 import java.util.List;
 
-import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackHeadersToolbar;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxNavigationToolbar;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ColumnAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ColumnAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ColumnAbstract.java
index 9ca0202..c6d9dbe 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ColumnAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ColumnAbstract.java
@@ -43,11 +43,11 @@ public abstract class ColumnAbstract<T> extends AbstractColumn<T,String> {
     private static final long serialVersionUID = 1L;
 
     public ColumnAbstract(final String columnName) {
-        this(Model.of(columnName));
+        this(Model.of(columnName), null);
     }
 
-    public ColumnAbstract(final IModel<String> columnNameModel) {
-        super(columnNameModel);
+    public ColumnAbstract(final IModel<String> columnNameModel, final String sortColumn) {
+        super(columnNameModel, sortColumn);
     }
 
     protected ComponentFactory findComponentFactory(final ComponentType componentType, final IModel<?> model) {

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterPropertyColumn.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterPropertyColumn.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterPropertyColumn.java
index 74a8c3d..05adc9c 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterPropertyColumn.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterPropertyColumn.java
@@ -48,13 +48,10 @@ public final class ObjectAdapterPropertyColumn extends ColumnAbstract<ObjectAdap
 
     private static final long serialVersionUID = 1L;
 
-    @SuppressWarnings("unused")
-    private final String sortProperty;
     private final String propertyExpression;
 
     public ObjectAdapterPropertyColumn(final IModel<String> columnNameModel, final String sortProperty, final String propertyName) {
-        super(columnNameModel);
-        this.sortProperty = sortProperty;
+        super(columnNameModel, sortProperty);
         this.propertyExpression = propertyName;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_down.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_down.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_down.png
new file mode 100644
index 0000000..f31cc81
Binary files /dev/null and b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_down.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_off.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_off.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_off.png
new file mode 100644
index 0000000..f9b1ced
Binary files /dev/null and b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_off.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/5a85a303/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_up.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_up.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_up.png
new file mode 100644
index 0000000..63031c3
Binary files /dev/null and b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/images/arrow_up.png differ