/*
 ** This file is part of Filius, a network construction and simulation software.
 ** 
 ** Originally created at the University of Siegen, Institute "Didactics of
 ** Informatics and E-Learning" by a students' project group:
 **     members (2006-2007): 
 **         André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
 **         Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
 **     supervisors:
 **         Stefan Freischlad (maintainer until 2009), Peer Stechert
 ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
 **         and Stefan Freischlad
 ** Filius is free software: you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** the Free Software Foundation, either version 2 of the License, or
 ** (at your option) version 3.
 ** 
 ** Filius is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied
 ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 ** PURPOSE. See the GNU General Public License for more details.
 ** 
 ** You should have received a copy of the GNU General Public License
 ** along with Filius.  If not, see <http://www.gnu.org/licenses/>.
 */
package filius.gui.anwendungssicht;

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Enumeration;

import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.tree.DefaultMutableTreeNode;

import filius.gui.JMainFrame;
import filius.rahmenprogramm.I18n;
import filius.software.system.Betriebssystem;
import filius.software.system.Datei;
import filius.software.system.Dateisystem;

public class DMTNFileChooser implements I18n {

    private JPanel pHaupt;
    private JList lVerzeichnisse;
    private DefaultMutableTreeNode aktuellerOrdner;
    private String aktuellerDateiname;
    private JButton btEbeneHoch;
    private JTextField tfDateiname;
    private JLabel lbDateiname, lbAktuellerOrdner;
    private JButton btAktion, btAbbrechen;
    private Betriebssystem betriebssystem;
    private int rueckgabe = 0;
    private JDialog dialog;

    public static final int OK = 1;
    public static final int CANCEL = 2;

