Index: src/gnu/gcjwebplugin/PluginAppletWindow.java
===================================================================
RCS file: /sources/gcjwebplugin/gcjwebplugin/src/gnu/gcjwebplugin/PluginAppletWindow.java,v
retrieving revision 1.22
diff -u -r1.22 PluginAppletWindow.java
--- src/gnu/gcjwebplugin/PluginAppletWindow.java 5 Apr 2006 19:45:45 -0000 1.22
+++ src/gnu/gcjwebplugin/PluginAppletWindow.java 6 Apr 2006 22:18:07 -0000
@@ -24,11 +24,19 @@
import java.applet.Applet;
import java.applet.AppletContext;
-import java.awt.AWTEvent;
-import java.awt.BorderLayout;
-import java.awt.Component;
import java.awt.Dimension;
-import java.awt.Toolkit;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.ContainerEvent;
+import java.awt.event.ContainerListener;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.InputMethodEvent;
+import java.awt.event.InputMethodListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;
@@ -39,8 +47,18 @@
import javax.swing.JOptionPane;
-class PluginAppletWindow extends EmbeddedWindow
+class PluginAppletWindow
+ extends EmbeddedWindow
+ implements ContainerListener, ComponentListener, MouseListener,
+ MouseMotionListener, InputMethodListener, HierarchyListener,
+ HierarchyBoundsListener
{
+
+ // This class implements various listeners because the author of an applet
+ // may attach listeners to it, unaware of the applet's parent (this class).
+ // So, we must pass all listener events on this plugin applet window to the
+ // actual applet.
+
private static HashMap contexts = new HashMap();
private Applet applet;
private AppletTag tag;
@@ -49,8 +67,318 @@
PluginAppletWindow()
{
super();
+ addContainerListener(this);
+ addComponentListener(this);
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ addInputMethodListener(this);
+ addHierarchyListener(this);
+ addHierarchyBoundsListener(this);
+ }
+
+ ///////////////////////////////////
+ /// ContainerListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when a component is added to the container.
+ *
+ * @param event the ContainerEvent
indicating component
+ * addition
+ */
+ public void componentAdded(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentAdded(event);
+ }
+ }
+
+ /**
+ * This method is called when a component is removed from the container.
+ *
+ * @param event the ContainerEvent
indicating component removal
+ */
+ public void componentRemoved(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentRemoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// ComponentListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the component is resized.
+ *
+ * @param event the ComponentEvent
indicating the resize
+ */
+ public void componentResized(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentResized(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is moved.
+ *
+ * @param event the ComponentEvent
indicating the move
+ */
+ public void componentMoved(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentMoved(event);
+ }
}
+ /**
+ * This method is called when the component is made visible.
+ *
+ * @param event the ComponentEvent
indicating the visibility
+ */
+ public void componentShown(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentShown(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is hidden.
+ *
+ * @param event the ComponentEvent
indicating the visibility
+ */
+ public void componentHidden(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentHidden(event);
+ }
+ }
+
+ ///////////////////////////////////
+ ////// MouseListener Methods //////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is clicked (pressed and released
+ * in short succession) on a component.
+ *
+ * @param event the MouseEvent
indicating the click
+ */
+ public void mouseClicked(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseClicked(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is pressed over a component.
+ *
+ * @param event the MouseEvent
for the press
+ */
+ public void mousePressed(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mousePressed(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is released over a component.
+ *
+ * @param event the MouseEvent
for the release
+ */
+ public void mouseReleased(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseReleased(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse enters a component.
+ *
+ * @param event the MouseEvent
for the entry
+ */
+ public void mouseEntered(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseEntered(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse exits a component.
+ *
+ * @param event the MouseEvent
for the exit
+ */
+ public void mouseExited(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseExited(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// MouseMotionListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while a button has been pressed.
+ *
+ * @param event the MouseEvent
indicating the motion
+ */
+ public void mouseDragged(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseDragged(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while no button is pressed.
+ *
+ * @param event the MouseEvent
indicating the motion
+ */
+ public void mouseMoved(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseMoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// InputMethodListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the text is changed.
+ *
+ * @param event the InputMethodEvent
indicating the text change
+ */
+ public void inputMethodTextChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].inputMethodTextChanged(event);
+ }
+ }
+
+ /**
+ * This method is called when the cursor position within the text is changed.
+ *
+ * @param event the InputMethodEvent
indicating the change
+ */
+ public void caretPositionChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].caretPositionChanged(event);
+ }
+ }
+
+ ///////////////////////////////////
+ //// HierarchyListener Methods ////
+ ///////////////////////////////////
+
+ /**
+ * Called when the hierarchy of this component changes. Use
+ * getChangeFlags()
on the event to see what exactly changed.
+ *
+ * @param e the event describing the change
+ */
+ public void hierarchyChanged(HierarchyEvent event)
+ {
+ if (applet != null)
+ {
+ HierarchyListener[] l = applet.getHierarchyListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].hierarchyChanged(event);
+ }
+ }
+
+ /////////////////////////////////////////
+ //// HierarchyBoundsListener Methods ////
+ /////////////////////////////////////////
+
+ /**
+ * Called when an ancestor component of the source is moved.
+ *
+ * @param e the event describing the ancestor's motion
+ */
+ public void ancestorMoved(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorMoved(e);
+ }
+ }
+
+ /**
+ * Called when an ancestor component is resized.
+ *
+ * @param e the event describing the ancestor's resizing
+ */
+ public void ancestorResized(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorResized(e);
+ }
+ }
+
void setTag(String tag, String documentbase, String encoding)
throws MalformedURLException, IOException
{
@@ -74,7 +402,6 @@
{
super.setHandle(handle);
addNotify();
- setLayout(new BorderLayout());
applet = AppletViewer.createApplet(tag);
@@ -87,8 +414,8 @@
return;
isActive = true;
- add(applet, BorderLayout.CENTER);
-
+ add(applet);
+
AppletContext context = (AppletContext) contexts.get(tag.codebase);
((PluginAppletContext) context).addApplet(applet);