/* * Copyright (c) 2008, 2009, 2010 Denis Tulskiy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. */ package com.tulskiy.musique.gui.model; import java.util.LinkedList; import java.util.List; import javax.swing.table.AbstractTableModel; import com.tulskiy.musique.playlist.Track; import com.tulskiy.musique.util.Util; /** * @author mliauchuk */ public class SingleTagFieldModel extends AbstractTableModel implements TagFieldModel { private TrackInfoItem trackInfoItem; private Track selectedTrack; private List<String> oldValues = new LinkedList<String>(); private List<String> newValues = new LinkedList<String>(); public SingleTagFieldModel(TrackInfoItem item) { this(item, null); } public SingleTagFieldModel(TrackInfoItem item, Track track) { trackInfoItem = item; selectedTrack = track; trackInfoItem.addState(); initValues(); if (getRowCount() == 0) { addValue(); } } public TrackInfoItem getTrackInfoItem() { return trackInfoItem; } public boolean isMultiTrackEditMode() { return selectedTrack == null; } private void initValues() { oldValues.clear(); newValues.clear(); if (isMultiTrackEditMode()) { for (Track track : trackInfoItem.getTracks()) { oldValues.add(track.getTrackData().getFileName()); newValues.add(Util.formatFieldValues(trackInfoItem.getState().getValues(track))); } } else { FieldValues values = trackInfoItem.getState().getValues(selectedTrack); values.setFieldValuesToList(oldValues); values.setFieldValuesToList(newValues); } } public void addValue() { oldValues.add("<new value>"); newValues.add(""); } public void removeValue(int index) { oldValues.remove(index); newValues.remove(index); } private void updateState() { if (isMultiTrackEditMode()) { for (int i = 0; i < newValues.size(); i++) { Track track = trackInfoItem.getTracks().get(i); String oldValue = Util.formatFieldValues(trackInfoItem.getState().getValues(track)); if (!oldValue.equals(newValues.get(i))) { trackInfoItem.getState().setValue(newValues.get(i), track); } } } else { if (newValues.isEmpty()) { trackInfoItem.getState().setValue("", selectedTrack); } else { trackInfoItem.getState().setValue(newValues.get(0), selectedTrack); for (int i = 1; i < newValues.size(); i++) { trackInfoItem.getState().addValue(newValues.get(i), selectedTrack); } } } } public void approveState() { trackInfoItem.approveState(false); initValues(); } public void approveModel() { updateState(); approveState(); } public void approveModel(String singleValue) { if (isMultiTrackEditMode()) { trackInfoItem.getState().setValue(singleValue); } else { trackInfoItem.getState().setValue(singleValue, selectedTrack); } approveState(); } public void refreshModel() { initValues(); } public void rejectModel() { trackInfoItem.rejectState(); initValues(); } @Override public int getRowCount() { return oldValues.size(); } @Override public int getColumnCount() { return 2; } @Override public String getValueAt(int rowIndex, int columnIndex) { String result = null; if (rowIndex > -1 & rowIndex < getRowCount()) { result = columnIndex == 0 ? oldValues.get(rowIndex) : newValues.get(rowIndex); } return result; } @Override public String getColumnName(int column) { if (isMultiTrackEditMode()) { return column == 0 ? "File" : "Value(s)"; } else { return column == 0 ? "Original" : "New"; } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { newValues.set(rowIndex, (String) aValue); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 1; } }