package controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import config.Config;
import config.Constants;
import controller.interfaces.ICommand;
import controller.interfaces.ICommandEnableWindow;
import controller.subcontroller.PreferencesController;
import logging.LogUtil;
import manager.CollectorManager;
import manager.TabManager;
import manager.structure.Controller;
import model.MainModel;
import model.exception.ControllerInitException;
import model.exception.TabInitException;
import model.progressbar.InProgressBar;
import model.progressbar.interfaces.IProgressBar;
import model.util.PathUtil;
import model.util.WindowUtils;
import view.MainWindow;
import view.subview.AboutView;
import view.subview.DebugFrame;
import view.subview.LicenseView;
public class MainController extends Observable implements ActionListener, Observer {
/**
* the logger
*/
private final Logger logger = Logger.getLogger(this.getClass().getName());
/**
* the model
*/
private MainModel model;
/**
* the window
*/
private MainWindow window;
/**
* the controllers for the tabs, maps identifier to controller
*/
private Map<String, Controller> controller;
/**
* Constructor
*/
public MainController() {
model = new MainModel();
controller = TabManager.getInstance().getController();
}
/**
* create window
*/
public void createWindow() {
window = new MainWindow();
try {
window.init();
} catch (TabInitException e) {
logger.log(Level.SEVERE, "Error while init main window:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("InitError");
}
// init tabs
for (Controller con : this.controller.values()) {
try {
// add maincontroller as observer is needed
if (con.observeMain())
con.getController().addObserver(this);
// add enable or disable command
con.getController().setMainWindowCommand(new ICommandEnableWindow() {
@Override
public void setWindowEnabled(boolean en) {
window.setEnabled(en);
if (en)
window.toFront();
}
});
// init controller
con.getController().init(window.getTab(con.getTabIndex()));
} catch (ControllerInitException e) {
logger.log(Level.SEVERE, "Error while init Controller:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("InitError");
}
}
window.setVisible(true);
window.setActionListener(this);
this.window.setLocation(WindowUtils.getCenteredWindowCoordinates(this.window));
window.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeWindow();
}
});
updateMI();
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable o, Object arg) {
logger.log(Level.FINER, "got message from " + o.getClass().getName());
// preferences
if (o.getClass().getName().equals(controller.subcontroller.PreferencesController.class.getName())) {
window.setEnabled(true);
}
}
/**
* closes the window
*/
public void closeWindow() {
// save controller settings
for (Controller con : this.controller.values()) {
con.getController().saveConfig();
}
// save collector
CollectorManager.getInstance().saveConfig();
try {
Config.getInstance().setCurrDimension(window.getCurrentSize());
Config.getInstance().writeConfig();
} catch (Exception e) {
logger.log(Level.SEVERE, "Error while writing config:\n" + LogUtil.getStackTrace(e), e);
int r = window.showConfirmationMessage("writeError");
if (r != JOptionPane.YES_OPTION)
return;
}
System.exit(1);
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("hifiLookAndFeelMI"))
hifiMI();
else if (e.getActionCommand().equals("acrylLookAndFeelMI"))
acrylMI();
else if (e.getActionCommand().equals("aeroLookAndFeelMI"))
aeroMI();
else if (e.getActionCommand().equals("aluminiumLookAndFeelMI"))
aluminiumMI();
else if (e.getActionCommand().equals("bernsteinLookAndFeelMI"))
bernsteinMI();
else if (e.getActionCommand().equals("fastLookAndFeelMI"))
fastMI();
else if (e.getActionCommand().equals("graphiteLookAndFeelMI"))
graphiteMI();
else if (e.getActionCommand().equals("lunaLookAndFeelMI"))
lunaMI();
else if (e.getActionCommand().equals("mcWinLookAndFeelMI"))
mcWinMI();
else if (e.getActionCommand().equals("mintLookAndFeelMI"))
mintMI();
else if (e.getActionCommand().equals("noireLookAndFeelMI"))
noireMI();
else if (e.getActionCommand().equals("smartLookAndFeelMI"))
smartMI();
else if (e.getActionCommand().equals("textureLookAndFeelMI"))
textureMI();
else if (e.getActionCommand().equals("quitMI"))
quitMI();
else if (e.getActionCommand().equals("settingsMI"))
settingsMI();
else if (e.getActionCommand().equals("updateMI"))
updateMI();
else if (e.getActionCommand().equals("debugMI"))
debugMI();
else if (e.getActionCommand().equals("donateMI"))
donateMI();
else if (e.getActionCommand().equals("licenseMI"))
licenseMI();
else if (e.getActionCommand().equals("aboutMI"))
aboutMI();
}
/**
* selects hifi skin
*/
private void hifiMI() {
logger.log(Level.FINER, "changed Skin to Hifi.");
com.jtattoo.plaf.hifi.HiFiLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.hifi.HiFiLookAndFeel");
}
/**
* selects acryl skin
*/
private void acrylMI() {
logger.log(Level.FINER, "changed Skin to Acryl.");
com.jtattoo.plaf.acryl.AcrylLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.acryl.AcrylLookAndFeel");
}
/**
* selects aero skin
*/
private void aeroMI() {
logger.log(Level.FINER, "changed Skin to Aero.");
com.jtattoo.plaf.aero.AeroLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.aero.AeroLookAndFeel");
}
/**
* selects aluminium skin
*/
private void aluminiumMI() {
logger.log(Level.FINER, "changed Skin to Aluminium.");
com.jtattoo.plaf.aluminium.AluminiumLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
}
/**
* selects bernstein skin
*/
private void bernsteinMI() {
logger.log(Level.FINER, "changed Skin to Bernstein.");
com.jtattoo.plaf.bernstein.BernsteinLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
}
/**
* selects fast skin
*/
private void fastMI() {
logger.log(Level.FINER, "changed Skin to Fast.");
com.jtattoo.plaf.fast.FastLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.fast.FastLookAndFeel");
}
/**
* selects graphite skin
*/
private void graphiteMI() {
logger.log(Level.FINER, "changed Skin to Graphite.");
com.jtattoo.plaf.graphite.GraphiteLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.graphite.GraphiteLookAndFeel");
}
/**
* selects luna skin
*/
private void lunaMI() {
logger.log(Level.FINER, "changed Skin to Luna.");
com.jtattoo.plaf.luna.LunaLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.luna.LunaLookAndFeel");
}
/**
* selects mcWin skin
*/
private void mcWinMI() {
logger.log(Level.FINER, "changed Skin to McWin.");
com.jtattoo.plaf.mcwin.McWinLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
}
/**
* selects mint skin
*/
private void mintMI() {
logger.log(Level.FINER, "changed Skin to Mint.");
com.jtattoo.plaf.mint.MintLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.mint.MintLookAndFeel");
}
/**
* selects noire skin
*/
private void noireMI() {
logger.log(Level.FINER, "changed Skin to Noire.");
com.jtattoo.plaf.noire.NoireLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.noire.NoireLookAndFeel");
}
/**
* selects smart skin
*/
private void smartMI() {
logger.log(Level.FINER, "changed Skin to Smart.");
com.jtattoo.plaf.smart.SmartLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.smart.SmartLookAndFeel");
}
/**
* selects texture skin
*/
private void textureMI() {
logger.log(Level.FINER, "changed Skin to Texture.");
com.jtattoo.plaf.texture.TextureLookAndFeel.setTheme("Default");
changeSkin("com.jtattoo.plaf.texture.TextureLookAndFeel");
}
/**
* quit pressed
*/
private void quitMI() {
logger.log(Level.FINER, "Quit pressed.");
closeWindow();
}
/**
* settings pressed
*/
private void settingsMI() {
logger.log(Level.FINER, "Settings pressed.");
window.setEnabled(false);
PreferencesController con = new PreferencesController();
con.setCloseCommand(new ICommand() {
@Override
public void call() {
window.setEnabled(true);
}
});
con.createWindow();
}
/**
* update pressed
*/
private void updateMI() {
logger.log(Level.FINER, "Update pressed.");
// check for updates
new Thread(new Runnable() {
@Override
public void run() {
IProgressBar pb = new InProgressBar(new String[] { "checking for updates" }, 400, 200);
pb.start();
try {
model.getUpdateInfo();
boolean isUpdate = model.isUpdateAvailable();
pb.stopBar();
if (!isUpdate)
return;
int r = window.showConfirmationMessage("softwareUpdateAvaiable");
if (r == JOptionPane.YES_OPTION) {
model.writeUpdater();
model.updateSoftware(PathUtil.getJarPath(MainController.class), window.getCurrentLanguage().toString());
System.exit(1);
}
} catch (IOException e) {
logger.log(Level.SEVERE, "Error while updating:\n" + LogUtil.getStackTrace(e), e);
pb.stopBar();
window.showMessage("noInternet");
}
}
}).start();
}
/**
* debug pressed, only available if debug is enabled
*/
private void debugMI() {
logger.log(Level.FINER, "Debug pressed.");
try {
DebugFrame w = new DebugFrame();
w.init();
w.setVisible(true);
} catch (RuntimeException e) {
logger.log(Level.SEVERE, "tried to open debug console twice.");
}
}
/**
* donate pressed
*/
private void donateMI() {
logger.log(Level.FINER, "Donate pressed");
try {
int r = window.showConfirmationMessage("openDonationURL");
if (r != JOptionPane.YES_OPTION)
return;
java.awt.Desktop.getDesktop().browse(java.net.URI.create(Constants.donateURL));
} catch (IOException e) {
logger.log(Level.SEVERE, "Error while opening url:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("urlopenError");
}
}
/**
* license pressed
*/
private void licenseMI() {
logger.log(Level.FINER, "License pressed.");
try {
LicenseView v = new LicenseView();
v.init();
v.setLocation(WindowUtils.getCenteredWindowCoordinates(v));
v.setVisible(true);
} catch (IOException e) {
logger.log(Level.SEVERE, "Error while opening license window:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("licenseError");
}
}
/**
* about pressed
*/
private void aboutMI() {
logger.log(Level.FINER, "About pressed.");
AboutView v = new AboutView();
v.init();
v.setLocation(WindowUtils.getCenteredWindowCoordinates(v));
v.setVisible(true);
}
/**
* changes the skin to the given skin
*
* @param skin
* the given look and feel string
*/
private void changeSkin(String skin) {
logger.log(Level.FINER, "changed Skin: " + skin);
try {
Config.getInstance().setcurrentSkin(skin);
UIManager.setLookAndFeel(skin);
SwingUtilities.updateComponentTreeUI(window);
window.pack();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
}
}
}