blob: ddb4a663b2d5b0c7ab78d63f6aa7a811213a9443 [file] [log] [blame]
/*
* Copyright 2000-2012 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.
*/
/** $Id$ */
package org.intellij.images.ui;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.JBColor;
import com.intellij.util.ui.UIUtil;
import icons.ImagesIcons;
import org.intellij.images.ImagesBundle;
import org.intellij.images.editor.ImageDocument;
import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* UI for {@link ThumbnailComponent}.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
public class ThumbnailComponentUI extends ComponentUI {
@NonNls
private static final String DOTS = "...";
@NonNls
private static final String THUMBNAIL_COMPONENT_ERROR_STRING = "ThumbnailComponent.errorString";
private static final Color LINE_COLOR = new Color(0x8E, 0xA8, 0xCE);
private static final Color PNG_COLOR = new Color(0x80, 0x00, 0x80);
private static final Color GIF_COLOR = new Color(0x00, 0x80, 0x00);
private static final Color JPG_COLOR = new Color(0x80, 0x80, 0x00);
private static final Color BMP_COLOR = new Color(0x00, 0x00, 0x80);
private static final ThumbnailComponentUI ui = new ThumbnailComponentUI();
static {
UIManager.getDefaults().put(THUMBNAIL_COMPONENT_ERROR_STRING,
ImagesBundle.message("thumbnails.component.error.text"));
}
public void paint(Graphics g, JComponent c) {
ThumbnailComponent tc = (ThumbnailComponent) c;
if (tc != null) {
paintBackground(g, tc);
if (tc.isDirectory()) {
paintDirectory(g, tc);
} else {
paintImageThumbnail(g, tc);
}
// File name
paintFileName(g, tc);
}
}
private void paintDirectory(Graphics g, ThumbnailComponent tc) {
// Paint directory icon
ImagesIcons.ThumbnailDirectory.paintIcon(tc, g, 5, 5);
int imagesCount = tc.getImagesCount();
if (imagesCount > 0) {
final String title = ImagesBundle.message("icons.count", imagesCount);
Font font = getSmallFont();
FontMetrics fontMetrics = g.getFontMetrics(font);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(title, 5 + (ImagesIcons.ThumbnailDirectory.getIconWidth() - fontMetrics.stringWidth(title)) / 2, ImagesIcons.ThumbnailDirectory
.getIconHeight() / 2 + fontMetrics.getAscent());
}
}
private void paintImageThumbnail(Graphics g, ThumbnailComponent tc) {
// Paint blank
ImagesIcons.ThumbnailBlank.paintIcon(tc, g, 5, 5);
ImageComponent imageComponent = tc.getImageComponent();
ImageDocument document = imageComponent.getDocument();
BufferedImage image = document.getValue();
if (image != null) {
paintImage(g, tc);
} else {
paintError(g, tc);
}
paintFileSize(g, tc);
}
private void paintBackground(Graphics g, ThumbnailComponent tc) {
Dimension size = tc.getSize();
g.setColor(tc.getBackground());
g.fillRect(0, 0, size.width, size.height);
}
private void paintImage(Graphics g, ThumbnailComponent tc) {
ImageComponent imageComponent = tc.getImageComponent();
BufferedImage image = imageComponent.getDocument().getValue();
int blankHeight = ImagesIcons.ThumbnailBlank.getIconHeight();
// Paint image info (and reduce height of text from available height)
blankHeight -= paintImageCaps(g, image);
// Paint image format (and reduce height of text from available height)
blankHeight -= paintFormatText(tc, g);
// Paint image
paintThumbnail(g, imageComponent, blankHeight);
}
private int paintImageCaps(Graphics g, BufferedImage image) {
String description = ImagesBundle.message("icon.dimensions", image.getWidth(), image.getHeight(), image.getColorModel().getPixelSize());
Font font = getSmallFont();
FontMetrics fontMetrics = g.getFontMetrics(font);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(description, 8, 7 + fontMetrics.getAscent());
return fontMetrics.getHeight();
}
private int paintFormatText(ThumbnailComponent tc, Graphics g) {
Font font = getSmallFont().deriveFont(Font.BOLD);
FontMetrics fontMetrics = g.getFontMetrics(font);
String format = tc.getFormat().toUpperCase();
int stringWidth = fontMetrics.stringWidth(format);
int x = ImagesIcons.ThumbnailBlank.getIconWidth() - stringWidth + 2;
int y = ImagesIcons.ThumbnailBlank.getIconHeight() - fontMetrics.getHeight() + 4;
g.setColor(LINE_COLOR);
g.drawLine(x - 3, y - 1, x + stringWidth + 1, y - 1);
g.drawLine(x - 4, y, x - 4, y + fontMetrics.getHeight() - 1);
g.setColor(getFormatColor(format));
g.setFont(font);
g.drawString(
format,
x,
y + fontMetrics.getAscent()
);
return fontMetrics.getHeight();
}
private Color getFormatColor(String format) {
if ("PNG".equals(format)) {
return PNG_COLOR;
} else if ("GIF".equals(format)) {
return GIF_COLOR;
} else if ("JPG".equals(format) || "JPEG".equals(format)) {
return JPG_COLOR;
} else if ("BMP".equals(format) || "WBMP".equals(format)) {
return BMP_COLOR;
}
return Color.BLACK;
}
private void paintThumbnail(Graphics g, ImageComponent imageComponent, int blankHeight) {
// Zoom image by available size
int maxWidth = ImagesIcons.ThumbnailBlank.getIconWidth() - 10;
int maxHeight = blankHeight - 10;
BufferedImage image = imageComponent.getDocument().getValue();
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
if (imageWidth > maxWidth || imageHeight > maxHeight) {
if (imageWidth > maxWidth) {
double proportion = (double) maxWidth / (double) imageWidth;
imageWidth = maxWidth;
imageHeight = (int) ((double) imageHeight * proportion);
}
if (imageHeight > maxHeight) {
double proportion = (double) maxHeight / (double) imageHeight;
imageHeight = maxHeight;
imageWidth = (int) ((double) imageWidth * proportion);
}
}
imageComponent.setCanvasSize(imageWidth, imageHeight);
Dimension size = imageComponent.getSize();
int x = 5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - size.width) / 2;
int y = 5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - size.height) / 2;
imageComponent.paint(g.create(x, y, size.width, size.height));
}
private void paintFileName(Graphics g, ThumbnailComponent tc) {
Font font = UIUtil.getLabelFont();
FontMetrics fontMetrics = g.getFontMetrics(font);
g.setFont(font);
g.setColor(tc.getForeground());
String fileName = tc.getFileName();
String title = fileName;
while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8) {
title = title.substring(0, title.length() - 1);
}
if (fileName.equals(title)) {
// Center
g.drawString(fileName, 6 + (ImagesIcons.ThumbnailBlank.getIconWidth() - 2 - fontMetrics.stringWidth(title)) / 2, ImagesIcons.ThumbnailBlank
.getIconHeight() + 8 + fontMetrics.getAscent());
} else {
int dotsWidth = fontMetrics.stringWidth(DOTS);
while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8 - dotsWidth) {
title = title.substring(0, title.length() - 1);
}
g.drawString(title + DOTS, 6, ImagesIcons.ThumbnailBlank.getIconHeight() + 8 + fontMetrics.getAscent());
}
}
private void paintFileSize(Graphics g, ThumbnailComponent tc) {
Font font = getSmallFont();
FontMetrics fontMetrics = g.getFontMetrics(font);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(
tc.getFileSizeText(),
8,
ImagesIcons.ThumbnailBlank.getIconHeight() + 4 - fontMetrics.getHeight() + fontMetrics.getAscent()
);
}
private void paintError(Graphics g, ThumbnailComponent tc) {
Font font = getSmallFont();
FontMetrics fontMetrics = g.getFontMetrics(font);
Messages.getErrorIcon().paintIcon(
tc,
g,
5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - Messages.getErrorIcon().getIconWidth()) / 2,
5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - Messages.getErrorIcon().getIconHeight()) / 2
);
// Error
String error = getSubmnailComponentErrorString();
g.setColor(JBColor.RED);
g.setFont(font);
g.drawString(error, 8, 8 + fontMetrics.getAscent());
}
private String getSubmnailComponentErrorString() {
return UIManager.getString(THUMBNAIL_COMPONENT_ERROR_STRING);
}
private static Font getSmallFont() {
Font labelFont = UIUtil.getLabelFont();
return labelFont.deriveFont(labelFont.getSize2D() - 2.0f);
}
public Dimension getPreferredSize(JComponent c) {
Font labelFont = UIUtil.getLabelFont();
FontMetrics fontMetrics = c.getFontMetrics(labelFont);
return new Dimension(
ImagesIcons.ThumbnailBlank.getIconWidth() + 10,
ImagesIcons.ThumbnailBlank.getIconHeight() + fontMetrics.getHeight() + 15
);
}
@SuppressWarnings({"UnusedDeclaration"})
public static ComponentUI createUI(JComponent c) {
return ui;
}
}