package audiobook; import java.awt.dnd.DropTargetDropEvent; import java.beans.PropertyChangeEvent; import java.util.concurrent.ExecutionException; import other.Strings.AdvancedFileNameQuoteProcessor; import other.Strings.M4aTagQuoteProcessor; import Applications.Application; import Dating.Time; import Files.FileActions; import java.awt.Cursor; import java.awt.Dimension; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetAdapter; import java.awt.dnd.DropTargetListener; import java.awt.event.KeyEvent; import java.beans.PropertyChangeListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileNameExtensionFilter; import other.Strings.FileNameQuoteProcessor; import other.Strings.FilepathQuoteProcessor; import other.Strings.NumberQuoteProcessor; import other.Strings.QuoteProcessor; import swing.Beans.MultipleInputPane; /** * This class extends all methods to create an audiobook. It Also contains information about the Main Window shown on startup. * @author Kim */ public class MainWindow extends javax.swing.JFrame { /** Creates new form MainWindow */ public MainWindow() { initComponents(); initDragAndDrop(); } /** * Initializes the DropTargetAdapter and the DropTargets to enable special drag and drop features * @see DropTargetAdapter * @see DropTarget */ private void initDragAndDrop() { coverFieldDrop = new DropTargetAdapter() { @Override public void drop(DropTargetDropEvent dtde) { try { Transferable tr = dtde.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); //Checking Dragged Objects for their Flavour Type //Only accept Files for (int i = 0; i < flavors.length; i++) { if (flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrop(dtde.getDropAction()); List files = (List) tr.getTransferData(flavors[i]); File imageFile = (File) files.get(0); if (imageFile.isDirectory()) { dtde.rejectDrop(); return; } //Setting dropped File as active Cover if (imageFile.getName().toLowerCase().endsWith(".jpg".toLowerCase()) || imageFile.getName().toLowerCase().endsWith(".png".toLowerCase())) { Main.currBook.setImageFile(imageFile); CoverField.setText(imageFile.getPath()); dtde.dropComplete(true); CoverField.repaint(); } else { JOptionPane.showMessageDialog(null, "Die Datei kann nicht als Cover verwendet werden. Die Formate .jpg und .png werden unterstützt.", "Fehler", JOptionPane.ERROR_MESSAGE); dtde.rejectDrop(); } return; } } } catch (Throwable t) { } dtde.rejectDrop(); } }; listDrop = new DropTargetAdapter() { @Override public void drop(DropTargetDropEvent dtde) { try { Transferable tr = dtde.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); //Only accept dropped *.m4a Files or Filders for (int i = 0; i < flavors.length; i++) { if (flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrop(dtde.getDropAction()); List files = (List) tr.getTransferData(flavors[i]); boolean unsupportedFile = false; //Import useable files to audiobook data for (File file : files) { if (file.isDirectory() || file.getName().endsWith(".m4a")) { load(file); } else { unsupportedFile = true; } } if (unsupportedFile) { JOptionPane.showMessageDialog(null, "Es werden nur *.m4a Dateien unterstützt. Konvertieren Sie diese z.B. über iTunes", "Achtung", JOptionPane.WARNING_MESSAGE); } updateChaptersList(); dtde.dropComplete(true); return; } } } catch (Exception ex) { } dtde.rejectDrop(); } }; targetDirDrop = new DropTargetAdapter() { @Override public void drop(DropTargetDropEvent dtde) { try { Transferable tr = dtde.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); //Accepting only directories for (int i = 0; i < flavors.length; i++) { if (flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrop(dtde.getDropAction()); List files = (List) tr.getTransferData(flavors[i]); File dir = (File) files.get(0); if (!dir.isDirectory()) { dtde.rejectDrop(); return; } //Set dropped Folder as active target foleder Main.currBook.setTargetFolder(dir); FolderField.setText(dir.getPath()); dtde.dropComplete(true); FolderField.repaint(); checkPOD(); return; } } } catch (Throwable t) { t.printStackTrace(); } dtde.rejectDrop(); } }; mainDrop = new DropTargetAdapter() { @Override public void drop(DropTargetDropEvent dtde) { try { Transferable tr = dtde.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); //Checking Dragged Objects for their Flavour Type //Only accept POD Files for (int i = 0; i < flavors.length; i++) { if (flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrop(dtde.getDropAction()); List files = (List) tr.getTransferData(flavors[i]); File file = (File) files.get(0); if (!file.getName().toLowerCase().endsWith("POD".toLowerCase()) || file.isDirectory()) { dtde.rejectDrop(); return; } //Load dropped File loadPODFile(file); return; } } } catch (Throwable t) { } dtde.rejectDrop(); } }; //Activating drag-and-drop DropTarget listTarget = new DropTarget(ChaptersList, listDrop); DropTarget coverFieldTarget = new DropTarget(CoverField, coverFieldDrop); DropTarget targetDirTarget = new DropTarget(FolderField, targetDirDrop); DropTarget mainTarget = new DropTarget(this, mainDrop); } @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { buttonGroup = new javax.swing.ButtonGroup(); openFilesButton = new javax.swing.JButton(); FilesScrollPane = new javax.swing.JScrollPane(); ChaptersList = new javax.swing.JList(); upButton = new javax.swing.JButton(); downButton = new javax.swing.JButton(); removeButton = new javax.swing.JButton(); ChapterPropPanel = new javax.swing.JPanel(); TitleLabel = new javax.swing.JLabel(); titleField = new javax.swing.JTextField(); FileLabel = new javax.swing.JLabel(); fileField = new javax.swing.JTextField(); BookPropPanel = new javax.swing.JPanel(); CoverLabel = new javax.swing.JLabel(); CoverField = new javax.swing.JTextField(); SearchCoverButton = new javax.swing.JButton(); createAudiobookButton = new javax.swing.JButton(); TargetDirLabel = new javax.swing.JLabel(); FolderField = new javax.swing.JTextField(); SearchFolderButton = new javax.swing.JButton(); CopyRadioButton = new javax.swing.JRadioButton(); moveRadioButton = new javax.swing.JRadioButton(); createPodFileButton = new javax.swing.JButton(); NameField = new javax.swing.JTextField(); editTagsButton = new javax.swing.JButton(); RemoveCoverButton = new javax.swing.JButton(); NameTagLabel = new javax.swing.JLabel(); NameTag = new javax.swing.JLabel(); ArtistTagLabel = new javax.swing.JLabel(); ArtistTag = new javax.swing.JLabel(); AlbumTagLabel = new javax.swing.JLabel(); AlbumTag = new javax.swing.JLabel(); DeleteFiles = new javax.swing.JCheckBox(); useProfile = new javax.swing.JButton(); SortButton = new javax.swing.JButton(); menuBar = new javax.swing.JMenuBar(); FileMenu = new javax.swing.JMenu(); openFilesMenuItem = new javax.swing.JMenuItem(); loadPODFileMenuItem = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JPopupMenu.Separator(); ExitMenuItem = new javax.swing.JMenuItem(); SpecialMenu = new javax.swing.JMenu(); createChapterProfileMenuItem = new javax.swing.JMenuItem(); HelpMenu = new javax.swing.JMenu(); AboutMenuItem = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setTitle("Audiobook Maker"); setIconImage(new ImageIcon(Main.class.getResource("audiobook_icon.png")).getImage()); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); openFilesButton.setText("Dateien öffnen"); openFilesButton.setToolTipText("Dateien zum Hörbuch hinzufügen"); openFilesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFilesButtonActionPerformed(evt); } }); ChaptersList.setModel(new DefaultListModel()); ChaptersList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { ChaptersListValueChanged(evt); } }); ChaptersList.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { ChaptersListKeyPressed(evt); } }); FilesScrollPane.setViewportView(ChaptersList); upButton.setText("nach oben"); upButton.setToolTipText("Ausgewähltes Kapitel nach oben bewegen"); upButton.setEnabled(false); upButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upButtonActionPerformed(evt); } }); downButton.setText("nach unten"); downButton.setToolTipText("Ausgewähltes Kapitel nach unten bewegen"); downButton.setEnabled(false); downButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downButtonActionPerformed(evt); } }); removeButton.setText("Entfernen"); removeButton.setToolTipText("Ausgewähltes Kapitel entfernen"); removeButton.setEnabled(false); removeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeButtonActionPerformed(evt); } }); ChapterPropPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Kapitel-Eigenschaften")); TitleLabel.setText("Titel:"); titleField.setEditable(false); titleField.setToolTipText("Namen für ausgewähltes Kapitel angeben"); titleField.setDragEnabled(true); titleField.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e){ renameChapter(); } public void removeUpdate(DocumentEvent e){ renameChapter(); } public void insertUpdate(DocumentEvent e){ renameChapter(); } }); titleField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { titleFieldActionPerformed(evt); } }); FileLabel.setText("Datei:"); fileField.setEditable(false); javax.swing.GroupLayout ChapterPropPanelLayout = new javax.swing.GroupLayout(ChapterPropPanel); ChapterPropPanel.setLayout(ChapterPropPanelLayout); ChapterPropPanelLayout.setHorizontalGroup( ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(ChapterPropPanelLayout.createSequentialGroup() .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(TitleLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(FileLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(fileField, javax.swing.GroupLayout.DEFAULT_SIZE, 565, Short.MAX_VALUE) .addComponent(titleField, javax.swing.GroupLayout.DEFAULT_SIZE, 565, Short.MAX_VALUE))) ); ChapterPropPanelLayout.setVerticalGroup( ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(ChapterPropPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(FileLabel) .addComponent(fileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(6, 6, 6) .addGroup(ChapterPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(TitleLabel) .addComponent(titleField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(127, Short.MAX_VALUE)) ); BookPropPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Hörbuch-Eigenschaften")); CoverLabel.setText("Cover:"); CoverField.setEditable(false); SearchCoverButton.setText("..."); SearchCoverButton.setToolTipText("Cover-Datei suchen"); SearchCoverButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SearchCoverButtonActionPerformed(evt); } }); createAudiobookButton.setText("Hörbuch erstellen"); createAudiobookButton.setToolTipText(".m4b Datei erstellen (vorher muss eine .POD Datei erstellt werden)"); createAudiobookButton.setEnabled(false); createAudiobookButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createAudiobookButtonActionPerformed(evt); } }); TargetDirLabel.setText("Ordner:"); FolderField.setEditable(false); SearchFolderButton.setText("Suchen..."); SearchFolderButton.setToolTipText("Zielordner für die Dateien auswählen"); SearchFolderButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SearchFolderButtonActionPerformed(evt); } }); buttonGroup.add(CopyRadioButton); CopyRadioButton.setSelected(true); CopyRadioButton.setText("Dateien kopieren"); CopyRadioButton.setToolTipText("Audiodateien in den Zielordner kopieren"); buttonGroup.add(moveRadioButton); moveRadioButton.setText("Dateien verschieben"); moveRadioButton.setToolTipText("Audiodateien in den Zielordner verschieben"); createPodFileButton.setText(".POD Datei erstellen"); createPodFileButton.setToolTipText(""); createPodFileButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createPodFileButtonActionPerformed(evt); } }); NameField.setText("Name"); NameField.setToolTipText("Namen für das Hörbuch auswählen"); NameField.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e){ checkPOD(); } public void removeUpdate(DocumentEvent e){ checkPOD(); } public void insertUpdate(DocumentEvent e){ checkPOD(); } }); editTagsButton.setText("Tags bearbeiten"); editTagsButton.setToolTipText("Tags für das Hörbuch eingeben. ACHTUNG: funktioniert noch nicht unbedingt bei iTunes"); editTagsButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editTagsButtonActionPerformed(evt); } }); RemoveCoverButton.setText("Löschen"); RemoveCoverButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RemoveCoverButtonActionPerformed(evt); } }); NameTagLabel.setText("Name: "); NameTag.setText("..."); ArtistTagLabel.setText("Interpret: "); ArtistTag.setText("..."); AlbumTagLabel.setText("Album: "); AlbumTag.setText("..."); DeleteFiles.setText("Dateien löschen"); DeleteFiles.setToolTipText("Dateien nach erstellen des Hörbuches aus Zielordner löschen (Sie werden nicht mehr benötigt)"); javax.swing.GroupLayout BookPropPanelLayout = new javax.swing.GroupLayout(BookPropPanel); BookPropPanel.setLayout(BookPropPanelLayout); BookPropPanelLayout.setHorizontalGroup( BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(BookPropPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, BookPropPanelLayout.createSequentialGroup() .addComponent(NameField, javax.swing.GroupLayout.DEFAULT_SIZE, 225, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(createPodFileButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(createAudiobookButton)) .addGroup(BookPropPanelLayout.createSequentialGroup() .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(TargetDirLabel) .addComponent(CoverLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, BookPropPanelLayout.createSequentialGroup() .addComponent(CoverField, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(SearchCoverButton)) .addComponent(FolderField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 356, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(RemoveCoverButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(SearchFolderButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(BookPropPanelLayout.createSequentialGroup() .addComponent(CopyRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(moveRadioButton) .addGap(18, 18, 18) .addComponent(DeleteFiles) .addContainerGap(132, Short.MAX_VALUE)) .addGroup(BookPropPanelLayout.createSequentialGroup() .addComponent(editTagsButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(NameTagLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(NameTag) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(ArtistTagLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(ArtistTag) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(AlbumTagLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(AlbumTag) .addGap(165, 165, 165)))) ); BookPropPanelLayout.setVerticalGroup( BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(BookPropPanelLayout.createSequentialGroup() .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(CoverLabel) .addComponent(CoverField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(RemoveCoverButton) .addComponent(SearchCoverButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(TargetDirLabel) .addComponent(FolderField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(SearchFolderButton)) .addGap(18, 18, 18) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(CopyRadioButton) .addComponent(moveRadioButton) .addComponent(DeleteFiles)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(editTagsButton) .addComponent(NameTagLabel) .addComponent(NameTag) .addComponent(ArtistTagLabel) .addComponent(ArtistTag) .addComponent(AlbumTagLabel) .addComponent(AlbumTag)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(BookPropPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(createAudiobookButton) .addComponent(createPodFileButton) .addComponent(NameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) ); useProfile.setText("Kapitelprofil anwenden"); useProfile.setToolTipText("Namen der ausgewählten Kapitel automatisch bearbeiten"); useProfile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { useProfileActionPerformed(evt); } }); SortButton.setText("Sortieren"); SortButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SortButtonActionPerformed(evt); } }); FileMenu.setText("Datei"); FileMenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFilesButtonActionPerformed(evt); } }); openFilesMenuItem.setText("Dateien öffnen"); FileMenu.add(openFilesMenuItem); loadPODFileMenuItem.setText("POD Datei laden"); loadPODFileMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { loadPODFileMenuItemActionPerformed(evt); } }); FileMenu.add(loadPODFileMenuItem); FileMenu.add(jSeparator1); ExitMenuItem.setText("Beenden"); ExitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExitMenuItemActionPerformed(evt); } }); FileMenu.add(ExitMenuItem); menuBar.add(FileMenu); SpecialMenu.setText("Spezial"); createChapterProfileMenuItem.setText("Kapitelprofil Editor"); createChapterProfileMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createChapterProfileMenuItemActionPerformed(evt); } }); SpecialMenu.add(createChapterProfileMenuItem); menuBar.add(SpecialMenu); HelpMenu.setText("Hilfe"); HelpMenu.setToolTipText(""); AboutMenuItem.setText("Über"); AboutMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { AboutMenuItemActionPerformed(evt); } }); HelpMenu.add(AboutMenuItem); menuBar.add(HelpMenu); setJMenuBar(menuBar); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(useProfile, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(SortButton)) .addComponent(FilesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 224, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(removeButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(downButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(upButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(openFilesButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(BookPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(ChapterPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(FilesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 371, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(useProfile) .addComponent(SortButton))) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(openFilesButton) .addGap(47, 47, 47) .addComponent(upButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(downButton) .addGap(18, 18, 18) .addComponent(removeButton)) .addComponent(BookPropPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ChapterPropPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); pack(); }// //GEN-END:initComponents /** * Opens a Filechooser dialog to choose a Folder or Files to load. * @param evt Auto Generated Event; not used */ private void openFilesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openFilesButtonActionPerformed JFileChooser chooser = new JFileChooser(Main.lastDir); chooser.addChoosableFileFilter(new FileNameExtensionFilter("Mpeg 4 audio files(*.m4a)", "m4a")); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setAcceptAllFileFilterUsed(false); chooser.setMultiSelectionEnabled(true); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Main.lastDir = chooser.getCurrentDirectory(); //Load all selected files and foders for (File file : chooser.getSelectedFiles()) { load(file); } setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } updateChaptersList(); }//GEN-LAST:event_openFilesButtonActionPerformed /** * loads an audiofile to this active project. If the file is a folder every subfolder's audiofile and subfolder will be loaded * @param f a file */ private void load(File f) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (f.isDirectory()) { //load all subfolder's *.m4a files and folders FileFilter filter = new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".m4a".toLowerCase()); } }; for (File file : f.listFiles(filter)) { load(file); } } else { //add a new chapter with an audiofile Chapter c = new Chapter(); c.setFile(f); c.setTitle(f.getName()); //Read the audiofile's length boolean error = false; try { c.calculateTime(); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Beim Laden der Datei\"" + f.getPath() + "\" ist ein Fehler aufgetreten. Diese Datei wurde NICHT geladen", "Fehler", JOptionPane.ERROR_MESSAGE); error = true; } if (!error) { Main.currBook.add(c); } } setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Moves the selected chapter up * @param evt Auto Generated Event; not used */ private void upButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upButtonActionPerformed if (ChaptersList.getSelectedIndices()[0] <= 0) { return; } List tmpChapters = new ArrayList<>(); int[] indices = ChaptersList.getSelectedIndices(); for (int i = indices.length - 1; i >= 0; i--) { tmpChapters.add(Main.currBook.remove(indices[i])); } List chapters = new ArrayList<>(); for (int i = tmpChapters.size() - 1; i >= 0; i--) { chapters.add(tmpChapters.get(i)); } for (int i = 0; i < chapters.size(); i++) { Chapter chapter = chapters.get(i); Main.currBook.add(indices[i] - 1, chapter); } updateChaptersList(); int[] select = new int[indices.length]; for (int i = 0; i < indices.length; i++) { int j = indices[i]; select[i] = j - 1; } ChaptersList.setSelectedIndices(select); }//GEN-LAST:event_upButtonActionPerformed /** * Moves the selected chapter down * @param evt Auto Generated Event; not used */ private void downButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downButtonActionPerformed if (ChaptersList.getSelectedIndices()[ChaptersList.getSelectedIndices().length - 1] >= Main.currBook.size() - 1) { return; } List tmpChapters = new ArrayList<>(); int[] indices = ChaptersList.getSelectedIndices(); for (int i = indices.length - 1; i >= 0; i--) { tmpChapters.add(Main.currBook.remove(indices[i])); } List chapters = new ArrayList<>(); for (int i = tmpChapters.size() - 1; i >= 0; i--) { chapters.add(tmpChapters.get(i)); } for (int i = 0; i < chapters.size(); i++) { Chapter chapter = chapters.get(i); Main.currBook.add(indices[i] + 1, chapter); } updateChaptersList(); int[] select = new int[indices.length]; for (int i = 0; i < indices.length; i++) { int j = indices[i]; select[i] = j + 1; } ChaptersList.setSelectedIndices(select); }//GEN-LAST:event_downButtonActionPerformed /** * Called when the List's selection was changed. Enables/disables the buttons * @param evt Auto Generated Event; not used */ private void ChaptersListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_ChaptersListValueChanged if (ChaptersList.getSelectedIndex() == -1 || ChaptersList.getSelectedIndices().length > 1) { upButton.setEnabled(false); downButton.setEnabled(false); removeButton.setEnabled(false); titleField.setEditable(false); } else { upButton.setEnabled(true); downButton.setEnabled(true); removeButton.setEnabled(true); titleField.setEditable(true); try { fileField.setText(Main.currBook.get(ChaptersList.getSelectedIndex()).getFile().getPath()); } catch (NullPointerException ex) { fileField.setText(""); } try { titleField.setText(Main.currBook.get(ChaptersList.getSelectedIndex()).getTitle()); } catch (NullPointerException ex) { titleField.setText(""); } } }//GEN-LAST:event_ChaptersListValueChanged /** * Removes the selected chapter * @param evt Auto Generated Event; not used */ private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed int index; for (int i = ChaptersList.getSelectedIndices().length - 1; i >= 0; i--) { index = ChaptersList.getSelectedIndices()[i]; Main.currBook.remove(index); } updateChaptersList(); }//GEN-LAST:event_removeButtonActionPerformed /** * Opens a filechooser dialog to select a imagefile to use as cover * @param evt Auto Generated Event; not used */ private void SearchCoverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SearchCoverButtonActionPerformed JFileChooser chooser = new JFileChooser(Main.lastDir); chooser.setMultiSelectionEnabled(false); chooser.setAcceptAllFileFilterUsed(false); chooser.addChoosableFileFilter(new FileNameExtensionFilter("Image Files(*.jpg, *.png)", "jpg", "jpeg", "png")); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { Main.lastDir = chooser.getCurrentDirectory(); Main.currBook.setImageFile(chooser.getSelectedFile()); CoverField.setText(chooser.getSelectedFile().getPath()); } }//GEN-LAST:event_SearchCoverButtonActionPerformed /** * Opens a filechooser dialog to select a target folder for the files * @param evt Auto Generated Event; not used */ private void SearchFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SearchFolderButtonActionPerformed JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setAcceptAllFileFilterUsed(false); chooser.setMultiSelectionEnabled(false); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { Main.currBook.setTargetFolder(chooser.getSelectedFile()); FolderField.setText(chooser.getSelectedFile().getPath()); } checkPOD(); }//GEN-LAST:event_SearchFolderButtonActionPerformed /** * Creates the .POD File * @param evt Auto Generated Event; not used */ private void createPodFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createPodFileButtonActionPerformed createPODFile(); }//GEN-LAST:event_createPodFileButtonActionPerformed public void createPODFile() { // boolean isError = false; String errorText = "Beim Erstellen der .POD Datei sind folgende Fehler aufgetreten;
    "; //No target folder selected if (FolderField.getText().equals("")) { errorText = errorText.concat("
  • Es wurde kein Ordner angegeben
  • "); isError = true; } //No name typed if (NameField.getText().equals("")) { errorText = errorText.concat("
  • Es wurde kein Dateiname angegeben
  • "); isError = true; } //No files loaded if (!(Main.currBook.size() > 0)) { errorText = errorText.concat("
  • Es wurden keine Dateien ausgewählt
  • "); isError = true; } if (isError) { errorText = errorText.concat("
Der Prozess konnte nicht abgeschlossen werden"); JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); return; } //
//If no cover is selected let the user confirm to proceed if (CoverField.getText().equals("") && JOptionPane.showConfirmDialog(this, "Es wurde kein Cover ausgewählt. Fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { return; } SwingWorker worker = new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { // /*if (CopyRadioButton.isSelected()) { //Copy Files dialog.ActionLabel.setText("Dateien kopieren..."); for (Chapter chapter : Main.currBook) { dialog.MessageLabel.setText("Datei: " + chapter.getFile().getPath()); dialog.validate(); dialog.repaint(); boolean success = true; if (!Files.FileActions.isInside(Main.currBook.getTargetFolder(), chapter.getFile())) { File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); success = Files.FileActions.fastCopy(chapter.getFile(), newFile); chapter.setFile(newFile); } dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); dialog.validate(); dialog.repaint(); if (!success) { if (JOptionPane.showConfirmDialog(null, "Beim Kopieren der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten.\n\nTrotzdem fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { dialog.dispose(); return; } } } //Copy Cover if (Main.currBook.getImageFile() != null) { dialog.MessageLabel.setText("Datei: " + Main.currBook.getImageFile().getPath()); dialog.validate(); dialog.repaint(); boolean success = true; if (!Files.FileActions.isInside(Main.currBook.getTargetFolder(), Main.currBook.getImageFile())) { File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); success = Files.FileActions.fastCopy(Main.currBook.getImageFile(), newFile); Main.currBook.setImageFile(newFile); } dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); dialog.validate(); dialog.repaint(); if (!success) { JOptionPane.showMessageDialog(null, "Beim Kopieren des Covers ist ein Fehler aufgetreten. Der Prozess kann nicht fortgeführt werden", "Fehler", JOptionPane.ERROR_MESSAGE); dialog.dispose(); return; } } } else if (moveRadioButton.isSelected()) { //Move Files dialog.ActionLabel.setText("Dateien verschieben..."); for (Chapter chapter : Main.currBook) { dialog.MessageLabel.setText("Datei: " + chapter.getFile()); File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); boolean success = chapter.getFile().renameTo(newFile); chapter.setFile(newFile); dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); if (!success) { if (JOptionPane.showConfirmDialog(null, "Beim Verschieben der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten.\n\nTrotzdem fortfahren?", "Fortfahren?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION) { dialog.dispose(); return; } } } //Move Cover if (Main.currBook.getImageFile() != null) { dialog.MessageLabel.setText("Datei: " + Main.currBook.getImageFile().getPath()); File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); boolean success = Main.currBook.getImageFile().renameTo(newFile); Main.currBook.setImageFile(newFile); dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); if (!success) { JOptionPane.showMessageDialog(null, "Beim Verschieben des Covers ist ein Fehler aufgetreten. Der Prozess kann nicht forgeführt werden.", "Fehler", JOptionPane.ERROR_MESSAGE); dialog.dispose(); return; } } }*/ // int max = Main.currBook.size(); if (Main.currBook.getImageFile() != null) { max++; } firePropertyChange("Maximum", 0, max); // if (CopyRadioButton.isSelected()) { firePropertyChange("ActionLabel", null, "Dateien Kopieren..."); } else if (moveRadioButton.isSelected()) { firePropertyChange("ActionLabel", null, "Dateien verschieben..."); } else { return Boolean.FALSE; } for (int i = 0; i < Main.currBook.size(); i++) { Chapter chapter = Main.currBook.get(i); firePropertyChange("MessageLabel", null, "Datei: " + chapter.getFile().getPath()); File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + chapter.getFile().getName()); boolean success; if (CopyRadioButton.isSelected()) { success = FileActions.fastCopy(chapter.getFile(), newFile); } else { success = chapter.getFile().renameTo(newFile); } chapter.setFile(newFile); firePropertyChange("ProgressValue", 0, i + 1); if (!success) { firePropertyChange("Error", null, "Beim Kopieren/Verschieben der Datei \"" + chapter.getFile().getPath() + "\" ist ein Fehler aufgetreten."); return Boolean.FALSE; } } if (Main.currBook.getImageFile() != null) { firePropertyChange("MessageLabel", null, "Datei: " + Main.currBook.getImageFile().getPath()); File newFile = new File(Main.currBook.getTargetFolder().getPath() + "/" + Main.currBook.getImageFile().getName()); boolean success; if (CopyRadioButton.isSelected()) { success = FileActions.fastCopy(Main.currBook.getImageFile(), newFile); } else { success = Main.currBook.getImageFile().renameTo(newFile); } Main.currBook.setImageFile(newFile); firePropertyChange("ProgressValue", 0, max); if (!success) { firePropertyChange("Error", null, "Beim Kopieren/Verschieben der Datei \"" + Main.currBook.getImageFile().getPath() + "\" ist ein Fehler aufgetreten."); return Boolean.FALSE; } } // // firePropertyChange("ProgressValue", 0, 0); firePropertyChange("ActionLabel", null, "Sonderzeichen entfernen..."); for (int i = 0; i < Main.currBook.size(); i++) { Chapter chapter = Main.currBook.get(i); firePropertyChange("MessageLabel", null, "Datei: " + chapter.getFile().getPath()); File newFile = new File(chapter.getFile().getParent() + "/" + chapter.getFile().getName().replaceAll("[^A-Z^a-z^0-9^_^-^.^ ]", "")); if (newFile.getName().equalsIgnoreCase(".m4a")) { newFile = new File(newFile.getParent() + "/Kapitel" + (i + 1) + ".m4a"); } if (!chapter.getFile().renameTo(newFile)) { firePropertyChange("Error", null, "Die Datei " + chapter.getFile().getPath() + " enthält nicht zulässige Zeichen."); //JOptionPane.showMessageDialog(null, "Die Datei " + chapter.getFile().getPath() + " enthält nicht zulässige Zeichen.", "Fehler", JOptionPane.ERROR_MESSAGE); return Boolean.FALSE; } chapter.setFile(newFile); firePropertyChange("ProgressValue", 0, i + 1); } if (Main.currBook.getImageFile() != null) { File newFile = new File(Main.currBook.getImageFile().getParent() + "/" + Main.currBook.getImageFile().getName().replaceAll("[^A-Z^a-z^0-9^_^-^.^ ]", "")); if (newFile.getName().equalsIgnoreCase(Files.FileActions.getExtention(newFile))) { newFile = new File(newFile.getParent() + "/Cover" + Files.FileActions.getExtention(newFile)); } if (!Main.currBook.getImageFile().renameTo(newFile)) { firePropertyChange("Error", null, "Die Datei " + Main.currBook.getImageFile().getPath() + " enthält nicht zulässige Zeichen."); //JOptionPane.showMessageDialog(null, "Die Coverdatei enthält nicht zulässige Zeichen.", "Fehler", JOptionPane.ERROR_MESSAGE); return Boolean.FALSE; } Main.currBook.setImageFile(newFile); firePropertyChange("ProgressValue", 0, max); } // // firePropertyChange("ProgressValue", 0, 0); firePropertyChange("ActionLabel", "", "Script erstellen..."); FileWriter FWriter = null; File PODfile = new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD"); try { FWriter = new FileWriter(PODfile); BufferedWriter writer = new BufferedWriter(FWriter); //Write head writer.write("[Podcast]\n\n"); writer.write("altfolder1=" + Main.currBook.getTargetFolder().getName() + "\n"); writer.write("basename=" + NameField.getText() + "\n"); writer.write("audiobook=true\n"); if (Main.currBook.getImageFile() != null) { writer.write("artwork=" + Main.currBook.getImageFile().getName() + "\n"); ImageIcon icon = new ImageIcon(Main.currBook.getImageFile().getPath()); writer.write("imgwidth=" + icon.getIconWidth() + "\n"); writer.write("imgheight=" + icon.getIconHeight() + "\n"); } writer.write("editpointcount=" + Main.currBook.size() + "\n"); firePropertyChange("ProgressValue", null, 1); //Write a block for each chapter Time startTime = new Time(false); for (int i = 1; i <= Main.currBook.size(); i++) { Chapter chapter = Main.currBook.get(i - 1); writer.write("\n\n[Editpoint_" + i + "]\n"); if (Main.currBook.getImageFile() != null) { writer.write("image=" + Main.currBook.getImageFile().getName() + "\n"); } writer.write("audiofile=" + chapter.getFile().getName() + "\n"); writer.write("chapter=" + chapter.getTitle() + "\n"); writer.write("start=" + startTime.toString() + ".00\n"); startTime.add(chapter.getTime()); firePropertyChange("ProgressValue", 0, i + 1); } //Write Metadata (not neccessary) if (Main.currBook.getAlbum() != null || Main.currBook.getName() != null || Main.currBook.getArtist() != null) { writer.write("\n[metadata]\n"); } if (Main.currBook.getName() != null) { writer.write("©nam=" + Main.currBook.getName() + "\n"); } if (Main.currBook.getArtist() != null) { writer.write("©ART=" + Main.currBook.getArtist() + "\n"); } if (Main.currBook.getAlbum() != null) { writer.write("©alb=" + Main.currBook.getAlbum()); } writer.close(); FWriter.close(); } catch (IOException ex) { //JOptionPane.showMessageDialog(null, "Beim Erstellen der .POD Datei ist ein Fehler aufgetreten. Der Prozess konnte nicht abgeschlossen werden.", "Fehler", JOptionPane.ERROR_MESSAGE); firePropertyChange("Error", null, "Beim Erstellen des Skriptes ist ein Fehler aufgetreten."); try { //remove POD file on error to not let create the user an impossible audiobook PODfile.delete(); } catch (Exception exc) { } return Boolean.FALSE; } // return Boolean.TRUE; } @Override protected void done() { try { firePropertyChange("Finish", null, get()); } catch (InterruptedException | ExecutionException ex) { ex.printStackTrace(); } } }; final ProgressDialog dialog = new ProgressDialog(this, true); worker.addPropertyChangeListener(dialog); dialog.progressBar.setValue(0); dialog.ActionLabel.setText(""); dialog.MessageLabel.setText(""); worker.execute(); dialog.setVisible(true); } /** * Lets SSA create the audiobook file * @param evt Auto Generated Event; not used */ private void createAudiobookButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createAudiobookButtonActionPerformed // boolean isError = false; String errorText = "Beim Erstellen des Hörbuchs sind folgende Fehler aufgetreten;
    "; //No target folder if (FolderField.getText().equals("")) { errorText = errorText.concat("
  • Es wurde kein Ordner angegeben
  • "); isError = true; } //No name typed if (NameField.getText().equals("")) { errorText = errorText.concat("
  • Es wurde kein Dateiname angegeben
  • "); isError = true; } if (isError) { errorText = errorText.concat("
Der Prozess konnte nicht abgeschlossen werden"); JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); return; } //Check if the POD file exists; should already be done --> checkPOD(); final File PODfile = new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD"); if (!PODfile.exists()) { JOptionPane.showMessageDialog(this, "Die .POD Datei \"" + PODfile.getPath() + "\" wurde nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE); return; } //
SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { ProcessBuilder builder = new ProcessBuilder("SSA", PODfile.getName()).redirectErrorStream(true); builder.directory(Main.currBook.getTargetFolder()); builder.redirectErrorStream(true); final Process p = builder.start(); // new Thread() { // // public void run() { try { //BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); //String line; int i; while ((i = p.getInputStream().read()) != -1) { System.out.println(i); } } catch (IOException ex) { ex.printStackTrace(); } // } // }.start(); return p.exitValue(); } @Override protected void done() { System.out.println("done"); } }; worker.execute(); /*// File logFile = new File(Main.currBook.getTargetFolder().getPath() + "/SSA Log.txt"); if (logFile.exists()) { logFile.delete(); } logFile.createNewFile(); BufferedWriter writer = new BufferedWriter(new FileWriter(logFile)); //Writing the SSA output to the logfile writer.write("SSA Output: " + "\n"); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = reader.readLine()) != null) { writer.write("\n" + line); } writer.write("\n\n\nErgebnis=" + p.exitValue()); reader.close(); writer.close(); //*/ /* // //Create new ProcessBuilder to use SSA ProcessBuilder builder = new ProcessBuilder("SSA", PODfile.getName()).redirectErrorStream(true); builder.directory(Main.currBook.getTargetFolder()); try { Process p = builder.start(); p.waitFor(); // if (DeleteFiles.isSelected()) { dialog.setTitle("Aufräumen"); dialog.ActionLabel.setText("Dateien löschen: "); dialog.MessageLabel.setText(""); dialog.progressBar.setIndeterminate(false); dialog.progressBar.setMaximum(Main.currBook.size()); dialog.progressBar.setValue(0); for (Chapter chapter : Main.currBook) { dialog.MessageLabel.setText("Datei: " + chapter.getFile().getPath()); if (!chapter.getFile().delete()) { JOptionPane.showMessageDialog(null, "Beim löschen der Datei " + chapter.getFile().getPath() + " ist ein Fehler aufgetreten", "Fehler", JOptionPane.ERROR_MESSAGE); } dialog.progressBar.setValue(dialog.progressBar.getValue() + 1); dialog.validate(); dialog.repaint(); } } // JOptionPane.showMessageDialog(null, "Das Hörbuch wurde erfolgreich im Ordner \"" + PODfile.getParent() + "\" erstellt", "Beendet", JOptionPane.INFORMATION_MESSAGE); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "Beim Erstellen des Hörbuches ist ein Fehler aufgetreten. Der Prozess konnte nicht abgeschlossen werden.", "Fehler", JOptionPane.ERROR_MESSAGE); } catch (InterruptedException ex) { JOptionPane.showMessageDialog(null, "Der Prozess wurde abgebrochen.", "Fehler", JOptionPane.ERROR_MESSAGE); } //*/ }//GEN-LAST:event_createAudiobookButtonActionPerformed /** * Lets the user choose a text file to auto rename every selected chapter * @param evt Auto Generated Event; not used */ private void useProfileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useProfileActionPerformed //Creating preview component final JTextArea preview = new JTextArea(); preview.setEditable(false); preview.setLineWrap(true); preview.setWrapStyleWord(true); preview.setPreferredSize(new Dimension(250, 100)); File userDir = new File(System.getProperty("user.dir")); File profileFolder = new File(userDir.getPath() + "/Profile"); JFileChooser chooser = new JFileChooser(profileFolder.exists() ? profileFolder : userDir); chooser.setMultiSelectionEnabled(false); chooser.setAccessory(preview); chooser.addPropertyChangeListener(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { try { BufferedReader reader = new BufferedReader(new FileReader((File) evt.getNewValue())); preview.setText(""); String line = ""; while ((line = reader.readLine()) != null) { if (line.startsWith("#")) { preview.append(line.replaceFirst("#", "") + "\n"); } } } catch (Exception e) { e.printStackTrace(); } } }); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { try { FileReader FReader = new FileReader(chooser.getSelectedFile()); BufferedReader reader = new BufferedReader(FReader); String profile = ""; while ((profile = reader.readLine()).startsWith("#")) { } //Using profile useChapterProfile(profile); FReader.close(); reader.close(); } catch (FileNotFoundException ex) { Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); } } }//GEN-LAST:event_useProfileActionPerformed /** * Renames every loaded Chapter by a single-line String containing QuoteProcessor compatible code. * @param profile a single Line String * @see NumberQuoteProcessor * @see M4aTagQuoteProcessor * @see FileNameQuoteProcessor * @see AdvancedFileNameQuoteProcessor * @see FilepathQuoteProcessor * @see QuoteProcessor */ public void useChapterProfile(String profile) { if (profile == null || profile == "") { return; } //Creating QuoteProcessor instances NumberQuoteProcessor numbQuote = new NumberQuoteProcessor(); FileNameQuoteProcessor fileNameQuote = new FileNameQuoteProcessor(); FilepathQuoteProcessor filePathQuote = new FilepathQuoteProcessor(); AdvancedFileNameQuoteProcessor advancedQuote = new AdvancedFileNameQuoteProcessor(); M4aTagQuoteProcessor m4aQuote = new M4aTagQuoteProcessor(); //if no chapter is selected, select all if (ChaptersList.getSelectedIndex() == -1) { ChaptersList.setSelectionInterval(0, Main.currBook.size() - 1); } //Applying profile to each loaded and selected chapter for (int i : ChaptersList.getSelectedIndices()) { Chapter chapter = Main.currBook.get(i); numbQuote.setNumber(i + 1); fileNameQuote.setFile(chapter.getFile()); advancedQuote.setFile(chapter.getFile()); filePathQuote.setFile(chapter.getFile()); m4aQuote.setFile(chapter.getFile()); String newTitle = profile; newTitle = numbQuote.replaceAll(newTitle); newTitle = fileNameQuote.replaceAll(newTitle); newTitle = advancedQuote.replaceAll(newTitle); newTitle = filePathQuote.replaceAll(newTitle); newTitle = m4aQuote.replaceAll(newTitle); chapter.setTitle(newTitle); } updateChaptersList(); } /** * Calls the exit method * @param evt Auto Generated Event; not used */ private void ExitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExitMenuItemActionPerformed Main.mainObj.exit(); }//GEN-LAST:event_ExitMenuItemActionPerformed /** * Calls the exit method * @param evt Auto Generated Event; not used */ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing Main.mainObj.exit(); }//GEN-LAST:event_formWindowClosing /** * Opens the a new Chapter editor window * @param evt Auto Generated Event; not used */ private void createChapterProfileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createChapterProfileMenuItemActionPerformed ChapterProfileCreator window = new ChapterProfileCreator(); window.setLocation(Application.getScreenCenterFor(window)); window.setVisible(true); }//GEN-LAST:event_createChapterProfileMenuItemActionPerformed /** * Removes the loaded cover * @param evt Auto Generated Event; not used */ private void RemoveCoverButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveCoverButtonActionPerformed Main.currBook.setImageFile(null); CoverField.setText(""); }//GEN-LAST:event_RemoveCoverButtonActionPerformed /** * Opens a MultipleInputPane to edit tags * @param evt Auto Generated Event; not used * @see MultipleInputPane */ private void editTagsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editTagsButtonActionPerformed MultipleInputPane pane = new MultipleInputPane("Name: ", "Interpret: ", "Album: "); pane.setText(0, Main.currBook.getName()); pane.setText(1, Main.currBook.getArtist()); pane.setText(2, Main.currBook.getAlbum()); pane.showDialog(this, "Eingabe", JOptionPane.PLAIN_MESSAGE); Main.currBook.setName(pane.getText(0)); Main.currBook.setArtist(pane.getText(1)); Main.currBook.setAlbum(pane.getText(2)); NameTag.setText(Main.currBook.getName().equals("") ? "..." : Main.currBook.getName()); AlbumTag.setText(Main.currBook.getAlbum().equals("") ? "..." : Main.currBook.getAlbum()); ArtistTag.setText(Main.currBook.getArtist().equals("") ? "..." : Main.currBook.getArtist()); pack(); }//GEN-LAST:event_editTagsButtonActionPerformed /** * Shows an about box * @param evt Auto Generated Event; not used */ private void AboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutMenuItemActionPerformed Main.mainObj.showAboutBox(); }//GEN-LAST:event_AboutMenuItemActionPerformed /** * Sorts all chapters alphabetical * @param evt Auto Generated Event; not used */ private void SortButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SortButtonActionPerformed Collections.sort(Main.currBook); updateChaptersList(); }//GEN-LAST:event_SortButtonActionPerformed /** * Called when the user presses the [Enter] Key after typing in titleField * @param evt Auto Generated Event; not used */ private void titleFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_titleFieldActionPerformed ChaptersList.removeSelectionInterval(ChaptersList.getSelectedIndex(), ChaptersList.getSelectedIndex()); }//GEN-LAST:event_titleFieldActionPerformed /** * Provides methods to react on Key actions inside the List * @param evt a Key Event */ private void ChaptersListKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_ChaptersListKeyPressed //Delete if (evt.getKeyCode() == KeyEvent.VK_DELETE) { removeButtonActionPerformed(null); } }//GEN-LAST:event_ChaptersListKeyPressed /** * Loads all available information of a POD file and sets them active * @param evt Auto Generated Event; not used */ private void loadPODFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadPODFileMenuItemActionPerformed //Open filechooser dialog JFileChooser chooser = new JFileChooser(Main.lastDir); chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.POD Files", "POD")); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setAcceptAllFileFilterUsed(false); chooser.setMultiSelectionEnabled(false); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { Main.lastDir = chooser.getCurrentDirectory(); loadPODFile(chooser.getSelectedFile()); } }//GEN-LAST:event_loadPODFileMenuItemActionPerformed public void loadPODFile(File podFile) { try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); //setting targetFolder Main.currBook.setTargetFolder(podFile.getParentFile()); BufferedReader reader = new BufferedReader(new FileReader(podFile)); String line = ""; String errorText = "Beim Laden folgender Dateien sind Fehler aufgetreten, sodass sie nicht geladen wurden:
    "; boolean error = false; // while (line != null) { if (line.startsWith("basename=")) { //seting Name NameField.setText(line.substring(line.indexOf("=") + 1)); line = reader.readLine(); } else if (line.startsWith("[Editpoint")) { //Creating a new chapter Chapter newChapter = new Chapter(); boolean wasError = error; while (!(line = reader.readLine()).startsWith("[")) { if (line.startsWith("audiofile")) { //Setting the chapter's file File audiofile = new File(podFile.getParent() + "/" + line.substring(line.indexOf("=") + 1)); newChapter.setFile(audiofile); //Reading the audiotrack's length try { newChapter.calculateTime(); error = false; } catch (Exception ex) { errorText = errorText.concat("
  • " + newChapter.getFile().getPath() + "
  • "); error = true; } } else if (line.startsWith("chapter")) { //Setting the title of the chapter newChapter.setTitle(line.substring(line.indexOf("=") + 1)); } } if (!error) { //If there is no error add chapter to active audiobook Main.currBook.add(newChapter); error = wasError; } //Reading tag information } else if (line.startsWith("©nam")) { Main.currBook.setName(line.substring(line.indexOf("=") + 1)); line = reader.readLine(); } else if (line.startsWith("©ART")) { Main.currBook.setArtist(line.substring(line.indexOf("=") + 1)); line = reader.readLine(); } else if (line.startsWith("©alb")) { Main.currBook.setAlbum(line.substring(line.indexOf("=") + 1)); line = reader.readLine(); } else { line = reader.readLine(); } } //
    if (error) { //Show error log errorText = errorText.concat("
Prüfen Sie, ob die Dateien funktionsfähige *.m4a Dateien und im Ordner der POD Datei vorhanden sind."); JOptionPane.showMessageDialog(this, errorText, "Fehler", JOptionPane.ERROR_MESSAGE); } setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } catch (IOException ex) { ex.printStackTrace(); } repaintAll(); } /** * Auto called. Checks wether a POD file in the target folder exists */ public void checkPOD() { try { if (new File(Main.currBook.getTargetFolder().getPath() + "/" + NameField.getText() + ".POD").exists()) { createAudiobookButton.setEnabled(true); } else { createAudiobookButton.setEnabled(false); } } catch (Exception ex) { createAudiobookButton.setEnabled(false); } } /** * Auto called. Updates the Chapters List. */ public void renameChapter() { Chapter c = Main.currBook.get(ChaptersList.getSelectedIndex()); c.setTitle(titleField.getText()); } /** * Creates a new TreeModel with all loaded chapters and sets it as active model */ public void updateChaptersList() { DefaultListModel model = new DefaultListModel(); for (Object chapter : Main.currBook) { model.addElement(chapter); } ChaptersList.setModel(model); ChaptersList.repaint(); } /** * Sets data of all components by their related variables */ public void repaintAll() { updateChaptersList(); CoverField.setText(Main.currBook.getImageFile() == null ? "" : Main.currBook.getImageFile().getPath()); NameTag.setText(Main.currBook.getName().equals("") ? "..." : Main.currBook.getName()); AlbumTag.setText(Main.currBook.getAlbum().equals("") ? "..." : Main.currBook.getAlbum()); ArtistTag.setText(Main.currBook.getArtist().equals("") ? "..." : Main.currBook.getArtist()); FolderField.setText(Main.currBook.getTargetFolder().getPath()); checkPOD(); } // DropTargetListener listDrop; DropTargetListener coverFieldDrop; DropTargetListener targetDirDrop; DropTargetListener mainDrop; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenuItem AboutMenuItem; private javax.swing.JLabel AlbumTag; private javax.swing.JLabel AlbumTagLabel; private javax.swing.JLabel ArtistTag; private javax.swing.JLabel ArtistTagLabel; private javax.swing.JPanel BookPropPanel; private javax.swing.JPanel ChapterPropPanel; private javax.swing.JList ChaptersList; private javax.swing.JRadioButton CopyRadioButton; private javax.swing.JTextField CoverField; private javax.swing.JLabel CoverLabel; private javax.swing.JCheckBox DeleteFiles; private javax.swing.JMenuItem ExitMenuItem; private javax.swing.JLabel FileLabel; private javax.swing.JMenu FileMenu; private javax.swing.JScrollPane FilesScrollPane; private javax.swing.JTextField FolderField; private javax.swing.JMenu HelpMenu; private javax.swing.JTextField NameField; private javax.swing.JLabel NameTag; private javax.swing.JLabel NameTagLabel; private javax.swing.JButton RemoveCoverButton; private javax.swing.JButton SearchCoverButton; private javax.swing.JButton SearchFolderButton; private javax.swing.JButton SortButton; private javax.swing.JMenu SpecialMenu; private javax.swing.JLabel TargetDirLabel; private javax.swing.JLabel TitleLabel; private javax.swing.ButtonGroup buttonGroup; private javax.swing.JButton createAudiobookButton; private javax.swing.JMenuItem createChapterProfileMenuItem; private javax.swing.JButton createPodFileButton; private javax.swing.JButton downButton; private javax.swing.JButton editTagsButton; private javax.swing.JTextField fileField; private javax.swing.JPopupMenu.Separator jSeparator1; private javax.swing.JMenuItem loadPODFileMenuItem; private javax.swing.JMenuBar menuBar; private javax.swing.JRadioButton moveRadioButton; private javax.swing.JButton openFilesButton; private javax.swing.JMenuItem openFilesMenuItem; private javax.swing.JButton removeButton; private javax.swing.JTextField titleField; private javax.swing.JButton upButton; private javax.swing.JButton useProfile; // End of variables declaration//GEN-END:variables // }