// TODO SORTERA SKITEN
// TODO WHY IS CONTROLLER EVEN A CLASS TO USE
package controller;
import gui.GUI;
import gui.QuerySearchTab;
import gui.UploadTab;
import gui.processing.ProcessTab;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import model.ErrorLogger;
import model.GenomizerModel;
import model.SessionHandler;
import model.User;
import util.AnnotationDataType;
import util.LoginException;
/**
* Controller class responsible for setting the correct actions to the listening
* buttons and other component. This will drive the actions started via the GUI.
*/
public class Controller {
private GUI view;
private GenomizerModel model;
private final JFileChooser fileChooser = new JFileChooser();
public Controller(GUI view, GenomizerModel model) {
this.view = view;
this.model = model;
updateView();
}
/**
* Update **ALL** the actionlisteners in the whole wide gui.
*/
private void updateView() {
loginWindowUpdate();
userPanelUpdate();
ratioCalcUpdate();
tabbedPaneUpdate();
}
/**
* Update all the actionlisteners in the tabs.
*/
public void createTabControllers() {
QuerySearchTabController querySearchTabController = new QuerySearchTabController(
view, model);
view.getQuerySearchTab().setController(querySearchTabController);
ProcessTabController processTabController = new ProcessTabController(
view.getProcessTab(), model.getProcessingModel());
view.getProcessTab().setController(processTabController);
new WorkspaceTabController(view, model, fileChooser);
new UploadTabController(view, model, fileChooser);
SysadminController sysadminTabController = new SysadminController(model,view);
view.getSysAdminTab().setController(sysadminTabController);
ConvertTabController convertTabController = new ConvertTabController(
view, model, fileChooser);
view.getConvertTab().setController(convertTabController);
view.getQuerySearchTab().clickUpdateAnnotations();
SettingsTabController settingsTabController = new SettingsTabController(view, model);
view.getSettingsTab().setController(settingsTabController);
sysadminTabController.updateAnnotationTable();
sysadminTabController.updateGenomeReleaseTab();
}
/**
* Update the tabbed-pane listeners
*/
private void tabbedPaneUpdate() {
view.addChangedTabListener(ChangedTabListener());
}
/**
* Update the loginWindow listeners
*/
private void loginWindowUpdate() {
view.getLoginWindow().addLoginListener(LoginListener());
}
/**
* Update the userPanel listeners
*/
private void userPanelUpdate() {
view.addLogoutListener(LogoutListener());
}
/**
* TODO redo
* Update the ratioCalcWindow listeners
*/
private void ratioCalcUpdate() {
// view.getRatioCalcPopup().addOkListener(OkListener());
// view.getProcessTab().addRatioCalcListener(RatioCalcListener());
}
/**
* Listener for when tabs are changed. Will for some tabs perform automatic
* updates.
*
* TODO: separate view from Thread
*/
public ChangeListener ChangedTabListener() {
return new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
new Thread() {
@Override
public void run() {
// If logged out
if (User.getInstance().getToken() == "") return;
Class<?> tab = view.getSelectedTabClass();
AnnotationDataType[] a = null;
if (tab == UploadTab.class
|| tab == QuerySearchTab.class) {
a = model.getAnnotations();
}
if (tab == UploadTab.class) {
// uplod
if (((a) != null)
&& view.getUploadTab().newExpStarted()) {
view.getUploadTab().getNewExpPanel()
.updateAnnotations(a);
}
} else if (tab == QuerySearchTab.class) {
// Query
if ((a) != null) {
view.getQuerySearchTab().setAnnotationTypes(a);
view.getQuerySearchTab().refresh();
}
}
if (tab == ProcessTab.class ){
// TODO
}
};
}.start();
}
};
}
/**
* Listener to convert files. Should convert files between different
* formats. TODO: Not completed.
*/
public ActionListener ConvertFileListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
// TODO ConvertFile-listener doesn't do anything
};
}.start();
}
};
}
/**
* The listener to create region data, TODO: Not completed at all
*
* @author c11ann
*/
public ActionListener RawToRegionDataListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
// TODO: Raw To Region Data Listener doesn't do
// anything.
};
}.start();
}
};
}
/**
* Listen to the login button. Will send the entered name and password, and
* if accepted update view. TODO: Move view bits from Thread
*/
public ActionListener LoginListener() {
return new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
new Thread() {
@Override
public void run() {
((JButton) e.getSource()).setEnabled(false);
String ip = view.getLoginWindow().getIPInput();
String username = view.getLoginWindow()
.getUsernameInput();
String password = view.getLoginWindow()
.getPasswordInput();
if (!ip.isEmpty() && !username.isEmpty()
&& !password.isEmpty()) {
SessionHandler sessionHandler = SessionHandler
.getInstance();
sessionHandler.setIP(ip);
try {
sessionHandler.loginUser(username, password);
view.updateLoginAccepted(username, password,
"Desktop User");
createTabControllers();
view.getSysAdminTab().getController()
.updateAnnotationTable();
view.getSysAdminTab().getController()
.updateGenomeReleaseTab();
view.setStatusPanel("Login successful");
view.setStatusPanelColor("success");
} catch (LoginException e) {
ErrorLogger.log("Login", username
+ " logged in");
view.getLoginWindow().updateLoginFailed(
e.getMessage());
ErrorLogger.log(e.getMessage());
}
} else {
view.getLoginWindow().updateLoginFailed(
"Didn't enter username, "
+ "password and/or server");
}
((JButton) e.getSource()).setEnabled(true);
};
}.start();
}
};
}
/**
* Listen to the logout button. Will call logout and reset methods of the
* model, and also update and reset view. (Because of this also reset
* relevant parts of the controller.) TODO: Separate view part of Thread.
*/
public ActionListener LogoutListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
int response = JOptionPane.showConfirmDialog(null,
"Are you sure you wish to log out?", "Log out",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (response == JOptionPane.YES_OPTION) {
SessionHandler.getInstance().logoutUser();
model.resetModel();
view.updateLogout();
view.resetGUI();
ErrorLogger.log("Logout", "User logged out");
}
};
}.start();
}
};
}
/**
* Show the ratioCalc popup. TODO: Remove Thread
*/
public ActionListener RatioCalcListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.showRatioPopup();
}
};
}
/**
* Listen to the OK button in the ratioCalc popup. Will hide the window.
*/
public ActionListener OkListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO: Should OK do something more?
view.getRatioCalcPopup().hideRatioWindow();
}
};
}
}