cs151/hw4/src/ShapeIcon.java
2025-04-19 16:36:31 -07:00

91 lines
2.8 KiB
Java

import javax.swing.Icon;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
/**
* An icon that draws a CompositeShape.
*/
public class ShapeIcon implements Icon {
private final CompositeShape shape;
private final int width;
private final int height;
private boolean outline = false; // Flag to indicate if the icon should be outlined
/**
* Constructs a ShapeIcon.
* @param shape the shape to draw
* @param width the desired width of the icon
* @param height the desired height of the icon
*/
public ShapeIcon(CompositeShape shape, int width, int height) {
this.shape = shape;
this.width = width;
this.height = height;
}
/**
* Sets whether this icon should draw an outline (e.g., when selected).
* @param outline true to draw outline, false otherwise.
*/
public void setOutline(boolean outline) {
this.outline = outline;
}
@Override
public int getIconWidth() {
return width;
}
@Override
public int getIconHeight() {
return height;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g.create(); // Work on a copy
// Enable antialiasing for smoother graphics
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Translate to the icon's drawing position
g2.translate(x, y);
double shapeWidth = shape.getWidth();
double shapeHeight = shape.getHeight();
// Calculate scaling factor to fit shape within icon bounds
double scaleX = (shapeWidth == 0) ? 1 : (double) width / shapeWidth;
double scaleY = (shapeHeight == 0) ? 1 : (double) height / shapeHeight;
double scale = Math.min(scaleX, scaleY) * 0.8; // Use 80% of space for padding
// Calculate translation to center the scaled shape
double dx = (width - shapeWidth * scale) / 2.0;
double dy = (height - shapeHeight * scale) / 2.0;
// Apply centering translation and scaling
AffineTransform originalTransform = g2.getTransform();
g2.translate(dx, dy);
g2.scale(scale, scale);
// Draw the shape
shape.draw(g2);
// Restore original transform before drawing outline (if any)
g2.setTransform(originalTransform);
// Draw outline if selected
if (outline) {
// Simple rectangle outline around the icon area
g2.setColor(java.awt.Color.GRAY);
g2.drawRect(0, 0, width - 1, height - 1);
g2.drawRect(1, 1, width - 3, height - 3); // Inner outline
}
g2.dispose(); // Clean up the graphics copy
}
}