Chromium Code Reviews| 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..ed50d3acb9dc27e72b5c4c68a87ded550a8e8276 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_COMPLILE_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_MOVE_CARET); |
| + 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$ |
|
apavlov
2013/01/22 06:38:10
Is it by chance a list... argument?
Peter Rybin
2013/01/22 16:28:59
No
|
| + compileError.getCompilerMessage(), start.getLine(), start.getColumn() }); |
| + } |
| + }); |
| + return NLS.bind(Messages.LiveEditResultDialog_FAILURE, message); |
| } |
| public String visitSuccess(SuccessResult successResult) { |
| return Messages.LiveEditResultDialog_OK; |