5c457f6238f8b48f8fe6264a16659a5f070bda30
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / SelectBlockAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.scinotes.actions;
14
15 import java.beans.PropertyChangeEvent;
16 import java.beans.PropertyChangeListener;
17
18 import javax.swing.JMenuItem;
19 import javax.swing.KeyStroke;
20
21 import org.scilab.modules.gui.menuitem.MenuItem;
22 import org.scilab.modules.scinotes.KeywordEvent;
23 import org.scilab.modules.scinotes.MatchingBlockScanner;
24 import org.scilab.modules.scinotes.SciNotes;
25 import org.scilab.modules.scinotes.ScilabEditorPane;
26 import org.scilab.modules.scinotes.ScilabLexerConstants;
27
28 /**
29  * Class to handle the block selection
30  * @author Calixte DENIZET
31  */
32 public class SelectBlockAction extends DefaultAction {
33
34     protected boolean isPopup;
35
36     /**
37      * Constructor
38      * @param name the name of the action
39      * @param editor SciNotes
40      */
41     public SelectBlockAction(String name, SciNotes editor) {
42         super(name, editor);
43     }
44
45     /**
46      * doAction
47      */
48     public void doAction() {
49         ScilabEditorPane sep = getEditor().getTextPane();
50         MatchingBlockScanner scanner = sep.getMatchingBlockManager(true).getScanner();
51         KeywordEvent event = sep.getKeywordEvent(!isPopup, false);
52         int tok = event.getType();
53         int pos;
54         MatchingBlockScanner.MatchingPositions mpos = null;
55         if (ScilabLexerConstants.isMatchable(tok)) {
56             pos = event.getStart();
57             mpos = scanner.getMatchingBlock(pos, true);
58             if (mpos != null) {
59                 sep.setSelectionStart(mpos.firstB);
60                 sep.setSelectionEnd(mpos.secondE);
61             }
62         }
63
64         if (mpos == null) {
65             scanner = sep.getMatchingBlockManager(false).getScanner();
66             event = sep.getKeywordEvent(!isPopup, true);
67             tok = event.getType();
68             if (ScilabLexerConstants.isMatchable(tok)) {
69                 pos = event.getStart() + event.getLength();
70                 mpos = scanner.getMatchingBlock(pos, false);
71                 if (mpos != null) {
72                     sep.setSelectionStart(mpos.secondB);
73                     sep.setSelectionEnd(mpos.firstE);
74                 }
75             }
76         }
77     }
78
79     /**
80      * createMenu
81      * @param label label of the menu
82      * @param editor SciNotes
83      * @param key KeyStroke
84      * @return MenuItem
85      */
86     public static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key) {
87         return createMenu(label, editor, key, new SelectBlockAction(label, editor));
88     }
89
90     /**
91      * createMenu
92      * @param label label of the menu
93      * @param editor SciNotes
94      * @param key KeyStroke
95      * @param sba the SelectBlock action
96      * @return MenuItem
97      */
98     protected static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key, final SelectBlockAction sba) {
99         final MenuItem menuitem = createMenu(label, null, sba, key);
100         ((JMenuItem) menuitem.getAsSimpleMenuItem()).addPropertyChangeListener(new PropertyChangeListener() {
101                 public void propertyChange(PropertyChangeEvent e) {
102                     if (editor.getTextPane() != null) {
103                         ScilabEditorPane sep = editor.getTextPane();
104                         boolean block = ScilabLexerConstants.isMatchable(sep.getKeywordEvent(!sba.isPopup, false).getType());
105                         block = block || ScilabLexerConstants.isMatchable(sep.getKeywordEvent(!sba.isPopup, true).getType());
106                         menuitem.setEnabled(block);
107                     }
108                 }
109             });
110
111         return menuitem;
112     }
113 }