Revision 196

View differences:

org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/buildNumber.properties
1
#Mon Jun 06 01:58:03 CEST 2016
2
buildNumber=2112
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/assembly/gvsig-plugin-package.xml
1
<!--
2

  
3
    gvSIG. Desktop Geographic Information System.
4

  
5
    Copyright (C) 2007-2013 gvSIG Association.
6

  
7
    This program is free software; you can redistribute it and/or
8
    modify it under the terms of the GNU General Public License
9
    as published by the Free Software Foundation; either version 3
10
    of the License, or (at your option) any later version.
11

  
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16

  
17
    You should have received a copy of the GNU General Public License
18
    along with this program; if not, write to the Free Software
19
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
    MA  02110-1301, USA.
21

  
22
    For any additional information, do not hesitate to contact us
23
    at info AT gvsig.com, or visit our website www.gvsig.com.
24

  
25
-->
26
<assembly>
27
  <id>gvsig-plugin-package</id>
28
  <formats>
29
    <format>zip</format>
30
  </formats>
31
  <baseDirectory>${project.artifactId}</baseDirectory>
32
  <includeBaseDirectory>true</includeBaseDirectory>
33
  <files>
34
    <file>
35
      <source>target/${project.artifactId}-${project.version}.jar</source>
36
      <outputDirectory>lib</outputDirectory>
37
    </file>
38
    <file>
39
      <source>target/package.info</source>
40
    </file>
41
  </files>
42

  
43
  <fileSets>
44
    <fileSet>
45
      <directory>src/main/resources-plugin</directory>
46
      <outputDirectory>.</outputDirectory>
47
    </fileSet>
48
  </fileSets>
49

  
50
  <dependencySets>
51
    <dependencySet>
52
      <useProjectArtifact>false</useProjectArtifact>
53
      <useTransitiveDependencies>false</useTransitiveDependencies>
54
      <outputDirectory>lib</outputDirectory>
55
      <includes>
56
        <include>bsf:bsf</include>
57
        <include>org.python:jython</include>
58
        <include>com.fifesoft:rsyntaxtextarea</include>
59
      </includes>
60
    </dependencySet>
61
  </dependencySets>
62

  
63
</assembly>
64

  
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/AboutExpressionFieldExtension.java
1
/*******************************************************************************
2
 *
3
 *   gvSIG. Desktop Geographic Information System.
4
 *  
5
 *   Copyright (C) 2007-2013 gvSIG Association.
6
 *  
7
 *   This program is free software; you can redistribute it and/or
8
 *   modify it under the terms of the GNU General Public License
9
 *   as published by the Free Software Foundation; either version 3
10
 *   of the License, or (at your option) any later version.
11
 *  
12
 *   This program is distributed in the hope that it will be useful,
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *   GNU General Public License for more details.
16
 *  
17
 *   You should have received a copy of the GNU General Public License
18
 *   along with this program; if not, write to the Free Software
19
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
 *   MA  02110-1301, USA.
21
 *  
22
 *   For any additional information, do not hesitate to contact us
23
 *   at info AT gvsig.com, or visit our website www.gvsig.com.
24
 *   
25
 *******************************************************************************/
26
package org.gvsig.expressionfield;
27

  
28
import org.gvsig.about.AboutManager;
29
import org.gvsig.about.AboutParticipant;
30
import org.gvsig.andami.plugins.Extension;
31
import org.gvsig.app.ApplicationLocator;
32
import org.gvsig.app.ApplicationManager;
33

  
34

  
35
/**
36
 * About extension.
37
 *
38
 * Add the about coments to the gvSIG About panel
39
 */
