/*
* #%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.core;
import com.alee.laf.label.WebLabel;
import com.alee.managers.notification.NotificationIcon;
import com.alee.managers.notification.NotificationManager;
import com.alee.managers.notification.NotificationOption;
import com.alee.managers.notification.WebNotificationPopup;
import com.brsanthu.googleanalytics.*;
import org.gitools.api.components.IEditor;
import org.gitools.api.resource.SemanticVersion;
import org.gitools.ui.core.components.StatusBar;
import org.gitools.ui.core.components.editor.AbstractEditor;
import org.gitools.ui.core.components.editor.EditorsPanel;
import org.gitools.ui.platform.IconUtils;
import org.gitools.ui.platform.application.IApplicationTracking;
import org.gitools.ui.platform.icons.IconNames;
import org.gitools.ui.platform.settings.Settings;
import org.gitools.utils.color.ColorRegistry;
import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
public class Application extends JFrame implements IApplicationTracking {
private static final long serialVersionUID = -6899584212813749990L;
private static final String appName;
private static final SemanticVersion appVersion;
private static final String appTracking;
private static final GoogleAnalytics analytics;
private static ColorRegistry colorRegistry = ColorRegistry.get();
private static String test;
static {
appName = "Gitools";
appTracking = "UA-7111176-2";
Properties settings = new Properties();
try {
settings.load(Application.class.getResourceAsStream("/settings.properties"));
} catch (IOException e) {
e.printStackTrace();
}
appVersion = new SemanticVersion(settings.getProperty("version"));
GoogleAnalyticsConfig config = new GoogleAnalyticsConfig();
config.setRequestParameterDiscoverer(new AwtRequestParameterDiscoverer());
if (Settings.get().isProxyEnabled()) {
config.setProxyHost(Settings.get().getProxyHost());
config.setProxyPort(Settings.get().getProxyPort());
}
analytics = new GoogleAnalytics(config, appTracking, appName, appVersion.toString());
analytics.getDefaultRequest().clientId(Settings.get().getUuid());
}
private JToolBar toolBar;
private EditorsPanel editorsPanel;
private StatusBar statusBar;
private static Application instance;
public static Application get() {
if (instance == null) {
instance = new Application();
}
return instance;
}
private Application() {
//initApplication();
}
public void initApplication() {
createComponents();
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle(appName + " " + appVersion);
setIconImage(IconUtils.getImageIconResource(IconNames.logoMini).getImage());
setPreferredSize(new Dimension(1200, 750));
pack();
}
public static String getAppName() {
return appName;
}
public static SemanticVersion getGitoolsVersion() {
return appVersion;
}
public static String getAppTracking() {
return appTracking;
}
@Override
public void trackEvent(String category, String action, String label) {
if (Settings.get().isAllowUsageStatistics()) {
EventHit hit = new EventHit(category, action, label, null);
hit.clientId(Settings.get().getUuid());
analytics.postAsync(hit);
}
}
@Override
public void trackException(String description) {
if (Settings.get().isAllowUsageStatistics()) {
ExceptionHit hit = new ExceptionHit(description);
hit.clientId(Settings.get().getUuid());
analytics.postAsync(hit);
}
}
public void setToolBar(JToolBar toolbar) {
this.toolBar = toolbar;
}
private void createComponents() {
editorsPanel = new EditorsPanel();
statusBar = new StatusBar();
configureLayout();
}
private void configureLayout() {
setLayout(new BorderLayout());
add(toolBar, BorderLayout.NORTH);
add(editorsPanel, BorderLayout.CENTER);
add(statusBar, BorderLayout.SOUTH);
}
public void addEditor(IEditor editor) {
if (editor instanceof AbstractEditor) {
editorsPanel.addEditor((AbstractEditor) editor);
}
}
public void start() {
editorsPanel.setSelectedIndex(0);
setLocationByPlatform(true);
setVisible(true);
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
String javaVersion = System.getProperty("java.version");
if (javaVersion != null && javaVersion.endsWith("1.7.0_25")) {
JOptionPane.showMessageDialog(Application.get(), "You are using Java 7 build 25. This build has some important bugs, please update to the latest Java 7 build.");
}
if (isNewerGitoolsAvailable()) {
JOptionPane.showMessageDialog(Application.get(), "There is a newer version of Gitools.\n Download it from http://www.gitools.org.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
SwingUtilities.invokeLater(runnable);
}
boolean isNewerGitoolsAvailable() throws Exception {
Proxy proxy = Settings.get().getProxy();
SemanticVersion thisVersion = Application.getGitoolsVersion();
URL latestUrl = new URL("http://www.gitools.org/downloads/latest.txt");
URLConnection con = latestUrl.openConnection(proxy);
con.setConnectTimeout(1000);
con.setReadTimeout(1000);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String latestVersion;
latestVersion = in.readLine();
in.close();
SemanticVersion latest = new SemanticVersion(latestVersion);
return latest.isNewerThan(thisVersion);
}
public EditorsPanel getEditorsPanel() {
return editorsPanel;
}
public JToolBar getToolBar() {
return toolBar;
}
/**
* @param text
* @param displayTime miliseconds
*/
public void showNotification(String text, int displayTime) {
WebNotificationPopup popup = new WebNotificationPopup();
popup.setIcon(NotificationIcon.clock.getIcon());
popup.setContent (new WebLabel(text));
popup.setDisplayTime(displayTime);
showNotificationPopup(popup);
}
/**
*
* @param text
*/
public void showNotification(String text) {
showNotification(text, 4000);
}
public void showNotificationPermanent(String text, NotificationOption... options) {
NotificationManager.showNotification(text, options);
}
public void showNotificationPopup(WebNotificationPopup popup) {
NotificationManager.showNotification(popup);
}
public void setInteractionStatus(String status) {
statusBar.setText(status);
}
public void refresh() {
}
public void setCursorWaiting() {
this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
}
public void setCursorNormal() {
this.setCursor(Cursor.getDefaultCursor());
}
}