connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/ui/mylyn/AbstractNotificationPopup.java
author dadubrow
Fri, 12 Mar 2010 14:47:52 -0600
changeset 1104 e84724c7f393
permissions -rw-r--r--
copy in required mylyn code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1104
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     1
/*******************************************************************************
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     2
 * Copyright (c) 2004, 2009 Tasktop Technologies and others.
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     3
 * All rights reserved. This program and the accompanying materials
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     4
 * are made available under the terms of the Eclipse Public License v1.0
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     5
 * which accompanies this distribution, and is available at
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     6
 * http://www.eclipse.org/legal/epl-v10.html
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     7
 *
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     8
 * Contributors:
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
     9
 *     Benjamin Pasero - intial API and implementation
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    10
 *     Tasktop Technologies - initial API and implementation
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    11
 *******************************************************************************/
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    12
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    13
package com.nokia.carbide.remoteconnections.internal.ui.mylyn;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    14
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    15
import org.eclipse.core.runtime.IProgressMonitor;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    16
import org.eclipse.core.runtime.IStatus;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    17
import org.eclipse.core.runtime.Status;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    18
import org.eclipse.core.runtime.jobs.Job;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    19
import org.eclipse.jface.resource.JFaceResources;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    20
import org.eclipse.jface.resource.LocalResourceManager;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    21
import org.eclipse.jface.window.Window;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    22
import org.eclipse.swt.SWT;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    23
import org.eclipse.swt.events.ControlAdapter;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    24
import org.eclipse.swt.events.ControlEvent;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    25
import org.eclipse.swt.events.MouseAdapter;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    26
import org.eclipse.swt.events.MouseEvent;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    27
import org.eclipse.swt.events.MouseTrackAdapter;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    28
import org.eclipse.swt.graphics.Color;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    29
import org.eclipse.swt.graphics.GC;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    30
import org.eclipse.swt.graphics.Image;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    31
import org.eclipse.swt.graphics.Point;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    32
import org.eclipse.swt.graphics.Rectangle;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    33
import org.eclipse.swt.graphics.Region;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    34
import org.eclipse.swt.layout.GridData;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    35
import org.eclipse.swt.layout.GridLayout;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    36
import org.eclipse.swt.widgets.Composite;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    37
import org.eclipse.swt.widgets.Control;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    38
import org.eclipse.swt.widgets.Display;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    39
import org.eclipse.swt.widgets.Label;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    40
import org.eclipse.swt.widgets.Monitor;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    41
import org.eclipse.swt.widgets.Shell;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    42
import org.eclipse.ui.IWorkbenchWindow;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    43
import org.eclipse.ui.PlatformUI;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    44
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    45
import com.nokia.carbide.remoteconnections.internal.ui.mylyn.SwtUtil.FadeJob;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    46
import com.nokia.carbide.remoteconnections.internal.ui.mylyn.SwtUtil.IFadeListener;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    47
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    48
/**
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    49
 * @author Benjamin Pasero
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    50
 * @author Mik Kersten
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    51
 * @author Steffen Pingel
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    52
 */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    53
