/*
* Copyright (C) 2014 Tim Vaughan <tgvaughan@gmail.com>.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package beast.app.beauti;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Point;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import beast.util.AddOnManager;
/**
* @author Tim Vaughan <tgvaughan@gmail.com>
*/
public class JPackageRepositoryDialog extends JDialog {
private static final long serialVersionUID = 1L;
public JPackageRepositoryDialog(final JFrame frame) {
super(frame);
setModal(true);
setTitle("BEAST 2 Package Repository Manager");
// Get current list of URLs:
List<URL> urls;
try {
urls = AddOnManager.getRepositoryURLs();
} catch (MalformedURLException exception) {
urls = new ArrayList<>();
try {
urls.add(new URL(AddOnManager.PACKAGES_XML));
} catch (MalformedURLException e) {
// Hard-coded URL is broken. Should never happen!
e.printStackTrace();
}
}
// Assemble table
final RepoTableModel repoTableModel = new RepoTableModel(urls);
final JTable repoTable = new JTable(repoTableModel);
int size = repoTable.getFont().getSize();
repoTable.setRowHeight(20 * size/13);
repoTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(repoTable);
getContentPane().add(scrollPane, BorderLayout.CENTER);
// Add buttons
Box box = Box.createHorizontalBox();
// ADD URL
JButton addURLButton = new JButton("Add URL");
addURLButton.addActionListener(e -> {
String newURLString = (String)JOptionPane.showInputDialog(frame,
"Enter package repository URL",
"Add repository URL",JOptionPane.PLAIN_MESSAGE, null, null, "http://");
if (newURLString == null)
return; // User canceled
URL newURL = null;
try {
newURL = new URL(newURLString);
} catch (MalformedURLException exception) {
JOptionPane.showMessageDialog(frame, "Invalid URL.");
return;
}
if (repoTableModel.urls.contains(newURL)) {
JOptionPane.showMessageDialog(frame, "Repository already exists!");
return;
}
try {
if (newURL.getHost() == null)
return;
InputStream is = newURL.openStream();
is.close();
} catch (IOException ex) {
JOptionPane.showMessageDialog(frame, "Could not access URL.");
return;
}
// Add to table:
repoTableModel.urls.add(newURL);
repoTableModel.fireTableDataChanged();
});
box.add(addURLButton);
// DELETE URL
JButton deleteURLButton = new JButton("Delete selected URL");
deleteURLButton.addActionListener(e -> {
if (JOptionPane.showConfirmDialog(frame, "Really delete this repository?") ==JOptionPane.YES_OPTION) {
repoTableModel.urls.remove(repoTable.getSelectedRow());
repoTableModel.fireTableDataChanged();
}
});
deleteURLButton.setEnabled(false);
box.add(deleteURLButton);
// DONE
JButton OKButton = new JButton("Done");
OKButton.addActionListener(e -> {
AddOnManager.saveRepositoryURLs(repoTableModel.urls);
setVisible(false);
});
box.add(OKButton);
getContentPane().add(box, BorderLayout.PAGE_END);
// Action listeners to disable/enable delete button
ListSelectionModel listSelectionModel = repoTable.getSelectionModel();
listSelectionModel.addListSelectionListener(e -> {
if (e.getValueIsAdjusting())
return;
if (listSelectionModel.isSelectedIndex(0))
deleteURLButton.setEnabled(false);
else
deleteURLButton.setEnabled(true);
});
// Set size and location of dialog
Dimension dim = scrollPane.getPreferredSize();
Dimension dim2 = box.getPreferredSize();
setSize(dim.width + 30, dim.height + dim2.height + 30);
Point frameLocation = frame.getLocation();
Dimension frameSize = frame.getSize();
setLocation(frameLocation.x + frameSize.width / 2 - dim.width / 2,
frameLocation.y + frameSize.height / 2 - dim.height / 2);
}
/**
* Class of tables containing the current list of package repositories.
*/
class RepoTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
public List<URL> urls;
public RepoTableModel(List<URL> urls) {
this.urls = urls;
}
@Override
public int getRowCount() {
return urls.size();
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public String getColumnName(int column) {
return "Package repository URLs";
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return urls.get(rowIndex);
}
}
}