001 /** 002 * iFish - An iRiver iHP jukebox database creation tool 003 * 004 * Copyright (C) 2009 Richard "Shred" Körber 005 * http://ifish.shredzone.org 006 * 007 * This program is free software: you can redistribute it and/or modify 008 * it under the terms of the GNU General Public License as published by 009 * the Free Software Foundation, either version 3 of the License, or 010 * (at your option) any later version. 011 * 012 * This program is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 015 * GNU General Public License for more details. 016 * 017 * You should have received a copy of the GNU General Public License 018 * along with this program. If not, see <http://www.gnu.org/licenses/>. 019 */ 020 package net.shredzone.ifish.gui; 021 022 import java.util.HashSet; 023 import java.util.Iterator; 024 import java.util.Set; 025 026 import javax.swing.event.ListDataEvent; 027 import javax.swing.event.ListDataListener; 028 import javax.swing.event.TableModelEvent; 029 import javax.swing.event.TableModelListener; 030 import javax.swing.table.TableModel; 031 032 import net.shredzone.ifish.db.Entry; 033 import net.shredzone.ifish.db.Playlist; 034 import net.shredzone.ifish.i18n.L; 035 036 /** 037 * This is a TableModel for Playlists. 038 * 039 * @author Richard Körber <dev@shredzone.de> 040 * @version $Id: PlaylistTableModel.java 291 2009-04-28 21:29:27Z shred $ 041 */ 042 public class PlaylistTableModel implements TableModel, ListDataListener { 043 private final Playlist playlist; 044 private final Set<TableModelListener> sListener = new HashSet<TableModelListener>(); 045 046 /** 047 * Create a PlaylistTableModel for the given Playlist. 048 * 049 * @param pl Playlist to create a model for. 050 */ 051 public PlaylistTableModel( Playlist pl ) { 052 playlist = pl; 053 } 054 055 /** 056 * Get the number of columns. 057 * 058 * @return Number of columns. 059 */ 060 @Override 061 public int getColumnCount() { 062 return 5; 063 } 064 065 /** 066 * Get the number of rows. 067 * 068 * @return Number of rows. 069 */ 070 @Override 071 public int getRowCount() { 072 return playlist.getSize(); 073 } 074 075 /** 076 * Check if the cell is editable. This is always false. 077 * 078 * @param rowIndex Row index of the cell 079 * @param columnIndex Column index of the cell 080 * @return false 081 */ 082 @Override 083 public boolean isCellEditable( int rowIndex, int columnIndex ) { 084 return false; 085 } 086 087 /** 088 * Get the class of the column. 089 * 090 * @param columnIndex Column index to get the class for 091 * @return The class. 092 */ 093 @Override 094 public Class<?> getColumnClass( int columnIndex ) { 095 if( columnIndex==0 ) { 096 return Integer.class; 097 }else { 098 return String.class; 099 } 100 } 101 102 /** 103 * Get the value of a cell. 104 * 105 * @param rowIndex Cell row. 106 * @param columnIndex Cell column. 107 * @return Value of that cell. 108 */ 109 @Override 110 public Object getValueAt( int rowIndex, int columnIndex ) { 111 Entry entry = getEntryAt( rowIndex ); 112 if( entry==null ) return null; 113 114 Object result = null; 115 switch( columnIndex ) { 116 case 0: result = new Integer( rowIndex+1 ); break; 117 case 1: result = entry.getTitle(); break; 118 case 2: result = entry.getArtist(); break; 119 case 3: result = entry.getAlbum(); break; 120 case 4: result = entry.getFileName(); break; 121 } 122 return result; 123 } 124 125 /** 126 * Get the Entry of a row. 127 * 128 * @param rowIndex Row number 129 * @return Entry at this row, or null 130 */ 131 public Entry getEntryAt( int rowIndex ) { 132 return (Entry) playlist.getElementAt( rowIndex ); 133 } 134 135 /** 136 * Get the playlist. 137 * 138 * @return Playlist 139 */ 140 public Playlist getPlaylist() { 141 return playlist; 142 } 143 144 /** 145 * Set the value of a cell. Always ignored. 146 * 147 * @param aValue New value 148 * @param rowIndex Cell row 149 * @param columnIndex Cell column 150 */ 151 @Override 152 public void setValueAt( Object aValue, int rowIndex, int columnIndex ) { 153 } 154 155 /** 156 * Get the column name. 157 * 158 * @param columnIndex Column 159 * @return Name of the column. 160 */ 161 @Override 162 public String getColumnName( int columnIndex ) { 163 String name = null; 164 switch( columnIndex ) { 165 case 0: name = L.tr("table.head.index"); break; 166 case 1: name = L.tr("table.head.title"); break; 167 case 2: name = L.tr("table.head.artist"); break; 168 case 3: name = L.tr("table.head.album"); break; 169 case 4: name = L.tr("table.head.file"); break; 170 } 171 return name; 172 } 173 174 /** 175 * Add a table model listener. 176 * 177 * @param l TableModelListener to be added. 178 */ 179 @Override 180 public void addTableModelListener( TableModelListener l ) { 181 if( sListener.isEmpty() ) { 182 playlist.addListDataListener( this ); 183 } 184 sListener.add( l ); 185 } 186 187 /** 188 * Remove a table model listener. 189 * 190 * @param l TableModelListener to be removed. 191 */ 192 @Override 193 public void removeTableModelListener( TableModelListener l ) { 194 sListener.remove( l ); 195 if( sListener.isEmpty() ) { 196 playlist.removeListDataListener( this ); 197 } 198 } 199 200 /** 201 * Fire a TableModelEvent according to the ListDataEvent passed. 202 * 203 * @param e ListDataEvent 204 */ 205 protected void fireTableModelListener( ListDataEvent e ) { 206 int type; 207 switch( e.getType() ) { 208 case ListDataEvent.INTERVAL_ADDED: 209 type = TableModelEvent.INSERT; break; 210 211 case ListDataEvent.INTERVAL_REMOVED: 212 type = TableModelEvent.DELETE; break; 213 214 default: 215 type = TableModelEvent.UPDATE; 216 } 217 218 TableModelEvent event = new TableModelEvent( 219 this, 220 e.getIndex0(), 221 e.getIndex1(), 222 TableModelEvent.ALL_COLUMNS, 223 type 224 ); 225 226 for (TableModelListener listener : sListener) { 227 listener.tableChanged( event ); 228 } 229 } 230 231 /** 232 * ListDataListener implementation, do not use. 233 * 234 * @param e ListDataEvent 235 */ 236 @Override 237 public void contentsChanged( ListDataEvent e ) { 238 fireTableModelListener( e ); 239 } 240 241 /** 242 * ListDataListener implementation, do not use. 243 * 244 * @param e ListDataEvent 245 */ 246 @Override 247 public void intervalAdded( ListDataEvent e ) { 248 fireTableModelListener( e ); 249 } 250 251 /** 252 * ListDataListener implementation, do not use. 253 * 254 * @param e ListDataEvent 255 */ 256 @Override 257 public void intervalRemoved( ListDataEvent e ) { 258 fireTableModelListener( e ); 259 } 260 261 }