blob: e08df7c41516e063f503c2ba23f13ac94a4f7bee [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
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.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
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.team.core.RepositoryProvider;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.CVSTeamProvider;
import org.eclipse.team.internal.ui.*;
import org.eclipse.team.internal.ui.dialogs.*;
import org.eclipse.team.ui.*;
/**
* This area provides the widgets for providing the CVS commit comment
*/
public class CommitCommentArea extends DialogArea {
private static final int WIDTH_HINT = 350;
private static final int HEIGHT_HINT = 150;
private Text text;
private Combo previousCommentsCombo;
private IProject mainProject;
private String[] comments = new String[0];
private String comment = ""; //$NON-NLS-1$
public static final String OK_REQUESTED = "OkRequested";//$NON-NLS-1$
/**
* Constructor for CommitCommentArea.
* @param parentDialog
* @param settings
*/
public CommitCommentArea(Dialog parentDialog, IDialogSettings settings) {
super(parentDialog, settings);
comments = CVSUIPlugin.getPlugin().getRepositoryManager().getPreviousComments();
}
/**
* @see org.eclipse.team.internal.ccvs.ui.DialogArea#createArea(org.eclipse.swt.widgets.Composite)
*/
public Control createArea(Composite parent) {
Composite composite = createGrabbingComposite(parent, 1);
initializeDialogUnits(composite);
Label label = new Label(composite, SWT.NULL);
label.setLayoutData(new GridData());
label.setText(Policy.bind("ReleaseCommentDialog.enterComment")); //$NON-NLS-1$
text = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = WIDTH_HINT;
data.heightHint = HEIGHT_HINT;
text.setLayoutData(data);
text.selectAll();
text.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_RETURN && (e.stateMask & SWT.CTRL) != 0) {
e.doit = false;
CommitCommentArea.this.signalCtrlEnter();
}
}
});
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
comment = text.getText();
}
});
label = new Label(composite, SWT.NULL);
label.setLayoutData(new GridData());
label.setText(Policy.bind("ReleaseCommentDialog.choosePrevious")); //$NON-NLS-1$
previousCommentsCombo = new Combo(composite, SWT.READ_ONLY);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
previousCommentsCombo.setLayoutData(data);
// Initialize the values before we register any listeners so
// we don't get any platform specific selection behavior
// (see bug 32078: http://bugs.eclipse.org/bugs/show_bug.cgi?id=32078)
initializeValues();
previousCommentsCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int index = previousCommentsCombo.getSelectionIndex();
if (index != -1)
text.setText(comments[index]);
}
});
return composite;
}
/**
* Method initializeValues.
*/
private void initializeValues() {
// populate the previous comment list
for (int i = 0; i < comments.length; i++) {
previousCommentsCombo.add(flattenText(comments[i]));
}
// We don't want to have an initial selection
// (see bug 32078: http://bugs.eclipse.org/bugs/show_bug.cgi?id=32078)
previousCommentsCombo.setText(""); //$NON-NLS-1$
// determine the initial comment text
String initialComment;
try {
initialComment = getCommitTemplate();
} catch (CVSException e) {
CVSUIPlugin.log(e);
initialComment = null;
}
if (initialComment != null && initialComment.length() != 0) {
text.setText(initialComment);
}
}
/*
* Flatten the text in the multiline comment
* @param string
* @return String
*/
private String flattenText(String string) {
StringBuffer buffer = new StringBuffer(string.length() + 20);
boolean skipAdjacentLineSeparator = true;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c == '\r' || c == '\n') {
if (!skipAdjacentLineSeparator)
buffer.append(Policy.bind("separator")); //$NON-NLS-1$
skipAdjacentLineSeparator = true;
} else {
buffer.append(c);
skipAdjacentLineSeparator = false;
}
}
return buffer.toString();
}
/**
* Method signalCtrlEnter.
*/
private void signalCtrlEnter() {
firePropertyChangeChange(OK_REQUESTED, null, null);
}
/**
* Method clearCommitText.
*/
private void clearCommitText() {
try {
text.setText(getCommitTemplate());
previousCommentsCombo.deselectAll();
} catch (CVSException e) {
CVSUIPlugin.openError(getShell(), null, null, e, CVSUIPlugin.PERFORM_SYNC_EXEC);
}
}
private String getCommitTemplate() throws CVSException {
CVSTeamProvider provider = getProvider();
if (provider == null) return ""; //$NON-NLS-1$
String template = provider.getCommitTemplate();
if (template == null) template = ""; //$NON-NLS-1$
return template;
}
/**
* Method getProvider.
*/
private CVSTeamProvider getProvider() throws CVSException {
if (mainProject == null) return null;
return (CVSTeamProvider) RepositoryProvider.getProvider(mainProject, CVSProviderPlugin.getTypeId());
}
/**
* Method getSelectedComment.
* @return String
*/
private String getSelectedComment() {
if (comments.length == 0) {
// There are no previous comments so use the template
try {
return getCommitTemplate();
} catch (CVSException e) {
// log the exception for now.
// The user can surface the problem by trying to reset the comment
CVSUIPlugin.log(e);
}
} else {
int index = previousCommentsCombo.getSelectionIndex();
if (index != -1)
return comments[index];
}
return ""; //$NON-NLS-1$
}
/**
* Return the entered comment
*
* @return the comment
*/
public String[] getComments() {
return comments;
}
/**
* Returns the comment.
* @return String
*/
public String getComment() {
if (comment != null && comment.length() > 0) finished();
return comment;
}
/**
* Method setProject.
* @param iProject
*/
public void setProject(IProject iProject) {
this.mainProject = iProject;
}
private void finished() {
// if the comment is the same as the template, ignore it
try {
if (comment.equals(getCommitTemplate())) {
comment = ""; //$NON-NLS-1$
}
} catch (CVSException e) {
// we couldn't get the commit template. Log the error and continue
CVSUIPlugin.log(e);
}
// if there is still a comment, remember it
if (comment.length() > 0) {
CVSUIPlugin.getPlugin().getRepositoryManager().addComment(comment);
}
}
}