/******************************************************************************* * 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.merge; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; 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.HasValue; 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.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.smartTree.event.SelectionChangedEvent; 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; import java.util.List; /** * An implementation of MergeView, represented as popup modal dialog. */ @Singleton public class MergeViewImpl extends Window implements MergeView { /** UI binder */ interface CopyViewImplUiBinder extends UiBinder<Widget, MergeViewImpl> { } /** UI binder instance */ private static CopyViewImplUiBinder uiBinder = GWT.create(CopyViewImplUiBinder.class); /** Localization constants. */ @UiField(provided = true) SubversionExtensionLocalizationConstants constants; /** Bundled resources. */ @UiField(provided = true) SubversionExtensionResources resources; /** Delegate to perform actions */ private ActionDelegate delegate; /** Target text box. */ @UiField TextBox targetTextBox; @UiField DeckPanel deckPanel; /** Source URL check box. */ @UiField CheckBox sourceURLCheckBox; /** Source URl text box. */ @UiField TextBox sourceUrlTextBox; private Tree tree; @UiField DockLayoutPanel treeContainer; /** Merge button */ private Button mergeButton; /** Cancel button */ private Button cancelButton; /** Attention icon. */ private OMSVGSVGElement alertMarker; /* Default constructor creating an instance of this MergeViewImpl */ @Inject public MergeViewImpl(SubversionExtensionLocalizationConstants constants, SubversionExtensionResources resources) { this.constants = constants; this.resources = resources; ensureDebugId("plugin-svn merge-dialog"); setWidget(uiBinder.createAndBindUi(this)); setTitle(constants.mergeDialogTitle()); mergeButton = createButton(constants.buttonMerge(), "plugin-svn-merge-dialog-merge-button", new ClickHandler() { @Override public void onClick(ClickEvent event) {delegate.mergeClicked();} }); mergeButton.addStyleName(Window.resources.windowCss().button()); addButtonToFooter(mergeButton); cancelButton = createButton(constants.buttonCancel(), "plugin-svn-merge-dialog-cancel-button", new ClickHandler() { @Override public void onClick(ClickEvent event) {delegate.cancelClicked();} }); addButtonToFooter(cancelButton); 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); targetTextBox.setEnabled(false); tree = new Tree(new NodeStorage(), new NodeLoader()); tree.getSelectionModel().setSelectionMode(SelectionModel.Mode.SINGLE); tree.getSelectionModel().addSelectionChangedHandler(new SelectionChangedEvent.SelectionChangedHandler() { @Override public void onSelectionChanged(SelectionChangedEvent event) { final List<Node> selection = event.getSelection(); if (selection == null || selection.isEmpty()) { return; } delegate.onNodeSelected(selection.get(0)); } }); treeContainer.add(tree); } @Override public void setRootNode(Node node) { tree.getNodeStorage().clear(); tree.getNodeStorage().add(node); } @Override public HasValue<Boolean> sourceCheckBox() { return sourceURLCheckBox; } @Override public void enableMergeButton(boolean enable) { mergeButton.setEnabled(enable); } @Override public void setError(final String message) { if (message == null) { alertMarker.getStyle().setVisibility(Style.Visibility.HIDDEN); return; } alertMarker.getStyle().setVisibility(Style.Visibility.VISIBLE); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { Tooltip.create((elemental.dom.Element) alertMarker.getElement(), PositionController.VerticalAlign.TOP, PositionController.HorizontalAlign.MIDDLE, message); } }); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public void show() { deckPanel.showWidget(0); super.show(); } @Override public HasValue<String> targetTextBox() { return targetTextBox; } @Override public HasValue<String> sourceURLTextBox() { return sourceUrlTextBox; } @UiHandler("sourceURLCheckBox") @SuppressWarnings("unused") public void onSourceUrlCheckBoxActivated(ClickEvent event) { deckPanel.showWidget(sourceURLCheckBox.getValue() ? 1 : 0); delegate.onSourceCheckBoxClicked(); } @UiHandler("sourceUrlTextBox") @SuppressWarnings("unused") public void onSourceURLChanged(KeyUpEvent event) { delegate.onSourceURLChanged(sourceUrlTextBox.getText()); } }