/*
* Copyright 2004 - 2012 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder 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.
*
* PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id: MultiFileRestoreTableModel.java 19700 2012-09-01 04:48:56Z glasgow $
*/
package de.dal33t.powerfolder.ui.wizard.table;
import de.dal33t.powerfolder.PFComponent;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.util.Translation;
import de.dal33t.powerfolder.util.compare.FileInfoComparator;
import de.dal33t.powerfolder.util.compare.ReverseComparator;
import de.dal33t.powerfolder.ui.model.SortedTableModel;
import de.dal33t.powerfolder.ui.util.UIUtil;
import javax.swing.table.TableModel;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.CopyOnWriteArrayList;
public class MultiFileRestoreTableModel extends PFComponent implements TableModel, SortedTableModel {
private static final String[] COLUMNS = {
Translation.getTranslation("multi_file_restore_table_model.file_name"),
Translation.getTranslation("multi_file_restore_table_model.modified_date"),
Translation.getTranslation("multi_file_restore_table_model.version"),
Translation.getTranslation("multi_file_restore_table_model.size")};
static final int COL_FILE_NAME = 0;
static final int COL_MODIFIED_DATE = 1;
static final int COL_VERSION = 2;
static final int COL_SIZE = 3;
private final List<FileInfo> fileInfos;
private int fileInfoComparatorType = -1;
private boolean sortAscending = true;
private int sortColumn;
private final List<TableModelListener> listeners;
/**
* Constructor
*
* @param controller
*/
public MultiFileRestoreTableModel(Controller controller) {
super(controller);
fileInfos = new ArrayList<FileInfo>();
listeners = new CopyOnWriteArrayList<TableModelListener>();
}
public int getRowCount() {
return fileInfos.size();
}
public int getColumnCount() {
return COLUMNS.length;
}
public String getColumnName(int columnIndex) {
return COLUMNS[columnIndex];
}
public Class<?> getColumnClass(int columnIndex) {
return FileInfo.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return fileInfos.get(rowIndex);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
throw new UnsupportedOperationException("Cannot modify MultiFileRestoreTableModel");
}
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public int getSortColumn() {
return sortColumn;
}
public boolean isSortAscending() {
return sortAscending;
}
public boolean sortBy(int columnIndex) {
sortColumn = columnIndex;
switch (columnIndex) {
case COL_FILE_NAME:
return sortMe(FileInfoComparator.BY_NAME);
case COL_VERSION:
return sortMe(FileInfoComparator.BY_VERSION);
case COL_SIZE:
return sortMe(FileInfoComparator.BY_SIZE);
case COL_MODIFIED_DATE:
return sortMe(FileInfoComparator.BY_MODIFIED_DATE);
}
sortColumn = -1;
return false;
}
/**
* Re-sorts the file list with the new comparator only if comparator differs
* from old one
*
* @param newComparatorType
* @return if the table was freshly sorted
*/
public boolean sortMe(int newComparatorType) {
if (fileInfos.isEmpty()) {
return false;
}
int oldComparatorType = fileInfoComparatorType;
fileInfoComparatorType = newComparatorType;
if (oldComparatorType != newComparatorType) {
boolean sorted = sort();
if (sorted) {
fireModelChanged();
return true;
}
}
return false;
}
private boolean sort() {
if (fileInfoComparatorType != -1) {
FileInfoComparator comparator = new FileInfoComparator(
fileInfoComparatorType);
synchronized (fileInfos) {
if (sortAscending) {
Collections.sort(fileInfos, comparator);
} else {
Collections.sort(fileInfos, new ReverseComparator<FileInfo>(
comparator));
}
}
return true;
}
return false;
}
public void reverseList() {
sortAscending = !sortAscending;
synchronized (fileInfos) {
Collections.reverse(fileInfos);
}
fireModelChanged();
}
private void fireModelChanged() {
TableModelEvent e = new TableModelEvent(this);
for (TableModelListener listener : listeners) {
listener.tableChanged(e);
}
}
public void setAscending(boolean ascending) {
sortAscending = ascending;
}
public void setFileInfos(List<FileInfo> fileInfos) {
synchronized (this.fileInfos) {
this.fileInfos.clear();
this.fileInfos.addAll(fileInfos);
}
update();
}
/**
* Update the model in response to a change.
*/
private void update() {
Runnable runnable = new Runnable() {
public void run() {
sort();
fireModelChanged();
}
};
UIUtil.invokeLaterInEDT(runnable);
}
public List<FileInfo> getFileInfos() {
return Collections.unmodifiableList(fileInfos);
}
}