JAL-2773 add new flag to paintAlignment(updateOverview,updateStructures) and first...
[jalview.git] / src / jalview / appletgui / AnnotationColumnChooser.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.appletgui;
22
23 import jalview.datamodel.AlignmentAnnotation;
24 import jalview.datamodel.HiddenColumns;
25 import jalview.schemes.AnnotationColourGradient;
26 import jalview.util.MessageManager;
27 import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
28
29 import java.awt.BorderLayout;
30 import java.awt.CardLayout;
31 import java.awt.Checkbox;
32 import java.awt.Choice;
33 import java.awt.Color;
34 import java.awt.Dimension;
35 import java.awt.Frame;
36 import java.awt.Panel;
37 import java.awt.TextField;
38 import java.awt.event.ActionEvent;
39 import java.awt.event.ActionListener;
40 import java.awt.event.AdjustmentEvent;
41 import java.awt.event.AdjustmentListener;
42 import java.awt.event.ItemEvent;
43 import java.awt.event.ItemListener;
44 import java.awt.event.MouseAdapter;
45 import java.awt.event.MouseEvent;
46 import java.awt.event.MouseListener;
47 import java.awt.event.TextEvent;
48 import java.awt.event.TextListener;
49 import java.util.ArrayList;
50 import java.util.Vector;
51
52 //import javax.swing.JPanel;
53
54 //import net.miginfocom.swing.MigLayout;
55
56 public class AnnotationColumnChooser extends AnnotationRowFilter implements
57         ActionListener, AdjustmentListener, ItemListener, MouseListener
58 {
59
60   private Choice annotations = new Choice();
61
62   private Panel actionPanel = new Panel();
63
64   private TitledPanel thresholdPanel = new TitledPanel();
65
66   private Panel switchableViewsPanel = new Panel(new CardLayout());
67
68   private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
69           .getLayout());
70
71   private Panel noGraphFilterView = new Panel();
72
73   private Panel graphFilterView = new Panel();
74
75   private Panel annotationComboBoxPanel = new Panel();
76
77   private BorderLayout borderLayout1 = new BorderLayout();
78
79   private BorderLayout gBorderLayout = new BorderLayout();
80
81   private BorderLayout ngBorderLayout = new BorderLayout();
82
83   private Choice threshold = new Choice();
84
85   private StructureFilterPanel gStructureFilterPanel;
86
87   private StructureFilterPanel ngStructureFilterPanel;
88
89   private StructureFilterPanel currentStructureFilterPanel;
90
91   private SearchPanel currentSearchPanel;
92
93   private SearchPanel gSearchPanel;
94
95   private SearchPanel ngSearchPanel;
96
97   private FurtherActionPanel currentFurtherActionPanel;
98
99   private FurtherActionPanel gFurtherActionPanel;
100
101   private FurtherActionPanel ngFurtherActionPanel;
102
103   public static final int ACTION_OPTION_SELECT = 1;
104
105   public static int ACTION_OPTION_HIDE = 2;
106
107   public static String NO_GRAPH_VIEW = "0";
108
109   public static String GRAPH_VIEW = "1";
110
111   private int actionOption = ACTION_OPTION_SELECT;
112
113   private HiddenColumns oldHiddenColumns;
114
115   public AnnotationColumnChooser()
116   {
117     try
118     {
119       jbInit();
120     } catch (Exception ex)
121     {
122       ex.printStackTrace();
123     }
124   }
125
126   public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
127   {
128     super(av, ap);
129     frame = new Frame();
130     frame.add(this);
131     jalview.bin.JalviewLite.addFrame(frame,
132             MessageManager.getString("label.select_by_annotation"), 520,
133             215);
134
135     slider.addAdjustmentListener(this);
136     slider.addMouseListener(this);
137
138     AlignmentAnnotation[] anns = av.getAlignment().getAlignmentAnnotation();
139     if (anns == null)
140     {
141       return;
142     }
143     setOldHiddenColumns(av.getAlignment().getHiddenColumns());
144     adjusting = true;
145     Vector<String> list = new Vector<>();
146     int index = 1;
147     for (int i = 0; i < anns.length; i++)
148     {
149       String label = anns[i].label;
150       if (anns[i].sequenceRef != null)
151       {
152         label = label + "_" + anns[i].sequenceRef.getName();
153       }
154       if (!list.contains(label))
155       {
156         list.addElement(label);
157       }
158       else
159       {
160         list.addElement(label + "_" + (index++));
161       }
162     }
163
164     for (int i = 0; i < list.size(); i++)
165     {
166       annotations.addItem(list.elementAt(i).toString());
167     }
168
169     populateThresholdComboBox(threshold);
170     AnnotationColumnChooser lastChooser = av
171             .getAnnotationColumnSelectionState();
172     // restore Object state from the previous session if one exists
173     if (lastChooser != null)
174     {
175       currentSearchPanel = lastChooser.getCurrentSearchPanel();
176       currentStructureFilterPanel = lastChooser
177               .getCurrentStructureFilterPanel();
178       annotations.select(lastChooser.getAnnotations().getSelectedIndex());
179       threshold.select(lastChooser.getThreshold().getSelectedIndex());
180       actionOption = lastChooser.getActionOption();
181       percentThreshold.setState(lastChooser.percentThreshold.getState());
182     }
183
184     try
185     {
186       jbInit();
187     } catch (Exception ex)
188     {
189     }
190     adjusting = false;
191
192     updateView();
193     frame.invalidate();
194     frame.pack();
195   }
196
197   private void jbInit() throws Exception
198   {
199     ok.setLabel(MessageManager.getString("action.ok"));
200
201     cancel.setLabel(MessageManager.getString("action.cancel"));
202
203     thresholdValue.setEnabled(false);
204     thresholdValue.setColumns(7);
205     thresholdValue.setCaretPosition(0);
206
207     ok.addActionListener(this);
208     cancel.addActionListener(this);
209     annotations.addItemListener(this);
210     thresholdValue.addActionListener(this);
211     threshold.addItemListener(this);
212
213     slider.setBackground(Color.white);
214     slider.setEnabled(false);
215     slider.setPreferredSize(new Dimension(100, 32));
216
217     thresholdPanel.setBackground(Color.white);
218     // thresholdPanel.setFont(JvSwingUtils.getLabelFont());
219     // thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
220
221     percentThreshold.setLabel("As percentage");
222     percentThreshold.addItemListener(this);
223
224     actionPanel.setBackground(Color.white);
225     // actionPanel.setFont(JvSwingUtils.getLabelFont());
226
227     graphFilterView.setLayout(gBorderLayout);
228     graphFilterView.setBackground(Color.white);
229
230     noGraphFilterView.setLayout(ngBorderLayout);
231     noGraphFilterView.setBackground(Color.white);
232
233     annotationComboBoxPanel.setBackground(Color.white);
234     // annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
235
236     gSearchPanel = new SearchPanel(this);
237     ngSearchPanel = new SearchPanel(this);
238     gFurtherActionPanel = new FurtherActionPanel(this);
239     ngFurtherActionPanel = new FurtherActionPanel(this);
240     gStructureFilterPanel = new StructureFilterPanel(this);
241     ngStructureFilterPanel = new StructureFilterPanel(this);
242
243     thresholdPanel.setTitle("Threshold Filter");
244     thresholdPanel.add(getThreshold());
245     thresholdPanel.add(slider);
246     thresholdPanel.add(thresholdValue);
247     thresholdPanel.add(percentThreshold);
248
249     actionPanel.add(ok);
250     actionPanel.add(cancel);
251
252     Panel staticPanel = new Panel();
253     staticPanel.setLayout(new BorderLayout());
254     staticPanel.setBackground(Color.white);
255
256     staticPanel.add(gSearchPanel, java.awt.BorderLayout.NORTH);
257     staticPanel.add(gStructureFilterPanel, java.awt.BorderLayout.SOUTH);
258
259     graphFilterView.add(staticPanel, java.awt.BorderLayout.NORTH);
260     graphFilterView.add(thresholdPanel, java.awt.BorderLayout.CENTER);
261     graphFilterView.add(gFurtherActionPanel, java.awt.BorderLayout.SOUTH);
262
263     noGraphFilterView.add(ngSearchPanel, java.awt.BorderLayout.PAGE_START);
264     noGraphFilterView.add(ngStructureFilterPanel,
265             java.awt.BorderLayout.CENTER);
266     noGraphFilterView.add(ngFurtherActionPanel,
267             java.awt.BorderLayout.CENTER);
268
269     annotationComboBoxPanel.add(getAnnotations());
270     switchableViewsPanel.add(noGraphFilterView,
271             AnnotationColumnChooser.NO_GRAPH_VIEW);
272     switchableViewsPanel.add(graphFilterView,
273             AnnotationColumnChooser.GRAPH_VIEW);
274
275     this.setLayout(borderLayout1);
276     this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
277     this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
278     this.add(actionPanel, java.awt.BorderLayout.SOUTH);
279
280     selectedAnnotationChanged();
281     this.validate();
282   }
283
284   @Override
285   @SuppressWarnings("unchecked")
286   public void reset()
287   {
288     if (this.getOldHiddenColumns() != null)
289     {
290       av.getColumnSelection().clear();
291
292       if (av.getAnnotationColumnSelectionState() != null)
293       {
294         HiddenColumns oldHidden = av.getAnnotationColumnSelectionState()
295                 .getOldHiddenColumns();
296         if (oldHidden != null)
297         {
298           ArrayList<int[]> regions = oldHidden.getHiddenColumnsCopy();
299           for (int[] positions : regions)
300           {
301             av.hideColumns(positions[0], positions[1]);
302           }
303         }
304         // TODO not clear why we need to hide all the columns (above) if we are
305         // going to copy the hidden columns over wholesale anyway
306         av.getAlignment().setHiddenColumns(oldHidden);
307       }
308       av.sendSelection();
309       ap.paintAlignment(true, true);
310     }
311
312   }
313
314   @Override
315   public void adjustmentValueChanged(AdjustmentEvent evt)
316   {
317     if (!adjusting)
318     {
319       setThresholdValueText();
320       valueChanged(!sliderDragging);
321     }
322   }
323
324   protected void addSliderMouseListeners()
325   {
326
327     slider.addMouseListener(new MouseAdapter()
328     {
329       @Override
330       public void mousePressed(MouseEvent e)
331       {
332         sliderDragging = true;
333         super.mousePressed(e);
334       }
335
336       @Override
337       public void mouseDragged(MouseEvent e)
338       {
339         sliderDragging = true;
340         super.mouseDragged(e);
341       }
342
343       @Override
344       public void mouseReleased(MouseEvent evt)
345       {
346         if (sliderDragging)
347         {
348           sliderDragging = false;
349           valueChanged(true);
350         }
351         ap.paintAlignment(true, true);
352       }
353     });
354   }
355
356   @Override
357   public void valueChanged(boolean updateAllAnnotation)
358   {
359     if (slider.isEnabled())
360     {
361       getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
362       updateView(); // this also calls paintAlignment(true,true)
363     }
364   }
365
366   public Choice getThreshold()
367   {
368     return threshold;
369   }
370
371   public void setThreshold(Choice threshold)
372   {
373     this.threshold = threshold;
374   }
375
376   public Choice getAnnotations()
377   {
378     return annotations;
379   }
380
381   public void setAnnotations(Choice annotations)
382   {
383     this.annotations = annotations;
384   }
385
386   @Override
387   public void updateView()
388   {
389     // Check if combobox is still adjusting
390     if (adjusting)
391     {
392       return;
393     }
394
395     AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
396     setCurrentAnnotation(av.getAlignment()
397             .getAlignmentAnnotation()[getAnnotations().getSelectedIndex()]);
398
399     int selectedThresholdItem = getSelectedThresholdItem(
400             getThreshold().getSelectedIndex());
401
402     slider.setEnabled(true);
403     thresholdValue.setEnabled(true);
404     percentThreshold.setEnabled(true);
405
406     if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
407     {
408       slider.setEnabled(false);
409       thresholdValue.setEnabled(false);
410       thresholdValue.setText("");
411       percentThreshold.setEnabled(false);
412       // build filter params
413     }
414     else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
415     {
416       if (getCurrentAnnotation().threshold == null)
417       {
418         getCurrentAnnotation().setThreshold(new jalview.datamodel.GraphLine(
419                 (getCurrentAnnotation().graphMax
420                         - getCurrentAnnotation().graphMin) / 2f,
421                 "Threshold", Color.black));
422       }
423
424       adjusting = true;
425       // float range = getCurrentAnnotation().graphMax * 1000
426       // - getCurrentAnnotation().graphMin * 1000;
427
428       slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
429       slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
430       slider.setValue(
431               (int) (getCurrentAnnotation().threshold.value * 1000));
432       setThresholdValueText();
433       // slider.setMajorTickSpacing((int) (range / 10f));
434       slider.setEnabled(true);
435       thresholdValue.setEnabled(true);
436       percentThreshold.setEnabled(true);
437       adjusting = false;
438
439       // build filter params
440       filterParams.setThresholdType(
441               AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
442       if (getCurrentAnnotation().isQuantitative())
443       {
444         filterParams
445                 .setThresholdValue(getCurrentAnnotation().threshold.value);
446
447         if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
448         {
449           filterParams.setThresholdType(
450                   AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
451         }
452         else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
453         {
454           filterParams.setThresholdType(
455                   AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
456         }
457       }
458     }
459
460     if (currentStructureFilterPanel != null)
461     {
462       if (currentStructureFilterPanel.alphaHelix.getState())
463       {
464         filterParams.setFilterAlphaHelix(true);
465       }
466       if (currentStructureFilterPanel.betaStrand.getState())
467       {
468         filterParams.setFilterBetaSheet(true);
469       }
470       if (currentStructureFilterPanel.turn.getState())
471       {
472         filterParams.setFilterTurn(true);
473       }
474     }
475
476     if (currentSearchPanel != null)
477     {
478
479       if (!currentSearchPanel.searchBox.getText().isEmpty())
480       {
481         currentSearchPanel.description.setEnabled(true);
482         currentSearchPanel.displayName.setEnabled(true);
483         filterParams.setRegexString(currentSearchPanel.searchBox.getText());
484         if (currentSearchPanel.displayName.getState())
485         {
486           filterParams.addRegexSearchField(
487                   AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
488         }
489         if (currentSearchPanel.description.getState())
490         {
491           filterParams.addRegexSearchField(
492                   AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
493         }
494       }
495       else
496       {
497         currentSearchPanel.description.setEnabled(false);
498         currentSearchPanel.displayName.setEnabled(false);
499       }
500     }
501
502     // show hidden columns here, before changing the column selection in
503     // filterAnnotations, because showing hidden columns has the side effect of
504     // adding them to the selection
505     av.showAllHiddenColumns();
506     av.getColumnSelection().filterAnnotations(
507             getCurrentAnnotation().annotations, filterParams);
508
509     if (getActionOption() == ACTION_OPTION_HIDE)
510     {
511       av.hideSelectedColumns();
512     }
513
514     filterParams = null;
515     av.setAnnotationColumnSelectionState(this);
516     av.sendSelection();
517     ap.paintAlignment(true, true);
518   }
519
520   public HiddenColumns getOldHiddenColumns()
521   {
522     return oldHiddenColumns;
523   }
524
525   public void setOldHiddenColumns(HiddenColumns currentHiddenColumns)
526   {
527     if (currentHiddenColumns != null)
528     {
529       this.oldHiddenColumns = new HiddenColumns(currentHiddenColumns);
530     }
531   }
532
533   public FurtherActionPanel getCurrentFutherActionPanel()
534   {
535     return currentFurtherActionPanel;
536   }
537
538   public void setCurrentFutherActionPanel(
539           FurtherActionPanel currentFutherActionPanel)
540   {
541     this.currentFurtherActionPanel = currentFutherActionPanel;
542   }
543
544   public SearchPanel getCurrentSearchPanel()
545   {
546     return currentSearchPanel;
547   }
548
549   public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
550   {
551     this.currentSearchPanel = currentSearchPanel;
552   }
553
554   public int getActionOption()
555   {
556     return actionOption;
557   }
558
559   public void setActionOption(int actionOption)
560   {
561     this.actionOption = actionOption;
562   }
563
564   public StructureFilterPanel getCurrentStructureFilterPanel()
565   {
566     return currentStructureFilterPanel;
567   }
568
569   public void setCurrentStructureFilterPanel(
570           StructureFilterPanel currentStructureFilterPanel)
571   {
572     this.currentStructureFilterPanel = currentStructureFilterPanel;
573   }
574
575   @Override
576   public void itemStateChanged(ItemEvent e)
577   {
578     if (e.getSource() == annotations)
579     {
580       selectedAnnotationChanged();
581     }
582     else if (e.getSource() == threshold)
583     {
584       threshold_actionPerformed(null);
585     }
586     else if (e.getSource() == percentThreshold)
587     {
588       if (!adjusting)
589       {
590         percentageValue_actionPerformed();
591       }
592
593     }
594   }
595
596   public void selectedAnnotationChanged()
597   {
598     String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
599     if (av.getAlignment().getAlignmentAnnotation()[getAnnotations()
600             .getSelectedIndex()].isQuantitative())
601     {
602       currentView = AnnotationColumnChooser.GRAPH_VIEW;
603     }
604
605     gSearchPanel.syncState();
606     gFurtherActionPanel.syncState();
607     gStructureFilterPanel.syncState();
608
609     ngSearchPanel.syncState();
610     ngFurtherActionPanel.syncState();
611     ngStructureFilterPanel.syncState();
612
613     switchableViewsLayout.show(switchableViewsPanel, currentView);
614     updateView();
615   }
616
617   public class FurtherActionPanel extends Panel implements ItemListener
618   {
619     private AnnotationColumnChooser aColChooser;
620
621     private Choice furtherAction = new Choice();
622
623     public FurtherActionPanel(AnnotationColumnChooser aColChooser)
624     {
625       this.aColChooser = aColChooser;
626       furtherAction.addItem("Select");
627       furtherAction.addItem("Hide");
628       furtherAction.addItemListener(this);
629       syncState();
630
631       // this.setTitle("Filter Actions");
632       // this.setFont(JvSwingUtils.getLabelFont());
633
634       this.add(furtherAction);
635     }
636
637     public void syncState()
638     {
639       if (aColChooser
640               .getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE)
641       {
642         furtherAction.select("Hide");
643       }
644       else
645       {
646         furtherAction.select("Select");
647       }
648     }
649
650     @Override
651     public void itemStateChanged(ItemEvent e)
652     {
653       aColChooser.setCurrentFutherActionPanel(this);
654       if (furtherAction.getSelectedItem().equalsIgnoreCase("Select"))
655       {
656         setActionOption(ACTION_OPTION_SELECT);
657         updateView();
658       }
659       else
660       {
661         setActionOption(ACTION_OPTION_HIDE);
662         updateView();
663       }
664
665     }
666   }
667
668   public class StructureFilterPanel extends TitledPanel
669           implements ItemListener
670   {
671     private AnnotationColumnChooser aColChooser;
672
673     private Checkbox alphaHelix = new Checkbox();
674
675     private Checkbox betaStrand = new Checkbox();
676
677     private Checkbox turn = new Checkbox();
678
679     private Checkbox all = new Checkbox();
680
681     public StructureFilterPanel(AnnotationColumnChooser aColChooser)
682     {
683       this.aColChooser = aColChooser;
684
685       alphaHelix.setLabel(MessageManager.getString("label.alpha_helix"));
686       alphaHelix.setBackground(Color.white);
687
688       alphaHelix.addItemListener(this);
689
690       betaStrand.setLabel(MessageManager.getString("label.beta_strand"));
691       betaStrand.setBackground(Color.white);
692       betaStrand.addItemListener(this);
693
694       turn.setLabel(MessageManager.getString("label.turn"));
695       turn.setBackground(Color.white);
696       turn.addItemListener(this);
697
698       all.setLabel(MessageManager.getString("label.select_all"));
699       all.setBackground(Color.white);
700       all.addItemListener(this);
701
702       this.setBackground(Color.white);
703       this.setTitle("Structure Filter");
704       // this.setFont(JvSwingUtils.getLabelFont());
705
706       this.add(all);
707       this.add(alphaHelix);
708       this.add(betaStrand);
709       this.add(turn);
710     }
711
712     public void alphaHelix_actionPerformed()
713     {
714       updateSelectAllState();
715       aColChooser.setCurrentStructureFilterPanel(this);
716       aColChooser.updateView();
717     }
718
719     public void betaStrand_actionPerformed()
720     {
721       updateSelectAllState();
722       aColChooser.setCurrentStructureFilterPanel(this);
723       aColChooser.updateView();
724     }
725
726     public void turn_actionPerformed()
727     {
728       updateSelectAllState();
729       aColChooser.setCurrentStructureFilterPanel(this);
730       aColChooser.updateView();
731     }
732
733     public void all_actionPerformed()
734     {
735       if (all.getState())
736       {
737         alphaHelix.setState(true);
738         betaStrand.setState(true);
739         turn.setState(true);
740       }
741       else
742       {
743         alphaHelix.setState(false);
744         betaStrand.setState(false);
745         turn.setState(false);
746       }
747       aColChooser.setCurrentStructureFilterPanel(this);
748       aColChooser.updateView();
749     }
750
751     public void updateSelectAllState()
752     {
753       if (alphaHelix.getState() && betaStrand.getState() && turn.getState())
754       {
755         all.setState(true);
756       }
757       else
758       {
759         all.setState(false);
760       }
761     }
762
763     public void syncState()
764     {
765       StructureFilterPanel sfp = aColChooser
766               .getCurrentStructureFilterPanel();
767       if (sfp != null)
768       {
769         alphaHelix.setState(sfp.alphaHelix.getState());
770         betaStrand.setState(sfp.betaStrand.getState());
771         turn.setState(sfp.turn.getState());
772         if (sfp.all.getState())
773         {
774           all.setState(true);
775           alphaHelix.setState(true);
776           betaStrand.setState(true);
777           turn.setState(true);
778         }
779       }
780
781     }
782
783     @Override
784     public void itemStateChanged(ItemEvent e)
785     {
786       if (e.getSource() == alphaHelix)
787       {
788         alphaHelix_actionPerformed();
789       }
790       else if (e.getSource() == betaStrand)
791       {
792         betaStrand_actionPerformed();
793       }
794       else if (e.getSource() == turn)
795       {
796         turn_actionPerformed();
797       }
798       else if (e.getSource() == all)
799       {
800         all_actionPerformed();
801       }
802     }
803   }
804
805   public class SearchPanel extends TitledPanel implements ItemListener
806   {
807     private AnnotationColumnChooser aColChooser;
808
809     private Checkbox displayName = new Checkbox();
810
811     private Checkbox description = new Checkbox();
812
813     private TextField searchBox = new TextField(10);
814
815     public SearchPanel(AnnotationColumnChooser aColChooser)
816     {
817
818       this.aColChooser = aColChooser;
819       searchBox.addTextListener(new TextListener()
820       {
821
822         @Override
823         public void textValueChanged(TextEvent e)
824         {
825           searchStringAction();
826
827         }
828
829       });
830
831       displayName.setLabel(MessageManager.getString("label.label"));
832       displayName.setEnabled(false);
833       displayName.addItemListener(this);
834
835       description.setLabel(MessageManager.getString("label.description"));
836       description.setEnabled(false);
837       description.addItemListener(this);
838       this.setTitle("Search Filter");
839       // this.setFont(JvSwingUtils.getLabelFont());
840
841       syncState();
842       this.add(searchBox);
843       this.add(displayName);
844       this.add(description);
845     }
846
847     public void displayNameCheckboxAction()
848     {
849       aColChooser.setCurrentSearchPanel(this);
850       aColChooser.updateView();
851     }
852
853     public void discriptionCheckboxAction()
854     {
855       aColChooser.setCurrentSearchPanel(this);
856       aColChooser.updateView();
857     }
858
859     public void searchStringAction()
860     {
861       aColChooser.setCurrentSearchPanel(this);
862       aColChooser.updateView();
863     }
864
865     public void syncState()
866     {
867       SearchPanel sp = aColChooser.getCurrentSearchPanel();
868       if (sp != null)
869       {
870         description.setEnabled(sp.description.isEnabled());
871         description.setState(sp.description.getState());
872
873         displayName.setEnabled(sp.displayName.isEnabled());
874         displayName.setState(sp.displayName.getState());
875
876         searchBox.setText(sp.searchBox.getText());
877       }
878     }
879
880     @Override
881     public void itemStateChanged(ItemEvent e)
882     {
883       if (e.getSource() == displayName)
884       {
885         displayNameCheckboxAction();
886       }
887       else if (e.getSource() == description)
888       {
889         discriptionCheckboxAction();
890       }
891
892     }
893   }
894
895   @Override
896   public void actionPerformed(ActionEvent evt)
897   {
898
899     if (evt.getSource() == ok)
900     {
901       ok_actionPerformed(null);
902     }
903     else if (evt.getSource() == cancel)
904     {
905       cancel_actionPerformed(null);
906     }
907     else if (evt.getSource() == thresholdValue)
908     {
909       thresholdValue_actionPerformed(null);
910     }
911     else
912     {
913       updateView();
914     }
915   }
916
917   @Override
918   public void mouseClicked(MouseEvent e)
919   {
920     // TODO Auto-generated method stub
921
922   }
923
924   @Override
925   public void mousePressed(MouseEvent e)
926   {
927     if (e.getSource() == slider)
928     {
929       updateView();
930     }
931
932   }
933
934   @Override
935   public void mouseReleased(MouseEvent e)
936   {
937     if (e.getSource() == slider)
938     {
939       updateView();
940     }
941   }
942
943   @Override
944   public void mouseEntered(MouseEvent e)
945   {
946     if (e.getSource() == slider)
947     {
948       updateView();
949     }
950   }
951
952   @Override
953   public void mouseExited(MouseEvent e)
954   {
955     if (e.getSource() == slider)
956     {
957       updateView();
958     }
959   }
960
961 }