Rev 4807 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3653 | schaersvoo | 1 | /* |
2 | ********************************************************************************* |
||
3 | * J.M. Evers 2010 * |
||
4 | * This is all amateur scriblings... So no copyrights. * |
||
5 | * This source code file, and compiled classes derived from it, * |
||
6 | * can be used and distributed without restriction, including for commercial use * |
||
7 | * No warrenty. * |
||
8 | ********************************************************************************* |
||
9 | version 0.4 |
||
10 | 10/12/2010 |
||
11 | Added param pointsize to differ size of points from linewidth |
||
12 | Removed −× from html reply (problems with representation after sending to wims) |
||
13 | now just ascii + - : x |
||
14 | |||
15 | version 0.3 |
||
16 | Added decimals [point object] |
||
17 | |||
18 | version 0.2 |
||
19 | |||
20 | Added correct French button text [B. Perrin-Riou] |
||
21 | Added left hand +,-,x,: sign next to the lines [when language=fr ] |
||
22 | |||
23 | version 0.1 |
||
24 | |||
25 | Applet for simple adding, subtracting,dividing and multiplying by pupils. |
||
26 | The result can be checked by WIMS. |
||
27 | |||
28 | Output: |
||
29 | document.getElementById('InvulGrid').ReadApplet("0") : itemlist [one item per horizontal line] |
||
30 | document.getElementById('InvulGrid').ReadApplet("1") : javascript confirmbox |
||
31 | document.getElementById('InvulGrid').ReadApplet("2") : html table |
||
32 | document.getElementById('InvulGrid').ReadApplet("3") : latex array/table |
||
33 | |||
34 | Example [same as test.html] |
||
35 | <html> |
||
36 | <body> |
||
37 | <script type="text/javascript"> |
||
38 | function ReadThis(){ |
||
39 | |||
40 | var wims_reply = document.getElementById('InvulGrid').ReadApplet("0"); |
||
41 | alert("this can send to wims for correction:\n"+wims_reply); |
||
42 | |||
43 | var js_alert_show= document.getElementById('InvulGrid').ReadApplet("1"); |
||
44 | alert("this can be the confirmbox for the pupil:\n"+js_alert_show); |
||
45 | |||
46 | var html_show= document.getElementById('InvulGrid').ReadApplet("2"); |
||
47 | document.getElementById('html_reply').innerHTML="this is a html-table representation<br>"+html_show; |
||
48 | |||
49 | var latex_show= document.getElementById('InvulGrid').ReadApplet("3"); |
||
50 | alert("this is an latex array of the answer:\n Usable via !insmath\n"+latex_show); |
||
51 | } |
||
52 | </script>. |
||
53 | <table> |
||
54 | <tr> |
||
55 | <th> |
||
56 | <applet id="InvulGrid" codebase="dist" archive="InvulGrid.jar" code="InvulGrid.class" width="400" height="400"> |
||
57 | <param name="fontsize" value="50"><!-- optional: actual fontsize will be determined according xlines/ylines -- xsize/ysize --> |
||
58 | <param name="pencolor" value="0,0,255,150"><!-- optional: typing color --> |
||
59 | <param name="bgcolor" value="255,255,255"><!-- optional: canvas bgcolor;default white ; R,G,B,alpha --> |
||
60 | <param name="markcolor" value="10,255,10,60"><!-- optional: active field color --> |
||
61 | <param name="linecolor" value="200,10,60,150"><!-- optional: user drawn lines in applet --> |
||
62 | <param name="linewidth" value="6"><!-- linewidth of user drawn lines --> |
||
63 | <param name="pointsize" value="3"><!-- size of drawn decimal points --> |
||
64 | |||
65 | <param name="xlines" value="12"><!-- default 10 ; number of vertical lines : determines fontsize --> |
||
66 | <param name="ylines" value="12"><!-- default 10 ; number of horizontal lines --> |
||
67 | <param name="showgrid" value="1"><!-- show xlines and ylines as grid in gridcolor --> |
||
68 | <param name="gridcolor" value="0,0,255,40"><!-- color of grid --> |
||
69 | <param name="reverse" value="yes"><!-- default false ; editing from right to left --> |
||
70 | |||
71 | <param name="language" value="en"><!-- default en ; nl , fr --> |
||
72 | <!-- optional: is an itemlist, spaces matter .--> |
||
73 | <!-- Optional horizontal lines: ---|x|-|+|: --> |
||
74 | <!-- bug in java plugin's stringtokenizer: first token blancspace is stripped off... --> |
||
75 | <!-- in applet viewer this works fine --> |
||
76 | <!-- to produce an space before the first number, add a "," like--> |
||
77 | <!-- spaces matter !! --> |
||
78 | <param name="exercise" value=", 13456789, 567890, 12345, 45678, 2345678,---|-"> |
||
79 | |||
80 | <!-- use first row of grid for user scribbling: this will not be send to wims --> |
||
81 | <param name="scribling_pencolor" value="255,200,0,170"><!-- optional --> |
||
82 | <!-- if param buttons is empty or not set : only a 'clear all; button will be shown --> |
||
83 | <param name="buttons" value="+"><!-- user draws lines with +,-,x,÷ symbols ; do not use too many! --> |
||
84 | </applet> |
||
85 | <br> |
||
86 | <input type="button" name="InvulGrid" value="Read " onclick="javascript:ReadThis(0);"> |
||
87 | </th> |
||
88 | <th> |
||
89 | <div id="html_reply"></div> |
||
90 | </th> |
||
91 | </tr> |
||
92 | <table> |
||
93 | </body> |
||
94 | </html> |
||
95 | */ |
||
96 | |||
97 | import java.applet.Applet; |
||
98 | import java.awt.image.BufferedImage; |
||
99 | import java.awt.*; |
||
100 | import java.awt.event.*; |
||
101 | import java.util.*; |
||
102 | import java.awt.Color; |
||
103 | import javax.swing.*; |
||
104 | //import java.io.*; not needed, we use javascript to communicate with WIMS |
||
105 | |||
106 | public class InvulGrid extends JApplet implements ActionListener,KeyListener,MouseListener, MouseMotionListener, MouseWheelListener { |
||
107 | Font font; |
||
108 | int fontsize,xsize,ysize,xlines,ylines,xstep,ystep,linewidth,pointsize; |
||
109 | Color scribling_pencolor,bgcolor,pencolor,linecolor,markcolor,gridcolor,deletecolor,marked_color,exercisecolor,scribling_rowcolor; |
||
110 | String[][] charArray; |
||
111 | boolean[][] Marked; |
||
112 | boolean[][] Editable; |
||
113 | boolean[] EditableObject; |
||
114 | int xindex = 0; |
||
115 | int yindex = 0; |
||
116 | int objcnt=0; |
||
117 | Graphics2D backg; |
||
118 | BufferedImage bg; |
||
119 | Vector objects = new Vector(); |
||
120 | Vector decimalpoints = new Vector(); |
||
121 | int pointcnt = 0; |
||
122 | boolean showgrid; |
||
123 | public String line_plus="line + "; |
||
124 | public String line_times="line x"; |
||
125 | public String line_min="line -"; |
||
126 | public String line_div="line :"; |
||
127 | public String delete_line="delete line"; |
||
128 | public String clear_all="clear all"; |
||
129 | Container cp; |
||
130 | int editablecnt = 0; |
||
131 | int fontheight=10; |
||
132 | boolean check_segments = false; |
||
133 | boolean reverse = false; |
||
134 | boolean left_to_right = false; |
||
135 | int scribling = 2; |
||
136 | // true: --- + false: + --- |
||
137 | boolean right = true; |
||
138 | int fontwidth = 10; |
||
139 | // reverse :if no 'conclusion line' is drawn, we write form left to right |
||
140 | // if a line is drawn, we write from right to left... |
||
141 | |||
142 | // slow repainting can occur via update() : using bufferedimage of grid to avoid flickering. |
||
143 | |||
144 | public void init(){ |
||
145 | scribling_pencolor = colorParam("scribling_pencolor", new Color(255,0,0)); |
||
146 | if( (getBool("scribling_row",true)) == true){scribling = 2;}else{scribling = 1;} |
||
147 | getLanguage("language"); |
||
148 | getButtons(); |
||
149 | Dimension appletSize = getSize(); |
||
150 | xsize = appletSize.width; |
||
151 | ysize = appletSize.height; |
||
152 | xlines = getInt("xlines",10); |
||
153 | ylines = getInt("ylines",10); |
||
154 | xstep = (int) xsize/xlines; |
||
155 | ystep = (int) ysize/(ylines+1); |
||
156 | bg = new BufferedImage(xsize,ysize, BufferedImage.TYPE_INT_ARGB); |
||
157 | backg = (Graphics2D) bg.getGraphics(); |
||
158 | // fitfont kan ylines bepalen !! volgorde is belangrijk |
||
159 | fontsize = getInt("fontsize",28); |
||
160 | font = FitFont( backg ,"TimesRoman" , fontsize); |
||
161 | charArray = new String[xlines+1][ylines+1]; |
||
162 | Marked = new boolean[xlines+1][ylines+1]; |
||
163 | Editable = new boolean[xlines+1][ylines+1]; |
||
164 | EditableObject = new boolean[xlines*ylines]; |
||
165 | |||
166 | for(int x = 0; x < xlines+1; x++){ |
||
167 | for(int y = 0; y < ylines+1 ; y++){ |
||
168 | charArray[x][y]=""; |
||
169 | Marked[x][y]=false; |
||
170 | Editable[x][y]=true; |
||
171 | } |
||
172 | } |
||
173 | for(int y = 0 ; y <xlines*ylines;y++){ |
||
174 | EditableObject[y] = true; |
||
175 | } |
||
176 | showgrid = getBool("showgrid",true); |
||
177 | left_to_right = getBool("reverse",false); |
||
178 | scribling_rowcolor = colorParam("scribling_rowcolor",new Color(0,255,0,50)); |
||
179 | bgcolor = colorParam("bgcolor",Color.white); |
||
180 | pencolor = colorParam("pencolor",Color.black); |
||
181 | linecolor = colorParam("linecolor",Color.red); |
||
182 | markcolor = colorParam("markcolor",Color.green); |
||
183 | gridcolor = colorParam("gridcolor",Color.blue); |
||
184 | exercisecolor = colorParam("exercisecolor",Color.black); |
||
185 | linewidth = getInt("linewidth",2); |
||
186 | pointsize = getInt("pointsize",5); |
||
187 | deletecolor = new Color(255,0,0,120); |
||
188 | marked_color = markcolor; |
||
189 | addKeyListener(this); |
||
190 | addMouseListener(this); |
||
191 | addMouseMotionListener(this); |
||
192 | addMouseWheelListener(this); |
||
193 | getSegments(); |
||
194 | ReadStringParam(); |
||
195 | prepaint(); |
||
196 | requestFocus(); |
||
197 | } |
||
198 | |||
199 | public String ReadApplet(String t){ |
||
200 | String[] reply = new String[ylines+1]; |
||
201 | String[] horline = new String[ylines+1]; |
||
202 | StringBuffer tmp; |
||
203 | int cnt = 0; |
||
204 | int userline; |
||
205 | int maxlength=0; |
||
206 | String op;// operator +,-,/,* |
||
207 | boolean not_empty = false; |
||
208 | boolean found_line = false; |
||
209 | int pnt = -1; |
||
210 | for( int y = scribling ; y <= ylines ; y++ ){// y = 1 all including scribling row ; y=2 excluding scribling row |
||
211 | tmp = new StringBuffer(); |
||
212 | found_line = false; |
||
213 | op = ""; |
||
214 | pnt = -1; |
||
215 | for(int i = 0 ; i < objcnt ; i++){ |
||
216 | if (objects.elementAt(i) instanceof GridLine){ |
||
217 | if( ((GridLine)objects.elementAt(i)).isSegment() == true ){ |
||
218 | userline = (int)(((GridLine)objects.elementAt(i)).getY1()/ystep) - 1; |
||
219 | if( y == userline ){ |
||
220 | found_line = true; |
||
221 | op = ((GridLine)objects.elementAt(i)).getText(); |
||
222 | i = objcnt; //exit |
||
223 | } |
||
224 | } |
||
225 | } |
||
226 | } |
||
227 | pnt = findPoint(y); |
||
228 | for( int x = 0 ; x <= xlines ; x++ ){ |
||
229 | if(x == pnt){ |
||
230 | tmp.append("."); |
||
231 | } |
||
232 | tmp.append(charArray[x][y]); |
||
233 | } |
||
234 | if(tmp.length() != 0){ |
||
235 | if( tmp.length() > maxlength ){maxlength = tmp.length();} |
||
236 | not_empty = true; |
||
237 | reply[cnt] = replace(tmp.toString(), " " , ""); |
||
238 | //System.out.println("added "+reply[cnt] + " by y = "+y); |
||
239 | if(found_line == true){horline[cnt] = op;} |
||
240 | cnt++; |
||
241 | } |
||
242 | |||
243 | } |
||
244 | if(not_empty == false){return "error:empty answer";} |
||
245 | |||
246 | if( t.equals("3") ){ |
||
247 | return makeLatex(reply,horline); |
||
248 | } |
||
249 | else |
||
250 | { |
||
251 | if( t.equals("2") ){ |
||
252 | return makeHtml(reply,horline); |
||
253 | } |
||
254 | else |
||
255 | { |
||
256 | if( t.equals("1") ){ |
||
257 | return makeJs(reply,horline,maxlength); |
||
258 | } |
||
259 | else |
||
260 | { |
||
261 | if( t.equals("0") ){ |
||
262 | return Array2String(reply,","); |
||
263 | } |
||
264 | else |
||
265 | { |
||
266 | return "error : usage is \n ReadApplet(0) ... wims itemlist\n ReadApplet(3) ... latex representation\n ReadApplet(2) ... html representation\n ReadApplet(1) ... javascript confirmbox"; |
||
267 | } |
||
268 | } |
||
269 | } |
||
270 | } |
||
271 | } |
||
272 | |||
273 | public String Array2String(String[] s, String sep) { |
||
274 | StringBuilder result = new StringBuilder(); |
||
275 | if (s.length > 0) { |
||
276 | result.append(s[0]); |
||
277 | for (int i=1; i < s.length; i++) { |
||
278 | if(s[i] != null){ |
||
279 | result.append(sep); |
||
280 | result.append(s[i]); |
||
281 | } |
||
282 | } |
||
283 | } |
||
284 | return result.toString(); |
||
285 | } |
||
286 | |||
287 | public String makeLatex(String[] reply , String[] horline){ |
||
288 | String latex=""; |
||
289 | String op=""; |
||
290 | String space=""; |
||
291 | boolean fraction = false; |
||
292 | int w = 0;int thisline=0; |
||
293 | while ( fraction == false && w <= ylines ){ |
||
294 | if(reply[w] != null){ |
||
295 | if(reply[w].indexOf("\\") != -1){ |
||
296 | fraction = true; |
||
297 | thisline = w; |
||
298 | } |
||
299 | } |
||
300 | w++; |
||
301 | } |
||
302 | |||
303 | if(fraction == true ){ |
||
304 | int start = (reply[thisline]).indexOf("/"); |
||
305 | int end = (reply[thisline]).indexOf("\\"); |
||
306 | w = end - start - 1; |
||
307 | if(w<0){w = reply[thisline].length();} |
||
308 | reply[thisline] = replace(reply[thisline],"\\"," & \\diagdown & "); |
||
309 | reply[thisline] = replace(reply[thisline],"/"," & \\diagup & "); |
||
310 | reply[thisline] = reply[thisline] + " \\\\ "; |
||
311 | latex="\\begin{array}{cclcc}"+reply[thisline]; |
||
312 | thisline++; |
||
313 | } |
||
314 | else |
||
315 | { |
||
316 | latex="\\begin{array}{rr}"; |
||
317 | thisline = 0; |
||
318 | } |
||
319 | |||
320 | for( int y = thisline ; y < reply.length ; y++ ){ |
||
321 | if( reply[y] != null){ |
||
322 | if(horline[y] != null){ |
||
323 | if((horline[y]).equals("\u00D7")){ |
||
324 | op =" \\times "; |
||
325 | } |
||
326 | else |
||
327 | { |
||
328 | if((horline[y]).equals("\u00F7")){ |
||
329 | op =" \\div "; |
||
330 | } |
||
331 | else |
||
332 | { |
||
333 | op = horline[y]; |
||
334 | } |
||
335 | } |
||
336 | if(fraction == false){ |
||
337 | if(right){ |
||
338 | latex = latex + " \\underline{" +reply[y]+ "} & "+horline[y] +" \\\\ "; |
||
339 | } |
||
340 | else // french |
||
341 | { |
||
342 | latex = latex + horline[y] +" & \\underline{" +reply[y]+ " } \\\\ "; |
||
343 | } |
||
344 | } |
||
345 | else |
||
346 | { |
||
347 | if( w > reply[y].length()){ |
||
348 | for(int z=0; z < w - reply[y].length();z++){ |
||
349 | space = space + " \\: "; |
||
350 | } |
||
351 | } |
||
352 | latex = latex + "& & \\underline{" +space+ reply[y]+"} & & \\\\ "; |
||
353 | } |
||
354 | } |
||
355 | else |
||
356 | { |
||
357 | if(fraction == false){ |
||
358 | if(right){ |
||
359 | latex = latex + " "+ reply[y] + " & "+ " \\\\ "; |
||
360 | } |
||
361 | else // french |
||
362 | { |
||
363 | latex = latex + " & "+ reply[y] + " \\\\ "; |
||
364 | } |
||
365 | } |
||
366 | else |
||
367 | { |
||
368 | if( w > reply[y].length()){ |
||
369 | for(int z=0; z < w - reply[y].length();z++){ |
||
370 | space = space + " \\: "; |
||
371 | } |
||
372 | } |
||
373 | latex = latex + "& & "+ space+ reply[y] +" & & \\\\ "; |
||
374 | } |
||
375 | } |
||
376 | } |
||
377 | } |
||
378 | latex = latex + " \\end{array}"; |
||
379 | return latex; |
||
380 | } |
||
381 | |||
382 | public String makeHtml(String[] reply , String[] horline){ |
||
383 | String table = "<table style=\"margin-bottom:1px;margin-top:1px;\"><tr><td align=\"right\"><table style=\"margin-bottom:1px;margin-top:1px;\" summary=\"\" width=\"100%\">"; |
||
384 | String tmp=""; |
||
385 | for( int y = 0 ; y < reply.length ; y++ ){ |
||
386 | if(reply[y] != null){ |
||
387 | if(right){ |
||
388 | table=table+"<tr><td style=\"text-align:right\">"+reply[y]+"</td><td> </td></tr>"; |
||
389 | } |
||
390 | else // french |
||
391 | { |
||
392 | table=table+"<tr><td> </td><td style=\"text-align:right\">"+reply[y]+"</td></tr>"; |
||
393 | } |
||
394 | if(horline[y] != null){ |
||
395 | if(horline[y].equals("\u00D7")) tmp = "x"; |
||
396 | else |
||
397 | if(horline[y].equals("\u00F7")) tmp = ":"; |
||
398 | else tmp = horline[y]; |
||
399 | |||
400 | if(right){ |
||
401 | table=table+"</table></td><tr><td><table style=\"margin-bottom:1px;margin-top:1px;\" summary=\"\" width=\"100%\"><tr><th width=\"90%\"><hr></th><th>"+tmp+"</th></tr></table></td></tr><td><table style=\"margin-bottom:1px;margin-top:1px;\" summary=\"\" width=\"100%\">"; |
||
402 | } |
||
403 | else // french |
||
404 | { |
||
405 | table=table+"</table></td><tr><td><table style=\"margin-bottom:1px;margin-top:1px;\" summary=\"\" width=\"100%\"><tr><th>"+tmp+"</th><th width=\"90%\"><hr></th></tr></table></td></tr><td><table style=\"margin-bottom:1px;margin-top:1px;\" summary=\"\" width=\"100%\">"; |
||
406 | } |
||
407 | } |
||
408 | } |
||
409 | } |
||
410 | table = table+"</table></td></tr></table>"; |
||
411 | return table; |
||
412 | } |
||
413 | |||
414 | public String makeJs(String[] reply, String[] horline , int maxlength){ |
||
415 | String js="";String space = "";String line = "";String op = ""; |
||
416 | for(int i = 0 ; i < maxlength ; i++){ |
||
417 | line = line + "-"; |
||
418 | } |
||
419 | for( int y = 0 ; y < reply.length ; y++ ){ |
||
420 | if(reply[y] != null){ |
||
421 | if(horline[y] != null){ |
||
422 | space = ""; |
||
423 | for(int i = 0 ; i < (maxlength - reply[y].length()) ; i++){ |
||
424 | space = space + " "; |
||
425 | } |
||
426 | if(right){ |
||
427 | js = js + space+reply[y] + "\n" + line + " " + horline[y] + "\n"; |
||
428 | } |
||
429 | else // french |
||
430 | { |
||
431 | js = js + space+reply[y] + "\n" + horline[y] +" "+ line + "\n"; |
||
432 | } |
||
433 | } |
||
434 | else // trying to align at the rightside of the alertbox ... somehow this will not work properly |
||
435 | { |
||
436 | space = ""; |
||
437 | for(int i = 0 ; i < (maxlength - reply[y].length()) ; i++){ |
||
438 | space = space + " "; |
||
439 | } |
||
440 | js = js + space + reply[y] + "\n"; |
||
441 | } |
||
442 | } |
||
443 | } |
||
444 | return js; |
||
445 | } |
||
446 | |||
447 | public void getSegments(){ |
||
448 | String param = getParameter("segment1"); |
||
449 | if(param != null && param.length() > 3){ |
||
450 | |||
451 | int i = 1; |
||
452 | StringTokenizer s; |
||
453 | int m=0,x1=0,x2=0,y1=0,y2=0; |
||
454 | String colorparam;Color segmentcolor; |
||
455 | check_segments = true; |
||
456 | while( param != null && param.length() >3 ){ |
||
457 | s = new StringTokenizer(param, ","); |
||
458 | m = s.countTokens(); |
||
459 | if(m != 4){System.out.println("Expecting 2 points for a linesegment");return;} |
||
460 | for(int p = 0 ; p < 4 ; p++){ |
||
461 | if( p == 0 ){ x1 = Integer.parseInt(s.nextToken());} |
||
462 | else |
||
463 | if( p == 1 ){ y1 = Integer.parseInt(s.nextToken());} |
||
464 | else |
||
465 | if( p == 2 ){ x2 = Integer.parseInt(s.nextToken());} |
||
466 | else |
||
467 | if( p == 3 ){ y2 = Integer.parseInt(s.nextToken());} |
||
468 | } |
||
469 | colorparam = "color"+i; |
||
470 | EditableObject[editablecnt] = false;editablecnt++; |
||
471 | segmentcolor = colorParam(colorparam,linecolor); |
||
472 | drawLine(x1*xstep,(y1+2)*ystep,x2*xstep,(y2+2)*ystep,segmentcolor,"",false,false); |
||
473 | i++; |
||
474 | param = getParameter("segment"+i); |
||
475 | } |
||
476 | } |
||
477 | } |
||
478 | |||
479 | |||
480 | public void ReadStringParam(){ |
||
481 | String exo = getParameter("exercise"); |
||
482 | if(exo != null && exo.length()>0){ |
||
483 | StringTokenizer lines = new StringTokenizer(exo, ","); |
||
484 | int m=lines.countTokens(); |
||
485 | boolean found_fraction = false; |
||
486 | boolean found_decimal_point = false; |
||
487 | if( m < ylines ){ |
||
488 | String lastword=""; |
||
489 | String word="";String tmp="";int xi=0; |
||
490 | for( int i = 0 ; i < m ; i++){ |
||
491 | word = lines.nextToken(); |
||
492 | if(word.indexOf("/") != -1){ found_fraction = true;} |
||
493 | if(word.indexOf("---|") != -1){// a special line and should be LAST !! |
||
494 | // the last word was: charArray[xindex - 1][yindex - 1] |
||
495 | char[] wordArray = lastword.toCharArray(); |
||
496 | boolean found = false;int start = 0;int end = wordArray.length; |
||
497 | for(int s = 0; s < end;s++){ |
||
498 | if(wordArray[s] != ' ' && !found){start = s;found = true;} |
||
499 | } |
||
500 | if(right && found_decimal_point){ |
||
501 | end = end - 1; |
||
502 | } |
||
503 | else |
||
504 | { |
||
505 | if(!right && found_decimal_point && start >0 ){start = start - 1; end = end - 1;} |
||
506 | } |
||
507 | if(word.indexOf("---|+") != -1){ // ---- + |
||
508 | drawLine(start*xstep,(i+2)*ystep,end*xstep,(i+2)*ystep,linecolor,"+",false,true); |
||
509 | EditableObject[editablecnt] = false;editablecnt++; |
||
510 | } |
||
511 | else |
||
512 | { |
||
513 | if(word.indexOf("---|-") != -1){ // ---- - |
||
514 | drawLine(start*xstep,(i+2)*ystep,end*xstep,(i+2)*ystep,linecolor,"-",false,true); |
||
515 | EditableObject[editablecnt] = false;editablecnt++; |
||
516 | } |
||
517 | else |
||
518 | { |
||
519 | if(word.indexOf("---|x") != -1){ // ---- x |
||
520 | drawLine(start*xstep,(i+2)*ystep,end*xstep,(i+2)*ystep,linecolor,"\u00D7",false,true); |
||
521 | EditableObject[editablecnt] = false;editablecnt++; |
||
522 | } |
||
523 | else |
||
524 | { |
||
525 | if(word.indexOf("---|:") != -1){ // ---- division |
||
526 | drawLine(start*xstep,(i+2)*ystep,end*xstep,(i+2)*ystep,linecolor,"\u00F7",false,true); |
||
527 | EditableObject[editablecnt] = false;editablecnt++; |
||
528 | } |
||
529 | else |
||
530 | { |
||
531 | System.out.println("unknown command : "+word); |
||
532 | } |
||
533 | } |
||
534 | } |
||
535 | } |
||
536 | } |
||
537 | else |
||
538 | { |
||
539 | xi=0; |
||
540 | for( int p = 0 ; p < word.length(); p++){ |
||
541 | if( p <= xlines ){ |
||
542 | tmp = Character.toString(word.charAt(p)); |
||
543 | if(tmp.equals(".")){ |
||
544 | drawPoint(xi,i+2,pointsize,false); |
||
545 | found_decimal_point = true; |
||
546 | } |
||
547 | else |
||
548 | { |
||
549 | charArray[xi][i+2] = tmp; |
||
550 | //we do not use yindex=1 : space is used for controls... |
||
551 | lastword = word; |
||
552 | if(found_fraction == true){ |
||
553 | Editable[xi][i+2] = false; |
||
554 | } |
||
555 | else |
||
556 | { |
||
557 | for(int c = 0 ; c<xlines;c++){ // disable editing of line y=i+2 |
||
558 | Editable[c][i+2] = false; |
||
559 | } |
||
560 | } |
||
561 | xi++; |
||
562 | } |
||
563 | } |
||
564 | else |
||
565 | { |
||
566 | System.out.println("ERROR : word "+word+" too large for "+xlines+" gridlines...\nin param \"execise\""); |
||
567 | return; |
||
568 | } |
||
569 | } |
||
570 | } |
||
571 | } |
||
572 | for(int x = 0 ; x<xlines ; x++){ |
||
573 | Editable[x][1] = true; |
||
574 | charArray[x][1]=""; |
||
575 | } |
||
576 | } |
||
577 | else |
||
578 | { |
||
579 | System.out.println("ERROR : to many spaces in param \"exercise\""); |
||
580 | return; |
||
581 | } |
||
582 | } |
||
583 | } |
||
584 | |||
585 | |||
586 | public void getLanguage(String s){ |
||
587 | s = getParameter("language"); |
||
588 | if(s != null && s.length() == 2){ |
||
589 | if( s.equalsIgnoreCase("nl")){ |
||
590 | line_plus="lijn + "; |
||
591 | line_times="lijn x"; |
||
592 | line_min="lijn -"; |
||
593 | delete_line="verwijder lijn"; |
||
594 | clear_all="alles wissen"; |
||
595 | line_div="line :"; |
||
596 | right=true; |
||
597 | return; |
||
598 | } |
||
599 | else |
||
600 | { |
||
601 | if( s.equalsIgnoreCase("fr")){ |
||
602 | line_plus="+ Ã droite "; |
||
603 | line_times="droite x"; |
||
604 | delete_line="effacer droite"; |
||
605 | clear_all="effacer"; |
||
606 | line_min="droite -"; |
||
607 | line_div="droite :"; |
||
608 | right=false; |
||
609 | return; |
||
610 | } |
||
611 | } |
||
612 | } |
||
613 | } |
||
614 | |||
615 | |||
616 | public Font FitFont(Graphics g , String fontname , int fontsize){ |
||
617 | String maxstring=""; |
||
618 | for(int p = 0 ; p<xlines+4;p++){ |
||
619 | maxstring=maxstring+"5"; |
||
620 | } |
||
621 | font = new Font(fontname,Font.BOLD,fontsize); |
||
622 | FontMetrics fm = g.getFontMetrics(font); |
||
623 | if(fm.stringWidth(maxstring) > xsize){ |
||
624 | boolean does_not_fit = true; |
||
625 | while(fontsize > 4 && does_not_fit){ |
||
626 | fontsize = fontsize - 1; |
||
627 | font = new Font(fontname,Font.BOLD,fontsize); |
||
628 | fm = g.getFontMetrics(font); |
||
629 | if(fm.stringWidth(maxstring) < xsize){ |
||
630 | does_not_fit = false; |
||
631 | } |
||
632 | } |
||
633 | System.out.println("xsize ("+xsize+") of applet too small...I've adjusted fontsize to "+fontsize); |
||
634 | } |
||
635 | fontheight =(int) (0.6*fm.getHeight()); |
||
636 | if( fontheight > ystep ){ // fonts will overlap !! decrease ygrid... |
||
637 | System.out.println("I will decrease number of horizontal lines: fonts will overlap...\nuse more xlines to overcome this."); |
||
638 | ystep = fontheight; |
||
639 | ylines = (int) (ysize / fontheight); |
||
640 | if(ylines < 2){ylines = 2;} |
||
641 | } |
||
642 | fontwidth = fm.stringWidth("+"); |
||
643 | return font; |
||
644 | } |
||
645 | |||
646 | public int getInt(String s, int i){ |
||
647 | String s1 = getParameter(s); |
||
648 | if( s1 != null && s1.length()!=0){ |
||
649 | try{ |
||
650 | i = Integer.parseInt(s1); |
||
651 | } |
||
652 | catch(Exception exception){System.out.println(" can not parse parameter "+s);} |
||
653 | } |
||
654 | return i; |
||
655 | } |
||
656 | |||
657 | public boolean getBool(String s, boolean flag){ |
||
658 | String s1 = getParameter(s); |
||
659 | if(s1 != null){ |
||
660 | if(s1.equals("1") || s1.equalsIgnoreCase("yes") || s1.equalsIgnoreCase("true")) |
||
661 | return true; |
||
662 | if(s1.equals("0") || s1.equalsIgnoreCase("no") || s1.equalsIgnoreCase("false")) |
||
663 | return false; |
||
664 | } |
||
665 | return flag; |
||
666 | } |
||
667 | |||
668 | public Color colorParam(String s, Color color){ |
||
669 | String s1 = getParameter(s); |
||
670 | if(s1 != null && s1.length() != 0){ |
||
671 | s1 = replace(s1,":", ","); |
||
672 | s1 = replace(s1,";", ","); |
||
673 | if( s1.indexOf(',') > 0 ){ |
||
674 | StringTokenizer stringtokenizer = new StringTokenizer(s1, ","); |
||
675 | int i = stringtokenizer.countTokens(); |
||
676 | if(i < 3 || i > 4){ return color;} |
||
677 | int ai[] = new int[i + 1]; |
||
678 | for(int j = 0; j < i; j++){ |
||
679 | ai[j] = Integer.parseInt(stringtokenizer.nextToken()); |
||
680 | if(ai[j] > 255 || ai[j] < 0){ ai[j] = 0;} |
||
681 | } |
||
682 | if(i == 3){ |
||
683 | color = new Color(ai[0], ai[1], ai[2]); |
||
684 | } |
||
685 | else |
||
686 | { |
||
687 | color = new Color(ai[0], ai[1], ai[2], ai[3]); |
||
688 | } |
||
689 | } |
||
690 | else |
||
691 | { |
||
692 | try{ color = Color.decode( s1 );}catch(Exception e){System.out.println("could not parse "+s);} |
||
693 | return color; |
||
694 | } |
||
695 | } |
||
696 | return color; |
||
697 | } |
||
698 | |||
699 | public void prepaint(){ // all "static" components are painted "once" |
||
700 | backg.setColor(bgcolor); |
||
701 | backg.fillRect(0,0,xsize,ysize); |
||
702 | if(showgrid){ |
||
703 | backg.setColor(gridcolor); |
||
704 | backg.setStroke( new BasicStroke(1)); |
||
705 | for(int x=0; x<xsize;x=x+xstep){ |
||
706 | backg.drawLine(x,ystep,x,ysize); |
||
707 | } |
||
708 | for(int y=ystep;y<ysize;y=y+ystep){ |
||
709 | backg.drawLine(0,y,xsize,y); |
||
710 | } |
||
711 | } |
||
712 | reverse=false; |
||
713 | backg.setFont(font); |
||
714 | for( int i = 0 ; i < objcnt; i++){ |
||
715 | if (objects.elementAt(i) instanceof GridLine){ |
||
716 | backg.setStroke( new BasicStroke(linewidth)); |
||
717 | backg.setColor(((GridLine)objects.elementAt(i)).getColor()); |
||
718 | backg.drawLine( |
||
719 | ((GridLine)objects.elementAt(i)).getX1(), |
||
720 | ((GridLine)objects.elementAt(i)).getY1(), |
||
721 | ((GridLine)objects.elementAt(i)).getX2(), |
||
722 | ((GridLine)objects.elementAt(i)).getY2() |
||
723 | ); |
||
724 | if(right){ |
||
725 | backg.drawString( |
||
726 | ((GridLine)objects.elementAt(i)).getText(), |
||
727 | ((GridLine)objects.elementAt(i)).getX2()+linewidth, |
||
728 | ((GridLine)objects.elementAt(i)).getY2()+(fontheight-linewidth)/2 |
||
729 | ); |
||
730 | } |
||
731 | else |
||
732 | { |
||
733 | backg.drawString( |
||
734 | ((GridLine)objects.elementAt(i)).getText(), |
||
735 | ((GridLine)objects.elementAt(i)).getX1()-linewidth-fontwidth, |
||
736 | ((GridLine)objects.elementAt(i)).getY2()+(fontheight-linewidth)/2 |
||
737 | ); |
||
738 | } |
||
739 | if(i == objcnt - 1){ |
||
740 | reverse= ((GridLine)objects.elementAt(i)).isSegment(); |
||
741 | } |
||
742 | } |
||
743 | } |
||
744 | for( int i = 0 ;i < pointcnt ; i++){ |
||
745 | if (decimalpoints.elementAt(i) instanceof DecimalPoint){ |
||
746 | int l = ((DecimalPoint)decimalpoints.elementAt(i)).getD(); |
||
747 | backg.setStroke( new BasicStroke(l)); |
||
748 | backg.setColor(pencolor); |
||
749 | backg.fillOval( |
||
750 | xstep*(((DecimalPoint)decimalpoints.elementAt(i)).getX()) - pointsize, |
||
751 | ystep*(1+((DecimalPoint)decimalpoints.elementAt(i)).getY()) - pointsize, |
||
752 | l, |
||
753 | l |
||
754 | ); |
||
755 | } |
||
756 | } |
||
757 | backg.setColor(scribling_rowcolor); |
||
758 | for(int x = 0 ; x <= xlines ; x++){ |
||
759 | backg.fillRect(x*xstep,ystep,xstep,ystep); //scribling row |
||
760 | } |
||
761 | |||
762 | backg.setColor(exercisecolor); |
||
763 | for(int x=0;x <= xlines ;x++){ |
||
764 | for(int y=0;y <= ylines ;y++){ |
||
765 | if(!Editable[x][y]){ |
||
766 | backg.drawString(charArray[x][y],x*xstep,(y+1)*ystep); |
||
767 | } |
||
768 | } |
||
769 | } |
||
770 | } |
||
771 | |||
772 | public void update(Graphics g){ |
||
773 | prepaint(); |
||
774 | paintComponent(g); |
||
775 | } |
||
776 | |||
777 | public void paint(Graphics g){ |
||
778 | update(g); |
||
779 | } |
||
780 | |||
781 | public void paintComponent(Graphics g){ |
||
782 | Graphics2D g2 = (Graphics2D) g; |
||
783 | g2.drawImage(bg,0,0,this); |
||
784 | g2.setFont(font); |
||
785 | reverse=false; |
||
786 | for( int i = 0 ; i < objcnt; i++){ |
||
787 | if (objects.elementAt(i) instanceof GridLine){ |
||
788 | if( ((GridLine)objects.elementAt(i)).getEdit() ){ |
||
789 | backg.setStroke( new BasicStroke(linewidth)); |
||
790 | backg.setColor(((GridLine)objects.elementAt(i)).getColor()); |
||
791 | backg.drawLine( |
||
792 | ((GridLine)objects.elementAt(i)).getX1(), |
||
793 | ((GridLine)objects.elementAt(i)).getY1(), |
||
794 | ((GridLine)objects.elementAt(i)).getX2(), |
||
795 | ((GridLine)objects.elementAt(i)).getY2() |
||
796 | ); |
||
797 | if(right){ |
||
798 | backg.drawString( |
||
799 | ((GridLine)objects.elementAt(i)).getText(), |
||
800 | ((GridLine)objects.elementAt(i)).getX2()+linewidth, // ---- + |
||
801 | ((GridLine)objects.elementAt(i)).getY2()+(fontheight-linewidth)/2 |
||
802 | ); |
||
803 | } |
||
804 | else //french |
||
805 | { |
||
806 | backg.drawString( |
||
807 | ((GridLine)objects.elementAt(i)).getText(), |
||
808 | ((GridLine)objects.elementAt(i)).getX1()-linewidth-fontwidth, // + ---- |
||
809 | ((GridLine)objects.elementAt(i)).getY2()+(fontheight-linewidth)/2 |
||
810 | ); |
||
811 | |||
812 | } |
||
813 | } |
||
814 | if(i == objcnt - 1){ |
||
815 | reverse= ((GridLine)objects.elementAt(i)).isSegment(); |
||
816 | } |
||
817 | } |
||
818 | } |
||
819 | for( int i = 0 ; i < pointcnt; i++){ |
||
820 | if (decimalpoints.elementAt(i) instanceof DecimalPoint){ |
||
821 | int l = ((DecimalPoint)decimalpoints.elementAt(i)).getD(); |
||
822 | backg.setStroke( new BasicStroke(l)); |
||
823 | backg.setColor(pencolor); |
||
824 | backg.fillOval( |
||
825 | xstep*(((DecimalPoint)decimalpoints.elementAt(i)).getX()) - pointsize, |
||
826 | ystep*(1+((DecimalPoint)decimalpoints.elementAt(i)).getY()) - pointsize, |
||
827 | l, |
||
828 | l |
||
829 | ); |
||
830 | } |
||
831 | } |
||
832 | for(int y=1;y <= ylines ;y++){ // start from scribling row |
||
833 | for(int x=0;x <= xlines ;x++){ |
||
834 | if(Marked[x][y]){ |
||
835 | g2.setColor(marked_color); |
||
836 | g2.fillRect(x*xstep,y*ystep,xstep,ystep); |
||
837 | Marked[x][y]=false; |
||
838 | } |
||
839 | if(Editable[x][y]){ |
||
840 | if( y == 1){ // scribling row |
||
841 | g2.setColor(scribling_pencolor); |
||
842 | } |
||
843 | else |
||
844 | { |
||
845 | g2.setColor(pencolor); |
||
846 | } |
||
847 | g2.drawString(charArray[x][y],x*xstep,(y+1)*ystep); |
||
848 | } |
||
849 | } |
||
850 | } |
||
851 | |||
852 | } |
||
853 | |||
854 | public synchronized void mousePressed(MouseEvent evt){ |
||
855 | int x = evt.getX();int y = evt.getY(); |
||
856 | boolean xfound=false,yfound=false; |
||
857 | for(int p=0 ; p < xsize ; p = p + xstep){ |
||
858 | if(x > p && x < p + xstep ){ |
||
859 | xindex = (int) x/xstep; |
||
860 | xfound=true; |
||
861 | } |
||
862 | } |
||
863 | for(int p=ystep ; p < ysize ; p = p + ystep){ |
||
864 | if(y > p && y < p + ystep ){ |
||
865 | yindex = (int) y/ystep ; |
||
866 | yfound=true; |
||
867 | } |
||
868 | } |
||
869 | if(xfound && yfound){ |
||
870 | Marked[xindex][yindex] = true; |
||
871 | repaint(); |
||
872 | } |
||
873 | } |
||
874 | public void mouseWheelMoved(MouseWheelEvent evt){ |
||
875 | int d = evt.getWheelRotation(); |
||
876 | if(d < 0){ |
||
877 | yindex--; |
||
878 | if(yindex < 1){yindex = 1;} |
||
879 | Marked[xindex][yindex] = true; |
||
880 | } |
||
881 | else |
||
882 | { |
||
883 | yindex++; |
||
884 | if(yindex > ylines ){yindex = ylines ;} |
||
885 | Marked[xindex][yindex] = true; |
||
886 | } |
||
887 | repaint(); |
||
888 | } |
||
889 | |||
890 | public synchronized void mouseDragged(MouseEvent evt){ |
||
891 | int x =(int) (evt.getX())/xstep; |
||
892 | int y =(int) (evt.getY())/ystep; |
||
893 | if(x>=0 && y>=1 && x<=xlines && y<=ylines){ |
||
894 | if(Editable[x][y]){ // only delete if editable |
||
895 | Marked[x][y] = true; |
||
896 | charArray[x][y]=""; |
||
897 | deleteDecimalPoint(x,y); |
||
898 | marked_color=deletecolor; |
||
899 | xindex = x; |
||
900 | yindex = y; |
||
901 | repaint(); |
||
902 | } |
||
903 | } |
||
904 | } |
||
905 | |||
906 | public synchronized void mouseReleased(MouseEvent evt){} |
||
907 | public void mouseEntered(MouseEvent evt){requestFocus();} |
||
908 | public void mouseExited(MouseEvent evt){} |
||
909 | public void mouseMoved(MouseEvent evt){requestFocus();} |
||
910 | public void mouseClicked(MouseEvent evt){ |
||
911 | int x =(int) (evt.getX())/xstep; |
||
912 | int y =(int) (evt.getY())/ystep; |
||
913 | if(x>=0 && y>=0 && x<=xlines && y<=ylines){ |
||
914 | if(Editable[x][y]){ |
||
915 | xindex = x;yindex = y; |
||
916 | Marked[xindex][yindex] = true; |
||
917 | repaint(); |
||
918 | } |
||
919 | } |
||
920 | } |
||
921 | public int[] ForbiddenKeys={16,17,18,19,20,27,112,113,114,115,116,117,118,119,120,145,154,155}; |
||
922 | |||
923 | public void keyPressed(KeyEvent e){ |
||
924 | int key = e.getKeyCode(); |
||
925 | //System.out.println("key="+key); |
||
926 | for(int i = 0 ; i < 18 ; i++){ |
||
927 | if(key == ForbiddenKeys[i]){return;} |
||
928 | } |
||
929 | ProcessKey( key, Character.toString(e.getKeyChar()) ); |
||
930 | repaint(); |
||
931 | } |
||
932 | |||
933 | public void keyTyped(KeyEvent e ) {} |
||
934 | public void keyReleased(KeyEvent e){} |
||
935 | |||
936 | public void ProcessKey(int key,String c){ |
||
937 | if(key == 46 || key == 44){if(Editable[xindex][yindex] == true){if(reverse){drawPoint(xindex+1,yindex,pointsize,true);}else{drawPoint(xindex,yindex,pointsize,true);}Marked[xindex][yindex] = true;}} |
||
938 | else |
||
939 | if(key == 32){ // space |
||
940 | xindex++;; |
||
941 | if( xindex > xlines - 1){ |
||
942 | xindex = 0; |
||
943 | yindex++; |
||
944 | if(yindex > ylines ){yindex = ylines;} |
||
945 | } |
||
946 | Marked[xindex][yindex] = true; |
||
947 | } |
||
948 | else |
||
949 | if(key == 10){ // enter -> newline : starts under the first char of previous line |
||
950 | int[] word = findLastWordLength(); |
||
951 | yindex++; |
||
952 | if(reverse && left_to_right == false ){xindex = word[2];}else{xindex = word[1];} |
||
953 | if(yindex > ylines ){yindex = ylines;} |
||
954 | Marked[xindex][yindex] = true; |
||
955 | } |
||
956 | else |
||
957 | if(key == 37){ // leftarrow |
||
958 | xindex--; |
||
959 | if(xindex < 0){xindex = xlines; |
||
960 | yindex--; |
||
961 | if(yindex < 1){yindex = 1;}// not smaller than 1 : control button space... |
||
962 | } |
||
963 | Marked[xindex][yindex] = true; |
||
964 | } |
||
965 | else |
||
966 | if(key == 39){ // rightarrow |
||
967 | xindex++; |
||
968 | if( xindex > xlines - 1){ |
||
969 | xindex = 0; |
||
970 | yindex++; |
||
971 | if(yindex > ylines ){yindex = ylines;} |
||
972 | } |
||
973 | Marked[xindex][yindex] = true; |
||
974 | } |
||
975 | else |
||
976 | if( key == 36){// home; |
||
977 | yindex = 1; |
||
978 | xindex = 1; |
||
979 | Marked[xindex][yindex] = true; |
||
980 | } |
||
981 | else |
||
982 | if( key == 35){// end; |
||
983 | yindex = ylines ; |
||
984 | Marked[xindex][yindex] = true; |
||
985 | } |
||
986 | else |
||
987 | if( key == 38 || key == 33){// arrow up |
||
988 | yindex--; |
||
989 | if(yindex < 1){yindex = 1;} |
||
990 | Marked[xindex][yindex] = true; |
||
991 | } |
||
992 | else |
||
993 | if( key == 40 || key == 34 ){// arrow down |
||
994 | yindex++; |
||
995 | if(yindex > ylines ){yindex = ylines ;} |
||
996 | Marked[xindex][yindex] = true; |
||
997 | } |
||
998 | else |
||
999 | if( (key == 8 ) && Editable[xindex][yindex]){//backspace |
||
1000 | charArray[xindex][yindex] = ""; |
||
1001 | deleteDecimalPoint(xindex,yindex); |
||
1002 | xindex--; |
||
1003 | if(xindex < 0){ |
||
1004 | xindex = xlines - 1; |
||
1005 | yindex--; |
||
1006 | if(yindex < 1){ yindex = 1;} |
||
1007 | } |
||
1008 | Marked[xindex][yindex] = true; |
||
1009 | } |
||
1010 | else |
||
1011 | if( ( key == 127 ) && Editable[xindex][yindex]){// delete |
||
1012 | charArray[xindex][yindex] = ""; |
||
1013 | Marked[xindex][yindex] = true; |
||
1014 | deleteDecimalPoint(xindex,yindex); |
||
1015 | } |
||
1016 | else |
||
1017 | { |
||
1018 | if(Editable[xindex][yindex]){ |
||
1019 | charArray[xindex][yindex] = c; |
||
1020 | if(reverse && left_to_right == false ){ |
||
1021 | if(xindex < xlines ){ |
||
1022 | xindex = xindex - 1; |
||
1023 | if (xindex<0 ){ |
||
1024 | int[] pos = findLastWordLength(); |
||
1025 | xindex = pos[2]; |
||
1026 | yindex++; |
||
1027 | if( yindex > ylines ){ yindex = ylines;} |
||
1028 | } |
||
1029 | } |
||
1030 | } |
||
1031 | else |
||
1032 | { |
||
1033 | if(xindex < xlines ){ |
||
1034 | xindex = xindex + 1; |
||
1035 | if (xindex>=xlines ){ |
||
1036 | int[] pos = findLastWordLength(); |
||
1037 | xindex = pos[1]; |
||
1038 | yindex++; |
||
1039 | if( yindex > ylines ){ yindex = ylines;} |
||
1040 | } |
||
1041 | } |
||
1042 | } |
||
1043 | Marked[xindex][yindex] = true; |
||
1044 | } |
||
1045 | |||
1046 | } |
||
1047 | marked_color = markcolor; |
||
1048 | } |
||
1049 | |||
1050 | public void Clear(){ |
||
1051 | for(int x = 0; x < xlines+1; x++){ |
||
1052 | for(int y = 0; y < ylines+1 ; y++){ |
||
1053 | if(Editable[x][y]){ // only clear if editable |
||
1054 | charArray[x][y]=""; |
||
1055 | Marked[x][y]=false; |
||
1056 | } |
||
1057 | } |
||
1058 | } |
||
1059 | repaint(); |
||
1060 | } |
||
1061 | |||
1062 | public int[] findLastWordLength(){ |
||
1063 | int[] word = new int[4]; |
||
1064 | int cnt;int thisline=0;int max=0; |
||
1065 | for(int y = 0 ; y < ylines ; y++){ |
||
1066 | cnt=0; |
||
1067 | for(int x=0 ; x < xlines ; x++){ |
||
1068 | if(charArray[x][y] != ""){cnt++;} |
||
1069 | } |
||
1070 | if(cnt>0){ |
||
1071 | thisline = y; |
||
1072 | if( cnt > max ){ max = cnt;} |
||
1073 | } |
||
1074 | } |
||
1075 | int begin=0; |
||
1076 | int end=xlines; |
||
1077 | for(int x = 0 ; x<xlines;x++){ // from left to word |
||
1078 | if(charArray[x][thisline] != "" ){begin = x;x=xlines;} |
||
1079 | } |
||
1080 | for(int x = xlines - 1 ; x >= 0;x--){//from right to word |
||
1081 | if(charArray[x][thisline] != "" ){ end = x; x=-1;} |
||
1082 | } |
||
1083 | word[0] = thisline; |
||
1084 | word[1] = begin; |
||
1085 | word[2] = end; |
||
1086 | word[3] = max; |
||
1087 | return word; |
||
1088 | } |
||
1089 | |||
1090 | |||
1091 | public String replace(String source, String pattern, String replace){ |
||
1092 | if ( source!=null && pattern.length()!=0 ){ |
||
1093 | final int len = pattern.length(); |
||
1094 | StringBuffer sb = new StringBuffer(); |
||
1095 | int found = -1; |
||
1096 | int start = 0; |
||
1097 | while( (found = source.indexOf(pattern, start) ) != -1) { |
||
1098 | sb.append(source.substring(start, found)); |
||
1099 | sb.append(replace); |
||
1100 | start = found + len; |
||
1101 | } |
||
1102 | sb.append(source.substring(start)); |
||
1103 | return sb.toString(); |
||
1104 | } |
||
1105 | else return ""; |
||
1106 | } |
||
1107 | |||
1108 | public void deleteAllLines(){ |
||
1109 | int s = objcnt - 1; |
||
1110 | for( int i = s ; i >=0; i--){ |
||
1111 | if(EditableObject[i]){ |
||
1112 | objects.removeElementAt(i); |
||
1113 | objcnt--; |
||
1114 | } |
||
1115 | } |
||
1116 | repaint(); |
||
1117 | } |
||
1118 | |||
1119 | public void deleteLine(){ |
||
1120 | if(objcnt <= 0){objcnt = 0; return;} |
||
1121 | if( (EditableObject[objcnt - 1]) == true){ |
||
1122 | try{ |
||
1123 | objcnt--; |
||
1124 | objects.removeElementAt(objcnt); |
||
1125 | repaint(); |
||
1126 | } |
||
1127 | catch(Exception e){System.out.println("can not remove line ... objcnt = "+objcnt+"\nerror : "+e);} |
||
1128 | } |
||
1129 | } |
||
1130 | |||
1131 | public void deleteAllPoints(){ |
||
1132 | int m = pointcnt - 1; |
||
1133 | for( int i = m ; i >=0; i--){ |
||
1134 | if( (((DecimalPoint)decimalpoints.elementAt(i)).getEditable()) == true ){ |
||
1135 | decimalpoints.removeElementAt(i); |
||
1136 | pointcnt--; |
||
1137 | } |
||
1138 | } |
||
1139 | repaint(); |
||
1140 | } |
||
1141 | |||
1142 | public int findPoint(int y){ // find the x- location of a decimal point at line y : only 1 point allowed... |
||
1143 | for(int i = 0 ; i<pointcnt;i++){ |
||
1144 | if( (DecimalPoint)decimalpoints.elementAt(i) != null ){ |
||
1145 | if( (((DecimalPoint)decimalpoints.elementAt(i)).getY()) == y ){ |
||
1146 | return (int) (((DecimalPoint)decimalpoints.elementAt(i)).getX()); |
||
1147 | } |
||
1148 | } |
||
1149 | } |
||
1150 | return -1; |
||
1151 | } |
||
1152 | |||
1153 | public void deleteDecimalPoint(int x,int y){ |
||
1154 | for( int i = 0 ; i < pointcnt; i++){ |
||
1155 | if( |
||
1156 | (((DecimalPoint)decimalpoints.elementAt(i)).getX()) == x |
||
1157 | && |
||
1158 | (((DecimalPoint)decimalpoints.elementAt(i)).getY()) == y |
||
1159 | && |
||
1160 | (((DecimalPoint)decimalpoints.elementAt(i)).getEditable()) == true |
||
1161 | ){ |
||
1162 | try{ |
||
1163 | decimalpoints.removeElementAt(i); |
||
1164 | pointcnt--; |
||
1165 | repaint(); |
||
1166 | return; |
||
1167 | }catch(Exception e){System.out.println("poincnt "+pointcnt+"\terror="+e);} |
||
1168 | } |
||
1169 | } |
||
1170 | } |
||
1171 | |||
1172 | public void destroy() {} |
||
1173 | |||
1174 | public void start(){} |
||
1175 | |||
1176 | public void drawPoint(int x, int y, int pointsize,boolean can_be_edited){ |
||
1177 | try{ |
||
1178 | decimalpoints.add(new DecimalPoint(x,y,pointsize,can_be_edited)); |
||
1179 | pointcnt++; |
||
1180 | } |
||
1181 | catch(Exception e){System.out.println(e);} |
||
1182 | } |
||
1183 | |||
1184 | public void drawLine(int x1,int y1,int x2,int y2,Color c,String s, boolean edit , boolean is_segment){ |
||
1185 | try{ |
||
1186 | objects.add(new GridLine(x1,y1,x2,y2,c,s,edit,is_segment)); |
||
1187 | objcnt++; |
||
1188 | } |
||
1189 | catch(Exception e){System.out.println(e);} |
||
1190 | } |
||
1191 | |||
1192 | public void actionPerformed(ActionEvent e){ |
||
1193 | String command = e.getActionCommand(); |
||
1194 | if(command.equals(clear_all)){ |
||
1195 | Clear(); |
||
1196 | deleteAllLines(); |
||
1197 | deleteAllPoints(); |
||
1198 | } |
||
1199 | else |
||
1200 | { |
||
1201 | if(command.equals(line_plus)){ |
||
1202 | int[] word = findLastWordLength(); |
||
1203 | if(word[0] > 1){ |
||
1204 | drawLine(word[1]*xstep,(word[0]+1)*ystep,(word[2]+1)*xstep,(word[0]+1)*ystep,linecolor,"+",true,true);//+ |
||
1205 | } |
||
1206 | } |
||
1207 | else |
||
1208 | { |
||
1209 | if(command.equals(line_min)){ |
||
1210 | int[] word = findLastWordLength(); |
||
1211 | if(word[0] > 1){ |
||
1212 | drawLine(word[1]*xstep,(word[0]+1)*ystep,(word[2]+1)*xstep,(word[0]+1)*ystep,linecolor,"-",true,true);//+ |
||
1213 | } |
||
1214 | } |
||
1215 | else |
||
1216 | { |
||
1217 | if(command.equals(line_div)){ |
||
1218 | int[] word = findLastWordLength(); |
||
1219 | if(word[0] > 1){ |
||
1220 | drawLine(word[1]*xstep,(word[0]+1)*ystep,(word[2]+1)*xstep,(word[0]+1)*ystep,linecolor,"\u00F7",true,true);//+ |
||
1221 | } |
||
1222 | } |
||
1223 | else |
||
1224 | { |
||
1225 | if(command.equals(line_times)){ |
||
1226 | int[] word = findLastWordLength(); |
||
1227 | if(word[0] > 1){ |
||
1228 | drawLine(word[1]*xstep,(word[0]+1)*ystep,(word[2]+1)*xstep,(word[0]+1)*ystep,linecolor,"\u00D7",true,true); |
||
1229 | } |
||
1230 | } |
||
1231 | else |
||
1232 | { |
||
1233 | if(command.equals(delete_line)){ |
||
1234 | deleteLine(); |
||
1235 | } |
||
1236 | } |
||
1237 | } |
||
1238 | } |
||
1239 | } |
||
1240 | } |
||
1241 | repaint(); |
||
1242 | } |
||
1243 | |||
1244 | public void getButtons(){ |
||
1245 | String param = getParameter("buttons"); |
||
1246 | Panel panel; |
||
1247 | if( param != null && param.length()>0){ |
||
1248 | panel = InvulGridPanel(param); |
||
1249 | } |
||
1250 | else |
||
1251 | { |
||
1252 | panel = InvulGridPanel("none"); |
||
1253 | } |
||
1254 | cp = getContentPane(); |
||
1255 | cp.add(panel); |
||
1256 | } |
||
1257 | |||
1258 | public Panel InvulGridPanel(String param){ |
||
1259 | Panel panel = new Panel(); |
||
1260 | setLayout(new FlowLayout()); |
||
1261 | Button s; |
||
1262 | if(!param.equals("none")){ |
||
1263 | StringTokenizer label = new StringTokenizer(param, ","); |
||
1264 | int m = label.countTokens();String operator=""; |
||
1265 | String txt=""; |
||
1266 | for(int i = 0; i < m ;i++){ |
||
1267 | operator = label.nextToken(); |
||
1268 | if(operator.equals("+")) txt = line_plus; |
||
1269 | else |
||
1270 | if(operator.equals("-")) txt = line_min; |
||
1271 | else |
||
1272 | if(operator.equals(":")) txt = line_div; |
||
1273 | else |
||
1274 | if(operator.equals("x")) txt = line_times; |
||
1275 | s = new Button(txt); |
||
1276 | s.addActionListener(this); |
||
1277 | add(s); |
||
1278 | } |
||
1279 | s = new Button(delete_line); |
||
1280 | s.addActionListener(this); |
||
1281 | add(s); |
||
1282 | } |
||
1283 | s = new Button(clear_all); |
||
1284 | s.addActionListener(this); |
||
1285 | add(s); |
||
1286 | return panel; |
||
1287 | } |
||
1288 | |||
1289 | public static void main(String[] args) { |
||
1290 | run(new InvulGrid(), 300, 300); |
||
1291 | } |
||
1292 | |||
1293 | public static void run(JApplet applet, int width, int height) { |
||
1294 | JFrame frame = new JFrame(); |
||
1295 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
||
1296 | frame.getContentPane().add(applet); |
||
1297 | applet.init(); |
||
1298 | applet.start(); |
||
1299 | frame.setVisible(true); |
||
1300 | } |
||
1301 | |||
1302 | |||
1303 | } |
||
1304 | |||
1305 | |||
1306 | class DecimalPoint { |
||
1307 | int x,y; |
||
1308 | int linewidth; |
||
1309 | boolean editable; |
||
1310 | |||
1311 | public DecimalPoint(int x,int y, int linewidth,boolean editable){ |
||
1312 | this.x = x; |
||
1313 | this.y = y; |
||
1314 | this.linewidth = linewidth; |
||
1315 | this.editable = editable; |
||
1316 | } |
||
1317 | |||
1318 | public int getX(){return x;} |
||
1319 | public int getY(){return y;} |
||
1320 | public int getD(){return linewidth;} |
||
1321 | public boolean getEditable(){return editable;} |
||
1322 | } |
||
1323 | |||
1324 | class GridLine { |
||
1325 | int x1,y1,x2,y2; |
||
1326 | Color color; |
||
1327 | String txt; |
||
1328 | boolean edit; |
||
1329 | boolean segment; |
||
1330 | |||
1331 | public GridLine(int x1, int y1 , int x2 , int y2, Color color, String txt,boolean edit, boolean segment){ |
||
1332 | this.x1 = x1; |
||
1333 | this.y1 = y1; |
||
1334 | this.x2 = x2; |
||
1335 | this.y2 = y2; |
||
1336 | this.color = color; |
||
1337 | this.txt = txt; |
||
1338 | this.edit = edit; |
||
1339 | this.segment = segment; |
||
1340 | } |
||
1341 | public int getX1() { return x1; } |
||
1342 | public int getY1() { return y1; } |
||
1343 | public int getX2() { return x2; } |
||
1344 | public int getY2() { return y2; } |
||
1345 | public Color getColor(){ return color;} |
||
1346 | public String getText() { return txt;} |
||
1347 | public boolean getEdit() { return edit;} |
||
1348 | public boolean isSegment() { return segment;} |
||
1349 | } |
||
1350 |