40

  
41
public class AboutExpressionFieldExtension extends Extension {
42

  
43
	public void initialize() {
44
		// TODO Auto-generated method stub
45

  
46
	}
47

  
48
	public void postInitialize() {
49
		ApplicationManager application = ApplicationLocator.getManager();
50
		
51
		AboutManager about = application.getAbout();
52

  
53
		about.addDeveloper(
54
				"IVER",
55
				this.getClass().getClassLoader().getResource("iver.html"),
56
				1
57
		);
58
		
59
		AboutParticipant participant = about.getDeveloper("IVER");
60
		participant.addContribution(
61
			"Expression field",
62
			"Extesi?n para el c?lculo de una expresi?n sobre una columna de la tabla.", 
63
			2007,1,1, 
64
			2007,12,31
65
		);
66
	}
67

  
68
	public void execute(String actionCommand) {
69

  
70
	}
71

  
72
	public boolean isEnabled() {
73
		return false;
74
	}
75

  
76
	public boolean isVisible() {
77
		return false;
78
	}
79

  
80
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/ExpressionFieldExtension.java
1
/**
2
 * *****************************************************************************
3
 *
4
 * gvSIG. Desktop Geographic Information System.
5
 *
6
 * Copyright (C) 2007-2013 gvSIG Association.
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 3
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21
 * MA 02110-1301, USA.
22
 *
23
 * For any additional information, do not hesitate to contact us
24
 * at info AT gvsig.com, or visit our website www.gvsig.com.
25
 *
26
 ******************************************************************************
27
 */
28
package org.gvsig.expressionfield;
29

  
30
import java.awt.Component;
31
import java.util.ArrayList;
32
import java.util.Iterator;
33

  
34
import javax.swing.JOptionPane;
35

  
36
import org.apache.bsf.BSFManager;
37

  
38
import org.gvsig.andami.IconThemeHelper;
39
import org.gvsig.andami.PluginServices;
40
import org.gvsig.andami.messages.NotificationManager;
41
import org.gvsig.andami.plugins.Extension;
42
import org.gvsig.app.project.documents.table.gui.FeatureTableDocumentPanel;
43
import org.gvsig.expressionfield.gui.FieldExpressionPage;
44
import org.gvsig.expressionfield.project.documents.table.IOperator;
45
import org.gvsig.expressionfield.project.documents.table.gui.EvalExpressionDialog;
46
import org.gvsig.expressionfield.project.documents.table.operators.Abs;
47
import org.gvsig.expressionfield.project.documents.table.operators.Acos;
48
import org.gvsig.expressionfield.project.documents.table.operators.After;
49
import org.gvsig.expressionfield.project.documents.table.operators.Area;
50
import org.gvsig.expressionfield.project.documents.table.operators.Asin;
51
import org.gvsig.expressionfield.project.documents.table.operators.Atan;
52
import org.gvsig.expressionfield.project.documents.table.operators.Before;
53
import org.gvsig.expressionfield.project.documents.table.operators.Ceil;
54
import org.gvsig.expressionfield.project.documents.table.operators.Cos;
55
import org.gvsig.expressionfield.project.documents.table.operators.DateToString;
56
import org.gvsig.expressionfield.project.documents.table.operators.Distinct;
57
import org.gvsig.expressionfield.project.documents.table.operators.Division;
58
import org.gvsig.expressionfield.project.documents.table.operators.E;
59
import org.gvsig.expressionfield.project.documents.table.operators.EndsWith;
60
import org.gvsig.expressionfield.project.documents.table.operators.Equal;
61
import org.gvsig.expressionfield.project.documents.table.operators.Equals;
62
import org.gvsig.expressionfield.project.documents.table.operators.Exp;
63
import org.gvsig.expressionfield.project.documents.table.operators.Floor;
64
import org.gvsig.expressionfield.project.documents.table.operators.Geometry;
65
import org.gvsig.expressionfield.project.documents.table.operators.GetTimeDate;
66
import org.gvsig.expressionfield.project.documents.table.operators.IndexOf;
67
import org.gvsig.expressionfield.project.documents.table.operators.IsNumber;
68
import org.gvsig.expressionfield.project.documents.table.operators.LastIndexOf;
69
import org.gvsig.expressionfield.project.documents.table.operators.Length;
70
import org.gvsig.expressionfield.project.documents.table.operators.LessEquals;
71
import org.gvsig.expressionfield.project.documents.table.operators.LessThan;
72
import org.gvsig.expressionfield.project.documents.table.operators.Log;
73
import org.gvsig.expressionfield.project.documents.table.operators.Max;
74
import org.gvsig.expressionfield.project.documents.table.operators.Min;
75
import org.gvsig.expressionfield.project.documents.table.operators.Minus;
76
import org.gvsig.expressionfield.project.documents.table.operators.MoreEquals;
77
import org.gvsig.expressionfield.project.documents.table.operators.MoreThan;
78
import org.gvsig.expressionfield.project.documents.table.operators.Perimeter;
79
import org.gvsig.expressionfield.project.documents.table.operators.Pi;
80
import org.gvsig.expressionfield.project.documents.table.operators.Plus;
81
import org.gvsig.expressionfield.project.documents.table.operators.PointX;
82
import org.gvsig.expressionfield.project.documents.table.operators.PointY;
83
import org.gvsig.expressionfield.project.documents.table.operators.Pow;
84
import org.gvsig.expressionfield.project.documents.table.operators.Random;
85
import org.gvsig.expressionfield.project.documents.table.operators.RecordIndex;
86
import org.gvsig.expressionfield.project.documents.table.operators.Replace;
87
import org.gvsig.expressionfield.project.documents.table.operators.Round;
88
import org.gvsig.expressionfield.project.documents.table.operators.SetTimeDate;
89
import org.gvsig.expressionfield.project.documents.table.operators.Sin;
90
import org.gvsig.expressionfield.project.documents.table.operators.Sqrt;
91
import org.gvsig.expressionfield.project.documents.table.operators.StartsWith;
92
import org.gvsig.expressionfield.project.documents.table.operators.SubString;
93
import org.gvsig.expressionfield.project.documents.table.operators.Tan;
94
import org.gvsig.expressionfield.project.documents.table.operators.Times;
95
import org.gvsig.expressionfield.project.documents.table.operators.ToDate;
96
import org.gvsig.expressionfield.project.documents.table.operators.ToDegrees;
97
import org.gvsig.expressionfield.project.documents.table.operators.ToLowerCase;
98
import org.gvsig.expressionfield.project.documents.table.operators.ToNumber;
99
import org.gvsig.expressionfield.project.documents.table.operators.ToRadians;
100
import org.gvsig.expressionfield.project.documents.table.operators.ToString;
101
import org.gvsig.expressionfield.project.documents.table.operators.ToUpperCase;
102
import org.gvsig.expressionfield.project.documents.table.operators.Trim;
103
import org.gvsig.fmap.dal.exception.DataException;
104
import org.gvsig.tools.ToolsLocator;
105
import org.gvsig.tools.extensionpoint.ExtensionPoint;
106
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
107
import org.gvsig.utils.swing.threads.AbstractMonitorableTask;
108

  
109
import org.slf4j.Logger;
110
import org.slf4j.LoggerFactory;
111

  
112
/**
113
 * @author Vicente Caballero Navarro
114
 */
115
public class ExpressionFieldExtension extends Extension {
116

  
117
    private static Logger logger = LoggerFactory.getLogger(ExpressionFieldExtension.class);
118

  
119
    public static final String JYTHON = "jython";
120
    private static BSFManager interpreter = new BSFManager();
121
    private FeatureTableDocumentPanel table = null;
122
    private static ArrayList<IOperator> operators = new ArrayList<IOperator>();
123

  
124
    public void initialize() {
125
        registerIcons();
126
        registerOperations();
127
    }
128

  
129
    public void execute(String actionCommand) {
130
        if ( "table-expression-field".equalsIgnoreCase(actionCommand) ) {
131
            org.gvsig.andami.ui.mdiManager.IWindow window = PluginServices.getMDIManager().getActiveWindow();
132
            table = (FeatureTableDocumentPanel) window;
133
            if ( !table.getModel().getStore().isEditing() ) {
134
                int option = JOptionPane.showConfirmDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "is_not_in_editing_are_you_sure"));
135
                if ( option != JOptionPane.OK_OPTION ) {
136
                    return;
137
                }
138
            }
139
            if ( operators.isEmpty() ) {
140
                PluginServices.cancelableBackgroundExecution(new EvalOperatorsTask());
141
            } else {
142
                EvalExpressionDialog eed = new EvalExpressionDialog(table, interpreter, operators);
143
                PluginServices.getMDIManager().addWindow(eed);
144
            }
145
        }
146
    }
147

  
148
    public void postInitialize() {
149

  
150
    }
151

  
152
    public boolean isEnabled() {
153
        org.gvsig.andami.ui.mdiManager.IWindow window = PluginServices.getMDIManager().getActiveWindow();
154
        if ( window instanceof FeatureTableDocumentPanel ) {
155
            FeatureTableDocumentPanel table = (FeatureTableDocumentPanel) window;
156
            int columnSelected = 0;
157
            try {
158
                columnSelected = table.getTablePanel().getTable().getSelectedColumnCount();
159
            } catch (DataException e) {
160
                logger.error("Can't get selected column in table.", e);
161
            }
162
            if ( columnSelected > 0 && table.getModel().getStore().isEditing() ) {
163
                return true;
164
            }
165
        }
166
        return false;
167
    }
168

  
169
    public boolean isVisible() {
170

  
171
        org.gvsig.andami.ui.mdiManager.IWindow window = PluginServices.getMDIManager().getActiveWindow();
172
        if ( window instanceof FeatureTableDocumentPanel ) {
173
            return true;
174
        }
175
        return false;
176
    }
