From e0324db343ee6607062db0776a1edb565625d155 Mon Sep 17 00:00:00 2001 From: koutsoub Date: Fri, 14 Jan 2011 13:39:58 +0200 Subject: [PATCH] sorting support for celltable --- src/gr/ebs/gss/client/FileList.java | 126 +++++++++++++++++++++++++---- src/gr/ebs/gss/client/SortableHeader.java | 112 +++++++++++++++++++++++++ src/gr/ebs/gss/client/downArrow.png | Bin 0 -> 274 bytes src/gr/ebs/gss/client/upArrow.png | Bin 0 -> 274 bytes 4 files changed, 222 insertions(+), 16 deletions(-) create mode 100644 src/gr/ebs/gss/client/SortableHeader.java create mode 100644 src/gr/ebs/gss/client/downArrow.png create mode 100644 src/gr/ebs/gss/client/upArrow.png diff --git a/src/gr/ebs/gss/client/FileList.java b/src/gr/ebs/gss/client/FileList.java index 8c0fb79..c525b72 100644 --- a/src/gr/ebs/gss/client/FileList.java +++ b/src/gr/ebs/gss/client/FileList.java @@ -17,6 +17,7 @@ * along with GSS. If not, see . */ package gr.ebs.gss.client; + import gr.ebs.gss.client.dnd.DnDSimpleFocusPanel; import gr.ebs.gss.client.dnd.DnDTreeItem; import gr.ebs.gss.client.rest.GetCommand; @@ -37,14 +38,12 @@ import java.util.Iterator; import java.util.List; import com.google.gwt.cell.client.ImageResourceCell; -import com.google.gwt.cell.client.Cell.Context; +import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.RepeatingCommand; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; -import com.google.gwt.dom.client.TableCellElement; -import com.google.gwt.dom.client.TableRowElement; import com.google.gwt.http.client.URL; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.resources.client.ClientBundle; @@ -212,7 +211,8 @@ public class FileList extends Composite { private FileContextMenu menuShowing; private CellTable celltable; private final MultiSelectionModel selectionModel; - + private final List allHeaders = new ArrayList(); + SortableHeader nameHeader; /** * Construct the file list widget. This entails setting up the widget * layout, fetching the number of files in the current folder from the @@ -276,42 +276,58 @@ public class FileList extends Composite { }; celltable.addColumn(status,""); - - celltable.addColumn(nameColumn,"Name"); + + celltable.addColumn(nameColumn,nameHeader = new SortableHeader("Name")); + allHeaders.add(nameHeader); + nameHeader.setSorted(true); + nameHeader.toggleReverseSort(); + nameHeader.setUpdater(new FileValueUpdater(nameHeader, "name")); + celltable.redrawHeaders(); + SortableHeader aheader; celltable.addColumn(new TextColumn() { @Override public String getValue(FileResource object) { // TODO Auto-generated method stub return object.getOwner(); } - },"Owner"); + },aheader = new SortableHeader("Owner")); + allHeaders.add(aheader); + aheader.setUpdater(new FileValueUpdater(aheader, "owner")); celltable.addColumn(new TextColumn() { @Override public String getValue(FileResource object) { // TODO Auto-generated method stub return object.getPath(); } - },"Path"); + },aheader = new SortableHeader("Path")); + allHeaders.add(aheader); + aheader.setUpdater(new FileValueUpdater(aheader, "path")); celltable.addColumn(new TextColumn() { @Override public String getValue(FileResource object) { // TODO Auto-generated method stub return object.getVersion().toString(); } - },"Version"); + },aheader = new SortableHeader("Version")); + allHeaders.add(aheader); + aheader.setUpdater(new FileValueUpdater(aheader, "version")); celltable.addColumn(new TextColumn() { @Override public String getValue(FileResource object) { // TODO Auto-generated method stub return object.getFileSizeAsString(); } - },"Size"); + },aheader = new SortableHeader("Size")); + allHeaders.add(aheader); + aheader.setUpdater(new FileValueUpdater(aheader, "size")); celltable.addColumn(new TextColumn() { @Override public String getValue(FileResource object) { return formatter.format(object.getModificationDate()); } - },"Last Modified"); + },aheader = new SortableHeader("Last Modified")); + allHeaders.add(aheader); + aheader.setUpdater(new FileValueUpdater(aheader, "date")); initWidget(celltable); setStyleName("gss-List"); selectionModel = new MultiSelectionModel(); @@ -348,10 +364,10 @@ public class FileList extends Composite { GSS.preventIESelection(); } public native void fireClickEvent(Element element) /*-{ - var evObj = $doc.createEvent('MouseEvents'); - evObj.initEvent('click', true, true); - element.dispatchEvent(evObj); - }-*/; + var evObj = $doc.createEvent('MouseEvents'); + evObj.initEvent('click', true, true); + element.dispatchEvent(evObj); + }-*/; public List getSelectedFiles() { return new ArrayList(selectionModel.getSelectedSet()); @@ -429,9 +445,10 @@ public class FileList extends Composite { if (max > count) max = count; folderTotalSize = 0; - + celltable.setRowCount(files.size()); celltable.setRowData(0,files); + celltable.redrawHeaders(); if (folderFileCount == 0) { showingStats = "no files"; } else if (folderFileCount < GSS.VISIBLE_FILE_COUNT) { @@ -838,5 +855,82 @@ public class FileList extends Composite { } + private void sortFiles(final String sortingProperty, final boolean sortingType){ + Collections.sort(files, new Comparator() { + @Override + public int compare(FileResource arg0, FileResource arg1) { + AbstractImagePrototype descPrototype = AbstractImagePrototype.create(images.desc()); + AbstractImagePrototype ascPrototype = AbstractImagePrototype.create(images.asc()); + if (sortingType){ + if (sortingProperty.equals("version")) { + return arg0.getVersion().compareTo(arg1.getVersion()); + } else if (sortingProperty.equals("owner")) { + return arg0.getOwner().compareTo(arg1.getOwner()); + } else if (sortingProperty.equals("date")) { + return arg0.getModificationDate().compareTo(arg1.getModificationDate()); + } else if (sortingProperty.equals("size")) { + return arg0.getContentLength().compareTo(arg1.getContentLength()); + } else if (sortingProperty.equals("name")) { + return arg0.getName().compareTo(arg1.getName()); + } else if (sortingProperty.equals("path")) { + return arg0.getUri().compareTo(arg1.getUri()); + } else { + return arg0.getName().compareTo(arg1.getName()); + } + } + else if (sortingProperty.equals("version")) { + + return arg1.getVersion().compareTo(arg0.getVersion()); + } else if (sortingProperty.equals("owner")) { + + return arg1.getOwner().compareTo(arg0.getOwner()); + } else if (sortingProperty.equals("date")) { + + return arg1.getModificationDate().compareTo(arg0.getModificationDate()); + } else if (sortingProperty.equals("size")) { + + return arg1.getContentLength().compareTo(arg0.getContentLength()); + } else if (sortingProperty.equals("name")) { + + return arg1.getName().compareTo(arg0.getName()); + } else if (sortingProperty.equals("path")) { + + return arg1.getUri().compareTo(arg0.getUri()); + } else { + + return arg1.getName().compareTo(arg0.getName()); + } + } + + }); + } + + final class FileValueUpdater implements ValueUpdater{ + private String property; + private SortableHeader header; + /** + * + */ + public FileValueUpdater(SortableHeader header,String property) { + this.property=property; + this.header=header; + } + @Override + public void update(String value) { + header.setSorted(true); + header.toggleReverseSort(); + + for (SortableHeader otherHeader : allHeaders) { + if (otherHeader != header) { + otherHeader.setSorted(false); + otherHeader.setReverseSort(true); + } + } + celltable.redrawHeaders(); + sortFiles(property, header.getReverseSort()); + FileList.this.update(true); + } + + } } diff --git a/src/gr/ebs/gss/client/SortableHeader.java b/src/gr/ebs/gss/client/SortableHeader.java new file mode 100644 index 0000000..b119e40 --- /dev/null +++ b/src/gr/ebs/gss/client/SortableHeader.java @@ -0,0 +1,112 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package gr.ebs.gss.client; + +import com.google.gwt.cell.client.Cell.Context; +import com.google.gwt.cell.client.ClickableTextCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.safehtml.client.SafeHtmlTemplates; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.cellview.client.Header; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * A {@link Header} subclass that maintains sorting state and displays an icon + * to indicate the sort direction. + */ +public class SortableHeader extends Header { + + interface Template extends SafeHtmlTemplates { + @Template("
{1}
{2}
") + SafeHtml sorted(int imageWidth, SafeHtml arrow, String text); + + @Template("
{1}
") + SafeHtml unsorted(int imageWidth, String text); + } + + private static Template template; + + /** + * Image resources. + */ + public static interface Resources extends ClientBundle { + + ImageResource downArrow(); + + ImageResource upArrow(); + } + + private static final Resources RESOURCES = GWT.create(Resources.class); + private static final int IMAGE_WIDTH = 16; + private static final SafeHtml DOWN_ARROW = makeImage(RESOURCES.downArrow()); + private static final SafeHtml UP_ARROW = makeImage(RESOURCES.upArrow()); + + private static SafeHtml makeImage(ImageResource resource) { + AbstractImagePrototype proto = AbstractImagePrototype.create(resource); + String html = proto.getHTML().replace("style='", + "style='position:absolute;right:0px;top:0px;"); + return SafeHtmlUtils.fromTrustedString(html); + } + + private boolean reverseSort = false; + private boolean sorted = false; + private String text; + + SortableHeader(String text) { + super(new ClickableTextCell()); + if (template == null) { + template = GWT.create(Template.class); + } + this.text = text; + } + + public boolean getReverseSort() { + return reverseSort; + } + + @Override + public String getValue() { + return text; + } + + @Override + public void render(Context context, SafeHtmlBuilder sb) { + if (sorted) { + sb.append(template.sorted(IMAGE_WIDTH, reverseSort ? DOWN_ARROW : UP_ARROW, text)); + } else { + sb.append(template.unsorted(IMAGE_WIDTH, text)); + } + } + + public void setReverseSort(boolean reverseSort) { + this.reverseSort = reverseSort; + } + + public void setSorted(boolean sorted) { + this.sorted = sorted; + } + + public void toggleReverseSort() { + this.reverseSort = !this.reverseSort; + } +} diff --git a/src/gr/ebs/gss/client/downArrow.png b/src/gr/ebs/gss/client/downArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4012ce0aa4f2c2e0b3baf66cf0c8a577c33b50 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E!3HGn{(JaZG%Q-e|yQz{EjrrH1%E%9`545_#k)9cH1D1fI${rtVt z-W*X^q&u=51-u+zaPH~gj@|iDERR*Qf!A zRYzBtm$2Av+00Yq5)pX((}pR!xwD1ZqYp5-&o-)1Ii0t5x7Fvw=Rq9?0m08YGVi8) z72n+%A+cWeVAXu?)vfEJ^XC+Q3@Mf|>0z2P>wk2?Us2~xl1ZIs88`jEzK@BAq0id< V)-C_%M}Y2S@O1TaS?83{1OOfmXgUA@ literal 0 HcmV?d00001 diff --git a/src/gr/ebs/gss/client/upArrow.png b/src/gr/ebs/gss/client/upArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a3369472fe88f47d288a5217c03704cb61639962 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E!3HGn{(JaZG%Q-e|yQz{EjrrH1%E%9`545_%4bY}INqysGfmm3-w zTw|2XpWqrP@$bKT=?89PNhI+`VX5|||