/*******************************************************************************
 * Copyright (c) 2000, 2007 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Brock Janiczak  (brockj@tpg.com.au) - Bug 77944 [Change Sets] Comment dialog: Use comment as title
 *******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.subscriber;

import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
import org.eclipse.ui.PlatformUI;

/**
 * Dialog for creating and editing commit set
 * title and comment
 */
public class CommitSetDialog extends TitleAreaDialog {

    public final static short NEW = 0;
    public final static short EDIT = 1;
    
	private static final int DEFAULT_WIDTH_IN_CHARS= 80;
    
    private final ActiveChangeSet set;
    private CommitCommentArea commitCommentArea;
    private Text nameText;
    private Button customTitleButton;
    private final String title;
    private final String description;
    private String comment;
    private short mode;
	protected String customTitle;

    public CommitSetDialog(Shell parentShell, ActiveChangeSet set, IResource[] files, short mode) {
        super(parentShell);
        this.set = set;
        this.mode = mode;
		this.title = mode == NEW ? CVSUIMessages.WorkspaceChangeSetCapability_2
				: CVSUIMessages.WorkspaceChangeSetCapability_7;
		this.description = mode == NEW ? CVSUIMessages.WorkspaceChangeSetCapability_3
				: CVSUIMessages.WorkspaceChangeSetCapability_8;
        
        if (files == null) {
            files = set.getResources();
        }
        
		int shellStyle = getShellStyle();
		setShellStyle(shellStyle | SWT.RESIZE | SWT.MAX);
		commitCommentArea = new CommitCommentArea();
		// Get a project from which the commit template can be obtained
		if (files.length > 0) 
		    commitCommentArea.setProject(files[0].getProject());
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
	protected Control createContents(Composite parent) {
        Control contents = super.createContents(parent);
        setTitle(title);
        setMessage(description);
        return contents;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
	protected Control createDialogArea(Composite parent) {
        Composite parentComposite = (Composite) super.createDialogArea(parent);

        // create a composite with standard margins and spacing
        Composite composite = new Composite(parentComposite, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        composite.setFont(parentComposite.getFont());
		
		if (hasCommitTemplate()) {
		    if (set.hasComment()) {
		        // Only set the comment if the set has a custom comment.
		        // Otherwise, the template should be used
		        comment = set.getComment();
		        commitCommentArea.setProposedComment(comment);
		    }
		} else {
		    comment = set.getComment();
		    commitCommentArea.setProposedComment(comment);
		}
		
		commitCommentArea.createArea(composite);
		commitCommentArea.addPropertyChangeListener(event -> {
			if (event.getProperty() == CommitCommentArea.OK_REQUESTED) {
				okPressed();
			} else if (event.getProperty() == CommitCommentArea.COMMENT_MODIFIED) {
				comment = (String) event.getNewValue();
				if (!customTitleButton.getSelection()) {
					nameText.setText(commitCommentArea.getFirstLineOfComment());
				}
				updateEnablements();
			}
		});

		createOptionsArea(composite);
		createNameArea(composite);
		
		initializeValues();
		updateEnablements();
		
        Dialog.applyDialogFont(parent);
        return composite;
    }
    
	/* (non-Javadoc)
	 * @see org.eclipse.jface.window.Window#getInitialSize()
	 */
	@Override
	protected Point getInitialSize() {
	    final Point size= super.getInitialSize();
	    size.x= convertWidthInCharsToPixels(DEFAULT_WIDTH_IN_CHARS);
	    size.y += convertHeightInCharsToPixels(8);
	    return size;
	}

    private void createNameArea(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
		layout.numColumns = 2;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		composite.setFont(parent.getFont());
		
		Label label = new Label(composite, SWT.NONE);
		label.setText(CVSUIMessages.CommitSetDialog_0); 
		label.setLayoutData(new GridData(GridData.BEGINNING));
		
		nameText = new Text(composite, SWT.BORDER);
		nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		nameText.addModifyListener(e -> {
			customTitle = nameText.getText();
			updateEnablements();
		});
    }

    private void initializeValues() {
        String initialText = set.getTitle();
        if (initialText == null) initialText = ""; //$NON-NLS-1$
        nameText.setText(initialText);
        nameText.setSelection(0, initialText.length());
        
        if (customTitleButton != null) {
            customTitleButton.setSelection(!commitCommentArea.getFirstLineOfComment().equals(initialText));
        }
    }
    
    private void createOptionsArea(Composite composite) {
		Composite radioArea = new Composite(composite, SWT.NONE);
		RowLayout radioAreaLayout = new RowLayout(SWT.VERTICAL);
		radioAreaLayout.marginLeft = 0;
		radioAreaLayout.marginRight = 0;
		radioAreaLayout.marginTop = 0;
		radioAreaLayout.marginBottom = 0;
		radioArea.setLayout(radioAreaLayout);
		
        customTitleButton = createCheckButton(radioArea, CVSUIMessages.CommitSetDialog_2); 
        SelectionAdapter listener = new SelectionAdapter() {
            @Override
			public void widgetSelected(SelectionEvent e) {
            	if (customTitleButton.getSelection()) {
            		nameText.setText(customTitle);
            	} else {
            		nameText.setText(commitCommentArea.getFirstLineOfComment());
            	}
                updateEnablements();
            }
        };
        customTitleButton.addSelectionListener(listener);
        
    }
    
	private Button createCheckButton(Composite parent, String label) {
		Button button = new Button(parent, SWT.CHECK);
		button.setText(label);
		return button;
	}
	
    private void updateEnablements() {
		setErrorMessage(null);
		String name;
		
		nameText.setEnabled(customTitleButton.getSelection());
		
		if (customTitleButton.getSelection()) {
			name = customTitle;
		} else {
			name = commitCommentArea.getFirstLineOfComment();
		}
		
		if (name.length() == 0) {
			setPageComplete(false);
			return;
		}
        
		// check if the new change set already exists
		if (mode == NEW 
				&& CVSUIPlugin.getPlugin().getChangeSetManager().getSet(name) != null) {
			setPageComplete(false);
			setErrorMessage(CVSUIMessages.WorkspaceChangeSetCapability_9);
			return;
		}
		
		// check if the edited change set already exists, do not display the
		// error message when new the name is the same as the old one
		if (mode == EDIT && !name.equals(set.getName()) 
				&& CVSUIPlugin.getPlugin().getChangeSetManager().getSet(name) != null) {
			setPageComplete(false);
			setErrorMessage(CVSUIMessages.WorkspaceChangeSetCapability_9);
			return;
		}

        
        setPageComplete(true);
    }
    
	final protected void setPageComplete(boolean complete) {
	    Button okButton = getButton(IDialogConstants.OK_ID);
		if(okButton != null ) {
			okButton.setEnabled(complete);
		}
	}
	
    private boolean hasCommitTemplate() {
        return commitCommentArea.hasCommitTemplate();
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
	protected void okPressed() {
    	String title = null;
    	if (customTitleButton.getSelection()) {
			title= customTitle;
		} else {
			title= commitCommentArea.getFirstLineOfComment();
		}
    	
        set.setTitle(title);
        // Call getComment so the comment gets saved
        set.setComment(commitCommentArea.getComment(true));
        
        super.okPressed();
    }


	protected Label createWrappingLabel(Composite parent, String text) {
		Label label = new Label(parent, SWT.LEFT | SWT.WRAP);
		label.setText(text);
		GridData data = new GridData();
		data.horizontalSpan = 1;
		data.horizontalAlignment = GridData.FILL;
		data.horizontalIndent = 0;
		data.grabExcessHorizontalSpace = true;
		data.widthHint = 200;
		label.setLayoutData(data);
		return label;
	}
	
	/* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
     */
    @Override
	protected Control createButtonBar(Composite parent) {
        Control control = super.createButtonBar(parent);
        updateEnablements();
        return control;
    }
    
    /* (non-Javadoc)
	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
	 */
	@Override
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText(title);
		// set F1 help
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
				IHelpContextIds.COMMIT_SET_DIALOG);

	}
}
