// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.client.code.debugging;
import com.google.collide.client.editor.Editor;
import com.google.collide.client.testing.DebugAttributeSetter;
import com.google.collide.client.util.Elements;
import com.google.collide.shared.document.Document;
import com.google.collide.shared.document.LineInfo;
import com.google.collide.shared.document.anchor.Anchor;
import com.google.collide.shared.document.anchor.AnchorManager;
import com.google.collide.shared.document.anchor.AnchorType;
import elemental.html.Element;
/**
* Handles an <i>execution line</i> anchored into a document.
*
* <p>Execution line is a line in a script where debugger stopped. Each call
* frame in the call stack has exactly one execution line, and execution line
* of the topmost call frame is where the debugger stopped last.
*
*/
class AnchoredExecutionLine {
private static final AnchorType EXECUTION_LINE_ANCHOR_TYPE = AnchorType.create(
AnchoredExecutionLine.class, "executionLine");
static AnchoredExecutionLine create(Editor editor, int lineNumber, String bufferLineClassName,
String gutterLineClassName) {
return new AnchoredExecutionLine(editor, lineNumber, bufferLineClassName, gutterLineClassName);
}
private final Editor editor;
private final Document document;
private final Anchor lineExecutionAnchor;
private final Element bufferExecutionLine;
private final Element gutterExecutionLine;
private AnchoredExecutionLine(Editor editor, int lineNumber, String bufferLineClassName,
String gutterLineClassName) {
this.editor = editor;
document = editor.getDocument();
lineExecutionAnchor = createExecutionLineAnchor(document, lineNumber);
bufferExecutionLine = Elements.createDivElement(bufferLineClassName);
new DebugAttributeSetter().add("linenumber", String.valueOf(lineNumber + 1)).on(
bufferExecutionLine);
editor.getBuffer().addAnchoredElement(lineExecutionAnchor, bufferExecutionLine);
gutterExecutionLine = Elements.createDivElement(gutterLineClassName);
new DebugAttributeSetter().add("linenumber", String.valueOf(lineNumber + 1)).on(
gutterExecutionLine);
editor.getLeftGutter().addAnchoredElement(lineExecutionAnchor, gutterExecutionLine);
}
void teardown() {
editor.getBuffer().removeAnchoredElement(lineExecutionAnchor, bufferExecutionLine);
editor.getLeftGutter().removeAnchoredElement(lineExecutionAnchor, gutterExecutionLine);
document.getAnchorManager().removeAnchor(lineExecutionAnchor);
}
private static Anchor createExecutionLineAnchor(Document document, int lineNumber) {
LineInfo lineInfo = document.getLineFinder().findLine(lineNumber);
Anchor anchor = document.getAnchorManager().createAnchor(EXECUTION_LINE_ANCHOR_TYPE,
lineInfo.line(), lineInfo.number(), AnchorManager.IGNORE_COLUMN);
anchor.setRemovalStrategy(Anchor.RemovalStrategy.SHIFT);
return anchor;
}
}