# HG changeset patch # Parent a14f31ffb7ce72ada4072caaecb5cd4713407706 #211098: Regular Expression option for file name pattern is confusing diff --git a/api.search/src/org/netbeans/api/search/ui/FileNameController.java b/api.search/src/org/netbeans/api/search/ui/FileNameController.java --- a/api.search/src/org/netbeans/api/search/ui/FileNameController.java +++ b/api.search/src/org/netbeans/api/search/ui/FileNameController.java @@ -173,14 +173,7 @@ } private void setFileNamePatternToolTip() { - String t; - if (regexp) { - t = null; - } else { - t = UiUtils.getText( - "BasicSearchForm.cboxFileNamePattern.tooltip"); //NOI18N - } - component.setToolTipText(t); + component.setToolTipText(UiUtils.getFileNamePatternsExample(regexp)); } /** diff --git a/api.search/src/org/netbeans/api/search/ui/ScopeOptionsController.java b/api.search/src/org/netbeans/api/search/ui/ScopeOptionsController.java --- a/api.search/src/org/netbeans/api/search/ui/ScopeOptionsController.java +++ b/api.search/src/org/netbeans/api/search/ui/ScopeOptionsController.java @@ -57,6 +57,7 @@ import org.netbeans.modules.search.ui.CheckBoxWithButtonPanel; import org.netbeans.modules.search.ui.FormLayoutHelper; import org.netbeans.modules.search.ui.UiUtils; +import org.openide.util.NbBundle; /** * Component controller for setting search scope options. @@ -116,6 +117,8 @@ private void init() { btnTestFileNamePattern = new JButton(); chkFileNameRegex = new JCheckBox(); + chkFileNameRegex.setToolTipText(UiUtils.getText( + "BasicSearchForm.chkFileNameRegex.tooltip")); //NOI18N if (!replacing) { chkArchives = new JCheckBox(); diff --git a/api.search/src/org/netbeans/modules/search/BasicSearchForm.java b/api.search/src/org/netbeans/modules/search/BasicSearchForm.java --- a/api.search/src/org/netbeans/modules/search/BasicSearchForm.java +++ b/api.search/src/org/netbeans/modules/search/BasicSearchForm.java @@ -46,8 +46,12 @@ import java.awt.Color; import java.awt.Component; -import java.awt.FlowLayout; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; import java.awt.ItemSelectable; +import java.awt.SystemColor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -58,6 +62,7 @@ import java.util.List; import java.util.logging.Logger; import javax.swing.*; +import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.JTextComponent; @@ -140,6 +145,8 @@ } useCurrentlySelectedText(); setSearchCriteriaValues(); + updateTextToFindInfo(); + updateFileNamePatternInfo(); } /** @@ -223,6 +230,8 @@ cboxTextToFind = ComponentUtils.adjustComboForSearchPattern(new JComboBox()); lblTextToFind.setLabelFor(cboxTextToFind.getComponent()); btnTestTextToFind = new JButton(); + lblTextToFindHint = new JLabel(); + lblTextToFindHint.setForeground(SystemColor.controlDkShadow); if (searchAndReplace) { lblReplacement = new JLabel(); @@ -239,6 +248,8 @@ lblScope.setLabelFor(cboxScope.getComponent()); lblFileNamePattern = new JLabel(); + lblFileNameHint = new JLabel(); + lblFileNameHint.setForeground(SystemColor.controlDkShadow); cboxFileNamePattern = ComponentUtils.adjustComboForFileName( new JComboBox()); lblFileNamePattern.setLabelFor(cboxFileNamePattern.getComponent()); @@ -271,14 +282,19 @@ formPanel = new SearchFormPanel(); formPanel.addRow(lblTextToFind, cboxTextToFind.getComponent()); + formPanel.addRow(new JLabel(), lblTextToFindHint); initContainingTextOptionsRow(searchAndReplace); if (searchAndReplace) { formPanel.addRow(lblReplacement, cboxReplacement); } + formPanel.addSeparator(); formPanel.addRow(lblScope, cboxScope.getComponent()); + formPanel.addSeparator(); formPanel.addRow(lblFileNamePattern, cboxFileNamePattern.getComponent()); + formPanel.addRow(new JLabel(), lblFileNameHint); initScopeOptionsRow(searchAndReplace); + formPanel.addEmptyLine(); } /** @@ -299,11 +315,10 @@ formPanel.addRow(new JLabel(), jp); } else { - jp.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0)); + jp.setLayout(new BoxLayout(jp, BoxLayout.LINE_AXIS)); jp.add(chkCaseSensitive); jp.add(chkWholeWords); jp.add(new CheckBoxWithButtonPanel(chkRegexp, btnTestTextToFind)); - jp.setMaximumSize(jp.getPreferredSize()); formPanel.addRow(new JLabel(), jp); } } @@ -424,6 +439,7 @@ cboxFileNamePattern.getFileNamePattern()); searchCriteria.setFileNameRegexp( cboxFileNamePattern.isRegularExpression()); + updateFileNamePatternInfo(); } }); @@ -496,6 +512,7 @@ && cboxFileNamePattern.getComponent().getItemCount() != 0) { cboxFileNamePattern.getComponent().setSelectedIndex(0); } + cboxFileNamePattern.setRegularExpression(memory.isFilePathRegex()); if (cboxReplacement != null && cboxReplacement.getItemCount() != 0) { cboxReplacement.setSelectedIndex(0); } @@ -608,7 +625,7 @@ if (cboxReplacement != null){ updateReplacePatternColor(); } - setTextToFindToolTip(); + updateTextToFindInfo(); } else if (toggle == chkPreserveCase) { searchCriteria.setPreserveCase(selected); } else { @@ -616,15 +633,18 @@ } } - private void setTextToFindToolTip() { - String t; - if (searchCriteria.isRegexp()) { - t = null; - } else { - t = UiUtils.getText( - "BasicSearchForm.cboxTextToFind.tooltip"); //NOI18N - } - cboxTextToFind.getComponent().setToolTipText(t); + private void updateTextToFindInfo() { + String bungleKey = (searchCriteria.isRegexp()) + ? "BasicSearchForm.cboxTextToFind.info.re" //NOI18N + : "BasicSearchForm.cboxTextToFind.info"; //NOI18N + String text = UiUtils.getText(bungleKey); + cboxTextToFind.getComponent().setToolTipText(text); + lblTextToFindHint.setText(text); + } + + private void updateFileNamePatternInfo() { + lblFileNameHint.setText(UiUtils.getFileNamePatternsExample( + cboxFileNamePattern.isRegularExpression())); } /** @@ -726,7 +746,7 @@ } else { } - setTextToFindToolTip(); + updateTextToFindInfo(); } private void lclz(AbstractButton ab, String msg) { @@ -751,8 +771,10 @@ protected SearchFormPanel formPanel; private JButton btnTestTextToFind; private JLabel lblTextToFind; + private JLabel lblTextToFindHint; private ScopeController cboxScope; private JLabel lblFileNamePattern; + private JLabel lblFileNameHint; private JLabel lblScope; private JLabel lblReplacement; private Color errorTextColor, defaultTextColor; @@ -766,18 +788,60 @@ private final class SearchFormPanel extends JPanel { private FormLayoutHelper flh; + private int row = 0; public SearchFormPanel() { super(); - this.flh = new FormLayoutHelper(this, - FormLayoutHelper.DEFAULT_COLUMN, - FormLayoutHelper.DEFAULT_COLUMN); - flh.setAllGaps(true); + setLayout(new GridBagLayout()); + setBorder(new EmptyBorder(5, 5, 5, 5)); } public void addRow(JComponent label, JComponent component) { - flh.addRow(label, component); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.gridy = row; + c.weightx = 0; + c.weighty = 0; + c.insets = new Insets(5, 5, 5, 5); + add(label, c); + + c.gridx = 1; + c.weightx = 1; + c.fill = GridBagConstraints.HORIZONTAL; + add(component, c); + + row++; + } + + public void addSeparator() { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = row; + c.gridwidth = 2; + c.weightx = 1; + c.insets = new Insets(5, 5, 5, 5); + c.fill = GridBagConstraints.HORIZONTAL; + JSeparator separator = new JSeparator(JSeparator.HORIZONTAL); + separator.setForeground(SystemColor.controlShadow); + add(separator, c); + row++; + } + + public void addEmptyLine() { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = row; + c.gridwidth = 2; + c.fill = GridBagConstraints.HORIZONTAL; + c.weighty = 1; + c.weightx = 0.1; + JLabel emptyLabel = new JLabel(); + emptyLabel.setPreferredSize(new Dimension(0, 0)); + emptyLabel.setMinimumSize(new Dimension(0, 0)); + add(emptyLabel, c); + row++; } } diff --git a/api.search/src/org/netbeans/modules/search/Bundle.properties b/api.search/src/org/netbeans/modules/search/Bundle.properties --- a/api.search/src/org/netbeans/modules/search/Bundle.properties +++ b/api.search/src/org/netbeans/modules/search/Bundle.properties @@ -210,15 +210,18 @@ BasicSearchForm.lblTextToFind.text=Containing &Text\: -BasicSearchForm.cboxTextToFind.tooltip=(* \= any string, ? \= any character, \\ \= escape for * ?) +BasicSearchForm.cboxTextToFind.info=(* \= any string, ? \= any character, \\ \= escape for * ?) +BasicSearchForm.cboxTextToFind.info.re=(Use java.util.regex.Pattern regular expression syntax) BasicSearchForm.lblReplacement.text=&Replace With\: -BasicSearchForm.lblScope.text=&Scope +BasicSearchForm.lblScope.text=&Scope: BasicSearchForm.lblFileNamePattern.text=File Name &Patterns\: -BasicSearchForm.cboxFileNamePattern.tooltip=(Example\: *.java, FZP??.jsp, web/**/main/*.?htm?) +BasicSearchForm.cboxFileNamePattern.example=(Example\: *.java, FZP??.jsp) +# {0} File path separator +BasicSearchForm.cboxFileNamePattern.example.re=(Example\: {0}test{0}.*{0}TestBug\\d+\\.java$) BasicSearchForm.cboxFileNamePattern.allFiles=(all files) @@ -244,7 +247,8 @@ BasicSearchForm.chkGenerated.text=Search in &Generated Sources -BasicSearchForm.chkFileNameRegex.text=Regular E&xpression +BasicSearchForm.chkFileNameRegex.text=File Path Regular E&xpression +BasicSearchForm.chkFileNameRegex.tooltip=Use regular expression for the file path BasicSearchForm.btnTestTextToFind.text=test diff --git a/api.search/src/org/netbeans/modules/search/PatternSandbox.java b/api.search/src/org/netbeans/modules/search/PatternSandbox.java --- a/api.search/src/org/netbeans/modules/search/PatternSandbox.java +++ b/api.search/src/org/netbeans/modules/search/PatternSandbox.java @@ -60,6 +60,7 @@ import org.netbeans.api.search.SearchHistory; import org.netbeans.api.search.SearchPattern; import org.netbeans.modules.search.ui.FormLayoutHelper; +import org.netbeans.modules.search.ui.UiUtils; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.awt.Mnemonics; @@ -788,8 +789,7 @@ @Override protected String getHintLabelText() { - return getText( - "BasicSearchForm.cboxFileNamePattern.tooltip"); //NOI18N + return UiUtils.getFileNamePatternsExample(pathRegexp); } } @@ -801,7 +801,8 @@ @Override public void itemStateChanged(ItemEvent e) { - lblHint.setVisible(e.getStateChange() == ItemEvent.DESELECTED); + lblHint.setText(UiUtils.getFileNamePatternsExample( + e.getStateChange() == ItemEvent.SELECTED)); } } diff --git a/api.search/src/org/netbeans/modules/search/ui/UiUtils.java b/api.search/src/org/netbeans/modules/search/ui/UiUtils.java --- a/api.search/src/org/netbeans/modules/search/ui/UiUtils.java +++ b/api.search/src/org/netbeans/modules/search/ui/UiUtils.java @@ -47,13 +47,12 @@ import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.CharConversionException; +import java.io.File; import java.io.IOException; import javax.swing.AbstractButton; import javax.swing.JLabel; import javax.swing.UIManager; -import org.netbeans.modules.search.BasicSearchCriteria; import org.netbeans.modules.search.BasicSearchProvider; -import org.netbeans.spi.search.SearchScopeDefinition; import org.openide.awt.Mnemonics; import org.openide.util.NbBundle; import org.openide.xml.XMLUtil; @@ -139,4 +138,24 @@ } } } + + /** + * Get an example of file name patterns. + * + * @param regexp True to get example or regular expression pattern, false to + * get example of standard pattern. + */ + public static String getFileNamePatternsExample(boolean regexp) { + if (regexp) { + String separator = ("\\".equals(File.separator)) //NOI18N + ? "\\\\" //NOI18N + : File.separator; + return NbBundle.getMessage(BasicSearchProvider.class, + "BasicSearchForm.cboxFileNamePattern.example.re", //NOI18N + separator); + } else { + return NbBundle.getMessage(BasicSearchProvider.class, + "BasicSearchForm.cboxFileNamePattern.example"); //NOI18N + } + } }