replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / LabeledIcon.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.ui;
17
18 import com.intellij.util.text.StringTokenizer;
19 import com.intellij.util.ui.UIUtil;
20
21 import javax.swing.*;
22 import java.awt.*;
23
24 /**
25  * @author Vladimir Kondratyev
26  */
27 public class LabeledIcon implements Icon {
28   private final Icon myIcon;
29   private final String myMnemonic;
30   private final String[] myStrings;
31   private int myIconTextGap = 5;
32
33   private Font myFont = UIUtil.getLabelFont();
34
35   /**
36    * @param icon     not {@code null} icon.
37    * @param text     to be painted under the <code>icon<code>. This parameter can
38    *                 be {@code null} if text isn't specified. In that case {@code LabeledIcon}
39    * @param mnemonic
40    */
41   public LabeledIcon(Icon icon, String text, String mnemonic) {
42     myIcon = icon;
43     myMnemonic = mnemonic;
44     if (text != null) {
45       StringTokenizer tokenizer = new StringTokenizer(text, "\n");
46       myStrings = new String[tokenizer.countTokens()];
47       for (int i = 0; tokenizer.hasMoreTokens(); i++) {
48         myStrings[i] = tokenizer.nextToken();
49       }
50     }
51     else {
52       myStrings = null;
53     }
54   }
55
56   public Font getFont() {
57     return myFont;
58   }
59
60   public void setFont(Font font) {
61     myFont = font;
62   }
63
64   public void setIconTextGap(int iconTextGap) {
65     myIconTextGap = iconTextGap;
66   }
67
68   public int getIconTextGap() {
69     return myIconTextGap;
70   }
71
72   public int getIconHeight() {
73     return myIcon.getIconHeight() + getTextHeight() + myIconTextGap;
74   }
75
76   public int getIconWidth() {
77     return Math.max(myIcon.getIconWidth(), getTextWidth());
78   }
79
80   private int getTextHeight() {
81     if (myStrings != null) {
82       return getFontHeight(myStrings, myFont);
83     }
84     else {
85       return 0;
86     }
87   }
88
89   private static int getFontHeight(String[] strings, Font font) {
90     FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
91     return fontMetrics.getHeight() * strings.length;
92   }
93
94   private int getTextWidth() {
95     if (myStrings != null) {
96       int width = 0;
97       Font font = UIUtil.getLabelFont();
98       FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
99       for (String string : myStrings) {
100         width = fontMetrics.stringWidth(string);
101       }
102
103       if (myMnemonic != null) {
104         width += fontMetrics.stringWidth(myMnemonic);
105       }
106       return width;
107     }
108     else {
109       return 0;
110     }
111   }
112
113   public void paintIcon(Component c, Graphics g, int x, int y) {
114     // Draw icon
115     int width = getIconWidth();
116     int iconWidth = myIcon.getIconWidth();
117     if (width > iconWidth) {
118       myIcon.paintIcon(c, g, x + (width - iconWidth) / 2, y);
119     }
120     else {
121       myIcon.paintIcon(c, g, x, y);
122     }
123     // Draw text
124     if (myStrings != null) {
125       Font font = getFont();
126       FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
127       g.setFont(fontMetrics.getFont());
128       if (myMnemonic != null) {
129         width -= fontMetrics.stringWidth(myMnemonic);
130       }
131       g.setColor(UIUtil.getLabelForeground());
132       y += myIcon.getIconHeight() + fontMetrics.getMaxAscent() + myIconTextGap;
133       for (String string : myStrings) {
134         g.drawString(string, x + (width - fontMetrics.stringWidth(string)) / 2, y);
135         y += fontMetrics.getHeight();
136       }
137
138       if (myMnemonic != null) {
139         y -= fontMetrics.getHeight();
140         g.setColor(UIUtil.getInactiveTextColor());
141         int offset = getTextWidth() - fontMetrics.stringWidth(myMnemonic);
142         g.drawString(myMnemonic, x + offset, y);
143       }
144     }
145   }
146 }