import com.sun.glf.demos.gallery.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;
import com.sun.glf.*;
import com.sun.glf.util.*;
import com.sun.glf.goodies.*;
import com.sun.glf.util.*;

public class FioriTesto extends JFrame
{
	Composition ComposizioneCorrente;

        JSlider sliderValori;JSlider slider_numeroCicli;
        JSlider slider_numeroDiShapes;
	JSlider slider_numeroDiRotazioni;
        JSlider slider_red;
        JSlider slider_gre;
        JSlider slider_blu;
        JSlider slider_red1;
        JSlider slider_gre1;
        JSlider slider_blu1;
        JSlider slider_red2;
        JSlider slider_gre2;
        JSlider slider_blu2;
        JSlider slider_red3;
        JSlider slider_gre3;
        JSlider slider_blu3;
        JLabel labelSlider_sliderValori;
        JLabel labelSlider_numeroDiShapes;
	JLabel labelSlider_numeroDiRotazioni;
        JLabel labelSlider_numeroCicli;
        JLabel label_colorirgb;
        JLabel label_colorirgb1;
        JLabel label_colorirgb2;
        JLabel label_colorirgb3;
        JLabel label_sfondo;
        JLabel label_testo;
        JLabel label_numpaint;
        JLabel label_base;
        JLabel label_tratto;
        JLabel label_riempimento;
        JButton bottone_testo;
	JTextArea area_testo;
        JComboBox combo_testo;




  Dimension margins = new Dimension(100, 100);
  String testo = "SMC";
  int fontSize = 80;
  Font textFont = new Font("Monotype", Font.PLAIN, fontSize);
  Color Coloresfondo =  new Color(128,128,255);
  int numeroDiShapes = 30;
  int numeroDiRotazioni = 1;
  Color ColoreDiBase =  new Color(128,128,0);
  float lumIniziale = .2f;
  float lumFinale = .8f;
  int numeroCicli = 10;
  float larghTratto = 4;
  Color ColoreTratto = new Color(128,255,255);
  Color ColoreRiempimento = new Color(128,255,128);
  //metodo build, metodo che crea la Composition
  public Composition build(){

    Shape shape = TextLayer.makeTextBlock(testo, textFont);  //Trasforma il
                                                            //testo in una
                                                            //shape con il
                                                            //metodo makeTextBlock()
    //Calcola le dim. della Composition tenendo conto dei margini
    Rectangle shapeBounds = shape.getBounds();
    int cmpWidth = shapeBounds.width>shapeBounds.height?shapeBounds.width:shapeBounds.height;
    Dimension size = new Dimension(2*cmpWidth + 2*margins.width,
				   2*cmpWidth + 2*margins.height);

    LayerComposition cmp = new LayerComposition(size);
    cmp.setBackgroundPaint(Coloresfondo);
    //Traslazione con AffineTranform
    AffineTransform t = new AffineTransform();
    t.translate(shapeBounds.width/2f, -shapeBounds.height/2f);
    Position shapePosition = new Position(Anchor.CENTER, 0, 0, t);

    shape = shapePosition.createTransformedShape(shape, cmp.getBounds());

    float angleTotal = 2*numeroDiRotazioni*(float)Math.PI;
    float angleStep = angleTotal/numeroDiShapes;

    // Cambia lo spazio di colore  in HSB  per usare in seguito la luminosità
    float hsb[] = Color.RGBtoHSB(ColoreDiBase.getRed(),
				 ColoreDiBase.getGreen(),
				 ColoreDiBase.getBlue(),
				 null);

    float deltaBrightness = (lumFinale-lumIniziale)/(numeroDiShapes/(float)
    numeroCicli);

    int rcx = size.width/2;
    int rcy = size.height/2;
    float b = 0;

    Layer layers[] = new Layer[numeroDiShapes + 2];
   //Rotazione con Affine Trasform
    AffineTransform rotate = new AffineTransform();
    int i = 0;
    for(i=0; i<numeroDiShapes; i++){
   //Usa la luminosità per andare dal max al min a seconda del numero di cicli
      b = lumIniziale + (i*deltaBrightness)%(lumFinale-lumIniziale);
      Color color = Color.getHSBColor(hsb[0], hsb[1], b);
      rotate.rotate(angleStep, rcx, rcy);
      //Copia e ruota i livelli
      layers[i] = new ShapeLayer(cmp, shape, new FillRenderer(color));
      layers[i].setTransform((AffineTransform)rotate.clone());
    }


    //
    // Aggiunge due livelli per dare l'efetto di profondità
    //
    FillRenderer textFill = new FillRenderer(ColoreRiempimento);
    FillRenderer textStroke = new FillRenderer(ColoreTratto);

    ShapeLayer textStrokeLayer = new ShapeLayer(cmp, shape, textStroke);
    textStrokeLayer.setTransform(AffineTransform.getTranslateInstance(larghTratto,
    larghTratto));
    ShapeLayer textFillLayer = new ShapeLayer(cmp, shape, textFill);

    layers[i++] = textStrokeLayer;
    layers[i++] = textFillLayer;

    cmp.setLayers(layers);
    cmp.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    return cmp;

  }

