source: ps2launchargs/source/uLaunchELF/editor.c@ 1194

Last change on this file since 1194 was 1101, checked in by iritscen, 7 years ago

Added following to ps2launchargs:\n-Source code.\n-DLL needed to run ps2client.\n-Instructions for building uLaunchELF.

  • Property svn:executable set to *
File size: 57.0 KB
RevLine 
[1101]1//--------------------------------------------------------------
2//File name: editor.c
3//--------------------------------------------------------------
4#include "launchelf.h"
5
6enum
7{
8 COL_NORM_BG = GS_SETREG_RGBA(160,160,160,0),
9 COL_NORM_TEXT = GS_SETREG_RGBA(0,0,0,0),
10 COL_MARK_BG = GS_SETREG_RGBA(0,40,160,0),
11 COL_MARK_TEXT = GS_SETREG_RGBA(160,160,160,0),
12 COL_CUR_INSERT = GS_SETREG_RGBA(0,160,0,0),
13 COL_CUR_OVERWR = GS_SETREG_RGBA(160,0,0,0),
14 COL_LINE_END = GS_SETREG_RGBA(160,80,0,0),
15 COL_TAB = GS_SETREG_RGBA(0,0,160,0),
16 COL_TEXT_END = GS_SETREG_RGBA(0,160,160,0),
17 COL_dummy
18};
19
20enum
21{
22 NEW,
23 OPEN,
24 CLOSE,
25 SAVE,
26 SAVE_AS,
27 WINDOWS,
28 EXIT,
29 NUM_MENU
30}; // Menu Fonction.
31
32enum
33{
34 MARK_START,
35 MARK_ON,
36 MARK_COPY,
37 MARK_CUT,
38 MARK_IN,
39 MARK_OUT,
40 MARK_TMP,
41 MARK_SIZE,
42 MARK_PRINT,
43 MARK_COLOR,
44 NUM_MARK
45}; // Marking Fonction/State.
46
47enum
48{
49 CREATED,
50 OPENED,
51 SAVED,
52 NUM_STATE
53}; // Windowing State.
54
55#define OTHER 1 // CR/LF Return Text Mode, 'All Normal System'.
56#define UNIX 2 // CR Return Text Mode, Unix.
57#define MAC 3 // LF Return Text Mode, Mac.
58
59#define TMP 10 // Temp Buffer For Add / Remove Char.
60#define EDIT 11 // Edit Buffer For Copy / Cut / Paste.
61
62static u8 *TextBuffer[12]; // Text Buffers, 10 Windows Max + 1 TMP + 1 EDIT. See above.
63static int Window[10][NUM_STATE], // Windowing System, 10 Windows Max.
64 TextMode[10], // Text Mode, UNIX, MAC, OTHER.
65 TextSize[10], // Text Size, 10 Windows Max.
66 Editor_nRowsWidth[MAX_ENTRY], // Current Window, Char Number For Each Rows. (MAX_ENTRY???)
67 Mark[NUM_MARK], // Marking System,(Mark, Copy, Cut, Paste, Delete),Work From 1 Window To An Other.
68 Active_Window, // Activated Windows Number.
69 Num_Window, // Opened Windows Count.
70 Editor_Cur, // Text Cursor.
71 Tmp_Cur, // Temp Cursor For Rules Calculations.
72 Editor_nChar, // Current Window, Total Char Number.
73 Editor_nRowsNum, // Current Window, Total Rows Number.
74 Editor_nCharRows, // Current Window, Char Number Per Rows Height.
75 Editor_nRowsTop, // Current Window, Rows Number Above Top Screen For Rules Calculations.
76 Rows_Num, // Rows Number Feeting In Screen Height.
77 Rows_Width, // Char Number Feeting In Screen Width.
78 Top_Width, // Char Number In Rows Above Top Screen.
79 Top_Height, // Current Window Rows Number Above Top Screen.
80 Editor_Insert, // Setting Insert On/Off.
81 Editor_RetMode, // Setting Insert On/Off.
82 Editor_Home, // Goto Line Home.
83 Editor_End, // Goto Line End
84 Editor_PushRows, // Push 1 Row Height Up(+1) Or Down(-1), Use For Page Up/Down Too.
85 Editor_TextEnd, // Set To 1 When '\0' Char Is Found Tell Text End.
86 KeyBoard_Cur, // Virtual KeyBoard Cursor.
87 KeyBoard_Active, // Virtual KeyBoard Activated Or Not.
88 del1, del2, del3, del4, // Deleted Chars Different Cases.
89 ins1, ins2, ins3, ins4, ins5, // Added Chars Different Cases.
90 t; // Text Cursor Timer.
91static char Path[10][MAX_PATH]; // File Path For Each Opened Windows. 10 Max.
92
93static const int WFONTS=20, // Virtual KeyBoard Width.
94 HFONTS=5; // Virtual KeyBoard Height.
95static char *KEY= " 01ABCDEFGHIJKLM:; "
96 " 23NOPQRSTUVWXYZ., "
97 " 45abcdefghijklm() "
98 " 67nopqrstuvwxyz[] "
99 " 89+-=!# $%&@_^' "; // Virtual KeyBoard Matrix.
100
101//--------------------------------------------------------------
102int MenuEditor(void)
103{
104 u64 color;
105 char enable[NUM_MENU], tmp[64];
106 int x, y, i, Menu_Sel;
107 int event, post_event=0;
108
109 int menu_len=strlen(LNG(New))>strlen(LNG(Open))?
110 strlen(LNG(New)):strlen(LNG(Open));
111 menu_len=strlen(LNG(Close))>menu_len? strlen(LNG(Close)):menu_len;
112 menu_len=strlen(LNG(Save))>menu_len? strlen(LNG(Save)):menu_len;
113 menu_len=strlen(LNG(Save_As))>menu_len? strlen(LNG(Save_As)):menu_len;
114 menu_len=strlen(LNG(Windows))>menu_len? strlen(LNG(Windows)):menu_len;
115 menu_len=strlen(LNG(Exit))>menu_len? strlen(LNG(Exit)):menu_len;
116
117 int menu_ch_w = menu_len+1; //Total characters in longest menu string.
118 int menu_ch_h = NUM_MENU; //Total number of menu lines.
119 int mSprite_Y1 = 64; //Top edge of sprite.
120 int mSprite_X2 = SCREEN_WIDTH-35; //Right edge of sprite.
121 int mSprite_X1 = mSprite_X2-(menu_ch_w+3)*FONT_WIDTH; //Left edge of sprite
122 int mSprite_Y2 = mSprite_Y1+(menu_ch_h+1)*FONT_HEIGHT; //Bottom edge of sprite
123
124 memset(enable, TRUE, NUM_MENU);
125
126 if(!Window[Active_Window][OPENED]){
127 enable[CLOSE] = FALSE;
128 enable[SAVE] = FALSE;
129 enable[SAVE_AS] = FALSE;
130 }
131 if(Window[Active_Window][CREATED]){
132 enable[SAVE] = FALSE;
133 }
134 if(!Num_Window)
135 enable[WINDOWS] = FALSE;
136
137 for(Menu_Sel=0; Menu_Sel<NUM_MENU; Menu_Sel++)
138 if(enable[Menu_Sel]==TRUE) break;
139
140 event = 1; //event = initial entry.
141 while(1){
142 //Pad response section.
143 waitPadReady(0, 0);
144 if(readpad()){
145 if(new_pad & PAD_UP && Menu_Sel<NUM_MENU){
146 event |= 2; //event |= valid pad command.
147 do{
148 Menu_Sel--;
149 if(Menu_Sel<0) Menu_Sel=NUM_MENU-1;
150 }while(!enable[Menu_Sel]);
151 }else if(new_pad & PAD_DOWN && Menu_Sel<NUM_MENU){
152 event |= 2; //event |= valid pad command.
153 do{
154 Menu_Sel++;
155 if(Menu_Sel==NUM_MENU) Menu_Sel=0;
156 }while(!enable[Menu_Sel]);
157 }else if((new_pad & PAD_TRIANGLE)
158 || (!swapKeys && new_pad & PAD_CROSS)
159 || (swapKeys && new_pad & PAD_CIRCLE) ){
160 return -1;
161 }else if((swapKeys && new_pad & PAD_CROSS)
162 || (!swapKeys && new_pad & PAD_CIRCLE) ){
163 event |= 2; //event |= valid pad command.
164 break;
165 }
166 }
167
168 if(event||post_event){ //NB: We need to update two frame buffers per event.
169
170 //Display section.
171 drawPopSprite(setting->color[0],
172 mSprite_X1, mSprite_Y1,
173 mSprite_X2, mSprite_Y2);
174 drawFrame(mSprite_X1, mSprite_Y1, mSprite_X2, mSprite_Y2, setting->color[1]);
175
176 for(i=0,y=mSprite_Y1+FONT_HEIGHT/2; i<NUM_MENU; i++){
177 if(i==NEW) strcpy(tmp, LNG(New));
178 else if(i==OPEN) strcpy(tmp, LNG(Open));
179 else if(i==CLOSE) strcpy(tmp, LNG(Close));
180 else if(i==SAVE) strcpy(tmp, LNG(Save));
181 else if(i==SAVE_AS) strcpy(tmp, LNG(Save_As));
182 else if(i==WINDOWS) strcpy(tmp, LNG(Windows));
183 else if(i==EXIT) strcpy(tmp, LNG(Exit));
184
185 if(enable[i]) color = setting->color[3];
186 else color = setting->color[1];
187
188 printXY(tmp, mSprite_X1+2*FONT_WIDTH, y, color, TRUE, 0);
189 y+=FONT_HEIGHT;
190 }
191 if(Menu_Sel<NUM_MENU)
192 drawChar(LEFT_CUR, mSprite_X1+FONT_WIDTH, mSprite_Y1+(FONT_HEIGHT/2+Menu_Sel*FONT_HEIGHT), setting->color[3]);
193
194 //Tooltip section.
195 x = SCREEN_MARGIN;
196 y = Menu_tooltip_y;
197 drawSprite(setting->color[0],
198 0, y-1,
199 SCREEN_WIDTH, y+16);
200 if (swapKeys)
201 sprintf(tmp, "ÿ1:%s ÿ0:%s ÿ3:%s", LNG(OK), LNG(Cancel), LNG(Back));
202 else
203 sprintf(tmp, "ÿ0:%s ÿ1:%s ÿ3:%s", LNG(OK), LNG(Cancel), LNG(Back));
204 printXY(tmp, x, y, setting->color[2], TRUE, 0);
205 }//ends if(event||post_event).
206 drawScr();
207 post_event = event;
208 event = 0;
209 }//ends while.
210 return Menu_Sel;
211}//ends menu.
212//--------------------------------------------------------------
213void Virt_KeyBoard_Entry(void)
214{
215 int i, Operation;
216
217 Operation=0;
218
219 if(new_pad & PAD_UP){ // Virtual KeyBoard move up.
220 if(!KeyBoard_Cur)
221 KeyBoard_Cur=WFONTS*(HFONTS-1);
222 else if(KeyBoard_Cur==WFONTS-1)
223 KeyBoard_Cur=WFONTS*HFONTS-1;
224 else if(KeyBoard_Cur>0){
225 if((KeyBoard_Cur-=WFONTS)<0)
226 KeyBoard_Cur=0;
227 }
228 //ends Virtual KeyBoard move up.
229 }else if(new_pad & PAD_DOWN){ // Virtual KeyBoard move down.
230 if(KeyBoard_Cur==WFONTS*HFONTS-1)
231 KeyBoard_Cur=WFONTS-1;
232 else if(KeyBoard_Cur==WFONTS*(HFONTS-1))
233 KeyBoard_Cur=0;
234 else if(KeyBoard_Cur<WFONTS*HFONTS-1){
235 if((KeyBoard_Cur+=WFONTS)>WFONTS*HFONTS-1)
236 KeyBoard_Cur=WFONTS*HFONTS-1;
237 }
238 //ends Virtual KeyBoard move down.
239 }else if(new_pad & PAD_LEFT){ // Virtual KeyBoard move left.
240 if(!KeyBoard_Cur)
241 KeyBoard_Cur=WFONTS*HFONTS-1;
242 else
243 KeyBoard_Cur--;
244 //ends Virtual KeyBoard move left.
245 }else if(new_pad & PAD_RIGHT){ // Virtual KeyBoard move right.
246 if(KeyBoard_Cur==WFONTS*HFONTS-1)
247 KeyBoard_Cur=0;
248 else
249 KeyBoard_Cur++;
250 //ends Virtual KeyBoard move right.
251 }else if(new_pad & PAD_L2){ // Text move left.
252 if(Editor_Cur>0)
253 Editor_Cur--;
254 }else if(new_pad & PAD_R2){ // Text move right.
255 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
256 Editor_Cur++;
257 }else if(new_pad & PAD_SELECT){ // Virtual KeyBoard Exit.
258 Rows_Num += 6;
259 KeyBoard_Active = 0;
260 }else if((!swapKeys && new_pad & PAD_CROSS)
261 || (swapKeys && new_pad & PAD_CIRCLE) ){ // Virtual KeyBoard Backspace
262 if(Editor_Cur>0){
263 if( TextMode[Active_Window]==OTHER
264 && TextBuffer[Active_Window][Editor_Cur]=='\n'
265 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
266 ){
267 Editor_Cur += 1; //Backspace at LF of CRLF must work after LF instead
268 }
269 if(Mark[MARK_ON]){
270 Mark[MARK_OUT]=Editor_Cur;
271 if(Mark[MARK_OUT]<Mark[MARK_IN]){
272 Mark[MARK_TMP]=Mark[MARK_IN];
273 Mark[MARK_IN]=Mark[MARK_OUT];
274 Mark[MARK_OUT]=Mark[MARK_TMP];
275 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
276 goto abort;
277 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
278 del1= -Mark[MARK_SIZE], del2=0, del3= -Mark[MARK_SIZE], del4= -Mark[MARK_SIZE];
279 Mark[MARK_ON]=0;
280 }else if(TextMode[Active_Window]==OTHER
281 && TextBuffer[Active_Window][Editor_Cur-1]=='\n'
282 && Editor_Cur>1
283 && TextBuffer[Active_Window][Editor_Cur-2]=='\r'){
284 del1=-2, del2=0, del3=-2, del4=-2; //Backspace CRLF
285 }else{
286 del1=-1, del2=0, del3=-1, del4=-1; //Backspace single char
287 }
288 Operation=-1;
289 }
290 //ends Virtual KeyBoard Backspace
291 }else if((swapKeys && new_pad & PAD_CROSS)
292 || (!swapKeys && new_pad & PAD_CIRCLE) ){ // Virtual KeyBoard Select.
293 if(!KeyBoard_Cur){ // Virtual KeyBoard MARK.
294 Mark[MARK_ON]=!Mark[MARK_ON];
295 if(Mark[MARK_ON]){
296 if( TextMode[Active_Window]==OTHER
297 && TextBuffer[Active_Window][Editor_Cur]=='\n'
298 && Editor_Cur>0
299 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
300 ){
301 Editor_Cur -= 1; //Marking at LF of CRLF must start at CR instead
302 }
303 if(Mark[MARK_COPY] || Mark[MARK_CUT])
304 free(TextBuffer[EDIT]);
305 Mark[MARK_ON]=1, Mark[MARK_COPY]=0, Mark[MARK_CUT]=0,
306 Mark[MARK_IN]=0, Mark[MARK_OUT]=0, Mark[MARK_TMP]=0,
307 Mark[MARK_SIZE]=0, Mark[MARK_PRINT]=0, Mark[MARK_COLOR]=0;
308 Mark[MARK_IN]=Mark[MARK_OUT]=Editor_Cur;
309 }
310 Mark[MARK_START]=1;
311 //ends Virtual KeyBoard MARK.
312 }else if(KeyBoard_Cur == WFONTS){ // Virtual KeyBoard COPY.
313 if(Mark[MARK_ON]){
314 if( TextMode[Active_Window]==OTHER
315 && TextBuffer[Active_Window][Editor_Cur]=='\n'
316 && Editor_Cur>0
317 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
318 ){
319 Editor_Cur += 1; //Mark end at LF of CRLF must include LF as well
320 }
321 Mark[MARK_OUT]=Editor_Cur;
322 if(Mark[MARK_OUT]<Mark[MARK_IN]){
323 Mark[MARK_TMP]=Mark[MARK_IN];
324 Mark[MARK_IN]=Mark[MARK_OUT];
325 Mark[MARK_OUT]=Mark[MARK_TMP];
326 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
327 goto abort;
328 if(Mark[MARK_COPY] || Mark[MARK_CUT])
329 free(TextBuffer[EDIT]);
330 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
331 TextBuffer[EDIT] = malloc(Mark[MARK_SIZE]+256); // 256 To Avoid Crash 256???
332 for(i=0; i<Mark[MARK_SIZE]; i++)
333 TextBuffer[EDIT][i]=TextBuffer[Active_Window][i+Mark[MARK_IN]];
334 Mark[MARK_COPY]=1, Mark[MARK_CUT]=0, Mark[MARK_ON]=0;
335 }
336 //ends Virtual KeyBoard COPY.
337 }else if(KeyBoard_Cur == 2*WFONTS){ // Virtual KeyBoard CUT.
338 if(Mark[MARK_ON]){
339 if( TextMode[Active_Window]==OTHER
340 && TextBuffer[Active_Window][Editor_Cur]=='\n'
341 && Editor_Cur>0
342 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
343 ){
344 Editor_Cur += 1; //Mark end at LF of CRLF must include LF as well
345 }
346 Mark[MARK_OUT]=Editor_Cur;
347 if(Mark[MARK_OUT]<Mark[MARK_IN]){
348 Mark[MARK_TMP]=Mark[MARK_IN];
349 Mark[MARK_IN]=Mark[MARK_OUT];
350 Mark[MARK_OUT]=Mark[MARK_TMP];
351 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
352 goto abort;
353 if(Mark[MARK_COPY] || Mark[MARK_CUT])
354 free(TextBuffer[EDIT]);
355 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
356 TextBuffer[EDIT] = malloc(Mark[MARK_SIZE]+256); // 256 To Avoid Crash 256???
357 for(i=0; i<Mark[MARK_SIZE]; i++)
358 TextBuffer[EDIT][i]=TextBuffer[Active_Window][i+Mark[MARK_IN]];
359 del1= -Mark[MARK_SIZE], del2=0, del3= -Mark[MARK_SIZE], del4= -Mark[MARK_SIZE];
360 Mark[MARK_CUT]=1, Mark[MARK_COPY]=0, Mark[MARK_ON]=0;
361 Operation=-1;
362 }
363abort:
364 Mark[MARK_TMP]=0; // just for compiler warning.
365 //ends Virtual KeyBoard CUT.
366 }else if(KeyBoard_Cur == 3*WFONTS){ // Virtual KeyBoard PASTE.
367 if( Mark[MARK_COPY] || Mark[MARK_CUT]){
368 if(TextMode[Active_Window]==OTHER && TextBuffer[Active_Window][Editor_Cur]=='\n'){
369 Editor_Cur-=1;
370 Mark[MARK_SIZE]-=1;
371 }
372 ins1=Mark[MARK_SIZE], ins2=Mark[MARK_SIZE], ins3=Mark[MARK_SIZE], ins4=0, ins5=Mark[MARK_SIZE];
373 Operation=1;
374 }
375 //ends Virtual KeyBoard PASTE.
376 }else if(KeyBoard_Cur == 4*WFONTS){ // Virtual KeyBoard HOME.
377 Editor_Home=1;
378 }else if(KeyBoard_Cur == 1){ // Virtual KeyBoard LINE UP.
379 if(Editor_Cur>0)
380 Editor_PushRows++;
381 }else if(KeyBoard_Cur == WFONTS+1){ // Virtual KeyBoard LINE DOWN.
382 if(Editor_Cur<Editor_nChar)
383 Editor_PushRows--;
384 }else if(KeyBoard_Cur == 2*WFONTS+1){ // Virtual KeyBoard PAGE UP.
385 if(Editor_Cur>0)
386 Editor_PushRows += 1*(Rows_Num-1);
387 }else if(KeyBoard_Cur == 3*WFONTS+1){ // Virtual KeyBoard PAGE DOWN.
388 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
389 Editor_PushRows -= 1*(Rows_Num-1);
390 }else if(KeyBoard_Cur == 4*WFONTS+1){ // Virtual KeyBoard END.
391 Editor_End=1;
392 }else if(KeyBoard_Cur == WFONTS-1){ // Virtual KeyBoard INSERT.
393 Editor_Insert = !Editor_Insert;
394 }else if(KeyBoard_Cur == 2*WFONTS-1){ // Virtual KeyBoard Return Mode CR/LF, LF, CR.
395 if((Editor_RetMode++)>=4)
396 Editor_RetMode=OTHER;
397 }else if(KeyBoard_Cur == 5*WFONTS-1){ // Virtual KeyBoard RETURN.
398
399 if( TextMode[Active_Window]==OTHER
400 && TextBuffer[Active_Window][Editor_Cur]=='\n'
401 && Editor_Cur>0
402 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
403 ){
404 Editor_Cur -= 1; //Entry at LF of CRLF must work at CR instead
405 }
406 if(Editor_Insert || TextBuffer[Active_Window][Editor_Cur]=='\0')
407 if(Editor_RetMode==OTHER)
408 ins1=2, ins2=0, ins3=2, ins4=0, ins5=2; //Insert CRLF
409 else
410 ins1=1, ins2=0, ins3=1, ins4=0, ins5=1; //Insert LF/CR
411 else
412 if( TextMode[Active_Window]==OTHER
413 && TextBuffer[Active_Window][Editor_Cur]=='\r'
414 && TextBuffer[Active_Window][Editor_Cur+1]=='\n'
415 ){ //OWrite Return at CRLF
416 if(Editor_RetMode==OTHER)
417 ins1=0, ins2=0, ins3=2, ins4=2, ins5=2; //OWrite CRLF at CRLF
418 else
419 ins1=0, ins2=0, ins3=1, ins4=2, ins5=1; //OWrite LF/CR at CRLF
420 }else{ //OWrite return at normal char
421 if(Editor_RetMode==OTHER)
422 ins1=1, ins2=0, ins3=2, ins4=1, ins5=2; //OWrite CRLF at char
423 else
424 ins1=0, ins2=0, ins3=1, ins4=1, ins5=1; //OWrite LF/CR at char
425 }
426 Operation=2;
427 //ends Virtual KeyBoard RETURN.
428 }else{ // Virtual KeyBoard Any other char + Space + Tabulation.
429 if( TextMode[Active_Window]==OTHER
430 && TextBuffer[Active_Window][Editor_Cur]=='\n'
431 && Editor_Cur>0
432 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
433 ){
434 Editor_Cur -= 1; //Entry at LF of CRLF must work at CR instead
435 }
436 if(Editor_Insert || TextBuffer[Active_Window][Editor_Cur]=='\0'){
437 ins1=1, ins2=0, ins3=1, ins4=0, ins5=1; //Insert char normally
438 }else{
439 if(TextMode[Active_Window]==OTHER
440 && TextBuffer[Active_Window][Editor_Cur]=='\r'
441 && TextBuffer[Active_Window][Editor_Cur+1]=='\n'
442 ){ //OWrite char at CRLF
443 ins1=0, ins2= 0, ins3=1, ins4= 2, ins5= 1; //OWrite at CR of CRLF
444 }else{ //OWrite return at normal char
445 ins1=0, ins2= 0, ins3=1, ins4= 1, ins5= 1; //OWrite normal char
446 }
447 }
448 if(KeyBoard_Cur == 3*WFONTS-1) // Tabulation.
449 Operation=3;
450 else if(KeyBoard_Cur == 4*WFONTS-1) // Space.
451 Operation=4;
452 else // Any other char.
453 Operation=5;
454 }
455 //ends Virtual KeyBoard Select.
456 }
457
458 if(Operation>0){ // Perform Add Char / Paste. Can Be Simplify???
459 TextBuffer[TMP] = malloc(TextSize[Active_Window]+ins1+256); // 256 To Avoid Crash 256???
460 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
461 //memset(TextBuffer[Active_Window], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256??? free(TextBuffer[Active_Window]);
462 TextBuffer[Active_Window] = malloc(TextSize[Active_Window]+ins1+256); // 256 To Avoid Crash 256???
463 strcpy(TextBuffer[Active_Window], TextBuffer[TMP]);
464 }
465
466 switch(Operation){
467 case 0:
468 break;
469 case -1:// Perform Del Char / Cut. Can Be Simplify???
470 TextBuffer[TMP] = malloc(TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
471 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
472 TextBuffer[Active_Window][Editor_Cur+del1]='\0';
473 strcat(TextBuffer[Active_Window], TextBuffer[TMP]+(Editor_Cur+del2));
474 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
475 //memset(TextBuffer[Active_Window], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
476 free(TextBuffer[Active_Window]);
477 TextBuffer[Active_Window] = malloc(TextSize[Active_Window]+del3+256); // 256 To Avoid Crash 256???
478 strcpy(TextBuffer[Active_Window], TextBuffer[TMP]);
479 //memset(TextBuffer[TMP], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
480 free(TextBuffer[TMP]);
481 Editor_Cur+=del3, TextSize[Active_Window]+=del4;
482 t=0;
483 break;
484 case 1: // Paste.
485 for(i=0; i<ins2; i++)
486 TextBuffer[Active_Window][i+Editor_Cur]=TextBuffer[EDIT][i];
487 goto common;
488 case 2: // Return.
489 if(Editor_RetMode==OTHER){
490 TextBuffer[Active_Window][Editor_Cur+ins2]='\r';
491 TextBuffer[Active_Window][Editor_Cur+ins2+1]='\n';
492 }else if(Editor_RetMode==UNIX){
493 TextBuffer[Active_Window][Editor_Cur+ins2]='\r';
494 }else if(Editor_RetMode==MAC){
495 TextBuffer[Active_Window][Editor_Cur+ins2]='\n';
496 }
497 goto common;
498 case 3: // Tabulation.
499 TextBuffer[Active_Window][Editor_Cur+ins2]='\t';
500 goto common;
501 case 4: // Space.
502 TextBuffer[Active_Window][Editor_Cur+ins2]=' ';
503 goto common;
504 case 5: // Any Char.
505 TextBuffer[Active_Window][Editor_Cur+ins2]=KEY[KeyBoard_Cur];
506 goto common;
507 common:
508 TextBuffer[Active_Window][Editor_Cur+ins3]='\0';
509 strcat(TextBuffer[Active_Window], TextBuffer[TMP]+(Editor_Cur+ins4));
510 //memset(TextBuffer[TMP], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
511 free(TextBuffer[TMP]);
512 Editor_Cur+=ins5, TextSize[Active_Window]+=ins1;
513 t=0;
514 break;
515 }
516}
517//------------------------------
518//endfunc Virt_KeyBoard_Entry
519//--------------------------------------------------------------
520int KeyBoard_Entry(void)
521{
522 int i, ret=0, Operation;
523 unsigned char KeyPress;
524
525 Operation=0;
526
527 if(PS2KbdRead(&KeyPress)) { //KeyBoard Response Section.
528
529 ret=1; // Equal To event |= pad command.
530
531 if(KeyPress == PS2KBD_ESCAPE_KEY) {
532 PS2KbdRead(&KeyPress);
533 if(KeyPress)
534 t=0;
535 if(KeyPress == 0x29){ // Key Right.
536 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
537 Editor_Cur++;
538 }else if(KeyPress == 0x2A){ // Key Left.
539 if(Editor_Cur>0)
540 Editor_Cur--;
541 }else if(KeyPress == 0x2C){ // Key Up.
542 if(Editor_Cur>0)
543 Editor_PushRows++;
544 }else if(KeyPress == 0x2B){ // Key Down.
545 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
546 Editor_PushRows--;
547 }else if(KeyPress == 0x24) // Key Home.
548 Editor_Home=1;
549 else if(KeyPress == 0x27) // Key End.
550 Editor_End=1;
551 else if(KeyPress == 0x25){ // Key PgUp.
552 if(Editor_Cur>0)
553 Editor_PushRows += 1*(Rows_Num-1);
554 }else if(KeyPress == 0x28){ // Key PgDn.
555 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
556 Editor_PushRows -= 1*(Rows_Num-1);
557 }else if(KeyPress == 0x23) // Key Insert.
558 Editor_Insert = !Editor_Insert;
559 else if(KeyPress == 0x26){ // Key Delete.
560 if(Editor_Cur<Editor_nChar){
561 if( TextMode[Active_Window]==OTHER
562 && TextBuffer[Active_Window][Editor_Cur]=='\n'
563 && Editor_Cur>0
564 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
565 ){
566 Editor_Cur -= 1; //Delete at LF of CRLF must work at CR instead
567 }
568 if(Mark[MARK_ON]){
569 Mark[MARK_OUT]=Editor_Cur;
570 if(Mark[MARK_OUT]<Mark[MARK_IN]){
571 Mark[MARK_TMP]=Mark[MARK_IN];
572 Mark[MARK_IN]=Mark[MARK_OUT];
573 Mark[MARK_OUT]=Mark[MARK_TMP];
574 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
575 goto abort;
576 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
577 del1= -Mark[MARK_SIZE], del2=0, del3= -Mark[MARK_SIZE], del4= -Mark[MARK_SIZE];
578 Mark[MARK_ON]=0;
579 }else if(TextMode[Active_Window]==OTHER
580 && TextBuffer[Active_Window][Editor_Cur]=='\r'
581 && TextBuffer[Active_Window][Editor_Cur+1]=='\n'
582 ){ //Delete at CRLF
583 del1=0, del2=2, del3=0, del4=-2; //delete CRLF
584 }else if(TextMode[Active_Window]==OTHER && TextBuffer[Active_Window][Editor_Cur]=='\n'){
585 del1=-1, del2=1, del3=-1, del4=-2;
586 }else{
587 del1=0, del2=1, del3=0, del4=-1; //delete single char
588 }
589 Operation=-1;
590 }
591 }else if(KeyPress == 0x01){ // Key F1 MENU.
592 ret=2;
593 }else if(KeyPress == 0x1B){ // Key Escape EXIT Editor.
594 ret=3;
595 }
596 }else{
597 if(KeyPress == 0x12){ // Key Ctrl+r Return Mode CR/LF Or LF Or CR.
598 if((Editor_RetMode++)>=4)
599 Editor_RetMode=OTHER;
600 }else if(KeyPress == 0x02){ // Key Ctrl+b MARK.
601 Mark[MARK_ON]=!Mark[MARK_ON];
602 if(Mark[MARK_ON]){
603 if( TextMode[Active_Window]==OTHER
604 && TextBuffer[Active_Window][Editor_Cur]=='\n'
605 && Editor_Cur>0
606 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
607 ){
608 Editor_Cur -= 1; //Marking at LF of CRLF must start at CR instead
609 }
610 if(Mark[MARK_COPY] || Mark[MARK_CUT])
611 free(TextBuffer[EDIT]);
612 Mark[MARK_ON]=1, Mark[MARK_COPY]=0, Mark[MARK_CUT]=0,
613 Mark[MARK_IN]=0, Mark[MARK_OUT]=0, Mark[MARK_TMP]=0,
614 Mark[MARK_SIZE]=0, Mark[MARK_PRINT]=0, Mark[MARK_COLOR]=0;
615 Mark[MARK_IN]=Mark[MARK_OUT]=Editor_Cur;
616 }
617 Mark[MARK_START]=1;
618 //ends Key Ctrl+b MARK.
619 }else if(KeyPress == 0x03){ // Key Ctrl+c COPY.
620 if( TextMode[Active_Window]==OTHER
621 && TextBuffer[Active_Window][Editor_Cur]=='\n'
622 && Editor_Cur>0
623 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
624 ){
625 Editor_Cur += 1; //Mark end at LF of CRLF must include LF as well
626 }
627 if(Mark[MARK_ON]){
628 Mark[MARK_OUT]=Editor_Cur;
629 if(Mark[MARK_OUT]<Mark[MARK_IN]){
630 Mark[MARK_TMP]=Mark[MARK_IN];
631 Mark[MARK_IN]=Mark[MARK_OUT];
632 Mark[MARK_OUT]=Mark[MARK_TMP];
633 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
634 goto abort;
635 if(Mark[MARK_COPY] || Mark[MARK_CUT])
636 free(TextBuffer[EDIT]);
637 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
638 TextBuffer[EDIT] = malloc(Mark[MARK_SIZE]+256); // 256 To Avoid Crash 256???
639 for(i=0; i<Mark[MARK_SIZE]; i++)
640 TextBuffer[EDIT][i]=TextBuffer[Active_Window][i+Mark[MARK_IN]];
641 Mark[MARK_COPY]=1, Mark[MARK_CUT]=0, Mark[MARK_ON]=0, Mark[MARK_TMP]=0;
642 }
643 //ends Key Ctrl+c COPY.
644 }else if(KeyPress == 0x18){ // Key Ctrl+x CUT.
645 if(Mark[MARK_ON]){
646 if( TextMode[Active_Window]==OTHER
647 && TextBuffer[Active_Window][Editor_Cur]=='\n'
648 && Editor_Cur>0
649 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
650 ){
651 Editor_Cur += 1; //Mark end at LF of CRLF must include LF as well
652 }
653 Mark[MARK_OUT]=Editor_Cur;
654 if(Mark[MARK_OUT]<Mark[MARK_IN]){
655 Mark[MARK_TMP]=Mark[MARK_IN];
656 Mark[MARK_IN]=Mark[MARK_OUT];
657 Mark[MARK_OUT]=Mark[MARK_TMP];
658 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
659 goto abort;
660 if(Mark[MARK_COPY] || Mark[MARK_CUT])
661 free(TextBuffer[EDIT]);
662 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
663 TextBuffer[EDIT] = malloc(Mark[MARK_SIZE]+256); // 256 To Avoid Crash 256???
664 for(i=0; i<Mark[MARK_SIZE]; i++)
665 TextBuffer[EDIT][i]=TextBuffer[Active_Window][i+Mark[MARK_IN]];
666 del1= -Mark[MARK_SIZE], del2=0, del3= -Mark[MARK_SIZE], del4= -Mark[MARK_SIZE];
667 Mark[MARK_CUT]=1, Mark[MARK_COPY]=0, Mark[MARK_ON]=0, Mark[MARK_TMP]=0;
668 Operation=-2;
669 }
670 //ends Key Ctrl+x CUT.
671 }else if(KeyPress == 0x16){ // Key Ctrl+v PASTE.
672 if( Mark[MARK_COPY] || Mark[MARK_CUT]){
673 if(TextMode[Active_Window]==OTHER && TextBuffer[Active_Window][Editor_Cur]=='\n'){
674 Editor_Cur-=1;
675 Mark[MARK_SIZE]-=1;
676 }
677 ins1=Mark[MARK_SIZE], ins2=Mark[MARK_SIZE], ins3=Mark[MARK_SIZE], ins4=0, ins5=Mark[MARK_SIZE];
678 Operation=1;
679 }
680 //ends Key Ctrl+v PASTE.
681 }else if(KeyPress == 0x07){ // Key BackSpace.
682 if(Editor_Cur>0){
683 if( TextMode[Active_Window]==OTHER
684 && TextBuffer[Active_Window][Editor_Cur]=='\n'
685 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
686 ){
687 Editor_Cur += 1; //Backspace at LF of CRLF must work after LF
688 }
689 if(Mark[MARK_ON]){
690 Mark[MARK_OUT]=Editor_Cur;
691 if(Mark[MARK_OUT]<Mark[MARK_IN]){
692 Mark[MARK_TMP]=Mark[MARK_IN];
693 Mark[MARK_IN]=Mark[MARK_OUT];
694 Mark[MARK_OUT]=Mark[MARK_TMP];
695 }else if(Mark[MARK_IN]==Mark[MARK_OUT])
696 goto abort;
697 Mark[MARK_SIZE]=Mark[MARK_OUT]-Mark[MARK_IN];
698 del1= -Mark[MARK_SIZE], del2=0, del3= -Mark[MARK_SIZE], del4= -Mark[MARK_SIZE];
699 Mark[MARK_ON]=0;
700 }else if(TextMode[Active_Window]==OTHER
701 && TextBuffer[Active_Window][Editor_Cur-1]=='\n'
702 && Editor_Cur>1
703 && TextBuffer[Active_Window][Editor_Cur-2]=='\r'){
704 del1=-2, del2=0, del3=-2, del4=-2; //Backspace CRLF
705 }else{
706 del1=-1, del2=0, del3=-1, del4=-1; //Backspace single char
707 }
708 Operation=-3;
709 }
710 //ends Key BackSpace.
711 }else if(KeyPress == 0x0A){ // Key Return.
712
713 if( TextMode[Active_Window]==OTHER
714 && TextBuffer[Active_Window][Editor_Cur]=='\n'
715 && Editor_Cur>0
716 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
717 ){
718 Editor_Cur -= 1; //Entry at LF of CRLF must work at CR instead
719 }
720 if(Editor_Insert || TextBuffer[Active_Window][Editor_Cur]=='\0')
721 if(Editor_RetMode==OTHER)
722 ins1=2, ins2=0, ins3=2, ins4=0, ins5=2; //Insert CRLF
723 else
724 ins1=1, ins2=0, ins3=1, ins4=0, ins5=1; //Insert LF/CR
725 else
726 if( TextMode[Active_Window]==OTHER
727 && TextBuffer[Active_Window][Editor_Cur]=='\r'
728 && TextBuffer[Active_Window][Editor_Cur+1]=='\n'
729 ){ //OWrite Return at CRLF
730 if(Editor_RetMode==OTHER)
731 ins1=0, ins2=0, ins3=2, ins4=2, ins5=2; //OWrite CRLF at CRLF
732 else
733 ins1=0, ins2=0, ins3=1, ins4=2, ins5=1; //OWrite LF/CR at CRLF
734 }else{ //OWrite return at normal char
735 if(Editor_RetMode==OTHER)
736 ins1=1, ins2=0, ins3=2, ins4=1, ins5=2; //OWrite CRLF at char
737 else
738 ins1=0, ins2=0, ins3=1, ins4=1, ins5=1; //OWrite LF/CR at char
739 }
740 Operation=2;
741 //ends Key Return.
742 }else{ // All Other Keys.
743 if( TextMode[Active_Window]==OTHER
744 && TextBuffer[Active_Window][Editor_Cur]=='\n'
745 && Editor_Cur>0
746 && TextBuffer[Active_Window][Editor_Cur-1]=='\r'
747 ){
748 Editor_Cur -= 1; //Entry at LF of CRLF must work at CR instead
749 }
750 if(Editor_Insert || TextBuffer[Active_Window][Editor_Cur]=='\0'){
751 ins1=1, ins2=0, ins3=1, ins4=0, ins5=1; //Insert char normally
752 }else{
753 if(TextMode[Active_Window]==OTHER
754 && TextBuffer[Active_Window][Editor_Cur]=='\r'
755 && TextBuffer[Active_Window][Editor_Cur+1]=='\n'
756 ){ //OWrite char at CRLF
757 ins1=0, ins2= 0, ins3=1, ins4= 2, ins5= 1; //OWrite at CR of CRLF
758 }else{ //OWrite return at normal char
759 ins1=0, ins2= 0, ins3=1, ins4= 1, ins5= 1; //OWrite normal char
760 }
761 }
762 Operation=3;
763 }
764 }
765
766 if(Operation>0){ // Perform Add Char / Paste. Can Be Simplify???
767 TextBuffer[TMP] = malloc(TextSize[Active_Window]+ins1+256); // 256 To Avoid Crash 256???
768 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
769 //memset(TextBuffer[Active_Window], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256??? free(TextBuffer[Active_Window]);
770 TextBuffer[Active_Window] = malloc(TextSize[Active_Window]+ins1+256); // 256 To Avoid Crash 256???
771 strcpy(TextBuffer[Active_Window], TextBuffer[TMP]);
772 }
773
774 switch(Operation){
775 case 0:
776 break;
777 case -1:// Perform Del Char / Cut. Can Be Simplify???
778 case -2:
779 case -3:
780 TextBuffer[TMP] = malloc(TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
781 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
782 TextBuffer[Active_Window][Editor_Cur+del1]='\0';
783 strcat(TextBuffer[Active_Window], TextBuffer[TMP]+(Editor_Cur+del2));
784 strcpy(TextBuffer[TMP], TextBuffer[Active_Window]);
785 //memset(TextBuffer[Active_Window], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
786 free(TextBuffer[Active_Window]);
787 TextBuffer[Active_Window] = malloc(TextSize[Active_Window]+del3+256); // 256 To Avoid Crash 256???
788 strcpy(TextBuffer[Active_Window], TextBuffer[TMP]);
789 //memset(TextBuffer[TMP], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
790 free(TextBuffer[TMP]);
791 Editor_Cur+=del3, TextSize[Active_Window]+=del4;
792 t=0;
793 break;
794 case 1: // Paste.
795 for(i=0; i<ins2; i++)
796 TextBuffer[Active_Window][i+Editor_Cur]=TextBuffer[EDIT][i];
797 goto common;
798 case 2: // Return.
799 if(Editor_RetMode==OTHER){
800 TextBuffer[Active_Window][Editor_Cur+ins2]='\r';
801 TextBuffer[Active_Window][Editor_Cur+ins2+1]='\n';
802 }else if(Editor_RetMode==UNIX){
803 TextBuffer[Active_Window][Editor_Cur+ins2]='\r';
804 }else if(Editor_RetMode==MAC){
805 TextBuffer[Active_Window][Editor_Cur+ins2]='\n';
806 }
807 goto common;
808 case 3: // Normal characters
809 TextBuffer[Active_Window][Editor_Cur+ins2]=KeyPress;
810 common:
811 TextBuffer[Active_Window][Editor_Cur+ins3]='\0';
812 strcat(TextBuffer[Active_Window], TextBuffer[TMP]+(Editor_Cur+ins4));
813 //memset(TextBuffer[TMP], 0, TextSize[Active_Window]+256); // 256 To Avoid Crash 256???
814 free(TextBuffer[TMP]);
815 Editor_Cur+=ins5, TextSize[Active_Window]+=ins1;
816 t=0;
817 break;
818 }
819
820abort:
821 KeyPress = '\0';
822 } //ends if(PS2KbdRead(&KeyPress)).
823 return ret;
824}
825//------------------------------
826//endfunc KeyBoard_Entry
827//--------------------------------------------------------------
828void Editor_Rules(void)
829{
830 int i;
831
832 Editor_nChar=TextSize[Active_Window]+1;
833
834 Top_Height=0, Top_Width =0;
835 Editor_nRowsNum=0, Editor_nCharRows=1, Editor_nRowsTop=1;
836 for(i=0; i<Editor_nChar; i++) // Rows Number, Width, Top, Calucations.
837 {
838 if((TextMode[Active_Window]==UNIX && TextBuffer[Active_Window][i]=='\r') || // Text Mode UNIX End Line.
839 TextBuffer[Active_Window][i]=='\n' || // Text Mode MAC Or OTHER End Line.
840 Editor_nCharRows>=Rows_Width || // Line Width > Screen Width.
841 TextBuffer[Active_Window][i]=='\0'){ // End Text.
842 if(i<Editor_Cur){
843 if((Editor_nRowsTop += 1)>Rows_Num){
844 Top_Width += Editor_nRowsWidth[Top_Height];
845 Top_Height += 1;
846 }
847 }
848 Editor_nRowsWidth[Editor_nRowsNum]=Editor_nCharRows;
849 Editor_nRowsNum++;
850 Editor_nCharRows=0;
851 }
852 if(TextBuffer[Active_Window][i]=='\0') // End Text Stop Calculations.
853 break;
854 Editor_nCharRows++;
855 }
856
857 if(Editor_Home){
858 Tmp_Cur=0;
859 for(i=0; i<Editor_nRowsNum; i++) // Home Rules.
860 {
861 if((Tmp_Cur += Editor_nRowsWidth[i])>=Editor_Cur+1)
862 break;
863 }
864 Tmp_Cur -= (Editor_nRowsWidth[i]-1);
865 Editor_Cur = Tmp_Cur-1;
866 Editor_Home=0;
867 }
868
869 if(Editor_End){
870 Tmp_Cur=0;
871 for(i=0; i<Editor_nRowsNum; i++) // End Rules.
872 {
873 if((Tmp_Cur += Editor_nRowsWidth[i])>=Editor_Cur+1)
874 break;
875 }
876 Editor_Cur = Tmp_Cur-1;
877 Editor_End=0;
878 }
879
880 if(Editor_PushRows<0){
881 Tmp_Cur=0;
882 for(i=0; i<Editor_nRowsNum; i++) // Line / Page Up Rules.
883 {
884 if((Tmp_Cur += Editor_nRowsWidth[i])>=Editor_Cur+1)
885 break;
886 }
887 Tmp_Cur -= (Editor_nRowsWidth[i]-1);
888 if(Editor_nRowsWidth[i+1]<=((Editor_Cur+1)-(Tmp_Cur-1)))
889 Editor_Cur = Tmp_Cur+Editor_nRowsWidth[i]+Editor_nRowsWidth[i+1]-1-1;
890 else
891 Editor_Cur = Tmp_Cur+Editor_nRowsWidth[i]+((Editor_Cur+1)-Tmp_Cur)-1;
892
893 if(Editor_PushRows++ >= 0)
894 Editor_PushRows=0;
895
896 if(Editor_Cur+1>=Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0'){
897 Editor_Cur=Editor_nChar-1;
898 Editor_PushRows=0;
899 }
900 }
901
902 if(Editor_PushRows>0){
903 Tmp_Cur=0;
904 for(i=0; i<Editor_nRowsNum; i++) // Line / Page Down Rules.
905 {
906 if((Tmp_Cur += Editor_nRowsWidth[i])>=Editor_Cur+1)
907 break;
908 }
909 Tmp_Cur -= (Editor_nRowsWidth[i]-1);
910
911 if(Editor_nRowsWidth[i-1]<=((Editor_Cur+1)-(Tmp_Cur-1)))
912 Editor_Cur = Tmp_Cur-1-1;
913 else
914 Editor_Cur = Tmp_Cur-Editor_nRowsWidth[i-1]+((Editor_Cur+1)-Tmp_Cur)-1;
915
916 if(Editor_PushRows-- <= 0)
917 Editor_PushRows=0;
918
919 if(Editor_Cur<=0){
920 Editor_Cur=0;
921 Editor_PushRows=0;
922 }
923 }
924
925 if(Editor_Cur >= Editor_nChar) // Max Char Number Rules.
926 Editor_Cur=Editor_nChar-1;
927
928 if(Editor_Cur < 0) // Min Char Number Rules.
929 Editor_Cur=0;
930
931 if(Mark[MARK_ON]){ // Mark Rules.
932 Mark[MARK_SIZE]=Editor_Cur-Mark[MARK_IN];
933 if(Mark[MARK_SIZE]>0){
934 Mark[MARK_PRINT]=Mark[MARK_SIZE];
935 if(Mark[MARK_IN]<Top_Width)
936 Mark[MARK_PRINT]=Editor_Cur-Top_Width;
937 }else if(Mark[MARK_SIZE]<0)
938 Mark[MARK_PRINT]=1;
939 else
940 Mark[MARK_PRINT]=0;
941 }
942
943}
944//--------------------------------------------------------------
945int Windows_Selector(void)
946{
947 u64 color;
948 int x, y, i, Window_Sel=Active_Window;
949 int event, post_event=0;
950
951 int Window_ch_w = 36; //Total characters in longest Window Name.
952 int Window_ch_h = 10; //Total number of Window Menu lines.
953 int wSprite_Y1 = 200; //Top edge of sprite.
954 int wSprite_X2 = SCREEN_WIDTH-35; //Right edge of sprite.
955 int wSprite_X1 = wSprite_X2-(Window_ch_w+3)*FONT_WIDTH-3; //Left edge of sprite.
956 int wSprite_Y2 = wSprite_Y1+(Window_ch_h+1)*FONT_HEIGHT+3; //Bottom edge of sprite.
957
958 char tmp[64];
959
960 event = 1; //event = initial entry.
961 while(1){
962 //Pad response section.
963 waitPadReady(0, 0);
964 if(readpad()){
965 if(new_pad & PAD_UP){
966 event |= 2; //event |= valid pad command.
967 if((Window_Sel--)<=0)
968 Window_Sel=9;
969 }else if(new_pad & PAD_DOWN){
970 event |= 2; //event |= valid pad command.
971 if((Window_Sel++)>=9)
972 Window_Sel=0;
973 }else if((new_pad & PAD_TRIANGLE)
974 || (!swapKeys && new_pad & PAD_CROSS)
975 || (swapKeys && new_pad & PAD_CIRCLE) ){
976 return -1;
977 }else if((swapKeys && new_pad & PAD_CROSS)
978 || (!swapKeys && new_pad & PAD_CIRCLE) ){
979 event |= 2; //event |= valid pad command.
980 break;
981 }
982 }
983
984 if(event||post_event){ //NB: We need to update two frame buffers per event.
985
986 //Display section.
987 drawPopSprite(setting->color[0],
988 wSprite_X1, wSprite_Y1,
989 wSprite_X2, wSprite_Y2);
990 drawFrame(wSprite_X1, wSprite_Y1, wSprite_X2, wSprite_Y2, setting->color[1]);
991
992 for(i=0,y=wSprite_Y1+FONT_HEIGHT/2; i<10; i++){
993 if(Window_Sel==i)
994 color = setting->color[2];
995 else
996 color = setting->color[3];
997
998 if(!Window[i][OPENED])
999 printXY(LNG(Free_Window), wSprite_X1+2*FONT_WIDTH, y, color, TRUE, 0);
1000 else if(Window[i][CREATED])
1001 printXY(LNG(Window_Not_Yet_Saved), wSprite_X1+2*FONT_WIDTH, y, color, TRUE, 0);
1002 else if(Window[i][OPENED])
1003 printXY(Path[i], wSprite_X1+2*FONT_WIDTH, y, color, TRUE, 0);
1004
1005 y+=FONT_HEIGHT;
1006 }
1007
1008 if(Window_Sel<=10)
1009 drawChar(LEFT_CUR, wSprite_X1+FONT_WIDTH, wSprite_Y1+(FONT_HEIGHT/2+Window_Sel*FONT_HEIGHT), setting->color[3]);
1010
1011 //Tooltip section.
1012 x = SCREEN_MARGIN;
1013 y = Menu_tooltip_y;
1014 drawSprite(setting->color[0],
1015 0, y-1,
1016 SCREEN_WIDTH, y+16);
1017 if (swapKeys)
1018 sprintf(tmp, "ÿ1:%s ÿ0:%s ÿ3:%s", LNG(OK), LNG(Cancel), LNG(Back));
1019 else
1020 sprintf(tmp, "ÿ0:%s ÿ1:%s ÿ3:%s", LNG(OK), LNG(Cancel), LNG(Back));
1021 printXY(tmp, x, y, setting->color[2], TRUE, 0);
1022 }//ends if(event||post_event).
1023 drawScr();
1024 post_event = event;
1025 event = 0;
1026 }//ends while.
1027 return Window_Sel;
1028}//ends Window_Selector.
1029//--------------------------------------------------------------
1030void Init(void)
1031{
1032 int i;
1033
1034 for(i=0; i<MAX_ENTRY; i++)
1035 Editor_nRowsWidth[i]=0;
1036
1037 Editor_Cur=0, Tmp_Cur=0,
1038 Editor_nChar=0, Editor_nRowsNum=0,
1039 Editor_nCharRows=0, Editor_nRowsTop=0,
1040 Editor_PushRows=0, Editor_TextEnd=0;
1041
1042 Top_Width=0, Top_Height=0;
1043
1044 Rows_Width = (SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-26-Menu_start_x)/FONT_WIDTH;
1045 Rows_Num = (Menu_end_y-Menu_start_y)/FONT_HEIGHT;
1046
1047 KeyBoard_Cur=2, KeyBoard_Active=0,
1048 Editor_Insert=1, Editor_RetMode=TextMode[Active_Window];
1049 Editor_Home=0, Editor_End=0;
1050
1051 del1=0, del2=0, del3=0, del4=0;
1052 ins1=0, ins2=0, ins3=0, ins4=0, ins5=0;
1053
1054 if(Mark[MARK_ON]){
1055 Mark[MARK_ON]=0, Mark[MARK_IN]=0,
1056 Mark[MARK_OUT]=0, Mark[MARK_TMP]=0,
1057 Mark[MARK_PRINT]=0, Mark[MARK_COLOR]=0;
1058 }
1059
1060}
1061//--------------------------------------------------------------
1062int New(int Win)
1063{
1064 int ret=0;
1065
1066 TextSize[Win]=1;
1067
1068 if( TextSize[Win] ){
1069 if( ( TextBuffer[Win] = malloc( TextSize[Win]+256 ) ) > 0 ){
1070 TextBuffer[Win][0]='\0';
1071 TextMode[Win]=OTHER;
1072 Window[Win][CREATED]=1, Window[Win][OPENED]=1, Window[Win][SAVED]=0;
1073 Init();
1074 ret=1;
1075 }
1076 }
1077
1078 if(ret){
1079 drawMsg(LNG(File_Created));
1080 }else{
1081 drawMsg(LNG(Failed_Creating_File));
1082 }
1083
1084 WaitTime=Timer();
1085 while(Timer()<WaitTime+1500); // print operation result during 1.5 sec.
1086
1087 return ret;
1088}
1089//--------------------------------------------------------------
1090int Open(int Win)
1091{
1092 int fd, i, ret=0;
1093 char filePath[MAX_PATH];
1094
1095 getFilePath(Path[Win], TEXT_CNF); // No Filtering, Be Careful.
1096
1097 if(Path[Win][0]=='\0')
1098 goto abort;
1099
1100 genFixPath(Path[Win], filePath);
1101 fd = genOpen( filePath, O_RDONLY );
1102
1103 if( fd >= 0 ) {
1104 TextSize[Win] = genLseek ( fd, 0, SEEK_END );
1105 genLseek ( fd, 0, SEEK_SET );
1106
1107 if( TextSize[Win] && TextSize[Win] <= 512*1024 ){ // Limit Text Size To 512Kb???
1108 if( ( TextBuffer[Win] = malloc( TextSize[Win]+256 ) ) > 0 ){ // 256 To Avoid Crash 256???
1109 memset(TextBuffer[Win], 0, TextSize[Win]+256); // 256 To Avoid Crash 256???
1110 genRead( fd, TextBuffer[Win], TextSize[Win] );
1111
1112 for(i=0; i<TextSize[Win]; i++){ // Scan For Text Mode.
1113 if(TextBuffer[Win][i-1]!='\r' && TextBuffer[Win][i]=='\n'){
1114 // Mode MAC Only LF At Line End.
1115 TextMode[Win]=MAC;
1116 break;
1117 }else if(TextBuffer[Win][i]=='\r' && TextBuffer[Win][i+1]=='\n'){
1118 // Mode OTHER CR/LF At Line End.
1119 TextMode[Win]=OTHER;
1120 break;
1121 }else if(TextBuffer[Win][i]=='\r' && TextBuffer[Win][i+1]!='\n'){
1122 // Mode UNIX Only CR At Line End.
1123 TextMode[Win]=UNIX;
1124 break;
1125 }
1126 }
1127
1128 Window[Win][OPENED]=1, Window[Win][SAVED]=0;
1129 Init();
1130 ret=1;
1131 }
1132 }
1133 }
1134
1135 genClose( fd );
1136
1137 if(ret){
1138 drawMsg(LNG(File_Opened));
1139 }else{
1140abort:
1141 TextSize[Win]=0;
1142 drawMsg(LNG(Failed_Opening_File));
1143 }
1144
1145 WaitTime=Timer();
1146 while(Timer()<WaitTime+1500); // print operation result during 1.5 sec.
1147
1148 return ret;
1149}
1150//--------------------------------------------------------------
1151void Close(int Win)
1152{
1153 char msg[MAX_PATH];
1154
1155 //memset(TextBuffer[Win], 0, TextSize[Win]+256); // 256 To Avoid Crash 256???
1156 free(TextBuffer[Win]);
1157
1158 if(Window[Win][CREATED])
1159 strcpy(msg, LNG(File_Not_Yet_Saved_Closed));
1160 else
1161 sprintf(msg, LNG(File_Closed), Path[Win]);
1162
1163 Path[Win][0]='\0';
1164
1165 TextMode[Win]=0, TextSize[Win]=0, Window[Win][CREATED]=0, Window[Win][OPENED]=0, Window[Win][SAVED]=1;
1166
1167 Init();
1168
1169 drawMsg(msg);
1170
1171 WaitTime=Timer();
1172 while(Timer()<WaitTime+1500); // print operation result during 1.5 sec.
1173}
1174//--------------------------------------------------------------
1175void Save(int Win)
1176{
1177 int fd, ret=0;
1178
1179 char filePath[MAX_PATH];
1180
1181 if(!strncmp(Path[Win], "cdfs", 4))
1182 goto abort;
1183 genFixPath(Path[Win], filePath);
1184
1185 fd = genOpen( filePath, O_CREAT|O_WRONLY|O_TRUNC );
1186
1187 if( fd >= 0 ) {
1188 if(TextMode[Win]==OTHER && TextBuffer[Win][TextSize[Win]]=='\n')
1189 genWrite(fd, TextBuffer[Win], TextSize[Win]-1);
1190 else
1191 genWrite(fd, TextBuffer[Win], TextSize[Win]);
1192 Window[Win][OPENED]=1, Window[Win][SAVED]=1;
1193 ret=1;
1194 }
1195
1196 genClose( fd );
1197 if(!strncmp(filePath, "pfs", 3))
1198 unmountParty(filePath[3]-'0');
1199
1200 if(ret){
1201 drawMsg(LNG(File_Saved));
1202 }else{
1203abort:
1204 drawMsg(LNG(Failed_Saving_File));
1205 }
1206
1207 WaitTime=Timer();
1208 while(Timer()<WaitTime+1500); // print operation result during 1.5 sec.
1209}
1210//--------------------------------------------------------------
1211void Save_As(int Win)
1212{
1213 int fd, ret=0;
1214 char tmp[MAX_PATH], oldPath[MAX_PATH], filePath[MAX_PATH];
1215 char *p;
1216
1217 tmp[0]='\0', oldPath[0]='\0', filePath[0]='\0';
1218
1219 if(Path[Win][0]!='\0'){
1220 strcpy(oldPath, Path[Win]);
1221 Path[Win][0]='\0';
1222 p=strrchr(oldPath, '/');
1223 if(p)
1224 strcpy(tmp, p+1);
1225 }
1226
1227 getFilePath(Path[Win], DIR_CNF);
1228 if(Path[Win][0] == '\0')
1229 goto abort;
1230 if(!strncmp(Path[Win], "cdfs", 4))
1231 goto abort;
1232
1233 drawMsg(LNG(Enter_File_Name));
1234
1235 if(keyboard(tmp, 36)>0){
1236 //strcat(Path[Win], tmp); //This is what we want, but malfunctions for MC!
1237 //sprintf(&Path[Win][strlen(Path[Win])], "%s", tmp); //This always works
1238 strcpy(&Path[Win][strlen(Path[Win])], tmp); //And this one works too
1239 //Note that the strcat call SHOULD have done the same thing, but won't.
1240 } else goto abort;
1241
1242 genFixPath(Path[Win], filePath);
1243
1244 fd = genOpen( filePath, O_CREAT|O_WRONLY|O_TRUNC );
1245
1246 if( fd >= 0 ) {
1247 if(TextMode[Win]==OTHER && TextBuffer[Win][TextSize[Win]]=='\n')
1248 genWrite(fd, TextBuffer[Win], TextSize[Win]-1);
1249 else
1250 genWrite(fd, TextBuffer[Win], TextSize[Win]);
1251 Window[Win][CREATED]=0, Window[Win][OPENED]=1, Window[Win][SAVED]=1;
1252 ret=1;
1253 genClose( fd );
1254 }
1255
1256 if(!strncmp(filePath, "pfs", 3))
1257 unmountParty(filePath[3]-'0');
1258
1259 if(ret){
1260 drawMsg(LNG(File_Saved));
1261 goto result_delay;
1262 }
1263
1264abort:
1265 if(oldPath[0]!='\0')
1266 strcpy(Path[Win], oldPath);
1267 drawMsg(LNG(Failed_Saving_File));
1268
1269result_delay:
1270 WaitTime=Timer();
1271 while(Timer()<WaitTime+1500); // display operation result during 1.5 sec.
1272}
1273//--------------------------------------------------------------
1274void TextEditor(void)
1275{
1276 char tmp[MAX_PATH], tmp1[MAX_PATH], tmp2[MAX_PATH];
1277 int ch;
1278 int x, y, y0, y1;
1279 int i=0, j, ret=0;
1280 int tmpLen=0;
1281 int event=1, post_event=0;
1282 int Editor_Start=0;
1283 u64 color;
1284 const int KEY_W=350,
1285 KEY_H=98,
1286 KEY_X=(SCREEN_WIDTH - KEY_W)/2,
1287 KEY_Y=(Menu_end_y - KEY_H);
1288 int KEY_LEN = strlen(KEY);
1289
1290 tmp[0]='\0', tmp1[0]='\0', ch='\0';
1291
1292 Active_Window=0, Num_Window=0;
1293
1294 for(i=0; i<10; i++){
1295 Window[i][CREATED]=0;
1296 Window[i][OPENED]=0;
1297 Window[i][SAVED]=1;
1298 TextMode[i]=0;
1299 TextSize[i]=0;
1300 Path[i][0]='\0';
1301 }
1302
1303 for(i=0; i<NUM_MARK; i++)
1304 Mark[i]=0;
1305
1306 Init();
1307
1308 t=0;
1309
1310 event = 1; //event = initial entry.
1311
1312 Rows_Width = (SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS-26-Menu_start_x)/FONT_WIDTH;
1313 Rows_Num = (Menu_end_y-Menu_start_y)/FONT_HEIGHT;
1314
1315 x = Menu_start_x;
1316 y = Menu_start_y;
1317
1318 while(1){
1319
1320 //Pad response section.
1321 waitPadReady(0, 0);
1322 if(readpad_no_KB()){
1323 if(new_pad){
1324 event |= 2; //event |= pad command.
1325 }
1326 if(!KeyBoard_Active){ // Pad Response Without KeyBoard.
1327 if(new_pad & PAD_UP){ // Text move up.
1328 if(Editor_Cur>0)
1329 Editor_PushRows++;
1330 }else if(new_pad & PAD_DOWN){ // Text move down.
1331 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
1332 Editor_PushRows--;
1333 }else if(new_pad & PAD_LEFT){ // Text move left.
1334 if(Editor_Cur>0)
1335 Editor_Cur--;
1336 }else if(new_pad & PAD_RIGHT){ // Text move right.
1337 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
1338 Editor_Cur++;
1339 }else if(new_pad & PAD_L2){ // Text move page up.
1340 if(Editor_Cur>0)
1341 Editor_PushRows += 1*(Rows_Num-1);
1342 }else if(new_pad & PAD_R2){ // Text move page down.
1343 if(Editor_Cur<Editor_nChar && TextBuffer[Active_Window][Editor_Cur]!='\0')
1344 Editor_PushRows -= 1*(Rows_Num-1);
1345 }else if(new_pad & PAD_SELECT && Window[Active_Window][OPENED]){ // Virtual KeyBoard Active Rows_Num -= 7.
1346 KeyBoard_Cur=2;
1347 Rows_Num -= 6;
1348 KeyBoard_Active = 1;
1349 }
1350 }else{ // Pad Response With Virtual KeyBoard.
1351 Virt_KeyBoard_Entry();
1352 }
1353
1354 if(new_pad & PAD_TRIANGLE){ // General Pad Response.
1355exit:
1356 drawMsg(LNG(Exiting_Editor));
1357 for(i=0; i<10; i++){
1358 if(!Window[i][SAVED])
1359 goto unsave;
1360 }
1361force:
1362 for(i=0; i<10; i++){
1363 if(Window[i][OPENED]){
1364 Close(i);
1365 Path[i][0]='\0';
1366 }
1367 }
1368 if(Mark[MARK_COPY] || Mark[MARK_CUT])
1369 free(TextBuffer[EDIT]);
1370 Mark[MARK_START]=0, Mark[MARK_ON]=0, Mark[MARK_COPY]=0, Mark[MARK_CUT]=0,
1371 Mark[MARK_IN]=0, Mark[MARK_OUT]=0, Mark[MARK_TMP]=0,
1372 Mark[MARK_SIZE]=0, Mark[MARK_PRINT]=0, Mark[MARK_COLOR]=0;
1373
1374 return;
1375unsave:
1376 if(ynDialog(LNG(Exit_Without_Saving))!=1)
1377 goto abort;
1378 else
1379 goto force;
1380 }else if(new_pad & PAD_R1) {
1381menu:
1382 ret = MenuEditor();
1383 if(ret==NEW){
1384 Num_Window=0;
1385 for(i=0; i<10; i++){
1386 if(Window[i][OPENED])
1387 Num_Window++;
1388 }
1389 if(Num_Window<10){
1390 for(i=0; i<10; i++){
1391 if(!Window[i][OPENED]){
1392 Active_Window=i;
1393 break;
1394 }
1395 }
1396 ret=New(Active_Window);
1397 if(!ret)
1398 goto fail;
1399 Editor_Cur=0, Editor_PushRows=0;
1400 }
1401 Num_Window=0;
1402 for(i=0; i<10; i++){
1403 if(Window[i][OPENED])
1404 Num_Window++;
1405 }
1406 } else if(ret==OPEN){
1407 drawMsg(LNG(Select_A_File_For_Editing));
1408 drawMsg(LNG(Select_A_File_For_Editing));
1409 Num_Window=0;
1410 for(i=0; i<10; i++){
1411 if(Window[i][OPENED])
1412 Num_Window++;
1413 }
1414 if(Num_Window<10){
1415 for(i=0; i<10; i++){
1416 if(!Window[i][OPENED]){
1417 Active_Window=i;
1418 break;
1419 }
1420 }
1421 ret=Open(Active_Window);
1422 if(!ret)
1423 goto fail;
1424 Editor_Cur=0, Editor_PushRows=0;
1425 }
1426 Num_Window=0;
1427 for(i=0; i<10; i++){
1428 if(Window[i][OPENED])
1429 Num_Window++;
1430 }
1431 } else if(ret==CLOSE){
1432 if(!Window[Active_Window][SAVED]){
1433 if(ynDialog(LNG(Close_Without_Saving))!=1)
1434 goto abort;
1435 }
1436 Close(Active_Window);
1437fail:
1438 for(i=9; i>-1; i--){
1439 if(Window[i][OPENED]){
1440 Active_Window=i;
1441 break;
1442 }
1443 }
1444 Num_Window=0;
1445 for(i=0; i<10; i++){
1446 if(Window[i][OPENED])
1447 Num_Window++;
1448 }
1449abort:
1450 i=0; // just for compiler warning.
1451 } else if(ret==SAVE){
1452 Save(Active_Window);
1453 } else if(ret==SAVE_AS){
1454 Save_As(Active_Window);
1455 } else if(ret==WINDOWS){
1456 ret=Windows_Selector();
1457 if(ret>=0){
1458 Active_Window=ret;
1459 Init();
1460 }
1461 } else if(ret==EXIT){
1462 goto exit;
1463 }
1464 }
1465 }//ends pad response section.
1466
1467 if(!Num_Window)
1468 Editor_Start++;
1469 if(Editor_Start==4){
1470 Editor_Start=0;
1471 event |= 2;
1472 goto menu;
1473 }
1474
1475 if(setting->usbkbd_used){ // Kbd response section.
1476
1477 ret = KeyBoard_Entry();
1478 if(ret)
1479 event |=2;
1480 if(ret==2)
1481 goto menu;
1482 else if(ret==3)
1483 goto exit;
1484
1485 } // end Kbd response section.
1486
1487 t++;
1488
1489 if(t & 0x0F) event |= 4; //repetitive timer event.
1490
1491 if(event||post_event){ //NB: We need to update two frame buffers per event.
1492
1493 //Display section.
1494 clrScr(setting->color[0]);
1495
1496 if(TextSize[Active_Window]==0)
1497 goto end;
1498
1499 drawOpSprite(COL_NORM_BG,
1500 SCREEN_MARGIN, Frame_start_y,
1501 SCREEN_WIDTH-SCREEN_MARGIN, Frame_end_y);
1502
1503 if(KeyBoard_Active){ //Display Virtual KeyBoard Section.
1504
1505 drawPopSprite(setting->color[0],
1506 SCREEN_MARGIN, KEY_Y+6,
1507 SCREEN_WIDTH-SCREEN_MARGIN, Frame_end_y);
1508 drawOpSprite(setting->color[1],
1509 SCREEN_MARGIN, KEY_Y+6,
1510 SCREEN_WIDTH-SCREEN_MARGIN, KEY_Y+6+LINE_THICKNESS-1);
1511 drawOpSprite(setting->color[1],
1512 KEY_X-48, KEY_Y+6,
1513 KEY_X-48+LINE_THICKNESS-1, Frame_end_y);
1514 drawOpSprite(setting->color[1],
1515 KEY_X+32, KEY_Y+6,
1516 KEY_X+32+LINE_THICKNESS-1, Frame_end_y);
1517 drawOpSprite(setting->color[1],
1518 KEY_X+KEY_W+32, KEY_Y+6,
1519 KEY_X+KEY_W+32+LINE_THICKNESS-1, Frame_end_y);
1520
1521 if(Mark[MARK_ON])
1522 color=setting->color[2];
1523 else
1524 color=setting->color[3];
1525 printXY(LNG(MARK), KEY_X+2+4-120, KEY_Y+12,
1526 color, TRUE, ((KEY_X-48)-SCREEN_MARGIN-3*FONT_WIDTH));
1527 printXY(LNG(LINE_UP), KEY_X+2+4-120+10*FONT_WIDTH, KEY_Y+12,
1528 setting->color[3], TRUE, ((KEY_X+32)-(KEY_X-48)-3*FONT_WIDTH));
1529 if(Mark[MARK_COPY])
1530 color=setting->color[2];
1531 else
1532 color=setting->color[3];
1533 printXY(LNG(COPY), KEY_X+2+4-120, KEY_Y+12+FONT_HEIGHT+2,
1534 color, TRUE, ((KEY_X-48)-SCREEN_MARGIN-3*FONT_WIDTH));
1535 printXY(LNG(LINE_DOWN), KEY_X+2+4-120+10*FONT_WIDTH, KEY_Y+12+FONT_HEIGHT+2,
1536 setting->color[3], TRUE, ((KEY_X+32)-(KEY_X-48)-3*FONT_WIDTH));
1537 if(Mark[MARK_CUT])
1538 color=setting->color[2];
1539 else
1540 color=setting->color[3];
1541 printXY(LNG(CUT), KEY_X+2+4-120, KEY_Y+12+FONT_HEIGHT*2+4,
1542 color, TRUE, ((KEY_X-48)-SCREEN_MARGIN-3*FONT_WIDTH));
1543 printXY(LNG(PAGE_UP), KEY_X+2+4-120+10*FONT_WIDTH, KEY_Y+12+FONT_HEIGHT*2+4,
1544 setting->color[3], TRUE, ((KEY_X+32)-(KEY_X-48)-3*FONT_WIDTH));
1545 printXY(LNG(PASTE), KEY_X+2+4-120, KEY_Y+12+FONT_HEIGHT*3+6,
1546 setting->color[3], TRUE, ((KEY_X-48)-SCREEN_MARGIN-3*FONT_WIDTH));
1547 printXY(LNG(PAGE_DOWN), KEY_X+2+4-120+10*FONT_WIDTH, KEY_Y+12+FONT_HEIGHT*3+6,
1548 setting->color[3], TRUE, ((KEY_X+32)-(KEY_X-48)-3*FONT_WIDTH));
1549 printXY(LNG(HOME), KEY_X+2+4-120, KEY_Y+12+FONT_HEIGHT*4+8,
1550 setting->color[3], TRUE, ((KEY_X-48)-SCREEN_MARGIN-3*FONT_WIDTH));
1551 printXY(LNG(END), KEY_X+2+4-120+10*FONT_WIDTH, KEY_Y+12+FONT_HEIGHT*4+8,
1552 setting->color[3], TRUE, ((KEY_X+32)-(KEY_X-48)-3*FONT_WIDTH));
1553
1554 if(Editor_Insert)
1555 color=setting->color[2];
1556 else
1557 color=setting->color[3];
1558 printXY(LNG(INSERT), KEY_X+2+4+392, KEY_Y+12,
1559 color, TRUE, ((SCREEN_WIDTH-SCREEN_MARGIN)-(KEY_X+KEY_W+32)-3*FONT_WIDTH));
1560 tmp[0]='\0';
1561 if(Editor_RetMode==OTHER)
1562 strcpy(tmp, LNG(RET_CRLF));
1563 else if(Editor_RetMode==UNIX)
1564 strcpy(tmp, LNG(RET_CR));
1565 else if(Editor_RetMode==MAC)
1566 strcpy(tmp, LNG(RET_LF));
1567 printXY(tmp, KEY_X+2+4 + 392, KEY_Y+12+FONT_HEIGHT+2,
1568 setting->color[3], TRUE, ((SCREEN_WIDTH-SCREEN_MARGIN)-(KEY_X+KEY_W+32)-3*FONT_WIDTH));
1569 printXY(LNG(TAB), KEY_X+2+4 + 392, KEY_Y+12+FONT_HEIGHT*2+4,
1570 setting->color[3], TRUE, ((SCREEN_WIDTH-SCREEN_MARGIN)-(KEY_X+KEY_W+32)-3*FONT_WIDTH));
1571 printXY(LNG(SPACE), KEY_X+2+4 + 392, KEY_Y+12+FONT_HEIGHT*3+6,
1572 setting->color[3], TRUE, ((SCREEN_WIDTH-SCREEN_MARGIN)-(KEY_X+KEY_W+32)-3*FONT_WIDTH));
1573 printXY(LNG(KB_RETURN), KEY_X+2+4 + 392, KEY_Y+12+FONT_HEIGHT*4+8,
1574 setting->color[3], TRUE, ((SCREEN_WIDTH-SCREEN_MARGIN)-(KEY_X+KEY_W+32)-3*FONT_WIDTH));
1575
1576 for(i=0; i<KEY_LEN; i++){
1577 drawChar(KEY[i],
1578 KEY_X+2+4+14 + (i%WFONTS+1)*20 - 32,
1579 KEY_Y+12 + (i/WFONTS)*18,
1580 setting->color[3]);
1581 }
1582
1583 //Virtual KeyBoard Cursor positioning section.
1584 if(!KeyBoard_Cur || KeyBoard_Cur%WFONTS==0)
1585 x = KEY_X+2+4 - 128;
1586 else if(KeyBoard_Cur==1 || (KeyBoard_Cur-1)%WFONTS==0)
1587 x = KEY_X+2+4 - 48;
1588 else if((KeyBoard_Cur+1)%WFONTS==0)
1589 x = KEY_X+2+4 + 384;
1590 else
1591 x = KEY_X+2+4+14 + (KeyBoard_Cur%WFONTS+1)*20 - 40;
1592 y = KEY_Y+12 + (KeyBoard_Cur/WFONTS)*18;
1593 drawChar(LEFT_CUR, x, y, setting->color[2]);
1594
1595 } // end Display Virtual KeyBoard Section.
1596
1597 x = Menu_start_x;
1598 y = Menu_start_y;
1599
1600 Editor_Rules();
1601
1602 Editor_TextEnd=0, tmpLen=0;
1603
1604 for(i=Top_Height; i<Rows_Num+Top_Height; i++)
1605 {
1606 for(j=0; j<Editor_nRowsWidth[i]; j++)
1607 {
1608 Mark[MARK_COLOR]=0;
1609
1610 if(Mark[MARK_ON] && Mark[MARK_PRINT]>0){ //Mark Text.
1611 if(Mark[MARK_SIZE]>0){
1612 if(Top_Width+tmpLen+j == (Editor_Cur-Mark[MARK_PRINT])){
1613 drawOpSprite(COL_MARK_BG, x, y-1, x+FONT_WIDTH, y+FONT_HEIGHT-1);
1614 Mark[MARK_COLOR]=1;
1615 Mark[MARK_PRINT]--;
1616 }
1617 }else if(Mark[MARK_SIZE]<0){
1618 if(Top_Width+tmpLen+j == (Editor_Cur+Mark[MARK_PRINT]-1)){
1619 drawOpSprite(COL_MARK_BG, x, y-1, x+FONT_WIDTH, y+FONT_HEIGHT-1);
1620 Mark[MARK_COLOR]=1;
1621 if((Mark[MARK_PRINT]++) == (-Mark[MARK_SIZE]))
1622 Mark[MARK_PRINT]=0;
1623 }
1624 }
1625 } // end mark.
1626
1627 if(Top_Width+tmpLen+j == Editor_Cur){ //Text Cursor.
1628 if(Editor_Insert)
1629 color = COL_CUR_INSERT;
1630 else
1631 color = COL_CUR_OVERWR;
1632 if(((event|post_event)&4) && (t & 0x10))
1633 drawChar(TEXT_CUR, x-4, y, color);
1634 }
1635
1636 if(TextBuffer[Active_Window][Top_Width+tmpLen+j]=='\n'){ // Line Feed.
1637 ch=DN_ARROW;
1638 color = COL_LINE_END;
1639 }else if (TextBuffer[Active_Window][Top_Width+tmpLen+j]=='\r'){ // Carriage Return.
1640 ch=LT_ARROW;
1641 color = COL_LINE_END;
1642 }else if (TextBuffer[Active_Window][Top_Width+tmpLen+j]=='\t'){ // Tabulation.
1643 ch=RT_ARROW;
1644 color = COL_TAB;
1645 }else if (TextBuffer[Active_Window][Top_Width+tmpLen+j]=='\0'){ // Text End.
1646 ch=BR_SPLIT;
1647 color = COL_TEXT_END;
1648 Editor_TextEnd=1;
1649 }else{
1650 ch=TextBuffer[Active_Window][Top_Width+tmpLen+j];
1651 if(Mark[MARK_ON] && Mark[MARK_COLOR]) //Text Color Black / White If Mark.
1652 color = COL_MARK_TEXT;
1653 else
1654 color = COL_NORM_TEXT;
1655 }
1656
1657 drawChar(ch, x, y, color);
1658
1659 if(Editor_TextEnd)
1660 goto end;
1661
1662 x += FONT_WIDTH;
1663 }
1664
1665 tmpLen += Editor_nRowsWidth[i];
1666
1667 x = Menu_start_x;
1668 y += FONT_HEIGHT;
1669
1670 } //ends for, so all editor Rows_Num were fixed above.
1671end:
1672 if(Editor_nRowsNum > Rows_Num) { //if more lines than available Rows_Num, use scrollbar.
1673 if(KeyBoard_Active){
1674 drawFrame(SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*8, Frame_start_y,
1675 SCREEN_WIDTH-SCREEN_MARGIN, KEY_Y+6, setting->color[1]);
1676 y0=(KEY_Y+6-Menu_start_y+8)*((double)Top_Height/Editor_nRowsNum);
1677 y1=(KEY_Y+6-Menu_start_y+8)*((double)(Top_Height+Rows_Num)/Editor_nRowsNum);
1678 drawOpSprite(setting->color[1],
1679 SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*6, (y0+Menu_start_y-2),
1680 SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*2, (y1+Menu_start_y-10));
1681 }else{
1682 drawFrame(SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*8, Frame_start_y,
1683 SCREEN_WIDTH-SCREEN_MARGIN, Frame_end_y, setting->color[1]);
1684 y0=(Menu_end_y-Menu_start_y+8)*((double)Top_Height/Editor_nRowsNum);
1685 y1=(Menu_end_y-Menu_start_y+8)*((double)(Top_Height+Rows_Num)/Editor_nRowsNum);
1686 drawOpSprite(setting->color[1],
1687 SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*6, (y0+Menu_start_y-2),
1688 SCREEN_WIDTH-SCREEN_MARGIN-LINE_THICKNESS*2, (y1+Menu_start_y-6));
1689 } //ends clause for scrollbar with KeyBoard.
1690 } //ends clause for scrollbar.
1691
1692 //Tooltip section.
1693 tmp[0]='\0', tmp1[0]='\0', tmp2[0]='\0';
1694 if(KeyBoard_Active){ //Display Virtual KeyBoard Tooltip.
1695 if(swapKeys)
1696 sprintf(tmp1, "R1:%s ÿ3:%s ÿ1:%s ÿ0:%s L2:%s R2:%s Sel:%s",
1697 LNG(Menu), LNG(Exit), LNG(Sel), LNG(BackSpace),
1698 LNG(Left), LNG(Right), LNG(Close_KB));
1699 else
1700 sprintf(tmp1, "R1:%s ÿ3:%s ÿ0:%s ÿ1:%s L2:%s R2:%s Sel:%s",
1701 LNG(Menu), LNG(Exit), LNG(Sel), LNG(BackSpace),
1702 LNG(Left), LNG(Right), LNG(Close_KB));
1703 }else if(setting->usbkbd_used){ //Display KeyBoard Tooltip.
1704 if(Window[Active_Window][OPENED]){
1705 if(Mark[MARK_ON])
1706 sprintf(tmp1, "F1/R1:%s Esc/ÿ3:%s Ctrl+ b:%s: %s ",
1707 LNG(Menu), LNG(Exit), LNG(Mark), LNG(On));
1708 else
1709 sprintf(tmp1, "F1/R1:%s Esc/ÿ3:%s Ctrl+ b:%s: %s ",
1710 LNG(Menu), LNG(Exit), LNG(Mark), LNG(Off));
1711 sprintf(tmp2, "x:%s c:%s v:%s ", LNG(Cut), LNG(Copy), LNG(Paste));
1712 strcat(tmp1, tmp2);
1713 if(Editor_RetMode==OTHER)
1714 sprintf(tmp2, "r:%s ", LNG(CrLf));
1715 else if(Editor_RetMode==UNIX)
1716 sprintf(tmp2, "r:%s ", LNG(Cr));
1717 else if(Editor_RetMode==MAC)
1718 sprintf(tmp2, "r:%s ", LNG(Lf));
1719 strcat(tmp1, tmp2);
1720 if(Editor_Insert)
1721 sprintf(tmp2, "%s:%s", LNG(Ins), LNG(On));
1722 else
1723 sprintf(tmp2, "%s:%s", LNG(Ins), LNG(Off));
1724 strcat(tmp1, tmp2);
1725 }else
1726 sprintf(tmp1, "F1/R1:%s Esc/ÿ3:%s", LNG(Menu), LNG(Exit));
1727 }else{ //Display Basic Tooltip.
1728 if(Window[Active_Window][OPENED])
1729 sprintf(tmp1, "R1:%s ÿ3:%s Select:%s", LNG(Menu), LNG(Exit), LNG(Open_KeyBoard));
1730 else
1731 sprintf(tmp1, "R1:%s ÿ3:%s", LNG(Menu), LNG(Exit));
1732 }
1733 if(Window[Active_Window][CREATED])
1734 sprintf(tmp, "%s : %s", LNG(PS2_TEXT_EDITOR), LNG(File_Not_Yet_Saved));
1735 else if(Window[Active_Window][OPENED])
1736 sprintf(tmp, "%s : %s", LNG(PS2_TEXT_EDITOR), Path[Active_Window]);
1737 else
1738 strcpy(tmp, LNG(PS2_TEXT_EDITOR));
1739 setScrTmp(tmp, tmp1);
1740 }//ends if(event||post_event).
1741 drawScr();
1742 post_event = event;
1743 event = 0;
1744 }//ends while.
1745
1746 return;
1747}
1748//--------------------------------------------------------------
1749//End of file: editor.c
1750//--------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.