import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.Dimension;
import javax.swing.JPanel; 
import java.awt.Font;
import java.util.Timer;
import java.util.TimerTask; 
import javax.swing.JFrame;	// applet 
import java.util.ArrayList;

import java.awt.*;
import java.awt.event.*;  
import javax.swing.*;
import java.awt.Dimension;

//public class fenetrel extends JPanel {	//applet JFrame
public class fenetrel extends JFrame {
        static panneaul pan = new panneaul();
        static JLabel lpas = new JLabel();
   			static JLabel lvide = new JLabel("");
   
        static JButton bmanuel = new JButton("Automatique");
        static JButton bcyclenext = new JButton("<html>Cycle<br>suivant</html>");
        static JButton bcycleprev = new JButton("<html>Cycle<br>précédent</html>");
        static JButton bdetail = new JButton("<html>Détail des<br>mouvements</html>");
        static JButton bcoloration = new JButton("<html>Coloration</html>");
     
        static JButton bnextgroupe = new JButton("<html>groupe<br>L-System<br>suivant<br></html>");
        static JButton bnextls = new JButton("<html>L-System<br>suivant<br>du groupe</html>");
 
        static JButton bordermax = new JButton("<html>Profondeur<br>maximum</html>"); 
        static JButton bhelp = new JButton("<html>Aide et<br>commentaires</html>");
				private Dimension dim = new Dimension(95, 60);	//95
				static JPanel menu = new JPanel();  
				static JPanel menugauche = new JPanel();

				static String str=new String();
				Timer t;

