/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program 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 3 of the
* License, or (at your option) any later version.
*
* This program 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 this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app;
import com.alee.extended.image.WebImage;
import com.alee.extended.window.WebProgressDialog;
import com.alee.laf.WebLookAndFeel;
import com.alee.laf.checkbox.WebCheckBoxStyle;
import com.alee.laf.label.WebLabel;
import com.alee.laf.panel.WebPanel;
import com.alee.laf.progressbar.WebProgressBar;
import com.alee.managers.notification.NotificationManager;
import com.google.common.base.Strings;
import org.gitools.api.ApplicationContext;
import org.gitools.api.components.IEditorManager;
import org.gitools.heatmap.plugins.PluginManager;
import org.gitools.persistence.PersistenceManager;
import org.gitools.ui.app.actions.Actions;
import org.gitools.ui.app.actions.MenuActionSet;
import org.gitools.ui.app.actions.ToolBarActionSet;
import org.gitools.ui.app.actions.help.GitoolsSatsSection;
import org.gitools.ui.app.batch.CommandExecutor;
import org.gitools.ui.app.batch.CommandListener;
import org.gitools.ui.app.dialog.TipsDialog;
import org.gitools.ui.app.welcome.WelcomeEditor;
import org.gitools.ui.core.Application;
import org.gitools.ui.platform.IconUtils;
import org.gitools.ui.platform.help.Help;
import org.gitools.ui.platform.help.Tips;
import org.gitools.ui.platform.icons.IconNames;
import org.gitools.ui.platform.os.SystemInfo;
import org.gitools.ui.platform.settings.Settings;
import org.gitools.utils.progressmonitor.NullProgressMonitor;
import org.jboss.weld.environment.se.StartMain;
import org.jboss.weld.environment.se.WeldContainer;
import org.jdesktop.swingx.painter.MattePainter;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.LogManager;
public class Main {
public static void main(final String[] args) {
// Start CommandListener
boolean portEnabled = Settings.get().isPortEnabled();
String portString = null;
if (portEnabled || portString != null) {
int port = Settings.get().getDefaultPort();
if (portString != null) {
port = Integer.parseInt(portString);
}
CommandListener.start(port, args);
}
// Initialize look and feel
WebLookAndFeel.install();
WebLookAndFeel.initializeManagers();
NotificationManager.setLocation(NotificationManager.NORTH_EAST);
WebCheckBoxStyle.animated = false;
// Splash screen , loading dialog
// Exampler loading dialog
final WebProgressDialog progress = createProgressDialog();
progress.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(final WindowEvent e) {
// Stop loading demo on dialog close
System.exit(0);
}
});
progress.setVisible(true);
setProgressText(progress, "Loading Gitools interface");
// Initialize Weld and ApplicationContext
WeldContainer container = new StartMain(args).go();
ApplicationContext.setPersistenceManager(container.instance().select(PersistenceManager.class).get());
ApplicationContext.setPluginManger(container.instance().select(PluginManager.class).get());
ApplicationContext.setEditorManger(container.instance().select(IEditorManager.class).get());
ApplicationContext.setProgressMonitor(new NullProgressMonitor());
setProgressText(progress, "Loading command executor");
// Check arguments syntax
final CommandExecutor cmdExecutor = new CommandExecutor();
if (args.length > 0) {
if (!cmdExecutor.checkArguments(args, new PrintWriter(System.err))) {
return;
}
}
// Workaround to force windows to paint the TaskPaneContainer background
UIManager.put("TaskPaneContainer.backgroundPainter", new MattePainter(Color.WHITE));
// Workaround to put a dropdown into a JToolBar
UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);
// Force silence lobobrowser loggers
try {
LogManager.getLogManager().readConfiguration(new ByteArrayInputStream("org.lobobrowser.level=OFF".getBytes("UTF-8")));
} catch (IOException e) {
}
// Load OS specific things
if (SystemInfo.isMac) {
com.apple.eawt.Application osxApp = com.apple.eawt.Application.getApplication();
osxApp.setDockIconImage(IconUtils.getImageResource(IconNames.logoNoText));
}
// Initialize help system
setProgressText(progress, "Loading help system");
try {
Tips.get().load(Main.class.getResourceAsStream("/help/tips.properties"));
Help.get().loadProperties(Main.class.getResourceAsStream("/help/help.properties"));
Help.get().loadUrlMap(Main.class.getResourceAsStream("/help/help.mappings"));
} catch (Exception ex) {
System.err.println("Error loading help system:");
ex.printStackTrace();
}
// Initialize actions
setProgressText(progress, "Loading Gitools actions");
Actions.init();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Launch frame
Application app = Application.get();
app.setJMenuBar(MenuActionSet.INSTANCE.createMenuBar());
app.setToolBar(ToolBarActionSet.INSTANCE.createToolBar());
Application.get().addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
Actions.exitAction.actionPerformed(null);
}
});
app.initApplication();
app.addEditor(new WelcomeEditor());
app.start();
if (args.length > 0) {
// Execute arguments
cmdExecutor.execute(args, new PrintWriter(System.err));
Application.get().trackEvent("main", isRunningJavaWebStart() ? "webstart" : "start", "with arguments");
} else {
if (Strings.isNullOrEmpty(Settings.get().getStatisticsConsentmentVersion()) ||
(!Settings.get().isAllowUsageStatistics() && !Application.getGitoolsVersion().equals(Settings.get().getStatisticsConsentmentVersion()))) {
Settings.get().setAllowUsageStatistics(true);
JPanel panel = new GitoolsSatsSection(Settings.get()).getPanel();
JOptionPane.showMessageDialog(Application.get(), panel, "Statistics", JOptionPane.QUESTION_MESSAGE);
Settings.get().setStatisticsConsentmentVersion(Application.getGitoolsVersion().toString());
} else {
// Show tips dialog
TipsDialog tipsDialog = new TipsDialog();
tipsDialog.show();
}
Application.get().trackEvent("main", isRunningJavaWebStart() ? "webstart" : "start", "no arguments");
}
}
});
// Displaying Gitools and hiding loading dialog
progress.setVisible(false);
}
private static boolean isRunningJavaWebStart() {
boolean hasJNLP = false;
try {
Class.forName("javax.jnlp.ServiceManager");
hasJNLP = true;
} catch (ClassNotFoundException ex) {
hasJNLP = false;
}
return hasJNLP;
}
private static void setProgressText(WebProgressDialog progress, String s) {
ProgressWebPanel bar = (ProgressWebPanel) progress.getMiddleComponent();
bar.setString(s);
}
private static WebProgressDialog createProgressDialog() {
final WebProgressDialog progress = new WebProgressDialog(null, "Loading Gitools " + Application.getGitoolsVersion());
progress.setIconImage(new ImageIcon(IconNames.class.getResource(IconNames.logoNoText)).getImage());
progress.setShowProgressBar(false);
progress.setMiddleComponent(new ProgressWebPanel());
return progress;
}
static class ProgressWebPanel extends WebPanel {
WebProgressBar progressBar;
ProgressWebPanel() {
super();
this.setLayout(new BorderLayout());
progressBar = new WebProgressBar();
progressBar.setIndeterminate(true);
progressBar.setStringPainted(true);
progressBar.setString("Loading Gitools ...");
progressBar.setPreferredSize(new Dimension(300, 80));
progressBar.setVisible(true);
this.add(progressBar, BorderLayout.SOUTH);
WebLabel label = new WebLabel("<html><body>" +
"<br/><center>" +
"<b>Gitools v. " + Application.getGitoolsVersion() + "</b>" +
"</center><br/></body</html>");
label.setHorizontalAlignment(SwingConstants.CENTER);
add(label, BorderLayout.CENTER);
ImageIcon im = new ImageIcon(IconNames.class.getResource(IconNames.logoNoText));
add(new WebImage(im), BorderLayout.NORTH);
}
public void setString(String s) {
progressBar.setString(s);
}
}
}