// COPIED from spring-ide org.springframework.ide.eclipse.ui.SpringUIUtils /******************************************************************************* * Copyright (c) 2012 Pivotal Software, Inc. * 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: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springsource.ide.eclipse.commons.ui; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.IWebBrowser; import org.eclipse.ui.browser.IWorkbenchBrowserSupport; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.browser.WebBrowserPreference; import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport; import org.eclipse.ui.internal.dialogs.PropertyDialog; import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager; import org.eclipse.ui.internal.dialogs.PropertyPageManager; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.wst.sse.core.StructuredModelManager; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.springsource.ide.eclipse.commons.internal.ui.UiPlugin; /** * This is a collection of UI-related helper methods. * @author Torsten Juergeleit * @author Christian Dupuis */ @SuppressWarnings("restriction") public final class SpringUIUtils { /** * Returns the standard display to be used. The method first checks, if the * thread calling this method has an associated display. If so, this display * is returned. Otherwise the method returns the default display. */ public static Display getStandardDisplay() { Display display = Display.getCurrent(); if (display == null) { display = Display.getDefault(); } return display; } /** * Returns a button with the given label and selection listener. */ public static Button createButton(Composite parent, String labelText, SelectionListener listener) { return createButton(parent, labelText, listener, 0, true); } /** * Returns a button with the given label, indentation, enablement and * selection listener. */ public static Button createButton(Composite parent, String labelText, SelectionListener listener, int indentation, boolean enabled) { Button button = new Button(parent, SWT.PUSH); button.setFont(parent.getFont()); button.setText(labelText); button.addSelectionListener(listener); button.setEnabled(enabled); FontMetrics fontMetrics = getFontMetrics(button); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH); gd.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); gd.horizontalIndent = indentation; button.setLayoutData(gd); return button; } /** * Returns a check box with the given label. */ public static Button createCheckBox(Composite parent, String labelText) { Button button = new Button(parent, SWT.CHECK); button.setFont(parent.getFont()); button.setText(labelText); button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); return button; } /** * Returns a text field with the given label. */ public static Text createTextField(Composite parent, String labelText) { return createTextField(parent, labelText, 0, 0, 0); } /** * Returns a text field with the given label and horizontal indentation. */ public static Text createTextField(Composite parent, String labelText, int indentation) { return createTextField(parent, labelText, indentation, 0, 0); } /** * Returns a text field with the given label, horizontal indentation and * width hint. */ public static Text createTextField(Composite parent, String labelText, int indentation, int textWidth) { return createTextField(parent, labelText, indentation, textWidth, 0); } /** * Returns a text field with the given label, horizontal indentation and * label and text width hint. */ public static Text createTextField(Composite parent, String labelText, int indentation, int textWidth, int labelWidth) { Composite textArea = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginWidth = 0; textArea.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalIndent = indentation; textArea.setLayoutData(gd); Label label = new Label(textArea, SWT.NONE); label.setText(labelText); label.setFont(parent.getFont()); if (labelWidth > 0) { gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.widthHint = labelWidth; label.setLayoutData(gd); } Text text = new Text(textArea, SWT.BORDER | SWT.SINGLE); text.setFont(parent.getFont()); if (textWidth > 0) { gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.widthHint = textWidth; } else { gd = new GridData(GridData.FILL_HORIZONTAL); } text.setLayoutData(gd); return text; } /** * Returns the font metrics for given control. */ public static FontMetrics getFontMetrics(Control control) { FontMetrics fontMetrics = null; GC gc = new GC(control); try { gc.setFont(control.getFont()); fontMetrics = gc.getFontMetrics(); } finally { gc.dispose(); } return fontMetrics; } /** * Displays specified preferences or property page and returns * <code>true</code> if <code>PreferenceDialog.OK</code> was selected. */ public static boolean showPreferenceDialog(String propertyPageId, IProject project, Map<String, Object> data) { IPreferenceNode targetNode = null; PropertyPageManager pageManager = new PropertyPageManager(); PropertyPageContributorManager.getManager().contribute(pageManager, project); IPreferenceNode[] nodes = pageManager.getRootSubNodes(); for (IPreferenceNode node : nodes) { // Was SpringPreferencePage.ID if ("org.springframework.ide.eclipse.ui.projectPropertyPage".equals(node.getId())) { targetNode = node; break; } } if (targetNode != null) { return openPreferenceNode(propertyPageId, targetNode, "Properties for " + project.getName(), project, data); } return false; } private static boolean openPreferenceNode(final String propertyPageId, final IPreferenceNode targetNode, final String title, Object element, Map<String, Object> data) { PreferenceManager manager = new PreferenceManager(); manager.addToRoot(targetNode); final PropertyDialog dialog = new PropertyDialog(UiPlugin.getActiveWorkbenchShell(), manager, new StructuredSelection(element)); if (propertyPageId != null) { dialog.setSelectedNode(propertyPageId); } if (data != null) { dialog.setPageData(data); } final boolean[] result = new boolean[] { false }; BusyIndicator.showWhile(getStandardDisplay(), new Runnable() { public void run() { dialog.create(); dialog.setMessage(targetNode.getLabelText()); dialog.getShell().setText(title); result[0] = (dialog.open() == Window.OK); } }); return result[0]; } public static IEditorPart getActiveEditor() { IWorkbenchWindow window = UiPlugin.getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page = window.getActivePage(); if (page != null) { return page.getActiveEditor(); } } return null; } /** * Returns the <code>ITextEditor</code> instance for given * <code>IEditorPart</code> or <code>null</code> for any non text editor. */ public static ITextEditor getTextEditor(IEditorPart part) { if (part instanceof ITextEditor) { return (ITextEditor) part; } else if (part instanceof IAdaptable) { return (ITextEditor) ((IAdaptable) part).getAdapter(ITextEditor.class); } return null; } public static void revealInEditor(IEditorPart editor, int line) { ITextEditor textEditor = getTextEditor(editor); if (textEditor != null && line > 0) { IDocumentProvider provider = textEditor.getDocumentProvider(); IEditorInput input = editor.getEditorInput(); try { provider.connect(input); } catch (CoreException e) { return; } IDocument document = provider.getDocument(input); try { IRegion lineRegion = document.getLineInformation(line - 1); textEditor.selectAndReveal(lineRegion.getOffset(), lineRegion.getLength()); } catch (BadLocationException e) { // ignore if specified line is not available in document } provider.disconnect(input); } } public static IEditorPart openInEditor(IFile file, int line) { return openInEditor(file, line, true); } /** * Opens given file in associated editor and go to specified line (if > 0). */ public static IEditorPart openInEditor(IFile file, int line, boolean activate) { IEditorPart editor = null; IWorkbenchPage page = UiPlugin.getActiveWorkbenchPage(); try { if (line > 0) { editor = IDE.openEditor(page, file, activate); ITextEditor textEditor = null; if (editor instanceof ITextEditor) { textEditor = (ITextEditor) editor; } else if (editor instanceof IAdaptable) { textEditor = (ITextEditor) ((IAdaptable) editor).getAdapter(ITextEditor.class); } if (textEditor != null) { IDocument document = textEditor.getDocumentProvider().getDocument(editor.getEditorInput()); try { int start = document.getLineOffset(line - 1); textEditor.selectAndReveal(start, 0); page.activate(editor); } catch (BadLocationException x) { // ignore } } else { IMarker marker = file.createMarker(IMarker.TEXT); marker.setAttribute(IMarker.LINE_NUMBER, line); editor = IDE.openEditor(page, marker, activate); marker.delete(); } } else { editor = IDE.openEditor(page, file, activate); } } catch (CoreException e) { openError("Open Editor Problems", e.getMessage(), e); } return editor; } public static IEditorPart openInEditor(IEditorInput input, String editorId) { return openInEditor(input, editorId, true); } public static IEditorPart openInEditor(IEditorInput input, String editorId, boolean activate) { IWorkbenchPage page = UiPlugin.getActiveWorkbenchPage(); try { return page.openEditor(input, editorId, activate); } catch (PartInitException e) { openError("Open Editor Problems", e.getMessage(), e); } return null; } public static IEditorPart openInEditor(IJavaElement element) { try { IEditorPart editor = JavaUI.openInEditor(element); if (editor != null) { JavaUI.revealInEditor(editor, element); } return editor; } catch (PartInitException e) { openError("Open Editor Problems", e.getMessage(), e); } catch (JavaModelException e) { openError("Open Editor Problems", e.getMessage(), e); } return null; } public static int getCaretOffset(ITextEditor editor) { ISelection selection = editor.getSelectionProvider().getSelection(); if (selection instanceof ITextSelection) { return ((ITextSelection) selection).getOffset(); } return -1; } public static String getSelectedText(ITextEditor editor) { ISelection selection = editor.getSelectionProvider().getSelection(); if (selection instanceof ITextSelection) { return ((ITextSelection) selection).getText().trim(); } return null; } public static IProgressMonitor getStatusLineProgressMonitor() { IWorkbenchPage wbPage = UiPlugin.getActiveWorkbenchPage(); if (wbPage != null) { IEditorPart editor = wbPage.getActiveEditor(); if (editor != null) { IActionBars bars = editor.getEditorSite().getActionBars(); return bars.getStatusLineManager().getProgressMonitor(); } } return null; } /** * Open an error style dialog for a given <code>CoreException</code> by * including any extra information from a nested <code>CoreException</code>. */ public static void openError(String title, String message, CoreException exception) { Shell shell = UiPlugin.getActiveWorkbenchShell(); // Check for a nested CoreException CoreException nestedException = null; IStatus status = exception.getStatus(); if (status != null && status.getException() instanceof CoreException) { nestedException = (CoreException) status.getException(); } if (nestedException != null) { // Open an error dialog and include the extra // status information from the nested CoreException ErrorDialog.openError(shell, title, message, nestedException.getStatus()); } else { // Open a regular error dialog since there is no // extra information to display MessageDialog.openError(shell, title, message); } } public static IFile getFile(IStructuredDocument document) { if (document != null) { try { IStructuredModel model = StructuredModelManager.getModelManager().getModelForRead(document); IFile resource = null; try { String baselocation = model.getBaseLocation(); if (baselocation != null) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IPath filePath = new Path(baselocation); if (filePath.segmentCount() > 0) { resource = root.getFile(filePath); } } } finally { if (model != null) { model.releaseFromRead(); } } return resource; } catch (Exception e) { // Sometime WTP fails for no good reason } } // fall back IEditorPart editor = SpringUIUtils.getActiveEditor(); if (editor != null && editor.getEditorInput() instanceof IFileEditorInput) { return ((IFileEditorInput) editor.getEditorInput()).getFile(); } return null; } public static void openUrl(String location) { openUrl(location, 0); } private static void openUrl(String location, int customFlags) { try { URL url = null; if (location != null) { url = new URL(location); } if (WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL) { try { IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport(); support.getExternalBrowser().openURL(url); } catch (Exception e) { } } else { IWebBrowser browser = null; int flags = customFlags; if (WorkbenchBrowserSupport.getInstance().isInternalWebBrowserAvailable()) { flags |= IWorkbenchBrowserSupport.AS_EDITOR | IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR; } else { flags |= IWorkbenchBrowserSupport.AS_EXTERNAL | IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR; } String generatedId = UiPlugin.PLUGIN_ID + "-" + Calendar.getInstance().getTimeInMillis(); browser = WorkbenchBrowserSupport.getInstance().createBrowser(flags, generatedId, null, null); browser.openURL(url); } } catch (PartInitException e) { MessageDialog.openError(Display.getDefault().getActiveShell(), "Browser init error", "Browser could not be initiated"); } catch (MalformedURLException e) { } } }