package jalview.urls;
-import java.util.ArrayList;
+import jalview.bin.Cache;
+import jalview.urls.api.UrlProviderI;
+import jalview.util.UrlLink;
+
import java.util.Iterator;
import java.util.List;
+import javax.swing.RowFilter.Entry;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
/**
* TableModel for UrlLinks table
public class UrlLinkTableModel extends AbstractTableModel
{
// local storage of data
- // use LinkedHashMap to guarantee ordering remains the same, as
- // we need to maintain a row/col mapping into the HashMap
private List<UrlLinkDisplay> data;
+ // supplier of url data
private UrlProviderI dataProvider;
+ // list of columns to display in table in correct order
private List<String> displayColumns;
- // row in table which is currently the default
- private int defaultRow;
+ // row in table which is currently the primary
+ private int primaryRow;
/**
* UrlLinkTableModel constructor
* @param keyColName
* name of column corresponding to keys in baseData
*/
- public UrlLinkTableModel(UrlProviderI baseData,
- List<String> displayColNames,
- String keyColName)
+ public UrlLinkTableModel(UrlProviderI baseData)
{
dataProvider = baseData;
data = baseData.getLinksForTable();
- displayColumns = new ArrayList<String>();
- displayColumns.add(keyColName);
- displayColumns.addAll(displayColNames);
+ displayColumns = UrlLinkDisplay.getDisplayColumnNames();
- // find the default row
- defaultRow = 0;
+ // find the primary row
+ primaryRow = 0;
Iterator<UrlLinkDisplay> it = data.iterator();
while (it.hasNext())
{
- if (it.next().getIsDefault())
+ if (it.next().getIsPrimary())
{
break;
}
else
{
- defaultRow++;
+ primaryRow++;
}
}
+
+ // set up listener which updates data source when table changes
+ this.addTableModelListener(new TableModelListener()
+ {
+ @Override
+ public void tableChanged(TableModelEvent e)
+ {
+ try
+ {
+ // update the UrlProvider from data list
+ dataProvider.setUrlData(data);
+ } catch (IllegalArgumentException ex)
+ {
+ Cache.log.error(ex.getMessage());
+ }
+ }
+ });
+
}
@Override
return data.get(rowIndex).isEditable(columnIndex);
}
+ /**
+ * Determine if a row is editable indirectly (rather than directly in table as
+ * in isCellEditable)
+ *
+ * @param rowIndex
+ * @return true if row can be edited indirectly
+ */
+ public boolean isRowEditable(int rowIndex)
+ {
+ // to edit, row must be a user entered row
+ return (dataProvider.isUserEntry(data.get(rowIndex).getId()));
+ }
+
+ /**
+ * Determine if a row is deletable
+ *
+ * @param rowIndex
+ * the row to be tested
+ * @return true if row can be deleted
+ */
+ public boolean isRowDeletable(int rowIndex)
+ {
+ // to delete, row must be a user entered row, and not the default row
+ return (dataProvider.isUserEntry(data.get(rowIndex).getId())
+ && !data.get(rowIndex).getIsPrimary());
+ }
+
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
- if ((columnIndex == UrlLinkDisplay.SELECTED)
- && (rowIndex == defaultRow))
- {
- // Selected urls column: can't deselect default URL
- // refuse to edit: TODO show message box here
-
- }
- else if (columnIndex == UrlLinkDisplay.DEFAULT)
+ if (columnIndex == UrlLinkDisplay.PRIMARY)
{
// Default url column: exactly one row must always be true
- if (rowIndex != defaultRow)
+ if (rowIndex != primaryRow)
{
// selected row is not currently the default
// set the current default to false
- data.get(defaultRow).setValue(columnIndex, false);
- fireTableRowsUpdated(defaultRow, defaultRow);
+ data.get(primaryRow).setValue(columnIndex, false);
+ fireTableRowsUpdated(primaryRow, primaryRow);
// set the default to be the selected row
- defaultRow = rowIndex;
+ primaryRow = rowIndex;
data.get(rowIndex).setValue(columnIndex, aValue);
- // default row must also be selected
- if (!data.get(rowIndex).getIsSelected())
- {
- data.get(rowIndex).setValue(UrlLinkDisplay.SELECTED, true);
- }
fireTableRowsUpdated(rowIndex, rowIndex);
}
}
return displayColumns.get(columnIndex);
}
- @Override
- public String toString()
- {
- // update the UrlProvider from data list
- dataProvider.setUrlData(data);
-
- return dataProvider.writeUrlsAsString();
- }
-
public void removeRow(int rowIndex)
{
// remove the row from data
data.remove(rowIndex);
// update default row
- if (defaultRow > rowIndex)
+ if (primaryRow > rowIndex)
{
- defaultRow--;
+ primaryRow--;
}
+ // fire update which will update data source
fireTableRowsDeleted(rowIndex, rowIndex);
}
public int insertRow(String name, String url)
{
// add a row to the data
- UrlLinkDisplay u = new UrlLinkDisplay(name, name, url, true, false);
+ UrlLink link = new UrlLink(name, url, name);
+ UrlLinkDisplay u = new UrlLinkDisplay(name, link, true, false);
int index = data.size();
data.add(u);
+
+ // fire update which will update data source
fireTableRowsInserted(index, index);
return index;
}
+
+ public int getPrimaryColumn()
+ {
+ return UrlLinkDisplay.PRIMARY;
+ }
+
+ public int getNameColumn()
+ {
+ return UrlLinkDisplay.NAME;
+ }
+
+ public int getDatabaseColumn()
+ {
+ return UrlLinkDisplay.DATABASE;
+ }
+
+ public int getIdColumn()
+ {
+ return UrlLinkDisplay.ID;
+ }
+
+ public int getUrlColumn()
+ {
+ return UrlLinkDisplay.URL;
+ }
+
+ public int getSelectedColumn()
+ {
+ return UrlLinkDisplay.SELECTED;
+ }
+
+ public boolean isUserEntry(
+ Entry<? extends TableModel, ? extends Object> entry)
+ {
+ return dataProvider
+ .isUserEntry(entry.getStringValue(UrlLinkDisplay.ID));
+ }
+
+ public boolean isUniqueName(String name)
+ {
+ return !dataProvider.contains(name);
+ }
}