package com.dedupeer.gui.component.panel;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.FontMetrics;
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.awt.event.MouseListener;
import java.io.File;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import com.dedupeer.backup.BackupQueue;
import com.dedupeer.backup.RestoreQueue;
import com.dedupeer.dao.CassandraManager;
import com.dedupeer.dao.Login;
import com.dedupeer.gui.component.dialog.SettingsDialog;
import com.dedupeer.gui.component.model.StoredFileDataModel;
import com.dedupeer.gui.component.renderer.IconLabelRenderer;
import com.dedupeer.gui.component.renderer.JProgressRenderer;
import com.dedupeer.navigation.DFile;
import com.dedupeer.navigation.Navigable;
import com.dedupeer.thrift.HashingAlgorithm;
import com.dedupeer.utils.FileUtils;
import com.dedupeer.utils.Utils;
/**
* @author Paulo Fernando (pf@paulofernando.net.br)
*/
public class MainPanel extends JPanel {
private static final long serialVersionUID = -6912344879931889592L;
private JButton btLogin, btAdd, btCalculate, btSettings,
btRehydrate, btDeduplicate, btAnalyze;
private JPanel groupButtonsTop = new JPanel();
private JPanel groupButtonsBottom = new JPanel();
private BorderLayout borderLayout = new BorderLayout();
private JTable table;
private JFrame jframe;
private MouseListener mouseListener;
private ActionListener menuListener;
private final String tooltipDeduplicate = "Use it to deduplicate other file";
private final String tooltipRehydrate = "Rehydrate this file";
private final String tooltipAnalyze = "Analyze and show information about the selected file";
private Login login;
public MainPanel(final JFrame jframe) {
this.jframe = jframe;
initComponents();
this.setLayout(borderLayout);
this.add(groupButtonsTop, BorderLayout.PAGE_START);
createAndAddTable();
this.add(groupButtonsBottom, BorderLayout.PAGE_END);
registerListeners();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showLoginDialog();
}
});
}
private void registerListeners() {
btLogin.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
showLoginDialog();
}
});
btAdd.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btAdd.isEnabled()) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(MainPanel.this);
File fileToBackup = fc.getSelectedFile();
if(result == JFileChooser.APPROVE_OPTION) {
backupIt(fileToBackup);
}
}
}
});
btCalculate.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btCalculate.isEnabled()) {
List<Navigable> listStoredFiles = ((StoredFileDataModel) table.getModel()).getStoredFileWithoutEconomyCalculated();
for(Navigable sf: listStoredFiles) {
sf.calculateStorageEconomy();
}
}
}
});
btSettings.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btSettings.isEnabled()) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new SettingsDialog(jframe, login);
}
});
}
}
});
//-----------------------------------------------------------------------
btRehydrate.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btRehydrate.isEnabled()) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
restoreIt((DFile)((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow()));
}
});
}
}
});
btDeduplicate.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btDeduplicate.isEnabled()) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(MainPanel.this);
File fileToBackup = fc.getSelectedFile();
if(result == JFileChooser.APPROVE_OPTION) {
backupIt(fileToBackup, ((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow()).getName());
}
}
});
}
}
});
btAnalyze.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(btAnalyze.isEnabled()) {
if(table.getSelectedRow() != -1) {
DFile selectedFile = (DFile)((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow());
selectedFile.analizeFile();
} else {
JOptionPane.showMessageDialog(jframe, "One file need be selected");
}
}
}
});
//-----------------------------------------------------------------------
mouseListener = new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if((e.getButton() == MouseEvent.BUTTON3) && (e.getClickCount() == 1)) {
if(table.getRowCount() > 0) {
Point point = e.getPoint();
int row = table.rowAtPoint(point);
table.getSelectionModel().setSelectionInterval(row, row);
JPopupMenu contextmenu = new JPopupMenu();
JMenuItem deduplicateMenu = new JMenuItem(tooltipDeduplicate);
deduplicateMenu.addActionListener(menuListener);
contextmenu.add(deduplicateMenu);
JMenuItem restoreMenu = new JMenuItem(tooltipRehydrate);
restoreMenu.addActionListener(menuListener);
contextmenu.add(restoreMenu);
contextmenu.show(e.getComponent(), e.getX(), e.getY());
}
} else if (e.getButton() == MouseEvent.BUTTON1) {
if (e.getClickCount() == 2) {
((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow()).open();
} else if (e.getClickCount() == 1) {
if(table.getSelectedRow() != -1) {
btRehydrate.setEnabled(true);
btDeduplicate.setEnabled(true);
btAnalyze.setEnabled(true);
} else {
btRehydrate.setEnabled(false);
btDeduplicate.setEnabled(false);
btAnalyze.setEnabled(false);
}
}
}
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
};
menuListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
if(event.getActionCommand().equals(tooltipDeduplicate)) {
JFileChooser fc = new JFileChooser();
int result = fc.showOpenDialog(MainPanel.this);
File fileToBackup = fc.getSelectedFile();
if(result == JFileChooser.APPROVE_OPTION) {
backupIt(fileToBackup, ((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow()).getName());
}
} else if(event.getActionCommand().equals(tooltipRehydrate)) {
restoreIt((DFile)((StoredFileDataModel) table.getModel()).getStoredFileByRow(table.getSelectedRow()));
}
}
};
table.addMouseListener(mouseListener);
}
/** Add a file in the queue to backup */
private void backupIt(File fileToBackup) {
String filename = fileToBackup.getName();
String newFileName = Utils.getValidName(fileToBackup.getName());
DFile backup;
if(filename.equals(newFileName)) {
backup = new DFile(fileToBackup, "");
} else {
backup = new DFile(fileToBackup, newFileName, "");
}
((StoredFileDataModel) table.getModel()).addNavigable(backup);
BackupQueue.getInstance().addBackup(backup);
}
/**
* Add a file in the queue to backup, and inform a file
* already stored to deduplicate this new file
*/
private void backupIt(File fileToBackup, String deduplicateWith) {
String filename = fileToBackup.getName();
String newFileName = Utils.getValidName(fileToBackup.getName());
DFile backup;
if(filename.equals(newFileName)) {
backup = new DFile(fileToBackup, "");
} else {
backup = new DFile(fileToBackup, newFileName, "");
}
((StoredFileDataModel) table.getModel()).addNavigable(backup);
BackupQueue.getInstance().addBackup(backup, deduplicateWith);
}
/** Adds a file in the queue to restore */
private void restoreIt(DFile dFile) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
jfc.showOpenDialog(this);
File file = jfc.getSelectedFile();
if(file != null) {
dFile.setPathToRestore(file.getAbsolutePath());
RestoreQueue.getInstance().addRestore(dFile);
}
}
protected void registerUser(String username) {
CassandraManager cm = new CassandraManager();
if(!cm.isDedupeerKeySpaceCreated()) {
cm.createDedupeerDataModel();
}
this.jframe.setTitle("Dedupeer File Storage [@" + username + "]");
//Unlock components
btAdd.setEnabled(true);
btCalculate.setEnabled(true);
btSettings.setEnabled(true);
login = new Login(username, (StoredFileDataModel)table.getModel());
}
private void initComponents() {
btLogin = new JButton(new ImageIcon("resources/images/login.png"));
btLogin.setToolTipText("Login");
btAdd = new JButton(new ImageIcon("resources/images/add.png"));
btAdd.setToolTipText("Add a file");
btAdd.setEnabled(false);
btCalculate = new JButton(new ImageIcon("resources/images/calculate_storage_economy.png"));
btCalculate.setToolTipText("Calculate the storage economy of the files stored");
btCalculate.setEnabled(false);
btSettings = new JButton(new ImageIcon("resources/images/settings.png"));
btSettings.setToolTipText("Settings");
btSettings.setEnabled(false);
groupButtonsTop.setLayout(new FlowLayout());
groupButtonsTop.add(btLogin);
groupButtonsTop.add(btAdd);
groupButtonsTop.add(btCalculate);
groupButtonsTop.add(btSettings);
//---------------------------------------------------------------------------------
btRehydrate = new JButton(new ImageIcon("resources/images/rehydrate.png"));
btRehydrate.setToolTipText("Rehydrate the selected file");
btRehydrate.setEnabled(false);
btDeduplicate = new JButton(new ImageIcon("resources/images/deduplicate.png"));
btDeduplicate.setToolTipText("Use the selected file to deduplicate other file");
btDeduplicate.setEnabled(false);
btAnalyze = new JButton(new ImageIcon("resources/images/analyze.png"));
btAnalyze.setToolTipText(tooltipAnalyze);
btAnalyze.setEnabled(false);
groupButtonsBottom.setLayout(new FlowLayout());
groupButtonsBottom.add(btRehydrate);
groupButtonsBottom.add(btDeduplicate);
groupButtonsBottom.add(btAnalyze);
}
private void createAndAddTable() {
table = new JTable(new StoredFileDataModel());
table.setFillsViewportHeight(true);
table.setShowVerticalLines(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setRowHeight(23);
FontMetrics fontMetrics = this.getFontMetrics(table.getFont());
table.getColumnModel().getColumn(1).setMaxWidth(fontMetrics.stringWidth(table.getModel().getColumnName(1)) + 50);
table.getColumnModel().getColumn(1).setMinWidth(fontMetrics.stringWidth(table.getModel().getColumnName(1)) + 50);
table.getColumnModel().getColumn(2).setMaxWidth(fontMetrics.stringWidth(table.getModel().getColumnName(2)) + 10);
table.getColumnModel().getColumn(2).setMinWidth(fontMetrics.stringWidth(table.getModel().getColumnName(2)) + 10);
table.getColumnModel().getColumn(0).setCellRenderer(new IconLabelRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(new JProgressRenderer());
table.getColumnModel().getColumn(2).setCellRenderer(new IconLabelRenderer());
JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane, BorderLayout.CENTER);
}
private void showLoginDialog() {
String username = JOptionPane.showInputDialog("Inform your username");
if(username != null) {
registerUser(username);
}
}
}