MenuItem.java (paramString): Now protected.
* java/awt/MenuItem.java (paramString): Now protected. * java/awt/MenuShortcut.java: Implements Serializable. * java/awt/MenuBar.java: Rewrote from scratch. * java/awt/MenuComponent.java (removeNotify): Wrote. Implements Serializable. * java/awt/GridBagConstraints.java (GridBagConstraints): New constructor. * java/awt/CheckboxMenuItem.java: Wrote. From-SVN: r38488
This commit is contained in:
parent
5472d1951a
commit
b3b90f82f4
6 changed files with 428 additions and 30 deletions
|
@ -1,3 +1,19 @@
|
|||
2000-12-26 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* java/awt/MenuItem.java (paramString): Now protected.
|
||||
|
||||
* java/awt/MenuShortcut.java: Implements Serializable.
|
||||
|
||||
* java/awt/MenuBar.java: Rewrote from scratch.
|
||||
|
||||
* java/awt/MenuComponent.java (removeNotify): Wrote.
|
||||
Implements Serializable.
|
||||
|
||||
* java/awt/GridBagConstraints.java (GridBagConstraints): New
|
||||
constructor.
|
||||
|
||||
* java/awt/CheckboxMenuItem.java: Wrote.
|
||||
|
||||
2000-12-25 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* java/awt/MenuContainer.java: Fixed typo.
|
||||
|
|
|
@ -7,9 +7,127 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|||
details. */
|
||||
|
||||
package java.awt;
|
||||
import java.awt.peer.CheckboxMenuItemPeer;
|
||||
import java.awt.event.ItemListener;
|
||||
import java.awt.event.ItemEvent;
|
||||
|
||||
/* A very incomplete placeholder. */
|
||||
|
||||
public class CheckboxMenuItem extends MenuItem
|
||||
/** This implements a menu item which keeps track of a boolean state.
|
||||
* @author Tom Tromey <tromey@redhat.com>
|
||||
* @date December 25, 2000
|
||||
*/
|
||||
public class CheckboxMenuItem extends MenuItem implements ItemSelectable
|
||||
{
|
||||
/** Create a new CheckboxMenuItem.
|
||||
* @param label The checkbox label. A null value is the same as "";
|
||||
* null is the default.
|
||||
* @param state The initial check state; defaults to false.
|
||||
*/
|
||||
public CheckboxMenuItem ()
|
||||
{
|
||||
this (null, false);
|
||||
}
|
||||
|
||||
public CheckboxMenuItem (String label)
|
||||
{
|
||||
this (label, false);
|
||||
}
|
||||
|
||||
public CheckboxMenuItem (String label, boolean state)
|
||||
{
|
||||
this.label = label;
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
/** Add a listener for item events.
|
||||
* @param listener The listener to add.
|
||||
*/
|
||||
public synchronized void addItemListener (ItemListener listener)
|
||||
{
|
||||
listeners = AWTEventMulticaster.add (listeners, listener);
|
||||
}
|
||||
|
||||
/** This creates the component's peer. */
|
||||
public void addNotify ()
|
||||
{
|
||||
if (peer != null)
|
||||
{
|
||||
// This choice of toolkit seems unsatisfying, but I'm not sure
|
||||
// what else to do.
|
||||
peer = Toolkit.getDefaultToolkit ().createCheckboxMenuItem (this);
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns this checkbox's label if this checkbox is selected. */
|
||||
public Object[] getSelectedObjects ()
|
||||
{
|
||||
Object[] r;
|
||||
if (state)
|
||||
{
|
||||
r = new Object[1];
|
||||
r[0] = label;
|
||||
}
|
||||
else
|
||||
r = new Object[0];
|
||||
return r;
|
||||
}
|
||||
|
||||
/** Returns the current state of this checkbox. */
|
||||
public boolean getState ()
|
||||
{
|
||||
return state;
|
||||
}
|
||||
|
||||
/** Generates a String representation of this Checkbox's state. */
|
||||
public String paramString ()
|
||||
{
|
||||
return ("[" + getClass ().getName ()
|
||||
+ "state=" + state + ","
|
||||
+ "label=" + label + "]");
|
||||
}
|
||||
|
||||
/** Process an event for this Checkbox.
|
||||
* @param event The event the process.
|
||||
*/
|
||||
protected void processEvent (AWTEvent event)
|
||||
{
|
||||
if (event instanceof ItemEvent)
|
||||
processItemEvent ((ItemEvent) event);
|
||||
else
|
||||
super.processEvent (event);
|
||||
}
|
||||
|
||||
/** Process an item event for this Checkbox.
|
||||
* @param event The ItemEvent to process
|
||||
*/
|
||||
protected void processItemEvent (ItemEvent event)
|
||||
{
|
||||
if (listeners != null)
|
||||
listeners.itemStateChanged (event);
|
||||
}
|
||||
|
||||
/** Remove an item listener.
|
||||
* @param listener Item listener to remove.
|
||||
*/
|
||||
public synchronized void removeItemListener (ItemListener listener)
|
||||
{
|
||||
listeners = AWTEventMulticaster.remove (listeners, listener);
|
||||
}
|
||||
|
||||
/** Set the checkbox's state.
|
||||
* @param state The new state.
|
||||
*/
|
||||
public void setState (boolean state)
|
||||
{
|
||||
this.state = state;
|
||||
if (peer != null)
|
||||
{
|
||||
CheckboxMenuItemPeer cp = (CheckboxMenuItemPeer) peer;
|
||||
cp.setState (state);
|
||||
}
|
||||
}
|
||||
|
||||
// Private state.
|
||||
String label;
|
||||
boolean state;
|
||||
ItemListener listeners;
|
||||
}
|
||||
|
|
|
@ -86,4 +86,25 @@ public class GridBagConstraints implements Cloneable, Serializable
|
|||
this.weightx = 0;
|
||||
this.weighty = 0;
|
||||
}
|
||||
|
||||
/** Create a new GridBagConstraints object with the indicated
|
||||
* parameters. */
|
||||
public GridBagConstraints (int gridx, int gridy,
|
||||
int gridwidth, int gridheight,
|
||||
double weightx, double weighty,
|
||||
int anchor, int fill,
|
||||
Insets insets, int ipadx, int ipady)
|
||||
{
|
||||
this.anchor = anchor;
|
||||
this.fill = fill;
|
||||
this.gridx = gridx;
|
||||
this.gridy = gridy;
|
||||
this.gridwidth = gridwidth;
|
||||
this.gridheight = gridheight;
|
||||
this.ipadx = ipadx;
|
||||
this.ipady = ipady;
|
||||
this.insets = insets;
|
||||
this.weightx = weightx;
|
||||
this.weighty = weighty;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,40 +8,281 @@ details. */
|
|||
|
||||
package java.awt;
|
||||
|
||||
/* A very incomplete placeholder. */
|
||||
import java.awt.peer.MenuBarPeer;
|
||||
import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public class MenuBar extends MenuComponent implements MenuContainer
|
||||
/** This class implements a MenuBar, such as might appear across the
|
||||
* top of a window.
|
||||
* @author Tom Tromey <tromey@redhat.com>
|
||||
* @date December 25, 2000
|
||||
*/
|
||||
public class MenuBar extends MenuComponent implements MenuContainer
|
||||
{
|
||||
Menu[] menus;
|
||||
int count;
|
||||
|
||||
public synchronized Menu add (Menu m)
|
||||
/** Create a new MenuBar. */
|
||||
public MenuBar ()
|
||||
{
|
||||
if (menus == null)
|
||||
menus = new Menu[1];
|
||||
else if (count == menus.length)
|
||||
{
|
||||
Menu[] newMenus = new Menu[2 * count];
|
||||
System.arraycopy(menus, 0, newMenus, 0, count);
|
||||
}
|
||||
menus[count++] = m;
|
||||
return m;
|
||||
menus = new Vector ();
|
||||
}
|
||||
|
||||
public void remove (MenuComponent comp)
|
||||
/** Add a menu to this MenuBar. If the menu has already has a
|
||||
* parent, it is first removed from its old parent before being
|
||||
* added.
|
||||
* @param menu The menu to add.
|
||||
* @returns menu
|
||||
*/
|
||||
public synchronized Menu add (Menu menu)
|
||||
{
|
||||
for (int i = count; --i >= 0; )
|
||||
if (menu.parent != null)
|
||||
menu.parent.remove (menu);
|
||||
|
||||
menu.parent = this;
|
||||
menus.add (menu);
|
||||
|
||||
if (peer != null)
|
||||
{
|
||||
if (menus[i] == comp)
|
||||
MenuBarPeer mp = (MenuBarPeer) peer;
|
||||
mp.add (menu);
|
||||
}
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
/** This creates the component's peer. */
|
||||
public void addNotify ()
|
||||
{
|
||||
if (peer != null)
|
||||
{
|
||||
// This choice of toolkit seems unsatisfying, but I'm not sure
|
||||
// what else to do.
|
||||
peer = Toolkit.getDefaultToolkit ().createMenuBar (this);
|
||||
}
|
||||
}
|
||||
|
||||
/** @deprecated Use getMenuCount() instead. */
|
||||
public int countMenus ()
|
||||
{
|
||||
return getMenuCount ();
|
||||
}
|
||||
|
||||
/** Delete a keyboard shortcut.
|
||||
* @param shortcut The short cut which should be deleted from all
|
||||
* menus on this MenuBar.
|
||||
*/
|
||||
public void deleteShortcut (MenuShortcut shortcut)
|
||||
{
|
||||
MenuItem it;
|
||||
// This is a slow implementation, but it probably doesn't matter.
|
||||
while ((it = getShortcutMenuItem (shortcut)) != null)
|
||||
it.deleteShortcut ();
|
||||
}
|
||||
|
||||
/** Returns the current Help menu. */
|
||||
public Menu getHelpMenu ()
|
||||
{
|
||||
return help_menu;
|
||||
}
|
||||
|
||||
/** Returns a menu from this object.
|
||||
* @param index Index of menu to return.
|
||||
*/
|
||||
public Menu getMenu (int index)
|
||||
{
|
||||
return (Menu) menus.get (index);
|
||||
}
|
||||
|
||||
/** Returns the number of menus on this MenuBar. */
|
||||
public int getMenuCount ()
|
||||
{
|
||||
return menus.size ();
|
||||
}
|
||||
|
||||
/** Returns the menu item on this MenuBar with the specified
|
||||
* shortcut.
|
||||
* @param shortcut Shortcut to look for
|
||||
*/
|
||||
public MenuItem getShortcutMenuItem (MenuShortcut shortcut)
|
||||
{
|
||||
Enumeration m = new MenuEnumeration (this);
|
||||
while (m.hasMoreElements ())
|
||||
{
|
||||
MenuItem item = (MenuItem) m.nextElement ();
|
||||
if (item.getShortcut () == shortcut)
|
||||
return item;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Remove a menu from the menu bar. If the menu is specified by
|
||||
* component (and not index), and does not exist on the menu, then
|
||||
* the method does nothing. If the removed menu has a peer, it is
|
||||
* destroyed.
|
||||
* @param menu The menu to remove
|
||||
* @param index The index of the menu to remove
|
||||
*/
|
||||
public synchronized void remove (MenuComponent menu)
|
||||
{
|
||||
int s = menus.size ();
|
||||
for (int i = 0; i < s; ++i)
|
||||
{
|
||||
if (menus.get (i) == menu)
|
||||
{
|
||||
System.arraycopy(menus, i, menus, i+1, count-i-1);
|
||||
count--;
|
||||
// FIXME: destroy peer
|
||||
return;
|
||||
remove (i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Font getFont() { return null; } // FIXME
|
||||
public boolean postEvent(Event evt) { return false; } // FIXME
|
||||
public synchronized void remove (int index)
|
||||
{
|
||||
Menu m = (Menu) menus.get (index);
|
||||
menus.remove (index);
|
||||
m.removeNotify ();
|
||||
m.parent = null;
|
||||
|
||||
if (peer != null)
|
||||
{
|
||||
MenuBarPeer mp = (MenuBarPeer) peer;
|
||||
mp.remove (index);
|
||||
}
|
||||
}
|
||||
|
||||
/** Set the Help menu for this MenuBar. If a Help menu already
|
||||
* exists, it is first removed.
|
||||
* @param menu The new Help menu.
|
||||
*/
|
||||
public synchronized void setHelpMenu (Menu menu)
|
||||
{
|
||||
if (help_menu != null)
|
||||
{
|
||||
help_menu.removeNotify ();
|
||||
help_menu.parent = null;
|
||||
}
|
||||
|
||||
if (menu.parent != null)
|
||||
menu.parent.remove (menu);
|
||||
if (menu.parent != null)
|
||||
menu.parent.remove (menu);
|
||||
menu.parent = this;
|
||||
|
||||
if (peer != null)
|
||||
{
|
||||
MenuBarPeer mp = (MenuBarPeer) peer;
|
||||
mp.addHelpMenu (menu);
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns an Enumeration which lists the keyboard shortcuts
|
||||
* associated with menu items on this MenuBar.
|
||||
*/
|
||||
public synchronized Enumeration shortcuts ()
|
||||
{
|
||||
return new ShortcutEnumeration (new MenuEnumeration (this));
|
||||
}
|
||||
|
||||
// Iterate over the items of a menu.
|
||||
private static class MenuEnumeration implements Enumeration
|
||||
{
|
||||
// Enumerate over the menu's items.
|
||||
Enumeration main;
|
||||
// Enumerate over a submenu.
|
||||
Enumeration sub;
|
||||
// Menubar so we can keep track of help menu too.
|
||||
MenuBar menubar;
|
||||
|
||||
MenuEnumeration (Menu m)
|
||||
{
|
||||
sub = null;
|
||||
menubar = null;
|
||||
main = m.items.elements ();
|
||||
}
|
||||
|
||||
MenuEnumeration (MenuBar mb)
|
||||
{
|
||||
sub = null;
|
||||
menubar = mb;
|
||||
main = mb.menus.elements ();
|
||||
}
|
||||
|
||||
public boolean hasMoreElements ()
|
||||
{
|
||||
boolean r = false;
|
||||
if (sub != null)
|
||||
r = sub.hasMoreElements ();
|
||||
if (! r)
|
||||
r = main.hasMoreElements ();
|
||||
if (! r && menubar != null)
|
||||
{
|
||||
if (menubar.help_menu != null)
|
||||
{
|
||||
main = new MenuEnumeration (menubar.help_menu);
|
||||
r = main.hasMoreElements ();
|
||||
}
|
||||
menubar = null;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
public Object nextElement () throws NoSuchElementException
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
if (! sub.hasMoreElements ())
|
||||
sub = null;
|
||||
else
|
||||
return sub.nextElement ();
|
||||
|
||||
if (! main.hasMoreElements () && menubar != null
|
||||
&& menubar.help_menu != null)
|
||||
{
|
||||
main = new MenuEnumeration (menubar.help_menu);
|
||||
menubar = null;
|
||||
}
|
||||
|
||||
Object r = main.nextElement ();
|
||||
if (r instanceof Menu)
|
||||
{
|
||||
sub = new MenuEnumeration ((Menu) r);
|
||||
continue;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is an enumeration that shadows another enumeration and
|
||||
// returns the shortcut for each item returned. I wonder if we're
|
||||
// only supposed to return unique shortcuts? If so then we could
|
||||
// keep a hash table here and remove duplicates.
|
||||
private static class ShortcutEnumeration implements Enumeration
|
||||
{
|
||||
Enumeration back;
|
||||
|
||||
ShortcutEnumeration (Enumeration back)
|
||||
{
|
||||
this.back = back;
|
||||
}
|
||||
|
||||
public boolean hasMoreElements ()
|
||||
{
|
||||
return back.hasMoreElements ();
|
||||
}
|
||||
|
||||
public Object nextElement () throws NoSuchElementException
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
MenuItem item = (MenuItem) back.nextElement ();
|
||||
if (item.getShortcut () != null)
|
||||
return item.getShortcut ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We use Vector because it makes enumerating easier than ArrayList
|
||||
// in this case.
|
||||
Vector menus;
|
||||
Menu help_menu;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ package java.awt;
|
|||
|
||||
/* Status: partially complete, untested. */
|
||||
|
||||
public abstract class MenuComponent
|
||||
public abstract class MenuComponent implements java.io.Serializable
|
||||
{
|
||||
// Fields from the serialization spec. Decalare others "transient".
|
||||
Font font;
|
||||
|
@ -71,7 +71,9 @@ public abstract class MenuComponent
|
|||
|
||||
public void removeNotify()
|
||||
{
|
||||
// FIXME
|
||||
if (peer != null)
|
||||
peer.dispose ();
|
||||
peer = null;
|
||||
}
|
||||
|
||||
/** @deprecated Replaced by dispatchEvent(AWTEvent) */
|
||||
|
|
|
@ -12,7 +12,7 @@ import java.awt.event.KeyEvent;
|
|||
|
||||
/* Status: Complete, except for hashCode(). Untested. */
|
||||
|
||||
public class MenuShortcut
|
||||
public class MenuShortcut implements java.io.Serializable
|
||||
{
|
||||
// Fields from the serialization spec. Decalare others "transient".
|
||||
int key;
|
||||
|
|
Loading…
Add table
Reference in a new issue