diff --git a/uk/ac/sanger/artemis/components/alignment/SAMRecordFilter.java b/uk/ac/sanger/artemis/components/alignment/SAMRecordFilter.java index ecca4ee92bbc16fe98765c5fd879dea3936592c3..db00c329fc06397e403890b8944340ff27697b18 100644 --- a/uk/ac/sanger/artemis/components/alignment/SAMRecordFilter.java +++ b/uk/ac/sanger/artemis/components/alignment/SAMRecordFilter.java @@ -1,13 +1,19 @@ package uk.ac.sanger.artemis.components.alignment; import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import uk.ac.sanger.artemis.components.Utilities; + class SAMRecordFilter extends JPanel { @@ -17,13 +23,20 @@ class SAMRecordFilter extends JPanel { super(); int nflags = SAMRecordFlagPredicate.FLAGS.length; - setLayout(new GridLayout(nflags, 2)); + setLayout(new GridLayout(nflags+1, 2)); final JCheckBox flagCheck[] = new JCheckBox[nflags]; + final SAMRecordFlagPredicate predicate = bamView.getSamRecordFlagPredicate(); + for(int j=0; j<nflags; j++) { flagCheck[j] = new JCheckBox( SAMRecordFlagPredicate.FLAGS_DESCRUIPTION[j], false); + + if(predicate != null && + predicate.isFlagSet(SAMRecordFlagPredicate.FLAGS[j])) + flagCheck[j].setSelected(true); + flagCheck[j].addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) @@ -33,43 +46,39 @@ class SAMRecordFilter extends JPanel }); add(flagCheck[j]); } - - int status = JOptionPane.showConfirmDialog(bamView, - this, "Filter Out Reads Based on Flag", - JOptionPane.OK_CANCEL_OPTION); - if(status != JOptionPane.OK_OPTION) - return; + final JFrame f = new JFrame("Filter Out Reads Based on Flag"); + JButton closeFrame = new JButton("Close"); + closeFrame.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + f.dispose(); + } + }); + add(closeFrame); + + f.getContentPane().add(this); + f.pack(); + Utilities.centreFrame(f); + f.setVisible(true); } private void filterChange(final BamView bamView, final JCheckBox flagCheck[]) { int nflags = SAMRecordFlagPredicate.FLAGS.length; - int flagsChecked = 0; + int flagCombined = 0; for(int j=0; j<nflags; j++) { if(flagCheck[j].isSelected()) - flagsChecked++; + flagCombined = flagCombined | SAMRecordFlagPredicate.FLAGS[j]; } - - bamView.setSamRecordFlagPredicate(null); - - if(flagsChecked == 0) - { - bamView.repaint(); - return; - } - - int flagsOn[] = new int[flagsChecked]; - int num = 0; - for(int j=0; j<nflags; j++) - { - if(flagCheck[j].isSelected()) - flagsOn[num++] = SAMRecordFlagPredicate.FLAGS[j]; - } - - bamView.setSamRecordFlagPredicate(new SAMRecordFlagPredicate(flagsOn)); + + if(flagCombined == 0) + bamView.setSamRecordFlagPredicate(null); + else + bamView.setSamRecordFlagPredicate(new SAMRecordFlagPredicate(flagCombined)); bamView.repaint(); } diff --git a/uk/ac/sanger/artemis/components/alignment/SAMRecordFlagPredicate.java b/uk/ac/sanger/artemis/components/alignment/SAMRecordFlagPredicate.java index dfd71f73e895f7ec02c7372fed887b19a35b94b3..29beb88bfea9e46a804eccec6248c319b8d496c1 100644 --- a/uk/ac/sanger/artemis/components/alignment/SAMRecordFlagPredicate.java +++ b/uk/ac/sanger/artemis/components/alignment/SAMRecordFlagPredicate.java @@ -28,7 +28,7 @@ import net.sf.samtools.SAMRecord; **/ public class SAMRecordFlagPredicate implements SAMRecordPredicate { - private int flag[]; + private int flag; private static final int READ_PAIRED_FLAG = 0x1; private static final int PROPER_PAIR_FLAG = 0x2; @@ -73,7 +73,7 @@ public class SAMRecordFlagPredicate implements SAMRecordPredicate }; - public SAMRecordFlagPredicate(int flag[]) + public SAMRecordFlagPredicate(int flag) { this.flag = flag; } @@ -86,11 +86,20 @@ public class SAMRecordFlagPredicate implements SAMRecordPredicate **/ public boolean testPredicate (final SAMRecord samRecord) { - for(int i=0; i<flag.length; i++) + return isFlagSet(samRecord.getFlags()); + } + + protected boolean isFlagSet(int thisFlag) + { + for(int i=0; i<FLAGS.length; i++) { - if((samRecord.getFlags() & flag[i]) == flag[i]) - return true; + if((flag & FLAGS[i]) == FLAGS[i]) + { + if((thisFlag & FLAGS[i]) == FLAGS[i]) + return true; + } } + return false; } }