8b1467933641cc53030e214012370534a6d361db
[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.KeyStroke;
17 import javax.swing.text.BadLocationException;
18
19 import org.scilab.modules.gui.menuitem.MenuItem;
20 import org.scilab.modules.scinotes.SciNotes;
21 import org.scilab.modules.scinotes.ScilabDocument;
22 import org.scilab.modules.scinotes.SearchManager;
23
24 /**
25  *
26  * @author Antoine ELIAS
27  *
28  */
29 public final class FindPreviousAction extends DefaultAction {
30
31     private static final long serialVersionUID = -9017015781643180532L;
32
33     /**
34      * Constructor
35      * @param name the name of the action
36      * @param editor SciNotes
37      */
38     public FindPreviousAction(String name, SciNotes editor) {
39         super(name, editor);
40     }
41
42     /**
43      * DoAction
44      */
45     public void doAction() {
46         try {
47             ScilabDocument doc = (ScilabDocument) getEditor().getTextPane().getDocument();
48             int startPos = getEditor().getTextPane().getSelectionStart();
49             int endPos = getEditor().getTextPane().getSelectionEnd();
50             int startLine = doc.getDefaultRootElement().getElementIndex(startPos);
51             int endLine = doc.getDefaultRootElement().getElementIndex(endPos);
52
53             //don't manage multiple lines quick find
54             if (startLine != endLine) {
55                 return;
56             }
57
58             String exp = null;
59             if (startPos == endPos) {
60                 //nothing to search
61                 if (FindAction.getPreviousSearch() == null) {
62                     return;
63                 } else {
64                     exp = FindAction.getPreviousSearch();
65                 }
66             } else {
67                 exp = doc.getText(startPos, endPos - startPos);
68             }
69
70             //search from current position to end document
71             List<Integer[]> offsets = SearchManager.findWord(doc, exp, 0, doc.getLength(), true, false, false);
72             if (offsets.size() != 0) {
73                 int index = -1;
74                 for (int i = 0; i < offsets.size(); i++) {
75                     if (offsets.get(i)[0] >= startPos) {
76                         index = i - 1;
77                         break;
78                     }
79                 }
80
81                 if (index == -1) {
82                     index = offsets.size() - 1;
83                 }
84
85                 getEditor().getTextPane().select(offsets.get(index)[0], offsets.get(index)[1]);
86             }
87         } catch (BadLocationException e) {
88             // TODO Auto-generated catch block
89             e.printStackTrace();
90         }
91     }
92
93     /**
94      * createMenu
95      * @param label label of the menu
96      * @param editor SciNotes
97      * @param key KeyStroke
98      * @return MenuItem
99      */
100     public static MenuItem createMenu(String label, SciNotes editor, KeyStroke key) {
101         return createMenu(label, null, new FindPreviousAction(label, editor), key);
102     }
103 }