        static double deltaX;
        static double deltaY; 
        static double x;
        static double y; 
        static ArrayList <String>  liste; 

public void affiche(String str,String str2)
{ 
JOptionPane.showMessageDialog
	    							(null, 
	     							str, 
	     							str2, 
	     							JOptionPane.INFORMATION_MESSAGE);
}
   
public void help()
{
int indexhelp=0;
String tabhelp[]={"L-System","Grammaire","Utilisation des commandes","Fonctionnement"};
	     						
String reponse="help";
while (reponse!= null) 
	{
	reponse = (String) JOptionPane.showInputDialog
	    							(null,
	     							"Choisir une rubrique de l'aide des L-Systems",
	     							"L-Systems- http://www.pdbzro.com/gags", 
	     							JOptionPane.QUESTION_MESSAGE,
	     							null,
	     							tabhelp,
	     							tabhelp[indexhelp]);
	 for (int i=0;i<tabhelp.length;i++)	
	 		{
	 		if (reponse==tabhelp[i])
	 				{
	 				switch (i)
	 					{
						case 0:{
str="Les systèmes de Lindenmayer ont été crées pour modéliser la croissance des plantes.\n";
str=str+"On part d'une structure de départ constituée d'une ou plusieurs lettres (ou caractères spéciaux)\n";
str=str+"et à chaque cycle on remplace les lettres en suivant la règle de production associée à chacune d'elles.\n";
str=str+"S'il y a plusieurs règles associées à la même lettre, on en choisit une au hasard.\n\n";
str=str+"Certaines des lettres sont des commandes, inspirées de celles du langage de la tortue graphique \"logo\"\n";
break;}

						case 1:{
str="          liste des commandes constituant les règles de substitution\n\n";
str=str+"+    tourner à droite\n";
str=str+"-    tourner à gauche\n";
str=str+"|    tourner de 180\n";
str=str+"#     tourner de 90\n"; 
str=str+"/n   tourner à droite de n\n";
str=str+"\\n   tourner à gauche de n\n"; 
str=str+"!    inverser + et -\n";
str=str+"[    empiler les paramètres\n";
str=str+"]    dépiler les paramètres\n";
str=str+"> ou >n    ajouter 1 ou n à la couleur (de 0 à 256)\n";
str=str+"< ou <n    retrancher 1 à la couleur\n";
str=str+"cn   mettre n comme valeur de couleur\n";
str=str+"@n   multiplier la longueur du pas par n\n";
str=str+"@In  diviser la longueur du pas par n\n";
str=str+"@Qn  multiplier la longueur du pas par sqrt(n)\n";
str=str+"@IQn diviser la longueur du pas par sqrt(n)\n";
str=str+":    noter la position courante\n";
str=str+";    tracer un trait vers la position courante enregistrée -(utilisé uniquement dans le Z order)\n";
str=str+"G    avancer d'un pas sans dessiner\n";
str=str+"F,A,B,1 :    avancer d'un pas en dessinant\n";
str=str+"\n\n";
str=str+"un L-system, par exemple la courbe de Koch, se définit par un angle, une structure de départ et des règles de substitution :\n";
str=str+"    angle=60\n";
str=str+"    axiom=F\n";
str=str+"    F=F+F--F+F\n";
break;} 

					case 2:{
str="A l'exception de F,A, B, et 1 toute lettre sans règle de production est supprimée à l'itération suivante, et donc ne sert à rien car n'ayant aucun effet\n";
str=str+"il est parfois nécessaire d'ajouter une règle \"F=\" pour supprimer F\n\n";
str=str+"plutot que d'utiliser une séquence \"++++\" dépendant de la valeur de \"angle\" pour orienter la figure, on utilisera # et eventuellement |\n";
str=str+"Le  cadrage et le changement d'échelle se fait automatiquement, par une premiète passe sans dessiner, servant à calculer les bornes de l'image\n";
str=str+"la structure de départ est souvent un segment (axiom=F), un triangle (axiom=F+F+F) ou un carré (axiom=F+F+F+F)\n";
str=str+"pour arrondir un angle, on double l'angle et on divise par 2 la taille pour dessiner le coin en plusieurs segments puis on remultiplie par 2 (voir le dragon)\n\n";
str=str+"après avoir dessiné une branche d'un arbre, il faut revenir à la racine de la branche avec les paramètres tels qu'ils étaient, avant de continuer\n";
str=str+"ainsi F[+F][-F]F dessine deux branches et le tronc qui continue\n\n";
str=str+"voir comme exemples le \"détail\" des L-systèmes proposés\n";
				;break;}
 
					case 3:{
str="Au début, le programme est en option automatique, c'est à dire que toutes les secondes il affiche un niveau de plus, jusqu'à un maximum modifiable de 5\n";
str=str+"cliquer sur \"manuel\" puis \"cycle suivant\" pour progresser cycle par cycle autant que désiré\n";
str=str+"l'affichage du niveau 0 correspond à l'axiome de départ\n\n";
str=str+"Si l'affichage est en noir et blanc, les commandes c, < et > sont inneffectives\n";
str=str+"< et > servent à passer d'une couleur à l'autre dans une liste brun, vert , bleu, indigo, violet, rouge, orange, et de nouveau brun\n";
break;}
		
	 				default:{}
	 				}
	 			affiche(str,reponse);
	 			indexhelp++; 
	 			if (indexhelp==tabhelp.length) {indexhelp=0;}
	 			}
	 		} // for
	 } // while
} // help 
 
public void mmaj()
{
str="<html>"+pan.ls[pan.numls][0]+"<br>"+pan.ls[pan.numls][1]+"</html>";
lpas.setText(str);
lpas.repaint();
}
        
public void maj()
{
mmaj(); 
 
if (pan.flag==true) {pan.repaint();}
}

public void initls()
	{
	pan.theorder=0;	
	if (pan.manuel==true)
		{pan.theordermax=0;}
	else
		{pan.theordermax=0;}					
	} 

public void listelsg() 
{ 
liste= new ArrayList <String >() ; 
for (int i=0;i<pan.ls.length;i++)
	{
	if (pan.ls[i][0]==pan.nomlsgroupe)
		{if (liste.contains(pan.ls[i][1])==false)
				{liste.add(pan.ls[i][1]);}
		}
	}
pan.nomlsg=new String [liste.size()];
for (int i=0;i<liste.size();i++)
	{pan.nomlsg[i]=liste.get(i);}
}
 
public fenetrel()
						{ 
/* applet*/
  this.setTitle("Iterated Fonction System - L-System");
  Dimension dime = Toolkit.getDefaultToolkit().getScreenSize();
  int theight = (int)dime.getHeight();
	int twidth  = (int)dime.getWidth();
	System.out.println("Current Screen resolution : "
                           + "width : " + twidth
                           + " height : " + theight);
  this.setSize(twidth, theight);	/* 1280 720 et 1920 1080 j'avais 1500 900 */
 
  this.setLocationRelativeTo(null);                           
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setUndecorated(false); 

							liste= new ArrayList <String >() ;   		
            	for (int i=0;i<pan.ls.length;i++)
            		{
            		if (liste.contains(pan.ls[i][0])==false)
            			{liste.add(pan.ls[i][0]);}
            		}
            	pan.nomgroupe=new String[liste.size()];
            	for (int i=0;i<liste.size();i++)
            		{pan.nomgroupe[i]=liste.get(i);}
            		
            	pan.nomlsgroupe=pan.ls[0][0];
            	listelsg();
                
            this.setLayout(new BorderLayout()); 
						pan.haut=theight-150; 
						pan.longueur=twidth-150;           
            menu.setPreferredSize(new Dimension(pan.longueur+200, 70)); 
            menugauche.setPreferredSize(new Dimension(160, pan.haut)); 
    				pan.setPreferredSize(new Dimension(pan.longueur, pan.haut));
          
            lpas.setPreferredSize(new Dimension(400, 70)); //270
            lvide.setPreferredSize(new Dimension(10, 60)); 
              
            bmanuel.setPreferredSize(dim);
            bdetail.setPreferredSize(dim);
            bcoloration.setPreferredSize(dim);
           
            bcyclenext.setPreferredSize(dim);
            bcycleprev.setPreferredSize(dim);

						bnextls.setPreferredSize(dim);
						bnextgroupe.setPreferredSize(dim);
						bordermax.setPreferredSize(dim);
						bhelp.setPreferredSize(dim);						

						bmanuel.addActionListener(new fmanuel());
						bdetail.addActionListener(new fdetail());
						bordermax.addActionListener(new fordermax());
						bcyclenext.addActionListener(new fcyclenext());
						bcycleprev.addActionListener(new fcycleprev());
						bcoloration.addActionListener(new fcoloration());
					
						bnextls.addActionListener(new fnextls());
						bnextgroupe.addActionListener(new fnextgroup());	
						bhelp.addActionListener(new fhelp());
 
						menu.add(lpas);
            menu.add(bdetail);
            menugauche.add(bmanuel);
            menugauche.add(bordermax);
            menugauche.add(bcyclenext);
            menugauche.add(bcycleprev);
 
            menu.add(bcoloration);
  
            menu.add(lvide); 
            menu.add(bnextls); 
            menu.add(bnextgroupe);
            menu.add(bhelp);
         
            this.add(menu, BorderLayout.NORTH);
            this.add(menugauche,BorderLayout.WEST);
            this.add(pan, BorderLayout.CENTER);
   	
      			//	this.setContentPane(container);
            this.setVisible(true);
             			
 						t=new Timer();
 						t.schedule(new timetask(),500,500);
      			str="bbbb";
      			mmaj();
        		}
        class timetask extends TimerTask 
        	{
        	public void run() 
        		{ 
        		mmaj();
        		
						//maj(); 
         		}
        }
    
