/*
* #%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.dialog.attributes;
import javax.swing.*;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @noinspection ALL
*/
class AttributesSelectionModel<T> implements ListModel {
private final T[] attributes;
private final List<Integer> selectedAttributes;
private final List<Integer> unselectedAttributes;
private final List<ListDataListener> listeners;
public AttributesSelectionModel(T[] attributes) {
this.attributes = attributes;
this.selectedAttributes = new ArrayList<Integer>();
this.unselectedAttributes = new ArrayList<Integer>();
this.listeners = new ArrayList<ListDataListener>();
for (int i = 0; i < attributes.length; i++)
selectedAttributes.add(i);
}
@Override
public int getSize() {
return selectedAttributes.size();
}
@Override
public Object getElementAt(int index) {
return attributes[selectedAttributes.get(index)];
}
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
public T[] getAttributes() {
return attributes;
}
public List<Integer> getSelectedIndices() {
return Collections.unmodifiableList(selectedAttributes);
}
public void setSelectedIndices(List<Integer> indices) {
List<Integer> unselectAttributes = new ArrayList<Integer>(selectedAttributes);
unselect(unselectAttributes);
select(indices);
}
public List<Integer> getUnselectedIndices() {
return Collections.unmodifiableList(unselectedAttributes);
}
public List<T> getSelectedAttributes() {
List<T> attr = new ArrayList<T>(selectedAttributes.size());
for (int i = 0; i < selectedAttributes.size(); i++)
attr.add(attributes[selectedAttributes.get(i)]);
return attr;
}
public List<T> getUnselectedAttributes() {
List<T> attr = new ArrayList<T>(unselectedAttributes.size());
for (int i = 0; i < unselectedAttributes.size(); i++)
attr.add(attributes[unselectedAttributes.get(i)]);
return attr;
}
public void select(List<Integer> indices) {
for (Integer i : indices) {
if (unselectedAttributes.contains(i)) {
unselectedAttributes.remove(i);
selectedAttributes.add(i);
}
}
fireChange();
}
public void unselect(List<Integer> indices) {
for (Integer i : indices) {
if (selectedAttributes.contains(i)) {
selectedAttributes.remove(i);
unselectedAttributes.add(i);
}
}
fireChange();
}
public void moveUp(List<Integer> indices) {
for (Integer index : indices) {
int i = selectedAttributes.indexOf(index);
if (i >= 0) {
Integer tmp = selectedAttributes.get(i);
selectedAttributes.set(i, selectedAttributes.get(i - 1));
selectedAttributes.set(i - 1, tmp);
}
}
fireChange();
}
public void moveDown(List<Integer> indices) {
for (Integer index : indices) {
int i = selectedAttributes.indexOf(index);
if (i >= 0) {
Integer tmp = selectedAttributes.get(i);
selectedAttributes.set(i, selectedAttributes.get(i + 1));
selectedAttributes.set(i + 1, tmp);
}
}
fireChange();
}
private void fireChange() {
int size = selectedAttributes.size();
ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, size > 0 ? size - 1 : 0);
for (ListDataListener l : listeners)
l.contentsChanged(e);
}
}