blob: 2633ef31c9f3c739f03915dba443caa52060c6bb [file] [log] [blame]
/*
* Copyright 2000-2014 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 com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.awt.*;
import static javax.swing.SwingConstants.CENTER;
import static javax.swing.SwingConstants.LEFT;
public class SeparatorWithText extends JComponent {
private String myCaption = "";
private int myPrefWidth;
private boolean myCaptionCentered = true;
public SeparatorWithText() {
setBorder(BorderFactory.createEmptyBorder(getVgap(), 0, getVgap(), 0));
setFont(UIUtil.getLabelFont());
setFont(getFont().deriveFont(Font.BOLD));
}
protected static int getVgap() {
return UIUtil.isUnderNativeMacLookAndFeel() ? 1 : 3;
}
protected static int getHgap() {
return 3;
}
public void setCaptionCentered(boolean captionCentered) {
myCaptionCentered = captionCentered;
}
public Dimension getPreferredSize() {
final Dimension size = getPreferredFontSize();
size.width = myPrefWidth == -1 ? size.width : myPrefWidth;
return size;
}
private Dimension getPreferredFontSize() {
if (hasCaption()) {
FontMetrics fm = getFontMetrics(getFont());
int preferredHeight = fm.getHeight();
int preferredWidth = getPreferredWidth(fm);
return new Dimension(preferredWidth, preferredHeight + getVgap() * 2);
}
return new Dimension(0, getVgap() * 2 + 1);
}
private int getPreferredWidth(FontMetrics fm) {
return fm.stringWidth(myCaption) + 2 * getHgap();
}
private boolean hasCaption() {
return myCaption != null && !myCaption.trim().isEmpty();
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
public void setMinimumWidth(int width) {
myPrefWidth = width;
}
protected void paintComponent(Graphics g) {
g.setColor(GroupedElementsRenderer.POPUP_SEPARATOR_FOREGROUND);
if (hasCaption()) {
Rectangle viewR = new Rectangle(0, getVgap(), getWidth() - 1, getHeight() - getVgap() - 1);
Rectangle iconR = new Rectangle();
Rectangle textR = new Rectangle();
String s = SwingUtilities
.layoutCompoundLabel(g.getFontMetrics(), myCaption, null, CENTER,
myCaptionCentered ? CENTER : LEFT,
CENTER,
myCaptionCentered ? CENTER : LEFT,
viewR, iconR, textR, 0);
final int lineY = textR.y + textR.height / 2;
if (s.equals(myCaption) && viewR.width - textR.width > 2 * getHgap()) {
if (myCaptionCentered) {
g.drawLine(0, lineY, textR.x - getHgap(), lineY);
}
g.drawLine(textR.x + textR.width + getHgap(), lineY, getWidth() - 1, lineY);
}
UIUtil.applyRenderingHints(g);
g.setColor(GroupedElementsRenderer.POPUP_SEPARATOR_TEXT_FOREGROUND);
g.drawString(s, textR.x, textR.y + g.getFontMetrics().getAscent());
}
else {
g.drawLine(0, getVgap(), getWidth() - 1, getVgap());
}
}
protected String getCaption() {
return myCaption;
}
public void setCaption(String captionAboveOf) {
myCaption = captionAboveOf;
}
}