diff --git a/app/src/processing/app/FindReplace.java b/app/src/processing/app/FindReplace.java index 26e7a754920..df1c9511435 100644 --- a/app/src/processing/app/FindReplace.java +++ b/app/src/processing/app/FindReplace.java @@ -28,6 +28,7 @@ import java.awt.event.*; import javax.swing.*; +import javax.swing.border.Border; import processing.app.helpers.OSUtils; @@ -50,239 +51,205 @@ @SuppressWarnings("serial") public class FindReplace extends JFrame implements ActionListener { - static final int EDGE = OSUtils.isMacOS() ? 20 : 13; - static final int SMALL = 6; - static final int BUTTONGAP = 12; // 12 is correct for Mac, other numbers may be required for other platofrms + private Editor editor; - Editor editor; + private JTextField findField; + private JTextField replaceField; + private static String findString; + private static String replaceString; - JTextField findField; - JTextField replaceField; - static String findString; - static String replaceString; + private JButton replaceButton; + private JButton replaceAllButton; + private JButton replaceFindButton; + private JButton previousButton; + private JButton findButton; - JButton replaceButton; - JButton replaceAllButton; - JButton replaceFindButton; - JButton previousButton; - JButton findButton; + private JCheckBox ignoreCaseBox; + private static boolean ignoreCase = true; - JCheckBox ignoreCaseBox; - static boolean ignoreCase = true; + private JCheckBox wrapAroundBox; + private static boolean wrapAround = true; - JCheckBox wrapAroundBox; - static boolean wrapAround = true; - - JCheckBox searchAllFilesBox; - static boolean searchAllFiles = false; + private JCheckBox searchAllFilesBox; + private static boolean searchAllFiles = false; public FindReplace(Editor editor) { - super("Find"); - setResizable(false); + super(_("Find")); this.editor = editor; - - FlowLayout searchLayout = new FlowLayout(FlowLayout.RIGHT,5,0); - Container pane = getContentPane(); - pane.setLayout(searchLayout); + JPanel contentPanel = new JPanel(); + Border padding = BorderFactory.createEmptyBorder(10, 10, 10, 10); + contentPanel.setBorder(padding); + setContentPane(contentPanel); + JLabel findLabel = new JLabel(_("Find:")); + findField = new JTextField(20); JLabel replaceLabel = new JLabel(_("Replace with:")); - Dimension labelDimension = replaceLabel.getPreferredSize(); - - JPanel find = new JPanel(); - find.add(findLabel); - find.add(findField = new JTextField(20)); - pane.add(find); - - JPanel replace = new JPanel(); - replace.add(replaceLabel); - replace.add(replaceField = new JTextField(20)); - pane.add(replace); - - int fieldHeight = findField.getPreferredSize().height; + replaceField = new JTextField(20); - JPanel checkbox = new JPanel(); - // Fill the findString with selected text if no previous value - if (editor.getSelectedText() != null && - editor.getSelectedText().length() > 0) + if (editor.getSelectedText() != null + && editor.getSelectedText().length() > 0) findString = editor.getSelectedText(); - if (findString != null) findField.setText(findString); - if (replaceString != null) replaceField.setText(replaceString); - //System.out.println("setting find str to " + findString); - //findField.requestFocusInWindow(); + if (findString != null) + findField.setText(findString); + if (replaceString != null) + replaceField.setText(replaceString); ignoreCaseBox = new JCheckBox(_("Ignore Case")); ignoreCaseBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ignoreCase = ignoreCaseBox.isSelected(); - } - }); + public void actionPerformed(ActionEvent e) { + ignoreCase = ignoreCaseBox.isSelected(); + } + }); ignoreCaseBox.setSelected(ignoreCase); - checkbox.add(ignoreCaseBox); wrapAroundBox = new JCheckBox(_("Wrap Around")); wrapAroundBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - wrapAround = wrapAroundBox.isSelected(); - } - }); + public void actionPerformed(ActionEvent e) { + wrapAround = wrapAroundBox.isSelected(); + } + }); wrapAroundBox.setSelected(wrapAround); - checkbox.add(wrapAroundBox); - + searchAllFilesBox = new JCheckBox(_("Search all Sketch Tabs")); searchAllFilesBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - searchAllFiles = searchAllFilesBox.isSelected(); - } - }); + public void actionPerformed(ActionEvent e) { + searchAllFiles = searchAllFilesBox.isSelected(); + } + }); searchAllFilesBox.setSelected(searchAllFiles); - checkbox.add(searchAllFilesBox); - pane.add(checkbox); - - JPanel buttons = new JPanel(); - buttons.setLayout(new FlowLayout(FlowLayout.CENTER, BUTTONGAP, 0)); + JPanel checkboxPanel = new JPanel(); + checkboxPanel.setLayout(new BoxLayout(checkboxPanel, BoxLayout.PAGE_AXIS)); + checkboxPanel.add(ignoreCaseBox); + checkboxPanel.add(Box.createRigidArea(new Dimension(8, 0))); + checkboxPanel.add(wrapAroundBox); + checkboxPanel.add(Box.createRigidArea(new Dimension(8, 0))); + checkboxPanel.add(searchAllFilesBox); - // ordering is different on mac versus pc + replaceAllButton = new JButton(_("Replace All")); + replaceAllButton.addActionListener(this); + replaceButton = new JButton(_("Replace")); + replaceButton.addActionListener(this); + replaceFindButton = new JButton(_("Replace & Find")); + replaceFindButton.addActionListener(this); + previousButton = new JButton(_("Previous")); + previousButton.addActionListener(this); + findButton = new JButton(_("Find")); + findButton.addActionListener(this); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS)); + + // ordering of buttons is different on mac versus pc if (OSUtils.isMacOS()) { - buttons.add(replaceAllButton = new JButton(_("Replace All"))); - buttons.add(replaceButton = new JButton(_("Replace"))); - buttons.add(replaceFindButton = new JButton(_("Replace & Find"))); - buttons.add(previousButton = new JButton(_("Previous"))); - buttons.add(findButton = new JButton(_("Find"))); + buttonPanel.add(replaceAllButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(replaceButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(replaceFindButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(previousButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(findButton); } else { - buttons.add(findButton = new JButton(_("Find"))); - buttons.add(previousButton = new JButton(_("Previous"))); // is this the right position for non-Mac? - buttons.add(replaceFindButton = new JButton(_("Replace & Find"))); - buttons.add(replaceButton = new JButton(_("Replace"))); - buttons.add(replaceAllButton = new JButton(_("Replace All"))); + buttonPanel.add(findButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(previousButton); // is this the right position for + // non-Mac? + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(replaceFindButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(replaceButton); + buttonPanel.add(Box.createRigidArea(new Dimension(8, 0))); + buttonPanel.add(replaceAllButton); } - pane.add(buttons); // to fix ugliness.. normally macosx java 1.3 puts an // ugly white border around this object, so turn it off. if (OSUtils.isMacOS()) { - buttons.setBorder(null); + buttonPanel.setBorder(null); } - /* - findField.addFocusListener(new FocusListener() { - public void focusGained(FocusEvent e) { - System.out.println("Focus gained " + e.getOppositeComponent()); - } - - public void focusLost(FocusEvent e) { - System.out.println("Focus lost "); // + e.getOppositeComponent()); - if (e.getOppositeComponent() == null) { - requestFocusInWindow(); - } - } - }); - */ - - Dimension buttonsDimension = buttons.getPreferredSize(); - int visibleButtonWidth = buttonsDimension.width - 2 * BUTTONGAP; - int fieldWidth = visibleButtonWidth - (labelDimension.width + SMALL); - - // +1 since it's better to tend downwards - int yoff = (1 + fieldHeight - labelDimension.height) / 2; - - int ypos = EDGE; - - int labelWidth = findLabel.getPreferredSize().width; - findLabel.setBounds(EDGE + (labelDimension.width-labelWidth), ypos + yoff, // + yoff was added to the wrong field - labelWidth, labelDimension.height); - findField.setBounds(EDGE + labelDimension.width + SMALL, ypos, - fieldWidth, fieldHeight); - - ypos += fieldHeight + SMALL; + // Put all components onto the dialog window + GridBagLayout searchLayout = new GridBagLayout(); + GridBagConstraints gbc = new GridBagConstraints(); + Container pane = getContentPane(); + pane.setLayout(searchLayout); - labelWidth = replaceLabel.getPreferredSize().width; - replaceLabel.setBounds(EDGE + (labelDimension.width-labelWidth), ypos + yoff, - labelWidth, labelDimension.height); - replaceField.setBounds(EDGE + labelDimension.width + SMALL, ypos, - fieldWidth, fieldHeight); - - ypos += fieldHeight + SMALL; - - ignoreCaseBox.setBounds(EDGE + labelDimension.width + SMALL, - ypos, - (fieldWidth-SMALL)/4, fieldHeight); - - wrapAroundBox.setBounds(EDGE + labelDimension.width + SMALL + (fieldWidth-SMALL)/4 + SMALL, - ypos, - (fieldWidth-SMALL)/4, fieldHeight); - - searchAllFilesBox.setBounds(EDGE + labelDimension.width + SMALL + (int)((fieldWidth-SMALL)/1.9) + SMALL, - ypos, - (fieldWidth-SMALL)/2, fieldHeight); - - ypos += fieldHeight + SMALL; - - buttons.setBounds(EDGE-BUTTONGAP, ypos, - buttonsDimension.width, buttonsDimension.height); - - ypos += buttonsDimension.height; - -// Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - - int wide = visibleButtonWidth + EDGE*2; - int high = ypos; // butt.y + butt.height + EDGE*2 + SMALL; + gbc.insets = new Insets(4, 4, 4, 4); + gbc.gridx = 0; + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + pane.add(findLabel, gbc); + gbc.gridx = 1; + gbc.weightx = 1.0; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.LINE_START; + pane.add(findField, gbc); + gbc.gridx = 0; + gbc.gridy = 1; + gbc.weightx = 0.0; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + pane.add(replaceLabel, gbc); + gbc.gridx = 1; + gbc.weightx = 1.0; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.LINE_START; + pane.add(replaceField, gbc); + gbc.gridx = 1; + gbc.gridy = 2; + gbc.weighty = 0.0; + gbc.fill = GridBagConstraints.NONE; + pane.add(checkboxPanel, gbc); + gbc.anchor = GridBagConstraints.CENTER; + gbc.gridwidth = 2; + gbc.gridx = 0; + gbc.gridy = 3; + gbc.insets = new Insets(12, 4, 4, 4); + pane.add(buttonPanel, gbc); pack(); - Insets insets = getInsets(); - //System.out.println("Insets = " + insets); - setSize(wide + insets.left + insets.right,high + insets.top + insets.bottom); - - setLocationRelativeTo( null ); // center - // setBounds((screen.width - wide) / 2, (screen.height - high) / 2, wide, high); - - replaceButton.addActionListener(this); - replaceAllButton.addActionListener(this); - replaceFindButton.addActionListener(this); - findButton.addActionListener(this); - previousButton.addActionListener(this); - - // you mustn't replace what you haven't found, my son - // semantics of replace are "replace the current selection with the replace field" - // so whether we have found before or not is irrelevent - // replaceButton.setEnabled(false); - // replaceFindButton.setEnabled(false); + setResizable(false); + // centers the dialog on thew screen + setLocationRelativeTo(null); // make the find button the blinky default getRootPane().setDefaultButton(findButton); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - handleClose(); - } - }); + public void windowClosing(WindowEvent e) { + handleClose(); + } + }); Base.registerWindowCloseKeys(getRootPane(), new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - //hide(); - handleClose(); - } - }); + public void actionPerformed(ActionEvent actionEvent) { + // hide(); + handleClose(); + } + }); Base.setIcon(this); // hack to to get first field to focus properly on osx addWindowListener(new WindowAdapter() { - public void windowActivated(WindowEvent e) { - //System.out.println("activating"); - /*boolean ok =*/ findField.requestFocusInWindow(); - //System.out.println("got " + ok); - findField.selectAll(); - } - }); + public void windowActivated(WindowEvent e) { + // System.out.println("activating"); + /* boolean ok = */findField.requestFocusInWindow(); + // System.out.println("got " + ok); + findField.selectAll(); + } + }); } - public void handleClose() { - //System.out.println("handling close now"); + // System.out.println("handling close now"); findString = findField.getText(); replaceString = replaceField.getText(); @@ -290,7 +257,6 @@ public void handleClose() { setVisible(false); } - /* public void show() { findField.requestFocusInWindow(); @@ -321,17 +287,18 @@ public void actionPerformed(ActionEvent e) { } } - // look for the next instance of the find string to be found // once found, select it (and go to that line) - private boolean find(boolean wrap,boolean backwards,boolean searchTabs,int originTab) { - //System.out.println("Find: " + originTab); - boolean wrapNeeded = false; + private boolean find(boolean wrap, boolean backwards, boolean searchTabs, + int originTab) { + // System.out.println("Find: " + originTab); + boolean wrapNeeded = false; String search = findField.getText(); - //System.out.println("finding for " + search + " " + findString); + // System.out.println("finding for " + search + " " + findString); // this will catch "find next" being called when no search yet - if (search.length() == 0) return false; + if (search.length() == 0) + return false; String text = editor.getText(); @@ -342,7 +309,7 @@ private boolean find(boolean wrap,boolean backwards,boolean searchTabs,int origi int nextIndex; if (!backwards) { - //int selectionStart = editor.textarea.getSelectionStart(); + // int selectionStart = editor.textarea.getSelectionStart(); int selectionEnd = editor.getSelectionStop(); nextIndex = text.indexOf(search, selectionEnd); @@ -351,10 +318,10 @@ private boolean find(boolean wrap,boolean backwards,boolean searchTabs,int origi wrapNeeded = true; } } else { - //int selectionStart = editor.textarea.getSelectionStart(); - int selectionStart = editor.getSelectionStart()-1; + // int selectionStart = editor.textarea.getSelectionStart(); + int selectionStart = editor.getSelectionStart() - 1; - if ( selectionStart >= 0 ) { + if (selectionStart >= 0) { nextIndex = text.lastIndexOf(search, selectionStart); } else { nextIndex = -1; @@ -378,8 +345,8 @@ private boolean find(boolean wrap,boolean backwards,boolean searchTabs,int origi originTab = realCurrentTab; if (!wrap) - if ((!backwards && realCurrentTab + 1 >= sketch.getCodeCount()) || - (backwards && realCurrentTab - 1 < 0)) + if ((!backwards && realCurrentTab + 1 >= sketch.getCodeCount()) + || (backwards && realCurrentTab - 1 < 0)) return false; // Can't continue without wrap if (backwards) { @@ -397,23 +364,23 @@ private boolean find(boolean wrap,boolean backwards,boolean searchTabs,int origi } } } - + if (wrapNeeded) - nextIndex = backwards ? text.lastIndexOf(search) : text.indexOf(search, 0); + nextIndex = backwards ? text.lastIndexOf(search) : text.indexOf(search, + 0); } - - if (nextIndex != -1) { + + if (nextIndex != -1) { editor.setSelection(nextIndex, nextIndex + search.length()); return true; - } - + } + return false; } - /** - * Replace the current selection with whatever's in the - * replacement text field. + * Replace the current selection with whatever's in the replacement text + * field. */ public void replace() { if (findField.getText().length() == 0) @@ -439,8 +406,8 @@ public void replace() { } /** - * Replace the current selection with whatever's in the - * replacement text field, and then find the next match + * Replace the current selection with whatever's in the replacement text + * field, and then find the next match */ public void replaceAndFindNext() { replace(); @@ -448,8 +415,8 @@ public void replaceAndFindNext() { } /** - * Replace everything that matches by doing find and replace - * alternately until nothing more found. + * Replace everything that matches by doing find and replace alternately until + * nothing more found. */ public void replaceAll() { if (findField.getText().length() == 0) @@ -471,20 +438,20 @@ public void replaceAll() { Toolkit.getDefaultToolkit().beep(); } } - - public void setFindText( String t ) { - findField.setText( t ); + + public void setFindText(String t) { + findField.setText(t); findString = t; } public void findNext() { - if ( !find( wrapAround, false, searchAllFiles,-1 ) ) { + if (!find(wrapAround, false, searchAllFiles, -1)) { Toolkit.getDefaultToolkit().beep(); } } public void findPrevious() { - if ( !find( wrapAround, true, searchAllFiles,-1 ) ) { + if (!find(wrapAround, true, searchAllFiles, -1)) { Toolkit.getDefaultToolkit().beep(); } }