        class fmanuel implements ActionListener
        	{
                @Override 
                public void actionPerformed(ActionEvent e) 
                	{
                      //  String str = ((JButton)e.getSource()).getText();
                  if (pan.manuel==true)
        						{bmanuel.setText("Manuel");
        						pan.manuel=false;
        						pan.theordermax=0;}
        					else 
        						{bmanuel.setText("Automatique");
        						pan.manuel=true;
        						pan.theordermax=0;} 
             			pan.theorder=0;
        					bmanuel.repaint();
                	}  
        	}
   
         class fcyclenext implements ActionListener 
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
             			pan.theordermax=pan.theordermax+1; 
             			pan.theorder=0;
             			pan.repaint();
                	}
        	} 
       	class fcycleprev implements ActionListener 
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	pan.manuel=true;
             			if (pan.theordermax>0) 
             				{pan.theordermax=pan.theordermax-1;
             				pan.theorder=0; 
             				pan.repaint();}
                	}
            
        	}
      	class fdetail implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent ev) 
                	{ 
                  int nbtrans=pan.ls[pan.numls].length;
                  str="<html>";
                  for (int i=0;i<nbtrans;i++)
                  	{
                  	str=str+pan.ls[pan.numls][i]+"<br>";
										}
									str=str+"</html>";
									affiche(str,"détail des transformations");
                	}
          
        	}
 
    		class fhelp implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                       help(); 
                       //pan.keepf=true;
                	}

        	} 
   
      	class fnextgroup implements ActionListener
        	{
                @Override 
                public void actionPerformed(ActionEvent e) 
                	{
                	int i=pan.numgroupe+1;
 									if (i==pan.nomgroupe.length) {i=0;}
									String  reponse = (String) JOptionPane.showInputDialog
	    							(null,
	     							"Choisir un groupe de L-System à analyser", 
	     							"Boutons personnalises", 
	     							JOptionPane.QUESTION_MESSAGE,
	     							null,
	     							pan.nomgroupe, 
	     							pan.nomgroupe[i]);
	     						for (i=0;i<pan.nomgroupe.length;i++)
	     							{if (reponse==pan.nomgroupe[i])
	     								{
	     								pan.nomlsgroupe=reponse;
	     								pan.numgroupe=i;
	     								pan.numlsg=0;
	     								}
	     							} 
	     						listelsg();
	     						for (i=0;i<pan.ls.length;i++)
	     							{
	     							if (pan.nomlsg[0]==pan.ls[i][1])
	     								{
	     								pan.numls=i; 
                      } 
	     							initls();
	     							maj();
	     							}
	     						}
	     		}
       	class fnextls implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	int i=pan.numlsg+1;
 									if (i==pan.nomlsg.length) 
 										{i=pan.numgroupe+1;
 										if (i==pan.nomgroupe.length) {i=0;}
 										pan.numgroupe=i;
 										pan.nomlsgroupe=pan.nomgroupe[i];
 										listelsg();
 										i=0;}
									String  reponse = (String) JOptionPane.showInputDialog
	    							(null, 
	     							"Choisir un L-System à analyser dans le groupe "+pan.nomlsgroupe, 
	     							"Boutons personnalises", 
	     							JOptionPane.QUESTION_MESSAGE,
	     							null, 
	     							pan.nomlsg,
	     							pan.nomlsg[i]); 
	     
	     						for (i=0;i<pan.nomlsg.length;i++)
	     							if (reponse==pan.nomlsg[i])
	     								{ 
	     								pan.numlsg=i;
	     								}	
	     						for (i=0;i<pan.ls.length;i++)
	     							if (reponse==pan.ls[i][1])
	     								{
	     								pan.numls=i; 
                      }
									initls();
									maj();
                	}
        	} 
       class fcoloration implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                	int i=pan.coloration+1; 
 									if (i==pan.nomcoloration.length) {i=0;}
									String  reponse = (String) JOptionPane.showInputDialog
	    							(null, 
	     							"Choisir un mode de coloration", 
	     							"Boutons personnalises",
	     							JOptionPane.QUESTION_MESSAGE,
	     							null,
	     							pan.nomcoloration, 
	     							pan.nomcoloration[pan.coloration]);
	     						for (i=0;i<pan.nomcoloration.length;i++)
	     							if (reponse==pan.nomcoloration[i])
	     								{ 
	     								pan.coloration=i;	     								
	     								} 
	     						//pan.imprimetout=true;
									maj();
                	}
        	}
				class fordermax implements ActionListener 
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
            			String  reponse = (String) JOptionPane.showInputDialog
	    							(null, 
	     							"Valeur maximum de la profondeur de calcul", 
	     							"Profondeur", 
	     							JOptionPane.QUESTION_MESSAGE);
	     							int i;
	     							
	     								try
		     								{i=Integer.parseInt(reponse);
	     									}
	     								catch(Exception ee)
	     									{i=0;}
	     								if (i>1)
            						{pan.ordermax=i;
            						}
            				 //pan.imprimetout=false;
                     mmaj();
                    
                	}
        	}         
}


