//MaestroG.java
/* A Java class for
 * LossyWide.java
 * Electromagnetic Transmission Line Applet
 * Applet without Smith Chart - Prepared by Umberto Ravaioli 
 * for 6th edition of Fundamentals of Applied Electromagnetics Book
 * May 2009 - All Rights Reserved
 */ 
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.net.*;
import java.awt.event.*;
import java.lang.*;


public class MaestroG{
    public static boolean useBiggerFont = false;
    public static Font serifFont, sanSerifFont, symbolFont, italicFont;
    MaestroG(){}
   
    //tipo=1 arrow up
    //
    public static final void drawArrow(int x, int y, int tipo, Graphics g){
	 Graphics2D g2d = (Graphics2D)g;
         switch (tipo){
	   case 1://ArrowUp
	  	g.drawLine(x,y,x,y-8);
		g.drawLine(x-3,y-2,x+3,y-2);
		g.drawLine(x-2,y-3,x+2,y-3);
		g.drawLine(x-2,y-4,x+2,y-4);
		g.drawLine(x-1,y-5,x+1,y-5);
		g.drawLine(x-1,y-6,x+1,y-6);
	   break;
	   case 2://Down
		g.drawLine(x,y,x,y+8);
		g.drawLine(x-1,y+6,x+1,y+6);
		g.drawLine(x-1,y+5,x+1,y+5);
		g.drawLine(x-2,y+4,x+2,y+4);
		g.drawLine(x-2,y+3,x+2,y+3);
		g.drawLine(x-3,y+2,x+3,y+2);
	   break;
	   case 3://ArrowRight
		g.drawLine(x,y,x+8,y);
		g.drawLine(x+6,y-1,x+6,y+1);
		g.drawLine(x+5,y-1,x+5,y+1);
		g.drawLine(x+4,y-2,x+4,y+2);
		g.drawLine(x+3,y-2,x+3,y+2);
		g.drawLine(x+2,y-3,x+2,y+3);
	   break;
	   case 4://ArrowLeft
		g.drawLine(x,y,x-8,y);
		g.drawLine(x-2,y-3,x-2,y+3);
		g.drawLine(x-3,y-2,x-3,y+2);
		g.drawLine(x-4,y-2,x-4,y+2);
		g.drawLine(x-5,y-1,x-5,y+1);
		g.drawLine(x-6,y-1,x-6,y+1); 
	  break;
          
          case 5://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x,y-8);
		//draw oblique arrow head
		Polygon pH = new Polygon();
		pH.addPoint(x-2, y-2);
		pH.addPoint(x+2, y-2);
		pH.addPoint(x,y-8);
		g.drawPolygon(pH);
		g.fillPolygon(pH);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 6://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x,y+8);
		//draw oblique arrow head
		Polygon pJ = new Polygon();
		pJ.addPoint(x-2, y+2);
		pJ.addPoint(x+2, y+2);
		pJ.addPoint(x,y+8);
		g.drawPolygon(pJ);
		g.fillPolygon(pJ);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
           
           case 7://ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x+8,y);
		//draw oblique arrow head
		Polygon pK = new Polygon();
		pK.addPoint(x+2, y-2);
		pK.addPoint(x+2, y+2);
		pK.addPoint(x+8,y);
		g.drawPolygon(pK);
		g.fillPolygon(pK);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 8://ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y,x-8,y);
		//draw oblique arrow head
		Polygon pL = new Polygon();
		pL.addPoint(x-2, y-2);
		pL.addPoint(x-2, y+2);
		pL.addPoint(x-8,y);
		g.drawPolygon(pL);
		g.fillPolygon(pL);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
           case 9://ArrowOblique 45 degrees NE
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		//draw oblique arrow head
		Polygon pM = new Polygon();
                //draw oblique arrow head
                
                //pM.addPoint(x+6,y-6);
		//pM.addPoint(x-2,y-2);
		//pM.addPoint(x+2,y+2);
                
		pM.addPoint(x+5,y-5);
		pM.addPoint(x-1,y-2);
		pM.addPoint(x+2,y+1);
		
                g.drawPolygon(pM);
		g.fillPolygon(pM);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                 
           break;
	}			
    }  

