| Index: dart/site/try/src/interaction_manager.dart
|
| diff --git a/dart/site/try/src/interaction_manager.dart b/dart/site/try/src/interaction_manager.dart
|
| index 44a910a9661ab3cec82cc1d784e357361e670304..88986cc35024fe143562b74fc9f58fb2f86cf8c1 100644
|
| --- a/dart/site/try/src/interaction_manager.dart
|
| +++ b/dart/site/try/src/interaction_manager.dart
|
| @@ -216,7 +216,6 @@ class InitialState extends InteractionState {
|
| hackDiv = newDiv;
|
| }
|
|
|
| - // TODO(ahe): This method should be cleaned up. It is too large.
|
| void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
|
| print('onMutation');
|
|
|
| @@ -227,27 +226,14 @@ class InitialState extends InteractionState {
|
| }
|
|
|
| Selection selection = window.getSelection();
|
| - Node anchorNode = selection.anchorNode;
|
| - int anchorOffset = selection.isCollapsed ? selection.anchorOffset : -1;
|
| + TrySelection trySelection = new TrySelection(mainEditorPane, selection);
|
|
|
| for (MutationRecord record in mutations) {
|
| - if (record.addedNodes.isEmpty) continue;
|
| - for (Node node in record.addedNodes) {
|
| - if (node.parent == null) continue;
|
| - StringBuffer buffer = new StringBuffer();
|
| - int selectionOffset = htmlToText(node, buffer, selection);
|
| - Text newNode = new Text('$buffer');
|
| - node.replaceWith(newNode);
|
| - if (selectionOffset != -1) {
|
| - anchorNode = newNode;
|
| - anchorOffset = selectionOffset;
|
| - }
|
| - }
|
| + normalizeMutationRecord(record, trySelection);
|
| }
|
|
|
| String currentText = mainEditorPane.text;
|
| - TrySelection trySelection =
|
| - new TrySelection(mainEditorPane, selection, currentText);
|
| + trySelection.updateText(currentText);
|
|
|
| context.currentCompilationUnit.content = currentText;
|
|
|
| @@ -256,37 +242,8 @@ class InitialState extends InteractionState {
|
| editor.isMalformedInput = false;
|
| int offset = 0;
|
| List<Node> nodes = <Node>[];
|
| - // + offset + charOffset + globalOffset + (charOffset + charCount)
|
| - // v v v v
|
| - // do identifier_abcdefghijklmnopqrst
|
| - for (Token token = tokenize(currentText);
|
| - token.kind != EOF_TOKEN;
|
| - token = token.next) {
|
| - int charOffset = token.charOffset;
|
| - int charCount = token.charCount;
|
| -
|
| - if (charOffset < offset) continue; // Happens for scanner errors.
|
| -
|
| - Decoration decoration = editor.getDecoration(token);
|
| - if (decoration == null) continue;
|
|
|
| - // Add a node for text before current token.
|
| - trySelection.addNodeFromSubstring(offset, charOffset, nodes);
|
| -
|
| - // Add a node for current token.
|
| - trySelection.addNodeFromSubstring(
|
| - charOffset, charOffset + charCount, nodes, decoration);
|
| -
|
| - offset = charOffset + charCount;
|
| - }
|
| -
|
| - // Add a node for anything after the last (decorated) token.
|
| - trySelection.addNodeFromSubstring(offset, currentText.length, nodes);
|
| -
|
| - // Ensure text always ends with a newline.
|
| - if (!currentText.endsWith('\n')) {
|
| - nodes.add(new Text('\n'));
|
| - }
|
| + tokenizeAndHighlight(currentText, offset, trySelection, nodes);
|
|
|
| mainEditorPane
|
| ..nodes.clear()
|
| @@ -392,7 +349,7 @@ class InitialState extends InteractionState {
|
| continue;
|
| }
|
| if (context.currentCompilationUnit.name == name) {
|
| - mainEditorPane.contentEditable = false;
|
| + mainEditorPane.contentEditable = 'false';
|
| statusDiv.text = 'Modified on disk';
|
| }
|
| }
|
| @@ -711,3 +668,55 @@ bool computeHasModifier(KeyboardEvent event) {
|
| event.getModifierState("SymbolLock") ||
|
| event.getModifierState("OS");
|
| }
|
| +
|
| +void tokenizeAndHighlight(String currentText,
|
| + int offset,
|
| + TrySelection trySelection,
|
| + List<Node> nodes) {
|
| + // + offset + charOffset + globalOffset + (charOffset + charCount)
|
| + // v v v v
|
| + // do identifier_abcdefghijklmnopqrst
|
| + for (Token token = tokenize(currentText);
|
| + token.kind != EOF_TOKEN;
|
| + token = token.next) {
|
| + int charOffset = token.charOffset;
|
| + int charCount = token.charCount;
|
| +
|
| + if (charOffset < offset) continue; // Happens for scanner errors.
|
| +
|
| + Decoration decoration = editor.getDecoration(token);
|
| + if (decoration == null) continue;
|
| +
|
| + // Add a node for text before current token.
|
| + trySelection.addNodeFromSubstring(offset, charOffset, nodes);
|
| +
|
| + // Add a node for current token.
|
| + trySelection.addNodeFromSubstring(
|
| + charOffset, charOffset + charCount, nodes, decoration);
|
| +
|
| + offset = charOffset + charCount;
|
| + }
|
| +
|
| + // Add a node for anything after the last (decorated) token.
|
| + trySelection.addNodeFromSubstring(offset, currentText.length, nodes);
|
| +
|
| + // Ensure text always ends with a newline.
|
| + if (!currentText.endsWith('\n')) {
|
| + nodes.add(new Text('\n'));
|
| + }
|
| +}
|
| +
|
| +void normalizeMutationRecord(MutationRecord record, TrySelection selection) {
|
| + if (record.addedNodes.isEmpty) return;
|
| + for (Node node in record.addedNodes) {
|
| + if (node.parent == null) continue;
|
| + StringBuffer buffer = new StringBuffer();
|
| + int selectionOffset = htmlToText(node, buffer, selection);
|
| + Text newNode = new Text('$buffer');
|
| + node.replaceWith(newNode);
|
| + if (selectionOffset != -1) {
|
| + selection.anchorNode = newNode;
|
| + selection.anchorOffset = selectionOffset;
|
| + }
|
| + }
|
| +}
|
|
|