package org.gitools.ui.app.fileimport.wizard.excel;
/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Biomedical Genomics Lab
* %%
* 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%
*/
import org.apache.poi.ss.usermodel.Cell;
import org.gitools.ui.platform.wizard.AbstractWizardPage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
public class SelectColumnsPage extends AbstractWizardPage {
private JPanel mainPanel;
private JComboBox rowsCellsCombo;
private JComboBox columnsCellsCombo;
private JList valueCellsList;
private JCheckBox hideNonNumericHeadersCheckBox;
private ExcelReader reader;
private DefaultComboBoxModel rowsCells;
private DefaultComboBoxModel colsCells;
private CheckListItem[] values;
@Override
public JComponent createControls() {
return mainPanel;
}
@Override
public void updateControls() {
try {
final List<ExcelHeader> allHeaders = new ArrayList<>();
final List<ExcelHeader> numericHeaders = new ArrayList<>();
for (ExcelHeader header : reader.getHeaders()) {
int type = header.getType();
if (type == Cell.CELL_TYPE_BOOLEAN || type == Cell.CELL_TYPE_NUMERIC) {
numericHeaders.add(header);
}
allHeaders.add(header);
}
if (allHeaders.size() < 2 || numericHeaders.size() < 1) {
throw new RuntimeException("At least we need three columns (two string and one numeric column) to create a matrix");
}
rowsCells = new DefaultComboBoxModel(allHeaders.toArray());
rowsCells.setSelectedItem(allHeaders.get(0));
rowsCellsCombo.setModel(rowsCells);
colsCells = new DefaultComboBoxModel(allHeaders.toArray());
colsCells.setSelectedItem(allHeaders.get(1));
columnsCellsCombo.setModel(colsCells);
createCheckListItems(numericHeaders);
valueCellsList.setListData(values);
valueCellsList.setCellRenderer(new CheckListRenderer());
valueCellsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// Add a mouse listener to handle changing selection
valueCellsList.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
JList list = (JList) event.getSource();
int index = list.locationToIndex(event.getPoint());
CheckListItem item = (CheckListItem) list.getModel().getElementAt(index);
item.setSelected(!item.isSelected());
list.repaint(list.getCellBounds(index, index));
fireUpdated();
}
});
hideNonNumericHeadersCheckBox.setEnabled(true);
hideNonNumericHeadersCheckBox.setSelected(true);
hideNonNumericHeadersCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (hideNonNumericHeadersCheckBox.isSelected()) {
createCheckListItems(numericHeaders);
} else {
createCheckListItems(allHeaders);
}
valueCellsList.setListData(values);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void createCheckListItems(List<ExcelHeader> headers) {
values = new CheckListItem[headers.size()];
for (int i = 0; i < headers.size(); i++) {
values[i] = new CheckListItem(headers.get(i));
}
}
@Override
public boolean isComplete() {
if (values == null) {
return false;
}
for (CheckListItem value : values) {
if (value.isSelected()) {
return true;
}
}
return false;
}
public ExcelReader getReader() {
return reader;
}
public void setReader(ExcelReader reader) {
this.reader = reader;
}
public int getSelectedColumn() {
ExcelHeader column = (ExcelHeader) colsCells.getSelectedItem();
return column.getPos();
}
public int getSelectedRow() {
ExcelHeader row = (ExcelHeader) rowsCells.getSelectedItem();
return row.getPos();
}
public List<Integer> getSelectedValues() {
List<Integer> valuesPos = new ArrayList<>(values.length);
for (CheckListItem v : values) {
if (v.isSelected()) {
valuesPos.add(v.getHeader().getPos());
}
}
return valuesPos;
}
private class CheckListItem {
private final ExcelHeader header;
private boolean isSelected = false;
public CheckListItem(ExcelHeader header) {
this.header = header;
}
public ExcelHeader getHeader() {
return header;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public String toString() {
return header.toString();
}
}
private class CheckListRenderer extends JCheckBox implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
setEnabled(list.isEnabled());
setSelected(((CheckListItem) value).isSelected());
setFont(list.getFont());
setBackground(list.getBackground());
setForeground(list.getForeground());
setText(value.toString());
return this;
}
}
}