SWT: delayed AWT frames creation to reduce memory usage

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1675 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2011-05-08 21:29:31 +00:00
parent c0cd134505
commit eb912da404
1 changed files with 54 additions and 22 deletions

View File

@ -47,6 +47,9 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
protected SwtGatewayTray() {
}
SettingsFrame settingsFrame;
AboutFrame aboutFrame;
private static TrayItem trayItem;
private static java.awt.Image awtImage;
private static Image image;
@ -167,28 +170,35 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
return result;
}
boolean lookAndFeelSet;
protected void setLookAndFeel() {
if (!lookAndFeelSet) {
lookAndFeelSet = true;
try {
String lafClassName = UIManager.getSystemLookAndFeelClassName();
// workaround for bug when SWT and AWT both try to access Gtk
if (lafClassName.indexOf("gtk") > 0) {
lafClassName = UIManager.getCrossPlatformLookAndFeelClassName();
// replace AWT event queue Gdk error handler to avoid application crash
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new SwtAwtEventQueue());
SwtAwtEventQueue.registerErrorHandler();
UIManager.setLookAndFeel(lafClassName);
SwtAwtEventQueue.handleGdkError();
} else {
UIManager.setLookAndFeel(lafClassName);
}
} catch (Exception e) {
DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_SET_LOOK_AND_FEEL"));
}
}
}
/**
* Create tray icon and register frame listeners.
*/
public void init() {
// set native look and feel
try {
String lafClassName = UIManager.getSystemLookAndFeelClassName();
// workaround for bug when SWT and AWT both try to access Gtk
if (lafClassName.indexOf("gtk") > 0) {
lafClassName = UIManager.getCrossPlatformLookAndFeelClassName();
// replace AWT event queue Gdk error handler to avoid application crash
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new SwtAwtEventQueue());
SwtAwtEventQueue.registerErrorHandler();
UIManager.setLookAndFeel(lafClassName);
SwtAwtEventQueue.handleGdkError();
} else {
UIManager.setLookAndFeel(lafClassName);
}
} catch (Exception e) {
DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_SET_LOOK_AND_FEEL"));
}
new Thread("SWT") {
@Override
@ -225,12 +235,15 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
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() {
if (aboutFrame == null) {
setLookAndFeel();
aboutFrame = new AboutFrame();
}
aboutFrame.update();
aboutFrame.setVisible(true);
}
@ -238,12 +251,16 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
}
});
final SettingsFrame settingsFrame = new SettingsFrame();
trayItem.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event event) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
// create frame on first call
if (settingsFrame == null) {
setLookAndFeel();
settingsFrame = new SettingsFrame();
}
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
@ -261,6 +278,11 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
// create frame on first call
if (settingsFrame == null) {
setLookAndFeel();
settingsFrame = new SettingsFrame();
}
settingsFrame.reload();
settingsFrame.setVisible(true);
// workaround for focus on first open
@ -281,6 +303,7 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
Logger rootLogger = Logger.getRootLogger();
LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender");
if (lf5Appender == null) {
setLookAndFeel();
logBrokerMonitor = new LogBrokerMonitor(LogLevel.getLog4JLevels()) {
@Override
protected void closeAfterConfirm() {
@ -308,6 +331,11 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
// display settings frame on first start
if (Settings.isFirstStart()) {
// create frame on first call
if (settingsFrame == null) {
setLookAndFeel();
settingsFrame = new SettingsFrame();
}
settingsFrame.setVisible(true);
}
synchronized (mainThread) {
@ -341,8 +369,12 @@ public class SwtGatewayTray implements DavGatewayTrayInterface {
// already disposed
}
// dispose AWT frames
settingsFrame.dispose();
aboutFrame.dispose();
if (settingsFrame != null) {
settingsFrame.dispose();
}
if (aboutFrame != null) {
aboutFrame.dispose();
}
if (logBrokerMonitor != null) {
logBrokerMonitor.dispose();
}