Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 2010 Oracle and/or its affiliates. All rights reserved.
   *
   * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.
   *
   * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Oracle in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  *
  * Contributor(s):
  *
  * Portions Copyrighted 2009 Sun Microsystems, Inc.
  */
 
 package org.netbeans.modules.bugtracking.ui.search;
 
 import java.awt.Color;

Author(s):
Jan Stola
 
 public class FindSupport {
     private static final String FIND_NEXT_ACTION = "find-next"// NOI18N
     private static final String FIND_PREVIOUS_ACTION = "find-previous"// NOI18N
     private TopComponent tc;
     private FindBar bar;
     // Highlighters
     // Current search details
     private Pattern pattern;
     private JTextComponent currentComp;
     private int currentStart;
     private int currentEnd;
 
     private FindSupport(TopComponent tc) {
         this. = tc;
          = new FindBar(this);
         ActionMap actionMap = tc.getActionMap();
         CallbackSystemAction a = SystemAction.get(org.openide.actions.FindAction.class);
         actionMap.put(a.getActionMapKey(), new FindAction(true));
         actionMap.put(new FindAction(true));
         actionMap.put(new FindAction(false));
         // Hack ensuring the same shortcuts as editor
        JEditorPane pane = new JEditorPane();
        for (Action action : pane.getEditorKitForContentType("text/x-java").getActions()) { // NOI18N
            Object name = action.getValue(.);
            if (.equals(name) || .equals(name)) {
                reuseShortcut(action);
            }
        }
        // PENDING the colors below should not be hardcoded
         = new DefaultHighlighter.DefaultHighlightPainter(new Color(255,180,66));
         = new DefaultHighlighter.DefaultHighlightPainter(new Color(176,197,227));
         = Pattern.compile("$^"); // NOI18N
    }
    private void reuseShortcut(Action action) {
        Object key = action.getValue(.);
        if (key instanceof KeyStroke) {
            inputMap.put((KeyStroke)keyaction.getValue(.));
        }
    }
    public static FindSupport create(TopComponent tc) {
        return new FindSupport(tc);
    }
    public JComponent getFindBar() {
        return ;
    }
    void reset() {
        highlight(true);
         = null;
    }
    void updatePattern() {
        reset();
        String p = .getPattern();
        if (!.getRegularExpression()) {
            p = Pattern.quote(p);
            if (.getWholeWords()) {
                p="\\b"+p+"\\b"// NOI18N
            }
        }
        int flags = .;
        if (!.getMatchCase()) {
            flags |= .;
        }
        try {
             = Pattern.compile(pflags);
        } catch (PatternSyntaxException psex) {
            String message = NbBundle.getMessage(FindSupport.class"FindBar.invalidExpression"); // NOI18N
            StatusDisplayer.getDefault().setStatusText(message.);
        }
        findNext();
        if (.getHighlightResults()) {
            highlight(false);
        }
    }
    void findNext() {
        boolean found = false;
        if ( != null) {
            highlight(true);
            found = findNext();
        }
        if (!found) {
             = null;
            findNext();
        }
        if ( != null && .getHighlightResults()) {
            highlight(false);
        }
    }
    private boolean findNext(Component comp) {
        if (comp == ) {
            return false;
        }
        if (comp instanceof JTextPane) {
            if ( == null ||  == comp) {
                JTextPane tcomp = (JTextPane)comp;
                String txt = tcomp.getText();
                Matcher matcher = .matcher(txt);
                int idx = (==null) ? 0 : ;
                if (matcher.find(idx)) {
                     = tcomp;
                     = matcher.start();
                     = matcher.end();
                    if ( == ) {
                         = null;
                    } else {
                        try {
                            Highlighter highlighter = tcomp.getHighlighter();
                            highlighter.addHighlight();
                            scrollToCurrent();
                        } catch (BadLocationException blex) {
                            ..log(.blex.getMessage(), blex);
                        }
                        return true;
                    }
                } else {
                     = null;
                }
            }
        } else if (comp instanceof Container) {
            Container cont = (Container)comp;
            for (Component subComp : cont.getComponents()) {
                if (findNext(subComp)) {
                    return true;
                }
            }
        }
        return false;
    }
    private void scrollToCurrent() {
        try {
            Rectangle r1 = .modelToView();
            Rectangle r2 = .modelToView();
            Rectangle r = r1.union(r2);
            .scrollRectToVisible(r);
        } catch (BadLocationException blex) {
            ..log(.blex.getMessage(), blex);
        }
    }
    void findPrevious() {
        boolean found = false;
        if ( != null) {
            highlight(true);
            found = findPrevious();
        }
        if (!found) {
             = null;
            findPrevious();
        }
        if ( != null && .getHighlightResults()) {
            highlight(false);
        }
    }
    private boolean findPrevious(Component comp) {
        if (comp == ) {
            return false;
        }
        if (comp instanceof JTextPane) {
            if ( == null ||  == comp) {
                JTextPane tcomp = (JTextPane)comp;
                String txt = tcomp.getText();
                Matcher matcher = .matcher(txt);
                Highlighter highlighter = tcomp.getHighlighter();
                int lastStart = -1;
                int lastEnd = -1;
                while (true) {
                    boolean found = matcher.find((lastEnd==-1) ? 0 : lastEnd);
                    if (found && (( == null) || (matcher.end()<=))) {
                        lastStart = matcher.start();
                        lastEnd = matcher.end();
                        if (lastStart == lastEnd) {
                            break;
                        }
                    } else {
                        break;
                    }
                }
                if (lastEnd == -1 || lastStart == lastEnd) {
                     = null;
                } else {
                     = tcomp;
                     = lastStart;
                     = lastEnd;
                    try {
                        highlighter.addHighlight();
                        scrollToCurrent();
                    } catch (BadLocationException blex) {
                        ..log(.blex.getMessage(), blex);
                    }
                    return true;
                }
            }
        } else if (comp instanceof Container) {
            Container cont = (Container)comp;
            Component[] comps = cont.getComponents();
            for (int i=comps.length-1; i>=0; i--) {
                if (findPrevious(comps[i])) {
                    return true;
                }
            }
        }
        return false;
    }
    void cancel() {
        if ( != null) {
            .requestFocus();
        }
        reset();
        .setVisible(false);
    }
    void switchHighlight(boolean on) {
        if (!on) {
            highlight(true);
        }
        if ( != null) {
            try {
            } catch (BadLocationException blex) {
                ..log(.blex.getMessage(), blex);
            }
        }
        if (on) {
            highlight(false);
        }
    }
    private void highlight(Component compboolean cancel) {
        if (comp == ) {
            return;
        }
        if (comp instanceof JTextPane) {
            JTextPane tcomp = (JTextPane)comp;
            String txt = tcomp.getText();
            Matcher matcher = .matcher(txt);
            Highlighter highlighter = tcomp.getHighlighter();
            if (cancel) {
                highlighter.removeAllHighlights();
            } else {
                int idx = 0;
                while (matcher.find(idx)) {
                    int start = matcher.start();
                    int end = matcher.end();
                    if (start == end) {
                        break;
                    }
                    try {
                        highlighter.addHighlight(startend);
                    } catch (BadLocationException blex) {
                        ..log(.blex.getMessage(), blex);
                    }
                    idx = matcher.end();
                }
            }
        } else if (comp instanceof Container) {
            Container cont = (Container)comp;
            for (Component subComp : cont.getComponents()) {
                highlight(subCompcancel);
            }
        }
    }
    private class FindAction extends AbstractAction {
        private boolean forward;
        FindAction(boolean forward) {
            this. = forward;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            if (.isVisible()) {
                if () {
                    findNext();
                } else {
                    findPrevious();
                }
            } else {
                .setVisible(true);
                updatePattern();
            }
            .requestFocusInWindow();
        }
    }
New to GrepCode? Check out our FAQ X