|
AnaMonitor Browser - Source CodeA REBOL object and block browser. |
|
REBOL [ Title: "AnaMonitor" Version: 2.0.0 File: %AnaMonitor.r Email: rotenca@libero.it Author: "Romano Paolo Tenca" Copyright: {GNU General Public License - Copyright (C) Romano Paolo Tenca 2001-2003} Web: http://www.rebol.it/~romano Rights: { This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } Aknowledgments: {Thanks to Gabriele Santilli for its beta testing and its support} Beta: false History: [ [2.0.0 27-Feb-2003 "Second major public release"] [1.1.0 2-Nov-2001 "First public release"] ] Date: none Category: [vid view utils 2] Purpose: { ^-^-A debugging tool to visually examine Rebol values. ^-} ] context [ set 'win-offset? func [ {Given any face, returns its window offset. Patched by Romano Paolo Tenca} face [object!] /local xy ] [ xy: 0x0 if face/parent-face [ xy: face/offset while [face: face/parent-face] [ if face/parent-face [ xy: xy + face/offset + either object? face/edge [face/edge/size] [0] ] ] ] xy ] system/view/wake-event: func [port /local event no-btn p-f] bind [ event: pick port 1 if none? event [ if debug [print "Event port awoke, but no event was present."] return false ] awake event ] in system/view 'self awake: func [event /local no-btn p-f] bind [ either not p-f: pop-face [ do event empty? screen-face/pane ] [ either all [ event/type = 'key event/key = escape ] [hide-popup] [ either any [ p-f = event/face all [ event/face same? p-f/parent-face find-window event/face within? event/offset win-offset? p-f p-f/size ] ] [ no-btn: false if block? get in p-f 'pane [ no-btn: foreach item p-f/pane [if get in item 'action [break/return false] true] ] if any [all [event/type = 'up no-btn] event/type = 'close] [hide-popup] do event ] [ either p-f/action [ if not find [move time inactive] event/type [ hide-popup ] if find [time inactive resize close] event/type [do event] ] [ if find [resize offset time] event/type [do event] ] ] none? find pop-list p-f ] ] ] in system/view 'self free: true set 'eat func [/only blk [block!]] [ if free [ free: false any [only blk: [move]] until [ only: pick system/view/event-port 1 not all [only find blk only/type] ] if only [awake only] free: true ] ] ] anamonitor-ctx: context [ window-mins: [subface 300x100 ly-exe 300x200 ly 600x430] basecol: aqua backcol: pewter view*: system/view wnum: 0 stopmode: false h: none out-range: "(out-of-range)" clickme: "(click me)" header: make system/script/header [ set [Version Date] first history license: none ] find-into: func [ "Find inside a block" series value /part range /only /case /any /with wild /skip size /match /tail /last /reverse /local f ] [ f: refine [find first series value] [[part range] only case any [with wild] [skip size] match tail last reverse] [return tmp] while [not tail? series] [ if do f [return index? series] series: next series ] none ] switch-m: func [ {Selects a choice and evaluates the first block! which follows it.} [throw] value "Value to search for." cases [block!] "Block of cases to search." /default case "Default case if no others are found." ] [ either value: find cases value [ until [block? first value: next value] do first value ] [either default [do case] [none]] ] rejoin: func [ "Reduces and joins a block of values." block [block!] "Values to reduce and join" /with value ] [ if empty? block: reduce block [return block] if with [parse/all block [any [skip with: skip (insert with :value)]]] head insert tail either series? first block [copy first block] [form first block] next block ] rig: func [data num [integer!]] [ data: to string! data head insert/dup data " " max 0 num - length? data ] lef: func [[catch] data num [integer!]] [ data: to string! data head insert/dup tail data " " max 0 num - length? data ] as-pair: func [blk] [to pair! reduce blk] set 'find-ref func ["Search references to/thru a given value" [catch] target "Value to find" /cont {Start the search from this object (default: system/words)} ctx [object!] /circ "Print also circular references" /only "Return only the first path found" /body "Search also in function body" /result "Return result in a block" /exclude "Exclude from search" custom [block!] /local delayed delayedp past pastn print inof form-path same? visited res ] [ print: func [x] [all [not result system/words/print :x]] form-path: func [x] [replace/all form :x " " "/"] same?: func [a [any-type!] b [any-type!]] [ if all [error? :a error? :b] [return (disarm :a) = disarm :b] if any [error? :a error? :b] [return false] not error? try [return system/words/same? :a :b] ] inof: func [ item [object! block! paren! function!] name [string!] target /local names values fin fiv ret trovati tmp ] [ if find/only visited :item [return false] insert/only tail visited :item either object? :item [ names: next first :item values: next second :item ] [ if function? :item [item: second :item] if error? try [names: make block! length? :item] [return false] repeat i length? :item [insert tail names i] values: :item ] insert/only tail past :item insert tail pastn name trovati: copy [] while [not tail? :names] [ if not unset? first :values [ fin: form first :names error? fiv: first :values if any [ all [ any-word? :target object? :item same? in :item first names :target ] same? :fiv :target either any-word? :fiv [ all [ value? :fiv same? get/any :fiv :target ] ] [ all [ any-path? :fiv any [ all [ any-word? :target same? first :fiv :target ] all [ any-path? :target (length? :fiv) >= length? :target equal? copy/part :fiv length? :target :target same? first :fiv first :target ] all [ value? first :fiv same? get/any first :fiv :target ] ] ] ] ] [ insert tail trovati reduce [copy past copy head insert tail pastn fin] print tmp: form-path next pastn remove back tail pastn insert tail res tmp if only [return true] ] if any [ block? :fiv object? :fiv paren? :fiv all [body function? :fiv fin: join fin "/[BODY]"] ] [ either find past :fiv [ if circ [ insert/only tail delayed :fiv insert/only tail delayedp join pastn fin ] ] [ all [ret: inof :fiv fin :target only return true] ] ] ] names: next :names values: next :values ] remove back tail pastn remove back tail past if circ [ foreach [past pastn] trovati [ if not empty? past [ repeat i length? delayed [ if tmp: find past delayed/:i [ insert tail res tmp: form-path next join delayedp/:i skip pastn index? tmp print ["^-" tmp] ] ] ] ] ] :ret ] custom: head insert tail copy [self cb :find-ref] any [custom []] if all [only any [result circ]] [throw make error! "Invalid Refinements"] insert insert tail visited: make block! 10000 reduce custom reduce [ visited past: make block! 25 pastn: make block! 25 res: make block! 100 ] if circ [insert insert tail visited delayed: make block! 100 delayedp: make block! 100] any [cont ctx: system/words] inof ctx either cont ["Context"] ["system/words"] :target visited: pastn: custom: delayed: delayedp: none either only [first res] [either result [:res] [none]] ] set 'find-global func [f [function!] /local w out code] [ out: copy [] code: [if global? :w [if value? :w [if any-function? get :w [return]] insert tail out to-word :w]] parse second :f r: [ any [ into r | set w [word! | get-word! | set-word! | set-word!] (do code) | set w [path! | set-path! | lit-path!] (w: first :w do code) | skip ] ] out ] test-value: func [x [any-type!]] [ if not value? 'x [return -2] if error? :x [return 0] if all [any-block? :x error? try [tail? :x]] [return -1] 1 ] get-all: func [ "Get any value of a path or of a word" w [path! set-path! lit-path! any-word!] ] [ either error? set/any 'w either any-word? :w [get/any :w] [get-path/anyv/ignore :w] [return :w] [:w] ] get-path: func [ "Get the value of a path of a word" path [path! set-path! lit-path!] /anyv "Like /any in get/any" /ignore "Ignore functions refinements" /local b e get-in res ] [ get-in: func [p w [word! get-word! integer!]] [ if get-word? :w [ if error? try [w: get :w] [make error! reduce ['script 'no-value :w]] ] any [ if all [integer? :w any-block? :p] [ if error? try [error? set/any 'res pick :p :w] [make error! reduce ['script 'out-of-range :w]] true ] if all [word? :w object? :p] [ if error? try [error? set/any 'res get/any in :p :w] [make error! reduce ['script 'invalid-path :w]] true ] if any [block? :p hash? :p] [ all [set-word? :w w: to-word :w] if any [ not p: find :p :w error? try [error? set/any 'res select :p :w] ] [make error! reduce ['script 'invalid-path :w]] true ] if any-function? :p [if ignore [return :p] false] if find [pair! file! url! date! time! tuple! email! event! money! image! struct!] type?/word :p [ if error? try [return p/:w] [make error! reduce ['script 'invalid-path :w]] true ] make error! reduce ['script 'invalid-path :w] ] if error? get/any 'res [return get/any 'res] get/any 'res ] b: first head insert/only copy [] :path if error? try [error? e: get first :b] [make error! reduce ['script 'no-value first :b]] while [b: next :b not tail? :b] [error? set/any 'e get-in :e first :b] if all [not value? 'e not anyv] [make error! reduce ['script 'no-value :path]] if error? get/any 'e [return get/any 'e] get/any 'e ] any-path?: func [x [any-type!]] [any [path? :x set-path? :x lit-path? :x]] v-c: func [ x [any-word! path! lit-path! set-path!] /local res b-x t ] [ res: copy [] if any-path? :x [ if empty? x: head :x [return res] x: first :x ] t: third :bind change t/words reduce [block! any-word!] change t/known-word reduce [any-word!] foreach y first system/words [if not same? y b-x: bind y :x [insert tail res b-x]] change t/words reduce [block! word!] change t/known-word reduce [word!] res ] bindall: func [ "Binds words to a specified context." words [block! any-word!] "A block of words or single word." known-word [any-word!] "A sample word from the target context." /copy "Deep copies block before binding it." /local t res ] [ t: third :bind change t/words reduce [block! any-word!] change t/known-word reduce [any-word!] res: either copy [bind/copy :words :known-word] [bind :words :known-word] change t/words reduce [block! word!] change t/known-word reduce [word!] :res ] inall: func [ "Returns the word in the object's context." object [object!] word [any-word!] /local t res ] [ t: third :in change t/word reduce [any-word!] res: in object :word change t/word reduce [word!] :res ] undefined?: func [x [any-word! set-path! lit-path! path!]] [ if any-path? :x [ if empty? x: head :x [return true] x: first :x ] error? try [error? get/any :x] ] global?: func [x [any-word! set-path! lit-path! path!]] [ if any-path? :x [ if empty? x: head :x [return false] x: first :x ] same? :x first bind use reduce [:x] reduce [reduce [:x]] 'system ] context?: func [x [any-word! set-path! lit-path! path!]] [ any [ if undefined? :x ["Undefined"] if global? :x ["Global"] "Local" ] ] same-any?: func [x [any-type!] y [any-type!]] [ found? any [ all [not value? 'x not value? 'y] all [ value? 'x value? 'y same? :x :y ] ] ] equal-bc?: func [x y] [ if all [ equal? type? x type? y equal? length? x: head x length? y: head y ] [ while [not tail? x] [ if not same-any? first x first y [return false] x: next x y: next y ] if tail? y [return true] ] false ] type-any?: func ['x [word!] /word] [ either word [type?/word get/any :x] [type? get/any :x] ] try-err: func [[throw] blk /local err] [ either error? set/any 'err try blk [ err: disarm err print ["** Error: " reduce bind compose [(get err/id)] in err 'id] print ["** Near: " err/near] err ] [none] ] confine: func [blk /local interrupt] [ interrupt: on error? do does [error? loop 1 [error? catch [do blk interrupt: off]]] interrupt ] dump-as-style: func [ ss "Face to dump as style" /name new [word!] "Use this name for the cloned style" /local facets h ] [ if not name [new: 's] either ss/facets [ parse/all facets: copy/deep ss/facets [ thru 'with into [ any [ thru words: into [ any [ h: function! (change/only h second first h) | skip ] ] ] ] ] compose [(ss/style) (facets)] ] [reduce [ss/style]] ] charset-to-char: func [ "Converts charset to a block of commented chars" data [bitset!] /block "Return a block" /local out ] [ out: make string! 1000 for i 0 255 1 [if find data i [insert tail out rejoin [mold to char! i " ; " i "^/"]]] either block [to-block out] [out] ] sub-set?: func [a b] [equal? a intersect a b] charset-analyzer: func [ "" data [bitset!] /local out print alpha num alphanum notalphanum ascii notascii ] [ out: make string! 1000 print: func [x] [insert tail out join x "^/"] alpha: make bitset! [#"a" - #"z" #"A" - #"Z"] num: make bitset! [#"0" - #"9"] alphanum: union alpha num notalphanum: complement alphanum ascii: charset [#"^@" - #"^~"] notascii: complement ascii print either (length? charset-to-char/block data) < (- 24 + length? charset-to-char/block complement data) ["Charset include:"] [data: complement data "Charset exclude:"] if sub-set? ascii data [data: difference data ascii print "^-All ASCII chars"] if sub-set? notascii data [data: difference data notascii print "^-All not ASCII chars"] either sub-set? alphanum data [print "^-Alphanum" data: difference data alphanum] [ if sub-set? alpha data [data: difference data alpha print "^-Alpha"] if sub-set? num data [data: difference data num print "^-Num"] ] if not equal? data charset "" [ print "^-Single chars: [" print rejoin [charset-to-char data "]"] ] out ] my-styles: stylize [ btn: button 44 basecol edge [size: 1x1] with [ append init [ color: basecol if :action [ action: func [f v /local x] compose [ all [x: not f/state f/state: on show f] (:action) f v eat/only [key] if x [f/state: off show f] ] ] if :alt-action [ alt-action: func [f v /local x] compose [ all [x: not f/state f/state: on show f] (:alt-action) f v eat/only [key] if x [f/state: off show f] ] ] ] ] tgl: toggle basecol edge [size: 1x1] with [ append init [ color: basecol if :action [action: func [f v] compose [(:action) f v eat/only [key]]] ] ] check: check feel [ o-e: :engage engage: func [f a e /oc] [ oc: f/color f/color: red show f o-e f a e f/color: oc show f ] ] with [ append init [ if :action [action: func [f v] compose [(:action) f v eat/only [key]]] ] ] auto-panel: IMAGE with [ feel: none size: -1x-1 append init [ insert action: second :action [origin 0x0] pane: layout/parent/styles action self styles if negative? size/x [size/x: pane/size/x + either edge [edge/size/x * 2] [0]] if negative? size/y [size/y: pane/size/y + either edge [edge/size/y * 2] [0]] pane: pane/pane ] ] area-scroll: area edge [size: 1x1] with [ ar: sld: none redrag: does [sld/state: none sld/redrag min 1 (second page-size) / second size-text ar] page-size: does [ar/size - either ar/edge [2 * ar/edge/size] [0]] resize: func [newsize /local delta] [ delta: newsize - size size: newsize ar/size: ar/size + delta sld/offset: delta * 1x0 + sld/offset either in sld 'resize [sld/resize delta * 0x1 + sld/size] [ sld/size: delta * 0x1 + sld/size redrag ] ] update: func [/text txt] [ if text [self/text: ar/text: txt] ar/user-data: none ar/line-list: none sld/data: 0 ar/para/scroll: 0x0 redrag show [ar sld] ] append init [ self/init: [] para: make para [] pane: reduce [ ar: make-face/size/offset self size - 16x0 0x0 sld: make-face/size/offset/spec either find styles 'scroller ['scroller] ['slider] 16x0 + (size * 0x1) ar/size * 1x0 [ action: func [face action] [scroll-para ar face] effect: [gradient 200.200.200 230.230.230] ] ] feel: make ar/feel [ old-e: :engage detect: func [f e] [if e/type = 'down [view*/focal-face: ar/parent-face] e] engage: func [face act event] [ either find [scroll-line scroll-page] act [ sld/data: min 1 max 0 sld/data + min 1 (either act = 'scroll-line [ar/font/size] [second page-size]) * (second event/offset) / second (size-text ar) scroll-para ar sld show sld ] [ view*/caret: either ar/user-data [ar/user-data] [ar/text] view*/focal-face: ar old-e ar act event if view*/focal-face = ar [ ar/user-data: view*/caret sld/data: (abs second caret-to-offset ar ar/text) / max 1 (second size-text ar) - (second page-size) redrag show sld view*/focal-face: ar/parent-face ] ] ] ] ar/feel: none flags: exclude flags [font para] image: edge: effect: none update ] ] ] port2ob: func [port [port!] /local x x2 nuovalinea before err line h value tmp tmp2 new] [ tmp: port/state/inbuffer tmp2: port/state/outbuffer port/state/inbuffer: port/state/outbuffer: none x: mold port port/state/inbuffer: tmp port/state/outbuffer: tmp2 while [error? err: try [load x]] [ xl: parse/all x "^/" err: disarm err parse/all err/near ["(line " thru ") " copy line to end] parse line [copy before thru ": " copy value to end] either value [ nuovalinea: rejoin [before {"} "*** CHANGED WAS: " to-string value {"}] x2: find x line remove/part x2 length? line insert x2 nuovalinea ] [make error! "can't list this port"] ] parse/all x [ any [ set-word! h: " unset" (h: change/part h {"*** CHANGED WAS: unset"} 6) :h | h: "make object! [...]" (h: change/part h "self" 18) :h | skip ] ] new: do x new/state/inbuffer: either string? port/state/inbuffer [form port/state/inbuffer] [port/state/inbuffer] new/state/outbuffer: either string? port/state/outbuffer [form port/state/outbuffer] [port/state/outbuffer] new ] get-item: func [item [object!] name [string!] /local ob x tmp] [ either item/expandblk [ if error? set/any 'tmp get-path/anyv/ignore first bind to-block head insert copy name "item/ob/" 'item [return :tmp] get/any 'tmp ] [ ob: item/ob if error? ob [ob: disarm ob] either object? ob [ if error? set/any 'x get/any in ob first to-block name [x: disarm x] get/any 'x ] [ either event? ob [ get-path/anyv/ignore head change back tail 'ob/fake first to-block name ] [ if error? set/any 'x pick ob to-integer name [x: disarm x] get/any 'x ] ] ] ] pathstr: func [item [object!]] [rejoin [item/pathto either item/pathto <> "" ["/"] [""] item/obname]] intest: func [linea] [linea: parse linea none rejoin [linea/1 " " linea/2]] clip: func [data /local ritorno] [ ritorno: copy "" foreach item data [insert tail ritorno join item "^/"] write clipboard:// ritorno ] clipname: func [ctx /local value] [ value: either string? ctx/f-lista/picked/1 [value: first parse ctx/f-lista/picked/1 none] [""] value: rejoin [pathstr ctx/f-lista/actual-item "/" value] write clipboard:// value ] alerta: func [testo face [object!] /local old] [ old: face/text face/text: rejoin ["ATTENTION: " testo " !!"] face/color: red show face face/color: pewter face/text: old ] change-sn: func [ {Change the first item displayed in a text-list and redrag the slider} face whe /local len ] [ len: length? face/texts if face/sn >= whe [face/sn: max 0 min len - face/lc whe - 1] if face/sn <= (whe - face/lc) [face/sn: max 0 (whe - face/lc)] face/sld/state: none face/sld/data: face/sn / max 1 (len - face/lc) face/sld/redrag min 1 face/lc / max 1 len ] where?: func [ "Find the position of the first picked item if any" lista [object!] ] [ either lista: find lista/texts lista/picked/1 [index? lista] [1] ] move-to: func [lista [object!] where [integer! none!]] [ if where [ insert clear lista/picked pick lista/texts where change-sn lista where show lista ] ] find-parse-list: func [lista [object!] value [string!] offset [integer!]] [ repeat x length? lista/texts [ if value = pick parse pick lista/texts x none offset [move-to lista x exit] ] ] find-into-list: func [ "Find/match a text-list" lista [object!] search [string!] pos [integer!] ] [ move-to lista pos: find-into at lista/texts pos + 1 search pos ] scroll-to: func [ "Scroll an area with slider and show them" area slider text ] [ text: (caret-to-offset area text) - area/para/scroll area/para/scroll: min 0x0 area/size / 2 - text slider/data: (second text) / max 1 second size-text area show [slider area] ] find-area: func [ {Find text in an area-scroll, highlight, scroll and focus, return the new position} area search [string!] pos "start position" case ] [ if not empty? search [ focus area/ar pos: any [pos view*/caret head area/text] if pos: refine-do [find pos search] [case] [ view*/highlight-start: view*/caret: pos view*/highlight-end: pos: find/tail pos search scroll-to area/ar area/sld pos ] ] pos ] viewcolors: has [out x n] [ out: copy [] parse second system/words [ any [ to tuple! x: ( if all [tuple? x/1 3 = length? x/1] [ insert insert tail out pick first system/words index? x x/1 ] ) skip ] ] sort/skip/compare out 2 [2] n: 0 x: copy [across origin 5x5 space 1x1 styles my-styles style box box 75x55 font-size 11] foreach [name color] out [ insert tail x compose [box as-is (rejoin [form name newline color]) (color)] n: n + 1 if (n // 7) = 0 [insert tail x 'return] ] insert tail x [return btn "Close" [munview/only x]] mview/new x: layout x ] refine: func [command [block!] refinement [block!] /with "Ignore refinement value" /local path] [ command: head change/only copy command path: to path! first command foreach item refinement [ either block? item [ if any [with get first item] [ insert tail :path first item insert tail command next item ] ] [ if any [with get item] [insert tail :path item] ] ] command ] refine-do: func [command [block!] refinement [block!]] [do refine command refinement] do-key-face: func [event /local face] [ if face: find-key-face event/face event/key [ if get in face 'action [do-face face event/key] return none ] event ] window-feel: make object! [ redraw: none detect: func [face event /user-data] [ all [ object? user-data: event/face/user-data find [key resize close scroll-line] event/type in user-data event/type return do refine/with [user-data event] reduce [event/type] ] either event/type = 'key [do-key-face event] [event] ] over: none engage: none ] mview: func [panel [object!] /new /offset xy /title text /options opts] [ either stopmode [ panel/feel: window-feel panel/text: either title [text] [copy "AnaMonitor-Stop"] panel/offset: either offset [xy] [view*/screen-face/size - panel/size / 2] all [options panel/options: append any [panel/options copy []] opts] show-popup panel do-events ] [ refine-do [view/new panel] [[offset xy] [title text] [options opts]] panel/feel: window-feel any [new do-events] ] ] munview: func [/only face] [ all [only not object? face exit] if all [any [view*/pop-face stopmode] only face <> view*/pop-face] [exit] either stopmode [hide-popup] [refine-do [unview] [[only face]]] ] anahelp: func [ctx /local ar sld] [ munview/only ctx/helpface ctx/helpface: layout [ origin 10x10 styles my-styles backcolor backcol space 2 across ar: area-scroll 600x370 - 16x0 203.204.205 203.204.205 help-string bold font-name font-fixed wrap feel [engage: none] keycode [f1 #"^["] [munview/only ctx/helpface] return tgl 120 basecol "License" "Help" [ either not value [ar/update/text help-string] [ header/license: any [ header/license all [ any [ all [exists? %gpl.txt read %gpl.txt] all [exists-thru? http://www.rebol.it/~romano/gpl.txt read-thru http://www.rebol.it/~romano/gpl.txt] request-download http://www.rebol.it/~romano/gpl.txt all [exists-thru? http://www.gnu.org/licenses/gpl.txt read-thru http://www.gnu.org/licenses/gpl.txt] request-download http://www.gnu.org/licenses/gpl.txt header/rights ] ] ] ar/update/text either none? header/license [header/rights] [to string! header/license] ] focus ar ] do [focus ar] ] mview/new/offset ctx/helpface ctx/ly/offset + 13x25 ] my-choose: func [texts f panel offset size ali /local old old-e] [ size: size - 0x4 old: get in svvf/choice-iterator 'engage svvf/choice-iterator/engage: func [face act event] [ either event/type = 'down [ either all [face/selected face/selectable] [act: face/pane-parent hide-popup do-face face act] [hide-popup] svvf/choice-iterator/engage: :old ] [show face] ] offset: max 0x0 min offset panel/size - (size * 1x0) - (size * 0x1 * length? texts) old-e: svv/choice-face/edge svv/choice-face/edge: make panel/edge [effect: 'bevel size: 1x1] choose/window/offset/style texts :f panel offset make-face/size/spec/clone 'button size compose/deep [ colors: [(basecol) (orange - 20.20.20)] font: make font [shadow: none align: (to-lit-word ali) size: 11] para: make para [wrap?: false] edge: none ] svv/choice-face/edge: old-e ] preferences: func [ctx /local sv useprefs prefs ly-pref-b h] [ useprefs: has [ly-old actual-item] [ basecol: prefs/base-color backcol: prefs/back-color ly-old: ctx/ly actual-item: ctx/f-lista/actual-item ctx/make-ly ctx/f-lista/actual-item: actual-item ctx/refresh munview/only ly-old mview/new/options/offset/title ctx/ly 'resize ly-old/offset ctx/title munview/only ctx/ly-pref ] prefs: ctx/prefs sv: make prefs [] ly-pref-b: [ styles my-styles backcolor backcol across check prefs/dbcl [prefs/dbcl: value] h4 "Double-click" return check prefs/novalue [prefs/novalue: value] h4 "Show values of words" return check prefs/nounset [prefs/nounset: value] h4 "Hide unset" return check prefs/sort [prefs/sort: value] h4 "Sort list by" h: at h4 45 white backcol middle center pewter prefs/sortby [ my-choose ["Name" "Type"] func [f b] [face/text: prefs/sortby: copy f/text] ctx/ly-pref h + 0x18 45x20 'center ] return check prefs/expandblk [prefs/expandblk: value] h4 "Expand nested blocks" return h4 150 "Indent expanded blocks:" field 40x21 form prefs/ind [ error? try [prefs/ind: min 12 max 0 to-integer face/text] face/text: form prefs/ind show face ] return h4 150 "List font size:" field 40x21 form prefs/fontsize [ error? try [prefs/fontsize: max 4 to-integer face/text] face/text: form prefs/fontsize show face ] return h4 "When click on func:" text "view" pad -4x2 check found? find prefs/on-function 'view [alter prefs/on-function 'view] pad 0x-2 text "list" pad -4x2 check found? find prefs/on-function 'list [alter prefs/on-function 'list] return h4 "Back color" pad 0x-4 box backcol 25x25 edge [size: 1x1 color: black effect: none] [ if value: request-color/color face/color [ face/color: prefs/back-color: value ] ] pad 14x4 h4 "Base color" pad 0x-4 box basecol 25x25 edge [size: 1x1 color: black effect: none] [ if value: request-color/color face/color [ face/color: prefs/base-color: value ] ] return pad 0x10 btn 50 "Save" [save ctx/fileprefs third prefs useprefs] btn 50 "Use" [useprefs] btn 50 "Cancel" #"^[" [ctx/prefs: sv munview/only ctx/ly-pref] ] munview/only ctx/ly-pref ctx/ly-pref: center-face/with layout ly-pref-b ctx/ly mview/new/title ctx/ly-pref "Preferences" ] help-string: rejoin [ header/title join " by " header/author newline "Version: " header/version " " header/date newline "Report bugs and wish to : " header/email newline header/copyright newline { Anamonitor can be started with: ^-do %anamonitor.r or ^-do/args %anamonitor.r system/view or you can put in user.r ^-do/args %anamonitor.r false ;to not show the window and then you can use one of: ^-monitor ^-^-to list the system object ^-monitor <word/path> ^-^-to list <word/path> (object/block/function/port) ^-mon <arg> ^-^-to list the evaluated <arg> (object/block/function/port) ^-stop <arg> ^-^-to list the evaluated <arg> (object/block/function/port) ^-^-Stop works in Modal Mode, so can be called inside ^-^-the action of a face to stop event handling until Anamonitor ^-^-window is closed (esc key) ^-^-(Modal Mode is also activated when an user pop-face is displayed) ^-^-^-Buttons and Menu ^-* = menu with standard object ^-! = menu for the listed object ^-Menu = global menu ^-right-click = popup menu for the selected item ^-< = left = go back in the history ^-> = right = go forward in the history ^-Pr/Vi = F4 = ^^P = probe or view the block/function/face... ^-exe = F2 = ^^E = edit and execute a command ^-new = open a new window (right-click open a new shell) ^-prefs = F8 = open preferences window ^-expand = ^^B = expand nested blocks (and refresh) ^-unset = ^^U = hide the unset values (and refresh) ^-sort = ^^S = sort the list (and refresh) ^-help = F1 = open the help window ^-find references = find references to/thru item ^-find references (func) = search also in func body ^-ctrl-t = tile windows ^-^-^-^-Others keys ^-F9 ^^R = refresh the list ^-^^C = copy whole list to the clipboard ^-^^X = copy selected item's path to the clipboard ^-up down = move up/down ^-page-down page-up = move one page up/down ^-home end = start or end of list ^-space return = list the selected item ^-esc = close the window (in stop mode also the main window) ^-shift-tab = cycle window (not available in stopmode) ^-click item = list or view the item ^-right-click item = open a popup menu for the item ^-^-^-^-Notes ^-port! and event! are listed with a trick ^-error! are listed disarmed ^-Modal (awake-event) system is patched to correct some bugs. ^-Win-offset? is patched to correct some bugs. ^-^-^-^-Abbreviations used in names ^-get() = get a word ^-getp() = get a path ^-fh() = function header (ex. third :source) ^-fb() = function body (ex. second :source) ^-fl() = function locals (ex. first :source) ^-hd() = head of block ^-ctx() = context of a word (show only standard loaded words) ^-^-^-^-Other utilities ^-Find-ref is a function to find references to a given value, use ^-^-help find-ref ^-from the console. Es. ^- ^-^-find-ref/body system/view ^- ^-^-^-^-Examples ^-do/args %anamonitor false ^-view layout ly: [ ^-^-button "Stop" [ ^-^-^-stop [ly face value] ^-^-] ^-^-button "Mon" [ ^-^-^-mon [ly face value] ^-^-] ^-] } ] cb: [ itemob: context [ob: trueob: obname: truename: pathto: type: sorted: sortby: nounset: refresh: listall: expandblk: engage-cases: none whe: 1 listanomi: copy []] ly: ly-exe: ly-pref: helpface: subface: f-lista: f-text: f-intest: f-sort: f-unset: f-panel: f-expand: h: none search: "" case: false sf-off: 40x40 linelen: 200 cntype: 10 cnname: 21 cnblock: 4 cnblock-expanded: 14 histem: copy [] fileprefs: system/script/path/anampref.r prefs: context [ dbcl: true sort: false fontname: font-fixed fontsize: 12 wsize: 630x435 woffset: 50x50 nounset: false sortby: "Name" novalue: false expandblk: true ind: 4 on-function: [list view] base-color: navy back-color: pewter shortcut: [ "Words" "system/words" "System" "system" "Options" "system/options" "Script" "system/script" "User" "system/user" "Screen" "system/view/screen-face" "Windows" "system/view/screen-face/pane" "View" "system/view" "Vid" "svv" "Vid Colors" "svv/vid-colors" "Vid Feel" "svvf" "Vid Styles" "svv/vid-styles" "Header" "header-rules" "Net-utils" "net-utils" "Mail-list-rules" "mail-list-rules" ] ] wsize: prefs/wsize sfsize: prefs/wsize - 25x25 ly-exesize: prefs/wsize - 100x150 listable: copy [ object! 'oblist port! 'portlist block! 'blklist paren! 'blklist hash! 'blklist list! 'blklist event! 'evlist function! 'none action! 'none op! 'none native! 'none ] listable?: func [x [any-type!]] [find listable type?/word get/any 'x] listall: func [item [object!] /local x] [ if x: select listable to-word mold item/type [ item/listanomi: copy [] item/sorted: item/nounset: item/expandblk: false if x: do x item [item/listall: copy item/listanomi] return x ] ] portlist: func [item /local attrs tipo altro] [ if not port? item/ob [item/ob: item/ob/self] if error? try [item/ob: port2ob attrs: item/ob] [ alerta "Can't list this port" f-intest viewface/fixed pathstr item rejoin ["port " mold item/ob] return false ] item/ob/self: attrs item/tipo: 'port! attrs: next second item/ob foreach el next first item/ob [ tipo: type? first attrs altro: blobval first attrs insert tail item/listanomi rejoin [lef el cnname " " lef tipo cntype " : " altro] attrs: next attrs ] true ] oblist: func [item /local attrs tipo altro] [ attrs: second item/ob foreach el first item/ob [ tipo: type? first attrs altro: blobval first attrs insert tail item/listanomi rejoin [lef el cnname " " lef tipo cntype " : " altro] attrs: next attrs ] true ] evlist: func [item /local attrs tipo altro] [ evfield: [item/ob/type item/ob/time item/ob/face item/ob/offset item/ob/key item/ob/control item/ob/shift item/ob/double-click] attrs: reduce evfield foreach el evfield [ tipo: type? first attrs altro: either unset? first attrs ["unset"] [either tipo <> error! [blobval first attrs] [clickme]] insert tail item/listanomi rejoin [lef last :el cnname " " lef tipo cntype " : " altro] attrs: next attrs ] true ] expand-block: func [ blk [block! paren! hash! list!] name [string! none!] dest [block! none!] ind [string! none!] /history hist [block! none!] /local altro el save el-name s-index ] [ save: does [ insert/only tail dest rejoin [ lef el-name cnblock-expanded " " lef type-any?/word el cntype ": " ind altro ] ] dest: any [dest copy []] name: any [name copy ""] ind: any [ind copy ""] hist: head any [hist copy []] while [find/only hist :blk] [ if same? head :blk head first hist [ el-name: join name 1 el: :blk altro: "... (reflexion)" save return dest ] hist: next hist ] insert/only tail hist :blk if error? try [s-index: subtract index? :blk 1] [ el-name: join name 1 el: :blk altro: out-range return dest ] while [not tail? :blk] [ error? set/any 'el first :blk el-name: join name subtract index? :blk s-index either find [block! paren! hash! list!] type-any?/word el [ either error? try [tail? :el] [ altro: rejoin [either paren! = type-any? el [out-range] ["[out-of-range]"]] save ] [ altro: rejoin [either paren! = type-any? el ["("] ["["]] save expand-block/history :el join el-name "/" dest join ind head insert/dup copy "" " " prefs/ind hist change altro either paren! = type-any? el [")"] ["]"] save ] ] [ altro: either error? try [ set/any 'altro get/any 'el ] [copy clickme] [copy blobval get/any 'altro] save ] blk: next :blk ] dest ] blklist: func [item /local x] [ if error? try [if 0 = length? item/ob [return false]] [return false] either any [all [prefs/expandblk item/tipo <> 'references] item/tipo = 'funcbody item/tipo = 'funcheader] [ item/listanomi: expand-block item/ob none none none item/expandblk: true ] [ x: 0 foreach el item/ob [ x: x + 1 insert tail item/listanomi rejoin [ rig x cnblock " " lef type-any?/word el cntype ": " blobval get/any 'el ] ] ] true ] face?: func [x [any-type!]] [ all [ object? :x empty? exclude first system/words/face first x value? in x 'type x/type = 'face ] ] probable: [block! funcbody funcheader funclocals] viewprobe: func [item] [ if error? try [ either find probable item/tipo [ either find [funcbody funcheader funclocals] item/tipo [ viewface/fixed pathstr item rejoin [ "func " mold third get-path 'item/trueob mold second get-path 'item/trueob ] ] [viewface/fixed pathstr item mold item/ob] ] [if face? item/ob [faceview item/ob pathstr item]] ] [alerta "Error while probing" f-intest] ] viewable: copy [ function! native! action! op! 'funcview string! email! tag! issue! 'stringview binary! 'binaryview bitset! 'bitsetview image! 'imageview tuple! 'tupleview pair! 'pairview url! file! 'fileurlview ] viewable?: func [x [word!]] [if parse viewable [to x to lit-word! set x to end] [x]] viewall: func [el pname [string!] /local x] [ either x: viewable? type?/word :el [do x :el pname] [ either face? :el [faceview :el pname] [none] ] ] face-start: does [ if subface [ sf-off: subface/offset if any [not stopmode view*/pop-face = subface] [munview/only subface] subface: none ] ] viewface: func [ name [string!] text-data [string!] /fixed /nowrap /binary /local h pos search xf sld ar case ] [ case: false face-start subface: layout [ origin 10x10 styles my-styles backcolor backcol size sfsize space 2 across btn "Copy" [write clipboard:// ar/data] btn "Wrap" "^^W" #"^W" [ ar/para/wrap?: ar/para/wrap? xor true ar/update ] btn "Font" "^^F" #"^F" [ ar/font/name: either ar/font/name = font-fixed [font-sans-serif] [font-fixed] ar/update ] btn "Bin" "^^B" #"^B" [ ar/update/text either find ar/user-data 'binary [ remove find ar/user-data 'binary to-string load ar/text ] [ append ar/user-data 'binary mold/only to-binary ar/text ] ] btn "Find" "f3" keycode [f3 #"^S"] [ search: either all [view*/highlight-start view*/highlight-end] [ copy/part view*/highlight-start view*/highlight-end ] [""] h: false inform layout [ styles my-styles backcolor backcol across check case [case: face/data] h4 "Case" return xf: field as-is search [search: value h: true hide-popup] return btn 50 "OK" [search: xf/text h: true hide-popup] btn 50 "Cancel" [hide-popup] do [focus xf] ] focus ar if h [pos: find-area ar search pos case] ] btn "Next" "f4" keycode [f4 #"^N"] [ pos: find-area ar search pos case ] btn "Tile" "^^t" keycode [#"^T"] [tile] btn "Close" escape [munview/only subface] return h: at ar: area-scroll sfsize - h - 10x10 snow snow para [wrap?: either nowrap [false] [true]] font [size: prefs/fontsize name: either fixed [font-fixed] [font-sans-serif]] text-data user-data clear [] ] if binary [append ar/user-data 'binary] subface/user-data: make object! [ resize: :resize-subface area: :ar min-size: window-mins/subface key: func [event /local face] [ if none? either all [event/key = #"^-" event/shift] [ next-window event/face ] [do-key-face event] [return none] event ] ] focus ar mview/new/offset/title/options subface sf-off name 'resize ] funcview: func [f name /local ritorno] [ ritorno: rejoin [name ": "] if function? :f [insert tail ritorno "func "] insert tail ritorno mold third :f if function? :f [insert tail ritorno mold second :f] viewface/fixed name ritorno ] stringview: func [el name] [viewface rejoin [name " - " length? el] form el] binaryview: func [el name] [viewface/binary/fixed rejoin [name " - " length? el] form el] helpdata: none helpview: func [el name /local out __|_*__|_ data safe file] [ file: http://www.rebol.com/view/docs/ref-data.r out: copy "" safe: reduce [:prin :print] prin: func [v] [insert tail out reform v ()] print: func [v] [insert insert tail out reform v #"^/" ()] __|_*__|_: :el help __|_*__|_ set [prin print] safe replace/all out "__|_*__|_" last parse/all name "/" any [ helpdata not connected? all [exists-thru? file help2data: to-block read-thru file] help2data: to-block request-download file ] if all [ help2data data: select help2data to-block last parse/all name "/" ] [ append out rejoin ["^/-------------" data/3 "-------------^/See also: " data/2 "^/-------------^/From " mold find/tail file "://" " - Copyright 2003 REBOL Technologies"] ] viewface/fixed name out ] fileurlview: func [el name /local tmp] [ viewface/fixed name rejoin [ "Form : " {"} form :el {"} "^/^/Mold : " {"} mold/only :el {"} "^/^/Binary : " to binary! :el either url? :el [join "^/^/Decode : " mold/only decode-url :el] [join "^/^/Split : " either error? try [tmp: mold/only split-path :el] ["Invalid file"] [tmp]] ] ] bitsetview: func [el name] [ viewface/fixed name rejoin [ el "^/^/" charset-analyzer el "^/= make bitset! [^/" charset-to-char el "]^/" "^/= complement make bitset! [^/" charset-to-char complement el "]^/" ] ] pairview: func [el name] [ if not any [ el/x <= 0 el/y <= 0 el/x > view*/screen-face/size/x el/y > view*/screen-face/size/y ] [ face-start subface: layout [ origin 10x10 styles my-styles backcolor backcol h4 font-size prefs/fontsize rejoin [name " : " :el] box :el yellow key #"^[" [munview/only subface] ] mview/new/offset/title subface sf-off "Pair" ] ] tupleview: func [el name /local tmp] [ if 3 = length? el [ face-start if tmp: find second system/words el [tmp: pick first system/words index? tmp] subface: layout [ origin 10x10 styles my-styles backcolor backcol h4 font-size prefs/fontsize reform [name ":" :el either tmp [rejoin ["(" tmp ")"]] [""]] box 90x90 edge [color: coal size: 2x2] :el key #"^[" [munview/only subface] ] mview/new/offset/title subface sf-off "Tuple" ] ] imageview: func [el name] [ face-start subface: layout [ origin 10x10 styles my-styles backcolor backcol h4 font-size prefs/fontsize name box :el/size + 2x2 edge [size: 1x1] effect none :el key #"^[" [munview/only subface] ] mview/new/offset/title subface sf-off "Image" ] faceview: func [el name] [ if all [face? :el el/size el/size <> 0x0] [ if image? el: to-image :el [imageview :el join "Image of face: " name] ] ] if-error: func [try-blk [block!] error-blk [block!] /local x] [ either error? set/any 'x try try-blk error-blk [:x] ] blobval: func [x [any-type!] /nr /local tmp tmp2 x1 x2 code get-type] [ code: [ copy/part rejoin [ lef mold :x 25 " [" context? :x either not undefined? :x [ rejoin [ " - " do get-type either any [not prefs/novalue nr not value? :x] [""] [ join " : " blobval/nr get/any 'tmp ] ] ] [""] "]" ] linelen ] switch test-value get/any 'x [ -2 [return "unset"] -1 [return "(out-of-range)"] ] x1: [set 'tmp2 rejoin ["[" length? :x " " index? :x "/" length? head :x "]"]] x2: [set 'tmp2 copy/part trim/lines mold :x linelen] switch-m/default type?/word :x [ block! hash! list! [do x1] object! [copy/part rejoin ["[" length? first :x "] " mold first :x] linelen] port! error! [clickme] function! action! native! op! [copy/part trim/lines mold third :x linelen] word! lit-word! set-word! get-word! refinement! [ get-type: [type? set/any 'tmp get/any :x] do code ] path! lit-path! set-path! [ get-type: [if-error [type? set/any 'tmp get-path/anyv/ignore :x] ["??"]] do code ] string! url! file! binary! tag! email! issue! [ copy/part rejoin [do x1 " " do x2] linelen ] ] [do x2] ] changelista: func [item /local tmp offsort x y] [ if not find [funcbody] item/tipo [ if prefs/nounset <> item/nounset [ item/listanomi: either prefs/nounset [ while [not tail? item/listanomi] [ item/listanomi: either equal? second parse first item/listanomi " " "unset" [ remove item/listanomi ] [next item/listanomi] ] head item/listanomi ] [item/listall] item/nounset: prefs/nounset item/whe: 1 ] if all [ not all [block? item/ob item/expandblk prefs/sortby = "Name"] any [prefs/sort <> item/sorted prefs/sortby <> item/sortby] ] [ offsort: either select reduce [block! hash! list!] item/type [ offsort: either item/expandblk [cnblock-expanded] [cnblock] select reduce ["Name" 0 "Type" offsort + 2 "Value" offsort + 2 + cntype] prefs/sortby ] [ select reduce ["Name" 0 "Type" cnname + 1 "Value" cnname + 1 + cntype] prefs/sortby ] either prefs/sort [ sort/compare item/listanomi func [a b] [lesser? skip a offsort skip b offsort] ] [item/listanomi: item/listall] item/sorted: prefs/sort item/sortby: prefs/sortby ] ] item/whe: 1 if item/refresh [ remove find back tail y: copy item/refresh "/" x: item/listanomi while [not tail? x] [ if find/match first x y [item/whe: index? x break] x: next x ] item/refresh: none ] f-intest/text: rejoin [ index? histem "/" length? head histem " - " pathstr item " (" item/type ")" ] f-lista/actual-item: item f-lista/texts: f-lista/lines: f-lista/data: item/listanomi f-lista/picked: reduce [pick f-lista/texts item/whe] change-sn f-lista item/whe show [f-intest f-lista] ] selec-alt: func [offset new /menu /local item vc ctx newp x x-word blk tmp append-vc func-sel] [ func-sel: func [tipo [word!]] [ either menu [ if item/tipo <> tipo [ newlist/parent-path item/truename :x item tipo item/pathto ] ] [newlist/parent-path new :x item tipo pathstr item] ] blk: [ "List In New Window" [ if error? :x [x: disarm :x] error? try append/only copy either stopmode [ [system/words/stop] ] [ [system/words/monitor] ] either listable? :x [:x] [compose [(:x)]] ] "View Rebol Help" [helpview :x form either x-word [x-word] [new]] "Probe Block" [either menu [viewprobe item] [viewface/fixed newp mold :x]] "Probe From Head" [viewface/fixed newp mold head :x] "List From Head" [newlist new head :x item 'blockhead] "Mold" [viewface/fixed newp mold :x] "View From Head" [viewall head :x newp] "Mold From Head" [viewface/fixed newp mold head :x] "View Face" [faceview :x newp] "List As Style" [newlist newp dump-as-style :x none 'none] "View As Style" [viewface/fixed newp mold/only dump-as-style :x] "View Source" [viewall :x newp] "List Body" [func-sel 'funcbody] "List Third" [func-sel 'funcheader] "List First" [func-sel 'funclocals] "Browse" [browse :x] "Edit File/Show Dir" [ either exists? :x [ either dir? :x [ use [dir] [dir: what-dir change-dir :x request-file change-dir dir] ] [try [editor :x]] ] [alerta "Cannot find the file/dir" f-intest] ] "Find references" [ alerta "wait....." f-intest viewface/fixed join "references to/thru " newp rejoin/with find-ref/result/exclude :x [self ly] newline show f-intest ] "Find references (func)" [ alerta "wait....." f-intest viewface/fixed join "references to/thru " newp rejoin/with find-ref/body/result/exclude :x [self ly] newline show f-intest ] ] append-vc: func [str] [ foreach str str [if str: find blk str [insert tail vc copy/part str 2]] ] item: first histem if either menu [ x: item/ob if tmp: get in item 'trueob [x: :tmp] new: item/obname newp: pathstr item ] [ new: first parse new none newp: does [rejoin [pathstr item "/" new]] if 0 > test-value set/any 'x get-item item new [return] all [ not unset? set/any 'x get-item item new any [tmp: error? :x not error? try [tmp: not equal? :x item/ob]] found? tmp ] ] [ vc: copy [] append-vc ["List In New Window"] any [ if all [ any [any-word? :x any-path? :x] not equal? "Undefined" ctx: context? :x ] [ x-word: :x append vc reduce [ rejoin ["List " ctx " Context"] [ if any-path? :x-word [x-word: first :x-word] either ctx = "Global" [ newlist "system/words" system/words none 'object! find-parse-list f-lista form :x-word 1 ] [ use [ctx selfc] [ ctx: v-c :x-word either all [ selfc: find ctx 'self selfc: first selfc object? set/any 'selfc get/any selfc same? :x-word inall selfc :x-word not same? selfc item/ob ] [ newlist new selfc item 'objectcontext find-parse-list f-lista form :x-word 1 ] [ if not equal-bc? ctx item/ob [ newlist new ctx item 'blockcontext find-parse-list f-lista join "'" form :x-word 4 ] ] ] ] ] ] either value? :x [ new: rejoin [new "=" mold :x] either not error? try [error? set/any 'x get-all :x] [ append-vc ["View Rebol Help"] false ] [true] ] [true] ] if find [block! paren! hash! list!] type?/word :x [ append-vc ["Find references" "Find references (func)" "Probe Block"] any [head? :x append-vc ["Probe From Head" "List From Head"]] all [menu append-vc ["Expand nested blocks"]] ] if all [any-string? :x not error? try [index? :x]] [ append-vc ["Mold" "Find references" "Find references (func)"] any [head? :x append-vc ["View From Head" "Mold From Head"]] if url? :x [append-vc ["Browse"]] if file? :x [append-vc ["Edit File/Show Dir" "Browse"]] ] if face? :x [append-vc ["Find references" "Find references (func)" "View Face" "List As Style" "View As Style"]] if any-function? :x [ if function? :x [append-vc ["Find references" "Find references (func)" "View Source" "List Body"]] append-vc ["List First" "List Third" "View Third" "View Rebol Help"] ] if find [object! port! struct!] type?/word :x [ append-vc ["Find references" "Find references (func)"] ] ] my-choose extract vc 2 func [f b] [switch f/text vc] ly offset 140x22 'left ] ] selec: func [value /local new newp tipo x item tmp] [ item: first histem tipo: item/type new: first parse value none newp: does [rejoin [pathstr item "/" new]] if 0 > test-value set/any 'x get-item item new [return] if all [ not unset? set/any 'x get-item item new any [tmp: error? :x not error? try [tmp: not equal? :x item/ob]] tmp ] [ either all [any-word? :x value? :x] [ new: rejoin ["GET(" new "=" mold :x ")"] if error? x: get :x [x: disarm :x] ] [ if all [ any-path? :x not error? try [error? set/any 'tmp get-path/anyv/ignore :x] ] [ new: rejoin ["GETP(" new "=" mold :x ")"] x: either error? :tmp [x: disarm :tmp] [:tmp] ] ] if error? :x [x: disarm :x] if any [error? try [equal? :x :item/ob]] [return] any [ if any-function? :x [ either function? :x [ if find prefs/on-function 'list [newlist new :x item 'funcbody] if find prefs/on-function 'view [viewall :x newp] ] [ if find prefs/on-function 'list [newlist new :x item 'funcheader] if find prefs/on-function 'view [viewall :x newp] ] true ] if listable? :x [newlist new :x item type?/word :x] if viewable? type?/word :x [viewall :x newp] ] ] ] go-to: func [ind [integer!]] [ if all [not tail? ind: skip head histem (ind - 1) ind <> histem] [ histem/1/whe: where? f-lista histem: ind changelista histem/1 ] ] go-back: does [go-to -1 + index? histem] go-forward: does [go-to 1 + index? histem] refresh: has [item] [ item: f-lista/actual-item item/whe: where? f-lista item/refresh: pick item/listanomi item/whe listall item changelista item item/refresh: none ] newstart: func [value [string!] /local start] [ either any [ value = "" all [ error? try [start: get-path to-path load value] error? try [start: do value] ] ] [ alerta "Invalid Value!" f-intest ] [ any [restart value :start alerta "Invalid Type!" f-intest] ] ] engage-tl: func [face action event /local len whe] [ if action = 'key [ len: length? face/texts either not found? find face/texts face/picked/1 [ clear face/picked insert/only tail face/picked pick face/texts whe: 1 ] [ whe: index? find face/texts face/picked/1 whe: switch-m/default event/key [ up [max 1 whe - 1] down [min len whe + 1] home [1] end [len] page-up [max 1 whe - face/lc + 1] page-down [min len whe + face/lc - 1] right [go-forward -1] left #"^[" [go-back -1] ] [switch-m/default event/key bind f-lista/actual-item/engage-cases 'face [whe]] if whe <> -1 [ clear face/picked face/picked: reduce [pick face/texts whe] ] ] if whe <> -1 [change-sn face whe] show face eat/only [key] ] ] engage-iter: func [f a e] [ switch a [ down [ if cnt > length? head lines [exit] if not e/control [f/state: cnt clear picked] alter picked f/text if any [not prefs/dbcl e/double-click] [do :act slf f/text] ] alt-down [ if cnt > length? head lines [exit] if not e/control [f/state: cnt clear picked] alter picked f/text do :alt-act f-lista/offset + f/offset + e/offset - 10x10 f/text ] up [f/state: none] alt-up [f/state: none] ] show pane ] newlist: func [ name [string!] start parent type2 [word!] /parent-path pp [string!] /select-item value /local newitem ] [ newitem: make itemob [ truename: name switch type2 [ funcbody [trueob: :start name: rejoin ["FB(" name ")"] start: second :start] funcheader [trueob: :start name: rejoin ["FH(" name ")"] start: third :start] funclocals [trueob: :start name: rejoin ["FL(" name ")"] start: first :start] blockhead [name: rejoin ["HD(" name ")"]] blockcontext [name: rejoin ["CTX(" name ")"]] objectcontext [name: rejoin ["CTX(" name ")"]] ] ob: :start obname: copy name pathto: either parent-path [copy pp] [either none? parent [copy ""] [pathstr parent]] type: type? :start tipo: either 'none = type2 [type?/word :start] [type2] expandblk: false engage-cases: [#"^M" #" " [selec face/picked/1 -1]] refresh: value ] either listall newitem [ if not empty? histem [histem/1/whe: where? f-lista] clear next histem histem: back insert next histem newitem changelista newitem true ] [ newitem: none false ] ] hist-list: func [face /local hist hista] [ hist: copy [] hista: back tail histem while [not 25 <= length? hist] [ insert hist rejoin [rig index? hista 3 " - " pathstr first hista] if head? hista [break] hista: back hista ] my-choose hist func [f] [ go-to to-integer first parse f/text " " ] ly f-intest/size * 0x1 + face/offset f-intest/size 'left ] exe: has [value result command ly-exeoff ex err h f-console probe-result ld] [ probe-result: true use [actual-item] [ actual-item: f-lista/actual-item/ob ld: function [] [file] [ if file: request-file/only [if file: read file [f-console/update/text file show f-console]] ] ex: func [] [ if all [command: f-console/ar/text not empty? command] [ if confine [ if not try-err [ error? set/any 'result do bind load/all command 'actual-item ] [ either value? 'result [ try-err either all [not probe-result listable? :result] [ [restart "exe-result" result] ] [ [print ["==" copy/part mold :result 200]] ] ] [print ""] ] ] [print ["** Error: invalid return/break/throw"]] refresh ] ] command: join "actual-item" either empty? f-lista/picked [""] [ join "/" first parse f-lista/picked/1 none ] ly-exeoff: sf-off if ly-exe [ly-exeoff: ly-exe/offset munview/only ly-exe] ly-exe: layout [ origin 10x10 styles my-styles backcolor backcol space 4x4 size ly-exesize style btn btn 50 across btn "Exe" "^^E F5" keycode [#"^E" f5] [ex] btn "Upd" "^^U F9" keycode [#"^U" f9] [ actual-item: f-lista/actual-item/ob loop 1000000 [] ] btn "Load" "^^L" keycode [#"^L"] [ld] tgl 50 basecol red "List" "Probe" probe-result [probe-result: value] btn "Tile" "^^t" keycode [#"^T"] [tile] btn "Close" "^^Q Esc" keycode [#"^Q" #"^["] [munview/only ly-exe focus f-lista] return text 480 as-is {- Actual-item is set to the listed object/block: click Upd or F9 or Ctrl-U to update it - Click Exe or F5 or Ctlr-E to execute - Esc to quit} return h: at f-console: area-scroll ly-exesize - h - 10x10 snow white font-name font-fixed font-size prefs/fontsize command [] ] deflag-face f-console/ar tabbed ly-exe/user-data: make object! [ resize: :resize-ly-exe console: :f-console min-size: window-mins/ly-exe key: func [event /local len face] [ if none? either all [event/key = #"^-" event/shift] [ next-window event/face ] [do-key-face event] [return none] event ] ] focus f-console mview/new/offset/title/options ly-exe ly-exeoff "Command to execute" 'resize ] ] resize-subface: func [event /local face] [ face: event/face face/old-size: face/size face/size: max face/size face/user-data/min-size if face/old-size = face/size [ face/user-data/area/resize face/user-data/area/size + face/size - sfsize sfsize: face/size ] show face ] resize-ly-exe: func [event /local face] [ face: event/face face/old-size: face/size face/size: max face/size face/user-data/min-size if face/old-size = face/size [ face/user-data/console/resize face/user-data/console/size + face/size - ly-exesize ly-exesize: face/size ] show face ] resize-ly: func [event /local face minsize delta] [ face: event/face minsize: face/user-data/min-size delta: face/size face/size: max face/size minsize if face/size = delta [ delta: face/size - wsize cnname: to-integer cnname * face/size/x / wsize/x wsize: face/size f-intest/size/x: f-intest/size/x + delta/x f-panel/offset/x: f-panel/offset/x + delta/x f-lista/size: f-lista/size + delta f-lista/pane/size: f-lista/pane/size + delta f-lista/sub-area/size: f-lista/sub-area/size + delta f-lista/iter/size/x: f-lista/iter/size/x + delta/x f-lista/sld/offset/x: f-lista/sld/offset/x + delta/x f-lista/sld/size/y: f-lista/sld/size/y + delta/y f-lista/lc: to integer! f-lista/size/y / f-lista/sub-area/size/y f-text/size/x: f-text/size/x + delta/x refresh ] show ly ] next-window: func [face /local blk tmp] [ if all [not stopmode blk: find reduce [ly ly-exe subface] face] [ forever [ if tail? blk: next blk [blk: head blk] if face = tmp: first blk [break] if find view*/screen-face/pane tmp [ tmp/changes: 'activate show tmp break ] ] ] none ] tile: func [] [tile-face subface 'below tile-face ly-exe 'across] tile-face: func [face [object! none!] mode] [ if face [ switch mode [ below [ face/offset: max 0x0 min view*/screen-face/size - 20x20 as-pair [ ly/offset/x - view*/resize-border/x ly/offset/y + ly/size/y + view*/resize-border/y ] face/size: max face/user-data/min-size as-pair [ ly/size/x view*/screen-face/size/y - face/offset/y - view*/title-size/y - view*/resize-border/y - 32 ] ] across [ face/offset: max 0x0 min view*/screen-face/size - 20x20 as-pair [ ly/offset/x + ly/size/x + view*/resize-border/x ly/offset/y - view*/title-size/y - view*/resize-border/y ] face/size: max face/user-data/min-size as-pair [ view*/screen-face/size/x - face/offset/x - (2 * view*/resize-border/x) ly/size/y ] ] ] show face ] ] lyb: copy/deep [ origin 10x10 styles my-styles backcolor backcol size wsize style myh4 h4 white no-wrap center across space 5x1 f-intest: h4 white backcol first wsize - 218 bold para [wrap?: false] "" [hist-list face] f-panel: auto-panel [ origin 0x0 across space 5x1 myh4 50 "Expand" basecol feel [engage: none] f-expand: check #"^B" prefs/expandblk [ if char? value [face/data: face/data xor true show face] prefs/expandblk: face/data refresh ] myh4 40 "Unset" basecol feel [engage: none] f-unset: check #"^U" prefs/nounset [ if char? value [face/data: face/data xor true show face] prefs/nounset: face/data refresh ] myh4 30 "Sort" [ my-choose ["None" "Name" "Type"] func [f b] [ prefs/sort: f-sort/data: either f/text = "None" [false] [ prefs/sortby: copy f/text true ] f-sort/color: red show f-sort refresh f-sort/color: white show f-sort ] face/parent-face/parent-face face/parent-face/offset + face/offset + 0x20 45x20 'center ] f-sort: check #"^S" prefs/sort [ if char? value [face/data: face/data xor true show face] prefs/sort: face/data refresh ] ] return space 1 btn 12 "*" [ my-choose extract prefs/shortcut 2 func [f b] [ newstart form select prefs/shortcut f/text ] ly 0x1 * face/size + face/offset 100x20 'left ] btn 12 "!" [selec-alt/menu face/offset + (0x1 * face/size) ""] btn "Menu" [ my-choose extract com-list 3 func [f b] [ ana-exe f/text ] ly 0x1 * face/size + face/offset 200x20 'left ] arrow left basecol white 24x24 [go-back] arrow right basecol white 24x24 [go-forward] btn "New" "F2 ^^w" keycode [f2 #"^W"] [ana-exe <new>] [ana-exe <console>] btn "Fnd" keycode [f3 #"^F"] [ show f-intest inform layout [ styles my-styles backcolor backcol across check case [case: face/data] h4 "Case" return face: field as-is search [h: true hide-popup] return btn 50 "OK" [h: true hide-popup] btn 50 "Cancel" [hide-popup] do [focus face] ] if h [any [find-into-list f-lista search: face/text 0 alerta "Not found" f-intest]] ] btn "Nxt" keycode [f4 #"^N"] [ show f-intest if all [search not empty? search] [ any [find-into-list f-lista search where? f-lista alerta "Not found" f-intest] ] ] key #"^T" [tile] btn "Exe" "F5 ^^E" keycode [f5 #"^E"] [ana-exe <execute>] btn "Pr/Vi" "F6" keycode [f6 #"^P"] [ana-exe <probeview>] btn "Pref" "F8" keycode [f8] [ana-exe <prefs>] space 2 btn "Help" "F1" keycode [f1] [ana-exe <help>] [ana-exe <console>] space 5 h: at f-text: field wsize/x - h/x - 10 copy "Name or command" [newstart value] return f-lista: text-list wsize - 20x56 black font-name font-fixed font-size prefs/fontsize no-wrap data "" [selec value] with [actual-item: none alt-act: func [offset value] [selec-alt offset value]] do [ f-lista/feel: make f-lista/feel [engage: :engage-tl] bind second :engage-iter in f-lista 'self f-lista/iter/feel: make f-lista/iter/feel [engage: :engage-iter] f-lista/sld/action: func [face value] append copy/deep second get in f-lista/sld 'action [eat] f-lista/sld/effect: [gradient 200.200.200 230.230.230] ] ] com-list: copy/deep [ "Refresh^-^-- Ctrl-R F9" <refresh> [refresh] "Copy List^-^-- Ctrl-C" <copylist> [clip f-lista/data] "Copy Item Path^-- Ctrl-X" <copyitem> [clipname self] "Probe/View^-^-- Ctrl-P F4" <probeview> [viewprobe f-lista/actual-item] "Execute^-^-- Ctrl-E" <execute> [exe] "New Window^-^-- Ctrl-N F2" <new> [do reduce ['system/words/monitor f-lista/actual-item/ob]] "New Console" <console> [launch ""] "View Global Colors" <colors> [viewcolors] "Toggle Expand^-- Ctrl-B" <expand> [do-face f-expand #"a"] "Toggle Unset^-^-- Ctrl-U" <unset> [do-face f-unset #"a"] "Toggle Sort^-^-- Ctrl-S" <sort> [do-face f-sort #"a"] "Tile windows^-^-- Ctrl-T" <tile> [tile] "Preferences^-^-- F8" <prefs> [Preferences self] "Browse Dictionary" <dictio> [browse http://www.rebol.com/docs/dictionary.html] "Browse Library" <library> [browse http://www.reboltech.com/library/library.html] "Browse Docs" <docs> [browse http://www.rebol.com/docs.html] "Help/About^-^-- F1" <help> [anahelp self] ] ana-exe: func [command [string! tag!]] [switch-m command com-list] title: does [ rejoin [ header/title " - " header/version either header/beta ["-Beta"] [""] either stopmode [" - StopMode"] [""] either awnum <> 1 [join " - " awnum] [""] ] ] restart: func [name [string!] start /select-item value /local type2] [ if error? :start [start: disarm :start] refine-do [ newlist name :start none either any-function? :start [ pick [funcbody funcheader] function? :start ] ['none] ] [[select-item value]] ] make-ly: function [] [] [ ly: layout lyb ly/user-data: make object! [ lista: :f-lista text: :f-text resize: :resize-ly min-size: window-mins/ly scroll-line: func [event /local len] [ len: length? lista/texts lista/sn: max 0 min len - lista/lc lista/sn + second event/offset lista/sld/data: lista/sn / max 1 len - lista/lc lista/sld/state: none lista/sld/redrag lista/lc / max 1 len show lista none ] key: func [event] [ if none? either all [event/key = #"^-" event/shift] [ next-window event/face ] [do-key-face event] [return none] if view*/focal-face <> lista [ either view*/focal-face = text [ if event/key = #"^[" [focus lista return none] ] [focus lista] ] event ] ] ] awnum: set 'wnum wnum + 1 Monitor: func [ "Visual monitor of objects/blocks" 'start [any-type!] /stop /async /select-item value /name string [string!] /local startname ev ] [ stopmode: stop if not value? 'start [start: 'system] name: either name [string] [either block? :start ["<block>"] [form :start]] any [ if path? :start [set/any 'start get-path :start true] if any-word? :start [ if error? set/any 'start get/any :start [start: disarm get/any :start] true ] ] if any [not value? 'start not listable? :start] [ print ["Invalid argument. Not one of:" extract listable 2] exit ] if exists? fileprefs [prefs: make prefs load/all fileprefs] use [v] [ parse/all mold first system/words [ any [ to "ctx-" copy h to " " ( set/any 'v get/any load h if all [ value? 'v any [object? :v block? :v] not find prefs/shortcut h ] [insert insert tail prefs/shortcut h h] ) ] ] ] backcol: prefs/back-color basecol: prefs/base-color wsize: prefs/wsize sfsize: prefs/wsize - 25x25 ly-exesize: prefs/wsize - 100x150 make-ly if refine-do [restart name :start] [[select-item value]] [ focus f-lista mview/new/options/offset/title ly 'resize prefs/woffset title any [stopmode async do-events] wnum: wnum - 1 none ] ] ] cache: [] set 'Monitor func ["Visual monitor of objects/blocks" 'start [any-type!] /stop /local s-m] [ insert tail cache s-m: context cb if view*/pop-face [stop = true] any [value? 'start start: 'system] refine-do [s-m/monitor :start] [stop] remove back tail cache none ] set 'Mon func ["Monitor of objects/blocks" start] [monitor :start :start] set 'Stop func ["Modal visual monitor of objects/blocks" start] [monitor/stop :start :start] ] either get in system/script 'args [ monitor system/script/args ] [ if false <> system/script/args [monitor] ] |