    public static final void drawArrowScaled(int x, int y, int tipo, double sfactor, Graphics g){
	Graphics2D g2d = (Graphics2D)g;
        double s;
        s = sfactor;
        
        switch (tipo){
	   
          case 1://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y-1,x,y+(int)(s*5));
		//draw oblique arrow head
		Polygon pH = new Polygon();
		pH.addPoint(x-(int)(s*2), y-(int)(s*2));
		pH.addPoint(x+(int)(s*2), y-(int)(s*2));
		pH.addPoint(x,y-(int)(s*7));
		g.drawPolygon(pH);
		g.fillPolygon(pH);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 2://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x,y+1,x,y-(int)(s*5));
		//draw oblique arrow head
		Polygon pJ = new Polygon();
		pJ.addPoint(x-(int)(s*2), y+(int)(s*2));
		pJ.addPoint(x+(int)(s*2), y+(int)(s*2));
		pJ.addPoint(x,y+(int)(s*7));
		g.drawPolygon(pJ);
		g.fillPolygon(pJ);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
           
           case 3://ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x+1,y,x-(int)(s*5),y);
		//draw oblique arrow head
		Polygon pK = new Polygon();
		pK.addPoint(x+(int)(s*2), y-(int)(s*2));
		pK.addPoint(x+(int)(s*2), y+(int)(s*2));
		pK.addPoint(x+(int)(s*7),y);
		g.drawPolygon(pK);
		g.fillPolygon(pK);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 4://ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                g.drawLine(x-1,y,x+(int)(s*5),y);
		//draw oblique arrow head
		Polygon pL = new Polygon();
		pL.addPoint(x-(int)(s*2), y-(int)(s*2));
		pL.addPoint(x-(int)(s*2), y+(int)(s*2));
		pL.addPoint(x-(int)(s*7),y);
		g.drawPolygon(pL);
		g.fillPolygon(pL);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
           case 5://ArrowOblique 45 degrees NE
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		//draw oblique arrow head
		Polygon pM = new Polygon();
                
                //pM.addPoint(x+(int)(s*5),y-(int)(s*5)); // longer arrow
		pM.addPoint(x+(int)(s*4),y-(int)(s*4));
		pM.addPoint(x-(int)(s*1),y-(int)(s*2));
		pM.addPoint(x+(int)(s*2),y+(int)(s*1));
		
                g.drawPolygon(pM);
		g.fillPolygon(pM);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                 
           break;
           
           case 7://Larger ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pR = new Polygon();
		pR.addPoint(x, y-(int)(s*3));
		pR.addPoint(x, y+(int)(s*3));
		pR.addPoint(x+(int)(s*7),y);
		g.drawPolygon(pR);
		g.fillPolygon(pR);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 8://Larger ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pS = new Polygon();
		pS.addPoint(x, y-(int)(s*3));
		pS.addPoint(x, y+(int)(s*3));
		pS.addPoint(x-(int)(s*7),y);
		g.drawPolygon(pS);
		g.fillPolygon(pS);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
           case 9://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pU = new Polygon();
		pU.addPoint(x-(int)(s*3), y);
		pU.addPoint(x+(int)(s*3), y);
		pU.addPoint(x,y-(int)(s*7));
		g.drawPolygon(pU);
		g.fillPolygon(pU);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 10://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pD = new Polygon();
                pD.addPoint(x-(int)(s*3), y);
		pD.addPoint(x+(int)(s*3), y);
		pD.addPoint(x,y+(int)(s*7));
		g.drawPolygon(pD);
		g.fillPolygon(pD);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
	}		
    }
        
    
    public static final void drawArrowtip(int x, int y, int tipo, Graphics g){
        Graphics2D g2d = (Graphics2D)g;
	 switch (tipo){
	   case 1://ArrowUp
	  	g.drawLine(x,y-4,x,y-8);
		g.drawLine(x-3,y-2,x+3,y-2);
		g.drawLine(x-2,y-3,x+2,y-3);
		g.drawLine(x-2,y-4,x+2,y-4);
		g.drawLine(x-1,y-5,x+1,y-5);
		g.drawLine(x-1,y-6,x+1,y-6);
	   break;
	   case 2://Down
		g.drawLine(x,y+4,x,y+8);
		g.drawLine(x-1,y+6,x+1,y+6);
		g.drawLine(x-1,y+5,x+1,y+5);
		g.drawLine(x-2,y+4,x+2,y+4);
		g.drawLine(x-2,y+3,x+2,y+3);
		g.drawLine(x-3,y+2,x+3,y+2);
	   break;
	   case 3://ArrowRight
		g.drawLine(x+4,y,x+8,y);
		g.drawLine(x+6,y-1,x+6,y+1);
		g.drawLine(x+5,y-1,x+5,y+1);
		g.drawLine(x+4,y-2,x+4,y+2);
		g.drawLine(x+3,y-2,x+3,y+2);
		g.drawLine(x+2,y-3,x+2,y+3);
	   break;
	   case 4://ArrowLeft
		g.drawLine(x-4,y,x-8,y);
		g.drawLine(x-2,y-3,x-2,y+3);
		g.drawLine(x-3,y-2,x-3,y+2);
		g.drawLine(x-4,y-2,x-4,y+2);
		g.drawLine(x-5,y-1,x-5,y+1);
		g.drawLine(x-6,y-1,x-6,y+1); 
	   break;
           
           case 5://ArrowUpSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		Polygon pH = new Polygon();
		pH.addPoint(x-2, y-2);
		pH.addPoint(x+2, y-2);
		pH.addPoint(x,y-8);
		g.drawPolygon(pH);
		g.fillPolygon(pH);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        
          break;
          
          case 6://ArrowDownSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pJ = new Polygon();
		pJ.addPoint(x-2, y+2);
		pJ.addPoint(x+2, y+2);
		pJ.addPoint(x,y+8);
		g.drawPolygon(pJ);
		g.fillPolygon(pJ);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   break;
           
           case 7://ArrowRightSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pK = new Polygon();
		pK.addPoint(x+2, y-2);
		pK.addPoint(x+2, y+2);
		pK.addPoint(x+8,y);
		g.drawPolygon(pK);
		g.fillPolygon(pK);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	   
	   break;
           
           case 8://ArrowLeftSmooth
               g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
                Polygon pL = new Polygon();
		pL.addPoint(x-2, y-2);
		pL.addPoint(x-2, y+2);
		pL.addPoint(x-8,y);
		g.drawPolygon(pL);
		g.fillPolygon(pL);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
 
	   break;
           
           case 9://ArrowOblique 45 degrees NE
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		Polygon pM = new Polygon();
                pM.addPoint(x+5,y-5);
		pM.addPoint(x-1,y-2);
		pM.addPoint(x+2,y+1);
		g.drawPolygon(pM);
		g.fillPolygon(pM);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                 
           break;
	}	
	
    }
    
    
    public static void addComponent(Container container, Component component, int gridx, int gridy,
	int gridwidth, int gridheight, int fill, int anchor) throws AWTException{
	    LayoutManager lm = container.getLayout();
	    if(!(lm instanceof GridBagLayout)){
		throw new AWTException ("Invalid layout"+lm);
	    }
	    else{
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = gridx;
		gbc.gridy = gridy;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.fill = fill;
		gbc.anchor = anchor;
		((GridBagLayout)lm).setConstraints(component, gbc);
		container.add(component);
	    }
    }
    
