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 &lt;dev@shredzone.de&gt;
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    }