Index: site/try/src/editor.dart |
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart |
deleted file mode 100644 |
index abe3f3ca19cb9ac29fa00600d55d2487cb2e5cd1..0000000000000000000000000000000000000000 |
--- a/site/try/src/editor.dart |
+++ /dev/null |
@@ -1,280 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library trydart.editor; |
- |
-import 'dart:html'; |
- |
-import 'package:compiler/src/scanner/string_scanner.dart' show |
- StringScanner; |
- |
-import 'package:compiler/src/tokens/token.dart' show |
- ErrorToken, |
- Token; |
- |
-import 'package:compiler/src/tokens/token_constants.dart' show |
- EOF_TOKEN; |
- |
-import 'ui.dart' show |
- currentTheme, |
- hackDiv, |
- interaction, |
- mainEditorPane, |
- observer, |
- outputDiv; |
- |
-import 'decoration.dart' show |
- CodeCompletionDecoration, |
- Decoration, |
- DiagnosticDecoration, |
- error, |
- info, |
- warning; |
- |
-import 'selection.dart' show |
- isCollapsed; |
- |
-import 'shadow_root.dart' show |
- getShadowRoot; |
- |
-import 'settings.dart' as settings; |
- |
-const String INDENT = '\u{a0}\u{a0}'; |
- |
-Set<String> seenIdentifiers; |
- |
-Element moveActive(int distance, Node ui) { |
- var /* ShadowRoot or Element */ root = getShadowRoot(ui); |
- List<Element> entries = root.querySelectorAll('.dart-static>.dart-entry'); |
- int activeIndex = -1; |
- for (var i = 0; i < entries.length; i++) { |
- if (entries[i].classes.contains('activeEntry')) { |
- activeIndex = i; |
- break; |
- } |
- } |
- int newIndex = activeIndex + distance; |
- Element currentEntry; |
- if (0 <= newIndex && newIndex < entries.length) { |
- currentEntry = entries[newIndex]; |
- } |
- if (currentEntry == null) return null; |
- if (0 <= newIndex && activeIndex != -1) { |
- entries[activeIndex].classes.remove('activeEntry'); |
- } |
- Element staticNode = root.querySelector('.dart-static'); |
- String visibility = computeVisibility(currentEntry, staticNode); |
- print(visibility); |
- var serverResults = root.querySelectorAll('.dart-server>.dart-entry'); |
- var serverResultCount = serverResults.length; |
- if (serverResultCount > 0) { |
- switch (visibility) { |
- case obscured: |
- case hidden: { |
- Rectangle cr = currentEntry.getBoundingClientRect(); |
- Rectangle sr = staticNode.getBoundingClientRect(); |
- Element entry = serverResults[0]; |
- entry.remove(); |
- currentEntry.parentNode.insertBefore(entry, currentEntry); |
- currentEntry = entry; |
- serverResultCount--; |
- |
- staticNode.style.maxHeight = '${sr.boundingBox(cr).height}px'; |
- } |
- } |
- } else { |
- currentEntry.scrollIntoView(); |
- } |
- if (serverResultCount == 0) { |
- root.querySelector('.dart-server').style.display = 'none'; |
- } |
- if (currentEntry != null) { |
- currentEntry.classes.add('activeEntry'); |
- } |
- // Discard mutations. |
- observer.takeRecords(); |
- return currentEntry; |
-} |
- |
-const visible = 'visible'; |
-const obscured = 'obscured'; |
-const hidden = 'hidden'; |
- |
-String computeVisibility(Element node, [Element parent]) { |
- Rectangle nr = node.getBoundingClientRect(); |
- if (parent == null) parent = node.parentNode; |
- Rectangle pr = parent.getBoundingClientRect(); |
- |
- if (pr.containsRectangle(nr)) return visible; |
- |
- if (pr.intersects(nr)) return obscured; |
- |
- return hidden; |
-} |
- |
-var activeCompletion; |
-num minSuggestionWidth = 0; |
- |
-/// Returns the [Element] which encloses the current collapsed selection, if it |
-/// exists. |
-Element getElementAtSelection() { |
- Selection selection = window.getSelection(); |
- if (!isCollapsed(selection)) return null; |
- var anchorNode = selection.anchorNode; |
- if (!mainEditorPane.contains(anchorNode)) return null; |
- if (mainEditorPane == anchorNode) return null; |
- int type = anchorNode.nodeType; |
- if (type != Node.TEXT_NODE) return null; |
- Text text = anchorNode; |
- var parent = text.parent; |
- if (parent is! Element) return null; |
- if (mainEditorPane == parent) return null; |
- return parent; |
-} |
- |
-bool isMalformedInput = false; |
- |
-addDiagnostic(String kind, String message, int begin, int end) { |
- observer.disconnect(); |
- Selection selection = window.getSelection(); |
- int offset = 0; |
- int anchorOffset = 0; |
- bool hasSelection = false; |
- Node anchorNode = selection.anchorNode; |
- bool foundNode = false; |
- void walk4(Node node) { |
- // TODO(ahe): Use TreeWalker when that is exposed. |
- int type = node.nodeType; |
- if (type == Node.TEXT_NODE || type == Node.CDATA_SECTION_NODE) { |
- CharacterData cdata = node; |
- // print('walking: ${node.data}'); |
- if (anchorNode == node) { |
- hasSelection = true; |
- anchorOffset = selection.anchorOffset + offset; |
- } |
- int newOffset = offset + cdata.length; |
- if (offset <= begin && begin < newOffset) { |
- hasSelection = node == anchorNode; |
- anchorOffset = selection.anchorOffset; |
- var alert; |
- if (kind == 'error') { |
- alert = error(message); |
- } else if (kind == 'warning') { |
- alert = warning(message); |
- } else { |
- alert = info(message); |
- } |
- Element parent = node.parentNode; |
- if (parent.classes.contains("diagnostic") && |
- !interaction.oldDiagnostics.contains(parent)) { |
- Element other = parent.firstChild; |
- other.remove(); |
- SpanElement wrapper = new SpanElement() |
- ..classes.add('diagnostic') |
- ..style.fontWeight = 'normal'; |
- |
- var root = getShadowRoot(wrapper); |
- if (root is ShadowRoot) { |
- // When https://code.google.com/p/chromium/issues/detail?id=313458 |
- // is fixed: |
- // var link = new LinkElement() |
- // ..rel = "stylesheet" |
- // ..type = "text/css" |
- // ..href = "dartlang-style.css"; |
- // root.append(link); |
- root.append( |
- new StyleElement()..text = '@import url(dartlang-style.css)'); |
- } |
- root |
- ..append(other) |
- ..append(alert); |
- other.style.display = 'block'; |
- alert.style.display = 'block'; |
- parent.append(wrapper); |
- } else { |
- if (interaction.oldDiagnostics.contains(parent)) { |
- node.remove(); |
- parent.replaceWith(node); |
- } |
- Node marker = new Text(""); |
- node.replaceWith(marker); |
- // TODO(ahe): Don't highlight everything in the node. Find the |
- // relevant token (works for now as we create a node for each token, |
- // which is probably not great for performance). |
- marker.replaceWith(diagnostic(node, alert)); |
- if (hasSelection) { |
- selection.collapse(node, anchorOffset); |
- } |
- } |
- foundNode = true; |
- return; |
- } |
- offset = newOffset; |
- } else if (type == Node.ELEMENT_NODE) { |
- Element element = node; |
- CssClassSet classes = element.classes; |
- if (classes.contains('alert') || |
- classes.contains('dart-code-completion')) { |
- return; |
- } |
- } |
- |
- var child = node.firstChild; |
- while(child != null && !foundNode) { |
- walk4(child); |
- child = child.nextNode; |
- } |
- } |
- walk4(mainEditorPane); |
- |
- if (!foundNode) { |
- outputDiv.appendText('$message\n'); |
- } |
- |
- observer.takeRecords(); |
- observer.observe( |
- mainEditorPane, childList: true, characterData: true, subtree: true); |
-} |
- |
-Decoration getDecoration(Token token) { |
- if (token is ErrorToken) { |
- // TODO(ahe): Remove side effects from this method. It only leads to |
- // confusion. |
- isMalformedInput = true; |
- return new DiagnosticDecoration('error', token.assertionMessage); |
- } |
- String tokenValue = token.value; |
- String tokenInfo = token.info.value; |
- if (tokenInfo == 'string') return currentTheme.string; |
- if (tokenInfo == 'identifier') { |
- seenIdentifiers.add(tokenValue); |
- Decoration decoration = currentTheme.foreground; |
- if (settings.enableCodeCompletion.value) { |
- decoration = CodeCompletionDecoration.from(decoration); |
- } |
- return decoration; |
- } |
- if (tokenInfo == 'keyword') return currentTheme.keyword; |
- if (tokenInfo == 'comment') return currentTheme.singleLineComment; |
- if (tokenInfo == 'malformed input') { |
- // TODO(ahe): Remove side effects from this method. It only leads to |
- // confusion. |
- isMalformedInput = true; |
- return new DiagnosticDecoration('error', tokenValue); |
- } |
- return currentTheme.foreground; |
-} |
- |
-diagnostic(content, tip) { |
- if (content is String) { |
- content = new Text(content); |
- } |
- if (content is! List) { |
- content = [content]; |
- } |
- return new AnchorElement() |
- ..classes.add('diagnostic') |
- ..append(tip) // Should be first for better Firefox editing. |
- ..nodes.addAll(content); |
-} |