/******************************************************************************* * 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.ext.git.client.merge; import elemental.events.KeyboardEvent; import elemental.events.MouseEvent; import org.eclipse.che.ide.ext.git.client.GitLocalizationConstant; import org.eclipse.che.ide.ext.git.client.GitResources; import org.eclipse.che.ide.ui.tree.Tree; import org.eclipse.che.ide.ui.tree.TreeNodeElement; import org.eclipse.che.ide.ui.window.Window; import org.eclipse.che.ide.util.input.SignalEvent; 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.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.google.inject.Singleton; import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; import static org.eclipse.che.ide.ext.git.client.merge.MergePresenter.LOCAL_BRANCHES_TITLE; import static org.eclipse.che.ide.ext.git.client.merge.MergePresenter.REMOTE_BRANCHES_TITLE; import static org.eclipse.che.ide.ext.git.client.merge.Reference.RefType.LOCAL_BRANCH; import static org.eclipse.che.ide.ext.git.client.merge.Reference.RefType.REMOTE_BRANCH; /** * The implementation of {@link MergeView}. * * @author Andrey Plotnikov */ @Singleton public class MergeViewImpl extends Window implements MergeView { interface MergeViewImplUiBinder extends UiBinder<Widget, MergeViewImpl> { } private static MergeViewImplUiBinder ourUiBinder = GWT.create(MergeViewImplUiBinder.class); Button btnCancel; Button btnMerge; @UiField ScrollPanel referencesPanel; @UiField(provided = true) final GitResources res; @UiField(provided = true) final GitLocalizationConstant locale; private Tree<Reference> references; private ActionDelegate delegate; private final Reference localBranch; private final Reference remoteBranch; /** * Create view. * * @param resources * @param locale * @param rendererResources */ @Inject protected MergeViewImpl(GitResources resources, GitLocalizationConstant locale, ReferenceTreeNodeRenderer.Resources rendererResources) { this.res = resources; this.locale = locale; this.ensureDebugId("git-merge-window"); Widget widget = ourUiBinder.createAndBindUi(this); this.setTitle(locale.mergeTitle()); this.setWidget(widget); this.references = Tree.create(rendererResources, new ReferenceTreeNodeDataAdapter(), new ReferenceTreeNodeRenderer(rendererResources, resources)); this.references.setTreeEventHandler(new Tree.Listener<Reference>() { @Override public void onNodeAction(TreeNodeElement<Reference> node) { } @Override public void onNodeClosed(TreeNodeElement<Reference> node) { //do nothing } @Override public void onNodeContextMenu(int mouseX, int mouseY, TreeNodeElement<Reference> node) { //do nothing } @Override public void onNodeDragStart(TreeNodeElement<Reference> node, MouseEvent event) { //do nothing } @Override public void onNodeDragDrop(TreeNodeElement<Reference> node, MouseEvent event) { //do nothing } @Override public void onNodeExpanded(final TreeNodeElement<Reference> node) { delegate.onReferenceSelected(node.getData()); } @Override public void onNodeSelected(TreeNodeElement<Reference> node, SignalEvent event) { delegate.onReferenceSelected(node.getData()); } @Override public void onRootContextMenu(int mouseX, int mouseY) { //do nothing } @Override public void onRootDragDrop(MouseEvent event) { //do nothing } @Override public void onKeyboard(KeyboardEvent event) { //do nothing } }); this.referencesPanel.add(references.asWidget()); Reference root = references.getModel().getRoot(); if (root == null) { root = new Reference("", "", null); references.getModel().setRoot(root); } localBranch = new Reference(LOCAL_BRANCHES_TITLE, LOCAL_BRANCHES_TITLE, LOCAL_BRANCH); remoteBranch = new Reference(REMOTE_BRANCHES_TITLE, REMOTE_BRANCHES_TITLE, REMOTE_BRANCH); List<Reference> branches = new ArrayList<>(); branches.add(localBranch); branches.add(remoteBranch); root.setBranches(branches); btnCancel = createButton(locale.buttonCancel(), "git-merge-cancel", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onCancelClicked(); } }); addButtonToFooter(btnCancel); btnMerge = createButton(locale.buttonMerge(), "git-merge-merge", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onMergeClicked(); } }); addButtonToFooter(btnMerge); } @Override protected void onEnterClicked() { if (isWidgetFocused(btnMerge)) { delegate.onMergeClicked(); return; } if (isWidgetFocused(btnCancel)) { delegate.onCancelClicked(); } } /** {@inheritDoc} */ @Override public void setLocalBranches(@NotNull List<Reference> references) { localBranch.setBranches(references); this.references.renderTree(0); } /** {@inheritDoc} */ @Override public void setRemoteBranches(@NotNull List<Reference> references) { remoteBranch.setBranches(references); this.references.renderTree(0); } /** {@inheritDoc} */ @Override public void setEnableMergeButton(boolean enabled) { btnMerge.setEnabled(enabled); } /** {@inheritDoc} */ @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } /** {@inheritDoc} */ @Override public void close() { this.hide(); } /** {@inheritDoc} */ @Override public void showDialog() { this.show(); } }