/******************************************************************************* * 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.svn.ide.move; import com.google.common.collect.Sets; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; 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.CheckBox; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.DockLayoutPanel; 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.ide.api.data.tree.Node; import org.eclipse.che.ide.api.data.tree.settings.SettingsProvider; import org.eclipse.che.ide.api.resources.Project; import org.eclipse.che.ide.api.resources.Resource; import org.eclipse.che.ide.resources.tree.ContainerNode; import org.eclipse.che.ide.resources.tree.ResourceNode; import org.eclipse.che.ide.resources.tree.SkipHiddenNodesInterceptor; import org.eclipse.che.ide.resources.tree.SkipLeafsInterceptor; import org.eclipse.che.ide.ui.Tooltip; import org.eclipse.che.ide.ui.menu.PositionController; import org.eclipse.che.ide.ui.smartTree.NodeLoader; import org.eclipse.che.ide.ui.smartTree.NodeStorage; import org.eclipse.che.ide.ui.smartTree.SelectionModel; import org.eclipse.che.ide.ui.smartTree.Tree; import org.eclipse.che.ide.ui.window.Window; import org.eclipse.che.plugin.svn.ide.SubversionExtensionLocalizationConstants; import org.eclipse.che.plugin.svn.ide.SubversionExtensionResources; import org.vectomatic.dom.svg.OMSVGSVGElement; /** * Implementation of {@link MoveView}. * * @author Vladyslav Zhukovskyi */ @Singleton public class MoveViewImpl extends Window implements MoveView { interface MoveViewImplUiBinder extends UiBinder<Widget, MoveViewImpl> { } private static MoveViewImplUiBinder uiBinder = GWT.create(MoveViewImplUiBinder.class); Button btnMove; Button btnCancel; @UiField DockLayoutPanel treeContainer; @UiField CheckBox urlCheckBox; @UiField DeckPanel deckPanel; @UiField TextBox sourceUrlTextBox; @UiField TextBox targetUrlTextBox; @UiField TextBox commentTextBox; @UiField DockLayoutPanel newNamePanel; @UiField TextBox newNameTextBox; @UiField(provided = true) SubversionExtensionResources resources; @UiField(provided = true) SubversionExtensionLocalizationConstants constants; private final ResourceNode.NodeFactory nodeFactory; private final SettingsProvider settingsProvider; private MoveView.ActionDelegate delegate; private Tree tree; private OMSVGSVGElement alertMarker; private static final String PLACEHOLDER = "placeholder"; private static final String PLACEHOLDER_DUMMY = "https://subversion.site.com/svn/sht_site/trunk"; @Inject public MoveViewImpl(SubversionExtensionResources resources, SubversionExtensionLocalizationConstants constants, SkipHiddenNodesInterceptor skipHiddenNodesInterceptor, SkipLeafsInterceptor skipLeafsInterceptor, ResourceNode.NodeFactory nodeFactory, SettingsProvider settingsProvider) { this.resources = resources; this.constants = constants; this.nodeFactory = nodeFactory; this.settingsProvider = settingsProvider; this.ensureDebugId("svn-move-window"); this.setTitle(constants.moveViewTitle()); this.setWidget(uiBinder.createAndBindUi(this)); btnCancel = createButton(constants.buttonCancel(), "svn-move-cancel", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onCancelClicked(); } }); addButtonToFooter(btnCancel); btnMove = createButton(constants.moveButton(), "svn-move-move", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onMoveClicked(); } }); addButtonToFooter(btnMove); alertMarker = resources.alert().getSvg(); alertMarker.getStyle().setWidth(22, Style.Unit.PX); alertMarker.getStyle().setHeight(22, Style.Unit.PX); alertMarker.getStyle().setMargin(10, Style.Unit.PX); getFooter().getElement().appendChild(alertMarker.getElement()); alertMarker.getStyle().setVisibility(Style.Visibility.HIDDEN); tree = new Tree(new NodeStorage(), new NodeLoader(Sets.newHashSet(skipHiddenNodesInterceptor, skipLeafsInterceptor))); tree.getSelectionModel().setSelectionMode(SelectionModel.Mode.SINGLE); treeContainer.add(tree); sourceUrlTextBox.getElement().setAttribute(PLACEHOLDER, PLACEHOLDER_DUMMY); targetUrlTextBox.getElement().setAttribute(PLACEHOLDER, PLACEHOLDER_DUMMY); commentTextBox.getElement().setAttribute(PLACEHOLDER, "Comment..."); urlCheckBox.setValue(false, true); deckPanel.showWidget(0); } /** {@inheritDoc} */ @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } /** {@inheritDoc} */ @Override public void onClose() { hide(); } /** {@inheritDoc} */ @Override public void setProject(Project project) { final ContainerNode node = nodeFactory.newContainerNode(project, settingsProvider.getSettings()); tree.getNodeStorage().clear(); tree.getNodeStorage().add(node); tree.setExpanded(node, true); } /** {@inheritDoc} */ @Override public void showErrorMarker(String message) { alertMarker.getStyle().setVisibility(Style.Visibility.VISIBLE); Tooltip.create((elemental.dom.Element)alertMarker.getElement(), PositionController.VerticalAlign.TOP, PositionController.HorizontalAlign.MIDDLE, message); btnMove.setEnabled(false); } /** {@inheritDoc} */ @Override public void hideErrorMarker() { alertMarker.getStyle().setVisibility(Style.Visibility.HIDDEN); btnMove.setEnabled(true); } /** {@inheritDoc} */ @Override public boolean isURLSelected() { return urlCheckBox.getValue(); } /** {@inheritDoc} */ @Override public String getSourceUrl() { return sourceUrlTextBox.getText(); } /** {@inheritDoc} */ @Override public String getTargetUrl() { return targetUrlTextBox.getText(); } /** {@inheritDoc} */ @Override public Resource getDestinationNode() { final Node node = tree.getSelectionModel().getSelectedNodes().get(0); if (node instanceof ResourceNode) { return ((ResourceNode)node).getData(); } return null; } /** {@inheritDoc} */ @Override public void onShow(boolean singleSelectedItem) { newNamePanel.setVisible(singleSelectedItem); newNameTextBox.setText(null); show(); } /** {@inheritDoc} */ @Override public String getComment() { return commentTextBox.getText(); } @UiHandler({"sourceUrlTextBox", "targetUrlTextBox", "commentTextBox"}) @SuppressWarnings("unused") public void onUrlFieldsChanged(KeyUpEvent event) { delegate.onUrlsChanged(); } @UiHandler("urlCheckBox") @SuppressWarnings("unused") public void onUrlCheckBoxClicked(ClickEvent event) { if (isURLSelected()) { sourceUrlTextBox.setText(null); targetUrlTextBox.setText(null); delegate.onUrlsChanged(); deckPanel.showWidget(1); } else { btnMove.setEnabled(true); deckPanel.showWidget(0); } } }