JAL-2316 Restructure identifiers.org download
[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 java.util.Iterator;
25 import java.util.List;
26
27 import javax.swing.event.TableModelEvent;
28 import javax.swing.event.TableModelListener;
29 import javax.swing.table.AbstractTableModel;
30
31 /**
32  * TableModel for UrlLinks table
33  * 
34  * @author $author$
35  * @version $Revision$
36  */
37
38 public class UrlLinkTableModel extends AbstractTableModel
39 {
40   // local storage of data
41   // use LinkedHashMap to guarantee ordering remains the same, as
42   // we need to maintain a row/col mapping into the HashMap
43   private List<UrlLinkDisplay> data;
44
45   private UrlProviderI dataProvider;
46
47   private List<String> displayColumns;
48
49   // row in table which is currently the default
50   private int defaultRow;
51
52   /**
53    * UrlLinkTableModel constructor
54    * 
55    * @param baseData
56    *          base data set to be presented in table
57    * @param entryNames
58    *          keys of entries in baseData's nested hashmap. Should match order
59    *          in displayColNames
60    * @param displayColNames
61    *          names of columns to display in order.
62    * @param keyColName
63    *          name of column corresponding to keys in baseData
64    */
65   public UrlLinkTableModel(UrlProviderI baseData)
66   {
67     dataProvider = baseData;
68     data = baseData.getLinksForTable();
69     displayColumns = UrlLinkDisplay.getDisplayColumnNames();
70
71     // find the default row
72     defaultRow = 0;
73     Iterator<UrlLinkDisplay> it = data.iterator();
74     while (it.hasNext())
75     {
76       if (it.next().getIsDefault())
77       {
78         break;
79       }
80       else
81       {
82         defaultRow++;
83       }
84     }
85
86     this.addTableModelListener(new TableModelListener()
87     {
88       @Override
89       public void tableChanged(TableModelEvent e)
90       {
91         // update the UrlProvider from data list
92         dataProvider.setUrlData(data);
93       }
94     });
95
96   }
97
98   @Override
99   public int getRowCount()
100   {
101     if (data == null)
102     {
103       return 0;
104     }
105     else
106     {
107       return data.size();
108     }
109   }
110
111   @Override
112   public int getColumnCount()
113   {
114     return displayColumns.size();
115   }
116
117   @Override
118   public Object getValueAt(int rowIndex, int columnIndex)
119   {
120     return data.get(rowIndex).getValue(columnIndex);
121   }
122
123   @Override
124   public boolean isCellEditable(int rowIndex, int columnIndex)
125   {
126     return data.get(rowIndex).isEditable(columnIndex);
127   }
128
129   @Override
130   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
131   {
132     if ((columnIndex == UrlLinkDisplay.SELECTED)
133             && (rowIndex == defaultRow))
134     {
135       // Selected urls column: can't deselect default URL
136       // refuse to edit: TODO show message box here
137
138     }
139     else if (columnIndex == UrlLinkDisplay.DEFAULT)
140     {
141       // Default url column: exactly one row must always be true
142       if (rowIndex != defaultRow)
143       {
144         // selected row is not currently the default
145         // set the current default to false
146         data.get(defaultRow).setValue(columnIndex, false);
147         fireTableRowsUpdated(defaultRow, defaultRow);
148
149         // set the default to be the selected row
150         defaultRow = rowIndex;
151         data.get(rowIndex).setValue(columnIndex, aValue);
152
153         // default row must also be selected
154         if (!data.get(rowIndex).getIsSelected())
155         {
156           data.get(rowIndex).setValue(UrlLinkDisplay.SELECTED, true);
157         }
158         fireTableRowsUpdated(rowIndex, rowIndex);
159       }
160     }
161     else
162     {
163       data.get(rowIndex).setValue(columnIndex, aValue);
164       fireTableRowsUpdated(rowIndex, rowIndex);
165     }
166   }
167
168   @Override
169   public Class<?> getColumnClass(int columnIndex)
170   {
171     return getValueAt(0, columnIndex).getClass();
172   }
173
174   @Override
175   public String getColumnName(int columnIndex)
176   {
177     return displayColumns.get(columnIndex);
178   }
179
180   public void removeRow(int rowIndex)
181   {
182     // remove the row from data
183     data.remove(rowIndex);
184
185     // update default row
186     if (defaultRow > rowIndex)
187     {
188       defaultRow--;
189     }
190
191     fireTableRowsDeleted(rowIndex, rowIndex);
192   }
193
194   public int insertRow(String name, String url)
195   {
196     // add a row to the data
197     UrlLinkDisplay u = new UrlLinkDisplay(name, name, url, true, false);
198     int index = data.size();
199     data.add(u);
200     fireTableRowsInserted(index, index);
201     return index;
202   }
203
204 }