/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.openkm.frontend.client.widget.searchresult; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.google.gwt.gen2.table.client.SortableGrid; import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorter; import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorterCallback; import com.google.gwt.gen2.table.client.TableModelHelper.ColumnSortList; import com.openkm.frontend.client.Main; import com.openkm.frontend.client.bean.GWTObjectToOrder; import com.openkm.frontend.client.bean.GWTQueryResult; import com.openkm.frontend.client.util.ColumnComparatorDate; import com.openkm.frontend.client.util.ColumnComparatorDouble; import com.openkm.frontend.client.util.ColumnComparatorText; /** * ExtendedColumnSorter * * @author jllort * */ public class ExtendedColumnSorter extends ColumnSorter { private String selectedRowDataID = ""; /* (non-Javadoc) * @see com.google.gwt.widgetideas.table.client.SortableGrid$ColumnSorter#onSortColumn(com.google.gwt.widgetideas.table.client.SortableGrid, com.google.gwt.widgetideas.table.client.TableModel.ColumnSortList, com.google.gwt.widgetideas.table.client.SortableGrid.ColumnSorterCallback) */ public void onSortColumn(SortableGrid grid, ColumnSortList sortList, ColumnSorterCallback callback) { // Get the primary column, sort order, number of rows, number of columns int column = sortList.getPrimaryColumn(); boolean ascending = sortList.isPrimaryAscending(); int rows = Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getDataTable().getRowCount(); int columns = Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getDataTable().getColumnCount(); int selectedRow = Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getSelectedRow(); Map<Integer,GWTQueryResult> data = new HashMap<Integer,GWTQueryResult>(Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.data); List<String[]> elementList = new ArrayList<String[]>(); // List with all data List<GWTObjectToOrder> elementToOrder = new ArrayList<GWTObjectToOrder>(); // List with column data, and actual position // Gets the data values and set on a list of String arrays ( element by column ) for (int i=0; i<rows;i++) { String[] rowI= new String[columns]; GWTObjectToOrder rowToOrder = new GWTObjectToOrder(); for (int x=0; x<columns; x++) { rowI[x] = Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getDataTable().getHTML(i, x); } elementList.add(i,rowI); switch(column) { case 0 : case 1 : case 2 : case 5 : case 6 : // Text rowToOrder.setObject(rowI[column].toLowerCase()); // Lower case solves problem with sort ordering rowToOrder.setDataId(""+ i); // Actual position value elementToOrder.add(rowToOrder); break; case 3 : // Bytes if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getDocument()!=null) { rowToOrder.setObject(new Double(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getDocument().getActualVersion().getSize())); } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getAttachment()!=null) { rowToOrder.setObject(new Double(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getAttachment().getActualVersion().getSize())); } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getFolder()!=null) { rowToOrder.setObject(new Double(0)); } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getMail()!=null) { rowToOrder.setObject(new Double(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getMail().getSize())); } rowToOrder.setDataId(""+ i); // Actual position value elementToOrder.add(rowToOrder); break; case 4 : // Date if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getDocument()!=null) { rowToOrder.setObject(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getDocument().getLastModified()); // Date value } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getAttachment()!=null) { rowToOrder.setObject(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getAttachment().getLastModified()); // Date value } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getFolder()!=null) { rowToOrder.setObject(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getFolder().getCreated()); } else if (((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getMail()!=null) { rowToOrder.setObject(((GWTQueryResult) data.get(Integer.parseInt(rowI[7]))).getMail().getReceivedDate()); } rowToOrder.setDataId(""+ i); // Actual position value elementToOrder.add(rowToOrder); break; } // Saves the selected row if (selectedRow==i) { selectedRowDataID = rowToOrder.getDataId(); } } switch(column) { case 0 : case 1 : case 2 : case 5 : case 6 : // Text Collections.sort(elementToOrder, ColumnComparatorText.getInstance()); break; case 3 : // Bytes Collections.sort(elementToOrder, ColumnComparatorDouble.getInstance()); break; case 4 : // Date Collections.sort(elementToOrder, ColumnComparatorDate.getInstance()); break; } // Reversing if needed if (!ascending) { Collections.reverse(elementToOrder); } applySort(elementList, elementToOrder); callback.onSortingComplete(); } /** * @param elementList * @param elementToOrder */ private void applySort(List<String[]> elementList, List<GWTObjectToOrder> elementToOrder) { // Removing all values while (Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getDataTable().getRowCount()>0 ){ Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.getDataTable().removeRow(0); } // Data map Map<Integer,GWTQueryResult> data = new HashMap<Integer,GWTQueryResult>(Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.data); Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.reset(); int column = 0; for (Iterator<GWTObjectToOrder> it = elementToOrder.iterator(); it.hasNext();) { GWTObjectToOrder orderedColumn = it.next(); String[] row = elementList.get(Integer.parseInt(orderedColumn.getDataId())); Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.addRow((GWTQueryResult) data.get(Integer.parseInt(row[7]))); // Sets selectedRow if (!selectedRowDataID.equals("") && selectedRowDataID.equals(row[7])) { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.table.setSelectedRow(column); selectedRowDataID = ""; } column++; } } }