package view; import java.awt.event.ActionListener; import java.awt.event.FocusListener; import java.io.IOException; import java.util.Locale; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.TransferHandler; import javax.swing.border.BevelBorder; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreeSelectionModel; import view.interfaces.AbstractTab; import view.subview.id3.ID3RightPanel; import model.audio.interfaces.IAudioFile; import model.exception.TabInitException; import model.structure.ID3TagData; import model.table.ID3TagTableModel; import model.util.WindowUtils; import net.miginfocom.swing.MigLayout; import com.cf.mls.MLS; import config.Config; public class ID3TagTab extends AbstractTab { /** * */ private static final long serialVersionUID = 6923738221946214668L; /** * the multi language supporter */ private MLS mls; /** * current width of each table column */ private int[] tableWidth; /* * components */ private JLabel rootJL; private JPanel foldersP; private JPanel rootPanelP; private JPanel tableP; private ID3RightPanel rightPanelP; private JButton deleteAllB; private JButton deleteFileB; private JButton saveTagsB; private JButton addFileB; private JButton addFolderB; private JButton rootOpenB; private JCheckBox autoAddChB; private JCheckBox recursiveChB; private JButton loadB; private JRadioButton saveSelectedRB; private JRadioButton saveAllChangeRB; private JTable tableT; private JTextField rootTF; private JTree filesTr; /** * Constructor */ public ID3TagTab() { mls = new MLS("view/languageFiles/ID3TagTab", Config.getInstance().getCurrentLanguage()); mls.setToolTipDuration(-1); this.tableWidth = new int[] { 55, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; } /* * (non-Javadoc) * * @see view.interfaces.AbstractTab#init() */ @Override public void init() throws TabInitException { deleteAllB = mls.generateJButton("deleteAllB", true, null); deleteFileB = mls.generateJButton("deleteFileB", true, null); saveTagsB = mls.generateJButton("saveTagsB", true, null); addFileB = mls.generateJButton("addFileB", true, null); addFolderB = mls.generateJButton("addFolderB", true, null); rootOpenB = mls.generateJButton("rootOpenB", true, null); loadB = mls.generateJButton("loadB", true, null); autoAddChB = mls.generateJCheckBox("autoAddChB", true, false, null); recursiveChB = mls.generateJCheckBox("recursiveChB", true, false, null); rootJL = mls.generateJLabel("rootJL", true); foldersP = mls.generateTitledBevelPanel("foldersP", BevelBorder.LOWERED, true); rootPanelP = mls.generateTitledBevelPanel("rootPanelP", BevelBorder.LOWERED, true); tableP = mls.generateTitledBevelPanel("tableP", BevelBorder.LOWERED, true); saveAllChangeRB = mls.generateJRadioButton("saveAllChangeRB", true, null); saveSelectedRB = mls.generateJRadioButton("saveSelectedRB", true, null); tableT = mls.generateJTable("tableT"); rootTF = mls.generateJTextField("rootTF", true, false, 10, ""); filesTr = mls.generateJTree("filesTr", true); // set radiobuttons and checkboxes setLoadButtonEnabled(!Config.getInstance().isID3AutoAdd()); this.recursiveChB.setSelected(Config.getInstance().isID3Recursive()); ButtonGroup bg = new ButtonGroup(); bg.add(saveAllChangeRB); bg.add(saveSelectedRB); this.saveAllChangeRB.setSelected(Config.getInstance().isID3AllChanged()); this.saveSelectedRB.setSelected(!Config.getInstance().isID3AllChanged()); tableT.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane scrollPane2 = new JScrollPane(); JScrollPane scrollPane = new JScrollPane(); // left Tree Panel JPanel leftPanel = new JPanel(new MigLayout("insets 0", "[grow]", "[shrink][grow][shrink]")); // root panel rootPanelP.setLayout(new MigLayout("insets 5", "[shrink][grow][shrink]", "[shrink]")); rootPanelP.add(rootJL); rootPanelP.add(rootTF, "grow, gapleft 10"); rootPanelP.add(rootOpenB, "gapleft 10"); leftPanel.add(rootPanelP, "wrap, grow"); // tree foldersP.setLayout(new MigLayout("insets 5", "[grow]", "[grow]")); scrollPane.setViewportView(filesTr); foldersP.add(scrollPane, "grow"); leftPanel.add(foldersP, "wrap, grow"); // button panel JPanel loadPanel = new JPanel(new MigLayout("insets 5", "[grow][shrink]", "[shrink][shrink]")); loadPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); loadPanel.add(recursiveChB, "grow"); loadPanel.add(loadB, "span 2 2, wrap"); loadPanel.add(autoAddChB, "grow"); leftPanel.add(loadPanel, "grow"); // middle Table Panel JPanel middlePanel = new JPanel(new MigLayout("insets 0", "[grow]", "[grow][shrink]")); tableP.setLayout(new MigLayout("insets 5", "[grow]", "[grow]")); scrollPane2.setViewportView(tableT); tableP.add(scrollPane2, "grow"); middlePanel.add(tableP, "grow, wrap"); // button panel JPanel addPanel = new JPanel(new MigLayout("insets 5", "[shrink][shrink][shrink][shrink][shrink][shrink]", "[shrink]")); addPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); addPanel.add(addFileB); addPanel.add(addFolderB); addPanel.add(deleteFileB, "gapleft 10"); addPanel.add(deleteAllB, "push"); // addPanel.add(playAudioB, "gapleft 10, push"); JPanel checkBoxP = new JPanel(new MigLayout("insets 0")); checkBoxP.add(saveAllChangeRB, "wrap"); checkBoxP.add(saveSelectedRB, "wrap"); addPanel.add(checkBoxP); addPanel.add(saveTagsB); middlePanel.add(addPanel, "grow"); // create Splitpane for left and middle panel JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, middlePanel); rightPanelP = new ID3RightPanel(mls); rightPanelP.init(); setLayout(new MigLayout("insets 0", "[grow][shrink]", "[grow]")); add(splitPane, "grow"); add(rightPanelP, "grow"); } /** * sets an ActionListener * * @param l * the ActionListener */ public void setActionListener(ActionListener l) { rootOpenB.addActionListener(l); deleteAllB.addActionListener(l); deleteFileB.addActionListener(l); addFileB.addActionListener(l); addFolderB.addActionListener(l); loadB.addActionListener(l); saveTagsB.addActionListener(l); autoAddChB.addActionListener(l); rightPanelP.setActionListener(l); } /** * sets the transfer handler to drop files into the table * * @param handler * the given transfer handler */ public void setTableTransferHandler(TransferHandler handler) { tableT.setFillsViewportHeight(true); tableT.setDragEnabled(true); tableT.setTransferHandler(handler); } /** * sets the transfer handler to drop files into the table * * @param handler * the given transfer handler */ public void setTreeTransferHandler(TransferHandler handler) { filesTr.setDragEnabled(true); filesTr.setTransferHandler(handler); } /** * sets a FocusListener * * @param l * the FocusListener */ public void setFocusListener(FocusListener l) { rightPanelP.setFocusListener(l); } /** * sets a ChangeListener * * @param l * the ChangeListener */ public void setChangeListener(ChangeListener l) { rightPanelP.setChangeListener(l); } /** * sets a TreeSelectionListener * * @param l * the TreeSelectionListener */ public void setTreeSelectionListener(TreeSelectionListener l) { this.filesTr.addTreeSelectionListener(l); } /** * sets a ListSelectionListener * * @param l * the ListSelectionListener */ public void setListSelectionListener(ListSelectionListener l) { this.tableT.getSelectionModel().addListSelectionListener(l); } /** * removes the ListSelectionListener * * @param l * the ListSelectionListener */ public void removeListSelectionListener(ListSelectionListener l) { this.tableT.getSelectionModel().removeListSelectionListener(l); } /** * resets all RadionButtons to unselected */ public void resetRB() { rightPanelP.resetRB(); } /** * shows a given message * * @param identifier * identifier for the mls */ public void showMessage(String identifier) { JOptionPane.showMessageDialog(this, mls.getMessage(identifier)); } /** * shows a given message * * @param identifier * identifier for the mls * @param replacer * the replacement for {0} */ public void showMessage(String identifier, String replacer) { JOptionPane.showMessageDialog(this, mls.getMessage(identifier).replace("{0}", replacer)); } /** * shows a given message and asks for yes or no * * @param identifier * identifier for the translator * * @return the JOPtionPane.YES or NO answer */ public int showConfirmationMessage(String identifier) { return JOptionPane.showConfirmDialog(this, this.mls.getMessage(identifier)); } /* * (non-Javadoc) * * @see view.interfaces.AbstractTab#changeLanguage(java.util.Locale) */ @Override public void changeLanguage(Locale lang) { this.mls.setLocale(lang); this.mls.translate(); } public void setautoAddChB(boolean b0) { autoAddChB.setSelected(b0); } public void setrecursiveChB(boolean b0) { recursiveChB.setSelected(b0); } public void setrootTF(String s0) { rootTF.setText(s0); } public String getLyricsTA() { return rightPanelP.getLyricsTA(); } public void setLyricsTA(String s0) { rightPanelP.setLyricsTA(s0); } public boolean getautoAddChB() { return autoAddChB.isSelected(); } public boolean getrecursiveChB() { return recursiveChB.isSelected(); } public String getrootTF() { return rootTF.getText(); } public boolean getSaveAllChangedRB() { return this.saveAllChangeRB.isSelected(); } public String geturlTF() { return rightPanelP.geturlTF(); } public String getalbumArtistTF() { return rightPanelP.getalbumArtistTF(); } public String getmaxTracksTF() { return rightPanelP.getmaxTracksTF(); } public String getcopyrightTF() { return rightPanelP.getcopyrightTF(); } public String getcomposerTF() { return rightPanelP.getcomposerTF(); } public String getalbumTF() { return rightPanelP.getalbumTF(); } public String getcommentTF() { return rightPanelP.getcommentTF(); } public String getyearTF() { return rightPanelP.getyearTF(); } public String gettitleTF() { return rightPanelP.gettitleTF(); } public String getorigArtistTF() { return rightPanelP.getorigArtistTF(); } public String getencodedByTF() { return rightPanelP.getencodedByTF(); } public String getartistTF() { return rightPanelP.getartistTF(); } public String getTrackNr() { return rightPanelP.getTrackNr(); } public String getPublisherTF() { return rightPanelP.getPublisherTF(); } public String getMaxTracks() { return rightPanelP.getMaxTracks(); } public String getCurrCD() { return rightPanelP.getCurrCD(); } public String getMaxCD() { return rightPanelP.getMaxCD(); } /** * sets the given audio file data to the interface * * @param audioFile * given audio file * * @throws IOException */ public void setAudioFileData(IAudioFile audioFile) throws IOException { rightPanelP.setID3Data(audioFile); } /** * resets all id3 data fields to its default value */ public void resetAudioFileData() { rightPanelP.resetID3Data(); } /** * gets the ID3Tag Data as shown in the interface * * @return all ID3Tag Data */ public ID3TagData getID3TagData() { return rightPanelP.getID3TagData(); } /** * sets the genre combobox * * @param genres * all genres */ public void setGenres(String[] genres) { rightPanelP.setGenres(genres); } /** * gets the selected genre index. does NOT start by 0 * * @return the genre */ public String getGenre() { return rightPanelP.getGenre(); } /** * sets the load button enabled or disabled * * @param en * enabled true, else false */ public void setLoadButtonEnabled(boolean en) { this.autoAddChB.setSelected(!en); this.loadB.setEnabled(en); } /** * updates the shown tree with the given root * * @param root * given root */ public void updateTree(String root) { WindowUtils.updateBrowserTree(this.filesTr, root, true, false); this.filesTr.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); } /** * gets all selected audio files * * @return indices of all selected audio files */ public int[] getSelectedFiles() { return this.tableT.getSelectedRows(); } /** * sets the selected audio file * * @param i * index of the selected mpe3 */ public void setSelectedFile(int i) { this.tableT.getSelectionModel().setSelectionInterval(i, i); } /** * sets the selected files * * @param indices * indices of all selected audio files */ public void setSelectedFiles(int[] indices) { for (int i = 0; i < indices.length; i++) this.tableT.getSelectionModel().addSelectionInterval(indices[i], indices[i]); } /** * gets the Tree object */ public JTree getFilesTree() { return this.filesTr; } /** * sets the table model to update the table * * @param model * table model */ public void setTableModel(ID3TagTableModel model) { // set col names for (int i = 0; i < 17; i++) { model.setColumnName(i, mls.getMessage("Col" + (i + 1))); } this.tableT.setModel(model); for (int i = 0; i < 17; i++) this.tableT.getColumnModel().getColumn(i).setPreferredWidth(this.tableWidth[i]); } /** * saves the widths of the current table */ public void saveTableWidth() { for (int i = 0; i < 17; i++) this.tableWidth[i] = this.tableT.getColumnModel().getColumn(i).getWidth(); } /** * sets the cover image data * * @param imgBytes * bytes of the image * @param extension * image extension * * @throws IOException */ public void setCoverImageData(byte[] imgBytes, String extension) throws IOException { rightPanelP.setCoverImageData(imgBytes, extension); } /** * gets the image size * * @return the image size */ public int[] getImageSize() { return rightPanelP.getImageSize(); } /** * sets all buttons enabled * * @param en * true for enabled, else false */ public void setButtonsEnabled(boolean en) { this.addFileB.setEnabled(en); this.addFolderB.setEnabled(en); this.deleteFileB.setEnabled(en); this.deleteAllB.setEnabled(en); this.recursiveChB.setEnabled(en && !autoAddChB.isSelected()); this.loadB.setEnabled(en); this.saveTagsB.setEnabled(en); this.rightPanelP.setButtonsEnabled(en); } }