// (by Dalubar)

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

// solito frame...
class myFrame extends JFrame {
    //dimensioni schermo
    Dimension dScreen = Toolkit.getDefaultToolkit().getScreenSize();
    // costruttore: prende come parametro la stringa da visualizzare
    public myFrame() {
        setTitle("Text scrolling... (by Dalubar)");
        setSize(dScreen.width/2, dScreen.height/4);
        setLocation((dScreen.width - getSize().width) / 2,
                    (dScreen.height - getSize().height) / 2);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // crea e inserisce pannello nel frame
        JPanel main = new myPanel();
        getContentPane().add(main);
        
        //aggiunge menu...
        new menuScrollingText(this);
    }
}

class myPanel extends JPanel implements ActionListener {
    String msg; Timer tick; FontMetrics fmt;
    int i, lower;
    Color textColor = Color.BLACK;
    boolean flag;
    JPanel commandPanel, userPanel;

    
    // costruttore...
    public myPanel() {
        msg = "";
        // crea e avvia un timer (un "tick" ogni 10 ms)
        tick = new Timer(10, this);
        tick.start();

        /* creazione interfaccia utente:
           Creazione di due pannelli: uno a NORTH e uno a SOUTH
           NORTH: pannello "userPanel" formato da una "label" e una casella di testo.
           Gestore layout: FlowLayout.
           SOUTH: pannello "commandPanel" formato da 5 radio + 1 bottone
           Gestore layout: BorderLayout.
        */
        
        //crea pannello per interfaccia utente e componenti
        userPanel = new JPanel();
        JLabel lbNome = new JLabel("Digita testo");
        final JTextField txNome = new JTextField(25);
        JButton btSampleFrase = new JButton("Frase di esempio");
        //setta manager di layout x il pannello e inserisce componenti
        userPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        userPanel.add(lbNome); userPanel.add(txNome); userPanel.add(btSampleFrase);
        //inserisce bordo nel pannello
        userPanel.setBorder(BorderFactory.createRaisedBevelBorder());
        
        
        // crea pannello "sud"
        ButtonGroup bg = new ButtonGroup();
        commandPanel = new JPanel();
        JLabel lbColori = new JLabel("Colori");
        lbColori.setFont(new Font("Arial", Font.PLAIN, 20));
        commandPanel.add(lbColori);
        addRadio("Nero", bg, Color.BLACK);
        addRadio("Rosso", bg, Color.RED);
        addRadio("Giallo", bg, Color.YELLOW);
        addRadio("Magenta", bg, Color.MAGENTA);
        addRadio("Blu", bg, Color.BLUE);
        addButton("Random", null);
        //setta manager di layout x il pannello e inserisce componenti
        commandPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        //inserisce bordo nel pannello
        commandPanel.setBorder(BorderFactory.createRaisedBevelBorder());
    
        //INSERISCE PANNELLI NEL "JPANEL" CORRENTE
        // setta manager di layout x il pannello principale
        setLayout(new BorderLayout());
        // aggiunge i pannelli in posizione "nord" e "sud"
        add(userPanel, BorderLayout.NORTH);
        add(commandPanel, BorderLayout.SOUTH);

        // classe anonima annidata x rilevare pressioni dei tasti nella JTextField
        txNome.getDocument().addDocumentListener(new
            DocumentListener() {
                /* quando l'utente digita o cancella un tasto,
                   aggiorno il testo da visualizzare e ricalcolo
                   la lunchezza in pixel della stringa
                */
                public void insertUpdate(DocumentEvent e) {
                    msg = txNome.getText();
                    lower = fmt.stringWidth(msg);
                }
    
                public void removeUpdate(DocumentEvent e) {
                    msg = txNome.getText();
                    lower = fmt.stringWidth(msg);
                }
                
                public void changedUpdate(DocumentEvent e) {}
            }
        );            
        
        btSampleFrase.addActionListener( new
            ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //svuota casella di testo
                    txNome.setText("");
                    //imposta messaggio
                    msg = "Chiare, fresche et dolci acque, " +
                        "ove le belle membra " +
                        "pose colei che sola a me par donna; " +
                        "gentil ramo ove piacque  " +
                        "(con sospir' mi rimembra)  " +
                        "a lei di fare al bel fiancho colonna;  " +
                        "herba et fior' che la gonna  " +
                        "leggiadra ricoverse  " +
                        "co l'angelico seno;  " +
                        "aere sacro, sereno,  " +
                        "ove Amor co' begli occhi il cor m'aperse:  " +
                        "date udïenza insieme  " +
                        "a le dolenti mie parole extreme.  " +
                        "S'egli è pur mio destino  " +
                        "e 'l cielo in ciò s'adopra,  " +
                        "ch'Amor quest'occhi lagrimando chiuda,  " +
                        "qualche gratia il meschino  " +
                        "corpo fra voi ricopra,  " +
                        "et torni l'alma al proprio albergo ignuda.  " +
                        "La morte fia men cruda  " +
                        "se questa spene porto  " +
                        "a quel dubbioso passo: " +
                        "ché lo spirito lasso  " +
                        "non poria mai in piú riposato porto  " +
                        "né in piú tranquilla fossa  " +
                        "fuggir la carne travagliata et l'ossa.  " +
                        "Tempo verrà anchor forse  " +
                        "ch'a l'usato soggiorno  " +
                        "torni la fera bella et mansüeta,  " +
                        "et là 'v'ella mi scorse  " +
                        "nel benedetto giorno,  " +
                        "volga la vista disïosa et lieta,  " +
                        "cercandomi; et, o pietà!,  " +
                        "già terra in fra le pietre  " +
                        "vedendo, Amor l'inspiri  " +
                        "in guisa che sospiri  " +
                        "sí dolcemente che mercé m'impetre,  " +
                        "et faccia forza al cielo,  " +
                        "asciugandosi gli occhi col bel velo.  " +
                        "Da' be' rami scendea  " +
                        "(dolce ne la memoria)  " +
                        "una pioggia di fior' sovra 'l suo grembo;  " +
                        "et ella si sedea  " +
                        "humile in tanta gloria,  " +
                        "coverta già de l'amoroso nembo.  " +
                        "Qual fior cadea sul lembo,  " +
                        "qual su le treccie bionde,  " +
                        "ch'oro forbito et perle  " +
                        "eran quel dí a vederle;  " +
                        "qual si posava in terra, et qual su l'onde;  " +
                        "qual con un vago errore  " +
                        "girando parea dir: - Qui regna Amore. -  " +
                        "Quante volte diss'io  " +
                        "allor pien di spavento:  " +
                        "Costei per fermo nacque in paradiso.  " +
                        "Cosí carco d'oblio  " +
                        "il divin portamento  " +
                        "e 'l volto e le parole e 'l dolce riso  " +
                        "m'aveano, et sí diviso  " +
                        "da l'imagine vera,  " +
                        "ch'i' dicea sospirando:  " +
                        "Qui come venn'io, o quando?;  " +
                        "credendo d'esser in ciel, non là dov'era.  " +
                        "Da indi in qua mi piace  " +
                        "questa herba sí, ch'altrove non ò pace.  " +
                        "Se tu avessi ornamenti quant'ài voglia,  " +
                        "poresti arditamente  " +
                        "uscir del boscho, et gir in fra la gente. " +
                        "Francesco Petrarca, Canzoniere, CXXVI.";
                }
            }
        );
    }
    
    // metodo che aggiunge un bottone al pannello specificato
    private void addButton(String label, final Color colore) {
        JButton unBottone = new JButton(label);
        commandPanel.add(unBottone);
        unBottone.addActionListener( new
            ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (colore != null)
                        textColor = colore;
                    else
                        textColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
                }
            }
        );
    }


    // metodo che aggiunge un bottone radio al pannello specificato
    private void addRadio(String label, ButtonGroup gruppo, final Color colore) {
        JRadioButton unRadioBottone = new JRadioButton(label, false);
        gruppo.add(unRadioBottone);
        commandPanel.add(unRadioBottone);
        unRadioBottone.addActionListener( new
            ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    textColor = colore;
                }
            }
        );
    }
    
    public void actionPerformed(ActionEvent e) {
        // decrementa la posizione x del testo...
        i -= 2;
        if (i < -lower) flag = false;
        repaint();
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Font title = new Font("Arial black", Font.PLAIN, 28);
        if (!flag) {
            /* ogni volta che la scritta esce dal frame (a sx)
               calcola dimensione stringa in pixel.
            */
            fmt = g.getFontMetrics(title);
            lower = fmt.stringWidth(msg);
            i = getSize().width;
            flag = true;
        }
        g.setFont(title);
        g.setColor(textColor);
        g.drawString(msg, i, 80);
    }
}

class menuScrollingText {
    public menuScrollingText(JFrame frame) {
        //creazione barra menù
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);
        //menu File
        JMenu fileMenu = new JMenu("File");
        JMenuItem exit = fileMenu.add("Uscita");
        //menu ?
        JMenu helpMenu = new JMenu("?");
        JMenuItem help = helpMenu.add("Informazioni...");
        //inserimento menu nella barra del menu
        menuBar.add(fileMenu);
        menuBar.add(helpMenu);
        
        //rilevatori azione per menu
        exit.addActionListener(new
            ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            }
        );

        help.addActionListener(new
            ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null,
                        "Applicazione di esempio\n(by Dalubar)",
                        "Informazioni...",
                        JOptionPane.INFORMATION_MESSAGE
                    );
                }
            }
        );
            
    }
}

// classe "main" di avvio
public class scrollingText2 {
    public static void main(String[] args) {
        JFrame f = new myFrame();
        f.show();
    }
}