| Index: plugins/org.chromium.debug.ui/src/org/chromium/debug/ui/liveedit/LiveEditResultDialog.java
|
| diff --git a/plugins/org.chromium.debug.ui/src/org/chromium/debug/ui/liveedit/LiveEditResultDialog.java b/plugins/org.chromium.debug.ui/src/org/chromium/debug/ui/liveedit/LiveEditResultDialog.java
|
| index befda61fbe65944c171571a355ed26c79bb4151e..5a2054233c3ee10008d51a180ed8249566120670 100644
|
| --- a/plugins/org.chromium.debug.ui/src/org/chromium/debug/ui/liveedit/LiveEditResultDialog.java
|
| +++ b/plugins/org.chromium.debug.ui/src/org/chromium/debug/ui/liveedit/LiveEditResultDialog.java
|
| @@ -16,6 +16,9 @@ import org.chromium.debug.ui.TableUtils.ColumnData;
|
| import org.chromium.debug.ui.TableUtils.TrivialAdapter;
|
| import org.chromium.debug.ui.TableUtils.ValueAdapter;
|
| import org.chromium.debug.ui.actions.ChooseVmControl;
|
| +import org.chromium.sdk.TextStreamPosition;
|
| +import org.chromium.sdk.UpdatableScript;
|
| +import org.chromium.sdk.UpdatableScript.CompileErrorFailure;
|
| import org.eclipse.jface.dialogs.Dialog;
|
| import org.eclipse.jface.dialogs.IDialogConstants;
|
| import org.eclipse.jface.viewers.IStructuredContentProvider;
|
| @@ -23,8 +26,12 @@ import org.eclipse.jface.viewers.TableViewer;
|
| import org.eclipse.jface.viewers.Viewer;
|
| import org.eclipse.osgi.util.NLS;
|
| import org.eclipse.swt.SWT;
|
| +import org.eclipse.swt.events.SelectionEvent;
|
| +import org.eclipse.swt.events.SelectionListener;
|
| import org.eclipse.swt.graphics.Image;
|
| 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;
|
| @@ -61,7 +68,7 @@ public class LiveEditResultDialog extends Dialog {
|
|
|
| public interface SingleInputVisitor<RES> {
|
| RES visitSuccess(SuccessResult successResult);
|
| - RES visitErrorMessage(String text);
|
| + RES visitErrorMessage(String message, UpdatableScript.Failure failure);
|
| }
|
|
|
| public interface MultipleResult {
|
| @@ -79,14 +86,26 @@ public class LiveEditResultDialog extends Dialog {
|
| String getOldScriptName();
|
| }
|
|
|
| + /**
|
| + * Allows dialog to highlight error in source text (presumably, in text editor).
|
| + */
|
| + public interface ErrorPositionHighlighter {
|
| + void highlight(int offset, int length);
|
| + }
|
| +
|
| public static SingleInput createTextInput(final String text,
|
| final PushChangesPlan changesPlan) {
|
| + return createTextInput(text, changesPlan, UpdatableScript.Failure.UNSPECIFIED);
|
| + }
|
| +
|
| + public static SingleInput createTextInput(final String text,
|
| + final PushChangesPlan changesPlan, final UpdatableScript.Failure failure) {
|
| return new LiveEditResultDialog.SingleInput() {
|
| public <RES> RES accept(LiveEditResultDialog.InputVisitor<RES> visitor) {
|
| return acceptSingle(visitor);
|
| }
|
| public <RES> RES acceptSingle(LiveEditResultDialog.SingleInputVisitor<RES> visitor) {
|
| - return visitor.visitErrorMessage(text);
|
| + return visitor.visitErrorMessage(text, failure);
|
| }
|
| public ScriptTargetMapping getFilePair() {
|
| return changesPlan.getScriptTargetMapping();
|
| @@ -95,16 +114,19 @@ public class LiveEditResultDialog extends Dialog {
|
| }
|
|
|
| private final Input input;
|
| + private final ErrorPositionHighlighter positionHighlighter;
|
|
|
| - public LiveEditResultDialog(Shell shell, Input input) {
|
| + public LiveEditResultDialog(Shell shell, Input input,
|
| + ErrorPositionHighlighter positionHighlighter) {
|
| super(shell);
|
| this.input = input;
|
| + this.positionHighlighter = positionHighlighter;
|
| }
|
|
|
| @Override
|
| protected boolean isResizable() {
|
| return true;
|
| -}
|
| + }
|
|
|
| @Override
|
| protected void configureShell(Shell shell) {
|
| @@ -123,9 +145,19 @@ public class LiveEditResultDialog extends Dialog {
|
| final Composite composite = (Composite) super.createDialogArea(parent);
|
|
|
| input.accept(new InputVisitor<Void>() {
|
| - public Void visitErrorMessage(String text) {
|
| - createErrorMessageControls(composite, text);
|
| - return null;
|
| + public Void visitErrorMessage(final String text, UpdatableScript.Failure failure) {
|
| + return failure.accept(new UpdatableScript.Failure.Visitor<Void>() {
|
| + @Override public Void visitUnspecified() {
|
| + createErrorMessageControls(composite, text);
|
| + return null;
|
| + }
|
| + @Override public Void visitCompileError(CompileErrorFailure compileError) {
|
| + createErrorWithPositionControls(composite, Messages.LiveEditResultDialog_COMPILE_ERROR,
|
| + compileError.getCompilerMessage(),
|
| + compileError.getStartPosition(), compileError.getEndPosition());
|
| + return null;
|
| + }
|
| + });
|
| }
|
| public Void visitSuccess(SuccessResult successResult) {
|
| createSuccessResultControls(composite, successResult);
|
| @@ -142,11 +174,64 @@ public class LiveEditResultDialog extends Dialog {
|
|
|
| private void createErrorMessageControls(Composite parent, String text) {
|
| Text textControl = new Text(parent, SWT.WRAP);
|
| - Display display = textControl.getDisplay();
|
| + Display display = parent.getDisplay();
|
| textControl.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
|
| textControl.setText(text);
|
| }
|
|
|
| + private void createErrorWithPositionControls(Composite parent, String localMessage,
|
| + String remoteMessage,
|
| + final TextStreamPosition startPosition,
|
| + TextStreamPosition endPosition) {
|
| + Display display = parent.getDisplay();
|
| +
|
| + Composite messageComposite;
|
| + {
|
| + messageComposite = new Composite(parent, SWT.NONE);
|
| + GridLayout gridLayout = new GridLayout(2, false);
|
| + messageComposite.setLayout(gridLayout);
|
| +
|
| + Label localMessageLabel = new Label(messageComposite, SWT.NONE);
|
| + localMessageLabel.setText(localMessage);
|
| + Text textControl = new Text(messageComposite, SWT.READ_ONLY);
|
| + textControl.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
|
| + textControl.setText(remoteMessage);
|
| + textControl.setEditable(false);
|
| + }
|
| +
|
| + Composite positionComposite;
|
| + {
|
| + positionComposite = new Composite(parent, SWT.NONE);
|
| + GridLayout gridLayout = new GridLayout(2, false);
|
| + positionComposite.setLayout(gridLayout);
|
| +
|
| + Label startLabel = new Label(positionComposite, SWT.NONE);
|
| + startLabel.setText(NLS.bind(Messages.LiveEditResultDialog_LINE_COLUMN,
|
| + startPosition.getLine(), startPosition.getColumn()));
|
| +
|
| + Button setPositionButton = new Button(positionComposite, SWT.NONE);
|
| + setPositionButton.setText(Messages.LiveEditResultDialog_SELECT_IN_EDITOR);
|
| + if (positionHighlighter == null) {
|
| + setPositionButton.setEnabled(false);
|
| + } else {
|
| + final int length;
|
| + if (endPosition == null) {
|
| + length = 0;
|
| + } else {
|
| + length = endPosition.getOffset() - startPosition.getOffset();
|
| + }
|
| + setPositionButton.addSelectionListener(new SelectionListener() {
|
| + @Override public void widgetSelected(SelectionEvent e) {
|
| + positionHighlighter.highlight(startPosition.getOffset(), length);
|
| + }
|
| + @Override public void widgetDefaultSelected(SelectionEvent e) {
|
| + widgetSelected(null);
|
| + }
|
| + });
|
| + }
|
| + }
|
| + }
|
| +
|
| private void createSuccessResultControls(Composite parent, SuccessResult successResult) {
|
| Label label1 = new Label(parent, SWT.NONE);
|
| label1.setText(Messages.LiveEditResultDialog_SUCCESS);
|
| @@ -246,8 +331,18 @@ public class LiveEditResultDialog extends Dialog {
|
| return statusCol;
|
| }
|
| private final SingleInputVisitor<String> textGetterVisitor = new SingleInputVisitor<String>() {
|
| - public String visitErrorMessage(String text) {
|
| - return NLS.bind(Messages.LiveEditResultDialog_FAILURE, text);
|
| + public String visitErrorMessage(final String text, UpdatableScript.Failure failure) {
|
| + String message = failure.accept(new UpdatableScript.Failure.Visitor<String>() {
|
| + @Override public String visitUnspecified() {
|
| + return text;
|
| + }
|
| + @Override public String visitCompileError(CompileErrorFailure compileError) {
|
| + TextStreamPosition start = compileError.getStartPosition();
|
| + return NLS.bind("{0} ({1}:{2})", new Object[] { //$NON-NLS-1$
|
| + compileError.getCompilerMessage(), start.getLine(), start.getColumn() });
|
| + }
|
| + });
|
| + return NLS.bind(Messages.LiveEditResultDialog_FAILURE, message);
|
| }
|
| public String visitSuccess(SuccessResult successResult) {
|
| return Messages.LiveEditResultDialog_OK;
|
|
|