[REBOL] Re: dirty editor
From: g:santilli:tiscalinet:it at: 29-Jun-2002 21:08
Hi Jim,
On Friday, June 28, 2002, 5:01:48 PM, you wrote:
JC> put: func [str num][
JC> if my-area <> system/view/focal-face [return]
JC> if not system/view/caret [return]
JC> insert system/view/caret str
JC> system/view/caret: skip system/view/caret num
JC> show my-area
JC> ]
How about:
put: func [str] [
if my-area <> system/view/focal-face [return]
if not system/view/caret [return]
system/view/caret: insert system/view/caret str
show my-area
]
JC> My question is, can I get this into a block or series?
You'd better change your Area's feel; it handles keys this way:
engage: func [face act event][
switch act [
down [
either not-equal? face view*/focal-face [
focus face
view*/caret: offset-to-caret face event/offset
] [
view*/highlight-start:
view*/highlight-end: none
view*/caret: offset-to-caret face event/offset
]
show face
]
over [
if not-equal? view*/caret offset-to-caret face event/offset [
if not view*/highlight-start [view*/highlight-start: view*/caret]
view*/highlight-end: view*/caret: offset-to-caret face event/offset
show face
]
]
key [edit-text face event get in face 'action]
]
]
i.e. calling the EDIT-TEXT function that you can find in the
CTX-TEXT object:
>> probe get in ctx-text 'edit-text
func [
face event action
/local key set-caret liney hi swap-text tmp tmp2 page-up page-down
][
key: event/key
if flag-face? face hide swap-text: [
tmp: face/text face/text: face/data face/data: tmp
view*/caret: either error? try [index? view*/caret] [tail face/text] [
at face/text index? view*/caret
]
]
if word? key [
either event/shift [
hi: view*/caret
if not view*/highlight-start [view*/highlight-start: hi]
] [unlight-text]
tmp: caret-to-offset face view*/caret
textinfo face view*/line-info view*/caret
liney: view*/line-info/size/y
hi: event/shift
]
if char? key [
either find keys-to-insert key [insert-char face key] [key: select keymap key]
]
if word? key [
set-caret: [view*/caret: offset-to-caret face tmp]
page-up: [
tmp/y: tmp/y - face/size/y
if not head? view*/line-info/start set-caret
]
page-down: [
tmp/y: tmp/y + face/size/y
if not tail? offset-to-caret face tmp set-caret
]
switch key [
back-char [
if all [not delete-selected-text not head? view*/caret] [
either event/control [
tmp2: view*/caret
remove/part view*/caret: back-word tmp2 tmp2
] [
remove view*/caret: back view*/caret
]
]
face/dirty?: true
]
del-char [
if all [not delete-selected-text not tail? view*/caret] [
either event/control [
remove/part view*/caret next-word view*/caret
] [
remove view*/caret
]
]
face/dirty?: true
]
up [
either event/control page-up [
tmp/y: tmp/y - liney
if not head? view*/line-info/start set-caret
]
]
down [
either event/control page-down [
tmp/y: tmp/y + liney
if not tail? offset-to-caret face tmp set-caret
]
]
home [
view*/caret: either event/control [head view*/caret] [beg-of-line view*/caret]
]
end [
view*/caret: either event/control [tail view*/caret] [end-of-line view*/caret]
]
left [
if not head? view*/caret [
view*/caret: either event/control [back-word view*/caret] [back view*/caret]
]
]
right [
if not tail? view*/caret [
view*/caret: either event/control [next-word view*/caret] [next view*/caret]
]
]
page-up page-up
page-down page-down
enter [
either flag-face? face return [
if flag-face? face hide swap-text
action face face/data
if flag-face? face tabbed [focus next-field face]
exit
] [insert-char face newline]
]
copy-text [copy-text face unlight-text]
cut-text [copy-text face delete-selected-text face/dirty?: true]
paste-text [
delete-selected-text
face/line-list: none
face/dirty?: true
view*/caret: insert view*/caret read clipboard://
]
clear-tail [
remove/part view*/caret end-of-line view*/caret
face/dirty?: true
]
all-text [hilight-all face]
tab-char [
if flag-face? face tabbed [
either in face 'refocus [face/refocus event/shift] [
tmp2: either event/shift [back-field face] [next-field face]
if flag-face? face hide swap-text
action face face/data
focus tmp2
]
exit
]
insert-char face tab
]
]
]
if hi [view*/highlight-end: view*/caret]
if face: view*/focal-face [
if flag-face? face hide [
insert/dup clear face/data "*" length? face/text
do swap-text
]
textinfo face view*/line-info view*/caret
liney: view*/line-info/size/y
tmp: caret-to-offset face view*/caret
tmp2: face/para/scroll
if all [tmp/x <= 0 tmp2/x < 0] [face/para/scroll/x: tmp2/x - tmp/x]
if all [tmp/y <= 0 tmp2/y < 0] [face/para/scroll/y: tmp2/y - tmp/y]
action: face/size - tmp - face/para/margin
if action/x - 5 <= 0 [face/para/scroll/x: tmp2/x + action/x - 5]
if action/y - liney <= 0 [face/para/scroll/y: tmp2/y + action/y - liney]
show face
]
]
Notice the lines with:
face/dirty?: true
But I still think it would be easier to remove or change the event
func instead of having to patch edit-text...
Regards,
Gabriele.
--
Gabriele Santilli <[g--santilli--tiscalinet--it]> -- REBOL Programmer
Amigan -- AGI L'Aquila -- REB: http://web.tiscali.it/rebol/index.r