package inferno.awt; import java.awt.*; import java.applet.*; import java.awt.event.*; import java.awt.peer.*; import inferno.awt.*; public class iPopupMenuPeer implements PopupMenuPeer,zPopupMenuParent { PopupMenu target; Window child; public void show(Event e) { Object o=e.target; if (o instanceof Component) { Component c=(Component)o; Point pc=c.getLocationOnScreen(); Container p; if (c instanceof Container) p=(Container)c; else p=c.getParent(); if (p!=null) { Window w=null; while (true) { if (p instanceof Frame) { Frame f=(Frame)p; Point pf=f.getLocationOnScreen(); closeChild(child); child=new zPopupMenu(f,this,target,pc.x+e.x-pf.x,pc.y+e.y-pf.y); child.pack(); child.setVisible(true); break; } else if (p instanceof Applet) { Applet a=(Applet)p; break; } p=p.getParent(); if (p==null) break; } } } } public void delItem(int item) { } public void addItem(MenuItem item) { } public void addSeparator() { } public void disable() { } public void enable() { } public void setEnabled(boolean state) { } public void setLabel(String label) { } public void closeChild(Window w) { if (child!=null && child==w) { child.setVisible(false); child.dispose(); child=null; } } public void closeEverything() { closeChild(child); } public iPopupMenuPeer(PopupMenu target) { this.target = target; } public void dispose() { } } class zPopupMenu extends Window implements ComponentListener,zPopupMenuParent{ zPopupMenuDisplay menudisplay; zPopupMenuParent ancestor; int xoffset,yoffset; public zPopupMenu(Frame f,zPopupMenuParent ancestor,Menu menu,int xoffset,int yoffset) { super(f); this.xoffset=xoffset; this.yoffset=yoffset; this.ancestor=ancestor; Point p=f.getLocation(); p.translate(this.xoffset,this.yoffset); setLocation(p); f.addComponentListener(this); this.menudisplay=new zPopupMenuDisplay(menu); add(this.menudisplay,BorderLayout.CENTER); //System.out.println("zPopupMenu Called: " + this); } public void closeChild(Window w) { if (menudisplay!=null) { if (!menudisplay.gotFocus() && ancestor!=null) ancestor.closeChild(this); else menudisplay.closeChild(w); } } public void closeEverything() { if (ancestor!=null) ancestor.closeEverything(); } public boolean gotFocus() { if (menudisplay==null) return false; else return menudisplay.gotFocus(); } public void componentHidden(ComponentEvent e) { } public void componentMoved(ComponentEvent e) { Point p=e.getComponent().getLocation(); p.translate(xoffset,yoffset); setLocation(p); } public void componentResized(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public void dispose() { if (menudisplay!=null) { menudisplay.closeChild(this); } super.dispose(); } } class zPopupMenuDisplay extends Canvas implements MouseListener,MouseMotionListener, FocusListener{ zPopupMenuObject menuObjects[]; zPopupMenuObject selectedMenuObject; zPopupMenu child; int menuObjectCount; Dimension pSize; boolean focus; Menu menu; static Color highlight = SystemColor.controlHighlight; static Color light = SystemColor.controlLtHighlight; static Color medium = SystemColor.controlShadow; static Color dark = SystemColor.controlDkShadow; static final int TickBoxSize=13; static final int TickLabelGap=4; static final int SeparatorHeight=6; public zPopupMenuDisplay(Menu menu) { super(); setMenu(menu); addMouseListener(this); addMouseMotionListener(this); /*addKeyListener(this);*/ addFocusListener(this); } public boolean isFocusTraversable() { return false; } void setMenu(Menu menu) { int maxwidth=0; int yy=4; int xx=4; this.menu=menu; menuObjectCount=menu.getItemCount(); selectedMenuObject=null; if (menuObjectCount==0) menuObjects=null; else { menuObjects=new zPopupMenuObject[menuObjectCount]; boolean submenu=false; for (int i=0;i0,g); else g.fillRect(xx,yy,area.width,area.height); xx+=2; yy+=2; g.setColor(SystemColor.menuText); g.translate(-mode,-mode); if (checked) Misc.drawTick(g,xx,yy,zPopupMenuDisplay.TickBoxSize); g.drawString(s,zPopupMenuDisplay.TickBoxSize+zPopupMenuDisplay.TickLabelGap+xx,yy+fa); if (submenu) drawArrow(g,area.x+area.width-6,area.y+area.height/2); g.translate(+mode,+mode); } else { xx+=2; yy+=2; if (checked) { g.setColor(SystemColor.controlLtHighlight); Misc.drawTick(g,xx+1,yy+1,zPopupMenuDisplay.TickBoxSize); g.setColor(SystemColor.controlShadow); Misc.drawTick(g,xx,yy,zPopupMenuDisplay.TickBoxSize); } Misc.drawDisabledString(s,zPopupMenuDisplay.TickBoxSize+zPopupMenuDisplay.TickLabelGap+xx,yy+fa,g); if (submenu) { g.setColor(SystemColor.controlLtHighlight); drawArrow(g,area.x+area.width-6+1,area.y+area.height/2+1); g.setColor(SystemColor.controlShadow); drawArrow(g,area.x+area.width-6,area.y+area.height/2); } } } } class zPopupMenuSeparator extends zPopupMenuObject { public zPopupMenuSeparator(Rectangle area) { super(area); } public void paint(Graphics g,int mode) { int y=area.y+zPopupMenuDisplay.SeparatorHeight/2-1; g.setColor(zPopupMenuDisplay.medium); g.drawLine(area.x,y,area.x+area.width,y); y+=1; g.setColor(zPopupMenuDisplay.light); g.drawLine(area.x,y,area.x+area.width,y); } } interface zPopupMenuParent { public void closeChild(Window W); public void closeEverything(); }