blob: 13186d19a2f03964648104757007339f19649830 [file] [log] [blame]
// Copyright (C) 2015 The Android Open Source Project
//
// 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 net.codemirror.lib;
import static com.google.gwt.dom.client.Style.Display.INLINE_BLOCK;
import static com.google.gwt.dom.client.Style.Unit.PX;
import static net.codemirror.lib.CodeMirror.style;
import static net.codemirror.lib.CodeMirror.LineClassWhere.WRAP;
import com.google.gerrit.client.diff.DisplaySide;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.DOM;
import net.codemirror.lib.CodeMirror.LineHandle;
import java.util.Objects;
/** Additional features added to CodeMirror by Gerrit Code Review. */
public class Extras {
static final native Extras get(CodeMirror c) /*-{ return c.gerritExtras }-*/;
private static final native void set(CodeMirror c, Extras e)
/*-{ c.gerritExtras = e }-*/;
static void attach(CodeMirror c) {
set(c, new Extras(c));
}
private final CodeMirror cm;
private Element margin;
private DisplaySide side;
private double charWidthPx;
private double lineHeightPx;
private LineHandle activeLine;
private Extras(CodeMirror cm) {
this.cm = cm;
}
public DisplaySide side() {
return side;
}
public void side(DisplaySide s) {
side = s;
}
public double charWidthPx() {
if (charWidthPx <= 1) {
int len = 100;
StringBuilder s = new StringBuilder();
for (int i = 0; i < len; i++) {
s.append('m');
}
Element e = DOM.createSpan();
e.getStyle().setDisplay(INLINE_BLOCK);
e.setInnerText(s.toString());
cm.measure().appendChild(e);
charWidthPx = ((double) e.getOffsetWidth()) / len;
e.removeFromParent();
}
return charWidthPx;
}
public double lineHeightPx() {
if (lineHeightPx <= 1) {
Element p = DOM.createDiv();
int lines = 1;
for (int i = 0; i < lines; i++) {
Element e = DOM.createDiv();
p.appendChild(e);
Element pre = DOM.createElement("pre");
pre.setInnerText("gqyŚŻŹŃ");
e.appendChild(pre);
}
cm.measure().appendChild(p);
lineHeightPx = ((double) p.getOffsetHeight()) / lines;
p.removeFromParent();
}
return lineHeightPx;
}
public void lineLength(int columns) {
if (margin == null) {
margin = DOM.createDiv();
margin.setClassName(style().margin());
cm.mover().appendChild(margin);
}
margin.getStyle().setMarginLeft(columns * charWidthPx(), PX);
}
public void showTabs(boolean show) {
Element e = cm.getWrapperElement();
if (show) {
e.addClassName(style().showTabs());
} else {
e.removeClassName(style().showTabs());
}
}
public final boolean hasActiveLine() {
return activeLine != null;
}
public final LineHandle activeLine() {
return activeLine;
}
public final boolean activeLine(LineHandle line) {
if (Objects.equals(activeLine, line)) {
return false;
}
if (activeLine != null) {
cm.removeLineClass(activeLine, WRAP, style().activeLine());
}
activeLine = line;
cm.addLineClass(activeLine, WRAP, style().activeLine());
return true;
}
public final void clearActiveLine() {
if (activeLine != null) {
cm.removeLineClass(activeLine, WRAP, style().activeLine());
activeLine = null;
}
}
}