/*******************************************************************************
* 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.factory.configure;
import com.google.common.base.Strings;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.regexp.shared.RegExp;
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.Anchor;
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.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.CoreLocalizationConstant;
import org.eclipse.che.ide.factory.FactoryResources;
import org.eclipse.che.ide.ui.Tooltip;
import org.eclipse.che.ide.ui.menu.PositionController;
import org.eclipse.che.ide.ui.window.Window;
import org.eclipse.che.ide.ui.zeroclipboard.ClipboardButtonBuilder;
import javax.validation.constraints.NotNull;
import static com.google.gwt.dom.client.Style.Unit;
/**
* @author Anton Korneta
*/
@Singleton
public class CreateFactoryViewImpl extends Window implements CreateFactoryView {
private static final RegExp FACTORY_NAME_PATTERN = RegExp.compile("[^A-Za-z0-9_-]");
interface FactoryViewImplUiBinder extends UiBinder<Widget, CreateFactoryViewImpl> {
}
private final FactoryResources factoryResources;
private ActionDelegate delegate;
@UiField
FactoryResources.Style style;
@UiField
TextBox factoryName;
@UiField
TextBox factoryLink;
@UiField
Label factoryNameLabel;
@UiField
Label factoryLinkLabel;
@UiField
Label factoryNameErrorLabel;
@UiField
Button createFactoryButton;
@UiField
FlowPanel upperPanel;
@UiField
FlowPanel lowerPanel;
@UiField
FlowPanel createFactoryPanel;
@UiField
Anchor launch;
@UiField
Anchor configure;
private Tooltip labelsErrorTooltip;
@Inject
protected CreateFactoryViewImpl(FactoryViewImplUiBinder uiBinder,
CoreLocalizationConstant locale,
FactoryResources factoryResources,
ClipboardButtonBuilder buttonBuilder) {
this.factoryResources = factoryResources;
setTitle(locale.createFactoryTitle());
setWidget(uiBinder.createAndBindUi(this));
factoryNameLabel.setText(locale.createFactoryName());
factoryLinkLabel.setText(locale.createFactoryLink());
configure.getElement().insertFirst(factoryResources.configure().getSvg().getElement());
launch.getElement().insertFirst(factoryResources.execute().getSvg().getElement());
launch.addStyleName(style.launchIcon());
configure.addStyleName(style.configureIcon());
createFactoryButton.setEnabled(false);
Button cancelButton =
createButton(locale.createFactoryButtonClose(), "git-remotes-pull-cancel", event -> delegate.onCancelClicked());
createFactoryButton.addClickHandler(clickEvent -> delegate.onCreateClicked());
cancelButton.ensureDebugId("projectReadOnlyGitUrl-btnClose");
addButtonToFooter(cancelButton);
getWidget().getElement().getStyle().setPadding(0, Unit.PX);
buttonBuilder.withResourceWidget(factoryLink).build();
factoryLink.setReadOnly(true);
final Tooltip launchFactoryTooltip = Tooltip.create((elemental.dom.Element)launch.getElement(),
PositionController.VerticalAlign.TOP,
PositionController.HorizontalAlign.MIDDLE,
locale.createFactoryLaunchTooltip());
launchFactoryTooltip.setShowDelayDisabled(false);
final Tooltip configureFactoryTooltip = Tooltip.create((elemental.dom.Element)configure.getElement(),
PositionController.VerticalAlign.TOP,
PositionController.HorizontalAlign.MIDDLE,
locale.createFactoryConfigureTooltip());
configureFactoryTooltip.setShowDelayDisabled(false);
factoryName.getElement().setAttribute("placeholder", "new-factory-name");
}
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
@Override
public void showDialog() {
clear();
this.show();
}
@Override
public String getFactoryName() {
return factoryName.getText();
}
@Override
public void setAcceptFactoryLink(String acceptLink) {
factoryLink.setText(acceptLink);
launch.getElement().setAttribute("target", "_blank");
launch.setHref(acceptLink);
}
@Override
public void setConfigureFactoryLink(String configureLink) {
configure.getElement().setAttribute("target", "_blank");
configure.setHref(configureLink);
}
@Override
public void enableCreateFactoryButton(boolean enabled) {
createFactoryButton.setEnabled(enabled);
}
@Override
public void showFactoryNameError(@NotNull String labelMessage, @Nullable String tooltipMessage) {
factoryName.addStyleName(factoryResources.factoryCSS().inputError());
factoryNameErrorLabel.setText(labelMessage);
if (labelsErrorTooltip != null) {
labelsErrorTooltip.destroy();
}
if (!Strings.isNullOrEmpty(tooltipMessage)) {
labelsErrorTooltip = Tooltip.create((elemental.dom.Element)factoryNameErrorLabel.getElement(),
PositionController.VerticalAlign.TOP,
PositionController.HorizontalAlign.MIDDLE,
tooltipMessage);
labelsErrorTooltip.setShowDelayDisabled(false);
}
}
@Override
public void hideFactoryNameError() {
factoryName.removeStyleName(factoryResources.factoryCSS().inputError());
factoryNameErrorLabel.setText("");
}
@Override
public void close() {
this.hide();
}
@UiHandler({"factoryName"})
public void onProjectNameChanged(KeyUpEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER
&& createFactoryButton.isEnabled()) {
delegate.onCreateClicked();
} else {
String name = factoryName.getValue();
if (!Strings.isNullOrEmpty(name) && FACTORY_NAME_PATTERN.test(name)) {
name = name.replaceAll("[^A-Za-z0-9_]", "-");
factoryName.setValue(name);
}
delegate.onFactoryNameChanged(name);
}
}
private void clear() {
launch.getElement().removeAttribute("href");
configure.getElement().removeAttribute("href");
createFactoryButton.setEnabled(false);
factoryName.removeStyleName(factoryResources.factoryCSS().inputError());
factoryNameErrorLabel.setText("");
factoryName.setText("");
factoryLink.setText("");
}
}