From e3733c7a39cb0249922c7042d6b21a10c2e21e53 Mon Sep 17 00:00:00 2001 From: Alex Lewis Date: Wed, 20 Nov 2013 17:32:27 +0000 Subject: Add coloring modes to the blame page (issue-2, pull request #125) Blame output is now colored according to Commit (default), Author or Age. Both Commit and Author output uses random colors whereas Age uses a single color with varying tints applied to indicate the age. White indicates the eldest commit with the tint darkening as the commits get younger. Change-Id: I045458329af4765e91d5829ce3e8d28e21eeb66e --- src/main/java/com/gitblit/utils/ColorFactory.java | 135 ++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/main/java/com/gitblit/utils/ColorFactory.java (limited to 'src/main/java/com/gitblit/utils') diff --git a/src/main/java/com/gitblit/utils/ColorFactory.java b/src/main/java/com/gitblit/utils/ColorFactory.java new file mode 100644 index 00000000..b40735a0 --- /dev/null +++ b/src/main/java/com/gitblit/utils/ColorFactory.java @@ -0,0 +1,135 @@ +/* + * Copyright 2013 Alex Lewis. + * Copyright 2013 gitblit.com. + * + * 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 com.gitblit.utils; + +import java.awt.Color; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.Set; + +/** + * Factory for creating color maps. + * + * @author Alex Lewis + */ +public class ColorFactory { + + private static final double MAX_TINT_FACTOR = 1; + + private static final double MIN_TINT_FACTOR = 0.2; + + private static final double FIXED_TINT_FACTOR = 0.875; + + /** + * Builds a map of the supplied keys to a random color tinted according to + * the key's position in the set. + * + * Depending on the number of keys in the set a tint is calculated from 1.0 + * (I.e. white) to a minimum tint. The keys are sorted such that the + * "lowest" value will have a full tint applied to it (1.0) with an equally + * decreasing tint applied to each key thereafter. + * + * @param keys + * The keys to create a tinted color for. + * @param baseColor + * the base color (optional) + * @return The map of key to tinted color. + */ + public Map getGraduatedColorMap(Set keys, Color baseColor) { + Map colorMap = new HashMap(); + + if (baseColor == null) { + baseColor = getRandomColor(); + } + double tintStep = (MAX_TINT_FACTOR - MIN_TINT_FACTOR) / keys.size(); + + double currentTint = MAX_TINT_FACTOR; + for (T key : keys) { + Color color = tintColor(baseColor, currentTint); + + colorMap.put(key, getColorString(color)); + + currentTint -= tintStep; + } + + return colorMap; + } + + /** + * Builds a map of the supplied keys to random colors. + * + * Each color is selected randomly and tinted with a fixed tint. + * + * @param keys The keys to create the mapped colors. + * @return The map of key to random color. + */ + public Map getRandomColorMap(Set keys) { + Map colorMap = new HashMap(); + + for (T key : keys) { + Color color = tintColor(getRandomColor(), FIXED_TINT_FACTOR); + colorMap.put(key, getColorString(color)); + } + + return colorMap; + } + + private Color getRandomColor() { + Random random = new Random(); + + Color randomColor = new Color(random.nextInt(256), random.nextInt(256), + random.nextInt(256)); + + return randomColor; + } + + private Color tintColor(Color origColor, double tintFactor) { + int tintedRed = applyTint(origColor.getRed(), tintFactor); + int tintedGreen = applyTint(origColor.getGreen(), tintFactor); + int tintedBlue = applyTint(origColor.getBlue(), tintFactor); + + Color tintedColor = new Color(tintedRed, tintedGreen, tintedBlue); + + return tintedColor; + } + + /** + * Convert the color to an HTML compatible color string in hex format E.g. + * #FF0000 + * + * @param color The color to convert + * @return The string version of the color I.e. #RRGGBB + */ + private String getColorString(Color color) { + return "#" + Integer.toHexString(color.getRGB() & 0x00ffffff); + } + + /** + * Tint the supplied color with a tint factor (0 to 1 inclusive) to make the + * colour more pale I.e. closer to white. + * + * A Tint of 0 has no effect, a Tint of 1 turns the color white. + * + * @param color The original color + * @param tintFactor The factor - 0 to 1 inclusive + * @return The tinted color. + */ + private int applyTint(int color, double tintFactor) { + return (int) (color + ((255 - color) * tintFactor)); + } +} -- cgit v1.2.3