com.vectrace.MercurialEclipse.ui.HgProjectPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.vectrace.MercurialEclipse.ui.HgProjectPropertyPage.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2009 Bastian Doetsch 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:
 *     bastian          - implementation
 *     Andrei Loskutov  - bug fixes
 *     Amenel Voglozin  - bug fixes
 *******************************************************************************/
package com.vectrace.MercurialEclipse.ui;

import static com.vectrace.MercurialEclipse.ui.SWTWidgetHelper.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.PropertyPage;

import com.vectrace.MercurialEclipse.MercurialEclipsePlugin;
import com.vectrace.MercurialEclipse.exception.HgException;
import com.vectrace.MercurialEclipse.model.HgRoot;
import com.vectrace.MercurialEclipse.model.IHgRepositoryLocation;
import com.vectrace.MercurialEclipse.storage.HgCommitMessageManager;
import com.vectrace.MercurialEclipse.storage.HgRepositoryLocationManager;
import com.vectrace.MercurialEclipse.team.MercurialTeamProvider;
import com.vectrace.MercurialEclipse.wizards.NewLocationWizard;

/**
 * @author bastian
 */
public class HgProjectPropertyPage extends PropertyPage {

    public static final String ID = "com.vectrace.MercurialEclipse.ui.HgProjectPropertyPage";
    private IProject project;
    private Group reposGroup;
    private Text defTextField;
    private HgRoot hgRoot;
    private Combo allReposCombo;
    private Text commitText;

    public HgProjectPropertyPage() {
        super();
    }