177

  
178
    private void registerOperations() {
179
        ExtensionPointManager extensionPointsManager =ToolsLocator.getExtensionPointManager();
180
        ExtensionPoint ep = extensionPointsManager.add("AplicationPreferences", "");
181
        ep.append("fieldExpression", "", new FieldExpressionPage());
182

  
183
        ExtensionPoint extensionPoints = ToolsLocator.getExtensionPointManager().add(
184
                "ColumnOperators", "");
185
        extensionPoints.append(Abs.class.toString(), "", Abs.class);
186
        extensionPoints.append(Acos.class.toString(), "", Acos.class);
187
        extensionPoints.append(After.class.toString(), "", After.class);
188
        extensionPoints.append(Area.class.toString(), "", Area.class);
189
        extensionPoints.append(Asin.class.toString(), "", Asin.class);
190
        extensionPoints.append(Atan.class.toString(), "", Atan.class);
191
        extensionPoints.append(Acos.class.toString(), "", Acos.class);
192
        extensionPoints.append(Before.class.toString(), "", Before.class);
193
        extensionPoints.append(Ceil.class.toString(), "", Ceil.class);
194
        extensionPoints.append(Cos.class.toString(), "", Cos.class);
195
        extensionPoints.append(DateToString.class.toString(), "", DateToString.class);
196
        extensionPoints.append(Distinct.class.toString(), "", Distinct.class);
197
        extensionPoints.append(Division.class.toString(), "", Division.class);
198
        extensionPoints.append(E.class.toString(), "", E.class);
199
        extensionPoints.append(EndsWith.class.toString(), "", EndsWith.class);
200
        extensionPoints.append(Equal.class.toString(), "", Equal.class);
201
        extensionPoints.append(Equals.class.toString(), "", Equals.class);
202
        extensionPoints.append(Exp.class.toString(), "", Exp.class);
203
        extensionPoints.append(Floor.class.toString(), "", Floor.class);
204
        extensionPoints.append(Geometry.class.toString(), "", Geometry.class);
205
        extensionPoints.append(GetTimeDate.class.toString(), "", GetTimeDate.class);
206
        extensionPoints.append(IndexOf.class.toString(), "", IndexOf.class);
207
        extensionPoints.append(IsNumber.class.toString(), "", IsNumber.class);
208
        extensionPoints.append(LastIndexOf.class.toString(), "", LastIndexOf.class);
209
        extensionPoints.append(Length.class.toString(), "", Length.class);
210
        extensionPoints.append(LessEquals.class.toString(), "", LessEquals.class);
211
        extensionPoints.append(LessThan.class.toString(), "", LessThan.class);
212
        extensionPoints.append(Log.class.toString(), "", Log.class);
213
        extensionPoints.append(Max.class.toString(), "", Max.class);
214
        extensionPoints.append(Min.class.toString(), "", Min.class);
215
        extensionPoints.append(Minus.class.toString(), "", Minus.class);
216
        extensionPoints.append(MoreEquals.class.toString(), "", MoreEquals.class);
217
        extensionPoints.append(MoreThan.class.toString(), "", MoreThan.class);
218
        extensionPoints.append(Perimeter.class.toString(), "", Perimeter.class);
219
        extensionPoints.append(Pi.class.toString(), "", Pi.class);
220
        extensionPoints.append(Plus.class.toString(), "", Plus.class);
221
        extensionPoints.append(PointX.class.toString(), "", PointX.class);
222
        extensionPoints.append(PointY.class.toString(), "", PointY.class);
223
        extensionPoints.append(Pow.class.toString(), "", Pow.class);
224
        extensionPoints.append(Random.class.toString(), "", Random.class);
225

  
226
        // Added November 2013
227
        extensionPoints.append(RecordIndex.class.toString(), "", RecordIndex.class);
228

  
229
        extensionPoints.append(Replace.class.toString(), "", Replace.class);
230
        extensionPoints.append(Round.class.toString(), "", Round.class);
231
        extensionPoints.append(SetTimeDate.class.toString(), "", SetTimeDate.class);
232
        extensionPoints.append(Sin.class.toString(), "", Sin.class);
233
        extensionPoints.append(Sqrt.class.toString(), "", Sqrt.class);
234
        extensionPoints.append(StartsWith.class.toString(), "", StartsWith.class);
235
        extensionPoints.append(SubString.class.toString(), "", SubString.class);
236
        extensionPoints.append(Tan.class.toString(), "", Tan.class);
237
        extensionPoints.append(Times.class.toString(), "", Times.class);
238
        extensionPoints.append(ToDate.class.toString(), "", ToDate.class);
239
        extensionPoints.append(ToDegrees.class.toString(), "", ToDegrees.class);
240
        extensionPoints.append(ToLowerCase.class.toString(), "", ToLowerCase.class);
241
        extensionPoints.append(ToNumber.class.toString(), "", ToNumber.class);
242
        extensionPoints.append(ToRadians.class.toString(), "", ToRadians.class);
243
        extensionPoints.append(ToString.class.toString(), "", ToString.class);
244
        extensionPoints.append(ToUpperCase.class.toString(), "", ToUpperCase.class);
245
        extensionPoints.append(Trim.class.toString(), "", Trim.class);
246
    }
247

  
248
    private void registerIcons() {
249
        IconThemeHelper.registerIcon("action", "table-expression-field", this);
250
        IconThemeHelper.registerIcon("preferences", "expression-field-preferences", this);
251
    }
252

  
253
    private class EvalOperatorsTask extends AbstractMonitorableTask {
254

  
255
        private ExtensionPoint extensionPoint;
256

  
257
        public EvalOperatorsTask() {
258
            setInitialStep(0);
259
            setDeterminatedProcess(true);
260
            setStatusMessage(PluginServices.getText(this, "charging_operators") + "...");
261
            this.extensionPoint = ToolsLocator.getExtensionPointManager().get(
262
                    "ColumnOperators");
263
            setFinalStep(extensionPoint.getCount() + 1);
264
        }
265

  
266
        public void run() throws Exception {
267
            NotificationManager.addInfo(PluginServices.getText(this, "charging_operators"));
268
            long t1 = System.currentTimeMillis();
269
            Iterator iterator = extensionPoint.iterator();
270
            while ( iterator.hasNext() ) {
271
                try {
272
                    if ( isCanceled() ) {
273
                        return;
274
                    }
275
                    org.gvsig.tools.extensionpoint.ExtensionPoint.Extension obj = (org.gvsig.tools.extensionpoint.ExtensionPoint.Extension) iterator.next();
276
                    IOperator operator = (IOperator) extensionPoint.create(obj.getName());
277

  
278
                    operator.eval(interpreter);
279
                    operators.add(operator);
280
                    reportStep();
281
                    setNote(operator.getClass().getName());
282
                } catch (InstantiationException e) {
283
                    e.printStackTrace();
284
                } catch (IllegalAccessException e) {
285
                    e.printStackTrace();
286
                } catch (ClassCastException e) {
287
                    e.printStackTrace();
288
                }
289
            }
290
            long t2 = System.currentTimeMillis();
291
            System.out.println("Tiempo en evaluar y crear del extension point = " + (t2 - t1));
292
            long t3 = System.currentTimeMillis();
293
            System.out.println("Tiempo en a?adir los operadores correctos = " + (t3 - t2));
294
            reportStep();
295
        }
296

  
297
        public void finished() {
298
            if ( isCanceled() ) {
299
                return;
300
            }
301
            NotificationManager.addInfo(PluginServices.getText(this, "charged_operators"));
302
            EvalExpressionDialog eed = new EvalExpressionDialog(table, interpreter, operators);
303
            PluginServices.getMDIManager().addWindow(eed);
304
        }
305

  
306
    }
