/*
* Copyright (C) 2015 Patryk Strach
*
* This file is part of Virtual Slide Viewer.
*
* Virtual Slide Viewer 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.
*
* Virtual Slide Viewer 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 Virtual Slide Viewer.
* If not, see <http://www.gnu.org/licenses/>.
*/
package virtualslideviewer.ui.imagelist.view;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.table.AbstractTableModel;
import virtualslideviewer.core.VirtualSlide;
import virtualslideviewer.core.VirtualSlideChangeListener;
import virtualslideviewer.core.VirtualSlideImage;
/**
* An adapter to use a virtual slide's images as a data source for JTable.
*/
public class VirtualSlideImagesTableModel extends AbstractTableModel
{
private static final long serialVersionUID = 1832310162129272001L;
private final VirtualSlide mVirtualSlide;
/**
* @param virtualSlide A virtual slide which will be used as a source of images.
*/
public VirtualSlideImagesTableModel(VirtualSlide virtualSlide)
{
if(virtualSlide == null)
throw new IllegalArgumentException("virtualSlide cannot be null.");
mVirtualSlide = virtualSlide;
addListenersToVirtualSlide();
}
private void addListenersToVirtualSlide()
{
mVirtualSlide.addChangeListener(new VirtualSlideListener());
for(VirtualSlideImage image : mVirtualSlide.getImageList())
{
image.addPropertyChangeListener(new ImagePropertyListener());
}
}
@Override
public int getColumnCount()
{
return 1;
}
@Override
public int getRowCount()
{
return mVirtualSlide.getImageList().size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
return mVirtualSlide.getImageList().get(rowIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return true;
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
return VirtualSlideImage.class;
}
@Override
public String getColumnName(int columnIndex)
{
return null;
}
private class VirtualSlideListener implements VirtualSlideChangeListener
{
@Override
public void onImageAdd(VirtualSlide source, VirtualSlideImage newImage)
{
newImage.addPropertyChangeListener(new ImagePropertyListener());
int imageIndex = mVirtualSlide.getImageList().indexOf(newImage);
fireTableRowsInserted(imageIndex, imageIndex);
}
@Override
public void onImageRemove(VirtualSlide source, VirtualSlideImage removedImage)
{
fireTableDataChanged();
}
}
private class ImagePropertyListener implements PropertyChangeListener
{
@Override
public void propertyChange(PropertyChangeEvent e)
{
int imageIndex = mVirtualSlide.getImageList().indexOf(e.getSource());
fireTableRowsUpdated(imageIndex, imageIndex);
}
}
}