blob: a0f058977dc83967b5451d092d8fa813a6441b46 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 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;
}
}