    public static void  SansNosansSymb(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(symbolFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }

    public static void  SansNosansSymb2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }
    
    public static void  SansNosansSymb2B(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont(Font.BOLD,(float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont(Font.BOLD,(float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }
    
    public static void  SansMiditalic(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(italicFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    public static void TxtImgTxt(String str1, BufferedImage img, String str3, Graphics g, int fsize, int x, int y, ImageObserver observer){
		FontMetrics fm;
		g.setFont(new Font("SanSerif",Font.PLAIN,fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		//g.setFont(new Font("SanSerif",Font.ITALIC,fsize+1));
		//fm = g.getFontMetrics();
		//g.drawString(str2,x,y);

		x = x + fm.stringWidth("  ");
		g.drawImage(img,x,y-img.getHeight(),observer);
		x = x + fm.stringWidth(" ") + img.getWidth() + 1;
		
		//x = x + fm.stringWidth(str2) + 1;
		//g.setFont(new Font("SanSerif",Font.PLAIN,fsize));
                //fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  SansMiditalicSuper(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
                
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
                
                g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
                x = x + fm.stringWidth(str2) + 1;
		y = y + fm.getHeight()/3;
		g.setFont(italicFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str3,x,y);
		x = x + fm.stringWidth(str3) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
    }

    public static void TxtSuperImgTxt(String str1, String str2, BufferedImage img, String str4, Graphics g, int fsize, int x, int y, ImageObserver observer){
		FontMetrics fm;
		g.setFont(new Font("SanSerif",Font.PLAIN,fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;

		                
                g.setFont(new Font("SanSerif",Font.PLAIN,fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
                x = x + fm.stringWidth(str2) + 1;
		y = y + fm.getHeight()/3;

		//g.setFont(new Font("SanSerif",Font.ITALIC,fsize+1));
		//fm = g.getFontMetrics();
		//g.drawString(str2,x,y);

		x = x + fm.stringWidth("  ");
		g.drawImage(img,x,y-img.getHeight(),observer);
		x = x + fm.stringWidth(" ") + img.getWidth() + 1;
		
		//x = x + fm.stringWidth(str2) + 1;
		g.setFont(new Font("SanSerif",Font.PLAIN,fsize));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
    }
    
    public static void  subscripter(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSpecialSubSup(String str1, String str2, String str2b, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
                y = y - 2* fm.getHeight()/3;
                g.drawString(str2b,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSpecialSubSupSub(String str1, String str2, String str2b, String str3, String str4, String str5, String str6, String str7, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
                
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
                y = y - 2* fm.getHeight()/3;
                g.drawString(str2b,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                
                g.setFont(italicFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str4,x,y);
		x = x + fm.stringWidth(str4) + 1;
		
                g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str5,x,y);
		x = x + fm.stringWidth(str5) + 1;
		
                g.setFont(serifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str6,x,y);
                x = x + fm.stringWidth(str6) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str7,x,y);
                
                
    }
    
    public static void  subscripterIT(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		//g.setFont(new Font("Serif",Font.ITALIC,fsize));
		//g.setFont(italicFont.deriveFont((float)fsize));
		g.setFont(serifFont.deriveFont(Font.ITALIC,(float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterIT2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(italicFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripter2types(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    public static void  subscripterWavy(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize+2)); // Put tilde on top of symbol
                g.drawString("~",x,y-110*fm.getHeight()/200);  
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    public static void Wavy(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
                
                x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		g.setFont(serifFont.deriveFont((float)fsize+2)); // Put tilde on top of symbol
                g.drawString("~",x,y-120*fm.getHeight()/200);  
		
                x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void Wavy2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
                
                x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		g.setFont(serifFont.deriveFont((float)fsize+2)); // Put tilde on top of symbol
                g.drawString("~",x-2,y-120*fm.getHeight()/200);  
		
                x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSymFirst(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+1));
                //g.setFont(new Font("Symbol",Font.PLAIN,fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    public static void  subscripterSymFirst2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSymFirstBeforeLast(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+2));
                //g.setFont(new Font("Symbol",Font.PLAIN,fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                x = x + fm.stringWidth(str4) + 1;
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
    }
    
    public static void  subscripterSS(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSSIT(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(italicFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSSWavyC(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
                g.setFont(serifFont.deriveFont((float)fsize+2)); // Put tilde on top of symbol
                g.drawString("~",x-1,y-120*fm.getHeight()/200);  
		
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSS2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSS3(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSSym(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(symbolFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    
     public static void  subscripterSanSym(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize));
		g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
    }

    public static void  subscripterSanSym2(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize+1));
		//g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }

    public static void  subscripterSanSym3(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize+2));
		//g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }
    
    public static void  subscripterSymMiddle(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize));
		g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                x = x + fm.stringWidth(str4) + 1;
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
                
    }

    public static void  subscripterSymMiddle2(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize+1));
		//g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                x = x + fm.stringWidth(str4) + 1;
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
                
    }
    
    public static void  subscripterB(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterInfinityOne(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
                
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
		
                //create a symbol for "infinity".  JAVA 1.5 has a terrible rendition of the character
                //string str4 is not used
                //g.setFont(new Font("Serif",Font.PLAIN,fsize+3));
                //fm = g.getFontMetrics();
                g.setFont(serifFont.deriveFont((float)fsize+5));
                fm = g.getFontMetrics();
                g.drawString("\u221e",x,y);
                //g.drawString("o",x,y);
                //g.drawString("o",x+5,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }
    
    public static void  subscripterInfinityTwo(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
		//create a symbol for "infinity".  JAVA 1.5 has a terrible rendition of the character
                //string str4 is not used
                //g.setFont(new Font("Serif",Font.PLAIN,fsize+3));
                //fm = g.getFontMetrics();
                g.setFont(serifFont.deriveFont((float)fsize+5));
                fm = g.getFontMetrics();
                g.drawString("\u221e",x,y);
                //g.drawString("o",x,y);
                //g.drawString("o",x+5,y);
                
                x = x + fm.stringWidth("oo") + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
    }
    
    public static void  subscripterInfinityThree(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
		//create a symbol for "infinity".  JAVA 1.5 has a terrible rendition of the character
                //string str4 is not used
                //g.setFont(new Font("Serif",Font.PLAIN,fsize+3));
                //fm = g.getFontMetrics();
                g.setFont(serifFont.deriveFont((float)fsize+5));
                fm = g.getFontMetrics();
                g.drawString("\u221e",x,y);
                //g.drawString("o",x,y);
                //g.drawString("o",x+6,y);
                
                x = x + fm.stringWidth("oo") + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
    }
    
    public static void  superscripter(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    } 
    
    public static void  superscripterSymFirst(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
                
                g.setFont(serifFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;

                g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str3,x,y);
		x = x + fm.stringWidth(str3) + 1;
                
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str4,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str4) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);
    }
    
    public static void drawCircle(int x, int y, int radius, Graphics g){
		Graphics2D g2d = (Graphics2D)g;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                
                g.drawOval(x-radius/2,y-radius/2,radius,radius);
                
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    }
    
    public static void fillCircle(int x, int y, int radius, Graphics g){
            Graphics2D g2d = (Graphics2D)g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
            g.fillOval(x-radius/2,y-radius/2,radius,radius);
            
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }
    
    public static void drawArcThick(Graphics g, double xCenter, double yCenter, double Radius, double startangle, double endangle, int thick, Color color){
	
            Graphics2D g2d = (Graphics2D)g;
            g2d.setPaint(color);
            g2d.setStroke(new BasicStroke(thick));
        
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
            Arc2D.Double arc_one = new Arc2D.Double(xCenter,yCenter,Radius,Radius,startangle,endangle,0);
            g2d.draw(arc_one);
  
            g2d.setStroke(new BasicStroke(1));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        }
}

/*
//MaestroG.java

import java.awt.*;
import java.lang.*;

public class MaestroG{
    MaestroG(){};
    //tipo=1 arrow up
    //
    public static final void drawArrow(int x, int y, int tipo, Graphics g){
	 switch (tipo){
	   case 1://ArrowUp
	  	g.drawLine(x,y,x,y-8);
		g.drawLine(x-3,y-2,x+3,y-2);
		g.drawLine(x-2,y-3,x+2,y-3);
		g.drawLine(x-2,y-4,x+2,y-4);
		g.drawLine(x-1,y-5,x+1,y-5);
		g.drawLine(x-1,y-6,x+1,y-6);
	   break;
	   case 2://Down
		g.drawLine(x,y,x,y+8);
		g.drawLine(x-1,y+6,x+1,y+6);
		g.drawLine(x-1,y+5,x+1,y+5);
		g.drawLine(x-2,y+4,x+2,y+4);
		g.drawLine(x-2,y+3,x+2,y+3);
		g.drawLine(x-3,y+2,x+3,y+2);
	   break;
	   case 3://ArrowRight
		g.drawLine(x,y,x+8,y);
		g.drawLine(x+6,y-1,x+6,y+1);
		g.drawLine(x+5,y-1,x+5,y+1);
		g.drawLine(x+4,y-2,x+4,y+2);
		g.drawLine(x+3,y-2,x+3,y+2);
		g.drawLine(x+2,y-3,x+2,y+3);
	   break;
	   case 4://ArrowLeft
		g.drawLine(x,y,x-8,y);
		g.drawLine(x-2,y-3,x-2,y+3);
		g.drawLine(x-3,y-2,x-3,y+2);
		g.drawLine(x-4,y-2,x-4,y+2);
		g.drawLine(x-5,y-1,x-5,y+1);
		g.drawLine(x-6,y-1,x-6,y+1); 
	  break;
	}	
	
    }  
    
    public static final void drawArrowtip(int x, int y, int tipo, Graphics g){
	 switch (tipo){
	   case 1://ArrowUp
	  	g.drawLine(x,y-4,x,y-8);
		g.drawLine(x-3,y-2,x+3,y-2);
		g.drawLine(x-2,y-3,x+2,y-3);
		g.drawLine(x-2,y-4,x+2,y-4);
		g.drawLine(x-1,y-5,x+1,y-5);
		g.drawLine(x-1,y-6,x+1,y-6);
	   break;
	   case 2://Down
		g.drawLine(x,y+4,x,y+8);
		g.drawLine(x-1,y+6,x+1,y+6);
		g.drawLine(x-1,y+5,x+1,y+5);
		g.drawLine(x-2,y+4,x+2,y+4);
		g.drawLine(x-2,y+3,x+2,y+3);
		g.drawLine(x-3,y+2,x+3,y+2);
	   break;
	   case 3://ArrowRight
		g.drawLine(x+4,y,x+8,y);
		g.drawLine(x+6,y-1,x+6,y+1);
		g.drawLine(x+5,y-1,x+5,y+1);
		g.drawLine(x+4,y-2,x+4,y+2);
		g.drawLine(x+3,y-2,x+3,y+2);
		g.drawLine(x+2,y-3,x+2,y+3);
	   break;
	   case 4://ArrowLeft
		g.drawLine(x-4,y,x-8,y);
		g.drawLine(x-2,y-3,x-2,y+3);
		g.drawLine(x-3,y-2,x-3,y+2);
		g.drawLine(x-4,y-2,x-4,y+2);
		g.drawLine(x-5,y-1,x-5,y+1);
		g.drawLine(x-6,y-1,x-6,y+1); 
	  break;
	}	
	
    }  
    
    public static void addComponent(Container container, Component component, int gridx, int gridy,
	int gridwidth, int gridheight, int fill, int anchor) throws AWTException{
	    LayoutManager lm = container.getLayout();
	    if(!(lm instanceof GridBagLayout)){
		throw new AWTException ("Invalid layout"+lm);
	    }
	    else{
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = gridx;
		gbc.gridy = gridy;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.fill = fill;
		gbc.anchor = anchor;
		((GridBagLayout)lm).setConstraints(component, gbc);
		container.add(component);
	    }
    }
    
    public static void  SansNosansSymb(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(serifFont.deriveFont((float)fsize));
                g.setFont(symbolFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
    }
    
    public static void  subscripterSymMiddle(String str1, String str2, String str3, String str4, String str5, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
                int lengthy;
                
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize));
		g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
                x = x + fm.stringWidth(str4) + 1;
                g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str5,x,y);           
    }
    
    public static void  SansMiditalic(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(italicFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str2,x,y);
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  SansMiditalicSuper(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
                
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
                
                g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
                x = x + fm.stringWidth(str2) + 1;
		y = y + fm.getHeight()/3;
		g.setFont(italicFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str3,x,y);
		x = x + fm.stringWidth(str3) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
    }
  
    public static void  subscripter(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
     
    public static void  superscripter(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    } 
    
    public static void  superscripterSanSym(String str1, String str2, String str3, String str4, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y - fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y + fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
                x = x + fm.stringWidth(str3) + 1;
                g.setFont(serifFont.deriveFont((float)fsize));
		g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str4,x,y);
    }
    
    
    public static void  subscripterSS(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+2));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSS2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize+1));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSS3(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSSym(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(serifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(symbolFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterSymFirst(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
                g.setFont(symbolFont.deriveFont((float)fsize+1));
                fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    public static void  subscripterSymFirst2(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(serifFont.deriveFont((float)fsize));
                g.setFont(symbolFont.deriveFont((float)fsize+2));
                fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont((float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }
    
    public static void  subscripterB(String str1, String str2, String str3, Graphics g, int fsize, int x, int y){
        if (useBiggerFont) fsize += 2;
		FontMetrics fm;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize));
		fm = g.getFontMetrics();
		g.drawString(str1,x,y);
		x = x + fm.stringWidth(str1) + 1;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize-2));
		fm = g.getFontMetrics();
		y = y + fm.getHeight()/3;
		g.drawString(str2,x,y);
		y = y - fm.getHeight()/3;
		x = x + fm.stringWidth(str2) + 1;
		g.setFont(sanSerifFont.deriveFont(Font.BOLD,(float)fsize));
                fm = g.getFontMetrics();
		g.drawString(str3,x,y);
    }

    
    public static void drawCircle(int x, int y, int radius, Graphics g){
		g.drawOval(x-radius/2,y-radius/2,radius,radius);
    }
    
    public static void fillCircle(int x, int y, int radius, Graphics g){
		g.fillOval(x-radius/2,y-radius/2,radius,radius);
    }    
}
*/
