From 20d596648cb1bf4bf0ab092a9832a034fdb73791 Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Fri, 15 Sep 2017 15:44:17 +0000 Subject: [PATCH] Fix and improve some actions (#6287) CHE-6287: Fix and improve some actions --- .../che/ide/actions/OpenFileAction.java | 115 +++++++++--------- .../project/ProjectExplorerPresenter.java | 5 + .../action/RevealResourceAction.java | 22 +++- .../che/ide/ui/smartTree/TreeView.java | 5 + 4 files changed, 85 insertions(+), 62 deletions(-) diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/OpenFileAction.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/OpenFileAction.java index 6d3303041d..147e19e4cc 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/OpenFileAction.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/OpenFileAction.java @@ -10,18 +10,17 @@ */ package org.eclipse.che.ide.actions; +import static java.lang.Integer.parseInt; import static org.eclipse.che.api.promises.client.callback.CallbackPromiseHelper.createFromCallback; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.FLOAT_MODE; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL; -import com.google.common.base.Optional; import com.google.gwt.core.client.Callback; +import com.google.gwt.user.client.Timer; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.event.shared.HandlerRegistration; -import org.eclipse.che.api.promises.client.Operation; -import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.callback.CallbackPromiseHelper.Call; import org.eclipse.che.api.promises.client.js.JsPromiseError; @@ -36,15 +35,11 @@ import org.eclipse.che.ide.api.editor.EditorPartPresenter; import org.eclipse.che.ide.api.editor.text.TextPosition; import org.eclipse.che.ide.api.editor.texteditor.TextEditor; import org.eclipse.che.ide.api.event.ActivePartChangedEvent; -import org.eclipse.che.ide.api.event.ActivePartChangedHandler; import org.eclipse.che.ide.api.notification.NotificationManager; -import org.eclipse.che.ide.api.resources.File; import org.eclipse.che.ide.resource.Path; import org.eclipse.che.ide.util.loging.Log; /** - * TODO maybe rename it to factory open file? - * * @author Sergii Leschenko * @author Vlad Zhukovskyi */ @@ -95,53 +90,58 @@ public class OpenFileAction extends Action implements PromisableAction { .getWorkspaceRoot() .getFile(pathToOpen) .then( - new Operation>() { - @Override - public void apply(Optional optionalFile) throws OperationException { - if (optionalFile.isPresent()) { - if (actionCompletedCallback != null) { - actionCompletedCallback.onSuccess(null); - } - - editorAgent.openEditor( - optionalFile.get(), - new EditorAgent.OpenEditorCallback() { - @Override - public void onEditorOpened(EditorPartPresenter editor) { - if (!(editor instanceof TextEditor)) { - return; - } - - try { - int lineNumber = - Integer.parseInt(event.getParameters().get(LINE_PARAM_ID)) - 1; - ((TextEditor) editor) - .getDocument() - .setCursorPosition(new TextPosition(lineNumber, 0)); - } catch (NumberFormatException e) { - Log.error(getClass(), localization.fileToOpenLineIsNotANumber()); - } - } - - @Override - public void onInitializationFailed() {} - - @Override - public void onEditorActivated(EditorPartPresenter editor) {} - }); - - } else { - if (actionCompletedCallback != null) { - actionCompletedCallback.onFailure(null); - } - - notificationManager.notify( - localization.unableOpenResource(pathToOpen), FAIL, FLOAT_MODE); + optionalFile -> { + if (optionalFile.isPresent()) { + if (actionCompletedCallback != null) { + actionCompletedCallback.onSuccess(null); } + + editorAgent.openEditor( + optionalFile.get(), + new EditorAgent.OpenEditorCallback() { + @Override + public void onEditorOpened(EditorPartPresenter editor) { + scrollToLine(editor, event.getParameters().get(LINE_PARAM_ID)); + } + + @Override + public void onInitializationFailed() {} + + @Override + public void onEditorActivated(EditorPartPresenter editor) { + scrollToLine(editor, event.getParameters().get(LINE_PARAM_ID)); + } + }); + + } else { + if (actionCompletedCallback != null) { + actionCompletedCallback.onFailure(null); + } + + notificationManager.notify( + localization.unableOpenResource(pathToOpen), FAIL, FLOAT_MODE); } }); } + private void scrollToLine(EditorPartPresenter editor, String lineParam) { + if (!(editor instanceof TextEditor)) { + return; + } + new Timer() { + @Override + public void run() { + try { + int lineNumber = parseInt(lineParam); + TextEditor textEditor = (TextEditor) editor; + textEditor.getDocument().setCursorPosition(new TextPosition(lineNumber - 1, 0)); + } catch (NumberFormatException e) { + Log.error(getClass(), localization.fileToOpenLineIsNotANumber()); + } + } + }.schedule(300); + } + @Override public Promise promise(final ActionEvent actionEvent) { if (actionEvent.getParameters() == null) { @@ -163,16 +163,13 @@ public class OpenFileAction extends Action implements PromisableAction { handlerRegistration = eventBus.addHandler( ActivePartChangedEvent.TYPE, - new ActivePartChangedHandler() { - @Override - public void onActivePartChanged(ActivePartChangedEvent event) { - if (event.getActivePart() instanceof EditorPartPresenter) { - EditorPartPresenter editor = (EditorPartPresenter) event.getActivePart(); - handlerRegistration.removeHandler(); - if (Path.valueOf(pathToOpen) - .equals(editor.getEditorInput().getFile().getLocation())) { - callback.onSuccess(null); - } + event -> { + if (event.getActivePart() instanceof EditorPartPresenter) { + EditorPartPresenter editor = (EditorPartPresenter) event.getActivePart(); + handlerRegistration.removeHandler(); + if (Path.valueOf(pathToOpen) + .equals(editor.getEditorInput().getFile().getLocation())) { + callback.onSuccess(null); } } }); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/explorer/project/ProjectExplorerPresenter.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/explorer/project/ProjectExplorerPresenter.java index e8d69fc355..9035ef54e6 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/explorer/project/ProjectExplorerPresenter.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/explorer/project/ProjectExplorerPresenter.java @@ -21,6 +21,7 @@ import static org.eclipse.che.ide.api.resources.ResourceDelta.UPDATED; import com.google.common.collect.Sets; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.inject.Inject; import com.google.inject.Provider; @@ -172,6 +173,10 @@ public class ProjectExplorerPresenter extends BasePresenter }); } + public void addSelectionHandler(SelectionHandler handler) { + getTree().getSelectionModel().addSelectionHandler(handler); + } + @Inject public void initFileWatchers() { final String endpointId = "ws-agent"; diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/action/RevealResourceAction.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/action/RevealResourceAction.java index 2f39baf988..37919fd597 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/action/RevealResourceAction.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/action/RevealResourceAction.java @@ -12,17 +12,20 @@ package org.eclipse.che.ide.resources.action; import static com.google.common.base.Preconditions.checkState; import static java.util.Collections.singletonList; +import static org.eclipse.che.ide.resource.Path.valueOf; import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID; import com.google.common.annotations.Beta; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; +import java.util.Map; import javax.validation.constraints.NotNull; import org.eclipse.che.ide.api.action.AbstractPerspectiveAction; import org.eclipse.che.ide.api.action.ActionEvent; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.resources.Resource; +import org.eclipse.che.ide.resource.Path; import org.eclipse.che.ide.resources.reveal.RevealResourceEvent; /** @@ -35,6 +38,8 @@ import org.eclipse.che.ide.resources.reveal.RevealResourceEvent; @Singleton public class RevealResourceAction extends AbstractPerspectiveAction { + private static final String PATH = "path"; + private final AppContext appContext; private final EventBus eventBus; @@ -57,10 +62,21 @@ public class RevealResourceAction extends AbstractPerspectiveAction { /** {@inheritDoc} */ @Override public void actionPerformed(ActionEvent e) { - final Resource[] resources = appContext.getResources(); + Map params = e.getParameters(); + String pathToReveal = params.get(PATH); - checkState(resources != null && resources.length == 1); + if (pathToReveal != null) { + Path path = valueOf(pathToReveal); - eventBus.fireEvent(new RevealResourceEvent(resources[0])); + checkState(!path.isEmpty()); + + eventBus.fireEvent(new RevealResourceEvent(path)); + } else { + final Resource[] resources = appContext.getResources(); + + checkState(resources != null && resources.length == 1); + + eventBus.fireEvent(new RevealResourceEvent(resources[0])); + } } } diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/smartTree/TreeView.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/smartTree/TreeView.java index 9c72df7235..f8fccf89b9 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/smartTree/TreeView.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/smartTree/TreeView.java @@ -211,6 +211,11 @@ public class TreeView { } Element rootContainer = getNodeContainer(node); + + if (rootContainer == null) { + return; + } + if (loading) { rootContainer.addClassName(tree.getTreeStyles().styles().loading()); } else {