blob: a4aa2a2f30e157ffe275d6494f8409ffe836c316 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 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
* Itema AS - Refactored into commons
* Itema AS - Added configure button, bug #329897
*******************************************************************************/
package org.eclipse.mylyn.commons.workbench.forms;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.commons.ui.GradientCanvas;
import org.eclipse.mylyn.internal.commons.workbench.CommonsWorkbenchPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.FormColors;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
/**
* Control designed to display notification messages. These messages may contain links that can be clicked by the user.
*
* @since 3.7
* @author Robert Elves
* @author Steffen Pingel
* @author Torkild Ulvøy Resheim
*/
public abstract class MessageControl {
protected static Font setHeaderFontSizeAndStyle(Control text) {
float sizeFactor = 1.2f;
Font initialFont = text.getFont();
FontData[] fontData = initialFont.getFontData();
for (FontData element : fontData) {
element.setHeight((int) (element.getHeight() * sizeFactor));
element.setStyle(element.getStyle() | SWT.BOLD);
}
final Font textFont = new Font(text.getDisplay(), fontData);
text.setFont(textFont);
text.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
textFont.dispose();
}
});
Color color = CommonsWorkbenchPlugin.getDefault().getFormColors(text.getDisplay()).getColor(IFormColors.TITLE);
text.setForeground(color);
return textFont;
}
private ImageHyperlink closeLink;
private Link descriptionLabel;
private GradientCanvas head;
private GridData headData;
private Label imageLabel;
private final Composite parent;
private Label titleLabel;
private String eventId;
public MessageControl(Composite parent) {
this.parent = parent;
}
/**
* Disposes of the widget and performs a layout update.
*/
protected void close() {
if (head != null && !head.isDisposed()) {
head.dispose();
}
if (!parent.isDisposed()) {
parent.layout(true);
}
}
/**
* Returns <code>true</code> if the control has closed and is currently not showing any messages.
*
* @return <code>true</code> if the control is closed
*/
protected boolean isClosed() {
return (head == null || head.isDisposed());
}
/**
* Implement to handle the message control closing.
*/
protected abstract void closeMessage();
/**
* Returns the shell of the parent composite.
*
* @return the shell
*/
protected Shell getShell() {
return parent.getShell();
}
/**
* Creates the GUI of the service message control.
*
* @param parent
* the parent composite
* @return the control
*/
public Control createControl(Composite parent) {
FormColors colors = CommonsWorkbenchPlugin.getDefault().getFormColors(parent.getDisplay());
head = new GradientCanvas(parent, SWT.NONE);
GridLayout headLayout = new GridLayout();
headLayout.marginHeight = 0;
headLayout.marginWidth = 0;
headLayout.horizontalSpacing = 0;
headLayout.verticalSpacing = 0;
headLayout.numColumns = 1;
head.setLayout(headLayout);
headData = new GridData(SWT.FILL, SWT.TOP, true, false);
head.setLayoutData(headData);
Color top = colors.getColor(IFormColors.H_GRADIENT_END);
Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
head.setBackgroundGradient(new Color[] { bot, top }, new int[] { 100 }, true);
head.setSeparatorVisible(true);
head.setSeparatorAlignment(SWT.TOP);
head.putColor(IFormColors.H_BOTTOM_KEYLINE1, colors.getColor(IFormColors.H_BOTTOM_KEYLINE1));
head.putColor(IFormColors.H_BOTTOM_KEYLINE2, colors.getColor(IFormColors.H_BOTTOM_KEYLINE2));
head.putColor(IFormColors.H_HOVER_LIGHT, colors.getColor(IFormColors.H_HOVER_LIGHT));
head.putColor(IFormColors.H_HOVER_FULL, colors.getColor(IFormColors.H_HOVER_FULL));
head.putColor(IFormColors.TB_TOGGLE, colors.getColor(IFormColors.TB_TOGGLE));
head.putColor(IFormColors.TB_TOGGLE_HOVER, colors.getColor(IFormColors.TB_TOGGLE_HOVER));
TableWrapLayout layout = new TableWrapLayout();
layout.numColumns = 3;
head.setLayout(layout);
imageLabel = new Label(head, SWT.NONE);
titleLabel = new Label(head, SWT.NONE);
setHeaderFontSizeAndStyle(titleLabel);
Composite buttonsComp = new Composite(head, SWT.NONE);
TableWrapData data = new TableWrapData();
data.align = TableWrapData.RIGHT;
buttonsComp.setLayoutData(data);
GridLayout gLayout = new GridLayout(2, false);
gLayout.horizontalSpacing = 0;
gLayout.verticalSpacing = 0;
gLayout.marginHeight = 0;
gLayout.marginWidth = 0;
gLayout.verticalSpacing = 0;
buttonsComp.setLayout(gLayout);
createLinkControls(buttonsComp);
// spacer
new Label(head, SWT.NONE).setText(" "); //$NON-NLS-1$
descriptionLabel = new Link(head, SWT.WRAP);
descriptionLabel.addSelectionListener(getLinkListener());
data = new TableWrapData();
data.colspan = 2;
data.grabHorizontal = true;
descriptionLabel.setLayoutData(data);
return head;
}
protected void createLinkControls(Composite buttonsComp) {
closeLink = new ImageHyperlink(buttonsComp, SWT.NONE);
closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
// data = new TableWrapData();
// data.align = TableWrapData.RIGHT;
// closeLink.setLayoutData(data);
closeLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
closeMessage();
}
@Override
public void linkEntered(HyperlinkEvent e) {
closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE_HOVER));
}
@Override
public void linkExited(HyperlinkEvent e) {
closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
}
});
}
/**
* Must be implemented for custom handling of description links.
*
* @see #setDescription(String)
* @return the selection listener
*/
protected abstract SelectionListener getLinkListener();
protected void setDescription(String description) {
descriptionLabel.setText(description);
parent.layout(true, true);
}
/**
* Sets the title of the control.
*
* @param title
* the title to set
*/
protected void setTitle(String title) {
titleLabel.setText(title);
head.layout(true);
}
protected String getEventId() {
return eventId;
}
/**
* Sets the eventId of the message being displayed. How to handle certain kind of messages can be configured in
* preference settings if this property is set to a legal value. The event identifiers are declared using the
* <i>org.eclipse.mylyn.commons.notifications.notifications</i> extension point.
*
* @param eventId
* the event identifier for the displayed message
*/
protected void setEventId(String eventId) {
this.eventId = eventId;
}
/**
* Sets the title image of the control.
*
* @param image
* the title image
*/
protected void setTitleImage(Image image) {
imageLabel.setImage(image);
head.layout(true);
}
/**
* Creates the control unless the parent has been disposed.
*/
protected boolean ensureControl() {
if (parent.isDisposed()) {
return false;
}
if (head == null || head.isDisposed()) {
createControl(parent);
}
return true;
}
}