/* * Copyright PMEase (c) 2005 - 2010, * Date: Jan 17, 2010 12:46:27 PM * * All rights reserved. * * Revision: $Id$ */ package com.pmease.quickbuild.monitor.gui; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Shell; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.pmease.quickbuild.monitor.notifier.Notifier; import com.pmease.quickbuild.monitor.utils.SWTUtils; public class WindowManager { private static final Logger logger = LoggerFactory.getLogger(WindowManager.class); private Map<String, AbstractDialog> dialogs = new HashMap<String, AbstractDialog>(); private static Map<String, Class<? extends AbstractDialog>> dialogFactory = new HashMap<String, Class<? extends AbstractDialog>>(); static { dialogFactory.put("About", AboutDialog.class); dialogFactory.put("QuickView", BrowserWindow.class); dialogFactory.put("Preference", PreferenceDialog.class); dialogFactory.put("History", HistoryDialog.class); } public BrowserWindow browserWindow; public PreferenceDialog preferenceDialog; public AboutDialog aboutDialog; public HistoryDialog historyDialog; public List<Notifier> notifiers = new ArrayList<Notifier>(); private final TrayMonitor monitor; private final Boolean[] areas; private int totalX; private int totalY; private static final int NOTIFICATION_TOTALS = 10; private static final int NOTIFIER_WIDTH = 320; private static final int NOTIFIER_HEIGHT = 120; public WindowManager(TrayMonitor monitor) { this.monitor = monitor; Rectangle clientArea = monitor.getShell().getMonitor().getClientArea(); totalY = clientArea.height / (NOTIFIER_HEIGHT + 10); if (totalY > NOTIFICATION_TOTALS) { totalY = NOTIFICATION_TOTALS; } totalX = NOTIFICATION_TOTALS / totalY; if (totalX == 0) { totalX = 1; } areas = new Boolean[totalX * totalY]; for (int i = 0; i < areas.length; i++) { areas[i] = Boolean.TRUE; } } private void activateWindow(Shell shell) { if (shell.getMinimized()) { shell.setMinimized(false); } shell.setVisible(true); shell.forceActive(); shell.forceFocus(); } public AbstractDialog createDialog(String name) { Class<? extends AbstractDialog> clazz = dialogFactory.get(name); try { Constructor<? extends AbstractDialog> constructor = clazz.getConstructor(TrayMonitor.class); AbstractDialog dialog = constructor.newInstance(new Object[] { monitor }); dialogs.put(name, dialog); return dialog; } catch (SecurityException e) { logger.error("Failed create dialog " + name, e); } catch (NoSuchMethodException e) { logger.error("Failed create dialog " + name, e); } catch (IllegalArgumentException e) { logger.error("Failed create dialog " + name, e); } catch (InstantiationException e) { logger.error("Failed create dialog " + name, e); } catch (IllegalAccessException e) { logger.error("Failed create dialog " + name, e); } catch (InvocationTargetException e) { logger.error("Failed create dialog " + name, e); } return null; } public void showDialog(String name) { AbstractDialog dialog = dialogs.get(name); if (dialog == null || SWTUtils.isDisposed(dialog.getShell())) { dialog = createDialog(name); dialog.open(); } else { activateWindow(dialog.getShell()); } } public void showBrowser() { showDialog("QuickView"); } public void showPreferenceDialog() { showDialog("Preference"); } public void showAbout() { showDialog("About"); } public void showHistoryDialog() { showDialog("History"); } public void refreshHistoryDialog() { HistoryDialog dialog = (HistoryDialog) dialogs.get("History"); if (dialog == null || SWTUtils.isDisposed(dialog.getShell())) { return; } dialog.updateTable(); } private int getNext() { for (int i = 0; i < areas.length; i++) { if (areas[i]) { return i; } } return 0; } public void addNotifier(Notifier notifier) { int i = getNext(); notifier.setIndex(i); areas[i] = Boolean.FALSE; Shell shell = notifier.getShell(); shell.setSize(NOTIFIER_WIDTH, NOTIFIER_HEIGHT); Rectangle clientArea = monitor.getShell().getMonitor().getClientArea(); int x = i / totalY; int y = i - (x * totalY); int startX = clientArea.x + clientArea.width - (NOTIFIER_WIDTH + 10) * (x + 1); int startY = clientArea.y + clientArea.height - (NOTIFIER_HEIGHT + 10) * (y + 1); shell.setLocation(new Point(startX, startY)); } public void removeNotifier(Notifier notifier) { areas[notifier.getIndex()] = Boolean.TRUE; } }