PageRenderTime 52ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/jEdit/tags/jedit-4-0-pre3/org/gjt/sp/jedit/search/SearchDialog.java

#
Java | 805 lines | 586 code | 130 blank | 89 comment | 103 complexity | 595aca56e28db0edb1b0454b1e7d8e1f MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * SearchDialog.java - Search and replace dialog
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 1998, 1999, 2000, 2001 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.search;
  23. //{{{ Imports
  24. import javax.swing.border.*;
  25. import javax.swing.event.*;
  26. import javax.swing.*;
  27. import java.awt.*;
  28. import java.awt.event.*;
  29. import java.io.File;
  30. import org.gjt.sp.jedit.gui.*;
  31. import org.gjt.sp.jedit.io.FileVFS;
  32. import org.gjt.sp.jedit.msg.SearchSettingsChanged;
  33. import org.gjt.sp.jedit.*;
  34. import org.gjt.sp.util.Log;
  35. //}}}
  36. /**
  37. * Search and replace dialog.
  38. * @author Slava Pestov
  39. * @version $Id: SearchDialog.java 3931 2001-12-02 11:40:51Z spestov $
  40. */
  41. public class SearchDialog extends EnhancedDialog implements EBComponent
  42. {
  43. //{{{ Constants
  44. /**
  45. * Default file set.
  46. * @since jEdit 3.2pre2
  47. */
  48. public static final int CURRENT_BUFFER = 0;
  49. public static final int ALL_BUFFERS = 1;
  50. public static final int DIRECTORY = 2;
  51. //}}}
  52. //{{{ SearchDialog constructor
  53. /**
  54. * Creates a new search and replace dialog box.
  55. * @param view The view
  56. * @param searchString The search string
  57. */
  58. public SearchDialog(View view, String searchString)
  59. {
  60. this(view,searchString,CURRENT_BUFFER);
  61. } //}}}
  62. //{{{ SearchDialog constructor
  63. /**
  64. * Creates a new search and replace dialog box.
  65. * @param view The view
  66. * @param searchString The search string
  67. * @param searchIn One of CURRENT_BUFFER, ALL_BUFFERS, or DIRECTORY
  68. * @since jEdit 3.2pre2
  69. */
  70. public SearchDialog(View view, String searchString, int searchIn)
  71. {
  72. super(view,jEdit.getProperty("search.title"),false);
  73. this.view = view;
  74. JPanel content = new JPanel(new BorderLayout());
  75. content.setBorder(new EmptyBorder(0,12,12,12));
  76. setContentPane(content);
  77. JPanel centerPanel = new JPanel(new BorderLayout());
  78. centerPanel.add(BorderLayout.NORTH,createFieldPanel());
  79. centerPanel.add(BorderLayout.CENTER,createSearchSettingsPanel());
  80. content.add(BorderLayout.CENTER,centerPanel);
  81. content.add(BorderLayout.SOUTH,createMultiFilePanel());
  82. content.add(BorderLayout.EAST,createButtonsPanel());
  83. if(searchString != null)
  84. {
  85. if(searchString.indexOf('\n') == -1)
  86. {
  87. find.setText(searchString);
  88. find.selectAll();
  89. }
  90. else if(searchIn == CURRENT_BUFFER)
  91. {
  92. searchSelection.setSelected(true);
  93. hyperSearch.setSelected(true);
  94. }
  95. }
  96. ignoreCase.setSelected(SearchAndReplace.getIgnoreCase());
  97. regexp.setSelected(SearchAndReplace.getRegexp());
  98. wrap.setSelected(SearchAndReplace.getAutoWrapAround());
  99. if(SearchAndReplace.getReverseSearch())
  100. searchBack.setSelected(true);
  101. else
  102. searchForward.setSelected(true);
  103. if(SearchAndReplace.getBeanShellReplace())
  104. beanShellReplace.setSelected(true);
  105. else
  106. stringReplace.setSelected(true);
  107. if(searchIn == CURRENT_BUFFER)
  108. {
  109. if(!searchSelection.isSelected())
  110. {
  111. // might be already selected, see above.
  112. searchCurrentBuffer.setSelected(true);
  113. /* this property is only loaded and saved if
  114. * the 'current buffer' file set is selected.
  115. * otherwise, it defaults to on. */
  116. hyperSearch.setSelected(jEdit.getBooleanProperty(
  117. "search.hypersearch.toggle"));
  118. }
  119. }
  120. else if(searchIn == ALL_BUFFERS)
  121. {
  122. searchAllBuffers.setSelected(true);
  123. hyperSearch.setSelected(true);
  124. }
  125. else if(searchIn == DIRECTORY)
  126. {
  127. hyperSearch.setSelected(true);
  128. searchDirectory.setSelected(true);
  129. }
  130. SearchFileSet fileset = SearchAndReplace.getSearchFileSet();
  131. if(fileset instanceof DirectoryListSet)
  132. {
  133. filter.setText(((DirectoryListSet)fileset)
  134. .getFileFilter());
  135. directory.setText(((DirectoryListSet)fileset)
  136. .getDirectory());
  137. searchSubDirectories.setSelected(((DirectoryListSet)fileset)
  138. .isRecursive());
  139. }
  140. else
  141. {
  142. String path;
  143. if(view.getBuffer().getVFS() instanceof FileVFS)
  144. {
  145. path = MiscUtilities.getParentOfPath(
  146. view.getBuffer().getPath());
  147. }
  148. else
  149. path = System.getProperty("user.dir");
  150. directory.setText(path);
  151. if(fileset instanceof AllBufferSet)
  152. {
  153. filter.setText(((AllBufferSet)fileset)
  154. .getFileFilter());
  155. }
  156. else
  157. {
  158. filter.setText("*" + MiscUtilities
  159. .getFileExtension(view.getBuffer()
  160. .getName()));
  161. }
  162. searchSubDirectories.setSelected(true);
  163. }
  164. keepDialog.setSelected(jEdit.getBooleanProperty(
  165. "search.keepDialog.toggle"));
  166. updateEnabled();
  167. pack();
  168. jEdit.unsetProperty("search.width");
  169. jEdit.unsetProperty("search.d-width");
  170. jEdit.unsetProperty("search.height");
  171. jEdit.unsetProperty("search.d-height");
  172. GUIUtilities.loadGeometry(this,"search");
  173. show();
  174. EditBus.addToBus(this);
  175. GUIUtilities.requestFocus(this,find);
  176. } //}}}
  177. //{{{ ok() method
  178. public void ok()
  179. {
  180. try
  181. {
  182. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  183. if(!save())
  184. return;
  185. if(hyperSearch.isSelected() || searchSelection.isSelected())
  186. {
  187. if(SearchAndReplace.hyperSearch(view,
  188. searchSelection.isSelected()));
  189. closeOrKeepDialog();
  190. }
  191. else
  192. {
  193. if(SearchAndReplace.find(view))
  194. closeOrKeepDialog();
  195. }
  196. }
  197. finally
  198. {
  199. setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  200. }
  201. } //}}}
  202. //{{{ cancel() method
  203. public void cancel()
  204. {
  205. save();
  206. GUIUtilities.saveGeometry(this,"search");
  207. dispose();
  208. } //}}}
  209. //{{{ handleMessage() method
  210. public void handleMessage(EBMessage msg)
  211. {
  212. if(msg instanceof SearchSettingsChanged)
  213. {
  214. ignoreCase.setSelected(SearchAndReplace.getIgnoreCase());
  215. regexp.setSelected(SearchAndReplace.getRegexp());
  216. }
  217. } //}}}
  218. //{{{ dispose() method
  219. public void dispose()
  220. {
  221. EditBus.removeFromBus(this);
  222. super.dispose();
  223. } //}}}
  224. //{{{ Private members
  225. //{{{ Instance variables
  226. private View view;
  227. // fields
  228. private HistoryTextField find, replace;
  229. private JRadioButton stringReplace, beanShellReplace;
  230. // search settings
  231. private JCheckBox keepDialog, ignoreCase, regexp, hyperSearch,
  232. wrap;
  233. private JRadioButton searchBack, searchForward;
  234. private JRadioButton searchSelection, searchCurrentBuffer, searchAllBuffers,
  235. searchDirectory;
  236. // multifile settings
  237. private HistoryTextField filter, directory;
  238. private JCheckBox searchSubDirectories;
  239. private JButton choose;
  240. // buttons
  241. private JButton findBtn, replaceBtn, replaceAndFindBtn, replaceAllBtn,
  242. closeBtn;
  243. //}}}
  244. //{{{ createFieldPanel() method
  245. private JPanel createFieldPanel()
  246. {
  247. ButtonActionHandler actionHandler = new ButtonActionHandler();
  248. JPanel fieldPanel = new JPanel(new VariableGridLayout(
  249. VariableGridLayout.FIXED_NUM_COLUMNS,1));
  250. fieldPanel.setBorder(new EmptyBorder(0,0,12,12));
  251. JLabel label = new JLabel(jEdit.getProperty("search.find"));
  252. label.setDisplayedMnemonic(jEdit.getProperty("search.find.mnemonic")
  253. .charAt(0));
  254. find = new HistoryTextField("find");
  255. find.addActionListener(actionHandler);
  256. label.setLabelFor(find);
  257. label.setBorder(new EmptyBorder(12,0,2,0));
  258. fieldPanel.add(label);
  259. fieldPanel.add(find);
  260. label = new JLabel(jEdit.getProperty("search.replace"));
  261. label.setDisplayedMnemonic(jEdit.getProperty("search.replace.mnemonic")
  262. .charAt(0));
  263. label.setBorder(new EmptyBorder(12,0,0,0));
  264. fieldPanel.add(label);
  265. ButtonGroup grp = new ButtonGroup();
  266. ReplaceActionHandler replaceActionHandler = new ReplaceActionHandler();
  267. // we use a custom JRadioButton subclass that returns
  268. // false for isFocusTraversable() so that the user can
  269. // tab from the search field to the replace field with
  270. // one keystroke
  271. Box replaceModeBox = new Box(BoxLayout.X_AXIS);
  272. stringReplace = new MyJRadioButton(jEdit.getProperty(
  273. "search.string-replace-btn"));
  274. stringReplace.addActionListener(replaceActionHandler);
  275. grp.add(stringReplace);
  276. replaceModeBox.add(stringReplace);
  277. replaceModeBox.add(Box.createHorizontalStrut(12));
  278. beanShellReplace = new MyJRadioButton(jEdit.getProperty(
  279. "search.beanshell-replace-btn"));
  280. beanShellReplace.addActionListener(replaceActionHandler);
  281. grp.add(beanShellReplace);
  282. replaceModeBox.add(beanShellReplace);
  283. fieldPanel.add(replaceModeBox);
  284. fieldPanel.add(Box.createVerticalStrut(3));
  285. replace = new HistoryTextField("replace");
  286. replace.addActionListener(actionHandler);
  287. label.setLabelFor(replace);
  288. fieldPanel.add(replace);
  289. return fieldPanel;
  290. } //}}}
  291. //{{{ createSearchSettingsPanel() method
  292. private JPanel createSearchSettingsPanel()
  293. {
  294. JPanel searchSettings = new JPanel(new VariableGridLayout(
  295. VariableGridLayout.FIXED_NUM_COLUMNS,3));
  296. searchSettings.setBorder(new EmptyBorder(0,0,12,12));
  297. SettingsActionHandler actionHandler = new SettingsActionHandler();
  298. ButtonGroup fileset = new ButtonGroup();
  299. ButtonGroup direction = new ButtonGroup();
  300. searchSettings.add(new JLabel(jEdit.getProperty("search.fileset")));
  301. searchSettings.add(new JLabel(jEdit.getProperty("search.settings")));
  302. searchSettings.add(new JLabel(jEdit.getProperty("search.direction")));
  303. searchSelection = new JRadioButton(jEdit.getProperty("search.selection"));
  304. searchSelection.setMnemonic(jEdit.getProperty("search.selection.mnemonic")
  305. .charAt(0));
  306. fileset.add(searchSelection);
  307. searchSettings.add(searchSelection);
  308. searchSelection.addActionListener(actionHandler);
  309. keepDialog = new JCheckBox(jEdit.getProperty("search.keep"));
  310. keepDialog.setMnemonic(jEdit.getProperty("search.keep.mnemonic")
  311. .charAt(0));
  312. searchSettings.add(keepDialog);
  313. searchBack = new JRadioButton(jEdit.getProperty("search.back"));
  314. searchBack.setMnemonic(jEdit.getProperty("search.back.mnemonic")
  315. .charAt(0));
  316. direction.add(searchBack);
  317. searchSettings.add(searchBack);
  318. searchBack.addActionListener(actionHandler);
  319. searchCurrentBuffer = new JRadioButton(jEdit.getProperty("search.current"));
  320. searchCurrentBuffer.setMnemonic(jEdit.getProperty("search.current.mnemonic")
  321. .charAt(0));
  322. fileset.add(searchCurrentBuffer);
  323. searchSettings.add(searchCurrentBuffer);
  324. searchCurrentBuffer.addActionListener(actionHandler);
  325. ignoreCase = new JCheckBox(jEdit.getProperty("search.case"));
  326. ignoreCase.setMnemonic(jEdit.getProperty("search.case.mnemonic")
  327. .charAt(0));
  328. searchSettings.add(ignoreCase);
  329. ignoreCase.addActionListener(actionHandler);
  330. searchForward = new JRadioButton(jEdit.getProperty("search.forward"));
  331. searchForward.setMnemonic(jEdit.getProperty("search.forward.mnemonic")
  332. .charAt(0));
  333. direction.add(searchForward);
  334. searchSettings.add(searchForward);
  335. searchForward.addActionListener(actionHandler);
  336. searchAllBuffers = new JRadioButton(jEdit.getProperty("search.all"));
  337. searchAllBuffers.setMnemonic(jEdit.getProperty("search.all.mnemonic")
  338. .charAt(0));
  339. fileset.add(searchAllBuffers);
  340. searchSettings.add(searchAllBuffers);
  341. searchAllBuffers.addActionListener(actionHandler);
  342. regexp = new JCheckBox(jEdit.getProperty("search.regexp"));
  343. regexp.setMnemonic(jEdit.getProperty("search.regexp.mnemonic")
  344. .charAt(0));
  345. searchSettings.add(regexp);
  346. regexp.addActionListener(actionHandler);
  347. wrap = new JCheckBox(jEdit.getProperty("search.wrap"));
  348. wrap.setMnemonic(jEdit.getProperty("search.wrap.mnemonic")
  349. .charAt(0));
  350. searchSettings.add(wrap);
  351. wrap.addActionListener(actionHandler);
  352. searchDirectory = new JRadioButton(jEdit.getProperty("search.directory"));
  353. searchDirectory.setMnemonic(jEdit.getProperty("search.directory.mnemonic")
  354. .charAt(0));
  355. fileset.add(searchDirectory);
  356. searchSettings.add(searchDirectory);
  357. searchDirectory.addActionListener(actionHandler);
  358. hyperSearch = new JCheckBox(jEdit.getProperty("search.hypersearch"));
  359. hyperSearch.setMnemonic(jEdit.getProperty("search.hypersearch.mnemonic")
  360. .charAt(0));
  361. searchSettings.add(hyperSearch);
  362. hyperSearch.addActionListener(actionHandler);
  363. return searchSettings;
  364. } //}}}
  365. //{{{ createMultiFilePanel() method
  366. private JPanel createMultiFilePanel()
  367. {
  368. JPanel multifile = new JPanel();
  369. GridBagLayout layout = new GridBagLayout();
  370. multifile.setLayout(layout);
  371. GridBagConstraints cons = new GridBagConstraints();
  372. cons.gridy = cons.gridwidth = cons.gridheight = 1;
  373. cons.anchor = GridBagConstraints.WEST;
  374. cons.fill = GridBagConstraints.HORIZONTAL;
  375. MultiFileActionHandler actionListener = new MultiFileActionHandler();
  376. filter = new HistoryTextField("search.filter");
  377. filter.addActionListener(actionListener);
  378. cons.insets = new Insets(0,0,3,0);
  379. JLabel label = new JLabel(jEdit.getProperty("search.filterField"),
  380. SwingConstants.RIGHT);
  381. label.setBorder(new EmptyBorder(0,0,0,12));
  382. label.setDisplayedMnemonic(jEdit.getProperty("search.filterField.mnemonic")
  383. .charAt(0));
  384. label.setLabelFor(filter);
  385. cons.weightx = 0.0f;
  386. layout.setConstraints(label,cons);
  387. multifile.add(label);
  388. cons.insets = new Insets(0,0,3,6);
  389. cons.weightx = 1.0f;
  390. layout.setConstraints(filter,cons);
  391. multifile.add(filter);
  392. cons.gridy++;
  393. directory = new HistoryTextField("search.directory");
  394. directory.addActionListener(actionListener);
  395. label = new JLabel(jEdit.getProperty("search.directoryField"),
  396. SwingConstants.RIGHT);
  397. label.setBorder(new EmptyBorder(0,0,0,12));
  398. label.setDisplayedMnemonic(jEdit.getProperty("search.directoryField.mnemonic")
  399. .charAt(0));
  400. label.setLabelFor(directory);
  401. cons.insets = new Insets(0,0,3,0);
  402. cons.weightx = 0.0f;
  403. layout.setConstraints(label,cons);
  404. multifile.add(label);
  405. cons.insets = new Insets(0,0,3,6);
  406. cons.weightx = 1.0f;
  407. cons.gridwidth = 2;
  408. layout.setConstraints(directory,cons);
  409. multifile.add(directory);
  410. choose = new JButton(jEdit.getProperty("search.choose"));
  411. choose.setMnemonic(jEdit.getProperty("search.choose.mnemonic")
  412. .charAt(0));
  413. cons.insets = new Insets(0,0,3,0);
  414. cons.weightx = 0.0f;
  415. cons.gridwidth = 1;
  416. layout.setConstraints(choose,cons);
  417. multifile.add(choose);
  418. choose.addActionListener(actionListener);
  419. cons.insets = new Insets(0,0,0,0);
  420. cons.gridy++;
  421. cons.gridwidth = 4;
  422. searchSubDirectories = new JCheckBox(jEdit.getProperty(
  423. "search.subdirs"));
  424. searchSubDirectories.setMnemonic(jEdit.getProperty("search.subdirs.mnemonic")
  425. .charAt(0));
  426. layout.setConstraints(searchSubDirectories,cons);
  427. multifile.add(searchSubDirectories);
  428. return multifile;
  429. } //}}}
  430. //{{{ createButtonsPanel() method
  431. private Box createButtonsPanel()
  432. {
  433. Box box = new Box(BoxLayout.Y_AXIS);
  434. ButtonActionHandler actionHandler = new ButtonActionHandler();
  435. box.add(Box.createVerticalStrut(12));
  436. JPanel grid = new JPanel(new GridLayout(5,1,0,12));
  437. findBtn = new JButton(jEdit.getProperty("search.findBtn"));
  438. getRootPane().setDefaultButton(findBtn);
  439. grid.add(findBtn);
  440. findBtn.addActionListener(actionHandler);
  441. replaceBtn = new JButton(jEdit.getProperty("search.replaceBtn"));
  442. replaceBtn.setMnemonic(jEdit.getProperty("search.replaceBtn.mnemonic")
  443. .charAt(0));
  444. grid.add(replaceBtn);
  445. replaceBtn.addActionListener(actionHandler);
  446. replaceAndFindBtn = new JButton(jEdit.getProperty("search.replaceAndFindBtn"));
  447. replaceAndFindBtn.setMnemonic(jEdit.getProperty("search.replaceAndFindBtn.mnemonic")
  448. .charAt(0));
  449. grid.add(replaceAndFindBtn);
  450. replaceAndFindBtn.addActionListener(actionHandler);
  451. replaceAllBtn = new JButton(jEdit.getProperty("search.replaceAllBtn"));
  452. replaceAllBtn.setMnemonic(jEdit.getProperty("search.replaceAllBtn.mnemonic")
  453. .charAt(0));
  454. grid.add(replaceAllBtn);
  455. replaceAllBtn.addActionListener(actionHandler);
  456. closeBtn = new JButton(jEdit.getProperty("common.close"));
  457. grid.add(closeBtn);
  458. closeBtn.addActionListener(actionHandler);
  459. grid.setMaximumSize(grid.getPreferredSize());
  460. box.add(grid);
  461. box.add(Box.createGlue());
  462. return box;
  463. } //}}}
  464. //{{{ updateEnabled() method
  465. private void updateEnabled()
  466. {
  467. wrap.setEnabled(!hyperSearch.isSelected());
  468. boolean reverseEnabled = !hyperSearch.isSelected()
  469. && searchCurrentBuffer.isSelected();
  470. searchBack.setEnabled(reverseEnabled);
  471. searchForward.setEnabled(reverseEnabled);
  472. boolean regexpEnabled = (hyperSearch.isSelected()
  473. || !(searchBack.isEnabled() && searchBack.isSelected()));
  474. regexp.setEnabled(regexpEnabled);
  475. filter.setEnabled(searchAllBuffers.isSelected()
  476. || searchDirectory.isSelected());
  477. boolean directoryEnabled = searchDirectory.isSelected();
  478. directory.setEnabled(directoryEnabled);
  479. choose.setEnabled(directoryEnabled);
  480. searchSubDirectories.setEnabled(directoryEnabled);
  481. findBtn.setEnabled(!searchSelection.isSelected()
  482. || hyperSearch.isSelected());
  483. } //}}}
  484. //{{{ save() method
  485. private boolean save()
  486. {
  487. String filter = this.filter.getText();
  488. this.filter.addCurrentToHistory();
  489. if(filter.length() == 0)
  490. filter = "*";
  491. SearchFileSet fileset = SearchAndReplace.getSearchFileSet();
  492. if(searchSelection.isSelected())
  493. fileset = new CurrentBufferSet();
  494. else if(searchCurrentBuffer.isSelected())
  495. {
  496. fileset = new CurrentBufferSet();
  497. jEdit.setBooleanProperty("search.hypersearch.toggle",
  498. hyperSearch.isSelected());
  499. }
  500. else if(searchAllBuffers.isSelected())
  501. fileset = new AllBufferSet(filter);
  502. else if(searchDirectory.isSelected())
  503. {
  504. String directory = this.directory.getText();
  505. this.directory.addCurrentToHistory();
  506. boolean recurse = searchSubDirectories.isSelected();
  507. if(fileset instanceof DirectoryListSet)
  508. {
  509. DirectoryListSet dset = (DirectoryListSet)fileset;
  510. if(!dset.getDirectory().equals(directory)
  511. || !dset.getFileFilter().equals(filter)
  512. || !dset.isRecursive() == recurse)
  513. fileset = new DirectoryListSet(directory,filter,recurse);
  514. }
  515. else
  516. fileset = new DirectoryListSet(directory,filter,recurse);
  517. }
  518. else
  519. {
  520. // can't happen
  521. fileset = null;
  522. }
  523. jEdit.setBooleanProperty("search.keepDialog.toggle",
  524. keepDialog.isSelected());
  525. boolean ok = true;
  526. if(fileset.getFileCount() == 0)
  527. {
  528. // oops
  529. GUIUtilities.error(this,"empty-fileset",null);
  530. ok = false;
  531. }
  532. else
  533. SearchAndReplace.setSearchFileSet(fileset);
  534. if(find.getText().length() != 0)
  535. {
  536. find.addCurrentToHistory();
  537. SearchAndReplace.setSearchString(find.getText());
  538. replace.addCurrentToHistory();
  539. SearchAndReplace.setReplaceString(replace.getText());
  540. }
  541. else
  542. ok = false;
  543. return ok;
  544. } //}}}
  545. //{{{ closeOrKeepDialog() method
  546. private void closeOrKeepDialog()
  547. {
  548. if(keepDialog.isSelected())
  549. return;
  550. else
  551. {
  552. GUIUtilities.saveGeometry(this,"search");
  553. dispose();
  554. }
  555. } //}}}
  556. //}}}
  557. //{{{ Inner classes
  558. //{{{ MyJRadioButton class
  559. // used for the stringReplace and beanShell replace radio buttons,
  560. // so that the user can press tab to go from the find field to the
  561. // replace field in one go
  562. class MyJRadioButton extends JRadioButton
  563. {
  564. MyJRadioButton(String label)
  565. {
  566. super(label);
  567. }
  568. public boolean isFocusTraversable()
  569. {
  570. return false;
  571. }
  572. } //}}}
  573. //{{{ ReplaceActionHandler class
  574. class ReplaceActionHandler implements ActionListener
  575. {
  576. public void actionPerformed(ActionEvent evt)
  577. {
  578. replace.setModel(beanShellReplace.isSelected()
  579. ? "replace.script"
  580. : "replace");
  581. SearchAndReplace.setBeanShellReplace(
  582. beanShellReplace.isSelected());
  583. }
  584. } //}}}
  585. //{{{ SettingsActionHandler class
  586. class SettingsActionHandler implements ActionListener
  587. {
  588. public void actionPerformed(ActionEvent evt)
  589. {
  590. Object source = evt.getSource();
  591. if(source == ignoreCase)
  592. SearchAndReplace.setIgnoreCase(ignoreCase.isSelected());
  593. else if(source == regexp)
  594. SearchAndReplace.setRegexp(regexp.isSelected());
  595. else if(source == searchBack || source == searchForward)
  596. SearchAndReplace.setReverseSearch(searchBack.isSelected());
  597. else if(source == wrap)
  598. SearchAndReplace.setAutoWrapAround(wrap.isSelected());
  599. else if(source == searchCurrentBuffer)
  600. hyperSearch.setSelected(false);
  601. else if(source == searchSelection
  602. || source == searchAllBuffers
  603. || source == searchDirectory)
  604. hyperSearch.setSelected(true);
  605. updateEnabled();
  606. }
  607. } //}}}
  608. //{{{ MultiFileActionHandler class
  609. class MultiFileActionHandler implements ActionListener
  610. {
  611. public void actionPerformed(ActionEvent evt)
  612. {
  613. if(evt.getSource() == choose)
  614. {
  615. File dir = new File(directory.getText());
  616. JFileChooser chooser = new JFileChooser(dir.getParent());
  617. chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  618. chooser.setSelectedFile(dir);
  619. if(chooser.showOpenDialog(SearchDialog.this)
  620. == JFileChooser.APPROVE_OPTION)
  621. directory.setText(chooser.getSelectedFile().getPath());
  622. }
  623. else // source is directory or filter field
  624. {
  625. // just as if Enter was pressed in another
  626. // text field
  627. ok();
  628. }
  629. }
  630. } //}}}
  631. //{{{ ButtonActionHandler class
  632. class ButtonActionHandler implements ActionListener
  633. {
  634. public void actionPerformed(ActionEvent evt)
  635. {
  636. Object source = evt.getSource();
  637. if(source == closeBtn)
  638. cancel();
  639. else if(source == findBtn || source == find
  640. || source == replace)
  641. {
  642. ok();
  643. }
  644. else if(source == replaceBtn
  645. || (source == replaceAllBtn
  646. && searchSelection.isSelected()))
  647. {
  648. save();
  649. if(SearchAndReplace.replace(view))
  650. closeOrKeepDialog();
  651. else
  652. getToolkit().beep();
  653. }
  654. else if(source == replaceAndFindBtn)
  655. {
  656. save();
  657. if(SearchAndReplace.replace(view))
  658. ok();
  659. else
  660. getToolkit().beep();
  661. }
  662. else if(source == replaceAllBtn)
  663. {
  664. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  665. save();
  666. if(SearchAndReplace.replaceAll(view))
  667. closeOrKeepDialog();
  668. else
  669. getToolkit().beep();
  670. setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  671. }
  672. }
  673. } //}}}
  674. //}}}
  675. }