]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/tools/debugger/debugger.factor
610aa10b6f8f548626f5bacd1ad7f604002a01d6
[factor.git] / basis / ui / tools / debugger / debugger.factor
1 ! Copyright (C) 2006, 2011 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays hashtables io kernel math models
4 colors.constants namespaces sequences words continuations
5 debugger prettyprint help editors fonts ui ui.commands
6 ui.debugger ui.gestures ui.gadgets ui.pens.solid
7 ui.gadgets.worlds ui.gadgets.packs ui.gadgets.buttons
8 ui.gadgets.labels ui.gadgets.presentations ui.gadgets.panes
9 ui.gadgets.viewports ui.gadgets.tables ui.theme
10 ui.gadgets.tracks ui.gadgets.toolbar
11 ui.gadgets.scrollers ui.gadgets.borders ui.gadgets.status-bar
12 ui.tools.traceback ui.tools.inspector ui.tools.browser ui.tools.common ;
13 IN: ui.tools.debugger
14
15 TUPLE: debugger < track error restarts restart-hook restart-list continuation ;
16
17 <PRIVATE
18
19 SINGLETON: restart-renderer
20
21 M: restart-renderer row-columns
22     drop [ name>> ] [ "Abort" ] if* "• " prepend 1array ;
23
24 : <restart-list> ( debugger -- gadget )
25     dup restarts>> f prefix <model> restart-renderer <table>
26         [ [ \ continue-restart invoke-command ] when* ] >>action
27         swap restart-hook>> >>hook
28         t >>selection-required?
29         t >>single-click? ; inline
30
31 : <error-pane> ( error -- pane )
32     <pane> [ [ print-error ] with-pane ] keep ; inline
33
34 : <error-display> ( debugger -- gadget )
35     [ <filled-pile> ] dip
36     [ error>> <error-pane> add-gadget ]
37     [
38         dup restart-hook>> [
39             [ "To continue, pick one of the options below:" <label> theme-font-colors add-gadget ] dip
40             restart-list>> add-gadget
41         ] [ drop ] if
42     ] bi ;
43
44 PRIVATE>
45
46 : <debugger> ( error continuation restarts restart-hook -- debugger )
47     vertical debugger new-track with-lines
48         swap >>restart-hook
49         swap >>restarts
50         swap >>continuation
51         swap >>error
52         dup <restart-list> >>restart-list
53         dup <error-display> margins white-interior f track-add
54         add-toolbar ;
55
56 M: debugger focusable-child*
57     dup restart-hook>> [ restart-list>> ] [ drop t ] if ;
58
59 : debugger-window ( error continuation -- )
60     ! No restarts for the debugger window
61     f f <debugger> "Error" open-status-window ;
62
63 GENERIC: error-in-debugger? ( error -- ? )
64
65 M: world-error error-in-debugger?
66     world>> children>> [ f ] [ first debugger? ] if-empty ;
67
68 M: object error-in-debugger? drop f ;
69
70 [
71     dup error-in-debugger?
72     [ error-alert ] [ error-continuation get debugger-window ] if
73 ] ui-error-hook set-global
74
75 debugger "gestures" f {
76     { T{ button-down } request-focus }
77 } define-command-map
78
79 : com-inspect ( debugger -- ) error>> inspector ;
80
81 : com-traceback ( debugger -- ) continuation>> traceback-window ;
82
83 : com-help ( debugger -- ) error>> error-help-window ;
84
85 : com-edit ( debugger -- ) error>> edit-error ;
86
87 \ com-edit H{ { +listener+ t } } define-command
88
89 debugger "toolbar" f {
90     { T{ key-down f { C+ } "i" } com-inspect }
91     { T{ key-down f { C+ } "t" } com-traceback }
92     { T{ key-down f { C+ } "h" } com-help }
93     { T{ key-down f { C+ } "e" } com-edit }
94 } define-command-map