/* * Copyright (c) 2005 Matthew Hall and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Matthew Hall - initial API and implementation */ package org.eclipse.nebula.paperclips.core.border; import org.eclipse.nebula.paperclips.core.internal.util.ResourcePool; import org.eclipse.nebula.paperclips.core.internal.util.Util; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; /** * A border that draws a rectangle around a print. * * @author Matthew Hall */ public class LineBorder implements Border { RGB rgb; int lineWidth = 1; // in points int gapSize = 5; // in points /** * Constructs a LineBorder with a black border and 5-pt insets. (72 pts = * 1") */ public LineBorder() { this(new RGB(0, 0, 0)); // black } /** * Constructs a LineBorder with 5-pt insets. (72 pts = 1") * * @param rgb * the color to use for the border. */ public LineBorder(RGB rgb) { setRGB(rgb); } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + gapSize; result = prime * result + lineWidth; result = prime * result + ((rgb == null) ? 0 : rgb.hashCode()); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; LineBorder other = (LineBorder) obj; if (gapSize != other.gapSize) return false; if (lineWidth != other.lineWidth) return false; if (rgb == null) { if (other.rgb != null) return false; } else if (!rgb.equals(other.rgb)) return false; return true; } /** * Sets the border color to the argument. * * @param rgb * the new border color. */ public void setRGB(RGB rgb) { this.rgb = new RGB(rgb.red, rgb.green, rgb.blue); } /** * Returns the border color. * * @return the border color. */ public RGB getRGB() { return new RGB(rgb.red, rgb.green, rgb.blue); } /** * Sets the line width to the argument. * * @param points * the line width, in points. */ public void setLineWidth(int points) { if (points < 1) points = 1; this.lineWidth = points; } /** * Returns the line width of the border, expressed in points. * * @return the line width of the border, expressed in points. */ public int getLineWidth() { return lineWidth; } /** * Sets the size of the gap between the line border and the target print. * * @param points * the gap size, expressed in points. */ public void setGapSize(int points) { if (points < 1) points = 1; this.gapSize = points; } /** * Returns the size of the gap between the line border and the target print, * expressed in points. * * @return the gap size between the line border and the target print. */ public int getGapSize() { return Math.max(lineWidth, gapSize); } public BorderPainter createPainter(Device device, GC gc) { return new LineBorderPainter(this, device, gc); } } class LineBorderPainter extends AbstractBorderPainter { private final Device device; private final RGB rgb; private final Point lineWidth; private final Point borderWidth; LineBorderPainter(LineBorder border, Device device, GC gc) { Util.notNull(border, device, gc); this.rgb = border.rgb; this.device = device; int lineWidthPoints = border.getLineWidth(); int borderWidthPoints = border.getGapSize(); Point dpi = device.getDPI(); lineWidth = new Point(Math.round(lineWidthPoints * dpi.x / 72f), Math .round(lineWidthPoints * dpi.y / 72f)); borderWidth = new Point(Math.round(borderWidthPoints * dpi.x / 72f), Math.round(borderWidthPoints * dpi.y / 72f)); } public int getLeft() { return borderWidth.x; } public int getRight() { return borderWidth.x; } public int getTop(boolean open) { return open ? 0 : borderWidth.y; } public int getBottom(boolean open) { return open ? 0 : borderWidth.y; } public void paint(GC gc, int x, int y, int width, int height, boolean topOpen, boolean bottomOpen) { Color oldColor = gc.getBackground(); try { gc.setBackground(ResourcePool.forDevice(device).getColor(rgb)); // Left & right gc.fillRectangle(x, y, lineWidth.x, height); gc.fillRectangle(x + width - lineWidth.x, y, lineWidth.x, height); // Top & bottom if (!topOpen) gc.fillRectangle(x, y, width, lineWidth.y); if (!bottomOpen) gc.fillRectangle(x, y + height - lineWidth.y, width, lineWidth.y); } finally { gc.setBackground(oldColor); } } public Point getOverlap() { return new Point(lineWidth.x, lineWidth.y); } public void dispose() { } // Shared resources -- nothing to dispose }