Fix and improve some actions (#6287)

CHE-6287: Fix and improve some actions
6.19.x
Oleksandr Andriienko 2017-09-15 15:44:17 +00:00 committed by Anatoliy Bazko
parent c9af56c9cd
commit 20d596648c
4 changed files with 85 additions and 62 deletions

View File

@ -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<Optional<File>>() {
@Override
public void apply(Optional<File> 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<Void> 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);
}
}
});

View File

@ -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<Node> handler) {
getTree().getSelectionModel().addSelectionHandler(handler);
}
@Inject
public void initFileWatchers() {
final String endpointId = "ws-agent";

View File

@ -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<String, String> 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]));
}
}
}

View File

@ -211,6 +211,11 @@ public class TreeView {
}
Element rootContainer = getNodeContainer(node);
if (rootContainer == null) {
return;
}
if (loading) {
rootContainer.addClassName(tree.getTreeStyles().styles().loading());
} else {