import jalview.jbgui.GPreferences;
import jalview.jbgui.GSequenceLink;
import jalview.schemes.ColourSchemeProperty;
+import jalview.urls.UrlLinkTableModel;
import jalview.urls.UrlProvider;
import jalview.urls.UrlProviderI;
import jalview.util.MessageManager;
import jalview.util.Platform;
+import jalview.util.UrlConstants;
import jalview.ws.sifts.SiftsSettings;
import java.awt.BorderLayout;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import java.util.Vector;
import javax.help.HelpSetException;
import javax.swing.JColorChooser;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
+import javax.swing.ListSelectionModel;
+import javax.swing.RowFilter;
+import javax.swing.RowSorter;
+import javax.swing.SortOrder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
*/
public static UrlProviderI sequenceUrlLinks;
+ public static UrlLinkTableModel dataModel;
+
/**
* Holds name and link separated with | character. Sequence IDS and Sequences
* must be $SEQUENCEIDS$ or $SEQUENCEIDS=/.possible | chars ./=$ and
static
{
String string = Cache.getDefault("SEQUENCE_LINKS",
- UrlProviderI.DEFAULT_STRING);
- sequenceUrlLinks = new UrlProvider(UrlProviderI.DEFAULT_LABEL, string);
+ UrlConstants.DEFAULT_STRING);
+ sequenceUrlLinks = new UrlProvider(UrlConstants.DEFAULT_LABEL, string);
+ dataModel = new UrlLinkTableModel(sequenceUrlLinks);
/**
* TODO: reformulate groupURL encoding so two or more can be stored in the
groupURLLinks = new ArrayList<String>();
}
- Vector<String> nameLinks, urlLinks;
-
JInternalFrame frame;
DasSourceBrowser dasSource;
/*
* Set Connections tab defaults
*/
- nameLinks = new Vector<String>();
- urlLinks = new Vector<String>();
- resetStoredLinks();
- updateLinkData();
+ // set up sorting
+ linkUrlTable.setModel(dataModel);
+ final TableRowSorter<TableModel> sorter = new TableRowSorter<>(
+ linkUrlTable.getModel());
+ linkUrlTable.setRowSorter(sorter);
+ List<RowSorter.SortKey> sortKeys = new ArrayList<>();
+
+ sortKeys.add(new RowSorter.SortKey(3,
+ SortOrder.DESCENDING));
+ sortKeys.add(new RowSorter.SortKey(2, SortOrder.DESCENDING));
+ sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
+
+ sorter.setSortKeys(sortKeys);
+ sorter.sort();
+
+ // set up filtering
+ ActionListener onReset;
+ onReset = new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ filterTB.setText("");
+ sorter.setRowFilter(RowFilter.regexFilter(""));
+ }
+
+ };
+ doReset.addActionListener(onReset);
+
+ // filter to display only custom urls
+ final RowFilter<TableModel, Object> customUrlFilter = new RowFilter<TableModel, Object>()
+ {
+ @Override
+ public boolean include(
+ Entry<? extends TableModel, ? extends Object> entry)
+ {
+ String id = entry.getStringValue(4);
+ return sequenceUrlLinks.isUserEntry(id);
+ }
+ };
+
+ final TableRowSorter<TableModel> customSorter = new TableRowSorter<>(
+ linkUrlTable.getModel());
+ customSorter.setRowFilter(customUrlFilter);
+
+ ActionListener onCustomOnly;
+ onCustomOnly = new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ filterTB.setText("");
+ sorter.setRowFilter(customUrlFilter);
+ }
+ };
+ userOnly.addActionListener(onCustomOnly);
+
+ filterTB.getDocument().addDocumentListener(new DocumentListener()
+ {
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ sorter.setRowFilter(RowFilter.regexFilter("(?i)"
+ + filterTB.getText()));
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ sorter.setRowFilter(RowFilter.regexFilter("(?i)"
+ + filterTB.getText()));
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ sorter.setRowFilter(RowFilter.regexFilter("(?i)"
+ + filterTB.getText()));
+ }
+ });
+
+ // set up list selection functionality
+ linkUrlTable.getSelectionModel().addListSelectionListener(
+ new UrlListSelectionHandler());
+
+ // set up radio buttons
+ linkUrlTable.getColumn("Default").setCellRenderer(
+ new RadioButtonRenderer());
+ linkUrlTable.getColumn("Default")
+ .setCellEditor(new RadioButtonEditor());
+
+ // get boolean columns and resize those to min possible
+ for (int column = 0; column < linkUrlTable.getColumnCount(); column++)
+ {
+ if (linkUrlTable.getModel().getColumnClass(column)
+ .equals(Boolean.class))
+ {
+ TableColumn tableColumn = linkUrlTable.getColumnModel().getColumn(
+ column);
+ int preferredWidth = tableColumn.getMinWidth();
+
+ TableCellRenderer cellRenderer = linkUrlTable.getCellRenderer(0,
+ column);
+ Component c = linkUrlTable.prepareRenderer(cellRenderer, 0, column);
+ int cwidth = c.getPreferredSize().width
+ + linkUrlTable.getIntercellSpacing().width;
+ preferredWidth = Math.max(preferredWidth, cwidth);
+
+ tableColumn.setPreferredWidth(preferredWidth);
+ }
+ }
useProxy.setSelected(Cache.getDefault("USE_PROXY", false));
+ useProxy_actionPerformed(); // make sure useProxy is correctly initialised
proxyServerTB.setEnabled(useProxy.isSelected());
proxyPortTB.setEnabled(useProxy.isSelected());
proxyServerTB.setText(Cache.getDefault("PROXY_SERVER", ""));
jalview.util.BrowserLauncher.resetBrowser();
// save user-defined and selected links
- String links = sequenceUrlLinks.writeUrlsAsString();
+ String links = linkUrlTable.getModel().toString();
if (links.isEmpty())
{
Cache.applicationProperties.remove("SEQUENCE_LINKS");
@Override
public void newLink_actionPerformed(ActionEvent e)
{
-
GSequenceLink link = new GSequenceLink();
boolean valid = false;
while (!valid)
{
if (link.checkValid())
{
- nameLinks.addElement(link.getName());
- urlLinks.addElement(link.getURL());
- if (updateLinkData())
- {
- valid = true;
- }
- else
- {
- break;
- }
+ ((UrlLinkTableModel) linkUrlTable.getModel()).insertRow(
+ link.getName(), link.getURL());
+ valid = true;
}
}
else
{
GSequenceLink link = new GSequenceLink();
- int index = linkNameList.getSelectedIndex();
+ int index = linkUrlTable.getSelectedRow();
if (index == -1)
{
+ // no row was selected
JOptionPane.showInternalMessageDialog(Desktop.desktop,
MessageManager.getString("label.no_link_selected"),
MessageManager.getString("label.no_link_selected"),
return;
}
- link.setName(nameLinks.elementAt(index).toString());
- link.setURL(urlLinks.elementAt(index).toString());
+ link.setName(linkUrlTable.getValueAt(index, 0).toString());
+ link.setURL(linkUrlTable.getValueAt(index, 1).toString());
boolean valid = false;
while (!valid)
{
-
if (JOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
MessageManager.getString("label.new_sequence_url_link"),
JOptionPane.OK_CANCEL_OPTION, -1, null) == JOptionPane.OK_OPTION)
{
if (link.checkValid())
{
- nameLinks.setElementAt(link.getName(), index);
- urlLinks.setElementAt(link.getURL(), index);
- if (updateLinkData())
- {
- valid = true;
- }
- else
- {
- break;
- }
+ linkUrlTable.setValueAt(link.getName(), index, 0);
+ linkUrlTable.setValueAt(link.getURL(), index, 1);
+ valid = true;
}
}
-
else
{
break;
@Override
public void deleteLink_actionPerformed(ActionEvent e)
{
- int index = linkNameList.getSelectedIndex();
+ int index = linkUrlTable.getSelectedRow();
+ int modelIndex = -1;
if (index == -1)
{
+ // no row is selected
JOptionPane.showInternalMessageDialog(Desktop.desktop,
MessageManager.getString("label.no_link_selected"),
MessageManager.getString("label.no_link_selected"),
JOptionPane.WARNING_MESSAGE);
return;
}
- nameLinks.removeElementAt(index);
- urlLinks.removeElementAt(index);
- updateLinkData();
- }
-
- private boolean updateLinkData()
- {
- try
- {
- sequenceUrlLinks.setUrlLinks(nameLinks, urlLinks);
- linkNameList.setListData(nameLinks);
- linkURLList.setListData(urlLinks);
- } catch (IllegalArgumentException e)
+ else
{
-
- // put back the old links
- resetStoredLinks();
-
- linkNameList.setListData(nameLinks);
- linkURLList.setListData(urlLinks);
-
- JOptionPane.showInternalMessageDialog(Desktop.desktop,
- e.getMessage(), MessageManager.getString("label.link_name"),
- JOptionPane.WARNING_MESSAGE);
-
- return false;
+ modelIndex = linkUrlTable.convertRowIndexToModel(index);
}
- return true;
- }
- private void resetStoredLinks()
- {
- Vector<String> nlinks = sequenceUrlLinks.getLinksForDisplay();
-
- nameLinks.clear();
- urlLinks.clear();
- for (String entry : nlinks)
- {
- nameLinks.addElement(entry.split("\\|")[0]);
- urlLinks.addElement(entry.split("\\|")[1]);
- }
+ // make sure we use the model index to delete, and not the table index
+ ((UrlLinkTableModel) linkUrlTable.getModel()).removeRow(modelIndex);
}
+
@Override
public void defaultBrowser_mouseClicked(MouseEvent e)
{
return name.hashCode() + code.hashCode();
}
}
+
+ private class UrlListSelectionHandler implements ListSelectionListener
+ {
+
+ @Override
+ public void valueChanged(ListSelectionEvent e)
+ {
+ ListSelectionModel lsm = (ListSelectionModel) e.getSource();
+
+ int index = lsm.getMinSelectionIndex();
+ if (index == -1)
+ {
+ // no selection, so disable delete/edit buttons
+ editLink.setEnabled(false);
+ deleteLink.setEnabled(false);
+ return;
+ }
+ int modelIndex = linkUrlTable.convertRowIndexToModel(index);
+
+ // determine if the new selection is a custom url or not
+ if (!sequenceUrlLinks.isUserEntry((String) linkUrlTable
+.getModel()
+ .getValueAt(modelIndex, 4))) // KM TODO do this better
+ {
+ // entry is not a user-defined url and so should not be edited
+ // disable edit and delete buttons
+ deleteLink.setEnabled(false);
+ editLink.setEnabled(false);
+ }
+ else
+ {
+ deleteLink.setEnabled(true);
+ editLink.setEnabled(true);
+ }
+
+ // BUT it's the default url, don't allow deletion
+ if ((boolean) linkUrlTable.getValueAt(index, 3))
+ {
+ deleteLink.setEnabled(false);
+ }
+ }
+}
}