aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/javax/swing/text/ComponentView.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/javax/swing/text/ComponentView.java')
-rw-r--r--libjava/classpath/javax/swing/text/ComponentView.java494
1 files changed, 0 insertions, 494 deletions
diff --git a/libjava/classpath/javax/swing/text/ComponentView.java b/libjava/classpath/javax/swing/text/ComponentView.java
deleted file mode 100644
index 3680b42..0000000
--- a/libjava/classpath/javax/swing/text/ComponentView.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/* ComponentView.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath 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 for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package javax.swing.text;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Rectangle;
-import java.awt.Shape;
-
-import javax.swing.SwingUtilities;
-
-/**
- * A {@link View} implementation that is able to render arbitrary
- * {@link Component}s. This uses the attribute
- * {@link StyleConstants#ComponentAttribute} to determine the
- * <code>Component</code> that should be rendered. This <code>Component</code>
- * becomes a direct child of the <code>JTextComponent</code> that contains
- * this <code>ComponentView</code>, so this view must not be shared between
- * multiple <code>JTextComponent</code>s.
- *
- * @author Roman Kennke (kennke@aicas.com)
- * @author original author unknown
- */
-public class ComponentView extends View
-{
-
- /**
- * A special container that sits between the component and the hosting
- * container. This is used to propagate invalidate requests and cache
- * the component's layout sizes.
- */
- private class Interceptor
- extends Container
- {
- Dimension min;
- Dimension pref;
- Dimension max;
- float alignX;
- float alignY;
-
- /**
- * Creates a new instance that hosts the specified component.
- */
- Interceptor(Component c)
- {
- setLayout(null);
- add(c);
- cacheComponentSizes();
- }
-
- /**
- * Intercepts the normal invalidate call and propagates the invalidate
- * request up using the View's preferenceChanged().
- */
- public void invalidate()
- {
- super.invalidate();
- if (getParent() != null)
- preferenceChanged(null, true, true);
- }
-
- /**
- * This is overridden to simply cache the layout sizes.
- */
- public void doLayout()
- {
- cacheComponentSizes();
- }
-
- /**
- * Overridden to also reshape the component itself.
- */
- public void reshape(int x, int y, int w, int h)
- {
- super.reshape(x, y, w, h);
- if (getComponentCount() > 0)
- getComponent(0).setSize(w, h);
- cacheComponentSizes();
- }
-
- /**
- * Overridden to also show the component.
- */
- public void show()
- {
- super.show();
- if (getComponentCount() > 0)
- getComponent(0).setVisible(true);
- }
-
- /**
- * Overridden to also hide the component.
- */
- public void hide()
- {
- super.hide();
- if (getComponentCount() > 0)
- getComponent(0).setVisible(false);
- }
-
- /**
- * Overridden to return the cached value.
- */
- public Dimension getMinimumSize()
- {
- maybeValidate();
- return min;
- }
-
- /**
- * Overridden to return the cached value.
- */
- public Dimension getPreferredSize()
- {
- maybeValidate();
- return pref;
- }
-
- /**
- * Overridden to return the cached value.
- */
- public Dimension getMaximumSize()
- {
- maybeValidate();
- return max;
- }
-
- /**
- * Overridden to return the cached value.
- */
- public float getAlignmentX()
- {
- maybeValidate();
- return alignX;
- }
-
- /**
- * Overridden to return the cached value.
- */
- public float getAlignmentY()
- {
- maybeValidate();
- return alignY;
- }
-
- /**
- * Validates the container only when necessary.
- */
- private void maybeValidate()
- {
- if (! isValid())
- validate();
- }
-
- /**
- * Fetches the component layout sizes into the cache.
- */
- private void cacheComponentSizes()
- {
- if (getComponentCount() > 0)
- {
- Component c = getComponent(0);
- min = c.getMinimumSize();
- pref = c.getPreferredSize();
- max = c.getMaximumSize();
- alignX = c.getAlignmentX();
- alignY = c.getAlignmentY();
- }
- }
- }
-
- /**
- * The component that is displayed by this view.
- */
- private Component comp;
-
- /**
- * The intercepting container.
- */
- private Interceptor interceptor;
-
- /**
- * Creates a new instance of <code>ComponentView</code> for the specified
- * <code>Element</code>.
- *
- * @param elem the element that this <code>View</code> is rendering
- */
- public ComponentView(Element elem)
- {
- super(elem);
- }
-
- /**
- * Creates the <code>Component</code> that this <code>View</code> is
- * rendering. The <code>Component</code> is determined using
- * the {@link StyleConstants#ComponentAttribute} of the associated
- * <code>Element</code>.
- *
- * @return the component that is rendered
- */
- protected Component createComponent()
- {
- return StyleConstants.getComponent(getElement().getAttributes());
- }
-
- /**
- * Returns the alignment of this <code>View</code> along the specified axis.
- *
- * @param axis either {@link View#X_AXIS} or {@link View#Y_AXIS}
- *
- * @return the alignment of this <code>View</code> along the specified axis
- */
- public float getAlignment(int axis)
- {
- float align = 0.0F;
- // I'd rather throw an IllegalArgumentException for illegal axis,
- // but the Harmony testsuite indicates fallback to super behaviour.
- if (interceptor != null && (axis == X_AXIS || axis == Y_AXIS))
- {
- if (axis == X_AXIS)
- align = interceptor.getAlignmentX();
- else if (axis == Y_AXIS)
- align = interceptor.getAlignmentY();
- else
- assert false : "Must not reach here";
- }
- else
- align = super.getAlignment(axis);
- return align;
- }
-
- /**
- * Returns the <code>Component</code> that is rendered by this
- * <code>ComponentView</code>.
- *
- * @return the <code>Component</code> that is rendered by this
- * <code>ComponentView</code>
- */
- public final Component getComponent()
- {
- return comp;
- }
-
- /**
- * Returns the maximum span of this <code>View</code> along the specified
- * axis.
- *
- * This will return {@link Component#getMaximumSize()} for the specified
- * axis.
- *
- * @return the maximum span of this <code>View</code> along the specified
- * axis
- */
- public float getMaximumSpan(int axis)
- {
- if (axis != X_AXIS && axis != Y_AXIS)
- throw new IllegalArgumentException("Illegal axis");
- float span = 0;
- if (interceptor != null)
- {
- if (axis == X_AXIS)
- span = interceptor.getMaximumSize().width;
- else if (axis == Y_AXIS)
- span = interceptor.getMaximumSize().height;
- else
- assert false : "Must not reach here";
- }
- return span;
- }
-
- public float getMinimumSpan(int axis)
- {
- if (axis != X_AXIS && axis != Y_AXIS)
- throw new IllegalArgumentException("Illegal axis");
- float span = 0;
- if (interceptor != null)
- {
- if (axis == X_AXIS)
- span = interceptor.getMinimumSize().width;
- else if (axis == Y_AXIS)
- span = interceptor.getMinimumSize().height;
- else
- assert false : "Must not reach here";
- }
- return span;
- }
-
- public float getPreferredSpan(int axis)
- {
- if (axis != X_AXIS && axis != Y_AXIS)
- throw new IllegalArgumentException("Illegal axis");
- float span = 0;
- if (interceptor != null)
- {
- if (axis == X_AXIS)
- span = interceptor.getPreferredSize().width;
- else if (axis == Y_AXIS)
- span = interceptor.getPreferredSize().height;
- else
- assert false : "Must not reach here";
- }
- return span;
- }
-
- public Shape modelToView(int pos, Shape a, Position.Bias b)
- throws BadLocationException
- {
- int p0 = getStartOffset();
- int p1 = getEndOffset();
- if (pos >= p0 && pos <= p1)
- {
- Rectangle viewRect = a.getBounds();
- if (pos == p1)
- viewRect.x += viewRect.width;
- viewRect.width = 0;
- return viewRect;
- }
- else
- throw new BadLocationException("Illegal position", pos);
- }
-
- /**
- * The real painting behavour is performed by normal component painting,
- * triggered by the text component that hosts this view. This method does
- * not paint by itself. However, it sets the size of the component according
- * to the allocation that is passed here.
- *
- * @param g the graphics context
- * @param a the allocation of the child
- */
- public void paint(Graphics g, Shape a)
- {
- if (interceptor != null)
- {
- Rectangle r = a instanceof Rectangle ? (Rectangle) a : a.getBounds();
- interceptor.setBounds(r.x, r.y, r.width, r.height);
- }
- }
-
- /**
- * This sets up the component when the view is added to its parent, or
- * cleans up the view when it is removed from its parent.
- *
- * When this view is added to a parent view, the component of this view
- * is added to the container that hosts this view. When <code>p</code> is
- * <code>null</code>, then the view is removed from it's parent and we have
- * to also remove the component from it's parent container.
- *
- * @param p the parent view or <code>null</code> if this view is removed
- * from it's parent
- */
- public void setParent(final View p)
- {
- super.setParent(p);
- if (SwingUtilities.isEventDispatchThread())
- setParentImpl();
- else
- SwingUtilities.invokeLater
- (new Runnable()
- {
- public void run()
- {
- Document doc = getDocument();
- try
- {
- if (doc instanceof AbstractDocument)
- ((AbstractDocument) doc).readLock();
- setParentImpl();
- Container host = getContainer();
- if (host != null)
- {
- preferenceChanged(null, true, true);
- host.repaint();
- }
- }
- finally
- {
- if (doc instanceof AbstractDocument)
- ((AbstractDocument) doc).readUnlock();
- }
- }
- });
- }
-
- /**
- * The implementation of {@link #setParent}. This is package private to
- * avoid a synthetic accessor method.
- */
- void setParentImpl()
- {
- View p = getParent();
- if (p != null)
- {
- Container c = getContainer();
- if (c != null)
- {
- if (interceptor == null)
- {
- // Create component and put it inside the interceptor.
- Component created = createComponent();
- if (created != null)
- {
- comp = created;
- interceptor = new Interceptor(comp);
- }
- }
- if (interceptor != null)
- {
- // Add the interceptor to the hosting container.
- if (interceptor.getParent() == null)
- c.add(interceptor, this);
- }
- }
- }
- else
- {
- if (interceptor != null)
- {
- Container parent = interceptor.getParent();
- if (parent != null)
- parent.remove(interceptor);
- }
- }
- }
-
- /**
- * Maps coordinates from the <code>View</code>'s space into a position
- * in the document model.
- *
- * @param x the x coordinate in the view space
- * @param y the y coordinate in the view space
- * @param a the allocation of this <code>View</code>
- * @param b the bias to use
- *
- * @return the position in the document that corresponds to the screen
- * coordinates <code>x, y</code>
- */
- public int viewToModel(float x, float y, Shape a, Position.Bias[] b)
- {
- int pos;
- // I'd rather do the following. The harmony testsuite indicates
- // that a simple cast is performed.
- //Rectangle r = a instanceof Rectangle ? (Rectangle) a : a.getBounds();
- Rectangle r = (Rectangle) a;
- if (x < r.x + r.width / 2)
- {
- b[0] = Position.Bias.Forward;
- pos = getStartOffset();
- }
- else
- {
- b[0] = Position.Bias.Backward;
- pos = getEndOffset();
- }
- return pos;
- }
-}