public abstract class AbstractNotificationPopup extends Window {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    54
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    55
	private static final int TITLE_HEIGHT = 24;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    56
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    57
	private static final String LABEL_NOTIFICATION = "Notification";
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    58
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    59
	private static final String LABEL_JOB_CLOSE = "Close Notification Job";
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    60
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    61
	private static final int MAX_WIDTH = 400;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    62
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    63
	private static final int MIN_HEIGHT = 100;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    64
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    65
	private static final long DEFAULT_DELAY_CLOSE = 8 * 1000;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    66
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    67
	private static final int PADDING_EDGE = 5;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    68
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    69
	private long delayClose = DEFAULT_DELAY_CLOSE;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    70
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    71
	protected LocalResourceManager resources;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    72
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    73
	private NotificationPopupColors color;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    74
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    75
	private final Display display;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    76
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    77
	private Shell shell;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    78
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    79
	private Region lastUsedRegion;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    80
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    81
	private Image lastUsedBgImage;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    82
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    83
	private final Job closeJob = new Job(LABEL_JOB_CLOSE) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    84
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    85
		@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    86
		protected IStatus run(IProgressMonitor monitor) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    87
			if (!display.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    88
				display.asyncExec(new Runnable() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    89
					public void run() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    90
						Shell shell = AbstractNotificationPopup.this.getShell();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    91
						if (shell == null || shell.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    92
							return;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    93
						}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    94
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    95
						if (isMouseOver(shell)) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    96
							scheduleAutoClose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    97
							return;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    98
						}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
    99
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   100
						AbstractNotificationPopup.this.closeFade();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   101
					}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   102
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   103
				});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   104
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   105
			if (monitor.isCanceled()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   106
				return Status.CANCEL_STATUS;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   107
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   108
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   109
			return Status.OK_STATUS;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   110
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   111
	};
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   112
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   113
	private final boolean respectDisplayBounds = true;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   114
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   115
	private final boolean respectMonitorBounds = true;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   116
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   117
	private FadeJob fadeJob;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   118
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   119
	private boolean fadingEnabled;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   120
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   121
	public AbstractNotificationPopup(Display display) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   122
		this(display, SWT.NO_TRIM | SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   123
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   124
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   125
	public AbstractNotificationPopup(Display display, int style) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   126
		super(new Shell(display));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   127
		setShellStyle(style);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   128
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   129
		this.display = display;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   130
		resources = new LocalResourceManager(JFaceResources.getResources());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   131
		initResources();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   132
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   133
		closeJob.setSystem(true);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   134
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   135
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   136
	public boolean isFadingEnabled() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   137
		return fadingEnabled;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   138
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   139
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   140
	public void setFadingEnabled(boolean fadingEnabled) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   141
		this.fadingEnabled = fadingEnabled;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   142
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   143
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   144
	/**
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   145
	 * Override to return a customized name. Default is to return the name of the product, specified by the -name (e.g.
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   146
	 * "Eclipse SDK") command line parameter that's associated with the product ID (e.g. "org.eclipse.sdk.ide"). Strips
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   147
	 * the trailing "SDK" for any name, since this part of the label is considered visual noise.
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   148
	 * 
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   149
	 * @return the name to be used in the title of the popup.
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   150
	 */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   151
	protected String getPopupShellTitle() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   152
//		String productName = CommonUiUtil.getProductName();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   153
//		if (productName != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   154
//			return productName + " " + LABEL_NOTIFICATION; //$NON-NLS-1$
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   155
//		} else {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   156
			return LABEL_NOTIFICATION;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   157
//		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   158
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   159
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   160
	protected Image getPopupShellImage(int maximumHeight) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   161
		// always use the launching workbench window
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   162
		IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   163
		if (windows != null && windows.length > 0) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   164
			IWorkbenchWindow workbenchWindow = windows[0];
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   165
			if (workbenchWindow != null && !workbenchWindow.getShell().isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   166
				Image image = getShell().getImage();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   167
				int diff = Integer.MAX_VALUE;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   168
				if (image != null && image.getBounds().height <= maximumHeight) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   169
					diff = maximumHeight - image.getBounds().height;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   170
				} else {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   171
					image = null;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   172
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   173
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   174
				Image[] images = getShell().getImages();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   175
				if (images != null && images.length > 0) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   176
					// find the icon that is closest in size, but not larger than maximumHeight 
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   177
					for (Image image2 : images) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   178
						int newDiff = maximumHeight - image2.getBounds().height;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   179
						if (newDiff >= 0 && newDiff <= diff) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   180
							diff = newDiff;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   181
							image = image2;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   182
						}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   183
					}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   184
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   185
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   186
				return image;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   187
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   188
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   189
		return null;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   190
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   191
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   192
	/**
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   193
	 * Override to populate with notifications.
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   194
	 * 
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   195
	 * @param parent
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   196
	 */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   197
	protected void createContentArea(Composite parent) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   198
		// empty by default
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   199
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   200
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   201
	/**
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   202
	 * Override to customize the title bar
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   203
	 */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   204
	protected void createTitleArea(Composite parent) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   205
		((GridData) parent.getLayoutData()).heightHint = TITLE_HEIGHT;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   206
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   207
		Label titleImageLabel = new Label(parent, SWT.NONE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   208
		titleImageLabel.setImage(getPopupShellImage(TITLE_HEIGHT));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   209
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   210
		Label titleTextLabel = new Label(parent, SWT.NONE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   211
		titleTextLabel.setText(getPopupShellTitle());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   212
		titleTextLabel.setFont(CommonFonts.BOLD);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   213
		titleTextLabel.setForeground(getTitleForeground());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   214
//		titleTextLabel.setForeground(color.getTitleText());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   215
		titleTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   216
		titleTextLabel.setCursor(parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   217
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   218
		final Label button = new Label(parent, SWT.NONE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   219
		button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   220
		button.addMouseTrackListener(new MouseTrackAdapter() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   221
			@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   222
			public void mouseEnter(MouseEvent e) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   223
				button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE_HOVER));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   224
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   225
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   226
			@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   227
			public void mouseExit(MouseEvent e) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   228
				button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   229
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   230
		});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   231
		button.addMouseListener(new MouseAdapter() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   232
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   233
			@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   234
			public void mouseUp(MouseEvent e) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   235
				close();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   236
				setReturnCode(CANCEL);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   237
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   238
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   239
		});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   240
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   241
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   242
	protected Color getTitleForeground() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   243
		return color.getTitleText();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   244
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   245
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   246
	private void initResources() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   247
		color = new NotificationPopupColors(display, resources);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   248
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   249
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   250
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   251
	protected void configureShell(Shell newShell) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   252
		super.configureShell(newShell);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   253
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   254
		shell = newShell;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   255
		newShell.setBackground(color.getBorder());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   256
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   257
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   258
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   259
	public void create() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   260
		super.create();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   261
		addRegion(shell);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   262
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   263
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   264
	private void addRegion(Shell shell) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   265
		Region region = new Region();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   266
		Point s = shell.getSize();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   267
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   268
		/* Add entire Shell */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   269
		region.add(0, 0, s.x, s.y);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   270
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   271
		/* Subtract Top-Left Corner */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   272
		region.subtract(0, 0, 5, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   273
		region.subtract(0, 1, 3, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   274
		region.subtract(0, 2, 2, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   275
		region.subtract(0, 3, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   276
		region.subtract(0, 4, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   277
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   278
		/* Subtract Top-Right Corner */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   279
		region.subtract(s.x - 5, 0, 5, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   280
		region.subtract(s.x - 3, 1, 3, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   281
		region.subtract(s.x - 2, 2, 2, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   282
		region.subtract(s.x - 1, 3, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   283
		region.subtract(s.x - 1, 4, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   284
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   285
		/* Subtract Bottom-Left Corner */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   286
		region.subtract(0, s.y, 5, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   287
		region.subtract(0, s.y - 1, 3, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   288
		region.subtract(0, s.y - 2, 2, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   289
		region.subtract(0, s.y - 3, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   290
		region.subtract(0, s.y - 4, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   291
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   292
		/* Subtract Bottom-Right Corner */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   293
		region.subtract(s.x - 5, s.y - 0, 5, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   294
		region.subtract(s.x - 3, s.y - 1, 3, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   295
		region.subtract(s.x - 2, s.y - 2, 2, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   296
		region.subtract(s.x - 1, s.y - 3, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   297
		region.subtract(s.x - 1, s.y - 4, 1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   298
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   299
		/* Dispose old first */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   300
		if (shell.getRegion() != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   301
			shell.getRegion().dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   302
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   303
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   304
		/* Apply Region */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   305
		shell.setRegion(region);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   306
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   307
		/* Remember to dispose later */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   308
		lastUsedRegion = region;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   309
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   310
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   311
	private boolean isMouseOver(Shell shell) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   312
		if (display.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   313
			return false;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   314
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   315
		return shell.getBounds().contains(display.getCursorLocation());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   316
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   317
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   318
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   319
	public int open() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   320
		if (shell == null || shell.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   321
			shell = null;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   322
			create();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   323
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   324
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   325
		constrainShellSize();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   326
		shell.setLocation(fixupDisplayBounds(shell.getSize(), shell.getLocation()));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   327
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   328
		if (isFadingEnabled()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   329
			shell.setAlpha(0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   330
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   331
		shell.setVisible(true);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   332
		fadeJob = SwtUtil.fadeIn(shell, new IFadeListener() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   333
			public void faded(Shell shell, int alpha) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   334
				if (shell.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   335
					return;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   336
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   337
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   338
				if (alpha == 255) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   339
					scheduleAutoClose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   340
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   341
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   342
		});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   343
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   344
		return Window.OK;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   345
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   346
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   347
	protected void scheduleAutoClose() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   348
		if (delayClose > 0) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   349
			closeJob.schedule(delayClose);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   350
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   351
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   352
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   353
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   354
	protected Control createContents(Composite parent) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   355
		((GridLayout) parent.getLayout()).marginWidth = 1;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   356
		((GridLayout) parent.getLayout()).marginHeight = 1;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   357
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   358
		/* Outer Composite holding the controls */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   359
		final Composite outerCircle = new Composite(parent, SWT.NO_FOCUS);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   360
		outerCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   361
		outerCircle.setBackgroundMode(SWT.INHERIT_FORCE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   362
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   363
		outerCircle.addControlListener(new ControlAdapter() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   364
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   365
			@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   366
			public void controlResized(ControlEvent e) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   367
				Rectangle clArea = outerCircle.getClientArea();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   368
				lastUsedBgImage = new Image(outerCircle.getDisplay(), clArea.width, clArea.height);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   369
				GC gc = new GC(lastUsedBgImage);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   370
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   371
				/* Gradient */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   372
				drawGradient(gc, clArea);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   373
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   374
				/* Fix Region Shape */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   375
				fixRegion(gc, clArea);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   376
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   377
				gc.dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   378
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   379
				Image oldBGImage = outerCircle.getBackgroundImage();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   380
				outerCircle.setBackgroundImage(lastUsedBgImage);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   381
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   382
				if (oldBGImage != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   383
					oldBGImage.dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   384
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   385
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   386
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   387
			private void drawGradient(GC gc, Rectangle clArea) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   388
				gc.setForeground(color.getGradientBegin());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   389
				gc.setBackground(color.getGradientEnd());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   390
				gc.fillGradientRectangle(clArea.x, clArea.y, clArea.width, clArea.height, true);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   391
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   392
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   393
			private void fixRegion(GC gc, Rectangle clArea) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   394
				gc.setForeground(color.getBorder());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   395
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   396
				/* Fill Top Left */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   397
				gc.drawPoint(2, 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   398
				gc.drawPoint(3, 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   399
				gc.drawPoint(1, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   400
				gc.drawPoint(0, 2);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   401
				gc.drawPoint(0, 3);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   402
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   403
				/* Fill Top Right */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   404
				gc.drawPoint(clArea.width - 4, 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   405
				gc.drawPoint(clArea.width - 3, 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   406
				gc.drawPoint(clArea.width - 2, 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   407
				gc.drawPoint(clArea.width - 1, 2);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   408
				gc.drawPoint(clArea.width - 1, 3);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   409
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   410
				/* Fill Bottom Left */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   411
				gc.drawPoint(2, clArea.height - 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   412
				gc.drawPoint(3, clArea.height - 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   413
				gc.drawPoint(1, clArea.height - 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   414
				gc.drawPoint(0, clArea.height - 2);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   415
				gc.drawPoint(0, clArea.height - 3);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   416
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   417
				/* Fill Bottom Right */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   418
				gc.drawPoint(clArea.width - 4, clArea.height - 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   419
				gc.drawPoint(clArea.width - 3, clArea.height - 0);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   420
				gc.drawPoint(clArea.width - 2, clArea.height - 1);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   421
				gc.drawPoint(clArea.width - 1, clArea.height - 2);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   422
				gc.drawPoint(clArea.width - 1, clArea.height - 3);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   423
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   424
		});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   425
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   426
		GridLayout layout = new GridLayout(1, false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   427
		layout.marginWidth = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   428
		layout.marginHeight = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   429
		layout.verticalSpacing = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   430
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   431
		outerCircle.setLayout(layout);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   432
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   433
		/* Title area containing label and close button */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   434
		final Composite titleCircle = new Composite(outerCircle, SWT.NO_FOCUS);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   435
		titleCircle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   436
		titleCircle.setBackgroundMode(SWT.INHERIT_FORCE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   437
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   438
		layout = new GridLayout(4, false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   439
		layout.marginWidth = 3;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   440
		layout.marginHeight = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   441
		layout.verticalSpacing = 5;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   442
		layout.horizontalSpacing = 3;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   443
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   444
		titleCircle.setLayout(layout);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   445
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   446
		/* Create Title Area */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   447
		createTitleArea(titleCircle);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   448
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   449
		/* Outer composite to hold content controlls */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   450
		Composite outerContentCircle = new Composite(outerCircle, SWT.NONE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   451
		outerContentCircle.setBackgroundMode(SWT.INHERIT_FORCE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   452
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   453
		layout = new GridLayout(1, false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   454
		layout.marginWidth = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   455
		layout.marginHeight = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   456
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   457
		outerContentCircle.setLayout(layout);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   458
		outerContentCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   459
		outerContentCircle.setBackground(outerCircle.getBackground());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   460
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   461
		/* Middle composite to show a 1px black line around the content controls */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   462
		Composite middleContentCircle = new Composite(outerContentCircle, SWT.NO_FOCUS);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   463
		middleContentCircle.setBackgroundMode(SWT.INHERIT_FORCE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   464
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   465
		layout = new GridLayout(1, false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   466
		layout.marginWidth = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   467
		layout.marginHeight = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   468
		layout.marginTop = 1;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   469
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   470
		middleContentCircle.setLayout(layout);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   471
		middleContentCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   472
		middleContentCircle.setBackground(color.getBorder());
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   473
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   474
		/* Inner composite containing the content controls */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   475
		Composite innerContent = new Composite(middleContentCircle, SWT.NO_FOCUS);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   476
		innerContent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   477
		innerContent.setBackgroundMode(SWT.INHERIT_FORCE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   478
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   479
		layout = new GridLayout(1, false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   480
		layout.marginWidth = 0;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   481
		layout.marginHeight = 5;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   482
		layout.marginLeft = 5;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   483
		layout.marginRight = 5;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   484
		innerContent.setLayout(layout);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   485
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   486
		innerContent.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   487
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   488
		/* Content Area */
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   489
		createContentArea(innerContent);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   490
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   491
		setNullBackground(outerCircle);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   492
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   493
		return outerCircle;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   494
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   495
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   496
	private void setNullBackground(final Composite outerCircle) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   497
		for (Control c : outerCircle.getChildren()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   498
			c.setBackground(null);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   499
			if (c instanceof Composite) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   500
				setNullBackground((Composite) c);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   501
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   502
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   503
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   504
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   505
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   506
	protected void initializeBounds() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   507
		Rectangle clArea = getPrimaryClientArea();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   508
		Point initialSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   509
		int height = Math.max(initialSize.y, MIN_HEIGHT);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   510
		int width = Math.min(initialSize.x, MAX_WIDTH);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   511
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   512
		Point size = new Point(width, height);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   513
		shell.setLocation(clArea.width + clArea.x - size.x - PADDING_EDGE, clArea.height + clArea.y - size.y
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   514
				- PADDING_EDGE);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   515
		shell.setSize(size);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   516
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   517
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   518
	private Rectangle getPrimaryClientArea() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   519
		Monitor primaryMonitor = shell.getDisplay().getPrimaryMonitor();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   520
		return (primaryMonitor != null) ? primaryMonitor.getClientArea() : shell.getDisplay().getClientArea();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   521
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   522
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   523
	public void closeFade() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   524
		if (fadeJob != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   525
			fadeJob.cancelAndWait(false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   526
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   527
		fadeJob = SwtUtil.fadeOut(getShell(), new IFadeListener() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   528
			public void faded(Shell shell, int alpha) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   529
				if (!shell.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   530
					if (alpha == 0) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   531
						shell.close();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   532
					} else if (isMouseOver(shell)) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   533
						if (fadeJob != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   534
							fadeJob.cancelAndWait(false);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   535
						}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   536
						fadeJob = SwtUtil.fastFadeIn(shell, new IFadeListener() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   537
							public void faded(Shell shell, int alpha) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   538
								if (shell.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   539
									return;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   540
								}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   541
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   542
								if (alpha == 255) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   543
									scheduleAutoClose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   544
								}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   545
							}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   546
						});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   547
					}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   548
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   549
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   550
		});
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   551
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   552
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   553
	@Override
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   554
	public boolean close() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   555
		resources.dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   556
		if (lastUsedRegion != null) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   557
			lastUsedRegion.dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   558
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   559
		if (lastUsedBgImage != null && !lastUsedBgImage.isDisposed()) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   560
			lastUsedBgImage.dispose();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   561
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   562
		return super.close();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   563
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   564
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   565
	public long getDelayClose() {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   566
		return delayClose;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   567
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   568
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   569
	public void setDelayClose(long delayClose) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   570
		this.delayClose = delayClose;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   571
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   572
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   573
	private Point fixupDisplayBounds(Point tipSize, Point location) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   574
		if (respectDisplayBounds) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   575
			Rectangle bounds;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   576
			Point rightBounds = new Point(tipSize.x + location.x, tipSize.y + location.y);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   577
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   578
			if (respectMonitorBounds) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   579
				bounds = shell.getDisplay().getPrimaryMonitor().getBounds();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   580
			} else {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   581
				bounds = getPrimaryClientArea();
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   582
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   583
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   584
			if (!(bounds.contains(location) && bounds.contains(rightBounds))) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   585
				if (rightBounds.x > bounds.x + bounds.width) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   586
					location.x -= rightBounds.x - (bounds.x + bounds.width);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   587
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   588
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   589
				if (rightBounds.y > bounds.y + bounds.height) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   590
					location.y -= rightBounds.y - (bounds.y + bounds.height);
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   591
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   592
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   593
				if (location.x < bounds.x) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   594
					location.x = bounds.x;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   595
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   596
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   597
				if (location.y < bounds.y) {
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   598
					location.y = bounds.y;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   599
				}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   600
			}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   601
		}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   602
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   603
		return location;
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   604
	}
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   605
e84724c7f393 copy in required mylyn code
dadubrow
parents:
diff changeset
   606
}