Make sure we do exit: catch exceptions before System.exit

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@589 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2009-06-16 08:55:39 +00:00
parent e5c1fcd807
commit 32bc5eeb02
3 changed files with 155 additions and 143 deletions

View File

@ -188,14 +188,18 @@ public class AwtGatewayTray implements DavGatewayTrayInterface {
// create an action exitListener to listen for exit action executed on the tray icon // create an action exitListener to listen for exit action executed on the tray icon
ActionListener exitListener = new ActionListener() { ActionListener exitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
DavGateway.stop(); try {
SystemTray.getSystemTray().remove(trayIcon); DavGateway.stop();
SystemTray.getSystemTray().remove(trayIcon);
// dispose frames // dispose frames
settingsFrame.dispose(); settingsFrame.dispose();
aboutFrame.dispose(); aboutFrame.dispose();
if (logBrokerMonitor != null) { if (logBrokerMonitor != null) {
logBrokerMonitor.dispose(); logBrokerMonitor.dispose();
}
} catch (Exception exc) {
DavGatewayTray.error(exc);
} }
// make sure we do exit // make sure we do exit
System.exit(0); System.exit(0);

View File

@ -177,6 +177,7 @@ public class FrameGatewayTray implements DavGatewayTrayInterface {
// create an action exitListener to listen for exit action executed on the tray icon // create an action exitListener to listen for exit action executed on the tray icon
ActionListener exitListener = new ActionListener() { ActionListener exitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try {
DavGateway.stop(); DavGateway.stop();
// dispose frames // dispose frames
settingsFrame.dispose(); settingsFrame.dispose();
@ -184,6 +185,9 @@ public class FrameGatewayTray implements DavGatewayTrayInterface {
if (logBrokerMonitor != null) { if (logBrokerMonitor != null) {
logBrokerMonitor.dispose(); logBrokerMonitor.dispose();
} }
} catch (Exception exc) {
DavGatewayTray.error(exc);
}
// make sure we do exit // make sure we do exit
System.exit(0); System.exit(0);
} }

View File

@ -136,155 +136,159 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
new Thread("SWT") { new Thread("SWT") {
@Override @Override
public void run() { public void run() {
display = new Display(); try {
shell = new Shell(display); display = new Display();
shell = new Shell(display);
final Tray tray = display.getSystemTray(); final Tray tray = display.getSystemTray();
if (tray != null) { if (tray != null) {
trayItem = new TrayItem(tray, SWT.NONE); trayItem = new TrayItem(tray, SWT.NONE);
trayItem.setToolTipText(BundleMessage.format("UI_DAVMAIL_GATEWAY")); trayItem.setToolTipText(BundleMessage.format("UI_DAVMAIL_GATEWAY"));
awtImage = DavGatewayTray.loadImage("tray.png"); awtImage = DavGatewayTray.loadImage("tray.png");
image = loadSwtImage("tray.png"); image = loadSwtImage("tray.png");
image2 = loadSwtImage(AwtGatewayTray.TRAY2_PNG); image2 = loadSwtImage(AwtGatewayTray.TRAY2_PNG);
inactiveImage = loadSwtImage(AwtGatewayTray.TRAYINACTIVE_PNG); inactiveImage = loadSwtImage(AwtGatewayTray.TRAYINACTIVE_PNG);
trayItem.setImage(image); trayItem.setImage(image);
// create a popup menu // create a popup menu
final Menu popup = new Menu(shell, SWT.POP_UP); final Menu popup = new Menu(shell, SWT.POP_UP);
trayItem.addListener(SWT.MenuDetect, new Listener() { trayItem.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) { public void handleEvent(Event event) {
display.asyncExec( display.asyncExec(
new Runnable() { new Runnable() {
public void run() { public void run() {
popup.setVisible(true); popup.setVisible(true);
}
});
}
});
MenuItem aboutItem = new MenuItem(popup, SWT.PUSH);
aboutItem.setText(BundleMessage.format("UI_ABOUT"));
final AboutFrame aboutFrame = new AboutFrame();
aboutItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
aboutFrame.update();
aboutFrame.setVisible(true);
}
});
}
});
final SettingsFrame settingsFrame = new SettingsFrame();
trayItem.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
settingsFrame.setVisible(true);
}
});
}
});
// create menu item for the default action
MenuItem defaultItem = new MenuItem(popup, SWT.PUSH);
defaultItem.setText(BundleMessage.format("UI_SETTINGS"));
defaultItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
settingsFrame.setVisible(true);
}
});
}
});
MenuItem logItem = new MenuItem(popup, SWT.PUSH);
logItem.setText(BundleMessage.format("UI_SHOW_LOGS"));
logItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
Logger rootLogger = Logger.getRootLogger();
LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender");
if (lf5Appender == null) {
logBrokerMonitor = new LogBrokerMonitor(LogLevel.getLog4JLevels()) {
@Override
protected void closeAfterConfirm() {
hide();
}
};
lf5Appender = new LF5Appender(logBrokerMonitor);
lf5Appender.setName("LF5Appender");
rootLogger.addAppender(lf5Appender);
} }
lf5Appender.getLogBrokerMonitor().show(); });
} }
}); });
MenuItem aboutItem = new MenuItem(popup, SWT.PUSH);
aboutItem.setText(BundleMessage.format("UI_ABOUT"));
final AboutFrame aboutFrame = new AboutFrame();
aboutItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
aboutFrame.update();
aboutFrame.setVisible(true);
}
});
}
});
final SettingsFrame settingsFrame = new SettingsFrame();
trayItem.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
settingsFrame.setVisible(true);
}
});
}
});
// create menu item for the default action
MenuItem defaultItem = new MenuItem(popup, SWT.PUSH);
defaultItem.setText(BundleMessage.format("UI_SETTINGS"));
defaultItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
settingsFrame.setVisible(true);
}
});
}
});
MenuItem logItem = new MenuItem(popup, SWT.PUSH);
logItem.setText(BundleMessage.format("UI_SHOW_LOGS"));
logItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
Logger rootLogger = Logger.getRootLogger();
LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender");
if (lf5Appender == null) {
logBrokerMonitor = new LogBrokerMonitor(LogLevel.getLog4JLevels()) {
@Override
protected void closeAfterConfirm() {
hide();
}
};
lf5Appender = new LF5Appender(logBrokerMonitor);
lf5Appender.setName("LF5Appender");
rootLogger.addAppender(lf5Appender);
}
lf5Appender.getLogBrokerMonitor().show();
}
});
}
});
MenuItem exitItem = new MenuItem(popup, SWT.PUSH);
exitItem.setText(BundleMessage.format("UI_EXIT"));
exitItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
DavGateway.stop();
shell.dispose();
}
});
// display settings frame on first start
if (Settings.isFirstStart()) {
settingsFrame.setVisible(true);
} }
}); synchronized (mainThread) {
// ready
MenuItem exitItem = new MenuItem(popup, SWT.PUSH); isReady = true;
exitItem.setText(BundleMessage.format("UI_EXIT")); mainThread.notifyAll();
exitItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
DavGateway.stop();
shell.dispose();
} }
});
// display settings frame on first start while (!shell.isDisposed()) {
if (Settings.isFirstStart()) { if (!display.readAndDispatch()) {
settingsFrame.setVisible(true); display.sleep();
} }
synchronized (mainThread) { }
// ready
isReady = true;
mainThread.notifyAll();
}
while (!shell.isDisposed()) { if (trayItem != null) {
if (!display.readAndDispatch()) { trayItem.dispose();
display.sleep(); trayItem = null;
}
if (image != null) {
image.dispose();
}
if (image2 != null) {
image2.dispose();
}
display.dispose();
// dispose AWT frames
settingsFrame.dispose();
aboutFrame.dispose();
if (logBrokerMonitor != null) {
logBrokerMonitor.dispose();
} }
} }
} catch (Exception exc) {
if (trayItem != null) { DavGatewayTray.error(exc);
trayItem.dispose();
trayItem = null;
}
if (image != null) {
image.dispose();
}
if (image2 != null) {
image2.dispose();
}
display.dispose();
// dispose AWT frames
settingsFrame.dispose();
aboutFrame.dispose();
if (logBrokerMonitor != null) {
logBrokerMonitor.dispose();
}
// make sure we do exit
System.exit(0);
} }
// make sure we do exit
System.exit(0);
} }
}.start(); }.start();
while (true) { while (true) {