/*******************************************************************************
 * Copyright (c) 2007 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.ui.internal.mappings.details;

import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jpt.core.internal.IJpaProject;
import org.eclipse.jpt.core.internal.mappings.IId;
import org.eclipse.jpt.core.internal.mappings.ISequenceGenerator;
import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
import org.eclipse.jpt.db.internal.ConnectionProfile;
import org.eclipse.jpt.ui.internal.IJpaHelpContextIds;
import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.help.IWorkbenchHelpSystem;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;

/**
 * SequenceGeneratorComposite
 */
public class SequenceGeneratorComposite extends GeneratorComposite<ISequenceGenerator>
{
	private CCombo sequenceNameCombo;

	private ModifyListener sequenceNameComboListener;

	private ConnectionProfile connectionProfile;

	public SequenceGeneratorComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
		super(parent, commandStack, widgetFactory);
	}

	protected ISequenceGenerator createGenerator() {
		ISequenceGenerator sequenceGenerator = idMapping().createSequenceGenerator();
		idMapping().setSequenceGenerator(sequenceGenerator);
		return sequenceGenerator;
	}
	
	protected ISequenceGenerator generator(IId idMapping) {
		return idMapping.getSequenceGenerator();
	}

	@Override
	protected void initializeLayout(Composite composite) {
		IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();
		
		GridLayout layout = new GridLayout(2, false);
		composite.setLayout(layout);
		getWidgetFactory().createLabel(composite, JptUiMappingsMessages.SequenceGeneratorComposite_name);
		
		this.nameTextWidget = buildNameText(composite);
		GridData gridData = new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		this.nameTextWidget.setLayoutData(gridData);
		helpSystem.setHelp(this.nameTextWidget, IJpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_NAME);
		
		getWidgetFactory().createLabel(composite, JptUiMappingsMessages.SequenceGeneratorComposite_sequence);
		
		this.sequenceNameCombo = buildSequenceNameCombo(composite);
		gridData = new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		this.sequenceNameCombo.setLayoutData(gridData);
		helpSystem.setHelp(sequenceNameCombo, IJpaHelpContextIds.MAPPING_SEQUENCE_GENERATOR_SEQUENCE);
	}

	private CCombo buildSequenceNameCombo(Composite parent) {
		CCombo combo = getWidgetFactory().createCCombo(parent, SWT.FLAT);
		combo.add(""); //$NON-NLS-1$
		combo.select(0);
		combo.addModifyListener(getSequenceNameListener());
		return combo;
	}

	private ModifyListener getSequenceNameListener() {
		if (this.sequenceNameComboListener == null) {
			this.sequenceNameComboListener = new ModifyListener() {
				public void modifyText(ModifyEvent e) {
					if (isPopulating()) {
						return;
					}
					String text = ((CCombo) e.getSource()).getText();
					if (text != null && sequenceNameCombo.getItemCount() > 0 && text.equals(sequenceNameCombo.getItem(0))) {
						text = null;
					}
					ISequenceGenerator generator = getGenerator();
					if (generator == null) {
						generator = createGenerator();
					}
					generator.setSpecifiedSequenceName(text);
				}
			};
		}
		return this.sequenceNameComboListener;
	}

	protected void generatorChanged(Notification notification) {
		super.generatorChanged(notification);
		if (notification.getFeatureID(ISequenceGenerator.class) == JpaCoreMappingsPackage.ISEQUENCE_GENERATOR__SPECIFIED_SEQUENCE_NAME) {
			final String sequenceName = notification.getNewStringValue();
			Display.getDefault().asyncExec(new Runnable() {
				public void run() {
					if (getControl().isDisposed()) {
						return;
					}
					if (sequenceName == null) {
						sequenceNameCombo.select(0);
					}
					else if (!sequenceNameCombo.getText().equals(sequenceName)) {
						sequenceNameCombo.setText(sequenceName);
					}
				}
			});
		}
	}

	@Override
	protected void doPopulate(EObject obj) {
		super.doPopulate(obj);
		if (obj == null) {
			return;
		}
		populateSequenceNameCombo();
	}

	@Override
	protected void doPopulate() {
		populateSequenceNameCombo();
	}
	
	private ConnectionProfile getConnectionProfile() {
		if(this.connectionProfile == null) {
			IJpaProject jpaProject = getGenerator().getJpaProject();
			this.connectionProfile = jpaProject.connectionProfile();
		}
		return this.connectionProfile;
	}

	private void populateSequenceNameCombo() {
		if (this.getGenerator() == null) {
			return;
		}
		this.sequenceNameCombo.setItem(0, JptUiMappingsMessages.SequenceGeneratorComposite_default);
		if (this.getConnectionProfile().isConnected()) {
//			this.sequenceNameCombo.remove(1, this.sequenceNameCombo.getItemCount() - 1);
//			Schema schema = getConnectionProfile().getDatabase().schemaNamed(getGenerator().getJpaProject().getSchemaName());
//			if (schema != null) {
//				for (Iterator stream = CollectionTools.sort(schema.sequenceNames()); stream.hasNext();) {
//					this.sequenceNameCombo.add((String) stream.next());
//				}
//			}
		}
		String sequenceName = this.getGenerator().getSpecifiedSequenceName();
		if (sequenceName != null) {
			if (!this.sequenceNameCombo.getText().equals(sequenceName)) {
				this.sequenceNameCombo.setText(sequenceName);
			}
		}
		else {
			this.sequenceNameCombo.select(0);
		}
	}

	protected void clear() {
		super.clear();
		this.sequenceNameCombo.select(0);
	}
}