    public DMTNFileChooser(Betriebssystem bs) {
        dialog = new JDialog();
        dialog.setIconImage(JMainFrame.getJMainFrame().getIconImage());

        this.betriebssystem = bs;
        this.aktuellerOrdner = betriebssystem.getDateisystem().getRoot();
        pHaupt = new JPanel(new BorderLayout());
        Box boxHaupt = Box.createVerticalBox();
        Box tmpBox = Box.createHorizontalBox();
        tmpBox.add(Box.createHorizontalStrut(5));

        lbAktuellerOrdner = new JLabel(aktuellerOrdner.toString());
        lbAktuellerOrdner.setHorizontalAlignment(JLabel.LEFT);

        boxHaupt.add(Box.createVerticalStrut(10));
        tmpBox.add(lbAktuellerOrdner);

        tmpBox.add(Box.createHorizontalStrut(20));
        btEbeneHoch = new JButton(messages.getString("dmtnfilechooser_msg1"));
        btEbeneHoch.setActionCommand("ebeneHoch");
        btEbeneHoch.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(btEbeneHoch.getActionCommand())) {
                    if (aktuellerOrdner.getParent() != null) {
                        aktuellerOrdner = (DefaultMutableTreeNode) aktuellerOrdner.getParent();

                        ordnerInhaltAnzeigen(aktuellerOrdner);

                    }

                }
            }
        });
        tmpBox.add(Box.createHorizontalStrut(5));
        tmpBox.add(btEbeneHoch);
        boxHaupt.add(Box.createVerticalStrut(10));
        boxHaupt.add(tmpBox);

        DefaultListModel lmDateiListe = new DefaultListModel();
        lVerzeichnisse = new JList(lmDateiListe);
        lVerzeichnisse.setFixedCellHeight(16);
        JScrollPane dateiListenScrollPane = new JScrollPane(lVerzeichnisse);
        boxHaupt.add(Box.createVerticalStrut(10));
        boxHaupt.add(dateiListenScrollPane);

        lVerzeichnisse.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                /* Doppelklick (Linke Maustaste) */
                if (e.getClickCount() == 2 && e.getButton() == 1) {
                    int index = ((JList) e.getSource()).locationToIndex(e.getPoint());

                    DefaultListModel lm = (DefaultListModel) lVerzeichnisse.getModel();
                    int selektiert = selektierteZelle(index, e.getPoint());
                    if (selektiert > -1) {
                        String[] teile = lm.getElementAt(index).toString().split(";");
                        if (teile.length > 0) {
                            if (teile[0].equals("Ordner")) {
                                DefaultMutableTreeNode ordnerNode = Dateisystem.verzeichnisKnoten(aktuellerOrdner,
                                        teile[1]);
                                aktuellerOrdner = ordnerNode;
                                ordnerInhaltAnzeigen(ordnerNode);
                            }
                            if (teile[0].equals("Datei")) {
                                Datei datei = betriebssystem.getDateisystem().holeDatei(aktuellerOrdner, teile[1]);
                                tfDateiname.setText(datei.getName());
                            }

                        }
                    }
                }
            }
        });
        Box boxDateiname = Box.createHorizontalBox();
        lbDateiname = new JLabel(messages.getString("dmtnfilechooser_msg2"));
        boxDateiname.add(lbDateiname);
        tfDateiname = new JTextField();
        boxDateiname.add(Box.createHorizontalStrut(5));
        boxDateiname.add(tfDateiname);
        boxHaupt.add(Box.createVerticalStrut(10));
        boxHaupt.add(boxDateiname);

        Box boxButtons = Box.createHorizontalBox();
        btAktion = new JButton(messages.getString("dmtnfilechooser_msg3"));
        btAbbrechen = new JButton(messages.getString("dmtnfilechooser_msg4"));
        btAbbrechen.setActionCommand("cancel");
        boxButtons.add(Box.createHorizontalStrut(5));
        boxButtons.add(btAktion);
        boxButtons.add(Box.createHorizontalStrut(5));
        boxButtons.add(btAbbrechen);
        boxHaupt.add(Box.createVerticalStrut(10));
        boxHaupt.add(boxButtons);
        boxHaupt.add(Box.createVerticalStrut(10));

        btAbbrechen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(btAbbrechen.getActionCommand())) {
                    rueckgabe = CANCEL;
                    dialog.setVisible(false);
                    dialog.dispose();

                }
            }
        });

        pHaupt.add(boxHaupt, BorderLayout.CENTER);
        dialog.setModal(true);
        dialog.setBounds(100, 100, 320, 240);
        dialog.add(pHaupt);

    }

    public int saveDialog() {
        dialog.setTitle(messages.getString("dmtnfilechooser_msg5"));
        btAktion.setText(messages.getString("dmtnfilechooser_msg6"));
        btAktion.setActionCommand("save");
        btAktion.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(btAktion.getActionCommand())) {
                    rueckgabe = OK;
                    aktuellerDateiname = tfDateiname.getText();
                    dialog.setVisible(false);
                    dialog.dispose();
                }
            }
        });
        ordnerInhaltAnzeigen(aktuellerOrdner);
        dialog.setVisible(true);
        return rueckgabe;
    }

    public int openDialog() {
        dialog.setTitle(messages.getString("dmtnfilechooser_msg7"));
        btAktion.setText(messages.getString("dmtnfilechooser_msg8"));
        btAktion.setActionCommand("open");
        btAktion.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(btAktion.getActionCommand())) {
                    rueckgabe = OK;
                    aktuellerDateiname = tfDateiname.getText();
                    dialog.setVisible(false);
                    dialog.dispose();
                }
            }
        });
        ordnerInhaltAnzeigen(aktuellerOrdner);
        dialog.setVisible(true);
        return rueckgabe;
    }

    public DefaultMutableTreeNode getAktuellerOrdner() {
        return aktuellerOrdner;
    }

    public void setAktuellerOrdner(DefaultMutableTreeNode aktuellerOrdner) {
        this.aktuellerOrdner = aktuellerOrdner;
    }

    /**
     * Fuegt den Inhalt einer DefaultMutableTreeNode in ListModel der dateiListe ein. Um im CellRenderer zwischen
     * Dateien und Ordnern unterscheiden zu koennen, wird der Typ (Datei/Ordner) gefolgt von einem Semicolon angegeben.
     * 
     * @param node
     *            Die DefaultMutableTreeNode deren Inhalt angezeigt werden soll.
     */
    public void ordnerInhaltAnzeigen(DefaultMutableTreeNode node) {
        DefaultListModel lm = (DefaultListModel) lVerzeichnisse.getModel();
        lm.clear();

        lVerzeichnisse.setCellRenderer(new OrdnerInhaltListRenderer());
        for (Enumeration e = node.children(); e.hasMoreElements();) {
            DefaultMutableTreeNode enode = (DefaultMutableTreeNode) e.nextElement();
            if (enode.getUserObject().getClass().equals(Datei.class)) {
                Datei dat = (Datei) enode.getUserObject();
                lm.addElement("Datei;" + dat.getName());
            } else {
                lm.addElement("Ordner;" + enode.toString());
            }
        }
        lbAktuellerOrdner.setText(messages.getString("dmtnfilechooser_msg11") + " " + aktuellerOrdner.toString());
    }

    /**
     * Ueberprueft ob eine (per locationToIndex) ermittelte Zelle wirklich geklickt wurde Das ist noetig, weil im
     * leeren, unteren Teil der JList automatisch der unterste Index zurueckgegeben wird.
     */
    public int selektierteZelle(int index, Point punkt) {
        int ergebnis = -1;
        if (lVerzeichnisse.indexToLocation(index) != null) {
            if (lVerzeichnisse.indexToLocation(index).getY() + lVerzeichnisse.getFixedCellHeight() > punkt.getY()) {
                ergebnis = index;
            }
        }
        return ergebnis;
    }

    public String getAktuellerDateiname() {
        return aktuellerDateiname;
    }

    public void setAktuellerDateiname(String aktuellerDateiname) {
        this.aktuellerDateiname = aktuellerDateiname;
    }
}
