/*
* Project: xdccBee
* Copyright (C) 2009 snert@snert-lab.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 3 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, see <http://www.gnu.org/licenses/>.
*/
package de.snertlab.xdccBee.ui;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import de.snertlab.xdccBee.controlling.BeeLogger;
import de.snertlab.xdccBee.irc.IrcServer;
import de.snertlab.xdccBee.irc.ServerList;
import de.snertlab.xdccBee.irc.listener.NotifyManagerConnectedState;
import de.snertlab.xdccBee.messages.XdccBeeMessages;
import de.snertlab.xdccBee.settings.ServerSettings;
import de.snertlab.xdccBee.settings.Settings;
import de.snertlab.xdccBee.tools.CocoaUIEnhancer;
import de.snertlab.xdccBee.ui.actions.ActionAbout;
import de.snertlab.xdccBee.ui.actions.ActionPreferences;
import de.snertlab.xdccBee.ui.actions.ActionQuit;
/**
* @author snert
*
*/
public class Application extends ApplicationWindow {
private static Logger logger = BeeLogger.getLogger();
public static final String VERSION_STRING = readVersionNrFromProperties();
private static Application window;
private ViewMain viewMain;
public static void main(String args[]) {
// INFO: Unter MacOsx muss jar wie folgt gestartet werden: java
// -XstartOnFirstThread -jar
try {
if (!ArrayUtils.isEmpty(args) && !args[0].equals("-debug")) {
BeeLogger.removeConsoleHandler();
}
logger.info("xdccBee start");
window = new Application();
window.setBlockOnOpen(true);
window.open();
if (Display.getCurrent() != null
&& !Display.getCurrent().isDisposed()) {
Display.getCurrent().dispose();
}
} catch (Exception e) {
BeeLogger.exception(e);
throw new RuntimeException(e);
}
System.exit(0);
}
public static Application getWindow() {
return window;
}
public static boolean isMac() {
if (System.getProperty("os.name").equals("Mac OS X")) { //$NON-NLS-1$ //$NON-NLS-2$
return true;
}
return false;
}
public Application() {
super(null);
addToolBar(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
}
@Override
protected Control createContents(Composite parent) {
if (isMac())
macMenu(); // Geht leider nicht in addMenuBar da shell noch nich da
// ist
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FormLayout());
viewMain = new ViewMain();
viewMain.createContents(container);
if (!isMac()) {
makeTray(); // TODO: Tray for mac?!
}
return container;
}
private void macMenu() {
try {
Listener listener = new Listener() {
@Override
public void handleEvent(Event event) {
new ActionQuit(false).run();
}
};
CocoaUIEnhancer enhancer = new CocoaUIEnhancer(
XdccBeeMessages.getString("Application_TITLE")); //$NON-NLS-1$
enhancer.hookApplicationMenu(getShell().getDisplay(), listener,
new ActionAbout(getShell()), new ActionPreferences(
getShell()));
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
private void winMenu(MenuManager menuManager) {
MenuManager fileMenu = new MenuManager(
XdccBeeMessages.getString("Application_MENU_FILE")); //$NON-NLS-1$
MenuManager helpMenu = new MenuManager(
XdccBeeMessages.getString("Application_MENU_HELP")); //$NON-NLS-1$
menuManager.add(fileMenu);
menuManager.add(helpMenu);
fileMenu.add(new ActionPreferences(getShell()));
fileMenu.add(new ActionQuit(true));
helpMenu.add(new ActionAbout(getShell()));
}
@Override
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager("menu"); //$NON-NLS-1$
if (!isMac()) {
winMenu(menuManager);
}
return menuManager;
}
@Override
protected ToolBarManager createToolBarManager(int style) {
ToolBarManager toolBarManager = new ToolBarManager(style);
return toolBarManager;
}
@Override
protected StatusLineManager createStatusLineManager() {
StatusLineManager statusLineManager = new StatusLineManager();
return statusLineManager;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
/*
* Provide different resolutions for icons to get high quality rendering
* wherever the OS needs large icons. For example, the ALT+TAB window on
* certain systems uses a larger icon.
*/
newShell.setImages(new Image[] { Images.WINDOW_ICON_SMALL,
Images.WINDOW_ICON_LARGE, Images.WINDOW_ICON_XLARGE,
Images.WINDOW_ICON_XXLARGE });
newShell.setText(XdccBeeMessages.getString("Application_TITLE")); //$NON-NLS-1$
newShell.setSize(getSettings().getMainWindowSize());
if (getSettings().getMainWindowPosition().x != 0
|| getSettings().getMainWindowPosition().y != 0) {
newShell.setLocation(getSettings().getMainWindowPosition());
} else {
centerShell(newShell);
}
newShell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
new ActionQuit(false).run();
}
});
if (newShell.getDisplay().getSystemTray() != null && !isMac()) { // TODO:
// Tray
// for
// mac?!
// shellIconified
// doesnt
// work
// under
// mac
newShell.addShellListener(new ShellAdapter() {
public void shellIconified(ShellEvent e) {
window.getShell().setVisible(false);
}
});
}
}
private void centerShell(Shell newShell) {
Rectangle pDisplayBounds = newShell.getDisplay().getBounds();
int nLeft = (pDisplayBounds.width - getInitialSize().x) / 2;
int nTop = (pDisplayBounds.height - getInitialSize().y) / 2;
newShell.setBounds(nLeft, nTop, getInitialSize().x, getInitialSize().y);
}
public static void placeDialogInCenter(Shell parent, Shell shell) {
Rectangle parentSize = parent.getBounds();
Rectangle mySize = shell.getBounds();
int locationX, locationY;
locationX = (parentSize.width - mySize.width) / 2 + parentSize.x;
locationY = (parentSize.height - mySize.height) / 2 + parentSize.y;
shell.setLocation(new Point(locationX, locationY));
}
@Override
protected Point getInitialSize() {
return getSettings().getMainWindowSize();
}
public static Settings getSettings() {
return Settings.getInstance();
}
public static ServerSettings getServerSettings() {
return ServerSettings.getInstance();
}
public ViewMain getViewMain() {
return viewMain;
}
private static String readVersionNrFromProperties() {
try {
Properties prop = loadVersionProperties();
String version = ""; //$NON-NLS-1$
String major = (String) prop.get("build.major.number"); //$NON-NLS-1$
String minor = (String) prop.get("build.minor.number"); //$NON-NLS-1$
String patch = (String) prop.get("build.patch.number"); //$NON-NLS-1$
String revision = (String) prop.get("build.revision.number"); //$NON-NLS-1$
version = "Version " + major + "." + minor + "." + patch + " Build(" + revision + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
return version;
} catch (Exception e) {
logger.info("no version file found");
return "NO_VERSION_FILE";
}
}
private static Properties loadVersionProperties() {
try {
Properties properties = new Properties();
properties.load(Application.class
.getResourceAsStream("version.properties")); //$NON-NLS-1$
return properties;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.ApplicationWindow#close()
*/
@Override
public boolean close() {
// TODO: Abstract class NotifyManager to get .clearNotifyList() in all
// of the NotifyManagers
NotifyManagerConnectedState.getNotifyManager().clearNotifyList();
List<IrcServer> listIrcServer = ServerList.getListConnectedServer();
for (IrcServer ircServer : listIrcServer) {
ircServer.disconnect();
}
return super.close();
}
private void makeTray() {
Display display = window.getShell().getDisplay();
final Tray tray = display.getSystemTray();
if (tray == null) {
// no tray
} else {
final TrayItem item = new TrayItem(tray, SWT.NONE);
item.setToolTipText(XdccBeeMessages.getString("Application_TITLE"));
final Menu menu = new Menu(window.getShell(), SWT.POP_UP);
MenuItem mi = new MenuItem(menu, SWT.PUSH);
mi.setText(XdccBeeMessages.getString("Application_TRAY_OPEN"));
mi.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
window.getShell().setVisible(true);
window.getShell().setMinimized(false);
}
});
menu.setDefaultItem(mi);
item.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
menu.setVisible(true);
}
});
item.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
menu.setVisible(true);
}
});
item.setImage(Images.WINDOW_ICON_LARGE);
}
}
}