From 5ba3a5897509312b0f0485adfeb573cf63ba92de Mon Sep 17 00:00:00 2001 From: Vitaliy Guliy Date: Tue, 1 Mar 2016 15:21:12 +0200 Subject: [PATCH] CHE-388 Don't use ugly browser prompt box to display 'Go to line' dialog window Signed-off-by: Vitaliy Guliy --- .../part/editor/EditorPartStackPresenter.java | 15 ++--- .../ide/part/editor/EditorPartStackView.java | 8 +-- .../widgets/editortab/EditorTabWidget.java | 4 +- .../dialogs/input/InputDialogPresenter.java | 14 ++--- .../org/eclipse/che/ide/ui/window/View.java | 4 ++ .../rename/JavaRefactoringRename.java | 3 +- .../orion/client/OrionEditorExtension.java | 5 +- .../orion/client/OrionEditorWidget.java | 58 +++++++++++++++++++ .../code_edit/built-codeEdit-amd.js | 31 ++++++++-- 9 files changed, 108 insertions(+), 34 deletions(-) diff --git a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java index b4655b48a9..64c0496696 100644 --- a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java +++ b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackPresenter.java @@ -101,15 +101,6 @@ public class EditorPartStackPresenter extends PartStackPresenter implements Edit eventBus.addHandler(CloseNonPinnedEditorsEvent.getType(), this); } - private void removeItemFromList(@NotNull TabItem tab) { - ListItem listItem = getListItemByTab(tab); - - if (listItem != null) { - listButton.removeListItem(listItem); - items.remove(listItem); - } - } - @Nullable private ListItem getListItemByTab(@NotNull TabItem tabItem) { for (Entry entry : items.entrySet()) { @@ -217,9 +208,11 @@ public class EditorPartStackPresenter extends PartStackPresenter implements Edit /** {@inheritDoc} */ @Override public void onTabClose(@NotNull TabItem tab) { - removeItemFromList(tab); + ListItem listItem = getListItemByTab(tab); + listButton.removeListItem(listItem); + items.remove(listItem); - eventBus.fireEvent(new FileEvent(((EditorTab)tab).getFile(), CLOSE)); + eventBus.fireEvent(new FileEvent(((EditorTab) tab).getFile(), CLOSE)); } /** {@inheritDoc} */ diff --git a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java index 94ea28d327..fd1802f789 100644 --- a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java +++ b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorPartStackView.java @@ -35,7 +35,6 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.NoSuchElementException; import static com.google.gwt.dom.client.Style.Display.BLOCK; import static com.google.gwt.dom.client.Style.Display.NONE; @@ -198,11 +197,10 @@ public class EditorPartStackView extends ResizeComposite implements PartStackVie tabs.remove(presenter); contents.remove(presenter); - try { - PartPresenter activePart = contents.getLast(); - selectTab(activePart); - } catch (NoSuchElementException exception) { + if (contents.isEmpty()) { getElement().getParentElement().getStyle().setDisplay(NONE); + } else { + selectTab(contents.getLast()); } //this hack need to force redraw dom element to apply correct styles diff --git a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/widgets/editortab/EditorTabWidget.java b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/widgets/editortab/EditorTabWidget.java index f879186eb8..1c8cf9a312 100644 --- a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/widgets/editortab/EditorTabWidget.java +++ b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/widgets/editortab/EditorTabWidget.java @@ -108,7 +108,6 @@ public class EditorTabWidget extends Composite implements EditorTab, ContextMenu closeButton.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - EditorTabWidget.this.eventBus.fireEvent(new FileEvent(EditorTabWidget.this.file, FileEvent.FileOperation.CLOSE)); delegate.onTabClose(EditorTabWidget.this); } }, ClickEvent.getType()); @@ -142,7 +141,8 @@ public class EditorTabWidget extends Composite implements EditorTab, ContextMenu if (part instanceof EditorPartPresenter) { VirtualFile changedFile = ((EditorPartPresenter)part).getEditorInput().getFile(); FileType fileType = fileTypeRegistry.getFileTypeByFile(changedFile); - iconPanel.setWidget(new SVGImage(fileType.getSVGImage())); + icon = fileType.getSVGImage(); + iconPanel.setWidget(getIcon()); } } diff --git a/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/dialogs/input/InputDialogPresenter.java b/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/dialogs/input/InputDialogPresenter.java index c38544c70f..d6173c380e 100644 --- a/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/dialogs/input/InputDialogPresenter.java +++ b/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/dialogs/input/InputDialogPresenter.java @@ -74,17 +74,17 @@ public class InputDialogPresenter implements InputDialog, InputDialogView.Action @Override public void cancelled() { - this.view.closeDialog(); - if (this.cancelCallback != null) { - this.cancelCallback.cancelled(); + view.closeDialog(); + if (cancelCallback != null) { + cancelCallback.cancelled(); } } @Override public void accepted() { - this.view.closeDialog(); - if (this.inputCallback != null) { - this.inputCallback.accepted(view.getValue()); + view.closeDialog(); + if (inputCallback != null) { + inputCallback.accepted(view.getValue()); } } @@ -103,7 +103,7 @@ public class InputDialogPresenter implements InputDialog, InputDialogView.Action @Override public void show() { isInputValid(); - this.view.showDialog(); + view.showDialog(); } @Override diff --git a/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/View.java b/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/View.java index 101ceec8fd..3522d27748 100644 --- a/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/View.java +++ b/core/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/View.java @@ -137,10 +137,14 @@ class View extends Composite { @Override public void onKeyDown(KeyDownEvent event) { if (KeyboardEvent.KeyCode.ESC == event.getNativeEvent().getKeyCode()) { + event.stopPropagation(); + event.preventDefault(); if (delegate != null) { delegate.onEscapeKey(); } } else if (KeyboardEvent.KeyCode.ENTER == event.getNativeEvent().getKeyCode()) { + event.stopPropagation(); + event.preventDefault(); if (delegate != null) { delegate.onEnterKey(); } diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/rename/JavaRefactoringRename.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/rename/JavaRefactoringRename.java index b10d51bf33..f55cff4044 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/rename/JavaRefactoringRename.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/rename/JavaRefactoringRename.java @@ -162,7 +162,8 @@ public class JavaRefactoringRename implements FileEventHandler { @Override public void onFileOperation(FileEvent event) { - if (event.getOperationType() == CLOSE && textEditor.getDocument().getFile().getPath().equals(event.getFile().getPath())) { + if (event.getOperationType() == CLOSE && textEditor != null && textEditor.getDocument() != null && + textEditor.getDocument().getFile().getPath().equals(event.getFile().getPath())) { isActiveLinkedEditor = false; } } diff --git a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorExtension.java b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorExtension.java index 54ce1b949d..6064a90f85 100644 --- a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorExtension.java +++ b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorExtension.java @@ -18,7 +18,6 @@ import com.google.gwt.core.client.JsArrayString; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.LinkElement; -import com.google.gwt.dom.client.Node; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -94,6 +93,7 @@ public class OrionEditorExtension implements Provider{ }); } }); + // must not be delayed registerEditor(); KeyMode.init(); @@ -131,6 +131,7 @@ public class OrionEditorExtension implements Provider{ initializationFailed(callback, "Failed to inject Orion editor", e); } }, scripts, new String[0]); + injectCssLink(GWT.getModuleBaseForStaticFiles() + "built-codeEdit-10.0/code_edit/built-codeEdit.css"); } @@ -154,9 +155,7 @@ public class OrionEditorExtension implements Provider{ public void onSuccess(final JavaScriptObject[] result) { //use 4th element as keybinding module keyBindingModule = result[3].cast(); - endConfiguration(callback); - } }, new String[]{"orion/codeEdit", diff --git a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorWidget.java b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorWidget.java index 93da95c28d..a2d3631109 100644 --- a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorWidget.java +++ b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorWidget.java @@ -96,6 +96,7 @@ import org.eclipse.che.ide.jseditor.client.texteditor.CompositeEditorWidget; import org.eclipse.che.ide.jseditor.client.texteditor.ContentInitializedHandler; import org.eclipse.che.ide.jseditor.client.texteditor.EditorWidget; import org.eclipse.che.ide.jseditor.client.texteditor.LineStyler; +import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.util.browser.UserAgent; import org.eclipse.che.ide.util.loging.Log; @@ -130,6 +131,7 @@ public class OrionEditorWidget extends CompositeEditorWidget implements HasChang private final JavaScriptObject uiUtilsOverlay; private final KeymapPrefReader keymapPrefReader; private final ContentAssistWidgetFactory contentAssistWidgetFactory; + private final DialogFactory dialogFactory; @UiField SimplePanel panel; @@ -169,6 +171,7 @@ public class OrionEditorWidget extends CompositeEditorWidget implements HasChang final KeymapPrefReader keymapPrefReader, final Provider keyBindingModuleProvider, final ContentAssistWidgetFactory contentAssistWidgetFactory, + final DialogFactory dialogFactory, @Assisted final List editorModes, @Assisted final WidgetInitializedCallback widgetInitializedCallback) { this.keyBindingModuleProvider = keyBindingModuleProvider; @@ -176,6 +179,7 @@ public class OrionEditorWidget extends CompositeEditorWidget implements HasChang this.moduleHolder = moduleHolder; this.keyModeInstances = keyModeInstances; this.eventBus = eventBus; + this.dialogFactory = dialogFactory; initWidget(UIBINDER.createAndBindUi(this)); this.keymapPrefReader = keymapPrefReader; @@ -193,6 +197,8 @@ public class OrionEditorWidget extends CompositeEditorWidget implements HasChang codeEditWidgetModule.createEditorView(panel.getElement(), JavaScriptObject.createObject()) .then(new EditorViewCreatedOperation(widgetInitializedCallback)); + + registerPromptFunction(); } private static JavaScriptObject getEditorSettings() { @@ -801,4 +807,56 @@ public class OrionEditorWidget extends CompositeEditorWidget implements HasChang widgetInitializedCallback.initialized(OrionEditorWidget.this); } } + + /** + * Registers global prompt function to be accessible directly from JavaScript. + * + * Function promptIDE(title, text, defaultValue, callback) + * title Dialog title + * text The text to display in the dialog box + * defaultValue The default value + * callback function(value) + * clicking "OK" will return input value + * clicking "Cancel" will return null + */ + private native void registerPromptFunction() /*-{ + if (!$wnd["promptIDE"]) { + var instance = this; + $wnd["promptIDE"] = function(title, text, defaultValue, callback) { + instance.@org.eclipse.che.ide.editor.orion.client.OrionEditorWidget::askLineNumber(*)(title, text, defaultValue, callback); + }; + } + }-*/; + + /** + * Custom callback to pass given value to native javascript function. + */ + private class InputCallback implements org.eclipse.che.ide.ui.dialogs.InputCallback { + + private JavaScriptObject callback; + + public InputCallback(JavaScriptObject callback) { + this.callback = callback; + } + + @Override + public native void accepted(String value) /*-{ + var callback = this.@org.eclipse.che.ide.editor.orion.client.OrionEditorWidget.InputCallback::callback; + callback(value); + }-*/; + + }; + + private void askLineNumber(String title, String text, String defaultValue, final JavaScriptObject callback) { + if (defaultValue == null) { + defaultValue = ""; + } else { + // It's strange situation defaultValue.length() returns 'undefined' but must return a number. + // Reinitialise the variable resolves the problem. + defaultValue = "" + defaultValue; + } + + dialogFactory.createInputDialog(title, text, defaultValue, 0, defaultValue.length(), new InputCallback(callback), null).show(); + } + } diff --git a/plugins/plugin-orion/che-plugin-orion-editor/src/main/resources/org/eclipse/che/ide/editor/orion/public/built-codeEdit-10.0/code_edit/built-codeEdit-amd.js b/plugins/plugin-orion/che-plugin-orion-editor/src/main/resources/org/eclipse/che/ide/editor/orion/public/built-codeEdit-10.0/code_edit/built-codeEdit-amd.js index e9a4b5ee84..0bc28f2da3 100644 --- a/plugins/plugin-orion/che-plugin-orion-editor/src/main/resources/org/eclipse/che/ide/editor/orion/public/built-codeEdit-10.0/code_edit/built-codeEdit-amd.js +++ b/plugins/plugin-orion/che-plugin-orion-editor/src/main/resources/org/eclipse/che/ide/editor/orion/public/built-codeEdit-10.0/code_edit/built-codeEdit-amd.js @@ -35907,14 +35907,35 @@ define('orion/editorCommands',[ var line; var editor = this.editor || that.editor; var model = editor.getModel(); + if (data.parameters && data.parameters.valueFor('line')) { //$NON-NLS-0$ line = data.parameters.valueFor('line'); //$NON-NLS-0$ - } else { - line = model.getLineAtOffset(editor.getCaretOffset()); - line = prompt(messages.gotoLinePrompt, line + 1); if (line) { - line = parseInt(line, 10); + editor.onGotoLine(line - 1, 0); } + return; + } + + line = model.getLineAtOffset(editor.getCaretOffset()); + + // try to use promptIDE(title, text, defaultValue, callback) function + if (window["promptIDE"]) { + window["promptIDE"](messages.gotoLineTooltip, messages.gotoLinePrompt, line + 1, + function(value) { + if (value) { + value = parseInt(value, 10); + } + if (value) { + editor.onGotoLine(value - 1, 0); + } + }); + return; + } + + // use browser based + line = prompt(messages.gotoLinePrompt, line + 1); + if (line) { + line = parseInt(line, 10); } if (line) { editor.onGotoLine(line - 1, 0); @@ -42268,4 +42289,4 @@ define('embeddedEditor/builder/embeddedEditor',[ }); return CodeEdit; }); -define('orion/codeEdit', ['embeddedEditor/builder/embeddedEditor'], function(p) { return p; }); \ No newline at end of file +define('orion/codeEdit', ['embeddedEditor/builder/embeddedEditor'], function(p) { return p; });