/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Icy 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.gui.preferences; import icy.gui.component.IcyTable; import icy.plugin.PluginRepositoryLoader; import icy.preferences.RepositoryPreferences; import icy.preferences.RepositoryPreferences.RepositoryInfo; import icy.workspace.WorkspaceRepositoryLoader; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; /** * @author Stephane */ public class RepositoryPreferencePanel extends PreferencePanel implements ListSelectionListener { /** * */ private static final long serialVersionUID = 5676905012950916850L; public static final String NODE_NAME = "Repository"; static final String[] columnNames = {"Name", "Location", "Enabled"}; /** * list of repository */ final ArrayList<RepositoryInfo> repositories; /** * gui */ final AbstractTableModel tableModel; final JTable table; final JButton addButton; final JButton editButton; final JButton removeButton; RepositoryPreferencePanel(PreferenceFrame parent) { super(parent, NODE_NAME, PreferenceFrame.NODE_NAME); repositories = new ArrayList<RepositoryInfo>(); load(); // build buttons addButton = new JButton("add..."); addButton.setToolTipText("Add a new repository"); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addRepository(); } }); editButton = new JButton("edit..."); editButton.setToolTipText("Edit selected repository"); editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { editRepository(getSelectedRepository()); } }); removeButton = new JButton("remove"); removeButton.setToolTipText("Delete selected repository"); removeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeRepository(getSelectedRepository()); } }); final JPanel buttonsPanel = new JPanel(); buttonsPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.PAGE_AXIS)); buttonsPanel.add(addButton); buttonsPanel.add(Box.createVerticalStrut(8)); buttonsPanel.add(editButton); buttonsPanel.add(Box.createVerticalStrut(8)); buttonsPanel.add(removeButton); buttonsPanel.add(Box.createVerticalStrut(8)); buttonsPanel.add(Box.createVerticalGlue()); // build table tableModel = new AbstractTableModel() { /** * */ private static final long serialVersionUID = -8573364273165723214L; @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { return repositories.size(); } @Override public Object getValueAt(int row, int column) { final RepositoryInfo reposInf = repositories.get(row); switch (column) { case 0: return reposInf.getName(); case 1: return reposInf.getLocation(); case 2: return Boolean.valueOf(reposInf.isEnabled()); } return ""; } @Override public boolean isCellEditable(int row, int column) { return (column == 2); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { final RepositoryInfo reposInf = repositories.get(rowIndex); switch (columnIndex) { case 0: case 1: // read only break; case 2: if (aValue instanceof Boolean) reposInf.setEnabled(((Boolean) aValue).booleanValue()); break; } } @Override public Class<?> getColumnClass(int columnIndex) { if (columnIndex == 2) return Boolean.class; return String.class; } }; table = new IcyTable(tableModel); final TableColumnModel colModel = table.getColumnModel(); TableColumn col; // columns setting col = colModel.getColumn(0); col.setMinWidth(80); col.setPreferredWidth(80); col.setMaxWidth(120); col = colModel.getColumn(1); col.setMinWidth(160); col.setPreferredWidth(240); col.setMaxWidth(500); col = colModel.getColumn(2); col.setMinWidth(60); col.setPreferredWidth(60); col.setMaxWidth(60); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getSelectionModel().addListSelectionListener(this); table.setRowSelectionAllowed(true); table.setColumnSelectionAllowed(false); table.setAutoCreateRowSorter(true); table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); final JPanel tablePanel = new JPanel(); tablePanel.setLayout(new BoxLayout(tablePanel, BoxLayout.PAGE_AXIS)); tablePanel.add(table.getTableHeader()); tablePanel.add(new JScrollPane(table)); mainPanel.setLayout(new BorderLayout()); mainPanel.add(tablePanel, BorderLayout.CENTER); mainPanel.add(buttonsPanel, BorderLayout.EAST); mainPanel.validate(); // select first entry in table table.getSelectionModel().setSelectionInterval(0, 0); } @Override protected void load() { repositories.clear(); repositories.addAll(RepositoryPreferences.getRepositeries()); } @Override protected void save() { // save to rpeferences RepositoryPreferences.setRepositeries(repositories); // then reload online plugins and workspace as repositories changed PluginRepositoryLoader.reload(); WorkspaceRepositoryLoader.reload(); // update repositories on Workspace and Plugin panel ((PluginLocalPreferencePanel) getPreferencePanel(PluginLocalPreferencePanel.class)).updateRepositories(); ((PluginOnlinePreferencePanel) getPreferencePanel(PluginOnlinePreferencePanel.class)).updateRepositories(); ((WorkspaceOnlinePreferencePanel) getPreferencePanel(WorkspaceOnlinePreferencePanel.class)) .updateRepositories(); ((WorkspaceLocalPreferencePanel) getPreferencePanel(WorkspaceLocalPreferencePanel.class)).updateRepositories(); } private int getRepositeryIndex(RepositoryInfo reposInf) { return repositories.indexOf(reposInf); } private int getRepositeryModelIndex(RepositoryInfo reposInf) { return getRepositeryIndex(reposInf); } // private int getRepositeryTableIndex(RepositoryInfo reposInf) // { // final int ind = getRepositeryModelIndex(reposInf); // // if (ind != -1) // return table.convertRowIndexToView(ind); // // return ind; // } RepositoryInfo getSelectedRepository() { int index; index = table.getSelectedRow(); if (index == -1) return null; index = table.convertRowIndexToModel(index); if (index == -1) return null; return repositories.get(index); } boolean addRepository() { final RepositoryInfo reposInf = new RepositoryInfo("name", "http://"); if (!new EditRepositoryDialog("Add a new repository", reposInf).isCanceled()) { // add new repository entry repositories.add(reposInf); // get index final int ind = getRepositeryModelIndex(reposInf); // notify data changed tableModel.fireTableRowsInserted(ind, ind); return true; } return false; } boolean editRepository(final RepositoryInfo reposInf) { final int ind = getRepositeryModelIndex(reposInf); if (!new EditRepositoryDialog("Edit repository", reposInf).isCanceled()) { try { // notify data changed tableModel.fireTableRowsUpdated(ind, ind); } catch (Exception e) { // ignore possible exception here } return true; } return false; } boolean removeRepository(final RepositoryInfo reposInf) { final int ind = getRepositeryModelIndex(reposInf); if (repositories.remove(reposInf)) { // notify data changed tableModel.fireTableRowsDeleted(ind, ind); return true; } return false; } private void udpateButtonsState() { final RepositoryInfo selectedRepos = getSelectedRepository(); final boolean enabled = (selectedRepos != null) && !selectedRepos.isDefault(); editButton.setEnabled(enabled); removeButton.setEnabled(enabled); } @Override public void valueChanged(ListSelectionEvent e) { udpateButtonsState(); } }