    @Override
    protected Control createContents(Composite parent) {
        this.project = (IProject) super.getElement();

        Composite comp = createComposite(parent, 1);

        if (!MercurialTeamProvider.isHgTeamProviderFor(project)) {
            setMessage("This project doesn't use MercurialEclipse as Team provider.");
            return comp;
        }
        hgRoot = MercurialTeamProvider.getHgRoot(project);
        if (hgRoot == null) {
            setMessage("Failed to find hg root for project.");
            return comp;
        }

        final HgRepositoryLocationManager mgr = MercurialEclipsePlugin.getRepoManager();
        Set<IHgRepositoryLocation> allRepos = mgr.getAllRepoLocations();
        IHgRepositoryLocation defLoc = mgr.getDefaultRepoLocation(hgRoot);

        createCommitGroup(comp);

        createRepoGroup(comp, defLoc);

        createButtons(mgr);

        updateSelection(allRepos, defLoc);

        allReposCombo.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                updateDefaultRepo();
            }
        });

        updateApplyButton();
        commitText.setFocus();
        return comp;
    }

    private void createRepoGroup(Composite comp, IHgRepositoryLocation defLoc) {
        reposGroup = SWTWidgetHelper.createGroup(comp, "Default repository", 1, GridData.FILL_HORIZONTAL);

        defTextField = createTextField(reposGroup);
        defTextField.setEditable(false);
        try {
            if (defLoc != null && defLoc.getUri() != null) {
                defTextField.setText(defLoc.getUri().toString());
            }
        } catch (HgException e) {
            // This is an innocuous exception: the user will simply not see the text if one is thrown.
            MercurialEclipsePlugin.logError(e);
        }

        createLabel(reposGroup, "Set as default:");
        allReposCombo = createCombo(reposGroup);
    }

    private void createCommitGroup(Composite comp) {
        Group commitGroup = SWTWidgetHelper.createGroup(comp, "Hg root settings", 1, GridData.FILL_HORIZONTAL);
        Composite commitComp = createComposite(commitGroup, 2);
        createLabel(commitComp, "Default commit name:");
        commitText = createTextField(commitComp);
        commitText.setText(HgCommitMessageManager.getDefaultCommitName(hgRoot));
    }

    private void createButtons(final HgRepositoryLocationManager mgr) {
        Composite buttonComposite = createComposite(reposGroup, 3);
        final Button addRepo = createPushButton(buttonComposite, "Add...", 1);
        addRepo.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                NewLocationWizard wizard = new NewLocationWizard();
                WizardDialog dialog = new WizardDialog(addRepo.getShell(), wizard);
                int result = dialog.open();
                if (result != Window.OK) {
                    return;
                }
                if (wizard.getRepository() != null) {
                    updateSelection(mgr.getAllRepoLocations(), wizard.getRepository());
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });

        final Button modifyRepo = createPushButton(buttonComposite, "Modify...", 1);
        modifyRepo.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                if (defTextField.getData() != null) {
                    PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(addRepo.getShell(),
                            (IAdaptable) defTextField.getData(),
                            "com.vectrace.MercurialEclipse.repositoryProperties", null, null);
                    dialog.open();
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });

        final Button deleteRepo = createPushButton(buttonComposite, "Delete...", 1);
        deleteRepo.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                IHgRepositoryLocation repo = (IHgRepositoryLocation) defTextField.getData();
                if (repo != null) {
                    Set<HgRoot> locationRoots = mgr.getAllRepoLocationRoots(repo);
                    String message;
                    if ((locationRoots.size() == 1 && !locationRoots.contains(hgRoot))
                            || locationRoots.size() > 1) {
                        message = "Delete repository '" + repo.getLocation() + "'?"
                                + "\nAt least one other project still uses this repository!";
                    } else {
                        message = "Delete repository '" + repo.getLocation() + "'?";
                    }
                    boolean confirm = MessageDialog.openConfirm(getShell(), "Mercurial", message);
                    if (confirm) {
                        mgr.disposeRepository(repo);
                        updateSelection(mgr.getAllRepoLocations(), null);
                    }
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });
    }

    private void updateSelection(final Set<IHgRepositoryLocation> allRepos, IHgRepositoryLocation defLoc) {
        allReposCombo.removeAll();

        int idx = -1;
        int defIndex = idx;
        //
        // We sort the URIs alphabetically, which will be easier on the user.
        List<IHgRepositoryLocation> sortedRepos = new ArrayList<IHgRepositoryLocation>(allRepos.size());
        for (IHgRepositoryLocation repo : allRepos) {
            sortedRepos.add(repo);
        }
        sortedRepos.sort(HgRepositoryLocationManager.getRepoLocationComparator());
        //
        //
        for (final IHgRepositoryLocation repo : sortedRepos) {
            idx++;
            allReposCombo.add(repo.getLocation());
            if (defLoc != null && defLoc.equals(repo)) {
                defIndex = idx;
            }
        }
        if (defIndex >= 0) {
            allReposCombo.select(defIndex);
        } else if (idx >= 0) {
            allReposCombo.select(idx);
        }
        setSelectedRepo(defLoc);
    }

    @Override
    public boolean performOk() {
        if (hgRoot == null) {
            return super.performOk();
        }
        final HgRepositoryLocationManager mgr = MercurialEclipsePlugin.getRepoManager();
        IHgRepositoryLocation defLoc = mgr.getDefaultRepoLocation(hgRoot);
        IHgRepositoryLocation data = (IHgRepositoryLocation) defTextField.getData();
        if (data != null && (defLoc == null || !defTextField.getText().equals(defLoc.getLocation()))) {
            mgr.setDefaultRepository(hgRoot, data);
        }
        String commitName = commitText.getText().trim();
        HgCommitMessageManager.updateDefaultCommitName(hgRoot, commitName);

        return super.performOk();
    }

    @Override
    protected void performApply() {
        this.performOk();
    }

    @Override
    public boolean isValid() {
        if (hgRoot == null) {
            return super.isValid();
        }
        IHgRepositoryLocation data = (IHgRepositoryLocation) defTextField.getData();
        if (data == null) {
            return false;
        }
        String commitName = commitText.getText().trim();
        if (commitName.length() == 0) {
            return false;
        }
        return super.isValid();
    }

    @Override
    protected void performDefaults() {
        if (hgRoot == null) {
            return;
        }
        final HgRepositoryLocationManager mgr = MercurialEclipsePlugin.getRepoManager();
        IHgRepositoryLocation defLoc = mgr.getDefaultRepoLocation(hgRoot);
        if (defLoc != null) {
            defTextField.setText(defLoc.getLocation());
            defTextField.setData(defLoc);
        } else {
            defTextField.setText("");
            defTextField.setData(null);
        }
        Set<IHgRepositoryLocation> allRepos = mgr.getAllRepoLocations();
        updateSelection(allRepos, defLoc);
        commitText.setText(HgCommitMessageManager.getDefaultCommitName(hgRoot));
        super.performDefaults();
    }

    private void updateDefaultRepo() {
        HgRepositoryLocationManager mgr = MercurialEclipsePlugin.getRepoManager();
        final Set<IHgRepositoryLocation> repos = mgr.getAllRepoLocations();
        for (IHgRepositoryLocation repo : repos) {
            if (repo.getLocation().equals(allReposCombo.getText())) {
                setSelectedRepo(repo);
            }
        }
    }

    private void setSelectedRepo(IHgRepositoryLocation repo) {
        defTextField.setData(repo);
        if (repo != null) {
            defTextField.setText(repo.getLocation());
        } else {
            defTextField.setText("");
        }
        updateApplyButton();
    }
}