OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library script_inset_element; | |
6 | |
7 import 'dart:html'; | |
8 import 'observatory_element.dart'; | |
9 import 'package:observatory/service.dart'; | |
10 import 'package:polymer/polymer.dart'; | |
11 | |
12 /// Box with script source code in it. | |
13 @CustomTag('script-inset') | |
14 class ScriptInsetElement extends ObservatoryElement { | |
15 @published Script script; | |
16 | |
17 /// Set the height to make the script inset scroll. Otherwise it | |
18 /// will show from startPos to endPos. | |
19 @published String height = null; | |
20 | |
21 @published int currentPos; | |
22 @published int startPos; | |
23 @published int endPos; | |
24 | |
25 @observable int currentLine; | |
26 @observable int startLine; | |
27 @observable int endLine; | |
28 @observable bool linesReady = false; | |
29 | |
30 @observable List<ScriptLine> lines = toObservable([]); | |
31 | |
32 String makeLineId(int line) { | |
33 return 'line-$line'; | |
34 } | |
35 | |
36 MutationObserver _observer; | |
37 | |
38 void _scrollToCurrentPos() { | |
39 var line = shadowRoot.querySelector('#line-$currentLine'); | |
40 if (line != null) { | |
41 line.scrollIntoView(); | |
42 } | |
43 } | |
44 | |
45 void _onMutation(mutations, observer) { | |
46 _scrollToCurrentPos(); | |
47 } | |
48 | |
49 void attached() { | |
50 super.attached(); | |
51 var table = shadowRoot.querySelector('.sourceTable'); | |
52 if (table != null) { | |
53 _observer = new MutationObserver(_onMutation); | |
54 _observer.observe(table, childList:true); | |
55 } | |
56 } | |
57 | |
58 void detached() { | |
59 if (_observer != null) { | |
60 _observer.disconnect(); | |
61 _observer = null; | |
62 } | |
63 super.detached(); | |
64 } | |
65 | |
66 void currentPosChanged(oldValue) { | |
67 _updateLines(); | |
68 _scrollToCurrentPos(); | |
69 } | |
70 | |
71 void startPosChanged(oldValue) { | |
72 _updateLines(); | |
73 } | |
74 | |
75 void endPosChanged(oldValue) { | |
76 _updateLines(); | |
77 } | |
78 | |
79 void scriptChanged(oldValue) { | |
80 _updateLines(); | |
81 } | |
82 | |
83 var _updateFuture; | |
84 | |
85 void _updateLines() { | |
86 linesReady = false; | |
87 if (_updateFuture != null) { | |
88 // Already scheduled. | |
89 return; | |
90 } | |
91 if (script == null) { | |
92 // Wait for script to be assigned. | |
93 return; | |
94 } | |
95 if (!script.loaded) { | |
96 _updateFuture = script.load().then((_) { | |
97 if (script.loaded) { | |
98 _updateFuture = null; | |
99 _updateLines(); | |
100 } | |
101 }); | |
102 return; | |
103 } | |
104 startLine = (startPos != null | |
105 ? script.tokenToLine(startPos) | |
106 : 1); | |
107 currentLine = (currentPos != null | |
108 ? script.tokenToLine(currentPos) | |
109 : null); | |
110 endLine = (endPos != null | |
111 ? script.tokenToLine(endPos) | |
112 : script.lines.length); | |
113 | |
114 lines.clear(); | |
115 for (int i = (startLine - 1); i <= (endLine - 1); i++) { | |
116 lines.add(script.lines[i]); | |
117 } | |
118 linesReady = true; | |
119 } | |
120 | |
121 ScriptInsetElement.created() : super.created(); | |
122 } | |
123 | |
124 @CustomTag('breakpoint-toggle') | |
125 class BreakpointToggleElement extends ObservatoryElement { | |
126 @published ScriptLine line; | |
127 @observable bool busy = false; | |
128 | |
129 void toggleBreakpoint(var a, var b, var c) { | |
130 if (busy) { | |
131 return; | |
132 } | |
133 busy = true; | |
134 if (line.bpt == null) { | |
135 // No breakpoint. Set it. | |
136 line.script.isolate.setBreakpoint(line.script, line.line).then((_) { | |
137 busy = false; | |
138 }); | |
139 } else { | |
140 // Existing breakpoint. Remove it. | |
141 line.script.isolate.clearBreakpoint(line.bpt).then((_) { | |
142 busy = false; | |
143 }); | |
144 } | |
145 } | |
146 | |
147 BreakpointToggleElement.created() : super.created(); | |
148 } | |
OLD | NEW |