package com.deepnighttwo.resourceresolverapplication; import org.eclipse.swt.SWT; 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.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 org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.application.ActionBarAdvisor; import org.eclipse.ui.application.IActionBarConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.plugin.AbstractUIPlugin; public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { private IWorkbenchWindow window; private TrayItem trayItem; private Image trayImage; private final static String COMMAND_ID = "com.deepnighttwo.resourceresolver.application.exitCommand"; public ApplicationWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) { super(configurer); } public ActionBarAdvisor createActionBarAdvisor( IActionBarConfigurer configurer) { return new ApplicationActionBarAdvisor(configurer); } public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); configurer.setInitialSize(new Point(1000, 700)); configurer.setShowCoolBar(false); configurer.setShowStatusLine(false); configurer.setTitle("Resource Resolver"); } // As of here is the new stuff @Override public void postWindowOpen() { super.postWindowOpen(); window = getWindowConfigurer().getWindow(); setShellInMiddle(); trayItem = initTaskItem(window); // Some OS might not support tray items if (trayItem != null) { minimizeBehavior(); // Create exit and about action on the icon hookPopupMenu(); } } private void setShellInMiddle() { Shell shell = window.getShell(); Display display = shell.getDisplay(); shell.setLocation(display.getClientArea().width / 2 - shell.getShell().getSize().x / 2, display.getClientArea().height / 2 - shell.getSize().y / 2); } // Add a listener to the shell private void minimizeBehavior() { window.getShell().addShellListener(new ShellAdapter() { // If the window is minimized hide the window public void shellIconified(ShellEvent e) { window.getShell().setVisible(false); } }); // If user double-clicks on the tray icons the application will be // visible again trayItem.addListener(SWT.DefaultSelection, new Listener() { public void handleEvent(Event event) { Shell shell = window.getShell(); if (!shell.isVisible()) { window.getShell().setMinimized(false); shell.setVisible(true); } } }); } // We hook up on menu entry which allows to close the application private void hookPopupMenu() { trayItem.addListener(SWT.MenuDetect, new Listener() { public void handleEvent(Event event) { Menu menu = new Menu(window.getShell(), SWT.POP_UP); // Creates a new menu item that terminates the program // when selected MenuItem exit = new MenuItem(menu, SWT.NONE); exit.setText("Exit"); exit.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { // Lets call our command IHandlerService handlerService = (IHandlerService) window .getService(IHandlerService.class); try { handlerService.executeCommand(COMMAND_ID, null); } catch (Exception ex) { throw new RuntimeException(COMMAND_ID); } } }); // We need to make the menu visible menu.setVisible(true); } }); } // This methods create the tray item and return a reference private TrayItem initTaskItem(IWorkbenchWindow window) { final Tray tray = window.getShell().getDisplay().getSystemTray(); TrayItem trayItem = new TrayItem(tray, SWT.NONE); trayImage = AbstractUIPlugin.imageDescriptorFromPlugin( "com.deepnighttwo.resourceresolver.application", "/icons/alt_window_16.gif").createImage(); trayItem.setImage(trayImage); trayItem.setToolTipText("TrayItem"); return trayItem; } // We need to clean-up after ourself @Override public void dispose() { if (trayImage != null) { trayImage.dispose(); } if (trayItem != null) { trayItem.dispose(); } } }