/* * Copyright (c) 2013 David Boissier * * 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 org.codinjutsu.tools.jenkins.view.util; import com.intellij.util.ui.UIUtil; import org.codinjutsu.tools.jenkins.logic.BuildStatusAggregator; import org.codinjutsu.tools.jenkins.model.Build; import org.codinjutsu.tools.jenkins.model.BuildStatusEnum; import javax.swing.*; import java.awt.*; public class BuildStatusIcon extends JComponent { private static final int PIXEL_WIDTH = 8; private static final Color FOREGROUND_COLOR = new JLabel().getForeground(); final Icon icon; final String toolTipText; final int numberToDisplay; private final int numberWith; public static JComponent createIcon(BuildStatusAggregator aggregator) { if (aggregator.hasNoResults()) { return new BuildStatusIcon(Build.ICON_BY_BUILD_STATUS_MAP.get(BuildStatusEnum.NULL), "No builds", 0); } int nbBrokenBuilds = aggregator.getNbBrokenBuilds(); if (nbBrokenBuilds > 0) { return new BuildStatusIcon(Build.ICON_BY_BUILD_STATUS_MAP.get(BuildStatusEnum.FAILURE), String.format("%d broken builds", nbBrokenBuilds), nbBrokenBuilds); } int nbUnstableBuilds = aggregator.getNbUnstableBuilds(); if (nbUnstableBuilds > 0) { return new BuildStatusIcon(Build.ICON_BY_BUILD_STATUS_MAP.get(BuildStatusEnum.UNSTABLE), String.format("%d unstable builds", nbUnstableBuilds), nbUnstableBuilds); } return new BuildStatusIcon(Build.ICON_BY_BUILD_STATUS_MAP.get(BuildStatusEnum.SUCCESS), "No broken builds", 0); } private BuildStatusIcon(Icon icon, String toolTipText, int numberToDisplay) { this.icon = icon; this.toolTipText = toolTipText; this.numberToDisplay = numberToDisplay; this.numberWith = numberToDisplay == 0 ? 0 : String.valueOf(numberToDisplay).length() * PIXEL_WIDTH; setOpaque(false); } public Dimension getMinimumSize() { return getPreferredSize(); } public Dimension getMaximumSize() { return getPreferredSize(); } public Dimension getPreferredSize() { final Insets insets = getInsets(); return new Dimension( icon.getIconWidth() + insets.left + insets.right + numberWith, icon.getIconHeight() + insets.top + insets.bottom ); } protected void paintComponent(Graphics g) { g.setColor(UIUtil.getPanelBackground()); g.fillRect(0, 0, getWidth(), getHeight()); final Dimension size = getSize(); int x = (size.width - icon.getIconWidth() - numberWith) / 2; int y = (size.height - icon.getIconHeight()) / 2; paintIcon(g, icon, x, y); setToolTipText(toolTipText); if (numberToDisplay > 0) { Font originalFont = g.getFont(); Color originalColor = g.getColor(); g.setFont(calcFont()); y += icon.getIconHeight() - g.getFontMetrics().getDescent(); x += icon.getIconWidth(); g.setColor(FOREGROUND_COLOR); g.drawString(String.valueOf(numberToDisplay), x, y); g.setFont(originalFont); g.setColor(originalColor); } } private void paintIcon(Graphics g, Icon icon, int x, int y) { icon.paintIcon(this, g, x, y); } private Font calcFont() { return getFont().deriveFont(Font.BOLD).deriveFont((float) icon.getIconHeight() * 3 / 5); } }