/******************************************************************************* * Copyright (c) 2010, 2014 SAP AG and others. * Copyright (C) 2012, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com> * * 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: * Stefan Lay (SAP AG) - initial implementation * Mathias Kinzler (SAP AG) - use the abstract super class * Tomasz Zarna (IBM) - merge squash, bug 382720 *******************************************************************************/ package org.eclipse.egit.ui.internal.dialogs; import java.io.IOException; import java.text.MessageFormat; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.window.Window; import org.eclipse.jgit.api.MergeCommand.FastForwardMode; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.merge.MergeConfig; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; /** * Dialog for selecting a merge target. * */ public class MergeTargetSelectionDialog extends AbstractBranchSelectionDialog { private boolean mergeSquash; private FastForwardMode fastForwardMode; private boolean mergeCommit; /** * @param parentShell * @param repo */ public MergeTargetSelectionDialog(Shell parentShell, Repository repo) { super(parentShell, repo, getMergeTarget(repo), SHOW_LOCAL_BRANCHES | SHOW_REMOTE_BRANCHES | SHOW_TAGS | EXPAND_LOCAL_BRANCHES_NODE | getSelectSetting(repo)); MergeConfig config = MergeConfig.getConfigForCurrentBranch(repo); fastForwardMode = config.getFastForwardMode(); mergeSquash = config.isSquash(); if (mergeSquash) mergeCommit = false; else mergeCommit = config.isCommit(); } @Override protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); getButton(Window.OK).setText( UIText.MergeTargetSelectionDialog_ButtonMerge); } @Override protected String getMessageText() { String branch = getCurrentBranch(); if (branch != null) return MessageFormat.format( UIText.MergeTargetSelectionDialog_SelectRefWithBranch, branch); else return UIText.MergeTargetSelectionDialog_SelectRef; } @Override protected String getTitle() { String branch = getCurrentBranch(); if (branch != null) return MessageFormat.format( UIText.MergeTargetSelectionDialog_TitleMergeWithBranch, branch); else return UIText.MergeTargetSelectionDialog_TitleMerge; } @Override protected void refNameSelected(String refName) { boolean tagSelected = refName != null && refName.startsWith(Constants.R_TAGS); boolean branchSelected = refName != null && (refName.startsWith(Constants.R_HEADS) || refName .startsWith(Constants.R_REMOTES)); boolean currentSelected; try { currentSelected = refName != null && refName.equals(repo.getFullBranch()); } catch (IOException e) { currentSelected = false; } getButton(Window.OK).setEnabled( !currentSelected && (branchSelected || tagSelected)); } @Override protected void createCustomArea(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(1, false)); GridDataFactory.fillDefaults().grab(true, false).applyTo(main); Group mergeTypeGroup = new Group(main, SWT.NONE); mergeTypeGroup .setText(UIText.MergeTargetSelectionDialog_MergeTypeGroup); GridDataFactory.fillDefaults().grab(true, false) .applyTo(mergeTypeGroup); mergeTypeGroup.setLayout(new GridLayout(1, false)); Button commit = new Button(mergeTypeGroup, SWT.RADIO); if (mergeCommit) commit.setSelection(true); commit.setText(UIText.MergeTargetSelectionDialog_MergeTypeCommitButton); commit.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (((Button) event.widget).getSelection()) { mergeSquash = false; mergeCommit = true; } } }); Button noCommit = new Button(mergeTypeGroup, SWT.RADIO); if (!mergeCommit && !mergeSquash) noCommit.setSelection(true); noCommit.setText(UIText.MergeTargetSelectionDialog_MergeTypeNoCommitButton); noCommit.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (((Button) event.widget).getSelection()) { mergeSquash = false; mergeCommit = false; } } }); Button squash = new Button(mergeTypeGroup, SWT.RADIO); if (mergeSquash) squash.setSelection(true); squash.setText(UIText.MergeTargetSelectionDialog_MergeTypeSquashButton); squash.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (((Button) event.widget).getSelection()) { mergeSquash = true; mergeCommit = false; } } }); Group fastForwardGroup = new Group(main, SWT.NONE); fastForwardGroup .setText(UIText.MergeTargetSelectionDialog_FastForwardGroup); GridDataFactory.fillDefaults().grab(true, false) .applyTo(fastForwardGroup); fastForwardGroup.setLayout(new GridLayout(1, false)); createFastForwardButton(fastForwardGroup, UIText.MergeTargetSelectionDialog_FastForwardButton, FastForwardMode.FF); createFastForwardButton(fastForwardGroup, UIText.MergeTargetSelectionDialog_NoFastForwardButton, FastForwardMode.NO_FF); createFastForwardButton(fastForwardGroup, UIText.MergeTargetSelectionDialog_OnlyFastForwardButton, FastForwardMode.FF_ONLY); } private void createFastForwardButton(Group grp, String text, final FastForwardMode ffMode) { Button btn = new Button(grp, SWT.RADIO); btn.setText(text); btn.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (((Button) event.widget).getSelection()) fastForwardMode = ffMode; } }); btn.setSelection(fastForwardMode == ffMode); } /** * @return whether the merge is to be squashed */ public boolean isMergeSquash() { return mergeSquash; } /** * @return selected fast forward mode */ public FastForwardMode getFastForwardMode() { return fastForwardMode; } /** * @return whether the merge is to be committed */ public boolean isCommit() { return mergeCommit; } }