/* * Copyright 2000-2009 JetBrains s.r.o. * * 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.intellij.ui; import javax.swing.*; import java.awt.*; /** * @author kir */ public class ErrorLabel extends JLabel { private boolean myUnderline; private Color myForeground; private String myTooltip; public ErrorLabel() { this(null, null); } public ErrorLabel(String text) { this(text, null); } public ErrorLabel(String text, Icon icon) { super(text, icon, SwingConstants.LEFT); setOpaque(false); } public void setErrorText(String text, Color color) { boolean newUnderline = text != null; myForeground = color; if (newUnderline) { updateLabelView(newUnderline, text); } else if (myUnderline) { updateLabelView(newUnderline, myTooltip); } } @Override public void setToolTipText(String text) { if (myUnderline) { myTooltip = text; } else { super.setToolTipText(text); } } private void updateLabelView(boolean newUnderline, String tooltip) { super.setToolTipText(tooltip); myUnderline = newUnderline; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); String text = getText(); if (text != null && myUnderline) { g.setColor(myForeground); int x = 0; Icon icon = getIcon(); if (icon != null) { x = icon.getIconWidth() + getIconTextGap(); } if (getHorizontalAlignment() == CENTER) { int w = g.getFontMetrics().stringWidth(text); x += (getWidth() - x - w) >> 1; } drawWave(this, g, x, text); } } public static void drawWave(Component c, Graphics g, int x, String text) { int y = getTextBaseLine(c); y += 2; int width = c.getFontMetrics(c.getFont()).stringWidth(text); int nLines = (width >> 1) + 1; int xCurr = x; int yBottom = y + 1; int []xx = new int[nLines + 1]; int []yy = new int[nLines + 1]; int line = 0; for (; line < nLines; line += 2) { xx[line] = xCurr; yy[line] = yBottom; xx[line + 1] = xCurr + 2; yy[line + 1] = yBottom - 2; xCurr += 4; } g.drawPolyline(xx, yy, line); } private static int getTextBaseLine(Component c) { FontMetrics fm = c.getFontMetrics(c.getFont()); return (c.getHeight() >> 1) + (fm.getHeight() >> 1) - fm.getDescent(); } }