home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
utilities
/
utilsd
/
edit
/
!lEdit
/
l
/
text
< prev
next >
Wrap
Text File
|
1995-01-19
|
15KB
|
452 lines
;;; *** lEdit - Lisp Editor ***
;;; (c) 1995 Urs Bisang
;;; Version 0.1
;;;
;;; dieses file enthaelt high-level support routinen
;;; fuer das txt modul von riscoslib
;;;
;;; *** globale variablen ***
;; liste aller aktiver text buffers
(define *text-bufferlist* '())
;; default name um eine selection abzuspeichern
(define *text-selection-name* "Selection")
;; das letzte von find benutzte suchstring
(define *text-previous-searchstring* "")
;; flag das anzeigt ob find casesensitiv suchen soll
(define *text-casesensitiv-find* #f)
;; bringe den cursor an den start des text buffers
(define (text-cursor-home text) (txt-setdot text 0))
;; bringe den cursor ans ende des text buffers
(define (text-cursor-end text)
(txt-setdot text (txt-size text)))
;; bewege den cursor um eine bildschirmhoehe nach unten
(define (text-cursor-pagedown text)
(txt-movevertical text (txt-visiblelinecount text) 1))
;; bewege den cursor um eine bildschirmhoehe nach oben
(define (text-cursor-pageup text)
(txt-movevertical text (- (txt-visiblelinecount text)) 1))
;; loesche n zeichen an der stelle i im textbuffer
(define (text-deleteat text i n)
;; falls der dot nach der selection ist, adjust dot.
;; falls der dot innerhalb der selection ist,
;; setze dot an den anfang der selection
(if (> (txt-dot text) i)
(if (< (txt-dot text) (+ i n))
(txt-setdot text i)
(txt-movedot text (- n))))
(let ((old-dot (txt-dot text)))
(txt-setdot text i)
(txt-delete text n)
(txt-setdot text old-dot)))
;; loesche selektierten text aus dem textbuffer
(define (text-delete-selection)
(if (txtscrap-selectowner)
(let ((text (txtscrap-selectowner))
(start (txt-selectstart text))
(end (txt-selectend text)))
(text-deleteat text start (- end start))
(text-clear-selection))))
;; loesche eine selektion
(define (text-clear-selection)
(if (txtscrap-selectowner)
(txtscrap-setselect (txtscrap-selectowner) 0 0)))
;; kopiere eine selection
(define (text-copy-selection text1)
(if (txtscrap-selectowner)
(let ((text2 (txtscrap-selectowner))
(selection (txt-getselection text2)))
(txt-insertstring* text1 selection))))
;; verschiebe eine selection
(define (text-move-selection text1)
(if (txtscrap-selectowner)
(let ((text2 (txtscrap-selectowner))
(n (- (txt-selectend text2)
(txt-selectstart text2)))
(selection (txt-getselection text2)))
(text-delete-selection)
(txt-insertstring text1 selection)
(txtscrap-setselect text1
(txt-dot text1)
(+ (txt-dot text1) n))
(txt-movedot text1 n))))
;; ist ein text buffer veraendert seit der letzten speicherung ?
(define (text-buffer-updated? text)
(= (bit-and (txt-charoptions text) 4) 4))
;; zeige aenderungen im text buffer nicht sofort an
(define (text-dont-update text)
(txt-setcharoptions text 1 0))
;; zeige aenderungen im text buffer sofort an
(define (text-update text)
(txt-setcharoptions text 1 1))
;; update den titel eines editor windows
(define (text-update-title text)
(txt-settitle text
(string-concat
(if (getp text 'filename)
(getp text 'filename)
*lisp-untitled-name*)
(if (text-buffer-updated? text)
" *"
"")
(if (> (txtwin-number text) 1)
(string-concat " " (txtwin-number text))
"")
" (" (getp text 'modename) ")")))
;; erzeuge einen neuen view eines schon bestehenden windows
(define (text-new-view text)
(let ((text1 (gensym)))
(set-eval! text1 text)
(txtwin-new text)
;; bug in riscos lib???
;; window title und menu handler muessen hier neu gesetzt werden
;; damit es funktioniert !!
(text-update-title text)
(event-attachmenumaker (txt-syshandle text)
lisp-ledit-menu-maker&handler
text1)))
;; schliesse ein fenster eines text buffers und speichere
;; den buffer (falls noetig) wenn das letzte fenster des
;; buffers geschlossen wird
(define (text-close-window text)
(if (> (txtwin-number text) 1)
(begin (txtwin-dispose text)
(text-update-title text))
(text-remove-buffer text)))
;; entferne einen buffer und schliesse alle zum buffer gehoerenden
;; fenster. frage ob der buffer gespeichert werden soll, falls er
;; veraendert wurde
(define (text-remove-buffer text)
(if (text-buffer-updated? text)
(if (text-query-save text)
(text-kill-buffer text))
(text-kill-buffer text)))
;; fragt mit einer dialogbox ob ein buffer gesaved werden soll
;; und speichert den buffer falls es zutrifft
(define (text-query-save text)
(let ((field (dbox-popup "close" "This file has been modified")))
(cond
((= field 0) (text-save-buffer text)) ; save
((= field 2) #t) ; discard
((= field 3) #f) ; cancel
(else #f))))
;; entfernt einen buffer aus dem speicher und der buffer-liste
(define (text-kill-buffer text)
(set! *text-bufferlist* (list-remove *text-bufferlist* text))
;; bug in riscoslib? text selection wird nicht geloescht,
;; wenn buffer entfernt wird !!! muss explizit geloescht werden!
(if (equal? text (txtscrap-selectowner))
(text-clear-selection))
(txt-dispose text))
;; gib die anzahl modifizierter text buffer zurueck oder #f
(define (text-modified-buffers)
(let ((n 0) (l *text-bufferlist*))
(while l
(if (text-buffer-updated? (car l))
(inc! n))
(set! l (cdr l)))
(if (= n 0) #f n)))
;; speichere einen text buffer
(define (text-save-buffer text)
(if (getp text 'filename)
(text-save text)
(text-saveas text)))
;; speichere text buffer mittels dragging
(define (text-saveas text)
(let ((filename (getp text 'filename)))
(cond (filename (txt-saveas text filename 0 (txt-size text) #t))
(else (set! filename
(txt-saveas text (getp text 'defaultname)
0 (txt-size text) #t))
(cond (filename (setp! text 'filename filename)
(text-update-title text)
filename)
(else #f))))))
;; speichere current selection mittels dragging
(define (text-save-selection text1)
(let ((text (txtscrap-selectowner)))
(if text
(txt-saveas text
*text-selection-name*
(txt-selectstart text)
(txt-selectend text)
#t))))
;; printe current selection
(define (text-print-selection text1)
(let ((text (txtscrap-selectowner)))
(if text
(if (not (txt-print text
(txt-selectstart text)
(txt-selectend text)
#t))
(werr 0 "can't print - printer application not found")))))
;; speichere text buffer bei schon bekanntem namen
(define (text-save text)
(let ((filename (getp text 'filename)))
(if filename
(begin
(txt-save text filename 0 (txt-size text) #t)
(text-update-title text)
#t)
#f)))
;; printe den inhalt des text buffers
(define (text-print text)
(if (not (txt-print text 0 (txt-size text) #t))
(werr 0 "can't print - printer application not found")))
;; fuege ein in ein editor window gedraggtes file an der cursor
;; position ein
(define (text-insert-dragged-file text)
(let ((filename (car (xferrecv-checkinsert))))
(cond ((txt-load text filename (txt-dot text) #t)
(txt-setcharoptions text 4 4) ; text is updated
(text-update-title text)))
(xferrecv-insertfileok)))
;; lade ein in auf das baricon gedraggtes file und zeige
;