/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.debug; import elemental.dom.Element; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; import org.eclipse.che.ide.api.debug.BreakpointRenderer; import org.eclipse.che.ide.api.editor.document.Document; import org.eclipse.che.ide.api.editor.gutter.Gutter; import org.eclipse.che.ide.api.editor.gutter.Gutter.LineNumberingChangeCallback; import org.eclipse.che.ide.api.editor.texteditor.EditorResources; import org.eclipse.che.ide.api.editor.texteditor.LineStyler; import org.eclipse.che.ide.util.dom.Elements; import static org.eclipse.che.ide.api.editor.gutter.Gutters.BREAKPOINTS_GUTTER; /** * Renderer for breakpoint marks in gutter (on the left margin of the text). */ public class BreakpointRendererImpl implements BreakpointRenderer { /** The resources for breakpoint display. */ private final BreakpointResources breakpointResources; /** The resources for editor display. */ private final EditorResources editorResources; /** The component responsible for gutter handling. */ private final Gutter hasGutter; /** The component responsible for line style handling. */ private final LineStyler lineStyler; /** The document. */ private Document document; private Element activeBreakpointMark; private Element inactiveBreakpointMark; @AssistedInject public BreakpointRendererImpl(final BreakpointResources breakpointResources, final EditorResources editorResources, @Assisted final Gutter hasGutter, @Assisted final LineStyler lineStyler, @Assisted final Document document) { this.breakpointResources = breakpointResources; this.editorResources = editorResources; this.hasGutter = hasGutter; this.lineStyler = lineStyler; this.document = document; breakpointResources.getCss().ensureInjected(); initBreakpointMarks(); } @Override public void addBreakpointMark(final int lineNumber) { if (hasGutter != null) { this.hasGutter.addGutterItem(lineNumber, BREAKPOINTS_GUTTER, inactiveBreakpointMark); } } @Override public void addBreakpointMark(final int lineNumber, final LineChangeAction action) { if (hasGutter != null) { this.hasGutter.addGutterItem(lineNumber, BREAKPOINTS_GUTTER, inactiveBreakpointMark, new LineNumberingChangeCallback() { @Override public void onLineNumberingChange(final int fromLine, final int linesRemoved, final int linesAdded) { action.onLineChange(document.getFile(), fromLine, linesAdded, linesRemoved); } }); } } @Override public void removeBreakpointMark(final int lineNumber) { if (hasGutter != null) { this.hasGutter.removeGutterItem(lineNumber, BREAKPOINTS_GUTTER); } } @Override public void clearBreakpointMarks() { if (hasGutter != null) { this.hasGutter.clearGutter(BREAKPOINTS_GUTTER); } } @Override public void setBreakpointActive(final int lineNumber, final boolean active) { if (hasGutter != null) { final Element mark = this.hasGutter.getGutterItem(lineNumber, BREAKPOINTS_GUTTER); if (mark != null) { Element element = active ? activeBreakpointMark : inactiveBreakpointMark; this.hasGutter.setGutterItem(lineNumber, BREAKPOINTS_GUTTER, element); } } } @Override public void setLineActive(final int lineNumber, final boolean active) { if (active && this.lineStyler != null) { this.lineStyler.addLineStyles(lineNumber, this.editorResources.editorCss().debugLine()); } else { this.lineStyler.removeLineStyles(lineNumber, this.editorResources.editorCss().debugLine()); } } private void initBreakpointMarks() { BreakpointResources.Css css = breakpointResources.getCss(); activeBreakpointMark = Elements.createDivElement(css.breakpoint(), css.active()); inactiveBreakpointMark = Elements.createDivElement(css.breakpoint(), css.inactive()); } @Override public boolean isReady() { return this.hasGutter != null && this.lineStyler != null; } }