X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Furls%2FUrlLinkTableModel.java;h=a0f42f021dfbbf33087f27a34c803aca9ec894d5;hb=2dea2608f1b4acefbedaaa88f931080ed882fc71;hp=edf25617890c7fb056205aa0a1962746718e20ed;hpb=44fc22cf950ff114ce3a5a07600e7a7eb5fd1216;p=jalview.git diff --git a/src/jalview/urls/UrlLinkTableModel.java b/src/jalview/urls/UrlLinkTableModel.java index edf2561..a0f42f0 100644 --- a/src/jalview/urls/UrlLinkTableModel.java +++ b/src/jalview/urls/UrlLinkTableModel.java @@ -21,10 +21,18 @@ package jalview.urls; +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 @@ -36,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 @@ -66,20 +74,38 @@ 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) + { + try + { + // update the UrlProvider from data list + dataProvider.setUrlData(data); + } catch (IllegalArgumentException ex) + { + Cache.log.error(ex.getMessage()); + } + } + }); + } @Override @@ -113,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); } } @@ -164,36 +205,73 @@ public class UrlLinkTableModel extends AbstractTableModel 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 entry) + { + return dataProvider + .isUserEntry(entry.getStringValue(UrlLinkDisplay.ID)); + } + + public boolean isUniqueName(String name) + { + return !dataProvider.contains(name); + } }