a18341bb0ba1dc607f069a827e6fdc218351353a
[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   private List<UrlLinkDisplay> data;
42
43   // supplier of url data
44   private UrlProviderI dataProvider;
45
46   // list of columns to display in table in correct order
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     // set up listener which updates data source when table changes
87     this.addTableModelListener(new TableModelListener()
88     {
89       @Override
90       public void tableChanged(TableModelEvent e)
91       {
92         // update the UrlProvider from data list
93         dataProvider.setUrlData(data);
94       }
95     });
96
97   }
98
99   @Override
100   public int getRowCount()
101   {
102     if (data == null)
103     {
104       return 0;
105     }
106     else
107     {
108       return data.size();
109     }
110   }
111
112   @Override
113   public int getColumnCount()
114   {
115     return displayColumns.size();
116   }
117
118   @Override
119   public Object getValueAt(int rowIndex, int columnIndex)
120   {
121     return data.get(rowIndex).getValue(columnIndex);
122   }
123
124   @Override
125   public boolean isCellEditable(int rowIndex, int columnIndex)
126   {
127     return data.get(rowIndex).isEditable(columnIndex);
128   }
129
130   @Override
131   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
132   {
133     if (columnIndex == UrlLinkDisplay.DEFAULT)
134     {
135       // Default url column: exactly one row must always be true
136       if (rowIndex != defaultRow)
137       {
138         // selected row is not currently the default
139         // set the current default to false
140         data.get(defaultRow).setValue(columnIndex, false);
141         fireTableRowsUpdated(defaultRow, defaultRow);
142
143         // set the default to be the selected row
144         defaultRow = rowIndex;
145         data.get(rowIndex).setValue(columnIndex, aValue);
146
147         fireTableRowsUpdated(rowIndex, rowIndex);
148       }
149     }
150     else
151     {
152       data.get(rowIndex).setValue(columnIndex, aValue);
153       fireTableRowsUpdated(rowIndex, rowIndex);
154     }
155   }
156
157   @Override
158   public Class<?> getColumnClass(int columnIndex)
159   {
160     return getValueAt(0, columnIndex).getClass();
161   }
162
163   @Override
164   public String getColumnName(int columnIndex)
165   {
166     return displayColumns.get(columnIndex);
167   }
168
169   public void removeRow(int rowIndex)
170   {
171     // remove the row from data
172     data.remove(rowIndex);
173
174     // update default row
175     if (defaultRow > rowIndex)
176     {
177       defaultRow--;
178     }
179
180     // fire update which will update data source
181     fireTableRowsDeleted(rowIndex, rowIndex);
182   }
183
184   public int insertRow(String name, String url)
185   {
186     // add a row to the data
187     UrlLinkDisplay u = new UrlLinkDisplay(name, name, url, true, false);
188     int index = data.size();
189     data.add(u);
190
191     // fire update which will update data source
192     fireTableRowsInserted(index, index);
193     return index;
194   }
195
196 }