/*
** 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.Dimension;
import java.awt.Image;
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.beans.PropertyVetoException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Enumeration;
import java.util.Observable;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import filius.Main;
import filius.software.lokal.FileExplorer;
import filius.software.system.Datei;
import filius.software.system.Dateisystem;
public class GUIApplicationFileExplorerWindow extends GUIApplicationWindow {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel backPanel;
private JTree tv;
private DefaultMutableTreeNode aktuellerOrdner;
private JList dateiListe;
private GUIApplicationFileExplorerWindow dies;
private DefaultMutableTreeNode selektierteNode, zwischenAblageNode;
private JButton btImportieren;
private String datei, pfad;
private JInternalFrame fileImportFrame;
public GUIApplicationFileExplorerWindow(final GUIDesktopPanel desktop,
String appName) {
super(desktop, appName);
this.dies = this;
aktuellerOrdner = holeAnwendung().getSystemSoftware().getDateisystem()
.getRoot();
initialisiereKomponenten();
}
private void initialisiereKomponenten() {
backPanel = new JPanel(new BorderLayout());
tv = new JTree(aktuellerOrdner);
tv.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tv
.getLastSelectedPathComponent();
if (node == null)
return;
aktuellerOrdner = node;
ordnerInhaltAnzeigen(node);
}
});
ImageIcon dateiIcon = new ImageIcon(getClass().getResource("/gfx/desktop/datei.png"));
ImageIcon ordnerIcon = new ImageIcon(getClass().getResource("/gfx/desktop/ordner.png"));
tv.setBounds(0, 0, 150, 100);
tv.setCellRenderer(new GUITreeRenderer(dateiIcon, ordnerIcon));
final Box box = Box.createVerticalBox();
box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JButton aktualisieren = new JButton(messages
.getString("fileexplorer_msg1"));
aktualisieren.setActionCommand("aktualisieren");
aktualisieren.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(
aktualisieren.getActionCommand())) {
aktualisieren();
}
}
});
box.add(aktualisieren);
box.add(Box.createVerticalStrut(5));
btImportieren = new JButton(messages.getString("fileexplorer_msg2"));
btImportieren.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fileImport();
}
});
box.add(btImportieren);
JScrollPane scrollpane = new JScrollPane(tv);
Box horBox = Box.createHorizontalBox();
horBox.add(scrollpane);
horBox.setPreferredSize(new Dimension(180, 240));
DefaultListModel lmDateiListe = new DefaultListModel();
dateiListe = new JList(lmDateiListe);
dateiListe.setFixedCellHeight(16);
JScrollPane dateiListenScrollPane = new JScrollPane(dateiListe);
horBox.add(dateiListenScrollPane);
dateiListe.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
/* Rechte Maustaste (Einmal geklickt) */
if (e.getButton() == 3) {
if (aktuellerOrdner != null) {
int index = ((JList) e.getSource()).locationToIndex(e
.getPoint());
DefaultListModel lm = (DefaultListModel) dateiListe
.getModel();
int selektiert = selektierteZelle(index, e.getPoint());
JPopupMenu popmen = new JPopupMenu();
final JMenuItem miNeuerOrdner = new JMenuItem(messages
.getString("fileexplorer_msg3"));
miNeuerOrdner.setActionCommand("neuerordner");
final JMenuItem miLoeschen = new JMenuItem(messages
.getString("fileexplorer_msg4"));
miLoeschen.setActionCommand("loeschen");
final JMenuItem miAusschneiden = new JMenuItem(messages
.getString("fileexplorer_msg5"));
miAusschneiden.setActionCommand("ausschneiden");
final JMenuItem miKopieren = new JMenuItem(messages
.getString("fileexplorer_msg6"));
miKopieren.setActionCommand("kopieren");
final JMenuItem miEinfuegen = new JMenuItem(messages
.getString("fileexplorer_msg7"));
miEinfuegen.setActionCommand("einfuegen");
final JMenuItem miUmbenennen = new JMenuItem(messages
.getString("fileexplorer_msg8"));
miUmbenennen.setActionCommand("umbenennen");
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
/* Neuer Ordner */
if (e.getActionCommand().equals(
miNeuerOrdner.getActionCommand())) {
String ordnerName = JOptionPane
.showInputDialog("");
if (!ordnerName.equals("")) {
holeAnwendung().getSystemSoftware()
.getDateisystem()
.erstelleVerzeichnis(
aktuellerOrdner,
ordnerName);
aktualisieren();
}
}
/* Loeschen */
if (e.getActionCommand().equals(
miLoeschen.getActionCommand())) {
int loeschAbfrage = JOptionPane
.showConfirmDialog(
dies,
messages
.getString("fileexplorer_msg18"),
messages
.getString("fileexplorer_msg18"),
JOptionPane.YES_NO_OPTION);
if (loeschAbfrage == JOptionPane.YES_OPTION) {
aktuellerOrdner.remove(selektierteNode);
aktualisieren();
}
}
/* Ausschneiden */
if (e.getActionCommand().equals(
miAusschneiden.getActionCommand())) {
try {
zwischenAblageNode = tiefesKopieren(selektierteNode);
}
catch (IOException e1) {
e1.printStackTrace(Main.debug);
}
catch (ClassNotFoundException e1) {
e1.printStackTrace(Main.debug);
}
aktuellerOrdner.remove(selektierteNode);
aktualisieren();
}
/* Kopieren */
if (e.getActionCommand().equals(
miKopieren.getActionCommand())) {
try {
zwischenAblageNode = tiefesKopieren(selektierteNode);
}
catch (IOException e1) {
e1.printStackTrace(Main.debug);
}
catch (ClassNotFoundException e1) {
e1.printStackTrace(Main.debug);
}
aktualisieren();
}
/* Einfuegen */
if (e.getActionCommand().equals(
miEinfuegen.getActionCommand())) {
aktuellerOrdner.add(zwischenAblageNode);
aktualisieren();
}
/* Umbenennen */
if (e.getActionCommand().equals(
miUmbenennen.getActionCommand())) {
String neuerName = JOptionPane
.showInputDialog(
dies,
messages
.getString("fileexplorer_msg9"));
if (neuerName != "" && neuerName != null) {
if (!holeAnwendung()
.getSystemSoftware()
.getDateisystem()
.dateiVorhanden(
aktuellerOrdner,
neuerName)) {
if (selektierteNode.getUserObject()
.getClass().equals(
Datei.class)) {
/* Datei umbenennen */
Datei dat = (Datei) selektierteNode
.getUserObject();
dat.setName(neuerName);
}
else {
/* Ordner umbenennen */
selektierteNode
.setUserObject(neuerName);
}
aktualisieren();
}
}
}
}
};
miNeuerOrdner.addActionListener(al);
miLoeschen.addActionListener(al);
miAusschneiden.addActionListener(al);
miKopieren.addActionListener(al);
miEinfuegen.addActionListener(al);
miUmbenennen.addActionListener(al);
/*
* Neuer Ordner kann nur angelegt werden, wenn kein
* Eintrag selektiert ist
*/
if (selektiert == -1) {
popmen.add(miNeuerOrdner);
if (zwischenAblageNode != null) {
popmen.add(miEinfuegen);
}
;
}
else {
String[] teile = lm.getElementAt(index).toString()
.split(";");
if (teile.length > 0) {
selektierteNode = Dateisystem
.verzeichnisKnoten(aktuellerOrdner,
teile[1]);
}
popmen.add(miLoeschen);
popmen.add(miAusschneiden);
popmen.add(miKopieren);
popmen.add(miUmbenennen);
}
dies.add(popmen);
popmen.show(dies.getRootPane().getLayeredPane(), e
.getX()
+ tv.getWidth(), e.getY()
+ btImportieren.getY()
+ btImportieren.getHeight());
}
}
}
});
box.add(horBox);
backPanel.add(box, BorderLayout.CENTER);
ordnerInhaltAnzeigen(aktuellerOrdner);
this.getContentPane().add(backPanel);
pack();
}
/**
* 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) dateiListe.getModel();
lm.clear();
dateiListe.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(messages.getString("fileexplorer_msg10")
+ dat.getName());
}
else {
lm.addElement(messages.getString("fileexplorer_msg11")
+ enode.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 (dateiListe.indexToLocation(index) != null) {
if (dateiListe.indexToLocation(index).getY()
+ dateiListe.getFixedCellHeight() > punkt.getY()) {
ergebnis = index;
}
}
return ergebnis;
}
public void aktualisieren() {
tv.updateUI();
ordnerInhaltAnzeigen(aktuellerOrdner);
}
/**
* Da bei clone() nur das Objekt und nicht seine Referenzen kopiert werden,
* wird fuer DefaultMutableTreeNode Tiefes Kopieren gebraucht, um z.B. bei
* einem Ordner die komplette eingeschlossene Struktur zu erhalten
*/
public DefaultMutableTreeNode tiefesKopieren(DefaultMutableTreeNode original)
throws IOException, ClassNotFoundException {
DefaultMutableTreeNode ergebnis = null;
// ObjectOutputStream erzeugen
ByteArrayOutputStream bufOutStream = new ByteArrayOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(bufOutStream);
// Objekt im byte-Array speichern
outStream.writeObject(original);
outStream.close();
// Pufferinhalt abrufen
byte[] buffer = bufOutStream.toByteArray();
// ObjectInputStream erzeugen
ByteArrayInputStream bufInStream = new ByteArrayInputStream(buffer);
ObjectInputStream inStream = new ObjectInputStream(bufInStream);
// Objekt wieder auslesen
ergebnis = (DefaultMutableTreeNode) inStream.readObject();
return ergebnis;
}
public void fileImport() {
fileImportFrame = new JInternalFrame(messages
.getString("fileexplorer_msg12"));
ImageIcon image = new ImageIcon(getClass().getResource("/gfx/desktop/icon_fileimporter.png"));
image.setImage(image.getImage().getScaledInstance(16, 16, Image.SCALE_AREA_AVERAGING));
setFrameIcon(image);
backPanel = new JPanel(new BorderLayout());
final JTextArea outputField = new JTextArea("");
outputField.setEditable(false);
outputField.setSize(new Dimension(300, 80));
JLabel fileLabel = new JLabel(messages.getString("fileexplorer_msg13"));
final JTextField inputField = new JTextField("");
inputField.setSize(new Dimension(150, 30));
inputField.setEditable(false);
final JTextField renameField = new JTextField("");
renameField.setSize(new Dimension(150, 30));
JLabel renameLabel = new JLabel(messages.getString("fileexplorer_msg9"));
JButton fileButton = new JButton(messages
.getString("fileexplorer_msg14"));
fileButton.setSize(new Dimension(100, 30));
fileButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
JFileChooser fc = new JFileChooser();
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
datei = fc.getSelectedFile().getName();
pfad = fc.getSelectedFile().getParent();
if (!pfad.endsWith(System.getProperty("file.separator")))
pfad += System.getProperty("file.separator");
}
if (datei != null) {
inputField.setText(pfad + datei);
renameField.setText(datei);
}
try {
fileImportFrame.setSelected(true);
}
catch (PropertyVetoException e1) {
e1.printStackTrace(Main.debug);
}
}
});
Box importBox = Box.createHorizontalBox();
importBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
importBox.add(fileLabel);
importBox.add(Box.createHorizontalStrut(5));
importBox.add(inputField);
importBox.add(Box.createHorizontalStrut(5));
importBox.add(fileButton);
Box middleBox = Box.createHorizontalBox();
middleBox.add(renameLabel);
middleBox.add(Box.createHorizontalStrut(5));
middleBox.add(renameField);
middleBox.add(Box.createHorizontalStrut(5));
Box upperBox = Box.createVerticalBox();
upperBox.add(importBox);
upperBox.add(middleBox);
backPanel.add(upperBox, BorderLayout.NORTH);
JButton importButton = new JButton(messages
.getString("fileexplorer_msg15"));
importButton.setSize(new Dimension(100, 30));
importButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent z) {
if (inputField.getText().equals("")
|| renameField.getText().equals("")) {
outputField.setText(messages
.getString("fileexplorer_msg16"));
}
else {
if (aktuellerOrdner == null) {
outputField.setText(messages
.getString("fileexplorer_msg17"));
}
else {
// if (inputField.getText().equals(pfad + datei)
// && datei.equals(renameField.getText())) {
outputField.setText(((FileExplorer) holeAnwendung()).addFile(pfad, datei,
aktuellerOrdner,
renameField.getText()));
aktualisieren();
// }
// else if (inputField.getText().equals(pfad + datei)
// && !renameField.getText().equals("")) {
// outputField
// .setText(((FileExplorer) holeAnwendung())
// .addFile(outputField.getText(), "",
// aktuellerOrdner,
// renameField.getText()));
// aktualisieren();
// }
}
}
}
});
Box lowerBox = Box.createHorizontalBox();
lowerBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
lowerBox.add(importButton);
backPanel.add(outputField, BorderLayout.CENTER);
backPanel.add(lowerBox, BorderLayout.SOUTH);
fileImportFrame.getContentPane().add(backPanel);
fileImportFrame.setClosable(true);
fileImportFrame.setResizable(false);
fileImportFrame.setBounds(30, 80, 350, 200);
fileImportFrame.setVisible(true);
addFrame(fileImportFrame);
try {
fileImportFrame.setSelected(true);
}
catch (PropertyVetoException e1) {
e1.printStackTrace(Main.debug);
}
}
public void update(Observable arg0, Object arg1) {
}
}