/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.macbundler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;


public class BundleWizardPage1 extends BundleWizardBasePage {
	
	static String[] JVMS= {
		"1.3+",	//$NON-NLS-1$
		"1.3*",	//$NON-NLS-1$
		"1.4.2",	//$NON-NLS-1$
		"1.4+",	//$NON-NLS-1$
		"1.4*",	//$NON-NLS-1$
		"1.5+",	//$NON-NLS-1$
		"1.5*",	//$NON-NLS-1$
		"1.6+",	//$NON-NLS-1$
		"1.6*"	//$NON-NLS-1$
	};

	ILaunchConfiguration[] fConfigurations= new ILaunchConfiguration[0];
	Combo fLocation;	
	Combo fLaunchConfigs;
	Combo fJVMVersion;
	Text fAppName;
	Text fMainClass;
	Text fArguments;
	Text fIconFileName;
	Button fUseSWT;
	
	
	public BundleWizardPage1(BundleDescription bd) {
		super("page1", bd); //$NON-NLS-1$
	}

	@Override
	public void createContents(Composite c) {
		
		final Shell shell= c.getShell();
				
		Composite c1= createComposite(c, 2);
			createLabel(c1, Util.getString("page1.launchConfig.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		
			fLaunchConfigs= new Combo(c1, SWT.READ_ONLY);
			fillCombo(fLaunchConfigs);
			fLaunchConfigs.addSelectionListener(
				new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						int ix= fLaunchConfigs.getSelectionIndex();
						if (ix > 0 && ix < fConfigurations.length) {
							fBundleDescription.clear();
							fBundleDescription.inititialize(fConfigurations[ix]);
						}
					}
				}
			);
			
					
		Group c2= createGroup(c, "Main", 2); //$NON-NLS-1$
			createLabel(c2, Util.getString("page1.mainClass.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
			Composite c7a= createHBox(c2);
			
				fMainClass= createText(c7a, MAINCLASS, 1);
				Button b1= createButton(c7a, SWT.NONE, Util.getString("page1.mainClass.chooseButton.label")); //$NON-NLS-1$
				b1.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						MessageBox mb= new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
						mb.setMessage(Util.getString("page1.mainClass.dialog.message")); //$NON-NLS-1$
						mb.setText(Util.getString("page1.mainClass.dialog.title")); //$NON-NLS-1$
						mb.open();
					}
				});
				
				createLabel(c2, Util.getString("page1.arguments.label"), GridData.VERTICAL_ALIGN_BEGINNING); //$NON-NLS-1$
				fArguments= createText(c2, ARGUMENTS, 2);
					
