blob: d806eb2e06b8cb40d0033368cf5683cda961809a [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ui;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.ui.EditableModel;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.*;
/**
* @author yole
*/
public class CollectionListModel<T> extends AbstractListModel implements EditableModel {
private final List<T> myItems;
public CollectionListModel(@NotNull final Collection<? extends T> items) {
myItems = new ArrayList<T>(items);
}
public CollectionListModel(@NotNull final List<? extends T> items) {
this((Collection<? extends T>)items);
}
public CollectionListModel(final T... items) {
myItems = ContainerUtilRt.newArrayList(items);
}
@Override
public int getSize() {
return myItems.size();
}
@Override
public T getElementAt(final int index) {
return myItems.get(index);
}
public void add(final T element) {
int i = myItems.size();
myItems.add(element);
fireIntervalAdded(this, i, i);
}
public void add(int i,final T element) {
myItems.add(i, element);
fireIntervalAdded(this, i, i);
}
public void add(@NotNull final List<? extends T> elements) {
if (elements.isEmpty()) return;
int i = myItems.size();
myItems.addAll(elements);
fireIntervalAdded(this, i, i + elements.size() - 1);
}
public void remove(@NotNull final T element) {
int i = myItems.indexOf(element);
myItems.remove(element);
fireIntervalRemoved(this, i, i);
}
public void setElementAt(@NotNull final T element, final int index) {
myItems.set(index, element);
fireContentsChanged(this, index, index);
}
public void remove(final int index) {
myItems.remove(index);
fireIntervalRemoved(this, index, index);
}
public void removeAll() {
int size = myItems.size();
if (size > 0) {
myItems.clear();
fireIntervalRemoved(this, 0, size - 1);
}
}
public void contentsChanged(@NotNull final T element) {
int i = myItems.indexOf(element);
fireContentsChanged(this, i, i);
}
public void sort(final Comparator<T> comparator) {
Collections.sort(myItems, comparator);
}
@NotNull
public List<T> getItems() {
return Collections.unmodifiableList(myItems);
}
public void replaceAll(@NotNull final List<? extends T> elements) {
removeAll();
add(elements);
}
@Override
public void addRow() {
}
@Override
public void removeRow(int index) {
remove(index);
}
@Override
public void exchangeRows(int oldIndex, int newIndex) {
Collections.swap(myItems, oldIndex, newIndex);
fireContentsChanged(this, oldIndex, oldIndex);
fireContentsChanged(this, newIndex, newIndex);
}
@Override
public boolean canExchangeRows(int oldIndex, int newIndex) {
return true;
}
@NonNls
@Override
public String toString() {
return getClass().getName() + " (" + getSize() + " elements)";
}
public List<T> toList() {
return new ArrayList<T>(myItems);
}
public int getElementIndex(T item) {
return myItems.indexOf(item);
}
}