-
Notifications
You must be signed in to change notification settings - Fork 8
/
DebugConsole.mxml
151 lines (129 loc) · 4.39 KB
/
DebugConsole.mxml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo" xmlns:mx1="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import org.openpalace.iptscrae.IptEngineEvent;
import org.openpalace.iptscrae.IptManager;
import org.openpalace.iptscrae.IptToken;
import org.openpalace.iptscrae.Runnable;
[Bindable]
private var dataStack:ArrayCollection;
[Bindable]
private var callStack:ArrayCollection;
private var _iptManager:IptManager;
[Bindable]
private var enableDebugging:Boolean;
[Bindable(event="managerChanged")]
public function set iptManager(newValue:IptManager):void {
if (_iptManager !== newValue) {
_iptManager = newValue;
_iptManager.addEventListener(IptEngineEvent.PAUSE, handlePause);
_iptManager.addEventListener(IptEngineEvent.START, handleStart);
_iptManager.addEventListener(IptEngineEvent.ABORT, handleAbort);
_iptManager.addEventListener(IptEngineEvent.RESUME, handleResume, false, 10000);
_iptManager.addEventListener(IptEngineEvent.FINISH, handleFinish);
enableDebugging = _iptManager.paused;
updateDebugDisplay();
}
}
public function get iptManager():IptManager {
return _iptManager;
}
private function handleResume(event:IptEngineEvent):void {
updateDebugDisplay();
enableDebugging = false;
}
private function handlePause(event:IptEngineEvent):void {
updateDebugDisplay();
enableDebugging = true;
}
private function handleStart(event:IptEngineEvent):void {
updateDebugDisplay();
enableDebugging = false;
}
private function handleAbort(event:IptEngineEvent):void {
updateDebugDisplay();
enableDebugging = false;
}
private function handleFinish(event:IptEngineEvent):void {
updateDebugDisplay();
enableDebugging = false;
}
private function updateDataStack(stack:Vector.<IptToken>):void {
var ac:ArrayCollection = new ArrayCollection();
for (var i:int = stack.length; i != 0; i--) {
ac.addItem(stack[i-1]);
}
dataStack = ac;
}
private function updateCallStack(stack:Vector.<Runnable>):void {
var ac:ArrayCollection = new ArrayCollection();
for (var i:int = stack.length; i != 0; i--) {
ac.addItem(stack[i-1]);
}
callStack = ac;
}
private function updateDebugDisplay():void {
if (iptManager.paused) {
scriptContextDisplay.text = iptManager.scriptContextDisplay;
var currentItem:Runnable = iptManager.currentRunnableItem;
if (currentItem && Object(currentItem).context) {
updateDataStack(Object(currentItem).context.stack.stack);
}
else {
dataStack = new ArrayCollection();
}
updateCallStack(iptManager.callStack);
}
else {
callStack = new ArrayCollection();
dataStack = new ArrayCollection();
scriptContextDisplay.text = "";
}
}
private function step():void {
iptManager.step();
updateDebugDisplay();
}
private function resume():void {
iptManager.resume();
}
private function abort():void {
iptManager.abort();
}
private function stepChanged():void {
iptManager.stepThroughScript = stepCheckbox.selected;
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout
gap="5"
horizontalAlign="left" />
</s:layout>
<s:HGroup height="100%" width="100%">
<s:VGroup width="100%" height="100%">
<s:Label text="Data Stack:" />
<s:List width="100%" height="100%" dataProvider="{dataStack}" />
</s:VGroup>
<s:VGroup width="100%" height="100%">
<s:Label text="Call Stack:" />
<s:List width="100%" height="100%" dataProvider="{callStack}" />
</s:VGroup>
</s:HGroup>
<s:VGroup height="60" width="100%">
<mx1:Text id="scriptContextDisplay" width="100%" truncateToFit="true" fontFamily="Courier New" />
</s:VGroup>
<s:HGroup>
<s:Button label="Step" click="step()" enabled="{enableDebugging}" />
<s:Button label="Run" click="resume()" enabled="{enableDebugging}" />
<s:Button label="Abort" click="abort()" enabled="{enableDebugging}" />
<s:CheckBox id="stepCheckbox" label="Step through script" change="stepChanged()" />
</s:HGroup>
</s:Group>