168 lines · 6.0 KB · Java
RawDownload
/* * Copyright (c) 1997, 2000, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */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 */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;}