Refactorization of the management of the actions in menus, button, shortcuts
[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             int startPos = getEditor().getTextPane().getSelectionStart();
48             int endPos = getEditor().getTextPane().getSelectionEnd();
49             int startLine = ((ScilabDocument) getEditor().getTextPane().getDocument()).getDefaultRootElement().getElementIndex(startPos);
50             int endLine = ((ScilabDocument) getEditor().getTextPane().getDocument()).getDefaultRootElement().getElementIndex(endPos);
51
52             //don't manage multiple lines quick find
53             if (startLine != endLine) {
54                 return;
55             }
56
57             String exp = null;
58             if (startPos == endPos) {
59                 //nothing to search
60                 if (FindAction.getPreviousSearch() == null) {
61                     return;
62                 } else {
63                     exp = FindAction.getPreviousSearch();
64                 }
65             } else {
66                 exp = getEditor().getTextPane().getDocument().getText(startPos, endPos - startPos);
67             }
68
69             ScilabDocument scilabStyle = (ScilabDocument) getEditor().getTextPane().getDocument();
70
71             //search from current position to end document
72             List<Integer[]> offsets = SearchManager.findWord(scilabStyle, exp, 0, scilabStyle.getLength(), false, false, false);
73             if (offsets.size() != 0) {
74                 int index = -1;
75                 for (int i = 0; i < offsets.size(); i++) {
76                     if (offsets.get(i)[0] >= startPos) {
77                         index = i - 1;
78                         break;
79                     }
80                 }
81
82                 if (index == -1) {
83                     index = offsets.size() - 1;
84                 }
85
86                 getEditor().getTextPane().select(offsets.get(index)[0], offsets.get(index)[1]);
87             }
88         } catch (BadLocationException e) {
89             // TODO Auto-generated catch block
90             e.printStackTrace();
91         }
92     }
93
94     /**
95      * createMenu
96      * @param label label of the menu
97      * @param editor SciNotes
98      * @param key KeyStroke
99      * @return MenuItem
100      */
101     public static MenuItem createMenu(String label, SciNotes editor, KeyStroke key) {
102         return createMenu(label, null, new FindPreviousAction(label, editor), key);
103     }
104 }