/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* MainFrame.java
*
* Created on 2010-8-13, 11:38:58
*/
package org.snova.framework.shell.swing;
import java.awt.AWTException;
import java.awt.Cursor;
import java.awt.Desktop;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collection;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snova.framework.Snova;
import org.snova.framework.common.Constants;
import org.snova.framework.common.Version;
import org.snova.framework.config.SnovaConfiguration;
import org.snova.framework.shell.swing.gae.C4GUIHolder;
import org.snova.framework.shell.swing.gae.GAEGUIHolder;
import org.snova.framework.shell.swing.gae.SSHGUIHolder;
import org.snova.framework.shell.swing.gae.SpacGUIHolder;
import org.snova.framework.trace.Trace;
import org.snova.framework.util.PreferenceHelper;
import org.snova.framework.util.SharedObjectHelper;
/**
*
* @author wqy
*/
public class MainFrame extends javax.swing.JFrame
{
/** Creates new form MainFrame */
public MainFrame()
{
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
LookAndFeelInfo[] allFeels = UIManager.getInstalledLookAndFeels();
for (LookAndFeelInfo feel : allFeels)
{
if (feel.getName().contains("Nimbus"))
{
UIManager.setLookAndFeel(feel.getClassName());
break;
}
}
}
catch (Exception e)
{
logger.error("", e);
}
// end = System.currentTimeMillis();
// System.out.println("Cost " + (end -start) + "ms");
initComponents();
// end = System.currentTimeMillis();
// System.out.println("Cost " + (end -start) + "ms");
fm = new Snova(new GUITrace());
this.setTitle(Constants.PROJECT_NAME + " V" + Version.value);
this.setIconImage(ImageUtil.FLAG.getImage());
installPluginsUIPanel = new JPanel();
availablePluginsUIPanel = new JPanel();
installedPluginPanel.setViewportView(installPluginsUIPanel);
availableUIPanel.setViewportView(availablePluginsUIPanel);
installPluginsUIPanel.setLayout(new BoxLayout(installPluginsUIPanel,
BoxLayout.PAGE_AXIS));
availablePluginsUIPanel.setLayout(new BoxLayout(
availablePluginsUIPanel, BoxLayout.PAGE_AXIS));
installPluginsUIPanel.add(new InstalledPluginPanel(this,
new GAEGUIHolder()));
installPluginsUIPanel.add(new InstalledPluginPanel(this,
new C4GUIHolder()));
installPluginsUIPanel.add(new InstalledPluginPanel(this,
new SpacGUIHolder()));
//installPluginsUIPanel.add(new InstalledPluginPanel(this,
// new SSHGUIHolder()));
// displayInstalledPlugins();
jTabbedPane2.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (jTabbedPane2.getSelectedComponent() == installedPluginPanel)
{
displayInstalledPlugins();
}
else
{
displayAvailablePlugins();
}
}
});
// end = System.currentTimeMillis();
// System.out.println("Cost " + (end -start) + "ms");
SharedObjectHelper.getGlobalThreadPool().submit(new Runnable()
{
@Override
public void run()
{
// jTabbedPane2.setSelectedIndex(0);
displayInstalledPlugins();
displayAvailablePlugins();
new SysTray(MainFrame.this);
if (Boolean.TRUE
.toString()
.equals(PreferenceHelper
.getPreference(FrameworkConfigDialog.AUTO_CONNECT)))
{
updateexecuteStatus();
}
}
});
end = System.currentTimeMillis();
if (logger.isDebugEnabled())
{
logger.debug("Cost " + (end - start) + "ms to launch GUI frame.");
}
}
private void displayAvailablePlugins()
{
availablePluginsUIPanel.removeAll();
// try
// {
// ProductReleaseDetail release = getProductUpdateDetail();
// List<PluginReleaseDetail> plugins = release.plugins;
// for (PluginReleaseDetail plugin : plugins)
// {
// if (!pm.isPluginInstalled(plugin.name))
// {
// availablePluginsUIPanel.add(new AvalablePluginPanel(this,
// plugin));
// }
//
// }
// }
// catch (Exception ex)
// {
// logger.error("", ex);
// }
}
private void displayInstalledPlugins()
{
// installPluginsUIPanel.removeAll();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed"
// <editor-fold defaultstate="collapsed"
// desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents()
{
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
statusTextArea = new javax.swing.JTextArea();
jPanel2 = new javax.swing.JPanel();
jTabbedPane2 = new javax.swing.JTabbedPane();
installedPluginPanel = new javax.swing.JScrollPane();
availableUIPanel = new javax.swing.JScrollPane();
jPanel3 = new javax.swing.JPanel();
javax.swing.JLabel appTitleLabel = new javax.swing.JLabel();
javax.swing.JLabel appDescLabel = new javax.swing.JLabel();
javax.swing.JLabel versionLabel = new javax.swing.JLabel();
javax.swing.JLabel appVendorLabel = new javax.swing.JLabel();
javax.swing.JLabel appVersionLabel = new javax.swing.JLabel();
javax.swing.JLabel vendorLabel = new javax.swing.JLabel();
javax.swing.JLabel homepageLabel = new javax.swing.JLabel();
appHomepageLabel = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
executeButton = new javax.swing.JButton();
exitButton = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
helpButton = new javax.swing.JButton();
twitterLabel = new javax.swing.JLabel();
statusLabel = new javax.swing.JLabel();
setLocationByPlatform(true);
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowIconified(java.awt.event.WindowEvent evt)
{
formWindowIconified(evt);
}
});
statusTextArea.setBackground(new java.awt.Color(0, 0, 0));
statusTextArea.setColumns(20);
statusTextArea.setEditable(false);
statusTextArea.setForeground(new java.awt.Color(0, 204, 0));
statusTextArea.setRows(5);
jScrollPane1.setViewportView(statusTextArea);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(
jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 374,
Short.MAX_VALUE));
jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE));
jTabbedPane1.addTab("Status", ImageUtil.SPEAKER, jPanel1);
installedPluginPanel
.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jTabbedPane2.addTab("Installed", installedPluginPanel);
jTabbedPane2.addTab("Available", availableUIPanel);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(
jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jTabbedPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 374,
Short.MAX_VALUE));
jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jTabbedPane2, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE));
jTabbedPane1.addTab("Plugins", ImageUtil.PLUGIN, jPanel2);
appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(
appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD,
appTitleLabel.getFont().getSize() + 4));
appTitleLabel.setText("Snova GUI Launcher");
appDescLabel.setText("<html>The GUI launcher of snova");
versionLabel.setFont(versionLabel.getFont().deriveFont(
versionLabel.getFont().getStyle() | java.awt.Font.BOLD));
versionLabel.setText("Product Version:");
appVendorLabel.setText("yinqiwen@gmail.com");
appVersionLabel.setText(Version.value);
vendorLabel.setFont(vendorLabel.getFont().deriveFont(
vendorLabel.getFont().getStyle() | java.awt.Font.BOLD));
vendorLabel.setText("Vendor:");
homepageLabel.setFont(homepageLabel.getFont().deriveFont(
homepageLabel.getFont().getStyle() | java.awt.Font.BOLD));
homepageLabel.setText("Home:");
appHomepageLabel
.setText("<html><font color=\"Blue\"> <u>snova.googlecode.com</u></font></html>");
appHomepageLabel.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mouseClicked(java.awt.event.MouseEvent evt)
{
appHomepageLabelMouseClicked(evt);
}
});
appHomepageLabel
.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseMoved(java.awt.event.MouseEvent evt)
{
appHomepageLabelMouseMoved(evt);
}
});
jLabel2.setIcon(ImageUtil.FLAG);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(
jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout
.setHorizontalGroup(jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
jPanel3Layout
.createSequentialGroup()
.addContainerGap(160, Short.MAX_VALUE)
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addComponent(
homepageLabel)
.addGap(1,
1,
1)
.addComponent(
appHomepageLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addComponent(
vendorLabel)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
appVendorLabel))
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addComponent(
versionLabel)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
appVersionLabel))
.addComponent(
appDescLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
appTitleLabel))
.addGap(36, 36, 36))
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addGap(12, 12, 12)
.addComponent(jLabel2)
.addContainerGap(362,
Short.MAX_VALUE))));
jPanel3Layout
.setVerticalGroup(jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addGap(49, 49, 49)
.addComponent(appTitleLabel)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
appDescLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
versionLabel)
.addComponent(
appVersionLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
vendorLabel)
.addComponent(
appVendorLabel))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
homepageLabel)
.addComponent(
appHomepageLabel,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(75, Short.MAX_VALUE))
.addGroup(
jPanel3Layout
.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
jPanel3Layout
.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(
jLabel2,
javax.swing.GroupLayout.PREFERRED_SIZE,
191,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(38,
Short.MAX_VALUE))));
jTabbedPane1.addTab("About", ImageUtil.ABOUT, jPanel3);
executeButton.setIcon(ImageUtil.START);
executeButton.setText("Start");
executeButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
executeButtonActionPerformed(evt);
}
});
exitButton.setIcon(ImageUtil.EXIT);
exitButton.setText("Exit");
exitButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
exitButtonActionPerformed(evt);
}
});
jButton4.setIcon(ImageUtil.CONFIG);
jButton4.setText("Config");
jButton4.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
jButton4ActionPerformed(evt);
}
});
helpButton.setIcon(ImageUtil.HELP);
helpButton.setText("Help");
helpButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
helpButtonActionPerformed(evt);
}
});
twitterLabel.setIcon(ImageUtil.TWITTER);
twitterLabel
.setText("<html><font color=\"Blue\"> <u>@yinqiwen</u></font></html>");
twitterLabel.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mouseClicked(java.awt.event.MouseEvent evt)
{
twitterLabelMouseClicked(evt);
}
});
twitterLabel
.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseMoved(java.awt.event.MouseEvent evt)
{
twitterLabelMouseMoved(evt);
}
});
statusLabel.setText("Idle");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addComponent(
jTabbedPane1,
javax.swing.GroupLayout.PREFERRED_SIZE,
379,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jButton4,
javax.swing.GroupLayout.DEFAULT_SIZE,
99,
Short.MAX_VALUE)
.addComponent(
helpButton,
javax.swing.GroupLayout.DEFAULT_SIZE,
99,
Short.MAX_VALUE)
.addComponent(
exitButton,
javax.swing.GroupLayout.DEFAULT_SIZE,
99,
Short.MAX_VALUE)
.addComponent(
executeButton,
javax.swing.GroupLayout.DEFAULT_SIZE,
99,
Short.MAX_VALUE)))
.addGroup(
layout.createSequentialGroup()
.addComponent(
twitterLabel)
.addGap(18, 18,
18)
.addComponent(
statusLabel,
javax.swing.GroupLayout.DEFAULT_SIZE,
406,
Short.MAX_VALUE)))
.addContainerGap()));
layout.setVerticalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addComponent(
jTabbedPane1)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED))
.addGroup(
layout.createSequentialGroup()
.addGap(55, 55,
55)
.addComponent(
executeButton)
.addGap(40, 40,
40)
.addComponent(
jButton4)
.addGap(39, 39,
39)
.addComponent(
helpButton)
.addGap(41, 41,
41)
.addComponent(
exitButton)
.addGap(27, 27,
27)))
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(twitterLabel)
.addComponent(statusLabel))
.addContainerGap()));
pack();
}// </editor-fold>//GEN-END:initComponents
public void exit()
{
System.exit(1);
}
private void exitButtonActionPerformed(java.awt.event.ActionEvent evt)
{// GEN-FIRST:event_exitButtonActionPerformed
exit();
}// GEN-LAST:event_exitButtonActionPerformed
private void formWindowIconified(java.awt.event.WindowEvent evt)
{// GEN-FIRST:event_formWindowIconified
setVisible(false);
}// GEN-LAST:event_formWindowIconified
private void helpButtonActionPerformed(java.awt.event.ActionEvent evt)
{// GEN-FIRST:event_helpButtonActionPerformed
go2Webpage(Constants.OFFICIAL_SITE);
}// GEN-LAST:event_helpButtonActionPerformed
private void twitterLabelMouseClicked(java.awt.event.MouseEvent evt)
{// GEN-FIRST:event_twitterLabelMouseClicked
go2Webpage(Constants.OFFICIAL_TWITTER);
}// GEN-LAST:event_twitterLabelMouseClicked
private void twitterLabelMouseMoved(java.awt.event.MouseEvent evt)
{// GEN-FIRST:event_twitterLabelMouseMoved
evt.getComponent().setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}// GEN-LAST:event_twitterLabelMouseMoved
private void appHomepageLabelMouseClicked(java.awt.event.MouseEvent evt)
{// GEN-FIRST:event_appHomepageLabelMouseClicked
go2Webpage(Constants.OFFICIAL_SITE);
}// GEN-LAST:event_appHomepageLabelMouseClicked
private void appHomepageLabelMouseMoved(java.awt.event.MouseEvent evt)
{// GEN-FIRST:event_appHomepageLabelMouseMoved
evt.getComponent().setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}// GEN-LAST:event_appHomepageLabelMouseMoved
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt)
{// GEN-FIRST:event_jButton4ActionPerformed
getConfigDialog().start();
}// GEN-LAST:event_jButton4ActionPerformed
private void updateexecuteStatus()
{
if (!hasStarted)
{
statusLabel.setText("Starting...");
executeButton.setText("Stop");
executeButton.setIcon(ImageUtil.STOP);
hasStarted = true;
SharedObjectHelper.getGlobalThreadPool().submit(new Runnable()
{
public void run()
{
fm.start();
}
});
}
else
{
statusLabel.setText("Stopped");
executeButton.setText("Start");
executeButton.setIcon(ImageUtil.START);
hasStarted = false;
SharedObjectHelper.getGlobalThreadPool().submit(new Runnable()
{
public void run()
{
fm.stop();
}
});
}
}
private void executeButtonActionPerformed(java.awt.event.ActionEvent evt)
{// GEN-FIRST:event_executeButtonActionPerformed
updateexecuteStatus();
}// GEN-LAST:event_executeButtonActionPerformed
public void go2Webpage(String site)
{
try
{
Desktop desktop = Desktop.getDesktop();
desktop.browse(new URI(site));
}
catch (Exception e)
{
logger.error("Failed to go to web site!", e);
}
}
/**
* @param args
* the command line arguments
*/
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new MainFrame().setVisible(true);
}
});
}
private FrameworkConfigDialog getConfigDialog()
{
if (null == config)
{
config = new FrameworkConfigDialog(this, true);
}
return config;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel appHomepageLabel;
private javax.swing.JScrollPane availableUIPanel;
private javax.swing.JButton executeButton;
private javax.swing.JButton exitButton;
private javax.swing.JButton helpButton;
private javax.swing.JScrollPane installedPluginPanel;
private javax.swing.JButton jButton4;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTabbedPane jTabbedPane2;
private javax.swing.JLabel statusLabel;
private javax.swing.JTextArea statusTextArea;
private javax.swing.JLabel twitterLabel;
// End of variables declaration//GEN-END:variables
private JPanel installPluginsUIPanel;
private JPanel availablePluginsUIPanel;
private boolean hasStarted = false;
private FrameworkConfigDialog config;
private Snova fm;
protected static Logger logger = LoggerFactory.getLogger(MainFrame.class);
Trace trace = new GUITrace();
class GUITrace implements Trace
{
public void info(final String string)
{
statusTextArea.append(string);
statusTextArea.append(System.getProperty("line.separator"));
statusLabel.setText(string);
}
public void error(final String string)
{
statusTextArea.append(string);
statusTextArea.append(System.getProperty("line.separator"));
statusLabel.setText(string);
}
public void notice(final String string)
{
statusTextArea.append(string);
statusTextArea.append(System.getProperty("line.separator"));
}
}
}