/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.languageserver.ide.location;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
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.PromiseError;
import org.eclipse.che.ide.api.editor.text.TextPosition;
import org.eclipse.che.ide.api.editor.text.TextRange;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.api.notification.StatusNotification;
import org.eclipse.che.ide.api.parts.PartStackType;
import org.eclipse.che.ide.api.parts.WorkspaceAgent;
import org.eclipse.che.ide.api.parts.base.BasePresenter;
import org.eclipse.che.plugin.languageserver.ide.LanguageServerResources;
import org.eclipse.che.plugin.languageserver.ide.util.OpenFileInEditorHelper;
import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.Range;
import org.vectomatic.dom.svg.ui.SVGResource;
import java.util.List;
/**
* @author Evgen Vidolob
*/
public class OpenLocationPresenter extends BasePresenter implements OpenLocationView.ActionDelegate {
private final LanguageServerResources resources;
private final OpenLocationView view;
private final WorkspaceAgent workspaceAgent;
private final OpenFileInEditorHelper helper;
private final NotificationManager notificationManager;
private final String title;
@Inject
public OpenLocationPresenter(LanguageServerResources resources,
OpenLocationView view,
WorkspaceAgent workspaceAgent,
OpenFileInEditorHelper helper,
NotificationManager notificationManager,
@Assisted String title) {
this.resources = resources;
this.view = view;
this.workspaceAgent = workspaceAgent;
this.helper = helper;
this.notificationManager = notificationManager;
this.title = title;
view.setDelegate(this);
view.setTitle(title);
}
//TODO maybe we should use some generic data object not a DTO
public void openLocation(Promise<List<Location>> promise) {
promise.then(new Operation<List<Location>>() {
@Override
public void apply(List<Location> arg) throws OperationException {
showLocations(arg);
}
}).catchError(new Operation<PromiseError>() {
@Override
public void apply(PromiseError arg) throws OperationException {
showError(arg);
}
});
}
public void showError(PromiseError arg) {
notificationManager
.notify(title, arg.getMessage(), StatusNotification.Status.FAIL, StatusNotification.DisplayMode.FLOAT_MODE);
}
private void showLocations(List<Location> locations) {
view.setLocations(locations);
openPart();
}
@Override
public SVGResource getTitleImage() {
return resources.fieldItem();
}
@Override
public String getTitle() {
return title;
}
@Override
public IsWidget getView() {
return view;
}
@Override
public String getTitleToolTip() {
return null;
}
@Override
public void go(AcceptsOneWidget container) {
container.setWidget(view);
}
private void openPart() {
workspaceAgent.openPart(this, PartStackType.INFORMATION);
workspaceAgent.setActivePart(this);
}
@Override
public void onLocationSelected(Location location) {
Range range = location.getRange();
helper.openFile(location.getUri(), new TextRange(new TextPosition(
range.getStart().getLine(),
range.getStart().getCharacter()), new TextPosition(range.getEnd().getLine(), range.getEnd().getCharacter())));
}
}