		Group c5= createGroup(c, "Destination", 2); //$NON-NLS-1$	
			createLabel(c5, Util.getString("page1.appName.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
			fAppName= createText(c5, APPNAME, 1);
		
			createLabel(c5, Util.getString("page1.appFolder.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
			Composite c3a= createHBox(c5);
			
				fLocation= createCombo(c3a, DESTINATIONDIRECTORY);
				
				final Button browse= createButton(c3a, SWT.NONE, Util.getString("page1.appFolder.browseButton.label")); //$NON-NLS-1$
				browse.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						DirectoryDialog dd= new DirectoryDialog(browse.getShell(), SWT.SAVE);
						dd.setMessage(Util.getString("page1.appFolder.browseDialog.message")); //$NON-NLS-1$
						dd.setText(Util.getString("page1.appFolder.browseDialog.title")); //$NON-NLS-1$
						String name= dd.open();
						if (name != null) {
							fLocation.setText(name);
						}
					}
				});
		
		Group g6= createGroup(c, "Options", 2); //$NON-NLS-1$
		
			createLabel(g6, Util.getString("page1.jvm.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
			
			Composite c8= createComposite(g6, 4);
			
				fJVMVersion= new Combo(c8, SWT.READ_ONLY);
				for (int i= 0; i < JVMS.length; i++) {
					fJVMVersion.add(JVMS[i]);
				}
				fJVMVersion.setText(JVMS[4]);
				hookField(fJVMVersion, JVMVERSION);
				createLabel(c8, "      ", GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
				createLabel(c8, Util.getString("page1.useSWT.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
				fUseSWT= createButton(c8, SWT.CHECK, null);
				hookButton(fUseSWT, USES_SWT);
			
			createLabel(g6, Util.getString("page1.appIcon.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
			Composite c7= createComposite(g6, 2);
				fIconFileName= createText(c7, ICONFILE, 1);
				final Button b= createButton(c7, SWT.NONE, Util.getString("page1.appIcon.chooseButton.label")); //$NON-NLS-1$
				b.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						FileDialog fd= new FileDialog(b.getShell(), SWT.OPEN);
						fd.setText(Util.getString("page1.appIcon.chooseDialog.title")); //$NON-NLS-1$
						fd.setFilterExtensions(new String[] { "icns" }); //$NON-NLS-1$
						String name= fd.open();
						if (name != null) {
							fIconFileName.setText(name);
						}
					}
				});
			
	}
	
	@Override
	void enterPage() {
		super.enterPage();
		initCombo(fLaunchConfigs);
	}
	
	@Override
	public void propertyChange(PropertyChangeEvent event) {
		if (fAppName != null)
		 {
			fAppName.setText(fBundleDescription.get(APPNAME, "")); //$NON-NLS-1$
		}
		if (fMainClass != null)
		 {
			fMainClass.setText(fBundleDescription.get(MAINCLASS, "")); //$NON-NLS-1$
		}
		if (fJVMVersion != null)
		 {
			fJVMVersion.setText(fBundleDescription.get(JVMVERSION, "")); //$NON-NLS-1$
		}
		if (fUseSWT != null) {
			fUseSWT.setSelection(fBundleDescription.get(USES_SWT, false));
		}
	}
	
	@Override
	public boolean isPageComplete() {
		return fAppName != null && fAppName.getText().length() > 0 && fLocation.getText().length() > 0;
	}

	// private stuff
	
	private void collectLaunchConfigs() {
		ArrayList<ILaunchConfiguration> configs= new ArrayList<ILaunchConfiguration>();
		ILaunchManager manager= DebugPlugin.getDefault().getLaunchManager();
		ILaunchConfigurationType type= manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
		try {
			ILaunchConfiguration[] configurations= manager.getLaunchConfigurations(type);
			for (int i= 0; i < configurations.length; i++) {
				ILaunchConfiguration configuration= configurations[i];
				if (BundleDescription.verify(configuration)) {
					configs.add(configuration);
				}
			}
		} catch (CoreException e) {
			//
		}
		fConfigurations= configs.toArray(new ILaunchConfiguration[configs.size()]);
		Arrays.sort(fConfigurations, new Comparator<Object>() {
			@Override
			public int compare(Object o1, Object o2) {
				ILaunchConfiguration lc1= (ILaunchConfiguration) o1;
				ILaunchConfiguration lc2= (ILaunchConfiguration) o2;
				return lc1.getName().compareTo(lc2.getName());
			}

			@Override
			public boolean equals(Object obj) {
				return false;
			}
		});
	}
	
	private void fillCombo(Combo c) {
		collectLaunchConfigs();
		for (int i= 0; i < fConfigurations.length; i++) {
			ILaunchConfiguration configuration= fConfigurations[i];
			c.add(configuration.getName());
		}
	}
	
	private void initCombo(Combo c) {
		IStructuredSelection sel= ((MacBundleWizard)getWizard()).getSelection();
		Object o= sel.getFirstElement();
		if (o instanceof IJavaElement) {
			IJavaProject project= ((IJavaElement) o).getJavaProject();
			if (project != null) {
				for (int i= 0; i < fConfigurations.length; i++) {
					ILaunchConfiguration configuration= fConfigurations[i];
					if (BundleDescription.matches(configuration, project)) {
						c.setText(configuration.getName());
						fBundleDescription.inititialize(configuration);
						return;
					}
				}
			}
		}
	}	
}
