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