From 8f92faae5f7c909f0c05d6d00249b4b209feb123 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 4 Feb 2013 13:52:47 +0100 Subject: [PATCH] OO-529: implement sorting for groups in the member view --- .../ui/main/AbstractMemberListController.java | 19 ++++- .../ui/main/GroupMemberViewComparator.java | 81 +++++++++++++++++++ 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/olat/group/ui/main/GroupMemberViewComparator.java diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java index 9b67c798606..2b5160a4523 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java @@ -19,6 +19,7 @@ */ package org.olat.group.ui.main; +import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -125,6 +126,7 @@ public abstract class AbstractMemberListController extends BasicController imple private final BusinessGroupModule groupModule; private final ACService acService; + private final GroupMemberViewComparator memberViewComparator; private static final CourseMembershipComparator MEMBERSHIP_COMPARATOR = new CourseMembershipComparator(); public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, String page) { @@ -148,6 +150,8 @@ public abstract class AbstractMemberListController extends BasicController imple businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); groupModule = CoreSpringFactory.getImpl(BusinessGroupModule.class); acService = CoreSpringFactory.getImpl(ACService.class); + + memberViewComparator = new GroupMemberViewComparator(Collator.getInstance(getLocale())); isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); mainVC = createVelocityContainer(page); @@ -202,14 +206,23 @@ public abstract class AbstractMemberListController extends BasicController imple Object b = table.getTableDataModel().getValueAt(rowb,dataColumn); if(a instanceof CourseMembership && b instanceof CourseMembership) { return MEMBERSHIP_COMPARATOR.compare((CourseMembership)a, (CourseMembership)b); - } else { - return super.compareTo(rowa, rowb); } + return super.compareTo(rowa, rowb); } }); if(repoEntry != null) { CustomCellRenderer groupRenderer = new GroupCellRenderer(); - memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.groups.i18n(), Cols.groups.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, groupRenderer)); + memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.groups.i18n(), Cols.groups.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, groupRenderer) { + @Override + public int compareTo(final int rowa, final int rowb) { + Object a = table.getTableDataModel().getValueAt(rowa,dataColumn); + Object b = table.getTableDataModel().getValueAt(rowb,dataColumn); + if(a instanceof MemberView && b instanceof MemberView) { + return memberViewComparator.compare((MemberView)a, (MemberView)b); + } + return super.compareTo(rowa, rowb); + } + }); } memberListCtr.addColumnDescriptor(new GraduateColumnDescriptor("table.header.graduate", TABLE_ACTION_GRADUATE, getTranslator())); diff --git a/src/main/java/org/olat/group/ui/main/GroupMemberViewComparator.java b/src/main/java/org/olat/group/ui/main/GroupMemberViewComparator.java new file mode 100644 index 00000000000..c81cdbbe0d4 --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/GroupMemberViewComparator.java @@ -0,0 +1,81 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group.ui.main; + +import java.text.Collator; +import java.util.Comparator; +import java.util.List; + +import org.olat.group.BusinessGroupShort; + +/** + * Compare the groups of member views based on the group name.<br/> + * + * Initial date: 04.02.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class GroupMemberViewComparator implements Comparator<MemberView> { + + private Collator collator; + + public GroupMemberViewComparator(Collator collator) { + this.collator = collator; + } + + @Override + public int compare(MemberView m1, MemberView m2) { + List<BusinessGroupShort> g1 = m1.getGroups(); + List<BusinessGroupShort> g2 = m2.getGroups(); + + if(g1 == null || g1.isEmpty()) { + if(g2 == null || g2.isEmpty()) return 0; + return -1; + } + if(g2 == null || g2.isEmpty()) return 1; + + int maxLevel = Math.max(g1.size(), g2.size()); + + int compare = 0; + for(int i=0; i<maxLevel && compare==0; i++) { + BusinessGroupShort gs1 = i < g1.size() ? g1.get(i) : null; + BusinessGroupShort gs2 = i < g2.size() ? g2.get(i) : null; + compare = compareLevel(gs1, gs2); + } + return compare; + } + + private int compareLevel(BusinessGroupShort g1, BusinessGroupShort g2) { + if(g1 == null) { + if(g2 == null) return 0; + return -1; + } + if(g2 == null) return 1; + + String n1 = g1.getName(); + String n2 = g2.getName(); + if(n1 == null) { + if(n2 == null) return 0; + return -1; + } + if(n2 == null) return 1; + return collator == null ? n1.compareTo(n2) : collator.compare(n1, n2); + } +} -- GitLab