/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.debug.ui.actions; import org.eclipse.debug.ui.DebugPopup; import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; import org.eclipse.jdt.internal.debug.ui.display.DisplayView; import org.eclipse.jdt.internal.debug.ui.display.IDataDisplay; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.texteditor.ITextEditor; public class PopupDisplayAction extends DisplayAction { public static final String ACTION_DEFINITION_ID = "org.eclipse.jdt.debug.ui.commands.Display"; //$NON-NLS-1$ private String snippet; private String resultString; private ITextEditor fTextEditor; private ISelection fSelectionBeforeEvaluation; public PopupDisplayAction() { super(); } private void showPopup(StyledText textWidget) { IWorkbenchPart part = getTargetPart(); if (part instanceof ITextEditor) { fTextEditor = (ITextEditor) part; fSelectionBeforeEvaluation = getTargetSelection(); } DebugPopup displayPopup = new DisplayPopup(getShell(), textWidget); displayPopup.open(); } private class DisplayPopup extends DebugPopup { public DisplayPopup(Shell shell, StyledText textWidget) { super(shell, getPopupAnchor(textWidget), ACTION_DEFINITION_ID); } @Override protected String getActionText() { return ActionMessages.PopupDisplayAction_2; } @Override protected void persist() { IDataDisplay directDisplay = getDirectDataDisplay(); Display display = JDIDebugUIPlugin.getStandardDisplay(); if (!display.isDisposed()) { IDataDisplay dataDisplay = getDataDisplay(); if (dataDisplay != null) { if (directDisplay == null) { dataDisplay.displayExpression(snippet); } dataDisplay.displayExpressionValue(resultString); } } } @Override protected Control createDialogArea(Composite parent) { GridData gd = new GridData(GridData.FILL_BOTH); StyledText text = new StyledText(parent, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL); text.setLayoutData(gd); text.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); text.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); text.setText(resultString); return text; } @Override public boolean close() { boolean returnValue = super.close(); if (fTextEditor != null && fSelectionBeforeEvaluation != null) { fTextEditor.getSelectionProvider().setSelection(fSelectionBeforeEvaluation); fTextEditor = null; fSelectionBeforeEvaluation = null; } return returnValue; } } @Override protected void displayStringResult(String currentSnippet, String currentResultString) { IWorkbenchPart part = getTargetPart(); if (part instanceof DisplayView) { super.displayStringResult(currentSnippet, currentResultString); return; } final StyledText textWidget = EvaluateAction.getStyledText(part); if (textWidget == null) { super.displayStringResult(currentSnippet, currentResultString); } else { snippet = currentSnippet; resultString = currentResultString; Display.getDefault().asyncExec(new Runnable() { @Override public void run() { showPopup(textWidget); } }); evaluationCleanup(); } } }