org.eclipse.mylyn.internal.team.ui.properties.ProjectTeamPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.team.ui.properties.ProjectTeamPage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2009 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.team.ui.properties;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.IControlContentAdapter;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
import org.eclipse.mylyn.internal.team.ui.preferences.FocusedTeamPreferencePage;
import org.eclipse.mylyn.internal.team.ui.templates.TemplateHandlerContentProposalProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;

/**
 * A property page that support per project configuration of commit comment templates.
 * 
 * @author Rob Elves
 * @author Steffen Pingel
 * @see Adapted from org.eclipse.ui.internal.ide.dialogs.ProjectReferencePage
 */
public class ProjectTeamPage extends PropertyPage {

    private IProject project;

    private boolean modified;

    private boolean ignoreModifyEvents;

    private Button useProjectSettings;

    private Text commitTemplateText;

    private Composite propertiesComposite;

    private Hyperlink configurationHyperlink;

    private Label label;

    public ProjectTeamPage() {
        noDefaultAndApplyButton();
    }

    @Override
    protected Control createContents(Composite parent) {
        Font font = parent.getFont();

        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        composite.setFont(font);

        createDescription(composite);
        createPropertiesControl(composite);

        initialize();

        return composite;
    }

    private void createDescription(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setFont(parent.getFont());
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 2;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        useProjectSettings = new Button(composite, SWT.CHECK);
        useProjectSettings.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (!ignoreModifyEvents) {
                    modified = true;
                }
                setPropertiesEnabled(useProjectSettings.getSelection());
            }
        });
        useProjectSettings.setText(Messages.ProjectTeamPage_Enable_project_specific_settings);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(useProjectSettings);

        configurationHyperlink = new Hyperlink(composite, SWT.NONE);
        configurationHyperlink.setUnderlined(true);
        configurationHyperlink.setText(Messages.ProjectTeamPage_Configure_workspace);
        configurationHyperlink.addHyperlinkListener(new HyperlinkAdapter() {

            @Override
            public void linkActivated(HyperlinkEvent e) {
                PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(),
                        FocusedTeamPreferencePage.PAGE_ID, new String[] { FocusedTeamPreferencePage.PAGE_ID },
                        null);
                dlg.open();
            }
        });

        Label horizontalLine = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
        horizontalLine.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
        horizontalLine.setFont(composite.getFont());
    }

    private void setPropertiesEnabled(boolean enabled) {
        propertiesComposite.setEnabled(enabled);
        for (Control child : propertiesComposite.getChildren()) {
            child.setEnabled(enabled);
        }
        commitTemplateText.setEnabled(enabled);

        configurationHyperlink.setEnabled(!enabled);
        if (!enabled) {
            configurationHyperlink.setForeground(JFaceColors.getHyperlinkText(getShell().getDisplay()));
        } else {
            configurationHyperlink
                    .setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
        }
    }

    private void createPropertiesControl(Composite parent) {
        propertiesComposite = new Composite(parent, SWT.NONE);
        propertiesComposite.setFont(parent.getFont());
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 1;
        propertiesComposite.setLayout(layout);
        propertiesComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        label = new Label(propertiesComposite, SWT.NONE);
        label.setText(Messages.ProjectTeamPage_Commit_Comment_Template);

        String completedTemplate = ""; //getPreferenceStore().getString(FocusedTeamUiPlugin.COMMIT_TEMPLATE); //$NON-NLS-1$
        commitTemplateText = addTemplateField(propertiesComposite, completedTemplate,
                new TemplateHandlerContentProposalProvider());
    }

    private Text addTemplateField(final Composite parent, final String text, IContentProposalProvider provider) {
        IControlContentAdapter adapter = new TextContentAdapter();
        Text control = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        control.setText(text);
        control.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                if (!ignoreModifyEvents) {
                    modified = true;
                }
            }
        });

        new ContentAssistCommandAdapter(control, adapter, provider, null, new char[] { '$' }, true);

        GridData gd = new GridData();
        gd.heightHint = 60;
        gd.horizontalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = true;
        gd.verticalAlignment = GridData.CENTER;
        gd.grabExcessVerticalSpace = false;
        control.setLayoutData(gd);

        return control;
    }

    private void initialize() {
        project = (IProject) getElement().getAdapter(IResource.class);
        try {
            ignoreModifyEvents = true;
            TeamPropertiesLinkProvider provider = new TeamPropertiesLinkProvider();
            String template = provider.getCommitCommentTemplate(project);
            if (template == null) {
                useProjectSettings.setSelection(false);
                setPropertiesEnabled(false);
                commitTemplateText.setText(FocusedTeamUiPlugin.getDefault().getPreferenceStore()
                        .getString(FocusedTeamUiPlugin.COMMIT_TEMPLATE));
            } else {
                useProjectSettings.setSelection(true);
                setPropertiesEnabled(true);
                commitTemplateText.setText(template);
            }
        } finally {
            ignoreModifyEvents = false;
        }
    }

    @Override
    public boolean performOk() {
        if (!modified) {
            return true;
        }

        TeamPropertiesLinkProvider provider = new TeamPropertiesLinkProvider();
        if (useProjectSettings.getSelection()) {
            provider.setCommitCommentTemplate(project, commitTemplateText.getText());
        } else {
            provider.setCommitCommentTemplate(project, null);
        }

        return true;
    }
}