gcc/libjava/java/awt/Container.java
Rolf W. Rasmussen 777e6d799a ComponentDataBlitOp.java: New file.
* gnu/gcj/awt/ComponentDataBlitOp.java: New file.
	* gnu/gcj/awt/GLightweightPeer.java: New file.
	* java/awt/BorderLayout.java: Implemented all methods.
	* java/awt/Button.java (actionListener, actionCommand): Renamed
	and modifier change.
	(addNotify): Call super.
	(dispatchEventImpl): New method.
	(getListeners): New method.
	(label): Made package-private, not private.
	* java/awt/Canvas.java: Implemented class body.
	* java/awt/Color.java (brighter): New method.
	(darker): New method.
	(hashCode): New method.
	* java/awt/Component.java (visible, enabled, eventMask): Set defaults.
	(getGraphicsConfiguration): Delegate to
	getGraphicsConfigurationImpl().
	(getGraphicsConfigurationImpl): New method.
	(getToolkit): Only return value from peer if not null.
	(isDisplayable): Check with parent.
	(isShowing): No parent implies not showing.
	(getForeground): Check parent property if local is null.
	(getBackground): Likewise.
	(getFont): Likewise.
	(setForeground): Inform peer.
	(setBackground): Likewise
	(setLocale): Invalidate component.
	(getColorModel): Implemented.
	(setLocation): Invalidate, or ignore if no change.
	(setSize): Invalidate, or ignore if no change.
	(setBounds): Invalidate, or ignore if no change.
	(isOpaque): By default, heavyweight implies opaque.
	(isLightweight): Implemented.
	(getMaximumSize): Implemented.
	(doLayout): Implemented, NOP.
	(validate): Implemented, NOP.
	(invalidate): Only propagate to parent if parent was valid.
	(getGraphics): Implemented.
	(getFontMetrics): Implemented.
	(update): Implemented.
	(paintAll): Implemented.
	(repaint): Implemented all repaint methods.
	(print): Implemented.
	(printAll): Implemented.
	(createImage): Implemented.
	(dispatchEvent): Give the peer a chance to handle the event.
	(dispatchEventImpl): Dispatch paint events.
	(enableEvents): Lightweights enable events on parent component.
	(coalesceEvents): Coalesce paint events, and select event type
	using a switch.
	(coalescePaintEvents): New method.
	(processEvent): Fix unfortunate ordering of statements, and call
	correct method for MOUSE_CLICKED.
	(processPaintEvent): New method.
	(addNotify): Allow container to notify children before event
	mask is set in peer.
	(addNotifyContainerChildren): New method.
	(removeNotify): Visibility should not change on removeNotify.
	(paramString): Implemented.
	(list): Implemented two of the list methods.
	* Container (myInsets): Removed, insets are managed by peer.
	(getInsets): Query peer.
	(addImpl): Fix reparenting, enable events for lightweights,
	initialize component array.
	(validate): Call doLayout in validateTree() instead.
	(validateTree): Do nothing if already valid. Call beginValidate(),
	endValidate() on peer. Call validateTree() instead of validate()
	for children that are containers. Mark valid after validation of
	children.
	(setFont): Partial implementation.
	(paint): Implemented.
	(visitChildren): New method.
	(visitChild): New method.
	(update): Implemented.
	(print): Implemented.
	(paintComponents): Implemented.
	(printComponents): Consider translation and clipping.
	(getComponentAt): Ignore invisible children. Return this if no
	child match.
	(addNotify): Call super.
	(addNotifyContainerChildren): New method.
	(paramString): Implemented.
	(list): Implemented.
	* java/awt/EventQueue (invokeAndWait): Get system event queue the
	right way.
	(invokeLater): Likewise.
	(isDispatchThread): Likewise.
	* java/awt/FontMetrics (getLeading): Formula change.
	(getDescent): Consider leading also.
	(getMaxAscent): Default to getAscent().
	(getMaxDescent): Default to getDescent.
	(getMaxAdvance): Return value signifying unknown.
	(charWidth): Both methods implemented.
	(charsWidth): Implemented.
	(bytesWidth): Implemented.
	(getWidths): Implemented.
	* java/awt/Frame.java (NORMAL, ICONIFIED, iconImage, isResizable,
	state): New fields.
	(Frame): Rearragend constuctor chaining to disallow null being
	passed as a graphics configuration.
	(getTitle): Return empty string if null.
	(dispose): Removed.
	(getIconImage): New method.
	(setIconImage): New method.
	(finalize): New method.
	(setMenuBar): Notify peer.
	(isResizable): New method.
	(setResizable): New method.
	(getState): New method.
	(getFont): Removed.
	(remove): Implemented.
	(removeNotify): New method.
	(getFrames): New method.
	* java/awt/Graphics.java: Implemented body of class.
	* java/awt/Graphics2D.java: New file.
	* java/awt/GraphicsConfiguration.java: Enabled part of the API.
	* java/awt/Image.java: Implemented body of class.
	* java/awt/Panel.java (Panel): Call correct super constructor.
	(addNotify): Implemented.
	* java/awt/Rectangle.java (isEmpty): Fixed reversed logic.
	* java/awt/RenderingHints.java: New file.
	* java/awt/Toolkit.java (createComponent): Implemented.
	(getSystemEventQueue): Delegate to getSystemEventQueueImpl().
	* java/awt/Window.java (Window): Two new constructors. Reordered
	constructor chaining.
	(getGraphicsConfigurationImpl): New method.
	(finalize): Call super.
	(addNotify): Call super.
	(pack): Do layout stuff.
	(show): Ensure that peer exists and that component is valid.
	(dispose): Dispose owned children.
	(getOwner): Simplify code, casting null pointers is valid.
	(getGraphicsConfiguration): Ask peer if local value is null.
	* java/awt/event/ActionEvent.java (getActionCommand): Renamed from
	getcmd().
	* java/awt/image/BufferedImage.java: New file.
	* java/awt/image/RasterOp.java: New file.
	* java/awt/peer/ComponentPeer.java (getGraphicsConfiguration):
	More powerfull replacement for getColorModel().
	(getColorModel) Removed.
	(setEventMask) New method.
	* Makefile.am: Added new files.
	* Makefile.in: Rebuilt.

