HELYX-OS/src/eu/engys/application/AbstractApplication.java
2016-01-22 16:57:55 +01:00

252 lines
8.9 KiB
Java

/*--------------------------------*- Java -*---------------------------------*\
| o |
| o o | HelyxOS: The Open Source GUI for OpenFOAM |
| o O o | Copyright (C) 2012-2016 ENGYS |
| o o | http://www.engys.com |
| o | |
|---------------------------------------------------------------------------|
| License |
| This file is part of HelyxOS. |
| |
| HelyxOS is free software; you can redistribute it and/or modify it |
| under the terms of the GNU General Public License as published by the |
| Free Software Foundation; either version 2 of the License, or (at your |
| option) any later version. |
| |
| HelyxOS is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with HelyxOS; if not, write to the Free Software Foundation, |
| Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
\*---------------------------------------------------------------------------*/
package eu.engys.application;
import static eu.engys.launcher.StartUpMonitor.close;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsDevice;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.engys.core.Arguments;
import eu.engys.core.OpenFOAMEnvironment;
import eu.engys.core.controller.Controller;
import eu.engys.core.presentation.ActionContainer;
import eu.engys.core.presentation.ActionManager;
import eu.engys.core.project.Model;
import eu.engys.gui.AboutWindow;
import eu.engys.gui.GlassPane;
import eu.engys.gui.PreferencesDialog;
import eu.engys.gui.events.EventManager;
import eu.engys.gui.view.View;
import eu.engys.gui.view3D.View3DEventListener;
import eu.engys.util.ui.ResourcesUtil;
import eu.engys.util.ui.UiUtil;
public abstract class AbstractApplication implements Application, ActionContainer {
private static final Logger logger = LoggerFactory.getLogger(AbstractApplication.class);
protected JFrame frame;
public View view;
protected Model model;
public Controller controller;
protected View3DEventListener view3dListener;
public AbstractApplication(Model model, View view, Controller controller) {
this.model = model;
this.view = view;
this.controller = controller;
}
@Override
public JFrame getFrame() {
return frame;
}
@Override
public boolean isDemo() {
return false;
}
@Override
public void checkVersion() {
}
@Override
public void run() {
initFrame();
frame.setVisible(true);
trySettingOpenFoamFolder();
if (Arguments.stlFiles != null) {
if (Arguments.baseDir != null) {
ActionManager.getInstance().invoke("application.open");
} else {
ActionManager.getInstance().invoke("application.create");
}
} else {
if (Arguments.baseDir != null) {
controller.openCase(Arguments.baseDir);
} else {
view.showStartupDialog(this);
}
}
close();
}
protected void trySettingOpenFoamFolder() {
OpenFOAMEnvironment.trySettingOpenFoamFolder(frame);
}
@Override
public void initFrame() {
view.layoutComponents();
frame = new JFrame(getTitle()) {
@Override
public void dispose() {
EventManager.unregisterAllEventSubscriptions();
super.dispose();
}
/**
* This method fixes the Synthetica laf bug that causes incorrect
* fullscreen window size on secondary monitor.
*/
@Override
public void setMaximizedBounds(Rectangle bounds) {
GraphicsDevice currentFrame = getGraphicsConfiguration().getDevice();
if (UiUtil.isSecondaryScreen(currentFrame) && getExtendedState() == JFrame.NORMAL) {
super.setMaximizedBounds(UiUtil.getCurrentScreenSize(frame));
} else {
super.setMaximizedBounds(bounds);
}
}
};
view.setProgressMonitorParent(frame);
Dimension preferredDimension = UiUtil.getPreferredScreenSize();
logger.info("Set dimendions to {}", preferredDimension);
frame.setSize(preferredDimension);
frame.setLocationRelativeTo(null);
UiUtil.center(frame);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setIconImages(Arrays.asList(new Image[] { ((ImageIcon) getSmallIcon()).getImage(), ((ImageIcon) getBigIcon()).getImage() }));
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
ActionManager.getInstance().invoke("application.exit");
}
});
frame.setName("MainFrame");
frame.getRootPane().updateUI();
frame.setJMenuBar(view.getMenuBar());
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(view, BorderLayout.CENTER);
frame.getContentPane().add(view.getStatusBar(), BorderLayout.SOUTH);
GlassPane glassPane = new GlassPane();
frame.setGlassPane(glassPane);
glassPane.setVisible(false);
customizeGUIFrame(view);
}
public View getView() {
return view;
}
public Model getModel() {
return model;
}
public abstract String getTitle();
protected abstract void customizeGUIFrame(View view);
protected void addPreferencesItem(final View view) {
JMenuItem preferencesItem = new JMenuItem(new AbstractAction("Preferences", PREFERENCES_ICON) {
@Override
public void actionPerformed(ActionEvent e) {
new PreferencesDialog(isOS(), hasParaview(), hasFieldView(), hasEnsight(), hasSolverPreferences(), model.getDefaults().getDictDataFolder()).show();
}
});
preferencesItem.setName("Application Preferences");
view.getMenuBar().getEditMenu().add(preferencesItem);
}
protected abstract boolean hasParaview();
protected abstract boolean hasFieldView();
protected abstract boolean hasEnsight();
protected boolean hasSolverPreferences() {
return true;
}
protected boolean isOS() {
return false;
}
protected void addHelpItem(final View view) {
view.getMenuBar().getHelpMenu().add(new AbstractAction("About", INFO_ICON) {
@Override
public void actionPerformed(ActionEvent e) {
new AboutWindow(getMediumIcon(), getBannerIcon());
}
});
}
@Override
public JPanel createAdPanel() {
return new JPanel();
}
@Override
public JPanel createVersionPanel() {
return new JPanel();
}
/**
* RESOURCES
*/
public static final Icon PREFERENCES_ICON = ResourcesUtil.getIcon("preferences.icon");
public static final Icon LICENSE_ICON = ResourcesUtil.getIcon("license.icon");
public static final Icon INFO_ICON = ResourcesUtil.getIcon("info.icon");
public static final Icon PDF_ICON = ResourcesUtil.getIcon("file.pdf");
public static final Icon FOLDER_ICON = ResourcesUtil.getIcon("application.open.icon");
public static final Icon SMALL_LOGO = ResourcesUtil.getIcon("engys.logo");
public static final Icon BIG_LOGO = ResourcesUtil.getIcon("engys.logo.big");
public static final Icon MEDIUM_LOGO = ResourcesUtil.getIcon("engys.logo.medium");
public static final Icon FULL_LOGO = ResourcesUtil.getIcon("engys.logo.full");
}