JAL-2316 Added jalview.urls.* packages
[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.urls.api.UrlProviderI;
26 import jalview.util.UrlLink;
27
28 import java.util.Iterator;
29 import java.util.List;
30
31 import javax.swing.event.TableModelEvent;
32 import javax.swing.event.TableModelListener;
33 import javax.swing.table.AbstractTableModel;
34
35 /**
36  * TableModel for UrlLinks table
37  * 
38  * @author $author$
39  * @version $Revision$
40  */
41
42 public class UrlLinkTableModel extends AbstractTableModel
43 {
44   // local storage of data
45   private List<UrlLinkDisplay> data;
46
47   // supplier of url data
48   private UrlProviderI dataProvider;
49
50   // list of columns to display in table in correct order
51   private List<String> displayColumns;
52
53   // row in table which is currently the default
54   private int defaultRow;
55
56   /**
57    * UrlLinkTableModel constructor
58    * 
59    * @param baseData
60    *          base data set to be presented in table
61    * @param entryNames
62    *          keys of entries in baseData's nested hashmap. Should match order
63    *          in displayColNames
64    * @param displayColNames
65    *          names of columns to display in order.
66    * @param keyColName
67    *          name of column corresponding to keys in baseData
68    */
69   public UrlLinkTableModel(UrlProviderI baseData)
70   {
71     dataProvider = baseData;
72     data = baseData.getLinksForTable();
73     displayColumns = UrlLinkDisplay.getDisplayColumnNames();
74
75     // find the default row
76     defaultRow = 0;
77     Iterator<UrlLinkDisplay> it = data.iterator();
78     while (it.hasNext())
79     {
80       if (it.next().getIsDefault())
81       {
82         break;
83       }
84       else
85       {
86         defaultRow++;
87       }
88     }
89
90     // set up listener which updates data source when table changes
91     this.addTableModelListener(new TableModelListener()
92     {
93       @Override
94       public void tableChanged(TableModelEvent e)
95       {
96         try
97         {
98           // update the UrlProvider from data list
99           dataProvider.setUrlData(data);
100         } catch (IllegalArgumentException ex)
101         {
102           Cache.log.error(ex.getMessage());
103         }
104       }
105     });
106
107   }
108
109   @Override
110   public int getRowCount()
111   {
112     if (data == null)
113     {
114       return 0;
115     }
116     else
117     {
118       return data.size();
119     }
120   }
121
122   @Override
123   public int getColumnCount()
124   {
125     return displayColumns.size();
126   }
127
128   @Override
129   public Object getValueAt(int rowIndex, int columnIndex)
130   {
131     return data.get(rowIndex).getValue(columnIndex);
132   }
133
134   @Override
135   public boolean isCellEditable(int rowIndex, int columnIndex)
136   {
137     return data.get(rowIndex).isEditable(columnIndex);
138   }
139
140   @Override
141   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
142   {
143     if (columnIndex == UrlLinkDisplay.DEFAULT)
144     {
145       // Default url column: exactly one row must always be true
146       if (rowIndex != defaultRow)
147       {
148         // selected row is not currently the default
149         // set the current default to false
150         data.get(defaultRow).setValue(columnIndex, false);
151         fireTableRowsUpdated(defaultRow, defaultRow);
152
153         // set the default to be the selected row
154         defaultRow = rowIndex;
155         data.get(rowIndex).setValue(columnIndex, aValue);
156
157         fireTableRowsUpdated(rowIndex, rowIndex);
158       }
159     }
160     else
161     {
162       data.get(rowIndex).setValue(columnIndex, aValue);
163       fireTableRowsUpdated(rowIndex, rowIndex);
164     }
165   }
166
167   @Override
168   public Class<?> getColumnClass(int columnIndex)
169   {
170     return getValueAt(0, columnIndex).getClass();
171   }
172
173   @Override
174   public String getColumnName(int columnIndex)
175   {
176     return displayColumns.get(columnIndex);
177   }
178
179   public void removeRow(int rowIndex)
180   {
181     // remove the row from data
182     data.remove(rowIndex);
183
184     // update default row
185     if (defaultRow > rowIndex)
186     {
187       defaultRow--;
188     }
189
190     // fire update which will update data source
191     fireTableRowsDeleted(rowIndex, rowIndex);
192   }
193
194   public int insertRow(String name, String url)
195   {
196     // add a row to the data
197     UrlLink link = new UrlLink(name, url);
198     UrlLinkDisplay u = new UrlLinkDisplay(name, link, true, false);
199     int index = data.size();
200     data.add(u);
201
202     // fire update which will update data source
203     fireTableRowsInserted(index, index);
204     return index;
205   }
206
207   public int getDefaultColumn()
208   {
209     return UrlLinkDisplay.DEFAULT;
210   }
211
212   public int getNameColumn()
213   {
214     return UrlLinkDisplay.NAME;
215   }
216
217   public int getIdColumn()
218   {
219     return UrlLinkDisplay.ID;
220   }
221
222   public int getUrlColumn()
223   {
224     return UrlLinkDisplay.URL;
225   }
226
227   public int getSelectedColumn()
228   {
229     return UrlLinkDisplay.SELECTED;
230   }
231 }