package org.seqcode.data.seqdata.tools.editor;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.security.AccessControlException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;
import org.seqcode.data.core.ExptType;
import org.seqcode.data.seqdata.SeqAlignment;
import org.seqcode.data.seqdata.SeqDataLoader;
import org.seqcode.data.seqdata.SeqDataModifier;
import org.seqcode.data.seqdata.SeqExpt;
import org.seqcode.gseutils.NotFoundException;
import org.seqcode.gseutils.Pair;
import org.seqcode.projects.seqview.components.SeqAlignmentTableModel;
import org.seqcode.viz.components.GenericEditTablePanel;
public class SeqExptEditTablePanel extends GenericEditTablePanel<SeqExpt> {
private SeqDataLoader seqLoader;
private SeqDataModifier seqModifier;
private TreeSet<SeqExpt> expts;
private JComboBox jcbType;
private JTextField regexLab, regexCond, regexTarget, regexCell, regexRep;
private SeqExptTableModel filteredModel;
public SeqExptEditTablePanel() {
try {
seqLoader = new SeqDataLoader(true, true);
seqModifier = new SeqDataModifier(seqLoader);
} catch (AccessControlException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
seqLoader = null;
}
expts = new TreeSet<SeqExpt>();
filteredModel = new SeqExptTableModel();
init(filteredModel);
}
public JPanel getInputsPanel() {
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new GridLayout(2,6));
try {
ArrayList<String> types = new ArrayList<String>();
types.add("");
for(ExptType e : seqLoader.getMetadataLoader().loadAllExptTypes(false))
types.add(e.getName());
Collections.sort(types);
jcbType = new JComboBox(types.toArray()); jcbType.setEditable(true);
jcbType.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexLab = new JTextField(); regexLab.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexCond = new JTextField(); regexCond.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexTarget = new JTextField(); regexTarget.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexCell = new JTextField(); regexCell.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
regexRep = new JTextField(); regexRep.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){filter();}});
Font labelFont = new Font("SansSerif", Font.PLAIN, 10);
Border paddingBorder = BorderFactory.createEmptyBorder(5,5,5,5);
JLabel labelExpt = new JLabel("ExptType"); labelExpt.setFont(labelFont); labelExpt.setBorder(paddingBorder);
JLabel labelLab = new JLabel("Lab"); labelLab.setFont(labelFont); labelLab.setBorder(paddingBorder);
JLabel labelCond = new JLabel("ExptCondition"); labelCond.setFont(labelFont); labelCond.setBorder(paddingBorder);
JLabel labelTarget = new JLabel("ExptTarget"); labelTarget.setFont(labelFont); labelTarget.setBorder(paddingBorder);
JLabel labelCell = new JLabel("CellLine"); labelCell.setFont(labelFont); labelCell.setBorder(paddingBorder);
JLabel labelRep = new JLabel("Replicate"); labelRep.setFont(labelFont); labelRep.setBorder(paddingBorder);
inputPanel.add(labelExpt);
inputPanel.add(labelLab);
inputPanel.add(labelCond);
inputPanel.add(labelTarget);
inputPanel.add(labelCell);
inputPanel.add(labelRep);
inputPanel.add(jcbType);
inputPanel.add(regexLab);
inputPanel.add(regexCond);
inputPanel.add(regexTarget);
inputPanel.add(regexCell);
inputPanel.add(regexRep);
} catch (SQLException e) {
e.printStackTrace();
}
return inputPanel;
}
public void retrieveData() {
try {
synchronized(expts) {
expts.clear();
expts.addAll(seqLoader.loadAllExperiments());
}
} catch (SQLException e) {
throw new RuntimeException(e.toString(), e);
}
}
public void updateComponents() {
filteredModel.clear();
synchronized(expts) {
for (SeqExpt l : expts) {
filteredModel.addObject(l);
}
}
}
public void filter() {
Pattern pattType=null, pattLab=null, pattCond=null, pattTarget=null, pattCell=null, pattRep=null;
String regType = (String) jcbType.getSelectedItem();
regType=regType.toLowerCase();
if(regType != null && regType.length() > 0)
pattType = Pattern.compile(regType);
String regLab = regexLab.getText().trim();
regLab = regLab.toLowerCase();
if(regLab != null && regLab.length() > 0)
pattLab = Pattern.compile(regLab);
String regCond = regexCond.getText().trim();
regCond = regCond.toLowerCase();
if(regCond != null && regCond.length() > 0)
pattCond = Pattern.compile(regCond);
String regTarget = regexTarget.getText().trim();
regTarget = regTarget.toLowerCase();
if(regTarget != null && regTarget.length() > 0)
pattTarget = Pattern.compile(regTarget);
String regCell = regexCell.getText().trim();
regCell = regCell.toLowerCase();
if(regCell != null && regCell.length() > 0)
pattCell = Pattern.compile(regCell);
String regRep = regexRep.getText().trim();
regRep = regRep.toLowerCase();
if(regRep != null && regRep.length() > 0)
pattRep = Pattern.compile(regRep);
synchronized(expts) {
List<SeqExpt> filteredExpts = new ArrayList<SeqExpt>();
for (SeqExpt expt : expts){
if( (pattType == null || pattType.matcher(expt.getExptType().getName().toLowerCase()).find()) &&
(pattLab == null || pattLab.matcher(expt.getLab().getName().toLowerCase()).find()) &&
(pattCond == null || pattCond.matcher(expt.getExptCondition().getName().toLowerCase()).find()) &&
(pattTarget == null || pattTarget.matcher(expt.getExptTarget().getName().toLowerCase()).find()) &&
(pattCell == null || pattCell.matcher(expt.getCellLine().getName().toLowerCase()).find()) &&
(pattRep == null || pattRep.matcher(expt.getReplicate().toLowerCase()).find()) &&
(((String)this.speciesCBox.getSelectedItem()).equals("") || ((String)this.speciesCBox.getSelectedItem()).equals(expt.getOrganism().getName()))
) {
filteredExpts.add(expt);
}
}
filteredModel.clear();
for (SeqExpt l : filteredExpts) {
filteredModel.addObject(l);
}
}
}
public void edit(Collection<SeqExpt> toEdit){
SeqDataEditEntryForm editForm = new SeqDataEditEntryForm(seqLoader, seqModifier, toEdit);
editForm.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent pcEvt) {
if (pcEvt.getPropertyName().equals(SeqDataEditEntryForm.FINISHED)) {
updateData();
filter();
}
}
});
}
public void close() {
if(seqModifier!=null){
//This will delete any now-redundant Lab, ExptTargets, etc from the db
try {
JOptionPane.showMessageDialog(null, "Please wait... cleaning up core database", "Working...", JOptionPane.INFORMATION_MESSAGE);
seqModifier.coreCleanup();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (seqLoader != null) {
seqLoader.close();
}
}
}