Bug 9884 fixed: Add in prefs the possibility to add a default header on new files...
[scilab.git] / scilab / modules / preferences / src / java / org / scilab / modules / preferences / Component / TextArea.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - 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.preferences.Component;
14
15 import java.awt.Color;
16 import java.awt.event.ActionEvent;
17 import java.awt.event.ActionListener;
18 import java.util.regex.Pattern;
19
20 import javax.swing.BorderFactory;
21 import javax.swing.JScrollBar;
22 import javax.swing.JScrollPane;
23 import javax.swing.JTextArea;
24 import javax.swing.ScrollPaneConstants;
25 import javax.swing.event.DocumentEvent;
26 import javax.swing.event.DocumentListener;
27
28 import org.scilab.modules.preferences.XChooser;
29 import org.scilab.modules.preferences.XCommonManager;
30 import org.scilab.modules.preferences.XComponent;
31 import org.scilab.modules.preferences.XConfigManager;
32
33 import org.w3c.dom.Node;
34
35 /**
36  * Implementation of a TextArea.
37  *
38  * @author Calixte DENIZET
39  *
40  */
41 public class TextArea extends Panel implements XComponent, XChooser, DocumentListener {
42
43     /** Universal identifier for serialization.
44      *
45      */
46     private static final long serialVersionUID = -7007541669965737408L;
47
48     private JTextArea textarea;
49     private JScrollPane scrollPane;
50     private ActionListener actionListener;
51
52     /** Define the set of actuators.
53      *
54      * @return array of actuator names.
55      */
56     public final String [] actuators() {
57         String [] actuators = {"enable", "text", "columns", "rows", "editable", "scroll"};
58         return actuators;
59     }
60
61     /** Constructor.
62      *
63      * @param peer : associated view DOM node.
64      */
65     public TextArea(final Node peer) {
66         super(peer);
67         textarea = new JTextArea();
68         textarea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
69         scrollPane = new JScrollPane(textarea);
70         add(scrollPane);
71         textarea.setFocusable(true);
72         textarea.setColumns(10);
73         refresh(peer);
74     }
75
76     /** Refresh the component by the use of actuators.
77      *
78      * @param peer the corresponding view DOM node
79      */
80     public final void refresh(final Node peer) {
81         String text = XCommonManager.getAttribute(peer, "text");
82         String columns = XCommonManager.getAttribute(peer, "columns");
83         String rows = XCommonManager.getAttribute(peer, "rows");
84         String editable = XCommonManager.getAttribute(peer, "editable");
85         String scroll = XCommonManager.getAttribute(peer, "scroll");
86
87         if (!text.equals(text())) {
88             text(text);
89         }
90
91         if (!columns.equals(columns())) {
92             columns(columns);
93         }
94
95         if (!rows.equals(rows())) {
96             rows(rows);
97         }
98
99         if (!editable.equals(editable())) {
100             editable(editable);
101         }
102
103         if (!scroll.equals(scroll())) {
104             scroll(scroll);
105         }
106
107         boolean enable = XConfigManager.getBoolean(peer, "enable", true);
108         textarea.setEnabled(enable);
109         JScrollBar bar = scrollPane.getVerticalScrollBar();
110         if (bar != null) {
111             bar.setEnabled(enable);
112         }
113
114         bar = scrollPane.getHorizontalScrollBar();
115         if (bar != null) {
116             bar.setEnabled(enable);
117         }
118     }
119
120     /**
121      * {@inheritDoc}
122      */
123     public void changedUpdate(DocumentEvent e) { }
124
125     /**
126      * {@inheritDoc}
127      */
128     public void insertUpdate(DocumentEvent e) {
129         update();
130     }
131
132     /**
133      * {@inheritDoc}
134      */
135     public void removeUpdate(DocumentEvent e) {
136         update();
137     }
138
139     private void update() {
140         if (actionListener != null) {
141             ActionEvent transmit = new ActionEvent(this, 0, "TextArea change", System.currentTimeMillis(), 0);
142             actionListener.actionPerformed(transmit);
143         }
144     }
145
146     /** Sensor for 'text' attribute.
147      *
148      * @return the attribute value.
149      */
150     public final String text() {
151         return textarea.getText();
152     }
153
154     /** Actuator for 'text' attribute.
155      *
156      * @param text : the attribute value.
157      */
158     public final void columns(final String columns) {
159         if (!columns.equals(XCommonManager.NAV)) {
160             int jColumns = Integer.parseInt(columns);
161             textarea.setColumns(jColumns);
162         }
163     }
164
165     /** Sensor for 'columns' attribute.
166      *
167      * @return the attribute value.
168      */
169     public final String columns() {
170         return Integer.toString(textarea.getColumns());
171     }
172
173     /** Actuator for 'text' attribute.
174      *
175      * @param text : the attribute value.
176      */
177     public final void rows(final String rows) {
178         if (!rows.equals(XCommonManager.NAV)) {
179             int jRows = Integer.parseInt(rows);
180             textarea.setRows(jRows);
181         }
182     }
183
184     /** Sensor for 'columns' attribute.
185      *
186      * @return the attribute value.
187      */
188     public final String rows() {
189         return Integer.toString(textarea.getRows());
190     }
191
192     /** Actuator for 'text' attribute.
193      *
194      * @param text : the attribute value.
195      */
196     public final void editable(final String editable) {
197         textarea.setEditable(editable.equalsIgnoreCase("true"));
198     }
199
200     /** Sensor for 'columns' attribute.
201      *
202      * @return the attribute value.
203      */
204     public final String editable() {
205         return Boolean.toString(textarea.isEditable());
206     }
207
208     /** Actuator for 'text' attribute.
209      *
210      * @param text : the attribute value.
211      */
212     public final void scroll(final String scroll) {
213         scrollPane.setVerticalScrollBarPolicy(scroll.equalsIgnoreCase("true") ? ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED : ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
214         scrollPane.setHorizontalScrollBarPolicy(scroll.equalsIgnoreCase("true") ? ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED : ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
215     }
216
217     /** Sensor for 'columns' attribute.
218      *
219      * @return the attribute value.
220      */
221     public final String scroll() {
222         return Boolean.toString(scrollPane.getVerticalScrollBarPolicy() == ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
223     }
224
225     /** Actuator for 'text' attribute.
226      *
227      * @param text : the attribute value.
228      */
229     public final void text(final String text) {
230         textarea.setText(text);
231     }
232
233     public void addActionListener(ActionListener actionListener) {
234         this.actionListener = actionListener;
235     }
236
237     public void addDocumentListener(DocumentListener listener) {
238         textarea.getDocument().addDocumentListener(listener);
239     }
240
241     /** Actual response read by the listener.
242      *
243      * @return response read by the listener.
244      */
245     public final Object choose() {
246         return text();
247     }
248
249     /** Developer serialization method.
250      *
251      * @return equivalent signature.
252      */
253     public final String toString() {
254         String signature = "TextArea";
255         if (!text().equals(XCommonManager.NAV)) {
256             signature += " text='" + text() + "'";
257         }
258         return signature;
259     }
260 }