import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Container;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.BoxLayout;
import javax.swing.Box;

public class Digialbumi extends JFrame {
    private static String dirName = "C:/Java/Kuvat";
    private static String kuvaTekstiTiedosto = "C:/Java/kuvatekstit";
    private JButton edellinen, seuraava;
    private JPanel alaNapit;
    private Box yläPaneli;
    private JLabel kuva;
    private JLabel kuvaTiedot;
    private JTextField kuvaTeksti;
    private List tiedostot;
    private List tiedostoNimet;
    private List ikonit;
    private List kuvaTekstit;
    private int indeksi;
    private boolean luoKuvaTekstit;
    
    private void asetaKuva() {
	kuva.setIcon((ImageIcon)(ikonit.get(indeksi)));
	kuvaTiedot.setText("Kuva " + (indeksi+1) + "/" + tiedostoNimet.size()
			   + ": " + tiedostoNimet.get(indeksi));
	kuvaTeksti.setText((String)kuvaTekstit.get(indeksi));
    }

    private void talletaKuvaTekstit() {
	try {
	    ObjectOutputStream out =
		new ObjectOutputStream(new FileOutputStream(kuvaTekstiTiedosto));
	    out.writeObject(kuvaTekstit);
	    out.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    private void lueKuvaTekstit() {
	try {
	    ObjectInputStream in =
		new ObjectInputStream(new FileInputStream(kuvaTekstiTiedosto));
	    kuvaTekstit = (List)in.readObject();
	    luoKuvaTekstit = false;
	} catch (FileNotFoundException e) {
	    kuvaTekstit = new LinkedList();
	    luoKuvaTekstit = true;
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public Digialbumi(String name) {
	super(name);
	// Komponenttien luonti
	edellinen = new JButton("Edellinen");
	seuraava = new JButton("Seuraava");
	alaNapit = new JPanel();
	yläPaneli = new Box(BoxLayout.Y_AXIS);
	tiedostot = Arrays.asList((new File(dirName)).listFiles());
	ikonit = new LinkedList();
	tiedostoNimet = new LinkedList();
	Iterator it = tiedostot.iterator();
	int maksimiKorkeus = 0;
	int maksimiLeveys = 0;
	lueKuvaTekstit();
	while (it.hasNext()) {
	    String nimi = ((File)it.next()).getAbsolutePath();
	    ImageIcon ikoni = new ImageIcon(nimi);
	    tiedostoNimet.add(nimi);
	    ikonit.add(ikoni);
	    if (luoKuvaTekstit) {
		kuvaTekstit.add("");
	    }
	    if (ikoni.getIconHeight() > maksimiKorkeus) {
		maksimiKorkeus = ikoni.getIconHeight();
	    }
	    if (ikoni.getIconWidth() > maksimiLeveys) {
		maksimiLeveys = ikoni.getIconWidth();
	    }
	}
	System.out.println(ikonit);
	System.out.println(tiedostoNimet);
	indeksi = 0;
	kuva = new JLabel("", JLabel.CENTER);
	kuva.setMinimumSize(new Dimension(maksimiLeveys, maksimiKorkeus));
	kuva.setPreferredSize(new Dimension(maksimiLeveys, maksimiKorkeus));
	kuvaTiedot = new JLabel("", JLabel.CENTER);
	kuvaTeksti = new JTextField("", 30);
	asetaKuva();

	// Asettelu
	alaNapit.add(edellinen);
	alaNapit.add(seuraava);

	yläPaneli.add(Box.createRigidArea(new Dimension(0, 10)));
	yläPaneli.add(kuvaTiedot);
	kuvaTiedot.setAlignmentX(Component.CENTER_ALIGNMENT);
	yläPaneli.add(Box.createVerticalGlue());
	yläPaneli.add(kuvaTeksti);
	kuvaTeksti.setAlignmentX(Component.CENTER_ALIGNMENT);
	yläPaneli.add(Box.createRigidArea(new Dimension(0, 10)));

	Container contentPane = getContentPane();
	contentPane.add(yläPaneli, BorderLayout.NORTH);
	contentPane.add(alaNapit, BorderLayout.SOUTH);
	contentPane.add(kuva, BorderLayout.CENTER);

	pack();
	setVisible(true);

	// Kuuntelijat
	edellinen.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    if (indeksi > 0) {
			indeksi--;
			asetaKuva();
		    }
		}
	    });
	seuraava.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    if (indeksi < tiedostot.size() - 1) {
			indeksi++;
			asetaKuva();
		    }
		}
	    });

	kuvaTeksti.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    kuvaTekstit.set(indeksi, kuvaTeksti.getText());
		    talletaKuvaTekstit();
		}
	    });

	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main (String[] args) {
	new Digialbumi("Albumi");
    }
}
