package bezeroa.graf;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.Comparator;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
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.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.table.TableRowSorter;
import erabilgarriak.DownloadFile;
import erabilgarriak.DownloadFileHelper;
import erabilgarriak.FileData;
import erabilgarriak.ServerPackage.FileDataArrayHolder;
import bezeroa.Bezero;
import bezeroa.Bidaltzailea;
import bezeroa.Deskarga;
import bezeroa.Globalak;
public class SistemaGrafikoa extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
JList fitxZerrenda;
JTable table;
private TableModel tableModel;
private ArrayList<DownloadFile> bidaltzaileak=new ArrayList<DownloadFile>();
/**
* Hari pare batera atera fitxategiak kargatzeko funtzioak, horrela ez da itxaron behar, join-a kontruktore bukaeran
*
* @throws Exception
*/
public SistemaGrafikoa() throws Exception{
Splash splash = new Splash();
System.out.println("Kargatzen");
this.setSize(800, 500);
this.setTitle("eMandoa");
this.setResizable(true);
this.setLocation(100, 100);
splash.getProgressBar().setValue(5);
this.setJMenuBar(menuBarraSortu());
this.setContentPane(panelOrokorraSortu());
Thread a = new Thread(){
public void run(){
try {
while(true){
//table.updateUI();
table.setVisible(false);
table.setVisible(true);
sleep(20);
}
} catch (Exception e) {}
}
};
a.start();
splash.getProgressBar().setValue(10);
//%60a dago hemen
Bezero.fileDatakSortu(splash.getProgressBar(), splash.getLabel());
for (int i=0;Bezero.files.size()>i;i++){
try{
FileData filedata=Bezero.files.get(i);
Bidaltzailea bidal = new Bidaltzailea(filedata);
DownloadFile df = DownloadFileHelper.narrow(Globalak.ORBGlobal.getRootPOA().servant_to_reference(bidal));
bidaltzaileak.add(df);
Globalak.eMandoa.getServer().register(df);
}catch (Exception e){
e.printStackTrace();
splash.setVisible(false);
JOptionPane.showMessageDialog(null, "Errore bat zerbitzarira konektatzerako orduan", "Errorea", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
splash.getProgressBar().setValue(70);
//%25a dago hemen
Bezero.datakIrakurri(splash.getProgressBar(), splash.getLabel());
for(Deskarga d : Bezero.berrabiarazteko){
JProgressBar bar = new JProgressBar();
bar.setStringPainted(true);
d.setProgressBar(bar);
DeskargaData data = new DeskargaData(d.getFileData().name, bar, tamainaKalkulatu(d.getFileData().size));
tableModel.add(data);
d.start();
}
splash.getProgressBar().setValue(95);
this.addWindowListener(new WindowListener(){
@Override
public void windowActivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent arg0) {
irten();
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent arg0) {
// TODO Auto-generated method stub
}
});
splash.getProgressBar().setValue(100);
fitxZerrenda.setModel(fitxategiZerrendaModeloaSortu());
this.setVisible(true);
splash.setVisible(false);
splash.dispose();
}
private JMenuBar menuBarraSortu() {
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("Aukerak");
menu.setMnemonic(KeyEvent.VK_A);
menu.getAccessibleContext().setAccessibleDescription("Programako aukerak");
JMenuItem fitxBerriak = new JMenuItem("Fitxategiak erregistratu");
fitxBerriak.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK));
fitxBerriak.getAccessibleContext().setAccessibleDescription("ongoing karpetan dauden fitxategiak erregistratu");
fitxBerriak.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
ArrayList<FileData> fitx = Bezero.getFitxBerriak();
if(fitx != null){
for (int i=0; fitx.size()>i; i++){
try{
FileData filedata=fitx.get(i);
Bidaltzailea bidal = new Bidaltzailea(filedata);
DownloadFile df = DownloadFileHelper.narrow(Globalak.ORBGlobal.getRootPOA().servant_to_reference(bidal));
bidaltzaileak.add(df);
Globalak.eMandoa.getServer().register(df);
}catch (Exception e1){
JOptionPane.showMessageDialog(null, "Errore bat zerbitzarira konektatzerako orduan", "Errorea", JOptionPane.INFORMATION_MESSAGE);
}
}
}
}
});
JMenuItem irten = new JMenuItem("irten");
irten.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
irten.getAccessibleContext().setAccessibleDescription("Programatik irten");
irten.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {irten();}
});
menu.add(fitxBerriak);
menu.addSeparator();
menu.add(irten);
bar.add(menu);
return bar;
}
protected void irten() {
for(DownloadFile df : bidaltzaileak){
Thread a = getTimer();
a.start();
Globalak.eMandoa.getServer().deregister(df);
a.interrupt();
try {
a.join();
} catch (InterruptedException e) {}
}
Globalak.ORBGlobal.getORB().shutdown(true);
try {
Globalak.ORBGlobal.getORBThread().join();
} catch (InterruptedException e) {}
System.exit(0);
}
protected Thread getTimer() {
return new Thread(){
boolean stopped=false;
public void interrupt(){
this.stopped = true;
super.interrupt();
}
public void run(){
while(!stopped){
try{
sleep(1000*2);
System.exit(0);
}catch(Exception e){}
}
}
};
}
private Container panelOrokorraSortu() {
JSplitPane panel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, deskargaZerrenda(), fitxategiZerrenda());
panel.setDividerLocation(540);
return panel;
}
private Component deskargaZerrenda() {
JPanel panel = new JPanel(new BorderLayout());
JLabel lDeskargak = new JLabel("Deskargak");
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
tableModel = new TableModel();
table = new JTable(tableModel);//TableModel nik egindako klasea da
table.setDefaultRenderer(JProgressBar.class, new CellRenderer());//Honek zutabeko klasea JProgress bar motakoa bada
//CellRenderer(nik egindakoa) klasea erabiltzekoesaten dio
//table.setAutoCreateRowSorter(true);//JProgressBar-arendako ez dau sortzen
table.getColumnModel().getColumn(1).setPreferredWidth((int) (this.getWidth()*0.3));
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
sorter.setComparator(1, new Comparator<JProgressBar>(){
@Override
public int compare(final JProgressBar o1, final JProgressBar o2) {
return o1.getValue()-o2.getValue();
}
});
sorter.setComparator(2, new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
String[] s1a = s1.split(" ");
String[] s2a = s2.split(" ");
if(s1a[1].equals(s2a[1]))
return Double.parseDouble(s1a[0])<Double.parseDouble(s2a[0])?(int) Math.floor(Double.parseDouble(s1a[0])-Double.parseDouble(s2a[0])):(int) Math.ceil(Double.parseDouble(s1a[0])-Double.parseDouble(s2a[0]));
else{
if(s1a[1].equals("B"))
return -1;
if(s1a[1].equals("KB") && !s2a[1].equals("B"))
return -1;
if(s1a[1].equals("MB") && s2a[1].equals("GB"))
return -1;
return 1;
}
}
});
//table.setRowSorter(sorter);
//table.setVisible(true);
//table.setMinimumSize(new Dimension((int)(this.getWidth()*0.5), 350));
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setMinimumSize(new Dimension((int)(this.getWidth()*0.5), 350));
scrollPane.setBackground(Color.white);
panel.add(lDeskargak,BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);
return panel;
}
private Component fitxategiZerrenda() {
JPanel panel = new JPanel(new BorderLayout(10, 10));
JPanel bPanel = new JPanel(new GridLayout(1,2));
JButton deskargatu = new JButton("Deskargatu"),
aktualizatu = new JButton("Aktualizatu");
JLabel lFitxategi = new JLabel("Partekatutako Fitxategiak");
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
deskargatu.setActionCommand("deskargatu");
deskargatu.addActionListener(this);
aktualizatu.setActionCommand("aktualizatu");
aktualizatu.addActionListener(this);
bPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
bPanel.add(deskargatu);
bPanel.add(aktualizatu);
fitxZerrenda = new JList();
//TODO Zerbitzarian dauden fitxategien zerrenda modeloa sortu eta zerrendari erantzi
panel.add(lFitxategi,BorderLayout.NORTH);
panel.add(new JScrollPane(fitxZerrenda), BorderLayout.CENTER);
panel.add(bPanel,BorderLayout.SOUTH);
return panel;
}
public DefaultListModel fitxategiZerrendaModeloaSortu(){
FileData[] buff = new FileData[1];
buff[0] = new FileData();
FileDataArrayHolder holder = new FileDataArrayHolder(buff);
Globalak.eMandoa.getServer().getLista(holder);
DefaultListModel modelo= new DefaultListModel();
for(FileData data : holder.value){
modelo.addElement(data);
}
return modelo;
}
public static void main(String[] args) throws Exception{
/*try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e1) {
}
}
*/
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new SistemaGrafikoa();
Globalak.ORBGlobal.getORBThread().start();
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("deskargatu")){
Deskarga d;
try {
d = new Deskarga((FileData) fitxZerrenda.getSelectedValue());
JProgressBar bar = new JProgressBar();
bar.setStringPainted(true);
d.setProgressBar(bar);
DeskargaData data = new DeskargaData(d.getFileData().name, bar, tamainaKalkulatu(d.getFileData().size));
tableModel.add(data);
d.start();
} catch (Exception e1) {
e1.printStackTrace();
}
}
if(e.getActionCommand().equals("aktualizatu")){
fitxZerrenda.setModel(fitxategiZerrendaModeloaSortu());
}
}
private String tamainaKalkulatu(long l) {
String unitatea = " B";
Double buff = (double) l;
if(buff < 1024)
return buff+unitatea;
else{
unitatea = " KB";
buff = buff/1024;
if(buff < 1024)
return truncate(buff) + unitatea;
else{
unitatea = " MB";
buff = buff/1024;
if(buff < 1024)
return truncate(buff) + unitatea;
else{
unitatea = " GB";
buff = buff /1024;
return truncate(buff) + unitatea;
}
}
}
}
public double truncate(Double d){
return ((long)(d*100))/100.0;
}
}