X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Furls%2FUrlLinkTableModel.java;h=02e565ee84c1725ff11b322c44da24e0e963539e;hb=80b889f0cca49103e1b20ed806755a0719789906;hp=0605f02da3720dd9b3bfb9e0dd26d634245d77ea;hpb=e63a4d52c27252dfb83efeeee1bda6c89b6dddec;p=jalview.git diff --git a/src/jalview/urls/UrlLinkTableModel.java b/src/jalview/urls/UrlLinkTableModel.java index 0605f02..02e565e 100644 --- a/src/jalview/urls/UrlLinkTableModel.java +++ b/src/jalview/urls/UrlLinkTableModel.java @@ -21,12 +21,18 @@ package jalview.urls; +import jalview.bin.Console; +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 @@ -38,16 +44,16 @@ import javax.swing.table.AbstractTableModel; 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 data; + // supplier of url data private UrlProviderI dataProvider; + // list of columns to display in table in correct order private List 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 @@ -68,28 +74,35 @@ public class UrlLinkTableModel extends AbstractTableModel data = baseData.getLinksForTable(); displayColumns = UrlLinkDisplay.getDisplayColumnNames(); - // find the default row - defaultRow = 0; + // find the primary row + primaryRow = 0; Iterator 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) { - // update the UrlProvider from data list - dataProvider.setUrlData(data); + try + { + // update the UrlProvider from data list + dataProvider.setUrlData(data); + } catch (IllegalArgumentException ex) + { + Console.error(ex.getMessage()); + } } }); @@ -126,35 +139,50 @@ public class UrlLinkTableModel extends AbstractTableModel 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); } } @@ -183,22 +211,67 @@ public class UrlLinkTableModel extends AbstractTableModel 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 entry) + { + return dataProvider + .isUserEntry(entry.getStringValue(UrlLinkDisplay.ID)); + } + + public boolean isUniqueName(String name) + { + return !dataProvider.contains(name); + } }