/******************************************************************************* * Copyright (c) 2011, 2013 SAP AG and others. * 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: * Mathias Kinzler (SAP AG) - initial implementation *******************************************************************************/ package org.eclipse.egit.ui.internal.repository.tree.command; import java.text.MessageFormat; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.UIUtils; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jgit.lib.Repository; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Asks whether the working directory of a (non-bare) Repository should also be * deleted */ public class DeleteRepositoryConfirmDialog extends TitleAreaDialog { private final Repository repository; private boolean shouldDeleteGitDir = false; private boolean shouldDeleteWorkingDir = false; private boolean shouldRemoveProjects = false; private int numberOfProjects = 0; private Button deleteGitDir; private Button deleteWorkDir; private Button removeProjects; private Text deleteWorkDirLabel; /** * @param parentShell * @param repository * non-bare repository * @param numberOfProjects */ public DeleteRepositoryConfirmDialog(Shell parentShell, Repository repository, int numberOfProjects) { super(parentShell); setHelpAvailable(false); if (repository.isBare()) throw new IllegalArgumentException( "DeleteRepositoryConfirmDialog can only be used for non-bare repository."); //$NON-NLS-1$ this.repository = repository; this.numberOfProjects = numberOfProjects; } @Override protected Control createDialogArea(Composite parent) { Composite main = new Composite(parent, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).applyTo(main); main.setLayout(new GridLayout(1, false)); deleteGitDir = new Button(main, SWT.CHECK); GridDataFactory.fillDefaults().grab(true, false).applyTo(deleteGitDir); deleteGitDir .setText(UIText.DeleteRepositoryConfirmDialog_DeleteGitDirCheckbox); createIndentedLabel(main, repository.getDirectory().getPath()); deleteWorkDir = new Button(main, SWT.CHECK); GridDataFactory.fillDefaults().grab(true, false).applyTo(deleteWorkDir); deleteWorkDir .setText(UIText.DeleteRepositoryConfirmDialog_DeleteWorkingDirectoryCheckbox); deleteWorkDirLabel = createIndentedLabel(main, repository.getWorkTree() .getPath()); removeProjects = new Button(main, SWT.CHECK); deleteGitDir.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { shouldDeleteGitDir = deleteGitDir.getSelection(); updateUI(); } }); deleteWorkDir.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { shouldDeleteWorkingDir = deleteWorkDir.getSelection(); updateUI(); } }); if (numberOfProjects > 0) { removeProjects.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { shouldRemoveProjects = removeProjects.getSelection(); } }); GridDataFactory.fillDefaults().grab(true, false).applyTo(removeProjects); removeProjects .setText(MessageFormat .format(UIText.DeleteRepositoryConfirmDialog_DeleteProjectsCheckbox, Integer.valueOf(numberOfProjects))); } else removeProjects.setVisible(false); deleteGitDir.setFocus(); main.setTabList( new Control[] { deleteGitDir, deleteWorkDir, removeProjects }); return main; } @Override public void create() { super.create(); setTitle(NLS.bind( UIText.DeleteRepositoryConfirmDialog_DeleteRepositoryTitle, Activator.getDefault().getRepositoryUtil() .getRepositoryName(repository))); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell .setText(UIText.DeleteRepositoryConfirmDialog_DeleteRepositoryWindowTitle); } @Override protected Control createButtonBar(Composite parent) { Control result = super.createButtonBar(parent); updateUI(); return result; } /** * @return if the working directory should be deleted */ public boolean shouldDeleteWorkingDir() { return shouldDeleteWorkingDir; } /** * @return if the working directory should be deleted */ public boolean shouldRemoveProjects() { return shouldRemoveProjects; } private static Text createIndentedLabel(Composite main, String text) { Text widget = UIUtils.createSelectableLabel(main, 0); widget.setText(text); // Eclipse 4.3: Use LayoutConstants.getIndent once we depend on 4.3 int indent = 20; GridDataFactory.fillDefaults().grab(true, false).indent(indent, 0) .applyTo(widget); return widget; } private void updateUI() { // The user has to select the delete checkbox before OK can be clicked getButton(IDialogConstants.OK_ID).setEnabled(shouldDeleteGitDir); deleteWorkDir.setEnabled(shouldDeleteGitDir); deleteWorkDirLabel.setEnabled(shouldDeleteGitDir); removeProjects .setEnabled(shouldDeleteGitDir && !shouldDeleteWorkingDir); if (shouldDeleteWorkingDir && numberOfProjects > 0) { removeProjects.setSelection(true); shouldRemoveProjects = true; } if (shouldDeleteGitDir) setMessage( UIText.DeleteRepositoryConfirmDialog_DeleteRepositoryNoUndoWarning, IMessageProvider.WARNING); else setMessage(UIText.DeleteRepositoryConfirmDialog_DeleteRepositoryConfirmMessage); } }