package gui.image;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSeparator;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import models.Image;
import models.Links;
import models.SessionData;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.ini4j.InvalidFileFormatException;
import org.ini4j.Wini;
import server.generated.Server.Client;
import server.generated.User;
import thrift.ThriftConnection;
import util.GuiOrganizer;
import util.OpenLinks;
import ftp.DownloadTask;
import gui.intro.About_GUI;
import gui.intro.MainMenue_GUI;
import config.Config;
@SuppressWarnings("serial")
public class FTPEditDownloader_GUI extends JFrame implements
PropertyChangeListener {
/**
* Logger instance for this class.
*/
private final static Logger LOGGER = Logger
.getLogger(FTPEditDownloader_GUI.class);
@SuppressWarnings("unused")
private JPanel contentPane;
private final JPanel contentPanel = new JPanel();
JLabel lblPath;
JLabel lblDownSpeed;
User user;
JProgressBar progressBar;
String host = SessionData.session.getServerAdress();
int port = 21;
String downloadFile = "";
static String arg = "";
DownloadTask task;
JLabel lblFertig;
JLabel lblFilesize;
JLabel lblVerbleibend;
JFileChooser fc;
long filesize;
double speed;
int progress = 0; // progress of download
long bytesread;
JLabel lblZeit;
boolean taskrun = false;
ThriftConnection con = new ThriftConnection();
Client client = models.Client.clientcon.getClient();
JButton btnZurck = new JButton("Zurück");
JButton btnDownloadStarten = new JButton("Download starten");
JButton btnDownloadStoppen = new JButton("Download abbrechen");
private JLabel lblAnleitung;
Component c = null;
private boolean isCurrentlyLoading = false; // currently up or downloading
// file
private boolean isAborted = false; // down- or upload was manually aborted
private static final String HELP_MESSAGE = "
" +
"Hier können Sie Images herunterladen.
" +
"Klicken Sie anschließend auf \"Zurück\", um zu Ihrer vorherigen Auswahl zurückzugelangen.
" +
"
";
/**
* Create the frame.
*/
public FTPEditDownloader_GUI(Component formerGUI) {
try {
client.setTokenForSession(SessionData.session.getAuthToken());
} catch (TException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
final Object[] options = { "Beenden", "Abbrechen" };
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (taskrun == true) {
// check if user wants to quit.
int choice = JOptionPane
.showOptionDialog(
c,
"Aktuell ist ein Download aktiv. Wollen Sie diesen Abbrechen und das Programm beenden?",
"Upload aktiv",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null,
options, options[1]);
// 0=beenden, 1=abbrechen
if (choice == 0) {
try {
client.DeleteFtpUser(user.userName);
con.closeThriftConnection();
} catch (TException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
task.cancel(true);
System.exit(0);
}// end if coice
} else {
// no download running, close window
System.exit(0);
}// end if taskrun
}// end window closing
});
setResizable(false);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setBackground(Color.WHITE);
setTitle("Dozentenmodul - Image herunterladen");
// Aktion die beim Schliessen durchgefuehrt werden soll
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setBounds(0, 0, 603, 722);
setLocationRelativeTo(formerGUI);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBackground(SystemColor.menu);
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(null);
{
JButton btnSpeicherortAuswhlen = new JButton(
"Speicherort auswählen");
btnSpeicherortAuswhlen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
fc = new JFileChooser(Config.getLastDownloadPath());
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.showOpenDialog(getParent());
File dir = fc.getSelectedFile();
// check if directory is selected
if (dir != null) {
// is selected
// create dir if it does not exists.
if (!dir.exists())
dir.mkdirs();
lblPath.setText(dir.getAbsolutePath());
} else {
// no directory selected
lblPath.setText("");
}// end if
}
});
btnSpeicherortAuswhlen.setBounds(102, 124, 173, 23);
btnSpeicherortAuswhlen.setVerticalAlignment(SwingConstants.TOP);
contentPanel.add(btnSpeicherortAuswhlen);
}
lblPath = new JLabel("");
lblPath.setText(Config.getLastDownloadPath());
lblPath.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent arg0) {
if (lblPath.getText() == null) {
// wenn leer, dann upload button nicht freigeben
btnDownloadStarten.setEnabled(false);
btnDownloadStarten.setText("Bitte warten");
} else {
// wenn leer, dann upload button freigeben
btnDownloadStarten.setEnabled(true);
btnDownloadStarten.setText("Download starten");
}
}
});
lblPath.setBounds(102, 158, 485, 23);
contentPanel.add(lblPath);
btnDownloadStarten.setEnabled(false);
btnDownloadStarten.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
buttonDownloadActionPerformed(arg0);
}
});
btnDownloadStarten.setBounds(102, 200, 173, 23);
contentPanel.add(btnDownloadStarten);
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setBounds(102, 234, 485, 30);
contentPanel.add(progressBar);
JLabel lblDownloadgeschwindigkeit = new JLabel(
"Downloadgeschwindigkeit:");
lblDownloadgeschwindigkeit.setBounds(102, 275, 141, 14);
contentPanel.add(lblDownloadgeschwindigkeit);
lblDownSpeed = new JLabel("0");
lblDownSpeed.setBounds(374, 275, 117, 14);
contentPanel.add(lblDownSpeed);
JLabel lblFertig_1 = new JLabel("Fertig:");
lblFertig_1.setBounds(102, 325, 46, 14);
contentPanel.add(lblFertig_1);
lblFertig = new JLabel("0");
lblFertig.setBounds(183, 325, 108, 14);
contentPanel.add(lblFertig);
JLabel lblVon = new JLabel("von:");
lblVon.setBounds(318, 325, 46, 14);
contentPanel.add(lblVon);
lblFilesize = new JLabel("0");
lblFilesize.setBounds(374, 325, 117, 14);
contentPanel.add(lblFilesize);
JLabel lblMbVerbleibend = new JLabel("Verbleibend:");
lblMbVerbleibend.setBounds(102, 350, 71, 14);
contentPanel.add(lblMbVerbleibend);
lblVerbleibend = new JLabel("0");
lblVerbleibend.setBounds(183, 350, 108, 14);
contentPanel.add(lblVerbleibend);
JLabel lblGeschtzteVerbleibendeZeit = new JLabel(
"Geschätzte Verbleibende Zeit:");
lblGeschtzteVerbleibendeZeit.setBounds(102, 300, 150, 14);
contentPanel.add(lblGeschtzteVerbleibendeZeit);
lblZeit = new JLabel("0");
lblZeit.setBounds(374, 300, 117, 14);
contentPanel.add(lblZeit);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBackground(SystemColor.menu);
panel.setBounds(10, 24, 577, 57);
contentPanel.add(panel);
JLabel lblImageDownloader = new JLabel("Image Downloader");
lblImageDownloader.setFont(new Font("Tahoma", Font.BOLD, 18));
lblImageDownloader.setBounds(10, 11, 509, 22);
panel.add(lblImageDownloader);
JTextPane txtpnWhlenSieEinen = new JTextPane();
txtpnWhlenSieEinen
.setText("Wählen Sie einen Ort aus, um das von Ihnen gewählte Image herunterzuladen.");
txtpnWhlenSieEinen.setEditable(false);
txtpnWhlenSieEinen.setBackground(SystemColor.menu);
txtpnWhlenSieEinen.setBounds(10, 36, 509, 32);
panel.add(txtpnWhlenSieEinen);
JSeparator separator = new JSeparator();
separator.setBounds(0, 88, 597, 2);
contentPanel.add(separator);
JLabel label_1 = new JLabel("Hauptmenü");
label_1.setForeground(Color.BLUE);
label_1.setBounds(20, 92, 61, 20);
contentPanel.add(label_1);
JLabel label_2 = new JLabel(">");
label_2.setBounds(80, 95, 14, 14);
contentPanel.add(label_2);
JLabel label_3 = new JLabel("Image");
label_3.setForeground(Color.BLUE);
label_3.setBounds(91, 92, 46, 20);
contentPanel.add(label_3);
JLabel label_4 = new JLabel(">");
label_4.setBounds(139, 95, 14, 14);
contentPanel.add(label_4);
JLabel lblNeuBearbeiten = new JLabel("Bearbeiten");
lblNeuBearbeiten.setBounds(149, 95, 155, 14);
contentPanel.add(lblNeuBearbeiten);
JSeparator separator_1 = new JSeparator();
separator_1.setBounds(-10, 648, 597, 2);
contentPanel.add(separator_1);
JLabel lblSchritt = new JLabel("Schritt 1:");
lblSchritt.setBounds(24, 128, 57, 14);
contentPanel.add(lblSchritt);
JLabel lblSchritt_1 = new JLabel("Schritt 2:");
lblSchritt_1.setBounds(24, 204, 57, 14);
contentPanel.add(lblSchritt_1);
JLabel lblSchritt_3 = new JLabel("Schritt 3:");
lblSchritt_3.setBounds(20, 423, 57, 14);
contentPanel.add(lblSchritt_3);
JLabel lblKlickenSieAuf = new JLabel(
"Klicken Sie auf \"Zurück\".");
lblKlickenSieAuf.setBounds(102, 423, 241, 14);
contentPanel.add(lblKlickenSieAuf);
JMenuBar menuBar = new JMenuBar();
menuBar.setBounds(0, 0, 597, 21);
contentPanel.add(menuBar);
JMenu menu = new JMenu("Hilfe");
menuBar.add(menu);
JMenuItem menuItem = new JMenuItem("FAQ");
menuItem.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
OpenLinks open = new OpenLinks();
URI windows;
try {
windows = new URI(Links.getFAQ());
open.openWebpage(windows);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
menu.add(menuItem);
JMenuItem menuItem_1 = new JMenuItem("OTRS");
menuItem_1.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
OpenLinks open = new OpenLinks();
URI windows;
try {
windows = new URI(Links.getOTRS());
open.openWebpage(windows);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
menu.add(menuItem_1);
JMenuItem mntmAbout = new JMenuItem("About");
mntmAbout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
About_GUI ab = new About_GUI();
ab.setVisible(true);
}
});
menu.add(mntmAbout);
lblAnleitung = new JLabel(
"Anleitung zum Erstellen einer virtuellen Maschine herunterladen");
lblAnleitung.setForeground(Color.BLUE);
lblAnleitung.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
OpenLinks open = new OpenLinks();
URI anleitung;
try {
anleitung = new URI(Links.getAnleitungVMDK());
open.openWebpage(anleitung);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
lblAnleitung.setBounds(102, 448, 311, 14);
contentPanel.add(lblAnleitung);
btnDownloadStoppen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
isAborted = true; // set flag
try {
client.DeleteFtpUser(user.userName);
LOGGER.info("FTP user deleted.");
} catch (TException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
task.cancel(true);
resetValues();
// reset buttons
resetButtons();
}
});
btnDownloadStoppen.setEnabled(false);
btnDownloadStoppen.setBounds(305, 200, 173, 23);
contentPanel.add(btnDownloadStoppen);
{
JPanel buttonPane = new JPanel();
buttonPane.setBackground(UIManager.getColor("Button.background"));
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
btnZurck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// check if loading file or not
if (isCurrentlyLoading() == true) {
int choice = JOptionPane
.showOptionDialog(
c,
"Nicht abgeschlossene Uploads werden beendet. Trotzdem zurück gehen?",
"Warnung",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null,
options, options[1]);
// 0=beenden, 1=abbrechen
if (choice == 0) {
task.cancel(true);
try {
client.DeleteFtpUser(user.userName);
} catch (TException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// go back one page
SearchEditImage_GUI se = new SearchEditImage_GUI(c);
se.setVisible(true);
dispose();
}// end choice
} else {
// go back one page
SearchEditImage_GUI se = new SearchEditImage_GUI(c);
se.setVisible(true);
dispose();
}// end else
// always save download path
File f = new File(lblPath.getText());
if (f.isDirectory()) {
Config.setLastDownloadPath(f.toString());
} else if (f.getParentFile().isDirectory()) {
Config.setLastDownloadPath(f.getParentFile()
.toString());
}
Config.store();
}
});
btnZurck.setActionCommand("Cancel");
buttonPane.add(btnZurck);
}
}
setVisible(true);
JMenu mnNewMenu_Info = new JMenu("Info");
mnNewMenu_Info.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
JOptionPane.showMessageDialog(c, HELP_MESSAGE, "Hilfe zu dieser Oberfläche", JOptionPane.INFORMATION_MESSAGE);
}
});
menuBar.add(mnNewMenu_Info);
c = this;
}
private void buttonDownloadActionPerformed(ActionEvent event) {
isAborted = false;
progressBar.setValue(0);
btnDownloadStarten.setEnabled(false); // verhindert schnellen zweiten
// Klick
btnDownloadStarten.setText("Bitte warten");
try {
user = client.getFtpUser();
downloadFile = user.path
+ "/"
+ client.getPathOfImage(Image.image.getImageId(),
Image.image.getVersion());
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
JOptionPane.showMessageDialog(c,
e.getCause() + "\n" + e.getStackTrace(), "Debug-Message",
JOptionPane.ERROR_MESSAGE);
}
task = new DownloadTask(host, port, user.userName, user.password,
downloadFile, lblPath.getText());
task.addPropertyChangeListener(this);
task.execute();
taskrun = true;
}
public void propertyChange(PropertyChangeEvent arg0) {
if (isAborted == false) {
progress = 0;
if ("progress" == arg0.getPropertyName()) {
progress = (Integer) arg0.getNewValue();
progressBar.setValue(progress);
}
if ("speed" == arg0.getPropertyName()) {
speed = (double) arg0.getNewValue();
lblDownSpeed.setText(String.valueOf(speed).substring(0,
String.valueOf(speed).lastIndexOf(".") + 3)
+ " MB/s");
}
// Button zum Fertigstellen freischalten, wenn 100% erreicht sind
if (isCurrentlyLoading() == false || progressBar.getPercentComplete() == 1.0) {
// no download
//LOGGER.info("finished downloading file");
btnDownloadStoppen.setEnabled(false);
} else {
// currently uploading, don't let user interact
btnDownloadStoppen.setEnabled(true);
}
if ("bytesread" == arg0.getPropertyName()) {
bytesread = (long) arg0.getNewValue();
lblFertig.setText((bytesread / 1024 / 1024) + " MB");
lblVerbleibend
.setText(((filesize / 1024 / 1024) - (bytesread / 1024 / 1024))
+ " MB");
lblZeit.setText(String
.valueOf(
((((filesize / 1024 / 1024) - (bytesread / 1024 / 1024)) / speed) / 60) + 1)
.substring(
0,
String.valueOf(
(((filesize / 1024 / 1024) - (bytesread / 1024 / 1024)) / speed) / 60)
.lastIndexOf("."))
+ " Minuten");
}
if ("filesize" == arg0.getPropertyName()) {
filesize = (long) arg0.getNewValue();
lblFilesize.setText((filesize / 1024 / 1024) + " MB");
}
}// end if
}// end PropertyChange()
public boolean isCurrentlyLoading() {
isCurrentlyLoading = false;
if (lblVerbleibend.getText().equals("0 MB")
|| lblVerbleibend.getText().equals("0")) {
isCurrentlyLoading = false;
} else {
isCurrentlyLoading = true;
}
return isCurrentlyLoading;
}// end isCurrentlyLoading()
public void resetValues() {
lblDownSpeed.setText("0");
lblZeit.setText("0");
lblFertig.setText("0");
lblFilesize.setText("0");
lblVerbleibend.setText("0");
progressBar.setValue(0);
}// end resetValues
public void resetButtons() {
// btnFinish.setEnabled(false);
btnDownloadStarten.setEnabled(true);
btnDownloadStarten.setText("Download starten");
btnDownloadStoppen.setEnabled(false);
}// end resetButtons
}// end class