package controller;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import config.Config;
import config.Constants;
import controller.interfaces.AbstractController;
import logging.LogUtil;
import model.FolderCreatorModel;
import model.exception.ControllerInitException;
import model.filefilter.AudioFilter;
import model.progressbar.CounterProgressBar;
import model.progressbar.InProgressBar;
import model.progressbar.interfaces.ICancelCommand;
import model.progressbar.interfaces.IProgressBar;
import model.transferhandler.FileFolderTransferHandler;
import model.util.ChooserUtil;
import model.util.Commons;
import model.util.Util;
import view.FolderCreatorTab;
import view.interfaces.AbstractTab;
public class FolderCreatorController extends AbstractController implements MouseListener {
/**
* the logger
*/
private final Logger logger = Logger.getLogger(this.getClass().getName());
/**
* the model
*/
private FolderCreatorModel model;
/**
* the window
*/
private FolderCreatorTab window;
/**
* the cancel command for progressbars
*/
private ICancelCommand cancelCmd;
/**
* Constructor
*/
public FolderCreatorController() {
this.model = new FolderCreatorModel();
this.cancelCmd = new ICancelCommand() {
@Override
public void call() {
model.setStopFlag(true);
}
};
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#init(view.interfaces.AbstractTab
* )
*/
@Override
public void init(AbstractTab tab) throws ControllerInitException {
this.window = (FolderCreatorTab) tab;
this.window.setMouseListener(this);
this.window.setActionListener(this);
this.window.setTableModel(model.getTableModel());
try {
this.window.setMasks(Commons.readMasks());
} catch (IOException e) {
logger.log(Level.SEVERE, "Error while reading masks:\n" + LogUtil.getStackTrace(e), e);
}
this.window.setTableTransferHandler(new FileFolderTransferHandler() {
private static final long serialVersionUID = 5074476020036849927L;
@Override
public void addFolder(final String path) {
new Thread(new Runnable() {
@Override
public void run() {
addAudioFiles(path);
}
}).start();
}
@Override
public void addFiles(final List<String> files) {
addAudioFiles(files);
}
});
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable arg0, Object arg1) {
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("showChangesB"))
showChangesBPressed();
else if (e.getActionCommand().equals("makeStructureB"))
makeStructureBPressed();
else if (e.getActionCommand().equals("targetOpenB"))
targetOpenBPressed();
else if (e.getActionCommand().equals("filenameRB"))
filenameRBPressed();
else if (e.getActionCommand().equals("id3tagRB"))
id3tagRBPressed();
else if (e.getActionCommand().equals("addFileB"))
addFileBPressed();
else if (e.getActionCommand().equals("addFolderB"))
addFolderBPressed();
else if (e.getActionCommand().equals("deleteFileB"))
deleteFileBPressed();
else if (e.getActionCommand().equals("deleteAllB"))
deleteAllBPressed();
}
/**
* show changes button pressed
*/
private void showChangesBPressed() {
logger.log(Level.FINER, "Show changes button pressed.");
if (window.getstructureTF().trim().equals("")) {
window.showMessage("structureEmpty");
return;
}
if (window.gettargetTF().trim().equals("")) {
window.showMessage("TargetFolderNotFound");
return;
}
// id3tag
if (window.getID3TagRB()) {
new Thread(new Runnable() {
@Override
public void run() {
window.setButtonsEnabled(false);
IProgressBar b = new CounterProgressBar();
b.setMax(model.getListSize());
b.setCancelCommand(cancelCmd);
b.start();
model.createNewPathID3(window.getstructureTF().trim(), window.gettargetTF().trim(), b);
Util.sleep(Constants.REFRESH_DELAY);
b.stopBar();
model.setStopFlag(false);
updateTable(true);
}
}).start();
}
// else filename
else {
if (window.getregexTF().trim().equals("")) {
window.showMessage("regexEmpty");
return;
}
new Thread(new Runnable() {
@Override
public void run() {
window.setButtonsEnabled(false);
IProgressBar b = new CounterProgressBar();
b.setMax(model.getListSize());
b.setCancelCommand(cancelCmd);
b.start();
model.createNewPath(window.getstructureTF().trim(), window.getregexTF().trim(), window.gettargetTF().trim(), b);
window.setTableModel(model.getTableModel());
Util.sleep(Constants.REFRESH_DELAY);
model.setStopFlag(false);
b.stopBar();
updateTable(true);
}
}).start();
}
}
/**
* generates the folder structure Button pressed
*/
private void makeStructureBPressed() {
logger.log(Level.FINER, "Make changes button pressed.");
if (window.gettargetTF().trim().equals("")) {
logger.log(Level.FINER, "target is empty.");
window.showMessage("TargetFolderNotFound");
return;
}
new Thread(new Runnable() {
@Override
public void run() {
window.setButtonsEnabled(false);
IProgressBar b = new CounterProgressBar();
b.setMax(model.getListSize());
b.setCancelCommand(cancelCmd);
b.start();
model.createFolderStructure();
model.generateFolderStructure(window.gettargetTF());
try {
model.copyAudioFiles(b);
} catch (IOException e) {
window.showMessage("copyError");
}
Util.sleep(Constants.REFRESH_DELAY);
window.setButtonsEnabled(true);
model.setStopFlag(false);
b.stopBar();
}
}).start();
}
/**
* opens the target folder open button
*/
private void targetOpenBPressed() {
logger.log(Level.FINER, "Target open button pressed.");
File folder = ChooserUtil.openFolder(window, window.gettargetTF().length() > 0 ? new File(window.gettargetTF()) : null);
if (folder == null)
return;
window.settargetTF(folder.getAbsolutePath());
String path = window.gettargetTF();
if (!new File(path).exists()) {
logger.log(Level.FINER, "folder: " + path + " doesnt exist.");
window.showMessage("TargetFolderNotFound");
return;
}
}
/**
* filename radiobutton pressed
*/
private void filenameRBPressed() {
logger.log(Level.FINER, "Filename RadioButton changed: " + window.getFilenameRB());
window.setRegexEnabled(true);
}
/**
* id3 radiobutton pressed
*/
private void id3tagRBPressed() {
logger.log(Level.FINER, "ID3Tag RadioButton changed: " + window.getID3TagRB());
window.setRegexEnabled(false);
}
/**
* regex help button pressed
*/
private void regexHelpPressed() {
logger.log(Level.FINER, "Regex Help Panel pressed.");
window.openRegexHelpDialog();
}
/**
* structure regex help button pressed
*/
private void structureHelpPressed() {
logger.log(Level.FINER, "Structure Help Panel pressed.");
window.openStructureHelpDialog();
}
/**
* add file button pressed
*/
private void addFileBPressed() {
logger.log(Level.FINER, "add file button pressed.");
final File file = ChooserUtil.openFile(window, new AudioFilter(), new File(Config.getInstance().getGeneratorOpenFile()));
if (file == null)
return;
if (!new File(file.getAbsolutePath()).exists()) {
logger.log(Level.FINER, "file: " + file.getAbsolutePath() + " doesnt exist.");
window.showMessage("FileNotFound");
return;
}
Config.getInstance().setGeneratorOpenFile(file.getAbsolutePath());
List<String> lst = new ArrayList<>();
lst.add(file.getAbsolutePath());
addAudioFiles(lst);
}
/**
* add folder button pressed
*/
private void addFolderBPressed() {
logger.log(Level.FINEST, "add folder button pressed.");
final File folder = ChooserUtil.openFolder(window, new File(Config.getInstance().getGeneratorOpenFolder()));
if (folder == null)
return;
if (!new File(folder.getAbsolutePath()).exists()) {
logger.log(Level.FINER, "folder: " + folder.getAbsolutePath() + " doesnt exist.");
window.showMessage("FolderNotFound");
return;
}
Config.getInstance().setGeneratorOpenFolder(folder.getAbsolutePath());
addAudioFiles(folder.getAbsolutePath());
}
/**
* delete file button pressed
*/
private void deleteFileBPressed() {
logger.log(Level.FINEST, "delete file button pressed.");
int[] i = window.getSelectedIndices();
if (i == null || i.length < 1)
return;
model.deleteAudioFiles(i);
updateTable(false);
}
/**
* delete all files button pressed
*/
private void deleteAllBPressed() {
logger.log(Level.FINEST, "delete all button pressed.");
model.clearAudioFiles();
updateTable(false);
}
/**
* updates the table
*
* @param enButtons
* true if the buttons should be enabled
*/
private void updateTable(final boolean enButtons) {
window.saveTableWidth();
window.setTableModel(model.getTableModel());
if (enButtons)
window.setButtonsEnabled(true);
}
/**
* adds the given list of audio files
*
* @param files
* the given file paths
*/
private void addAudioFiles(final List<String> files) {
new Thread(new Runnable() {
@Override
public void run() {
IProgressBar ib = new InProgressBar(400, 200);
ib.setCancelCommand(cancelCmd);
ib.start();
for (String f : files)
model.addAudioFile(f, true);
Util.sleep(Constants.REFRESH_DELAY);
model.setStopFlag(false);
ib.stopBar();
updateTable(true);
}
}).start();
}
/**
* adds the given folder
*
* @param path
* path to the folder
*/
private void addAudioFiles(final String path) {
new Thread(new Runnable() {
@Override
public void run() {
IProgressBar ib = new InProgressBar(400, 200);
ib.setCancelCommand(cancelCmd);
ib.start();
model.addAudioFiles(path, window.getrecursiveChB());
Util.sleep(Constants.REFRESH_DELAY);
model.setStopFlag(false);
ib.stopBar();
updateTable(true);
}
}).start();
}
/*
* (non-Javadoc)
*
* @see controller.interfaces.AbstractController#saveConfig()
*/
@Override
public void saveConfig() {
Config.getInstance().setGeneratorTargetFolder(window.gettargetTF());
Config.getInstance().setGeneratorStructure(window.getstructureTF());
Config.getInstance().setGeneratorRecursive(window.getrecursiveChB());
Config.getInstance().setGeneratorRegex(window.getregexTF());
Config.getInstance().setGeneratorFilenameSelected(window.getFilenameRB());
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#mousePressed(java.awt.event.
* MouseEvent)
*/
@Override
public void mousePressed(MouseEvent e) {
if (e.getSource() == window.getRegexHelpP())
regexHelpPressed();
else if (e.getSource() == window.getStructureHelpP())
structureHelpPressed();
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#mouseReleased(java.awt.event
* .MouseEvent)
*/
@Override
public void mouseReleased(MouseEvent e) {
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#mouseClicked(java.awt.event.
* MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#mouseEntered(java.awt.event.
* MouseEvent)
*/
@Override
public void mouseEntered(MouseEvent e) {
}
/*
* (non-Javadoc)
*
* @see controller.interfaces.AbstractController#mouseExited(java.awt.event.
* MouseEvent)
*/
@Override
public void mouseExited(MouseEvent e) {
}
}