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 }