/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* 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 3 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, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.analysis.groupcomparison.wizard;
import org.gitools.analysis.groupcomparison.dimensiongroups.DimensionGroup;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class DimensionGroupTableModel extends AbstractTableModel {
private static final String[] columnName = new String[]{"Name", "Property", "Group #"};
private static final Class<?>[] columnClass = new Class<?>[]{String.class, String.class, Integer.class};
private List<IndexedGroup> indexedGroupList = null;
private class IndexedGroup implements Comparable<IndexedGroup> {
DimensionGroup group;
int index;
public IndexedGroup(DimensionGroup group, int index) {
this.group = group;
this.index = index;
}
public DimensionGroup getGroup() {
return group;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public int compareTo(IndexedGroup o) {
return this.index - o.getIndex();
}
}
public DimensionGroupTableModel() {
super();
indexedGroupList = new ArrayList<IndexedGroup>(0);
}
public void setGroups(DimensionGroup[] groups) {
indexedGroupList = new ArrayList<>(groups.length);
for (int i = 0; i < groups.length; i++) {
indexedGroupList.add(new IndexedGroup(groups[i], i + 1));
}
fireTableDataChanged();
}
@Override
public int getRowCount() {
return indexedGroupList.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int columnIndex) {
return columnName[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnClass[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex != 1 & rowIndex > -1) {
return true;
}
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return indexedGroupList.get(rowIndex).getGroup().getName();
case 1:
return indexedGroupList.get(rowIndex).getGroup().getProperty();
case 2:
return indexedGroupList.get(rowIndex).getIndex();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
indexedGroupList.get(rowIndex).getGroup().setName((String) aValue);
break;
case 1:
indexedGroupList.set(rowIndex, (IndexedGroup) aValue);
break;
case 2:
indexedGroupList.get(rowIndex).setIndex((int) aValue);
break;
}
}
public List<DimensionGroup> getGroupList() {
List list = new ArrayList<DimensionGroup>();
for (IndexedGroup g : indexedGroupList)
list.add(g.getGroup());
return list;
}
public void addGroup(final DimensionGroup group) {
indexedGroupList.add(new IndexedGroup(group, indexedGroupList.size() + 1));
fireTableDataChanged();
}
public void setGroup(final DimensionGroup group, int position) {
int groupIndex = indexedGroupList.get(position).getIndex();
indexedGroupList.set(position, new IndexedGroup(group, groupIndex));
fireTableDataChanged();
}
@Override
public void fireTableDataChanged() {
reorder();
super.fireTableDataChanged();
}
private void reorder() {
Collections.sort(indexedGroupList);
int next = 1;
int lastSet = -1;
int currentGroup;
int lastGroup = -1;
for (IndexedGroup g : indexedGroupList) {
currentGroup = g.getIndex();
if (currentGroup != lastGroup) {
g.setIndex(next++);
lastSet = g.getIndex();
} else {
g.setIndex(lastSet);
}
lastGroup = currentGroup;
}
}
void removeGroups(int[] selectedRows) {
List<Object> objects = new ArrayList<>(selectedRows.length);
for (int index : selectedRows) {
objects.add(indexedGroupList.get(index));
}
indexedGroupList.removeAll(objects);
fireTableDataChanged();
}
public DimensionGroup getGroupAt(int index) {
return indexedGroupList.get(index).getGroup();
}
}