/*******************************************************************************
* 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.ide.workspace.create;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.machine.shared.dto.recipe.RecipeDescriptor;
import org.eclipse.che.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.ui.window.Window;
import org.eclipse.che.ide.workspace.WorkspaceWidgetFactory;
import org.eclipse.che.ide.workspace.create.recipewidget.RecipeWidget;
import java.util.ArrayList;
import java.util.List;
/**
* The class contains business logic which allows to set up special parameters for creating user workspaces.
*
* @author Dmitry Shnurenko
*/
@Singleton
class CreateWorkspaceViewImpl extends Window implements CreateWorkspaceView, RecipeWidget.ActionDelegate {
interface CreateWorkspaceViewImplUiBinder extends UiBinder<Widget, CreateWorkspaceViewImpl> {
}
private static final CreateWorkspaceViewImplUiBinder UI_BINDER = GWT.create(CreateWorkspaceViewImplUiBinder.class);
private static final int BORDER_WIDTH = 1;
private final WorkspaceWidgetFactory tagFactory;
private final PopupPanel popupPanel;
private final FlowPanel tagsPanel;
private final HidePopupCallBack hidePopupCallBack;
private ActionDelegate delegate;
private Button createButton;
private boolean isPredefinedRecipe;
@UiField(provided = true)
final CoreLocalizationConstant locale;
@UiField
TextBox wsName;
@UiField
TextBox recipeURL;
@UiField
Label recipeUrlError;
@UiField
TextBox tags;
@UiField
Label tagsError;
@UiField
Label nameError;
@UiField
TextBox predefinedRecipes;
@Inject
public CreateWorkspaceViewImpl(CoreLocalizationConstant locale,
org.eclipse.che.ide.Resources resources,
WorkspaceWidgetFactory tagFactory,
FlowPanel tagsPanel) {
this.locale = locale;
this.tagFactory = tagFactory;
this.tagsPanel = tagsPanel;
this.tagsPanel.setStyleName(resources.coreCss().tagsPanel());
this.popupPanel = new PopupPanel(true);
this.popupPanel.setStyleName(resources.coreCss().createWsTagsPopup());
this.popupPanel.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
popupPanel.hide();
}
}, ClickEvent.getType());
this.hidePopupCallBack = new HidePopupCallBack() {
@Override
public void hidePopup() {
popupPanel.hide();
}
};
setWidget(UI_BINDER.createAndBindUi(this));
setTitle(locale.createWsTitle());
wsName.setText(locale.createWsDefaultName());
predefinedRecipes.getElement().setPropertyString("placeholder", locale.placeholderChoosePredefined());
recipeURL.getElement().setPropertyString("placeholder", locale.placeholderInputRecipeUrl());
tags.getElement().setPropertyString("placeholder", locale.placeholderFindByTags());
createButton = createButton(locale.createWsButton(), "create-workspace-button", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
delegate.onCreateButtonClicked();
}
});
addButtonToFooter(createButton);
}
/** {@inheritDoc} */
@Override
public void setWorkspaceName(String name) {
wsName.setText(name);
}
/** {@inheritDoc} */
@Override
public String getRecipeUrl() {
return recipeURL.getText();
}
/** {@inheritDoc} */
@Override
public List<String> getTags() {
List<String> tagList = new ArrayList<>();
for (String tag : tags.getValue().split(" ")) {
if (!tag.isEmpty()) {
tagList.add(tag.trim());
}
}
return tagList;
}
/** {@inheritDoc} */
@Override
public String getWorkspaceName() {
return wsName.getText();
}
/** {@inheritDoc} */
@Override
public void showFoundByTagRecipes(List<RecipeDescriptor> recipes) {
addRecipesToPanel(recipes);
int xPanelCoordinate = tags.getAbsoluteLeft() + BORDER_WIDTH;
int yPanelCoordinate = tags.getAbsoluteTop() + tags.getOffsetHeight();
popupPanel.setPopupPosition(xPanelCoordinate, yPanelCoordinate);
popupPanel.show();
}
private void addRecipesToPanel(List<RecipeDescriptor> recipes) {
tagsPanel.clear();
for (RecipeDescriptor descriptor : recipes) {
RecipeWidget tag = tagFactory.create(descriptor);
tag.setDelegate(this);
tagsPanel.add(tag);
}
popupPanel.setWidget(tagsPanel);
}
/** {@inheritDoc} */
@Override
public void showPredefinedRecipes(List<RecipeDescriptor> recipes) {
addRecipesToPanel(recipes);
int xPanelCoordinate = predefinedRecipes.getAbsoluteLeft() + BORDER_WIDTH;
int yPanelCoordinate = predefinedRecipes.getAbsoluteTop() + predefinedRecipes.getOffsetHeight();
popupPanel.setPopupPosition(xPanelCoordinate, yPanelCoordinate);
popupPanel.show();
}
/** {@inheritDoc} */
@Override
public void onTagClicked(RecipeWidget tag) {
recipeURL.setText(tag.getRecipeUrl());
predefinedRecipes.setText(isPredefinedRecipe ? tag.getTagName() : "");
tags.setText("");
delegate.onRecipeUrlChanged();
}
/** {@inheritDoc} */
@Override
public void setVisibleUrlError(boolean visible) {
recipeUrlError.setVisible(visible);
}
/** {@inheritDoc} */
@Override
public void setVisibleTagsError(boolean visible) {
tagsError.setVisible(visible);
}
/** {@inheritDoc} */
@Override
public void showValidationNameError(String error) {
boolean isErrorExist = !error.isEmpty();
nameError.setVisible(isErrorExist);
nameError.setText(error);
}
/** {@inheritDoc} */
@Override
public void setEnableCreateButton(boolean visible) {
createButton.setEnabled(visible);
}
@UiHandler("tags")
public void onTagsChanged(@SuppressWarnings("UnusedParameters") KeyUpEvent event) {
tagsChangedAction();
}
private void tagsChangedAction() {
String tag = tags.getText();
tagsError.setVisible(!tag.isEmpty());
if (!tag.isEmpty()) {
delegate.onTagsChanged(hidePopupCallBack);
}
isPredefinedRecipe = false;
}
@UiHandler("tags")
public void onTagsClicked(@SuppressWarnings("UnusedParameters") ClickEvent event) {
tagsChangedAction();
}
@UiHandler("recipeURL")
public void onRecipeUrlChanged(@SuppressWarnings("UnusedParameters") KeyUpEvent event) {
delegate.onRecipeUrlChanged();
}
@UiHandler("wsName")
public void onWorkspaceNameChanged(@SuppressWarnings("UnusedParameters") KeyUpEvent event) {
delegate.onNameChanged();
}
@UiHandler("wsName")
public void onNameFieldFocused(@SuppressWarnings("UnusedParameters") ClickEvent event) {
delegate.onNameChanged();
}
@UiHandler("predefinedRecipes")
public void onPredefineRecipesClicked(@SuppressWarnings("UnusedParameters") ClickEvent event) {
delegate.onPredefinedRecipesClicked();
isPredefinedRecipe = true;
}
/** {@inheritDoc} */
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
}