package statalign.postprocess.gui; import java.awt.BorderLayout; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.EtchedBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import statalign.base.Input; import statalign.base.MainManager; import statalign.io.DataType; import statalign.ui.MainFrame; /** * This is the graphical interface for showing the input data * * @author miklos, novak, herman * */ public class InputGUI extends JPanel implements ActionListener, ListSelectionListener{ /** * */ private static final long serialVersionUID = 1L; JPanel pan; Input owner; TextArea text; MainManager manager; JPanel seqPan; private JList sequences; DefaultListModel dlmSequences; JButton jbDelete; JButton jbDeleteAll; public boolean sequencesAreRemovable = true; boolean showWelcome = true; private JScrollPane spSeq; /** * This constructor makes an initial GUI for showing the input sequences and their names. * @param manager The MainManager that handles the MCMC run. */ public InputGUI(final MainManager manager){ super(new BorderLayout()); this.manager = manager; seqPan = new JPanel(new BorderLayout()); dlmSequences = new DefaultListModel(); sequences = new JList(dlmSequences); sequences.setBorder(new EtchedBorder()); sequences.setToolTipText("Input sequences - click on them to view or remove"); sequences.addListSelectionListener(this); spSeq = new JScrollPane(sequences); //setPreferredSize(new Dimension(500,300)); // spSzoveg.getViewport().add(sequences); // spSzoveg.setMaximumSize(this.getSize()); seqPan.add(spSeq,BorderLayout.CENTER); JPanel actionPanel = new JPanel(new BorderLayout()); jbDelete = new JButton("Remove"); jbDelete.addActionListener(this); actionPanel.add(jbDelete,BorderLayout.WEST); jbDeleteAll = new JButton("Remove all"); jbDeleteAll.addActionListener(this); actionPanel.add(jbDeleteAll, BorderLayout.EAST); seqPan.add(actionPanel,BorderLayout.SOUTH); JEditorPane jep = new JEditorPane("text/html", MainFrame.WELCOME_MSG); jep.setEditable(false); jep.setOpaque(false); jep.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent hle) { if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) { String url = hle.getURL().toString(); if(url.endsWith("add")) { manager.frame.addSequences(); } else if(url.endsWith("doc")) manager.frame.helpUsers(); } } }); add(jep, BorderLayout.NORTH); // updateSequences(); } /** * It rereads sequences from MainManager */ public void updateSequences(){ //if(dlmSequences.size() > 0){ dlmSequences.removeAllElements(); //} if(manager.inputData.seqs != null){ if(showWelcome && manager.inputData.seqs.size() > 0) { showWelcome = false; removeAll(); add(seqPan); validate(); } // System.out.println("sequences size: "+manager.seqs.sequences.size()+ // " names size: "+manager.seqs.seqNames.size()); for(int i = 0; i < manager.inputData.seqs.size(); i++){ String s1 = manager.inputData.seqs.getSequence(i); String seqTitle = "<font color=\"000099\">> "+manager.inputData.seqs.getSeqName(i)+"</font>"; for (DataType d : manager.inputData.auxData) { if (d.perSequenceData() && !d.getSummaryAssociatedWith(manager.inputData.seqs.getSeqName(i)).isEmpty()) { seqTitle += "<font color=\"C80000\"> + "+d.getSummaryAssociatedWith(manager.inputData.seqs.getSeqName(i))+"</font>"; } } String s2 = ""; int length = 0; for(int j = 0; j < s1.length(); j++){ if(s1.charAt(j) != ' ' && s1.charAt(j) != '-'){ s2 += s1.charAt(j); length++; if(length % 115 == 0){ s2+="<br>"; } } } dlmSequences.addElement("<html>"+ seqTitle +"\n<br><font face=\"Courier New\">"+s2+"</font></html>"); } } listListener(); } /* public InputGUI(JPanel pan, Input inp, String s){ text = new TextArea(s,pan.getHeight()/13,(int)(pan.getWidth()/6.6),TextArea.SCROLLBARS_BOTH); this.pan = pan; this.owner = inp; text.setFont(new Font("Monospaced",Font.PLAIN,10)); text.setEditable(false); add(text); } public void paintComponent(Graphics gr){ super.paintComponent(gr); text.setColumns((int)(pan.getWidth()/6.6)); text.setRows(pan.getHeight()/13); } */ void listListener(){ jbDeleteAll.setEnabled(false); if(sequences.getModel().getSize() != 0) { jbDeleteAll.setEnabled(sequencesAreRemovable); } int index = sequences.getSelectedIndex(); if(index == -1){ jbDelete.setEnabled(false); updateUI(); } else{ jbDelete.setEnabled(sequencesAreRemovable); updateUI(); } } /** * Handles removing sequences. */ @Override public void actionPerformed(ActionEvent e) { int index = sequences.getSelectedIndex(); int[] indices = sequences.getSelectedIndices(); // Removes the sequences from the model AND from the sequences arrays, i.e. // there is a one-to-one mapping between those. listListener(); if("Remove".equals(e.getActionCommand())) { //listListener(); for (int i = indices.length-1; i >= 0; i--) { int ind = indices[i]; for (DataType d : manager.inputData.auxData) { if (d.perSequenceData()) { d.removeDataAssociatedWith(manager.inputData.seqs.getSeqName(ind)); } } manager.inputData.seqs.remove(ind); dlmSequences.remove(ind); } // Moves the selected index of the list. if(dlmSequences.getSize() != 0){ if(index == dlmSequences.getSize()){ index--; } sequences.setSelectedIndex(index); } } else if("Remove all".equals(e.getActionCommand())) { for (String seqName : manager.inputData.seqs.getSeqnames()) { for (DataType d : manager.inputData.auxData) { if (d.perSequenceData()) { d.removeDataAssociatedWith(seqName); } } } manager.inputData.auxData.clear(); manager.inputData.seqs.clear(); manager.deactivateRNA(); dlmSequences.clear(); jbDeleteAll.setEnabled(false); } } /** * It invokes the list listener when a value changed. */ @Override public void valueChanged(ListSelectionEvent arg0) { listListener(); } }