/**
* Xtreme Media Player a cross-platform media player.
* Copyright (C) 2005-2011 Besmir Beqiri
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package xtrememp.ui.table;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
/**
*
* @author Besmir Beqiri
*/
public class PlaylistTableColumnModel extends DefaultTableColumnModel implements ActionListener {
private Map<JCheckBoxMenuItem, PlaylistTableColumn> map;
private JPopupMenu popupMenu;
public PlaylistTableColumnModel() {
super();
this.map = new HashMap<JCheckBoxMenuItem, PlaylistTableColumn>();
this.popupMenu = new JPopupMenu();
// Init popup menu.
PlaylistColumn[] playlistColumns = PlaylistColumn.values();
for (PlaylistColumn playlistColumn : playlistColumns) {
JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(playlistColumn.getDisplayName(), false);
menuItem.setName(playlistColumn.name());
if (playlistColumn == PlaylistColumn.TITLE) {
menuItem.setEnabled(false);
} else {
menuItem.addActionListener(this);
}
popupMenu.add(menuItem);
}
}
public JPopupMenu getPopupMenu() {
return popupMenu;
}
public void resetAll(int modelIndex) {
for (Enumeration<TableColumn> columnEnum = getColumns(); columnEnum.hasMoreElements();) {
TableColumn tableColumn = columnEnum.nextElement();
if (tableColumn instanceof PlaylistTableColumn) {
PlaylistTableColumn playlistTableColumn = (PlaylistTableColumn) tableColumn;
if (playlistTableColumn.getModelIndex() != modelIndex) {
playlistTableColumn.reset();
}
}
}
}
public PlaylistColumn[] getPlaylistColumns() {
PlaylistColumn[] playlistColumns = new PlaylistColumn[getColumnCount()];
List<PlaylistColumn> columnsList = new ArrayList<PlaylistColumn>(getColumnCount());
for (Enumeration<TableColumn> columnEnum = getColumns(); columnEnum.hasMoreElements();) {
TableColumn tableColumn = columnEnum.nextElement();
if (tableColumn instanceof PlaylistTableColumn) {
PlaylistTableColumn playlistTableColumn = (PlaylistTableColumn) tableColumn;
columnsList.add(playlistTableColumn.getModelIndex(), playlistTableColumn.getPlaylistColumn());
}
}
return columnsList.toArray(playlistColumns);
}
@Override
public void addColumn(TableColumn tableColumn) {
super.addColumn(tableColumn);
if (tableColumn instanceof PlaylistTableColumn) {
PlaylistTableColumn playlistTableColumn = (PlaylistTableColumn) tableColumn;
Component[] components = popupMenu.getComponents();
for (Component component : components) {
JCheckBoxMenuItem menuItem = (JCheckBoxMenuItem) component;
if (menuItem.getText().equals(playlistTableColumn.getName())) {
map.put(menuItem, playlistTableColumn);
menuItem.setSelected(true);
break;
}
}
}
}
@Override
public PlaylistTableColumn getColumn(int columnIndex) {
return (PlaylistTableColumn) super.getColumn(columnIndex);
}
@Override
public void moveColumn(int columnIndex, int newIndex) {
TableColumn fromTableColumn = getColumn(columnIndex);
TableColumn toTableColumn = getColumn(newIndex);
super.moveColumn(columnIndex, newIndex);
fromTableColumn.setModelIndex(newIndex);
toTableColumn.setModelIndex(columnIndex);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source instanceof JCheckBoxMenuItem) {
JCheckBoxMenuItem menuItem = (JCheckBoxMenuItem) source;
PlaylistTableColumn playlistTableColumn = map.get(menuItem);
if (menuItem.isSelected()) {
int columnCount = getColumnCount();
if (playlistTableColumn == null) {
PlaylistColumn playlistColumn = PlaylistColumn.valueOf(menuItem.getName());
playlistTableColumn = new PlaylistTableColumn(playlistColumn, columnCount);
map.put(menuItem, playlistTableColumn);
}
super.addColumn(playlistTableColumn);
playlistTableColumn.setModelIndex(columnCount);
} else {
for (Enumeration<TableColumn> columnEnum = getColumns(); columnEnum.hasMoreElements();) {
TableColumn tableColumn = columnEnum.nextElement();
int modelIndex = tableColumn.getModelIndex();
if (modelIndex > playlistTableColumn.getModelIndex()) {
tableColumn.setModelIndex(modelIndex - 1);
}
}
removeColumn(playlistTableColumn);
}
}
}
}