/*
** 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;
}
}