001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.forms.components.image;
031:
032: import java.awt.Color;
033: import java.awt.Dimension;
034: import java.awt.Graphics;
035: import java.awt.Insets;
036: import java.awt.Rectangle;
037:
038: import javax.swing.Icon;
039: import javax.swing.JComponent;
040:
041: import com.jeta.forms.gui.effects.ImagePainter;
042: import com.jeta.forms.store.properties.ImageProperty;
043:
044: /**
045: * A component that displays an image. The image can be aligned horizontally:
046: * LEFT, CENTER, and RIGHT and vertically: TOP, CENTER, BOTTOM.
047: *
048: * This component is used instead if JLabel because it has fewer properties and
049: * is more intuitive when used in the designer.
050: *
051: * @author Jeff Tassin
052: */
053: public class ImageComponent extends JComponent {
054:
055: /**
056: * The horizontal alignment LEFT, CENTER, RIGHT
057: */
058: private int m_halign = ImageProperty.LEFT;
059:
060: /**
061: * The vertical alignment TOP, CENTER, BOTTOM
062: */
063: private int m_valign = ImageProperty.TOP;
064:
065: /**
066: * The image
067: */
068: private Icon m_icon;
069:
070: /**
071: * The preferred size
072: */
073: private Dimension m_pref_size = new Dimension(16, 16);
074:
075: /**
076: * The object that actually renderes the image.
077: */
078: private ImagePainter m_painter;
079:
080: /**
081: * A rectangle used for holding the paint bounds so we don't have to
082: * re-instantiate with every paint.
083: */
084: private Rectangle m_painter_rect;
085:
086: /**
087: * ctor
088: */
089: public ImageComponent() {
090: }
091:
092: /**
093: * @return the horizontal alignment for this image (LEFT,CENTER,RIGHT)
094: */
095: public int getHorizontalAlignment() {
096: return m_halign;
097: }
098:
099: /**
100: * @return the preferred size
101: */
102: public Dimension getPreferredSize() {
103: Insets insets = getInsets();
104: m_pref_size.setSize(
105: insets.left + insets.right + getIconWidth(), insets.top
106: + insets.bottom + getIconHeight());
107: return m_pref_size;
108: }
109:
110: /**
111: * @return the minimum size
112: */
113: public Dimension getMinimumSize() {
114: return getPreferredSize();
115: }
116:
117: /**
118: * @return the vertical alignment for this image (TOP,CENTER,BOTTOM)
119: */
120: public int getVerticalAlignment() {
121: return m_valign;
122: }
123:
124: /**
125: * @return the icon for this image
126: */
127: public Icon getIcon() {
128: return m_icon;
129: }
130:
131: /**
132: * @return the height of the icon
133: */
134: public int getIconHeight() {
135: if (m_icon == null) {
136: return 16;
137: } else
138: return m_icon.getIconHeight();
139: }
140:
141: /**
142: * @return the width of the icon
143: */
144: public int getIconWidth() {
145: if (m_icon == null) {
146: return 16;
147: } else
148: return m_icon.getIconWidth();
149: }
150:
151: /**
152: * Sets the horizontal alignment for this image (LEFT,CENTER,RIGHT)
153: */
154: public void setHorizontalAlignment(int align) {
155: m_halign = align;
156: m_painter = null;
157: }
158:
159: /**
160: * Sets the icon for this iamge
161: */
162: public void setIcon(Icon icon) {
163: m_icon = icon;
164: if (icon != null) {
165: m_pref_size.setSize(Math.max(16, icon.getIconWidth()), Math
166: .max(16, icon.getIconHeight()));
167: }
168: m_painter = null;
169: revalidate();
170: }
171:
172: /**
173: * Sets the vertical alignment for this image (TOP,CENTER,BOTTOM)
174: */
175: public void setVerticalAlignment(int align) {
176: m_valign = align;
177: m_painter = null;
178: }
179:
180: /**
181: * Renders the image on the graphics context
182: */
183: public void paintComponent(Graphics g) {
184: super .paintComponent(g);
185:
186: Insets insets = getInsets();
187: int x = insets.left;
188: int y = insets.top;
189: int width = getWidth() - insets.left - insets.right;
190: int height = getHeight() - insets.top - insets.bottom;
191:
192: if (m_painter == null)
193: m_painter = new ImagePainter(m_icon,
194: getHorizontalAlignment(), getVerticalAlignment());
195:
196: if (m_painter_rect == null)
197: m_painter_rect = new Rectangle();
198:
199: m_painter_rect.setBounds(x, y, width, height);
200:
201: if (isOpaque()) {
202: Color bg = getBackground();
203: if (bg != null) {
204: Rectangle clip_rect = g.getClipBounds();
205: if (m_painter_rect.intersects(clip_rect)) {
206: Rectangle rect = m_painter_rect
207: .intersection(clip_rect);
208: g.setClip(rect.x, rect.y, rect.width, rect.height);
209: Color old_color = g.getColor();
210: g.setColor(bg);
211: g.fillRect(rect.x, rect.y, rect.width, rect.height);
212: g.setColor(old_color);
213: }
214: g.setClip(clip_rect.x, clip_rect.y, clip_rect.width,
215: clip_rect.height);
216: }
217: }
218: m_painter.paint(this, g, m_painter_rect);
219: }
220: }
|