/* * Copyright (C) 2014 たんらる */ package fourthline.mabiicco.ui.mml; import java.util.ArrayList; import java.util.List; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; import fourthline.mabiicco.AppResource; import fourthline.mabiicco.midi.InstClass; import fourthline.mabiicco.midi.MabiDLS; import fourthline.mmlTools.ComposeRank; import fourthline.mmlTools.MMLTrack; import fourthline.mmlTools.core.MMLText; public final class TrackListTable extends JTable { private static final long serialVersionUID = -710966050907225119L; private final class InCheckTableModel extends AbstractTableModel { private static final long serialVersionUID = -5732476297298041942L; private final String[] columnNames = new String[] { "", AppResource.appText("mml.output.trackName"), AppResource.appText("mml.output.instrument"), AppResource.appText("mml.output.rank") }; private final boolean checkBox; private final boolean checkValue[]; private final ArrayList<String[]> dataList = new ArrayList<>(); private final ArrayList<ComposeRank> rankList = new ArrayList<>(); private InCheckTableModel(List<MMLTrack> trackList, boolean checkBox) { this.checkBox = checkBox; checkValue = new boolean[trackList.size()]; for (MMLTrack track : trackList) { InstClass inst = MabiDLS.getInstance().getInstByProgram(track.getProgram()); dataList.add(new String[] { track.getTrackName(), inst.toString(), track.mmlRankFormat() }); rankList.add(track.mmlRank()); } } private InCheckTableModel(MMLTrack track, List<MMLText> textList) { this.checkBox = false; this.checkValue = null; for (MMLText mml : textList) { InstClass inst = MabiDLS.getInstance().getInstByProgram(track.getProgram()); dataList.add(new String[] { track.getTrackName(), inst.toString(), mml.mmlRankFormat() }); rankList.add(mml.mmlRank()); } } @Override public Class<?> getColumnClass(int col) { if (!checkBox) { col++; } if (col == 0) { return Boolean.class; } return String.class; } @Override public int getColumnCount() { int count = 4; if (!checkBox) { count--; } return count; } @Override public int getRowCount() { return dataList.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (!checkBox) { columnIndex++; } if (columnIndex == 0) { return checkValue[rowIndex]; } else { return dataList.get(rowIndex)[columnIndex-1]; } } @Override public String getColumnName(int columnIndex) { if (!checkBox) { columnIndex++; } return columnNames[ columnIndex ]; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (!checkBox) { columnIndex++; } if (columnIndex == 0) { return true; } return false; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (!checkBox) { columnIndex++; } if (columnIndex != 0) { return; } checkValue[rowIndex] = aValue.equals(Boolean.TRUE) ? true : false; } } private final InCheckTableModel checkTableModel; public TrackListTable(List<MMLTrack> trackList) { this(trackList, false); } /** * MMLTrackのJTableを作成します. * @param trackList * @param checkBox trueであれば, 最初の列にチェックボックスを作成します. */ public TrackListTable(List<MMLTrack> trackList, boolean checkBox) { super(); checkTableModel = new InCheckTableModel(trackList, checkBox); initialize(checkBox); } public TrackListTable(MMLTrack track, List<MMLText> textList) { super(); checkTableModel = new InCheckTableModel(track, textList); initialize(false); } private void initialize(boolean checkBox) { setModel( checkTableModel ); if (checkBox) { getColumnModel().getColumn(0).setPreferredWidth(0); getColumnModel().getColumn(3).setPreferredWidth(180); setRowSelectionAllowed(false); } else { getColumnModel().getColumn(2).setPreferredWidth(180); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setRowSelectionInterval(0, 0); } getTableHeader().setReorderingAllowed(false); setFocusable(false); } /** * 現在のチェック状態を表す配列を返します. * @return */ public boolean[] getCheckList() { return checkTableModel.checkValue; } /** * count分の項目にチェックをつけます * @param count */ public void setInitialCheck(int count) { for (int i = 0; i < checkTableModel.checkValue.length; i++) { if (i < count) { checkTableModel.checkValue[i] = true; } } } public boolean selectedRowCanSplit() { int row = getSelectedRow(); ComposeRank rank = checkTableModel.rankList.get(row); return !rank.canCompose(); } }