1 package snow.texteditor; 2 3 import snow.utils.gui.*; 4 import javax.swing.*; 5 import javax.swing.event.*; 6 import javax.swing.text.*; 7 import java.awt.event.*; 8 import java.util.*; 9 import java.awt.*; 10 11 15 public class SearchPanel extends JPanel 16 { 17 final private JTextField searchTF = new JTextField(12); 18 19 final private JButton searchPrevious = new JButton(new Icons.UpIcon(10,10, true)); 20 final private JButton searchNext = new JButton(new Icons.DownIcon(10,10, true)); 21 22 final private JButton close = new JButton(Icons.CrossIcon.shared10); 23 final private JCheckBox searchFromLine = new JCheckBox("from actual position", false); 24 final private JCheckBox ignoreCase = new JCheckBox("ignore case", true); 25 final private JCheckBox backward = new JCheckBox("backward", false); 26 final private JTextField infoField = new JTextField(30); 27 28 final private JCheckBox viewAll = new JCheckBox("all", false); 30 33 final private SimpleDocument doc; 34 final private JTextPane textPane; 35 36 37 private int actualPosition = -1; private String actualSearch = ""; 39 40 private Object actualHighlightTag = null; 42 43 44 public SearchPanel(final JTextPane textPane, SimpleDocument doc) 45 { 46 super(); 48 this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 49 this.setBorder(null); 50 51 this.doc = doc; 52 this.textPane = textPane; 53 54 JPanel sPan = new JPanel(new FlowLayout(FlowLayout.LEFT,5,0)); 55 add(sPan); 56 sPan.add(close); 57 58 sPan.add(new JLabel("Search: ")); 59 sPan.add(searchTF); 60 searchNext.setMargin(new Insets(0,0,0,0)); 61 sPan.add(searchNext); 62 searchNext.setToolTipText("Search next"); 63 searchPrevious.setMargin(new Insets(0,0,0,0)); 64 sPan.add(searchPrevious); 65 searchPrevious.setToolTipText("Search previous"); 66 sPan.add(ignoreCase); 67 sPan.add(searchFromLine); 68 sPan.add(backward); 69 71 add(Box.createHorizontalStrut(10)); 72 add(infoField); 73 infoField.setEditable(false); 74 infoField.setMargin(null); 75 infoField.setBorder(null); 76 77 searchTF.addKeyListener(new KeyAdapter() 78 { 79 @Override 80 public void keyReleased(KeyEvent ke) 81 { 82 if(ke.getKeyCode() == KeyEvent.VK_ENTER) 83 { 84 searchNext(); 86 } 87 else 88 { 89 actualPosition = -1; 91 searchNext(); 92 } 93 } 94 }); 95 96 textPane.registerKeyboardAction(new ActionListener() 97 { 98 public void actionPerformed(ActionEvent ae) 99 { 100 CTRL_F_pressed(); 101 } 102 }, "Search", KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK, false), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 103 104 textPane.registerKeyboardAction(new ActionListener() 105 { 106 public void actionPerformed(ActionEvent ae) 107 { 108 searchNext(); 109 } 110 }, "SearchNext", KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0, true), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 111 112 close.setMargin(new Insets(0,0,0,0)); 113 close.setFocusPainted(false); 114 115 close.addActionListener(new ActionListener() 116 { 117 public void actionPerformed(ActionEvent ae) 118 { 119 setVisible(false); 120 textPane.requestFocus(); 121 } 122 }); 123 124 searchNext.addActionListener(new ActionListener() 125 { 126 public void actionPerformed(ActionEvent ae) 127 { 128 searchNext(true); 129 } 130 }); 131 132 searchPrevious.addActionListener(new ActionListener() 133 { 134 public void actionPerformed(ActionEvent ae) 135 { 136 searchNext(false); 137 } 138 }); 139 140 setVisible(false); 142 } 144 146 public void setSearchPositionStart(int pos) 147 { 148 actualPosition = pos; 149 } 150 151 public void setInfoText(final String info) 152 { 153 if(EventQueue.isDispatchThread()) 154 { 155 infoField.setText(info); 156 } 157 else 158 { 159 EventQueue.invokeLater(new Runnable () { public void run() { 160 infoField.setText(info); 161 }}); 162 } 163 } 164 165 public void CTRL_F_pressed() 166 { 167 if(!this.isVisible()) 168 { 169 this.setVisible(true); 170 } 171 searchTF.selectAll(); 172 searchTF.requestFocus(); 173 } 174 175 176 public void searchNext() 177 { 178 searchNext( !this.backward.isSelected() ); 179 } 180 181 183 public void searchNext(boolean forward) 184 { 185 if(!this.isVisible()) 187 { 188 this.setVisible(true); 189 return; 190 } 191 searchTF.requestFocus(); 192 193 194 if(actualHighlightTag!=null) 196 { 197 textPane.getHighlighter().removeHighlight(actualHighlightTag); 198 } 199 200 201 this.actualSearch = searchTF.getText(); 202 if(ignoreCase.isSelected()) actualSearch = actualSearch.toUpperCase(); 203 if(actualSearch.length()==0) return; 205 206 int incr = 1; 207 if(!forward) incr = -1; 208 if(this.searchFromLine.isSelected()) 209 { 210 actualPosition = search(actualSearch, textPane.getCaretPosition() + incr, !forward); 211 } 212 else 213 { 214 actualPosition = search(actualSearch, this.actualPosition + incr, !forward); 215 } 216 217 if(actualPosition>=0) 218 { 219 searchTF.setBackground(UIManager.getColor("TextField.background")); 220 223 try 224 { 225 actualHighlightTag = textPane.getHighlighter().addHighlight( 226 actualPosition, actualPosition+actualSearch.length(), doc.searchHighlighter); 227 textPane.setCaretPosition(actualPosition); 229 textPane.scrollRectToVisible( textPane.modelToView(actualPosition) ); 232 } 233 catch(Exception e) { e.printStackTrace(); } 234 } 235 else 236 { 237 searchTF.setBackground(Color.red); 239 } 240 } 241 242 243 private int search(String str, int from, boolean backward) 244 { 245 if(backward) 246 { 247 return doc.searchBackward(str, from, ignoreCase.isSelected()); 248 } 249 else 250 { 251 return doc.search(str, from, ignoreCase.isSelected()); 252 } 253 } 254 255 257 public void searchNext_calledFromPopup(String str, int from) 258 { 259 this.setVisible(true); 261 262 this.actualSearch = str; 263 this.searchTF.setText(str); 264 this.backward.setSelected(false); 265 266 if(this.ignoreCase.isSelected()) str = str.toUpperCase(); 267 if(actualHighlightTag!=null) 269 { 270 textPane.getHighlighter().removeHighlight(actualHighlightTag); 271 } 272 273 int pos = doc.search(str, from, ignoreCase.isSelected()); 274 if(pos>=0) 275 { 276 try 277 { 278 actualHighlightTag = textPane.getHighlighter().addHighlight( 279 pos, pos+str.length(), doc.searchHighlighter); 280 textPane.setCaretPosition(pos); 282 textPane.scrollRectToVisible( textPane.modelToView(pos) ); 284 } 285 catch(Exception e) { e.printStackTrace(); } 286 } 287 else 288 { 289 System.out.println(str+" not found from "+from); 290 } 291 } 292 293 295 public void searchPrevious_calledFromPopup(String str, int from) 296 { 297 this.searchTF.setText(str); 298 this.backward.setSelected(true); 299 300 if(this.ignoreCase.isSelected()) str = str.toUpperCase(); 301 if(actualHighlightTag!=null) 303 { 304 textPane.getHighlighter().removeHighlight(actualHighlightTag); 305 } 306 307 int pos = doc.searchBackward(str, from, ignoreCase.isSelected()); 308 if(pos>=0) 309 { 310 try 311 { 312 actualHighlightTag = textPane.getHighlighter().addHighlight( 313 pos, pos+str.length(), doc.searchHighlighter); 314 textPane.setCaretPosition(pos); 316 textPane.scrollRectToVisible( textPane.modelToView(pos) ); 318 } 319 catch(Exception e) { e.printStackTrace(); } 320 321 } 322 else 323 { 324 System.out.println(str+" not found backward from "+from); 325 } 326 } 327 328 } | Popular Tags |