JAL-2291 use HiddenColumns.hideMarkedBits and take union of selection and sequence...
[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.Iterator;
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<String>();
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
176               .getCurrentSearchPanel();
177       currentStructureFilterPanel = lastChooser
178               .getCurrentStructureFilterPanel();
179       annotations.select(lastChooser
180               .getAnnotations().getSelectedIndex());
181       threshold.select(lastChooser
182               .getThreshold().getSelectedIndex());
183       actionOption = lastChooser
184               .getActionOption();
185       percentThreshold.setState(lastChooser.percentThreshold.getState());
186     }
187
188     try
189     {
190       jbInit();
191     } catch (Exception ex)
192     {
193     }
194     adjusting = false;
195
196     updateView();
197     frame.invalidate();
198     frame.pack();
199   }
200
201   private void jbInit() throws Exception
202   {
203     ok.setLabel(MessageManager.getString("action.ok"));
204
205     cancel.setLabel(MessageManager.getString("action.cancel"));
206
207     thresholdValue.setEnabled(false);
208     thresholdValue.setColumns(7);
209     thresholdValue.setCaretPosition(0);
210
211     ok.addActionListener(this);
212     cancel.addActionListener(this);
213     annotations.addItemListener(this);
214     thresholdValue.addActionListener(this);
215     threshold.addItemListener(this);
216
217     slider.setBackground(Color.white);
218     slider.setEnabled(false);
219     slider.setPreferredSize(new Dimension(100, 32));
220
221     thresholdPanel.setBackground(Color.white);
222     // thresholdPanel.setFont(JvSwingUtils.getLabelFont());
223     // thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
224
225     percentThreshold.setLabel("As percentage");
226     percentThreshold.addItemListener(this);
227
228     actionPanel.setBackground(Color.white);
229     // actionPanel.setFont(JvSwingUtils.getLabelFont());
230
231     graphFilterView.setLayout(gBorderLayout);
232     graphFilterView.setBackground(Color.white);
233
234     noGraphFilterView.setLayout(ngBorderLayout);
235     noGraphFilterView.setBackground(Color.white);
236
237     annotationComboBoxPanel.setBackground(Color.white);
238     // annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
239
240     gSearchPanel = new SearchPanel(this);
241     ngSearchPanel = new SearchPanel(this);
242     gFurtherActionPanel = new FurtherActionPanel(this);
243     ngFurtherActionPanel = new FurtherActionPanel(this);
244     gStructureFilterPanel = new StructureFilterPanel(this);
245     ngStructureFilterPanel = new StructureFilterPanel(this);
246
247     thresholdPanel.setTitle("Threshold Filter");
248     thresholdPanel.add(getThreshold());
249     thresholdPanel.add(slider);
250     thresholdPanel.add(thresholdValue);
251     thresholdPanel.add(percentThreshold);
252
253     actionPanel.add(ok);
254     actionPanel.add(cancel);
255
256     Panel staticPanel = new Panel();
257     staticPanel.setLayout(new BorderLayout());
258     staticPanel.setBackground(Color.white);
259
260     staticPanel.add(gSearchPanel, java.awt.BorderLayout.NORTH);
261     staticPanel.add(gStructureFilterPanel, java.awt.BorderLayout.SOUTH);
262
263     graphFilterView.add(staticPanel, java.awt.BorderLayout.NORTH);
264     graphFilterView.add(thresholdPanel, java.awt.BorderLayout.CENTER);
265     graphFilterView.add(gFurtherActionPanel, java.awt.BorderLayout.SOUTH);
266
267     noGraphFilterView.add(ngSearchPanel, java.awt.BorderLayout.PAGE_START);
268     noGraphFilterView.add(ngStructureFilterPanel,
269             java.awt.BorderLayout.CENTER);
270     noGraphFilterView.add(ngFurtherActionPanel,
271             java.awt.BorderLayout.CENTER);
272
273     annotationComboBoxPanel.add(getAnnotations());
274     switchableViewsPanel.add(noGraphFilterView,
275             AnnotationColumnChooser.NO_GRAPH_VIEW);
276     switchableViewsPanel.add(graphFilterView,
277             AnnotationColumnChooser.GRAPH_VIEW);
278
279     this.setLayout(borderLayout1);
280     this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
281     this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
282     this.add(actionPanel, java.awt.BorderLayout.SOUTH);
283
284     selectedAnnotationChanged();
285     this.validate();
286   }
287
288   @Override
289   @SuppressWarnings("unchecked")
290   public void reset()
291   {
292     if (this.getOldHiddenColumns() != null)
293     {
294       av.getColumnSelection().clear();
295
296       if (av.getAnnotationColumnSelectionState() != null)
297       {
298         HiddenColumns oldHidden = av
299                 .getAnnotationColumnSelectionState()
300                 .getOldHiddenColumns();
301         if (oldHidden != null && oldHidden.getHiddenRegions() != null
302                 && !oldHidden.getHiddenRegions().isEmpty())
303         {
304           for (Iterator<int[]> itr = oldHidden.getHiddenRegions()
305                   .iterator(); itr.hasNext();)
306           {
307             int positions[] = itr.next();
308             av.hideColumns(positions[0], positions[1]);
309           }
310         }
311         av.getAlignment().setHiddenColumns(oldHidden);
312       }
313       ap.paintAlignment(true);
314     }
315
316   }
317
318   @Override
319   public void adjustmentValueChanged(AdjustmentEvent evt)
320   {
321     if (!adjusting)
322     {
323       setThresholdValueText();
324       valueChanged(!sliderDragging);
325     }
326   }
327
328   protected void addSliderMouseListeners()
329   {
330
331     slider.addMouseListener(new MouseAdapter()
332     {
333       @Override
334       public void mousePressed(MouseEvent e)
335       {
336         sliderDragging = true;
337         super.mousePressed(e);
338       }
339
340       @Override
341       public void mouseDragged(MouseEvent e)
342       {
343         sliderDragging = true;
344         super.mouseDragged(e);
345       }
346
347       @Override
348       public void mouseReleased(MouseEvent evt)
349       {
350         if (sliderDragging)
351         {
352           sliderDragging = false;
353           valueChanged(true);
354         }
355         ap.paintAlignment(true);
356       }
357     });
358   }
359
360   @Override
361   public void valueChanged(boolean updateAllAnnotation)
362   {
363     if (slider.isEnabled())
364     {
365       getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
366       updateView();
367       ap.paintAlignment(false);
368     }
369   }
370
371   public Choice getThreshold()
372   {
373     return threshold;
374   }
375
376   public void setThreshold(Choice threshold)
377   {
378     this.threshold = threshold;
379   }
380
381   public Choice getAnnotations()
382   {
383     return annotations;
384   }
385
386   public void setAnnotations(Choice annotations)
387   {
388     this.annotations = annotations;
389   }
390
391   @Override
392   public void updateView()
393   {
394     // Check if combobox is still adjusting
395     if (adjusting)
396     {
397       return;
398     }
399
400     AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
401     setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[getAnnotations()
402             .getSelectedIndex()]);
403
404     int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
405             .getSelectedIndex());
406
407     slider.setEnabled(true);
408     thresholdValue.setEnabled(true);
409     percentThreshold.setEnabled(true);
410
411     if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
412     {
413       slider.setEnabled(false);
414       thresholdValue.setEnabled(false);
415       thresholdValue.setText("");
416       percentThreshold.setEnabled(false);
417       // build filter params
418     }
419     else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
420     {
421       if (getCurrentAnnotation().threshold == null)
422       {
423         getCurrentAnnotation()
424                 .setThreshold(
425                         new jalview.datamodel.GraphLine(
426                                 (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
427                                 "Threshold", Color.black));
428       }
429
430       adjusting = true;
431       float range = getCurrentAnnotation().graphMax * 1000
432               - getCurrentAnnotation().graphMin * 1000;
433
434       slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
435       slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
436       slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
437       setThresholdValueText();
438       // slider.setMajorTickSpacing((int) (range / 10f));
439       slider.setEnabled(true);
440       thresholdValue.setEnabled(true);
441       percentThreshold.setEnabled(true);
442       adjusting = false;
443
444       // build filter params
445       filterParams
446               .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
447       if (getCurrentAnnotation().isQuantitative())
448       {
449         filterParams
450                 .setThresholdValue(getCurrentAnnotation().threshold.value);
451
452         if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
453         {
454           filterParams
455                   .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
456         }
457         else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
458         {
459           filterParams
460                   .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
461         }
462       }
463     }
464
465     if (currentStructureFilterPanel != null)
466     {
467       if (currentStructureFilterPanel.alphaHelix.getState())
468       {
469         filterParams.setFilterAlphaHelix(true);
470       }
471       if (currentStructureFilterPanel.betaStrand.getState())
472       {
473         filterParams.setFilterBetaSheet(true);
474       }
475       if (currentStructureFilterPanel.turn.getState())
476       {
477         filterParams.setFilterTurn(true);
478       }
479     }
480
481     if (currentSearchPanel != null)
482     {
483
484       if (!currentSearchPanel.searchBox.getText().isEmpty())
485       {
486         currentSearchPanel.description.setEnabled(true);
487         currentSearchPanel.displayName.setEnabled(true);
488         filterParams.setRegexString(currentSearchPanel.searchBox.getText());
489         if (currentSearchPanel.displayName.getState())
490         {
491           filterParams
492                   .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
493         }
494         if (currentSearchPanel.description.getState())
495         {
496           filterParams
497                   .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
498         }
499       }
500       else
501       {
502         currentSearchPanel.description.setEnabled(false);
503         currentSearchPanel.displayName.setEnabled(false);
504       }
505     }
506
507     av.getColumnSelection().filterAnnotations(
508             getCurrentAnnotation().annotations, filterParams);
509
510     av.showAllHiddenColumns();
511     if (getActionOption() == ACTION_OPTION_HIDE)
512     {
513       av.hideSelectedColumns();
514     }
515
516     filterParams = null;
517     av.setAnnotationColumnSelectionState(this);
518     ap.paintAlignment(true);
519   }
520
521   public HiddenColumns getOldHiddenColumns()
522   {
523     return oldHiddenColumns;
524   }
525
526   public void setOldHiddenColumns(HiddenColumns currentHiddenColumns)
527   {
528     if (currentHiddenColumns != null)
529     {
530       this.oldHiddenColumns = new HiddenColumns(currentHiddenColumns);
531     }
532   }
533
534   public FurtherActionPanel getCurrentFutherActionPanel()
535   {
536     return currentFurtherActionPanel;
537   }
538
539   public void setCurrentFutherActionPanel(
540           FurtherActionPanel currentFutherActionPanel)
541   {
542     this.currentFurtherActionPanel = currentFutherActionPanel;
543   }
544
545   public SearchPanel getCurrentSearchPanel()
546   {
547     return currentSearchPanel;
548   }
549
550   public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
551   {
552     this.currentSearchPanel = currentSearchPanel;
553   }
554
555   public int getActionOption()
556   {
557     return actionOption;
558   }
559
560   public void setActionOption(int actionOption)
561   {
562     this.actionOption = actionOption;
563   }
564
565   public StructureFilterPanel getCurrentStructureFilterPanel()
566   {
567     return currentStructureFilterPanel;
568   }
569
570   public void setCurrentStructureFilterPanel(
571           StructureFilterPanel currentStructureFilterPanel)
572   {
573     this.currentStructureFilterPanel = currentStructureFilterPanel;
574   }
575
576   @Override
577   public void itemStateChanged(ItemEvent e)
578   {
579     if (e.getSource() == annotations)
580     {
581       selectedAnnotationChanged();
582     }
583     else if (e.getSource() == threshold)
584     {
585       threshold_actionPerformed(null);
586     }
587     else if (e.getSource() == percentThreshold)
588     {
589       if (!adjusting)
590       {
591         percentageValue_actionPerformed();
592       }
593
594     }
595   }
596
597   public void selectedAnnotationChanged()
598   {
599     String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
600     if (av.getAlignment().getAlignmentAnnotation()[getAnnotations()
601             .getSelectedIndex()].isQuantitative())
602     {
603       currentView = AnnotationColumnChooser.GRAPH_VIEW;
604     }
605
606     gSearchPanel.syncState();
607     gFurtherActionPanel.syncState();
608     gStructureFilterPanel.syncState();
609
610     ngSearchPanel.syncState();
611     ngFurtherActionPanel.syncState();
612     ngStructureFilterPanel.syncState();
613
614     switchableViewsLayout.show(switchableViewsPanel, currentView);
615     updateView();
616   }
617
618   public class FurtherActionPanel extends Panel implements ItemListener
619   {
620     private AnnotationColumnChooser aColChooser;
621
622     private Choice furtherAction = new Choice();
623
624     public FurtherActionPanel(AnnotationColumnChooser aColChooser)
625     {
626       this.aColChooser = aColChooser;
627       furtherAction.addItem("Select");
628       furtherAction.addItem("Hide");
629       furtherAction.addItemListener(this);
630       syncState();
631
632       // this.setTitle("Filter Actions");
633       // this.setFont(JvSwingUtils.getLabelFont());
634
635       this.add(furtherAction);
636     }
637
638     public void syncState()
639     {
640       if (aColChooser.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 implements
669           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 }