/******************************************************************************* * Copyright (c) 2010 Neil Bartlett. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Neil Bartlett - initial API and implementation *******************************************************************************/ package bndtools.utils; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.PopupDialog; import org.eclipse.jface.preference.JFacePreferences; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; 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.ui.IWorkbenchPart; import org.eclipse.ui.forms.HyperlinkGroup; import org.eclipse.ui.forms.HyperlinkSettings; import org.eclipse.ui.forms.IMessage; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.plugin.AbstractUIPlugin; import bndtools.Plugin; public class MessagesPopupDialog extends PopupDialog { private final Control controlAttachment; private final IMessage[] messages; private final IWorkbenchPart part; private final HyperlinkGroup hyperlinkGroup; private final Image bulletImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/bullet_go.png").createImage(); public MessagesPopupDialog(Control controlAttachment, IMessage[] messages, IWorkbenchPart part) { super(null, PopupDialog.INFOPOPUP_SHELLSTYLE, true, false, false, false, false, null, null); this.controlAttachment = controlAttachment; this.messages = messages; this.part = part; this.hyperlinkGroup = new HyperlinkGroup(controlAttachment.getDisplay()); this.hyperlinkGroup.setHyperlinkUnderlineMode(HyperlinkSettings.UNDERLINE_ALWAYS); } @Override public boolean close() { boolean result = super.close(); bulletImg.dispose(); return result; } @SuppressWarnings("unused") @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); composite.setLayout(new GridLayout(1, false)); for (int i = 0; i < messages.length; i++) { if (i > 0) { Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); separator.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 2, 1)); } // Message Type Image Label Composite pnlTitle = new Composite(composite, SWT.NONE); pnlTitle.setLayout(new GridLayout(2, false)); Label lblImage = new Label(pnlTitle, SWT.NONE); lblImage.setImage(getMessageImage(messages[i].getMessageType())); // Message Label StringBuilder builder = new StringBuilder(); if (messages[i].getPrefix() != null) { builder.append(messages[i].getPrefix()); } builder.append(messages[i].getMessage()); Label lblText = new Label(pnlTitle, SWT.WRAP); lblText.setText(builder.toString()); lblText.setFont(JFaceResources.getFontRegistry().getItalic(JFaceResources.DIALOG_FONT)); lblText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Fix actions, if present Object data = messages[i].getData(); IAction[] fixes; if (data instanceof IAction) { fixes = new IAction[] { (IAction) data }; } else if (data instanceof IAction[]) { fixes = (IAction[]) data; } else { fixes = null; } if (fixes != null) { // new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); Composite pnlFixes = new Composite(composite, SWT.NONE); pnlFixes.setLayout(new GridLayout(3, false)); Label lblFixes = new Label(pnlFixes, SWT.NONE); lblFixes.setText("Available Fixes:"); lblFixes.setForeground(JFaceResources.getColorRegistry().get(JFacePreferences.QUALIFIER_COLOR)); for (int j = 0; j < fixes.length; j++) { if (j > 0) new Label(pnlFixes, SWT.NONE); // Spacer new Label(pnlFixes, SWT.NONE).setImage(bulletImg); final IAction fix = fixes[j]; Hyperlink fixLink = new Hyperlink(pnlFixes, SWT.NONE); hyperlinkGroup.add(fixLink); fixLink.setText(fix.getText()); fixLink.setHref(fix); fixLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { fix.run(); close(); // part.getSite().getPage().activate(part); part.setFocus(); } }); fixLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); } } } return composite; } @Override protected Point getInitialSize() { return super.getInitialSize(); } @Override protected Point getInitialLocation(Point initialSize) { Rectangle linkBounds = controlAttachment.getBounds(); linkBounds = controlAttachment.getDisplay().map(controlAttachment.getParent(), null, linkBounds); return new Point(linkBounds.x, linkBounds.y + linkBounds.height); } static Image getMessageImage(int messageType) { switch (messageType) { case IMessageProvider.INFORMATION : return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO); case IMessageProvider.WARNING : return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING); case IMessageProvider.ERROR : return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR); default : return null; } } }