replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / HorizontalLabeledIcon.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 HorizontalLabeledIcon implements Icon {
28   private final Icon myIcon;
29   private final String[] myStrings;
30   private final String myMnemonic;
31
32   /**
33    * @param icon not {@code null} icon.
34    * @param text to be painted under the <code>icon<code>. This parameter can
35    *             be {@code null} if text isn't specified. In that case {@code LabeledIcon}
36    */
37   public HorizontalLabeledIcon(Icon icon, String text, String mnemonic) {
38     myIcon = icon;
39     if (text != null) {
40       StringTokenizer tokenizer = new StringTokenizer(text, "\n");
41       myStrings = new String[tokenizer.countTokens()];
42       for (int i = 0; tokenizer.hasMoreTokens(); i++) {
43         myStrings[i] = tokenizer.nextToken();
44       }
45     }
46     else {
47       myStrings = null;
48     }
49     myMnemonic = mnemonic;
50   }
51
52   public int getIconHeight() {
53     return Math.max(myIcon.getIconHeight(), getTextHeight());
54   }
55
56   public int getIconWidth() {
57     return myIcon.getIconWidth() + getTextWidth() + 5;
58   }
59
60   private int getTextHeight() {
61     if (myStrings != null) {
62       Font font = UIUtil.getLabelFont();
63       FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
64       return fontMetrics.getHeight() * myStrings.length;
65     }
66     else {
67       return 0;
68     }
69   }
70
71   private int getTextWidth() {
72     if (myStrings != null) {
73       int width = 0;
74       Font font = UIUtil.getLabelFont();
75       FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
76       for (int i = 0; i < myStrings.length; i++) {
77         String string = myStrings[i];
78         if (myMnemonic != null && i == myStrings.length-1) {
79           string += " "+myMnemonic;
80         }
81         width = Math.max(width, fontMetrics.stringWidth(string));
82       }
83
84       return width;
85     }
86     else {
87       return 0;
88     }
89   }
90
91   public void paintIcon(Component c, Graphics g, int x, int y) {
92     // Draw icon
93     int height = getIconHeight();
94     int iconHeight = myIcon.getIconHeight();
95     if (height > iconHeight) {
96       myIcon.paintIcon(c, g, x, y + (height - iconHeight) / 2);
97     }
98     else {
99       myIcon.paintIcon(c, g, x, y);
100     }
101
102     // Draw text
103     if (myStrings != null) {
104       Font font = UIUtil.getLabelFont();
105       FontMetrics fontMetrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
106       g.setFont(fontMetrics.getFont());
107       g.setColor(UIUtil.getLabelForeground());
108
109       x += myIcon.getIconWidth() + 5;
110       y += (height - getTextHeight()) / 2 + fontMetrics.getHeight() - fontMetrics.getDescent();
111       for (int i = 0; i < myStrings.length; i++) {
112         String string = myStrings[i];
113         g.drawString(string, x, y);
114         y += fontMetrics.getHeight();
115       }
116       if (myMnemonic != null) {
117         g.setColor(UIUtil.getInactiveTextColor());
118         int offset = fontMetrics.stringWidth(myStrings[myStrings.length-1]+" ");
119         y -= fontMetrics.getHeight();
120         g.drawString(myMnemonic, x + offset, y);
121       }
122     }
123   }
124
125 }