307
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/gui/FieldExpressionPage.java
1
/*******************************************************************************
2
 *
3
 *   gvSIG. Desktop Geographic Information System.
4
 *  
5
 *   Copyright (C) 2007-2013 gvSIG Association.
6
 *  
7
 *   This program is free software; you can redistribute it and/or
8
 *   modify it under the terms of the GNU General Public License
9
 *   as published by the Free Software Foundation; either version 3
10
 *   of the License, or (at your option) any later version.
11
 *  
12
 *   This program is distributed in the hope that it will be useful,
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *   GNU General Public License for more details.
16
 *  
17
 *   You should have received a copy of the GNU General Public License
18
 *   along with this program; if not, write to the Free Software
19
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
 *   MA  02110-1301, USA.
21
 *  
22
 *   For any additional information, do not hesitate to contact us
23
 *   at info AT gvsig.com, or visit our website www.gvsig.com.
24
 *   
25
 *******************************************************************************/
26
package org.gvsig.expressionfield.gui;
27

  
28
import java.awt.event.MouseEvent;
29
import java.awt.event.MouseListener;
30
import java.util.prefs.Preferences;
31

  
32
import javax.swing.ImageIcon;
33
import javax.swing.JCheckBox;
34
import javax.swing.JPanel;
35
import javax.swing.JTextArea;
36
import javax.swing.JTextField;
37

  
38
import org.gvsig.andami.IconThemeHelper;
39
import org.gvsig.andami.PluginServices;
40
import org.gvsig.andami.preferences.AbstractPreferencePage;
41
import org.gvsig.andami.preferences.StoreException;
42

  
43

  
44
/**
45
 * @author Vicente Caballero Navarro
46
 */
