/* * Created on 8 juil. 2003 * Copyright (C) 2003, 2004, 2005, 2006 Aelitis, All Rights Reserved. * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.ui.swt; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.download.DownloadManagerStats; import org.gudy.azureus2.core3.global.GlobalManager; import org.gudy.azureus2.core3.global.GlobalManagerListener; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.ui.swt.components.shell.ShellFactory; import org.gudy.azureus2.ui.swt.mainwindow.ListenerNeedingCoreRunning; import org.gudy.azureus2.ui.swt.mainwindow.MenuFactory; import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils; import org.gudy.azureus2.ui.systray.SystemTraySWT; import com.aelitis.azureus.core.AzureusCore; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.core.AzureusCoreRunningListener; import com.aelitis.azureus.ui.UIFunctionsManager; import com.aelitis.azureus.ui.common.updater.UIUpdatable; import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT; import com.aelitis.azureus.ui.swt.UIFunctionsSWT; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; /** * Download Basket. For System Tray, see {@link SystemTraySWT} * * @author Olivier * */ public class TrayWindow implements GlobalManagerListener, UIUpdatable { private final static String ID = "DownloadBasket/TrayWindow"; GlobalManager globalManager; List managers; protected AEMonitor managers_mon = new AEMonitor(ID); Display display; Shell minimized; Label label; private Menu menu; private Rectangle screen; private int xPressed; private int yPressed; private boolean moving; public TrayWindow() { this.managers = new ArrayList(); UIFunctionsSWT uif = UIFunctionsManagerSWT.getUIFunctionsSWT(); Shell mainShell = uif == null ? Utils.findAnyShell() : uif.getMainShell(); this.display = mainShell.getDisplay(); minimized = ShellFactory.createShell(mainShell, SWT.ON_TOP); minimized.setText("Vuze"); //$NON-NLS-1$ label = new Label(minimized, SWT.NULL); ImageLoader.getInstance().setLabelImage(label, "tray"); final Rectangle bounds = label.getImage().getBounds(); label.setSize(bounds.width, bounds.height); minimized.setSize(bounds.width + 2, bounds.height + 2); screen = display.getClientArea(); //NICO handle macosx and multiple monitors if (!Constants.isOSX) { minimized.setLocation(screen.x + screen.width - bounds.width - 2, screen.y + screen.height - bounds.height - 2); } else { minimized.setLocation(20, 20); } minimized.layout(); minimized.setVisible(false); //minimized.open(); MouseListener mListener = new MouseAdapter() { public void mouseDown(MouseEvent e) { xPressed = e.x; yPressed = e.y; moving = true; //System.out.println("Position : " + xPressed + " , " + yPressed); } public void mouseUp(MouseEvent e) { moving = false; } public void mouseDoubleClick(MouseEvent e) { restore(); } }; MouseMoveListener mMoveListener = new MouseMoveListener() { public void mouseMove(MouseEvent e) { if (moving) { int dX = xPressed - e.x; int dY = yPressed - e.y; Point currentLoc = minimized.getLocation(); int x = currentLoc.x - dX; int y = currentLoc.y - dY; if (x < 10) x = 0; if (x > screen.width - (bounds.width + 12)) x = screen.width - (bounds.width + 2); if (y < 10) y = 0; if (y > screen.height - (bounds.height + 12)) y = screen.height - (bounds.height + 2); minimized.setLocation(x, y); } } }; label.addMouseListener(mListener); label.addMouseMoveListener(mMoveListener); menu = new Menu(minimized, SWT.CASCADE); label.setMenu(menu); MenuItem file_show = new MenuItem(menu, SWT.NULL); Messages.setLanguageText(file_show, "TrayWindow.menu.show"); //$NON-NLS-1$ menu.setDefaultItem(file_show); file_show.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { restore(); } }); new MenuItem(menu, SWT.SEPARATOR); MenuFactory.addCloseDownloadBarsToMenu(menu); new MenuItem(menu, SWT.SEPARATOR); MenuItem file_startalldownloads = new MenuItem(menu, SWT.NULL); Messages.setLanguageText(file_startalldownloads, "TrayWindow.menu.startalldownloads"); //$NON-NLS-1$ file_startalldownloads.addListener(SWT.Selection, new ListenerNeedingCoreRunning() { public void handleEvent(AzureusCore core, Event e) { globalManager.startAllDownloads(); } }); MenuItem file_stopalldownloads = new MenuItem(menu, SWT.NULL); Messages.setLanguageText(file_stopalldownloads, "TrayWindow.menu.stopalldownloads"); //$NON-NLS-1$ file_stopalldownloads.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { ManagerUtils.asyncStopAll(); } }); new MenuItem(menu, SWT.SEPARATOR); MenuItem file_close = new MenuItem(menu, SWT.NULL); Messages.setLanguageText(file_close, "TrayWindow.menu.close"); file_close.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { COConfigurationManager.setParameter("Show Download Basket", false); } }); MenuItem file_exit = new MenuItem(menu, SWT.NULL); Messages.setLanguageText(file_exit, "TrayWindow.menu.exit"); //$NON-NLS-1$ file_exit.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { UIFunctionsManager.getUIFunctions().dispose(false, false); } }); Utils.createTorrentDropTarget(minimized, false); try { AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() { public void azureusCoreRunning(AzureusCore core) { globalManager = core.getGlobalManager(); globalManager.addListener(TrayWindow.this); } }); } catch (Exception e) { Debug.out(e); } } public void setVisible(boolean visible) { if(visible || !COConfigurationManager.getBooleanParameter("Show Download Basket")) { minimized.setVisible(visible); if (!visible) moving = false; } try { if (visible) { UIFunctionsManager.getUIFunctions().getUIUpdater().addUpdater(this); } else { UIFunctionsManager.getUIFunctions().getUIUpdater().removeUpdater(this); } } catch (Exception e) { Debug.out(e); } } public void dispose() { minimized.dispose(); } public void restore() { if(!COConfigurationManager.getBooleanParameter("Show Download Basket")) minimized.setVisible(false); UIFunctionsSWT functionsSWT = UIFunctionsManagerSWT.getUIFunctionsSWT(); if (functionsSWT != null) { functionsSWT.bringToFront(); } moving = false; } // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#updateUI() public void updateUI() { if (minimized.isDisposed() || !minimized.isVisible()) return; StringBuffer toolTip = new StringBuffer(); String separator = ""; //$NON-NLS-1$ try{ managers_mon.enter(); for (int i = 0; i < managers.size(); i++) { DownloadManager manager = (DownloadManager) managers.get(i); DownloadManagerStats stats = manager.getStats(); String name = manager.getDisplayName(); String completed = DisplayFormatters.formatPercentFromThousands(stats.getCompleted()); toolTip.append(separator); toolTip.append(name); toolTip.append(" -- C: "); toolTip.append(completed); toolTip.append(", D : "); toolTip.append(DisplayFormatters.formatDataProtByteCountToKiBEtcPerSec( stats.getDataReceiveRate(), stats.getProtocolReceiveRate())); toolTip.append(", U : "); toolTip.append(DisplayFormatters.formatDataProtByteCountToKiBEtcPerSec( stats.getDataSendRate(), stats.getProtocolSendRate())); separator = "\n"; //$NON-NLS-1$ } }finally{ managers_mon.exit(); } //label.setToolTipText(toolTip.toString()); //minimized.moveAbove(null); } public void downloadManagerAdded(DownloadManager created) { try{ managers_mon.enter(); managers.add(created); }finally{ managers_mon.exit(); } } public void downloadManagerRemoved(DownloadManager removed) { try{ managers_mon.enter(); managers.remove(removed); }finally{ managers_mon.exit(); } } // globalmanagerlistener public void destroyed() { } public void destroyInitiated() { } public void seedingStatusChanged( boolean seeding_only_mode, boolean b ){ } public void updateLanguage() { MenuFactory.updateMenuText(menu); } /** * @param moving */ public void setMoving(boolean moving) { this.moving = moving; } // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#getUpdateUIName() public String getUpdateUIName() { return ID; } }