/******************************************************************************* * Copyright (c) 2016 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.ide.ui.utils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import melnorme.util.swt.SWTFactoryUtil; import melnorme.utilbox.fields.validation.IDetailsMessage; import melnorme.utilbox.misc.StringUtil; import melnorme.utilbox.status.StatusException; public class StatusMessageDialogExt extends StatusMessageDialog2 { public StatusMessageDialogExt(Shell shell, String title, StatusException statusMessage) { super(shell, title, statusMessage); } @Override protected IconAndMessageWidget createIconAndMessageWidget() { return new IconAndMessageWidgetExt(); } /** * Extension to {@link IconAndMessageWidget}, allows displaying additional info from {@link IDetailsMessage} * in a control with links in texts. */ public static class IconAndMessageWidgetExt extends IconAndMessageWidget { protected Link helpControl; @Override protected void createMessageControl(Composite topControl) { super.createMessageControl(topControl); if(statusMessage instanceof IDetailsMessage) { IDetailsMessage detailsMessage = (IDetailsMessage) statusMessage; createDetailsMessage(topControl, detailsMessage); } } protected void createDetailsMessage(Composite topControl, IDetailsMessage detailsMessage) { if(!detailsMessage.getDetailsMessage2().isPresent()) { return; } String additionalMessage = "\n" + detailsMessage.getDetailsMessage2().get(); helpControl = SWTFactoryUtil.createLink(topControl, SWT.WRAP, additionalMessage, gdfFillDefaults().grab(true, true).span(2, 1).create() ); helpControl.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String uri = e.text; if(uri.startsWith("http")) { Program.launch(uri); } else if(uri.startsWith("pref:")) { String prefId = StringUtil.removeStart("pref:", uri); WorkbenchUtils.openPreferencePage(helpControl.getShell(), prefId); } else { UIOperationsStatusHandler.handleInternalError("Unknown link URI:\n" + uri, null); } } }); } public Link getHelpControl() { return helpControl; } } }