blob: 32ea7a23691ad54b18e62311055a1f3dfb72e99d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.notifications.ui.popup;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.LegacyActionTools;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.mylyn.commons.notifications.core.AbstractNotification;
import org.eclipse.mylyn.commons.notifications.ui.AbstractUiNotification;
import org.eclipse.mylyn.commons.ui.compatibility.CommonColors;
import org.eclipse.mylyn.commons.workbench.AbstractWorkbenchNotificationPopup;
import org.eclipse.mylyn.commons.workbench.forms.CommonFormUtil;
import org.eclipse.mylyn.commons.workbench.forms.ScalingHyperlink;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
/**
* @author Rob Elves
* @author Mik Kersten
*/
public class NotificationPopup extends AbstractWorkbenchNotificationPopup {
private static final int NUM_NOTIFICATIONS_TO_DISPLAY = 4;
private List<AbstractNotification> notifications;
public NotificationPopup(Shell parent) {
super(parent.getDisplay());
}
@Override
protected void createContentArea(Composite parent) {
int count = 0;
for (final AbstractNotification notification : notifications) {
Composite notificationComposite = new Composite(parent, SWT.NO_FOCUS);
GridLayout gridLayout = new GridLayout(2, false);
GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(notificationComposite);
notificationComposite.setLayout(gridLayout);
notificationComposite.setBackground(parent.getBackground());
if (count < NUM_NOTIFICATIONS_TO_DISPLAY) {
final Label notificationLabelIcon = new Label(notificationComposite, SWT.NO_FOCUS);
notificationLabelIcon.setBackground(parent.getBackground());
if (notification instanceof AbstractUiNotification) {
notificationLabelIcon.setImage(((AbstractUiNotification) notification).getNotificationKindImage());
}
// FIXME
// if (!(notification instanceof TaskListNotificationReminder)) {
// final AbstractTask task = (AbstractTask) notification.getAdapter(AbstractTask.class);
// if (task != null) {
// notificationLabelIcon.addMouseListener(new MouseAdapter() {
// @Override
// public void mouseUp(MouseEvent e) {
// TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
// notificationLabelIcon.setImage(null);
// notificationLabelIcon.setToolTipText(null);
// }
// });
// notificationLabelIcon.setToolTipText(Messages.TaskListNotificationPopup_Mark_Task_Read);
// }
// }
// FIXME
// final TaskScalingHyperlink itemLink = new TaskScalingHyperlink(notificationComposite, SWT.BEGINNING
// | SWT.NO_FOCUS);
final ScalingHyperlink itemLink = new ScalingHyperlink(notificationComposite, SWT.BEGINNING
| SWT.NO_FOCUS);
GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(itemLink);
itemLink.setForeground(CommonColors.HYPERLINK_WIDGET);
itemLink.registerMouseTrackListener();
itemLink.setText(LegacyActionTools.escapeMnemonics(notification.getLabel()));
if (notification instanceof AbstractUiNotification) {
itemLink.setImage(((AbstractUiNotification) notification).getNotificationImage());
}
itemLink.setBackground(parent.getBackground());
itemLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
if (notification instanceof AbstractUiNotification) {
((AbstractUiNotification) notification).open();
}
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
Shell windowShell = window.getShell();
if (windowShell != null) {
if (windowShell.getMinimized()) {
windowShell.setMinimized(false);
}
windowShell.open();
windowShell.forceActive();
}
}
}
});
String descriptionText = null;
if (notification.getDescription() != null) {
descriptionText = notification.getDescription();
}
if (descriptionText != null && !descriptionText.trim().equals("")) { //$NON-NLS-1$
Label descriptionLabel = new Label(notificationComposite, SWT.NO_FOCUS);
descriptionLabel.setText(LegacyActionTools.escapeMnemonics(descriptionText));
descriptionLabel.setBackground(parent.getBackground());
GridDataFactory.fillDefaults()
.span(2, SWT.DEFAULT)
.grab(true, false)
.align(SWT.FILL, SWT.TOP)
.applyTo(descriptionLabel);
}
} else {
int numNotificationsRemain = notifications.size() - count;
ScalingHyperlink remainingLink = new ScalingHyperlink(notificationComposite, SWT.NO_FOCUS);
remainingLink.setForeground(CommonColors.HYPERLINK_WIDGET);
remainingLink.registerMouseTrackListener();
remainingLink.setBackground(parent.getBackground());
remainingLink.setText(NLS.bind("{0} more", numNotificationsRemain)); //$NON-NLS-1$
GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).applyTo(remainingLink);
remainingLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
// FIXME
// TasksUiUtil.openTasksViewInActivePerspective().setFocus();
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
Shell windowShell = window.getShell();
if (windowShell != null) {
windowShell.setMaximized(true);
windowShell.open();
}
}
}
});
break;
}
count++;
}
}
@Override
protected void createTitleArea(Composite parent) {
super.createTitleArea(parent);
}
public List<AbstractNotification> getNotifications() {
return new ArrayList<AbstractNotification>(notifications);
}
@Override
protected Color getTitleForeground() {
return CommonFormUtil.getSharedColors().getColor(IFormColors.TITLE);
}
public void setContents(List<AbstractNotification> notifications) {
this.notifications = notifications;
}
}