mainwindow.java.svn-base
来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 673 行 · 第 1/2 页
SVN-BASE
673 行
/**
* $Revision: $
* $Date: $
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Lesser Public License (LGPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware;
import org.jivesoftware.resource.Default;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ui.ChatFrame;
import org.jivesoftware.spark.util.BrowserLauncher;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.SwingTimerTask;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.TaskEngine;
import org.jivesoftware.spark.util.URLFileSystem;
import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.plugin.alerts.InputTextAreaDialog;
import org.jivesoftware.sparkimpl.plugin.layout.LayoutSettings;
import org.jivesoftware.sparkimpl.plugin.layout.LayoutSettingsManager;
import org.jivesoftware.sparkimpl.settings.JiveInfo;
import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
import org.jivesoftware.sparkimpl.updater.CheckUpdates;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.TimerTask;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
/**
* The <code>MainWindow</code> class acts as both the DockableHolder and the proxy
* to the Workspace in Spark.
*
* @version 1.0, 03/12/14
*/
public final class MainWindow extends ChatFrame implements ActionListener {
private final Set<MainWindowListener> listeners = new HashSet<MainWindowListener>();
private final JMenu connectMenu = new JMenu();
private final JMenu contactsMenu = new JMenu();
private final JMenu actionsMenu = new JMenu();
private final JMenu pluginsMenu = new JMenu();
private final JMenu helpMenu = new JMenu();
private JMenuItem preferenceMenuItem;
private final JMenuItem menuAbout = new JMenuItem(SparkRes.getImageIcon(SparkRes.INFORMATION_IMAGE));
private final JMenuItem helpMenuItem = new JMenuItem();
private final JMenuBar mainWindowBar = new JMenuBar();
private boolean focused;
private JToolBar topToolbar = new JToolBar();
private JSplitPane splitPane;
private static MainWindow singleton;
private static final Object LOCK = new Object();
/**
* Returns the singleton instance of <CODE>MainWindow</CODE>,
* creating it if necessary.
* <p/>
*
* @return the singleton instance of <Code>MainWindow</CODE>
*/
public static MainWindow getInstance() {
// Synchronize on LOCK to ensure that we don't end up creating
// two singletons.
synchronized (LOCK) {
if (null == singleton) {
MainWindow controller = new MainWindow(Default.getString(Default.APPLICATION_NAME), SparkManager.getApplicationImage());
singleton = controller;
return controller;
}
}
return singleton;
}
/**
* Constructs the UI for the MainWindow. The MainWindow UI is the container for the
* entire Spark application.
*
* @param title the title of the frame.
* @param icon the icon used in the frame.
*/
private MainWindow(String title, ImageIcon icon) {
// Initialize and dock the menus
buildMenu();
// Add Workspace Container
getContentPane().setLayout(new BorderLayout());
LayoutSettings settings = LayoutSettingsManager.getLayoutSettings();
if (settings.getMainWindowX() == 0 && settings.getMainWindowY() == 0) {
// Use default settings.
setSize(300, 500);
GraphicUtils.centerWindowOnScreen(this);
}
else {
setBounds(settings.getMainWindowX(), settings.getMainWindowY(), settings.getMainWindowWidth(), settings.getMainWindowHeight());
}
// Add menubar
this.setJMenuBar(mainWindowBar);
this.getContentPane().add(topToolbar, BorderLayout.NORTH);
setTitle(title + " - " + SparkManager.getSessionManager().getUsername());
setIconImage(icon.getImage());
// Setup WindowListener to be the proxy to the actual window listener
// which cannot normally be used outside of the Window component because
// of protected access.
addWindowListener(new WindowAdapter() {
/**
* This event fires when the window has become active.
*
* @param e WindowEvent is not used.
*/
public void windowActivated(WindowEvent e) {
fireWindowActivated();
}
/**
* Invoked when a window is de-activated.
*/
public void windowDeactivated(WindowEvent e) {
}
/**
* This event fires whenever a user minimizes the window
* from the toolbar.
*
* @param e WindowEvent is not used.
*/
public void windowIconified(WindowEvent e) {
}
/**
* This event fires when the application is closing.
* This allows Plugins to do any persistence or other
* work before exiting.
*
* @param e WindowEvent is never used.
*/
public void windowClosing(WindowEvent e) {
saveLayout();
setVisible(false);
}
});
this.addWindowFocusListener(new MainWindowFocusListener());
}
/**
* Adds a MainWindow listener to {@link MainWindow}. The
* listener will be called when either the MainWindow has been minimized, maximized,
* or is shutting down.
*
* @param listener the <code>MainWindowListener</code> to register
*/
public void addMainWindowListener(MainWindowListener listener) {
listeners.add(listener);
}
/**
* Removes the specified {@link MainWindowListener}.
*
* @param listener the <code>MainWindowListener</code> to remove.
*/
public void removeMainWindowListener(MainWindowListener listener) {
listeners.remove(listener);
}
/**
* Notifies all {@link MainWindowListener}s that the <code>MainWindow</code>
* has been activated.
*/
private void fireWindowActivated() {
for (MainWindowListener listener : listeners) {
listener.mainWindowActivated();
}
if (Spark.isMac()) {
setJMenuBar(mainWindowBar);
}
}
/**
* Notifies all {@link MainWindowListener}s that the <code>MainWindow</code>
* is shutting down.
*/
private void fireWindowShutdown() {
for (MainWindowListener listener : listeners) {
listener.shutdown();
}
}
/**
* Invokes the Preferences Dialog.
*
* @param e the ActionEvent
*/
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(preferenceMenuItem)) {
SparkManager.getPreferenceManager().showPreferences();
}
}
/**
* Prepares Spark for shutting down by first calling all {@link MainWindowListener}s and
* setting the Agent to be offline.
*/
public void shutdown() {
final XMPPConnection con = SparkManager.getConnection();
if (con.isConnected()) {
// Send disconnect.
con.disconnect();
}
// Notify all MainWindowListeners
try {
fireWindowShutdown();
}
catch (Exception ex) {
Log.error(ex);
}
finally {
// Close application.
System.exit(1);
}
}
/**
* Prepares Spark for shutting down by first calling all {@link MainWindowListener}s and
* setting the Agent to be offline.
*
* @param sendStatus true if Spark should send a presence with a status message.
*/
public void logout(boolean sendStatus) {
final XMPPConnection con = SparkManager.getConnection();
String status = null;
if (con.isConnected() && sendStatus) {
final InputTextAreaDialog inputTextDialog = new InputTextAreaDialog();
status = inputTextDialog.getInput(Res.getString("title.status.message"), Res.getString("message.current.status"),
SparkRes.getImageIcon(SparkRes.USER1_MESSAGE_24x24), this);
}
// Notify all MainWindowListeners
try {
// Set auto-login to false;
SettingsManager.getLocalPreferences().setAutoLogin(false);
fireWindowShutdown();
setVisible(false);
}
finally {
closeConnectionAndInvoke(status);
}
}
/**
* Closes the current connection and restarts Spark.
*
* @param reason the reason for logging out. This can be if user gave no reason.
*/
private void closeConnectionAndInvoke(String reason) {
final XMPPConnection con = SparkManager.getConnection();
if (con.isConnected()) {
if (reason != null) {
Presence byePresence = new Presence(Presence.Type.unavailable, reason, -1, null);
con.disconnect(byePresence);
}
else {
con.disconnect();
}
}
try {
String command = "";
if (Spark.isWindows()) {
String sparkExe = Spark.getBinDirectory().getParentFile().getCanonicalPath() + "\\" + Default.getString(Default.SHORT_NAME) + ".exe";
String starterExe = Spark.getBinDirectory().getParentFile().getCanonicalPath() + "\\starter.exe";
command = starterExe + " \"" + sparkExe + "\"";
}
else if (Spark.isMac()) {
command = "open -a Spark";
}
Runtime.getRuntime().exec(command);
}
catch (IOException e) {
Log.error("Error starting Spark", e);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?