/*
* Copyright (c) 2008 David Kocher. All rights reserved.
* http://cyberduck.ch/
*
* 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.
*
* Bug fixes, suggestions and comments should be sent to:
* dkocher@cyberduck.ch
*/
package ch.cyberduck;
import ch.cyberduck.core.*;
import org.apache.log4j.Logger;
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
/**
* @version $Id: AbstractPathTableDelegate.java 5614 2009-12-11 18:46:46Z dkocher $
*/
public abstract class AbstractPathTableDelegate extends AbstractTableDelegate<Path> {
private static Logger log = Logger.getLogger(AbstractTableDelegate.class);
/**
* @return A tooltip string containing the size and modification date of the path
*/
public String tooltip(Path p) {
return p.getAbsolute() + "\n"
+ Status.getSizeAsString(p.attributes.getSize()) + "\n";
//+ DateFormatter.getLongFormat(p.attributes.getModificationDate());
}
@Override
public Comparator<Path> getSortingComparator() {
final boolean ascending = this.isSortedAscending();
// final String identifier = this.selectedColumnIdentifier();
// if(identifier.equals(BrowserTableDataSource.ICON_COLUMN)
// || identifier.equals(BrowserTableDataSource.KIND_COLUMN)) {
// return new FileTypeComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.FILENAME_COLUMN)) {
// return new FilenameComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.SIZE_COLUMN)) {
// return new SizeComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.MODIFIED_COLUMN)) {
// return new TimestampComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.OWNER_COLUMN)) {
// return new OwnerComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.GROUP_COLUMN)) {
// return new GroupComparator(ascending);
// }
// else if(identifier.equals(BrowserTableDataSource.PERMISSIONS_COLUMN)) {
// return new PermissionsComparator(ascending);
// }
// log.error("Unknown column identifier:" + identifier);
return new NullComparator<Path>();
}
private static class FileTypeComparator extends BrowserComparator {
private Collator impl = Collator.getInstance(Locale.getDefault());
public FileTypeComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
if((p1.attributes.isDirectory() && p2.attributes.isDirectory())
|| p1.attributes.isFile() && p2.attributes.isFile()) {
if(ascending) {
return impl.compare(p1.kind(), p2.kind());
}
return -impl.compare(p1.kind(), p2.kind());
}
if(p1.attributes.isFile()) {
return ascending ? 1 : -1;
}
return ascending ? -1 : 1;
}
public String toString() {
return BrowserTableDataSource.ICON_COLUMN;
}
}
private static class FilenameComparator extends BrowserComparator {
private Comparator<String> impl = new NaturalOrderComparator();
public FilenameComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
if(ascending) {
return impl.compare(p1.getName(), p2.getName());
}
return -impl.compare(p1.getName(), p2.getName());
}
public String toString() {
return BrowserTableDataSource.FILENAME_COLUMN;
}
}
private static class SizeComparator extends BrowserComparator {
public SizeComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
if(p1.attributes.getSize() > p2.attributes.getSize()) {
return ascending ? 1 : -1;
}
else if(p1.attributes.getSize() < p2.attributes.getSize()) {
return ascending ? -1 : 1;
}
return 0;
}
public String toString() {
return BrowserTableDataSource.SIZE_COLUMN;
}
}
private static class TimestampComparator extends BrowserComparator {
public TimestampComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
long d1 = p1.attributes.getModificationDate();
if(-1 == d1) {
return 0;
}
long d2 = p2.attributes.getModificationDate();
if(-1 == d2) {
return 0;
}
if(d1 == d2) {
return 0;
}
if(ascending) {
return d1 > d2 ? 1 : -1;
}
return d1 > d2 ? -1 : 1;
}
public String toString() {
return BrowserTableDataSource.MODIFIED_COLUMN;
}
}
private static class OwnerComparator extends BrowserComparator {
public OwnerComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
if(ascending) {
return p1.attributes.getOwner().compareToIgnoreCase(p2.attributes.getOwner());
}
return -p1.attributes.getOwner().compareToIgnoreCase(p2.attributes.getOwner());
}
public String toString() {
return BrowserTableDataSource.OWNER_COLUMN;
}
}
private static class GroupComparator extends BrowserComparator {
public GroupComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
if(ascending) {
return p1.attributes.getGroup().compareToIgnoreCase(p2.attributes.getGroup());
}
return -p1.attributes.getGroup().compareToIgnoreCase(p2.attributes.getGroup());
}
public String toString() {
return BrowserTableDataSource.GROUP_COLUMN;
}
}
private static class PermissionsComparator extends BrowserComparator {
public PermissionsComparator(boolean ascending) {
super(ascending);
}
@Override
public int compare(Path p1, Path p2) {
Permission perm1 = p1.attributes.getPermission();
if(null == perm1) {
perm1 = Permission.EMPTY;
}
Permission perm2 = p2.attributes.getPermission();
if(null == perm2) {
perm2 = Permission.EMPTY;
}
if(perm1.getOctalNumber() > perm2.getOctalNumber()) {
return ascending ? 1 : -1;
}
else if(perm1.getOctalNumber() < perm2.getOctalNumber()) {
return ascending ? -1 : 1;
}
return 0;
}
public String toString() {
return BrowserTableDataSource.PERMISSIONS_COLUMN;
}
}
}