47
public class FieldExpressionPage extends AbstractPreferencePage {
48
	private static Preferences prefs = Preferences.userRoot().node( "fieldExpressionOptions" );
49
	private JTextArea jTextArea = null;
50
	private JTextField txtLimit;
51
	private JCheckBox ckLimit=null;
52
	private ImageIcon icon;
53

  
54
	public FieldExpressionPage() {
55
		super();
56
		
57
		icon = IconThemeHelper.getImageIcon("expression-field-preferences");
58
		
59
		addComponent(getJTextArea());
60

  
61
		addComponent(PluginServices.getText(this, "limit_rows_in_memory") + ":",
62
			txtLimit = new JTextField("", 15));
63
		addComponent(ckLimit = new JCheckBox(PluginServices.getText(this, "without_limit")));
64
		ckLimit.addMouseListener(new MouseListener() {
65
			public void mouseClicked(MouseEvent e) {
66
				if (ckLimit.isSelected()) {
67
					txtLimit.setText(PluginServices.getText(this, "without_limit"));
68
				}else {
69
					if (txtLimit.getText().equals(PluginServices.getText(this, "without_limit")))
70
					txtLimit.setText("500000");
71
				}
72

  
73
			}
74
			public void mouseEntered(MouseEvent e) {
75
			}
76
			public void mouseExited(MouseEvent e) {
77
			}
78
			public void mousePressed(MouseEvent e) {
79
			}
80
			public void mouseReleased(MouseEvent e) {
81
			}
82

  
83
		});
84
	}
85

  
86
	public void initializeValues() {
87
		int limit = prefs.getInt("limit_rows_in_memory",-1);
88
		if (limit==-1) {
89
			ckLimit.setSelected(true);
90
			txtLimit.setText(PluginServices.getText(this,"without_limit"));
91
		}else {
92
			ckLimit.setSelected(false);
93
			txtLimit.setText(String.valueOf(limit));
94
		}
95
	}
96

  
97
	public String getID() {
98
		return this.getClass().getName();
99
	}
100

  
101
	public String getTitle() {
102
		return PluginServices.getText(this, "limit_rows_in_memory");
103
	}
104

  
105
	public JPanel getPanel() {
106
		return this;
107
	}
108

  
109
	public void storeValues() throws StoreException {
110
		int limit;
111
		try{
112
			if (ckLimit.isSelected()) {
113
				limit=-1;
114
			}else {
115
//			if (txtLimit.getText().equals(PluginServices.getText(this,"without_limit"))) {
116
//				limit=-1;
117
//			}else {
118
				limit=Integer.parseInt(txtLimit.getText());
119
			}
120
		}catch (Exception e) {
121
			throw new StoreException(PluginServices.getText(this,"limit_rows_in_memory")+PluginServices.getText(this,"error"));
122
		}
123
		prefs.putInt("limit_rows_in_memory", limit);
124
	}
125

  
126
	public void initializeDefaults() {
127
		int limit=prefs.getInt("limit_rows_in_memory",-1);
128
		if (limit==-1) {
129
			ckLimit.setSelected(true);
130
			txtLimit.setText(PluginServices.getText(this,"without_limit"));
131
		}else {
132
			ckLimit.setSelected(false);
133
			txtLimit.setText(String.valueOf(limit));
134
		}
135
	}
136

  
137
	public ImageIcon getIcon() {
138
		return icon;
139
	}
140
	/**
141
	 * This method initializes jTextArea
142
	 *
143
	 * @return javax.swing.JTextArea
144
	 */
145
	private JTextArea getJTextArea() {
146
		if (jTextArea == null) {
147
			jTextArea = new JTextArea();
148
			jTextArea.setBounds(new java.awt.Rectangle(13,7,285,57));
149
			jTextArea.setForeground(java.awt.Color.black);
150
			jTextArea.setBackground(java.awt.SystemColor.control);
151
			jTextArea.setRows(3);
152
			jTextArea.setWrapStyleWord(true);
153
			jTextArea.setLineWrap(true);
154
			jTextArea.setEditable(false);
155
			jTextArea.setText(PluginServices.getText(this,"specifies_the_limit_rows_in_memory_when_the_program_eval_the_expression"));
156
		}
157
		return jTextArea;
158
	}
159

  
160
	public boolean isValueChanged() {
161
		return super.hasChanged();
162
	}
163

  
164
	public void setChangesApplied() {
165
		setChanged(false);
166
	}
167
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/project/documents/table/FeatureIndex.java
1
/*******************************************************************************
2
 *
3
 *   gvSIG. Desktop Geographic Information System.
4
 *  
5
 *   Copyright (C) 2007-2013 gvSIG Association.
6
 *  
7
 *   This program is free software; you can redistribute it and/or
8
 *   modify it under the terms of the GNU General Public License
9
 *   as published by the Free Software Foundation; either version 3
10
 *   of the License, or (at your option) any later version.
11
 *  
12
 *   This program is distributed in the hope that it will be useful,
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *   GNU General Public License for more details.
16
 *  
17
 *   You should have received a copy of the GNU General Public License
18
 *   along with this program; if not, write to the Free Software
19
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
 *   MA  02110-1301, USA.
21
 *  
22
 *   For any additional information, do not hesitate to contact us
23
 *   at info AT gvsig.com, or visit our website www.gvsig.com.
24
 *   
25
 *******************************************************************************/
26
package org.gvsig.expressionfield.project.documents.table;
27

  
28
/**
29
 * Utility class to use in Jython bean
30
 * 
31
 * @author jldominguez
32
 * 
33
 */
34
public class FeatureIndex {
35

  
36
	private long index = -1;
37

  
38
	public void next() {
39
		index++;
40
	}
41

  
42
	public void previous() {
43
		index--;
44
	}
45

  
46
	public long get() {
47
		return index;
48
	}
49

  
50
	public void set(long i) {
51
		index = i;
52
	}
53
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/project/documents/table/IOperator.java
1
/*******************************************************************************
2
 *
3
 *   gvSIG. Desktop Geographic Information System.
4
 *  
5
 *   Copyright (C) 2007-2013 gvSIG Association.
6
 *  
7
 *   This program is free software; you can redistribute it and/or
8
 *   modify it under the terms of the GNU General Public License
9
 *   as published by the Free Software Foundation; either version 3
10
 *   of the License, or (at your option) any later version.
11
 *  
12
 *   This program is distributed in the hope that it will be useful,
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *   GNU General Public License for more details.
16
 *  
17
 *   You should have received a copy of the GNU General Public License
18
 *   along with this program; if not, write to the Free Software
19
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
 *   MA  02110-1301, USA.
21
 *  
22
 *   For any additional information, do not hesitate to contact us
23
 *   at info AT gvsig.com, or visit our website www.gvsig.com.
24
 *   
25
 *******************************************************************************/
26
package org.gvsig.expressionfield.project.documents.table;
27

  
28
import org.apache.bsf.BSFException;
29
import org.apache.bsf.BSFManager;
30

  
31
/**
32
 * @author Vicente Caballero Navarro
33
 */
34
public interface IOperator {
35
	int NUMBER = 0;
36
	int STRING = 1;
37
	int DATE = 2;
38
	public String addText(String s);
39
	public String toString();
40
	public void eval(BSFManager interpreter) throws BSFException ;
41
	public boolean isEnable();
42
	public void setType(int fieldType);
43
	public String getTooltip();
44
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/project/documents/table/gui/FeatureContainer.java
1
/*******************************************************************************
2
 *
3
 *   gvSIG. Desktop Geographic Information System.
4
 *  
5
 *   Copyright (C) 2007-2013 gvSIG Association.
6
 *  
7
 *   This program is free software; you can redistribute it and/or
8
 *   modify it under the terms of the GNU General Public License
9
 *   as published by the Free Software Foundation; either version 3
10
 *   of the License, or (at your option) any later version.
11
 *  
12
 *   This program is distributed in the hope that it will be useful,
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *   GNU General Public License for more details.
16
 *  
17
 *   You should have received a copy of the GNU General Public License
18
 *   along with this program; if not, write to the Free Software
19
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
 *   MA  02110-1301, USA.
21
 *  
22
 *   For any additional information, do not hesitate to contact us
23
 *   at info AT gvsig.com, or visit our website www.gvsig.com.
24
 *   
25
 *******************************************************************************/
26
package org.gvsig.expressionfield.project.documents.table.gui;
27

  
28
import org.gvsig.fmap.dal.feature.Feature;
29

  
30
public class FeatureContainer {
31
private Feature feature = null;
32

  
33
public Feature getFeature() {
34
	return feature;
35
}
36

  
37
public void setFeature(Feature feature) {
38
	this.feature = feature;
39
}
40

  
41
public boolean containsFeature() {
42
	return feature!=null;
43
}
44
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/project/documents/table/gui/syntaxhighlight/JRSyntaxTextArea.java
1
package org.gvsig.expressionfield.project.documents.table.gui.syntaxhighlight;
2

  
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.awt.event.KeyListener;
6

  
7
import javax.swing.JScrollPane;
8
import javax.swing.event.CaretEvent;
9
import javax.swing.event.CaretListener;
10
import javax.swing.text.JTextComponent;
11

  
12
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
13
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
14
import org.fife.ui.rtextarea.RTextScrollPane;
15

  
16

  
17
public class JRSyntaxTextArea implements SyntaxtHighlightTextComponent {
18

  
19
	public class DefaultUpdateCaretPositionActionEvent extends ActionEvent implements UpdateCaretPositionActionEvent {
20

  
21
		/**
22
		 * 
23
		 */
24
		private static final long serialVersionUID = 8238486105726094074L;
25
		int line = -1;
26
		int column = -1;
27
		
28
		public DefaultUpdateCaretPositionActionEvent(Object source, int id,
29
				String command, int line, int column) {
30
			super(source, id, command);
31
			this.line = line;
32
			this.column = column;
33
		}
34

  
35
		public int getLine() {
36
			return this.line+1;
37
		}
38

  
39
		public int getColumn() {
40
			return this.column;
41
		}
42

  
43
		public boolean hasLineAndColumn() {
44
			return this.line >=0 && this.column >= 0;
45
		}
46
		
47
	}
48
	
49
	protected ActionListener updateCaretPosition = null;
50
	protected RSyntaxTextArea textArea = null;
51
	
52
	public JRSyntaxTextArea() {
53
		this.textArea = new RSyntaxTextArea(20, 60);
54
		this.init();
55
	}
56
	
57
	protected void init() {
58
		textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_PYTHON);
59
		textArea.setCodeFoldingEnabled(true);
60
		textArea.setClearWhitespaceLinesEnabled(true);
61
		textArea.setAutoIndentEnabled(true);
62
		textArea.setCloseCurlyBraces(true);
63
		textArea.setWhitespaceVisible(true);
64
		textArea.setAnimateBracketMatching(true);
65
		textArea.setBracketMatchingEnabled(true);
66
		textArea.setAutoIndentEnabled(true);
67
		textArea.setTabsEmulated(true);
68
		textArea.setTabSize(2);
69
		textArea.setAntiAliasingEnabled(true);
70
		
71
		textArea.addCaretListener(new CaretListener() {
72
			public void caretUpdate(CaretEvent e) {
73
				if( updateCaretPosition== null ) {
74
					return;
75
				}
76
				updateCaretPosition.actionPerformed(
77
						new DefaultUpdateCaretPositionActionEvent(textArea, 1, "position", textArea.getCaretLineNumber(), textArea.getCaretOffsetFromLineStart() ) 
78
				);
79
			}
80
			
81
		});
82
	}
83
	
84
	public void setContentType(String contentType) {
85
		this.textArea.setSyntaxEditingStyle(contentType);
86
	}
87
	
88
	public JScrollPane getJScrollPane() {
89
		return  new RTextScrollPane(this.textArea);
90
	}
91

  
92
	public JTextComponent getJTextComponent() {
93
		return this.textArea;
94
	}
95

  
96
	public String getContentType() {
97
		return this.textArea.getSyntaxEditingStyle();
98
	}
99
	
100
	public void addUpdateCaretPositionActionListener(ActionListener updateCaretPosition) {
101
		this.updateCaretPosition = updateCaretPosition;  
102
	}
103

  
104
	public void setText(String text) {
105
		this.textArea.setText(text);
106
	}
107

  
108
	public String getText() {
109
		return this.textArea.getText();
110
	}
111
	
112
	public void addKeyListener(KeyListener keyListener) {
113
		this.textArea.addKeyListener(keyListener);
114
	}
115
}
org.gvsig.expressionfield/tags/org.gvsig.expressionfield-2.0.34/src/main/java/org/gvsig/expressionfield/project/documents/table/gui/syntaxhighlight/styles/JavaStyledDocument.java
1
package org.gvsig.expressionfield.project.documents.table.gui.syntaxhighlight.styles;
2

  
3
import java.awt.Color;
4
import java.util.HashSet;
5
import java.util.Set;
6

  
7
import javax.swing.text.AttributeSet;
8
import javax.swing.text.BadLocationException;
9
import javax.swing.text.DefaultEditorKit;
10
import javax.swing.text.DefaultStyledDocument;
11
import javax.swing.text.Element;
12
import javax.swing.text.MutableAttributeSet;
13
import javax.swing.text.SimpleAttributeSet;
14
import javax.swing.text.StyleConstants;
15

  
16

  
17
public class JavaStyledDocument extends DefaultStyledDocument {
18
	/**
19
	 * 
20
	 */
21
	private static final long serialVersionUID = 2859530660266127826L;
22
	
23
	private final DefaultStyledDocument doc;
24
	private final Element rootElement;
25

  
26
	private boolean multiLineComment;
27
	private final MutableAttributeSet normal;
28
	private final MutableAttributeSet keyword;
29
	private final MutableAttributeSet comment;
30
	private final MutableAttributeSet quote;
31

  
32
    private final Set<String> keywords;
33

  
34
	public JavaStyledDocument()
35
	{
36
		doc = this;
37
		rootElement = doc.getDefaultRootElement();
38
		putProperty( DefaultEditorKit.EndOfLineStringProperty, "\n" );
39

  
40
		normal = new SimpleAttributeSet();
41
		StyleConstants.setForeground(normal, Color.black);
42

  
43
		comment = new SimpleAttributeSet();
44
		StyleConstants.setForeground(comment, Color.gray);
45
		StyleConstants.setItalic(comment, true);
46

  
47
		keyword = new SimpleAttributeSet();
48
		StyleConstants.setForeground(keyword, Color.blue);
49

  
50
		quote = new SimpleAttributeSet();
51
		StyleConstants.setForeground(quote, Color.red);
52

  
53
        keywords = new HashSet<String>();
54
		keywords.add( "abstract" );
55
		keywords.add( "boolean" );
56
		keywords.add( "break" );
57
		keywords.add( "byte" );
58
		keywords.add( "byvalue" );
59
		keywords.add( "case" );
60
		keywords.add( "cast" );
61
		keywords.add( "catch" );
62
		keywords.add( "char" );
63
		keywords.add( "class" );
64
		keywords.add( "const" );
65
		keywords.add( "continue" );
66
		keywords.add( "default" );
67
		keywords.add( "do" );
68
		keywords.add( "double" );
69
		keywords.add( "else" );
70
		keywords.add( "extends" );
71
		keywords.add( "false" );
72
		keywords.add( "final" );
73
		keywords.add( "finally" );
74
		keywords.add( "float" );
75
		keywords.add( "for" );
76
		keywords.add( "future" );
77
		keywords.add( "generic" );
78
		keywords.add( "goto" );
79
		keywords.add( "if" );
80
		keywords.add( "implements" );
81
		keywords.add( "import" );
82
		keywords.add( "inner" );
83
		keywords.add( "instanceof" );
84
		keywords.add( "int" );
85
		keywords.add( "interface" );
86
		keywords.add( "long" );
87
		keywords.add( "native" );
88
		keywords.add( "new" );
89
		keywords.add( "null" );
90
		keywords.add( "operator" );
91
		keywords.add( "outer" );
92
		keywords.add( "package" );
93
		keywords.add( "private" );
94
		keywords.add( "protected" );
95
		keywords.add( "public" );
96
		keywords.add( "rest" );
97
		keywords.add( "return" );
98
		keywords.add( "short" );
99
		keywords.add( "static" );
100
		keywords.add( "super" );
101
		keywords.add( "switch" );
102
		keywords.add( "synchronized" );
103
		keywords.add( "this" );
104
		keywords.add( "throw" );
105
		keywords.add( "throws" );
106
		keywords.add( "transient" );
107
		keywords.add( "true" );
108
		keywords.add( "try" );
109
		keywords.add( "var" );
110
		keywords.add( "void" );
111
		keywords.add( "volatile" );
112
		keywords.add( "while" );
113
	}
114

  
115
	/*
116
	 *  Override to apply syntax highlighting after the document has been updated
117
	 */
118
	@Override
119
    public void insertString(int offset, String str, AttributeSet a) throws BadLocationException
120
	{
121
		if (str.equals("{"))
122
			str = addMatchingBrace(offset);
123

  
124
		super.insertString(offset, str, a);
125
		processChangedLines(offset, str.length());
126
	}
127

  
128
	/*
129
	 *  Override to apply syntax highlighting after the document has been updated
130
	 */
131
	@Override
132
    public void remove(int offset, int length) throws BadLocationException
133
	{
134
		super.remove(offset, length);
135
		processChangedLines(offset, 0);
136
	}
137

  
138
	/*
139
	 *  Determine how many lines have been changed,
140
	 *  then apply highlighting to each line
141
	 */
142
	public void processChangedLines(int offset, int length)
143
		throws BadLocationException
144
	{
145
		String content = doc.getText(0, doc.getLength());
146

  
147
		//  The lines affected by the latest document update
148

  
149
		int startLine = rootElement.getElementIndex( offset );
150
		int endLine = rootElement.getElementIndex( offset + length );
151

  
152
		//  Make sure all comment lines prior to the start line are commented
153
		//  and determine if the start line is still in a multi line comment
154

  
155
		setMultiLineComment( commentLinesBefore( content, startLine ) );
156

  
157
		//  Do the actual highlighting
158

  
159
		for (int i = startLine; i <= endLine; i++)
160
		{
161
			applyHighlighting(content, i);
162
		}
163

  
164
		//  Resolve highlighting to the next end multi line delimiter
165

  
166
		if (isMultiLineComment())
167
			commentLinesAfter(content, endLine);
168
		else
169
			highlightLinesAfter(content, endLine);
170
	}
171

  
172
	/*
173
	 *  Highlight lines when a multi line comment is still 'open'
174
	 *  (ie. matching end delimiter has not yet been encountered)
175
	 */
176
	private boolean commentLinesBefore(String content, int line)
177
	{
178
		int offset = rootElement.getElement( line ).getStartOffset();
179

  
180
		//  Start of comment not found, nothing to do
181

  
182
		int startDelimiter = lastIndexOf( content, getStartDelimiter(), offset - 2 );
183

  
184
		if (startDelimiter < 0)
185
			return false;
186

  
187
		//  Matching start/end of comment found, nothing to do
188

  
189
		int endDelimiter = indexOf( content, getEndDelimiter(), startDelimiter );
190

  
191
		if (endDelimiter < offset & endDelimiter != -1)
192
			return false;
193

  
194
		//  End of comment not found, highlight the lines
195

  
196
		doc.setCharacterAttributes(startDelimiter, offset - startDelimiter + 1, comment, false);
197
		return true;
198
	}
199

  
200
	/*
201
	 *  Highlight comment lines to matching end delimiter
202
	 */
203
	private void commentLinesAfter(String content, int line)
204
	{
205
		int offset = rootElement.getElement( line ).getEndOffset();
206

  
207
		//  End of comment not found, nothing to do
208

  
209
		int endDelimiter = indexOf( content, getEndDelimiter(), offset );
210

  
211
		if (endDelimiter < 0)
212
			return;
213

  
214
		//  Matching start/end of comment found, comment the lines
215

  
216
		int startDelimiter = lastIndexOf( content, getStartDelimiter(), endDelimiter );
217

  
218
		if (startDelimiter < 0 || startDelimiter <= offset)
219
		{
220
			doc.setCharacterAttributes(offset, endDelimiter - offset + 1, comment, false);
221
		}
222
	}
223

  
224
	/*
225
	 *  Highlight lines to start or end delimiter
226
	 */
227
	private void highlightLinesAfter(String content, int line)
228
		throws BadLocationException
229
	{
230
		int offset = rootElement.getElement( line ).getEndOffset();
231

  
232
		//  Start/End delimiter not found, nothing to do
233

  
234
		int startDelimiter = indexOf( content, getStartDelimiter(), offset );
235
		int endDelimiter = indexOf( content, getEndDelimiter(), offset );
236

  
237
		if (startDelimiter < 0)
238
			startDelimiter = content.length();
239

  
240
		if (endDelimiter < 0)
241
			endDelimiter = content.length();
242

  
243
		int delimiter = Math.min(startDelimiter, endDelimiter);
244

  
245
		if (delimiter < offset)
246
			return;
247

  
248
		//	Start/End delimiter found, reapply highlighting
249

  
250
		int endLine = rootElement.getElementIndex( delimiter );
251

  
252
		for (int i = line + 1; i < endLine; i++)
253
		{
254
			Element branch = rootElement.getElement( i );
255
			Element leaf = doc.getCharacterElement( branch.getStartOffset() );
256
			AttributeSet as = leaf.getAttributes();
257

  
258
			if ( as.isEqual(comment) )
259
				applyHighlighting(content, i);
260
		}
261
	}
262

  
263
	/*
264
	 *  Parse the line to determine the appropriate highlighting
265
	 */
266
	private void applyHighlighting(String content, int line)
267
		throws BadLocationException
268
	{
269
		int startOffset = rootElement.getElement( line ).getStartOffset();
270
		int endOffset = rootElement.getElement( line ).getEndOffset() - 1;
271

  
272
		int lineLength = endOffset - startOffset;
273
		int contentLength = content.length();
274

  
275
		if (endOffset >= contentLength)
276
			endOffset = contentLength - 1;
277

  
278
		//  check for multi line comments
279
		//  (always set the comment attribute for the entire line)
280

  
281
		if (endingMultiLineComment(content, startOffset, endOffset)
282
		||  isMultiLineComment()
283
		||  startingMultiLineComment(content, startOffset, endOffset) )
284
		{
285
			doc.setCharacterAttributes(startOffset, endOffset - startOffset + 1, comment, false);
286
			return;
287
		}
288

  
289
		//  set normal attributes for the line
290

  
291
		doc.setCharacterAttributes(startOffset, lineLength, normal, true);
292

  
293
		//  check for single line comment
294

  
295
		int index = content.indexOf(getSingleLineDelimiter(), startOffset);
296

  
297
		if ( (index > -1) && (index < endOffset) )
298
		{
299
			doc.setCharacterAttributes(index, endOffset - index + 1, comment, false);
300
			endOffset = index - 1;
301
		}
302

  
303
		//  check for tokens
304

  
305
		checkForTokens(content, startOffset, endOffset);
306
	}
307

  
308
	/*
309
	 *  Does this line contain the start delimiter
310
	 */
311
	private boolean startingMultiLineComment(String content, int startOffset, int endOffset)
312
		throws BadLocationException
313
	{
314
		int index = indexOf( content, getStartDelimiter(), startOffset );
315

  
316
		if ( (index < 0) || (index > endOffset) )
317
			return false;
318
		else
319
		{
320
			setMultiLineComment( true );
321
			return true;
322
		}
323
	}
324

  
325
	/*
326
	 *  Does this line contain the end delimiter
327
	 */
328
	private boolean endingMultiLineComment(String content, int startOffset, int endOffset)
329
		throws BadLocationException
330
	{
331
		int index = indexOf( content, getEndDelimiter(), startOffset );
332

  
333
		if ( (index < 0) || (index > endOffset) )
334
			return false;
335
		else
336
		{
337
			setMultiLineComment( false );
338
			return true;
339
		}
340
	}
341

  
342
	/*
343
	 *  We have found a start delimiter
344
	 *  and are still searching for the end delimiter
345
	 */
346
	private boolean isMultiLineComment()
347
	{
348
		return multiLineComment;
349
	}
350

  
351
	private void setMultiLineComment(boolean value)
352
	{
353
		multiLineComment = value;
354
	}
355

  
356
	/*
357
	 *	Parse the line for tokens to highlight
358
	 */
359
	private void checkForTokens(String content, int startOffset, int endOffset)
360
	{
361
		while (startOffset <= endOffset)
362
		{
363
			//  skip the delimiters to find the start of a new token
364

  
365
			while ( isDelimiter( content.substring(startOffset, startOffset + 1) ) )
366
			{
367
				if (startOffset < endOffset)
368
					startOffset++;
369
				else
370
					return;
371
			}
372

  
373
			//  Extract and process the entire token
374

  
375
			if ( isQuoteDelimiter( content.substring(startOffset, startOffset + 1) ) )
376
				startOffset = getQuoteToken(content, startOffset, endOffset);
377
			else
378
				startOffset = getOtherToken(content, startOffset, endOffset);
379
		}
380
	}
381

  
382
	/*
383
	 *
384
	 */
385
	private int getQuoteToken(String content, int startOffset, int endOffset)
386
	{
387
		String quoteDelimiter = content.substring(startOffset, startOffset + 1);
388
		String escapeString = getEscapeString(quoteDelimiter);
389

  
390
		int index;
391
		int endOfQuote = startOffset;
392

  
393
		//  skip over the escape quotes in this quote
394

  
395
		index = content.indexOf(escapeString, endOfQuote + 1);
396

  
397
		while ( (index > -1) && (index < endOffset) )
398
		{
399
			endOfQuote = index + 1;
400
			index = content.indexOf(escapeString, endOfQuote);
401
		}
402

  
403
		// now find the matching delimiter
404

  
405
		index = content.indexOf(quoteDelimiter, endOfQuote + 1);
406

  
407
		if ( (index < 0) || (index > endOffset) )
408
			endOfQuote = endOffset;
409
		else
410
			endOfQuote = index;
411

  
412
		doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1, quote, false);
413

  
414
		return endOfQuote + 1;
415
	}
416

  
417
	/*
418
	 *
419
	 */
420
	private int getOtherToken(String content, int startOffset, int endOffset)
421
	{
422
		int endOfToken = startOffset + 1;
423

  
424
		while ( endOfToken <= endOffset )
425
		{
426
			if ( isDelimiter( content.substring(endOfToken, endOfToken + 1) ) )
427
				break;
428

  
429
			endOfToken++;
430
		}
431

  
432
		String token = content.substring(startOffset, endOfToken);
433

  
434
		if ( isKeyword( token ) )
435
		{
436
			doc.setCharacterAttributes(startOffset, endOfToken - startOffset, keyword, false);
437
		}
438

  
439
		return endOfToken + 1;
440
	}
441

  
442
	/*
443
	 *  Assume the needle will the found at the start/end of the line
444
	 */
445
	private int indexOf(String content, String needle, int offset)
446
	{
447
		int index;
448

  
449
		while ( (index = content.indexOf(needle, offset)) != -1 )
450
		{
451
			String text = getLine( content, index ).trim();
452

  
453
			if (text.startsWith(needle) || text.endsWith(needle))
454
				break;
455
			else
456
				offset = index + 1;
457
		}
458

  
459
		return index;
460
	}
461

  
462
	/*
463
	 *  Assume the needle will the found at the start/end of the line
464
	 */
465
	private int lastIndexOf(String content, String needle, int offset)
466
	{
467
		int index;
468

  
469
		while ( (index = content.lastIndexOf(needle, offset)) != -1 )
470
		{
471
			String text = getLine( content, index ).trim();
472

  
473
			if (text.startsWith(needle) || text.endsWith(needle))
474
				break;
475
			else
476
				offset = index - 1;
477
		}
478

  
479
		return index;
480
	}
481

  
482
	private String getLine(String content, int offset)
483
	{
484
		int line = rootElement.getElementIndex( offset );
485
		Element lineElement = rootElement.getElement( line );
486
		int start = lineElement.getStartOffset();
487
		int end = lineElement.getEndOffset();
488
		return content.substring(start, end - 1);
489
	}
490

  
491
	/*
492
	 *  Override for other languages
493
	 */
494
	protected boolean isDelimiter(String character)
495
	{
496
		String operands = ";:{}()[]+-/%<=>!&|^~*";
497

  
498
		if (Character.isWhitespace( character.charAt(0) ) ||
499
			operands.indexOf(character) != -1 )
500
			return true;
501
		else
502
			return false;
503
	}
504

  
505
	/*
506
	 *  Override for other languages
507
	 */
508
	protected boolean isQuoteDelimiter(String character)
509
	{
510
		String quoteDelimiters = "\"'";
511

  
512
		if (quoteDelimiters.indexOf(character) < 0)
513
			return false;
514
		else
515
			return true;
516
	}
517

  
518
	/*
519
	 *  Override for other languages
520
	 */
521
	protected boolean isKeyword(String token)
522
	{
523
		return keywords.contains( token );
524
	}
525

  
526
	/*
527
	 *  Override for other languages
528
	 */
529
	protected String getStartDelimiter()
530
	{
531
		return "/*";
532
	}
533

  
534
	/*
535
	 *  Override for other languages
536
	 */
537
	protected String getEndDelimiter()
538
	{
539
		return "*/";
540
	}
541

  
542
	/*
543
	 *  Override for other languages
544
	 */
545
	protected String getSingleLineDelimiter()
546
	{
547
		return "//";
548
	}
549

  
550
	/*
551
	 *  Override for other languages
552
	 */
553
	protected String getEscapeString(String quoteDelimiter)
554
	{
555
		return "\\" + quoteDelimiter;
556
	}
557

  
558
	/*
559
	 *
560
	 */
561
	protected String addMatchingBrace(int offset) throws BadLocationException
562
	{
563
		StringBuffer whiteSpace = new StringBuffer();
564
		int line = rootElement.getElementIndex( offset );
565
		int i = rootElement.getElement(line).getStartOffset();
566

  
567
		while (true)
568
		{
569
			String temp = doc.getText(i, 1);
570

  
571
			if (temp.equals(" ") || temp.equals("\t"))
572
			{
573
				whiteSpace.append(temp);
574
				i++;
575
			}
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff