PageRenderTime 47ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/jEdit/tags/jedit-4-2-pre4/org/gjt/sp/jedit/search/SearchDialog.java

#
Java | 903 lines | 645 code | 143 blank | 115 comment | 106 complexity | f28612d7f0210c9cd09747f7ac025700 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, 2003 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.*;
  26. import java.awt.*;
  27. import java.awt.event.*;
  28. import java.io.File;
  29. import java.util.HashMap;
  30. import org.gjt.sp.jedit.browser.VFSBrowser;
  31. import org.gjt.sp.jedit.gui.*;
  32. import org.gjt.sp.jedit.io.*;
  33. import org.gjt.sp.jedit.msg.SearchSettingsChanged;
  34. import org.gjt.sp.jedit.msg.ViewUpdate;
  35. import org.gjt.sp.jedit.*;
  36. //}}}
  37. /**
  38. * Search and replace dialog.
  39. * @author Slava Pestov
  40. * @version $Id: SearchDialog.java 4808 2003-06-22 21:23:33Z spestov $
  41. */
  42. public class SearchDialog extends EnhancedDialog implements EBComponent
  43. {
  44. //{{{ Constants
  45. /**
  46. * Default file set.
  47. * @since jEdit 3.2pre2
  48. */
  49. public static final int CURRENT_BUFFER = 0;
  50. public static final int ALL_BUFFERS = 1;
  51. public static final int DIRECTORY = 2;
  52. //}}}
  53. //{{{ getSearchDialog() method
  54. public static SearchDialog getSearchDialog(View view)
  55. {
  56. return (SearchDialog)viewHash.get(view);
  57. } //}}}
  58. //{{{ preloadSearchDialog() method
  59. /**
  60. * Preloads the search dialog for the given for so that it can be
  61. * quickly displayed later.
  62. * @since jEdit 4.2pre3
  63. */
  64. public static void preloadSearchDialog(View view)
  65. {
  66. SearchDialog dialog = new SearchDialog(view);
  67. viewHash.put(view,dialog);
  68. } //}}}
  69. //{{{ showSearchDialog() method
  70. /**
  71. * Displays a search and replace dialog box, reusing an existing one
  72. * if necessary.
  73. * @param view The view
  74. * @param searchString The search string
  75. * @param searchIn One of CURRENT_BUFFER, ALL_BUFFERS, or DIRECTORY
  76. * @since jEdit 4.0pre6
  77. */
  78. public static void showSearchDialog(View view, String searchString,
  79. int searchIn)
  80. {
  81. SearchDialog dialog = (SearchDialog)viewHash.get(view);
  82. dialog.setSearchString(searchString,searchIn);
  83. GUIUtilities.requestFocus(dialog,dialog.find);
  84. // ugly workaround
  85. if(OperatingSystem.isUnix() && !OperatingSystem.isMacOS())
  86. dialog.setVisible(false);
  87. dialog.setVisible(true);
  88. dialog.toFront();
  89. dialog.requestFocus();
  90. } //}}}
  91. //{{{ setSearchString() method
  92. /**
  93. * Sets the search string.
  94. * @since jEdit 4.0pre5
  95. */
  96. public void setSearchString(String searchString, int searchIn)
  97. {
  98. if(searchString == null)
  99. find.setText(null);
  100. else
  101. {
  102. if(searchString.indexOf('\n') == -1)
  103. {
  104. find.setText(searchString);
  105. find.selectAll();
  106. }
  107. else if(searchIn == CURRENT_BUFFER)
  108. {
  109. searchSelection.setSelected(true);
  110. hyperSearch.setSelected(true);
  111. }
  112. }
  113. if(searchIn == CURRENT_BUFFER)
  114. {
  115. if(!searchSelection.isSelected())
  116. {
  117. // might be already selected, see above.
  118. searchCurrentBuffer.setSelected(true);
  119. /* this property is only loaded and saved if
  120. * the 'current buffer' file set is selected.
  121. * otherwise, it defaults to on. */
  122. hyperSearch.setSelected(jEdit.getBooleanProperty(
  123. "search.hypersearch.toggle"));
  124. }
  125. }
  126. else if(searchIn == ALL_BUFFERS)
  127. {
  128. searchAllBuffers.setSelected(true);
  129. hyperSearch.setSelected(true);
  130. }
  131. else if(searchIn == DIRECTORY)
  132. {
  133. hyperSearch.setSelected(true);
  134. searchDirectory.setSelected(true);
  135. }
  136. updateEnabled();
  137. } //}}}
  138. //{{{ ok() method
  139. public void ok()
  140. {
  141. try
  142. {
  143. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  144. if(!save(false))
  145. return;
  146. if(searchSelection.isSelected()
  147. && view.getTextArea().getSelectionCount() == 0)
  148. {
  149. GUIUtilities.error(view,"search-no-selection",null);
  150. return;
  151. }
  152. if(hyperSearch.isSelected() || searchSelection.isSelected())
  153. {
  154. if(SearchAndReplace.hyperSearch(view,
  155. searchSelection.isSelected()))
  156. closeOrKeepDialog();
  157. }
  158. else
  159. {
  160. if(SearchAndReplace.find(view))
  161. closeOrKeepDialog();
  162. else
  163. {
  164. toFront();
  165. requestFocus();
  166. find.requestFocus();
  167. }
  168. }
  169. }
  170. finally
  171. {
  172. setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  173. }
  174. } //}}}
  175. //{{{ cancel() method
  176. public void cancel()
  177. {
  178. save(true);
  179. GUIUtilities.saveGeometry(this,"search");
  180. setVisible(false);
  181. } //}}}
  182. //{{{ handleMessage() method
  183. public void handleMessage(EBMessage msg)
  184. {
  185. if(msg instanceof SearchSettingsChanged)
  186. {
  187. load();
  188. }
  189. } //}}}
  190. //{{{ dispose() method
  191. public void dispose()
  192. {
  193. EditBus.removeFromBus(this);
  194. viewHash.remove(view);
  195. super.dispose();
  196. } //}}}
  197. //{{{ Private members
  198. private static HashMap viewHash = new HashMap();
  199. //{{{ Instance variables
  200. private View view;
  201. // fields
  202. private HistoryTextField find, replace;
  203. private JRadioButton stringReplace, beanShellReplace;
  204. // search settings
  205. private JCheckBox keepDialog, ignoreCase, regexp, hyperSearch,
  206. wrap;
  207. private JRadioButton searchBack, searchForward;
  208. private JRadioButton searchSelection, searchCurrentBuffer, searchAllBuffers,
  209. searchDirectory;
  210. // multifile settings
  211. private HistoryTextField filter, directory;
  212. private JCheckBox searchSubDirectories;
  213. private JButton choose;
  214. // buttons
  215. private JButton findBtn, /* replaceBtn, */ replaceAndFindBtn, replaceAllBtn,
  216. closeBtn;
  217. //}}}
  218. //{{{ SearchDialog constructor
  219. /**
  220. * Creates a new search and replace dialog box.
  221. * @param view The view
  222. * @param searchString The search string
  223. */
  224. private SearchDialog(View view)
  225. {
  226. super(view,jEdit.getProperty("search.title"),false);
  227. this.view = view;
  228. JPanel content = new JPanel(new BorderLayout());
  229. content.setBorder(new EmptyBorder(0,12,12,12));
  230. setContentPane(content);
  231. JPanel centerPanel = new JPanel(new BorderLayout());
  232. centerPanel.add(BorderLayout.NORTH,createFieldPanel());
  233. centerPanel.add(BorderLayout.CENTER,createSearchSettingsPanel());
  234. content.add(BorderLayout.CENTER,centerPanel);
  235. content.add(BorderLayout.SOUTH,createMultiFilePanel());
  236. content.add(BorderLayout.EAST,createButtonsPanel());
  237. pack();
  238. jEdit.unsetProperty("search.width");
  239. jEdit.unsetProperty("search.d-width");
  240. jEdit.unsetProperty("search.height");
  241. jEdit.unsetProperty("search.d-height");
  242. GUIUtilities.loadGeometry(this,"search");
  243. load();
  244. EditBus.addToBus(this);
  245. } //}}}
  246. //{{{ createFieldPanel() method
  247. private JPanel createFieldPanel()
  248. {
  249. ButtonActionHandler actionHandler = new ButtonActionHandler();
  250. JPanel fieldPanel = new JPanel(new VariableGridLayout(
  251. VariableGridLayout.FIXED_NUM_COLUMNS,1));
  252. fieldPanel.setBorder(new EmptyBorder(0,0,12,12));
  253. JLabel label = new JLabel(jEdit.getProperty("search.find"));
  254. label.setDisplayedMnemonic(jEdit.getProperty("search.find.mnemonic")
  255. .charAt(0));
  256. find = new HistoryTextField("find");
  257. find.setColumns(25);
  258. find.addActionListener(actionHandler);
  259. label.setLabelFor(find);
  260. label.setBorder(new EmptyBorder(12,0,2,0));
  261. fieldPanel.add(label);
  262. fieldPanel.add(find);
  263. label = new JLabel(jEdit.getProperty("search.replace"));
  264. label.setDisplayedMnemonic(jEdit.getProperty("search.replace.mnemonic")
  265. .charAt(0));
  266. label.setBorder(new EmptyBorder(12,0,0,0));
  267. fieldPanel.add(label);
  268. ButtonGroup grp = new ButtonGroup();
  269. ReplaceActionHandler replaceActionHandler = new ReplaceActionHandler();
  270. // we use a custom JRadioButton subclass that returns
  271. // false for isFocusTraversable() so that the user can
  272. // tab from the search field to the replace field with
  273. // one keystroke
  274. Box replaceModeBox = new Box(BoxLayout.X_AXIS);
  275. stringReplace = new MyJRadioButton(jEdit.getProperty(
  276. "search.string-replace-btn"));
  277. stringReplace.addActionListener(replaceActionHandler);
  278. grp.add(stringReplace);
  279. replaceModeBox.add(stringReplace);
  280. replaceModeBox.add(Box.createHorizontalStrut(12));
  281. beanShellReplace = new MyJRadioButton(jEdit.getProperty(
  282. "search.beanshell-replace-btn"));
  283. beanShellReplace.addActionListener(replaceActionHandler);
  284. grp.add(beanShellReplace);
  285. replaceModeBox.add(beanShellReplace);
  286. fieldPanel.add(replaceModeBox);
  287. fieldPanel.add(Box.createVerticalStrut(3));
  288. replace = new HistoryTextField("replace");
  289. replace.addActionListener(actionHandler);
  290. label.setLabelFor(replace);
  291. fieldPanel.add(replace);
  292. return fieldPanel;
  293. } //}}}
  294. //{{{ createSearchSettingsPanel() method
  295. private JPanel createSearchSettingsPanel()
  296. {
  297. JPanel searchSettings = new JPanel(new VariableGridLayout(
  298. VariableGridLayout.FIXED_NUM_COLUMNS,3));
  299. searchSettings.setBorder(new EmptyBorder(0,0,12,12));
  300. SettingsActionHandler actionHandler = new SettingsActionHandler();
  301. ButtonGroup fileset = new ButtonGroup();
  302. ButtonGroup direction = new ButtonGroup();
  303. searchSettings.add(new JLabel(jEdit.getProperty("search.fileset")));
  304. searchSettings.add(new JLabel(jEdit.getProperty("search.settings")));
  305. searchSettings.add(new JLabel(jEdit.getProperty("search.direction")));
  306. searchSelection = new JRadioButton(jEdit.getProperty("search.selection"));
  307. searchSelection.setMnemonic(jEdit.getProperty("search.selection.mnemonic")
  308. .charAt(0));
  309. fileset.add(searchSelection);
  310. searchSettings.add(searchSelection);
  311. searchSelection.addActionListener(actionHandler);
  312. keepDialog = new JCheckBox(jEdit.getProperty("search.keep"));
  313. keepDialog.setMnemonic(jEdit.getProperty("search.keep.mnemonic")
  314. .charAt(0));
  315. searchSettings.add(keepDialog);
  316. searchBack = new JRadioButton(jEdit.getProperty("search.back"));
  317. searchBack.setMnemonic(jEdit.getProperty("search.back.mnemonic")
  318. .charAt(0));
  319. direction.add(searchBack);
  320. searchSettings.add(searchBack);
  321. searchBack.addActionListener(actionHandler);
  322. searchCurrentBuffer = new JRadioButton(jEdit.getProperty("search.current"));
  323. searchCurrentBuffer.setMnemonic(jEdit.getProperty("search.current.mnemonic")
  324. .charAt(0));
  325. fileset.add(searchCurrentBuffer);
  326. searchSettings.add(searchCurrentBuffer);
  327. searchCurrentBuffer.addActionListener(actionHandler);
  328. ignoreCase = new JCheckBox(jEdit.getProperty("search.case"));
  329. ignoreCase.setMnemonic(jEdit.getProperty("search.case.mnemonic")
  330. .charAt(0));
  331. searchSettings.add(ignoreCase);
  332. ignoreCase.addActionListener(actionHandler);
  333. searchForward = new JRadioButton(jEdit.getProperty("search.forward"));
  334. searchForward.setMnemonic(jEdit.getProperty("search.forward.mnemonic")
  335. .charAt(0));
  336. direction.add(searchForward);
  337. searchSettings.add(searchForward);
  338. searchForward.addActionListener(actionHandler);
  339. searchAllBuffers = new JRadioButton(jEdit.getProperty("search.all"));
  340. searchAllBuffers.setMnemonic(jEdit.getProperty("search.all.mnemonic")
  341. .charAt(0));
  342. fileset.add(searchAllBuffers);
  343. searchSettings.add(searchAllBuffers);
  344. searchAllBuffers.addActionListener(actionHandler);
  345. regexp = new JCheckBox(jEdit.getProperty("search.regexp"));
  346. regexp.setMnemonic(jEdit.getProperty("search.regexp.mnemonic")
  347. .charAt(0));
  348. searchSettings.add(regexp);
  349. regexp.addActionListener(actionHandler);
  350. wrap = new JCheckBox(jEdit.getProperty("search.wrap"));
  351. wrap.setMnemonic(jEdit.getProperty("search.wrap.mnemonic")
  352. .charAt(0));
  353. searchSettings.add(wrap);
  354. wrap.addActionListener(actionHandler);
  355. searchDirectory = new JRadioButton(jEdit.getProperty("search.directory"));
  356. searchDirectory.setMnemonic(jEdit.getProperty("search.directory.mnemonic")
  357. .charAt(0));
  358. fileset.add(searchDirectory);
  359. searchSettings.add(searchDirectory);
  360. searchDirectory.addActionListener(actionHandler);
  361. hyperSearch = new JCheckBox(jEdit.getProperty("search.hypersearch"));
  362. hyperSearch.setMnemonic(jEdit.getProperty("search.hypersearch.mnemonic")
  363. .charAt(0));
  364. searchSettings.add(hyperSearch);
  365. hyperSearch.addActionListener(actionHandler);
  366. return searchSettings;
  367. } //}}}
  368. //{{{ createMultiFilePanel() method
  369. private JPanel createMultiFilePanel()
  370. {
  371. JPanel multifile = new JPanel();
  372. GridBagLayout layout = new GridBagLayout();
  373. multifile.setLayout(layout);
  374. GridBagConstraints cons = new GridBagConstraints();
  375. cons.gridy = cons.gridwidth = cons.gridheight = 1;
  376. cons.anchor = GridBagConstraints.WEST;
  377. cons.fill = GridBagConstraints.HORIZONTAL;
  378. MultiFileActionHandler actionListener = new MultiFileActionHandler();
  379. filter = new HistoryTextField("search.filter");
  380. filter.addActionListener(actionListener);
  381. cons.insets = new Insets(0,0,3,0);
  382. JLabel label = new JLabel(jEdit.getProperty("search.filterField"),
  383. SwingConstants.RIGHT);
  384. label.setBorder(new EmptyBorder(0,0,0,12));
  385. label.setDisplayedMnemonic(jEdit.getProperty("search.filterField.mnemonic")
  386. .charAt(0));
  387. label.setLabelFor(filter);
  388. cons.weightx = 0.0f;
  389. layout.setConstraints(label,cons);
  390. multifile.add(label);
  391. cons.insets = new Insets(0,0,3,6);
  392. cons.weightx = 1.0f;
  393. layout.setConstraints(filter,cons);
  394. multifile.add(filter);
  395. cons.gridy++;
  396. directory = new HistoryTextField("search.directory");
  397. directory.setColumns(25);
  398. directory.addActionListener(actionListener);
  399. label = new JLabel(jEdit.getProperty("search.directoryField"),
  400. SwingConstants.RIGHT);
  401. label.setBorder(new EmptyBorder(0,0,0,12));
  402. label.setDisplayedMnemonic(jEdit.getProperty("search.directoryField.mnemonic")
  403. .charAt(0));
  404. label.setLabelFor(directory);
  405. cons.insets = new Insets(0,0,3,0);
  406. cons.weightx = 0.0f;
  407. layout.setConstraints(label,cons);
  408. multifile.add(label);
  409. cons.insets = new Insets(0,0,3,6);
  410. cons.weightx = 1.0f;
  411. cons.gridwidth = 2;
  412. layout.setConstraints(directory,cons);
  413. multifile.add(directory);
  414. choose = new JButton(jEdit.getProperty("search.choose"));
  415. choose.setMnemonic(jEdit.getProperty("search.choose.mnemonic")
  416. .charAt(0));
  417. cons.insets = new Insets(0,0,3,0);
  418. cons.weightx = 0.0f;
  419. cons.gridwidth = 1;
  420. layout.setConstraints(choose,cons);
  421. multifile.add(choose);
  422. choose.addActionListener(actionListener);
  423. cons.insets = new Insets(0,0,0,0);
  424. cons.gridy++;
  425. cons.gridwidth = 4;
  426. searchSubDirectories = new JCheckBox(jEdit.getProperty(
  427. "search.subdirs"));
  428. searchSubDirectories.setMnemonic(jEdit.getProperty("search.subdirs.mnemonic")
  429. .charAt(0));
  430. layout.setConstraints(searchSubDirectories,cons);
  431. multifile.add(searchSubDirectories);
  432. return multifile;
  433. } //}}}
  434. //{{{ createButtonsPanel() method
  435. private Box createButtonsPanel()
  436. {
  437. Box box = new Box(BoxLayout.Y_AXIS);
  438. ButtonActionHandler actionHandler = new ButtonActionHandler();
  439. box.add(Box.createVerticalStrut(12));
  440. JPanel grid = new JPanel(new GridLayout(5,1,0,12));
  441. findBtn = new JButton(jEdit.getProperty("search.findBtn"));
  442. getRootPane().setDefaultButton(findBtn);
  443. grid.add(findBtn);
  444. findBtn.addActionListener(actionHandler);
  445. /* replaceBtn = new JButton(jEdit.getProperty("search.replaceBtn"));
  446. replaceBtn.setMnemonic(jEdit.getProperty("search.replaceBtn.mnemonic")
  447. .charAt(0));
  448. grid.add(replaceBtn);
  449. replaceBtn.addActionListener(actionHandler); */
  450. replaceAndFindBtn = new JButton(jEdit.getProperty("search.replaceAndFindBtn"));
  451. replaceAndFindBtn.setMnemonic(jEdit.getProperty("search.replaceAndFindBtn.mnemonic")
  452. .charAt(0));
  453. grid.add(replaceAndFindBtn);
  454. replaceAndFindBtn.addActionListener(actionHandler);
  455. replaceAllBtn = new JButton(jEdit.getProperty("search.replaceAllBtn"));
  456. replaceAllBtn.setMnemonic(jEdit.getProperty("search.replaceAllBtn.mnemonic")
  457. .charAt(0));
  458. grid.add(replaceAllBtn);
  459. replaceAllBtn.addActionListener(actionHandler);
  460. closeBtn = new JButton(jEdit.getProperty("common.close"));
  461. grid.add(closeBtn);
  462. closeBtn.addActionListener(actionHandler);
  463. grid.setMaximumSize(grid.getPreferredSize());
  464. box.add(grid);
  465. box.add(Box.createGlue());
  466. return box;
  467. } //}}}
  468. //{{{ updateEnabled() method
  469. private void updateEnabled()
  470. {
  471. wrap.setEnabled(!hyperSearch.isSelected()
  472. && !searchSelection.isSelected());
  473. boolean reverseEnabled = !hyperSearch.isSelected()
  474. && searchCurrentBuffer.isSelected()
  475. && !regexp.isSelected();
  476. searchBack.setEnabled(reverseEnabled);
  477. searchForward.setEnabled(reverseEnabled);
  478. if(!reverseEnabled)
  479. searchForward.setSelected(true);
  480. filter.setEnabled(searchAllBuffers.isSelected()
  481. || searchDirectory.isSelected());
  482. boolean directoryEnabled = searchDirectory.isSelected();
  483. directory.setEnabled(directoryEnabled);
  484. choose.setEnabled(directoryEnabled);
  485. searchSubDirectories.setEnabled(directoryEnabled);
  486. findBtn.setEnabled(!searchSelection.isSelected()
  487. || hyperSearch.isSelected());
  488. replaceAndFindBtn.setEnabled(!hyperSearch.isSelected()
  489. && !searchSelection.isSelected());
  490. } //}}}
  491. //{{{ save() method
  492. /**
  493. * @param cancel If true, we don't bother the user with warning messages
  494. */
  495. private boolean save(boolean cancel)
  496. {
  497. String filter = this.filter.getText();
  498. this.filter.addCurrentToHistory();
  499. if(filter.length() == 0)
  500. filter = "*";
  501. SearchFileSet fileset = SearchAndReplace.getSearchFileSet();
  502. if(searchSelection.isSelected())
  503. fileset = new CurrentBufferSet();
  504. else if(searchCurrentBuffer.isSelected())
  505. {
  506. fileset = new CurrentBufferSet();
  507. jEdit.setBooleanProperty("search.hypersearch.toggle",
  508. hyperSearch.isSelected());
  509. }
  510. else if(searchAllBuffers.isSelected())
  511. fileset = new AllBufferSet(filter);
  512. else if(searchDirectory.isSelected())
  513. {
  514. String directory = this.directory.getText();
  515. this.directory.addCurrentToHistory();
  516. directory = MiscUtilities.constructPath(
  517. view.getBuffer().getDirectory(),directory);
  518. if((VFSManager.getVFSForPath(directory).getCapabilities()
  519. & VFS.LOW_LATENCY_CAP) == 0)
  520. {
  521. if(cancel)
  522. return false;
  523. int retVal = GUIUtilities.confirm(
  524. SearchDialog.this,"remote-dir-search",
  525. null,JOptionPane.YES_NO_OPTION,
  526. JOptionPane.WARNING_MESSAGE);
  527. if(retVal != JOptionPane.YES_OPTION)
  528. return false;
  529. }
  530. boolean recurse = searchSubDirectories.isSelected();
  531. if(fileset instanceof DirectoryListSet)
  532. {
  533. DirectoryListSet dset = (DirectoryListSet)fileset;
  534. dset.setDirectory(directory);
  535. dset.setFileFilter(filter);
  536. dset.setRecursive(recurse);
  537. EditBus.send(new SearchSettingsChanged(null));
  538. }
  539. else
  540. fileset = new DirectoryListSet(directory,filter,recurse);
  541. }
  542. else
  543. {
  544. // can't happen
  545. fileset = null;
  546. }
  547. jEdit.setBooleanProperty("search.keepDialog.toggle",
  548. keepDialog.isSelected());
  549. boolean ok = true;
  550. SearchAndReplace.setSearchFileSet(fileset);
  551. if(find.getText().length() != 0)
  552. {
  553. find.addCurrentToHistory();
  554. SearchAndReplace.setSearchString(find.getText());
  555. replace.addCurrentToHistory();
  556. SearchAndReplace.setReplaceString(replace.getText());
  557. }
  558. else
  559. ok = false;
  560. return ok;
  561. } //}}}
  562. //{{{ closeOrKeepDialog() method
  563. private void closeOrKeepDialog()
  564. {
  565. if(keepDialog.isSelected())
  566. {
  567. // Windows bug workaround in case a YES/NO confirm
  568. // was shown
  569. // ... but if HyperSearch results window is floating,
  570. // the workaround causes problems!
  571. if(!hyperSearch.isSelected())
  572. {
  573. toFront();
  574. requestFocus();
  575. find.requestFocus();
  576. }
  577. return;
  578. }
  579. else
  580. {
  581. GUIUtilities.saveGeometry(this,"search");
  582. setVisible(false);
  583. }
  584. } //}}}
  585. //{{{ load() method
  586. private void load()
  587. {
  588. ignoreCase.setSelected(SearchAndReplace.getIgnoreCase());
  589. regexp.setSelected(SearchAndReplace.getRegexp());
  590. wrap.setSelected(SearchAndReplace.getAutoWrapAround());
  591. if(SearchAndReplace.getReverseSearch())
  592. searchBack.setSelected(true);
  593. else
  594. searchForward.setSelected(true);
  595. if(SearchAndReplace.getBeanShellReplace())
  596. {
  597. replace.setModel("replace.script");
  598. beanShellReplace.setSelected(true);
  599. }
  600. else
  601. {
  602. replace.setModel("replace");
  603. stringReplace.setSelected(true);
  604. }
  605. SearchFileSet fileset = SearchAndReplace.getSearchFileSet();
  606. if(fileset instanceof DirectoryListSet)
  607. {
  608. filter.setText(((DirectoryListSet)fileset)
  609. .getFileFilter());
  610. directory.setText(((DirectoryListSet)fileset)
  611. .getDirectory());
  612. searchSubDirectories.setSelected(((DirectoryListSet)fileset)
  613. .isRecursive());
  614. }
  615. else
  616. {
  617. directory.setText(view.getBuffer().getDirectory());
  618. if(fileset instanceof AllBufferSet)
  619. {
  620. filter.setText(((AllBufferSet)fileset)
  621. .getFileFilter());
  622. }
  623. else
  624. {
  625. filter.setText("*" + MiscUtilities
  626. .getFileExtension(view.getBuffer()
  627. .getName()));
  628. }
  629. searchSubDirectories.setSelected(true);
  630. }
  631. directory.addCurrentToHistory();
  632. keepDialog.setSelected(jEdit.getBooleanProperty(
  633. "search.keepDialog.toggle"));
  634. } //}}}
  635. //}}}
  636. //{{{ Inner classes
  637. //{{{ MyJRadioButton class
  638. // used for the stringReplace and beanShell replace radio buttons,
  639. // so that the user can press tab to go from the find field to the
  640. // replace field in one go
  641. class MyJRadioButton extends JRadioButton
  642. {
  643. MyJRadioButton(String label)
  644. {
  645. super(label);
  646. }
  647. public boolean isFocusTraversable()
  648. {
  649. return false;
  650. }
  651. } //}}}
  652. //{{{ ReplaceActionHandler class
  653. class ReplaceActionHandler implements ActionListener
  654. {
  655. public void actionPerformed(ActionEvent evt)
  656. {
  657. replace.setModel(beanShellReplace.isSelected()
  658. ? "replace.script"
  659. : "replace");
  660. SearchAndReplace.setBeanShellReplace(
  661. beanShellReplace.isSelected());
  662. }
  663. } //}}}
  664. //{{{ SettingsActionHandler class
  665. class SettingsActionHandler implements ActionListener
  666. {
  667. public void actionPerformed(ActionEvent evt)
  668. {
  669. Object source = evt.getSource();
  670. if(source == ignoreCase)
  671. SearchAndReplace.setIgnoreCase(ignoreCase.isSelected());
  672. else if(source == regexp)
  673. SearchAndReplace.setRegexp(regexp.isSelected());
  674. else if(source == searchBack || source == searchForward)
  675. SearchAndReplace.setReverseSearch(searchBack.isSelected());
  676. else if(source == wrap)
  677. SearchAndReplace.setAutoWrapAround(wrap.isSelected());
  678. else if(source == searchCurrentBuffer)
  679. hyperSearch.setSelected(false);
  680. else if(source == searchSelection
  681. || source == searchAllBuffers
  682. || source == searchDirectory)
  683. hyperSearch.setSelected(true);
  684. updateEnabled();
  685. }
  686. } //}}}
  687. //{{{ MultiFileActionHandler class
  688. class MultiFileActionHandler implements ActionListener
  689. {
  690. public void actionPerformed(ActionEvent evt)
  691. {
  692. if(evt.getSource() == choose)
  693. {
  694. String[] dirs = GUIUtilities.showVFSFileDialog(
  695. view,directory.getText(),
  696. VFSBrowser.CHOOSE_DIRECTORY_DIALOG,
  697. false);
  698. if(dirs != null)
  699. directory.setText(dirs[0]);
  700. }
  701. else // source is directory or filter field
  702. {
  703. // just as if Enter was pressed in another
  704. // text field
  705. ok();
  706. }
  707. }
  708. } //}}}
  709. //{{{ ButtonActionHandler class
  710. class ButtonActionHandler implements ActionListener
  711. {
  712. public void actionPerformed(ActionEvent evt)
  713. {
  714. Object source = evt.getSource();
  715. if(source == closeBtn)
  716. cancel();
  717. else if(source == findBtn || source == find
  718. || source == replace)
  719. {
  720. ok();
  721. }
  722. else if(source == replaceAndFindBtn)
  723. {
  724. save(false);
  725. if(SearchAndReplace.replace(view))
  726. ok();
  727. else
  728. getToolkit().beep();
  729. }
  730. else if(source == replaceAllBtn)
  731. {
  732. if(searchSelection.isSelected() &&
  733. view.getTextArea().getSelectionCount()
  734. == 0)
  735. {
  736. GUIUtilities.error(view,"search-no-selection",null);
  737. return;
  738. }
  739. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  740. save(false);
  741. if(searchSelection.isSelected())
  742. {
  743. if(SearchAndReplace.replace(view))
  744. closeOrKeepDialog();
  745. else
  746. getToolkit().beep();
  747. }
  748. else
  749. {
  750. if(SearchAndReplace.replaceAll(view))
  751. closeOrKeepDialog();
  752. else
  753. getToolkit().beep();
  754. }
  755. setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  756. }
  757. }
  758. } //}}}
  759. //}}}
  760. }