/*******************************************************************************
 * Copyright (c) 2008, 2011 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.details;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages;
import org.eclipse.jpt.common.ui.internal.widgets.ClassChooserComboPane;
import org.eclipse.jpt.common.ui.internal.widgets.Pane;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyListValueModelAdapter;
import org.eclipse.jpt.common.utility.model.value.ListValueModel;
import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
import org.eclipse.jpt.core.context.IdClassReference;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Composite;

/**
 * Id class hyperlink label, combo, and browse button
 *
 */
public class IdClassComposite
	extends Pane<IdClassReference>
{
	/**
	 * Creates a new <code>IdClassComposite</code>.
	 *
	 * @param parentPane The parent pane of this one
	 * @param parent The parent container
	 */
	public IdClassComposite(
			Pane<?> parentPane,
			PropertyValueModel<? extends IdClassReference> subjectHolder,
			Composite parent) {
		
		super(parentPane, subjectHolder, parent);
	}
	
	public IdClassComposite(
			Pane<?> parentPane,
			PropertyValueModel<? extends IdClassReference> subjectHolder,
			Composite parent,
        	boolean automaticallyAlignWidgets) {
		
		super(parentPane, subjectHolder, parent, automaticallyAlignWidgets);
	}
	
	
	@Override
	protected void initializeLayout(Composite container) {
		new IdClassChooserComboPane(this, container);
	}
	
	
	private class IdClassChooserComboPane
		extends ClassChooserComboPane<IdClassReference>
	{
		public IdClassChooserComboPane(Pane<IdClassReference> parentPane, Composite parent) {
			super(parentPane, parent);
		}
		
		
		@Override
		protected String getClassName() {
			return getSubject().getIdClassName();
		}
		
		@Override
		protected void setClassName(String className) {
			getSubject().setSpecifiedIdClassName(className);
		}
		
		@Override
		protected String getLabelText() {
			return JptUiDetailsMessages.IdClassComposite_label;
		}
		
		@Override
		protected IJavaProject getJavaProject() {
			return getSubject().getJpaProject().getJavaProject();
		}
		
		@Override
		protected char getEnclosingTypeSeparator() {
			return getSubject().getIdClassEnclosingTypeSeparator();
		}
		
		@Override
		protected WritablePropertyValueModel<String> buildTextHolder() {
			return new PropertyAspectAdapter<IdClassReference, String>(
					getSubjectHolder(), 
					IdClassReference.SPECIFIED_ID_CLASS_NAME_PROPERTY,
					IdClassReference.DEFAULT_ID_CLASS_NAME_PROPERTY) {
				
				@Override
				protected String buildValue_() {
					String value = this.subject.getSpecifiedIdClassName();
					return (value == null) ? defaultText(this.subject) : value;
				}
				
				@Override
				protected void setValue_(String value) {
					if (value == null 
							|| value.length() == 0 
							|| value.equals(defaultText(this.subject))) {
						value = null;
					}
					this.subject.setSpecifiedIdClassName(value);
				}
			};
		}
		
		protected String defaultText(IdClassReference idClassReference) {
			String defaultClassName = idClassReference.getDefaultIdClassName();
			return (defaultClassName == null) ?
					JptCommonUiMessages.NoneSelected
					: NLS.bind(JptCommonUiMessages.DefaultWithOneParam, defaultClassName);
		}
		
		@Override
		protected ListValueModel<String> buildClassListHolder() {
			return new PropertyListValueModelAdapter<String>(
				new PropertyAspectAdapter<IdClassReference, String>(
						getSubjectHolder(), IdClassReference.DEFAULT_ID_CLASS_NAME_PROPERTY) {
					@Override
					protected String buildValue_() {
						return defaultText(this.subject);
					}
				});
		}
	}
}
