/*
** 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.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Observable;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import filius.software.email.Email;
import filius.software.system.Betriebssystem;
import filius.software.system.Datei;
import filius.rahmenprogramm.EingabenUeberpruefung;
import filius.software.dateiaustausch.PeerToPeerAnwendung;
/**
* Diese Klasse ist die grafische Benutzungsoberflaeche fuer die Peer2Peer Anwendung.
*
* @author Johannes Bade & Thomas Gerding
*/
public class GUIApplicationPeerToPeerAnwendungWindow extends GUIApplicationWindow{
private static final long serialVersionUID = 1L;
private boolean pruefungOK = true;
private boolean zahlOK=true;
private JPanel mainPanel;
private JPanel networkPanel;
private JPanel searchPanel;
private JLabel networkIpLabel;
private JButton networkIpButton;
private JTextField networkIpField;
private JLabel searchLabel;
private JButton searchButton, downloadButton, stopSearchButton, emptyListButton;
private JTextField searchField;
private JTable netzwerkTabelle, ergebnisTabelle, dateiTabelle;
private JPanel filePanel;
private JLabel filePanelLabel;
private JLabel maxClientsLabel;
private JTextField maxClientsField;
private JPanel configPanel;
private JLabel tabHead;
public GUIApplicationPeerToPeerAnwendungWindow(final GUIDesktopPanel desktop, String appName) {
super(desktop, appName);
JTabbedPane tabbedPane = new JTabbedPane();
mainPanel = new JPanel(new BorderLayout());
networkPanel = new JPanel(new BorderLayout());
networkIpLabel = new JLabel(messages.getString("peertopeeranwendung_msg1"));
networkIpButton = new JButton(messages.getString("peertopeeranwendung_msg2"));
networkIpButton.setToolTipText(messages.getString("peertopeeranwendung_msg3"));
tabHead = new JLabel(messages.getString("peertopeeranwendung_msg4"));
networkIpField = new JTextField("192.168.0.1");
networkIpField.addKeyListener(new KeyAdapter()
{
public void keyReleased(KeyEvent e)
{
ipPruefen(networkIpField);
}
});
networkIpButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
/*
* Ueberprueft ob es sich ueberhaupt um eine korrekt aufgebaute IP handelt
* und verhindert das Hinzufuegen ggf.
*/
if(pruefungOK == true)
{
((PeerToPeerAnwendung)holeAnwendung()).beitretenNetzwerk(networkIpField.getText());
}
else
{
JOptionPane.showMessageDialog(desktop, messages.getString("peertopeeranwendung_msg5"));
}
}
}});
DefaultTableModel neuesTabellenModell = new DefaultTableModel(0, 2);
netzwerkTabelle = new JTable(neuesTabellenModell);
// Add a mouse listener to the table
netzwerkTabelle.setEnabled(false);
netzwerkTabelle.setIntercellSpacing(new Dimension(10,10));
netzwerkTabelle.setRowHeight(30);
netzwerkTabelle.setShowGrid(false);
netzwerkTabelle.setFillsViewportHeight(true);
netzwerkTabelle.setBackground(Color.WHITE);
netzwerkTabelle.setShowHorizontalLines(true);
TableColumnModel tcm = netzwerkTabelle.getColumnModel();
tcm.getColumn(0).setHeaderValue(messages.getString("peertopeeranwendung_msg6"));
tcm.getColumn(0).setPreferredWidth(20);
tcm.getColumn(1).setHeaderValue(messages.getString("peertopeeranwendung_msg7"));
tcm.getColumn(1).setPreferredWidth(300);
JScrollPane tabellenScrollPane = new JScrollPane(netzwerkTabelle);
neuesTabellenModell = new DefaultTableModel(0, 3);
ergebnisTabelle = new JTable(neuesTabellenModell);
ergebnisTabelle.setDragEnabled(false);
ergebnisTabelle.setIntercellSpacing(new Dimension(10,10));
ergebnisTabelle.setRowHeight(30);
ergebnisTabelle.setShowGrid(false);
ergebnisTabelle.setFillsViewportHeight(true);
ergebnisTabelle.setBackground(Color.WHITE);
ergebnisTabelle.setShowHorizontalLines(true);
ergebnisTabelle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tcm = ergebnisTabelle.getColumnModel();
tcm.getColumn(0).setHeaderValue(messages.getString("peertopeeranwendung_msg8"));
tcm.getColumn(0).setPreferredWidth(200);
tcm.getColumn(1).setHeaderValue(messages.getString("peertopeeranwendung_msg9"));
tcm.getColumn(1).setPreferredWidth(200);
tcm.getColumn(2).setHeaderValue(messages.getString("peertopeeranwendung_msg10"));
tcm.getColumn(2).setPreferredWidth(50);
JScrollPane tabellenScrollPaneErgebnis = new JScrollPane(ergebnisTabelle);
Box verticalTopBox = Box.createVerticalBox();
Box topBox = Box.createHorizontalBox();
topBox.add(networkIpLabel);
topBox.add(Box.createHorizontalStrut(5));
topBox.add(networkIpField);
topBox.add(Box.createHorizontalStrut(15));
topBox.add(networkIpButton);
topBox.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
Box labelBox = Box.createHorizontalBox();
labelBox.add(tabHead);
verticalTopBox.add(topBox);
verticalTopBox.add(Box.createVerticalStrut(5));
verticalTopBox.add(tabHead);
networkPanel.add(verticalTopBox, BorderLayout.NORTH);
networkPanel.add(tabellenScrollPane, BorderLayout.CENTER);
tabbedPane.addTab("Netzwerk", new ImageIcon(getClass().getResource("/gfx/desktop/peertopeer_netzwerk_klein.png")), networkPanel);
searchPanel = new JPanel(new BorderLayout());
searchLabel = new JLabel(messages.getString("peertopeeranwendung_msg11"));
searchField = new JTextField(messages.getString("peertopeeranwendung_msg12"));
searchButton = new JButton(messages.getString("peertopeeranwendung_msg13"));
searchButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
((PeerToPeerAnwendung)holeAnwendung()).sucheDatei(searchField.getText());
}
}});
stopSearchButton = new JButton(messages.getString("peertopeeranwendung_msg14"));
stopSearchButton.setToolTipText(messages.getString("peertopeeranwendung_msg15"));
stopSearchButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
((PeerToPeerAnwendung)holeAnwendung()).abbrechenSuche();
}
}});
emptyListButton = new JButton(messages.getString("peertopeeranwendung_msg16"));
emptyListButton.setToolTipText(messages.getString("peertopeeranwendung_msg17"));
emptyListButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
((PeerToPeerAnwendung)holeAnwendung()).loescheSuchergebnisse();
updateErgebnisTabelle();
}
}});
downloadButton = new JButton(messages.getString("peertopeeranwendung_msg18"));
downloadButton.setToolTipText(messages.getString("peertopeeranwendung_msg19"));
downloadButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
int zeilenNummer = ergebnisTabelle.getSelectedRow();
if (zeilenNummer > -1)
{
((PeerToPeerAnwendung)holeAnwendung()).herunterladenDatei(zeilenNummer);
}
}
}});
Box searchBox = Box.createHorizontalBox();
searchBox.add(searchLabel);
searchBox.add(Box.createHorizontalStrut(5));
searchBox.add(searchField);
searchBox.add(Box.createHorizontalStrut(5));
searchBox.add(searchButton);
searchBox.add(Box.createHorizontalStrut(2));
searchBox.add(stopSearchButton);
searchBox.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
Box downloadBox = Box.createHorizontalBox();
downloadBox.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
downloadBox.add(downloadButton);
downloadBox.add(Box.createHorizontalStrut(5));
downloadBox.add(emptyListButton);
searchPanel.add(searchBox, BorderLayout.NORTH);
searchPanel.add(tabellenScrollPaneErgebnis, BorderLayout.CENTER);
searchPanel.add(downloadBox, BorderLayout.SOUTH);
tabbedPane.addTab(messages.getString("peertopeeranwendung_msg20"), new ImageIcon(getClass().getResource("/gfx/desktop/peertopeer_suchen_klein.png")),searchPanel);
filePanel = new JPanel(new BorderLayout());
filePanelLabel = new JLabel(messages.getString("peertopeeranwendung_msg21"));
DefaultTableModel dateiTabellenModell = new DefaultTableModel(0, 2);
dateiTabelle = new JTable(dateiTabellenModell);
dateiTabelle.setDragEnabled(false);
dateiTabelle.setEnabled(false);
dateiTabelle.setIntercellSpacing(new Dimension(10,10));
dateiTabelle.setRowHeight(30);
dateiTabelle.setShowGrid(false);
dateiTabelle.setFillsViewportHeight(true);
dateiTabelle.setBackground(Color.WHITE);
dateiTabelle.setShowHorizontalLines(true);
tcm = dateiTabelle.getColumnModel();
tcm.getColumn(0).setHeaderValue(messages.getString("peertopeeranwendung_msg22"));
tcm.getColumn(0).setPreferredWidth(300);
tcm.getColumn(1).setHeaderValue(messages.getString("peertopeeranwendung_msg23"));
tcm.getColumn(1).setPreferredWidth(50);
JScrollPane dateiScrollPane = new JScrollPane(dateiTabelle);
this.updateDateiTabelle();
Box dateiBox = Box.createHorizontalBox();
dateiBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
dateiBox.add(filePanelLabel);
filePanel.add(dateiBox, BorderLayout.NORTH);
filePanel.add(dateiScrollPane, BorderLayout.CENTER);
tabbedPane.addTab(messages.getString("peertopeeranwendung_msg24"),new ImageIcon(getClass().getResource("/gfx/desktop/peertopeer_dateien_klein.png")) , filePanel);
configPanel = new JPanel(new BorderLayout());
maxClientsLabel = new JLabel(messages.getString("peertopeeranwendung_msg25"));
maxClientsField = new JTextField(""+((PeerToPeerAnwendung)holeAnwendung()).getMaxTeilnehmerZahl());
maxClientsField.addKeyListener(new KeyAdapter()
{
public void keyReleased(KeyEvent e)
{
zahlPruefen(maxClientsField);
}
});
JButton maxClientButton = new JButton(messages.getString("peertopeeranwendung_msg26"));
maxClientButton.addMouseListener(new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
{
if(zahlOK==true)
{
((PeerToPeerAnwendung)holeAnwendung()).setMaxTeilnehmerZahl(Integer.parseInt(maxClientsField.getText()));
}
else
{
JOptionPane.showMessageDialog(desktop, messages.getString("peertopeeranwendung_msg27"));
}
}
}});
Box configBox = Box.createHorizontalBox();
configBox.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
configBox.add(maxClientsLabel);
configBox.add(Box.createHorizontalStrut(10));
configBox.add(maxClientsField);
configBox.add(Box.createHorizontalStrut(10));
configBox.add(maxClientButton);
configPanel.add(configBox, BorderLayout.NORTH);
tabbedPane.addTab(messages.getString("peertopeeranwendung_msg28"), new ImageIcon(getClass().getResource("/gfx/desktop/peertopeer_einstellungen.png")), configPanel);
tabbedPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
updateDateiTabelle();
updateErgebnisTabelle();
updateNetzwerkTabelle();
}
});
mainPanel.add(tabbedPane, BorderLayout.CENTER);
this.getContentPane().add(mainPanel);
pack();
updateNetzwerkTabelle();
updateErgebnisTabelle();
updateDateiTabelle();
}
/**
* Diese Funktion erstellt die Tabelle mit den von der P2P Anwendung "verwalteten"
* Dateien zur Verfuegung.
* Sie wird �ber das Beobachtermuster ausgeloest.
*
* @author Thomas Gerding & Johannes Bade
*
*/
public void updateDateiTabelle()
{
DefaultTableModel tabellenModell = (DefaultTableModel) dateiTabelle.getModel();
tabellenModell.setRowCount(0);
LinkedList tempListe = holeAnwendung().getSystemSoftware().getDateisystem().holeDateien(((PeerToPeerAnwendung)holeAnwendung()).holeVerzeichnis());
ListIterator it = tempListe.listIterator();
while (it.hasNext())
{
Datei tmpDatei = (Datei) it.next();
Vector<Comparable> v = new Vector<Comparable>();
v.add(tmpDatei.getName());
v.add(tmpDatei.getDateiTyp());
tabellenModell.addRow(v);
}
}
/**
* Diese Funktion erstellt die Tabelle mit den bekannten Peer2Peer
* Teilnehmern.
* Sie wird ueber das Beobachtermuster ausgeloest.
*
* @author Thomas Gerding & Johannes Bade
*
*/
public void updateNetzwerkTabelle()
{
DefaultTableModel tabellenModell = (DefaultTableModel) netzwerkTabelle.getModel();
tabellenModell.setRowCount(0);
LinkedList tempListe = ((PeerToPeerAnwendung)holeAnwendung()).holeBekanntePeerToPeerTeilnehmer();
int zaehler = 0;
ListIterator it = tempListe.listIterator();
while (it.hasNext())
{
String ip = it.next().toString();
zaehler++;
Vector v = new Vector();
v.add(zaehler);
v.add(ip);
tabellenModell.addRow(v);
}
}
/**
* Diese Funktion erstellt die Tabelle mit den empfangenen Suchergebnissen.
* Sie wird ueber das Beobachtermuster ausgeloest.
*
* @author Thomas Gerding & Johannes Bade
*
*/
public void updateErgebnisTabelle()
{
String tmp;
DefaultTableModel tabellenModell = (DefaultTableModel) ergebnisTabelle.getModel();
tabellenModell.setRowCount(0);
LinkedList tempListe = ((PeerToPeerAnwendung)holeAnwendung()).holeErgebnisse();
ListIterator it = tempListe.listIterator();
while (it.hasNext())
{
String ergebnis = it.next().toString();
Vector v = new Vector();
StringTokenizer tempTokenizer=new StringTokenizer(ergebnis,"/");
v.add(tempTokenizer.nextToken());
tmp = tempTokenizer.nextToken();
v.add(tmp.substring(0, tmp.lastIndexOf(":")));
v.add(tmp.substring(tmp.lastIndexOf(":")+1));
tabellenModell.addRow(v);
}
}
/**
* Funktion die w�hrend der Eingabe �berpr�ft ob die bisherige Eingabe einen
* korrekten Wert darstellt.
*
* @author Johannes Bade & Thomas Gerding
* @param pruefRegel
* @param feld
*/
public void ipPruefen(JTextField feld)
{
if (EingabenUeberpruefung.isGueltig(feld.getText(), EingabenUeberpruefung.musterIpAdresse))
{
feld.setForeground(EingabenUeberpruefung.farbeRichtig);
pruefungOK=true;
}
else
{
feld.setForeground(EingabenUeberpruefung.farbeFalsch);
pruefungOK = false;
}
}
/**
* Funktion die w�hrend der Eingabe �berpr�ft ob die bisherige Eingabe einen
* korrekten Wert darstellt.
*
* @author Johannes Bade & Thomas Gerding
* @param pruefRegel
* @param feld
*/
public void zahlPruefen(JTextField feld)
{
if (EingabenUeberpruefung.isGueltig(feld.getText(), EingabenUeberpruefung.musterNurZahlen))
{
feld.setForeground(EingabenUeberpruefung.farbeRichtig);
zahlOK=true;
}
else
{
feld.setForeground(EingabenUeberpruefung.farbeFalsch);
zahlOK = false;
}
}
/**
* Sorgt dafuer, dass die DateiTabelle bei Reaktivierung des Fensters aktualisiert wird
*/
public void internalFrameActivated(InternalFrameEvent e) {
this.updateDateiTabelle();
}
public void internalFrameClosed(InternalFrameEvent e) {
this.setVisible(false);
}
public void internalFrameClosing(InternalFrameEvent e) {
this.setVisible(false);
}
public void internalFrameDeactivated(InternalFrameEvent e) {
}
public void internalFrameDeiconified(InternalFrameEvent e) {
this.updateDateiTabelle();
}
public void internalFrameIconified(InternalFrameEvent e) {
this.updateDateiTabelle();
}
public void internalFrameOpened(InternalFrameEvent e) {
this.updateDateiTabelle();
}
public void update(Observable arg0, Object arg1) {
updateNetzwerkTabelle();
updateErgebnisTabelle();
updateDateiTabelle();
}
}