diff --git a/uk/ac/sanger/artemis/components/alignment/ReadGroupsFrame.java b/uk/ac/sanger/artemis/components/alignment/ReadGroupsFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..acc32485e24775241e85327a582484061d6dba57 --- /dev/null +++ b/uk/ac/sanger/artemis/components/alignment/ReadGroupsFrame.java @@ -0,0 +1,178 @@ +package uk.ac.sanger.artemis.components.alignment; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.List; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JColorChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + +import net.sf.samtools.SAMReadGroupRecord; + +class ReadGroupFrame extends JFrame +{ + private static final long serialVersionUID = 1L; + private LineAttributes[] colours; + private List<SAMReadGroupRecord> hideReadGroups = new Vector<SAMReadGroupRecord>(); + + ReadGroupFrame(List<SAMReadGroupRecord> readGroups, BamView bamView) + { + super("Read Groups"); + + colours = LineAttributes.init(readGroups.size()); + update(readGroups, bamView); + + JFrame f = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, bamView); + + int hgt = 250; + if(hgt < f.getHeight()/2) + hgt = f.getHeight()/2; + setPreferredSize(new Dimension(300, hgt)); + + pack(); + + final Point p = f.getLocationOnScreen(); + final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); + int y = (screen.height-getSize().height)/2; + if(y < 10) + y = 10; + int x = p.x-getSize().width; + if(x < 10) + x = 10; + setLocation(new Point(x, y)); + + setDefaultCloseOperation(HIDE_ON_CLOSE); + } + + private void update(final List<SAMReadGroupRecord> readGroups, + final BamView bamView) + { + final JPanel mainPanel = new JPanel(new BorderLayout()); + final JPanel panel = new JPanel(new GridBagLayout()); + final JScrollPane jsp = new JScrollPane(panel); + mainPanel.add(jsp, BorderLayout.CENTER); + getContentPane().add(mainPanel); + + final JButton close = new JButton("CLOSE"); + close.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent arg0) + { + setVisible(false); + } + }); + mainPanel.add(close, BorderLayout.SOUTH); + + final GridBagConstraints c = new GridBagConstraints(); + c.gridy = 0; + c.anchor = GridBagConstraints.WEST; + + if(readGroups.size() == 0) + { + panel.add(new JLabel("No read groups"), c); + return; + } + + c.gridx = 0; + JLabel rgLab = new JLabel("Read Groups"); + rgLab.setFont(rgLab.getFont().deriveFont(Font.BOLD)); + panel.add(rgLab, c); + + c.gridx = 1; + JLabel colLab = new JLabel("Colour"); + colLab.setFont(rgLab.getFont().deriveFont(Font.BOLD)); + panel.add(colLab, c); + + final JButton toggle = new JButton("Toggle"); + final List<JCheckBox> checkBoxes = new Vector<JCheckBox>(); + c.gridx = 2; + panel.add(toggle, c); + toggle.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent arg0) + { + for(JCheckBox cb: checkBoxes) + cb.setSelected(!cb.isSelected()); + } + }); + + c.gridy = 1; + for(int i=0; i<readGroups.size(); i++) + { + final SAMReadGroupRecord grp = readGroups.get(i); + + c.gridx = 0; + final JLabel lab = new JLabel(grp.getId()); + lab.setToolTipText(grp.getDescription()); + panel.add(lab, c); + + c.gridx = 1; + final LineAttributes lnAttr = colours[i]; + final JButton butt = new JButton("Select", bamView.getImageIcon(lnAttr.getLineColour())); + butt.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent _) + { + Color newColour = JColorChooser.showDialog(null, "Colour Chooser", + lnAttr.getLineColour()); + + lnAttr.setLineColour(newColour); + butt.setIcon(bamView.getImageIcon(lnAttr.getLineColour())); + bamView.repaint(); + } + }); + panel.add(butt, c); + + c.gridx = 2; + final JCheckBox show = new JCheckBox("Show", true); + checkBoxes.add(show); + show.addItemListener(new ItemListener(){ + public void itemStateChanged(ItemEvent arg0) + { + if(show.isSelected()) + hideReadGroups.remove(grp); + else + hideReadGroups.add(grp); + bamView.repaintBamView(); + } + }); + panel.add(show, c); + + c.gridy+=1; + } + } + + protected Color getReadGroupColour(final List<SAMReadGroupRecord> readGroups, final SAMReadGroupRecord rg) + { + if(rg == null) + return Color.BLACK; + final String rgId = rg.getId(); + for(int i=0; i<readGroups.size(); i++) + { + final SAMReadGroupRecord grp = readGroups.get(i); + if(grp.getId().equals(rgId)) + return colours[i].getLineColour(); + } + return Color.BLACK; + } + + protected boolean isReadGroupVisible(final SAMReadGroupRecord rg) + { + return !hideReadGroups.contains(rg); + } +} \ No newline at end of file