/*
* RObjectEntrySort.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.environment.view;
import java.util.Comparator;
class RObjectEntrySort implements Comparator<RObjectEntry>
{
public RObjectEntrySort()
{
sortType_ = SORT_AUTO;
sortColumn_ = ObjectGridColumn.COLUMN_NAME;
ascending_ = true;
}
public void setSortType(int sortType)
{
sortType_ = sortType;
}
public void setSortColumn(int sortColumn)
{
sortColumn_ = sortColumn;
// default to descending sort for size (largest objects on top--the most
// likely desired ordering)
if (sortColumn == ObjectGridColumn.COLUMN_SIZE)
ascending_ = false;
else
ascending_ = true;
}
public int getSortColumn()
{
return sortColumn_;
}
public boolean getAscending()
{
return ascending_;
}
public void setAscending(boolean ascending)
{
ascending_ = ascending;
}
public int compare(RObjectEntry first, RObjectEntry second)
{
if (ascending_ || sortType_ == SORT_AUTO)
return compareAscending(first, second);
else
return compareAscending(second, first);
}
public int compareAscending(RObjectEntry first, RObjectEntry second)
{
int result = 0;
if (sortType_ == SORT_AUTO)
{
result = first.getCategory() - second.getCategory();
if (result == 0)
{
result = localeCompare(first.rObject.getName(),
second.rObject.getName());
}
}
else if (sortType_ == SORT_COLUMN)
{
switch (sortColumn_)
{
case ObjectGridColumn.COLUMN_NAME:
result = localeCompare(first.rObject.getName(),
second.rObject.getName());
break;
case ObjectGridColumn.COLUMN_TYPE:
result = localeCompare(first.rObject.getType(),
second.rObject.getType());
break;
case ObjectGridColumn.COLUMN_LENGTH:
result = new Long(first.rObject.getLength())
.compareTo(new Long(second.rObject.getLength()));
break;
case ObjectGridColumn.COLUMN_SIZE:
result = new Long(first.rObject.getSize())
.compareTo(new Long(second.rObject.getSize()));
break;
case ObjectGridColumn.COLUMN_VALUE:
result = localeCompare(first.getDisplayValue(),
second.getDisplayValue());
break;
}
}
return result;
}
// Gets sort order of two strings. Coerces from undefined/null values to
// empty strings.
private native int localeCompare(String first, String second) /*-{
firstVal = first ? first : "";
secondVal = second ? second : "";
return firstVal.localeCompare(secondVal);
}-*/;
public static final int SORT_AUTO = 0;
public static final int SORT_COLUMN = 1;
private int sortType_;
private int sortColumn_;
private boolean ascending_;
}