package controller;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
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 controller.interfaces.AbstractController;
import logging.LogUtil;
import model.RenameToolModel;
import model.exception.ControllerInitException;
import model.filefilter.AudioFilter;
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 view.RenameToolTab;
import view.interfaces.AbstractTab;
public class RenameToolController extends AbstractController {
/**
* the logger
*/
private final Logger logger = Logger.getLogger(this.getClass().getName());
/**
* the model
*/
private RenameToolModel model;
/**
* the window
*/
private RenameToolTab window;
/**
* cancel command
*/
private ICancelCommand cancelCmd;
/**
* Constructor
*/
public RenameToolController() {
this.model = new RenameToolModel();
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 = (RenameToolTab) 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 = 5506005560109208460L;
@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) {
new Thread(new Runnable() {
@Override
public void run() {
addAudioFiles(files);
}
}).start();
}
});
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable o, Object arg) {
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("renameFilesB"))
renameFilesBPressed();
else if (e.getActionCommand().equals("showChangesB"))
makeChangesBPressed();
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();
else if (e.getActionCommand().equals("filenameRB"))
getInfoMethodChanged();
else if (e.getActionCommand().equals("id3tagRB"))
getInfoMethodChanged();
else if (e.getActionCommand().equals("replaceSpaceChB"))
replaceSpaceChBPressed();
else if (e.getActionCommand().equals("replaceUnderscoreChB"))
replaceUnderscoreChBPressed();
}
/**
* rename files pressed, before the changes needs to be made
*/
private void renameFilesBPressed() {
logger.log(Level.FINER, "Rename files button pressed.");
new Thread(new Runnable() {
@Override
public void run() {
window.setButtonsEnabled(false);
if (model.allAudioFilesAnalysed()) {
logger.log(Level.FINER, "not all audio files analyzed.");
window.showMessage("notAllAnalyzed");
return;
}
IProgressBar b = new InProgressBar(400, 200);
b.start();
model.renameAudioFiles(window.getUnchangedChB(), window.getUpperCaseRB());
b.stopBar();
window.setButtonsEnabled(true);
window.showMessage("done");
}
}).start();
}
/**
* makes the changes and shows them in the table, the changes will be
* written by pressing rename files
*/
private void makeChangesBPressed() {
logger.log(Level.FINER, "Make changes button pressed.");
final String src = window.getsourceTF();
final String target = window.gettargetTF();
if (!window.getID3TagRB() && src.trim().equals("")) {
window.showMessage("srcRegexEmpty");
return;
} else if (target.trim().equals("")) {
window.showMessage("targetRegexEmpty");
return;
}
new Thread(new Runnable() {
@Override
public void run() {
window.setButtonsEnabled(false);
IProgressBar b = new InProgressBar(400, 200);
b.setCancelCommand(cancelCmd);
b.start();
if (window.getID3TagRB())
model.makeNewNamesID3Tag(target);
else
model.makeNewNames(src, target);
model.makeMisc(window.getreplaceUnderscoreChB(), window.getreplaceSpaceChB(), window.gettrimChB());
if (window.getreplaceChB())
model.makeReplace(window.getreplaceTF(), window.getreplaceWithTF());
model.setStopFlag(false);
b.stopBar();
updateTable(true);
}
}).start();
}
/**
* add file pressed
*/
private void addFileBPressed() {
logger.log(Level.FINER, "add file button pressed.");
final File file = ChooserUtil.openFile(window, new AudioFilter(), new File(Config.getInstance().getRenameOpenFile()));
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().setRenameOpenFile(file.getAbsolutePath());
new Thread(new Runnable() {
@Override
public void run() {
List<String> lst = new ArrayList<>();
lst.add(file.getAbsolutePath());
addAudioFiles(lst);
}
}).start();
}
/**
* add folder pressed
*/
private void addFolderBPressed() {
logger.log(Level.FINER, "add folder button pressed.");
final File folder = ChooserUtil.openFolder(window, new File(Config.getInstance().getRenameOpenFolder()));
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().setRenameOpenFolder(folder.getAbsolutePath());
new Thread() {
public void run() {
addAudioFiles(folder.getAbsolutePath());
}
}.start();
}
/**
* deletes the file from the list
*/
private void deleteFileBPressed() {
logger.log(Level.FINER, "delete file button pressed.");
int[] i = window.getSelectedIndices();
if (i == null || i.length < 1)
return;
model.deleteAudioFiles(i);
updateTable(false);
}
/**
* deletes all files from the list
*/
private void deleteAllBPressed() {
logger.log(Level.FINER, "delete all button pressed.");
model.clearAudioFiles();
updateTable(false);
}
/**
* replace underscore with space checkbox pressed
*/
private void replaceUnderscoreChBPressed() {
logger.log(Level.FINER, "replace underscore checkbox pressed. selected: " + window.getreplaceUnderscoreChB());
if (!window.getreplaceUnderscoreChB())
window.setreplaceUnderscoreChB(false);
else
window.setreplaceUnderscoreChB(true);
window.setreplaceSpaceChB(false);
}
/**
* replace space with underscore checkbox pressed
*/
private void replaceSpaceChBPressed() {
logger.log(Level.FINER, "replace space checkbox pressed. selected: " + window.getreplaceSpaceChB());
if (!window.getreplaceSpaceChB())
window.setreplaceSpaceChB(false);
else
window.setreplaceSpaceChB(true);
window.setreplaceUnderscoreChB(false);
}
/**
* changed the information method
*/
private void getInfoMethodChanged() {
logger.log(Level.FINER, "get info method changed. id3tag selected: " + window.getID3TagRB());
if (window.getID3TagRB()) {
window.setSourceRegexEnabled(false);
} else {
window.setSourceRegexEnabled(true);
}
}
/*
* (non-Javadoc)
*
* @see
* controller.interfaces.AbstractController#mouseClicked(java.awt.event.
* MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
logger.log(Level.FINER, "open help pressed.");
window.openHelpDialog();
}
/**
* adds the given folder to the list
*
* @param path
* the folder path
*/
private void addAudioFiles(String path) {
IProgressBar ib = new InProgressBar(400, 200);
ib.setCancelCommand(cancelCmd);
ib.start();
model.addAudioFiles(path, window.getrecursiveChB());
ib.stopBar();
model.setStopFlag(false);
updateTable(true);
}
/**
* adds the given files to the list
*
* @param files
* the paths
*/
private void addAudioFiles(List<String> files) {
IProgressBar ib = new InProgressBar(400, 200);
ib.setCancelCommand(cancelCmd);
ib.start();
for (String f : files)
model.addAudioFile(f, true);
model.setStopFlag(false);
ib.stopBar();
updateTable(true);
}
/**
* updates the table
*
* @param enButtons
* true if all buttons should be enabled too
*/
private void updateTable(final boolean enButtons) {
window.saveTableWidth();
window.setTableModel(model.getTableModel());
if (enButtons)
window.setButtonsEnabled(true);
}
/*
* (non-Javadoc)
*
* @see controller.interfaces.AbstractController#saveConfig()
*/
@Override
public void saveConfig() {
Config.getInstance().setRenameReplaceSpaceWithUnderscore(window.getreplaceSpaceChB());
Config.getInstance().setRenameFilenameSelected(!window.getID3TagRB());
Config.getInstance().setRenameTrimFilename(window.gettrimChB());
Config.getInstance().setRenameExtensionLowercase(window.getLowerCaseRB());
Config.getInstance().setRenameExtensionUppercase(window.getUpperCaseRB());
Config.getInstance().setRenameRecursive(window.getrecursiveChB());
Config.getInstance().setRenameSource(window.getsourceTF());
Config.getInstance().setRenameTarget(window.gettargetTF());
Config.getInstance().setRenameReplace(window.getreplaceTF());
Config.getInstance().setRenameReplaceWith(window.getreplaceWithTF());
}
}