package icy.gui.inspector;
import icy.gui.component.AbstractRoisPanel.BaseColumnInfo;
import icy.gui.component.button.IcyButton;
import icy.preferences.XMLPreferences;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.roi.ROIDescriptor;
import icy.roi.ROIUtil;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class RoiSettingPanel extends JPanel implements ActionListener
{
// GUI
private JScrollPane scrollPaneView;
private JScrollPane scrollPaneExport;
private JTable tableView;
private JTable tableExport;
private JPanel panelExportTop;
private JLabel lblColumnSelectionFor;
private JLabel lblNewLabel;
private IcyButton upViewBtn;
private IcyButton downViewBtn;
private IcyButton upExportBtn;
private IcyButton downExportBtn;
// internals
List<BaseColumnInfo> idsView;
List<BaseColumnInfo> idsExport;
private AbstractTableModel viewModel;
private AbstractTableModel exportModel;
private final XMLPreferences prefView;
private final XMLPreferences prefExport;
/**
* Create the panel.
*
* @param exportPreferences
*/
public RoiSettingPanel(XMLPreferences viewPreferences, XMLPreferences exportPreferences)
{
super();
prefView = viewPreferences;
prefExport = exportPreferences;
final Set<ROIDescriptor> descriptors = ROIUtil.getROIDescriptors().keySet();
idsView = new ArrayList<BaseColumnInfo>();
idsExport = new ArrayList<BaseColumnInfo>();
// build view and export lists
for (ROIDescriptor descriptor : descriptors)
{
idsView.add(new BaseColumnInfo(descriptor, prefView, false));
idsExport.add(new BaseColumnInfo(descriptor, prefExport, true));
}
sortLists();
initialize();
viewModel = new AbstractTableModel()
{
@Override
public int getColumnCount()
{
return 2;
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
switch (columnIndex)
{
case 0:
// name
return String.class;
case 1:
// visibility
return Boolean.class;
}
return String.class;
}
@Override
public String getColumnName(int column)
{
switch (column)
{
case 0:
return "Column name";
case 1:
return "Visible";
}
return "";
}
@Override
public int getRowCount()
{
return idsView.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
switch (columnIndex)
{
case 0:
// name
return idsView.get(rowIndex).descriptor.getName();
case 1:
// visibility
return Boolean.valueOf(idsView.get(rowIndex).visible);
}
return null;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return (columnIndex == 1);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
// visibility
if (columnIndex == 1)
idsView.get(rowIndex).visible = ((Boolean) aValue).booleanValue();
}
};
exportModel = new AbstractTableModel()
{
@Override
public int getColumnCount()
{
return 2;
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
switch (columnIndex)
{
case 0:
// name
return String.class;
case 1:
// visibility
return Boolean.class;
}
return String.class;
}
@Override
public String getColumnName(int column)
{
switch (column)
{
case 0:
return "Column name";
case 1:
return "Visible";
}
return "";
}
@Override
public int getRowCount()
{
return idsExport.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
switch (columnIndex)
{
case 0:
// name
return idsExport.get(rowIndex).descriptor.getName();
case 1:
// visibility
return Boolean.valueOf(idsExport.get(rowIndex).visible);
}
return null;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return (columnIndex == 1);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
// visibility
if (columnIndex == 1)
idsExport.get(rowIndex).visible = ((Boolean) aValue).booleanValue();
}
};
TableColumnModel columnModel;
TableColumn column;
tableView.setModel(viewModel);
columnModel = tableView.getColumnModel();
column = columnModel.getColumn(0);
column.setPreferredWidth(150);
column.setMinWidth(80);
column = columnModel.getColumn(1);
column.setResizable(false);
column.setPreferredWidth(50);
column.setMaxWidth(50);
column.setMinWidth(30);
tableExport.setModel(exportModel);
columnModel = tableExport.getColumnModel();
column = columnModel.getColumn(0);
column.setPreferredWidth(150);
column.setMinWidth(80);
column = columnModel.getColumn(1);
column.setResizable(false);
column.setPreferredWidth(50);
column.setMaxWidth(50);
column.setMinWidth(30);
upViewBtn.addActionListener(this);
downViewBtn.addActionListener(this);
upExportBtn.addActionListener(this);
downExportBtn.addActionListener(this);
}
private void initialize()
{
setLayout(new BorderLayout(0, 0));
JSplitPane splitPane = new JSplitPane();
splitPane.setResizeWeight(0.5);
add(splitPane, BorderLayout.CENTER);
JPanel panelView = new JPanel();
splitPane.setLeftComponent(panelView);
panelView.setLayout(new BorderLayout(0, 0));
scrollPaneView = new JScrollPane();
panelView.add(scrollPaneView, BorderLayout.CENTER);
tableView = new JTable();
tableView.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
tableView.setRowSelectionAllowed(true);
scrollPaneView.setViewportView(tableView);
JPanel panelViewTop = new JPanel();
panelView.add(panelViewTop, BorderLayout.NORTH);
GridBagLayout gbl_panelViewTop = new GridBagLayout();
gbl_panelViewTop.columnWidths = new int[] {0, 0, 0, 0};
gbl_panelViewTop.rowHeights = new int[] {14, 0};
gbl_panelViewTop.columnWeights = new double[] {1.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_panelViewTop.rowWeights = new double[] {0.0, Double.MIN_VALUE};
panelViewTop.setLayout(gbl_panelViewTop);
lblColumnSelectionFor = new JLabel("Columns to display");
GridBagConstraints gbc_lblColumnSelectionFor = new GridBagConstraints();
gbc_lblColumnSelectionFor.insets = new Insets(0, 0, 0, 5);
gbc_lblColumnSelectionFor.gridx = 0;
gbc_lblColumnSelectionFor.gridy = 0;
panelViewTop.add(lblColumnSelectionFor, gbc_lblColumnSelectionFor);
upViewBtn = new IcyButton(new IcyIcon(ResourceUtil.ICON_ARROW_UP));
upViewBtn.setToolTipText("Change order of selected column(s)");
upViewBtn.setFlat(true);
GridBagConstraints gbc_upViewBtn = new GridBagConstraints();
gbc_upViewBtn.insets = new Insets(0, 0, 0, 5);
gbc_upViewBtn.gridx = 1;
gbc_upViewBtn.gridy = 0;
panelViewTop.add(upViewBtn, gbc_upViewBtn);
downViewBtn = new IcyButton(new IcyIcon(ResourceUtil.ICON_ARROW_DOWN));
downViewBtn.setToolTipText("Change order of selected column(s)");
downViewBtn.setFlat(true);
GridBagConstraints gbc_downViewBtn = new GridBagConstraints();
gbc_downViewBtn.gridx = 2;
gbc_downViewBtn.gridy = 0;
panelViewTop.add(downViewBtn, gbc_downViewBtn);
JPanel panelExport = new JPanel();
splitPane.setRightComponent(panelExport);
panelExport.setLayout(new BorderLayout(0, 0));
scrollPaneExport = new JScrollPane();
panelExport.add(scrollPaneExport, BorderLayout.CENTER);
tableExport = new JTable();
tableExport.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
tableExport.setRowSelectionAllowed(true);
scrollPaneExport.setViewportView(tableExport);
panelExportTop = new JPanel();
panelExport.add(panelExportTop, BorderLayout.NORTH);
GridBagLayout gbl_panelExportTop = new GridBagLayout();
gbl_panelExportTop.columnWidths = new int[] {0, 0, 0, 0};
gbl_panelExportTop.rowHeights = new int[] {14, 0};
gbl_panelExportTop.columnWeights = new double[] {1.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_panelExportTop.rowWeights = new double[] {0.0, Double.MIN_VALUE};
panelExportTop.setLayout(gbl_panelExportTop);
lblNewLabel = new JLabel("Columns to export (XLS or CSV)");
GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
gbc_lblNewLabel.insets = new Insets(0, 0, 0, 5);
gbc_lblNewLabel.gridx = 0;
gbc_lblNewLabel.gridy = 0;
panelExportTop.add(lblNewLabel, gbc_lblNewLabel);
upExportBtn = new IcyButton(new IcyIcon(ResourceUtil.ICON_ARROW_UP));
upExportBtn.setToolTipText("Change order of selected column(s)");
upExportBtn.setFlat(true);
GridBagConstraints gbc_upExportBtn = new GridBagConstraints();
gbc_upExportBtn.insets = new Insets(0, 0, 0, 5);
gbc_upExportBtn.gridx = 1;
gbc_upExportBtn.gridy = 0;
panelExportTop.add(upExportBtn, gbc_upExportBtn);
downExportBtn = new IcyButton(new IcyIcon(ResourceUtil.ICON_ARROW_DOWN));
downExportBtn.setToolTipText("Change order of selected column(s)");
downExportBtn.setFlat(true);
GridBagConstraints gbc_downExportBtn = new GridBagConstraints();
gbc_downExportBtn.gridx = 2;
gbc_downExportBtn.gridy = 0;
panelExportTop.add(downExportBtn, gbc_downExportBtn);
}
void fixOrders()
{
int order;
order = 0;
for (BaseColumnInfo columnInfo : idsView)
columnInfo.order = order++;
order = 0;
for (BaseColumnInfo columnInfo : idsExport)
columnInfo.order = order++;
}
/**
* Sort lists on their order
*/
void sortLists()
{
// sort tables
Collections.sort(idsView);
Collections.sort(idsExport);
// and fix orders
fixOrders();
}
/**
* Save columns setting to preferences
*/
public void save()
{
sortLists();
for (BaseColumnInfo columnInfo : idsView)
columnInfo.save(prefView);
for (BaseColumnInfo columnInfo : idsExport)
columnInfo.save(prefExport);
}
List<BaseColumnInfo> getSelected(JTable table, List<BaseColumnInfo> columnInfos)
{
final List<BaseColumnInfo> result = new ArrayList<BaseColumnInfo>();
final int[] selected = table.getSelectedRows();
for (int index : selected)
result.add(columnInfos.get(index));
return result;
}
void restoreSelected(JTable table, List<BaseColumnInfo> columnInfos, List<BaseColumnInfo> selected)
{
final ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.setValueIsAdjusting(true);
try
{
selectionModel.clearSelection();
for (BaseColumnInfo bci : selected)
{
final int index = columnInfos.indexOf(bci);
if (index >= 0)
selectionModel.addSelectionInterval(index, index);
}
}
finally
{
selectionModel.setValueIsAdjusting(false);
}
}
@Override
public void actionPerformed(ActionEvent e)
{
final Object source = e.getSource();
final JTable table;
final List<BaseColumnInfo> columnInfos;
final int v;
if ((source == upViewBtn) || (source == downViewBtn))
{
table = tableView;
columnInfos = idsView;
}
else if ((source == upExportBtn) || (source == downExportBtn))
{
table = tableExport;
columnInfos = idsExport;
}
else
{
table = null;
columnInfos = null;
}
if ((source == upViewBtn) || (source == upExportBtn))
v = -1;
else if ((source == downViewBtn) || (source == downExportBtn))
v = 1;
else
v = 0;
if ((table != null) && (columnInfos != null))
{
final List<BaseColumnInfo> selected = getSelected(table, columnInfos);
// update order of selected area
for (BaseColumnInfo bci : selected)
bci.order = bci.order + v;
if (v == -1)
{
// change order of previous item
final int firstSelected = table.getSelectionModel().getMinSelectionIndex();
if ((firstSelected != -1) && (firstSelected > 0))
columnInfos.get(firstSelected - 1).order += table.getSelectedRowCount();
}
else
{
// change order of next item
final int lastSelected = table.getSelectionModel().getMaxSelectionIndex();
if ((lastSelected != -1) && (lastSelected < (columnInfos.size() - 1)))
columnInfos.get(lastSelected + 1).order -= table.getSelectedRowCount();
}
// sort lists
sortLists();
restoreSelected(table, columnInfos, selected);
// refresh table data
viewModel.fireTableRowsUpdated(0, idsView.size() - 1);
exportModel.fireTableRowsUpdated(0, idsExport.size() - 1);
}
}
}