/******************************************************************************* * Copyright (C) 2016, Thomas Wolf <thomas.wolf@paranor.ch> * * 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 *******************************************************************************/ package org.eclipse.egit.ui.internal.commit; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.source.LineNumberRulerColumn; import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.diff.DiffEntry; /** * A {@link LineNumberRulerColumn} that uses an * {@link ILogicalLineNumberProvider} to determine the line numbers to show. */ public class LogicalLineNumberRulerColumn extends LineNumberRulerColumn { private ILogicalLineNumberProvider logicalLineNumberProvider; private final @NonNull DiffEntry.Side side; /** * Zoom level for workaround for HiDPI line number rulers on macOS retina. * * @see <a href="https://bugs.eclipse.org/516322">Bug 516322</a> */ int zoom = 100; /** * @param side */ public LogicalLineNumberRulerColumn(@NonNull DiffEntry.Side side) { this.side = side; } /** * @return the {@link DiffEntry} side */ protected @NonNull DiffEntry.Side getSide() { return side; } /** * Retrieves the {@link ILogicalLineNumberProvider} to use. This * implementation returns a {@link LogicalLineNumberProvider}. * * @return the {@link ILogicalLineNumberProvider} */ protected ILogicalLineNumberProvider getLogicalLineNumberProvider() { if (logicalLineNumberProvider == null) { ITextViewer viewer = getParentRuler().getTextViewer(); Assert.isNotNull(viewer); logicalLineNumberProvider = new LogicalLineNumberProvider(getSide(), viewer); } return logicalLineNumberProvider; } @Override protected String createDisplayString(int line) { int logicalLine = getLogicalLineNumberProvider().getLogicalLine(line); return logicalLine < 0 ? "" : Integer.toString(logicalLine + 1); //$NON-NLS-1$ } @Override protected int computeNumberOfDigits() { int max = getLogicalLineNumberProvider().getMaximum(); int digits = 2; while (max > Math.pow(10, digits) - 1) { ++digits; } return digits; } /** * Enable workaround for HiDPI line number rulers on macOS retina. This * method will override an internal method in Oxygen (4.7). * * @return true * @see <a href="https://bugs.eclipse.org/516322">Bug 516322</a> */ protected boolean internalSupportsZoomedPaint() { return true; } /** * Store zoom level for workaround for HiDPI line number rulers on macOS * retina. This method will override an internal method in Oxygen (4.7). * * @param zoomLevel * the zoom level to use for drawing operations * @see <a href="https://bugs.eclipse.org/516322">Bug 516322</a> */ protected void internalSetZoom(int zoomLevel) { this.zoom = zoomLevel; } }