Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 68266c320a1df88e8b8e0128983a4a87840d5cbc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*******************************************************************************
 * 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;
	}
}

Back to the top