/*******************************************************************************
 * Copyright (c) 2016 IBM Corporation. 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * 	Contributors:
 * 	    IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.js.node.internal.launch.ui;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
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.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.jsdt.js.node.internal.NodeConstants;
import org.eclipse.wst.jsdt.js.node.internal.ui.ImageResource;
import org.eclipse.wst.jsdt.js.node.internal.Messages;

/**
 * Arguments tab for node application launch configuration
 * 
 * @author "Adalberto Lopez Venegas (adalbert)"
 */
public class NodeLaunchArgumentsTab extends AbstractLaunchConfigurationTab {
    
	private Text nodeArgumentsText;
	private Text appArgumentsText;
	private Button nodeVariablesButton;
	private Button appVariablesButton;
	
    NodeWorkingDirectoryBlock workingDirectoryBlock = new NodeWorkingDirectoryBlock(NodeConstants.ATTR_WORKING_DIRECTORY);

	private ModifyListener modifyListener = new ModifyListener() {
        @Override
		public void modifyText(ModifyEvent e) {
            updateLaunchConfigurationDialog();
        }
    };
    
	private SelectionListener nodeArgsSelectionListener = new SelectionListener() {
        @Override
		public void widgetSelected(SelectionEvent e) {
            StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
            dialog.open();
            String variable = dialog.getVariableExpression();
            if (variable != null) {
            	nodeArgumentsText.insert(variable);
            }
        }

		@Override
		public void widgetDefaultSelected(SelectionEvent arg0) {
		}
    };
    
    private SelectionListener appArgsSelectionListener = new SelectionListener() {
        @Override
		public void widgetSelected(SelectionEvent e) {
            StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
            dialog.open();
            String variable = dialog.getVariableExpression();
            if (variable != null) {
            	appArgumentsText.insert(variable);
            }
        }

		@Override
		public void widgetDefaultSelected(SelectionEvent arg0) {				
		}            
    };

	@Override
	public void createControl(Composite parent) {        
		ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL);
		scrolledComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		Composite composite = new Composite(scrolledComposite, SWT.NULL);
		scrolledComposite.setContent(composite);
		
		Point minSize = composite.computeSize(0, 350);
		composite.setSize(minSize);
		if (composite.getParent() instanceof ScrolledComposite) {
			ScrolledComposite sc1 = (ScrolledComposite)composite.getParent();
			sc1.setMinSize(minSize);
			sc1.setExpandHorizontal(true);
			sc1.setExpandVertical(true);
		}
		
		GridLayout layout = new GridLayout();
		layout.horizontalSpacing = 5;
		layout.verticalSpacing = 5;
		layout.numColumns = 1;
		composite.setLayout(layout);
		
		createNodeArgumentsGroup(composite);
        createAppArgumentsGroup(composite);
        createWorkingDirectoryGroup(composite);
		
		setControl(scrolledComposite);		
	}
	
	private void createNodeArgumentsGroup(Composite parent) {
        Group nodeJSOptionsGroup = new Group(parent, SWT.NONE);
        nodeJSOptionsGroup.setText(Messages.LAUNCH_CONFIGURATION_ARGUMENTS_TAB_NODE_ARGUMENTS_TEXT);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        nodeJSOptionsGroup.setLayoutData(gd);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        nodeJSOptionsGroup.setLayout(layout);
        nodeJSOptionsGroup.setFont(parent.getFont());
        
        nodeArgumentsText = new Text(nodeJSOptionsGroup, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
		gd = new GridData(GridData.FILL_BOTH);
		gd.heightHint = 40;
		gd.widthHint = 100;
		nodeArgumentsText.setLayoutData(gd);
		nodeArgumentsText.addModifyListener(modifyListener);
		
		nodeVariablesButton = createPushButton(nodeJSOptionsGroup, Messages.LAUNCH_CONFIGURATION_ARGUMENTS_TAB_VARIABLES_TEXT, null);
		nodeVariablesButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
		nodeVariablesButton.addSelectionListener(nodeArgsSelectionListener);
	}
	
	private void createAppArgumentsGroup(Composite parent) {
        Group scriptOptionsGroup = new Group(parent, SWT.NONE);
        scriptOptionsGroup.setText(Messages.LAUNCH_CONFIGURATION_ARGUMENTS_TAB_APP_ARGUMENTS_TEXT);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        scriptOptionsGroup.setLayoutData(gd);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        scriptOptionsGroup.setLayout(layout);
        scriptOptionsGroup.setFont(parent.getFont());
        
        appArgumentsText = new Text(scriptOptionsGroup, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
		gd = new GridData(GridData.FILL_BOTH);
		gd.heightHint = 40;
		gd.widthHint = 100;
		appArgumentsText.setLayoutData(gd);
		appArgumentsText.addModifyListener(modifyListener);
		
		appVariablesButton = createPushButton(scriptOptionsGroup, Messages.LAUNCH_CONFIGURATION_ARGUMENTS_TAB_VARIABLES_TEXT, null);
		appVariablesButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
		appVariablesButton.addSelectionListener(appArgsSelectionListener);
	}
	
	protected void createWorkingDirectoryGroup(Composite parent) {
		workingDirectoryBlock.createControl(parent);
	}

    @Override
	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
    	workingDirectoryBlock.setDefaults(configuration);
    }

    @Override
	public void initializeFrom(ILaunchConfiguration configuration) {
        try {
        	nodeArgumentsText.setText(configuration.getAttribute(NodeConstants.ATTR_NODE_ARGUMENTS, NodeConstants.EMPTY));
        	appArgumentsText.setText(configuration.getAttribute(NodeConstants.ATTR_APP_ARGUMENTS, NodeConstants.EMPTY));
        	workingDirectoryBlock.initializeFrom(configuration);
            
        } catch (CoreException e) {
            setErrorMessage(e.getMessage());
        }
    }

    @Override
	public void performApply(ILaunchConfigurationWorkingCopy configuration) {    	
    	configuration.setAttribute(NodeConstants.ATTR_NODE_ARGUMENTS, nodeArgumentsText.getText().trim());
    	configuration.setAttribute(NodeConstants.ATTR_APP_ARGUMENTS, appArgumentsText.getText().trim());
    	workingDirectoryBlock.performApply(configuration);
    }

    
    @Override
	public boolean isValid(ILaunchConfiguration launchConfig) {
        setErrorMessage(null);
        setMessage(null);
    	return workingDirectoryBlock.isValid(launchConfig);
    }
    
	@Override
	public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog){
		super.setLaunchConfigurationDialog(dialog);
		workingDirectoryBlock.setLaunchConfigurationDialog(dialog);
	}
	
    @Override
	public String getErrorMessage() {
        String m = super.getErrorMessage();
        if (m == null) {
                return workingDirectoryBlock.getErrorMessage();
        }
        return m;
    }
    
    @Override
	public String getMessage() {
        String m = super.getMessage();
        if (m == null) {
            return workingDirectoryBlock.getMessage();
        }
        return m;
    }

	@Override
	public Image getImage() {
		return ImageResource.getImage(ImageResource.IMG_ARGUMENTS);
	}

	@Override
	public String getName() {
        return Messages.LAUNCH_CONFIGURATION_ARGUMENTS_TAB;
    }

}
