6f7c18be763dfbd70c55e9833cef72ea92cb8816
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / FindPreviousAction.java
1 /* Scilab (http://www.scilab.org/) - This file is part of Scilab
2  * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
3  *
4  * This file must be used under the terms of the CeCILL.
5  * This source file is licensed as described in the file COPYING, which
6  * you should have received as part of this distribution.  The terms
7  * are also available at
8  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9  *
10  */
11
12 package org.scilab.modules.scinotes.actions;
13
14 import java.util.List;
15
16 import javax.swing.JComponent;
17 import javax.swing.KeyStroke;
18 import javax.swing.text.BadLocationException;
19
20 import org.scilab.modules.gui.menuitem.MenuItem;
21 import org.scilab.modules.scinotes.SciNotes;
22 import org.scilab.modules.scinotes.ScilabDocument;
23 import javax.swing.JEditorPane;
24 import org.scilab.modules.scinotes.SearchManager;
25 import org.scilab.modules.scinotes.utils.SciNotesMessages;
26
27 /**
28  *
29  * @author Antoine ELIAS
30  *
31  */
32 public final class FindPreviousAction extends DefaultAction {
33
34     private static final long serialVersionUID = -9017015781643180532L;
35
36     /**
37      * Constructor
38      * @param editor SciNotes
39      */
40     protected FindPreviousAction(SciNotes editor) {
41         super(SciNotesMessages.FIND_NEXT, editor);
42     }
43
44     /**
45      * DoAction
46      */
47     public void doAction() {
48         try {
49             int startPos = getEditor().getTextPane().getSelectionStart();
50             int endPos = getEditor().getTextPane().getSelectionEnd();
51             int startLine = ((ScilabDocument) getEditor().getTextPane().getDocument()).getDefaultRootElement().getElementIndex(startPos);
52             int endLine = ((ScilabDocument) getEditor().getTextPane().getDocument()).getDefaultRootElement().getElementIndex(endPos);
53
54             //don't manage multiple lines quick find
55             if (startLine != endLine) {
56                 return;
57             }
58
59             String exp = null;
60             if (startPos == endPos) {
61                 //nothing to search
62                 if (FindAction.getPreviousSearch() == null) {
63                     return;
64                 } else {
65                     exp = FindAction.getPreviousSearch();
66                 }
67             } else {
68                 exp = getEditor().getTextPane().getDocument().getText(startPos, endPos - startPos);
69             }
70
71             JEditorPane scinotesTextPane =  getEditor().getTextPane();
72             ScilabDocument scilabStyle = ((ScilabDocument) scinotesTextPane.getDocument());
73
74             //search from current position to end document
75             List<Integer[]> offsets = SearchManager.findWord(scilabStyle, exp, 0, scilabStyle.getLength(), false, false, false);
76             if (offsets.size() != 0) {
77                 int index = -1;
78                 for (int i = 0; i < offsets.size(); i++) {
79                     if (offsets.get(i)[0] >= startPos) {
80                         index = i - 1;
81                         break;
82                     }
83                 }
84
85                 if (index == -1) {
86                     index = offsets.size() - 1;
87                 }
88
89                 getEditor().getTextPane().select(offsets.get(index)[0], offsets.get(index)[1]);
90             }
91         } catch (BadLocationException e) {
92             // TODO Auto-generated catch block
93             e.printStackTrace();
94         }
95     }
96
97     /**
98      * createMenu
99      * @param editor SciNotes
100      * @param key KeyStroke
101      * @return MenuItem
102      */
103     public static MenuItem createMenu(SciNotes editor, KeyStroke key) {
104         return createMenu(SciNotesMessages.FIND_PREVIOUS, null, new FindPreviousAction(editor), key);
105     }
106
107     /**
108      * Put input map
109      * @param textPane JTextpane
110      * @param editor Editor
111      * @param key KeyStroke
112      */
113     public static void putInInputMap(JComponent textPane, SciNotes editor, KeyStroke key) {
114         textPane.getInputMap().put(key, new FindPreviousAction(editor));
115     }
116 }