From-SVN: r35748
2000-08-16 18:03:48 +00:00

626 lines
14 KiB
Java

/* Copyright (C) 1999, 2000 Free Software Foundation
This file is part of libjava.
This software is copyrighted work licensed under the terms of the
Libjava License. Please consult the file "LIBJAVA_LICENSE" for
details. */
package java.awt;
import java.awt.event.*;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.EventListener;
import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
import java.awt.peer.LightweightPeer;
/* A somewhat incomplete class. */
public abstract class Container extends Component
{
/* Serialized fields from the serialization spec. */
int ncomponents;
Component[] component;
LayoutManager layoutMgr;
/* LightweightDispatcher dispatcher; */ // wtf?
Dimension maxSize;
int containerSerializedDataVersion;
/* Anything else is non-serializable, and should be declared "transient". */
transient ContainerListener containerListener;
public Container()
{
}
public int getComponentCount()
{
return ncomponents;
}
/** @deprecated Use getComponentCount() instead. */
public int countComponents()
{
return ncomponents;
}
public Component getComponent (int n)
{
if (n < 0 || n >= ncomponents)
throw new ArrayIndexOutOfBoundsException("no such component");
return component[n];
}
public Component[] getComponents()
{
Component[] result = new Component[ncomponents];
if (ncomponents > 0)
System.arraycopy(component, 0, result, 0, ncomponents);
return result;
}
public Insets getInsets()
{
if (peer == null)
return new Insets(0, 0, 0, 0);
return ((ContainerPeer) peer).getInsets();
}
/** @deprecated Use getInsets() instead. */
public Insets insets()
{
return getInsets();
}
public Component add (Component comp)
{
addImpl (comp, null, -1);
return comp;
}
public Component add (String name, Component comp)
{
addImpl (comp, name, -1);
return comp;
}
public Component add (Component comp, int index)
{
addImpl (comp, null, index);
return comp;
}
public void add (Component comp, Object constraints)
{
addImpl (comp, constraints, -1);
}
public void add (Component comp, Object constraints, int index)
{
addImpl (comp, constraints, index);
}
protected void addImpl (Component comp, Object constraints, int index)
{
if (index > ncomponents
|| comp instanceof Window
|| (comp instanceof Container
&& ((Container) comp).isAncestorOf (this)))
throw new IllegalArgumentException ();
// Reparent component, and make sure component is instantiated if
// we are.
if (comp.parent != null)
comp.parent.remove (comp);
comp.parent = this;
if (peer != null)
{
comp.addNotify ();
if (comp.isLightweight())
enableEvents(comp.eventMask);
}
invalidate ();
if (component == null)
component = new Component[4]; // FIXME, better initial size?
// This isn't the most efficient implementation. We could do less
// copying when growing the array. It probably doesn't matter.
if (ncomponents >= component.length)
{
int nl = component.length * 2;
Component[] c = new Component[nl];
System.arraycopy (component, 0, c, 0, ncomponents);
component = c;
}
if (index == -1)
component[ncomponents++] = comp;
else
{
System.arraycopy (component, index, component, index + 1,
ncomponents - index);
component[index] = comp;
++ncomponents;
}
// Notify the layout manager.
if (layoutMgr != null)
{
if (constraints != null && layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
lm2.addLayoutComponent (comp, constraints);
}
else
layoutMgr.addLayoutComponent ((String) constraints, comp);
}
ContainerEvent ce = new ContainerEvent (this,
ContainerEvent.COMPONENT_ADDED,
comp);
dispatchEvent (ce);
}
public void remove (int index)
{
Component r = component[index];
r.removeNotify ();
System.arraycopy (component, index + 1, component, index,
ncomponents - index - 1);
component[--ncomponents] = null;
invalidate ();
if (layoutMgr != null)
layoutMgr.removeLayoutComponent (r);
ContainerEvent ce = new ContainerEvent (this,
ContainerEvent.COMPONENT_REMOVED,
r);
dispatchEvent (ce);
}
public void remove (Component comp)
{
for (int i = 0; i < ncomponents; ++i)
{
if (component[i] == comp)
{
remove (i);
break;
}
}
}
public void removeAll()
{
while (ncomponents > 0)
remove (0);
}
public LayoutManager getLayout()
{
return layoutMgr;
}
public void setLayout(LayoutManager mgr)
{
layoutMgr = mgr;
// FIXME
}
public void doLayout()
{
if (layoutMgr != null)
layoutMgr.layoutContainer (this);
}
/** @deprecated Use doLayout() instead. */
public void layout()
{
doLayout();
}
public void invalidate()
{
super.invalidate ();
}
public void validate()
{
if (! isValid ())
{
validateTree ();
}
}
protected void validateTree()
{
if (valid) return;
ContainerPeer cPeer = null;
if ((peer != null) && !(peer instanceof LightweightPeer))
{
cPeer = (ContainerPeer) peer;
cPeer.beginValidate();
}
doLayout ();
for (int i = 0; i < ncomponents; ++i)
{
Component comp = component[i];
if (comp instanceof Container)
{
((Container) comp).validateTree();
}
else
{
component[i].validate();
}
}
/* children will call invalidate() when they are layed out. It
is therefore imporant that valid is not set to true
before after the children has been layed out. */
valid = true;
if (cPeer != null)
cPeer.endValidate();
}
public void setFont(Font f)
{
super.setFont(f);
// FIXME, should invalidate all children with font == null
}
public Dimension getPreferredSize()
{
if (layoutMgr != null)
return layoutMgr.preferredLayoutSize (this);
else
return super.getPreferredSize ();
}
/** @deprecated Use getPreferredSize() instead */
public Dimension preferredSize()
{
return getPreferredSize();
}
public Dimension getMinimumSize()
{
if (layoutMgr != null)
return layoutMgr.minimumLayoutSize (this);
else
return super.getMinimumSize ();
}
/** @deprecated Use getMinimumSize() instead */
public Dimension minimumSize()
{
return getMinimumSize();
}
public Dimension getMaximumSize()
{
if (layoutMgr != null && layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.maximumLayoutSize (this);
}
else
return super.getMaximumSize ();
}
public float getAlignmentX()
{
if (layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.getLayoutAlignmentX (this);
}
else
return CENTER_ALIGNMENT;
}
public float getAlignmentY()
{
if (layoutMgr instanceof LayoutManager2)
{
LayoutManager2 lm2 = (LayoutManager2) layoutMgr;
return lm2.getLayoutAlignmentY (this);
}
else
return CENTER_ALIGNMENT;
}
public void paint(Graphics g)
{
if (!isShowing())
return;
super.paint(g);
visitChildren(g, GfxPaintVisitor.INSTANCE, true);
}
/**
* Perform a graphics operation on the children of this container.
* For each applicable child, the visitChild() method will be called
* to perform the graphics operation.
*
* @param gfx The graphics object that will be used to derive new
* graphics objects for the children.
*
* @param visitor Object encapsulating the graphics operation that
* should be performed.
*
* @param lightweightOnly If true, only lightweight components will
* be visited.
*/
private void visitChildren(Graphics gfx, GfxVisitor visitor,
boolean lightweightOnly)
{
// FIXME: do locking
for (int i = 0; i < ncomponents; ++i)
{
Component comp = component[i];
boolean applicable = comp.isVisible()
&& (comp.isLightweight() || !lightweightOnly);
if (applicable)
visitChild(gfx, visitor, comp);
}
}
/**
* Perform a graphics operation on a child. A translated and clipped
* graphics object will be created, and the visit() method of the
* visitor will be called to perform the operation.
*
* @param gfx The graphics object that will be used to derive new
* graphics objects for the child.
*
* @param visitor Object encapsulating the graphics operation that
* should be performed.
*
* @param comp The child component that should be visited.
*/
private void visitChild(Graphics gfx, GfxVisitor visitor,
Component comp)
{
Rectangle bounds = comp.getBounds();
Rectangle clip = gfx.getClipBounds().intersection(bounds);
if (clip.isEmpty()) return;
Graphics gfx2 = gfx.create();
gfx2.setClip(clip.x, clip.y, clip.width, clip.height);
gfx2.translate(bounds.x, bounds.y);
visitor.visit(comp, gfx2);
}
public void update(Graphics g)
{
super.update(g);
}
public void print(Graphics g)
{
super.print(g);
visitChildren(g, GfxPrintVisitor.INSTANCE, true);
}
public void paintComponents(Graphics g)
{
super.paint(g);
visitChildren(g, GfxPaintAllVisitor.INSTANCE, true);
}
public void printComponents(Graphics g)
{
super.paint(g);
visitChildren(g, GfxPrintAllVisitor.INSTANCE, true);
}
void dispatchEventImpl(AWTEvent e)
{
if ((e.id <= ContainerEvent.CONTAINER_LAST
&& e.id >= ContainerEvent.CONTAINER_FIRST)
&& (containerListener != null
|| (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0))
processEvent(e);
else super.dispatchEventImpl(e);
}
public void addContainerListener(ContainerListener l)
{
containerListener = AWTEventMulticaster.add (containerListener, l);
}
public void removeContainerListener(ContainerListener l)
{
containerListener = AWTEventMulticaster.remove(containerListener, l);
}
/** @since 1.3 */
public EventListener[] getListeners(Class listenerType)
{
if (listenerType == ContainerListener.class)
return getListenersImpl(listenerType, containerListener);
else return super.getListeners(listenerType);
}
protected void processEvent(AWTEvent e)
{
if (e instanceof ContainerEvent)
processContainerEvent((ContainerEvent) e);
else super.processEvent(e);
}
protected void processContainerEvent(ContainerEvent e)
{
if (containerListener == null)
return;
switch (e.id)
{
case ContainerEvent.COMPONENT_ADDED:
containerListener.componentAdded(e);
break;
case ContainerEvent.COMPONENT_REMOVED:
containerListener.componentRemoved(e);
break;
}
}
/** @deprecated */
public void deliverEvent(Event e)
{
}
public Component getComponentAt (int x, int y)
{
if (! contains (x, y))
return null;
for (int i = 0; i < ncomponents; ++i)
{
// Ignore invisible children...
if (!component[i].isVisible())
continue;
int x2 = x - component[i].x;
int y2 = y - component[i].y;
if (component[i].contains (x2, y2))
return component[i];
}
return this;
}
/** @deprecated Use getComponentAt() instead */
public Component locate(int x, int y)
{
return getComponentAt(x, y);
}
public Component getComponentAt(Point p)
{
return getComponentAt(p.x, p.y);
}
public Component findComponentAt(int x, int y)
{
// FIXME
return null;
}
public Component findComponentAt(Point p)
{
return findComponentAt(p.x, p.y);
}
public void addNotify ()
{
super.addNotify();
}
void addNotifyContainerChildren()
{
for (int i = ncomponents; --i >= 0; )
{
component[i].addNotify();
if (component[i].isLightweight())
enableEvents(component[i].eventMask);
}
}
public void removeNotify()
{
for (int i = 0; i < ncomponents; ++i)
component[i].removeNotify ();
super.removeNotify();
}
public boolean isAncestorOf (Component comp)
{
for (;;)
{
if (comp == null)
return false;
if (comp == this)
return true;
comp = comp.getParent();
}
}
protected String paramString()
{
String param = super.paramString();
if (layoutMgr != null)
param = param + "," + layoutMgr.getClass().getName();
return param;
}
public void list (PrintStream out, int indent)
{
for (int i = 0; i < indent; ++i)
out.print (' ');
out.println (toString ());
for (int i = 0; i < ncomponents; ++i)
component[i].list (out, indent + 2);
}
public void list(PrintWriter out, int indent)
{
for (int i = 0; i < indent; ++i)
out.print (' ');
out.println (toString ());
for (int i = 0; i < ncomponents; ++i)
component[i].list (out, indent + 2);
}
/* The following classes are used in concert with the
visitChildren() method to implement all the graphics operations
that requires traversal of the containment hierarchy. */
abstract static class GfxVisitor
{
public abstract void visit(Component c, Graphics gfx);
}
static class GfxPaintVisitor extends GfxVisitor
{
public void visit(Component c, Graphics gfx) { c.paint(gfx); }
public static final GfxVisitor INSTANCE = new GfxPaintVisitor();
}
static class GfxPrintVisitor extends GfxVisitor
{
public void visit(Component c, Graphics gfx) { c.print(gfx); }
public static final GfxVisitor INSTANCE = new GfxPrintVisitor();
}
static class GfxPaintAllVisitor extends GfxVisitor
{
public void visit(Component c, Graphics gfx) { c.paintAll(gfx); }
public static final GfxVisitor INSTANCE = new GfxPaintAllVisitor();
}
static class GfxPrintAllVisitor extends GfxVisitor
{
public void visit(Component c, Graphics gfx) { c.printAll(gfx); }
public static final GfxVisitor INSTANCE = new GfxPrintAllVisitor();
}
}