001    /*--------------------------------------------------------------------------+
002    $Id: ECCSMColor.java 26283 2010-02-18 11:18:57Z juergens $
003    |                                                                          |
004    | Copyright 2005-2010 Technische Universitaet Muenchen                     |
005    |                                                                          |
006    | Licensed under the Apache License, Version 2.0 (the "License");          |
007    | you may not use this file except in compliance with the License.         |
008    | You may obtain a copy of the License at                                  |
009    |                                                                          |
010    |    http://www.apache.org/licenses/LICENSE-2.0                            |
011    |                                                                          |
012    | Unless required by applicable law or agreed to in writing, software      |
013    | distributed under the License is distributed on an "AS IS" BASIS,        |
014    | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015    | See the License for the specific language governing permissions and      |
016    | limitations under the License.                                           |
017    +--------------------------------------------------------------------------*/
018    package edu.tum.cs.commons.color;
019    
020    import java.awt.Color;
021    import java.awt.Graphics2D;
022    import java.awt.geom.Rectangle2D;
023    import java.awt.image.BufferedImage;
024    
025    import edu.tum.cs.commons.string.StringUtils;
026    
027    /**
028     * Colors of the CCSM CI.
029     * 
030     * @author Florian Deissenboeck
031     * @author $Author: juergens $
032     * @version $Rev: 26283 $
033     * @levd.rating GREEN Hash: BBF7FFF92CC252EB7D7E4BE16C822AD2
034     */
035    public enum ECCSMColor implements IColor {
036    
037            /** Light blue */
038            LIGHT_BLUE(205, 222, 239),
039    
040            /** Blue */
041            BLUE(99, 156, 206),
042    
043            /** Purple */
044            PURPLE(50, 50, 102),
045    
046            /** Dark Blue */
047            DARK_BLUE(0, 117, 204),
048    
049            /** Green */
050            GREEN(102, 204, 102),
051    
052            /** Yellow */
053            YELLOW(255, 255, 51),
054    
055            /** Red */
056            RED(255, 102, 51),
057    
058            /** Dark red */
059            DARK_RED(204, 51, 51),
060    
061            /** Light Gray */
062            LIGHT_GRAY(204, 204, 204),
063    
064            /** Dark Gray */
065            DARK_GRAY(102, 102, 102);
066    
067            /** Red value. */
068            private final int red;
069    
070            /** Green value. */
071            private final int green;
072    
073            /** Blue value. */
074            private final int blue;
075    
076            /** AWT color. */
077            private Color color;
078    
079            /** Create new color. */
080            private ECCSMColor(int red, int green, int blue) {
081                    check(red);
082                    check(green);
083                    check(blue);
084                    this.red = red;
085                    this.green = green;
086                    this.blue = blue;
087            }
088    
089            /** Check if the color value is legal. */
090            private void check(int colorValue) {
091                    if (colorValue < 0 || colorValue > 255) {
092                            throw new IllegalArgumentException(
093                                            "Value must be between 0 and 255");
094                    }
095            }
096    
097            /** {@inheritDoc} */
098            public String getHTMLColorCode() {
099                    return String.format("#%02X%02X%02X", red, green, blue);
100            }
101    
102            /** {@inheritDoc} */
103            public Color getColor() {
104                    if (color == null) {
105                            color = new Color(red, green, blue);
106                    }
107                    return color;
108            }
109    
110            /** Get string representation. */
111            @Override
112            public String toString() {
113                    return name() + "; " + getHTMLColorCode() + "; "
114                                    + String.format("%03d, %03d, %03d", red, green, blue);
115    
116            }
117    
118            /** Get table of all defined colors. */
119            public static String getColorTable() {
120                    StringBuilder result = new StringBuilder();
121    
122                    result.append("  HTML  |  r    g    b  | name");
123                    result.append(StringUtils.CR);
124    
125                    for (ECCSMColor color : values()) {
126                            result.append(color.getHTMLColorCode());
127                            result.append(" | ");
128                            result.append(String.format("%03d, %03d, %03d", color.red,
129                                            color.green, color.blue));
130                            result.append(" | ");
131                            result.append(color.name());
132                            result.append(StringUtils.CR);
133                    }
134    
135                    return result.toString();
136            }
137    
138            /**
139             * Get image showing all defined colors. If image height is sufficient,
140             * color information text is shown.
141             * 
142             * @param width
143             *            image width
144             * @param height
145             *            image height
146             */
147            public static BufferedImage getColorChart(int width, int height) {
148    
149                    BufferedImage image = new BufferedImage(width, height,
150                                    BufferedImage.TYPE_INT_RGB);
151    
152                    Graphics2D graphics = image.createGraphics();
153    
154                    float barHeight = (float) height / values().length;
155                    boolean drawName = graphics.getFontMetrics().getHeight() < barHeight;
156    
157                    float y = 0;
158                    for (ECCSMColor color : values()) {
159                            graphics.setColor(color.getColor());
160    
161                            Rectangle2D rect = new Rectangle2D.Float(0, y, width, barHeight);
162                            graphics.fill(rect);
163    
164                            y += barHeight;
165    
166                            if (drawName) {
167                                    graphics.setColor(Color.black);
168                                    graphics.drawString(color.toString(), 5f, y - 3);
169                            }
170                    }
171    
172                    return image;
173            }
174    
175    }