| /* |
| * 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 <T> Map<T, String> getGraduatedColorMap(Set<T> keys, Color baseColor) { |
| Map<T, String> colorMap = new HashMap<T, String>(); |
| |
| 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 <T> Map<T, String> getRandomColorMap(Set<T> keys) { |
| Map<T, String> colorMap = new HashMap<T, String>(); |
| |
| 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)); |
| } |
| } |