/*
* SVNSelectChangelistTable.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.vcs.svn;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.view.client.MultiSelectionModel;
import org.rstudio.core.client.cellview.TriStateCheckboxCell;
import org.rstudio.studio.client.common.vcs.StatusAndPath;
import java.util.*;
public class SVNSelectChangelistTable extends SVNChangelistTable
{
public SVNSelectChangelistTable()
{
uncommitableStatuses.add("X");
uncommitableStatuses.add("?");
uncommitableStatuses.add("!");
uncommitableStatuses.add("C");
}
@Override
protected MultiSelectionModel<StatusAndPath> createSelectionModel()
{
// Squelch normal table selection, we're using checkboxes instead
return new MultiSelectionModel<StatusAndPath>()
{
@Override
public void setSelected(StatusAndPath object, boolean selected)
{
// do nothing
}
};
}
@Override
public ArrayList<StatusAndPath> getSelectedItems()
{
throw new UnsupportedOperationException(
"SVNSelectChangelistTable.getSelectedItems is not supported");
}
@Override
public ArrayList<String> getSelectedPaths()
{
ArrayList<String> selectedPaths = new ArrayList<String>();
for (Map.Entry<String, Boolean> entry : selected_.entrySet())
if (entry.getValue() != null && entry.getValue())
selectedPaths.add(entry.getKey());
return selectedPaths;
}
@Override
public ArrayList<String> getSelectedDiscardablePaths()
{
throw new UnsupportedOperationException(
"SVNSelectChangelistTable.getSelectedDiscardablePaths is not " +
"supported");
}
@Override
public void setItems(ArrayList<StatusAndPath> items)
{
for (StatusAndPath item: items)
{
if (selected_.containsKey(item.getPath()))
continue;
selected_.put(item.getPath(),
!uncommitableStatuses.contains(item.getStatus()));
}
super.setItems(items);
}
public Column<StatusAndPath, Boolean> getCommitColumn()
{
return commitColumn_;
}
public void setSelected(StatusAndPath obj, Boolean selected)
{
selected_.put(obj.getPath(), selected);
List<StatusAndPath> list = dataProvider_.getList();
int index = list.indexOf(obj);
if (index >= 0)
list.set(index, list.get(index));
}
@Override
protected void configureTable()
{
commitColumn_ = new Column<StatusAndPath, Boolean>(
new TriStateCheckboxCell<StatusAndPath>(selectionModel_))
{
@Override
public Boolean getValue(StatusAndPath object)
{
return selected_.containsKey(object.getPath()) &&
selected_.get(object.getPath());
}
};
commitColumn_.setHorizontalAlignment(Column.ALIGN_CENTER);
commitColumn_.setSortable(true);
sortHandler_.setComparator(commitColumn_, new Comparator<StatusAndPath>()
{
@Override
public int compare(StatusAndPath a, StatusAndPath b)
{
Boolean a1 = commitColumn_.getValue(a);
Boolean b1 = commitColumn_.getValue(b);
int a2 = a1 == null ? 0 : a1 ? -1 : 1;
int b2 = b1 == null ? 0 : b1 ? -1 : 1;
return a2 - b2;
}
});
table_.addColumn(commitColumn_, "Commit");
table_.setColumnWidth(commitColumn_, "46px");
super.configureTable();
}
public void clearSelection()
{
selected_.clear();
List<StatusAndPath> list = dataProvider_.getList();
for (int i = 0; i < list.size(); i++)
list.set(i, list.get(i));
}
private final HashMap<String, Boolean> selected_ =
new HashMap<String, Boolean>();
private final HashSet<String> uncommitableStatuses = new HashSet<String>();
private Column<StatusAndPath, Boolean> commitColumn_;
}