001    package sears.gui.search;
002    
003    import java.awt.event.ComponentAdapter;
004    import java.awt.event.ComponentEvent;
005    import java.awt.event.KeyAdapter;
006    import java.awt.event.KeyEvent;
007    import java.util.EventListener;
008    
009    import javax.swing.BoxLayout;
010    import javax.swing.JButton;
011    import javax.swing.JComponent;
012    import javax.swing.JTextField;
013    import javax.swing.event.CaretEvent;
014    import javax.swing.event.CaretListener;
015    
016    import sears.gui.MainWindow;
017    import sears.tools.Utils;
018    
019    public class FindBox extends JComponent implements FindDialog,EventListener {
020            
021            private static final long serialVersionUID = 3347745500011278383L;
022            
023            //private static Icon FIND_ICON = SearsResources.getIcon("TinyFindIcon");
024    
025    //      private static final int BTN_WIDTH = 2;
026            
027            private JSearchField _textField;
028            private JButton _nextBtn;
029            private JButton _previousBtn;
030            
031            //private JLabel _label;
032            
033            private MainWindow _mw;
034            
035            public FindBox(MainWindow mw) {
036                    initComponents();
037                    addActions();
038                    _mw = mw;
039                    _mw.addFB(this);
040                    setFindEnabled(false);
041            //      setBorder(new EmptyBorder(10,8,10,8));
042                    //setBounds(0, 0, 100, 2);
043                    this.addComponentListener(new ComponentAdapter() {
044    
045                            public void componentResized(ComponentEvent e) {
046                                    // TODO Auto-generated method stub
047                                    
048                            }
049                            
050                    });
051                    
052            }
053            
054            
055            private void initComponents() {
056                    _textField = new JSearchField();
057                    _nextBtn = new JButton(">");
058                    _previousBtn = new JButton("<");
059            //      _label = new JLabel(" ");
060                    _previousBtn.setEnabled(false);
061                    _nextBtn.setEnabled(false);
062                    
063                    this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
064                    this.add(_textField);
065                    this.add(_previousBtn);
066                    this.add(_nextBtn);
067                    
068                    _previousBtn.setVisible(false);
069                    _nextBtn.setVisible(false);
070                    
071            }
072            
073            private void addActions() {
074                    _textField.addCaretListener(new CaretListener() {
075    
076                            public void caretUpdate(CaretEvent e) {
077                                    String text = ((JTextField) e.getSource()).getText();
078                                    if( text.trim().length() > 0 ) {
079                                            _previousBtn.setEnabled(true);
080                                            _nextBtn.setEnabled(true);
081                                            Thread next = new Thread(new Runnable() {
082                                                    public void run() {
083                                                            findStringInSubtitle(false);
084                                                    }
085                                            });
086                                            next.start();
087                                    } else {
088                                            _mw.fireFindStop();
089                                            _previousBtn.setEnabled(false);
090                                            _nextBtn.setEnabled(false);
091                                    }
092                            }
093                            
094                    });
095                    _textField.addKeyListener(new KeyAdapter() {
096                            
097                            private Boolean[] actionRequiredForKeyEvent(KeyEvent e) {
098                                    Boolean[] result = new Boolean[2];
099    
100                                    int keyCode = e.getKeyCode();
101                                    // enter or command+g (apple only)
102                                    result[0] = ( keyCode == KeyEvent.VK_ENTER ) 
103                                                                    || ( Utils.isMacPlatform && keyCode == KeyEvent.VK_G && e.isMetaDown());
104                                    // check modifier key:
105                                    result[1] = e.isShiftDown();
106                    
107                                    return result;
108                            }
109                            
110                            public void keyPressed(KeyEvent e) {
111    
112                                    Boolean[] ar = actionRequiredForKeyEvent(e);
113                                    if( ar[0] ) {
114                                            if( ar[1] ) {
115                                                    _previousBtn.doClick();
116                                            } else {
117                                                    _nextBtn.doClick();
118                                            }
119                                    }
120                            }
121                            
122                    });
123                    
124                    _nextBtn.addActionListener(new java.awt.event.ActionListener() {
125                            public void actionPerformed(java.awt.event.ActionEvent e) {
126                                    Thread next = new Thread(new Runnable() {
127                                            public void run() {
128                                                    findStringInSubtitle(false);
129                                            }
130                                    });
131                                    next.start();
132                            }
133                    });
134                    
135                    _previousBtn.addActionListener(new java.awt.event.ActionListener() {
136                            public void actionPerformed(java.awt.event.ActionEvent e) {
137                                    Thread previous = new Thread(new Runnable() {
138                                            public void run() {
139                                                    findStringInSubtitle(true);
140                                            }
141                                    });
142                                    previous.start();
143                            }
144                    });
145                    
146            }
147            
148            /**
149             * performs a find action in the subtitle.
150             * @param previous if true call a previous find action, if false it's a next one
151             */
152            private void findStringInSubtitle(boolean previous) {
153                    // perform a find also if user did not enter anything
154                    _mw.find(this, previous);               
155                    
156            }
157    
158            public String getText() {
159                    // TODO Auto-generated method stub
160                    return _textField.getText();
161            }
162    
163            public void setOccurencesCount(int occurencesCount) {
164                    //_label.setText( String.valueOf(occurencesCount) );
165                    _textField.setToolTipText(String.valueOf(occurencesCount));
166            }
167    
168            public void setFindEnabled(Boolean inFlag) {
169                    this.setEnabled(inFlag);
170                    _textField.setEnabled(inFlag);
171            //      _previousBtn.setEnabled(inFlag);
172            //      _nextBtn.setEnabled(inFlag);            
173            }
174            
175    }