if (menuObjectCount==0) menuObjects=null; else { menuObjects=new zMenuObject[menuObjectCount]; boolean submenu=false; for (int i=0;i<menuObjectCount;i++) { MenuItem mi=menu.getItem(i); String label=mi.getLabel(); if (!submenu && mi instanceof Menu) submenu=true; if (!label.equals("-")) { Font f=mi.getFont(); FontMetrics fm=getFontMetrics(f); maxwidth=Math.max(maxwidth,TickBoxSize+TickLabelGap+fm.stringWidth(label)); } } maxwidth+=2; // For outside lines if (submenu) maxwidth+=8; for (int i=0;i<menuObjectCount;i++) { MenuItem mi=menu.getItem(i); String label=mi.getLabel(); int h; if (label.equals("-")) { h=SeparatorHeight; // Height menuObjects[i]=new zMenuSeparator(new Rectangle(xx,yy,maxwidth,h)); } else { Font f=mi.getFont(); FontMetrics fm=getFontMetrics(f); h=Math.max(fm.getHeight(),TickBoxSize)+4; //Height menuObjects[i]=new zMenuText(mi,new Rectangle(xx,yy,maxwidth,h)); } yy+=h; } } pSize=new Dimension(xx+maxwidth+4,yy+4); } public Dimension getPreferredSize() { return pSize; } public void paint(Graphics g) { Dimension d=getSize(); g.setColor(SystemColor.menu); Misc.Draw3DArea(0,0,d.width,d.height,g); for (int i=0;i<menuObjectCount;i++) menuObjects[i].paint(g,0); } void closeChild() { closeChild(child); } void closeChild(Window w) { if (w!=null && w == child) { w.setVisible(false); w.dispose(); w=null; } if (child!=null) { child.setVisible(false); child.dispose(); child = null; } } // Required by listener interface but not used public void mouseClicked(MouseEvent e) { } // Required by listener interface but not used public void mouseEntered(MouseEvent e) { } // Required by listener interface but not used public void mouseExited(MouseEvent e) { } // Required by listener interface but not used public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { if (selectedMenuObject!=null && selectedMenuObject instanceof zMenuText) { MenuItem menuItem=((zMenuText)selectedMenuObject).item; if (menuItem.isEnabled() && !(menuItem instanceof Menu)) { String actionCommand=menuItem.getActionCommand(); iToolkit.postEvent(new ActionEvent(menuItem, ActionEvent.ACTION_PERFORMED, actionCommand)); zMenuWindow w=(zMenuWindow)getParent(); Frame f=(Frame)w.getParent(); f.requestFocus(); w.closeEverything(); } } } public void mouseMoved(MouseEvent e) { if (!focus) { focus=true; requestFocus(); } if (selectedMenuObject==null || !selectedMenuObject.area.contains(e.getPoint())) { Graphics g=getGraphics(); if (selectedMenuObject!=null) { selectedMenuObject.paint(g,0); selectedMenuObject=null; closeChild(child); } for (int i=0;i<menuObjectCount;i++) if (menuObjects[i].area.contains(e.getPoint())) { int mode=1; selectedMenuObject=menuObjects[i]; if (selectedMenuObject instanceof zMenuText) { zMenuText mo=(zMenuText)selectedMenuObject; if (mo.item.isEnabled()) { zMenuWindow w=(zMenuWindow)getParent(); Frame f=(Frame)w.getParent(); if (mo.item instanceof Menu) { int xx=w.xoffset+mo.area.x+mo.area.width; int yy=w.yoffset+mo.area.y; Menu menu=(Menu)mo.item; mode=-1; zMenuWindow newChild=new zMenuWindow(f,w,menu,xx,yy); newChild.pack(); newChild.setVisible(true); closeChild(child); child=newChild; } } selectedMenuObject.paint(g,mode); } break; } g.dispose(); } } public void mouseDragged(MouseEvent e) { mouseMoved(e); } public boolean gotFocus() { if (focus) return true; else if (child==null) return false; else return child.gotFocus(); } public void focusLost(FocusEvent e) { focus=false; if (!gotFocus()) { zMenuWindow m=(zMenuWindow)getParent(); if (m.ancestor!=null) m.ancestor.closeChild(m); } } public void focusGained(FocusEvent e) { focus=true; } } // base class for the menuObjects abstract class zMenuObject { Rectangle area; public zMenuObject() { } public zMenuObject(Rectangle area) { this.area=area; } public abstract void paint(Graphics g,int mode); } // Standard item item class class zMenuText extends zMenuObject { MenuItem item; public zMenuText(MenuItem item,Rectangle area){ super(area); this.item=item;} void drawArrow(Graphics g,int x,int y){ for (int i=0;i<4;i++) { g.drawLine(x,y+i,x+3-i,y+i); if (i!=0) g.drawLine(x,y-i,x+3-i,y-i); }} public void paint(Graphics g,int mode){ Font f=item.getFont(); FontMetrics fm=g.getFontMetrics(f); int fa=fm.getAscent(); boolean enabled=item.isEnabled(); boolean submenu=item instanceof Menu; boolean checked=(item instanceof CheckboxMenuItem? ((CheckboxMenuItem)item).getState():false); String s=item.getLabel(); int xx=area.x; int yy=area.y; g.setFont(f); if (enabled) { g.setColor(SystemColor.menu); if (mode!=0) Misc.fill3DRect(area,mode>0,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,zMenuDisplay.TickBoxSize); g.drawString(s,zMenuDisplay.TickBoxSize+zMenuDisplay.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,zMenuDisplay.TickBoxSize); g.setColor(SystemColor.controlShadow); Misc.drawTick(g,xx,yy,zMenuDisplay.TickBoxSize); } Misc.drawDisabledString(s,zMenuDisplay.TickBoxSize+zMenuDisplay.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); } } } } // separator bar class zMenuSeparator extends zMenuObject { public zMenuSeparator(Rectangle area){ super(area);} public void paint(Graphics g,int mode){ int y=area.y+zMenuDisplay.SeparatorHeight/2-1; g.setColor(zMenuDisplay.medium); g.drawLine(area.x,y,area.x+area.width,y); y+=1; g.setColor(zMenuDisplay.light); g.drawLine(area.x,y,area.x+area.width,y); } } // The interface to look backwards to parent to close ourselves interface zMenuParent { // Called by child (or parent) to close and delete itself public void closeChild(Window W); // Close all the windows back to the menubar public void closeEverything(); } Lines 501–906 of 906. Previous lines
if (menuObjectCount==0) menuObjects=null; else { menuObjects=new zMenuObject[menuObjectCount]; boolean submenu=false; for (int i=0;i<menuObjectCount;i++) { MenuItem mi=menu.getItem(i); String label=mi.getLabel(); if (!submenu && mi instanceof Menu) submenu=true; if (!label.equals("-")) { Font f=mi.getFont(); FontMetrics fm=getFontMetrics(f); maxwidth=Math.max(maxwidth,TickBoxSize+TickLabelGap+fm.stringWidth(label)); } } maxwidth+=2; // For outside lines if (submenu) maxwidth+=8; for (int i=0;i<menuObjectCount;i++) { MenuItem mi=menu.getItem(i); String label=mi.getLabel(); int h; if (label.equals("-")) { h=SeparatorHeight; // Height menuObjects[i]=new zMenuSeparator(new Rectangle(xx,yy,maxwidth,h)); } else { Font f=mi.getFont(); FontMetrics fm=getFontMetrics(f); h=Math.max(fm.getHeight(),TickBoxSize)+4; //Height menuObjects[i]=new zMenuText(mi,new Rectangle(xx,yy,maxwidth,h)); } yy+=h; } } pSize=new Dimension(xx+maxwidth+4,yy+4); } public Dimension getPreferredSize() { return pSize; } public void paint(Graphics g) { Dimension d=getSize(); g.setColor(SystemColor.menu); Misc.Draw3DArea(0,0,d.width,d.height,g); for (int i=0;i<menuObjectCount;i++) menuObjects[i].paint(g,0); } void closeChild() { closeChild(child); } void closeChild(Window w) { if (w!=null && w == child) { w.setVisible(false); w.dispose(); w=null; } if (child!=null) { child.setVisible(false); child.dispose(); child = null; } } // Required by listener interface but not used public void mouseClicked(MouseEvent e) { } // Required by listener interface but not used public void mouseEntered(MouseEvent e) { } // Required by listener interface but not used public void mouseExited(MouseEvent e) { } // Required by listener interface but not used public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { if (selectedMenuObject!=null && selectedMenuObject instanceof zMenuText) { MenuItem menuItem=((zMenuText)selectedMenuObject).item; if (menuItem.isEnabled() && !(menuItem instanceof Menu)) { String actionCommand=menuItem.getActionCommand(); iToolkit.postEvent(new ActionEvent(menuItem, ActionEvent.ACTION_PERFORMED, actionCommand)); zMenuWindow w=(zMenuWindow)getParent(); Frame f=(Frame)w.getParent(); f.requestFocus(); w.closeEverything(); } } } public void mouseMoved(MouseEvent e) { if (!focus) { focus=true; requestFocus(); } if (selectedMenuObject==null || !selectedMenuObject.area.contains(e.getPoint())) { Graphics g=getGraphics(); if (selectedMenuObject!=null) { selectedMenuObject.paint(g,0); selectedMenuObject=null; closeChild(child); } for (int i=0;i<menuObjectCount;i++) if (menuObjects[i].area.contains(e.getPoint())) { int mode=1; selectedMenuObject=menuObjects[i]; if (selectedMenuObject instanceof zMenuText) { zMenuText mo=(zMenuText)selectedMenuObject; if (mo.item.isEnabled()) { zMenuWindow w=(zMenuWindow)getParent(); Frame f=(Frame)w.getParent(); if (mo.item instanceof Menu) { int xx=w.xoffset+mo.area.x+mo.area.width; int yy=w.yoffset+mo.area.y; Menu menu=(Menu)mo.item; mode=-1; zMenuWindow newChild=new zMenuWindow(f,w,menu,xx,yy); newChild.pack(); newChild.setVisible(true); closeChild(child); child=newChild; } } selectedMenuObject.paint(g,mode); } break; } g.dispose(); } } public void mouseDragged(MouseEvent e) { mouseMoved(e); } public boolean gotFocus() { if (focus) return true; else if (child==null) return false; else return child.gotFocus(); } public void focusLost(FocusEvent e) { focus=false; if (!gotFocus()) { zMenuWindow m=(zMenuWindow)getParent(); if (m.ancestor!=null) m.ancestor.closeChild(m); } } public void focusGained(FocusEvent e) { focus=true; } } // base class for the menuObjects abstract class zMenuObject { Rectangle area; public zMenuObject() { } public zMenuObject(Rectangle area) { this.area=area; } public abstract void paint(Graphics g,int mode); } // Standard item item class class zMenuText extends zMenuObject { MenuItem item; public zMenuText(MenuItem item,Rectangle area) { super(area); this.item=item; } void drawArrow(Graphics g,int x,int y) { for (int i=0;i<4;i++) { g.drawLine(x,y+i,x+3-i,y+i); if (i!=0) g.drawLine(x,y-i,x+3-i,y-i); } } public void paint(Graphics g,int mode) { Font f=item.getFont(); FontMetrics fm=g.getFontMetrics(f); int fa=fm.getAscent(); boolean enabled=item.isEnabled(); boolean submenu=item instanceof Menu; boolean checked=(item instanceof CheckboxMenuItem? ((CheckboxMenuItem)item).getState():false); String s=item.getLabel(); int xx=area.x; int yy=area.y; g.setFont(f); if (enabled) { g.setColor(SystemColor.menu); if (mode!=0) Misc.fill3DRect(area,mode>0,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,zMenuDisplay.TickBoxSize); g.drawString(s,zMenuDisplay.TickBoxSize+zMenuDisplay.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,zMenuDisplay.TickBoxSize); g.setColor(SystemColor.controlShadow); Misc.drawTick(g,xx,yy,zMenuDisplay.TickBoxSize); } Misc.drawDisabledString(s,zMenuDisplay.TickBoxSize+zMenuDisplay.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); } } } } // separator bar class zMenuSeparator extends zMenuObject { public zMenuSeparator(Rectangle area) { super(area); } public void paint(Graphics g,int mode) { int y=area.y+zMenuDisplay.SeparatorHeight/2-1; g.setColor(zMenuDisplay.medium); g.drawLine(area.x,y,area.x+area.width,y); y+=1; g.setColor(zMenuDisplay.light); g.drawLine(area.x,y,area.x+area.width,y); } } // The interface to look backwards to parent to close ourselves interface zMenuParent { // Called by child (or parent) to close and delete itself public void closeChild(Window W); // Close all the windows back to the menubar public void closeEverything(); }