package de.tud.socom.client.gui.history;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.border.EmptyBorder;
import de.tud.socom.client.logic.Connection;
@SuppressWarnings("serial")
public class HistoryExport extends JFrame {
final JList list = new JList();
private JPanel contentPane;
public HistoryExport() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 450, 300);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
list.setCellRenderer(new CellRenderer());
fillListWithHistory(list);
contentPane.add(list, BorderLayout.CENTER);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.SOUTH);
JSplitPane splitPane = new JSplitPane();
panel.add(splitPane);
JButton btnNewButton = new JButton("Export");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
exportUrls();
}
});
splitPane.setLeftComponent(btnNewButton);
JButton btnClose = new JButton("Close");
btnClose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
HistoryExport.this.dispose();
}
});
splitPane.setRightComponent(btnClose);
list.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int index = list.locationToIndex(e.getPoint());
if (index != -1) {
JCheckBox checkbox = (JCheckBox) list.getModel().getElementAt(index);
checkbox.setSelected(!checkbox.isSelected());
repaint();
}
}
});
selectAll();
this.setVisible(true);
}
private void exportUrls() {
List<String> urls = new LinkedList<String>();
ListModel model = list.getModel();
int size = model.getSize();
for (int i = 0; i < size; i++) {
JCheckBox checkbox = (JCheckBox) model.getElementAt(i);
boolean selected = checkbox.isSelected();
if (selected)
urls.add(checkbox.getText());
}
JFileChooser jFileChooser = new JFileChooser();
int returnVal = jFileChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File f = jFileChooser.getSelectedFile();
if (f.exists()) {
int result = JOptionPane.showConfirmDialog(this, "File already exists. Overwrite?");
if (result == JOptionPane.YES_OPTION) {
f.delete();
} else {
System.out.println("do not overwrite");
return;
}
}
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f));
Map<String, String> methods = Connection.get().getUrlHistoryRequests();
for (String url : urls) {
writer.write(methods.get(url) + ":" + url + "\n");
}
writer.flush();
writer.close();
JOptionPane.showMessageDialog(this, "File saved.");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void fillListWithHistory(JList list) {
DefaultListModel model = new DefaultListModel();
list.setModel(model);
List<String> urls = Connection.get().getUrlHistory();
for (int i = 0; i < urls.size(); i++) {
model.add(i, new JCheckBox(urls.get(i)));
}
}
protected class CellRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JCheckBox checkbox = (JCheckBox) value;
return checkbox;
}
}
public void selectAll() {
int size = list.getModel().getSize();
for (int i = 0; i < size; i++) {
JCheckBox checkbox = (JCheckBox) list.getModel().getElementAt(i);
checkbox.setSelected(true);
}
this.repaint();
}
public void deselectAll() {
int size = list.getModel().getSize();
for (int i = 0; i < size; i++) {
JCheckBox checkbox = (JCheckBox) list.getModel().getElementAt(i);
checkbox.setSelected(false);
}
this.repaint();
}
}