private void handleOnCallFrameSelect(int callFrameDepth) {
    debuggerState.setActiveCallFrameIndex(callFrameDepth);
    debuggingModelRenderer.renderDebuggerCallFrame();

    PathUtil callFramePath = debuggerState.getActiveCallFramePath();
    if (callFramePath == null) {
      // Not paused, remove the execution line (if any).
      debuggingModelRenderer.removeExecutionLine();
      return;
    }

    maybeAnchorExecutionLine();

    int lineNumber = debuggerState.getActiveCallFrameExecutionLineNumber();
    maybeNavigateToDocument(callFramePath, lineNumber);
  }
  private DebuggingModelController(
      Place currentPlace,
      AppContext appContext,
      DebuggingModel debuggingModel,
      Editor editor,
      EditorPopupController editorPopupController,
      DocumentManager documentManager) {
    this.appContext = appContext;
    this.editor = editor;
    this.currentPlace = currentPlace;
    this.debuggingModel = debuggingModel;
    this.leftGutterClickListenerRemover =
        editor.getLeftGutter().getClickListenerRegistrar().add(leftGutterClickListener);

    // Every time we enter workspace, we get a new debugging session id.
    String sessionId =
        BootstrapSession.getBootstrapSession().getActiveClientId()
            + ":"
            + System.currentTimeMillis();
    this.debuggerState = DebuggerState.create(sessionId);

    this.debuggingSidebar = DebuggingSidebar.create(appContext.getResources(), debuggerState);
    this.debuggingModelRenderer =
        DebuggingModelRenderer.create(appContext, editor, debuggingSidebar, debuggerState);
    this.cssLiveEditController = new CssLiveEditController(debuggerState, documentManager);
    this.evaluationPopupController =
        EvaluationPopupController.create(
            appContext.getResources(), editor, editorPopupController, debuggerState);

    this.debuggingModel.addModelChangeListener(debuggingModelChangeListener);
    this.debuggerState.getDebuggerStateListenerRegistrar().add(debuggerStateListener);
    this.debuggingSidebar.getDebuggerCommandListenerRegistrar().add(userCommandListener);
  }
 private void maybeAnchorExecutionLine() {
   PathUtil callFramePath = debuggerState.getActiveCallFramePath();
   if (callFramePath != null && callFramePath.equals(path)) {
     int lineNumber = debuggerState.getActiveCallFrameExecutionLineNumber();
     if (lineNumber >= 0) {
       debuggingModelRenderer.renderExecutionLine(lineNumber);
     }
   }
 }
 private void anchorBreakpoints() {
   JsonArray<Breakpoint> allBreakpoints = debuggingModel.getBreakpoints();
   for (int i = 0; i < allBreakpoints.size(); ++i) {
     Breakpoint breakpoint = allBreakpoints.get(i);
     if (path.equals(breakpoint.getPath())) {
       anchorBreakpointAndUpdateSidebar(breakpoint);
       debuggingModelRenderer.renderBreakpointOnGutter(
           breakpoint.getLineNumber(), breakpoint.isActive());
     }
   }
 }
  public void setDocument(Document document, PathUtil path, DocumentParser parser) {
    if (breakpoints != null) {
      breakpoints.teardown();
      debuggingModelRenderer.handleDocumentChanged();
    }
    this.path = path;
    breakpoints = new AnchoredBreakpoints(debuggingModel, document);
    anchorBreakpoints();
    maybeAnchorExecutionLine();

    evaluationPopupController.setDocument(document, path, parser);
    breakpoints.setBreakpointDescriptionListener(breakpointDescriptionListener);
  }