- /*
- * @(#)IconView.java 1.28 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
- package javax.swing.text;
-
- import java.awt.*;
- import javax.swing.Icon;
- import javax.swing.event.*;
-
- /**
- * Icon decorator that implements the view interface. The
- * entire element is used to represent the icon. This acts
- * as a gateway from the display-only View implementations to
- * interactive lightweight icons (that is, it allows icons
- * to be embedded into the View hierarchy. The parent of the icon
- * is the container that is handed out by the associated view
- * factory.
- *
- * @author Timothy Prinzing
- * @version 1.28 12/19/03
- */
- public class IconView extends View {
-
- /**
- * Creates a new icon view that represents an element.
- *
- * @param elem the element to create a view for
- */
- public IconView(Element elem) {
- super(elem);
- AttributeSet attr = elem.getAttributes();
- c = StyleConstants.getIcon(attr);
- }
-
- // --- View methods ---------------------------------------------
-
- /**
- * Paints the icon.
- * The real paint behavior occurs naturally from the association
- * that the icon has with its parent container (the same
- * container hosting this view), so this simply allows us to
- * position the icon properly relative to the view. Since
- * the coordinate system for the view is simply the parent
- * containers, positioning the child icon is easy.
- *
- * @param g the rendering surface to use
- * @param a the allocated region to render into
- * @see View#paint
- */
- public void paint(Graphics g, Shape a) {
- Rectangle alloc = a.getBounds();
- c.paintIcon(getContainer(), g, alloc.x, alloc.y);
- }
-
- /**
- * Determines the preferred span for this view along an
- * axis.
- *
- * @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into
- * Typically the view is told to render into the span
- * that is returned, although there is no guarantee.
- * The parent may choose to resize or break the view.
- * @exception IllegalArgumentException for an invalid axis
- */
- public float getPreferredSpan(int axis) {
- switch (axis) {
- case View.X_AXIS:
- return c.getIconWidth();
- case View.Y_AXIS:
- return c.getIconHeight();
- default:
- throw new IllegalArgumentException("Invalid axis: " + axis);
- }
- }
-
- /**
- * Determines the desired alignment for this view along an
- * axis. This is implemented to give the alignment to the
- * bottom of the icon along the y axis, and the default
- * along the x axis.
- *
- * @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the desired alignment >= 0.0f && <= 1.0f. This should be
- * a value between 0.0 and 1.0 where 0 indicates alignment at the
- * origin and 1.0 indicates alignment to the full span
- * away from the origin. An alignment of 0.5 would be the
- * center of the view.
- */
- public float getAlignment(int axis) {
- switch (axis) {
- case View.Y_AXIS:
- return 1;
- default:
- return super.getAlignment(axis);
- }
- }
-
- /**
- * Provides a mapping from the document model coordinate space
- * to the coordinate space of the view mapped to it.
- *
- * @param pos the position to convert >= 0
- * @param a the allocated region to render into
- * @return the bounding box of the given position
- * @exception BadLocationException if the given position does not
- * represent a valid location in the associated document
- * @see View#modelToView
- */
- public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException {
- int p0 = getStartOffset();
- int p1 = getEndOffset();
- if ((pos >= p0) && (pos <= p1)) {
- Rectangle r = a.getBounds();
- if (pos == p1) {
- r.x += r.width;
- }
- r.width = 0;
- return r;
- }
- throw new BadLocationException(pos + " not in range " + p0 + "," + p1, pos);
- }
-
- /**
- * Provides a mapping from the view coordinate space to the logical
- * coordinate space of the model.
- *
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
- * @param a the allocated region to render into
- * @return the location within the model that best represents the
- * given point of view >= 0
- * @see View#viewToModel
- */
- public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
- Rectangle alloc = (Rectangle) a;
- if (x < alloc.x + (alloc.width / 2)) {
- bias[0] = Position.Bias.Forward;
- return getStartOffset();
- }
- bias[0] = Position.Bias.Backward;
- return getEndOffset();
- }
-
- // --- member variables ------------------------------------------------
-
- private Icon c;
- }
-