/**
* JHylaFax - A java client for HylaFAX.
*
* Copyright (C) 2005 by Steffen Pingel <steffenp@gmx.de>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package net.sf.jhylafax;
import gnu.hylafax.HylaFAXClient;
import gnu.inet.ftp.ConnectionEvent;
import gnu.inet.ftp.ConnectionListener;
import gnu.inet.ftp.ServerResponseException;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicBorders;
import net.sf.jhylafax.JobHelper.StatusResponse;
import net.sf.jhylafax.addressbook.AddressBook;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.xnap.commons.gui.AboutDialog;
import org.xnap.commons.gui.Builder;
import org.xnap.commons.gui.Dialogs;
import org.xnap.commons.gui.ErrorDialog;
import org.xnap.commons.gui.action.AbstractXNapAction;
import org.xnap.commons.gui.factory.DefaultFactory;
import org.xnap.commons.gui.shortcut.ActionShortcut;
import org.xnap.commons.gui.util.GUIHelper;
import org.xnap.commons.gui.util.IconHelper;
import org.xnap.commons.gui.util.LabelUpdater;
import org.xnap.commons.gui.util.WhatsThisAction;
import org.xnap.commons.i18n.I18n;
import org.xnap.commons.i18n.I18nFactory;
import org.xnap.commons.i18n.I18nManager;
import org.xnap.commons.io.Job;
import org.xnap.commons.io.ProgressMonitor;
import org.xnap.commons.io.UserAbortException;
import org.xnap.commons.settings.SettingStore;
import org.xnap.commons.util.FileHelper;
/**
* The main class, that provides the main window as well as the network connection.
*
* @author Steffen Pingel
*/
@SuppressWarnings("serial")
public class JHylaFAX extends JFrame implements LocaleChangeListener {
public final static I18n i18n = I18nFactory.getI18n(JHylaFAX.class);
public final static String JDK14_LOG_CONFIG_KEY = "java.util.logging.config.file";
public final static Locale[] SUPPORTED_LOCALES = {
Locale.ENGLISH,
/*new Locale("bg"),*/
new Locale("ca"),
new Locale("cs"),
new Locale("de"),
new Locale("es"),
new Locale("fr"),
new Locale("it"),
/*new Locale("hu"),*/
new Locale("nl"),
/* new Locale("ko"), */
new Locale("pl"),
new Locale("pt", "BR"),
new Locale("ru"),
new Locale("sv"),
new Locale("tr"),
};
private final static Log logger = LogFactory.getLog(JHylaFAX.class);
private static final int BUFFER_SIZE = 1024 * 512;
private static JHylaFAX app;
private static String version;
private JTabbedPane mainTabbedPane;
private JMenu fileMenu;
private SettingsDialogAction settingsDialogAction;
private JPanel statusBarPanel;
private JLabel statusLabel;
private JLabel serverInfoLabel;
private ExitAction exitAction;
private UpdateStatusAction updateStatusAction;
private HylaFAXClient connection;
private JToolBar mainToolBar;
private SendAction sendAction;
private PollAction pollAction;
private JMenu helpMenu;
private AboutAction aboutAction;
private String password;
private String adminPassword;
private ConnectionHandler connectionHandler = new ConnectionHandler();
private ActionShortcut sendActionShortcut;
private AddressBook addressBook;
private AddressBookAction addressBookAction;
private ActionShortcut updateStatusActionShortcut;
private ReceiveQueuePanel recvqPanel;
private JobQueuePanel sendqPanel;
private JobQueuePanel pollqPanel;
private JobQueuePanel doneqPanel;
private DocumentQueuePanel docqPanel;
private SettingsWizardAction settingsWizardAction;
private JobQueue jobQueue = new JobQueue();
private NotificationTimer notificationTimer = new NotificationTimer();
private File addressBookFile;
private Object connectionLock = new Object();
private FaxTray tray;
public JHylaFAX() {
app = this;
try {
Settings.load(getSettingsFile());
// XXX load does not trigger a property change event, therefore
// this needs to be updated manually
Settings.DEFAULT_COMPLETION_MODE.updateMode();
}
catch (FileNotFoundException e) {
logger.debug("Error loading settings", e);
// ignore, probably the first time
}
catch (IOException e) {
logger.debug("Error loading settings", e);
ErrorDialog.showError(this, i18n.tr("Could not load settings"),
i18n.tr("JHylaFAX Error"),
e);
}
updateResourceBundle();
I18nManager.getInstance().addLocaleChangeListener(new LabelUpdater());
IconHelper.classLoader = JHylaFAX.class.getClassLoader();
initializeToolkit();
initialize();
restoreLayout();
PropertyChangeListener disconnector = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (connection != null) {
try {
connection.quit();
}
catch (Exception e) {
logger.debug("Error closing connection", e);
}
connection = null;
}
}
};
Settings.HOSTNAME.addPropertyChangeListener(disconnector);
Settings.PORT.addPropertyChangeListener(disconnector);
Settings.USE_PASSIVE.addPropertyChangeListener(disconnector);
Settings.USERNAME.addPropertyChangeListener(disconnector);
Settings.LOCALE.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
updateResourceBundle();
}
});
notificationTimer.settingsUpdated();
}
private void restoreLayout() {
SettingStore store = new SettingStore(Settings.backstore);
store.restoreWindow("window.main", 40, 40, 540, 400, this);
recvqPanel.restoreLayout(store, new String[] { "sender", "pages", "time", "filename", "filesize", "error" });
sendqPanel.restoreLayout(store, new String[] { "id", "priority", "sender", "number", "dials", "pages", "error", "state" });
pollqPanel.restoreLayout(store, new String[] { "id", "priority", "sender", "number", "dials", "pages", "error", "state" });
doneqPanel.restoreLayout(store, new String[] { "id", "priority", "sender", "number", "dials", "pages", "error", "state" });
docqPanel.restoreLayout(store, new String[] { "permissions", "owner", "modified", "filename", "filesize", "time" });
}
private void saveLayout() {
SettingStore store = new SettingStore(Settings.backstore);
store.saveWindow("window.main", this);
recvqPanel.saveLayout(store);
sendqPanel.saveLayout(store);
pollqPanel.saveLayout(store);
doneqPanel.saveLayout(store);
docqPanel.saveLayout(store);
}
private void updateResourceBundle() {
try {
I18nManager.getInstance().setDefaultLocale(Settings.LOCALE.getValue());
}
catch (MissingResourceException e) {
logger.warn("Error loading resource bundle", e);
}
}
public static void initializeToolkit()
{
// configure UI properties
UIManager.put("swing.boldMetal", Boolean.FALSE);
UIManager.put("SplitPaneDivider.border",
new BasicBorders.MarginBorder());
UIManager.put("TitledBorder.font", UIManager.getFont("Label.font").deriveFont(Font.BOLD));
UIManager.put("TitledBorder.titleColor", UIManager.getColor("Label.foreground").brighter());
Builder.setProperty(DefaultFactory.ENHANCED_TEXT_FIELD_MENU_KEY, true);
}
private void initialize() {
initializeIcon();
initializeActions();
initializeShortCuts();
initializeMenuBar();
initializeContent();
initializeToolBar();
initializeStatusBar();
initializeSystemTray();
updateLabels();
updateServerInfo();
}
private void initializeIcon() {
List<? extends Image> images = IconHelper.getApplicationIcons("kdeprintfax.png");
if (images != null) {
setIconImages(images);
}
}
private void initializeActions() {
updateStatusAction = new UpdateStatusAction();
settingsDialogAction = new SettingsDialogAction();
settingsWizardAction = new SettingsWizardAction();
addressBookAction = new AddressBookAction();
exitAction = new ExitAction();
sendAction = new SendAction();
pollAction = new PollAction();
aboutAction = new AboutAction();
}
private void initializeShortCuts() {
sendActionShortcut = new ActionShortcut(sendAction);
sendActionShortcut.setKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
updateStatusActionShortcut = new ActionShortcut(updateStatusAction);
updateStatusActionShortcut.setKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
}
private void initializeContent() {
setTitle("JHylaFAX");
setLayout(new BorderLayout());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
exit();
}
});
mainTabbedPane = new JTabbedPane();
mainTabbedPane.setBorder(GUIHelper.createEmptyBorder(10));
getContentPane().add(mainTabbedPane, BorderLayout.CENTER);
recvqPanel = new ReceiveQueuePanel("recvq");
mainTabbedPane.addTab("", IconHelper.getTabTitleIcon("folder_inbox.png"), recvqPanel);
sendqPanel = new JobQueuePanel("sendq");
mainTabbedPane.addTab("", IconHelper.getTabTitleIcon("folder_outbox.png"), sendqPanel);
doneqPanel = new JobQueuePanel("doneq");
mainTabbedPane.addTab("", IconHelper.getTabTitleIcon("folder_sent_mail.png"), doneqPanel);
pollqPanel = new JobQueuePanel("pollq");
if (Settings.SHOW_POLLQ.getValue()) {
mainTabbedPane.addTab("", IconHelper.getTabTitleIcon("folder_print.png"), pollqPanel);
}
docqPanel = new DocumentQueuePanel("docq");
mainTabbedPane.addTab("", IconHelper.getTabTitleIcon("folder_txt.png"), docqPanel);
}
private void initializeSystemTray() {
tray = new FaxTray();
if (tray.isSupported()) {
tray.getPopupMenu().add(new MenuItem((String) exitAction.getValue(Action.NAME)));
}
}
public void exit()
{
if (addressBook != null) {
try {
addressBook.saveLayout(new SettingStore(Settings.backstore));
addressBook.store(addressBookFile);
}
catch (Exception e) {
logger.debug("Error storing addressbook", e);
ErrorDialog.showError(JHylaFAX.this,
i18n.tr("Could not store addressbook"),
i18n.tr("JHylaFAX Error"),
e);
}
}
saveLayout();
try {
Settings.store(getSettingsFile());
}
catch (IOException e) {
logger.debug("Error storing settings", e);
ErrorDialog.showError(JHylaFAX.this,
i18n.tr("Could not store settings"),
i18n.tr("JHylaFAX Error"),
e);
}
System.exit(0);
}
private void initializeToolBar() {
mainToolBar = new JToolBar();
//mainToolBar.setBorderPainted(false);
//mainToolBar.setRollover(true);
getContentPane().add(mainToolBar, BorderLayout.NORTH);
mainToolBar.add(Builder.createToolBarButton(sendAction));
mainToolBar.addSeparator();
mainToolBar.add(Builder.createToolBarButton(updateStatusAction));
mainToolBar.addSeparator();
mainToolBar.add(Builder.createToolBarButton(addressBookAction));
mainToolBar.addSeparator();
mainToolBar.add(Builder.createToolBarButton(settingsDialogAction));
}
private void initializeMenuBar() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
fileMenu = new JMenu();
menuBar.add(fileMenu);
JComponent item = Builder.createMenuItem(sendAction);
sendActionShortcut.setMenuItem((JMenuItem)item);
fileMenu.add(item);
fileMenu.add(Builder.createMenuItem(pollAction));
fileMenu.addSeparator();
item = Builder.createMenuItem(updateStatusAction);
fileMenu.add(item);
updateStatusActionShortcut.setMenuItem((JMenuItem)item);
fileMenu.addSeparator();
fileMenu.add(Builder.createMenuItem(settingsDialogAction));
fileMenu.add(Builder.createMenuItem(settingsWizardAction));
fileMenu.addSeparator();
fileMenu.add(Builder.createMenuItem(addressBookAction));
fileMenu.addSeparator();
fileMenu.add(Builder.createMenuItem(exitAction));
helpMenu = new JMenu();
menuBar.add(helpMenu);
helpMenu.add(Builder.createMenuItem(new WhatsThisAction()));
helpMenu.addSeparator();
helpMenu.add(Builder.createMenuItem(aboutAction));
}
private void initializeStatusBar() {
statusBarPanel = new JPanel(new BorderLayout());
getContentPane().add(statusBarPanel, BorderLayout.SOUTH);
statusLabel = new JLabel();
statusBarPanel.add(statusLabel, BorderLayout.CENTER);
serverInfoLabel = new JLabel();
statusBarPanel.add(serverInfoLabel, BorderLayout.EAST);
}
public static JHylaFAX getInstance() {
return app;
}
public HylaFAXClient getConnection(ProgressMonitor monitor) throws IOException, ServerResponseException {
synchronized (connectionLock) {
monitor.setText(i18n.tr("Connecting to {0}", Settings.HOSTNAME.getValue() + ":" + Settings.PORT.getValue()));
if (connection == null) {
connection = new HylaFAXClient();
connection.addConnectionListener(connectionHandler);
connection.setPassive(Settings.USE_PASSIVE.getValue());
}
logger.info("Connecting to HylaFAX server at " + Settings.HOSTNAME.getValue() + ":" + Settings.PORT.getValue());
connection.open(Settings.HOSTNAME.getValue(), Settings.PORT.getValue());
// authenticate until successful or aborted
if (password == null) {
password = Settings.PASSWORD.getValue();
}
while (true) {
if (connection.user(Settings.USERNAME.getValue())) {
if (password.length() == 0) {
password = requestPassword(monitor, false);
if (password == null) {
throw new UserAbortException();
}
}
try {
connection.pass(password);
} catch (ServerResponseException e) {
// wrong password, try again
password = "";
continue;
}
}
break;
}
// establish admin mode
if (adminPassword == null) {
adminPassword = Settings.ADMIN_PASSWORD.getValue();
}
if (Settings.ADMIN_MODE.getValue()) {
while (true) {
if (adminPassword.length() == 0) {
adminPassword = requestPassword(monitor, true);
if (adminPassword == null) {
// just skip the admin command
break;
}
}
try {
connection.admin(adminPassword);
} catch (ServerResponseException e) {
// wrong password, try again
adminPassword = "";
continue;
}
break;
}
}
return connection;
}
}
private String requestPassword(final ProgressMonitor monitor, final boolean admin) throws ServerResponseException {
final String[] password = new String[1];
Runnable runner = new Runnable() {
public void run() {
String host = Settings.USERNAME.getValue() + "@"
+ Settings.HOSTNAME.getValue();
password[0] = Dialogs.requestPassword(monitor.getComponent(),
(admin)
? i18n.tr("Enter admin password for {0}:", host)
: i18n.tr("Enter password for {0}:", host),
i18n.tr("JHylaFAX Connection"));
}
};
try {
SwingUtilities.invokeAndWait(runner);
return password[0];
}
catch (InterruptedException e) {
logger.error("Unexpected exception while waiting for password", e);
throw new ServerResponseException(i18n.tr("Abort by user."));
}
catch (InvocationTargetException e) {
logger.error("Unexpected exception while waiting for password", e);
throw new ServerResponseException(i18n.tr("Abort by user."));
}
}
public static File getSettingsFile() throws IOException {
return new File(FileHelper.getHomeDir("jhylafax"), "jhlafax.prefs");
}
public static File getAddressBookFile() throws IOException {
if (Settings.CUSTOMIZE_ADDRESS_BOOK_FILENAME.getValue()) {
return new File(Settings.ADDRESS_BOOK_FILENAME.getValue());
}
else {
return new File(FileHelper.getHomeDir("jhylafax"),
Settings.ADDRESS_BOOK_FILENAME.getDefaultValue());
}
}
public <T> T runJob(final Job<T> job) throws Exception {
return jobQueue.runJob(null, job);
}
public <T> T runJob(JDialog owner, final Job<T> job) throws Exception {
return jobQueue.runJob(owner, job);
}
public void updateServerInfo() {
serverInfoLabel.setText(
Settings.HOSTNAME.getValue() + ":" + Settings.PORT.getValue());
}
public void updateLabels() {
fileMenu.setText(i18n.tr("File"));
helpMenu.setText(i18n.tr("Help"));
for (int i = 0; i < mainTabbedPane.getTabCount(); i++) {
AbstractQueuePanel panel = (AbstractQueuePanel)mainTabbedPane.getComponent(i);
panel.updateLabels();
String queueName = panel.getQueueName();
if (queueName.equals("recvq")) { mainTabbedPane.setTitleAt(i, i18n.tr("Received")); }
else if (queueName.equals("sendq")) { mainTabbedPane.setTitleAt(i, i18n.tr("Sending")); }
else if (queueName.equals("pollq")) { mainTabbedPane.setTitleAt(i, i18n.tr("Pollable")); }
else if (queueName.equals("doneq")) { mainTabbedPane.setTitleAt(i, i18n.tr("Done")); }
else if (queueName.equals("docq")) { mainTabbedPane.setTitleAt(i, i18n.tr("Documents")); }
}
sendAction.putValue(Action.NAME, i18n.tr("Send Fax..."));
sendAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Opens a dialog for sending a fax"));
pollAction.putValue(Action.NAME, i18n.tr("Poll Fax..."));
pollAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Opens a dialog for polling a fax"));
addressBookAction.putValue(Action.NAME, i18n.tr("Address Book"));
updateStatusAction.putValue(Action.NAME, i18n.tr("Update Status"));
updateStatusAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Queries the status from the server"));
settingsDialogAction.putValue(Action.NAME, i18n.tr("Settings..."));
settingsDialogAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Displays the settings dialog"));
settingsDialogAction.updateLabels();
settingsWizardAction.putValue(Action.NAME, i18n.tr("Setup Wizard..."));
settingsWizardAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Displays the settings wizard"));
settingsWizardAction.updateLabels();
exitAction.putValue(Action.NAME, i18n.tr("Exit"));
exitAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Closes the application"));
aboutAction.putValue(Action.NAME, i18n.tr("About..."));
aboutAction.putValue(Action.SHORT_DESCRIPTION, i18n.tr("Opens a dialog that displays funny information"));
GUIHelper.setMnemonics(getJMenuBar());
}
/**
* @param args
*/
public static void main(final String[] args) {
final ArgsHandler handler = new ArgsHandler();
handler.evaluate(args);
evaluateArgumentsPreVisible(handler);
ThreadGroup tg = new ThreadGroup("JHylaFAXThreadGroup") {
public void uncaughtException(Thread t,Throwable e) {
e.printStackTrace();
}
};
// System.setProperty("sun.awt.exception.handler",
// "xnap.util.XNapAWTExceptionHandler");
Thread mainRunner = new Thread(tg, "JHylaFAXMain") {
public void run() {
setContextClassLoader(JHylaFAX.class.getClassLoader());
JHylaFAX app = new JHylaFAX();
app.setVisible(true);
app.evaluateArgumentsPostVisible(handler);
}
};
mainRunner.start();
}
private static void evaluateArgumentsPreVisible(ArgsHandler handler)
{
// configure logging
URL url = JHylaFAX.class.getResource(handler.getLogConfigFilename());
if (url != null) {
PropertyConfigurator.configure(url);
} else {
System.err.println("Could not find logging configuration: "
+ handler.getLogConfigFilename());
BasicConfigurator.configure();
}
// InputStream in = ClassLoader.getSystemResourceAsStream(handler.getLogConfigFilename());
// if (in != null) {
// try {
// LogManager.getLogManager().readConfiguration(in);
// }
// catch (IOException e) {
// logger.warn("Error reading logging configuration", e);
// try {
// in.close();
// } catch (IOException e1) {}
// }
// }
// else {
// logger.warn("Could not find logging configuration: " + handler.getLogConfigFilename());
// }
}
protected void evaluateArgumentsPostVisible(ArgsHandler handler)
{
if (!Settings.HAS_SEEN_WIZARD.getValue()) {
SettingsWizard wizard = new SettingsWizard(JHylaFAX.this);
wizard.setModal(true);
wizard.setLocationRelativeTo(JHylaFAX.this);
wizard.setVisible(true);
}
if (Settings.UPDATE_ON_STARTUP.getValue()) {
updateTables();
}
String[] filenames = handler.getFilenames();
String[] numbers = handler.getNumbers();
File tempFile = null;
if (handler.getReadStdin()) {
tempFile = saveStdInToFile();
if (tempFile != null) {
// prepend path of temp file to filename array
String[] newFilenames = new String[filenames.length + 1];
newFilenames[0] = tempFile.getAbsolutePath();
System.arraycopy(filenames, 0, newFilenames, 1, filenames.length);
filenames = newFilenames;
}
}
if (filenames.length > 0 || numbers.length > 0) {
SendDialog dialog = new SendDialog(this);
for (String number : numbers) {
// FIXME should invoke addNumber()
dialog.setNumber(number);
}
if (filenames.length > 0) {
dialog.setDocument(filenames[0]);
for (int i = 1; i < filenames.length; i++) {
dialog.addDocument(filenames[i]);
}
}
dialog.setQuitAfterSending(handler.getQuitAfterSending());
dialog.setLocationRelativeTo(JHylaFAX.this);
dialog.setVisible(true);
}
}
private File saveStdInToFile()
{
File tempFile;
try {
tempFile = File.createTempFile("jhylafax", null);
tempFile.deleteOnExit();
}
catch (IOException e) {
logger.debug("Error creating temporary file", e);
ErrorDialog.showError(JHylaFAX.getInstance(),
i18n.tr("Error creating temporary file"),
i18n.tr("JHylaFAX Error"),
e);
return null;
}
// TODO use FileHelper.copy() and display progress
try {
BufferedInputStream in = new BufferedInputStream(System.in);
try {
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
try {
byte[] buf = new byte[BUFFER_SIZE];
while (true) {
int bytesRead = in.read(buf);
if (bytesRead <= 0) {
break;
}
out.write(buf, 0, bytesRead);
}
}
finally {
out.close();
}
}
finally {
in.close();
}
}
catch (IOException e) {
logger.debug("Error creating temporary file", e);
ErrorDialog.showError(JHylaFAX.getInstance(),
i18n.tr("Error creating temporary file"),
i18n.tr("JHylaFAX Error"),
e);
return null;
}
return tempFile;
}
public void updateTables()
{
updateTables(JobHelper.updateStatus());
}
public void updateTables(StatusResponse response)
{
jobQueue.setLastUpdate(System.currentTimeMillis());
if (response != null) {
updateServerInfo();
statusLabel.setText(response.status);
statusLabel.setToolTipText("<html><pre><b>" + response.verboseStatus + "</b></pre>");
recvqPanel.setData(response.recvq);
sendqPanel.setData(response.sendq);
pollqPanel.setData(response.pollq);
doneqPanel.setData(response.doneq);
docqPanel.setData(response.docq);
}
}
private class AboutAction extends AbstractXNapAction {
private AboutDialog dialog;
public AboutAction() {
putValue(ICON_FILENAME, "jhylafax.png");
}
public void actionPerformed(ActionEvent e)
{
if (dialog == null) {
dialog = new AboutDialog();
dialog.setTitle(i18n.tr("About JHylaFax {0}", getVersion()));
dialog.setLocationRelativeTo(JHylaFAX.this);
dialog.addHTMLTab(i18n.tr("General Information"), "about.html", true);
JTextArea textArea = dialog.addTab(i18n.tr("License"), "LICENSE.jhylafax");
textArea.setFont(new Font("Monospaced", Font.PLAIN, 10));
dialog.addHTMLTab(i18n.tr("3rd Party Software"), "LICENSE.other.html", true);
dialog.getTabbedPane().setSelectedIndex(0);
}
if (!dialog.isVisible()) {
dialog.setVisible(true);
}
}
}
private class AddressBookAction extends AbstractXNapAction {
public AddressBookAction() {
putValue(ICON_FILENAME, "contents.png");
}
public void actionPerformed(ActionEvent e)
{
getAddressBook().setVisible(true);
}
}
private class SendAction extends AbstractXNapAction {
public SendAction() {
putValue(ICON_FILENAME, "mail_new.png");
}
public void actionPerformed(ActionEvent e)
{
SendDialog dialog = new SendDialog(JHylaFAX.this);
dialog.setLocationRelativeTo(JHylaFAX.this);
dialog.setVisible(true);
}
}
private class PollAction extends AbstractXNapAction {
public PollAction() {
putValue(ICON_FILENAME, "mail_get.png");
}
public void actionPerformed(ActionEvent e)
{
PollDialog dialog = new PollDialog(JHylaFAX.this);
dialog.setLocationRelativeTo(JHylaFAX.this);
dialog.setVisible(true);
}
}
private class SettingsDialogAction extends AbstractXNapAction
implements LocaleChangeListener {
private SettingsDialog dialog;
public SettingsDialogAction() {
putValue(ICON_FILENAME, "configure.png");
}
public void updateLabels()
{
if (dialog != null) {
dialog.updateLabels();
}
}
public void actionPerformed(ActionEvent e)
{
if (dialog == null) {
dialog = new SettingsDialog(JHylaFAX.this);
dialog.setLocationRelativeTo(JHylaFAX.this);
}
if (!dialog.isVisible()) {
dialog.revert();
dialog.setVisible(true);
}
}
}
private class SettingsWizardAction extends AbstractXNapAction
implements LocaleChangeListener {
public SettingsWizardAction() {
putValue(ICON_FILENAME, "wizard.png");
}
public void updateLabels() {
}
public void actionPerformed(ActionEvent e)
{
SettingsWizard wizard = new SettingsWizard(JHylaFAX.this);
wizard.setLocationRelativeTo(JHylaFAX.this);
wizard.setVisible(true);
}
}
private class ExitAction extends AbstractXNapAction {
public ExitAction() {
putValue(ICON_FILENAME, "exit.png");
}
public void actionPerformed(ActionEvent e)
{
exit();
}
}
private class UpdateStatusAction extends AbstractXNapAction {
public UpdateStatusAction() {
putValue(ICON_FILENAME, "reload.png");
}
public void actionPerformed(ActionEvent e) {
updateTables();
}
}
private class ConnectionHandler implements ConnectionListener {
public void connectionOpened(ConnectionEvent event) {
logger.info("Connected to "
+ event.getRemoteInetAddress().getHostAddress()
+ ":" + event.getRemotePort());
}
public void connectionClosed(ConnectionEvent event) {
logger.info("Disconnected from "
+ event.getRemoteInetAddress().getHostAddress()
+ ":" + event.getRemotePort());
connection.removeConnectionListener(this);
connection = null;
}
public void connectionFailed(Exception e) {
logger.info("Connection failed", e);
connection.removeConnectionListener(this);
connection = null;
}
}
public AddressBook getAddressBook()
{
if (addressBook == null) {
addressBook = new AddressBook();
//addressBook.setLocationRelativeTo(JHylaFAX.this);
addressBook.restoreLayout(new SettingStore(Settings.backstore));
try {
addressBookFile = getAddressBookFile();
if (addressBookFile.exists()) {
addressBook.load(addressBookFile);
}
}
catch (Exception e) {
logger.debug("Error loading addressbook", e);
ErrorDialog.showError(JHylaFAX.this,
i18n.tr("Could not load addressbook"),
i18n.tr("JHylaFAX Error"),
e);
}
}
return addressBook;
}
public void showError(String message, Exception e)
{
ErrorDialog.showError(this, message, i18n.tr("JHylaFAX Error"), e);
}
public void showError(String message)
{
Dialogs.showError(this, message, i18n.tr("JHylaFAX Error"));
}
public void resetAllTables() {
recvqPanel.resetTable();
sendqPanel.resetTable();
pollqPanel.resetTable();
doneqPanel.resetTable();
docqPanel.resetTable();
}
public void runNotification(Notification notification)
{
jobQueue.addNotification(notification);
}
public void settingsUpdated()
{
notificationTimer.settingsUpdated();
}
public synchronized static String getVersion() {
if (version == null) {
try {
InputStream in = JHylaFAX.class.getResourceAsStream("version.properties");
try {
Properties p = new Properties();
p.load(in);
version = p.getProperty("jhylafax.version", "");
} finally {
in.close();
}
} catch (IOException e) {
logger.debug("Error loading version properties", e);
}
}
return version;
}
}