blob: d6ff4f0eca761758b656cede24c2ac834b800354 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Lucas Koehler - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.fx.internal.projects;
import java.util.Arrays;
import java.util.List;
import javax.swing.text.html.ImageView;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.emfstore.client.ESRemoteProject;
import org.eclipse.emf.emfstore.client.ESServer;
import org.eclipse.emf.emfstore.client.ESUsersession;
import org.eclipse.emf.emfstore.client.ESWorkspace;
import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
import org.eclipse.emf.emfstore.client.observer.ESLogoutObserver;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.server.EMFStoreController;
import org.eclipse.emf.emfstore.internal.server.exceptions.FatalESException;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.VBoxBuilder;
import javafx.stage.Modality;
import javafx.stage.Stage;
public final class ESRemoteProjectTreeCell extends TreeCell<Object> {
private static List<String> localURLs = Arrays.asList("localhost", "127.0.0.1");
private class LoginHandler implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent t) {
final ESServer server = (ESServer) getTreeItem().getValue();
String password = null;
String user = null;
if (server.getLastUsersession() != null) {
password = server.getLastUsersession().getPassword();
user = server.getLastUsersession().getUsername();
}
if (password == null || password.isEmpty() || user == null
|| user.isEmpty()) {
final LoginStage stage = new LoginStage(server.getLastUsersession());
stage.showAndWait();
if (stage.getPassword() == null) {
return;
}
user = stage.getName();
password = stage.getPassword();
try {
final ESUsersession login = server.login(user, password);
login.setSavePassword(stage.isSavePassword());
} catch (final ESException e) {
showError(e);
}
} else {
try {
server.getLastUsersession().refresh();
} catch (final ESException e) {
showError(e);
}
}
}
}
private class LogoutHandler implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent t) {
final ESServer server = (ESServer) getTreeItem().getValue();
try {
server.getLastUsersession().logout();
} catch (final ESException e) {
showError(e);
}
}
}
private class CheckoutNameStage extends Stage {
private String result;
CheckoutNameStage() {
super();
initModality(Modality.WINDOW_MODAL);
setTitle("Enter Name for LocalProject");
final TextField tf = new TextField();
final Button button = new Button("Create");
button.setMaxWidth(Double.MAX_VALUE);
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
result = tf.getText();
close();
}
});
setScene(new Scene(VBoxBuilder.create().children(tf, button)
.build()));
}
}
private final ContextMenu remoteProjectMenu = new ContextMenu();
private final ContextMenu serverMenu = new ContextMenu();
private final BooleanProperty loggedIn = new SimpleBooleanProperty(false);
// private ContextMenu serverMenu = new ContextMenu();
@SuppressWarnings("restriction")
public ESRemoteProjectTreeCell() {
{
final MenuItem addServerMenuItem = new MenuItem();
final ImageView image = new ImageView(Activator.getContext().getBundle()
.getResource("icons/server_add.png").toExternalForm());
addServerMenuItem.setGraphic(HBoxBuilder.create()
.alignment(Pos.CENTER_LEFT)
.children(image, new Label("Add Server")).build());
remoteProjectMenu.getItems().add(addServerMenuItem);
serverMenu.getItems().add(addServerMenuItem);
}
{
final MenuItem addMenuItem = new MenuItem();
final ImageView image = new ImageView(Activator.getContext().getBundle()
.getResource("icons/checkout.png").toExternalForm());
addMenuItem.setGraphic(new HBox(image, new Label("Checkout")));
remoteProjectMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
final ESRemoteProject remoteProject = (ESRemoteProject) getTreeItem()
.getValue();
final CheckoutNameStage stage = new CheckoutNameStage();
stage.showAndWait();
if (stage.result == null) {
return;
}
try {
remoteProject.checkout(stage.result, remoteProject
.getServer().getLastUsersession(),
new NullProgressMonitor());
} catch (final ESException e) {
showError(e);
}
}
});
}
ESWorkspaceProviderImpl.getObserverBus().register(
new ESLoginObserver() {
@Override
public void loginCompleted(ESUsersession session) {
if (!getItem().equals(session.getServer())) {
return;
}
loggedIn.set(true);
}
});
ESWorkspaceProviderImpl.getObserverBus().register(
new ESLogoutObserver() {
@Override
public void logoutCompleted(ESUsersession session) {
if (!getItem().equals(session.getServer())) {
return;
}
loggedIn.set(false);
}
});
}
private void showError(Exception e) {
final Stage errorStage = new Stage();
errorStage.initModality(Modality.WINDOW_MODAL);
errorStage.setTitle("Error");
errorStage.setScene(new Scene(VBoxBuilder.create().children(new Label(e.getMessage()))
.build()));
errorStage.showAndWait();
}
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
String cellText = null;
Node graphics = null;
if (ESWorkspace.class.isInstance(item)) {
cellText = "Known Server";
// Label label = new Label("Known Server");
// ImageView image = new
// ImageView(Activator.getContext().getBundle().getResource("icons/remoteProject.png").toExternalForm());
// graphics = HBoxBuilder.create().alignment(Pos.CENTER_LEFT)
// .children(label).build();
} else if (ESRemoteProject.class.isInstance(item)) {
cellText = ESRemoteProject.class.cast(item).getProjectName();
graphics = new ImageView(Activator.getContext()
.getBundle().getResource("icons/remoteProject.png")
.toExternalForm());
// graphics = HBoxBuilder.create().alignment(Pos.CENTER_LEFT)
// .children(image, label).build();
setContextMenu(remoteProjectMenu);
} else if (ESServer.class.isInstance(item)) {
final ESServer server = (ESServer) item;
{
cellText = server.getName() + "("
+ server.getURL() + ":" + server.getPort() + ")";
graphics = new ImageView(Activator.getContext()
.getBundle().getResource("icons/server.png")
.toExternalForm());
// graphics = HBoxBuilder.create().alignment(Pos.CENTER_LEFT)
// .children(image, label).build();
}
if (localURLs.contains(server.getURL()) && EMFStoreController.getInstance() == null) {
final MenuItem startServerItem = new MenuItem();
final ImageView image = new ImageView(Activator.getContext()
.getBundle().getResource("icons/server_go.png")
.toExternalForm());
startServerItem.setGraphic(HBoxBuilder.create()
.alignment(Pos.CENTER_LEFT)
.children(image, new Label("Start Server")).build());
serverMenu.getItems().add(0, startServerItem);
startServerItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
try {
EMFStoreController.runAsNewThread();
startServerItem.setVisible(false);
} catch (final FatalESException ex) {
showError(ex);
}
}
});
}
{
final MenuItem logInItem = new MenuItem();
final ImageView image = new ImageView(Activator.getContext()
.getBundle().getResource("icons/logIn.png")
.toExternalForm());
logInItem.setGraphic(HBoxBuilder.create()
.alignment(Pos.CENTER_LEFT)
.children(image, new Label("Login")).build());
serverMenu.getItems().add(logInItem);
logInItem.setOnAction(new LoginHandler());
logInItem.visibleProperty().bind(loggedIn.not());
}
{
final MenuItem logOutItem = new MenuItem();
final ImageView image = new ImageView(Activator.getContext()
.getBundle().getResource("icons/logOut.png")
.toExternalForm());
logOutItem.setGraphic(HBoxBuilder.create()
.alignment(Pos.CENTER_LEFT)
.children(image, new Label("Logout")).build());
serverMenu.getItems().add(logOutItem);
logOutItem.setOnAction(new LogoutHandler());
logOutItem.visibleProperty().bind(loggedIn);
}
if (server.getLastUsersession() != null) {
loggedIn.set(server.getLastUsersession().isLoggedIn());
}
setContextMenu(serverMenu);
}
// if (graphics != null)
setGraphic(graphics);
setText(cellText);
}
}
}