View Javadoc
1   /*
2    * Copyright (C) 2010, Google Inc.
3    * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
4    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
5    *
6    * This program and the accompanying materials are made available under the
7    * terms of the Eclipse Distribution License v. 1.0 which is available at
8    * https://www.eclipse.org/org/documents/edl-v10.php.
9    *
10   * SPDX-License-Identifier: BSD-3-Clause
11   */
12  
13  package org.eclipse.jgit.awtui;
14  
15  import java.awt.Color;
16  import java.awt.Graphics;
17  import java.awt.Graphics2D;
18  import java.awt.Polygon;
19  import java.io.Serializable;
20  
21  import org.eclipse.jgit.awtui.CommitGraphPane.GraphCellRender;
22  import org.eclipse.jgit.awtui.SwingCommitList.SwingLane;
23  import org.eclipse.jgit.lib.Constants;
24  import org.eclipse.jgit.lib.Ref;
25  import org.eclipse.jgit.revplot.AbstractPlotRenderer;
26  import org.eclipse.jgit.revplot.PlotCommit;
27  
28  final class AWTPlotRenderer extends AbstractPlotRenderer<SwingLane, Color>
29  		implements Serializable {
30  	private static final long serialVersionUID = 1L;
31  
32  	final GraphCellRender cell;
33  
34  	transient Graphics2D g;
35  
36  	AWTPlotRenderer(GraphCellRender c) {
37  		cell = c;
38  	}
39  
40  	void paint(Graphics in, PlotCommit<SwingLane> commit) {
41  		g = (Graphics2D) in.create();
42  		try {
43  			final int h = cell.getHeight();
44  			g.setColor(cell.getBackground());
45  			g.fillRect(0, 0, cell.getWidth(), h);
46  			if (commit != null)
47  				paintCommit(commit, h);
48  		} finally {
49  			g.dispose();
50  			g = null;
51  		}
52  	}
53  
54  	/** {@inheritDoc} */
55  	@Override
56  	protected void drawLine(final Color color, int x1, int y1, int x2,
57  			int y2, int width) {
58  		if (y1 == y2) {
59  			x1 -= width / 2;
60  			x2 -= width / 2;
61  		} else if (x1 == x2) {
62  			y1 -= width / 2;
63  			y2 -= width / 2;
64  		}
65  
66  		g.setColor(color);
67  		g.setStroke(CommitGraphPane.stroke(width));
68  		g.drawLine(x1, y1, x2, y2);
69  	}
70  
71  	/** {@inheritDoc} */
72  	@Override
73  	protected void drawCommitDot(final int x, final int y, final int w,
74  			final int h) {
75  		g.setColor(Color.blue);
76  		g.setStroke(CommitGraphPane.strokeCache[1]);
77  		g.fillOval(x, y, w, h);
78  		g.setColor(Color.black);
79  		g.drawOval(x, y, w, h);
80  	}
81  
82  	/** {@inheritDoc} */
83  	@Override
84  	protected void drawBoundaryDot(final int x, final int y, final int w,
85  			final int h) {
86  		g.setColor(cell.getBackground());
87  		g.setStroke(CommitGraphPane.strokeCache[1]);
88  		g.fillOval(x, y, w, h);
89  		g.setColor(Color.black);
90  		g.drawOval(x, y, w, h);
91  	}
92  
93  	/** {@inheritDoc} */
94  	@Override
95  	protected void drawText(String msg, int x, int y) {
96  		final int texth = g.getFontMetrics().getHeight();
97  		final int y0 = (y - texth) / 2 + (cell.getHeight() - texth) / 2;
98  		g.setColor(cell.getForeground());
99  		g.drawString(msg, x, y0 + texth - g.getFontMetrics().getDescent());
100 	}
101 
102 	/** {@inheritDoc} */
103 	@Override
104 	protected Color laneColor(SwingLane myLane) {
105 		return myLane != null ? myLane.color : Color.black;
106 	}
107 
108 	void paintTriangleDown(int cx, int y, int h) {
109 		final int tipX = cx;
110 		final int tipY = y + h;
111 		final int baseX1 = cx - 10 / 2;
112 		final int baseX2 = tipX + 10 / 2;
113 		final int baseY = y;
114 		final Polygon triangle = new Polygon();
115 		triangle.addPoint(tipX, tipY);
116 		triangle.addPoint(baseX1, baseY);
117 		triangle.addPoint(baseX2, baseY);
118 		g.fillPolygon(triangle);
119 		g.drawPolygon(triangle);
120 	}
121 
122 	/** {@inheritDoc} */
123 	@Override
124 	protected int drawLabel(int x, int y, Ref ref) {
125 		String txt;
126 		String name = ref.getName();
127 		if (name.startsWith(Constants.R_HEADS)) {
128 			g.setBackground(Color.GREEN);
129 			txt = name.substring(Constants.R_HEADS.length());
130 		} else if (name.startsWith(Constants.R_REMOTES)){
131 			g.setBackground(Color.LIGHT_GRAY);
132 			txt = name.substring(Constants.R_REMOTES.length());
133 		} else if (name.startsWith(Constants.R_TAGS)){
134 			g.setBackground(Color.YELLOW);
135 			txt = name.substring(Constants.R_TAGS.length());
136 		} else {
137 			// Whatever this would be
138 			g.setBackground(Color.WHITE);
139 			if (name.startsWith(Constants.R_REFS))
140 				txt = name.substring(Constants.R_REFS.length());
141 			else
142 				txt = name; // HEAD and such
143 		}
144 		if (ref.getPeeledObjectId() != null) {
145 			float[] colorComponents = g.getBackground().getRGBColorComponents(null);
146 			colorComponents[0] *= 0.9f;
147 			colorComponents[1] *= 0.9f;
148 			colorComponents[2] *= 0.9f;
149 			g.setBackground(new Color(colorComponents[0],colorComponents[1],colorComponents[2]));
150 		}
151 		if (txt.length() > 12)
152 			txt = txt.substring(0,11) + "\u2026"; // ellipsis "…" (in UTF-8) //$NON-NLS-1$
153 
154 		final int texth = g.getFontMetrics().getHeight();
155 		int textw = g.getFontMetrics().stringWidth(txt);
156 		g.setColor(g.getBackground());
157 		int arcHeight = texth/4;
158 		int y0 = y - texth/2 + (cell.getHeight() - texth)/2;
159 		g.fillRoundRect(x , y0, textw + arcHeight*2, texth -1, arcHeight, arcHeight);
160 		g.setColor(g.getColor().darker());
161 		g.drawRoundRect(x, y0, textw + arcHeight*2, texth -1 , arcHeight, arcHeight);
162 		g.setColor(Color.BLACK);
163 		g.drawString(txt, x + arcHeight, y0 + texth - g.getFontMetrics().getDescent());
164 
165 		return arcHeight * 3 + textw;
166 	}
167 }