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
//
}