JAL-2316 Unit test updates and associated minor changes and fixes.
[jalview.git] / src / jalview / urls / UrlLinkTableModel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.urls;
23
24 import jalview.bin.Cache;
25 import jalview.util.UrlLink;
26
27 import java.util.Iterator;
28 import java.util.List;
29
30 import javax.swing.event.TableModelEvent;
31 import javax.swing.event.TableModelListener;
32 import javax.swing.table.AbstractTableModel;
33
34 /**
35  * TableModel for UrlLinks table
36  * 
37  * @author $author$
38  * @version $Revision$
39  */
40
41 public class UrlLinkTableModel extends AbstractTableModel
42 {
43   // local storage of data
44   private List<UrlLinkDisplay> data;
45
46   // supplier of url data
47   private UrlProviderI dataProvider;
48
49   // list of columns to display in table in correct order
50   private List<String> displayColumns;
51
52   // row in table which is currently the default
53   private int defaultRow;
54
55   /**
56    * UrlLinkTableModel constructor
57    * 
58    * @param baseData
59    *          base data set to be presented in table
60    * @param entryNames
61    *          keys of entries in baseData's nested hashmap. Should match order
62    *          in displayColNames
63    * @param displayColNames
64    *          names of columns to display in order.
65    * @param keyColName
66    *          name of column corresponding to keys in baseData
67    */
68   public UrlLinkTableModel(UrlProviderI baseData)
69   {
70     dataProvider = baseData;
71     data = baseData.getLinksForTable();
72     displayColumns = UrlLinkDisplay.getDisplayColumnNames();
73
74     // find the default row
75     defaultRow = 0;
76     Iterator<UrlLinkDisplay> it = data.iterator();
77     while (it.hasNext())
78     {
79       if (it.next().getIsDefault())
80       {
81         break;
82       }
83       else
84       {
85         defaultRow++;
86       }
87     }
88
89     // set up listener which updates data source when table changes
90     this.addTableModelListener(new TableModelListener()
91     {
92       @Override
93       public void tableChanged(TableModelEvent e)
94       {
95         try
96         {
97           // update the UrlProvider from data list
98           dataProvider.setUrlData(data);
99         } catch (IllegalArgumentException ex)
100         {
101           Cache.log.error(ex.getMessage());
102         }
103       }
104     });
105
106   }
107
108   @Override
109   public int getRowCount()
110   {
111     if (data == null)
112     {
113       return 0;
114     }
115     else
116     {
117       return data.size();
118     }
119   }
120
121   @Override
122   public int getColumnCount()
123   {
124     return displayColumns.size();
125   }
126
127   @Override
128   public Object getValueAt(int rowIndex, int columnIndex)
129   {
130     return data.get(rowIndex).getValue(columnIndex);
131   }
132
133   @Override
134   public boolean isCellEditable(int rowIndex, int columnIndex)
135   {
136     return data.get(rowIndex).isEditable(columnIndex);
137   }
138
139   @Override
140   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
141   {
142     if (columnIndex == UrlLinkDisplay.DEFAULT)
143     {
144       // Default url column: exactly one row must always be true
145       if (rowIndex != defaultRow)
146       {
147         // selected row is not currently the default
148         // set the current default to false
149         data.get(defaultRow).setValue(columnIndex, false);
150         fireTableRowsUpdated(defaultRow, defaultRow);
151
152         // set the default to be the selected row
153         defaultRow = rowIndex;
154         data.get(rowIndex).setValue(columnIndex, aValue);
155
156         fireTableRowsUpdated(rowIndex, rowIndex);
157       }
158     }
159     else
160     {
161       data.get(rowIndex).setValue(columnIndex, aValue);
162       fireTableRowsUpdated(rowIndex, rowIndex);
163     }
164   }
165
166   @Override
167   public Class<?> getColumnClass(int columnIndex)
168   {
169     return getValueAt(0, columnIndex).getClass();
170   }
171
172   @Override
173   public String getColumnName(int columnIndex)
174   {
175     return displayColumns.get(columnIndex);
176   }
177
178   public void removeRow(int rowIndex)
179   {
180     // remove the row from data
181     data.remove(rowIndex);
182
183     // update default row
184     if (defaultRow > rowIndex)
185     {
186       defaultRow--;
187     }
188
189     // fire update which will update data source
190     fireTableRowsDeleted(rowIndex, rowIndex);
191   }
192
193   public int insertRow(String name, String url)
194   {
195     // add a row to the data
196     UrlLink link = new UrlLink(name, url);
197     UrlLinkDisplay u = new UrlLinkDisplay(name, link, true, false);
198     int index = data.size();
199     data.add(u);
200
201     // fire update which will update data source
202     fireTableRowsInserted(index, index);
203     return index;
204   }
205
206   public int getDefaultColumn()
207   {
208     return UrlLinkDisplay.DEFAULT;
209   }
210
211   public int getNameColumn()
212   {
213     return UrlLinkDisplay.NAME;
214   }
215
216   public int getIdColumn()
217   {
218     return UrlLinkDisplay.ID;
219   }
220
221   public int getUrlColumn()
222   {
223     return UrlLinkDisplay.URL;
224   }
225
226   public int getSelectedColumn()
227   {
228     return UrlLinkDisplay.SELECTED;
229   }
230 }