	public FioriTesto(String titolo)
	{
		setTitle(titolo);
		setSize(500,500);
		setResizable(false);
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                JFrame finestraControlli = new JFrame();
		finestraControlli.setTitle("Controlli");
		finestraControlli.setSize(600,200);
		finestraControlli.getContentPane().setLayout(new GridLayout(8,1));
                JFrame finestraControlli2 = new JFrame();
                JFrame finestradis = new JFrame();

    //Ascoltatore Slider per la larghezza del tratto
    sliderValori = new JSlider(0,20,4);
    labelSlider_sliderValori = new JLabel("Larghezza tratto: " + larghTratto);
    larghTratto = sliderValori.getValue();
    sliderValori.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	larghTratto = sliderValori.getValue();
    	labelSlider_sliderValori.setText("Larghezza Tratto: " + larghTratto);
	  	setComposition(build());
    	}});


    //Ascoltatore Slider per il numero di Shapes
    slider_numeroDiShapes = new JSlider(0,50,30);
    labelSlider_numeroDiShapes = new JLabel("Numero di shapes: " + numeroDiShapes);
    numeroDiShapes = slider_numeroDiShapes.getValue();
    slider_numeroDiShapes.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	numeroDiShapes = slider_numeroDiShapes.getValue();
    	labelSlider_numeroDiShapes.setText("Numero di shapes: " + numeroDiShapes);
	  	setComposition(build());
    	}});


     //Ascoltatore Slider per il numero di rotazioni
      slider_numeroDiRotazioni = new JSlider(0,10,1);
     labelSlider_numeroDiRotazioni = new JLabel("Numero di rotazioni: "+numeroDiRotazioni);
    numeroDiRotazioni = slider_numeroDiRotazioni.getValue();
    slider_numeroDiRotazioni.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	numeroDiRotazioni = slider_numeroDiRotazioni.getValue();
    	labelSlider_numeroDiRotazioni.setText("Numero di rotazioni: " + numeroDiRotazioni);
	  	setComposition(build());
    	}});

     //Ascoltatore Slider per il numero di cicli
      slider_numeroCicli = new JSlider(0,10,1);
      labelSlider_numeroCicli = new JLabel("Numero di cicli: "+ numeroCicli);
    numeroCicli = slider_numeroCicli.getValue();
    slider_numeroCicli.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	numeroCicli = slider_numeroCicli.getValue();
    	labelSlider_numeroCicli.setText("Numero di cicli: " + numeroCicli);
	  	setComposition(build());
    	}});
     //ComboBox per la selezione del font
     combo_testo = new JComboBox();
     combo_testo.setEditable(false);
     combo_testo.addItem("SansSerif");
     combo_testo.addItem("Serif");
     combo_testo.addItem("GDT");
     combo_testo.addItem("Monospaced");
     combo_testo.addItem("Book Antiqua Corsivo");
     combo_testo.addItem("Comic Sans Ms");
     combo_testo.addItem("Courier New Bold Italic");
     combo_testo.addItem("Garamond Corsivo");
     //Ascoltatore ComboBox per il font
     combo_testo.addActionListener(new ActionListener(){public void
       actionPerformed(ActionEvent a){
        textFont= new Font((String)combo_testo.getSelectedItem(),Font.PLAIN,
        fontSize);
       setComposition(build());
       }});

    //Aggiunta degli oggetti swing ai relativi frame e settaggi(Locazione frame,titolo,grandezza ecc.)

    setVisible(true);
    finestraControlli.getContentPane().add(labelSlider_sliderValori);
    finestraControlli.getContentPane().add(sliderValori);
    finestraControlli.getContentPane().add(labelSlider_numeroDiShapes);
    finestraControlli.getContentPane().add(slider_numeroDiShapes);
    finestraControlli.getContentPane().add(labelSlider_numeroDiRotazioni);
    finestraControlli.getContentPane().add(slider_numeroDiRotazioni);
    finestraControlli.getContentPane().add(labelSlider_numeroCicli);
    finestraControlli.getContentPane().add(slider_numeroCicli);
    area_testo = new JTextArea(testo);
    bottone_testo= new JButton("OK");
    finestraControlli.getContentPane().add(area_testo);
    finestraControlli.getContentPane().add(bottone_testo);
    label_testo = new JLabel("Font");
    finestraControlli.getContentPane().add(label_testo);
    finestraControlli.getContentPane().add(combo_testo);
    label_numpaint = new JLabel("Hai disegnato "+numeropaint+" volte");
    finestraControlli.setResizable(false);
    finestraControlli.setLocation(0,445);
    finestraControlli.setVisible(true);
    finestraControlli2.setTitle("Controllo colori");
    finestraControlli2.setSize(750,100);
    finestraControlli2.setResizable(false);
    finestraControlli2.getContentPane().setLayout(new GridLayout(4,5));
    label_colorirgb = new JLabel("Colore di sfondo");
    label_colorirgb1 = new JLabel("Colore di base");
    label_colorirgb3 = new JLabel("Colore riempimento");
    label_colorirgb2 = new JLabel("Colore tratto");
    finestraControlli2.getContentPane().add(label_colorirgb);
    slider_red= new JSlider(0,255,10);
    slider_gre= new JSlider(0,255,10);
    slider_blu= new JSlider(0,255,10);
    label_sfondo = new JLabel("R:   "+slider_red.getValue()+"  G:   "+slider_gre.getValue()+"  B:   "+slider_blu.getValue());
    finestraControlli2.getContentPane().add(label_sfondo);
    finestraControlli2.getContentPane().add(slider_red);
    finestraControlli2.getContentPane().add(slider_gre);
    finestraControlli2.getContentPane().add(slider_blu);
    finestraControlli2.getContentPane().add(label_colorirgb1);
    slider_red1= new JSlider(0,255,10);
    slider_gre1= new JSlider(0,255,10);
    slider_blu1= new JSlider(0,255,10);
    label_base = new JLabel("R:   "+slider_red1.getValue()+"  G:   "+slider_gre1.getValue()+"  B:    "+   slider_blu1.getValue());
    finestraControlli2.getContentPane().add(label_base);
    finestraControlli2.getContentPane().add(slider_red1);
    finestraControlli2.getContentPane().add(slider_gre1);
    finestraControlli2.getContentPane().add(slider_blu1);
    finestraControlli2.getContentPane().add(label_colorirgb2);
    slider_red2= new JSlider(0,255,10);
    slider_gre2= new JSlider(0,255,10);
    slider_blu2= new JSlider(0,255,10);
    label_tratto =  new JLabel("R:   "+slider_red2.getValue()+"  G:   "+slider_gre2.getValue()+"  B:    "+    slider_blu2.getValue());
    finestraControlli2.getContentPane().add(label_tratto);
    finestraControlli2.getContentPane().add(slider_red2);
    finestraControlli2.getContentPane().add(slider_gre2);
    finestraControlli2.getContentPane().add(slider_blu2);
    finestraControlli2.getContentPane().add(label_colorirgb3);
    slider_red3= new JSlider(0,255,10);
    slider_gre3= new JSlider(0,255,10);
    slider_blu3= new JSlider(0,255,10);
    label_riempimento = new JLabel("R:   "+slider_red3.getValue()+"  G:   "+slider_gre3.getValue()+"  B:    "+    slider_blu3.getValue());
    finestraControlli2.getContentPane().add(label_riempimento);
    finestraControlli2.getContentPane().add(slider_red3);
    finestraControlli2.getContentPane().add(slider_gre3);
    finestraControlli2.getContentPane().add(slider_blu3);
    finestraControlli2.setVisible(true);
    finestradis.setTitle("Numero di paint");
    finestradis.setSize(150,150);
    finestradis.setLocation(500,300);
    finestradis.getContentPane().add(label_numpaint);
    finestradis.setResizable(false);
    finestradis.setVisible(true);



    //Ascoltatore per il bottone di OK della modifica del testo
    bottone_testo.addActionListener(new ActionListener(){public void
          actionPerformed(ActionEvent a){
        testo = area_testo.getText();
       setComposition(build());
       }});

    //Ascoltatore Slider per il rosso del colore di sfondo
    slider_red.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	Coloresfondo = new Color(slider_red.getValue(),slider_gre.getValue(),slider_blu.getValue());
        setComposition(build());
        label_sfondo.setText("R:   "+slider_red.getValue()+"  G:   "+slider_gre.getValue()+"  B:  "+slider_blu.getValue());
            	}});

    //Ascoltatore Slider per il verde del colore di sfondo
    slider_gre.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	Coloresfondo = new Color(slider_red.getValue(),slider_gre.getValue(),slider_blu.getValue());
        setComposition(build());
        label_sfondo.setText("R:   " +slider_red.getValue() + "  G:   " +slider_gre.getValue()+"  B:  "+slider_blu.getValue());

    	}});

     //Ascoltatore Slider per il blu del colore di sfondo
     slider_blu.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	Coloresfondo = new Color(slider_red.getValue(),slider_gre.getValue(),slider_blu.getValue());
        setComposition(build());
    label_sfondo.setText("R:   "+slider_red.getValue()+"  G:   "+slider_gre.getValue()+"  B:  "+slider_blu.getValue());


        }});

      //Ascoltatore Slider per il rosso del colore di base
      slider_red1.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreDiBase = new Color(slider_red1.getValue(),slider_gre1.getValue(),
            slider_blu1.getValue());
        setComposition(build());
        label_base.setText("R:   "+slider_red1.getValue()+"  G:   "+slider_gre1.getValue()+"  B:   "+slider_blu1.getValue());

    	}});

      //Ascoltatore Slider per il verde del colore di base
    slider_gre1.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreDiBase = new Color(slider_red1.getValue(),slider_gre1.getValue(),
            slider_blu1.getValue());
        setComposition(build());
        label_base.setText("R:   "+slider_red1.getValue()+"  G:   "+slider_gre1.getValue()+"  B:   "+slider_blu1.getValue());
       }});

      //Ascoltatore Slider per il blu del colore di base
     slider_blu1.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreDiBase = new Color(slider_red1.getValue(),slider_gre1.getValue(),
            slider_blu1.getValue());
        setComposition(build());
    	label_base.setText("R:   "+slider_red1.getValue()+"  G:   "+slider_gre1.getValue()+"  B:   "+slider_blu1.getValue());

            }});
      //Ascoltatore Slider per il rosso del colore del tratto
     slider_red2.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreTratto = new Color(slider_red2.getValue(),slider_gre2.getValue(),
            slider_blu2.getValue());
        setComposition(build());
        label_tratto.setText("R:   "+slider_red2.getValue()+"  G:   "+slider_gre2.getValue()+"  B:   "+ slider_blu2.getValue());

    	}});

      //Ascoltatore Slider per il verde del colore del tratto
    slider_gre2.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreTratto = new Color(slider_red2.getValue(),slider_gre2.getValue(),
            slider_blu2.getValue());
        setComposition(build());
         label_tratto.setText("R:   "+slider_red2.getValue()+"  G:   "+slider_gre2.getValue()+"  B:   "+ slider_blu2.getValue());

    	}});

        //Ascoltatore Slider per il blu del colore del tratto
    slider_blu2.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreTratto = new Color(slider_red2.getValue(),slider_gre2.getValue(),
            slider_blu2.getValue());
        setComposition(build());
    	 label_tratto.setText("R:   "+slider_red2.getValue()+"  G:   "+slider_gre2.getValue()+"  B:   "+ slider_blu2.getValue());

            }});

       //Ascoltatore Slider per il rosso del colore di riepimento
    slider_red3.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreRiempimento = new Color(slider_red3.getValue(),slider_gre3.getValue(),
            slider_blu3.getValue());
        setComposition(build());
         label_riempimento.setText("R:   "+slider_red3.getValue()+"  G:   "+slider_gre3.getValue()+"  B:   "+ slider_blu3.getValue());

       }});
       //Ascoltatore Slider per il verde del colore di riempimento
    slider_gre3.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreRiempimento = new Color(slider_red3.getValue(),slider_gre3.getValue(),
            slider_blu3.getValue());
        setComposition(build());
    	   label_riempimento.setText("R:   "+slider_red3.getValue()+"  G:   "+slider_gre3.getValue()+"  B:   "+ slider_blu3.getValue());

      }});
       //Ascoltatore Slider per il blu del colore di riempimento
     slider_blu3.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){
    	ColoreRiempimento  = new Color(slider_red3.getValue(),slider_gre3.getValue(),
            slider_blu3.getValue());
        setComposition(build());
             label_riempimento.setText("R:   "+slider_red3.getValue()+"  G:   "+slider_gre3.getValue()+"  B:   "+ slider_blu3.getValue());

    	}});



      setComposition(build());

	}


	public void setComposition(Composition cmp)
	{
		// aggiorno la composition corrente ogni volta che cambio i valori di un oggetto
		ComposizioneCorrente = build();
		// richiamo il repaint per aggiornare l'immagine
		repaint();
                label_numpaint.setText("Hai disegnato " +numeropaint+ " volte ");
	}
       int numeropaint= 0;
	public void paint(Graphics g)
	{
		// creo un graphics2D che utilizzo nella composition per fargli disegnare il suo contenuto
		Graphics2D g2 = (Graphics2D)g;
		// richiamo il paint della composition per disegnare sul Graphics2D selezionato
		if(numeropaint!=0){
                ComposizioneCorrente.paint(g2);
	 }

         numeropaint++;
        }

 public static void main(String args[]){
  	FioriTesto ft = new FioriTesto("Fiore");
  }
}
