PROC MainEdit() STATUS = "Edit" MOVETO TableMain IMAGERIGHTS MOVETO "Ath" IMAGERIGHTS MOVETO "Ins" IMAGERIGHTS MOVETO "Nam" IMAGERIGHTS MOVETO "Src" IMAGERIGHTS MOVETO "Abs" IMAGERIGHTS MOVETO "Key" IMAGERIGHTS WHILE TRUE PromptEdit() IF ISEMPTY("Ref") THEN itn = 1 ifn = 1 ENDIF MOVETO TableName[itn] MOVETO FIELD FieldName[ifn] IF itn <> 1 THEN END ENDIF IF itn = 1 THEN IF ifn = 1 AND TableMain = "Answer" THEN IMAGERIGHTS READONLY ENDIF EditFieldMain(FALSE) IF ifn = 1 AND TableMain = "Answer" THEN IMAGERIGHTS ENDIF ELSE CURSOR NORMAL EditField() CURSOR OFF ENDIF SWITCH CASE Retval = -75 : PrevField() ;"Left" CASE Retval = -72 : PrevField() ;"Up" CASE Retval = -15 : PrevField() ;"ReverseTab" CASE Retval = -77 : NextField() ;"Right" CASE Retval = -80 : NextField() ;"Down" CASE Retval = 9 : NextField() ;"Tab" CASE Retval = 13 : NextField() ;"Enter" CASE Retval = -59 : ;"F1" SWITCH CASE itn = 5 AND ([I] = 0 OR ISBLANK([I])) AND LEN([]) < 7 : Journals() CASE itn = 7 : KeyLu(TRUE) OTHERWISE : HelpScreen() ENDSWITCH CASE Retval = -83 : ;"Del" DeleteRecord() IF NOT Retval THEN TableMain = "Ref" TableName[1] = "Ref" MOVETO TableMain FORMKEY MESSAGE "Table Answer is empty - go to Ref" SLEEP 1000 QUITLOOP ENDIF CASE Retval = 4 : DittoRecord() ;Ctrl+D CASE Retval = -32 : PasteRecord() ;Alt+D OTHERWISE : IF [Index] = "temporary" THEN ChangeIndex() ENDIF SWITCH CASE Retval = 26 : SearchOneRecord() ;"Zoom" CASE Retval = -44 : SearchAgain(TRUE) ;"ZoomNext" CASE Retval = -81 : ;"PgDn" MOVETO TableMain IF NOT ATLAST() THEN PGDN ELSE IF TableMain = "Ref" THEN PGDN EditFieldMain(TRUE) ENDIF ENDIF CASE Retval = -73 : MOVETO TableMain PGUP ;"PgUp" CASE Retval = -71 : MOVETO TableMain HOME ;"Home" CASE Retval = -79 : MOVETO TableMain END ;"End" CASE Retval = -60 : QUITLOOP ;"F2" CASE Retval = -82 : ;"Ins" IF TableMain = "Ref" THEN MOVETO TableMain INS EditFieldMain(TRUE) ENDIF CASE Retval = 18 : ;Ctrl+R PROMPT "", "" Replace() PromptEdit() OTHERWISE : BEEP ENDSWITCH ENDSWITCH ENDWHILE PROMPT STATUS = "View" MOVETO "Ath" IMAGERIGHTS READONLY MOVETO "Ins" IMAGERIGHTS READONLY MOVETO "Nam" IMAGERIGHTS READONLY MOVETO "Src" IMAGERIGHTS READONLY MOVETO "Abs" IMAGERIGHTS READONLY MOVETO "Key" IMAGERIGHTS READONLY MOVETO TableMain IMAGERIGHTS READONLY ENDPROC PROC PromptEdit() PROMPT TableMain + " table: " + STRVAL(NRECORDS(TableMain)) + " records" + FILL(" ", 40) + Status, STRVAL(CCOUNT(TableMain, "Flag")) + " collected records" + " F1 - Help F2 - to finish" ENDPROC PROC PromptField() PROMPT FieldName[ifn] + " field" + FILL(" ", 40) + Status, FILL(" ", 30) + "F1 - Help Enter - finish" ENDPROC PROC EditFieldMain(DeleteBlank) PRIVATE Ch, Num WHILE TRUE IF ISBLANK([Index]) THEN MOVETO [Index] [] = "temporary" Retval = 13 ELSE WAIT FIELD UNTIL 26, -44, ;"Zoom", "ZoomNext" -81, -73, -71, -79, ;"PgDn", "PgUp", "Home", "End" -77, -75, -72, -80, ; "Right", "Left", "Up", "Down" 9, -15, 13, ;"Tab", "ReverseTab", "Enter" -59, -60, -83, -82, 6, ; "F1", "F2", "Del", "Ins", "FieldView" 18, 4, -32 ; Ctrl+R, Ctrl+D, Alt+D ENDIF SWITCH CASE Retval = 6 : ;"FieldView" KEYPRESS 6 PromptField() WAIT FIELD UNTIL 13 ;"Enter" PromptEdit() CASE DeleteBlank AND Retval = -83 : ;"Del" DEL RETURN OTHERWISE : IF FIELD() = "Index" THEN Ch = Retval Num = [Index] UNLOCKRECORD IF RECORDSTATUS("Locked") OR RECORDSTATUS("New") THEN MESSAGE "Record with such a number already exists" SLEEP 1000 ELSE LOCATE Num RETURN Ch ENDIF ELSE RETURN Retval ENDIF ENDSWITCH ENDWHILE ENDPROC PROC ChangeIndex() PRIVATE Loc, Yr, Auth, Page, k, l MOVETO TableMain MOVETO [Index] IF MATCH([], "..+..") THEN Loc = "+" ELSE Loc = "" ENDIF IF LEN([Year]) = 4 THEN Yr = SUBSTR([Year], 3, 2) ELSE Yr = "__" ENDIF IF MATCH([Ath->Authors], ".. ", Auth) = FALSE THEN Auth = [Ath->Authors] ENDIF k = MATCH(Auth, "..-..", Auth, k) IF LEN(Auth) < 3 THEN Auth = Auth + "___" ENDIF Auth = SUBSTR(Auth, 1, 3) MOVETO "Src" MOVETO [Source] END IF MATCH([], "..;..)..", k, l, Page) = FALSE THEN IF MATCH([], "..; .. ..", k, l, Page) = FALSE THEN IF MATCH([], "..;.. ..", k, l, Page) = FALSE THEN Page = "___" ENDIF ENDIF ENDIF MOVETO "Ref" k = MATCH(Page, "..-..", Page, k) Page = RemoveSp(Page) IF LEN(Page) < 3 THEN Page = "___" + Page ENDIF Page = SUBSTR(Page, LEN(Page)-1, 2) l = Yr + Auth + Page + Loc [] = l k = 1 WHILE TRUE Loc = [] UNLOCKRECORD IF RECORDSTATUS("Locked") = FALSE AND RECORDSTATUS("New") = FALSE THEN QUITLOOP ENDIF [] = l + STRVAL(k) k = k + 1 ENDWHILE LOCATE Loc ENDPROC PROC EditField() PRIVATE Ch, I, Word, j, Line IF ISBLANK([I]) THEN [I] = 0 ENDIF WHILE TRUE RefreshCanvas() Line = [] WHILE TRUE Ch = GETCHAR() SWITCH CASE Ch = 8 : ; backspace SWITCH CASE ISBLANK(Line) AND [I] = 0 : BEEP CASE ISBLANK(Line) AND [I] > 0 : DEL QUITLOOP OTHERWISE : Line = SUBSTR(Line, 1, LEN(Line) - 1) @ ROW(), COL() - 1 ?? " " @ ROW(), COL() - 1 ENDSWITCH CASE Ch = 127 : ; CtrlBackspace SWITCH CASE ISBLANK(Line) AND [I] = 0 : BEEP CASE ISBLANK(Line) AND [I] > 0 : DEL QUITLOOP OTHERWISE : @ ROW(), COL() - LEN(Line) ?? SPACES(LEN(Line)) @ ROW(), COL() - LEN(Line) Line = "" ENDSWITCH CASE Ch > 31 : ; regular SWITCH CASE LEN(Line) = 60 : IF SUBSTR(Line, 60, 1) <> " " THEN SWITCH CASE Ch = 32 : Word = "" CASE SEARCH(" ", Line) = 0 : Word = CHR(Ch) OTHERWISE : j = 60 WHILE SUBSTR(Line, j, 1) <> " " j = j - 1 ENDWHILE Word = SUBSTR(Line, j + 1, 60 - j) + CHR(Ch) Line = SUBSTR(Line, 1, j - 1) ENDSWITCH ELSE Word = CHR(Ch) ENDIF [] = Line I = [I] DOWN [I] = I + 1 [] = RemoveSp(Word) QUITLOOP OTHERWISE : ?? CHR(Ch) Line = Line + CHR(Ch) ENDSWITCH CASE Ch = 6 : ;"FieldView" [] = Line FieldWhileEdit() PromptEdit() QUITLOOP OTHERWISE : IF ISBLANK(Line) THEN DEL ELSE [] = Line ENDIF RETURN Ch ENDSWITCH ENDWHILE ENDWHILE ENDPROC PROC FieldWhileEdit() PRIVATE c, j j = LEN([]) + 1 c = COL() - j WHILE TRUE PROMPT FieldName[ifn] + " field: " + "row " + STRVAL(RECNO()) + " from " + STRVAL(NIMAGERECORDS()) + FILL(" ", 30) + Status, FILL(" ", 30) + "F1 - Help Enter - finish" RefreshCanvas() CURSOR BOX WHILE TRUE @ ROW(), c + j Ch = GETCHAR() SWITCH CASE Ch = 8 : ; Backspace SWITCH CASE j = 1 AND [I] = 0 : BEEP CASE j = 1 AND [I] > 0 : UP MOVETO FIELD FieldName[ifn] j = LEN([]) + 1 QUITLOOP OTHERWISE : [] = SUBSTR([], 1, j - 2) + SUBSTR([], j, LEN([]) - j + 1) j = j - 1 QUITLOOP ENDSWITCH CASE Ch = 127 : ; CtrlBackspace CASE Ch = -83 : ; Del SWITCH CASE ISBLANK([]) : BEEP OTHERWISE : [] = SUBSTR([], 1, j - 1) + SUBSTR([], j + 1, LEN([]) - j + 1) QUITLOOP ENDSWITCH CASE Ch = -81 : ; PgDn PGDN QUITLOOP CASE Ch = -73 : ; PgUp PGUP QUITLOOP CASE Ch = -71 : ; Home HOME j = 1 QUITLOOP CASE Ch = -79 : ; End END j = LEN([]) + 1 QUITLOOP CASE Ch = -77 : ; Right j = j + 1 IF j > LEN([]) + 1 THEN IF NOT ATLAST() THEN DOWN j = 1 QUITLOOP ELSE j = LEN([]) + 1 ENDIF ENDIF CASE Ch = -116 : ; CtrlRight IF j > LEN([]) THEN IF NOT ATLAST() THEN DOWN j = 1 QUITLOOP ENDIF ELSE j = j + 1 WHILE j <= LEN([]) AND SUBSTR([], j, 1) <> " " j = j + 1 ENDWHILE ENDIF CASE Ch = -75 : ; Left j = j - 1 IF j = 0 THEN IF NOT ATFIRST() THEN UP MOVETO FIELD FieldName[ifn] j = LEN([]) + 1 QUITLOOP ELSE j = 1 ENDIF ENDIF CASE Ch = -115 : ; CtrlLeft IF j = 1 THEN IF NOT ATFIRST() THEN UP MOVETO FIELD FieldName[ifn] j = LEN([]) + 1 QUITLOOP ENDIF ELSE j = j - 1 WHILE j > 1 AND SUBSTR([], j, 1) <> " " j = j - 1 ENDWHILE ENDIF CASE Ch = -72 : ; Up UP MOVETO FIELD FieldName[ifn] QUITLOOP CASE Ch = -80 : ; Down IF NOT ATLAST() THEN DOWN ENDIF QUITLOOP CASE Ch = -59 : ; F1 HelpScreen() CASE Ch = 13 : QUITLOOP ; Enter CASE Ch > 31 : ; regular SWITCH CASE j = 61 : j = EndofLine() QUITLOOP CASE LEN([]) = 60 : MiddleofLine() QUITLOOP OTHERWISE : [] = SUBSTR([], 1, j - 1) + CHR(Ch) + SUBSTR([], j, LEN([]) - j + 1) j = j + 1 QUITLOOP ENDSWITCH ENDSWITCH ENDWHILE IF Ch = 13 THEN QUITLOOP ENDIF ENDWHILE Reformat() ENDPROC PROC EndofLine() PRIVATE j, Word IF SUBSTR([], 60, 1) <> " " THEN SWITCH CASE SEARCH(" ", []) = 0 : Word = CHR(Ch) OTHERWISE : j = 60 WHILE SUBSTR([], j, 1) <> " " j = j - 1 ENDWHILE Word = SUBSTR([], j + 1, 60 - j) + CHR(Ch) [] = SUBSTR([], 1, j - 1) ENDSWITCH ELSE Word = CHR(Ch) ENDIF InsertRow() [] = RemoveSp(Word) RETURN LEN([]) + 1 ENDPROC PROC MiddleofLine() PRIVATE j1, Word IF SEARCH(" ", SUBSTR([], j, 60 - j + 1)) = 0 THEN Word = SUBSTR([], j, 60 - j + 1) j1 = j ELSE j1 = 60 WHILE SUBSTR([], j1, 1) <> " " j1 = j1 - 1 ENDWHILE Word = SUBSTR([], j1 + 1, 60 - j1) ENDIF [] = SUBSTR([], 1, j - 1) + CHR(Ch) + SUBSTR([], j, j1 - j) j = j + 1 InsertRow() [] = RemoveSp(Word) UP MOVETO FIELD FieldName[ifn] ENDPROC PROC RemoveSp(String) WHILE MATCH(String, " ..", String) ENDWHILE WHILE SUBSTR(String, LEN(String), 1) = " " String = SUBSTR(String, 1, LEN(String) - 1) ENDWHILE RETURN String ENDPROC PROC Reformat() PRIVATE I, l, lw, Word HOME WHILE NOT ATLAST() I = [I] l = 59 - LEN([]) DOWN WHILE ISBLANK([]) DEL ENDWHILE IF [I] = I THEN QUITLOOP ENDIF IF l > LEN([]) THEN Word = [] [] = "" UP MOVETO FIELD FieldName[ifn] [] = [] + " " + Word LOOP ENDIF lw = SEARCH(" ", SUBSTR([], 1, l)) IF lw = 0 THEN [I] = I + 1 LOOP ELSE lw = l WHILE SUBSTR([], lw, 1) <> " " lw = lw - 1 ENDWHILE Word = SUBSTR([], 1, lw - 1) [] = RemoveSp(SUBSTR([], lw + 1, LEN([]) - lw)) UP MOVETO FIELD FieldName[ifn] [] = [] + " " + Word ENDIF ENDWHILE ENDPROC PROC DeleteRecord() PRIVATE Choice IF TableMain = "Ref" THEN SHOWMENU "Ooops" : "Cancel operation", "Delete" : "Delete current record from data base" TO Choice SWITCH CASE Choice = "Ooops" : RETURN CASE Choice = "Delete" : OTHERWISE : RETURN ENDSWITCH DeleteTable("Ath") DeleteTable("Ins") DeleteTable("Nam") DeleteTable("Src") DeleteTable("Abs") DeleteTable("Key") MOVETO TableMain MOVETO [Index] DEL IF [] = "" THEN EditFieldMain(FALSE) ENDIF ELSE DO_IT! FORMKEY COEDITKEY DEL IF ISEMPTY("Answer") THEN RETURN FALSE ENDIF FORMKEY ENDIF RETURN TRUE ENDPROC PROC DeleteTable(Name) MOVETO Name HOME WHILE NOT ATLAST() DEL ENDWHILE DEL ENDPROC PROC Replace() PRIVATE x, y, Choice, Global, I, Reform, x1, y1 IF NOT User THEN MESSAGE "Only for registered users, I'm sorry" SLEEP 1000 RETURN ENDIF IF ISEMPTY("Ref") THEN MESSAGE "Data base is empty" SLEEP 1000 RETURN ENDIF IF ifn = 3 THEN MESSAGE "You can't replace in Flag field" SLEEP 1000 RETURN ENDIF IF TableMain = "Answer" AND ifn = 1 THEN MESSAGE "You can't change Index field in Answer table" SLEEP 1000 RETURN ENDIF Global = FALSE PAINTCANVAS ATTRIBUTE AtMenu 0, 0, 1, 79 STYLE ATTRIBUTE AtMenu @ 1,0 CLEAR EOL ?? "Enter value or pattern to search for" @ 0,0 CLEAR EOL ?? "Value: " CURSOR NORMAL ACCEPT "A60" DEFAULT Value TO Value CURSOR OFF IF NOT Retval THEN RETURN ENDIF @ 1,0 CLEAR EOL ?? "Enter value to change to" @ 0,0 CLEAR EOL ?? "ToValue: " CURSOR NORMAL ACCEPT "A60" DEFAULT ToValue TO ToValue CURSOR OFF IF NOT Retval THEN RETURN ENDIF IF Value = "" AND ToValue = "" THEN RETURN ENDIF IF itn = 1 THEN IF Value <> "" THEN SCAN FOR MATCH([], ".." + Value + "..", x, y) IF NOT Global THEN RefreshCanvas() PAINTCANVAS REVERSE ROW(), COL() - LEN(y) - LEN(Value), ROW(), COL() - LEN(y) -1 SHOWMENU "Yes" : "Replace", "No" : "Ignore", "Global" : "Replace without confirmation", "Cancel" : "Quit the operation" TO Choice SWITCH CASE Choice = "Yes" : CASE Choice = "No" : LOOP CASE Choice = "Global" : Global = TRUE CASE Choice = "Cancel" : RETURN CASE Choice = "Esc" : RETURN ENDSWITCH ENDIF [] = x + ToValue + y IF MOD(RECNO(), 5) = 0 THEN MESSAGE "Processing record " + STRVAL(RECNO()) ENDIF ENDSCAN ELSE SHOWMENU "Forward" : "To append " + ToValue + " to the end of each record", "Cancel" : "Cancel the operation" TO Choice IF Choice = "Cancel" OR Choice = "Esc" THEN RETURN ENDIF SCAN [] = [] + ToValue IF MOD(RECNO(), 5) = 0 THEN MESSAGE "Processing record " + STRVAL(RECNO()) ENDIF ENDSCAN ENDIF ELSE MOVETO TableMain IF Value <> "" THEN SCAN MOVETO TableName[itn] MOVETO FIELD FieldName[ifn] Reform = FALSE SCAN FOR MATCH([], ".." + Value + "..", x, y) IF NOT Global THEN RefreshCanvas() PAINTCANVAS REVERSE ROW(), COL() - LEN(y) - LEN(Value), ROW(), COL() - LEN(y) - 1 SHOWMENU "Yes" : "Replace", "No" : "Ignore", "Global" : "Replace without confirmation", "Cancel" : "Quit the operation" TO Choice SWITCH CASE Choice = "Yes" : CASE Choice = "No" : LOOP CASE Choice = "Global" : Global = TRUE CASE Choice = "Cancel" : RETURN CASE Choice = "Esc" : RETURN ENDSWITCH ENDIF Reform = TRUE x = x + ToValue IF SUBSTR(x, LEN(x), 1) <> " " AND SUBSTR(y, 1, 1) <> " " THEN IF MATCH(y, ".. ..", x1, y1) THEN x = x + x1 y = y1 ELSE x = x + y y = "" ENDIF ENDIF x = RemoveSp(x) Pack(x) InsertRow() y = RemoveSp(y) x1 = Pack(y) FOR y1 FROM 1 TO x1 UP MOVETO FIELD FieldName[ifn] ENDFOR ENDSCAN IF Reform THEN Reformat() ENDIF MOVETO TableMain IF MOD(RECNO(), 5) = 0 THEN MESSAGE "Processing record " + STRVAL(RECNO()) ENDIF ENDSCAN ELSE SHOWMENU "Forward" : "To append " + ToValue + " to the end of each record", "Cancel" : "Cancel the operation" TO Choice IF Choice = "Cancel" OR Choice = "Esc" THEN RETURN ENDIF SCAN MOVETO TableName[itn] MOVETO FIELD FieldName[ifn] END IF LEN([]) + LEN(ToValue) > 60 THEN I = [I] DOWN [I] = I + 1 [] = ToValue ELSE [] = [] + ToValue ENDIF MOVETO TableMain IF MOD(RECNO(), 5) = 0 THEN MESSAGE "Processing record " + STRVAL(RECNO()) ENDIF ENDSCAN ENDIF ENDIF HOME ENDPROC PROC InsertRow() I = [I] END IF [I] = I THEN DOWN ELSE WHILE [I] > I [I] = [I] + 1 UP MOVETO FIELD FieldName[ifn] ENDWHILE DOWN INS ENDIF [I] = I + 1 ENDPROC PROC Pack(x) PRIVATE i, x1 i = 1 WHILE TRUE IF LEN(x) > 60 THEN IF SEARCH(" ", SUBSTR(x, 1, 60)) = 0 THEN [] = SUBSTR(x, 1, 60) x = SUBSTR(x, 61, LEN(x) - 60) ELSE x1 = 60 WHILE SUBSTR(x, x1, 1) <> " " x1 = x1 - 1 ENDWHILE [] = SUBSTR(x, 1, x1 - 1) x = SUBSTR(x, x1 + 1, LEN(x) - x1) ENDIF InsertRow() i = i + 1 ELSE [] = x QUITLOOP ENDIF ENDWHILE RETURN i ENDPROC PROC DittoRecord() PRIVATE i IF NOT User THEN MESSAGE "Only for registered users, I'm sorry" SLEEP 1000 RETURN ENDIF IF ifn = 1 OR ifn = 3 THEN MESSAGE "Can't duplicate and paste in this field" SLEEP 1000 RETURN ENDIF FieldPaste = ifn IF ifn = 2 THEN dimArea = 1 ARRAY Area[dimArea] Area[1] = [] ELSE dimArea = NIMAGERECORDS() IF dimArea = 0 THEN dimArea = 1 ARRAY Area[dimArea] Area[i] = "" ELSE ARRAY Area[dimArea] HOME FOR i FROM 1 TO dimArea Area[i] = [] IF i < dimArea THEN DOWN ENDIF ENDFOR ENDIF ENDIF ENDPROC PROC PasteRecord() IF ifn = 1 OR ifn = 3 THEN MESSAGE "Can't duplicate and paste in this field" SLEEP 1000 RETURN ENDIF IF ifn = 2 AND FieldPaste <> 2 THEN MESSAGE "Nothing to paste" SLEEP 1000 RETURN ENDIF IF ifn <> 2 THEN HOME ENDIF UNLOCKRECORD IF ifn = 2 THEN IF [] <> "" THEN MESSAGE "Clear the field, first" SLEEP 1000 RETURN ENDIF [] = Area[1] ELSE IF NIMAGERECORDS() = 0 THEN DOWN ELSE IF [] <> "" THEN MESSAGE "Clear the field, first" SLEEP 1000 RETURN ENDIF ENDIF FOR i FROM 1 TO dimArea [] = Area[i] [I] = i - 1 IF i < dimArea THEN DOWN ENDIF ENDFOR ENDIF ENDPROC PROC Journals() PRIVATE Jour, Journal Jour = [] UNLOCKRECORD FORMKEY MOVETO "Journals" MOVETO [Short] LOCATE Jour IF Retval THEN Journal = [Journal] ELSE PROMPT "Choose a Journal and press F2", "Esc to cancel" WHILE TRUE WAIT TABLE UNTIL -60, ;"F2" 27, ;"Esc" -83 ;"Del" SWITCH CASE Retval = -60 : Journal = [Journal] QUITLOOP CASE Retval = 27 : Journal = "" QUITLOOP CASE Retval = -83 : ; Del SHOWMENU "Ooops" : "Cancel operation", "Delete" : "Delete the current record" TO Choice IF Choice = "Delete" THEN DEL ENDIF ENDSWITCH ENDWHILE ENDIF MOVETO TableMain FORMKEY MOVETO TableName[itn] IF Journal <> "" THEN [] = Journal [I] = 0 ENDIF ENDPROC